# HG changeset patch # User tbell # Date 1240089027 25200 # Node ID c66fa5c0e626f91016c1170e7b1b5aa5be7b2fba # Parent 824a5ff07bcbfb9338956ebab060225f7e6bd15f# Parent b49ee2080eb877ef5ec2ef73ef948012f8650b1d Merge diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/make/common/shared/Defs-windows.gmk diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/make/java/zip/FILES_c.gmk --- a/jdk/make/java/zip/FILES_c.gmk Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/make/java/zip/FILES_c.gmk Sat Apr 18 14:10:27 2009 -0700 @@ -29,7 +29,6 @@ Deflater.c \ Inflater.c \ ZipFile.c \ - ZipEntry.c \ zadler32.c \ zcrc32.c \ deflate.c \ diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/make/java/zip/mapfile-vers --- a/jdk/make/java/zip/mapfile-vers Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/make/java/zip/mapfile-vers Sat Apr 18 14:10:27 2009 -0700 @@ -50,15 +50,17 @@ Java_java_util_zip_Inflater_initIDs; Java_java_util_zip_Inflater_reset; Java_java_util_zip_Inflater_setDictionary; - Java_java_util_zip_ZipEntry_initFields; - Java_java_util_zip_ZipEntry_initIDs; Java_java_util_zip_ZipFile_close; Java_java_util_zip_ZipFile_freeEntry; - Java_java_util_zip_ZipFile_getCSize; Java_java_util_zip_ZipFile_getEntry; - Java_java_util_zip_ZipFile_getMethod; + Java_java_util_zip_ZipFile_getEntryBytes; + Java_java_util_zip_ZipFile_getEntryCrc; + Java_java_util_zip_ZipFile_getEntryCSize; + Java_java_util_zip_ZipFile_getEntryFlag; + Java_java_util_zip_ZipFile_getEntryMethod; + Java_java_util_zip_ZipFile_getEntrySize; + Java_java_util_zip_ZipFile_getEntryTime; Java_java_util_zip_ZipFile_getNextEntry; - Java_java_util_zip_ZipFile_getSize; Java_java_util_zip_ZipFile_getZipMessage; Java_java_util_zip_ZipFile_getTotal; Java_java_util_zip_ZipFile_initIDs; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/make/java/zip/reorder-i586 --- a/jdk/make/java/zip/reorder-i586 Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/make/java/zip/reorder-i586 Sat Apr 18 14:10:27 2009 -0700 @@ -20,12 +20,14 @@ text: .text%Java_java_util_zip_ZipFile_open; text: .text%Java_java_util_zip_ZipFile_getTotal; text: .text%Java_java_util_zip_ZipFile_getEntry; -text: .text%Java_java_util_zip_ZipEntry_initIDs; -text: .text%Java_java_util_zip_ZipEntry_initFields; text: .text%Java_java_util_zip_ZipFile_freeEntry; -text: .text%Java_java_util_zip_ZipFile_getCSize; -text: .text%Java_java_util_zip_ZipFile_getSize; -text: .text%Java_java_util_zip_ZipFile_getMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryTime; +text: .text%Java_java_util_zip_ZipFile_getEntryCrc; +text: .text%Java_java_util_zip_ZipFile_getEntryCSize; +text: .text%Java_java_util_zip_ZipFile_getEntrySize; +text: .text%Java_java_util_zip_ZipFile_getEntryFlag; +text: .text%Java_java_util_zip_ZipFile_getEntryMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryBytes; text: .text%Java_java_util_zip_Inflater_initIDs; text: .text%Java_java_util_zip_Inflater_init; text: .text%inflateInit2_; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/make/java/zip/reorder-sparc --- a/jdk/make/java/zip/reorder-sparc Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/make/java/zip/reorder-sparc Sat Apr 18 14:10:27 2009 -0700 @@ -19,12 +19,14 @@ text: .text%Java_java_util_zip_ZipFile_open; text: .text%Java_java_util_zip_ZipFile_getTotal; text: .text%Java_java_util_zip_ZipFile_getEntry; -text: .text%Java_java_util_zip_ZipEntry_initIDs; -text: .text%Java_java_util_zip_ZipEntry_initFields; text: .text%Java_java_util_zip_ZipFile_freeEntry; -text: .text%Java_java_util_zip_ZipFile_getCSize; -text: .text%Java_java_util_zip_ZipFile_getSize; -text: .text%Java_java_util_zip_ZipFile_getMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryTime; +text: .text%Java_java_util_zip_ZipFile_getEntryCrc; +text: .text%Java_java_util_zip_ZipFile_getEntryCSize; +text: .text%Java_java_util_zip_ZipFile_getEntrySize; +text: .text%Java_java_util_zip_ZipFile_getEntryFlag; +text: .text%Java_java_util_zip_ZipFile_getEntryMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryBytes; text: .text%Java_java_util_zip_Inflater_initIDs; text: .text%Java_java_util_zip_Inflater_init; text: .text%inflateInit2_; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/make/java/zip/reorder-sparcv9 --- a/jdk/make/java/zip/reorder-sparcv9 Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/make/java/zip/reorder-sparcv9 Sat Apr 18 14:10:27 2009 -0700 @@ -20,12 +20,14 @@ text: .text%Java_java_util_zip_ZipFile_open; text: .text%Java_java_util_zip_ZipFile_getTotal; text: .text%Java_java_util_zip_ZipFile_getEntry; -text: .text%Java_java_util_zip_ZipEntry_initIDs; -text: .text%Java_java_util_zip_ZipEntry_initFields; text: .text%Java_java_util_zip_ZipFile_freeEntry; -text: .text%Java_java_util_zip_ZipFile_getCSize; -text: .text%Java_java_util_zip_ZipFile_getSize; -text: .text%Java_java_util_zip_ZipFile_getMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryTime; +text: .text%Java_java_util_zip_ZipFile_getEntryCrc; +text: .text%Java_java_util_zip_ZipFile_getEntryCSize; +text: .text%Java_java_util_zip_ZipFile_getEntrySize; +text: .text%Java_java_util_zip_ZipFile_getEntryFlag; +text: .text%Java_java_util_zip_ZipFile_getEntryMethod; +text: .text%Java_java_util_zip_ZipFile_getEntryBytes; text: .text%Java_java_util_zip_Inflater_initIDs; text: .text%Java_java_util_zip_Inflater_init; text: .text%inflateInit2_; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/bin/emessages.h --- a/jdk/src/share/bin/emessages.h Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/bin/emessages.h Sat Apr 18 14:10:27 2009 -0700 @@ -50,6 +50,12 @@ #define JAR_ERROR2 "Error: Unable to access jarfile %s" #define JAR_ERROR3 "Error: Invalid or corrupt jarfile %s" +#define CLS_ERROR1 "Error: Could not find the main class %s.\n" JNI_ERROR +#define CLS_ERROR2 "Error: Failed to load Main Class: %s\n%s" +#define CLS_ERROR3 "Error: No main method found in specified class.\n" GEN_ERROR +#define CLS_ERROR4 "Error: Main method not public\n" GEN_ERROR +#define CLS_ERROR5 "Error: main-class: attribute exceeds system limits of %d bytes\n" GEN_ERROR + #define CFG_WARN1 "Warning: %s VM not supported; %s VM will be used" #define CFG_WARN2 "Warning: No leading - on line %d of `%s'" #define CFG_WARN3 "Warning: Missing VM type on line %d of `%s'" diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/bin/java.c --- a/jdk/src/share/bin/java.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/bin/java.c Sat Apr 18 14:10:27 2009 -0700 @@ -915,8 +915,14 @@ * to avoid locating, expanding and parsing the manifest extra * times. */ - if (info.main_class != NULL) - (void)JLI_StrCat(env_entry, info.main_class); + if (info.main_class != NULL) { + if (JLI_StrLen(info.main_class) <= MAXNAMELEN) { + (void)JLI_StrCat(env_entry, info.main_class); + } else { + JLI_ReportErrorMessage(CLS_ERROR5, MAXNAMELEN); + exit(1); + } + } (void)putenv(env_entry); ExecJRE(jre, new_argv); JLI_FreeManifest(); diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java --- a/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java Sat Apr 18 14:10:27 2009 -0700 @@ -22,7 +22,6 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - package com.sun.jmx.remote.internal; import java.io.IOException; @@ -34,6 +33,7 @@ import java.util.Map; import java.util.concurrent.Executor; +import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedAction; import javax.security.auth.Subject; @@ -54,7 +54,10 @@ public abstract class ClientNotifForwarder { - public ClientNotifForwarder(Map env) { + + private final AccessControlContext acc; + + public ClientNotifForwarder(Map env) { this(null, env); } @@ -87,6 +90,8 @@ this.command = command; if (thread == null) { thread = new Thread() { + + @Override public void run() { while (true) { Runnable r; @@ -130,6 +135,7 @@ this.defaultClassLoader = defaultClassLoader; this.executor = ex; + this.acc = AccessController.getContext(); } /** @@ -380,28 +386,85 @@ setState(TERMINATED); } -// ------------------------------------------------- -// private classes -// ------------------------------------------------- + + // ------------------------------------------------- + // private classes + // ------------------------------------------------- // + private class NotifFetcher implements Runnable { + + private volatile boolean alreadyLogged = false; + + private void logOnce(String msg, SecurityException x) { + if (alreadyLogged) return; + // Log only once. + logger.config("setContextClassLoader",msg); + if (x != null) logger.fine("setContextClassLoader", x); + alreadyLogged = true; + } + + // Set new context class loader, returns previous one. + private final ClassLoader setContextClassLoader(final ClassLoader loader) { + final AccessControlContext ctxt = ClientNotifForwarder.this.acc; + // if ctxt is null, log a config message and throw a + // SecurityException. + if (ctxt == null) { + logOnce("AccessControlContext must not be null.",null); + throw new SecurityException("AccessControlContext must not be null"); + } + return AccessController.doPrivileged( + new PrivilegedAction() { + public ClassLoader run() { + try { + // get context class loader - may throw + // SecurityException - though unlikely. + final ClassLoader previous = + Thread.currentThread().getContextClassLoader(); + + // if nothing needs to be done, break here... + if (loader == previous) return previous; + + // reset context class loader - may throw + // SecurityException + Thread.currentThread().setContextClassLoader(loader); + return previous; + } catch (SecurityException x) { + logOnce("Permission to set ContextClassLoader missing. " + + "Notifications will not be dispatched. " + + "Please check your Java policy configuration: " + + x, x); + throw x; + } + } + }, ctxt); + } + public void run() { + final ClassLoader previous; + if (defaultClassLoader != null) { + previous = setContextClassLoader(defaultClassLoader); + } else { + previous = null; + } + try { + doRun(); + } finally { + if (defaultClassLoader != null) { + setContextClassLoader(previous); + } + } + } + + private void doRun() { synchronized (ClientNotifForwarder.this) { currentFetchThread = Thread.currentThread(); - if (state == STARTING) + if (state == STARTING) { setState(STARTED); + } } - if (defaultClassLoader != null) { - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - Thread.currentThread(). - setContextClassLoader(defaultClassLoader); - return null; - } - }); - } NotificationResult nr = null; if (!shouldStop() && (nr = fetchNotifs()) != null) { @@ -434,8 +497,9 @@ // check if an mbean unregistration notif if (!listenerID.equals(mbeanRemovedNotifID)) { final ClientListenerInfo li = infoList.get(listenerID); - if (li != null) - listeners.put(listenerID,li); + if (li != null) { + listeners.put(listenerID, li); + } continue; } final Notification notif = tn.getNotification(); @@ -799,9 +863,7 @@ private long clientSequenceNumber = -1; private final int maxNotifications; private final long timeout; - private Integer mbeanRemovedNotifID = null; - private Thread currentFetchThread; // state diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java --- a/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java Sat Apr 18 14:10:27 2009 -0700 @@ -111,6 +111,22 @@ */ protected abstract void checkWrite(); + /** + * Check if the caller can create the named class. The default + * implementation of this method calls {@link #checkWrite()}. + */ + protected void checkCreate(String className) { + checkWrite(); + } + + /** + * Check if the caller can unregister the named MBean. The default + * implementation of this method calls {@link #checkWrite()}. + */ + protected void checkUnregister(ObjectName name) { + checkWrite(); + } + //-------------------------------------------- //-------------------------------------------- // @@ -148,7 +164,7 @@ } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, ObjectName name) @@ -158,7 +174,7 @@ MBeanRegistrationException, MBeanException, NotCompliantMBeanException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className); @@ -170,7 +186,7 @@ } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, ObjectName name, @@ -181,7 +197,7 @@ MBeanRegistrationException, MBeanException, NotCompliantMBeanException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className, @@ -196,7 +212,7 @@ } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, @@ -209,7 +225,7 @@ MBeanException, NotCompliantMBeanException, InstanceNotFoundException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className, @@ -222,7 +238,7 @@ } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, @@ -237,7 +253,7 @@ MBeanException, NotCompliantMBeanException, InstanceNotFoundException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className, @@ -394,45 +410,45 @@ } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public Object instantiate(String className) throws ReflectionException, MBeanException { - checkWrite(); + checkCreate(className); return getMBeanServer().instantiate(className); } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public Object instantiate(String className, Object params[], String signature[]) throws ReflectionException, MBeanException { - checkWrite(); + checkCreate(className); return getMBeanServer().instantiate(className, params, signature); } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public Object instantiate(String className, ObjectName loaderName) throws ReflectionException, MBeanException, InstanceNotFoundException { - checkWrite(); + checkCreate(className); return getMBeanServer().instantiate(className, loaderName); } /** - * Call checkWrite(), then forward this method to the + * Call checkCreate(className), then forward this method to the * wrapped object. */ public Object instantiate(String className, ObjectName loaderName, Object params[], String signature[]) throws ReflectionException, MBeanException, InstanceNotFoundException { - checkWrite(); + checkCreate(className); return getMBeanServer().instantiate(className, loaderName, params, signature); } @@ -579,12 +595,12 @@ } /** - * Call checkWrite(), then forward this method to the + * Call checkUnregister(), then forward this method to the * wrapped object. */ public void unregisterMBean(ObjectName name) throws InstanceNotFoundException, MBeanRegistrationException { - checkWrite(); + checkUnregister(name); getMBeanServer().unregisterMBean(name); } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java --- a/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java Sat Apr 18 14:10:27 2009 -0700 @@ -31,11 +31,17 @@ import java.security.AccessController; import java.security.Principal; import java.security.PrivilegedAction; -import java.util.Collection; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; +import java.util.StringTokenizer; +import java.util.regex.Pattern; import javax.management.MBeanServer; +import javax.management.ObjectName; import javax.security.auth.Subject; /** @@ -46,7 +52,8 @@ * not allowed; in this case the request is not forwarded to the * wrapped object.

* - *

This class implements the {@link #checkRead()} and {@link #checkWrite()} + *

This class implements the {@link #checkRead()}, {@link #checkWrite()}, + * {@link #checkCreate(String)}, and {@link #checkUnregister(ObjectName)} * methods based on an access level properties file containing username/access * level pairs. The set of username/access level pairs is passed either as a * filename which denotes a properties file on disk, or directly as an instance @@ -56,14 +63,50 @@ * has exactly one access level. The same access level can be shared by several * usernames.

* - *

The supported access level values are readonly and - * readwrite.

+ *

The supported access level values are {@code readonly} and + * {@code readwrite}. The {@code readwrite} access level can be + * qualified by one or more clauses, where each clause looks + * like create classNamePattern or {@code + * unregister}. For example:

+ * + *
+ * monitorRole  readonly
+ * controlRole  readwrite \
+ *              create javax.management.timer.*,javax.management.monitor.* \
+ *              unregister
+ * 
+ * + *

(The continuation lines with {@code \} come from the parser for + * Properties files.)

*/ public class MBeanServerFileAccessController extends MBeanServerAccessController { - public static final String READONLY = "readonly"; - public static final String READWRITE = "readwrite"; + static final String READONLY = "readonly"; + static final String READWRITE = "readwrite"; + + static final String CREATE = "create"; + static final String UNREGISTER = "unregister"; + + private enum AccessType {READ, WRITE, CREATE, UNREGISTER}; + + private static class Access { + final boolean write; + final String[] createPatterns; + private boolean unregister; + + Access(boolean write, boolean unregister, List createPatternList) { + this.write = write; + int npats = (createPatternList == null) ? 0 : createPatternList.size(); + if (npats == 0) + this.createPatterns = NO_STRINGS; + else + this.createPatterns = createPatternList.toArray(new String[npats]); + this.unregister = unregister; + } + + private final String[] NO_STRINGS = new String[0]; + } /** *

Create a new MBeanServerAccessController that forwards all the @@ -87,8 +130,8 @@ throws IOException { super(); this.accessFileName = accessFileName; - props = propertiesFromFile(accessFileName); - checkValues(props); + Properties props = propertiesFromFile(accessFileName); + parseProperties(props); } /** @@ -123,14 +166,14 @@ * #setMBeanServer} method after doing access checks based on read and * write permissions.

* - *

This instance is initialized from the specified properties instance. - * This constructor makes a copy of the properties instance using its - * clone method and it is the copy that is consulted to check - * the username and access level of an incoming connection. The original - * properties object can be modified without affecting the copy. If the - * {@link #refresh} method is then called, the - * MBeanServerFileAccessController will make a new copy of the - * properties object at that time.

+ *

This instance is initialized from the specified properties + * instance. This constructor makes a copy of the properties + * instance and it is the copy that is consulted to check the + * username and access level of an incoming connection. The + * original properties object can be modified without affecting + * the copy. If the {@link #refresh} method is then called, the + * MBeanServerFileAccessController will make a new + * copy of the properties object at that time.

* * @param accessFileProps properties list containing the username/access * level entries. @@ -145,8 +188,7 @@ if (accessFileProps == null) throw new IllegalArgumentException("Null properties"); originalProps = accessFileProps; - props = (Properties) accessFileProps.clone(); - checkValues(props); + parseProperties(accessFileProps); } /** @@ -155,14 +197,14 @@ * #setMBeanServer} method after doing access checks based on read and * write permissions.

* - *

This instance is initialized from the specified properties instance. - * This constructor makes a copy of the properties instance using its - * clone method and it is the copy that is consulted to check - * the username and access level of an incoming connection. The original - * properties object can be modified without affecting the copy. If the - * {@link #refresh} method is then called, the - * MBeanServerFileAccessController will make a new copy of the - * properties object at that time.

+ *

This instance is initialized from the specified properties + * instance. This constructor makes a copy of the properties + * instance and it is the copy that is consulted to check the + * username and access level of an incoming connection. The + * original properties object can be modified without affecting + * the copy. If the {@link #refresh} method is then called, the + * MBeanServerFileAccessController will make a new + * copy of the properties object at that time.

* * @param accessFileProps properties list containing the username/access * level entries. @@ -184,16 +226,36 @@ * Check if the caller can do read operations. This method does * nothing if so, otherwise throws SecurityException. */ + @Override public void checkRead() { - checkAccessLevel(READONLY); + checkAccess(AccessType.READ, null); } /** * Check if the caller can do write operations. This method does * nothing if so, otherwise throws SecurityException. */ + @Override public void checkWrite() { - checkAccessLevel(READWRITE); + checkAccess(AccessType.WRITE, null); + } + + /** + * Check if the caller can create MBeans or instances of the given class. + * This method does nothing if so, otherwise throws SecurityException. + */ + @Override + public void checkCreate(String className) { + checkAccess(AccessType.CREATE, className); + } + + /** + * Check if the caller can do unregister operations. This method does + * nothing if so, otherwise throws SecurityException. + */ + @Override + public void checkUnregister(ObjectName name) { + checkAccess(AccessType.UNREGISTER, null); } /** @@ -218,14 +280,13 @@ * @exception IllegalArgumentException if any of the supplied access * level values differs from "readonly" or "readwrite". */ - public void refresh() throws IOException { - synchronized (props) { - if (accessFileName == null) - props = (Properties) originalProps.clone(); - else - props = propertiesFromFile(accessFileName); - checkValues(props); - } + public synchronized void refresh() throws IOException { + Properties props; + if (accessFileName == null) + props = (Properties) originalProps; + else + props = propertiesFromFile(accessFileName); + parseProperties(props); } private static Properties propertiesFromFile(String fname) @@ -240,7 +301,7 @@ } } - private void checkAccessLevel(String accessLevel) { + private synchronized void checkAccess(AccessType requiredAccess, String arg) { final AccessControlContext acc = AccessController.getContext(); final Subject s = AccessController.doPrivileged(new PrivilegedAction() { @@ -249,39 +310,235 @@ } }); if (s == null) return; /* security has not been enabled */ - final Set principals = s.getPrincipals(); - for (Principal p : principals) { - String grantedAccessLevel; - synchronized (props) { - grantedAccessLevel = props.getProperty(p.getName()); - } - if (grantedAccessLevel != null) { - if (accessLevel.equals(READONLY) && - (grantedAccessLevel.equals(READONLY) || - grantedAccessLevel.equals(READWRITE))) - return; - if (accessLevel.equals(READWRITE) && - grantedAccessLevel.equals(READWRITE)) + final Set principals = s.getPrincipals(); + String newPropertyValue = null; + for (Iterator i = principals.iterator(); i.hasNext(); ) { + final Principal p = (Principal) i.next(); + Access access = accessMap.get(p.getName()); + if (access != null) { + boolean ok; + switch (requiredAccess) { + case READ: + ok = true; // all access entries imply read + break; + case WRITE: + ok = access.write; + break; + case UNREGISTER: + ok = access.unregister; + if (!ok && access.write) + newPropertyValue = "unregister"; + break; + case CREATE: + ok = checkCreateAccess(access, arg); + if (!ok && access.write) + newPropertyValue = "create " + arg; + break; + default: + throw new AssertionError(); + } + if (ok) return; } } - throw new SecurityException("Access denied! Invalid access level for " + - "requested MBeanServer operation."); + SecurityException se = new SecurityException("Access denied! Invalid " + + "access level for requested MBeanServer operation."); + // Add some more information to help people with deployments that + // worked before we required explicit create clauses. We're not giving + // any information to the bad guys, other than that the access control + // is based on a file, which they could have worked out from the stack + // trace anyway. + if (newPropertyValue != null) { + SecurityException se2 = new SecurityException("Access property " + + "for this identity should be similar to: " + READWRITE + + " " + newPropertyValue); + se.initCause(se2); + } + throw se; + } + + private static boolean checkCreateAccess(Access access, String className) { + for (String classNamePattern : access.createPatterns) { + if (classNameMatch(classNamePattern, className)) + return true; + } + return false; } - private void checkValues(Properties props) { - Collection c = props.values(); - for (Iterator i = c.iterator(); i.hasNext(); ) { - final String accessLevel = (String) i.next(); - if (!accessLevel.equals(READONLY) && - !accessLevel.equals(READWRITE)) { - throw new IllegalArgumentException( - "Syntax error in access level entry [" + accessLevel + "]"); - } + private static boolean classNameMatch(String pattern, String className) { + // We studiously avoided regexes when parsing the properties file, + // because that is done whenever the VM is started with the + // appropriate -Dcom.sun.management options, even if nobody ever + // creates an MBean. We don't want to incur the overhead of loading + // all the regex code whenever those options are specified, but if we + // get as far as here then the VM is already running and somebody is + // doing the very unusual operation of remotely creating an MBean. + // Because that operation is so unusual, we don't try to optimize + // by hand-matching or by caching compiled Pattern objects. + StringBuilder sb = new StringBuilder(); + StringTokenizer stok = new StringTokenizer(pattern, "*", true); + while (stok.hasMoreTokens()) { + String tok = stok.nextToken(); + if (tok.equals("*")) + sb.append("[^.]*"); + else + sb.append(Pattern.quote(tok)); + } + return className.matches(sb.toString()); + } + + private void parseProperties(Properties props) { + this.accessMap = new HashMap(); + for (Map.Entry entry : props.entrySet()) { + String identity = (String) entry.getKey(); + String accessString = (String) entry.getValue(); + Access access = Parser.parseAccess(identity, accessString); + accessMap.put(identity, access); } } - private Properties props; + private static class Parser { + private final static int EOS = -1; // pseudo-codepoint "end of string" + static { + assert !Character.isWhitespace(EOS); + } + + private final String identity; // just for better error messages + private final String s; // the string we're parsing + private final int len; // s.length() + private int i; + private int c; + // At any point, either c is s.codePointAt(i), or i == len and + // c is EOS. We use int rather than char because it is conceivable + // (if unlikely) that a classname in a create clause might contain + // "supplementary characters", the ones that don't fit in the original + // 16 bits for Unicode. + + private Parser(String identity, String s) { + this.identity = identity; + this.s = s; + this.len = s.length(); + this.i = 0; + if (i < len) + this.c = s.codePointAt(i); + else + this.c = EOS; + } + + static Access parseAccess(String identity, String s) { + return new Parser(identity, s).parseAccess(); + } + + private Access parseAccess() { + skipSpace(); + String type = parseWord(); + Access access; + if (type.equals(READONLY)) + access = new Access(false, false, null); + else if (type.equals(READWRITE)) + access = parseReadWrite(); + else { + throw syntax("Expected " + READONLY + " or " + READWRITE + + ": " + type); + } + if (c != EOS) + throw syntax("Extra text at end of line"); + return access; + } + + private Access parseReadWrite() { + List createClasses = new ArrayList(); + boolean unregister = false; + while (true) { + skipSpace(); + if (c == EOS) + break; + String type = parseWord(); + if (type.equals(UNREGISTER)) + unregister = true; + else if (type.equals(CREATE)) + parseCreate(createClasses); + else + throw syntax("Unrecognized keyword " + type); + } + return new Access(true, unregister, createClasses); + } + + private void parseCreate(List createClasses) { + while (true) { + skipSpace(); + createClasses.add(parseClassName()); + skipSpace(); + if (c == ',') + next(); + else + break; + } + } + + private String parseClassName() { + // We don't check that classname components begin with suitable + // characters (so we accept 1.2.3 for example). This means that + // there are only two states, which we can call dotOK and !dotOK + // according as a dot (.) is legal or not. Initially we're in + // !dotOK since a classname can't start with a dot; after a dot + // we're in !dotOK again; and after any other characters we're in + // dotOK. The classname is only accepted if we end in dotOK, + // so we reject an empty name or a name that ends with a dot. + final int start = i; + boolean dotOK = false; + while (true) { + if (c == '.') { + if (!dotOK) + throw syntax("Bad . in class name"); + dotOK = false; + } else if (c == '*' || Character.isJavaIdentifierPart(c)) + dotOK = true; + else + break; + next(); + } + String className = s.substring(start, i); + if (!dotOK) + throw syntax("Bad class name " + className); + return className; + } + + // Advance c and i to the next character, unless already at EOS. + private void next() { + if (c != EOS) { + i += Character.charCount(c); + if (i < len) + c = s.codePointAt(i); + else + c = EOS; + } + } + + private void skipSpace() { + while (Character.isWhitespace(c)) + next(); + } + + private String parseWord() { + skipSpace(); + if (c == EOS) + throw syntax("Expected word at end of line"); + final int start = i; + while (c != EOS && !Character.isWhitespace(c)) + next(); + String word = s.substring(start, i); + skipSpace(); + return word; + } + + private IllegalArgumentException syntax(String msg) { + return new IllegalArgumentException( + msg + " [" + identity + " " + s + "]"); + } + } + + private Map accessMap; private Properties originalProps; private String accessFileName; } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java Sat Apr 18 14:10:27 2009 -0700 @@ -302,7 +302,16 @@ schemaTrees = new Hashtable(11, 0.75f); initEnv(); - connect(false); + try { + connect(false); + } catch (NamingException e) { + try { + close(); + } catch (Exception e2) { + // Nothing + } + throw e; + } } LdapCtx(LdapCtx existing, String newDN) throws NamingException { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2009 Sun Microsystems, Inc. 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 @@ -33,12 +33,33 @@ final class VersionHelper12 extends VersionHelper { + // System property to control whether classes may be loaded from an + // arbitrary URL code base. + private static final String TRUST_URL_CODEBASE_PROPERTY = + "com.sun.jndi.ldap.object.trustURLCodebase"; + + // Determine whether classes may be loaded from an arbitrary URL code base. + private static final String trustURLCodebase = + AccessController.doPrivileged( + new PrivilegedAction() { + public String run() { + return System.getProperty(TRUST_URL_CODEBASE_PROPERTY, + "false"); + } + } + ); + VersionHelper12() {} // Disallow external from creating one of these. ClassLoader getURLClassLoader(String[] url) throws MalformedURLException { ClassLoader parent = getContextClassLoader(); - if (url != null) { + /* + * Classes may only be loaded from an arbitrary URL code base when + * the system property com.sun.jndi.ldap.object.trustURLCodebase + * has been set to "true". + */ + if (url != null && "true".equalsIgnoreCase(trustURLCodebase)) { return URLClassLoader.newInstance(getUrlArray(url), parent); } else { return parent; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/awt/Font.java --- a/jdk/src/share/classes/java/awt/Font.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/awt/Font.java Sat Apr 18 14:10:27 2009 -0700 @@ -37,6 +37,8 @@ import java.awt.peer.FontPeer; import java.io.*; import java.lang.ref.SoftReference; +import java.security.AccessController; +import java.security.PrivilegedExceptionAction; import java.text.AttributedCharacterIterator.Attribute; import java.text.CharacterIterator; import java.text.StringCharacterIterator; @@ -51,6 +53,7 @@ import sun.font.AttributeValues; import sun.font.EAttribute; import sun.font.CompositeFont; +import sun.font.CreatedFontTracker; import sun.font.Font2D; import sun.font.Font2DHandle; import sun.font.FontManager; @@ -575,14 +578,16 @@ } /* used to implement Font.createFont */ - private Font(File fontFile, int fontFormat, boolean isCopy) + private Font(File fontFile, int fontFormat, + boolean isCopy, CreatedFontTracker tracker) throws FontFormatException { this.createdFont = true; /* Font2D instances created by this method track their font file * so that when the Font2D is GC'd it can also remove the file. */ this.font2DHandle = - FontManager.createFont2D(fontFile, fontFormat, isCopy).handle; + FontManager.createFont2D(fontFile, fontFormat, + isCopy, tracker).handle; this.name = this.font2DHandle.font2D.getFontName(Locale.getDefault()); this.style = Font.PLAIN; this.size = 1; @@ -788,6 +793,29 @@ } /** + * Used with the byte count tracker for fonts created from streams. + * If a thread can create temp files anyway, no point in counting + * font bytes. + */ + private static boolean hasTempPermission() { + + if (System.getSecurityManager() == null) { + return true; + } + File f = null; + boolean hasPerm = false; + try { + f = File.createTempFile("+~JT", ".tmp", null); + f.delete(); + f = null; + hasPerm = true; + } catch (Throwable t) { + /* inc. any kind of SecurityException */ + } + return hasPerm; + } + + /** * Returns a new Font using the specified font type * and input data. The new Font is * created with a point size of 1 and style {@link #PLAIN PLAIN}. @@ -822,58 +850,96 @@ fontFormat != Font.TYPE1_FONT) { throw new IllegalArgumentException ("font format not recognized"); } - final InputStream fStream = fontStream; - Object ret = java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - File tFile = null; - FileOutputStream outStream = null; - try { - tFile = File.createTempFile("+~JF", ".tmp", null); - /* Temp file deleted by font shutdown hook */ - BufferedInputStream inStream = - new BufferedInputStream(fStream); - outStream = new FileOutputStream(tFile); - int bytesRead = 0; - int bufSize = 8192; - byte [] buf = new byte[bufSize]; - while (bytesRead != -1) { - try { - bytesRead = inStream.read(buf, 0, bufSize); - } catch (Throwable t) { - throw new IOException(); - } - if (bytesRead != -1) { - outStream.write(buf, 0, bytesRead); - } - } - /* don't close the input stream */ - outStream.close(); - } catch (IOException e) { - if (outStream != null) { - try { - outStream.close(); - } catch (Exception e1) { - } - } - if (tFile != null) { - try { - tFile.delete(); - } catch (Exception e2) { - } - } - return e; - } - return tFile; - } - }); + boolean copiedFontData = false; + + try { + final File tFile = AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public File run() throws IOException { + return File.createTempFile("+~JF", ".tmp", null); + } + } + ); - if (ret instanceof File) { - return new Font((File)ret, fontFormat, true); - } else if (ret instanceof IOException) { - throw (IOException)ret; - } else { - throw new FontFormatException("Couldn't access font stream"); + int totalSize = 0; + CreatedFontTracker tracker = null; + try { + final OutputStream outStream = + AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public OutputStream run() throws IOException { + return new FileOutputStream(tFile); + } + } + ); + if (!hasTempPermission()) { + tracker = CreatedFontTracker.getTracker(); + } + try { + byte[] buf = new byte[8192]; + for (;;) { + int bytesRead = fontStream.read(buf); + if (bytesRead < 0) { + break; + } + if (tracker != null) { + if (totalSize+bytesRead > tracker.MAX_FILE_SIZE) { + throw new IOException("File too big."); + } + if (totalSize+tracker.getNumBytes() > + tracker.MAX_TOTAL_BYTES) + { + throw new IOException("Total files too big."); + } + totalSize += bytesRead; + tracker.addBytes(bytesRead); + } + outStream.write(buf, 0, bytesRead); + } + /* don't close the input stream */ + } finally { + outStream.close(); + } + /* After all references to a Font2D are dropped, the file + * will be removed. To support long-lived AppContexts, + * we need to then decrement the byte count by the size + * of the file. + * If the data isn't a valid font, the implementation will + * delete the tmp file and decrement the byte count + * in the tracker object before returning from the + * constructor, so we can set 'copiedFontData' to true here + * without waiting for the results of that constructor. + */ + copiedFontData = true; + Font font = new Font(tFile, fontFormat, true, tracker); + return font; + } finally { + if (!copiedFontData) { + if (tracker != null) { + tracker.subBytes(totalSize); + } + AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Void run() { + tFile.delete(); + return null; + } + } + ); + } + } + } catch (Throwable t) { + if (t instanceof FontFormatException) { + throw (FontFormatException)t; + } + if (t instanceof IOException) { + throw (IOException)t; + } + Throwable cause = t.getCause(); + if (cause instanceof FontFormatException) { + throw (FontFormatException)cause; + } + throw new IOException("Problem reading font data."); } } @@ -913,6 +979,9 @@ */ public static Font createFont(int fontFormat, File fontFile) throws java.awt.FontFormatException, java.io.IOException { + + fontFile = new File(fontFile.getPath()); + if (fontFormat != Font.TRUETYPE_FONT && fontFormat != Font.TYPE1_FONT) { throw new IllegalArgumentException ("font format not recognized"); @@ -926,7 +995,7 @@ if (!fontFile.canRead()) { throw new IOException("Can't read " + fontFile); } - return new Font(fontFile, fontFormat, false); + return new Font(fontFile, fontFormat, false, null); } /** diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/io/File.java diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/lang/NoSuchFieldError.java --- a/jdk/src/share/classes/java/lang/NoSuchFieldError.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/lang/NoSuchFieldError.java Sat Apr 18 14:10:27 2009 -0700 @@ -41,14 +41,14 @@ private static final long serialVersionUID = -3456430195886129035L; /** - * Constructs a NoSuchFieldException with no detail message. + * Constructs a NoSuchFieldError with no detail message. */ public NoSuchFieldError() { super(); } /** - * Constructs a NoSuchFieldException with the specified + * Constructs a NoSuchFieldError with the specified * detail message. * * @param s the detail message. diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java --- a/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java Sat Apr 18 14:10:27 2009 -0700 @@ -196,10 +196,12 @@ if ((start < 0) || (end > len) || (start > end)) throw new IndexOutOfBoundsException(); - int sublen = end - start; - int off = offset + ((pos + start) << $LG_BYTES_PER_VALUE$); - assert (off >= 0); - return new ByteBufferAsCharBuffer$RW$$BO$(bb, -1, 0, sublen, sublen, off); + return new ByteBufferAsCharBuffer$RW$$BO$(bb, + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/nio/Direct-X-Buffer.java --- a/jdk/src/share/classes/java/nio/Direct-X-Buffer.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/nio/Direct-X-Buffer.java Sat Apr 18 14:10:27 2009 -0700 @@ -412,10 +412,12 @@ if ((start < 0) || (end > len) || (start > end)) throw new IndexOutOfBoundsException(); - int sublen = end - start; - int off = (pos + start) << $LG_BYTES_PER_VALUE$; - assert (off >= 0); - return new DirectCharBuffer$RW$$BO$(this, -1, 0, sublen, sublen, off); + return new DirectCharBuffer$RW$$BO$(this, + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/nio/Heap-X-Buffer.java --- a/jdk/src/share/classes/java/nio/Heap-X-Buffer.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/nio/Heap-X-Buffer.java Sat Apr 18 14:10:27 2009 -0700 @@ -572,10 +572,13 @@ || (end > length()) || (start > end)) throw new IndexOutOfBoundsException(); - int len = end - start; + int pos = position(); return new HeapCharBuffer$RW$(hb, - -1, 0, len, len, - offset + position() + start); + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/nio/StringCharBuffer.java --- a/jdk/src/share/classes/java/nio/StringCharBuffer.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/nio/StringCharBuffer.java Sat Apr 18 14:10:27 2009 -0700 @@ -102,10 +102,12 @@ public final CharBuffer subSequence(int start, int end) { try { int pos = position(); - return new StringCharBuffer(str, -1, + return new StringCharBuffer(str, + -1, pos + checkIndex(start, pos), pos + checkIndex(end, pos), - remaining(), offset); + capacity(), + offset); } catch (IllegalArgumentException x) { throw new IndexOutOfBoundsException(); } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java --- a/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java Sat Apr 18 14:10:27 2009 -0700 @@ -443,7 +443,7 @@ * at least care must be taken to ensure that the buffer is not accessed * while the channel remains open. * - *

If there is a security manager installed and the the channel is not + *

If there is a security manager installed and the channel is not * connected then this method verifies that the target address and port number * are permitted by the security manager's {@link SecurityManager#checkConnect * checkConnect} method. The overhead of this security check can be avoided diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/nio/file/Path.java --- a/jdk/src/share/classes/java/nio/file/Path.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/nio/file/Path.java Sat Apr 18 14:10:27 2009 -0700 @@ -494,7 +494,7 @@ * @throws IOException * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, it denies {@link LinkPermission}("symbolic") * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to the path of the symbolic link. @@ -531,7 +531,7 @@ * @throws IOException * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, it denies {@link LinkPermission}("hard") * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to both this path and the path of the @@ -560,7 +560,7 @@ * @throws IOException * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, it checks that {@code FilePermission} has been * granted with the "{@code readlink}" action to read the link. */ @@ -615,7 +615,7 @@ * obtained * * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, the {@link #toAbsolutePath toAbsolutePath} method * throws a security exception. */ @@ -636,7 +636,7 @@ * @throws IOError * if an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, its {@link SecurityManager#checkPropertyAccess(String) * checkPropertyAccess} method is invoked to check access to the * system property {@code user.dir} @@ -677,7 +677,7 @@ * @throws IOException * if the file does not exist or an I/O error occurs * @throws SecurityException - * In the case of the the default provider, and a security manager + * In the case of the default provider, and a security manager * is installed, its {@link SecurityManager#checkRead(String) checkRead} * method is invoked to check read access to the file, and where * this path is not absolute, its {@link SecurityManager#checkPropertyAccess(String) diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java --- a/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java Sat Apr 18 14:10:27 2009 -0700 @@ -208,7 +208,7 @@ * @throws ClosedDirectoryStreamException * if the directory stream is closed * @throws NoSuchFileException - * if the the directory does not exist (optional specific exception) + * if the directory does not exist (optional specific exception) * @throws DirectoryNotEmptyException * if the directory could not otherwise be deleted because it is * not empty (optional specific exception) diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/AccessController.java --- a/jdk/src/share/classes/java/security/AccessController.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/AccessController.java Sat Apr 18 14:10:27 2009 -0700 @@ -425,7 +425,7 @@ * Performs the specified PrivilegedExceptionAction with * privileges enabled and restricted by the specified * AccessControlContext. The action is performed with the - * intersection of the the permissions possessed by the caller's + * intersection of the permissions possessed by the caller's * protection domain, and those possessed by the domains represented by the * specified AccessControlContext. *

diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/AlgorithmParametersSpi.java --- a/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java Sat Apr 18 14:10:27 2009 -0700 @@ -102,7 +102,7 @@ * parameters should be returned in an instance of the * DSAParameterSpec class. * - * @param paramSpec the the specification class in which + * @param paramSpec the specification class in which * the parameters should be returned. * * @return the parameter specification. diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/PrivilegedActionException.java --- a/jdk/src/share/classes/java/security/PrivilegedActionException.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/PrivilegedActionException.java Sat Apr 18 14:10:27 2009 -0700 @@ -87,7 +87,7 @@ } /** - * Returns the the cause of this exception (the exception thrown by + * Returns the cause of this exception (the exception thrown by * the privileged computation that resulted in this * PrivilegedActionException). * diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/Security.java --- a/jdk/src/share/classes/java/security/Security.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/Security.java Sat Apr 18 14:10:27 2009 -0700 @@ -501,7 +501,7 @@ *

  • <crypto_service>.<algorithm_or_type> * <attribute_name>:< attribute_value> *

    The cryptographic service name must not contain any dots. There - * must be one or more space charaters between the the + * must be one or more space charaters between the * <algorithm_or_type> and the <attribute_name>. *

    A provider satisfies this selection criterion iff the * provider implements the specified algorithm or type for the specified diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/SecurityPermission.java --- a/jdk/src/share/classes/java/security/SecurityPermission.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/SecurityPermission.java Sat Apr 18 14:10:27 2009 -0700 @@ -118,7 +118,7 @@ * setProperty.{key} * Setting of the security property with the specified key * This could include setting a security provider or defining - * the location of the the system-wide security policy. Malicious + * the location of the system-wide security policy. Malicious * code that has permission to set a new security provider may * set a rogue provider that steals confidential information such * as cryptographic private keys. In addition, malicious code with diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/SignatureSpi.java --- a/jdk/src/share/classes/java/security/SignatureSpi.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/SignatureSpi.java Sat Apr 18 14:10:27 2009 -0700 @@ -316,7 +316,7 @@ * overridden by a provider * * @exception InvalidAlgorithmParameterException if this method is - * overridden by a provider and the the given parameters + * overridden by a provider and the given parameters * are inappropriate for this signature engine */ protected void engineSetParameter(AlgorithmParameterSpec params) diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/cert/CertificateFactory.java --- a/jdk/src/share/classes/java/security/cert/CertificateFactory.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/cert/CertificateFactory.java Sat Apr 18 14:10:27 2009 -0700 @@ -460,7 +460,7 @@ * {@link java.io.InputStream#reset() reset}, this method will * consume the entire input stream. Otherwise, each call to this * method consumes one CRL and the read position of the input stream - * is positioned to the next available byte after the the inherent + * is positioned to the next available byte after the inherent * end-of-CRL marker. If the data in the * input stream does not contain an inherent end-of-CRL marker (other * than EOF) and there is trailing data after the CRL is parsed, a diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java --- a/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java Sat Apr 18 14:10:27 2009 -0700 @@ -88,7 +88,7 @@ * {@link java.io.InputStream#reset() reset}, this method will * consume the entire input stream. Otherwise, each call to this * method consumes one certificate and the read position of the input stream - * is positioned to the next available byte after the the inherent + * is positioned to the next available byte after the inherent * end-of-certificate marker. If the data in the * input stream does not contain an inherent end-of-certificate marker (other * than EOF) and there is trailing data after the certificate is parsed, a @@ -261,7 +261,7 @@ * {@link java.io.InputStream#reset() reset}, this method will * consume the entire input stream. Otherwise, each call to this * method consumes one CRL and the read position of the input stream - * is positioned to the next available byte after the the inherent + * is positioned to the next available byte after the inherent * end-of-CRL marker. If the data in the * input stream does not contain an inherent end-of-CRL marker (other * than EOF) and there is trailing data after the CRL is parsed, a diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/Calendar.java --- a/jdk/src/share/classes/java/util/Calendar.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/util/Calendar.java Sat Apr 18 14:10:27 2009 -0700 @@ -41,9 +41,14 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.OptionalDataException; import java.io.Serializable; +import java.security.AccessControlContext; import java.security.AccessController; +import java.security.PermissionCollection; +import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.security.ProtectionDomain; import java.text.DateFormat; import java.text.DateFormatSymbols; import sun.util.BuddhistCalendar; @@ -2628,6 +2633,18 @@ } } + private static class CalendarAccessControlContext { + private static final AccessControlContext INSTANCE; + static { + RuntimePermission perm = new RuntimePermission("accessClassInPackage.sun.util.calendar"); + PermissionCollection perms = perm.newPermissionCollection(); + perms.add(perm); + INSTANCE = new AccessControlContext(new ProtectionDomain[] { + new ProtectionDomain(null, perms) + }); + } + } + /** * Reconstitutes this object from a stream (i.e., deserialize it). */ @@ -2657,17 +2674,30 @@ serialVersionOnStream = currentSerialVersion; // If there's a ZoneInfo object, use it for zone. + ZoneInfo zi = null; try { - ZoneInfo zi = (ZoneInfo) AccessController.doPrivileged( - new PrivilegedExceptionAction() { - public Object run() throws Exception { - return input.readObject(); - } - }); - if (zi != null) { - zone = zi; + zi = AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public ZoneInfo run() throws Exception { + return (ZoneInfo) input.readObject(); + } + }, + CalendarAccessControlContext.INSTANCE); + } catch (PrivilegedActionException pae) { + Exception e = pae.getException(); + if (!(e instanceof OptionalDataException)) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else if (e instanceof IOException) { + throw (IOException) e; + } else if (e instanceof ClassNotFoundException) { + throw (ClassNotFoundException) e; + } + throw new RuntimeException(e); } - } catch (Exception e) { + } + if (zi != null) { + zone = zi; } // If the deserialized object has a SimpleTimeZone, try to @@ -2676,9 +2706,9 @@ // implementation as much as possible. if (zone instanceof SimpleTimeZone) { String id = zone.getID(); - TimeZone zi = TimeZone.getTimeZone(id); - if (zi != null && zi.hasSameRules(zone) && zi.getID().equals(id)) { - zone = zi; + TimeZone tz = TimeZone.getTimeZone(id); + if (tz != null && tz.hasSameRules(zone) && tz.getID().equals(id)) { + zone = tz; } } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/zip/ZipCoder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/java/util/zip/ZipCoder.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,139 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package java.util.zip; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; +import java.nio.charset.CodingErrorAction; +import java.util.Arrays; + +/** + * Utility class for zipfile name and comment decoding and encoding + */ + +final class ZipCoder { + + String toString(byte[] ba, int length) { + CharsetDecoder cd = decoder().reset(); + int len = (int)(length * cd.maxCharsPerByte()); + char[] ca = new char[len]; + if (len == 0) + return new String(ca); + ByteBuffer bb = ByteBuffer.wrap(ba, 0, length); + CharBuffer cb = CharBuffer.wrap(ca); + CoderResult cr = cd.decode(bb, cb, true); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + cr = cd.flush(cb); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + return new String(ca, 0, cb.position()); + } + + String toString(byte[] ba) { + return toString(ba, ba.length); + } + + byte[] getBytes(String s) { + CharsetEncoder ce = encoder().reset(); + char[] ca = s.toCharArray(); + int len = (int)(ca.length * ce.maxBytesPerChar()); + byte[] ba = new byte[len]; + if (len == 0) + return ba; + ByteBuffer bb = ByteBuffer.wrap(ba); + CharBuffer cb = CharBuffer.wrap(ca); + CoderResult cr = ce.encode(cb, bb, true); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + cr = ce.flush(bb); + if (!cr.isUnderflow()) + throw new IllegalArgumentException(cr.toString()); + if (bb.position() == ba.length) // defensive copy? + return ba; + else + return Arrays.copyOf(ba, bb.position()); + } + + // assume invoked only if "this" is not utf8 + byte[] getBytesUTF8(String s) { + if (isutf8) + return getBytes(s); + if (utf8 == null) + utf8 = new ZipCoder(Charset.forName("UTF-8")); + return utf8.getBytes(s); + } + + + String toStringUTF8(byte[] ba, int len) { + if (isutf8) + return toString(ba, len); + if (utf8 == null) + utf8 = new ZipCoder(Charset.forName("UTF-8")); + return utf8.toString(ba, len); + } + + boolean isUTF8() { + return isutf8; + } + + private Charset cs; + private CharsetDecoder dec; + private CharsetEncoder enc; + private boolean isutf8; + private ZipCoder utf8; + + private ZipCoder(Charset cs) { + this.cs = cs; + this.isutf8 = cs.name().equals("UTF-8"); + } + + static ZipCoder get(Charset charset) { + return new ZipCoder(charset); + } + + private CharsetDecoder decoder() { + if (dec == null) { + dec = cs.newDecoder() + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT); + } + return dec; + } + + private CharsetEncoder encoder() { + if (enc == null) { + enc = cs.newEncoder() + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT); + } + return enc; + } +} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/zip/ZipConstants64.java --- a/jdk/src/share/classes/java/util/zip/ZipConstants64.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/ZipConstants64.java Sat Apr 18 14:10:27 2009 -0700 @@ -73,5 +73,12 @@ static final int ZIP64_EXTSIZ = 8; // compressed size, 8-byte static final int ZIP64_EXTLEN = 16; // uncompressed size, 8-byte + /* + * Language encoding flag EFS + */ + static final int EFS = 0x800; // If this bit is set the filename and + // comment fields for this file must be + // encoded using UTF-8. + private ZipConstants64() {} } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/zip/ZipEntry.java --- a/jdk/src/share/classes/java/util/zip/ZipEntry.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java Sat Apr 18 14:10:27 2009 -0700 @@ -40,6 +40,7 @@ long size = -1; // uncompressed size of entry data long csize = -1; // compressed size of entry data int method = -1; // compression method + int flag = 0; // general purpose flag byte[] extra; // optional extra field data for entry String comment; // optional comment string for entry @@ -53,13 +54,6 @@ */ public static final int DEFLATED = 8; - static { - /* Zip library is loaded from System.initializeSystemClass */ - initIDs(); - } - - private static native void initIDs(); - /** * Creates a new zip entry with the specified name. * @@ -90,28 +84,15 @@ size = e.size; csize = e.csize; method = e.method; + flag = e.flag; extra = e.extra; comment = e.comment; } /* - * Creates a new zip entry for the given name with fields initialized - * from the specified jzentry data. + * Creates a new un-initialized zip entry */ - ZipEntry(String name, long jzentry) { - this.name = name; - initFields(jzentry); - } - - private native void initFields(long jzentry); - - /* - * Creates a new zip entry with fields initialized from the specified - * jzentry data. - */ - ZipEntry(long jzentry) { - initFields(jzentry); - } + ZipEntry() {} /** * Returns the name of the entry. @@ -258,16 +239,16 @@ /** * Sets the optional comment string for the entry. + * + *

    ZIP entry comments have maximum length of 0xffff. If the length of the + * specified comment string is greater than 0xFFFF bytes after encoding, only + * the first 0xFFFF bytes are output to the ZIP file entry. + * * @param comment the comment string - * @exception IllegalArgumentException if the length of the specified - * comment string is greater than 0xFFFF bytes + * * @see #getComment() */ public void setComment(String comment) { - if (comment != null && comment.length() > 0xffff/3 - && ZipOutputStream.getUTF8Length(comment) > 0xffff) { - throw new IllegalArgumentException("invalid entry comment length"); - } this.comment = comment; } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/zip/ZipFile.java --- a/jdk/src/share/classes/java/util/zip/ZipFile.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/ZipFile.java Sat Apr 18 14:10:27 2009 -0700 @@ -29,9 +29,11 @@ import java.io.IOException; import java.io.EOFException; import java.io.File; +import java.nio.charset.Charset; import java.util.Vector; import java.util.Enumeration; import java.util.NoSuchElementException; +import static java.util.zip.ZipConstants64.*; /** * This class is used to read entries from a zip file. @@ -76,16 +78,19 @@ /** * Opens a zip file for reading. * - *

    First, if there is a security - * manager, its checkRead method - * is called with the name argument - * as its argument to ensure the read is allowed. + *

    First, if there is a security manager, its checkRead + * method is called with the name argument as its argument + * to ensure the read is allowed. + * + *

    The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names and comments. * * @param name the name of the zip file * @throws ZipException if a ZIP format error has occurred * @throws IOException if an I/O error has occurred * @throws SecurityException if a security manager exists and its * checkRead method doesn't allow read access to the file. + * * @see SecurityManager#checkRead(java.lang.String) */ public ZipFile(String name) throws IOException { @@ -101,6 +106,9 @@ * method is called with the name argument as its argument to * ensure the read is allowed. * + *

    The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names and comments + * * @param file the ZIP file to be opened for reading * @param mode the mode in which the file is to be opened * @throws ZipException if a ZIP format error has occurred @@ -115,6 +123,59 @@ * @since 1.3 */ public ZipFile(File file, int mode) throws IOException { + this(file, mode, Charset.forName("UTF-8")); + } + + /** + * Opens a ZIP file for reading given the specified File object. + * + *

    The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names and comments. + * + * @param file the ZIP file to be opened for reading + * @throws ZipException if a ZIP format error has occurred + * @throws IOException if an I/O error has occurred + */ + public ZipFile(File file) throws ZipException, IOException { + this(file, OPEN_READ); + } + + private ZipCoder zc; + + /** + * Opens a new ZipFile to read from the specified + * File object in the specified mode. The mode argument + * must be either OPEN_READ or OPEN_READ | OPEN_DELETE. + * + *

    First, if there is a security manager, its checkRead + * method is called with the name argument as its argument to + * ensure the read is allowed. + * + * @param file the ZIP file to be opened for reading + * @param mode the mode in which the file is to be opened + * @param charset + * the {@link java.nio.charset.Charset {@code charset}} to + * be used to decode the ZIP entry name and comment that are not + * encoded by using UTF-8 encoding (indicated by entry's general + * purpose flag). + * + * @throws ZipException if a ZIP format error has occurred + * @throws IOException if an I/O error has occurred + * + * @throws SecurityException + * if a security manager exists and its checkRead + * method doesn't allow read access to the file,or its + * checkDelete method doesn't allow deleting the + * file when the OPEN_DELETE flag is set + * + * @throws IllegalArgumentException if the mode argument is invalid + * + * @see SecurityManager#checkRead(java.lang.String) + * + * @since 1.7 + */ + public ZipFile(File file, int mode, Charset charset) throws IOException + { if (((mode & OPEN_READ) == 0) || ((mode & ~(OPEN_READ | OPEN_DELETE)) != 0)) { throw new IllegalArgumentException("Illegal mode: 0x"+ @@ -128,24 +189,61 @@ sm.checkDelete(name); } } + if (charset == null) + throw new NullPointerException("charset is null"); + this.zc = ZipCoder.get(charset); jzfile = open(name, mode, file.lastModified()); - this.name = name; this.total = getTotal(jzfile); } - private static native long open(String name, int mode, long lastModified); - private static native int getTotal(long jzfile); - + /** + * Opens a zip file for reading. + * + *

    First, if there is a security manager, its checkRead + * method is called with the name argument as its argument + * to ensure the read is allowed. + * + * @param name the name of the zip file + * @param charset + * the {@link java.nio.charset.Charset {@code charset}} to + * be used to decode the ZIP entry name and comment that are not + * encoded by using UTF-8 encoding (indicated by entry's general + * purpose flag). + * + * @throws ZipException if a ZIP format error has occurred + * @throws IOException if an I/O error has occurred + * @throws SecurityException + * if a security manager exists and its checkRead + * method doesn't allow read access to the file + * + * @see SecurityManager#checkRead(java.lang.String) + * + * @since 1.7 + */ + public ZipFile(String name, Charset charset) throws IOException + { + this(new File(name), OPEN_READ, charset); + } /** * Opens a ZIP file for reading given the specified File object. * @param file the ZIP file to be opened for reading - * @throws ZipException if a ZIP error has occurred + * @param charset + * The {@link java.nio.charset.Charset {@code charset}} to be + * used to decode the ZIP entry name and comment (ignored if + * the language + * encoding bit of the ZIP entry's general purpose bit + * flag is set). + * + * @throws ZipException if a ZIP format error has occurred * @throws IOException if an I/O error has occurred + * + * @since 1.7 */ - public ZipFile(File file) throws ZipException, IOException { - this(file, OPEN_READ); + public ZipFile(File file, Charset charset) throws IOException + { + this(file, OPEN_READ, charset); } /** @@ -163,9 +261,9 @@ long jzentry = 0; synchronized (this) { ensureOpen(); - jzentry = getEntry(jzfile, name, true); + jzentry = getEntry(jzfile, zc.getBytes(name), true); if (jzentry != 0) { - ZipEntry ze = new ZipEntry(name, jzentry); + ZipEntry ze = getZipEntry(name, jzentry); freeEntry(jzfile, jzentry); return ze; } @@ -173,7 +271,7 @@ return null; } - private static native long getEntry(long jzfile, String name, + private static native long getEntry(long jzfile, byte[] name, boolean addSlash); // freeEntry releases the C jzentry struct. @@ -194,36 +292,30 @@ * @throws IllegalStateException if the zip file has been closed */ public InputStream getInputStream(ZipEntry entry) throws IOException { - return getInputStream(entry.name); - } - - /** - * Returns an input stream for reading the contents of the specified - * entry, or null if the entry was not found. - */ - private InputStream getInputStream(String name) throws IOException { - if (name == null) { - throw new NullPointerException("name"); + if (entry == null) { + throw new NullPointerException("entry"); } long jzentry = 0; ZipFileInputStream in = null; synchronized (this) { ensureOpen(); - jzentry = getEntry(jzfile, name, false); + if (!zc.isUTF8() && (entry.flag & EFS) != 0) { + jzentry = getEntry(jzfile, zc.getBytesUTF8(entry.name), false); + } else { + jzentry = getEntry(jzfile, zc.getBytes(entry.name), false); + } if (jzentry == 0) { return null; } - in = new ZipFileInputStream(jzentry); - } final ZipFileInputStream zfin = in; - switch (getMethod(jzentry)) { + switch (getEntryMethod(jzentry)) { case STORED: return zfin; case DEFLATED: // MORE: Compute good size for inflater stream: - long size = getSize(jzentry) + 2; // Inflater likes a bit of slack + long size = getEntrySize(jzentry) + 2; // Inflater likes a bit of slack if (size > 65536) size = 8192; if (size <= 0) size = 4096; return new InflaterInputStream(zfin, getInflater(), (int)size) { @@ -267,8 +359,6 @@ } } - private static native int getMethod(long jzentry); - /* * Gets an inflater from the list of available inflaters or allocates * a new one. @@ -343,7 +433,7 @@ ",\n message = " + message ); } - ZipEntry ze = new ZipEntry(jzentry); + ZipEntry ze = getZipEntry(null, jzentry); freeEntry(jzfile, jzentry); return ze; } @@ -351,6 +441,38 @@ }; } + private ZipEntry getZipEntry(String name, long jzentry) { + ZipEntry e = new ZipEntry(); + e.flag = getEntryFlag(jzentry); // get the flag first + if (name != null) { + e.name = name; + } else { + byte[] bname = getEntryBytes(jzentry, JZENTRY_NAME); + if (!zc.isUTF8() && (e.flag & EFS) != 0) { + e.name = zc.toStringUTF8(bname, bname.length); + } else { + e.name = zc.toString(bname, bname.length); + } + } + e.time = getEntryTime(jzentry); + e.crc = getEntryCrc(jzentry); + e.size = getEntrySize(jzentry); + e. csize = getEntryCSize(jzentry); + e.method = getEntryMethod(jzentry); + e.extra = getEntryBytes(jzentry, JZENTRY_EXTRA); + byte[] bcomm = getEntryBytes(jzentry, JZENTRY_COMMENT); + if (bcomm == null) { + e.comment = null; + } else { + if (!zc.isUTF8() && (e.flag & EFS) != 0) { + e.comment = zc.toStringUTF8(bcomm, bcomm.length); + } else { + e.comment = zc.toString(bcomm, bcomm.length); + } + } + return e; + } + private static native long getNextEntry(long jzfile, int i); /** @@ -443,8 +565,8 @@ ZipFileInputStream(long jzentry) { pos = 0; - rem = getCSize(jzentry); - size = getSize(jzentry); + rem = getEntryCSize(jzentry); + size = getEntrySize(jzentry); this.jzentry = jzentry; } @@ -514,13 +636,25 @@ } + + private static native long open(String name, int mode, long lastModified) + throws IOException; + private static native int getTotal(long jzfile); private static native int read(long jzfile, long jzentry, long pos, byte[] b, int off, int len); - private static native long getCSize(long jzentry); + // access to the native zentry object + private static native long getEntryTime(long jzentry); + private static native long getEntryCrc(long jzentry); + private static native long getEntryCSize(long jzentry); + private static native long getEntrySize(long jzentry); + private static native int getEntryMethod(long jzentry); + private static native int getEntryFlag(long jzentry); - private static native long getSize(long jzentry); + private static final int JZENTRY_NAME = 0; + private static final int JZENTRY_EXTRA = 1; + private static final int JZENTRY_COMMENT = 2; + private static native byte[] getEntryBytes(long jzentry, int type); - // Temporary add on for bug troubleshooting private static native String getZipMessage(long jzfile); } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/zip/ZipInputStream.java --- a/jdk/src/share/classes/java/util/zip/ZipInputStream.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/ZipInputStream.java Sat Apr 18 14:10:27 2009 -0700 @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.EOFException; import java.io.PushbackInputStream; +import java.nio.charset.Charset; import static java.util.zip.ZipConstants64.*; /** @@ -54,6 +55,8 @@ // one entry private boolean entryEOF = false; + private ZipCoder zc; + /** * Check to make sure that this stream has not been closed */ @@ -65,14 +68,39 @@ /** * Creates a new ZIP input stream. + * + *

    The UTF-8 {@link java.nio.charset.Charset charset} is used to + * decode the entry names. + * * @param in the actual input stream */ public ZipInputStream(InputStream in) { + this(in, Charset.forName("UTF-8")); + } + + /** + * Creates a new ZIP input stream. + * + * @param in the actual input stream + * + * @param charset + * The {@link java.nio.charset.Charset {@code charset}} to be + * used to decode the ZIP entry name (ignored if the + * language + * encoding bit of the ZIP entry's general purpose bit + * flag is set). + * + * @since 1.7 + */ + public ZipInputStream(InputStream in, Charset charset) { super(new PushbackInputStream(in, 512), new Inflater(true), 512); usesDefaultInflater = true; if(in == null) { throw new NullPointerException("in is null"); } + if (charset == null) + throw new NullPointerException("charset is null"); + this.zc = ZipCoder.get(charset); } /** @@ -141,8 +169,8 @@ * @param len the maximum number of bytes read * @return the actual number of bytes read, or -1 if the end of the * entry is reached - * @exception NullPointerException If b is null. - * @exception IndexOutOfBoundsException If off is negative, + * @exception NullPointerException if b is null. + * @exception IndexOutOfBoundsException if off is negative, * len is negative, or len is greater than * b.length - off * @exception ZipException if a ZIP file error has occurred @@ -252,6 +280,8 @@ if (get32(tmpbuf, 0) != LOCSIG) { return null; } + // get flag first, we need check EFS. + flag = get16(tmpbuf, LOCFLG); // get the entry name and create the ZipEntry first int len = get16(tmpbuf, LOCNAM); int blen = b.length; @@ -262,9 +292,11 @@ b = new byte[blen]; } readFully(b, 0, len); - ZipEntry e = createZipEntry(getUTF8String(b, 0, len)); + // Force to use UTF-8 if the EFS bit is ON, even the cs is NOT UTF-8 + ZipEntry e = createZipEntry(((flag & EFS) != 0) + ? zc.toStringUTF8(b, len) + : zc.toString(b, len)); // now get the remaining fields for the entry - flag = get16(tmpbuf, LOCFLG); if ((flag & 1) == 1) { throw new ZipException("encrypted ZIP entry not supported"); } @@ -313,71 +345,6 @@ return e; } - /* - * Fetches a UTF8-encoded String from the specified byte array. - */ - private static String getUTF8String(byte[] b, int off, int len) { - // First, count the number of characters in the sequence - int count = 0; - int max = off + len; - int i = off; - while (i < max) { - int c = b[i++] & 0xff; - switch (c >> 4) { - case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: - // 0xxxxxxx - count++; - break; - case 12: case 13: - // 110xxxxx 10xxxxxx - if ((b[i++] & 0xc0) != 0x80) { - throw new IllegalArgumentException(); - } - count++; - break; - case 14: - // 1110xxxx 10xxxxxx 10xxxxxx - if (((b[i++] & 0xc0) != 0x80) || - ((b[i++] & 0xc0) != 0x80)) { - throw new IllegalArgumentException(); - } - count++; - break; - default: - // 10xxxxxx, 1111xxxx - throw new IllegalArgumentException(); - } - } - if (i != max) { - throw new IllegalArgumentException(); - } - // Now decode the characters... - char[] cs = new char[count]; - i = 0; - while (off < max) { - int c = b[off++] & 0xff; - switch (c >> 4) { - case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: - // 0xxxxxxx - cs[i++] = (char)c; - break; - case 12: case 13: - // 110xxxxx 10xxxxxx - cs[i++] = (char)(((c & 0x1f) << 6) | (b[off++] & 0x3f)); - break; - case 14: - // 1110xxxx 10xxxxxx 10xxxxxx - int t = (b[off++] & 0x3f) << 6; - cs[i++] = (char)(((c & 0x0f) << 12) | t | (b[off++] & 0x3f)); - break; - default: - // 10xxxxxx, 1111xxxx - throw new IllegalArgumentException(); - } - } - return new String(cs, 0, count); - } - /** * Creates a new ZipEntry object for the specified * entry name. diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/zip/ZipOutputStream.java --- a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java Sat Apr 18 14:10:27 2009 -0700 @@ -27,6 +27,7 @@ import java.io.OutputStream; import java.io.IOException; +import java.nio.charset.Charset; import java.util.Vector; import java.util.HashSet; import static java.util.zip.ZipConstants64.*; @@ -44,19 +45,9 @@ private static class XEntry { public final ZipEntry entry; public final long offset; - public final int flag; public XEntry(ZipEntry entry, long offset) { this.entry = entry; this.offset = offset; - this.flag = (entry.method == DEFLATED && - (entry.size == -1 || - entry.csize == -1 || - entry.crc == -1)) - // store size, compressed size, and crc-32 in data descriptor - // immediately following the compressed entry data - ? 8 - // store size, compressed size, and crc-32 in LOC header - : 0; } } @@ -66,12 +57,14 @@ private CRC32 crc = new CRC32(); private long written = 0; private long locoff = 0; - private String comment; + private byte[] comment; private int method = DEFLATED; private boolean finished; private boolean closed = false; + private final ZipCoder zc; + private static int version(ZipEntry e) throws ZipException { switch (e.method) { case DEFLATED: return 20; @@ -100,10 +93,31 @@ /** * Creates a new ZIP output stream. + * + *

    The UTF-8 {@link java.nio.charset.Charset charset} is used + * to encode the entry names and comments. + * * @param out the actual output stream */ public ZipOutputStream(OutputStream out) { + this(out, Charset.forName("UTF-8")); + } + + /** + * Creates a new ZIP output stream. + * + * @param out the actual output stream + * + * @param charset the {@link java.nio.charset.Charset charset} + * to be used to encode the entry names and comments + * + * @since 1.7 + */ + public ZipOutputStream(OutputStream out, Charset charset) { super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true)); + if (charset == null) + throw new NullPointerException("charset is null"); + this.zc = ZipCoder.get(charset); usesDefaultDeflater = true; } @@ -114,11 +128,11 @@ * ZIP file comment is greater than 0xFFFF bytes */ public void setComment(String comment) { - if (comment != null && comment.length() > 0xffff/3 - && getUTF8Length(comment) > 0xffff) { - throw new IllegalArgumentException("ZIP file comment too long."); + if (comment != null) { + this.comment = zc.getBytes(comment); + if (this.comment.length > 0xffff) + throw new IllegalArgumentException("ZIP file comment too long."); } - this.comment = comment; } /** @@ -167,8 +181,15 @@ if (e.method == -1) { e.method = method; // use default method } + // store size, compressed size, and crc-32 in LOC header + e.flag = 0; switch (e.method) { case DEFLATED: + // store size, compressed size, and crc-32 in data descriptor + // immediately following the compressed entry data + if (e.size == -1 || e.csize == -1 || e.crc == -1) + e.flag = 8; + break; case STORED: // compressed size, uncompressed size, and crc-32 must all be @@ -192,6 +213,8 @@ if (! names.add(e.name)) { throw new ZipException("duplicate entry: " + e.name); } + if (zc.isUTF8()) + e.flag |= EFS; current = new XEntry(e, written); xentries.add(current); writeLOC(current); @@ -213,7 +236,7 @@ while (!def.finished()) { deflate(); } - if ((current.flag & 8) == 0) { + if ((e.flag & 8) == 0) { // verify size, compressed size, and crc-32 settings if (e.size != def.getBytesRead()) { throw new ZipException( @@ -343,11 +366,11 @@ */ private void writeLOC(XEntry xentry) throws IOException { ZipEntry e = xentry.entry; - int flag = xentry.flag; + int flag = e.flag; int elen = (e.extra != null) ? e.extra.length : 0; boolean hasZip64 = false; - writeInt(LOCSIG); // LOC header signature + writeInt(LOCSIG); // LOC header signature if ((flag & 8) == 8) { writeShort(version(e)); // version needed to extract @@ -380,7 +403,7 @@ writeInt(e.size); // uncompressed size } } - byte[] nameBytes = getUTF8Bytes(e.name); + byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); writeShort(elen); writeBytes(nameBytes, 0, nameBytes.length); @@ -417,7 +440,7 @@ */ private void writeCEN(XEntry xentry) throws IOException { ZipEntry e = xentry.entry; - int flag = xentry.flag; + int flag = e.flag; int version = version(e); long csize = e.csize; @@ -454,7 +477,7 @@ writeInt(e.crc); // crc-32 writeInt(csize); // compressed size writeInt(size); // uncompressed size - byte[] nameBytes = getUTF8Bytes(e.name); + byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); if (hasZip64) { // + headid(2) + datasize(2) @@ -464,8 +487,8 @@ } byte[] commentBytes; if (e.comment != null) { - commentBytes = getUTF8Bytes(e.comment); - writeShort(commentBytes.length); + commentBytes = zc.getBytes(e.comment); + writeShort(Math.min(commentBytes.length, 0xffff)); } else { commentBytes = null; writeShort(0); @@ -489,7 +512,7 @@ writeBytes(e.extra, 0, e.extra.length); } if (commentBytes != null) { - writeBytes(commentBytes, 0, commentBytes.length); + writeBytes(commentBytes, 0, Math.min(commentBytes.length, 0xffff)); } } @@ -541,9 +564,8 @@ writeInt(xlen); // length of central directory writeInt(xoff); // offset of central directory if (comment != null) { // zip file comment - byte[] b = getUTF8Bytes(comment); - writeShort(b.length); - writeBytes(b, 0, b.length); + writeShort(comment.length); + writeBytes(comment, 0, comment.length); } else { writeShort(0); } @@ -594,60 +616,4 @@ super.out.write(b, off, len); written += len; } - - /* - * Returns the length of String's UTF8 encoding. - */ - static int getUTF8Length(String s) { - int count = 0; - for (int i = 0; i < s.length(); i++) { - char ch = s.charAt(i); - if (ch <= 0x7f) { - count++; - } else if (ch <= 0x7ff) { - count += 2; - } else { - count += 3; - } - } - return count; - } - - /* - * Returns an array of bytes representing the UTF8 encoding - * of the specified String. - */ - private static byte[] getUTF8Bytes(String s) { - char[] c = s.toCharArray(); - int len = c.length; - // Count the number of encoded bytes... - int count = 0; - for (int i = 0; i < len; i++) { - int ch = c[i]; - if (ch <= 0x7f) { - count++; - } else if (ch <= 0x7ff) { - count += 2; - } else { - count += 3; - } - } - // Now return the encoded bytes... - byte[] b = new byte[count]; - int off = 0; - for (int i = 0; i < len; i++) { - int ch = c[i]; - if (ch <= 0x7f) { - b[off++] = (byte)ch; - } else if (ch <= 0x7ff) { - b[off++] = (byte)((ch >> 6) | 0xc0); - b[off++] = (byte)((ch & 0x3f) | 0x80); - } else { - b[off++] = (byte)((ch >> 12) | 0xe0); - b[off++] = (byte)(((ch >> 6) & 0x3f) | 0x80); - b[off++] = (byte)((ch & 0x3f) | 0x80); - } - } - return b; - } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/java/util/zip/package.html --- a/jdk/src/share/classes/java/util/zip/package.html Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/package.html Sat Apr 18 14:10:27 2009 -0700 @@ -53,6 +53,11 @@ PKWARE ZIP File Format Specification. The ZIP64(tm) format extensions are used to overcome the size limitations of the original ZIP format.

    + +

  • APPENDIX D of + PKWARE ZIP File Format Specification - Language Encoding Flag (EFS) to + encode ZIP entry filename and comment fields using UTF-8. +

  • ZLIB Compressed Data Format Specification version 3.3   diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/javax/management/monitor/CounterMonitor.java --- a/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java Sat Apr 18 14:10:27 2009 -0700 @@ -599,7 +599,7 @@ */ @Override public MBeanNotificationInfo[] getNotificationInfo() { - return notifsInfo; + return notifsInfo.clone(); } /* diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java --- a/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java Sat Apr 18 14:10:27 2009 -0700 @@ -481,7 +481,7 @@ */ @Override public MBeanNotificationInfo[] getNotificationInfo() { - return notifsInfo; + return notifsInfo.clone(); } /* diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/javax/management/monitor/Monitor.java --- a/jdk/src/share/classes/javax/management/monitor/Monitor.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/javax/management/monitor/Monitor.java Sat Apr 18 14:10:27 2009 -0700 @@ -32,7 +32,10 @@ import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedAction; +import java.security.ProtectionDomain; import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -163,7 +166,10 @@ /** * AccessControlContext of the Monitor.start() caller. */ - private AccessControlContext acc; + private static final AccessControlContext noPermissionsACC = + new AccessControlContext( + new ProtectionDomain[] {new ProtectionDomain(null, null)}); + private volatile AccessControlContext acc = noPermissionsACC; /** * Scheduler Service. @@ -173,14 +179,20 @@ new DaemonThreadFactory("Scheduler")); /** + * Map containing the thread pool executor per thread group. + */ + private static final Map executors = + new WeakHashMap(); + + /** + * Lock for executors map. + */ + private static final Object executorsLock = new Object(); + + /** * Maximum Pool Size */ private static final int maximumPoolSize; - - /** - * Executor Service. - */ - private static final ThreadPoolExecutor executor; static { final String maximumPoolSizeSysProp = "jmx.x.monitor.maximum.pool.size"; final String maximumPoolSizeStr = AccessController.doPrivileged( @@ -210,22 +222,9 @@ maximumPoolSize = maximumPoolSizeTmp; } } - executor = new ThreadPoolExecutor( - maximumPoolSize, - maximumPoolSize, - 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(), - new DaemonThreadFactory("Executor")); - executor.allowCoreThreadTimeOut(true); } /** - * Monitor task to be executed by the Executor Service. - */ - private final MonitorTask monitorTask = new MonitorTask(); - - /** * Future associated to the current monitor task. */ private Future monitorFuture; @@ -233,7 +232,7 @@ /** * Scheduler task to be executed by the Scheduler Service. */ - private final SchedulerTask schedulerTask = new SchedulerTask(monitorTask); + private final SchedulerTask schedulerTask = new SchedulerTask(); /** * ScheduledFuture associated to the current scheduler task. @@ -719,6 +718,7 @@ // Start the scheduler. // cleanupFutures(); + schedulerTask.setMonitorTask(new MonitorTask()); schedulerFuture = scheduler.schedule(schedulerTask, getGranularityPeriod(), TimeUnit.MILLISECONDS); @@ -748,7 +748,7 @@ // Reset the AccessControlContext. // - acc = null; + acc = noPermissionsACC; // Reset the complex type attribute information // such that it is recalculated again. @@ -1467,7 +1467,7 @@ */ private class SchedulerTask implements Runnable { - private Runnable task = null; + private MonitorTask task; /* * ------------------------------------------ @@ -1475,7 +1475,16 @@ * ------------------------------------------ */ - public SchedulerTask(Runnable task) { + public SchedulerTask() { + } + + /* + * ------------------------------------------ + * GETTERS/SETTERS + * ------------------------------------------ + */ + + public void setMonitorTask(MonitorTask task) { this.task = task; } @@ -1487,7 +1496,7 @@ public void run() { synchronized (Monitor.this) { - Monitor.this.monitorFuture = executor.submit(task); + Monitor.this.monitorFuture = task.submit(); } } } @@ -1500,6 +1509,8 @@ */ private class MonitorTask implements Runnable { + private ThreadPoolExecutor executor; + /* * ------------------------------------------ * CONSTRUCTORS @@ -1507,6 +1518,38 @@ */ public MonitorTask() { + // Find out if there's already an existing executor for the calling + // thread and reuse it. Otherwise, create a new one and store it in + // the executors map. If there is a SecurityManager, the group of + // System.getSecurityManager() is used, else the group of the thread + // instantiating this MonitorTask, i.e. the group of the thread that + // calls "Monitor.start()". + SecurityManager s = System.getSecurityManager(); + ThreadGroup group = (s != null) ? s.getThreadGroup() : + Thread.currentThread().getThreadGroup(); + synchronized (executorsLock) { + for (ThreadPoolExecutor e : executors.keySet()) { + DaemonThreadFactory tf = + (DaemonThreadFactory) e.getThreadFactory(); + ThreadGroup tg = tf.getThreadGroup(); + if (tg == group) { + executor = e; + break; + } + } + if (executor == null) { + executor = new ThreadPoolExecutor( + maximumPoolSize, + maximumPoolSize, + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(), + new DaemonThreadFactory("ThreadGroup<" + + group.getName() + "> Executor", group)); + executor.allowCoreThreadTimeOut(true); + executors.put(executor, null); + } + } } /* @@ -1515,12 +1558,18 @@ * ------------------------------------------ */ + public Future submit() { + return executor.submit(this); + } + public void run() { final ScheduledFuture sf; + final AccessControlContext ac; synchronized (Monitor.this) { sf = Monitor.this.schedulerFuture; + ac = Monitor.this.acc; } - AccessController.doPrivileged(new PrivilegedAction() { + PrivilegedAction action = new PrivilegedAction() { public Void run() { if (Monitor.this.isActive()) { final int an[] = alreadyNotifieds; @@ -1533,7 +1582,11 @@ } return null; } - }, Monitor.this.acc); + }; + if (ac == null) { + throw new SecurityException("AccessControlContext cannot be null"); + } + AccessController.doPrivileged(action, ac); synchronized (Monitor.this) { if (Monitor.this.isActive() && Monitor.this.schedulerFuture == sf) { @@ -1573,6 +1626,15 @@ namePrefix = "JMX Monitor " + poolName + " Pool [Thread-"; } + public DaemonThreadFactory(String poolName, ThreadGroup threadGroup) { + group = threadGroup; + namePrefix = "JMX Monitor " + poolName + " Pool [Thread-"; + } + + public ThreadGroup getThreadGroup() { + return group; + } + public Thread newThread(Runnable r) { Thread t = new Thread(group, r, diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/javax/management/monitor/StringMonitor.java --- a/jdk/src/share/classes/javax/management/monitor/StringMonitor.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/javax/management/monitor/StringMonitor.java Sat Apr 18 14:10:27 2009 -0700 @@ -184,6 +184,7 @@ * @return The derived gauge of the specified object. * */ + @Override public synchronized String getDerivedGauge(ObjectName object) { return (String) super.getDerivedGauge(object); } @@ -199,6 +200,7 @@ * @return The derived gauge timestamp of the specified object. * */ + @Override public synchronized long getDerivedGaugeTimeStamp(ObjectName object) { return super.getDerivedGaugeTimeStamp(object); } @@ -341,8 +343,9 @@ * the Java class of the notification and the notification types sent by * the string monitor. */ + @Override public MBeanNotificationInfo[] getNotificationInfo() { - return notifsInfo; + return notifsInfo.clone(); } /* diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java --- a/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java Sat Apr 18 14:10:27 2009 -0700 @@ -123,8 +123,10 @@ if (x > y) { throw new IllegalArgumentException("X dimension > Y dimension"); } - mediaName = media; - mediaMap.put(mediaName, this); + if (media != null && mediaMap.get(media) == null) { + mediaName = media; + mediaMap.put(mediaName, this); + } sizeVector.add(this); } @@ -147,8 +149,10 @@ if (x > y) { throw new IllegalArgumentException("X dimension > Y dimension"); } - mediaName = media; - mediaMap.put(mediaName, this); + if (media != null && mediaMap.get(media) == null) { + mediaName = media; + mediaMap.put(mediaName, this); + } sizeVector.add(this); } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/awt/image/GifImageDecoder.java --- a/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java Sat Apr 18 14:10:27 2009 -0700 @@ -585,9 +585,16 @@ System.out.print("Reading a " + width + " by " + height + " " + (interlace ? "" : "non-") + "interlaced image..."); } - + int initCodeSize = ExtractByte(block, 9); + if (initCodeSize >= 12) { + if (verbose) { + System.out.println("Invalid initial code size: " + + initCodeSize); + } + return false; + } boolean ret = parseImage(x, y, width, height, - interlace, ExtractByte(block, 9), + interlace, initCodeSize, block, rasline, model); if (!ret) { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/font/CreatedFontTracker.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/font/CreatedFontTracker.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package sun.font; + +public class CreatedFontTracker { + + public static final int MAX_FILE_SIZE = 32 * 1024 * 1024; + public static final int MAX_TOTAL_BYTES = 10 * MAX_FILE_SIZE; + + static int numBytes; + static CreatedFontTracker tracker; + + public static synchronized CreatedFontTracker getTracker() { + if (tracker == null) { + tracker = new CreatedFontTracker(); + } + return tracker; + } + + public synchronized int getNumBytes() { + return numBytes; + } + + public synchronized void addBytes(int sz) { + numBytes += sz; + } + + public synchronized void subBytes(int sz) { + numBytes -= sz; + } +} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/font/FileFont.java --- a/jdk/src/share/classes/sun/font/FileFont.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/font/FileFont.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -125,9 +125,9 @@ return true; } - void setFileToRemove(File file) { + void setFileToRemove(File file, CreatedFontTracker tracker) { Disposer.addObjectRecord(this, - new CreatedFontFileDisposerRecord(file)); + new CreatedFontFileDisposerRecord(file, tracker)); } /* This is called when a font scaler is determined to @@ -246,12 +246,16 @@ return getScaler().getUnitsPerEm(); } - private static class CreatedFontFileDisposerRecord implements DisposerRecord { + private static class CreatedFontFileDisposerRecord + implements DisposerRecord { File fontFile = null; + CreatedFontTracker tracker; - private CreatedFontFileDisposerRecord(File file) { + private CreatedFontFileDisposerRecord(File file, + CreatedFontTracker tracker) { fontFile = file; + this.tracker = tracker; } public void dispose() { @@ -260,6 +264,9 @@ public Object run() { if (fontFile != null) { try { + if (tracker != null) { + tracker.subBytes((int)fontFile.length()); + } /* REMIND: is it possible that the file is * still open? It will be closed when the * font2D is disposed but could this code diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/font/FontManager.java --- a/jdk/src/share/classes/sun/font/FontManager.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/font/FontManager.java Sat Apr 18 14:10:27 2009 -0700 @@ -2357,19 +2357,21 @@ static Vector tmpFontFiles = null; public static Font2D createFont2D(File fontFile, int fontFormat, - boolean isCopy) + boolean isCopy, + CreatedFontTracker tracker) throws FontFormatException { String fontFilePath = fontFile.getPath(); FileFont font2D = null; final File fFile = fontFile; + final CreatedFontTracker _tracker = tracker; try { switch (fontFormat) { case Font.TRUETYPE_FONT: font2D = new TrueTypeFont(fontFilePath, null, 0, true); break; case Font.TYPE1_FONT: - font2D = new Type1Font(fontFilePath, null); + font2D = new Type1Font(fontFilePath, null, isCopy); break; default: throw new FontFormatException("Unrecognised Font Format"); @@ -2379,6 +2381,9 @@ java.security.AccessController.doPrivileged( new java.security.PrivilegedAction() { public Object run() { + if (_tracker != null) { + _tracker.subBytes((int)fFile.length()); + } fFile.delete(); return null; } @@ -2387,7 +2392,7 @@ throw(e); } if (isCopy) { - font2D.setFileToRemove(fontFile); + font2D.setFileToRemove(fontFile, tracker); synchronized (FontManager.class) { if (tmpFontFiles == null) { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/font/TrueTypeFont.java --- a/jdk/src/share/classes/sun/font/TrueTypeFont.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/font/TrueTypeFont.java Sat Apr 18 14:10:27 2009 -0700 @@ -175,8 +175,17 @@ super(platname, nativeNames); useJavaRasterizer = javaRasterizer; fontRank = Font2D.TTF_RANK; - verify(); - init(fIndex); + try { + verify(); + init(fIndex); + } catch (Throwable t) { + close(); + if (t instanceof FontFormatException) { + throw (FontFormatException)t; + } else { + throw new FontFormatException("Unexpected runtime exception."); + } + } Disposer.addObjectRecord(this, disposerRecord); } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/font/Type1Font.java --- a/jdk/src/share/classes/sun/font/Type1Font.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/font/Type1Font.java Sat Apr 18 14:10:27 2009 -0700 @@ -39,6 +39,7 @@ import java.nio.channels.ClosedChannelException; import java.nio.channels.FileChannel; import sun.java2d.Disposer; +import sun.java2d.DisposerRecord; import java.util.HashSet; import java.util.HashMap; import java.awt.Font; @@ -76,6 +77,27 @@ */ public class Type1Font extends FileFont { + private static class T1DisposerRecord implements DisposerRecord { + String fileName = null; + + T1DisposerRecord(String name) { + fileName = name; + } + + public synchronized void dispose() { + java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction() { + public Object run() { + + if (fileName != null) { + (new java.io.File(fileName)).delete(); + } + return null; + } + }); + } + } + WeakReference bufferRef = new WeakReference(null); private String psName = null; @@ -125,18 +147,42 @@ /** + * Constructs a Type1 Font. + * @param platname - Platform identifier of the font. Typically file name. + * @param nativeNames - Native names - typically XLFDs on Unix. + */ + public Type1Font(String platname, Object nativeNames) + throws FontFormatException { + + this(platname, nativeNames, false); + } + + /** * - does basic verification of the file * - reads the names (full, family). * - determines the style of the font. * @throws FontFormatException - if the font can't be opened * or fails verification, or there's no usable cmap */ - public Type1Font(String platname, Object nativeNames) + public Type1Font(String platname, Object nativeNames, boolean createdCopy) throws FontFormatException { super(platname, nativeNames); fontRank = Font2D.TYPE1_RANK; checkedNatives = true; - verify(); + try { + verify(); + } catch (Throwable t) { + if (createdCopy) { + T1DisposerRecord ref = new T1DisposerRecord(platname); + Disposer.addObjectRecord(bufferRef, ref); + bufferRef = null; + } + if (t instanceof FontFormatException) { + throw (FontFormatException)t; + } else { + throw new FontFormatException("Unexpected runtime exception."); + } + } } private synchronized ByteBuffer getBuffer() throws FontFormatException { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/io/ByteToCharBig5.java --- a/jdk/src/share/classes/sun/io/ByteToCharBig5.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/io/ByteToCharBig5.java Sat Apr 18 14:10:27 2009 -0700 @@ -26,6 +26,8 @@ package sun.io; +import sun.nio.cs.ext.Big5; + /** * Tables and data to convert Big5 to Unicode * @@ -34,2179 +36,16 @@ public class ByteToCharBig5 extends ByteToCharDoubleByte { + private final static Big5 nioCoder = new Big5(); + public String getCharacterEncoding() { return "Big5"; } public ByteToCharBig5() { - super.index1 = index1; - super.index2 = index2; + super.index1 = nioCoder.getDecoderIndex1(); + super.index2 = nioCoder.getDecoderIndex2(); start = 0x40; end = 0xFE; } - - private final static String innerIndex0= - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u3000"+ - "\uFF0C\u3001\u3002\uFF0E\u2022\uFF1B\uFF1A\uFF1F"+ - "\uFF01\uFE30\u2026\u2025\uFE50\uFF64\uFE52\u00B7"+ - "\uFE54\uFE55\uFE56\uFE57\uFF5C\u2013\uFE31\u2014"+ - "\uFE33\uFF3F\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\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\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\uFFFD\uFF3F\uFFFD\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\u2641\u2609\u2191\u2193\u2190\u2192\u2196"+ - "\u2197\u2199\u2198\u2225\u2223\u2571\u2572\uFF0F"+ - "\uFF3C\uFF04\u00A5\u3012\u00A2\u00A3\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\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u256E"+ - "\u2570\u256F\u2550\u255E\u256A\u2561\u25E2\u25E3"+ - "\u25E5\u25E4\u2571\u2572\u2573\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\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\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\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\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\u4E59\u4E01\u4E03"+ - "\u4E43\u4E5D\u4E86\u4E8C\u4EBA\u513F\u5165\u516B"+ - "\u51E0\u5200\u5201\u529B\u5315\u5341\u535C\u53C8"+ - "\u4E09\u4E0B\u4E08\u4E0A\u4E2B\u4E38\u51E1\u4E45"+ - "\u4E48\u4E5F\u4E5E\u4E8E\u4EA1\u5140\u5203\u52FA"+ - "\u5343\u53C9\u53E3\u571F\u58EB\u5915\u5927\u5973"+ - "\u5B50\u5B51\u5B53\u5BF8\u5C0F\u5C22\u5C38\u5C71"+ - "\u5DDD\u5DE5\u5DF1\u5DF2\u5DF3\u5DFE\u5E72\u5EFE"+ - "\u5F0B\u5F13\u624D\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u4E11\u4E10\u4E0D"+ - "\u4E2D\u4E30\u4E39\u4E4B\u5C39\u4E88\u4E91\u4E95"+ - "\u4E92\u4E94\u4EA2\u4EC1\u4EC0\u4EC3\u4EC6\u4EC7"+ - "\u4ECD\u4ECA\u4ECB\u4EC4\u5143\u5141\u5167\u516D"+ - "\u516E\u516C\u5197\u51F6\u5206\u5207\u5208\u52FB"+ - "\u52FE\u52FF\u5316\u5339\u5348\u5347\u5345\u535E"+ - "\u5384\u53CB\u53CA\u53CD\u58EC\u5929\u592B\u592A"+ - "\u592D\u5B54\u5C11\u5C24\u5C3A\u5C6F\u5DF4\u5E7B"+ - "\u5EFF\u5F14\u5F15\u5FC3\u6208\u6236\u624B\u624E"+ - "\u652F\u6587\u6597\u65A4\u65B9\u65E5\u66F0\u6708"+ - "\u6728\u6B20\u6B62\u6B79\u6BCB\u6BD4\u6BDB\u6C0F"+ - "\u6C34\u706B\u722A\u7236\u723B\u7247\u7259\u725B"+ - "\u72AC\u738B\u4E19\u4E16\u4E15\u4E14\u4E18\u4E3B"+ - "\u4E4D\u4E4F\u4E4E\u4EE5\u4ED8\u4ED4\u4ED5\u4ED6"+ - "\u4ED7\u4EE3\u4EE4\u4ED9\u4EDE\u5145\u5144\u5189"+ - "\u518A\u51AC\u51F9\u51FA\u51F8\u520A\u52A0\u529F"+ - "\u5305\u5306\u5317\u531D\u4EDF\u534A\u5349\u5361"+ - "\u5360\u536F\u536E\u53BB\u53EF\u53E4\u53F3\u53EC"+ - "\u53EE\u53E9\u53E8\u53FC\u53F8\u53F5\u53EB\u53E6"+ - "\u53EA\u53F2\u53F1\u53F0\u53E5\u53ED\u53FB\u56DB"+ - "\u56DA\u5916\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u592E\u5931\u5974\u5976"+ - "\u5B55\u5B83\u5C3C\u5DE8\u5DE7\u5DE6\u5E02\u5E03"+ - "\u5E73\u5E7C\u5F01\u5F18\u5F17\u5FC5\u620A\u6253"+ - "\u6254\u6252\u6251\u65A5\u65E6\u672E\u672C\u672A"+ - "\u672B\u672D\u6B63\u6BCD\u6C11\u6C10\u6C38\u6C41"+ - "\u6C40\u6C3E\u72AF\u7384\u7389\u74DC\u74E6\u7518"+ - "\u751F\u7528\u7529\u7530\u7531\u7532\u7533\u758B"+ - "\u767D\u76AE\u76BF\u76EE\u77DB\u77E2\u77F3\u793A"+ - "\u79BE\u7A74\u7ACB\u4E1E\u4E1F\u4E52\u4E53\u4E69"+ - "\u4E99\u4EA4\u4EA6\u4EA5\u4EFF\u4F09\u4F19\u4F0A"+ - "\u4F15\u4F0D\u4F10\u4F11\u4F0F\u4EF2\u4EF6\u4EFB"+ - "\u4EF0\u4EF3\u4EFD\u4F01\u4F0B\u5149\u5147\u5146"+ - "\u5148\u5168\u5171\u518D\u51B0\u5217\u5211\u5212"+ - "\u520E\u5216\u52A3\u5308\u5321\u5320\u5370\u5371"+ - "\u5409\u540F\u540C\u540A\u5410\u5401\u540B\u5404"+ - "\u5411\u540D\u5408\u5403\u540E\u5406\u5412\u56E0"+ - "\u56DE\u56DD\u5733\u5730\u5728\u572D\u572C\u572F"+ - "\u5729\u5919\u591A\u5937\u5938\u5984\u5978\u5983"+ - "\u597D\u5979\u5982\u5981\u5B57\u5B58\u5B87\u5B88"+ - "\u5B85\u5B89\u5BFA\u5C16\u5C79\u5DDE\u5E06\u5E76"+ - "\u5E74\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u5F0F\u5F1B\u5FD9\u5FD6\u620E"+ - "\u620C\u620D\u6210\u6263\u625B\u6258\u6536\u65E9"+ - "\u65E8\u65EC\u65ED\u66F2\u66F3\u6709\u673D\u6734"+ - "\u6731\u6735\u6B21\u6B64\u6B7B\u6C16\u6C5D\u6C57"+ - "\u6C59\u6C5F\u6C60\u6C50\u6C55\u6C61\u6C5B\u6C4D"+ - "\u6C4E\u7070\u725F\u725D\u767E\u7AF9\u7C73\u7CF8"+ - "\u7F36\u7F8A\u7FBD\u8001\u8003\u800C\u8012\u8033"+ - "\u807F\u8089\u808B\u808C\u81E3\u81EA\u81F3\u81FC"+ - "\u820C\u821B\u821F\u826E\u8272\u827E\u866B\u8840"+ - "\u884C\u8863\u897F\u9621\u4E32\u4EA8\u4F4D\u4F4F"+ - "\u4F47\u4F57\u4F5E\u4F34\u4F5B\u4F55\u4F30\u4F50"+ - "\u4F51\u4F3D\u4F3A\u4F38\u4F43\u4F54\u4F3C\u4F46"+ - "\u4F63\u4F5C\u4F60\u4F2F\u4F4E\u4F36\u4F59\u4F5D"+ - "\u4F48\u4F5A\u514C\u514B\u514D\u5175\u51B6\u51B7"+ - "\u5225\u5224\u5229\u522A\u5228\u52AB\u52A9\u52AA"+ - "\u52AC\u5323\u5373\u5375\u541D\u542D\u541E\u543E"+ - "\u5426\u544E\u5427\u5446\u5443\u5433\u5448\u5442"+ - "\u541B\u5429\u544A\u5439\u543B\u5438\u542E\u5435"+ - "\u5436\u5420\u543C\u5440\u5431\u542B\u541F\u542C"+ - "\u56EA\u56F0\u56E4\u56EB\u574A\u5751\u5740\u574D"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u5747\u574E\u573E\u5750\u574F\u573B"+ - "\u58EF\u593E\u599D\u5992\u59A8\u599E\u59A3\u5999"+ - "\u5996\u598D\u59A4\u5993\u598A\u59A5\u5B5D\u5B5C"+ - "\u5B5A\u5B5B\u5B8C\u5B8B\u5B8F\u5C2C\u5C40\u5C41"+ - "\u5C3F\u5C3E\u5C90\u5C91\u5C94\u5C8C\u5DEB\u5E0C"+ - "\u5E8F\u5E87\u5E8A\u5EF7\u5F04\u5F1F\u5F64\u5F62"+ - "\u5F77\u5F79\u5FD8\u5FCC\u5FD7\u5FCD\u5FF1\u5FEB"+ - "\u5FF8\u5FEA\u6212\u6211\u6284\u6297\u6296\u6280"+ - "\u6276\u6289\u626D\u628A\u627C\u627E\u6279\u6273"+ - "\u6292\u626F\u6298\u626E\u6295\u6293\u6291\u6286"+ - "\u6539\u653B\u6538\u65F1\u66F4\u675F\u674E\u674F"+ - "\u6750\u6751\u675C\u6756\u675E\u6749\u6746\u6760"+ - "\u6753\u6757\u6B65\u6BCF\u6C42\u6C5E\u6C99\u6C81"+ - "\u6C88\u6C89\u6C85\u6C9B\u6C6A\u6C7A\u6C90\u6C70"+ - "\u6C8C\u6C68\u6C96\u6C92\u6C7D\u6C83\u6C72\u6C7E"+ - "\u6C74\u6C86\u6C76\u6C8D\u6C94\u6C98\u6C82\u7076"+ - "\u707C\u707D\u7078\u7262\u7261\u7260\u72C4\u72C2"+ - "\u7396\u752C\u752B\u7537\u7538\u7682\u76EF\u77E3"+ - "\u79C1\u79C0\u79BF\u7A76\u7CFB\u7F55\u8096\u8093"+ - "\u809D\u8098\u809B\u809A\u80B2\u826F\u8292\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u828B\u828D\u898B\u89D2\u8A00\u8C37\u8C46"+ - "\u8C55\u8C9D\u8D64\u8D70\u8DB3\u8EAB\u8ECA\u8F9B"+ - "\u8FB0\u8FC2\u8FC6\u8FC5\u8FC4\u5DE1\u9091\u90A2"+ - "\u90AA\u90A6\u90A3\u9149\u91C6\u91CC\u9632\u962E"+ - "\u9631\u962A\u962C\u4E26\u4E56\u4E73\u4E8B\u4E9B"+ - "\u4E9E\u4EAB\u4EAC\u4F6F\u4F9D\u4F8D\u4F73\u4F7F"+ - "\u4F6C\u4F9B\u4F8B\u4F86\u4F83\u4F70\u4F75\u4F88"+ - "\u4F69\u4F7B\u4F96\u4F7E\u4F8F\u4F91\u4F7A\u5154"+ - "\u5152\u5155\u5169\u5177\u5176\u5178\u51BD\u51FD"+ - "\u523B\u5238\u5237\u523A\u5230\u522E\u5236\u5241"+ - "\u52BE\u52BB\u5352\u5354\u5353\u5351\u5366\u5377"+ - "\u5378\u5379\u53D6\u53D4\u53D7\u5473\u5475\u5496"+ - "\u5478\u5495\u5480\u547B\u5477\u5484\u5492\u5486"+ - "\u547C\u5490\u5471\u5476\u548C\u549A\u5462\u5468"+ - "\u548B\u547D\u548E\u56FA\u5783\u5777\u576A\u5769"+ - "\u5761\u5766\u5764\u577C\u591C\u5949\u5947\u5948"+ - "\u5944\u5954\u59BE\u59BB\u59D4\u59B9\u59AE\u59D1"+ - "\u59C6\u59D0\u59CD\u59CB\u59D3\u59CA\u59AF\u59B3"+ - "\u59D2\u59C5\u5B5F\u5B64\u5B63\u5B97\u5B9A\u5B98"+ - "\u5B9C\u5B99\u5B9B\u5C1A\u5C48\u5C45\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u5C46\u5CB7\u5CA1\u5CB8\u5CA9\u5CAB\u5CB1\u5CB3"+ - "\u5E18\u5E1A\u5E16\u5E15\u5E1B\u5E11\u5E78\u5E9A"+ - "\u5E97\u5E9C\u5E95\u5E96\u5EF6\u5F26\u5F27\u5F29"+ - "\u5F80\u5F81\u5F7F\u5F7C\u5FDD\u5FE0\u5FFD\u5FF5"+ - "\u5FFF\u600F\u6014\u602F\u6035\u6016\u602A\u6015"+ - "\u6021\u6027\u6029\u602B\u601B\u6216\u6215\u623F"+ - "\u623E\u6240\u627F\u62C9\u62CC\u62C4\u62BF\u62C2"+ - "\u62B9\u62D2\u62DB\u62AB\u62D3\u62D4\u62CB\u62C8"+ - "\u62A8\u62BD\u62BC\u62D0\u62D9\u62C7\u62CD\u62B5"+ - "\u62DA\u62B1\u62D8\u62D6\u62D7\u62C6\u62AC\u62CE"+ - "\u653E\u65A7\u65BC\u65FA\u6614\u6613\u660C\u6606"+ - "\u6602\u660E\u6600\u660F\u6615\u660A\u6607\u670D"+ - "\u670B\u676D\u678B\u6795\u6771\u679C\u6773\u6777"+ - "\u6787\u679D\u6797\u676F\u6770\u677F\u6789\u677E"+ - "\u6790\u6775\u679A\u6793\u677C\u676A\u6772\u6B23"+ - "\u6B66\u6B67\u6B7F\u6C13\u6C1B\u6CE3\u6CE8\u6CF3"+ - "\u6CB1\u6CCC\u6CE5\u6CB3\u6CBD\u6CBE\u6CBC\u6CE2"+ - "\u6CAB\u6CD5\u6CD3\u6CB8\u6CC4\u6CB9\u6CC1\u6CAE"+ - "\u6CD7\u6CC5\u6CF1\u6CBF\u6CBB\u6CE1\u6CDB\u6CCA"+ - "\u6CAC\u6CEF\u6CDC\u6CD6\u6CE0\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7095"+ - "\u708E\u7092\u708A\u7099\u722C\u722D\u7238\u7248"+ - "\u7267\u7269\u72C0\u72CE\u72D9\u72D7\u72D0\u73A9"+ - "\u73A8\u739F\u73AB\u73A5\u753D\u759D\u7599\u759A"+ - "\u7684\u76C2\u76F2\u76F4\u77E5\u77FD\u793E\u7940"+ - "\u7941\u79C9\u79C8\u7A7A\u7A79\u7AFA\u7CFE\u7F54"+ - "\u7F8C\u7F8B\u8005\u80BA\u80A5\u80A2\u80B1\u80A1"+ - "\u80AB\u80A9\u80B4\u80AA\u80AF\u81E5\u81FE\u820D"+ - "\u82B3\u829D\u8299\u82AD\u82BD\u829F\u82B9\u82B1"+ - "\u82AC\u82A5\u82AF\u82B8\u82A3\u82B0\u82BE\u82B7"+ - "\u864E\u8671\u521D\u8868\u8ECB\u8FCE\u8FD4\u8FD1"+ - "\u90B5\u90B8\u90B1\u90B6\u91C7\u91D1\u9577\u9580"+ - "\u961C\u9640\u963F\u963B\u9644\u9642\u96B9\u96E8"+ - "\u9752\u975E\u4E9F\u4EAD\u4EAE\u4FE1\u4FB5\u4FAF"+ - "\u4FBF\u4FE0\u4FD1\u4FCF\u4FDD\u4FC3\u4FB6\u4FD8"+ - "\u4FDF\u4FCA\u4FD7\u4FAE\u4FD0\u4FC4\u4FC2\u4FDA"+ - "\u4FCE\u4FDE\u4FB7\u5157\u5192\u5191\u51A0\u524E"+ - "\u5243\u524A\u524D\u524C\u524B\u5247\u52C7\u52C9"+ - "\u52C3\u52C1\u530D\u5357\u537B\u539A\u53DB\u54AC"+ - "\u54C0\u54A8\u54CE\u54C9\u54B8\u54A6\u54B3\u54C7"+ - "\u54C2\u54BD\u54AA\u54C1\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u54C4\u54C8"+ - "\u54AF\u54AB\u54B1\u54BB\u54A9\u54A7\u54BF\u56FF"+ - "\u5782\u578B\u57A0\u57A3\u57A2\u57CE\u57AE\u5793"+ - "\u5955\u5951\u594F\u594E\u5950\u59DC\u59D8\u59FF"+ - "\u59E3\u59E8\u5A03\u59E5\u59EA\u59DA\u59E6\u5A01"+ - "\u59FB\u5B69\u5BA3\u5BA6\u5BA4\u5BA2\u5BA5\u5C01"+ - "\u5C4E\u5C4F\u5C4D\u5C4B\u5CD9\u5CD2\u5DF7\u5E1D"+ - "\u5E25\u5E1F\u5E7D\u5EA0\u5EA6\u5EFA\u5F08\u5F2D"+ - "\u5F65\u5F88\u5F85\u5F8A\u5F8B\u5F87\u5F8C\u5F89"+ - "\u6012\u601D\u6020\u6025\u600E\u6028\u604D\u6070"+ - "\u6068\u6062\u6046\u6043\u606C\u606B\u606A\u6064"+ - "\u6241\u62DC\u6316\u6309\u62FC\u62ED\u6301\u62EE"+ - "\u62FD\u6307\u62F1\u62F7\u62EF\u62EC\u62FE\u62F4"+ - "\u6311\u6302\u653F\u6545\u65AB\u65BD\u65E2\u6625"+ - "\u662D\u6620\u6627\u662F\u661F\u6628\u6631\u6624"+ - "\u66F7\u67FF\u67D3\u67F1\u67D4\u67D0\u67EC\u67B6"+ - "\u67AF\u67F5\u67E9\u67EF\u67C4\u67D1\u67B4\u67DA"+ - "\u67E5\u67B8\u67CF\u67DE\u67F3\u67B0\u67D9\u67E2"+ - "\u67DD\u67D2\u6B6A\u6B83\u6B86\u6BB5\u6BD2\u6BD7"+ - "\u6C1F\u6CC9\u6D0B\u6D32\u6D2A\u6D41\u6D25\u6D0C"+ - "\u6D31\u6D1E\u6D17\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6D3B\u6D3D\u6D3E"+ - "\u6D36\u6D1B\u6CF5\u6D39\u6D27\u6D38\u6D29\u6D2E"+ - "\u6D35\u6D0E\u6D2B\u70AB\u70BA\u70B3\u70AC\u70AF"+ - "\u70AD\u70B8\u70AE\u70A4\u7230\u7272\u726F\u7274"+ - "\u72E9\u72E0\u72E1\u73B7\u73CA\u73BB\u73B2\u73CD"+ - "\u73C0\u73B3\u751A\u752D\u754F\u754C\u754E\u754B"+ - "\u75AB\u75A4\u75A5\u75A2\u75A3\u7678\u7686\u7687"+ - "\u7688\u76C8\u76C6\u76C3\u76C5\u7701\u76F9\u76F8"+ - "\u7709\u770B\u76FE\u76FC\u7707\u77DC\u7802\u7814"+ - "\u780C\u780D\u7946\u7949\u7948\u7947\u79B9\u79BA"+ - "\u79D1\u79D2\u79CB\u7A7F\u7A81\u7AFF\u7AFD\u7C7D"+ - "\u7D02\u7D05\u7D00\u7D09\u7D07\u7D04\u7D06\u7F38"+ - "\u7F8E\u7FBF\u8004\u8010\u800D\u8011\u8036\u80D6"+ - "\u80E5\u80DA\u80C3\u80C4\u80CC\u80E1\u80DB\u80CE"+ - "\u80DE\u80E4\u80DD\u81F4\u8222\u82E7\u8303\u8305"+ - "\u82E3\u82DB\u82E6\u8304\u82E5\u8302\u8309\u82D2"+ - "\u82D7\u82F1\u8301\u82DC\u82D4\u82D1\u82DE\u82D3"+ - "\u82DF\u82EF\u8306\u8650\u8679\u867B\u867A\u884D"+ - "\u886B\u8981\u89D4\u8A08\u8A02\u8A03\u8C9E\u8CA0"+ - "\u8D74\u8D73\u8DB4\u8ECD\u8ECC\u8FF0\u8FE6\u8FE2"+ - "\u8FEA\u8FE5\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u8FED\u8FEB\u8FE4\u8FE8"+ - "\u90CA\u90CE\u90C1\u90C3\u914B\u914A\u91CD\u9582"+ - "\u9650\u964B\u964C\u964D\u9762\u9769\u97CB\u97ED"+ - "\u97F3\u9801\u98A8\u98DB\u98DF\u9996\u9999\u4E58"+ - "\u4EB3\u500C\u500D\u5023\u4FEF\u5026\u5025\u4FF8"+ - "\u5029\u5016\u5006\u503C\u501F\u501A\u5012\u5011"+ - "\u4FFA\u5000\u5014\u5028\u4FF1\u5021\u500B\u5019"+ - "\u5018\u4FF3\u4FEE\u502D\u502A\u4FFE\u502B\u5009"+ - "\u517C\u51A4\u51A5\u51A2\u51CD\u51CC\u51C6\u51CB"+ - "\u5256\u525C\u5254\u525B\u525D\u532A\u537F\u539F"+ - "\u539D\u53DF\u54E8\u5510\u5501\u5537\u54FC\u54E5"+ - "\u54F2\u5506\u54FA\u5514\u54E9\u54ED\u54E1\u5509"+ - "\u54EE\u54EA\u54E6\u5527\u5507\u54FD\u550F\u5703"+ - "\u5704\u57C2\u57D4\u57CB\u57C3\u5809\u590F\u5957"+ - "\u5958\u595A\u5A11\u5A18\u5A1C\u5A1F\u5A1B\u5A13"+ - "\u59EC\u5A20\u5A23\u5A29\u5A25\u5A0C\u5A09\u5B6B"+ - "\u5C58\u5BB0\u5BB3\u5BB6\u5BB4\u5BAE\u5BB5\u5BB9"+ - "\u5BB8\u5C04\u5C51\u5C55\u5C50\u5CED\u5CFD\u5CFB"+ - "\u5CEA\u5CE8\u5CF0\u5CF6\u5D01\u5CF4\u5DEE\u5E2D"+ - "\u5E2B\u5EAB\u5EAD\u5EA7\u5F31\u5F92\u5F91\u5F90"+ - "\u6059\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u6063\u6065\u6050\u6055\u606D"+ - "\u6069\u606F\u6084\u609F\u609A\u608D\u6094\u608C"+ - "\u6085\u6096\u6247\u62F3\u6308\u62FF\u634E\u633E"+ - "\u632F\u6355\u6342\u6346\u634F\u6349\u633A\u6350"+ - "\u633D\u632A\u632B\u6328\u634D\u634C\u6548\u6549"+ - "\u6599\u65C1\u65C5\u6642\u6649\u664F\u6643\u6652"+ - "\u664C\u6645\u6641\u66F8\u6714\u6715\u6717\u6821"+ - "\u6838\u6848\u6846\u6853\u6839\u6842\u6854\u6829"+ - "\u68B3\u6817\u684C\u6851\u683D\u67F4\u6850\u6840"+ - "\u683C\u6843\u682A\u6845\u6813\u6818\u6841\u6B8A"+ - "\u6B89\u6BB7\u6C23\u6C27\u6C28\u6C26\u6C24\u6CF0"+ - "\u6D6A\u6D95\u6D88\u6D87\u6D66\u6D78\u6D77\u6D59"+ - "\u6D93\u6D6C\u6D89\u6D6E\u6D5A\u6D74\u6D69\u6D8C"+ - "\u6D8A\u6D79\u6D85\u6D65\u6D94\u70CA\u70D8\u70E4"+ - "\u70D9\u70C8\u70CF\u7239\u7279\u72FC\u72F9\u72FD"+ - "\u72F8\u72F7\u7386\u73ED\u7409\u73EE\u73E0\u73EA"+ - "\u73DE\u7554\u755D\u755C\u755A\u7559\u75BE\u75C5"+ - "\u75C7\u75B2\u75B3\u75BD\u75BC\u75B9\u75C2\u75B8"+ - "\u768B\u76B0\u76CA\u76CD\u76CE\u7729\u771F\u7720"+ - "\u7728\u77E9\u7830\u7827\u7838\u781D\u7834\u7837"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u7825\u782D\u7820\u781F\u7832\u7955"+ - "\u7950\u7960\u795F\u7956\u795E\u795D\u7957\u795A"+ - "\u79E4\u79E3\u79E7\u79DF\u79E6\u79E9\u79D8\u7A84"+ - "\u7A88\u7AD9\u7B06\u7B11\u7C89\u7D21\u7D17\u7D0B"+ - "\u7D0A\u7D20\u7D22\u7D14\u7D10\u7D15\u7D1A\u7D1C"+ - "\u7D0D\u7D19\u7D1B\u7F3A\u7F5F\u7F94\u7FC5\u7FC1"+ - "\u8006\u8018\u8015\u8019\u8017\u803D\u803F\u80F1"+ - "\u8102\u80F0\u8105\u80ED\u80F4\u8106\u80F8\u80F3"+ - "\u8108\u80FD\u810A\u80FC\u80EF\u81ED\u81EC\u8200"+ - "\u8210\u822A\u822B\u8228\u822C\u82BB\u832B\u8352"+ - "\u8354\u834A\u8338\u8350\u8349\u8335\u8334\u834F"+ - "\u8332\u8339\u8336\u8317\u8340\u8331\u8328\u8343"; - - private final static String innerIndex1= - "\u8654\u868A\u86AA\u8693\u86A4\u86A9\u868C\u86A3"+ - "\u869C\u8870\u8877\u8881\u8882\u887D\u8879\u8A18"+ - "\u8A10\u8A0E\u8A0C\u8A15\u8A0A\u8A17\u8A13\u8A16"+ - "\u8A0F\u8A11\u8C48\u8C7A\u8C79\u8CA1\u8CA2\u8D77"+ - "\u8EAC\u8ED2\u8ED4\u8ECF\u8FB1\u9001\u9006\u8FF7"+ - "\u9000\u8FFA\u8FF4\u9003\u8FFD\u9005\u8FF8\u9095"+ - "\u90E1\u90DD\u90E2\u9152\u914D\u914C\u91D8\u91DD"+ - "\u91D7\u91DC\u91D9\u9583\u9662\u9663\u9661\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u965B\u965D\u9664\u9658\u965E\u96BB\u98E2"+ - "\u99AC\u9AA8\u9AD8\u9B25\u9B32\u9B3C\u4E7E\u507A"+ - "\u507D\u505C\u5047\u5043\u504C\u505A\u5049\u5065"+ - "\u5076\u504E\u5055\u5075\u5074\u5077\u504F\u500F"+ - "\u506F\u506D\u515C\u5195\u51F0\u526A\u526F\u52D2"+ - "\u52D9\u52D8\u52D5\u5310\u530F\u5319\u533F\u5340"+ - "\u533E\u53C3\u66FC\u5546\u556A\u5566\u5544\u555E"+ - "\u5561\u5543\u554A\u5531\u5556\u554F\u5555\u552F"+ - "\u5564\u5538\u552E\u555C\u552C\u5563\u5533\u5541"+ - "\u5557\u5708\u570B\u5709\u57DF\u5805\u580A\u5806"+ - "\u57E0\u57E4\u57FA\u5802\u5835\u57F7\u57F9\u5920"+ - "\u5962\u5A36\u5A41\u5A49\u5A66\u5A6A\u5A40\u5A3C"+ - "\u5A62\u5A5A\u5A46\u5A4A\u5B70\u5BC7\u5BC5\u5BC4"+ - "\u5BC2\u5BBF\u5BC6\u5C09\u5C08\u5C07\u5C60\u5C5C"+ - "\u5C5D\u5D07\u5D06\u5D0E\u5D1B\u5D16\u5D22\u5D11"+ - "\u5D29\u5D14\u5D19\u5D24\u5D27\u5D17\u5DE2\u5E38"+ - "\u5E36\u5E33\u5E37\u5EB7\u5EB8\u5EB6\u5EB5\u5EBE"+ - "\u5F35\u5F37\u5F57\u5F6C\u5F69\u5F6B\u5F97\u5F99"+ - "\u5F9E\u5F98\u5FA1\u5FA0\u5F9C\u607F\u60A3\u6089"+ - "\u60A0\u60A8\u60CB\u60B4\u60E6\u60BD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u60C5\u60BB\u60B5\u60DC\u60BC\u60D8\u60D5\u60C6"+ - "\u60DF\u60B8\u60DA\u60C7\u621A\u621B\u6248\u63A0"+ - "\u63A7\u6372\u6396\u63A2\u63A5\u6377\u6367\u6398"+ - "\u63AA\u6371\u63A9\u6389\u6383\u639B\u636B\u63A8"+ - "\u6384\u6388\u6399\u63A1\u63AC\u6392\u638F\u6380"+ - "\u637B\u6369\u6368\u637A\u655D\u6556\u6551\u6559"+ - "\u6557\u555F\u654F\u6558\u6555\u6554\u659C\u659B"+ - "\u65AC\u65CF\u65CB\u65CC\u65CE\u665D\u665A\u6664"+ - "\u6668\u6666\u665E\u66F9\u52D7\u671B\u6881\u68AF"+ - "\u68A2\u6893\u68B5\u687F\u6876\u68B1\u68A7\u6897"+ - "\u68B0\u6883\u68C4\u68AD\u6886\u6885\u6894\u689D"+ - "\u68A8\u689F\u68A1\u6882\u6B32\u6BBA\u6BEB\u6BEC"+ - "\u6C2B\u6D8E\u6DBC\u6DF3\u6DD9\u6DB2\u6DE1\u6DCC"+ - "\u6DE4\u6DFB\u6DFA\u6E05\u6DC7\u6DCB\u6DAF\u6DD1"+ - "\u6DAE\u6DDE\u6DF9\u6DB8\u6DF7\u6DF5\u6DC5\u6DD2"+ - "\u6E1A\u6DB5\u6DDA\u6DEB\u6DD8\u6DEA\u6DF1\u6DEE"+ - "\u6DE8\u6DC6\u6DC4\u6DAA\u6DEC\u6DBF\u6DE6\u70F9"+ - "\u7109\u710A\u70FD\u70EF\u723D\u727D\u7281\u731C"+ - "\u731B\u7316\u7313\u7319\u7387\u7405\u740A\u7403"+ - "\u7406\u73FE\u740D\u74E0\u74F6\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u74F7"+ - "\u751C\u7522\u7565\u7566\u7562\u7570\u758F\u75D4"+ - "\u75D5\u75B5\u75CA\u75CD\u768E\u76D4\u76D2\u76DB"+ - "\u7737\u773E\u773C\u7736\u7738\u773A\u786B\u7843"+ - "\u784E\u7965\u7968\u796D\u79FB\u7A92\u7A95\u7B20"+ - "\u7B28\u7B1B\u7B2C\u7B26\u7B19\u7B1E\u7B2E\u7C92"+ - "\u7C97\u7C95\u7D46\u7D43\u7D71\u7D2E\u7D39\u7D3C"+ - "\u7D40\u7D30\u7D33\u7D44\u7D2F\u7D42\u7D32\u7D31"+ - "\u7F3D\u7F9E\u7F9A\u7FCC\u7FCE\u7FD2\u801C\u804A"+ - "\u8046\u812F\u8116\u8123\u812B\u8129\u8130\u8124"+ - "\u8202\u8235\u8237\u8236\u8239\u838E\u839E\u8398"+ - "\u8378\u83A2\u8396\u83BD\u83AB\u8392\u838A\u8393"+ - "\u8389\u83A0\u8377\u837B\u837C\u8386\u83A7\u8655"+ - "\u5F6A\u86C7\u86C0\u86B6\u86C4\u86B5\u86C6\u86CB"+ - "\u86B1\u86AF\u86C9\u8853\u889E\u8888\u88AB\u8892"+ - "\u8896\u888D\u888B\u8993\u898F\u8A2A\u8A1D\u8A23"+ - "\u8A25\u8A31\u8A2D\u8A1F\u8A1B\u8A22\u8C49\u8C5A"+ - "\u8CA9\u8CAC\u8CAB\u8CA8\u8CAA\u8CA7\u8D67\u8D66"+ - "\u8DBE\u8DBA\u8EDB\u8EDF\u9019\u900D\u901A\u9017"+ - "\u9023\u901F\u901D\u9010\u9015\u901E\u9020\u900F"+ - "\u9022\u9016\u901B\u9014\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u90E8\u90ED"+ - "\u90FD\u9157\u91CE\u91F5\u91E6\u91E3\u91E7\u91ED"+ - "\u91E9\u9589\u966A\u9675\u9673\u9678\u9670\u9674"+ - "\u9676\u9677\u966C\u96C0\u96EA\u96E9\u7AE0\u7ADF"+ - "\u9802\u9803\u9B5A\u9CE5\u9E75\u9E7F\u9EA5\u9EBB"+ - "\u50A2\u508D\u5085\u5099\u5091\u5080\u5096\u5098"+ - "\u509A\u6700\u51F1\u5272\u5274\u5275\u5269\u52DE"+ - "\u52DD\u52DB\u535A\u53A5\u557B\u5580\u55A7\u557C"+ - "\u558A\u559D\u5598\u5582\u559C\u55AA\u5594\u5587"+ - "\u558B\u5583\u55B3\u55AE\u559F\u553E\u55B2\u559A"+ - "\u55BB\u55AC\u55B1\u557E\u5589\u55AB\u5599\u570D"+ - "\u582F\u582A\u5834\u5824\u5830\u5831\u5821\u581D"+ - "\u5820\u58F9\u58FA\u5960\u5A77\u5A9A\u5A7F\u5A92"+ - "\u5A9B\u5AA7\u5B73\u5B71\u5BD2\u5BCC\u5BD3\u5BD0"+ - "\u5C0A\u5C0B\u5C31\u5D4C\u5D50\u5D34\u5D47\u5DFD"+ - "\u5E45\u5E3D\u5E40\u5E43\u5E7E\u5ECA\u5EC1\u5EC2"+ - "\u5EC4\u5F3C\u5F6D\u5FA9\u5FAA\u5FA8\u60D1\u60E1"+ - "\u60B2\u60B6\u60E0\u611C\u6123\u60FA\u6115\u60F0"+ - "\u60FB\u60F4\u6168\u60F1\u610E\u60F6\u6109\u6100"+ - "\u6112\u621F\u6249\u63A3\u638C\u63CF\u63C0\u63E9"+ - "\u63C9\u63C6\u63CD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u63D2\u63E3\u63D0"+ - "\u63E1\u63D6\u63ED\u63EE\u6376\u63F4\u63EA\u63DB"+ - "\u6452\u63DA\u63F9\u655E\u6566\u6562\u6563\u6591"+ - "\u6590\u65AF\u666E\u6670\u6674\u6676\u666F\u6691"+ - "\u667A\u667E\u6677\u66FE\u66FF\u671F\u671D\u68FA"+ - "\u68D5\u68E0\u68D8\u68D7\u6905\u68DF\u68F5\u68EE"+ - "\u68E7\u68F9\u68D2\u68F2\u68E3\u68CB\u68CD\u690D"+ - "\u6912\u690E\u68C9\u68DA\u696E\u68FB\u6B3E\u6B3A"+ - "\u6B3D\u6B98\u6B96\u6BBC\u6BEF\u6C2E\u6C2F\u6C2C"+ - "\u6E2F\u6E38\u6E54\u6E21\u6E32\u6E67\u6E4A\u6E20"+ - "\u6E25\u6E23\u6E1B\u6E5B\u6E58\u6E24\u6E56\u6E6E"+ - "\u6E2D\u6E26\u6E6F\u6E34\u6E4D\u6E3A\u6E2C\u6E43"+ - "\u6E1D\u6E3E\u6ECB\u6E89\u6E19\u6E4E\u6E63\u6E44"+ - "\u6E72\u6E69\u6E5F\u7119\u711A\u7126\u7130\u7121"+ - "\u7136\u716E\u711C\u724C\u7284\u7280\u7336\u7325"+ - "\u7334\u7329\u743A\u742A\u7433\u7422\u7425\u7435"+ - "\u7436\u7434\u742F\u741B\u7426\u7428\u7525\u7526"+ - "\u756B\u756A\u75E2\u75DB\u75E3\u75D9\u75D8\u75DE"+ - "\u75E0\u767B\u767C\u7696\u7693\u76B4\u76DC\u774F"+ - "\u77ED\u785D\u786C\u786F\u7A0D\u7A08\u7A0B\u7A05"+ - "\u7A00\u7A98\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7A97\u7A96\u7AE5\u7AE3"+ - "\u7B49\u7B56\u7B46\u7B50\u7B52\u7B54\u7B4D\u7B4B"+ - "\u7B4F\u7B51\u7C9F\u7CA5\u7D5E\u7D50\u7D68\u7D55"+ - "\u7D2B\u7D6E\u7D72\u7D61\u7D66\u7D62\u7D70\u7D73"+ - "\u5584\u7FD4\u7FD5\u800B\u8052\u8085\u8155\u8154"+ - "\u814B\u8151\u814E\u8139\u8146\u813E\u814C\u8153"+ - "\u8174\u8212\u821C\u83E9\u8403\u83F8\u840D\u83E0"+ - "\u83C5\u840B\u83C1\u83EF\u83F1\u83F4\u8457\u840A"+ - "\u83F0\u840C\u83CC\u83FD\u83F2\u83CA\u8438\u840E"+ - "\u8404\u83DC\u8407\u83D4\u83DF\u865B\u86DF\u86D9"+ - "\u86ED\u86D4\u86DB\u86E4\u86D0\u86DE\u8857\u88C1"+ - "\u88C2\u88B1\u8983\u8996\u8A3B\u8A60\u8A55\u8A5E"+ - "\u8A3C\u8A41\u8A54\u8A5B\u8A50\u8A46\u8A34\u8A3A"+ - "\u8A36\u8A56\u8C61\u8C82\u8CAF\u8CBC\u8CB3\u8CBD"+ - "\u8CC1\u8CBB\u8CC0\u8CB4\u8CB7\u8CB6\u8CBF\u8CB8"+ - "\u8D8A\u8D85\u8D81\u8DCE\u8DDD\u8DCB\u8DDA\u8DD1"+ - "\u8DCC\u8DDB\u8DC6\u8EFB\u8EF8\u8EFC\u8F9C\u902E"+ - "\u9035\u9031\u9038\u9032\u9036\u9102\u90F5\u9109"+ - "\u90FE\u9163\u9165\u91CF\u9214\u9215\u9223\u9209"+ - "\u921E\u920D\u9210\u9207\u9211\u9594\u958F\u958B"+ - "\u9591\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9593\u9592\u958E\u968A\u968E"+ - "\u968B\u967D\u9685\u9686\u968D\u9672\u9684\u96C1"+ - "\u96C5\u96C4\u96C6\u96C7\u96EF\u96F2\u97CC\u9805"+ - "\u9806\u9808\u98E7\u98EA\u98EF\u98E9\u98F2\u98ED"+ - "\u99AE\u99AD\u9EC3\u9ECD\u9ED1\u4E82\u50AD\u50B5"+ - "\u50B2\u50B3\u50C5\u50BE\u50AC\u50B7\u50BB\u50AF"+ - "\u50C7\u527F\u5277\u527D\u52DF\u52E6\u52E4\u52E2"+ - "\u52E3\u532F\u55DF\u55E8\u55D3\u55E6\u55CE\u55DC"+ - "\u55C7\u55D1\u55E3\u55E4\u55EF\u55DA\u55E1\u55C5"+ - "\u55C6\u55E5\u55C9\u5712\u5713\u585E\u5851\u5858"+ - "\u5857\u585A\u5854\u586B\u584C\u586D\u584A\u5862"+ - "\u5852\u584B\u5967\u5AC1\u5AC9\u5ACC\u5ABE\u5ABD"+ - "\u5ABC\u5AB3\u5AC2\u5AB2\u5D69\u5D6F\u5E4C\u5E79"+ - "\u5EC9\u5EC8\u5F12\u5F59\u5FAC\u5FAE\u611A\u610F"+ - "\u6148\u611F\u60F3\u611B\u60F9\u6101\u6108\u614E"+ - "\u614C\u6144\u614D\u613E\u6134\u6127\u610D\u6106"+ - "\u6137\u6221\u6222\u6413\u643E\u641E\u642A\u642D"+ - "\u643D\u642C\u640F\u641C\u6414\u640D\u6436\u6416"+ - "\u6417\u6406\u656C\u659F\u65B0\u6697\u6689\u6687"+ - "\u6688\u6696\u6684\u6698\u668D\u6703\u6994\u696D"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u695A\u6977\u6960\u6954\u6975\u6930"+ - "\u6982\u694A\u6968\u696B\u695E\u6953\u6979\u6986"+ - "\u695D\u6963\u695B\u6B47\u6B72\u6BC0\u6BBF\u6BD3"+ - "\u6BFD\u6EA2\u6EAF\u6ED3\u6EB6\u6EC2\u6E90\u6E9D"+ - "\u6EC7\u6EC5\u6EA5\u6E98\u6EBC\u6EBA\u6EAB\u6ED1"+ - "\u6E96\u6E9C\u6EC4\u6ED4\u6EAA\u6EA7\u6EB4\u714E"+ - "\u7159\u7169\u7164\u7149\u7167\u715C\u716C\u7166"+ - "\u714C\u7165\u715E\u7146\u7168\u7156\u723A\u7252"+ - "\u7337\u7345\u733F\u733E\u746F\u745A\u7455\u745F"+ - "\u745E\u7441\u743F\u7459\u745B\u745C\u7576\u7578"+ - "\u7600\u75F0\u7601\u75F2\u75F1\u75FA\u75FF\u75F4"+ - "\u75F3\u76DE\u76DF\u775B\u776B\u7766\u775E\u7763"+ - "\u7779\u776A\u776C\u775C\u7765\u7768\u7762\u77EE"+ - "\u788E\u78B0\u7897\u7898\u788C\u7889\u787C\u7891"+ - "\u7893\u787F\u797A\u797F\u7981\u842C\u79BD\u7A1C"+ - "\u7A1A\u7A20\u7A14\u7A1F\u7A1E\u7A9F\u7AA0\u7B77"+ - "\u7BC0\u7B60\u7B6E\u7B67\u7CB1\u7CB3\u7CB5\u7D93"+ - "\u7D79\u7D91\u7D81\u7D8F\u7D5B\u7F6E\u7F69\u7F6A"+ - "\u7F72\u7FA9\u7FA8\u7FA4\u8056\u8058\u8086\u8084"+ - "\u8171\u8170\u8178\u8165\u816E\u8173\u816B\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u8179\u817A\u8166\u8205\u8247\u8482\u8477"+ - "\u843D\u8431\u8475\u8466\u846B\u8449\u846C\u845B"+ - "\u843C\u8435\u8461\u8463\u8469\u846D\u8446\u865E"+ - "\u865C\u865F\u86F9\u8713\u8708\u8707\u8700\u86FE"+ - "\u86FB\u8702\u8703\u8706\u870A\u8859\u88DF\u88D4"+ - "\u88D9\u88DC\u88D8\u88DD\u88E1\u88CA\u88D5\u88D2"+ - "\u899C\u89E3\u8A6B\u8A72\u8A73\u8A66\u8A69\u8A70"+ - "\u8A87\u8A7C\u8A63\u8AA0\u8A71\u8A85\u8A6D\u8A62"+ - "\u8A6E\u8A6C\u8A79\u8A7B\u8A3E\u8A68\u8C62\u8C8A"+ - "\u8C89\u8CCA\u8CC7\u8CC8\u8CC4\u8CB2\u8CC3\u8CC2"+ - "\u8CC5\u8DE1\u8DDF\u8DE8\u8DEF\u8DF3\u8DFA\u8DEA"+ - "\u8DE4\u8DE6\u8EB2\u8F03\u8F09\u8EFE\u8F0A\u8F9F"+ - "\u8FB2\u904B\u904A\u9053\u9042\u9054\u903C\u9055"+ - "\u9050\u9047\u904F\u904E\u904D\u9051\u903E\u9041"+ - "\u9112\u9117\u916C\u916A\u9169\u91C9\u9237\u9257"+ - "\u9238\u923D\u9240\u923E\u925B\u924B\u9264\u9251"+ - "\u9234\u9249\u924D\u9245\u9239\u923F\u925A\u9598"+ - "\u9698\u9694\u9695\u96CD\u96CB\u96C9\u96CA\u96F7"+ - "\u96FB\u96F9\u96F6\u9756\u9774\u9776\u9810\u9811"+ - "\u9813\u980A\u9812\u980C\u98FC\u98F4\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u98FD\u98FE\u99B3\u99B1\u99B4\u9AE1\u9CE9\u9E82"+ - "\u9F0E\u9F13\u9F20\u50E7\u50EE\u50E5\u50D6\u50ED"+ - "\u50DA\u50D5\u50CF\u50D1\u50F1\u50CE\u50E9\u5162"+ - "\u51F3\u5283\u5282\u5331\u53AD\u55FE\u5600\u561B"+ - "\u5617\u55FD\u5614\u5606\u5609\u560D\u560E\u55F7"+ - "\u5616\u561F\u5608\u5610\u55F6\u5718\u5716\u5875"+ - "\u587E\u5883\u5893\u588A\u5879\u5885\u587D\u58FD"+ - "\u5925\u5922\u5924\u596A\u5969\u5AE1\u5AE6\u5AE9"+ - "\u5AD7\u5AD6\u5AD8\u5AE3\u5B75\u5BDE\u5BE7\u5BE1"+ - "\u5BE5\u5BE6\u5BE8\u5BE2\u5BE4\u5BDF\u5C0D\u5C62"+ - "\u5D84\u5D87\u5E5B\u5E63\u5E55\u5E57\u5E54\u5ED3"+ - "\u5ED6\u5F0A\u5F46\u5F70\u5FB9\u6147\u613F\u614B"+ - "\u6177\u6162\u6163\u615F\u615A\u6158\u6175\u622A"+ - "\u6487\u6458\u6454\u64A4\u6478\u645F\u647A\u6451"+ - "\u6467\u6434\u646D\u647B\u6572\u65A1\u65D7\u65D6"+ - "\u66A2\u66A8\u669D\u699C\u69A8\u6995\u69C1\u69AE"+ - "\u69D3\u69CB\u699B\u69B7\u69BB\u69AB\u69B4\u69D0"+ - "\u69CD\u69AD\u69CC\u69A6\u69C3\u69A3\u6B49\u6B4C"+ - "\u6C33\u6F33\u6F14\u6EFE\u6F13\u6EF4\u6F29\u6F3E"+ - "\u6F20\u6F2C\u6F0F\u6F02\u6F22\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6EFF"+ - "\u6EEF\u6F06\u6F31\u6F38\u6F32\u6F23\u6F15\u6F2B"+ - "\u6F2F\u6F88\u6F2A\u6EEC\u6F01\u6EF2\u6ECC\u6EF7"+ - "\u7194\u7199\u717D\u718A\u7184\u7192\u723E\u7292"+ - "\u7296\u7344\u7350\u7464\u7463\u746A\u7470\u746D"+ - "\u7504\u7591\u7627\u760D\u760B\u7609\u7613\u76E1"+ - "\u76E3\u7784\u777D\u777F\u7761\u78C1\u789F\u78A7"+ - "\u78B3\u78A9\u78A3\u798E\u798F\u798D\u7A2E\u7A31"+ - "\u7AAA\u7AA9\u7AED\u7AEF\u7BA1\u7B95\u7B8B\u7B75"+ - "\u7B97\u7B9D\u7B94\u7B8F\u7BB8\u7B87\u7B84\u7CB9"+ - "\u7CBD\u7CBE\u7DBB\u7DB0\u7D9C\u7DBD\u7DBE\u7DA0"+ - "\u7DCA\u7DB4\u7DB2\u7DB1\u7DBA\u7DA2\u7DBF\u7DB5"+ - "\u7DB8\u7DAD\u7DD2\u7DC7\u7DAC\u7F70\u7FE0\u7FE1"+ - "\u7FDF\u805E\u805A\u8087\u8150\u8180\u818F\u8188"+ - "\u818A\u817F\u8182\u81E7\u81FA\u8207\u8214\u821E"+ - "\u824B\u84C9\u84BF\u84C6\u84C4\u8499\u849E\u84B2"+ - "\u849C\u84CB\u84B8\u84C0\u84D3\u8490\u84BC\u84D1"+ - "\u84CA\u873F\u871C\u873B\u8722\u8725\u8734\u8718"+ - "\u8755\u8737\u8729\u88F3\u8902\u88F4\u88F9\u88F8"+ - "\u88FD\u88E8\u891A\u88EF\u8AA6\u8A8C\u8A9E\u8AA3"+ - "\u8A8D\u8AA1\u8A93\u8AA4\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8AAA\u8AA5"+ - "\u8AA8\u8A98\u8A91\u8A9A\u8AA7\u8C6A\u8C8D\u8C8C"+ - "\u8CD3\u8CD1\u8CD2\u8D6B\u8D99\u8D95\u8DFC\u8F14"+ - "\u8F12\u8F15\u8F13\u8FA3\u9060\u9058\u905C\u9063"+ - "\u9059\u905E\u9062\u905D\u905B\u9119\u9118\u911E"+ - "\u9175\u9178\u9177\u9174\u9278\u9280\u9285\u9298"+ - "\u9296\u927B\u9293\u929C\u92A8\u927C\u9291\u95A1"+ - "\u95A8\u95A9\u95A3\u95A5\u95A4\u9699\u969C\u969B"+ - "\u96CC\u96D2\u9700\u977C\u9785\u97F6\u9817\u9818"+ - "\u98AF\u98B1\u9903\u9905\u990C\u9909\u99C1\u9AAF"+ - "\u9AB0\u9AE6\u9B41\u9B42\u9CF4\u9CF6\u9CF3\u9EBC"+ - "\u9F3B\u9F4A\u5104\u5100\u50FB\u50F5\u50F9\u5102"+ - "\u5108\u5109\u5105\u51DC\u5287\u5288\u5289\u528D"+ - "\u528A\u52F0\u53B2\u562E\u563B\u5639\u5632\u563F"+ - "\u5634\u5629\u5653\u564E\u5657\u5674\u5636\u562F"+ - "\u5630\u5880\u589F\u589E\u58B3\u589C\u58AE\u58A9"+ - "\u58A6\u596D\u5B09\u5AFB\u5B0B\u5AF5\u5B0C\u5B08"+ - "\u5BEE\u5BEC\u5BE9\u5BEB\u5C64\u5C65\u5D9D\u5D94"+ - "\u5E62\u5E5F\u5E61\u5EE2\u5EDA\u5EDF\u5EDD\u5EE3"+ - "\u5EE0\u5F48\u5F71\u5FB7\u5FB5\u6176\u6167\u616E"+ - "\u615D\u6155\u6182\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u617C\u6170\u616B"+ - "\u617E\u61A7\u6190\u61AB\u618E\u61AC\u619A\u61A4"+ - "\u6194\u61AE\u622E\u6469\u646F\u6479\u649E\u64B2"+ - "\u6488\u6490\u64B0\u64A5\u6493\u6495\u64A9\u6492"+ - "\u64AE\u64AD\u64AB\u649A\u64AC\u6499\u64A2\u64B3"+ - "\u6575\u6577\u6578\u66AE\u66AB\u66B4\u66B1\u6A23"+ - "\u6A1F\u69E8\u6A01\u6A1E\u6A19\u69FD\u6A21\u6A13"+ - "\u6A0A\u69F3\u6A02\u6A05\u69ED\u6A11\u6B50\u6B4E"+ - "\u6BA4\u6BC5\u6BC6\u6F3F\u6F7C\u6F84\u6F51\u6F66"+ - "\u6F54\u6F86\u6F6D\u6F5B\u6F78\u6F6E\u6F8E\u6F7A"+ - "\u6F70\u6F64\u6F97\u6F58\u6ED5\u6F6F\u6F60\u6F5F"+ - "\u719F\u71AC\u71B1\u71A8\u7256\u729B\u734E\u7357"+ - "\u7469\u748B\u7483\u747E\u7480\u757F\u7620\u7629"+ - "\u761F\u7624\u7626\u7621\u7622\u769A\u76BA\u76E4"+ - "\u778E\u7787\u778C\u7791\u778B\u78CB\u78C5\u78BA"+ - "\u78CA\u78BE\u78D5\u78BC\u78D0\u7A3F\u7A3C\u7A40"+ - "\u7A3D\u7A37\u7A3B\u7AAF\u7AAE\u7BAD\u7BB1\u7BC4"+ - "\u7BB4\u7BC6\u7BC7\u7BC1\u7BA0\u7BCC\u7CCA\u7DE0"+ - "\u7DF4\u7DEF\u7DFB\u7DD8\u7DEC\u7DDD\u7DE8\u7DE3"+ - "\u7DDA\u7DDE\u7DE9\u7D9E\u7DD9\u7DF2\u7DF9\u7F75"+ - "\u7F77\u7FAF\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7FE9\u8026\u819B\u819C"+ - "\u819D\u81A0\u819A\u8198\u8517\u853D\u851A\u84EE"+ - "\u852C\u852D\u8513\u8511\u8523\u8521\u8514\u84EC"+ - "\u8525\u84FF\u8506\u8782\u8774\u8776\u8760\u8766"+ - "\u8778\u8768\u8759\u8757\u874C\u8753\u885B\u885D"+ - "\u8910\u8907\u8912\u8913\u8915\u890A\u8ABC\u8AD2"+ - "\u8AC7\u8AC4\u8A95\u8ACB\u8AF8\u8AB2\u8AC9\u8AC2"+ - "\u8ABF\u8AB0\u8AD6\u8ACD\u8AB6\u8AB9\u8ADB\u8C4C"+ - "\u8C4E\u8C6C\u8CE0\u8CDE\u8CE6\u8CE4\u8CEC\u8CED"+ - "\u8CE2\u8CE3\u8CDC\u8CEA\u8CE1\u8D6D\u8D9F\u8DA3"+ - "\u8E2B\u8E10\u8E1D\u8E22\u8E0F\u8E29\u8E1F\u8E21"+ - "\u8E1E\u8EBA\u8F1D\u8F1B\u8F1F\u8F29\u8F26\u8F2A"+ - "\u8F1C\u8F1E\u8F25\u9069\u906E\u9068\u906D\u9077"+ - "\u9130\u912D\u9127\u9131\u9187\u9189\u918B\u9183"+ - "\u92C5\u92BB\u92B7\u92EA\u92AC\u92E4\u92C1\u92B3"+ - "\u92BC\u92D2\u92C7\u92F0\u92B2\u95AD\u95B1\u9704"+ - "\u9706\u9707\u9709\u9760\u978D\u978B\u978F\u9821"+ - "\u982B\u981C\u98B3\u990A\u9913\u9912\u9918\u99DD"+ - "\u99D0\u99DF\u99DB\u99D1\u99D5\u99D2\u99D9\u9AB7"+ - "\u9AEE\u9AEF\u9B27\u9B45\u9B44\u9B77\u9B6F\u9D06"+ - "\u9D09\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9D03\u9EA9\u9EBE\u9ECE\u58A8"+ - "\u9F52\u5112\u5118\u5114\u5110\u5115\u5180\u51AA"+ - "\u51DD\u5291\u5293\u52F3\u5659\u566B\u5679\u5669"+ - "\u5664\u5678\u566A\u5668\u5665\u5671\u566F\u566C"+ - "\u5662\u5676\u58C1\u58BE\u58C7\u58C5\u596E\u5B1D"+ - "\u5B34\u5B78\u5BF0\u5C0E\u5F4A\u61B2\u6191\u61A9"+ - "\u618A\u61CD\u61B6\u61BE\u61CA\u61C8\u6230\u64C5"+ - "\u64C1\u64CB\u64BB\u64BC\u64DA\u64C4\u64C7\u64C2"+ - "\u64CD\u64BF\u64D2\u64D4\u64BE\u6574\u66C6\u66C9"+ - "\u66B9\u66C4\u66C7\u66B8\u6A3D\u6A38\u6A3A\u6A59"+ - "\u6A6B\u6A58\u6A39\u6A44\u6A62\u6A61\u6A4B\u6A47"+ - "\u6A35\u6A5F\u6A48\u6B59\u6B77\u6C05\u6FC2\u6FB1"+ - "\u6FA1\u6FC3\u6FA4\u6FC1\u6FA7\u6FB3\u6FC0\u6FB9"+ - "\u6FB6\u6FA6\u6FA0\u6FB4\u71BE\u71C9\u71D0\u71D2"+ - "\u71C8\u71D5\u71B9\u71CE\u71D9\u71DC\u71C3\u71C4"+ - "\u7368\u749C\u74A3\u7498\u749F\u749E\u74E2\u750C"+ - "\u750D\u7634\u7638\u763A\u76E7\u76E5\u77A0\u779E"+ - "\u779F\u77A5\u78E8\u78DA\u78EC\u78E7\u79A6\u7A4D"+ - "\u7A4E\u7A46\u7A4C\u7A4B\u7ABA\u7BD9\u7C11\u7BC9"+ - "\u7BE4\u7BDB\u7BE1\u7BE9\u7BE6\u7CD5\u7CD6\u7E0A"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u7E11\u7E08\u7E1B\u7E23\u7E1E\u7E1D"+ - "\u7E09\u7E10\u7F79\u7FB2\u7FF0\u7FF1\u7FEE\u8028"+ - "\u81B3\u81A9\u81A8\u81FB\u8208\u8258\u8259\u854A"+ - "\u8559\u8548\u8568\u8569\u8543\u8549\u856D\u856A"+ - "\u855E\u8783\u879F\u879E\u87A2\u878D\u8861\u892A"+ - "\u8932\u8925\u892B\u8921\u89AA\u89A6\u8AE6\u8AFA"+ - "\u8AEB\u8AF1\u8B00\u8ADC\u8AE7\u8AEE\u8AFE\u8B01"+ - "\u8B02\u8AF7\u8AED\u8AF3\u8AF6\u8AFC\u8C6B\u8C6D"+ - "\u8C93\u8CF4\u8E44\u8E31\u8E34\u8E42\u8E39\u8E35"+ - "\u8F3B\u8F2F\u8F38\u8F33\u8FA8\u8FA6\u9075\u9074"+ - "\u9078\u9072\u907C\u907A\u9134\u9192\u9320\u9336"+ - "\u92F8\u9333\u932F\u9322\u92FC\u932B\u9304\u931A"; - - private final static String innerIndex2= - "\u9310\u9326\u9321\u9315\u932E\u9319\u95BB\u96A7"+ - "\u96A8\u96AA\u96D5\u970E\u9711\u9716\u970D\u9713"+ - "\u970F\u975B\u975C\u9766\u9798\u9830\u9838\u983B"+ - "\u9837\u982D\u9839\u9824\u9910\u9928\u991E\u991B"+ - "\u9921\u991A\u99ED\u99E2\u99F1\u9AB8\u9ABC\u9AFB"+ - "\u9AED\u9B28\u9B91\u9D15\u9D23\u9D26\u9D28\u9D12"+ - "\u9D1B\u9ED8\u9ED4\u9F8D\u9F9C\u512A\u511F\u5121"+ - "\u5132\u52F5\u568E\u5680\u5690\u5685\u5687\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u568F\u58D5\u58D3\u58D1\u58CE\u5B30\u5B2A"+ - "\u5B24\u5B7A\u5C37\u5C68\u5DBC\u5DBA\u5DBD\u5DB8"+ - "\u5E6B\u5F4C\u5FBD\u61C9\u61C2\u61C7\u61E6\u61CB"+ - "\u6232\u6234\u64CE\u64CA\u64D8\u64E0\u64F0\u64E6"+ - "\u64EC\u64F1\u64E2\u64ED\u6582\u6583\u66D9\u66D6"+ - "\u6A80\u6A94\u6A84\u6AA2\u6A9C\u6ADB\u6AA3\u6A7E"+ - "\u6A97\u6A90\u6AA0\u6B5C\u6BAE\u6BDA\u6C08\u6FD8"+ - "\u6FF1\u6FDF\u6FE0\u6FDB\u6FE4\u6FEB\u6FEF\u6F80"+ - "\u6FEC\u6FE1\u6FE9\u6FD5\u6FEE\u6FF0\u71E7\u71DF"+ - "\u71EE\u71E6\u71E5\u71ED\u71EC\u71F4\u71E0\u7235"+ - "\u7246\u7370\u7372\u74A9\u74B0\u74A6\u74A8\u7646"+ - "\u7642\u764C\u76EA\u77B3\u77AA\u77B0\u77AC\u77A7"+ - "\u77AD\u77EF\u78F7\u78FA\u78F4\u78EF\u7901\u79A7"+ - "\u79AA\u7A57\u7ABF\u7C07\u7C0D\u7BFE\u7BF7\u7C0C"+ - "\u7BE0\u7CE0\u7CDC\u7CDE\u7CE2\u7CDF\u7CD9\u7CDD"+ - "\u7E2E\u7E3E\u7E46\u7E37\u7E32\u7E43\u7E2B\u7E3D"+ - "\u7E31\u7E45\u7E41\u7E34\u7E39\u7E48\u7E35\u7E3F"+ - "\u7E2F\u7F44\u7FF3\u7FFC\u8071\u8072\u8070\u806F"+ - "\u8073\u81C6\u81C3\u81BA\u81C2\u81C0\u81BF\u81BD"+ - "\u81C9\u81BE\u81E8\u8209\u8271\u85AA\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u8584\u857E\u859C\u8591\u8594\u85AF\u859B\u8587"+ - "\u85A8\u858A\u8667\u87C0\u87D1\u87B3\u87D2\u87C6"+ - "\u87AB\u87BB\u87BA\u87C8\u87CB\u893B\u8936\u8944"+ - "\u8938\u893D\u89AC\u8B0E\u8B17\u8B19\u8B1B\u8B0A"+ - "\u8B20\u8B1D\u8B04\u8B10\u8C41\u8C3F\u8C73\u8CFA"+ - "\u8CFD\u8CFC\u8CF8\u8CFB\u8DA8\u8E49\u8E4B\u8E48"+ - "\u8E4A\u8F44\u8F3E\u8F42\u8F45\u8F3F\u907F\u907D"+ - "\u9084\u9081\u9082\u9080\u9139\u91A3\u919E\u919C"+ - "\u934D\u9382\u9328\u9375\u934A\u9365\u934B\u9318"+ - "\u937E\u936C\u935B\u9370\u935A\u9354\u95CA\u95CB"+ - "\u95CC\u95C8\u95C6\u96B1\u96B8\u96D6\u971C\u971E"+ - "\u97A0\u97D3\u9846\u98B6\u9935\u9A01\u99FF\u9BAE"+ - "\u9BAB\u9BAA\u9BAD\u9D3B\u9D3F\u9E8B\u9ECF\u9EDE"+ - "\u9EDC\u9EDD\u9EDB\u9F3E\u9F4B\u53E2\u5695\u56AE"+ - "\u58D9\u58D8\u5B38\u5F5D\u61E3\u6233\u64F4\u64F2"+ - "\u64FE\u6506\u64FA\u64FB\u64F7\u65B7\u66DC\u6726"+ - "\u6AB3\u6AAC\u6AC3\u6ABB\u6AB8\u6AC2\u6AAE\u6AAF"+ - "\u6B5F\u6B78\u6BAF\u7009\u700B\u6FFE\u7006\u6FFA"+ - "\u7011\u700F\u71FB\u71FC\u71FE\u71F8\u7377\u7375"+ - "\u74A7\u74BF\u7515\u7656\u7658\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7652"+ - "\u77BD\u77BF\u77BB\u77BC\u790E\u79AE\u7A61\u7A62"+ - "\u7A60\u7AC4\u7AC5\u7C2B\u7C27\u7C2A\u7C1E\u7C23"+ - "\u7C21\u7CE7\u7E54\u7E55\u7E5E\u7E5A\u7E61\u7E52"+ - "\u7E59\u7F48\u7FF9\u7FFB\u8077\u8076\u81CD\u81CF"+ - "\u820A\u85CF\u85A9\u85CD\u85D0\u85C9\u85B0\u85BA"+ - "\u85B9\u85A6\u87EF\u87EC\u87F2\u87E0\u8986\u89B2"+ - "\u89F4\u8B28\u8B39\u8B2C\u8B2B\u8C50\u8D05\u8E59"+ - "\u8E63\u8E66\u8E64\u8E5F\u8E55\u8EC0\u8F49\u8F4D"+ - "\u9087\u9083\u9088\u91AB\u91AC\u91D0\u9394\u938A"+ - "\u9396\u93A2\u93B3\u93AE\u93AC\u93B0\u9398\u939A"+ - "\u9397\u95D4\u95D6\u95D0\u95D5\u96E2\u96DC\u96D9"+ - "\u96DB\u96DE\u9724\u97A3\u97A6\u97AD\u97F9\u984D"+ - "\u984F\u984C\u984E\u9853\u98BA\u993E\u993F\u993D"+ - "\u992E\u99A5\u9A0E\u9AC1\u9B03\u9B06\u9B4F\u9B4E"+ - "\u9B4D\u9BCA\u9BC9\u9BFD\u9BC8\u9BC0\u9D51\u9D5D"+ - "\u9D60\u9EE0\u9F15\u9F2C\u5133\u56A5\u58DE\u58DF"+ - "\u58E2\u5BF5\u9F90\u5EEC\u61F2\u61F7\u61F6\u61F5"+ - "\u6500\u650F\u66E0\u66DD\u6AE5\u6ADD\u6ADA\u6AD3"+ - "\u701B\u701F\u7028\u701A\u701D\u7015\u7018\u7206"+ - "\u720D\u7258\u72A2\u7378\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u737A\u74BD"+ - "\u74CA\u74E3\u7587\u7586\u765F\u7661\u77C7\u7919"+ - "\u79B1\u7A6B\u7A69\u7C3E\u7C3F\u7C38\u7C3D\u7C37"+ - "\u7C40\u7E6B\u7E6D\u7E79\u7E69\u7E6A\u7F85\u7E73"+ - "\u7FB6\u7FB9\u7FB8\u81D8\u85E9\u85DD\u85EA\u85D5"+ - "\u85E4\u85E5\u85F7\u87FB\u8805\u880D\u87F9\u87FE"+ - "\u8960\u895F\u8956\u895E\u8B41\u8B5C\u8B58\u8B49"+ - "\u8B5A\u8B4E\u8B4F\u8B46\u8B59\u8D08\u8D0A\u8E7C"+ - "\u8E72\u8E87\u8E76\u8E6C\u8E7A\u8E74\u8F54\u8F4E"+ - "\u8FAD\u908A\u908B\u91B1\u91AE\u93E1\u93D1\u93DF"+ - "\u93C3\u93C8\u93DC\u93DD\u93D6\u93E2\u93CD\u93D8"+ - "\u93E4\u93D7\u93E8\u95DC\u96B4\u96E3\u972A\u9727"+ - "\u9761\u97DC\u97FB\u985E\u9858\u985B\u98BC\u9945"+ - "\u9949\u9A16\u9A19\u9B0D\u9BE8\u9BE7\u9BD6\u9BDB"+ - "\u9D89\u9D61\u9D72\u9D6A\u9D6C\u9E92\u9E97\u9E93"+ - "\u9EB4\u52F8\u56A8\u56B7\u56B6\u56B4\u56BC\u58E4"+ - "\u5B40\u5B43\u5B7D\u5BF6\u5DC9\u61F8\u61FA\u6518"+ - "\u6514\u6519\u66E6\u6727\u6AEC\u703E\u7030\u7032"+ - "\u7210\u737B\u74CF\u7662\u7665\u7926\u792A\u792C"+ - "\u792B\u7AC7\u7AF6\u7C4C\u7C43\u7C4D\u7CEF\u7CF0"+ - "\u8FAE\u7E7D\u7E7C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7E82\u7F4C\u8000"+ - "\u81DA\u8266\u85FB\u85F9\u8611\u85FA\u8606\u860B"+ - "\u8607\u860A\u8814\u8815\u8964\u89BA\u89F8\u8B70"+ - "\u8B6C\u8B66\u8B6F\u8B5F\u8B6B\u8D0F\u8D0D\u8E89"+ - "\u8E81\u8E85\u8E82\u91B4\u91CB\u9418\u9403\u93FD"+ - "\u95E1\u9730\u98C4\u9952\u9951\u99A8\u9A2B\u9A30"+ - "\u9A37\u9A35\u9C13\u9C0D\u9E79\u9EB5\u9EE8\u9F2F"+ - "\u9F5F\u9F63\u9F61\u5137\u5138\u56C1\u56C0\u56C2"+ - "\u5914\u5C6C\u5DCD\u61FC\u61FE\u651D\u651C\u6595"+ - "\u66E9\u6AFB\u6B04\u6AFA\u6BB2\u704C\u721B\u72A7"+ - "\u74D6\u74D4\u7669\u77D3\u7C50\u7E8F\u7E8C\u7FBC"+ - "\u8617\u862D\u861A\u8823\u8822\u8821\u881F\u896A"+ - "\u896C\u89BD\u8B74\u8B77\u8B7D\u8D13\u8E8A\u8E8D"+ - "\u8E8B\u8F5F\u8FAF\u91BA\u942E\u9433\u9435\u943A"+ - "\u9438\u9432\u942B\u95E2\u9738\u9739\u9732\u97FF"+ - "\u9867\u9865\u9957\u9A45\u9A43\u9A40\u9A3E\u9ACF"+ - "\u9B54\u9B51\u9C2D\u9C25\u9DAF\u9DB4\u9DC2\u9DB8"+ - "\u9E9D\u9EEF\u9F19\u9F5C\u9F66\u9F67\u513C\u513B"+ - "\u56C8\u56CA\u56C9\u5B7F\u5DD4\u5DD2\u5F4E\u61FF"+ - "\u6524\u6B0A\u6B61\u7051\u7058\u7380\u74E4\u758A"+ - "\u766E\u766C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u79B3\u7C60\u7C5F\u807E"+ - "\u807D\u81DF\u8972\u896F\u89FC\u8B80\u8D16\u8D17"+ - "\u8E91\u8E93\u8F61\u9148\u9444\u9451\u9452\u973D"+ - "\u973E\u97C3\u97C1\u986B\u9955\u9A55\u9A4D\u9AD2"+ - "\u9B1A\u9C49\u9C31\u9C3E\u9C3B\u9DD3\u9DD7\u9F34"+ - "\u9F6C\u9F6A\u9F94\u56CC\u5DD6\u6200\u6523\u652B"+ - "\u652A\u66EC\u6B10\u74DA\u7ACA\u7C64\u7C63\u7C65"+ - "\u7E93\u7E96\u7E94\u81E2\u8638\u863F\u8831\u8B8A"+ - "\u9090\u908F\u9463\u9460\u9464\u9768\u986F\u995C"+ - "\u9A5A\u9A5B\u9A57\u9AD3\u9AD4\u9AD1\u9C54\u9C57"+ - "\u9C56\u9DE5\u9E9F\u9EF4\u56D1\u58E9\u652C\u705E"+ - "\u7671\u7672\u77D7\u7F50\u7F88\u8836\u8839\u8862"+ - "\u8B93\u8B92\u8B96\u8277\u8D1B\u91C0\u946A\u9742"+ - "\u9748\u9744\u97C6\u9870\u9A5F\u9B22\u9B58\u9C5F"+ - "\u9DF9\u9DFA\u9E7C\u9E7D\u9F07\u9F77\u9F72\u5EF3"+ - "\u6B16\u7063\u7C6C\u7C6E\u883B\u89C0\u8EA1\u91C1"+ - "\u9472\u9470\u9871\u995E\u9AD6\u9B23\u9ECC\u7064"+ - "\u77DA\u8B9A\u9477\u97C9\u9A62\u9A65\u7E9C\u8B9C"+ - "\u8EAA\u91C5\u947D\u947E\u947C\u9C77\u9C78\u9EF7"+ - "\u8C54\u947F\u9E1A\u7228\u9A6A\u9B31\u9E1B\u9E1E"+ - "\u7C72\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u30FE\u309D\u309E\u3005\u3041"+ - "\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049"+ - "\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051"+ - "\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059"+ - "\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061"+ - "\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069"+ - "\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071"+ - "\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079"+ - "\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081"+ - "\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089"+ - "\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091"+ - "\u3092\u3093\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6"+ - "\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE"+ - "\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6"+ - "\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE"+ - "\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6"+ - "\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE"+ - "\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6"+ - "\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE"+ - "\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC"+ - "\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4"+ - "\u30F5\u30F6\u0414\u0415\u0401\u0416\u0417\u0418"+ - "\u0419\u041A\u041B\u041C\u0423\u0424\u0425\u0426"+ - "\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E"+ - "\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0451"+ - "\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D"+ - "\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445"+ - "\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D"+ - "\u044E\u044F\u2460\u2461\u2462\u2463\u2464\u2465"+ - "\u2466\u2467\u2468\u2469\u2474\u2475\u2476\u2477"+ - "\u2478\u2479\u247A\u247B\u247C\u247D\uFFFD\uFFFD"+ - "\u4E42\u4E5C\u51F5\u531A\u5382\u4E07\u4E0C\u4E47"+ - "\u4E8D\u56D7\uFA0C\u5C6E\u5F73\u4E0F\u5187\u4E0E"+ - "\u4E2E\u4E93\u4EC2\u4EC9\u4EC8\u5198\u52FC\u536C"+ - "\u53B9\u5720\u5903\u592C\u5C10\u5DFF\u65E1\u6BB3"+ - "\u6BCC\u6C14\u723F\u4E31\u4E3C\u4EE8\u4EDC\u4EE9"+ - "\u4EE1\u4EDD\u4EDA\u520C\u531C\u534C\u5722\u5723"+ - "\u5917\u592F\u5B81\u5B84\u5C12\u5C3B\u5C74\u5C73"+ - "\u5E04\u5E80\u5E82\u5FC9\u6209\u6250\u6C15\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u6C36\u6C43\u6C3F\u6C3B\u72AE\u72B0\u738A"+ - "\u79B8\u808A\u961E\u4F0E\u4F18\u4F2C\u4EF5\u4F14"+ - "\u4EF1\u4F00\u4EF7\u4F08\u4F1D\u4F02\u4F05\u4F22"+ - "\u4F13\u4F04\u4EF4\u4F12\u51B1\u5213\u5209\u5210"+ - "\u52A6\u5322\u531F\u534D\u538A\u5407\u56E1\u56DF"+ - "\u572E\u572A\u5734\u593C\u5980\u597C\u5985\u597B"+ - "\u597E\u5977\u597F\u5B56\u5C15\u5C25\u5C7C\u5C7A"+ - "\u5C7B\u5C7E\u5DDF\u5E75\u5E84\u5F02\u5F1A\u5F74"+ - "\u5FD5\u5FD4\u5FCF\u625C\u625E\u6264\u6261\u6266"+ - "\u6262\u6259\u6260\u625A\u6265\u65EF\u65EE\u673E"+ - "\u6739\u6738\u673B\u673A\u673F\u673C\u6733\u6C18"+ - "\u6C46\u6C52\u6C5C\u6C4F\u6C4A\u6C54\u6C4B\u6C4C"+ - "\u7071\u725E\u72B4\u72B5\u738E\u752A\u767F\u7A75"+ - "\u7F51\u8278\u827C\u8280\u827D\u827F\u864D\u897E"+ - "\u9099\u9097\u9098\u909B\u9094\u9622\u9624\u9620"+ - "\u9623\u4F56\u4F3B\u4F62\u4F49\u4F53\u4F64\u4F3E"+ - "\u4F67\u4F52\u4F5F\u4F41\u4F58\u4F2D\u4F33\u4F3F"+ - "\u4F61\u518F\u51B9\u521C\u521E\u5221\u52AD\u52AE"+ - "\u5309\u5363\u5372\u538E\u538F\u5430\u5437\u542A"+ - "\u5454\u5445\u5419\u541C\u5425\u5418\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u543D\u544F\u5441\u5428\u5424\u5447\u56EE\u56E7"+ - "\u56E5\u5741\u5745\u574C\u5749\u574B\u5752\u5906"+ - "\u5940\u59A6\u5998\u59A0\u5997\u598E\u59A2\u5990"+ - "\u598F\u59A7\u59A1\u5B8E\u5B92\u5C28\u5C2A\u5C8D"+ - "\u5C8F\u5C88\u5C8B\u5C89\u5C92\u5C8A\u5C86\u5C93"+ - "\u5C95\u5DE0\u5E0A\u5E0E\u5E8B\u5E89\u5E8C\u5E88"+ - "\u5E8D\u5F05\u5F1D\u5F78\u5F76\u5FD2\u5FD1\u5FD0"+ - "\u5FED\u5FE8\u5FEE\u5FF3\u5FE1\u5FE4\u5FE3\u5FFA"+ - "\u5FEF\u5FF7\u5FFB\u6000\u5FF4\u623A\u6283\u628C"+ - "\u628E\u628F\u6294\u6287\u6271\u627B\u627A\u6270"+ - "\u6281\u6288\u6277\u627D\u6272\u6274\u6537\u65F0"+ - "\u65F4\u65F3\u65F2\u65F5\u6745\u6747\u6759\u6755"+ - "\u674C\u6748\u675D\u674D\u675A\u674B\u6BD0\u6C19"+ - "\u6C1A\u6C78\u6C67\u6C6B\u6C84\u6C8B\u6C8F\u6C71"+ - "\u6C6F\u6C69\u6C9A\u6C6D\u6C87\u6C95\u6C9C\u6C66"+ - "\u6C73\u6C65\u6C7B\u6C8E\u7074\u707A\u7263\u72BF"+ - "\u72BD\u72C3\u72C6\u72C1\u72BA\u72C5\u7395\u7397"+ - "\u7393\u7394\u7392\u753A\u7539\u7594\u7595\u7681"+ - "\u793D\u8034\u8095\u8099\u8090\u8092\u809C\u8290"+ - "\u828F\u8285\u828E\u8291\u8293\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u828A"+ - "\u8283\u8284\u8C78\u8FC9\u8FBF\u909F\u90A1\u90A5"+ - "\u909E\u90A7\u90A0\u9630\u9628\u962F\u962D\u4E33"+ - "\u4F98\u4F7C\u4F85\u4F7D\u4F80\u4F87\u4F76\u4F74"+ - "\u4F89\u4F84\u4F77\u4F4C\u4F97\u4F6A\u4F9A\u4F79"+ - "\u4F81\u4F78\u4F90\u4F9C\u4F94\u4F9E\u4F92\u4F82"+ - "\u4F95\u4F6B\u4F6E\u519E\u51BC\u51BE\u5235\u5232"+ - "\u5233\u5246\u5231\u52BC\u530A\u530B\u533C\u5392"+ - "\u5394\u5487\u547F\u5481\u5491\u5482\u5488\u546B"+ - "\u547A\u547E\u5465\u546C\u5474\u5466\u548D\u546F"+ - "\u5461\u5460\u5498\u5463\u5467\u5464\u56F7\u56F9"+ - "\u576F\u5772\u576D\u576B\u5771\u5770\u5776\u5780"+ - "\u5775\u577B\u5773\u5774\u5762\u5768\u577D\u590C"+ - "\u5945\u59B5\u59BA\u59CF\u59CE\u59B2\u59CC\u59C1"+ - "\u59B6\u59BC\u59C3\u59D6\u59B1\u59BD\u59C0\u59C8"+ - "\u59B4\u59C7\u5B62\u5B65\u5B93\u5B95\u5C44\u5C47"+ - "\u5CAE\u5CA4\u5CA0\u5CB5\u5CAF\u5CA8\u5CAC\u5C9F"+ - "\u5CA3\u5CAD\u5CA2\u5CAA\u5CA7\u5C9D\u5CA5\u5CB6"+ - "\u5CB0\u5CA6\u5E17\u5E14\u5E19\u5F28\u5F22\u5F23"+ - "\u5F24\u5F54\u5F82\u5F7E\u5F7D\u5FDE\u5FE5\u602D"+ - "\u6026\u6019\u6032\u600B\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6034\u600A"+ - "\u6017\u6033\u601A\u601E\u602C\u6022\u600D\u6010"+ - "\u602E\u6013\u6011\u600C\u6009\u601C\u6214\u623D"+ - "\u62AD\u62B4\u62D1\u62BE\u62AA\u62B6\u62CA\u62AE"+ - "\u62B3\u62AF\u62BB\u62A9\u62B0\u62B8\u653D\u65A8"+ - "\u65BB\u6609\u65FC\u6604\u6612\u6608\u65FB\u6603"+ - "\u660B\u660D\u6605\u65FD\u6611\u6610\u66F6\u670A"+ - "\u6785\u676C\u678E\u6792\u6776\u677B\u6798\u6786"+ - "\u6784\u6774\u678D\u678C\u677A\u679F\u6791\u6799"+ - "\u6783\u677D\u6781\u6778\u6779\u6794\u6B25\u6B80"+ - "\u6B7E\u6BDE\u6C1D\u6C93\u6CEC\u6CEB\u6CEE\u6CD9"+ - "\u6CB6\u6CD4\u6CAD\u6CE7\u6CB7\u6CD0\u6CC2\u6CBA"+ - "\u6CC3\u6CC6\u6CED\u6CF2\u6CD2\u6CDD\u6CB4\u6C8A"+ - "\u6C9D\u6C80\u6CDE\u6CC0\u6D30\u6CCD\u6CC7\u6CB0"+ - "\u6CF9\u6CCF\u6CE9\u6CD1\u7094\u7098\u7085\u7093"+ - "\u7086\u7084\u7091\u7096\u7082\u709A\u7083\u726A"+ - "\u72D6\u72CB\u72D8\u72C9\u72DC\u72D2\u72D4\u72DA"+ - "\u72CC\u72D1\u73A4\u73A1\u73AD\u73A6\u73A2\u73A0"+ - "\u73AC\u739D\u74DD\u74E8\u753F\u7540\u753E\u758C"+ - "\u7598\u76AF\u76F3\u76F1\u76F0\u76F5\u77F8\u77FC"+ - "\u77F9\u77FB\u77FA\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u77F7\u7942\u793F"+ - "\u79C5\u7A78\u7A7B\u7AFB\u7C75\u7CFD\u8035\u808F"+ - "\u80AE\u80A3\u80B8\u80B5\u80AD\u8220\u82A0\u82C0"+ - "\u82AB\u829A\u8298\u829B\u82B5\u82A7\u82AE\u82BC"+ - "\u829E\u82BA\u82B4\u82A8\u82A1\u82A9\u82C2\u82A4"+ - "\u82C3\u82B6\u82A2\u8670\u866F\u866D\u866E\u8C56"+ - "\u8FD2\u8FCB\u8FD3\u8FCD\u8FD6\u8FD5\u8FD7\u90B2"+ - "\u90B4\u90AF\u90B3\u90B0\u9639\u963D\u963C\u963A"+ - "\u9643\u4FCD\u4FC5\u4FD3\u4FB2\u4FC9\u4FCB\u4FC1"+ - "\u4FD4\u4FDC\u4FD9\u4FBB\u4FB3\u4FDB\u4FC7\u4FD6"+ - "\u4FBA\u4FC0\u4FB9\u4FEC\u5244\u5249\u52C0\u52C2"+ - "\u533D\u537C\u5397\u5396\u5399\u5398\u54BA\u54A1"+ - "\u54AD\u54A5\u54CF\u54C3\u830D\u54B7\u54AE\u54D6"+ - "\u54B6\u54C5\u54C6\u54A0\u5470\u54BC\u54A2\u54BE"+ - "\u5472\u54DE\u54B0\u57B5\u579E\u579F\u57A4\u578C"+ - "\u5797\u579D\u579B\u5794\u5798\u578F\u5799\u57A5"+ - "\u579A\u5795\u58F4\u590D\u5953\u59E1\u59DE\u59EE"+ - "\u5A00\u59F1\u59DD\u59FA\u59FD\u59FC\u59F6\u59E4"+ - "\u59F2\u59F7\u59DB\u59E9\u59F3\u59F5\u59E0\u59FE"+ - "\u59F4\u59ED\u5BA8\u5C4C\u5CD0\u5CD8\u5CCC\u5CD7"+ - "\u5CCB\u5CDB\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u5CDE\u5CDA\u5CC9\u5CC7"+ - "\u5CCA\u5CD6\u5CD3\u5CD4\u5CCF\u5CC8\u5CC6\u5CCE"+ - "\u5CDF\u5CF8\u5DF9\u5E21\u5E22\u5E23\u5E20\u5E24"+ - "\u5EB0\u5EA4\u5EA2\u5E9B\u5EA3\u5EA5\u5F07\u5F2E"+ - "\u5F56\u5F86\u6037\u6039\u6054\u6072\u605E\u6045"+ - "\u6053\u6047\u6049\u605B\u604C\u6040\u6042\u605F"+ - "\u6024\u6044\u6058\u6066\u606E\u6242\u6243\u62CF"+ - "\u630D\u630B\u62F5\u630E\u6303\u62EB\u62F9\u630F"+ - "\u630C\u62F8\u62F6\u6300\u6313\u6314\u62FA\u6315"+ - "\u62FB\u62F0\u6541\u6543\u65AA\u65BF\u6636\u6621"+ - "\u6632\u6635\u661C\u6626\u6622\u6633\u662B\u663A"+ - "\u661D\u6634\u6639\u662E\u670F\u6710\u67C1\u67F2"+ - "\u67C8\u67BA\u67DC\u67BB\u67F8\u67D8\u67C0\u67B7"+ - "\u67C5\u67EB\u67E4\u67DF\u67B5\u67CD\u67B3\u67F7"+ - "\u67F6\u67EE\u67E3\u67C2\u67B9\u67CE\u67E7\u67F0"+ - "\u67B2\u67FC\u67C6\u67ED\u67CC\u67AE\u67E6\u67DB"+ - "\u67FA\u67C9\u67CA\u67C3\u67EA\u67CB\u6B28\u6B82"+ - "\u6B84\u6BB6\u6BD6\u6BD8\u6BE0\u6C20\u6C21\u6D28"+ - "\u6D34\u6D2D\u6D1F\u6D3C\u6D3F\u6D12\u6D0A\u6CDA"+ - "\u6D33\u6D04\u6D19\u6D3A\u6D1A\u6D11\u6D00\u6D1D"+ - "\u6D42\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u6D01\u6D18\u6D37\u6D03\u6D0F"+ - "\u6D40\u6D07\u6D20\u6D2C\u6D08\u6D22\u6D09\u6D10"+ - "\u70B7\u709F\u70BE\u70B1\u70B0\u70A1\u70B4\u70B5"+ - "\u70A9\u7241\u7249\u724A\u726C\u7270\u7273\u726E"+ - "\u72CA\u72E4\u72E8\u72EB\u72DF\u72EA\u72E6\u72E3"+ - "\u7385\u73CC\u73C2\u73C8\u73C5\u73B9\u73B6\u73B5"+ - "\u73B4\u73EB\u73BF\u73C7\u73BE\u73C3\u73C6\u73B8"+ - "\u73CB\u74EC\u74EE\u752E\u7547\u7548\u75A7\u75AA"+ - "\u7679\u76C4\u7708\u7703\u7704\u7705\u770A\u76F7"+ - "\u76FB\u76FA\u77E7\u77E8\u7806\u7811\u7812\u7805"+ - "\u7810\u780F\u780E\u7809\u7803\u7813\u794A\u794C"+ - "\u794B\u7945\u7944\u79D5\u79CD\u79CF\u79D6\u79CE"+ - "\u7A80\u7A7E\u7AD1\u7B00\u7B01\u7C7A\u7C78\u7C79"+ - "\u7C7F\u7C80\u7C81\u7D03\u7D08\u7D01\u7F58\u7F91"+ - "\u7F8D\u7FBE\u8007\u800E\u800F\u8014\u8037\u80D8"+ - "\u80C7\u80E0\u80D1\u80C8\u80C2\u80D0\u80C5\u80E3"+ - "\u80D9\u80DC\u80CA\u80D5\u80C9\u80CF\u80D7\u80E6"+ - "\u80CD\u81FF\u8221\u8294\u82D9\u82FE\u82F9\u8307"+ - "\u82E8\u8300\u82D5\u833A\u82EB\u82D6\u82F4\u82EC"+ - "\u82E1\u82F2\u82F5\u830C\u82FB\u82F6\u82F0\u82EA"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u82E4\u82E0\u82FA\u82F3\u82ED\u8677"+ - "\u8674\u867C\u8673\u8841\u884E\u8867\u886A\u8869"+ - "\u89D3\u8A04\u8A07\u8D72\u8FE3\u8FE1\u8FEE\u8FE0"+ - "\u90F1\u90BD\u90BF\u90D5\u90C5\u90BE\u90C7\u90CB"+ - "\u90C8\u91D4\u91D3\u9654\u964F\u9651\u9653\u964A"+ - "\u964E\u501E\u5005\u5007\u5013\u5022\u5030\u501B"+ - "\u4FF5\u4FF4\u5033\u5037\u502C\u4FF6\u4FF7\u5017"+ - "\u501C\u5020\u5027\u5035\u502F\u5031\u500E\u515A"+ - "\u5194\u5193\u51CA\u51C4\u51C5\u51C8\u51CE\u5261"+ - "\u525A\u5252\u525E\u525F\u5255\u5262\u52CD\u530E"+ - "\u539E\u5526\u54E2\u5517\u5512\u54E7\u54F3\u54E4"+ - "\u551A\u54FF\u5504\u5508\u54EB\u5511\u5505\u54F1"; - - private final static String innerIndex3= - "\u550A\u54FB\u54F7\u54F8\u54E0\u550E\u5503\u550B"+ - "\u5701\u5702\u57CC\u5832\u57D5\u57D2\u57BA\u57C6"+ - "\u57BD\u57BC\u57B8\u57B6\u57BF\u57C7\u57D0\u57B9"+ - "\u57C1\u590E\u594A\u5A19\u5A16\u5A2D\u5A2E\u5A15"+ - "\u5A0F\u5A17\u5A0A\u5A1E\u5A33\u5B6C\u5BA7\u5BAD"+ - "\u5BAC\u5C03\u5C56\u5C54\u5CEC\u5CFF\u5CEE\u5CF1"+ - "\u5CF7\u5D00\u5CF9\u5E29\u5E28\u5EA8\u5EAE\u5EAA"+ - "\u5EAC\u5F33\u5F30\u5F67\u605D\u605A\u6067\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u6041\u60A2\u6088\u6080\u6092\u6081\u609D"+ - "\u6083\u6095\u609B\u6097\u6087\u609C\u608E\u6219"+ - "\u6246\u62F2\u6310\u6356\u632C\u6344\u6345\u6336"+ - "\u6343\u63E4\u6339\u634B\u634A\u633C\u6329\u6341"+ - "\u6334\u6358\u6354\u6359\u632D\u6347\u6333\u635A"+ - "\u6351\u6338\u6357\u6340\u6348\u654A\u6546\u65C6"+ - "\u65C3\u65C4\u65C2\u664A\u665F\u6647\u6651\u6712"+ - "\u6713\u681F\u681A\u6849\u6832\u6833\u683B\u684B"+ - "\u684F\u6816\u6831\u681C\u6835\u682B\u682D\u682F"+ - "\u684E\u6844\u6834\u681D\u6812\u6814\u6826\u6828"+ - "\u682E\u684D\u683A\u6825\u6820\u6B2C\u6B2F\u6B2D"+ - "\u6B31\u6B34\u6B6D\u8082\u6B88\u6BE6\u6BE4\u6BE8"+ - "\u6BE3\u6BE2\u6BE7\u6C25\u6D7A\u6D63\u6D64\u6D76"+ - "\u6D0D\u6D61\u6D92\u6D58\u6D62\u6D6D\u6D6F\u6D91"+ - "\u6D8D\u6DEF\u6D7F\u6D86\u6D5E\u6D67\u6D60\u6D97"+ - "\u6D70\u6D7C\u6D5F\u6D82\u6D98\u6D2F\u6D68\u6D8B"+ - "\u6D7E\u6D80\u6D84\u6D16\u6D83\u6D7B\u6D7D\u6D75"+ - "\u6D90\u70DC\u70D3\u70D1\u70DD\u70CB\u7F39\u70E2"+ - "\u70D7\u70D2\u70DE\u70E0\u70D4\u70CD\u70C5\u70C6"+ - "\u70C7\u70DA\u70CE\u70E1\u7242\u7278\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u7277\u7276\u7300\u72FA\u72F4\u72FE\u72F6\u72F3"+ - "\u72FB\u7301\u73D3\u73D9\u73E5\u73D6\u73BC\u73E7"+ - "\u73E3\u73E9\u73DC\u73D2\u73DB\u73D4\u73DD\u73DA"+ - "\u73D7\u73D8\u73E8\u74DE\u74DF\u74F4\u74F5\u7521"+ - "\u755B\u755F\u75B0\u75C1\u75BB\u75C4\u75C0\u75BF"+ - "\u75B6\u75BA\u768A\u76C9\u771D\u771B\u7710\u7713"+ - "\u7712\u7723\u7711\u7715\u7719\u771A\u7722\u7727"+ - "\u7823\u782C\u7822\u7835\u782F\u7828\u782E\u782B"+ - "\u7821\u7829\u7833\u782A\u7831\u7954\u795B\u794F"+ - "\u795C\u7953\u7952\u7951\u79EB\u79EC\u79E0\u79EE"+ - "\u79ED\u79EA\u79DC\u79DE\u79DD\u7A86\u7A89\u7A85"+ - "\u7A8B\u7A8C\u7A8A\u7A87\u7AD8\u7B10\u7B04\u7B13"+ - "\u7B05\u7B0F\u7B08\u7B0A\u7B0E\u7B09\u7B12\u7C84"+ - "\u7C91\u7C8A\u7C8C\u7C88\u7C8D\u7C85\u7D1E\u7D1D"+ - "\u7D11\u7D0E\u7D18\u7D16\u7D13\u7D1F\u7D12\u7D0F"+ - "\u7D0C\u7F5C\u7F61\u7F5E\u7F60\u7F5D\u7F5B\u7F96"+ - "\u7F92\u7FC3\u7FC2\u7FC0\u8016\u803E\u8039\u80FA"+ - "\u80F2\u80F9\u80F5\u8101\u80FB\u8100\u8201\u822F"+ - "\u8225\u8333\u832D\u8344\u8319\u8351\u8325\u8356"+ - "\u833F\u8341\u8326\u831C\u8322\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8342"+ - "\u834E\u831B\u832A\u8308\u833C\u834D\u8316\u8324"+ - "\u8320\u8337\u832F\u8329\u8347\u8345\u834C\u8353"+ - "\u831E\u832C\u834B\u8327\u8348\u8653\u8652\u86A2"+ - "\u86A8\u8696\u868D\u8691\u869E\u8687\u8697\u8686"+ - "\u868B\u869A\u8685\u86A5\u8699\u86A1\u86A7\u8695"+ - "\u8698\u868E\u869D\u8690\u8694\u8843\u8844\u886D"+ - "\u8875\u8876\u8872\u8880\u8871\u887F\u886F\u8883"+ - "\u887E\u8874\u887C\u8A12\u8C47\u8C57\u8C7B\u8CA4"+ - "\u8CA3\u8D76\u8D78\u8DB5\u8DB7\u8DB6\u8ED1\u8ED3"+ - "\u8FFE\u8FF5\u9002\u8FFF\u8FFB\u9004\u8FFC\u8FF6"+ - "\u90D6\u90E0\u90D9\u90DA\u90E3\u90DF\u90E5\u90D8"+ - "\u90DB\u90D7\u90DC\u90E4\u9150\u914E\u914F\u91D5"+ - "\u91E2\u91DA\u965C\u965F\u96BC\u98E3\u9ADF\u9B2F"+ - "\u4E7F\u5070\u506A\u5061\u505E\u5060\u5053\u504B"+ - "\u505D\u5072\u5048\u504D\u5041\u505B\u504A\u5062"+ - "\u5015\u5045\u505F\u5069\u506B\u5063\u5064\u5046"+ - "\u5040\u506E\u5073\u5057\u5051\u51D0\u526B\u526D"+ - "\u526C\u526E\u52D6\u52D3\u532D\u539C\u5575\u5576"+ - "\u553C\u554D\u5550\u5534\u552A\u5551\u5562\u5536"+ - "\u5535\u5530\u5552\u5545\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u550C\u5532"+ - "\u5565\u554E\u5539\u5548\u552D\u553B\u5540\u554B"+ - "\u570A\u5707\u57FB\u5814\u57E2\u57F6\u57DC\u57F4"+ - "\u5800\u57ED\u57FD\u5808\u57F8\u580B\u57F3\u57CF"+ - "\u5807\u57EE\u57E3\u57F2\u57E5\u57EC\u57E1\u580E"+ - "\u57FC\u5810\u57E7\u5801\u580C\u57F1\u57E9\u57F0"+ - "\u580D\u5804\u595C\u5A60\u5A58\u5A55\u5A67\u5A5E"+ - "\u5A38\u5A35\u5A6D\u5A50\u5A5F\u5A65\u5A6C\u5A53"+ - "\u5A64\u5A57\u5A43\u5A5D\u5A52\u5A44\u5A5B\u5A48"+ - "\u5A8E\u5A3E\u5A4D\u5A39\u5A4C\u5A70\u5A69\u5A47"+ - "\u5A51\u5A56\u5A42\u5A5C\u5B72\u5B6E\u5BC1\u5BC0"+ - "\u5C59\u5D1E\u5D0B\u5D1D\u5D1A\u5D20\u5D0C\u5D28"+ - "\u5D0D\u5D26\u5D25\u5D0F\u5D30\u5D12\u5D23\u5D1F"+ - "\u5D2E\u5E3E\u5E34\u5EB1\u5EB4\u5EB9\u5EB2\u5EB3"+ - "\u5F36\u5F38\u5F9B\u5F96\u5F9F\u608A\u6090\u6086"+ - "\u60BE\u60B0\u60BA\u60D3\u60D4\u60CF\u60E4\u60D9"+ - "\u60DD\u60C8\u60B1\u60DB\u60B7\u60CA\u60BF\u60C3"+ - "\u60CD\u60C0\u6332\u6365\u638A\u6382\u637D\u63BD"+ - "\u639E\u63AD\u639D\u6397\u63AB\u638E\u636F\u6387"+ - "\u6390\u636E\u63AF\u6375\u639C\u636D\u63AE\u637C"+ - "\u63A4\u633B\u639F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6378\u6385\u6381"+ - "\u6391\u638D\u6370\u6553\u65CD\u6665\u6661\u665B"+ - "\u6659\u665C\u6662\u6718\u6879\u6887\u6890\u689C"+ - "\u686D\u686E\u68AE\u68AB\u6956\u686F\u68A3\u68AC"+ - "\u68A9\u6875\u6874\u68B2\u688F\u6877\u6892\u687C"+ - "\u686B\u6872\u68AA\u6880\u6871\u687E\u689B\u6896"+ - "\u688B\u68A0\u6889\u68A4\u6878\u687B\u6891\u688C"+ - "\u688A\u687D\u6B36\u6B33\u6B37\u6B38\u6B91\u6B8F"+ - "\u6B8D\u6B8E\u6B8C\u6C2A\u6DC0\u6DAB\u6DB4\u6DB3"+ - "\u6E74\u6DAC\u6DE9\u6DE2\u6DB7\u6DF6\u6DD4\u6E00"+ - "\u6DC8\u6DE0\u6DDF\u6DD6\u6DBE\u6DE5\u6DDC\u6DDD"+ - "\u6DDB\u6DF4\u6DCA\u6DBD\u6DED\u6DF0\u6DBA\u6DD5"+ - "\u6DC2\u6DCF\u6DC9\u6DD0\u6DF2\u6DD3\u6DFD\u6DD7"+ - "\u6DCD\u6DE3\u6DBB\u70FA\u710D\u70F7\u7117\u70F4"+ - "\u710C\u70F0\u7104\u70F3\u7110\u70FC\u70FF\u7106"+ - "\u7113\u7100\u70F8\u70F6\u710B\u7102\u710E\u727E"+ - "\u727B\u727C\u727F\u731D\u7317\u7307\u7311\u7318"+ - "\u730A\u7308\u72FF\u730F\u731E\u7388\u73F6\u73F8"+ - "\u73F5\u7404\u7401\u73FD\u7407\u7400\u73FA\u73FC"+ - "\u73FF\u740C\u740B\u73F4\u7408\u7564\u7563\u75CE"+ - "\u75D2\u75CF\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u75CB\u75CC\u75D1\u75D0"+ - "\u768F\u7689\u76D3\u7739\u772F\u772D\u7731\u7732"+ - "\u7734\u7733\u773D\u7725\u773B\u7735\u7848\u7852"+ - "\u7849\u784D\u784A\u784C\u7826\u7845\u7850\u7964"+ - "\u7967\u7969\u796A\u7963\u796B\u7961\u79BB\u79FA"+ - "\u79F8\u79F6\u79F7\u7A8F\u7A94\u7A90\u7B35\u7B47"+ - "\u7B34\u7B25\u7B30\u7B22\u7B24\u7B33\u7B18\u7B2A"+ - "\u7B1D\u7B31\u7B2B\u7B2D\u7B2F\u7B32\u7B38\u7B1A"+ - "\u7B23\u7C94\u7C98\u7C96\u7CA3\u7D35\u7D3D\u7D38"+ - "\u7D36\u7D3A\u7D45\u7D2C\u7D29\u7D41\u7D47\u7D3E"+ - "\u7D3F\u7D4A\u7D3B\u7D28\u7F63\u7F95\u7F9C\u7F9D"+ - "\u7F9B\u7FCA\u7FCB\u7FCD\u7FD0\u7FD1\u7FC7\u7FCF"+ - "\u7FC9\u801F\u801E\u801B\u8047\u8043\u8048\u8118"+ - "\u8125\u8119\u811B\u812D\u811F\u812C\u811E\u8121"+ - "\u8115\u8127\u811D\u8122\u8211\u8238\u8233\u823A"+ - "\u8234\u8232\u8274\u8390\u83A3\u83A8\u838D\u837A"+ - "\u8373\u83A4\u8374\u838F\u8381\u8395\u8399\u8375"+ - "\u8394\u83A9\u837D\u8383\u838C\u839D\u839B\u83AA"+ - "\u838B\u837E\u83A5\u83AF\u8388\u8397\u83B0\u837F"+ - "\u83A6\u8387\u83AE\u8376\u839A\u8659\u8656\u86BF"+ - "\u86B7\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u86C2\u86C1\u86C5\u86BA\u86B0"+ - "\u86C8\u86B9\u86B3\u86B8\u86CC\u86B4\u86BB\u86BC"+ - "\u86C3\u86BD\u86BE\u8852\u8889\u8895\u88A8\u88A2"+ - "\u88AA\u889A\u8891\u88A1\u889F\u8898\u88A7\u8899"+ - "\u889B\u8897\u88A4\u88AC\u888C\u8893\u888E\u8982"+ - "\u89D6\u89D9\u89D5\u8A30\u8A27\u8A2C\u8A1E\u8C39"+ - "\u8C3B\u8C5C\u8C5D\u8C7D\u8CA5\u8D7D\u8D7B\u8D79"+ - "\u8DBC\u8DC2\u8DB9\u8DBF\u8DC1\u8ED8\u8EDE\u8EDD"+ - "\u8EDC\u8ED7\u8EE0\u8EE1\u9024\u900B\u9011\u901C"+ - "\u900C\u9021\u90EF\u90EA\u90F0\u90F4\u90F2\u90F3"+ - "\u90D4\u90EB\u90EC\u90E9\u9156\u9158\u915A\u9153"+ - "\u9155\u91EC\u91F4\u91F1\u91F3\u91F8\u91E4\u91F9"+ - "\u91EA\u91EB\u91F7\u91E8\u91EE\u957A\u9586\u9588"+ - "\u967C\u966D\u966B\u9671\u966F\u96BF\u976A\u9804"+ - "\u98E5\u9997\u509B\u5095\u5094\u509E\u508B\u50A3"+ - "\u5083\u508C\u508E\u509D\u5068\u509C\u5092\u5082"+ - "\u5087\u515F\u51D4\u5312\u5311\u53A4\u53A7\u5591"+ - "\u55A8\u55A5\u55AD\u5577\u5645\u55A2\u5593\u5588"+ - "\u558F\u55B5\u5581\u55A3\u5592\u55A4\u557D\u558C"+ - "\u55A6\u557F\u5595\u55A1\u558E\u570C\u5829\u5837"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u5819\u581E\u5827\u5823\u5828\u57F5"+ - "\u5848\u5825\u581C\u581B\u5833\u583F\u5836\u582E"+ - "\u5839\u5838\u582D\u582C\u583B\u5961\u5AAF\u5A94"+ - "\u5A9F\u5A7A\u5AA2\u5A9E\u5A78\u5AA6\u5A7C\u5AA5"+ - "\u5AAC\u5A95\u5AAE\u5A37\u5A84\u5A8A\u5A97\u5A83"+ - "\u5A8B\u5AA9\u5A7B\u5A7D\u5A8C\u5A9C\u5A8F\u5A93"+ - "\u5A9D\u5BEA\u5BCD\u5BCB\u5BD4\u5BD1\u5BCA\u5BCE"+ - "\u5C0C\u5C30\u5D37\u5D43\u5D6B\u5D41\u5D4B\u5D3F"+ - "\u5D35\u5D51\u5D4E\u5D55\u5D33\u5D3A\u5D52\u5D3D"+ - "\u5D31\u5D59\u5D42\u5D39\u5D49\u5D38\u5D3C\u5D32"+ - "\u5D36\u5D40\u5D45\u5E44\u5E41\u5F58\u5FA6\u5FA5"+ - "\u5FAB\u60C9\u60B9\u60CC\u60E2\u60CE\u60C4\u6114"+ - "\u60F2\u610A\u6116\u6105\u60F5\u6113\u60F8\u60FC"+ - "\u60FE\u60C1\u6103\u6118\u611D\u6110\u60FF\u6104"+ - "\u610B\u624A\u6394\u63B1\u63B0\u63CE\u63E5\u63E8"+ - "\u63EF\u63C3\u649D\u63F3\u63CA\u63E0\u63F6\u63D5"+ - "\u63F2\u63F5\u6461\u63DF\u63BE\u63DD\u63DC\u63C4"+ - "\u63D8\u63D3\u63C2\u63C7\u63CC\u63CB\u63C8\u63F0"+ - "\u63D7\u63D9\u6532\u6567\u656A\u6564\u655C\u6568"+ - "\u6565\u658C\u659D\u659E\u65AE\u65D0\u65D2\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u667C\u666C\u667B\u6680\u6671\u6679\u666A"+ - "\u6672\u6701\u690C\u68D3\u6904\u68DC\u692A\u68EC"+ - "\u68EA\u68F1\u690F\u68D6\u68F7\u68EB\u68E4\u68F6"+ - "\u6913\u6910\u68F3\u68E1\u6907\u68CC\u6908\u6970"+ - "\u68B4\u6911\u68EF\u68C6\u6914\u68F8\u68D0\u68FD"+ - "\u68FC\u68E8\u690B\u690A\u6917\u68CE\u68C8\u68DD"+ - "\u68DE\u68E6\u68F4\u68D1\u6906\u68D4\u68E9\u6915"+ - "\u6925\u68C7\u6B39\u6B3B\u6B3F\u6B3C\u6B94\u6B97"+ - "\u6B99\u6B95\u6BBD\u6BF0\u6BF2\u6BF3\u6C30\u6DFC"+ - "\u6E46\u6E47\u6E1F\u6E49\u6E88\u6E3C\u6E3D\u6E45"+ - "\u6E62\u6E2B\u6E3F\u6E41\u6E5D\u6E73\u6E1C\u6E33"+ - "\u6E4B\u6E40\u6E51\u6E3B\u6E03\u6E2E\u6E5E\u6E68"+ - "\u6E5C\u6E61\u6E31\u6E28\u6E60\u6E71\u6E6B\u6E39"+ - "\u6E22\u6E30\u6E53\u6E65\u6E27\u6E78\u6E64\u6E77"+ - "\u6E55\u6E79\u6E52\u6E66\u6E35\u6E36\u6E5A\u7120"+ - "\u711E\u712F\u70FB\u712E\u7131\u7123\u7125\u7122"+ - "\u7132\u711F\u7128\u713A\u711B\u724B\u725A\u7288"+ - "\u7289\u7286\u7285\u728B\u7312\u730B\u7330\u7322"+ - "\u7331\u7333\u7327\u7332\u732D\u7326\u7323\u7335"+ - "\u730C\u742E\u742C\u7430\u742B\u7416\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u741A\u7421\u742D\u7431\u7424\u7423\u741D\u7429"+ - "\u7420\u7432\u74FB\u752F\u756F\u756C\u75E7\u75DA"+ - "\u75E1\u75E6\u75DD\u75DF\u75E4\u75D7\u7695\u7692"+ - "\u76DA\u7746\u7747\u7744\u774D\u7745\u774A\u774E"+ - "\u774B\u774C\u77DE\u77EC\u7860\u7864\u7865\u785C"+ - "\u786D\u7871\u786A\u786E\u7870\u7869\u7868\u785E"+ - "\u7862\u7974\u7973\u7972\u7970\u7A02\u7A0A\u7A03"+ - "\u7A0C\u7A04\u7A99\u7AE6\u7AE4\u7B4A\u7B3B\u7B44"+ - "\u7B48\u7B4C\u7B4E\u7B40\u7B58\u7B45\u7CA2\u7C9E"+ - "\u7CA8\u7CA1\u7D58\u7D6F\u7D63\u7D53\u7D56\u7D67"+ - "\u7D6A\u7D4F\u7D6D\u7D5C\u7D6B\u7D52\u7D54\u7D69"+ - "\u7D51\u7D5F\u7D4E\u7F3E\u7F3F\u7F65\u7F66\u7FA2"+ - "\u7FA0\u7FA1\u7FD7\u8051\u804F\u8050\u80FE\u80D4"+ - "\u8143\u814A\u8152\u814F\u8147\u813D\u814D\u813A"+ - "\u81E6\u81EE\u81F7\u81F8\u81F9\u8204\u823C\u823D"+ - "\u823F\u8275\u833B\u83CF\u83F9\u8423\u83C0\u83E8"+ - "\u8412\u83E7\u83E4\u83FC\u83F6\u8410\u83C6\u83C8"+ - "\u83EB\u83E3\u83BF\u8401\u83DD\u83E5\u83D8\u83FF"+ - "\u83E1\u83CB\u83CE\u83D6\u83F5\u83C9\u8409\u840F"+ - "\u83DE\u8411\u8406\u83C2\u83F3\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u83D5"+ - "\u83FA\u83C7\u83D1\u83EA\u8413\u83C3\u83EC\u83EE"+ - "\u83C4\u83FB\u83D7\u83E2\u841B\u83DB\u83FE\u86D8"+ - "\u86E2\u86E6\u86D3\u86E3\u86DA\u86EA\u86DD\u86EB"+ - "\u86DC\u86EC\u86E9\u86D7\u86E8\u86D1\u8848\u8856"+ - "\u8855\u88BA\u88D7\u88B9\u88B8\u88C0\u88BE\u88B6"+ - "\u88BC\u88B7\u88BD\u88B2\u8901\u88C9\u8995\u8998"+ - "\u8997\u89DD\u89DA\u89DB\u8A4E\u8A4D\u8A39\u8A59"+ - "\u8A40\u8A57\u8A58\u8A44\u8A45\u8A52\u8A48\u8A51"+ - "\u8A4A\u8A4C\u8A4F\u8C5F\u8C81\u8C80\u8CBA\u8CBE"+ - "\u8CB0\u8CB9\u8CB5\u8D84\u8D80\u8D89\u8DD8\u8DD3"+ - "\u8DCD\u8DC7\u8DD6\u8DDC\u8DCF\u8DD5\u8DD9\u8DC8"+ - "\u8DD7\u8DC5\u8EEF\u8EF7\u8EFA\u8EF9\u8EE6\u8EEE"+ - "\u8EE5\u8EF5\u8EE7\u8EE8\u8EF6\u8EEB\u8EF1\u8EEC"+ - "\u8EF4\u8EE9\u902D\u9034\u902F\u9106\u912C\u9104"+ - "\u90FF\u90FC\u9108\u90F9\u90FB\u9101\u9100\u9107"+ - "\u9105\u9103\u9161\u9164\u915F\u9162\u9160\u9201"+ - "\u920A\u9225\u9203\u921A\u9226\u920F\u920C\u9200"+ - "\u9212\u91FF\u91FD\u9206\u9204\u9227\u9202\u921C"+ - "\u9224\u9219\u9217\u9205\u9216\u957B\u958D\u958C"+ - "\u9590\u9687\u967E\u9688\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9689\u9683"+ - "\u9680\u96C2\u96C8\u96C3\u96F1\u96F0\u976C\u9770"+ - "\u976E\u9807\u98A9\u98EB\u9CE6\u9EF9\u4E83\u4E84"+ - "\u4EB6\u50BD\u50BF\u50C6\u50AE\u50C4\u50CA\u50B4"+ - "\u50C8\u50C2\u50B0\u50C1\u50BA\u50B1\u50CB\u50C9"+ - "\u50B6\u50B8\u51D7\u527A\u5278\u527B\u527C\u55C3"+ - "\u55DB\u55CC\u55D0\u55CB\u55CA\u55DD\u55C0\u55D4"+ - "\u55C4\u55E9\u55BF\u55D2\u558D\u55CF\u55D5\u55E2"+ - "\u55D6\u55C8\u55F2\u55CD\u55D9\u55C2\u5714\u5853"+ - "\u5868\u5864\u584F\u584D\u5849\u586F\u5855\u584E"+ - "\u585D\u5859\u5865\u585B\u583D\u5863\u5871\u58FC"+ - "\u5AC7\u5AC4\u5ACB\u5ABA\u5AB8\u5AB1\u5AB5\u5AB0"+ - "\u5ABF\u5AC8\u5ABB\u5AC6\u5AB7\u5AC0\u5ACA\u5AB4"+ - "\u5AB6\u5ACD\u5AB9\u5A90\u5BD6\u5BD8\u5BD9\u5C1F"+ - "\u5C33\u5D71\u5D63\u5D4A\u5D65\u5D72\u5D6C\u5D5E"+ - "\u5D68\u5D67\u5D62\u5DF0\u5E4F\u5E4E\u5E4A\u5E4D"+ - "\u5E4B\u5EC5\u5ECC\u5EC6\u5ECB\u5EC7\u5F40\u5FAF"+ - "\u5FAD\u60F7\u6149\u614A\u612B\u6145\u6136\u6132"+ - "\u612E\u6146\u612F\u614F\u6129\u6140\u6220\u9168"+ - "\u6223\u6225\u6224\u63C5\u63F1\u63EB\u6410\u6412"+ - "\u6409\u6420\u6424\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6433\u6443\u641F"+ - "\u6415\u6418\u6439\u6437\u6422\u6423\u640C\u6426"+ - "\u6430\u6428\u6441\u6435\u642F\u640A\u641A\u6440"+ - "\u6425\u6427\u640B\u63E7\u641B\u642E\u6421\u640E"+ - "\u656F\u6592\u65D3\u6686\u668C\u6695\u6690\u668B"+ - "\u668A\u6699\u6694\u6678\u6720\u6966\u695F\u6938"+ - "\u694E\u6962\u6971\u693F\u6945\u696A\u6939\u6942"+ - "\u6957\u6959\u697A\u6948\u6949\u6935\u696C\u6933"+ - "\u693D\u6965\u68F0\u6978\u6934\u6969\u6940\u696F"+ - "\u6944\u6976\u6958\u6941\u6974\u694C\u693B\u694B"+ - "\u6937\u695C\u694F\u6951\u6932\u6952\u692F\u697B"+ - "\u693C\u6B46\u6B45\u6B43\u6B42\u6B48\u6B41\u6B9B"+ - "\uFA0D\u6BFB\u6BFC\u6BF9\u6BF7\u6BF8\u6E9B\u6ED6"+ - "\u6EC8\u6E8F\u6EC0\u6E9F\u6E93\u6E94\u6EA0\u6EB1"+ - "\u6EB9\u6EC6\u6ED2\u6EBD\u6EC1\u6E9E\u6EC9\u6EB7"+ - "\u6EB0\u6ECD\u6EA6\u6ECF\u6EB2\u6EBE\u6EC3\u6EDC"+ - "\u6ED8\u6E99\u6E92\u6E8E\u6E8D\u6EA4\u6EA1\u6EBF"+ - "\u6EB3\u6ED0\u6ECA\u6E97\u6EAE\u6EA3\u7147\u7154"+ - "\u7152\u7163\u7160\u7141\u715D\u7162\u7172\u7178"+ - "\u716A\u7161\u7142\u7158\u7143\u714B\u7170\u715F"+ - "\u7150\u7153\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7144\u714D\u715A\u724F"+ - "\u728D\u728C\u7291\u7290\u728E\u733C\u7342\u733B"+ - "\u733A\u7340\u734A\u7349\u7444\u744A\u744B\u7452"+ - "\u7451\u7457\u7440\u744F\u7450\u744E\u7442\u7446"+ - "\u744D\u7454\u74E1\u74FF\u74FE\u74FD\u751D\u7579"+ - "\u7577\u6983\u75EF\u760F\u7603\u75F7\u75FE\u75FC"+ - "\u75F9\u75F8\u7610\u75FB\u75F6\u75ED\u75F5\u75FD"+ - "\u7699\u76B5\u76DD\u7755\u775F\u7760\u7752\u7756"+ - "\u775A\u7769\u7767\u7754\u7759\u776D\u77E0\u7887"+ - "\u789A\u7894\u788F\u7884\u7895\u7885\u7886\u78A1"+ - "\u7883\u7879\u7899\u7880\u7896\u787B\u797C\u7982"+ - "\u797D\u7979\u7A11\u7A18\u7A19\u7A12\u7A17\u7A15"+ - "\u7A22\u7A13\u7A1B\u7A10\u7AA3\u7AA2\u7A9E\u7AEB"+ - "\u7B66\u7B64\u7B6D\u7B74\u7B69\u7B72\u7B65\u7B73"+ - "\u7B71\u7B70\u7B61\u7B78\u7B76\u7B63\u7CB2\u7CB4"+ - "\u7CAF\u7D88\u7D86\u7D80\u7D8D\u7D7F\u7D85\u7D7A"+ - "\u7D8E\u7D7B\u7D83\u7D7C\u7D8C\u7D94\u7D84\u7D7D"+ - "\u7D92\u7F6D\u7F6B\u7F67\u7F68\u7F6C\u7FA6\u7FA5"+ - "\u7FA7\u7FDB\u7FDC\u8021\u8164\u8160\u8177\u815C"+ - "\u8169\u815B\u8162\u8172\u6721\u815E\u8176\u8167"+ - "\u816F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u8144\u8161\u821D\u8249\u8244"+ - "\u8240\u8242\u8245\u84F1\u843F\u8456\u8476\u8479"+ - "\u848F\u848D\u8465\u8451\u8440\u8486\u8467\u8430"+ - "\u844D\u847D\u845A\u8459\u8474\u8473\u845D\u8507"+ - "\u845E\u8437\u843A\u8434\u847A\u8443\u8478\u8432"+ - "\u8445\u8429\u83D9\u844B\u842F\u8442\u842D\u845F"+ - "\u8470\u8439\u844E\u844C\u8452\u846F\u84C5\u848E"+ - "\u843B\u8447\u8436\u8433\u8468\u847E\u8444\u842B"+ - "\u8460\u8454\u846E\u8450\u870B\u8704\u86F7\u870C"+ - "\u86FA\u86D6\u86F5\u874D\u86F8\u870E\u8709\u8701"+ - "\u86F6\u870D\u8705\u88D6\u88CB\u88CD\u88CE\u88DE"+ - "\u88DB\u88DA\u88CC\u88D0\u8985\u899B\u89DF\u89E5"+ - "\u89E4\u89E1\u89E0\u89E2\u89DC\u89E6\u8A76\u8A86"+ - "\u8A7F\u8A61\u8A3F\u8A77\u8A82\u8A84\u8A75\u8A83"+ - "\u8A81\u8A74\u8A7A\u8C3C\u8C4B\u8C4A\u8C65\u8C64"+ - "\u8C66\u8C86\u8C84\u8C85\u8CCC\u8D68\u8D69\u8D91"+ - "\u8D8C\u8D8E\u8D8F\u8D8D\u8D93\u8D94\u8D90\u8D92"+ - "\u8DF0\u8DE0\u8DEC\u8DF1\u8DEE\u8DD0\u8DE9\u8DE3"+ - "\u8DE2\u8DE7\u8DF2\u8DEB\u8DF4\u8F06\u8EFF\u8F01"+ - "\u8F00\u8F05\u8F07\u8F08\u8F02\u8F0B\u9052\u903F"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u9044\u9049\u903D\u9110\u910D\u910F"+ - "\u9111\u9116\u9114\u910B\u910E\u916E\u916F\u9248"+ - "\u9252\u9230\u923A\u9266\u9233\u9265\u925E\u9283"+ - "\u922E\u924A\u9246\u926D\u926C\u924F\u9260\u9267"+ - "\u926F\u9236\u9261\u9270\u9231\u9254\u9263\u9250"+ - "\u9272\u924E\u9253\u924C\u9256\u9232\u959F\u959C"+ - "\u959E\u959B\u9692\u9693\u9691\u9697\u96CE\u96FA"+ - "\u96FD\u96F8\u96F5\u9773\u9777\u9778\u9772\u980F"+ - "\u980D\u980E\u98AC\u98F6\u98F9\u99AF\u99B2\u99B0"+ - "\u99B5\u9AAD\u9AAB\u9B5B\u9CEA\u9CED\u9CE7\u9E80"+ - "\u9EFD\u50E6\u50D4\u50D7\u50E8\u50F3\u50DB\u50EA"+ - "\u50DD\u50E4\u50D3\u50EC\u50F0\u50EF\u50E3\u50E0"; - - private final static String innerIndex4= - "\u51D8\u5280\u5281\u52E9\u52EB\u5330\u53AC\u5627"+ - "\u5615\u560C\u5612\u55FC\u560F\u561C\u5601\u5613"+ - "\u5602\u55FA\u561D\u5604\u55FF\u55F9\u5889\u587C"+ - "\u5890\u5898\u5886\u5881\u587F\u5874\u588B\u587A"+ - "\u5887\u5891\u588E\u5876\u5882\u5888\u587B\u5894"+ - "\u588F\u58FE\u596B\u5ADC\u5AEE\u5AE5\u5AD5\u5AEA"+ - "\u5ADA\u5AED\u5AEB\u5AF3\u5AE2\u5AE0\u5ADB\u5AEC"+ - "\u5ADE\u5ADD\u5AD9\u5AE8\u5ADF\u5B77\u5BE0\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u5BE3\u5C63\u5D82\u5D80\u5D7D\u5D86\u5D7A"+ - "\u5D81\u5D77\u5D8A\u5D89\u5D88\u5D7E\u5D7C\u5D8D"+ - "\u5D79\u5D7F\u5E58\u5E59\u5E53\u5ED8\u5ED1\u5ED7"+ - "\u5ECE\u5EDC\u5ED5\u5ED9\u5ED2\u5ED4\u5F44\u5F43"+ - "\u5F6F\u5FB6\u612C\u6128\u6141\u615E\u6171\u6173"+ - "\u6152\u6153\u6172\u616C\u6180\u6174\u6154\u617A"+ - "\u615B\u6165\u613B\u616A\u6161\u6156\u6229\u6227"+ - "\u622B\u642B\u644D\u645B\u645D\u6474\u6476\u6472"+ - "\u6473\u647D\u6475\u6466\u64A6\u644E\u6482\u645E"+ - "\u645C\u644B\u6453\u6460\u6450\u647F\u643F\u646C"+ - "\u646B\u6459\u6465\u6477\u6573\u65A0\u66A1\u66A0"+ - "\u669F\u6705\u6704\u6722\u69B1\u69B6\u69C9\u69A0"+ - "\u69CE\u6996\u69B0\u69AC\u69BC\u6991\u6999\u698E"+ - "\u69A7\u698D\u69A9\u69BE\u69AF\u69BF\u69C4\u69BD"+ - "\u69A4\u69D4\u69B9\u69CA\u699A\u69CF\u69B3\u6993"+ - "\u69AA\u69A1\u699E\u69D9\u6997\u6990\u69C2\u69B5"+ - "\u69A5\u69C6\u6B4A\u6B4D\u6B4B\u6B9E\u6B9F\u6BA0"+ - "\u6BC3\u6BC4\u6BFE\u6ECE\u6EF5\u6EF1\u6F03\u6F25"+ - "\u6EF8\u6F37\u6EFB\u6F2E\u6F09\u6F4E\u6F19\u6F1A"+ - "\u6F27\u6F18\u6F3B\u6F12\u6EED\u6F0A\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u6F36\u6F73\u6EF9\u6EEE\u6F2D\u6F40\u6F30\u6F3C"+ - "\u6F35\u6EEB\u6F07\u6F0E\u6F43\u6F05\u6EFD\u6EF6"+ - "\u6F39\u6F1C\u6EFC\u6F3A\u6F1F\u6F0D\u6F1E\u6F08"+ - "\u6F21\u7187\u7190\u7189\u7180\u7185\u7182\u718F"+ - "\u717B\u7186\u7181\u7197\u7244\u7253\u7297\u7295"+ - "\u7293\u7343\u734D\u7351\u734C\u7462\u7473\u7471"+ - "\u7475\u7472\u7467\u746E\u7500\u7502\u7503\u757D"+ - "\u7590\u7616\u7608\u760C\u7615\u7611\u760A\u7614"+ - "\u76B8\u7781\u777C\u7785\u7782\u776E\u7780\u776F"+ - "\u777E\u7783\u78B2\u78AA\u78B4\u78AD\u78A8\u787E"+ - "\u78AB\u789E\u78A5\u78A0\u78AC\u78A2\u78A4\u7998"+ - "\u798A\u798B\u7996\u7995\u7994\u7993\u7997\u7988"+ - "\u7992\u7990\u7A2B\u7A4A\u7A30\u7A2F\u7A28\u7A26"+ - "\u7AA8\u7AAB\u7AAC\u7AEE\u7B88\u7B9C\u7B8A\u7B91"+ - "\u7B90\u7B96\u7B8D\u7B8C\u7B9B\u7B8E\u7B85\u7B98"+ - "\u5284\u7B99\u7BA4\u7B82\u7CBB\u7CBF\u7CBC\u7CBA"+ - "\u7DA7\u7DB7\u7DC2\u7DA3\u7DAA\u7DC1\u7DC0\u7DC5"+ - "\u7D9D\u7DCE\u7DC4\u7DC6\u7DCB\u7DCC\u7DAF\u7DB9"+ - "\u7D96\u7DBC\u7D9F\u7DA6\u7DAE\u7DA9\u7DA1\u7DC9"+ - "\u7F73\u7FE2\u7FE3\u7FE5\u7FDE\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8024"+ - "\u805D\u805C\u8189\u8186\u8183\u8187\u818D\u818C"+ - "\u818B\u8215\u8497\u84A4\u84A1\u849F\u84BA\u84CE"+ - "\u84C2\u84AC\u84AE\u84AB\u84B9\u84B4\u84C1\u84CD"+ - "\u84AA\u849A\u84B1\u84D0\u849D\u84A7\u84BB\u84A2"+ - "\u8494\u84C7\u84CC\u849B\u84A9\u84AF\u84A8\u84D6"+ - "\u8498\u84B6\u84CF\u84A0\u84D7\u84D4\u84D2\u84DB"+ - "\u84B0\u8491\u8661\u8733\u8723\u8728\u876B\u8740"+ - "\u872E\u871E\u8721\u8719\u871B\u8743\u872C\u8741"+ - "\u873E\u8746\u8720\u8732\u872A\u872D\u873C\u8712"+ - "\u873A\u8731\u8735\u8742\u8726\u8727\u8738\u8724"+ - "\u871A\u8730\u8711\u88F7\u88E7\u88F1\u88F2\u88FA"+ - "\u88FE\u88EE\u88FC\u88F6\u88FB\u88F0\u88EC\u88EB"+ - "\u899D\u89A1\u899F\u899E\u89E9\u89EB\u89E8\u8AAB"+ - "\u8A99\u8A8B\u8A92\u8A8F\u8A96\u8C3D\u8C68\u8C69"+ - "\u8CD5\u8CCF\u8CD7\u8D96\u8E09\u8E02\u8DFF\u8E0D"+ - "\u8DFD\u8E0A\u8E03\u8E07\u8E06\u8E05\u8DFE\u8E00"+ - "\u8E04\u8F10\u8F11\u8F0E\u8F0D\u9123\u911C\u9120"+ - "\u9122\u911F\u911D\u911A\u9124\u9121\u911B\u917A"+ - "\u9172\u9179\u9173\u92A5\u92A4\u9276\u929B\u927A"+ - "\u92A0\u9294\u92AA\u928D\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u92A6\u929A"+ - "\u92AB\u9279\u9297\u927F\u92A3\u92EE\u928E\u9282"+ - "\u9295\u92A2\u927D\u9288\u92A1\u928A\u9286\u928C"+ - "\u9299\u92A7\u927E\u9287\u92A9\u929D\u928B\u922D"+ - "\u969E\u96A1\u96FF\u9758\u977D\u977A\u977E\u9783"+ - "\u9780\u9782\u977B\u9784\u9781\u977F\u97CE\u97CD"+ - "\u9816\u98AD\u98AE\u9902\u9900\u9907\u999D\u999C"+ - "\u99C3\u99B9\u99BB\u99BA\u99C2\u99BD\u99C7\u9AB1"+ - "\u9AE3\u9AE7\u9B3E\u9B3F\u9B60\u9B61\u9B5F\u9CF1"+ - "\u9CF2\u9CF5\u9EA7\u50FF\u5103\u5130\u50F8\u5106"+ - "\u5107\u50F6\u50FE\u510B\u510C\u50FD\u510A\u528B"+ - "\u528C\u52F1\u52EF\u5648\u5642\u564C\u5635\u5641"+ - "\u564A\u5649\u5646\u5658\u565A\u5640\u5633\u563D"+ - "\u562C\u563E\u5638\u562A\u563A\u571A\u58AB\u589D"+ - "\u58B1\u58A0\u58A3\u58AF\u58AC\u58A5\u58A1\u58FF"+ - "\u5AFF\u5AF4\u5AFD\u5AF7\u5AF6\u5B03\u5AF8\u5B02"+ - "\u5AF9\u5B01\u5B07\u5B05\u5B0F\u5C67\u5D99\u5D97"+ - "\u5D9F\u5D92\u5DA2\u5D93\u5D95\u5DA0\u5D9C\u5DA1"+ - "\u5D9A\u5D9E\u5E69\u5E5D\u5E60\u5E5C\u7DF3\u5EDB"+ - "\u5EDE\u5EE1\u5F49\u5FB2\u618B\u6183\u6179\u61B1"+ - "\u61B0\u61A2\u6189\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u619B\u6193\u61AF"+ - "\u61AD\u619F\u6192\u61AA\u61A1\u618D\u6166\u61B3"+ - "\u622D\u646E\u6470\u6496\u64A0\u6485\u6497\u649C"+ - "\u648F\u648B\u648A\u648C\u64A3\u649F\u6468\u64B1"+ - "\u6498\u6576\u657A\u6579\u657B\u65B2\u65B3\u66B5"+ - "\u66B0\u66A9\u66B2\u66B7\u66AA\u66AF\u6A00\u6A06"+ - "\u6A17\u69E5\u69F8\u6A15\u69F1\u69E4\u6A20\u69FF"+ - "\u69EC\u69E2\u6A1B\u6A1D\u69FE\u6A27\u69F2\u69EE"+ - "\u6A14\u69F7\u69E7\u6A40\u6A08\u69E6\u69FB\u6A0D"+ - "\u69FC\u69EB\u6A09\u6A04\u6A18\u6A25\u6A0F\u69F6"+ - "\u6A26\u6A07\u69F4\u6A16\u6B51\u6BA5\u6BA3\u6BA2"+ - "\u6BA6\u6C01\u6C00\u6BFF\u6C02\u6F41\u6F26\u6F7E"+ - "\u6F87\u6FC6\u6F92\u6F8D\u6F89\u6F8C\u6F62\u6F4F"+ - "\u6F85\u6F5A\u6F96\u6F76\u6F6C\u6F82\u6F55\u6F72"+ - "\u6F52\u6F50\u6F57\u6F94\u6F93\u6F5D\u6F00\u6F61"+ - "\u6F6B\u6F7D\u6F67\u6F90\u6F53\u6F8B\u6F69\u6F7F"+ - "\u6F95\u6F63\u6F77\u6F6A\u6F7B\u71B2\u71AF\u719B"+ - "\u71B0\u71A0\u719A\u71A9\u71B5\u719D\u71A5\u719E"+ - "\u71A4\u71A1\u71AA\u719C\u71A7\u71B3\u7298\u729A"+ - "\u7358\u7352\u735E\u735F\u7360\u735D\u735B\u7361"+ - "\u735A\u7359\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u7362\u7487\u7489\u748A"+ - "\u7486\u7481\u747D\u7485\u7488\u747C\u7479\u7508"+ - "\u7507\u757E\u7625\u761E\u7619\u761D\u761C\u7623"+ - "\u761A\u7628\u761B\u769C\u769D\u769E\u769B\u778D"+ - "\u778F\u7789\u7788\u78CD\u78BB\u78CF\u78CC\u78D1"+ - "\u78CE\u78D4\u78C8\u78C3\u78C4\u78C9\u799A\u79A1"+ - "\u79A0\u799C\u79A2\u799B\u6B76\u7A39\u7AB2\u7AB4"+ - "\u7AB3\u7BB7\u7BCB\u7BBE\u7BAC\u7BCE\u7BAF\u7BB9"+ - "\u7BCA\u7BB5\u7CC5\u7CC8\u7CCC\u7CCB\u7DF7\u7DDB"+ - "\u7DEA\u7DE7\u7DD7\u7DE1\u7E03\u7DFA\u7DE6\u7DF6"+ - "\u7DF1\u7DF0\u7DEE\u7DDF\u7F76\u7FAC\u7FB0\u7FAD"+ - "\u7FED\u7FEB\u7FEA\u7FEC\u7FE6\u7FE8\u8064\u8067"+ - "\u81A3\u819F\u819E\u8195\u81A2\u8199\u8197\u8216"+ - "\u824F\u8253\u8252\u8250\u824E\u8251\u8524\u853B"+ - "\u850F\u8500\u8529\u850E\u8509\u850D\u851F\u850A"+ - "\u8527\u851C\u84FB\u852B\u84FA\u8508\u850C\u84F4"+ - "\u852A\u84F2\u8515\u84F7\u84EB\u84F3\u84FC\u8512"+ - "\u84EA\u84E9\u8516\u84FE\u8528\u851D\u852E\u8502"+ - "\u84FD\u851E\u84F6\u8531\u8526\u84E7\u84E8\u84F0"+ - "\u84EF\u84F9\u8518\u8520\u8530\u850B\u8519\u852F"+ - "\u8662\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u8756\u8763\u8764\u8777\u87E1"+ - "\u8773\u8758\u8754\u875B\u8752\u8761\u875A\u8751"+ - "\u875E\u876D\u876A\u8750\u874E\u875F\u875D\u876F"+ - "\u876C\u877A\u876E\u875C\u8765\u874F\u877B\u8775"+ - "\u8762\u8767\u8769\u885A\u8905\u890C\u8914\u890B"+ - "\u8917\u8918\u8919\u8906\u8916\u8911\u890E\u8909"+ - "\u89A2\u89A4\u89A3\u89ED\u89F0\u89EC\u8ACF\u8AC6"+ - "\u8AB8\u8AD3\u8AD1\u8AD4\u8AD5\u8ABB\u8AD7\u8ABE"+ - "\u8AC0\u8AC5\u8AD8\u8AC3\u8ABA\u8ABD\u8AD9\u8C3E"+ - "\u8C4D\u8C8F\u8CE5\u8CDF\u8CD9\u8CE8\u8CDA\u8CDD"+ - "\u8CE7\u8DA0\u8D9C\u8DA1\u8D9B\u8E20\u8E23\u8E25"+ - "\u8E24\u8E2E\u8E15\u8E1B\u8E16\u8E11\u8E19\u8E26"+ - "\u8E27\u8E14\u8E12\u8E18\u8E13\u8E1C\u8E17\u8E1A"+ - "\u8F2C\u8F24\u8F18\u8F1A\u8F20\u8F23\u8F16\u8F17"+ - "\u9073\u9070\u906F\u9067\u906B\u912F\u912B\u9129"+ - "\u912A\u9132\u9126\u912E\u9185\u9186\u918A\u9181"+ - "\u9182\u9184\u9180\u92D0\u92C3\u92C4\u92C0\u92D9"+ - "\u92B6\u92CF\u92F1\u92DF\u92D8\u92E9\u92D7\u92DD"+ - "\u92CC\u92EF\u92C2\u92E8\u92CA\u92C8\u92CE\u92E6"+ - "\u92CD\u92D5\u92C9\u92E0\u92DE\u92E7\u92D1\u92D3"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u92B5\u92E1\u92C6\u92B4\u957C\u95AC"+ - "\u95AB\u95AE\u95B0\u96A4\u96A2\u96D3\u9705\u9708"+ - "\u9702\u975A\u978A\u978E\u9788\u97D0\u97CF\u981E"+ - "\u981D\u9826\u9829\u9828\u9820\u981B\u9827\u98B2"+ - "\u9908\u98FA\u9911\u9914\u9916\u9917\u9915\u99DC"+ - "\u99CD\u99CF\u99D3\u99D4\u99CE\u99C9\u99D6\u99D8"+ - "\u99CB\u99D7\u99CC\u9AB3\u9AEC\u9AEB\u9AF3\u9AF2"+ - "\u9AF1\u9B46\u9B43\u9B67\u9B74\u9B71\u9B66\u9B76"+ - "\u9B75\u9B70\u9B68\u9B64\u9B6C\u9CFC\u9CFA\u9CFD"+ - "\u9CFF\u9CF7\u9D07\u9D00\u9CF9\u9CFB\u9D08\u9D05"+ - "\u9D04\u9E83\u9ED3\u9F0F\u9F10\u511C\u5113\u5117"+ - "\u511A\u5111\u51DE\u5334\u53E1\u5670\u5660\u566E"+ - "\u5673\u5666\u5663\u566D\u5672\u565E\u5677\u571C"+ - "\u571B\u58C8\u58BD\u58C9\u58BF\u58BA\u58C2\u58BC"+ - "\u58C6\u5B17\u5B19\u5B1B\u5B21\u5B14\u5B13\u5B10"+ - "\u5B16\u5B28\u5B1A\u5B20\u5B1E\u5BEF\u5DAC\u5DB1"+ - "\u5DA9\u5DA7\u5DB5\u5DB0\u5DAE\u5DAA\u5DA8\u5DB2"+ - "\u5DAD\u5DAF\u5DB4\u5E67\u5E68\u5E66\u5E6F\u5EE9"+ - "\u5EE7\u5EE6\u5EE8\u5EE5\u5F4B\u5FBC\u619D\u61A8"+ - "\u6196\u61C5\u61B4\u61C6\u61C1\u61CC\u61BA\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u61BF\u61B8\u618C\u64D7\u64D6\u64D0\u64CF"+ - "\u64C9\u64BD\u6489\u64C3\u64DB\u64F3\u64D9\u6533"+ - "\u657F\u657C\u65A2\u66C8\u66BE\u66C0\u66CA\u66CB"+ - "\u66CF\u66BD\u66BB\u66BA\u66CC\u6723\u6A34\u6A66"+ - "\u6A49\u6A67\u6A32\u6A68\u6A3E\u6A5D\u6A6D\u6A76"+ - "\u6A5B\u6A51\u6A28\u6A5A\u6A3B\u6A3F\u6A41\u6A6A"+ - "\u6A64\u6A50\u6A4F\u6A54\u6A6F\u6A69\u6A60\u6A3C"+ - "\u6A5E\u6A56\u6A55\u6A4D\u6A4E\u6A46\u6B55\u6B54"+ - "\u6B56\u6BA7\u6BAA\u6BAB\u6BC8\u6BC7\u6C04\u6C03"+ - "\u6C06\u6FAD\u6FCB\u6FA3\u6FC7\u6FBC\u6FCE\u6FC8"+ - "\u6F5E\u6FC4\u6FBD\u6F9E\u6FCA\u6FA8\u7004\u6FA5"+ - "\u6FAE\u6FBA\u6FAC\u6FAA\u6FCF\u6FBF\u6FB8\u6FA2"+ - "\u6FC9\u6FAB\u6FCD\u6FAF\u6FB2\u6FB0\u71C5\u71C2"+ - "\u71BF\u71B8\u71D6\u71C0\u71C1\u71CB\u71D4\u71CA"+ - "\u71C7\u71CF\u71BD\u71D8\u71BC\u71C6\u71DA\u71DB"+ - "\u729D\u729E\u7369\u7366\u7367\u736C\u7365\u736B"+ - "\u736A\u747F\u749A\u74A0\u7494\u7492\u7495\u74A1"+ - "\u750B\u7580\u762F\u762D\u7631\u763D\u7633\u763C"+ - "\u7635\u7632\u7630\u76BB\u76E6\u779A\u779D\u77A1"+ - "\u779C\u779B\u77A2\u77A3\u7795\u7799\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u7797\u78DD\u78E9\u78E5\u78EA\u78DE\u78E3\u78DB"+ - "\u78E1\u78E2\u78ED\u78DF\u78E0\u79A4\u7A44\u7A48"+ - "\u7A47\u7AB6\u7AB8\u7AB5\u7AB1\u7AB7\u7BDE\u7BE3"+ - "\u7BE7\u7BDD\u7BD5\u7BE5\u7BDA\u7BE8\u7BF9\u7BD4"+ - "\u7BEA\u7BE2\u7BDC\u7BEB\u7BD8\u7BDF\u7CD2\u7CD4"+ - "\u7CD7\u7CD0\u7CD1\u7E12\u7E21\u7E17\u7E0C\u7E1F"+ - "\u7E20\u7E13\u7E0E\u7E1C\u7E15\u7E1A\u7E22\u7E0B"+ - "\u7E0F\u7E16\u7E0D\u7E14\u7E25\u7E24\u7F43\u7F7B"+ - "\u7F7C\u7F7A\u7FB1\u7FEF\u802A\u8029\u806C\u81B1"+ - "\u81A6\u81AE\u81B9\u81B5\u81AB\u81B0\u81AC\u81B4"+ - "\u81B2\u81B7\u81A7\u81F2\u8255\u8256\u8257\u8556"+ - "\u8545\u856B\u854D\u8553\u8561\u8558\u8540\u8546"+ - "\u8564\u8541\u8562\u8544\u8551\u8547\u8563\u853E"+ - "\u855B\u8571\u854E\u856E\u8575\u8555\u8567\u8560"+ - "\u858C\u8566\u855D\u8554\u8565\u856C\u8663\u8665"+ - "\u8664\u879B\u878F\u8797\u8793\u8792\u8788\u8781"+ - "\u8796\u8798\u8779\u8787\u87A3\u8785\u8790\u8791"+ - "\u879D\u8784\u8794\u879C\u879A\u8789\u891E\u8926"+ - "\u8930\u892D\u892E\u8927\u8931\u8922\u8929\u8923"+ - "\u892F\u892C\u891F\u89F1\u8AE0\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8AE2"+ - "\u8AF2\u8AF4\u8AF5\u8ADD\u8B14\u8AE4\u8ADF\u8AF0"+ - "\u8AC8\u8ADE\u8AE1\u8AE8\u8AFF\u8AEF\u8AFB\u8C91"+ - "\u8C92\u8C90\u8CF5\u8CEE\u8CF1\u8CF0\u8CF3\u8D6C"+ - "\u8D6E\u8DA5\u8DA7\u8E33\u8E3E\u8E38\u8E40\u8E45"+ - "\u8E36\u8E3C\u8E3D\u8E41\u8E30\u8E3F\u8EBD\u8F36"+ - "\u8F2E\u8F35\u8F32\u8F39\u8F37\u8F34\u9076\u9079"+ - "\u907B\u9086\u90FA\u9133\u9135\u9136\u9193\u9190"+ - "\u9191\u918D\u918F\u9327\u931E\u9308\u931F\u9306"+ - "\u930F\u937A\u9338\u933C\u931B\u9323\u9312\u9301"+ - "\u9346\u932D\u930E\u930D\u92CB\u931D\u92FA\u9325"+ - "\u9313\u92F9\u92F7\u9334\u9302\u9324\u92FF\u9329"+ - "\u9339\u9335\u932A\u9314\u930C\u930B\u92FE\u9309"+ - "\u9300\u92FB\u9316\u95BC\u95CD\u95BE\u95B9\u95BA"+ - "\u95B6\u95BF\u95B5\u95BD\u96A9\u96D4\u970B\u9712"+ - "\u9710\u9799\u9797\u9794\u97F0\u97F8\u9835\u982F"+ - "\u9832\u9924\u991F\u9927\u9929\u999E\u99EE\u99EC"+ - "\u99E5\u99E4\u99F0\u99E3\u99EA\u99E9\u99E7\u9AB9"+ - "\u9ABF\u9AB4\u9ABB\u9AF6\u9AFA\u9AF9\u9AF7\u9B33"+ - "\u9B80\u9B85\u9B87\u9B7C\u9B7E\u9B7B\u9B82\u9B93"+ - "\u9B92\u9B90\u9B7A\u9B95\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9B7D\u9B88"+ - "\u9D25\u9D17\u9D20\u9D1E\u9D14\u9D29\u9D1D\u9D18"+ - "\u9D22\u9D10\u9D19\u9D1F\u9E88\u9E86\u9E87\u9EAE"+ - "\u9EAD\u9ED5\u9ED6\u9EFA\u9F12\u9F3D\u5126\u5125"+ - "\u5122\u5124\u5120\u5129\u52F4\u5693\u568C\u568D"+ - "\u5686\u5684\u5683\u567E\u5682\u567F\u5681\u58D6"+ - "\u58D4\u58CF\u58D2\u5B2D\u5B25\u5B32\u5B23\u5B2C"+ - "\u5B27\u5B26\u5B2F\u5B2E\u5B7B\u5BF1\u5BF2\u5DB7"+ - "\u5E6C\u5E6A\u5FBE\u5FBB\u61C3\u61B5\u61BC\u61E7"+ - "\u61E0\u61E5\u61E4\u61E8\u61DE\u64EF\u64E9\u64E3"+ - "\u64EB\u64E4\u64E8\u6581\u6580\u65B6\u65DA\u66D2"+ - "\u6A8D\u6A96\u6A81\u6AA5\u6A89\u6A9F\u6A9B\u6AA1"+ - "\u6A9E\u6A87\u6A93\u6A8E\u6A95\u6A83\u6AA8\u6AA4"+ - "\u6A91\u6A7F\u6AA6\u6A9A\u6A85\u6A8C\u6A92\u6B5B"+ - "\u6BAD\u6C09\u6FCC\u6FA9\u6FF4\u6FD4\u6FE3\u6FDC"+ - "\u6FED\u6FE7\u6FE6\u6FDE\u6FF2\u6FDD\u6FE2\u6FE8"+ - "\u71E1\u71F1\u71E8\u71F2\u71E4\u71F0\u71E2\u7373"+ - "\u736E\u736F\u7497\u74B2\u74AB\u7490\u74AA\u74AD"+ - "\u74B1\u74A5\u74AF\u7510\u7511\u7512\u750F\u7584"+ - "\u7643\u7648\u7649\u7647\u76A4\u76E9\u77B5\u77AB"+ - "\u77B2\u77B7\u77B6\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u77B4\u77B1\u77A8"+ - "\u77F0\u78F3\u78FD\u7902\u78FB\u78FC\u78F2\u7905"+ - "\u78F9\u78FE\u7904\u79AB\u79A8\u7A5C\u7A5B\u7A56"+ - "\u7A58\u7A54\u7A5A\u7ABE\u7AC0\u7AC1\u7C05\u7C0F"+ - "\u7BF2\u7C00\u7BFF\u7BFB\u7C0E\u7BF4\u7C0B\u7BF3"+ - "\u7C02\u7C09\u7C03\u7C01\u7BF8\u7BFD\u7C06\u7BF0"+ - "\u7BF1\u7C10\u7C0A\u7CE8\u7E2D\u7E3C\u7E42\u7E33"+ - "\u9848\u7E38\u7E2A\u7E49\u7E40\u7E47\u7E29\u7E4C"+ - "\u7E30\u7E3B\u7E36\u7E44\u7E3A\u7F45\u7F7F\u7F7E"+ - "\u7F7D\u7FF4\u7FF2\u802C\u81BB\u81C4\u81CC\u81CA"+ - "\u81C5\u81C7\u81BC\u81E9\u825B\u825A\u825C\u8583"+ - "\u8580\u858F\u85A7\u8595\u85A0\u858B\u85A3\u857B"+ - "\u85A4\u859A\u859E\u8577\u857C\u8589\u85A1\u857A"+ - "\u8578\u8557\u858E\u8596\u8586\u858D\u8599\u859D"+ - "\u8581\u85A2\u8582\u8588\u8585\u8579\u8576\u8598"+ - "\u8590\u859F\u8668\u87BE\u87AA\u87AD\u87C5\u87B0"+ - "\u87AC\u87B9\u87B5\u87BC\u87AE\u87C9\u87C3\u87C2"+ - "\u87CC\u87B7\u87AF\u87C4\u87CA\u87B4\u87B6\u87BF"+ - "\u87B8\u87BD\u87DE\u87B2\u8935\u8933\u893C\u893E"+ - "\u8941\u8952\u8937\u8942\u89AD\u89AF\u89AE\u89F2"+ - "\u89F3\u8B1E\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u8B18\u8B16\u8B11\u8B05"+ - "\u8B0B\u8B22\u8B0F\u8B12\u8B15\u8B07\u8B0D\u8B08"+ - "\u8B06\u8B1C\u8B13\u8B1A\u8C4F\u8C70\u8C72\u8C71"+ - "\u8C6F\u8C95\u8C94\u8CF9\u8D6F\u8E4E\u8E4D\u8E53"+ - "\u8E50\u8E4C\u8E47\u8F43\u8F40\u9085\u907E\u9138"+ - "\u919A\u91A2\u919B\u9199\u919F\u91A1\u919D\u91A0"+ - "\u93A1\u9383\u93AF\u9364\u9356\u9347\u937C\u9358"+ - "\u935C\u9376\u9349\u9350\u9351\u9360\u936D\u938F"+ - "\u934C\u936A\u9379\u9357\u9355\u9352\u934F\u9371"+ - "\u9377\u937B\u9361\u935E\u9363\u9367\u9380\u934E"+ - "\u9359\u95C7\u95C0\u95C9\u95C3\u95C5\u95B7\u96AE"+ - "\u96B0\u96AC\u9720\u971F\u9718\u971D\u9719\u979A"+ - "\u97A1\u979C\u979E\u979D\u97D5\u97D4\u97F1\u9841"+ - "\u9844\u984A\u9849\u9845\u9843\u9925\u992B\u992C"+ - "\u992A\u9933\u9932\u992F\u992D\u9931\u9930\u9998"+ - "\u99A3\u99A1\u9A02\u99FA\u99F4\u99F7\u99F9\u99F8"+ - "\u99F6\u99FB\u99FD\u99FE\u99FC\u9A03\u9ABE\u9AFE"+ - "\u9AFD\u9B01\u9AFC\u9B48\u9B9A\u9BA8\u9B9E\u9B9B"+ - "\u9BA6\u9BA1\u9BA5\u9BA4\u9B86\u9BA2\u9BA0\u9BAF"+ - "\u9D33\u9D41\u9D67\u9D36\u9D2E\u9D2F\u9D31\u9D38"+ - "\u9D30\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9D45\u9D42\u9D43\u9D3E\u9D37"+ - "\u9D40\u9D3D\u7FF5\u9D2D\u9E8A\u9E89\u9E8D\u9EB0"+ - "\u9EC8\u9EDA\u9EFB\u9EFF\u9F24\u9F23\u9F22\u9F54"+ - "\u9FA0\u5131\u512D\u512E\u5698\u569C\u5697\u569A"+ - "\u569D\u5699\u5970\u5B3C\u5C69\u5C6A\u5DC0\u5E6D"+ - "\u5E6E\u61D8\u61DF\u61ED\u61EE\u61F1\u61EA\u61F0"+ - "\u61EB\u61D6\u61E9\u64FF\u6504\u64FD\u64F8\u6501"+ - "\u6503\u64FC\u6594\u65DB\u66DA\u66DB\u66D8\u6AC5"+ - "\u6AB9\u6ABD\u6AE1\u6AC6\u6ABA\u6AB6\u6AB7\u6AC7"+ - "\u6AB4\u6AAD\u6B5E\u6BC9\u6C0B\u7007\u700C\u700D"+ - "\u7001\u7005\u7014\u700E\u6FFF\u7000\u6FFB\u7026"+ - "\u6FFC\u6FF7\u700A\u7201\u71FF\u71F9\u7203\u71FD"+ - "\u7376\u74B8\u74C0\u74B5\u74C1\u74BE\u74B6\u74BB"+ - "\u74C2\u7514\u7513\u765C\u7664\u7659\u7650\u7653"+ - "\u7657\u765A\u76A6\u76BD\u76EC\u77C2\u77BA\u78FF"+ - "\u790C\u7913\u7914\u7909\u7910\u7912\u7911\u79AD"+ - "\u79AC\u7A5F\u7C1C\u7C29\u7C19\u7C20\u7C1F\u7C2D"+ - "\u7C1D\u7C26\u7C28\u7C22\u7C25\u7C30\u7E5C\u7E50"+ - "\u7E56\u7E63\u7E58\u7E62\u7E5F\u7E51\u7E60\u7E57"+ - "\u7E53\u7FB5\u7FB3\u7FF7\u7FF8\u8075\u81D1\u81D2"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u81D0\u825F\u825E\u85B4\u85C6\u85C0"+ - "\u85C3\u85C2\u85B3\u85B5\u85BD\u85C7\u85C4\u85BF"+ - "\u85CB\u85CE\u85C8\u85C5\u85B1\u85B6\u85D2\u8624"+ - "\u85B8\u85B7\u85BE\u8669\u87E7\u87E6\u87E2\u87DB"+ - "\u87EB\u87EA\u87E5\u87DF\u87F3\u87E4\u87D4\u87DC"+ - "\u87D3\u87ED\u87D8\u87E3\u87A4\u87D7\u87D9\u8801"+ - "\u87F4\u87E8\u87DD\u8953\u894B\u894F\u894C\u8946"+ - "\u8950\u8951\u8949\u8B2A\u8B27\u8B23\u8B33\u8B30"+ - "\u8B35\u8B47\u8B2F\u8B3C\u8B3E\u8B31\u8B25\u8B37"+ - "\u8B26\u8B36\u8B2E\u8B24\u8B3B\u8B3D\u8B3A\u8C42"+ - "\u8C75\u8C99\u8C98\u8C97\u8CFE\u8D04\u8D02\u8D00"+ - "\u8E5C\u8E62\u8E60\u8E57\u8E56\u8E5E\u8E65\u8E67"; - - private final static String innerIndex5= - "\u8E5B\u8E5A\u8E61\u8E5D\u8E69\u8E54\u8F46\u8F47"+ - "\u8F48\u8F4B\u9128\u913A\u913B\u913E\u91A8\u91A5"+ - "\u91A7\u91AF\u91AA\u93B5\u938C\u9392\u93B7\u939B"+ - "\u939D\u9389\u93A7\u938E\u93AA\u939E\u93A6\u9395"+ - "\u9388\u9399\u939F\u938D\u93B1\u9391\u93B2\u93A4"+ - "\u93A8\u93B4\u93A3\u93A5\u95D2\u95D3\u95D1\u96B3"+ - "\u96D7\u96DA\u5DC2\u96DF\u96D8\u96DD\u9723\u9722"+ - "\u9725\u97AC\u97AE\u97A8\u97AB\u97A4\u97AA\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u97A2\u97A5\u97D7\u97D9\u97D6\u97D8\u97FA"+ - "\u9850\u9851\u9852\u98B8\u9941\u993C\u993A\u9A0F"+ - "\u9A0B\u9A09\u9A0D\u9A04\u9A11\u9A0A\u9A05\u9A07"+ - "\u9A06\u9AC0\u9ADC\u9B08\u9B04\u9B05\u9B29\u9B35"+ - "\u9B4A\u9B4C\u9B4B\u9BC7\u9BC6\u9BC3\u9BBF\u9BC1"+ - "\u9BB5\u9BB8\u9BD3\u9BB6\u9BC4\u9BB9\u9BBD\u9D5C"+ - "\u9D53\u9D4F\u9D4A\u9D5B\u9D4B\u9D59\u9D56\u9D4C"+ - "\u9D57\u9D52\u9D54\u9D5F\u9D58\u9D5A\u9E8E\u9E8C"+ - "\u9EDF\u9F01\u9F00\u9F16\u9F25\u9F2B\u9F2A\u9F29"+ - "\u9F28\u9F4C\u9F55\u5134\u5135\u5296\u52F7\u53B4"+ - "\u56AB\u56AD\u56A6\u56A7\u56AA\u56AC\u58DA\u58DD"+ - "\u58DB\u5912\u5B3D\u5B3E\u5B3F\u5DC3\u5E70\u5FBF"+ - "\u61FB\u6507\u6510\u650D\u6509\u650C\u650E\u6584"+ - "\u65DE\u65DD\u66DE\u6AE7\u6AE0\u6ACC\u6AD1\u6AD9"+ - "\u6ACB\u6ADF\u6ADC\u6AD0\u6AEB\u6ACF\u6ACD\u6ADE"+ - "\u6B60\u6BB0\u6C0C\u7019\u7027\u7020\u7016\u702B"+ - "\u7021\u7022\u7023\u7029\u7017\u7024\u701C\u702A"+ - "\u720C\u720A\u7207\u7202\u7205\u72A5\u72A6\u72A4"+ - "\u72A3\u72A1\u74CB\u74C5\u74B7\u74C3\u7516\u7660"+ - "\u77C9\u77CA\u77C4\u77F1\u791D\u791B\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\u7921\u791C\u7917\u791E\u79B0\u7A67\u7A68\u7C33"+ - "\u7C3C\u7C39\u7C2C\u7C3B\u7CEC\u7CEA\u7E76\u7E75"+ - "\u7E78\u7E70\u7E77\u7E6F\u7E7A\u7E72\u7E74\u7E68"+ - "\u7F4B\u7F4A\u7F83\u7F86\u7FB7\u7FFD\u7FFE\u8078"+ - "\u81D7\u81D5\u8264\u8261\u8263\u85EB\u85F1\u85ED"+ - "\u85D9\u85E1\u85E8\u85DA\u85D7\u85EC\u85F2\u85F8"+ - "\u85D8\u85DF\u85E3\u85DC\u85D1\u85F0\u85E6\u85EF"+ - "\u85DE\u85E2\u8800\u87FA\u8803\u87F6\u87F7\u8809"+ - "\u880C\u880B\u8806\u87FC\u8808\u87FF\u880A\u8802"+ - "\u8962\u895A\u895B\u8957\u8961\u895C\u8958\u895D"+ - "\u8959\u8988\u89B7\u89B6\u89F6\u8B50\u8B48\u8B4A"+ - "\u8B40\u8B53\u8B56\u8B54\u8B4B\u8B55\u8B51\u8B42"+ - "\u8B52\u8B57\u8C43\u8C77\u8C76\u8C9A\u8D06\u8D07"+ - "\u8D09\u8DAC\u8DAA\u8DAD\u8DAB\u8E6D\u8E78\u8E73"+ - "\u8E6A\u8E6F\u8E7B\u8EC2\u8F52\u8F51\u8F4F\u8F50"+ - "\u8F53\u8FB4\u9140\u913F\u91B0\u91AD\u93DE\u93C7"+ - "\u93CF\u93C2\u93DA\u93D0\u93F9\u93EC\u93CC\u93D9"+ - "\u93A9\u93E6\u93CA\u93D4\u93EE\u93E3\u93D5\u93C4"+ - "\u93CE\u93C0\u93D2\u93E7\u957D\u95DA\u95DB\u96E1"+ - "\u9729\u972B\u972C\u9728\u9726\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u97B3"+ - "\u97B7\u97B6\u97DD\u97DE\u97DF\u985C\u9859\u985D"+ - "\u9857\u98BF\u98BD\u98BB\u98BE\u9948\u9947\u9943"+ - "\u99A6\u99A7\u9A1A\u9A15\u9A25\u9A1D\u9A24\u9A1B"+ - "\u9A22\u9A20\u9A27\u9A23\u9A1E\u9A1C\u9A14\u9AC2"+ - "\u9B0B\u9B0A\u9B0E\u9B0C\u9B37\u9BEA\u9BEB\u9BE0"+ - "\u9BDE\u9BE4\u9BE6\u9BE2\u9BF0\u9BD4\u9BD7\u9BEC"+ - "\u9BDC\u9BD9\u9BE5\u9BD5\u9BE1\u9BDA\u9D77\u9D81"+ - "\u9D8A\u9D84\u9D88\u9D71\u9D80\u9D78\u9D86\u9D8B"+ - "\u9D8C\u9D7D\u9D6B\u9D74\u9D75\u9D70\u9D69\u9D85"+ - "\u9D73\u9D7B\u9D82\u9D6F\u9D79\u9D7F\u9D87\u9D68"+ - "\u9E94\u9E91\u9EC0\u9EFC\u9F2D\u9F40\u9F41\u9F4D"+ - "\u9F56\u9F57\u9F58\u5337\u56B2\u56B5\u56B3\u58E3"+ - "\u5B45\u5DC6\u5DC7\u5EEE\u5EEF\u5FC0\u5FC1\u61F9"+ - "\u6517\u6516\u6515\u6513\u65DF\u66E8\u66E3\u66E4"+ - "\u6AF3\u6AF0\u6AEA\u6AE8\u6AF9\u6AF1\u6AEE\u6AEF"+ - "\u703C\u7035\u702F\u7037\u7034\u7031\u7042\u7038"+ - "\u703F\u703A\u7039\u7040\u703B\u7033\u7041\u7213"+ - "\u7214\u72A8\u737D\u737C\u74BA\u76AB\u76AA\u76BE"+ - "\u76ED\u77CC\u77CE\u77CF\u77CD\u77F2\u7925\u7923"+ - "\u7927\u7928\u7924\u7929\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u79B2\u7A6E"+ - "\u7A6C\u7A6D\u7AF7\u7C49\u7C48\u7C4A\u7C47\u7C45"+ - "\u7CEE\u7E7B\u7E7E\u7E81\u7E80\u7FBA\u7FFF\u8079"+ - "\u81DB\u81D9\u820B\u8268\u8269\u8622\u85FF\u8601"+ - "\u85FE\u861B\u8600\u85F6\u8604\u8609\u8605\u860C"+ - "\u85FD\u8819\u8810\u8811\u8817\u8813\u8816\u8963"+ - "\u8966\u89B9\u89F7\u8B60\u8B6A\u8B5D\u8B68\u8B63"+ - "\u8B65\u8B67\u8B6D\u8DAE\u8E86\u8E88\u8E84\u8F59"+ - "\u8F56\u8F57\u8F55\u8F58\u8F5A\u908D\u9143\u9141"+ - "\u91B7\u91B5\u91B2\u91B3\u940B\u9413\u93FB\u9420"+ - "\u940F\u9414\u93FE\u9415\u9410\u9428\u9419\u940D"+ - "\u93F5\u9400\u93F7\u9407\u940E\u9416\u9412\u93FA"+ - "\u9409\u93F8\u940A\u93FF\u93FC\u940C\u93F6\u9411"+ - "\u9406\u95DE\u95E0\u95DF\u972E\u972F\u97B9\u97BB"+ - "\u97FD\u97FE\u9860\u9862\u9863\u985F\u98C1\u98C2"+ - "\u9950\u994E\u9959\u994C\u994B\u9953\u9A32\u9A34"+ - "\u9A31\u9A2C\u9A2A\u9A36\u9A29\u9A2E\u9A38\u9A2D"+ - "\u9AC7\u9ACA\u9AC6\u9B10\u9B12\u9B11\u9C0B\u9C08"+ - "\u9BF7\u9C05\u9C12\u9BF8\u9C40\u9C07\u9C0E\u9C06"+ - "\u9C17\u9C14\u9C09\u9D9F\u9D99\u9DA4\u9D9D\u9D92"+ - "\u9D98\u9D90\u9D9B\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9DA0\u9D94\u9D9C"+ - "\u9DAA\u9D97\u9DA1\u9D9A\u9DA2\u9DA8\u9D9E\u9DA3"+ - "\u9DBF\u9DA9\u9D96\u9DA6\u9DA7\u9E99\u9E9B\u9E9A"+ - "\u9EE5\u9EE4\u9EE7\u9EE6\u9F30\u9F2E\u9F5B\u9F60"+ - "\u9F5E\u9F5D\u9F59\u9F91\u513A\u5139\u5298\u5297"+ - "\u56C3\u56BD\u56BE\u5B48\u5B47\u5DCB\u5DCF\u5EF1"+ - "\u61FD\u651B\u6B02\u6AFC\u6B03\u6AF8\u6B00\u7043"+ - "\u7044\u704A\u7048\u7049\u7045\u7046\u721D\u721A"+ - "\u7219\u737E\u7517\u766A\u77D0\u792D\u7931\u792F"+ - "\u7C54\u7C53\u7CF2\u7E8A\u7E87\u7E88\u7E8B\u7E86"+ - "\u7E8D\u7F4D\u7FBB\u8030\u81DD\u8618\u862A\u8626"+ - "\u861F\u8623\u861C\u8619\u8627\u862E\u8621\u8620"+ - "\u8629\u861E\u8625\u8829\u881D\u881B\u8820\u8824"+ - "\u881C\u882B\u884A\u896D\u8969\u896E\u896B\u89FA"+ - "\u8B79\u8B78\u8B45\u8B7A\u8B7B\u8D10\u8D14\u8DAF"+ - "\u8E8E\u8E8C\u8F5E\u8F5B\u8F5D\u9146\u9144\u9145"+ - "\u91B9\u943F\u943B\u9436\u9429\u943D\u943C\u9430"+ - "\u9439\u942A\u9437\u942C\u9440\u9431\u95E5\u95E4"+ - "\u95E3\u9735\u973A\u97BF\u97E1\u9864\u98C9\u98C6"+ - "\u98C0\u9958\u9956\u9A39\u9A3D\u9A46\u9A44\u9A42"+ - "\u9A41\u9A3A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\u9A3F\u9ACD\u9B15\u9B17"+ - "\u9B18\u9B16\u9B3A\u9B52\u9C2B\u9C1D\u9C1C\u9C2C"+ - "\u9C23\u9C28\u9C29\u9C24\u9C21\u9DB7\u9DB6\u9DBC"+ - "\u9DC1\u9DC7\u9DCA\u9DCF\u9DBE\u9DC5\u9DC3\u9DBB"+ - "\u9DB5\u9DCE\u9DB9\u9DBA\u9DAC\u9DC8\u9DB1\u9DAD"+ - "\u9DCC\u9DB3\u9DCD\u9DB2\u9E7A\u9E9C\u9EEB\u9EEE"+ - "\u9EED\u9F1B\u9F18\u9F1A\u9F31\u9F4E\u9F65\u9F64"+ - "\u9F92\u4EB9\u56C6\u56C5\u56CB\u5971\u5B4B\u5B4C"+ - "\u5DD5\u5DD1\u5EF2\u6521\u6520\u6526\u6522\u6B0B"+ - "\u6B08\u6B09\u6C0D\u7055\u7056\u7057\u7052\u721E"+ - "\u721F\u72A9\u737F\u74D8\u74D5\u74D9\u74D7\u766D"+ - "\u76AD\u7935\u79B4\u7A70\u7A71\u7C57\u7C5C\u7C59"+ - "\u7C5B\u7C5A\u7CF4\u7CF1\u7E91\u7F4F\u7F87\u81DE"+ - "\u826B\u8634\u8635\u8633\u862C\u8632\u8636\u882C"+ - "\u8828\u8826\u882A\u8825\u8971\u89BF\u89BE\u89FB"+ - "\u8B7E\u8B84\u8B82\u8B86\u8B85\u8B7F\u8D15\u8E95"+ - "\u8E94\u8E9A\u8E92\u8E90\u8E96\u8E97\u8F60\u8F62"+ - "\u9147\u944C\u9450\u944A\u944B\u944F\u9447\u9445"+ - "\u9448\u9449\u9446\u973F\u97E3\u986A\u9869\u98CB"+ - "\u9954\u995B\u9A4E\u9A53\u9A54\u9A4C\u9A4F\u9A48"+ - "\u9A4A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\u9A49\u9A52\u9A50\u9AD0\u9B19"+ - "\u9B2B\u9B3B\u9B56\u9B55\u9C46\u9C48\u9C3F\u9C44"+ - "\u9C39\u9C33\u9C41\u9C3C\u9C37\u9C34\u9C32\u9C3D"+ - "\u9C36\u9DDB\u9DD2\u9DDE\u9DDA\u9DCB\u9DD0\u9DDC"+ - "\u9DD1\u9DDF\u9DE9\u9DD9\u9DD8\u9DD6\u9DF5\u9DD5"+ - "\u9DDD\u9EB6\u9EF0\u9F35\u9F33\u9F32\u9F42\u9F6B"+ - "\u9F95\u9FA2\u513D\u5299\u58E8\u58E7\u5972\u5B4D"+ - "\u5DD8\u882F\u5F4F\u6201\u6203\u6204\u6529\u6525"+ - "\u6596\u66EB\u6B11\u6B12\u6B0F\u6BCA\u705B\u705A"+ - "\u7222\u7382\u7381\u7383\u7670\u77D4\u7C67\u7C66"+ - "\u7E95\u826C\u863A\u8640\u8639\u863C\u8631\u863B"+ - "\u863E\u8830\u8832\u882E\u8833\u8976\u8974\u8973"+ - "\u89FE\u8B8C\u8B8E\u8B8B\u8B88\u8C45\u8D19\u8E98"+ - "\u8F64\u8F63\u91BC\u9462\u9455\u945D\u9457\u945E"+ - "\u97C4\u97C5\u9800\u9A56\u9A59\u9B1E\u9B1F\u9B20"+ - "\u9C52\u9C58\u9C50\u9C4A\u9C4D\u9C4B\u9C55\u9C59"+ - "\u9C4C\u9C4E\u9DFB\u9DF7\u9DEF\u9DE3\u9DEB\u9DF8"+ - "\u9DE4\u9DF6\u9DE1\u9DEE\u9DE6\u9DF2\u9DF0\u9DE2"+ - "\u9DEC\u9DF4\u9DF3\u9DE8\u9DED\u9EC2\u9ED0\u9EF2"+ - "\u9EF3\u9F06\u9F1C\u9F38\u9F37\u9F36\u9F43\u9F4F"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\u9F71\u9F70\u9F6E\u9F6F\u56D3\u56CD"+ - "\u5B4E\u5C6D\u652D\u66ED\u66EE\u6B13\u705F\u7061"+ - "\u705D\u7060\u7223\u74DB\u74E5\u77D5\u7938\u79B7"+ - "\u79B6\u7C6A\u7E97\u7F89\u826D\u8643\u8838\u8837"+ - "\u8835\u884B\u8B94\u8B95\u8E9E\u8E9F\u8EA0\u8E9D"+ - "\u91BE\u91BD\u91C2\u946B\u9468\u9469\u96E5\u9746"+ - "\u9743\u9747\u97C7\u97E5\u9A5E\u9AD5\u9B59\u9C63"+ - "\u9C67\u9C66\u9C62\u9C5E\u9C60\u9E02\u9DFE\u9E07"+ - "\u9E03\u9E06\u9E05\u9E00\u9E01\u9E09\u9DFF\u9DFD"+ - "\u9E04\u9EA0\u9F1E\u9F46\u9F74\u9F75\u9F76\u56D4"+ - "\u652E\u65B8\u6B18\u6B19\u6B17\u6B1A\u7062\u7226"+ - "\u72AA\u77D8\u77D9\u7939\u7C69\u7C6B\u7CF6\u7E9A"+ - "\u7E98\u7E9B\u7E99\u81E0\u81E1\u8646\u8647\u8648"+ - "\u8979\u897A\u897C\u897B\u89FF\u8B98\u8B99\u8EA5"+ - "\u8EA4\u8EA3\u946E\u946D\u946F\u9471\u9473\u9749"+ - "\u9872\u995F\u9C68\u9C6E\u9C6D\u9E0B\u9E0D\u9E10"+ - "\u9E0F\u9E12\u9E11\u9EA1\u9EF5\u9F09\u9F47\u9F78"+ - "\u9F7B\u9F7A\u9F79\u571E\u7066\u7C6F\u883C\u8DB2"+ - "\u8EA6\u91C3\u9474\u9478\u9476\u9475\u9A60\u9C74"+ - "\u9C73\u9C71\u9C75\u9E14\u9E13\u9EF6\u9F0A\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\u9FA4\u7068\u7065\u7CF7\u866A\u883E\u883D"+ - "\u883F\u8B9E\u8C9C\u8EA9\u8EC9\u974B\u9873\u9874"+ - "\u98CC\u9961\u99AB\u9A64\u9A66\u9A67\u9B24\u9E15"+ - "\u9E17\u9F48\u6207\u6B1E\u7227\u864C\u8EA8\u9482"+ - "\u9480\u9481\u9A69\u9A68\u9B2E\u9E19\u7229\u864B"+ - "\u8B9F\u9483\u9C79\u9EB7\u7675\u9A6B\u9C7A\u9E1D"+ - "\u7069\u706A\u9EA4\u9F7E\u9F49\u9F98\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+ - "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"; - - private final static short index1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 0, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 0, 0, 0, 0, 0, 0 - }; - - String index2[] = { - innerIndex0, - innerIndex1, - innerIndex2, - innerIndex3, - innerIndex4, - innerIndex5 - }; } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/io/CharToByteJohab.java --- a/jdk/src/share/classes/sun/io/CharToByteJohab.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/io/CharToByteJohab.java Sat Apr 18 14:10:27 2009 -0700 @@ -46,4728 +46,4 @@ super.index1 = nioCoder.getEncoderIndex1(); super.index2 = nioCoder.getEncoderIndex2(); } - - private final static String innerIndex0= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0020\u0021\"\u0023\u0024\u0025\u0026\'"+ - "\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\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uD9AE\u0000\u0000\uD9B4\u0000\u0000\uD967"+ - "\uD937\u0000\uDCA3\u0000\u0000\uD939\u0000\u0000"+ - "\uD956\uD94E\uDD99\uDD9A\uD9A5\u0000\uD9D2\uD934"+ - "\uD9AC\uDD98\uDCAC\u0000\uDCF9\uDCF6\uDCFA\uD9AF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDCA1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCA2\u0000\u0000\u0000\u0000\u0000\u0000\uD94F"+ - "\uDCAA\u0000\u0000\u0000\u0000\u0000\uDCAD\uDD3C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDD31\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDD33\u0000\u0000\u0000\u0000\u0000\u0000\uD950"+ - "\uDD3A\u0000\u0000\u0000\u0000\u0000\uDD3D\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDD32\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDCA4\uDD34"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDD35\uDCA6\uDD36\u0000\u0000\u0000\u0000"+ - "\uDD37\u0000\u0000\u0000\u0000\u0000\u0000\uDCA8"+ - "\uDD38\uDCA9\uDD39\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDD40\uDCAF\uDD3F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uDCAB\uDD3B\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uDCAE\uDD3E"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uD9A7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9B0\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9A8\uD9AB\uD9AA\uD9AD\u0000\uD9A9\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDB51\uDB52\uDB53\uDB54\uDB55\uDB56\uDB57"+ - "\uDB58\uDB59\uDB5A\uDB5B\uDB5C\uDB5D\uDB5E\uDB5F"+ - "\uDB60\uDB61\u0000\uDB62\uDB63\uDB64\uDB65\uDB66"+ - "\uDB67\uDB68\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDB71\uDB72\uDB73\uDB74\uDB75\uDB76\uDB77"+ - "\uDB78\uDB79\uDB7A\uDB7B\uDB7C\uDB7D\uDB7E\uDB91"+ - "\uDB92\uDB93\u0000\uDB94\uDB95\uDB96\uDB97\uDB98"+ - "\uDB99\uDB9A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDEA7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDEA1\uDEA2\uDEA3\uDEA4\uDEA5\uDEA6\uDEA8\uDEA9"+ - "\uDEAA\uDEAB\uDEAC\uDEAD\uDEAE\uDEAF\uDEB0\uDEB1"+ - "\uDEB2\uDEB3\uDEB4\uDEB5\uDEB6\uDEB7\uDEB8\uDEB9"+ - "\uDEBA\uDEBB\uDEBC\uDEBD\uDEBE\uDEBF\uDEC0\uDEC1"+ - "\uDED1\uDED2\uDED3\uDED4\uDED5\uDED6\uDED8\uDED9"+ - "\uDEDA\uDEDB\uDEDC\uDEDD\uDEDE\uDEDF\uDEE0\uDEE1"+ - "\uDEE2\uDEE3\uDEE4\uDEE5\uDEE6\uDEE7\uDEE8\uDEE9"+ - "\uDEEA\uDEEB\uDEEC\uDEED\uDEEE\uDEEF\uDEF0\uDEF1"+ - "\u0000\uDED7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uD93A\u0000\u0000"+ - "\uD93E\uD93F\u0000\u0000\uD940\uD941\u0000\u0000"+ - "\uD9D3\uD9D4\u0000\u0000\u0000\uD935\uD936\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9B6\u0000\uD957\uD958\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uD968\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uDD9B\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uDD9C"+ - "\u0000\uDD9D\uDD9E\uDD9F\uDDA0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uD959\u0000\u0000\u0000\u0000"+ - "\u0000\uD9B5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uDC34\u0000\u0000\uD9E0\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uD9E5\uD9E2\u0000\u0000\u0000\uDC69\u0000"+ - "\u0000\u0000\u0000\uD95A\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uDCF7\uDCF8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uDCFB\uDCFC\uDCFD\uDCFE\u0000"+ - "\uDB40\uDB41\uDB42\uDB43\uDB44\uDB45\uDB46\uDB47"+ - "\uDB48\uDB49\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDB31\uDB32\uDB33\uDB34\uDB35\uDB36\uDB37\uDB38"+ - "\uDB39\uDB3A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD977\uD978\uD976\uD979\uD97A\uD9D5\uD9D8\uD9D6"+ - "\uD9D9\uD9D7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD9A1\u0000\uD9A2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9A3\u0000\uD963\uD9A4\u0000\u0000\u0000\uD964"+ - "\uD996\u0000\u0000\uD997\u0000\u0000\u0000\uD9B3"+ - "\u0000\uD9B2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD97E\u0000\u0000\uD992\uD954\u0000"+ - "\uD960\u0000\u0000\u0000\u0000\uD93B\u0000\uD99E"+ - "\uD99F\uD99D\uD99C\uD994\uD995\u0000\uD9B1\u0000"+ - "\u0000\u0000\u0000\u0000\uD955\uD993\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uD93D\uD991\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD966\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD951\uD965\u0000\u0000\uD952\uD953\u0000\u0000"+ - "\u0000\u0000\uD97C\uD97D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD99A\uD99B\u0000\u0000\uD998\uD999"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uD9C1\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uD961\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD962\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCE7\uDCE8\uDCE9\uDCEA\uDCEB\uDCEC\uDCED\uDCEE"+ - "\uDCEF\uDCF0\uDCF1\uDCF2\uDCF3\uDCF4\uDCF5\u0000"+ - "\u0000\u0000\u0000\u0000\uDD77\uDD78\uDD79\uDD7A"+ - "\uDD7B\uDD7C\uDD7D\uDD7E\uDD91\uDD92\uDD93\uDD94"+ - "\uDD95\uDD96\uDD97\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uDD5D\uDD5E\uDD5F\uDD60"+ - "\uDD61\uDD62\uDD63\uDD64\uDD65\uDD66\uDD67\uDD68"+ - "\uDD69\uDD6A\uDD6B\uDD6C\uDD6D\uDD6E\uDD6F\uDD70"+ - "\uDD71\uDD72\uDD73\uDD74\uDD75\uDD76\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCCD\uDCCE\uDCCF\uDCD0\uDCD1\uDCD2\uDCD3\uDCD4"+ - "\uDCD5\uDCD6\uDCD7\uDCD8\uDCD9\uDCDA\uDCDB\uDCDC"+ - "\uDCDD\uDCDE\uDCDF\uDCE0\uDCE1\uDCE2\uDCE3\uDCE4"+ - "\uDCE5\uDCE6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDBA1\uDBAC\uDBA2\uDBAD\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uDBA3\uDBC8\uDBC7\uDBAE"+ - "\uDBA4\uDBC2\uDBC1\uDBAF\uDBA6\uDBC6\uDBC5\uDBB1"+ - "\uDBA5\uDBC4\uDBC3\uDBB0\uDBA7\uDBBC\uDBC9\uDBCA"+ - "\uDBB7\uDBCB\uDBCC\uDBB2\uDBA9\uDBBE\uDBCD\uDBCE"+ - "\uDBB9\uDBCF\uDBD0\uDBB4\uDBA8\uDBD1\uDBD2\uDBB8"+ - "\uDBBD\uDBD3\uDBD4\uDBB3\uDBAA\uDBD5\uDBD6\uDBBA"+ - "\uDBBF\uDBD7\uDBD8\uDBB5\uDBAB\uDBD9\uDBDA\uDBBB"+ - "\uDBDB\uDBDC\uDBC0\uDBDD\uDBDE\uDBDF\uDBE0\uDBE1"+ - "\uDBE2\uDBE3\uDBE4\uDBB6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD9C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD971\uD970\u0000\uD9C3\uD9C7\uD9C8\uD9CB\uD9CA"+ - "\uD9C9\uD9CC\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uD973\uD972\u0000\u0000\uD9BA\uD9B9"+ - "\u0000\u0000\u0000\u0000\uD975\uD974\u0000\u0000"+ - "\uD9B8\uD9B7\u0000\u0000\u0000\u0000\uD96F\uD96E"+ - "\uD9C2\u0000\u0000\uD96B\u0000\u0000\uD96D\uD96C"+ - "\uD9C4\uD9C5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uD96A\uD969\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uD9CF\uD9CE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uD9D0\u0000\uD9D1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD95F\u0000\uD95E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD9BC\uD9BD\u0000\uD9C0\uD9BB\uD9BE\u0000\uD9BF"+ - "\uD9CD\uD9DB\uD9DC\u0000\uD9DD\uD9DA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD931\uD932\uD933\uD938\u0000\u0000\u0000\u0000"+ - "\uD944\uD945\uD946\uD947\uD948\uD949\uD94A\uD94B"+ - "\uD94C\uD94D\u0000\uD97B\uD942\uD943\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDDA1\uDDA2\uDDA3\uDDA4\uDDA5\uDDA6\uDDA7"+ - "\uDDA8\uDDA9\uDDAA\uDDAB\uDDAC\uDDAD\uDDAE\uDDAF"+ - "\uDDB0\uDDB1\uDDB2\uDDB3\uDDB4\uDDB5\uDDB6\uDDB7"+ - "\uDDB8\uDDB9\uDDBA\uDDBB\uDDBC\uDDBD\uDDBE\uDDBF"+ - "\uDDC0\uDDC1\uDDC2\uDDC3\uDDC4\uDDC5\uDDC6\uDDC7"+ - "\uDDC8\uDDC9\uDDCA\uDDCB\uDDCC\uDDCD\uDDCE\uDDCF"+ - "\uDDD0\uDDD1\uDDD2\uDDD3\uDDD4\uDDD5\uDDD6\uDDD7"+ - "\uDDD8\uDDD9\uDDDA\uDDDB\uDDDC\uDDDD\uDDDE\uDDDF"+ - "\uDDE0\uDDE1\uDDE2\uDDE3\uDDE4\uDDE5\uDDE6\uDDE7"+ - "\uDDE8\uDDE9\uDDEA\uDDEB\uDDEC\uDDED\uDDEE\uDDEF"+ - "\uDDF0\uDDF1\uDDF2\uDDF3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDE31\uDE32\uDE33\uDE34\uDE35\uDE36\uDE37"+ - "\uDE38\uDE39\uDE3A\uDE3B\uDE3C\uDE3D\uDE3E\uDE3F"+ - "\uDE40\uDE41\uDE42\uDE43\uDE44\uDE45\uDE46\uDE47"+ - "\uDE48\uDE49\uDE4A\uDE4B\uDE4C\uDE4D\uDE4E\uDE4F"+ - "\uDE50\uDE51\uDE52\uDE53\uDE54\uDE55\uDE56\uDE57"+ - "\uDE58\uDE59\uDE5A\uDE5B\uDE5C\uDE5D\uDE5E\uDE5F"+ - "\uDE60\uDE61\uDE62\uDE63\uDE64\uDE65\uDE66\uDE67"+ - "\uDE68\uDE69\uDE6A\uDE6B\uDE6C\uDE6D\uDE6E\uDE6F"+ - "\uDE70\uDE71\uDE72\uDE73\uDE74\uDE75\uDE76\uDE77"+ - "\uDE78\uDE79\uDE7A\uDE7B\uDE7C\uDE7D\uDE7E\uDE91"+ - "\uDE92\uDE93\uDE94\uDE95\uDE96\uDE97\uDE98\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u8841\u8C41\u8444\u9041\u8446\u8447\u9441"+ - "\u9841\u9C41\u844A\u844B\u844C\u844D\u844E\u844F"+ - "\u8450\uA041\uA441\uA841\u8454\uAC41\uB041\uB441"+ - "\uB841\uBC41\uC041\uC441\uC841\uCC41\uD041\u8461"+ - "\u8481\u84A1\u84C1\u84E1\u8541\u8561\u8581\u85A1"+ - "\u85C1\u85E1\u8641\u8661\u8681\u86A1\u86C1\u86E1"+ - "\u8741\u8761\u8781\u87A1\uDAD4\uDAD5\uDAD6\uDAD7"+ - "\uDAD8\uDAD9\uDADA\uDADB\uDADC\uDADD\uDADE\uDADF"+ - "\uDAE0\uDAE1\uDAE2\uDAE3\uDAE4\uDAE5\uDAE6\uDAE7"+ - "\uDAE8\uDAE9\uDAEA\uDAEB\uDAEC\uDAED\uDAEE\uDAEF"+ - "\uDAF0\uDAF1\uDAF2\uDAF3\uDAF4\uDAF5\uDAF6\uDAF7"+ - "\uDAF8\uDAF9\uDAFA\uDAFB\uDAFC\uDAFD\uDAFE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDD41\uDD42\uDD43\uDD44\uDD45\uDD46\uDD47\uDD48"+ - "\uDD49\uDD4A\uDD4B\uDD4C\uDD4D\uDD4E\uDD4F\uDD50"+ - "\uDD51\uDD52\uDD53\uDD54\uDD55\uDD56\uDD57\uDD58"+ - "\uDD59\uDD5A\uDD5B\uDD5C\uD9DF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDCB1\uDCB2\uDCB3\uDCB4\uDCB5\uDCB6\uDCB7\uDCB8"+ - "\uDCB9\uDCBA\uDCBB\uDCBC\uDCBD\uDCBE\uDCBF\uDCC0"+ - "\uDCC1\uDCC2\uDCC3\uDCC4\uDCC5\uDCC6\uDCC7\uDCC8"+ - "\uDCC9\uDCCA\uDCCB\uDCCC\u0000\u0000\u0000\uD9DE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static String innerIndex1= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uDC59\uDC5A\uDC5B\uDC5C\uDC5D\u0000\u0000\u0000"+ - "\uDC4A\uDC4B\uDC6C\uDC6D\uDC6E\uDC46\uDC47\uDC48"+ - "\uDC64\uDC65\uDC66\uDC67\uDC68\uDC31\uDC32\uDC33"+ - "\uDC35\uDC3B\uDC3C\uDC3D\uDC3E\uDC3F\uDC40\uDC41"+ - "\uDC42\uDC43\uDC44\uDC37\uDC38\uDC39\uDC3A\uDC4D"+ - "\uDC4E\uDC75\uDC76\uDC77\uDC78\uDC71\uDC72\uDC73"+ - "\uDC4F\uDC50\uDC51\uDC52\uDC53\uDC54\uDC55\uDC56"+ - "\uDC57\uDC58\uDC5E\uDC5F\uDC60\uDC61\uDC62\uDC63"+ - "\uDC6A\uDC6B\uD9E3\uDC7C\uDC36\uDC70\uDC91\uD9E1"+ - "\uDC4C\uDC7D\uDC45\u0000\u0000\u0000\u0000\uDC49"+ - "\uDC7A\u0000\u0000\uDC7B\u0000\u0000\uDC6F\u0000"+ - "\uD9E4\u0000\u0000\uDC74\uDC7E\uDC79\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF179\uF2CB\u0000\uF662\u0000\u0000\u0000\uE742"+ - "\uF1DB\uEAB2\uEABE\uF7BB\u0000\uE996\u0000\u0000"+ - "\u0000\uF5E4\u0000\u0000\uF4A6\uE9E0\uEBA6\u0000"+ - "\uE29A\uE940\u0000\u0000\u0000\u0000\uECAA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF3E9\u0000\u0000"+ - "\u0000\u0000\uE1FA\u0000\u0000\u0000\u0000\u0000"+ - "\uF93F\uE4A1\u0000\uF3AB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEED1\uE43C\u0000\uE29B\u0000\u0000"+ - "\u0000\u0000\u0000\uF3FD\u0000\uEA4F\uF8BA\uF7B9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE262\u0000"+ - "\uECAB\uF0E0\u0000\u0000\u0000\uE29C\uE0F7\uEDA5"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE071\u0000\uE55C\u0000\u0000"+ - "\u0000\u0000\u0000\uF071\u0000\u0000\uE973\uEAAD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE0EB\u0000"+ - "\u0000\u0000\uE5AF\u0000\u0000\u0000\uE697\u0000"+ - "\uEDF8\u0000\u0000\uEA50\uF133\u0000\uEFCD\u0000"+ - "\uF037\uEFF6\uF8BB\u0000\uEEE9\uF2CC\u0000\u0000"+ - "\uE376\u0000\u0000\uEA51\u0000\u0000\uED3C\u0000"+ - "\u0000\uE75C\uF7F1\u0000\uE26F\uF834\uEE42\u0000"+ - "\uF89D\u0000\u0000\uF84D\uE158\uF2CD\uE5D5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4A2\u0000"+ - "\u0000\u0000\uF161\u0000\u0000\u0000\u0000\u0000"+ - "\uED37\uF162\u0000\u0000\uF641\u0000\u0000\uE29D"+ - "\u0000\u0000\uE361\uE0BF\u0000\uF1A4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF1A8\uEA52\uF672\uF1DC"+ - "\uE997\uEB49\u0000\u0000\u0000\uE55E\u0000\uF545"+ - "\u0000\u0000\u0000\uE4DB\uE645\uF134\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uED76\u0000\uF3EA\u0000\u0000\u0000\uE0EC\uE0C0"+ - "\u0000\u0000\u0000\uF194\u0000\u0000\u0000\u0000"+ - "\u0000\uE37A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF7F2\uF135\uE36F\u0000\uEEEA\uE37B\uE961"+ - "\uE8E9\uF9CC\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8D7"+ - "\u0000\u0000\u0000\u0000\uE871\u0000\uE646\u0000"+ - "\uECDF\u0000\uEA53\u0000\uEA54\uE031\u0000\u0000"+ - "\u0000\u0000\u0000\uF27C\u0000\u0000\uE4A3\uF247"+ - "\uF75F\u0000\u0000\u0000\u0000\uF058\uF248\uF3AC"+ - "\uF3A5\uEFCE\u0000\u0000\u0000\uF7BC\u0000\u0000"+ - "\u0000\uEDF9\uF17A\uE9D6\uF1C2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF735\u0000\u0000\u0000\u0000\u0000\uEDBA"+ - "\uE8D8\u0000\u0000\uE032\u0000\u0000\uE3CD\u0000"+ - "\u0000\u0000\uF27D\u0000\u0000\u0000\uF17B\uEA55"+ - "\u0000\uECE0\u0000\uE059\uF479\u0000\uE5CE\u0000"+ - "\uF646\u0000\uE252\uE657\u0000\uECB4\u0000\uF3AD"+ - "\u0000\uF072\u0000\u0000\u0000\u0000\uE6C2\u0000"+ - "\uF4A7\u0000\u0000\uE1EA\u0000\uF0EE\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE7B2\uF9A5"+ - "\u0000\u0000\u0000\u0000\u0000\uF665\uE5E2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF745"+ - "\u0000\u0000\uE197\uF5B5\uED3D\u0000\u0000\u0000"+ - "\u0000\uEEEB\uF3D5\u0000\u0000\u0000\uF34B\u0000"+ - "\u0000\uEFB5\u0000\uE159\uF865\u0000\u0000\uEBD4"+ - "\u0000\u0000\uE6D6\u0000\u0000\uE951\u0000\uEA56"+ - "\uF891\uECE1\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEBF3\uE998"+ - "\u0000\uE29E\u0000\uE8C4\u0000\uF793\u0000\u0000"+ - "\uE974\u0000\uEDEF\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE941\u0000\u0000\u0000\uE5D6\u0000"+ - "\u0000\uF4DA\u0000\uE0C1\u0000\uE8C3\u0000\u0000"+ - "\u0000\uE7FA\uE4EE\u0000\u0000\u0000\uF848\u0000"+ - "\u0000\uF9A6\uF0EF\u0000\uF536\u0000\uE15A\uF4A8"+ - "\u0000\uF4DB\u0000\uE8A7\uF647\u0000\uE2E6\uF394"+ - "\uE0DA\u0000\uEED2\uE6C3\uF692\uEF6E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEDA6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEDE7\u0000\u0000\u0000\uE033"+ - "\uE137\uF059\u0000\u0000\u0000\u0000\u0000\uF746"+ - "\u0000\u0000\u0000\u0000\u0000\uF835\u0000\u0000"+ - "\u0000\u0000\uF3AE\u0000\uF2CE\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE0ED\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF640\uF2CF\uEFCF\u0000"+ - "\uF6DE\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE263\u0000\u0000\u0000\u0000\uE999\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE8A8\u0000\u0000"+ - "\u0000\uE0F8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAA1\uE9E1\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5CA\uEFB6\u0000\u0000"+ - "\u0000\u0000\uEEEC\uF27E\u0000\uF4F0\u0000\uEABF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE15B\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE351\u0000\u0000"+ - "\u0000\uF562\uEB4A\u0000\u0000\u0000\u0000\uEAC0"+ - "\u0000\uE270\u0000\u0000\u0000\uE962\uF9EA\u0000"+ - "\u0000\u0000\uE698\u0000\u0000\u0000\uF05A\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF79\u0000\uECAC"+ - "\u0000\u0000\u0000\u0000\u0000\uF4D0\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE034\u0000\uE8F8\u0000\u0000\u0000\uEA57"+ - "\uF0F0\uF3D6\u0000\u0000\uEDE2\u0000\uE15C\u0000"+ - "\u0000\uE0FB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF073\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEAC1"+ - "\u0000\uE67D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFD0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF249\u0000\u0000\u0000\u0000\uE5E3"+ - "\u0000\u0000\uE3D3\u0000\uEDF0\u0000\u0000\u0000"+ - "\uEF44\uF0C3\u0000\uF03A\uF89E\uF5F6\uF34C\uF9D4"+ - "\uEB4B\uE253\u0000\uE34A\uF6BA\uE795\uF6CD\u0000"+ - "\u0000\u0000\uED3E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE56F\u0000\u0000\u0000"+ - "\u0000\u0000\uE377\u0000\u0000\uF19F\u0000\uE43E"+ - "\uF291\uE5D7\uF074\uF732\uE1EB\uE6BF\uF8B1\u0000"+ - "\u0000\uE1EC\u0000\u0000\u0000\uE942\uE37C\uE29F"+ - "\uF292\u0000\u0000\u0000\uE152\u0000\u0000\u0000"+ - "\uE37D\u0000\u0000\u0000\u0000\u0000\uEDF7\u0000"+ - "\u0000\u0000\uF4FC\u0000\u0000\uF232\u0000\u0000"+ - "\u0000\u0000\uE7B3\u0000\u0000\uE796\u0000\uEFB7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE23E\u0000\u0000\u0000\u0000\uE7A2\u0000\u0000"+ - "\u0000\u0000\uE793\u0000\uE55F\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEDA7\uE5D2"+ - "\u0000\u0000\u0000\u0000\u0000\uE639\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF532\u0000\uF3D7\u0000"+ - "\u0000\uE5D8\u0000\uF34D\uE6D0\uE560\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE6CF\uF0EA\uF9EB\u0000"+ - "\u0000\uE8ED\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF955\uE0C2\u0000\u0000\u0000\u0000\uF9D5\u0000"+ - "\uF558\uEF7A\uF5F3\u0000\u0000\uF7DE\u0000\u0000"+ - "\uE4EF\u0000\u0000\uF163\u0000\u0000\uE9C2\uF2B7"+ - "\uEED4\u0000\uE05A\u0000\u0000\u0000\uE7FB\u0000"+ - "\u0000\uF89F\u0000\u0000\u0000\u0000\u0000\uE63A"+ - "\u0000\u0000\u0000\u0000\u0000\uF59A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF6F7\uE93C\u0000\u0000"+ - "\u0000\uE6D7\uEAA2\u0000\u0000\u0000\uE24E\u0000"+ - "\uE4F0\u0000\u0000\u0000\u0000\u0000\uF334\uEBEC"+ - "\uE2E7\uF4CB\uF1A9\uE04E\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF591\u0000\u0000\u0000\uF65E"+ - "\u0000\u0000\uEA9D\uE34B\uE5B7\uF293\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF538\u0000\uE99A\u0000"+ - "\u0000\u0000\u0000\uE0A7\u0000\uE85E\u0000\u0000"+ - "\u0000\uEB76\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF1A5\uF294\u0000\u0000\u0000\u0000\uE99B"+ - "\u0000\u0000\uF7DC\u0000\u0000\uF4DC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF794\u0000\uF59B"+ - "\u0000\u0000\u0000\uF993\u0000\u0000\u0000\uE34C"+ - "\uE8F9\uE6B1\u0000\u0000\u0000\uE0FC\u0000\u0000"+ - "\u0000\uF335\uE0FD\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE5F4\u0000\u0000\u0000\uE1ED"+ - "\uE035\u0000\u0000\uE63B\uE352\u0000\u0000\u0000"+ - "\u0000\uF34E\uE44D\uE134\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF846\u0000"+ - "\u0000\uE15D\u0000\uE89C\u0000\uF65F\u0000\uEFB8"+ - "\u0000\uE797\u0000\u0000\u0000\uE15E\u0000\u0000"+ - "\u0000\u0000\uE6CD\u0000\u0000\uE561\uEFED\u0000"+ - "\uE07B\uE7E2\u0000\uF9B2\u0000\uECAD\uE65C\uE7B4"+ - "\u0000\u0000\uEBA7\uF263\uE353\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF9B3\u0000\uE5E4\u0000\u0000"+ - "\uE2E8\u0000\uF1C3\uE342\u0000\u0000\uE2A0\uE838"+ - "\u0000\u0000\u0000\u0000\u0000\uF760\u0000\u0000"+ - "\uF9D6\u0000\u0000\u0000\u0000\uF761\u0000\uF762"+ - "\uE963\u0000\u0000\u0000\u0000\uE9E2\uF8F9\uE9C1"+ - "\u0000\uECB5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1DD\uE254\u0000\uE0A1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9E3\u0000\u0000\u0000\u0000\uF96D"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF7AF\u0000\u0000\u0000\u0000\u0000\uE49D"+ - "\uE2A1\uED38\u0000\uF546\uF1A0\u0000\u0000\uECAE"+ - "\uEEED\uF9C1\uE872\u0000\u0000\uE743\u0000\u0000"+ - "\u0000\uE9E4\uF391\uF693\uF892\u0000\u0000\uE3F5"+ - "\u0000\u0000\uE85F\u0000\uE964\u0000\uE936\u0000"+ - "\uF2BF\u0000\u0000\u0000\u0000\u0000\uE25F\u0000"+ - "\uEB69\u0000\u0000\u0000\u0000\u0000\u0000\uE7D6"+ - "\uF164\uF05B\u0000\u0000\uE04F\uE5B0\u0000\uE2E9"+ - "\u0000\u0000\u0000\u0000\u0000\uF3ED\u0000\uE15F"+ - "\u0000\u0000\u0000\u0000\uED9A\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uED7D\u0000\u0000\u0000\u0000"+ - "\uE6D8\u0000\uF9A7\u0000\u0000\u0000\u0000\uF03B"+ - "\uF642\u0000\u0000\u0000\u0000\uE2F0\uF7BD\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE96\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE0DB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF4D1\u0000\u0000\u0000\u0000"+ - "\uEFD1\uF4A9\uE370\uEFD2\u0000\uE873\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC62\u0000\uF632\uEBF4"+ - "\u0000\u0000\u0000\uE874\u0000\u0000\u0000\u0000"+ - "\u0000\uEED5\uF5BF\uE2A2\uE1AF\uE2A3\u0000\u0000"+ - "\u0000\uE1B0\uF3FE\uE333\uEBAF\uF733\u0000\uE036"+ - "\uF6BB\uF47A\uEA58\uEFD3\u0000\u0000\u0000\u0000"+ - "\uEA59\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF9DE\uE050\u0000\u0000\u0000"+ - "\uF7EA\uE3CE\uF264\u0000\uE562\uE7A3\uF9A8\uE6D9"+ - "\uF6CE\uF84E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE2D6\u0000\uE6F0\u0000\uF0E1"+ - "\uF755\u0000\u0000\u0000\u0000\u0000\uE99C\u0000"+ - "\u0000\uE9C3\u0000\uF7DF\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEEEF\u0000\u0000\u0000\u0000"+ - "\uF9E5\uF633\u0000\uE7FC\uF9A9\u0000\uEEEE\u0000"+ - "\u0000\u0000\uE5E5\u0000\u0000\u0000\u0000\u0000"+ - "\uF2D0\u0000\uE1B1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6A2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF3B2\u0000\uF3B1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE1B2\u0000\uE83B\u0000\uE037\u0000\u0000"+ - "\u0000\u0000\u0000\uECE2\uF8BC\uE7A4\u0000\u0000"+ - "\uF24A\u0000\u0000\u0000\u0000\u0000\uF763\u0000"+ - "\u0000\u0000\u0000\u0000\uF8FA\u0000\uE2A4\u0000"+ - "\uE99D\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF673\u0000\u0000\u0000"+ - "\uF1AA\u0000\u0000\uF431\uE271\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF836\u0000\u0000\u0000\u0000"+ - "\uF7E0\u0000\u0000\u0000\u0000\uF166\u0000\u0000"+ - "\uED7E\uF7A1\u0000\u0000\uF8EF\u0000\u0000\u0000"+ - "\uF7EB\uF233\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF03C\u0000\u0000\u0000\uE038\u0000\u0000"+ - "\uF59C\u0000\u0000\u0000\u0000\uE1D6\uF998\u0000"+ - "\u0000\u0000\uF559\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF764\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF736\u0000\uEA5A\uF456"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE6DA\u0000"+ - "\uE4D0\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE755\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF076"+ - "\u0000\uF4DD\u0000\u0000\u0000\uED6A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF674\u0000"+ - "\u0000\u0000\u0000\u0000\uF694\u0000\uEAC2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7FD"+ - "\u0000\u0000\u0000\uE198\u0000\u0000\uE4BA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED3F\u0000"+ - "\u0000\u0000\u0000\uF7E1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF336\u0000\u0000\u0000"+ - "\uE0D3\u0000\u0000\u0000\uEB4C\u0000\uF55A\uE59C"+ - "\u0000\uF9AA\uF7E2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF547\uF9C2\uF940\u0000\uF9EC\uE072\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9BD"+ - "\u0000\uF077\uEAC3\uE3D2\uE272\u0000\uE4A4\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF9AB\u0000\uEAE0"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF457\u0000\u0000\u0000"+ - "\u0000\u0000\uEEF0\u0000\uE37E\u0000\u0000\uF4AA"+ - "\u0000\u0000\u0000\uEA5B\uF648\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBF5\uF3B3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF6A3\u0000"+ - "\u0000\uE039\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE2A5\u0000\u0000\uEAC4"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEBB0"+ - "\u0000\u0000\uF34F\u0000\uF634\u0000\uECB6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF856\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE391\u0000\u0000\uF9ED\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9C4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF999\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE4F\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEA3D\u0000\uF84F\u0000"+ - "\u0000\u0000\u0000\u0000\uEDF1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF1C4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE435\u0000\u0000\uF9EE\u0000\u0000"+ - "\u0000\uF5B6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEBF6\uEA5C\u0000\u0000\uF96E\u0000"+ - "\uF167\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE1DD\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE647\uE1B3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF765\uEDD8\u0000\u0000\u0000"+ - "\uE2EA\u0000\u0000\uE2D0\u0000\uF05C\u0000\u0000"+ - "\u0000\u0000\uF03E\uF03D\u0000\u0000\uE4F1\u0000"+ - "\uE4A5\u0000\u0000\u0000\u0000\u0000\u0000\uF6CF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF234\u0000\u0000\u0000\u0000\uE334\u0000\u0000"+ - "\uF432\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE392\u0000\u0000\u0000\u0000"+ - "\uF433\u0000\uF6F8\u0000\u0000\u0000\u0000\uE343"+ - "\u0000\u0000\uE8A9\u0000\u0000\uE4BB\uE07C\u0000"+ - "\uF3A6\uE0D5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6E7\u0000\u0000\uE1DE\u0000\uF6A4\u0000"+ - "\u0000\u0000\uF750\u0000\u0000\u0000\uE4DD\u0000"+ - "\uE160\u0000\u0000\u0000\u0000\uE2A6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF695\u0000\u0000\u0000"+ - "\u0000\u0000\uEBF7\u0000\u0000\u0000\u0000\u0000"+ - "\uE4DC\u0000\u0000\uF8A0\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF837\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF0D9\u0000\uE2A7\uF03F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uED91\u0000\u0000\u0000\uEFB9"+ - "\uF3D8\u0000\u0000\uE768\u0000\u0000\uEB94\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE44"+ - "\uE99E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF4F1\u0000\u0000\u0000\uECD0\u0000\u0000\uF49D"+ - "\u0000\uE8C6\uE393\u0000\uE394\u0000\u0000\u0000"+ - "\uE2DC\u0000\uE4D1\u0000\u0000\uE141\uF6D8\u0000"+ - "\uE0A8\uF0BC\uED4E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF56C\u0000"+ - "\u0000\uE952\u0000\u0000\uF337\u0000\u0000\uEE50"+ - "\u0000\u0000\uE07D\u0000\u0000\u0000\u0000\uEF7B"+ - "\uEDE8\uE953\u0000\u0000\uF1DE\uE4F2\u0000\u0000"+ - "\u0000\u0000\uE199\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE264\uEEAB\u0000\u0000\u0000\uE0C3"+ - "\u0000\uEBB1\u0000\u0000\uF6B2\u0000\u0000\uE4F3"+ - "\uE4D2\u0000\uF5C0\u0000\u0000\u0000\uEADD\u0000"+ - "\u0000\uF295\uEEF1\u0000\uF9B4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF458\u0000\u0000"+ - "\u0000\uF4D2\u0000\u0000\uF296\u0000\uEC63\u0000"+ - "\u0000\u0000\u0000\uE161\u0000\uEAEA\u0000\u0000"+ - "\u0000\uEFBA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE7D7\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5CD\u0000\uF3F2\uF857"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7F8\uE552\u0000\u0000\u0000\u0000\uF675\u0000"+ - "\u0000\u0000\u0000\uE9C5\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEEF2\uF1DF\u0000\u0000\uE05B\u0000"+ - "\u0000\uE8FA\u0000\u0000\u0000\uEF45\u0000\uE4A6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF9B5\u0000"+ - "\u0000\uF7C9\u0000\uED72\u0000\uF8BD\u0000\u0000"+ - "\uE6A4\uE255\u0000\u0000\u0000\u0000\uE265\uE676"+ - "\u0000\u0000\u0000\u0000\uEDBD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA5D\uF195\u0000\u0000\uF1E0"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF17C\uF8BE\uEAEB\u0000\uEBF8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF7BE"+ - "\u0000\u0000\u0000\u0000\uE395\uEB3A\uEF72\u0000"+ - "\u0000\uEC64\uE49F\u0000\uEDA8\u0000\u0000\u0000"+ - "\u0000\u0000\uE7D3\u0000\u0000\u0000\u0000\uE4DE"+ - "\u0000\uF548\uF6BC\uE99F\u0000\uEF7C\uED77\u0000"+ - "\u0000\uECF7\u0000\u0000\u0000\u0000\u0000\uF138"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF893\u0000"+ - "\u0000\u0000\u0000\u0000\uEDF2\u0000\u0000\uE396"+ - "\uE43F\uE975\u0000\u0000\u0000\u0000\uE335\uF3B4"+ - "\uF941\uE19A\u0000\u0000\uE9C6\uF861\u0000\uF6DF"+ - "\u0000\u0000\uF838\u0000\u0000\u0000\u0000\u0000"+ - "\uF297\u0000\uEA5E\u0000\u0000\u0000\u0000\uEEF3"+ - "\u0000\u0000\uF6AC\uF0C4\uF1E1\uEB3B\uE9C7\u0000"+ - "\u0000\u0000\u0000\uE443\uE44F\u0000\u0000\u0000"+ - "\uE05C\u0000\u0000\u0000\u0000\uF8BF\u0000\u0000"+ - "\u0000\u0000\uEDFD\uE9E5\uE75D\u0000\u0000\u0000"+ - "\u0000\u0000\uF196\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE397\u0000\u0000\uEF7D\uE362"+ - "\u0000\uE7D8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF676\u0000\u0000"+ - "\uE8AA\u0000\u0000\u0000\uF6E0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE769\u0000\uF533\u0000\u0000\uF56D\u0000"+ - "\u0000\u0000\u0000\uF2D1\u0000\u0000\uE7B5\u0000"+ - "\u0000\uF1AB\u0000\uECB7\u0000\u0000\u0000\u0000"+ - "\uF24B\uE1B4\u0000\uEB95\uF05D\u0000\u0000\u0000"+ - "\u0000\uF197\uEF7E\u0000\uE0A9\uF3AF\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE05D\u0000"+ - "\uF139\u0000\uF47B\u0000\uF9EF\u0000\uF7F3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEE51\u0000\u0000\uF168\u0000\u0000\u0000\uF1AC"+ - "\u0000\uF05E\u0000\uEF6F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEA5F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE436\u0000\u0000\uEEF4\uE3D6\u0000\u0000\uEE52"+ - "\uECE3\u0000\u0000\u0000\u0000\uED40\u0000\u0000"+ - "\u0000\uE744\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF635\u0000"+ - "\u0000\u0000\u0000\u0000\uF4DE\u0000\u0000\u0000"+ - "\u0000\uE6A5\u0000\u0000\u0000\u0000\uF6E8\u0000"+ - "\u0000\uEF56\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8E6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9E6\u0000\u0000\u0000\uE9A0\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE76A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE83C\uF040\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uECB8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE03A\uEBF9\u0000\uF041\u0000\u0000\u0000"+ - "\u0000\uF47C\u0000\u0000\uF87E\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF265\u0000\u0000\u0000\u0000\uF7F4\u0000"+ - "\u0000\uE47C\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF8FB\u0000\u0000"+ - "\u0000\uF9F0\u0000\uEB4D\uE273\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF756\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEA3E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAC5\u0000\u0000\uEDBE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1AD\uF87A\u0000\u0000\uE1EE\uF1A6\u0000\uF1AE"+ - "\uF37D\u0000\uE9A1\u0000\uF1AF\uF99A\u0000\uE77B"+ - "\u0000\u0000\u0000\uE19B\uE1B5\u0000\u0000\u0000"+ - "\u0000\uF839\u0000\uEBDD\u0000\u0000\u0000\u0000"+ - "\uEC65\uF1CF\u0000\u0000\u0000\uE9A2\u0000\u0000"+ - "\uF7CA\u0000\uF078\u0000\uEDED\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE4EB\u0000\uEFD4"+ - "\uEBFA\uED5C\u0000\uEBE4\uEF57\u0000\u0000\uE26B"+ - "\u0000\u0000\u0000\uE965\u0000\uF6B5\uF995\uF395"+ - "\uE23F\uF3B5\uF2D2\uEF58\uF0F1\u0000\u0000\u0000"+ - "\u0000\u0000\uE0D4\uEB4E\uECF8\uF079\uF942\u0000"+ - "\u0000\u0000\u0000\u0000\uEB96\u0000\uE2E0\u0000"+ - "\uF235\u0000\u0000\uF83A\uEE53\uEBB2\uE03B\u0000"+ - "\uECE4\uEFBB\u0000\u0000\u0000\u0000\u0000\uEC66"+ - "\uF4F2\u0000\uF266\uF042\uE398\uF169\uE85B\uE2A8"+ - "\u0000\u0000\u0000\u0000\uE9A3\u0000\u0000\u0000"+ - "\uE76B\u0000\uF7CE\uEFD5\uECD1\u0000\u0000\uE44C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE73C\uF4CC"+ - "\u0000\uE1FB\uF666\u0000\uEEF5\uEF91\uECF9\uE44B"+ - "\uF4F3\uECFB\u0000\uEA60\uE240\u0000\uE699\uF3D9"+ - "\u0000\u0000\u0000\u0000\u0000\uF5C1\uE954\u0000"+ - "\uF5BB\u0000\uEA61\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE976\u0000\u0000\uEA62\u0000\u0000\uF1E2"+ - "\uF298\uF05F\uF37E\uECFC\u0000\uE4DF\uE4F4\uEBB3"+ - "\u0000\uEBB4\u0000\u0000\u0000\u0000\uF563\u0000"+ - "\u0000\uEAC6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEFD6\u0000\u0000\u0000"+ - "\uE8AB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF636\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uECB9\uF0C5\uF539\uE1B6\uE49B\u0000\uE83D\uE473"+ - "\uE2D1\u0000\u0000\u0000\u0000\uE0DC\uE19C\u0000"+ - "\uE2DD\u0000\u0000\uEF39\u0000\uECBB\uECBA\u0000"+ - "\u0000\uEB6A\u0000\u0000\u0000\uF299\u0000\u0000"+ - "\u0000\u0000\u0000\uE943\u0000\u0000\u0000\u0000"+ - "\uE4F5\u0000\uE6A6\u0000\uF645\uE6DB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBD5\u0000\u0000\uE57A"+ - "\u0000\uEAA3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF9DF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE399\uF1D4\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE0AA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uED6B\u0000\uEBFB\uE0A2\u0000\u0000\u0000"+ - "\u0000\uE4E0\u0000\uED4F\u0000\uF8C0\u0000\uE84E"+ - "\uED5D\u0000\uE649\u0000\u0000\u0000\uF2C0\u0000"+ - "\uEBFC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF649\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAC7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uED41\u0000\u0000\u0000\u0000\u0000\u0000\uE977"+ - "\uE978\u0000\u0000\u0000\uF866\u0000\uE4F6\u0000"+ - "\u0000\u0000\u0000\uF3DA\u0000\uF894\u0000\u0000"; - - private final static String innerIndex2= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC9F"+ - "\u0000\u0000\u0000\u0000\u0000\uE5CF\uE39A\u0000"+ - "\u0000\uE1DF\u0000\u0000\uF5CB\u0000\uED92\uE0AB"+ - "\u0000\uE6C4\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uECA0"+ - "\u0000\uE9DA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE83E\uE07E\u0000\u0000\u0000"+ - "\uE5B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uECA1\u0000\u0000\uEF73\u0000\u0000\uF4AB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2A9"+ - "\u0000\u0000\u0000\uE4F7\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE593\u0000\u0000"+ - "\uE274\u0000\uEF94\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEDF5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEEAE\u0000\uE64A\u0000\uEAEC\uED50\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF74\u0000\u0000"+ - "\u0000\u0000\uE745\u0000\u0000\u0000\uED6C\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF549\uF3B6\u0000"+ - "\u0000\uEC6E\uEBB5\u0000\u0000\uE1EF\uF3A7\uE275"+ - "\uE0DD\u0000\u0000\uE7E3\u0000\u0000\uF4AC\u0000"+ - "\u0000\uE39B\uF13B\uEA63\uF6E9\u0000\u0000\uF7F5"+ - "\u0000\u0000\u0000\u0000\u0000\uEBDE\uE0EE\u0000"+ - "\u0000\u0000\uECBC\uF766\u0000\u0000\uE8EE\u0000"+ - "\u0000\u0000\u0000\u0000\uF9F1\u0000\u0000\u0000"+ - "\u0000\uF6B6\u0000\u0000\u0000\u0000\uF56E\u0000"+ - "\u0000\uF47D\u0000\uE8D9\u0000\uF338\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBFD\u0000\u0000"+ - "\u0000\u0000\u0000\uEA64\u0000\uEB3C\u0000\u0000"+ - "\u0000\u0000\u0000\uF1E3\u0000\u0000\uE4E1\u0000"+ - "\uEAC8\u0000\u0000\u0000\u0000\uE7B6\u0000\uF9AC"+ - "\uF2D3\u0000\u0000\u0000\uED51\uF77B\u0000\uE8AC"+ - "\u0000\u0000\u0000\u0000\uF956\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE73D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF64A"+ - "\u0000\uE8DF\uE4D3\uF757\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE05E\uF751\uE444\u0000\u0000\uE944"+ - "\uF849\uE05F\u0000\uF943\uF07A\uF07B\uE39C\u0000"+ - "\u0000\u0000\u0000\u0000\uF1E4\u0000\u0000\uE9E7"+ - "\u0000\u0000\uEAC9\u0000\u0000\u0000\u0000\uEAED"+ - "\u0000\u0000\u0000\u0000\u0000\uF24C\u0000\uF2C1"+ - "\u0000\u0000\uE162\u0000\uE9A4\u0000\u0000\u0000"+ - "\uEACA\u0000\u0000\u0000\u0000\u0000\uE4F8\uF3A8"+ - "\u0000\u0000\u0000\uE1B7\u0000\uF2D4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uED6D\uEAEE\uE0AC"+ - "\uEFBC\u0000\u0000\u0000\u0000\u0000\uF07C\u0000"+ - "\u0000\u0000\uEACB\u0000\u0000\u0000\u0000\u0000"+ - "\uF7BF\uE63F\uE5C6\u0000\u0000\u0000\u0000\u0000"+ - "\uE2AA\u0000\u0000\uE239\u0000\u0000\uE69A\u0000"+ - "\u0000\u0000\uF3B7\uF29A\u0000\u0000\u0000\uE7D9"+ - "\uF4DF\u0000\uF758\uE256\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE5E6\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF576\u0000\u0000\uEE55\uF2D5"+ - "\u0000\u0000\uE0EF\uF96F\u0000\u0000\u0000\u0000"+ - "\u0000\uE937\u0000\u0000\uE677\u0000\u0000\u0000"+ - "\u0000\u0000\uF759\u0000\u0000\u0000\u0000\uECD2"+ - "\u0000\uECBD\u0000\uE2E1\uF350\uF16A\u0000\uE9D7"+ - "\uF8F0\u0000\u0000\uF13C\u0000\u0000\u0000\uF339"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF867\uF8C1"+ - "\u0000\uE450\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEDB0\u0000\u0000\u0000\uF1E5\u0000\u0000"+ - "\u0000\u0000\uE0AD\u0000\uF7B0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF6A5\u0000\uE0AE\u0000\uE83F\u0000\uE746\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4A7\uF8B2"+ - "\u0000\uF9C4\u0000\uF13D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8A1\u0000\u0000\u0000\uEDE9\uEFEE"+ - "\u0000\uF4F4\uF795\uF351\uEA3F\uF740\u0000\u0000"+ - "\uF4E0\uEEAF\u0000\u0000\u0000\u0000\u0000\uE8AD"+ - "\u0000\uEE45\u0000\u0000\uF7A8\u0000\u0000\uE9D8"+ - "\uEF69\uF2D6\u0000\u0000\u0000\uE4E2\u0000\uEC6F"+ - "\u0000\u0000\uF970\uE6C8\uF9AD\u0000\u0000\u0000"+ - "\uEAEF\uE163\uE4F9\u0000\u0000\u0000\u0000\uE592"+ - "\uE8C7\uEA65\u0000\u0000\u0000\u0000\uF396\u0000"+ - "\uE5D0\uEDD9\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF957\uE966\uEC70\u0000\u0000\u0000\uE840\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF4A3\u0000\uE4EC"+ - "\u0000\uF55B\u0000\u0000\u0000\uF9C5\u0000\u0000"+ - "\u0000\u0000\u0000\uECFD\u0000\uF7B1\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE39D\uF16B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF5BC\uF434"+ - "\uE75E\uE75F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5F7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF671\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE447\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF8EC\u0000\uE9C8"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED78"+ - "\u0000\u0000\uE451\u0000\u0000\u0000\uF767\u0000"+ - "\u0000\u0000\u0000\u0000\uE64B\uEA66\u0000\u0000"+ - "\uF6BD\uF13E\u0000\u0000\u0000\uE371\u0000\uEB97"+ - "\uF043\u0000\uE266\u0000\u0000\u0000\u0000\uE135"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF198\uEC71\uECBE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF958\u0000\u0000"+ - "\uE1F0\u0000\uF7F6\u0000\u0000\uEAF0\u0000\u0000"+ - "\u0000\uEDBF\u0000\u0000\u0000\uE24F\u0000\u0000"+ - "\u0000\u0000\uF971\uF1B0\uF9D1\uF64B\u0000\u0000"+ - "\uF7CF\uF0DA\uE051\u0000\uE448\uE1F1\u0000\uECD3"+ - "\uF9E6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE7D\u0000\u0000"+ - "\u0000\uECFA\u0000\u0000\uF33A\uF7D0\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF972\u0000\uF737\u0000"+ - "\u0000\u0000\uEBE5\uF29B\u0000\u0000\u0000\uEEF6"+ - "\uF07D\u0000\u0000\uF944\uF5C2\u0000\u0000\uE6DC"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF397\u0000\uE9E8\uE4ED\uF5FC\u0000\uE84F\u0000"+ - "\uE19D\u0000\u0000\u0000\uE4FA\uF534\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF2D7\u0000\uE553"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF8E3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8ED\u0000\uEB3D\u0000\u0000\uF07E"+ - "\uF8B3\uED52\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF677\uE46D\u0000\uEACC\u0000\u0000\uF959\u0000"+ - "\u0000\uEDA9\uEB98\uF643\u0000\u0000\u0000\u0000"+ - "\u0000\uEBFE\u0000\u0000\u0000\u0000\uE0F0\u0000"+ - "\uF091\uF092\u0000\u0000\u0000\uE850\uF744\uF0F2"+ - "\u0000\u0000\u0000\u0000\u0000\uED53\u0000\u0000"+ - "\u0000\u0000\uEFD7\uED93\u0000\u0000\u0000\uE091"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE267"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF95A\u0000\u0000\u0000\uF4E1\u0000\u0000\uE0C4"+ - "\u0000\u0000\u0000\u0000\uECE5\u0000\uE0C5\uF044"+ - "\u0000\u0000\uEFBD\u0000\uE6C9\u0000\u0000\uF0DB"+ - "\uF1B1\u0000\uE153\uF6BE\uF95B\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF796\u0000\uE7B7\u0000\u0000"+ - "\uF4D3\uF4D4\u0000\u0000\u0000\uF6E4\u0000\uF6D1"+ - "\u0000\u0000\uE747\uE241\uE052\u0000\u0000\uF8B4"+ - "\uE0C6\u0000\u0000\uF398\u0000\u0000\uE5E7\u0000"+ - "\uF060\u0000\u0000\u0000\u0000\u0000\uE164\uE0AF"+ - "\u0000\u0000\u0000\u0000\u0000\uF53A\uEFAF\u0000"+ - "\u0000\uF5C3\uEFD8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9E9\u0000\u0000\u0000\uF3F3\u0000"+ - "\uE5FB\uEA4B\u0000\u0000\uF59D\u0000\u0000\u0000"+ - "\uF9F3\uF9F2\uF6A6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9C9\u0000\u0000\uE563"+ - "\u0000\uE138\u0000\uE851\uE165\u0000\uE7E4\u0000"+ - "\u0000\u0000\uF85A\u0000\u0000\u0000\uEDE3\u0000"+ - "\u0000\u0000\uE4BC\u0000\u0000\u0000\uE092\u0000"+ - "\u0000\u0000\u0000\uE354\u0000\u0000\u0000\uE060"+ - "\uF83B\uF0EB\uEEF8\uE7E5\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE3D7\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF4A4\u0000\u0000\u0000\uE59D\uF973"+ - "\uF868\u0000\uF4D5\u0000\uE2AB\u0000\u0000\uF0F3"+ - "\uE5FC\u0000\u0000\u0000\u0000\u0000\u0000\uE4D4"+ - "\uE1FC\u0000\uE7E6\u0000\uEC9B\uEC31\uF0D4\u0000"+ - "\uEB99\uED42\uE19E\u0000\u0000\u0000\uF8E4\u0000"+ - "\u0000\u0000\uF53B\u0000\u0000\u0000\u0000\uE34D"+ - "\u0000\uE093\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF2B8\u0000\u0000\u0000\uE6C0\u0000"+ - "\uF29C\uF9F4\u0000\u0000\uE4E3\u0000\uF8C2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5E8\uE8AE"+ - "\uEBB6\uF747\u0000\u0000\u0000\u0000\u0000\uEB4F"+ - "\uF8C3\uE9EA\u0000\uEC32\u0000\uF236\u0000\u0000"+ - "\u0000\u0000\u0000\uF678\u0000\u0000\u0000\u0000"+ - "\uF697\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE9CA\u0000"+ - "\u0000\uE372\u0000\u0000\u0000\u0000\uE9A6\u0000"+ - "\u0000\uE9EB\u0000\u0000\uED9B\u0000\u0000\uECAF"+ - "\uE39E\u0000\u0000\u0000\uF59E\u0000\u0000\u0000"+ - "\u0000\uE14C\uF6EA\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEDE4\uEAF1\u0000\u0000\uF6E1\u0000\uF7F7"+ - "\uF2B9\u0000\u0000\uF768\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7A9\u0000\u0000\u0000\u0000"+ - "\u0000\uF769\u0000\u0000\u0000\uF24D\u0000\u0000"+ - "\u0000\uE756\u0000\u0000\uED73\uF5CE\u0000\u0000"+ - "\u0000\u0000\uE9D9\u0000\u0000\u0000\u0000\uE7E7"+ - "\uE449\uE5C3\u0000\u0000\uE875\uE860\u0000\uE3D9"+ - "\uE268\u0000\uE0DE\uF53C\uE89D\u0000\uF679\uEF95"+ - "\uE2AC\uF392\u0000\uF59F\uE8C8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE250\uECD4\uE3CF\uF3F5"+ - "\u0000\uE1F2\u0000\uE2EB\u0000\u0000\u0000\uE1B8"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uECA6\uE3DA"+ - "\u0000\uF435\u0000\u0000\u0000\u0000\u0000\uF436"+ - "\u0000\uED5E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE4FB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF3A9\u0000\u0000\u0000\uF459"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF2D8\uEE59\u0000\uE748\uF895\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF4B5\u0000\u0000\uF734\u0000\u0000\uE3F3"+ - "\uEE58\u0000\u0000\u0000\u0000\uF76A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE979"+ - "\uEA67\u0000\u0000\u0000\u0000\u0000\uE0DF\u0000"+ - "\u0000\u0000\uE2EC\u0000\u0000\u0000\u0000\uF56F"+ - "\u0000\u0000\uE3F4\uE44A\u0000\u0000\u0000\uEAF2"+ - "\u0000\u0000\u0000\uEBB7\u0000\u0000\u0000\u0000"+ - "\uEC33\uE4FC\u0000\u0000\uF1E6\u0000\u0000\u0000"+ - "\u0000\u0000\uE8C9\u0000\u0000\u0000\uED9C\u0000"+ - "\uE2DE\u0000\u0000\uE260\u0000\u0000\u0000\u0000"+ - "\uE5D3\uF4F5\uF6AE\u0000\u0000\uF2C8\u0000\uE1F3"+ - "\uF5CF\uEDF3\uF352\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE061\u0000\u0000\u0000\uF093\u0000\uE336\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7DA"+ - "\uF33B\u0000\u0000\u0000\u0000\u0000\uF0E7\u0000"+ - "\u0000\u0000\uEDC0\uF945\u0000\u0000\u0000\u0000"+ - "\u0000\uED54\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE139\uF9C6\u0000"+ - "\u0000\u0000\u0000\u0000\uF045\u0000\uEDAA\uEABA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBDF\u0000\uE861"+ - "\u0000\u0000\u0000\u0000\uEBB8\u0000\uEF96\uE4FD"+ - "\u0000\u0000\u0000\u0000\uEC34\u0000\u0000\u0000"+ - "\u0000\u0000\uF45A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE876\uF6B3\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF9CD\u0000\u0000\u0000\uF4B6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF267\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5C4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE734\u0000\u0000\u0000\u0000\u0000\uF437"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7B8\uE7B9\uF2C9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE65E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6CB\uEAAE\uEF97\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE445\u0000\u0000\u0000\uE4D5\u0000"+ - "\u0000\u0000\u0000\u0000\uF55C\uE89E\u0000\u0000"+ - "\u0000\u0000\u0000\uE7E8\u0000\uF6EB\uF5C9\u0000"+ - "\uF4BC\u0000\uE862\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE4B5\u0000\u0000\u0000\u0000"+ - "\u0000\uEF46\u0000\u0000\uE65F\uF54A\u0000\uF6C9"+ - "\u0000\u0000\uE13A\u0000\u0000\uF353\uE166\u0000"+ - "\u0000\u0000\uE363\u0000\uE4BD\u0000\u0000\u0000"+ - "\uE8FB\u0000\uE0E0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE4E4\uF699\u0000\u0000\uE5BA\uF4CD\uE0E1"+ - "\u0000\u0000\u0000\u0000\uF0F4\u0000\u0000\u0000"+ - "\u0000\u0000\uF53D\u0000\uF93A\u0000\u0000\u0000"+ - "\u0000\u0000\uF6EC\u0000\u0000\u0000\uEF98\u0000"+ - "\uE877\u0000\u0000\u0000\uF6CC\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDC1\u0000\u0000\u0000\u0000\uEB7E\u0000\u0000"+ - "\u0000\u0000\u0000\uE5FD\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE276\uF93B\uE5BB\u0000\u0000\uF438"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEC35\uE1B9"+ - "\uF094\uE0C7\u0000\uE1F4\u0000\u0000\uE8AF\uF2D9"+ - "\u0000\u0000\u0000\u0000\u0000\uE1BA\u0000\u0000"+ - "\uF99B\u0000\u0000\u0000\u0000\uEAF3\uE277\uE852"+ - "\u0000\uE2AD\u0000\u0000\u0000\u0000\uEEF9\uF738"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF4E2\u0000"+ - "\u0000\u0000\uE094\uEAA4\u0000\u0000\uE554\u0000"+ - "\u0000\u0000\u0000\u0000\uE167\uEDC2\u0000\u0000"+ - "\u0000\u0000\uE1BB\u0000\uF2DA\uF268\u0000\uE9A7"+ - "\uEC36\u0000\u0000\u0000\u0000\u0000\uEB50\u0000"+ - "\u0000\u0000\uE640\uF75A\u0000\uF99C\u0000\uE7FE"+ - "\u0000\u0000\u0000\u0000\uEA40\u0000\u0000\u0000"+ - "\uE9EC\uE878\u0000\u0000\u0000\u0000\u0000\uE570"+ - "\u0000\uE69B\u0000\uE1D7\uEA68\u0000\u0000\uF49A"+ - "\u0000\uED66\u0000\u0000\uE355\uF53E\u0000\uE9A8"+ - "\u0000\u0000\u0000\uF1C5\uF4D6\u0000\u0000\uEA69"+ - "\uECE6\u0000\u0000\u0000\u0000\u0000\u0000\uE4A8"+ - "\u0000\uE8B0\u0000\u0000\uEDDA\uECBF\u0000\u0000"+ - "\u0000\uE8B1\u0000\u0000\u0000\uE5E9\u0000\u0000"+ - "\u0000\u0000\u0000\uEB51\uF2DB\u0000\u0000\uF379"+ - "\u0000\u0000\uE6B2\u0000\u0000\u0000\u0000\uE39F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7E9\u0000\u0000\uE3A0\u0000\uF17D\uE4A9\u0000"+ - "\uF439\uF354\u0000\u0000\uEC72\uEFEF\u0000\u0000"+ - "\u0000\uF7D1\u0000\u0000\uEFD9\u0000\u0000\u0000"+ - "\u0000\u0000\uEF6A\uE853\uE854\uE555\u0000\uEEFA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE1E0\uECB0"+ - "\u0000\uE8B2\uF8C4\u0000\uF4E3\u0000\uE7A5\uF8E7"+ - "\uE9CB\uE364\u0000\uEE46\uEB3E\uF9DA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE945\uEB9A"+ - "\uEEB1\u0000\u0000\u0000\u0000\uF5F0\u0000\uE76C"+ - "\uF1C6\u0000\u0000\u0000\u0000\uEBB9\u0000\uECC0"+ - "\uF7C0\uEFF0\u0000\u0000\uE7DB\u0000\uF4E4\u0000"+ - "\u0000\u0000\uE946\uED79\u0000\u0000\u0000\u0000"+ - "\u0000\uF355\uECC1\uF95C\uF95D\u0000\u0000\u0000"+ - "\u0000\uF45B\u0000\uF45C\u0000\u0000\u0000\uED5F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF3DB\u0000\uF869\u0000\uF3B8\uF9F5\uEB9B"+ - "\u0000\u0000\u0000\u0000\uEEFB\uF947\uF974\uF8C5"+ - "\uECE7\uE749\u0000\uF69A\u0000\u0000\uE955\uE168"+ - "\u0000\u0000\u0000\uEB3F\uF577\u0000\uF2DC\uE2FC"+ - "\uF2DD\u0000\uF43A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF9BE\u0000\u0000\uE03C"+ - "\uF9BB\uF9C7\u0000\u0000\u0000\u0000\uEEB2\u0000"+ - "\uF061\uEAF4\u0000\u0000\u0000\u0000\uE3EC\uED6E"+ - "\uEDC3\u0000\u0000\u0000\u0000\uE7A6\u0000\u0000"+ - "\uE1BC\u0000\uF4E5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF1D5\u0000\u0000\uE7BA\u0000"+ - "\u0000\u0000\uF1E7\uF8B5\uF77C\u0000\u0000\u0000"+ - "\u0000\uEB77\u0000\uE169\u0000\u0000\uE556\u0000"+ - "\u0000\u0000\u0000\u0000\uEEA5\u0000\uE5F5\uE4BE"+ - "\u0000\uF99D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED94\u0000"+ - "\u0000\uEAF5\u0000\u0000\uEF9A\uF77D\u0000\u0000"+ - "\uE257\u0000\u0000\u0000\u0000\u0000\uF9F6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEF68\u0000\uE1D8\uEED6\uE16A\u0000\u0000\uE073"+ - "\uEAF6\uF357\uF356\u0000\uE74A\u0000\uF3F4\uF592"+ - "\uF5CC\u0000\u0000\uF975\u0000\u0000\u0000\u0000"+ - "\uF055\uF095\u0000\uE9DB\u0000\uE967\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEA9F\uF49B\u0000\uE5C7"+ - "\u0000\u0000\u0000\uE760\u0000\uF358\uE3A1\uE3A2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE7D4\uE678"+ - "\uE7CA\u0000\uE841\uE757\uE972\uF4CE\uF5F4\u0000"+ - "\u0000\uF3B9\u0000\u0000\uE863\u0000\uF67A\u0000"+ - "\u0000\u0000\uE2F5\u0000\u0000\uF9AE\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE062\u0000"+ - "\u0000\uEAB4\u0000\u0000\u0000\u0000\uE6DD\uF84A"+ - "\uF237\uF5BD\u0000\uF797\u0000\u0000\uF1E8\u0000"+ - "\u0000\u0000\u0000\u0000\uE571\u0000\uE3A3\uEBD6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF7F8\u0000\uE8CA"+ - "\uE0F9\uE564\u0000\uE7DC\u0000\uF24E\u0000\uF6ED"+ - "\u0000\u0000\u0000\uE47E\u0000\u0000\uEBE6\uF6F9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE9ED"+ - "\u0000\uEF6B\u0000\uE8B3\u0000\u0000\u0000\uE3F7"+ - "\uEB40\u0000\u0000\uE572\u0000\uF667\u0000\uE6F9"+ - "\u0000\u0000\uE76D\u0000\uE1FD\uF43B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1BD"+ - "\uF752\u0000\u0000\uF43C\u0000\u0000\uE03D\uE03E"+ - "\uE2AE\u0000\u0000\u0000\u0000\u0000\uECC2\u0000"+ - "\u0000\u0000\u0000\u0000\uE947\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8DA"+ - "\uE7BB\uE095\uF663\uEE9A\uF097\u0000\u0000\u0000"+ - "\u0000\u0000\uF098\u0000\u0000\uF69B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE2AF\u0000\u0000\uE063\u0000\u0000\uE03F"+ - "\uE440\uF3BA\u0000\uE6B3\uECC3\uF4FD\uEA6A\u0000"+ - "\u0000\u0000\u0000\uEA6B\u0000\u0000\uF2DE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEC73\uF29D\u0000\u0000\uEAF7\uE6CA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE278\uE8DB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3BB\u0000\u0000\u0000\u0000\uEFF1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF847\uE356\u0000\u0000\uE13B\uF238\u0000\u0000"+ - "\uE0FA\uF7F9\uE19F\uE4FE\u0000\u0000\u0000\u0000"+ - "\uED60\u0000\u0000\u0000\u0000\u0000\uF47E\u0000"+ - "\uE565\uEACD\u0000\uF948\uE3D0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF45D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF6D2\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE064"+ - "\u0000\uE5D9\u0000\u0000\u0000\uE76E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1D9"+ - "\u0000\u0000\u0000\uF239\uF64C\u0000\u0000\uE16B"+ - "\u0000\u0000\u0000\u0000\u0000\uF359\u0000\uF99E"+ - "\u0000\uEF59\uF5A0\u0000\u0000\u0000\u0000\uEEFC"+ - "\uE6DE\u0000\u0000\u0000\u0000\uEA6C\u0000\uF33C"+ - "\uE1A0\uE1E1\u0000\uEBBA\u0000\uE8EF\uE842\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE3A5\uE948\u0000\u0000"+ - "\u0000\uE798\u0000\uE3A4\u0000\uE1E2\u0000\u0000"+ - "\u0000\u0000\uE97A\u0000\u0000\uF399\u0000\uF35A"+ - "\uE34E\u0000\uE9DC\u0000\u0000\u0000\u0000\uE566"+ - "\uE4D6\u0000\u0000\u0000\u0000\u0000\u0000\uF1D0"+ - "\uE1A1\u0000\u0000\u0000\u0000\u0000\uEAB5\u0000"+ - "\u0000\u0000\uEAF8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE531\uE242\u0000\u0000\u0000\u0000\u0000"+ - "\uEF5A\u0000\u0000\u0000\u0000\uF0F5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECD5\uF5D0\u0000"+ - "\u0000\u0000\uF5A1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7A7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDAB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE5B\u0000\uF5F1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEDC5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7A3\uEB6B\uF67B\u0000\uE0F1"+ - "\u0000\uE7EA\uF5A2\u0000\u0000\u0000\uE6D1\u0000"+ - "\uE3F8\uF09A\uF09B\uE843\u0000\u0000\u0000\u0000"+ - "\uF2DF\u0000\u0000\uF3EF\u0000\uEDF6\uF24F\uEC74"+ - "\u0000\u0000\u0000\u0000\u0000\uE34F\u0000\uF83C"+ - "\uF5D1\uEEB3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFBE\u0000\u0000"+ - "\u0000\u0000\u0000\uF45E\uE8B4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF95E\u0000\uE9EE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEEB4\u0000"+ - "\u0000\u0000\u0000\u0000\uE6B4\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF6B4\u0000\u0000\u0000\u0000"+ - "\u0000\uE1BE\u0000\uE879\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE2B0\uF6D9\uF4E6\u0000\u0000"+ - "\uE269\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE23A\u0000\uE0C8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE337\u0000\uF35B\u0000\uE357"+ - "\u0000\u0000\uED55\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE8E0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE5DA\u0000\uE6A7\u0000\u0000\u0000\uF250"+ - "\u0000\uF798\u0000\u0000\u0000\u0000\uF5D2\uF1E9"+ - "\u0000\uE7BC\u0000\uEDC6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5A3\u0000\u0000"+ - "\uE864\uEC37\uF8FC\u0000\u0000\uF3DC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE096\u0000\u0000\u0000"+ - "\uEF9C\u0000\u0000\uE279\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFF8\uEC75\u0000\u0000\u0000\u0000"+ - "\uE349\uE594\u0000\u0000\u0000\u0000\u0000\uE3A6"+ - "\u0000\uEACE\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF996\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE4AA\u0000\u0000\u0000\uE13C\u0000\u0000\u0000"+ - "\u0000\uF2E0\u0000\u0000\u0000\uEDE5\uE365\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8FC"+ - "\u0000\u0000\u0000\u0000\uF976\u0000\u0000\u0000"+ - "\u0000\u0000\uE0FE\uF1EA\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA41\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7E3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE532\uE2F6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE660\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5EA\uF3EE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF85B\u0000"+ - "\u0000\u0000\u0000\uEDA1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE5B1\u0000\u0000\u0000"+ - "\u0000\u0000\uE2ED\u0000\uF1EB\u0000\u0000\u0000"+ - "\u0000\u0000\uE5B2\u0000\u0000\u0000\uE5BC\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF9E2\uF4AD\u0000\uF9DB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFB0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE3A7\u0000\u0000\uF9E3\uE243\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF9E4\uF85E"+ - "\u0000\u0000\u0000\u0000\uE040\u0000\uF6A7\u0000"+ - "\uE2B1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE32"+ - "\u0000\uF946\uF43D\uF2E1\uF4AE\uE956\uE7EB\u0000"+ - "\u0000\u0000\uEF70\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEBA8\u0000\u0000\u0000\u0000\uE5F6"+ - "\uE2FD\u0000\u0000\uEA6D\u0000\u0000\u0000\uE7D1"+ - "\u0000\u0000\u0000\uED7A\uF45F\u0000\uF6BF\u0000"+ - "\u0000\uEC76\uEC38\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uECD6\u0000"+ - "\uF1D1\u0000\u0000\u0000\u0000\u0000\uEFF9\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE641\uEA42"+ - "\u0000\u0000\uEB78\u0000\u0000\uE4AB\u0000\uF0DC"+ - "\u0000\u0000\uEAAF\u0000\uE053\u0000\u0000\uF29E"+ - "\u0000\uF9C3\u0000\u0000\u0000\uF0F6\uE2B2\u0000"+ - "\u0000\u0000\u0000\uE7EC\u0000\uE7BD\u0000\uE76F"+ - "\u0000\u0000\uE548\uF0BE\uE9EF\u0000\uE9F0\uE9F1"+ - "\uE9F2\u0000\u0000\uE7BE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8C6\uE2B3\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF29F\u0000\u0000\u0000\u0000\u0000\u0000\uED3B"+ - "\u0000\uE855\u0000\uE77C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE3A8\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC39\u0000\u0000\uEA4C"+ - "\uEEB5\u0000\u0000\u0000\u0000\u0000\uE8F0\u0000"+ - "\uF2E2\uF3F0\uE2B4\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE8F1\u0000"+ - "\uEB41\u0000\u0000\u0000\u0000\uEAA5\u0000\uF7D2"+ - "\u0000\u0000\uEEFD\u0000\u0000\uEE33\uF8F1\uE0B0"+ - "\uF43E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE1E7\u0000\uEF6C\u0000\u0000\uEED7\u0000\u0000"+ - "\uF6C0\u0000\uE373\u0000\u0000\u0000\uE831\u0000"+ - "\u0000\u0000\uE14D\u0000\u0000\uE3A9\uE9CC\u0000"+ - "\u0000\uECFE\uE3AA\uEF3A\u0000\uF046\uF7FA\uEE5C"+ - "\uF668\u0000\u0000\u0000\uE557\u0000\u0000\u0000"+ - "\uE7CB\u0000\uE7D2\uE4CB\uE799\uE839\uF5F8\u0000"+ - "\u0000\uEA6E\uF43F\uF739\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE758\u0000\u0000\uF251\u0000"+ - "\u0000\u0000\u0000\uF7C1\u0000\u0000\u0000\u0000"+ - "\uE9F3\uF09C\u0000\uF64D\uEBBB\uE1BF\uF564\uEE5D"+ - "\u0000\uF95F\uF8A2\u0000\uEB6C\u0000\u0000\u0000"+ - "\u0000\uF54B\uE865\u0000\uF7B2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8F2\u0000\uE8F6\u0000\uEA6F"+ - "\u0000\u0000\u0000\uE8F2\u0000\u0000\u0000\u0000"+ - "\u0000\uF76C\uF6EE\uF0E8\u0000\uE49C\u0000\u0000"+ - "\uF3BC\u0000\u0000\uF86A\u0000\u0000\uE87A\uE856"+ - "\uF6C1\u0000\u0000\uEEB6\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static String innerIndex3= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEDC7\uE63C\u0000\u0000\u0000"+ - "\u0000\uE957\u0000\u0000\u0000\u0000\u0000\uEBA9"+ - "\u0000\uEC3A\u0000\uE5A6\u0000\u0000\uE567\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF460\u0000\uF09D"+ - "\u0000\uEB6D\uF8F3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3BD\u0000\u0000\uEC77\uF9D7\u0000"+ - "\uE258\uF047\u0000\uF950\u0000\uF9E7\uF6EF\u0000"+ - "\u0000\uE6B5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF2BA\uF3DD\u0000\uEA43\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEF5B\u0000\u0000\uF76D\u0000"+ - "\u0000\uF8C7\uE5C8\u0000\uE6DF\u0000\uE9A9\u0000"+ - "\u0000\u0000\u0000\u0000\uEFB1\u0000\u0000\uF83D"+ - "\uF669\uF896\u0000\u0000\u0000\u0000\u0000\uF73A"+ - "\u0000\u0000\u0000\u0000\u0000\uEE7E\u0000\uE16C"+ - "\uEBBC\uEB91\u0000\u0000\uEFBF\uF99F\uEE5E\u0000"+ - "\u0000\uEBD7\u0000\uEE5F\u0000\uF593\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED95"+ - "\u0000\u0000\uED9D\u0000\u0000\uF7E4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF2E3\u0000\u0000\uE2EE\uF64E\uEB42\uF9A0\uE3AB"+ - "\u0000\u0000\u0000\uE6FA\u0000\u0000\u0000\uF8C8"+ - "\u0000\uEC67\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE533\uF39A\uE6A8\u0000\u0000\u0000\uEBE7\u0000"+ - "\u0000\uE4BF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF2E4\u0000\uE6C5\uF0E2\u0000\u0000\uF977\u0000"+ - "\u0000\uED32\u0000\uEC78\u0000\uEE60\u0000\uF8E8"+ - "\uF578\uEDF4\uF54C\uF565\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEAB6"+ - "\u0000\uF949\uF252\uE097\u0000\u0000\u0000\uF2E5"+ - "\uE0E2\uE534\u0000\uEA70\uE89F\uED56\uEF4E\u0000"+ - "\u0000\u0000\u0000\uEB6E\uF644\uF062\u0000\uF7FB"+ - "\u0000\u0000\uEB52\u0000\uE074\u0000\uEEB7\u0000"+ - "\uF09F\u0000\uE7DD\u0000\uE844\uF23A\uF8E9\u0000"+ - "\u0000\u0000\u0000\uE8CB\uE845\u0000\u0000\u0000"+ - "\u0000\u0000\uF3BE\u0000\u0000\uE4AC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF8C9\u0000"+ - "\uEACF\u0000\u0000\uE4C0\uECD7\u0000\uF2E6\uF960"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEFC0"+ - "\u0000\u0000\u0000\uF5D3\u0000\u0000\uF16C\uF6B7"+ - "\u0000\u0000\uF048\uE3F9\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE958\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF049\u0000\u0000\u0000\u0000\u0000\uF3DE\u0000"+ - "\u0000\u0000\u0000\u0000\uE6B6\uE2B5\u0000\uE7A8"+ - "\u0000\u0000\uF17E\u0000\u0000\uE9AA\u0000\u0000"+ - "\u0000\u0000\uE1A2\uEF3E\u0000\u0000\u0000\uEBBD"+ - "\u0000\uF461\u0000\u0000\u0000\u0000\uEFC1\u0000"+ - "\u0000\u0000\uE49E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE8B5\u0000\uF4E7\uE7A0\u0000\u0000"+ - "\u0000\uF961\u0000\uF1B2\uF53F\u0000\uF8A3\u0000"+ - "\u0000\uF951\u0000\uF23B\uE535\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF594"+ - "\u0000\u0000\u0000\u0000\uF269\u0000\u0000\u0000"+ - "\uF8CA\u0000\u0000\u0000\u0000\u0000\uE1E3\uE74B"+ - "\u0000\uEDDB\uF799\u0000\u0000\u0000\uF664\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6A9"+ - "\u0000\uE0C9\u0000\u0000\uEE61\uF35C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE73E\u0000\uF7D3\uE5FE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE74C\uF440\u0000\u0000\u0000"+ - "\u0000\uEC3B\uF4E8\u0000\u0000\u0000\u0000\u0000"+ - "\uF2C2\u0000\u0000\u0000\u0000\u0000\u0000\uF1EC"+ - "\u0000\uEEB8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE8A0\u0000\u0000\uE14E\u0000\u0000\uF49E"+ - "\uE87B\u0000\uEC68\uF1D6\u0000\u0000\uE661\uEB43"+ - "\u0000\u0000\uF962\u0000\uF0C8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE4C1\uF35D\u0000"+ - "\uE2F7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF1D2\u0000\uE568\uE959\uE6F1\u0000"+ - "\u0000\uEABB\u0000\u0000\uF4A5\u0000\u0000\u0000"+ - "\uF55D\u0000\u0000\u0000\u0000\uF3BF\uF741\u0000"+ - "\uEFFA\u0000\u0000\u0000\uF8CB\u0000\u0000\uE065"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7D4\uF6CA\u0000\u0000\uE658"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF978\uF4BD"+ - "\u0000\uF2A0\u0000\uEEFE\u0000\u0000\u0000\u0000"+ - "\u0000\uE4C2\u0000\u0000\u0000\u0000\uE4B6\u0000"+ - "\uE13D\uF69C\uE642\uE468\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEED8\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECA5\u0000\u0000"+ - "\u0000\u0000\uEEB9\u0000\u0000\u0000\u0000\uF33D"+ - "\uF8CC\uF0A1\u0000\u0000\uE536\u0000\u0000\u0000"+ - "\u0000\uF8CD\u0000\uE5BD\uF3DF\u0000\u0000\uF69D"+ - "\u0000\uEA44\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5EB\u0000"+ - "\u0000\uEDC8\u0000\u0000\u0000\uF8A4\uE549\u0000"+ - "\u0000\uEA71\u0000\uED33\u0000\u0000\u0000\uE6B7"+ - "\u0000\uF77E\u0000\u0000\u0000\uEA45\u0000\u0000"+ - "\uE662\u0000\uF7D5\uEEBA\uF0D5\uE5F7\uF2E7\uEBBE"+ - "\u0000\u0000\u0000\uF83E\u0000\u0000\u0000\uE679"+ - "\uE67E\u0000\u0000\u0000\u0000\u0000\u0000\uEEBB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF15B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5B3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE244\u0000\u0000\u0000"+ - "\uF8A5\uEBEE\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF6A8\u0000\u0000\u0000\u0000\uF8CE\u0000\u0000"+ - "\u0000\u0000\u0000\uE74D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8FD\u0000\u0000\u0000\u0000"+ - "\uF979\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE2B6\u0000\u0000\u0000\uF1C7\uF23C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE16D\u0000\u0000"+ - "\u0000\u0000\uF637\u0000\u0000\u0000\uEE9C\u0000"+ - "\u0000\u0000\uF5A4\u0000\u0000\u0000\u0000\u0000"+ - "\uF9DC\uF1B3\uE259\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF2E8\u0000\u0000\uEBBF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF86B\uE0E3\uF6A9\u0000\uF8A6"+ - "\u0000\u0000\u0000\uE949\u0000\u0000\u0000\uF3C0"+ - "\uF1C8\uF2C3\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE63D\u0000\u0000\uF9CE\u0000\u0000\u0000\uEF31"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF8F4\uE5A7\u0000\u0000\u0000\uF3F6\u0000\uEE63"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE16E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF742\u0000\u0000\u0000\uE97B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF9B6\u0000\u0000\u0000"+ - "\u0000\uEDEA\u0000\u0000\uF3E0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE8CC\uE9CD\u0000\u0000\u0000\uE558\u0000"+ - "\u0000\uE7ED\u0000\u0000\u0000\u0000\uF5A5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEE9D\u0000\u0000\u0000\u0000\u0000\uEE64\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9C8"+ - "\u0000\uE631\uF9BF\u0000\uF963\u0000\uF2A1\u0000"+ - "\uEEBC\u0000\u0000\u0000\u0000\u0000\uE3EE\u0000"+ - "\u0000\uEE65\u0000\u0000\uEFF2\u0000\uEAB0\u0000"+ - "\u0000\u0000\u0000\u0000\uE770\uF94A\uF9AF\uF35E"+ - "\u0000\uE8E1\u0000\u0000\uEDC9\u0000\uF1B4\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEB53\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uECD8\u0000\u0000\u0000"+ - "\u0000\uEFFB\uF038\u0000\u0000\u0000\u0000\uF9B7"+ - "\u0000\u0000\uF8A7\u0000\uEFC2\u0000\u0000\u0000"+ - "\u0000\uF9F7\u0000\u0000\u0000\u0000\u0000\uEC69"+ - "\u0000\u0000\uE97C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEF32\u0000\u0000\u0000"+ - "\u0000\uEE92\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF9F8\uF9F9\u0000\u0000\u0000\uF64F\u0000"+ - "\u0000\uEEA7\u0000\uEE67\u0000\u0000\u0000\u0000"+ - "\uE595\uE559\u0000\u0000\u0000\u0000\uE69C\u0000"+ - "\uE6F2\u0000\uEBC0\u0000\uE8E2\uEE68\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEEBD"+ - "\u0000\u0000\u0000\u0000\u0000\uF35F\uF4BE\uEC3C"+ - "\u0000\u0000\u0000\u0000\u0000\uF5B7\uEB92\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF9B8\uECE8\u0000\uE537\uEF9E"+ - "\uF862\u0000\u0000\u0000\u0000\u0000\uF791\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE663\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE5B4\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF360\u0000\uF6F0\uF243\u0000\u0000"+ - "\uF04A\u0000\uF063\u0000\u0000\uF1C9\uE9AB\u0000"+ - "\u0000\u0000\uEDAC\uF9A1\u0000\uEAD0\uF143\u0000"+ - "\uEAD1\u0000\u0000\u0000\u0000\u0000\uF1ED\uF748"+ - "\uF6FA\u0000\u0000\u0000\uF73B\u0000\u0000\u0000"+ - "\u0000\u0000\uF570\u0000\u0000\u0000\u0000\u0000"+ - "\uE54A\uED43\u0000\uEFDA\u0000\uEA46\u0000\uE7BF"+ - "\u0000\uE7C0\uE691\u0000\u0000\u0000\u0000\uE7CC"+ - "\u0000\uE83A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEAE5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF6E5\u0000\u0000\u0000\uE142\u0000\u0000"+ - "\uEAF9\uE6E0\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE54B\u0000\u0000\u0000\u0000\uF9FA"+ - "\u0000\u0000\u0000\u0000\uE143\u0000\u0000\uE8F3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAD2\u0000\uE25A\u0000\uF26A\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED74\u0000"+ - "\uF8CF\u0000\u0000\u0000\u0000\u0000\u0000\uE2B7"+ - "\u0000\uF253\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE27A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEC3D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE6E1\uF897\u0000\u0000\uE5C9\uF73C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEED9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF4E9\u0000"+ - "\u0000\u0000\u0000\uE77D\uECC4\uF393\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF75\u0000\u0000"+ - "\u0000\uEB9C\uF254\uE7DE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF0A2\uF0A3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF952\uF04B"+ - "\u0000\u0000\u0000\u0000\uEF3B\uEA72\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1EF\u0000\uEF33\u0000\u0000\u0000\u0000\uE2F1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE54C\u0000\uF97A\u0000\u0000\u0000\u0000\u0000"+ - "\uEEBE\u0000\uF994\u0000\u0000\uE644\u0000\u0000"+ - "\uEC3E\u0000\uE4B7\uF85C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF86C\u0000\uF1B5\uEBE3"+ - "\u0000\uEF3C\u0000\uEF6D\u0000\u0000\uF2E9\u0000"+ - "\u0000\u0000\u0000\u0000\uF54D\u0000\uE2B8\uEFDB"+ - "\uE3AC\u0000\u0000\u0000\u0000\u0000\u0000\uE857"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF0C9"+ - "\u0000\uEF5C\u0000\u0000\u0000\uEA47\u0000\u0000"+ - "\u0000\u0000\uE64C\uE4E5\u0000\u0000\u0000\u0000"+ - "\u0000\uF86D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE866\u0000\uE041\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE858\uEAA6\u0000\uF7B3\uF462\u0000\uE054"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE25B\u0000"+ - "\u0000\uE1F5\u0000\u0000\u0000\uF9B0\uE5A8\u0000"+ - "\uF3C1\u0000\u0000\uEC79\uE95A\uF144\uF850\u0000"+ - "\u0000\uF8A8\uE338\u0000\u0000\uE87C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7EE"+ - "\u0000\uEB9D\u0000\u0000\u0000\uF2EA\uF86E\u0000"+ - "\u0000\uEB54\u0000\uE2B9\u0000\uE5CA\uE6E2\uEC3F"+ - "\u0000\uE6B8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEF5D\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF66A\u0000\u0000\u0000\u0000"+ - "\uF2A2\uEC6A\uF69E\u0000\u0000\uF8D0\uE3AD\u0000"+ - "\uE1E4\u0000\uE3AE\uE97D\uEF5E\u0000\uF39B\uE245"+ - "\uEE9E\u0000\u0000\uE6FB\uE366\uE9F5\uF6F1\u0000"+ - "\uF69F\u0000\uE8F7\u0000\u0000\u0000\u0000\uF8EA"+ - "\uEFDC\uE7C1\u0000\uF5F2\uEB55\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF064\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF7C2\u0000\uF04C"+ - "\u0000\uE455\uF8D1\uEEC0\uF0A5\u0000\uEAFA\uECA2"+ - "\uE6B9\u0000\uEFC3\u0000\uEF9F\uEF3F\u0000\u0000"+ - "\uF463\uF8A9\uE735\u0000\u0000\u0000\u0000\uE5CB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE358\u0000"+ - "\u0000\u0000\uE3AF\uE6E3\u0000\u0000\u0000\uEB56"+ - "\u0000\uE632\u0000\uF1F0\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE6F3\u0000\u0000\u0000\uF964\u0000\uE867\uE16F"+ - "\u0000\uF464\u0000\uE3B0\u0000\uE170\u0000\uE8FD"+ - "\uF4BF\u0000\uF361\u0000\u0000\u0000\u0000\u0000"+ - "\uF94B\u0000\uEC40\u0000\u0000\uEE35\u0000\u0000"+ - "\u0000\uEC6B\u0000\u0000\u0000\uEADE\u0000\uEB57"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF491\u0000"+ - "\u0000\u0000\uE171\u0000\u0000\u0000\u0000\uE67A"+ - "\u0000\u0000\u0000\u0000\uEEC2\u0000\u0000\u0000"+ - "\uE246\u0000\uF4C0\u0000\uE1FE\u0000\u0000\u0000"+ - "\uF8D2\u0000\uF79A\uF6FB\u0000\u0000\uEF4F\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEF47\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF1B6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE94A\u0000\u0000\uE144\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF3F7\u0000\u0000\u0000\uEF48\u0000\u0000"+ - "\uE098\u0000\uED34\uF566\u0000\u0000\u0000\uEAE6"+ - "\u0000\u0000\u0000\uEAA7\u0000\uEAE7\uEBC1\u0000"+ - "\uEFC4\u0000\u0000\uE95B\uEFC5\u0000\u0000\u0000"+ - "\uF2A3\uF0A6\uE0A3\uECE9\u0000\u0000\u0000\uE3FB"+ - "\uF2A4\u0000\uF2EB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE344"+ - "\u0000\u0000\u0000\u0000\uE1A3\u0000\u0000\uEF76"+ - "\u0000\uF2A5\u0000\uE4CC\uE87D\u0000\u0000\u0000"+ - "\u0000\uE6BA\u0000\uF465\uF5E5\uE7EF\u0000\u0000"+ - "\u0000\u0000\uF7B4\u0000\u0000\uE5D4\uF9CF\u0000"+ - "\u0000\u0000\uE8E3\u0000\u0000\u0000\u0000\uF3E1"+ - "\uF146\u0000\u0000\u0000\u0000\uF8FE\uE4D7\u0000"+ - "\uE3B1\u0000\uE0B1\u0000\u0000\u0000\u0000\uE3B2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE0B2\uF3C2"+ - "\u0000\u0000\uF571\uF7B5\u0000\u0000\uEBC3\uEBC2"+ - "\u0000\uF0F7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEAA8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE0CA\u0000\u0000"+ - "\u0000\u0000\u0000\uEE49\u0000\u0000\u0000\u0000"+ - "\u0000\uF76E\uF7AA\uE099\u0000\uF1B7\u0000\u0000"+ - "\uE4B8\uF466\u0000\u0000\uE569\uF255\uF492\u0000"+ - "\u0000\u0000\uE042\u0000\u0000\uE94B\u0000\uF3F8"+ - "\u0000\u0000\u0000\u0000\u0000\uF147\u0000\u0000"+ - "\u0000\u0000\uEDCA\u0000\uF650\uF9DD\u0000\u0000"+ - "\uE573\uE172\u0000\uF6D4\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE6E5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE4C3\u0000\uE736\u0000\uF651\u0000\u0000\u0000"+ - "\u0000\u0000\uE9F6\u0000\uE1C0\u0000\u0000\u0000"+ - "\uEDDC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEDCB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEBC4\u0000\u0000\u0000\u0000\u0000\uEF40"+ - "\uF540\uF4EA\uE87E\u0000\uE6BB\u0000\uEC41\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6AA\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE69D\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uED6F\u0000\uE066\u0000"+ - "\u0000\u0000\uF0A8\u0000\u0000\u0000\uE8FE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF652\u0000\u0000\uF2BB\u0000\u0000\u0000"+ - "\u0000\uE59F\u0000\u0000\uEB58\u0000\u0000\u0000"+ - "\uEF49\u0000\uF2A6\u0000\u0000\u0000\u0000\u0000"+ - "\uE1A4\u0000\u0000\uE596\uE8A1\uE8DC\uE8DD\u0000"+ - "\u0000\u0000\u0000\u0000\uF26C\u0000\uE0CB\uF965"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE27B\u0000"+ - "\uE1C1\u0000\u0000\uF8D3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF7AB\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5D4\u0000\u0000\u0000\u0000\uE7A9"+ - "\u0000\u0000\uEFDD\uE8CD\u0000\u0000\uE9CE\u0000"+ - "\uEEC3\u0000\uF15C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF7EC\u0000\u0000\u0000\uE0CC\u0000"+ - "\u0000\u0000\u0000\uEB9E\uE538\u0000\uF1D3\uE791"+ - "\u0000\uF467\u0000\uE09A\uE891\u0000\u0000\uE664"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE7CD\u0000"+ - "\u0000\u0000\uE77E\u0000\uF451\u0000\u0000\u0000"+ - "\uEAD3\u0000\u0000\u0000\uE892\u0000\uEC7A\u0000"+ - "\u0000\uEB9F\u0000\u0000\uE79A\u0000\u0000\u0000"+ - "\uF6AF\uE846\u0000\uE067\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF468\u0000"+ - "\uE79B\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF86F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2EF"+ - "\uE7C2\u0000\uF362\u0000\uED61\u0000\u0000\u0000"+ - "\uF4B7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF870\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF2EC\u0000\u0000\u0000\u0000"+ - "\u0000\uEC42\u0000\uE54D\u0000\u0000\uE7CE\u0000"+ - "\u0000\u0000\u0000\uF572\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE539\u0000\u0000\u0000\u0000\uE1C2\uEEDA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF469\u0000\u0000\u0000\u0000"+ - "\u0000\uE7AA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE74E\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE93D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC7B\uE69E\u0000\u0000"+ - "\uE09B\u0000\u0000\uE56A\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF567\uE131\u0000\u0000\uE2BA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF5B8"+ - "\u0000\u0000\u0000\uE7C3\uE378\u0000\u0000\u0000"+ - "\u0000\u0000\uECC5\uF0F8\u0000\uF441\u0000\u0000"+ - "\u0000\uE2BB\u0000\u0000\u0000\uE4AD\uEF71\uE27C"+ - "\u0000\u0000\u0000\uEB44\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEA73\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9F7\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF442\uF4F6\uF66B"+ - "\u0000\u0000\u0000\u0000\uE6FE\u0000\u0000\u0000"+ - "\u0000\u0000\uF76F\u0000\uF6F2\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE339\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE6A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5A6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6BC\uE173\u0000\u0000\uEE6B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9DD\u0000\u0000\u0000"+ - "\u0000\uE3B3\u0000\u0000\u0000\u0000\u0000\uF2ED"+ - "\u0000\u0000\u0000\u0000\uE66E\uED96\uEBEF\u0000"+ - "\u0000\uE9F8\u0000\u0000\u0000\u0000\u0000\uEF5F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE075\u0000\u0000\u0000\uE931"+ - "\u0000\uEB45\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF93C\uF93D\uE737\u0000\u0000\u0000"+ - "\u0000\uF1B8\u0000\u0000\u0000\uE8B6\u0000\u0000"+ - "\u0000\u0000\uE692\uF4AF\u0000\u0000\uE1A5\u0000"+ - "\uE893\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE738\u0000\u0000\u0000\uE174\u0000\u0000\uE3B4"+ - "\u0000\u0000\u0000\u0000\u0000\uE068\u0000\u0000"+ - "\u0000\u0000\u0000\uE894\u0000\u0000\u0000\u0000"+ - "\u0000\uF5A7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF5A8\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEE36\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5EC\uE5F8\uE895\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uECC6\u0000\u0000\u0000\uEA74\u0000"+ - "\uEA75\uE3B5\u0000\u0000\u0000\u0000\u0000\uE3B6"+ - "\uE3B7\uF443\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEFDE\u0000\u0000\u0000\u0000\u0000\uF363\uF444"+ - "\u0000\u0000\uF364\uE0E4\uF8D4\uF5E6\uECEA\u0000"+ - "\uEA76\u0000\u0000\u0000\u0000\uEAD4\u0000\u0000"+ - "\uF79B\u0000\u0000\u0000\u0000\uF33E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE3B8\u0000\u0000\u0000\u0000\uE66F"+ - "\u0000\uE367\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF931\uF2EE\uE968"+ - "\u0000\uEFDF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEDDD\uF9FB"+ - "\u0000\u0000\uEB59\u0000\u0000\u0000\uE659\u0000"+ - "\u0000\uE53A\u0000\uEDCC\u0000\u0000\u0000\u0000"+ - "\u0000\uEFE0\u0000\u0000\u0000\uE368\uF932\uE54E"+ - "\uEC43\uEA77\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE94C\uE446\uF5D5\u0000\u0000\u0000\u0000"+ - "\u0000\uE231\uF5A9\u0000\u0000\uE9F9\u0000\u0000"+ - "\uE9FA\u0000\u0000\u0000\u0000\u0000\u0000\uF365"+ - "\u0000\u0000\u0000\u0000\uF66F\u0000\uF46A\uED7B"+ - "\u0000\uF493\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF149\u0000\u0000\u0000\u0000"+ - "\uF9FC\u0000\u0000\u0000\u0000\uEBAA\u0000\u0000"+ - "\uE069\u0000\u0000\uF2EF\u0000\uF5AA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF19B\u0000\u0000\uF73D"+ - "\u0000\uF452\uF653\u0000\uE6D2\u0000\u0000\uF7A2"+ - "\uF366\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF39C\u0000"+ - "\u0000\uF670\u0000\u0000\u0000\u0000\uEFF3\uF453"+ - "\u0000\u0000\u0000\uE53B\uE043\uE1A6\u0000\uE1C3"+ - "\uE1DA\u0000\u0000\u0000\u0000\u0000\uE7CF\u0000"+ - "\u0000\uF654\u0000\u0000\u0000\uF26D\uEEC4\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC44"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEAE2\uEEDB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEF41\u0000\uF93E\u0000\u0000\u0000\u0000"+ - "\uEDCD\u0000\u0000\u0000\uF87B\u0000\uE2BC\u0000"+ - "\u0000\uE2E2\uE1F6\u0000\u0000\uF2F0\u0000\uF54E"+ - "\u0000\uE55D\u0000\u0000\uF4B8\u0000\u0000\u0000"+ - "\uEFA1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF494\uF4EB\u0000\uF367\u0000\u0000"+ - "\uE2D7\u0000\u0000\u0000\u0000\u0000\u0000\uE2DF"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEF50\uEF51\u0000\u0000\u0000\uE2E3\uEFA2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE33A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF4C1\uE33B\u0000\uE574"+ - "\u0000\u0000\uF2BC\uE731\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7DF"+ - "\u0000\uF4D7\u0000\u0000\u0000\uE94D\u0000\uE175"+ - "\uF1F1\u0000\u0000\uF3E2\u0000\uE56B\u0000\u0000"+ - "\u0000\u0000\uEC45\u0000\u0000\uE076\u0000\uE4AE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE176\u0000"+ - "\u0000\uF3D3\uF5E7\u0000\u0000\u0000\u0000\uE06A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF8EE"+ - "\u0000\uEBC5\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEAE9\u0000\uF26E\u0000\u0000\uF6C2\u0000"+ - "\uE732\u0000\u0000\u0000\u0000\u0000\uE9AC\u0000"+ - "\u0000\u0000\u0000\u0000\uF33F\uE64D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEBAB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF7B6\u0000"+ - "\u0000\uE597\u0000\uE359\uF2A7\uEC7C\u0000\uE8EA"+ - "\uE25C\uF5E8\uF6D5\u0000\uE4CD\u0000\uF4FE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE345\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBA0\u0000\uEAFB\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE6D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF34\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE0CD"+ - "\u0000\u0000\u0000\uF2A8\u0000\u0000\u0000\uF244"+ - "\u0000\u0000\u0000\u0000\uE868\uE3B9\u0000\uEAA9"+ - "\u0000\u0000\uF4B0\u0000\u0000\uE154\u0000\u0000"+ - "\u0000\uE247\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF2A9\u0000\u0000"+ - "\u0000\uEAD5\u0000\u0000\uF1D7\u0000\u0000\u0000"+ - "\uF256\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF2BD\uF966\u0000\u0000\uE8F4\u0000\uF2AA\uF749"+ - "\u0000\uF5E9\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uECD9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEBC6\u0000\u0000\u0000\uE54F\u0000\u0000\u0000"+ - "\u0000\uEA78\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF37A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF4C2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4AF\u0000"+ - "\u0000\uE06B\u0000\u0000\u0000\u0000\u0000\uF967"+ - "\u0000\u0000\uF1D8\uEBC7\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF568\uE643\uE9AD"+ - "\u0000\u0000\u0000\uE5BE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF3C3\uF26F\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE67B\u0000\u0000\u0000\uF569\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE6E6\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE847\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE9FB\u0000\u0000\u0000\u0000"+ - "\u0000\uE9CF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE733\u0000\u0000\uE869\u0000\uF368"+ - "\uF2C4\u0000\u0000\u0000\u0000\u0000\u0000\uEBD8"+ - "\u0000\u0000\u0000\u0000\u0000\uF3D4\u0000\uF1F2"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5DB\u0000"+ - "\u0000\uE5DC\uF4C4\uE0D7\u0000\u0000\u0000\u0000"+ - "\u0000\uEC46\u0000\u0000\u0000\u0000\uF2F1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8D5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE4D8\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE9D0\uF369"+ - "\uE0B3\u0000\u0000\u0000\u0000\u0000\u0000\uE5DD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE1A7\u0000\u0000\uE33C\u0000"; - - private final static String innerIndex4= - "\uE3BA\u0000\uF3C4\u0000\uEDB3\uF8F5\uEFE1\uF9E0"+ - "\uF94C\u0000\uE832\uE833\u0000\uE431\u0000\u0000"+ - "\uE491\u0000\u0000\u0000\uEC7D\u0000\u0000\uEA79"+ - "\uE26C\uF445\uE374\uE9D1\u0000\u0000\u0000\u0000"+ - "\uEBC8\uE8B7\uEAE3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF1B9\uF3C5\u0000\uF4CF\uE6AB"+ - "\uEBAC\u0000\u0000\uECEB\u0000\uF257\u0000\u0000"+ - "\u0000\uEBC9\uE09C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF39D\uF871\uF36A\uE177\uE896\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE14F\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE27D\u0000"+ - "\u0000\uE5A9\uF872\u0000\u0000\u0000\uE375\u0000"+ - "\uF0D6\u0000\uF16F\u0000\u0000\u0000\uEAFC\u0000"+ - "\u0000\uF6D6\uEA7A\uE0B4\u0000\u0000\uF2BE\u0000"+ - "\u0000\uE145\u0000\u0000\u0000\u0000\u0000\uE2BD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF2F2\uEC47"+ - "\u0000\u0000\u0000\uE178\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF39E\u0000\u0000\u0000"+ - "\uE670\u0000\uF3C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEC48\uF0AB\u0000\u0000"+ - "\u0000\uE0B5\uE761\u0000\uF55E\uF4F7\u0000\u0000"+ - "\uE6C6\u0000\uE3BB\uF6AA\u0000\uF1CA\uE6D3\uE79C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF655"+ - "\u0000\u0000\uE3CC\uE9FC\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEAFD\u0000"+ - "\uF7E5\u0000\uEB5A\u0000\u0000\uF49F\uE4B0\u0000"+ - "\uF595\uE859\u0000\uEE6E\u0000\u0000\u0000\u0000"+ - "\uF74A\uEF60\u0000\u0000\uE79D\u0000\u0000\uF065"+ - "\u0000\u0000\u0000\u0000\uE633\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF656\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF46B\uED9E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEF42\u0000\u0000"+ - "\u0000\u0000\u0000\uE86A\u0000\uF46C\uF8D6\uEFB2"+ - "\u0000\uF23D\u0000\uF873\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE97E\u0000\u0000\uF5EA\uEE70"+ - "\u0000\uF39F\u0000\u0000\u0000\u0000\u0000\uE6AC"+ - "\u0000\u0000\u0000\u0000\u0000\uF5C5\uF270\u0000"+ - "\u0000\uE8E5\u0000\uE9DE\u0000\u0000\uE7F0\uEFA3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3F9\u0000\uF454\uEB5B\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEFA4\u0000"+ - "\u0000\uEC49\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uECB1\uF97B\uE1A8\u0000\uE146\u0000\u0000"+ - "\uF36B\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEE4A\u0000\u0000\uE1A9\u0000\u0000\u0000"+ - "\u0000\u0000\uF4C3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBD9\u0000\u0000\uF2AB"+ - "\u0000\u0000\u0000\uEEC5\u0000\u0000\uEB79\u0000"+ - "\uF4C5\u0000\u0000\uE550\uE5BF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE9AE\u0000"+ - "\uF7FC\u0000\uE150\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEDA2\u0000\u0000\u0000"+ - "\uE248\u0000\u0000\u0000\uE762\uF7D6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3AA\uE261\u0000\u0000\uF657\u0000"+ - "\uE8EB\u0000\uEAFE\u0000\u0000\uE771\u0000\uF6F3"+ - "\u0000\uE6E7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE5A0\u0000\u0000"+ - "\uE3BC\u0000\uEDCF\u0000\uE0B6\u0000\uE848\u0000"+ - "\u0000\u0000\u0000\u0000\uE1C4\u0000\u0000\u0000"+ - "\u0000\u0000\uE64E\u0000\u0000\u0000\uEC4A\u0000"+ - "\u0000\u0000\u0000\u0000\uE2D8\u0000\u0000\u0000"+ - "\uEB5C\uF0F9\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF9FD\u0000\u0000\u0000\u0000\u0000"+ - "\uE6E8\uE0D8\u0000\u0000\u0000\uEFE2\u0000\u0000"+ - "\u0000\uEF4A\u0000\u0000\u0000\uECC7\u0000\u0000"+ - "\u0000\u0000\uF15D\u0000\uF15E\u0000\uE64F\u0000"+ - "\u0000\u0000\uECA7\u0000\uEAD6\uF9E8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF271"+ - "\uF638\uE9FD\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF74B\u0000\uEF61\u0000\u0000\u0000\u0000"+ - "\uF7D7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE27E\u0000\u0000\uF15F\u0000\u0000\u0000"+ - "\uEFA5\uE665\u0000\uE1C5\u0000\uF1BA\uE3BD\u0000"+ - "\u0000\uE2BE\u0000\u0000\uF14B\u0000\u0000\u0000"+ - "\uE441\u0000\u0000\u0000\u0000\uE179\u0000\uE7C4"+ - "\uEFFC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE3BE\u0000\u0000"+ - "\u0000\u0000\u0000\uF14C\u0000\u0000\uEDAD\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF6B0\u0000\uE17A"+ - "\u0000\u0000\u0000\uE4C4\u0000\u0000\uE650\u0000"+ - "\u0000\u0000\uE69F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEBA1\u0000"+ - "\uEA4D\u0000\uF639\u0000\u0000\u0000\uE834\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE634"+ - "\uF5C6\u0000\uEBA2\uEFC6\u0000\u0000\u0000\uF455"+ - "\u0000\u0000\u0000\u0000\u0000\uF579\uE67C\uF0D3"+ - "\u0000\u0000\u0000\u0000\uF14D\uEC6C\uEA7B\uF36C"+ - "\u0000\uF0BF\u0000\uE6CE\uE3BF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF5AB\u0000"+ - "\u0000\u0000\u0000\uF7FD\u0000\uE06C\u0000\u0000"+ - "\u0000\uE1C6\uF446\u0000\u0000\uE9FE\u0000\u0000"+ - "\u0000\uE147\uE8B8\u0000\u0000\u0000\u0000\uE379"+ - "\u0000\uE26D\uF0C0\u0000\uF9A2\u0000\u0000\u0000"+ - "\u0000\u0000\uF75B\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF066\uF3B0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE8CE\u0000\uF6C3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE8CF\uE0A4\u0000\u0000\uF770\u0000"+ - "\u0000\uF8D7\u0000\u0000\uF0CA\uEB31\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE25D\u0000\u0000\uE56C\u0000\u0000\u0000"+ - "\uF9D8\u0000\u0000\u0000\u0000\uE498\u0000\u0000"+ - "\u0000\u0000\uF447\u0000\u0000\uF898\uF63A\uF899"+ - "\uE776\u0000\uF541\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEF62\u0000\uE055\uE17B\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEC7E\u0000\u0000\u0000\u0000"+ - "\u0000\uEC4B\u0000\uF6AD\u0000\u0000\u0000\uF771"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF4EC\u0000\u0000\u0000\u0000\uEA31\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uED9F\u0000\u0000\uECEC\u0000"+ - "\uE9AF\uE9B0\u0000\u0000\uE0B7\uEF63\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEBA3\uE470\u0000"+ - "\u0000\u0000\u0000\uF3A0\u0000\u0000\u0000\u0000"+ - "\uEFA6\uE0F2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1F3\uE969\uEB5D\u0000\u0000\u0000\u0000\uF6DA"+ - "\uE8B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE13E\u0000\uE86B\u0000\u0000\u0000\u0000\uE1C7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9B1\u0000\uE73F\uECA3\u0000\u0000"+ - "\uE291\u0000\u0000\uF495\u0000\u0000\u0000\u0000"+ - "\uF743\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEB5E\u0000\uF5FD\u0000\u0000"+ - "\u0000\u0000\uF0EC\u0000\u0000\uE4C5\uF97C\uE46B"+ - "\uE57B\u0000\uEA32\u0000\u0000\u0000\uEDE6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF340\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE5C4\u0000\u0000\u0000\u0000\u0000\u0000\uF1F4"+ - "\u0000\u0000\u0000\uECED\u0000\uEF52\u0000\uF1F5"+ - "\uE6FC\u0000\uF1BB\u0000\u0000\uF63B\u0000\u0000"+ - "\u0000\u0000\u0000\uF448\uF658\u0000\u0000\u0000"+ - "\u0000\u0000\uE4E6\uF46D\uE2BF\u0000\uF0AC\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE2C0\u0000\uEE38"+ - "\uF9E9\u0000\uE2C1\u0000\uEB6F\uEA7C\u0000\u0000"+ - "\u0000\u0000\uEB32\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF54F\uEC91\u0000\uE7F1\uF3C7"+ - "\u0000\uE0B8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF7FE\uE8BA\uE897\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF67C\uE86C\uF874"+ - "\u0000\uEB5F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE9B2\u0000\u0000\u0000\u0000\uEE39\u0000\uF2F3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF4ED\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF0FA\u0000\uF7E6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE06D\uE5DE"+ - "\u0000\uE06E\uEAE4\u0000\u0000\u0000\uEE9F\u0000"+ - "\uF5AC\u0000\u0000\u0000\u0000\u0000\uED97\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEFE3\u0000\uF1CB\uE2E4\u0000"+ - "\u0000\u0000\uE763\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE9B3\uE57C\u0000\u0000\uF449\u0000\uEAB7"+ - "\u0000\u0000\u0000\u0000\u0000\uE0CE\uF8D8\u0000"+ - "\u0000\uE369\u0000\u0000\uE9D2\uF6F4\uEEDC\uED35"+ - "\u0000\uF933\u0000\uE8BB\u0000\u0000\u0000\uF44A"+ - "\uEFFD\uE35A\u0000\uF5D6\uE7C5\uED44\u0000\uF1A7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF04D\uEEA0\u0000\uF6C4\uF5AD\u0000\uE7E0"+ - "\u0000\u0000\u0000\uE044\u0000\u0000\uF772\uE2C2"+ - "\u0000\uF14E\u0000\u0000\u0000\uEDB4\uE1C8\uF258"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEEC8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE1C9\uF7B7\u0000"+ - "\u0000\uF3E8\uE7F2\uE8F5\uE045\uE7C6\u0000\u0000"+ - "\u0000\uE759\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7AB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF1BC\u0000\u0000\uE764\u0000\u0000\u0000\uE96A"+ - "\u0000\uEC4C\u0000\u0000\uF97D\uF170\uE4A0\u0000"+ - "\uEFC7\uEE3A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEC92\u0000\u0000\u0000\u0000\u0000\u0000\uF84B"+ - "\u0000\uF5AE\uF8AA\u0000\u0000\u0000\u0000\uF19D"+ - "\u0000\uF14F\uF968\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE575\u0000\u0000\u0000\uF7C3"+ - "\u0000\u0000\u0000\uF272\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE6E9\uF1F6\u0000\u0000\u0000\uEA7D\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE17C\u0000"+ - "\uECEE\u0000\u0000\u0000\u0000\u0000\uEF64\u0000"+ - "\u0000\u0000\uF89A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE9B4\uED45\uE740\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE765\u0000\u0000"+ - "\u0000\uF57A\u0000\u0000\u0000\uE249\u0000\u0000"+ - "\u0000\uE671\uE2D2\u0000\uE346\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE232\u0000\u0000\uF4EE\u0000"+ - "\u0000\u0000\u0000\u0000\uF4F8\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE95C\u0000\uE35B\u0000\u0000\u0000\uF934"+ - "\uE1CA\uE6D4\uEA33\u0000\uED70\u0000\u0000\u0000"+ - "\u0000\uF259\u0000\u0000\u0000\uEC6D\u0000\u0000"+ - "\u0000\u0000\u0000\uF5FE\uE53C\u0000\u0000\u0000"+ - "\u0000\u0000\uE5D1\u0000\uE792\uF753\uF067\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF5D7\u0000\u0000\uE74F\u0000\u0000\u0000"+ - "\u0000\uF9C0\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF0AD\u0000\u0000\u0000\u0000\uE5AA\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEEA8\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF25A"+ - "\u0000\u0000\u0000\uE077\u0000\u0000\u0000\u0000"+ - "\u0000\uF773\u0000\uE56D\u0000\u0000\uF068\u0000"+ - "\u0000\u0000\u0000\uF8D9\uF1F7\u0000\u0000\uEDB5"+ - "\u0000\u0000\u0000\u0000\u0000\uE33D\u0000\u0000"+ - "\u0000\u0000\uF3F1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEC4D\u0000\u0000\u0000\uECC8\u0000\u0000\u0000"+ - "\u0000\uE7D5\u0000\u0000\uEAAA\u0000\u0000\u0000"+ - "\u0000\uE8BC\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF774\u0000\u0000\u0000\u0000\u0000"+ - "\uF3FA\u0000\u0000\uEDB6\uF4EF\u0000\u0000\uF8DA"+ - "\uEBE0\u0000\uE7AC\u0000\uF5EB\u0000\uEB46\u0000"+ - "\u0000\uEFC8\u0000\uE0CF\u0000\uECC9\u0000\u0000"+ - "\u0000\uEA7E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEC4E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE991\u0000\uE635\u0000"+ - "\u0000\u0000\u0000\u0000\uEC93\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE6A0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE7A1\u0000\uE750\uE96B\u0000\u0000\uF1BD"+ - "\uEAB8\u0000\uF035\u0000\u0000\u0000\uE6AD\u0000"+ - "\u0000\uF4F9\u0000\uF1F8\u0000\uF5C7\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEBCA\uF0E3\u0000\uF46E"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF75C\u0000\uF069"+ - "\u0000\uE4C6\u0000\uE8E6\u0000\u0000\u0000\u0000"+ - "\u0000\uF5AF\u0000\u0000\u0000\u0000\uE292\u0000"+ - "\u0000\u0000\u0000\uEFFE\u0000\u0000\u0000\u0000"+ - "\u0000\uF8B6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEC94\u0000\u0000\u0000\u0000"+ - "\uE2F2\uF6B9\uE7F3\u0000\u0000\uEBCB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE86D\u0000\u0000\uE849"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF0FB"+ - "\u0000\uE0B9\u0000\u0000\uF1F9\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEB70\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF550\u0000"+ - "\uF9BC\uEAB1\uECEF\u0000\u0000\u0000\u0000\uEB33"+ - "\uF9B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF341\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE1CB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF1BE\u0000\u0000\u0000\uE5C0\uECF0\uF1FA"+ - "\u0000\u0000\u0000\u0000\u0000\uEFE4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE5ED\uEEDD\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE598\uEDB7\u0000\u0000"+ - "\u0000\uE8E7\uEC4F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF25B"+ - "\u0000\u0000\uE6F4\uF36D\u0000\u0000\u0000\uE23B"+ - "\u0000\u0000\uEEDE\u0000\u0000\u0000\uE666\uEBCC"+ - "\u0000\u0000\uEF43\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEDEE\uE932"+ - "\u0000\u0000\uEB60\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE5B5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE5A1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF8DB\u0000"+ - "\uF7CB\u0000\u0000\u0000\uE0F3\uF535\u0000\u0000"+ - "\u0000\u0000\u0000\uF858\uE667\u0000\uEFE5\uF8DC"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9D0"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF8F6\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE835\u0000\uE8BD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF172\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE1F7\uF36E\u0000\u0000\u0000"+ - "\u0000\uF659\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEA91"+ - "\u0000\u0000\u0000\uE4B1\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF97E\u0000\u0000\u0000"+ - "\u0000\uEF53\u0000\uF3C8\u0000\u0000\u0000\uE293"+ - "\u0000\u0000\u0000\u0000\uF7ED\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF496\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED46\u0000"+ - "\uF5B9\u0000\uE992\uECF1\u0000\u0000\u0000\u0000"+ - "\uEF35\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF44B\u0000\uEA34\u0000\uE85C\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE079\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECDA\u0000\uF969"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF06A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF7C4\u0000"+ - "\uECA4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF8DD\u0000\uF2CA\u0000"+ - "\uEF54\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5CC\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF0D7\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7AD"+ - "\u0000\u0000\uF8AB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE4D9\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE5A2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF66E\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE898\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEB61\u0000\u0000\uEFA8"+ - "\u0000\u0000\uF5F9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF83F\u0000\uF0FC\u0000\u0000\uEB7A\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECB2\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE5C5"+ - "\u0000\u0000\uF3E3\uE5EE\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE1CC\u0000\u0000\u0000\u0000\uF1D9\u0000"+ - "\u0000\u0000\u0000\uE751\u0000\u0000\u0000\u0000"+ - "\uF87C\u0000\u0000\u0000\u0000\u0000\uF3EB\u0000"+ - "\u0000\u0000\u0000\u0000\uF84C\uEE72\u0000\u0000"+ - "\u0000\u0000\uF875\uEC9C\u0000\u0000\u0000\uE046"+ - "\u0000\uED47\u0000\uF06B\u0000\uF5FA\u0000\u0000"+ - "\u0000\uF8AC\uE2C3\uF0FD\u0000\u0000\u0000\u0000"+ - "\uF79C\u0000\u0000\uEAB9\u0000\u0000\u0000\u0000"+ - "\uEBF1\u0000\uE434\u0000\u0000\u0000\u0000\uF5FB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE36A\uE36B"+ - "\u0000\uF04E\uE7B1\u0000\u0000\u0000\u0000\u0000"+ - "\uE047\u0000\u0000\uE4E7\u0000\uF775\u0000\u0000"+ - "\u0000\u0000\uE4B2\u0000\u0000\u0000\uEC50\uF46F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE1E5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7AC\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE1CD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF23E\uE63E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6EA"+ - "\u0000\u0000\u0000\u0000\uEEE0\uF0AE\u0000\u0000"+ - "\u0000\uE2D9\u0000\u0000\uE95D\uF1FB\u0000\uEA92"+ - "\u0000\uE6EB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEA35\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEAD7\uE8D0\uE8D1\u0000\u0000"+ - "\uE5A3\u0000\u0000\u0000\u0000\uF342\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE96C"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE078\u0000\uF776\uE95E\u0000\u0000\u0000\u0000"+ - "\uF06C\uE8D2\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFB3\u0000\u0000"+ - "\u0000\u0000\uF6DB\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uECA8\u0000"+ - "\uE6AE\u0000\u0000\uEB71\u0000\u0000\u0000\u0000"+ - "\u0000\uE0BA\u0000\u0000\uEDD1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE36C"+ - "\u0000\u0000\u0000\u0000\uE5C1\u0000\u0000\u0000"+ - "\u0000\u0000\uE75A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uECA9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEB34"+ - "\u0000\uEFA9\u0000\uE4C7\u0000\u0000\uE96D\uF73E"+ - "\u0000\u0000\u0000\uE148\u0000\u0000\u0000\uE33E"+ - "\u0000\u0000\u0000\uE794\u0000\u0000\uECCA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE13F\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE53D\uF661\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE35C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE056\u0000\u0000\uE5C2\u0000\u0000"+ - "\uE24A\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE057\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF840\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEAD8\u0000\u0000\u0000"+ - "\uF5BA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDEB\u0000\uF2F4\uE9B5\u0000\u0000\u0000\u0000"+ - "\uE1AA\u0000\uECF2\u0000\uF8F7\u0000\uF6D0\u0000"+ - "\u0000\u0000\u0000\uF9BA\u0000\u0000\uF9E1\uF6A0"+ - "\uE3C0\u0000\u0000\uEF55\u0000\uED48\u0000\uEBE8"+ - "\u0000\u0000\u0000\uE151\u0000\uE47D\u0000\u0000"+ - "\u0000\u0000\uE8BE\u0000\u0000\uEB72\u0000\u0000"+ - "\u0000\uF859\u0000\u0000\uEBCD\u0000\uE048\u0000"+ - "\u0000\u0000\uF470\uF3C9\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEA93\u0000\u0000\u0000\uF36F\uF754\u0000\u0000"+ - "\u0000\u0000\u0000\uF25C\u0000\u0000\uEA94\u0000"+ - "\uEEC9\u0000\uEC95\uEEE1\u0000\u0000\uECCB\u0000"+ - "\u0000\uECCC\u0000\u0000\u0000\uE2F8\uF2AC\u0000"+ - "\uF9FE\uF935\uF841\uEAD9\u0000\uEB62\u0000\u0000"+ - "\u0000\uF56A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF3CA\u0000\uE233"+ - "\u0000\u0000\u0000\u0000\uF44C\uF173\u0000\u0000"+ - "\u0000\u0000\u0000\uEB35\u0000\uF6AB\u0000\u0000"+ - "\uF0AF\u0000\u0000\u0000\u0000\u0000\uEDDE\u0000"+ - "\uEBA4\uE1AB\u0000\uE7F4\uEF36\uE1CE\uEBE9\u0000"+ - "\uF991\u0000\uEB73\u0000\u0000\u0000\u0000\u0000"+ - "\uEC51\u0000\uE234\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEA36\u0000\u0000\uF0FE\u0000\uF0DD\uF370"+ - "\u0000\u0000\uF56B\u0000\uEC96\u0000\u0000\uE4C8"+ - "\u0000\u0000\u0000\uF57B\u0000\uF245\u0000\uF5D8"+ - "\u0000\u0000\uE5DF\u0000\u0000\u0000\uE675\u0000"+ - "\u0000\u0000\u0000\uF0B0\uF573\u0000\u0000\u0000"+ - "\u0000\uECCD\u0000\u0000\u0000\u0000\uF596\uF842"+ - "\u0000\u0000\uF2F5\uE06F\u0000\uF0B1\uF1BF\u0000"+ - "\u0000\uF9C9\u0000\u0000\u0000\u0000\uED36\uF7A4"+ - "\uF343\u0000\uEDEC\u0000\u0000\u0000\uE3E7\u0000"+ - "\uE7C7\uED67\uF06D\u0000\uE599\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE84A\u0000"+ - "\uE85D\u0000\u0000\u0000\uF7CC\u0000\uEBDA\uE8BF"+ - "\u0000\uE155\uF160\uE0BB\u0000\uEA95\u0000\u0000"+ - "\uEFAA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE7C8\u0000\u0000\uF273\uE6BD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE2C4\u0000\u0000\u0000\u0000"+ - "\u0000\uE35D\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF936\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF3FB\u0000\u0000\u0000\u0000\uF9D2\uE3C1"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uECDB\u0000\uE4C9\u0000\uE95F\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE17D\u0000"+ - "\u0000\u0000\u0000\u0000\uEA37\u0000\u0000\uEE4B"+ - "\uF131\u0000\u0000\u0000\uE149\u0000\u0000\uF8DE"+ - "\u0000\u0000\u0000\u0000\u0000\uEEE2\u0000\u0000"+ - "\uE551\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE938\u0000\u0000\u0000\u0000\u0000"+ - "\uEC52\u0000\uF4D8\uEDD3\u0000\u0000\uF4D9\u0000"+ - "\u0000\u0000\uF4C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1DB"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1AC"+ - "\u0000\uF953\u0000\u0000\u0000\u0000\uE577\u0000"+ - "\uE3C2\u0000\uF7A5\u0000\uEF65\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uECCE\u0000\u0000"+ - "\u0000\u0000\uE55A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEADA\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8DF\uEEE3\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF79D\uECCF\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5B0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE777\u0000\uE7C9\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF73F\uF2F6\u0000"+ - "\uE9B6\uF23F\uE1F8\u0000\u0000\u0000\u0000\uEA48"+ - "\uF937\uF6FC\uF6B1\uE24B\uF531\u0000\u0000\uF25D"+ - "\uEBAE\u0000\u0000\uF153\uE2FE\u0000\uF74F\uE772"+ - "\uE4E8\u0000\u0000\uEA38\uF574\uF152\u0000\uE7F5"+ - "\uF7C5\uE9D3\uE693\uF19E\uF992\u0000\u0000\uF1C0"+ - "\uE049\u0000\uF274\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF471\u0000\uEA49\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE694\u0000\uEA96\u0000\uEADB\u0000"+ - "\uE8D3\u0000\uF877\uE773\uF551\u0000\uE9B7\u0000"+ - "\u0000\u0000\uF497\u0000\u0000\uE53E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE695\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE9B8\uE2C5\uEADF\u0000\u0000"; - - private final static String innerIndex5= - "\u0000\u0000\u0000\u0000\uF44E\uF631\u0000\uF0CB"+ - "\uF3FC\u0000\uF4C7\u0000\u0000\uEB7B\u0000\u0000"+ - "\u0000\u0000\u0000\uF1FC\u0000\u0000\uEBDB\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF275\u0000\uEA97\u0000"+ - "\u0000\u0000\u0000\uF863\u0000\u0000\u0000\u0000"+ - "\uF3CB\u0000\u0000\uE33F\uE9B9\u0000\u0000\uE3C3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5B1\u0000\u0000"+ - "\u0000\u0000\uF056\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF371\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF63C\u0000\u0000\u0000\u0000"+ - "\uF5D9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF37B\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE9BA\u0000\u0000\u0000\uF44F\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF6C5\u0000"+ - "\u0000\u0000\u0000\uE8A2\uF498\u0000\u0000\uE04A"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF6F5\u0000\uE0E5\u0000\u0000"+ - "\u0000\uF276\u0000\uEB63\u0000\u0000\u0000\u0000"+ - "\uE235\u0000\u0000\u0000\u0000\u0000\u0000\uE668"+ - "\u0000\u0000\u0000\uE53F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFC9\u0000\u0000\u0000\u0000\uE4CE"+ - "\uF552\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE0E6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF3A1\u0000\u0000\u0000\u0000\u0000"+ - "\uF0B2\u0000\u0000\u0000\u0000\uF3A2\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF0B3\u0000\uF344\u0000\u0000\uE0F4"+ - "\uE540\uF4B2\uF8B7\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF5EC\u0000\u0000\u0000\u0000\u0000\uF277"+ - "\uF542\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5ED\u0000\uE2F3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF372\u0000\u0000\u0000\u0000\u0000\uF25E"+ - "\u0000\u0000\uF3CC\u0000\u0000\uEDB8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE6F5\uECF3\uE2E5\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE2C6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF4B3\uED68\uE2F9\uE2DA\u0000\u0000"+ - "\u0000\u0000\uF85D\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE73"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF472\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5EE\u0000\u0000\uE04B\u0000\u0000\uECDC\u0000"+ - "\u0000\u0000\u0000\uE294\u0000\uE669\u0000\u0000"+ - "\u0000\uF240\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF575\uE752\uE960\uE17E\u0000\u0000"+ - "\u0000\u0000\u0000\uE5E0\uF65A\uF9CA\uE766\uF55F"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE636\uE94E"+ - "\u0000\uE8D4\uE6C7\u0000\u0000\u0000\u0000\uF4A0"+ - "\u0000\u0000\u0000\uF3CD\u0000\u0000\u0000\u0000"+ - "\uEC53\uE96E\u0000\uE96F\u0000\u0000\uF2AD\uEE3B"+ - "\u0000\u0000\u0000\u0000\uF7DD\uF04F\u0000\u0000"+ - "\u0000\uF2AE\u0000\u0000\u0000\uF560\uE295\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEE3C\u0000\uE26E"+ - "\u0000\u0000\uE5F9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uECF4\uE1D0\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE5B8\u0000\u0000\uF6FD\u0000"+ - "\uE939\u0000\u0000\u0000\u0000\uEA98\u0000\uE93A"+ - "\uF473\uEFB4\uE46C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEFE6\u0000\u0000\uECF6\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEECA\u0000"+ - "\u0000\uE35E\u0000\u0000\uE899\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE04C\u0000"+ - "\u0000\u0000\uF278\uE86E\u0000\uF499\u0000\u0000"+ - "\uEC9D\u0000\uE136\u0000\u0000\u0000\u0000\uE84B"+ - "\u0000\uF279\u0000\u0000\u0000\uF5DA\u0000\u0000"+ - "\uF6DC\uEBEA\uE251\uE541\u0000\uF9B1\uEE4D\u0000"+ - "\uF8AD\u0000\u0000\uF777\u0000\uEBCE\u0000\uF6E2"+ - "\uF5EF\uE2C7\u0000\u0000\uE542\uE191\u0000\uE578"+ - "\u0000\uF25F\uF6D7\u0000\u0000\uEB36\uE651\uEBDC"+ - "\uF373\uF3E4\uE993\uE637\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF597\u0000"+ - "\u0000\uF3CE\uF474\u0000\u0000\uE340\u0000\u0000"+ - "\uF191\u0000\u0000\u0000\uF7BA\u0000\uF0B5\u0000"+ - "\u0000\uE57D\uEC54\u0000\u0000\u0000\u0000\uEFE7"+ - "\u0000\u0000\uF0B4\uF031\u0000\uF74C\uE236\u0000"+ - "\uF7C6\uF96A\u0000\uE543\uE4B9\uF06E\u0000\u0000"+ - "\u0000\uEFAB\u0000\u0000\uEBE1\uE4CF\uF598\u0000"+ - "\uF050\uEBCF\u0000\uE14A\u0000\u0000\u0000\u0000"+ - "\u0000\uF27A\u0000\u0000\u0000\uF374\uF4B4\uE57E"+ - "\u0000\u0000\uF450\u0000\u0000\uF3E5\u0000\uF553"+ - "\uEB64\u0000\uF0B6\u0000\uE6A1\uE0E8\u0000\uF7AD"+ - "\uEFAD\uE774\uF843\uEC55\uF94D\u0000\u0000\uF154"+ - "\uE741\u0000\uE93B\u0000\u0000\u0000\u0000\uE5A4"+ - "\u0000\uF0E9\u0000\u0000\u0000\uEF4B\u0000\u0000"+ - "\u0000\uE767\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF8AE\uE3E1\u0000\u0000\uE8C0\u0000"+ - "\uF5BE\u0000\uEA99\u0000\u0000\u0000\u0000\uE09D"+ - "\uF6C6\uE2C8\u0000\u0000\u0000\uEBD0\u0000\u0000"+ - "\uF260\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEFF4\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE296\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE5CD\u0000"+ - "\u0000\uE2DB\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE9BB\u0000\u0000\u0000\u0000\uE23C\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFE8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE544\u0000\u0000"+ - "\u0000\u0000\uED57\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5DB\u0000\u0000\uF851\u0000\u0000"+ - "\u0000\uEA39\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE59A"+ - "\u0000\u0000\u0000\u0000\u0000\uF2F7\u0000\u0000"+ - "\u0000\u0000\uE4B3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF0B7\uF2F8\uF5DC\uF1CC\uE8D5\uF3CF\u0000"+ - "\u0000\u0000\uF3D0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF5B2\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE7AE\uE5AC\u0000\uEC56\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF9A3\u0000\uF8E5"+ - "\uEAAB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC97"+ - "\u0000\uF63D\u0000\uF5B3\u0000\uF345\u0000\u0000"+ - "\u0000\u0000\uEBA5\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF5DD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF132\uF1FD\u0000\uF5B4\uF8B8"+ - "\u0000\uE8A3\u0000\u0000\uE65A\uE0D9\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEDD4\u0000\u0000\u0000\u0000\u0000\u0000\uF4FA"+ - "\u0000\uF0B8\u0000\uEB47\uE6EC\uF3EC\uEDAF\uE5E1"+ - "\uE6ED\uE3D1\u0000\u0000\u0000\u0000\u0000\uEBF2"+ - "\uF2F9\u0000\u0000\u0000\uE9BC\uF66C\u0000\u0000"+ - "\u0000\u0000\u0000\uF375\u0000\u0000\u0000\uF554"+ - "\u0000\u0000\uEFE9\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF4FB\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE591\u0000\u0000"+ - "\uE132\uF6FE\uEABC\u0000\u0000\u0000\u0000\uF0CD"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE347\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE652\u0000\u0000\u0000"+ - "\u0000\u0000\uEF3D\u0000\u0000\u0000\u0000\uF2AF"+ - "\uE0A5\u0000\u0000\u0000\u0000\uE0E9\u0000\u0000"+ - "\u0000\uF878\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE156"+ - "\u0000\u0000\u0000\uEE77\u0000\u0000\uF057\u0000"+ - "\u0000\u0000\uE8A4\u0000\uE2C9\uEC9E\uF2FA\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF0DE\u0000\u0000\uF5C8\u0000\uE56E\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uEB65\u0000\uF2B0\u0000\u0000\uEC57\u0000"+ - "\uE7AF\u0000\u0000\u0000\uF7E7\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEEE5\u0000\u0000\uE2CA\uEBD1"+ - "\u0000\uEC58\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF2FB\u0000\u0000\uF89B"+ - "\u0000\u0000\uE994\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEB37\u0000\u0000\u0000"+ - "\u0000\u0000\uF778\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE0EA\u0000\u0000\u0000\uE0BC\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE672\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5DE\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF5DF\u0000\uF246\u0000\u0000\u0000\uEC98\uE4CA"+ - "\uF2FC\uE3C4\uF2B1\u0000\uE3C5\u0000\uE36E\u0000"+ - "\uE7E1\u0000\u0000\uEB48\u0000\u0000\uE1D1\uF4B9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEECC\u0000\uE638\uE237\u0000\uE545\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uED58\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE4B4\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF0B9\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE0F5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF66D\u0000\uF3A3\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE157\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEFCA\u0000\uEBF0\u0000"+ - "\u0000\u0000\uF5E0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8AF\u0000\u0000\u0000\uE0D1"+ - "\u0000\u0000\u0000\u0000\uF8E0\uF475\u0000\u0000"+ - "\uF192\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF37C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF27B\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEFCB\u0000"+ - "\u0000\uE192\u0000\u0000\uE6AF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF4A1\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF997\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF3A4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEB66\u0000\u0000"+ - "\u0000\u0000\u0000\uF2B2\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF561\u0000\u0000"+ - "\uF6A1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF3D1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE09E\uE09F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE25E\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF4C8\u0000\uF4BA"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF1FE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE836\u0000\u0000\uEB7C\u0000\u0000\u0000\u0000"+ - "\u0000\uF75D\u0000\uE0D2\u0000\u0000\u0000\uF0CE"+ - "\u0000\uF7D8\uF7D9\uE070\uE85A\u0000\u0000\u0000"+ - "\uE0A6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE058\uF7EE\uE8EC\u0000\u0000"+ - "\uE341\u0000\u0000\u0000\u0000\uE5EF\u0000\u0000"+ - "\u0000\uEE95\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEEA2\uED69\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED71"+ - "\u0000\u0000\uF954\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF7EF\uE2F4\uF6E6\u0000"+ - "\u0000\u0000\u0000\u0000\uE24C\u0000\u0000\u0000"+ - "\u0000\uF555\uE933\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9BD\u0000\u0000\u0000"+ - "\u0000\uF556\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF731\u0000\u0000\u0000\uEF66\u0000"+ - "\u0000\u0000\uE8C1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF376\u0000\u0000\u0000\uED49"+ - "\uF67D\u0000\uF7AE\u0000\uE9BE\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6B0\uE778\uE0BD\u0000\u0000"+ - "\uF7DA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF75E\uF7F0\uEB7D\uECB3\uF543"+ - "\u0000\u0000\uF052\uF476\uF346\u0000\u0000\u0000"+ - "\u0000\u0000\uE8D6\u0000\u0000\u0000\u0000\u0000"+ - "\uF0E4\u0000\u0000\uF477\u0000\uE6D5\uE546\uF7E8"+ - "\uE6C1\u0000\u0000\u0000\u0000\uEDD5\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEFEA\uE6CC\u0000"+ - "\u0000\u0000\uE4E9\uEC59\u0000\uF96B\uE1AD\u0000"+ - "\u0000\u0000\u0000\u0000\uE140\uF032\u0000\u0000"+ - "\uED98\uE350\u0000\uF347\uF231\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE6F6\u0000\u0000\u0000\uEC5A"+ - "\uEC5B\u0000\uF85F\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF0DF\u0000\u0000\u0000\u0000\u0000\uE65B"+ - "\u0000\u0000\u0000\uF544\u0000\u0000\u0000\u0000"+ - "\uF1CD\uED62\u0000\u0000\uF039\uED4A\uF4A2\uE1D2"+ - "\u0000\uF65B\u0000\uF3E6\uF1C1\uEF4C\uF261\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF377\uEC5C\u0000"+ - "\u0000\uED3A\u0000\uF5E1\uF1DA\u0000\u0000\u0000"+ - "\u0000\u0000\uE6EE\uE3F1\u0000\u0000\u0000\u0000"+ - "\uEFEB\uEFEC\uEB74\u0000\u0000\u0000\u0000\uE837"+ - "\uE9D4\u0000\uF033\u0000\u0000\u0000\uE653\uE696"+ - "\u0000\uE86F\u0000\uF2B3\u0000\u0000\u0000\u0000"+ - "\uEC5D\u0000\u0000\u0000\u0000\u0000\uF2FD\uF478"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF2C5\u0000\uEEE7\u0000\u0000\uE6FD\u0000"+ - "\u0000\uEECE\u0000\u0000\uEADC\u0000\uF7C7\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7F6"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEAAC\u0000\uE66A\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE934\u0000\u0000\u0000\uF348\u0000\u0000"+ - "\u0000\u0000\uE5FA\u0000\uED99\u0000\u0000\u0000"+ - "\uE654\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF57C\u0000\u0000\u0000\u0000\uF2FE\u0000"+ - "\u0000\u0000\u0000\u0000\uF331\u0000\uEA3A\u0000"+ - "\u0000\uE84C\uE79E\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF864\u0000\u0000\u0000\uF175\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF938\u0000\u0000\uF176"+ - "\u0000\u0000\uE75B\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8B9\u0000\uED63\u0000\uE1F9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE2D3\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE07A\u0000\u0000\uE2D4\u0000\uF74D\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF557\u0000"+ - "\u0000\u0000\u0000\uF06F\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF7DB\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE547\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF0E5\u0000\u0000\uEBD2\u0000"+ - "\u0000\u0000\u0000\uF034\u0000\u0000\u0000\uF852"+ - "\uF8E1\uF87D\uF332\uE193\u0000\uF833\uEC99\u0000"+ - "\uEC5E\u0000\uEFF5\u0000\uEBEB\u0000\u0000\u0000"+ - "\uEEE8\uEF67\uE89A\uE55B\u0000\u0000\u0000\uF6F6"+ - "\uE655\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE579\u0000\u0000"+ - "\uF89C\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE194\uF6DD\u0000\uEA4A\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE238\u0000"+ - "\u0000\u0000\u0000\u0000\uF349\uEDA0\uED59\u0000"+ - "\u0000\u0000\u0000\u0000\uED64\u0000\u0000\u0000"+ - "\uF053\u0000\uF2B4\u0000\u0000\u0000\uE6BE\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF8E2\u0000\uE1D3"+ - "\u0000\u0000\u0000\uF2B5\u0000\u0000\u0000\uF879"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF7A6\u0000\u0000\u0000\u0000\u0000\u0000\uEABD"+ - "\u0000\uF6C7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uF79F\u0000\u0000\uF79E"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA3B\uE8E8\u0000\u0000\uECDD"+ - "\u0000\uEBE2\uE3C6\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF660\uF0E6\uE89B"+ - "\u0000\u0000\u0000\u0000\uF157\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uEA9A\uF779\uECDE\u0000"+ - "\u0000\u0000\u0000\uE297\u0000\u0000\u0000\u0000"+ - "\u0000\uF853\uEDD7\u0000\uF158\u0000\u0000\u0000"+ - "\uF4C9\u0000\u0000\uED4B\u0000\u0000\u0000\u0000"+ - "\uEE3E\u0000\u0000\u0000\u0000\u0000\uF2B6\u0000"+ - "\uE94F\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE24D\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE753\u0000\u0000"+ - "\u0000\uE35F\u0000\uE2FA\uF4CA\uEB67\u0000\u0000"+ - "\u0000\uE3C7\uEFAE\u0000\uEF4D\u0000\u0000\uF854"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uEC5F\u0000"+ - "\u0000\uF855\u0000\u0000\u0000\uF7B8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE970\u0000\u0000"+ - "\uF8B0\u0000\u0000\u0000\uE739\uEDDF\uF7A7\u0000"+ - "\u0000\uF67E\u0000\uF65C\uEC9A\u0000\u0000\u0000"+ - "\u0000\uF193\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE870\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF3D2\uE45C\uE2CB\u0000\u0000\uE04D\u0000\u0000"+ - "\u0000\uE9BF\u0000\u0000\u0000\uF691\u0000\uEA9B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF844\u0000\u0000"+ - "\u0000\uE5AD\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF3E7"+ - "\u0000\uEA4E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE950\u0000\u0000\u0000\u0000\u0000\uE3C8\uE3C9"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF74E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE0F6\u0000\u0000\u0000\u0000"+ - "\uE59B\u0000\u0000\u0000\u0000\u0000\uF5E2\uEBD3"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE779\u0000\u0000\uF7A0\u0000\uE2CC\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF9A4\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE298\u0000\uF860"+ - "\u0000\u0000\uE195\uEE4E\u0000\u0000\u0000\uF63E"+ - "\u0000\u0000\uE5F0\u0000\u0000\uE3CA\u0000\u0000"+ - "\u0000\uF94E\uE5F1\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE1E9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uF845\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEC60\uF599\u0000\u0000\u0000"+ - "\uE1D4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEEA3\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uE8A5\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEC61\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6A2"+ - "\u0000\u0000\uF6E3\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uF036\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE331\u0000\u0000\u0000"+ - "\u0000\uE26A\uF8EB\uE8A6\uE8DE\uE775\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF070"+ - "\u0000\u0000\u0000\u0000\uE73A\u0000\u0000\u0000"+ - "\u0000\u0000\uEDE0\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE66B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF2C6\u0000"+ - "\u0000\uF77A\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED65"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE299\u0000\u0000\uEB68\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE6EF\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uF57D\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE1E6\u0000\u0000\u0000"+ - "\uE196\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF5E3\u0000\u0000"+ - "\uED5A\u0000\uE971\u0000\u0000\uF7C8\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF94F\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEF37\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE754\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE0BE"+ - "\u0000\uE93E\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6F7"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uF378\u0000\uE9C0"+ - "\u0000\uE2CD\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uE995\uE7B0\u0000\uEE79\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static String innerIndex6= - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uED4C\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF054\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\uED7C\u0000"+ - "\uED75\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uF8F8\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE14B\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uED4D\u0000\u0000"+ - "\uE1DC\uE7F7\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE9DF\u0000\u0000\u0000"+ - "\u0000\u0000\uF1CE\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uE7D0\u0000\u0000\u0000\u0000\u0000\uEDA3"+ - "\u0000\u0000\u0000\u0000\uF7CD\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE1AE\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2CE"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF63F\u0000\u0000\u0000\u0000\u0000"+ - "\uF9D3\uF0ED\uE66C\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uEDA4\u0000\u0000\u0000\uE5B6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE66D\u0000\u0000"+ - "\u0000\uF7E9\u0000\u0000\u0000\uEEA4\u0000\uE673"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uE3CB\uE674\u0000\u0000\u0000\uE5F2"+ - "\u0000\u0000\u0000\u0000\u0000\uEA9C\u0000\uE6F8"+ - "\u0000\u0000\u0000\u0000\u0000\uE77A\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE2D5\uE79F\u0000\u0000"+ - "\u0000\u0000\u0000\uE73B\u0000\u0000\uF9CB\u0000"+ - "\u0000\u0000\u0000\uF96C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uEB38\uE5F3\u0000"+ - "\u0000\uF9D9\u0000\u0000\uE133\u0000\u0000\u0000"+ - "\uE7F9\u0000\u0000\uE4EA\uF5F5\u0000\uF2C7\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE4DA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE84D\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEF38"+ - "\uE93F\u0000\u0000\u0000\u0000\u0000\uF333\u0000"+ - "\u0000\u0000\u0000\uE1D5\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uEB39\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\uEA3C\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\uF34A\uF241\u0000\u0000\uF242\u0000"+ - "\u0000\u0000\uF65D\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF262"+ - "\u0000\uE656\u0000\u0000\u0000\u0000\u0000\uEB75"+ - "\u0000\u0000\uF4BB\u0000\uEDE1\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED5B"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\uE6A3\u0000\u0000"+ - "\uE8C2\u0000\u0000\u0000\u0000\uE0A0\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\uE2CF\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868"+ - "\u8869\u886A\u886B\u886C\u886D\u886E\u886F\u8870"+ - "\u8871\u8873\u8874\u8875\u8876\u8877\u8878\u8879"+ - "\u887A\u887B\u887C\u887D\u8881\u8882\u8883\u8884"+ - "\u8885\u8886\u8887\u8888\u8889\u888A\u888B\u888C"+ - "\u888D\u888E\u888F\u8890\u8891\u8893\u8894\u8895"+ - "\u8896\u8897\u8898\u8899\u889A\u889B\u889C\u889D"+ - "\u88A1\u88A2\u88A3\u88A4\u88A5\u88A6\u88A7\u88A8"+ - "\u88A9\u88AA\u88AB\u88AC\u88AD\u88AE\u88AF\u88B0"+ - "\u88B1\u88B3\u88B4\u88B5\u88B6\u88B7\u88B8\u88B9"+ - "\u88BA\u88BB\u88BC\u88BD\u88C1\u88C2\u88C3\u88C4"+ - "\u88C5\u88C6\u88C7\u88C8\u88C9\u88CA\u88CB\u88CC"+ - "\u88CD\u88CE\u88CF\u88D0\u88D1\u88D3\u88D4\u88D5"+ - "\u88D6\u88D7\u88D8\u88D9\u88DA\u88DB\u88DC\u88DD"+ - "\u88E1\u88E2\u88E3\u88E4\u88E5\u88E6\u88E7\u88E8"+ - "\u88E9\u88EA\u88EB\u88EC\u88ED\u88EE\u88EF\u88F0"+ - "\u88F1\u88F3\u88F4\u88F5\u88F6\u88F7\u88F8\u88F9"+ - "\u88FA\u88FB\u88FC\u88FD\u8941\u8942\u8943\u8944"+ - "\u8945\u8946\u8947\u8948\u8949\u894A\u894B\u894C"+ - "\u894D\u894E\u894F\u8950\u8951\u8953\u8954\u8955"+ - "\u8956\u8957\u8958\u8959\u895A\u895B\u895C\u895D"+ - "\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968"+ - "\u8969\u896A\u896B\u896C\u896D\u896E\u896F\u8970"+ - "\u8971\u8973\u8974\u8975\u8976\u8977\u8978\u8979"+ - "\u897A\u897B\u897C\u897D\u8981\u8982\u8983\u8984"+ - "\u8985\u8986\u8987\u8988\u8989\u898A\u898B\u898C"+ - "\u898D\u898E\u898F\u8990\u8991\u8993\u8994\u8995"+ - "\u8996\u8997\u8998\u8999\u899A\u899B\u899C\u899D"+ - "\u89A1\u89A2\u89A3\u89A4\u89A5\u89A6\u89A7\u89A8"+ - "\u89A9\u89AA\u89AB\u89AC\u89AD\u89AE\u89AF\u89B0"+ - "\u89B1\u89B3\u89B4\u89B5\u89B6\u89B7\u89B8\u89B9"+ - "\u89BA\u89BB\u89BC\u89BD\u89C1\u89C2\u89C3\u89C4"+ - "\u89C5\u89C6\u89C7\u89C8\u89C9\u89CA\u89CB\u89CC"+ - "\u89CD\u89CE\u89CF\u89D0\u89D1\u89D3\u89D4\u89D5"+ - "\u89D6\u89D7\u89D8\u89D9\u89DA\u89DB\u89DC\u89DD"+ - "\u89E1\u89E2\u89E3\u89E4\u89E5\u89E6\u89E7\u89E8"+ - "\u89E9\u89EA\u89EB\u89EC\u89ED\u89EE\u89EF\u89F0"+ - "\u89F1\u89F3\u89F4\u89F5\u89F6\u89F7\u89F8\u89F9"+ - "\u89FA\u89FB\u89FC\u89FD\u8A41\u8A42\u8A43\u8A44"+ - "\u8A45\u8A46\u8A47\u8A48\u8A49\u8A4A\u8A4B\u8A4C"+ - "\u8A4D\u8A4E\u8A4F\u8A50\u8A51\u8A53\u8A54\u8A55"+ - "\u8A56\u8A57\u8A58\u8A59\u8A5A\u8A5B\u8A5C\u8A5D"+ - "\u8A61\u8A62\u8A63\u8A64\u8A65\u8A66\u8A67\u8A68"+ - "\u8A69\u8A6A\u8A6B\u8A6C\u8A6D\u8A6E\u8A6F\u8A70"+ - "\u8A71\u8A73\u8A74\u8A75\u8A76\u8A77\u8A78\u8A79"+ - "\u8A7A\u8A7B\u8A7C\u8A7D\u8A81\u8A82\u8A83\u8A84"+ - "\u8A85\u8A86\u8A87\u8A88\u8A89\u8A8A\u8A8B\u8A8C"+ - "\u8A8D\u8A8E\u8A8F\u8A90\u8A91\u8A93\u8A94\u8A95"+ - "\u8A96\u8A97\u8A98\u8A99\u8A9A\u8A9B\u8A9C\u8A9D"+ - "\u8AA1\u8AA2\u8AA3\u8AA4\u8AA5\u8AA6\u8AA7\u8AA8"+ - "\u8AA9\u8AAA\u8AAB\u8AAC\u8AAD\u8AAE\u8AAF\u8AB0"+ - "\u8AB1\u8AB3\u8AB4\u8AB5\u8AB6\u8AB7\u8AB8\u8AB9"+ - "\u8ABA\u8ABB\u8ABC\u8ABD\u8AC1\u8AC2\u8AC3\u8AC4"+ - "\u8AC5\u8AC6\u8AC7\u8AC8\u8AC9\u8ACA\u8ACB\u8ACC"+ - "\u8ACD\u8ACE\u8ACF\u8AD0\u8AD1\u8AD3\u8AD4\u8AD5"+ - "\u8AD6\u8AD7\u8AD8\u8AD9\u8ADA\u8ADB\u8ADC\u8ADD"+ - "\u8AE1\u8AE2\u8AE3\u8AE4\u8AE5\u8AE6\u8AE7\u8AE8"+ - "\u8AE9\u8AEA\u8AEB\u8AEC\u8AED\u8AEE\u8AEF\u8AF0"+ - "\u8AF1\u8AF3\u8AF4\u8AF5\u8AF6\u8AF7\u8AF8\u8AF9"+ - "\u8AFA\u8AFB\u8AFC\u8AFD\u8B41\u8B42\u8B43\u8B44"+ - "\u8B45\u8B46\u8B47\u8B48\u8B49\u8B4A\u8B4B\u8B4C"+ - "\u8B4D\u8B4E\u8B4F\u8B50\u8B51\u8B53\u8B54\u8B55"+ - "\u8B56\u8B57\u8B58\u8B59\u8B5A\u8B5B\u8B5C\u8B5D"+ - "\u8B61\u8B62\u8B63\u8B64\u8B65\u8B66\u8B67\u8B68"+ - "\u8B69\u8B6A\u8B6B\u8B6C\u8B6D\u8B6E\u8B6F\u8B70"+ - "\u8B71\u8B73\u8B74\u8B75\u8B76\u8B77\u8B78\u8B79"+ - "\u8B7A\u8B7B\u8B7C\u8B7D\u8B81\u8B82\u8B83\u8B84"+ - "\u8B85\u8B86\u8B87\u8B88\u8B89\u8B8A\u8B8B\u8B8C"+ - "\u8B8D\u8B8E\u8B8F\u8B90\u8B91\u8B93\u8B94\u8B95"+ - "\u8B96\u8B97\u8B98\u8B99\u8B9A\u8B9B\u8B9C\u8B9D"+ - "\u8BA1\u8BA2\u8BA3\u8BA4\u8BA5\u8BA6\u8BA7\u8BA8"+ - "\u8BA9\u8BAA\u8BAB\u8BAC\u8BAD\u8BAE\u8BAF\u8BB0"+ - "\u8BB1\u8BB3\u8BB4\u8BB5\u8BB6\u8BB7\u8BB8\u8BB9"+ - "\u8BBA\u8BBB\u8BBC\u8BBD\u8C61\u8C62\u8C63\u8C64"+ - "\u8C65\u8C66\u8C67\u8C68\u8C69\u8C6A\u8C6B\u8C6C"+ - "\u8C6D\u8C6E\u8C6F\u8C70\u8C71\u8C73\u8C74\u8C75"+ - "\u8C76\u8C77\u8C78\u8C79\u8C7A\u8C7B\u8C7C\u8C7D"+ - "\u8C81\u8C82\u8C83\u8C84\u8C85\u8C86\u8C87\u8C88"+ - "\u8C89\u8C8A\u8C8B\u8C8C\u8C8D\u8C8E\u8C8F\u8C90"+ - "\u8C91\u8C93\u8C94\u8C95\u8C96\u8C97\u8C98\u8C99"+ - "\u8C9A\u8C9B\u8C9C\u8C9D\u8CA1\u8CA2\u8CA3\u8CA4"+ - "\u8CA5\u8CA6\u8CA7\u8CA8\u8CA9\u8CAA\u8CAB\u8CAC"+ - "\u8CAD\u8CAE\u8CAF\u8CB0\u8CB1\u8CB3\u8CB4\u8CB5"+ - "\u8CB6\u8CB7\u8CB8\u8CB9\u8CBA\u8CBB\u8CBC\u8CBD"+ - "\u8CC1\u8CC2\u8CC3\u8CC4\u8CC5\u8CC6\u8CC7\u8CC8"+ - "\u8CC9\u8CCA\u8CCB\u8CCC\u8CCD\u8CCE\u8CCF\u8CD0"+ - "\u8CD1\u8CD3\u8CD4\u8CD5\u8CD6\u8CD7\u8CD8\u8CD9"+ - "\u8CDA\u8CDB\u8CDC\u8CDD\u8CE1\u8CE2\u8CE3\u8CE4"+ - "\u8CE5\u8CE6\u8CE7\u8CE8\u8CE9\u8CEA\u8CEB\u8CEC"+ - "\u8CED\u8CEE\u8CEF\u8CF0\u8CF1\u8CF3\u8CF4\u8CF5"+ - "\u8CF6\u8CF7\u8CF8\u8CF9\u8CFA\u8CFB\u8CFC\u8CFD"+ - "\u8D41\u8D42\u8D43\u8D44\u8D45\u8D46\u8D47\u8D48"+ - "\u8D49\u8D4A\u8D4B\u8D4C\u8D4D\u8D4E\u8D4F\u8D50"+ - "\u8D51\u8D53\u8D54\u8D55\u8D56\u8D57\u8D58\u8D59"+ - "\u8D5A\u8D5B\u8D5C\u8D5D\u8D61\u8D62\u8D63\u8D64"+ - "\u8D65\u8D66\u8D67\u8D68\u8D69\u8D6A\u8D6B\u8D6C"+ - "\u8D6D\u8D6E\u8D6F\u8D70\u8D71\u8D73\u8D74\u8D75"+ - "\u8D76\u8D77\u8D78\u8D79\u8D7A\u8D7B\u8D7C\u8D7D"+ - "\u8D81\u8D82\u8D83\u8D84\u8D85\u8D86\u8D87\u8D88"+ - "\u8D89\u8D8A\u8D8B\u8D8C\u8D8D\u8D8E\u8D8F\u8D90"+ - "\u8D91\u8D93\u8D94\u8D95\u8D96\u8D97\u8D98\u8D99"+ - "\u8D9A\u8D9B\u8D9C\u8D9D\u8DA1\u8DA2\u8DA3\u8DA4"+ - "\u8DA5\u8DA6\u8DA7\u8DA8\u8DA9\u8DAA\u8DAB\u8DAC"+ - "\u8DAD\u8DAE\u8DAF\u8DB0\u8DB1\u8DB3\u8DB4\u8DB5"+ - "\u8DB6\u8DB7\u8DB8\u8DB9\u8DBA\u8DBB\u8DBC\u8DBD"+ - "\u8DC1\u8DC2\u8DC3\u8DC4\u8DC5\u8DC6\u8DC7\u8DC8"+ - "\u8DC9\u8DCA\u8DCB\u8DCC\u8DCD\u8DCE\u8DCF\u8DD0"+ - "\u8DD1\u8DD3\u8DD4\u8DD5\u8DD6\u8DD7\u8DD8\u8DD9"+ - "\u8DDA\u8DDB\u8DDC\u8DDD\u8DE1\u8DE2\u8DE3\u8DE4"+ - "\u8DE5\u8DE6\u8DE7\u8DE8\u8DE9\u8DEA\u8DEB\u8DEC"+ - "\u8DED\u8DEE\u8DEF\u8DF0\u8DF1\u8DF3\u8DF4\u8DF5"+ - "\u8DF6\u8DF7\u8DF8\u8DF9\u8DFA\u8DFB\u8DFC\u8DFD"+ - "\u8E41\u8E42\u8E43\u8E44\u8E45\u8E46\u8E47\u8E48"+ - "\u8E49\u8E4A\u8E4B\u8E4C\u8E4D\u8E4E\u8E4F\u8E50"+ - "\u8E51\u8E53\u8E54\u8E55\u8E56\u8E57\u8E58\u8E59"+ - "\u8E5A\u8E5B\u8E5C\u8E5D\u8E61\u8E62\u8E63\u8E64"+ - "\u8E65\u8E66\u8E67\u8E68\u8E69\u8E6A\u8E6B\u8E6C"+ - "\u8E6D\u8E6E\u8E6F\u8E70\u8E71\u8E73\u8E74\u8E75"+ - "\u8E76\u8E77\u8E78\u8E79\u8E7A\u8E7B\u8E7C\u8E7D"+ - "\u8E81\u8E82\u8E83\u8E84\u8E85\u8E86\u8E87\u8E88"+ - "\u8E89\u8E8A\u8E8B\u8E8C\u8E8D\u8E8E\u8E8F\u8E90"+ - "\u8E91\u8E93\u8E94\u8E95\u8E96\u8E97\u8E98\u8E99"+ - "\u8E9A\u8E9B\u8E9C\u8E9D\u8EA1\u8EA2\u8EA3\u8EA4"+ - "\u8EA5\u8EA6\u8EA7\u8EA8\u8EA9\u8EAA\u8EAB\u8EAC"+ - "\u8EAD\u8EAE\u8EAF\u8EB0\u8EB1\u8EB3\u8EB4\u8EB5"+ - "\u8EB6\u8EB7\u8EB8\u8EB9\u8EBA\u8EBB\u8EBC\u8EBD"+ - "\u8EC1\u8EC2\u8EC3\u8EC4\u8EC5\u8EC6\u8EC7\u8EC8"+ - "\u8EC9\u8ECA\u8ECB\u8ECC\u8ECD\u8ECE\u8ECF\u8ED0"+ - "\u8ED1\u8ED3\u8ED4\u8ED5\u8ED6\u8ED7\u8ED8\u8ED9"+ - "\u8EDA\u8EDB\u8EDC\u8EDD\u8EE1\u8EE2\u8EE3\u8EE4"+ - "\u8EE5\u8EE6\u8EE7\u8EE8\u8EE9\u8EEA\u8EEB\u8EEC"+ - "\u8EED\u8EEE\u8EEF\u8EF0\u8EF1\u8EF3\u8EF4\u8EF5"+ - "\u8EF6\u8EF7\u8EF8\u8EF9\u8EFA\u8EFB\u8EFC\u8EFD"+ - "\u8F41\u8F42\u8F43\u8F44\u8F45\u8F46\u8F47\u8F48"+ - "\u8F49\u8F4A\u8F4B\u8F4C\u8F4D\u8F4E\u8F4F\u8F50"+ - "\u8F51\u8F53\u8F54\u8F55\u8F56\u8F57\u8F58\u8F59"+ - "\u8F5A\u8F5B\u8F5C\u8F5D\u8F61\u8F62\u8F63\u8F64"+ - "\u8F65\u8F66\u8F67\u8F68\u8F69\u8F6A\u8F6B\u8F6C"+ - "\u8F6D\u8F6E\u8F6F\u8F70\u8F71\u8F73\u8F74\u8F75"+ - "\u8F76\u8F77\u8F78\u8F79\u8F7A\u8F7B\u8F7C\u8F7D"+ - "\u8F81\u8F82\u8F83\u8F84\u8F85\u8F86\u8F87\u8F88"+ - "\u8F89\u8F8A\u8F8B\u8F8C\u8F8D\u8F8E\u8F8F\u8F90"+ - "\u8F91\u8F93\u8F94\u8F95\u8F96\u8F97\u8F98\u8F99"+ - "\u8F9A\u8F9B\u8F9C\u8F9D\u8FA1\u8FA2\u8FA3\u8FA4"+ - "\u8FA5\u8FA6\u8FA7\u8FA8\u8FA9\u8FAA\u8FAB\u8FAC"+ - "\u8FAD\u8FAE\u8FAF\u8FB0\u8FB1\u8FB3\u8FB4\u8FB5"+ - "\u8FB6\u8FB7\u8FB8\u8FB9\u8FBA\u8FBB\u8FBC\u8FBD"+ - "\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068"+ - "\u9069\u906A\u906B\u906C\u906D\u906E\u906F\u9070"+ - "\u9071\u9073\u9074\u9075\u9076\u9077\u9078\u9079"+ - "\u907A\u907B\u907C\u907D\u9081\u9082\u9083\u9084"+ - "\u9085\u9086\u9087\u9088\u9089\u908A\u908B\u908C"+ - "\u908D\u908E\u908F\u9090\u9091\u9093\u9094\u9095"+ - "\u9096\u9097\u9098\u9099\u909A\u909B\u909C\u909D"+ - "\u90A1\u90A2\u90A3\u90A4\u90A5\u90A6\u90A7\u90A8"+ - "\u90A9\u90AA\u90AB\u90AC\u90AD\u90AE\u90AF\u90B0"+ - "\u90B1\u90B3\u90B4\u90B5\u90B6\u90B7\u90B8\u90B9"+ - "\u90BA\u90BB\u90BC\u90BD\u90C1\u90C2\u90C3\u90C4"+ - "\u90C5\u90C6\u90C7\u90C8\u90C9\u90CA\u90CB\u90CC"+ - "\u90CD\u90CE\u90CF\u90D0\u90D1\u90D3\u90D4\u90D5"+ - "\u90D6\u90D7\u90D8\u90D9\u90DA\u90DB\u90DC\u90DD"+ - "\u90E1\u90E2\u90E3\u90E4\u90E5\u90E6\u90E7\u90E8"+ - "\u90E9\u90EA\u90EB\u90EC\u90ED\u90EE\u90EF\u90F0"+ - "\u90F1\u90F3\u90F4\u90F5\u90F6\u90F7\u90F8\u90F9"+ - "\u90FA\u90FB\u90FC\u90FD\u9141\u9142\u9143\u9144"+ - "\u9145\u9146\u9147\u9148\u9149\u914A\u914B\u914C"+ - "\u914D\u914E\u914F\u9150\u9151\u9153\u9154\u9155"+ - "\u9156\u9157\u9158\u9159\u915A\u915B\u915C\u915D"+ - "\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168"+ - "\u9169\u916A\u916B\u916C\u916D\u916E\u916F\u9170"+ - "\u9171\u9173\u9174\u9175\u9176\u9177\u9178\u9179"+ - "\u917A\u917B\u917C\u917D\u9181\u9182\u9183\u9184"+ - "\u9185\u9186\u9187\u9188\u9189\u918A\u918B\u918C"+ - "\u918D\u918E\u918F\u9190\u9191\u9193\u9194\u9195"+ - "\u9196\u9197\u9198\u9199\u919A\u919B\u919C\u919D"+ - "\u91A1\u91A2\u91A3\u91A4\u91A5\u91A6\u91A7\u91A8"+ - "\u91A9\u91AA\u91AB\u91AC\u91AD\u91AE\u91AF\u91B0"+ - "\u91B1\u91B3\u91B4\u91B5\u91B6\u91B7\u91B8\u91B9"+ - "\u91BA\u91BB\u91BC\u91BD\u91C1\u91C2\u91C3\u91C4"+ - "\u91C5\u91C6\u91C7\u91C8\u91C9\u91CA\u91CB\u91CC"+ - "\u91CD\u91CE\u91CF\u91D0\u91D1\u91D3\u91D4\u91D5"+ - "\u91D6\u91D7\u91D8\u91D9\u91DA\u91DB\u91DC\u91DD"+ - "\u91E1\u91E2\u91E3\u91E4\u91E5\u91E6\u91E7\u91E8"+ - "\u91E9\u91EA\u91EB\u91EC\u91ED\u91EE\u91EF\u91F0"+ - "\u91F1\u91F3\u91F4\u91F5\u91F6\u91F7\u91F8\u91F9"+ - "\u91FA\u91FB\u91FC\u91FD\u9241\u9242\u9243\u9244"+ - "\u9245\u9246\u9247\u9248\u9249\u924A\u924B\u924C"+ - "\u924D\u924E\u924F\u9250\u9251\u9253\u9254\u9255"+ - "\u9256\u9257\u9258\u9259\u925A\u925B\u925C\u925D"+ - "\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268"+ - "\u9269\u926A\u926B\u926C\u926D\u926E\u926F\u9270"+ - "\u9271\u9273\u9274\u9275\u9276\u9277\u9278\u9279"+ - "\u927A\u927B\u927C\u927D\u9281\u9282\u9283\u9284"+ - "\u9285\u9286\u9287\u9288\u9289\u928A\u928B\u928C"+ - "\u928D\u928E\u928F\u9290\u9291\u9293\u9294\u9295"+ - "\u9296\u9297\u9298\u9299\u929A\u929B\u929C\u929D"+ - "\u92A1\u92A2\u92A3\u92A4\u92A5\u92A6\u92A7\u92A8"+ - "\u92A9\u92AA\u92AB\u92AC\u92AD\u92AE\u92AF\u92B0"+ - "\u92B1\u92B3\u92B4\u92B5\u92B6\u92B7\u92B8\u92B9"+ - "\u92BA\u92BB\u92BC\u92BD\u92C1\u92C2\u92C3\u92C4"+ - "\u92C5\u92C6\u92C7\u92C8\u92C9\u92CA\u92CB\u92CC"+ - "\u92CD\u92CE\u92CF\u92D0\u92D1\u92D3\u92D4\u92D5"+ - "\u92D6\u92D7\u92D8\u92D9\u92DA\u92DB\u92DC\u92DD"+ - "\u92E1\u92E2\u92E3\u92E4\u92E5\u92E6\u92E7\u92E8"+ - "\u92E9\u92EA\u92EB\u92EC\u92ED\u92EE\u92EF\u92F0"+ - "\u92F1\u92F3\u92F4\u92F5\u92F6\u92F7\u92F8\u92F9"+ - "\u92FA\u92FB\u92FC\u92FD\u9341\u9342\u9343\u9344"+ - "\u9345\u9346\u9347\u9348\u9349\u934A\u934B\u934C"+ - "\u934D\u934E\u934F\u9350\u9351\u9353\u9354\u9355"+ - "\u9356\u9357\u9358\u9359\u935A\u935B\u935C\u935D"+ - "\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368"+ - "\u9369\u936A\u936B\u936C\u936D\u936E\u936F\u9370"+ - "\u9371\u9373\u9374\u9375\u9376\u9377\u9378\u9379"+ - "\u937A\u937B\u937C\u937D\u9381\u9382\u9383\u9384"+ - "\u9385\u9386\u9387\u9388\u9389\u938A\u938B\u938C"+ - "\u938D\u938E\u938F\u9390\u9391\u9393\u9394\u9395"+ - "\u9396\u9397\u9398\u9399\u939A\u939B\u939C\u939D"+ - "\u93A1\u93A2\u93A3\u93A4\u93A5\u93A6\u93A7\u93A8"+ - "\u93A9\u93AA\u93AB\u93AC\u93AD\u93AE\u93AF\u93B0"+ - "\u93B1\u93B3\u93B4\u93B5\u93B6\u93B7\u93B8\u93B9"+ - "\u93BA\u93BB\u93BC\u93BD\u9461\u9462\u9463\u9464"+ - "\u9465\u9466\u9467\u9468\u9469\u946A\u946B\u946C"+ - "\u946D\u946E\u946F\u9470\u9471\u9473\u9474\u9475"+ - "\u9476\u9477\u9478\u9479\u947A\u947B\u947C\u947D"+ - "\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488"+ - "\u9489\u948A\u948B\u948C\u948D\u948E\u948F\u9490"+ - "\u9491\u9493\u9494\u9495\u9496\u9497\u9498\u9499"+ - "\u949A\u949B\u949C\u949D\u94A1\u94A2\u94A3\u94A4"+ - "\u94A5\u94A6\u94A7\u94A8\u94A9\u94AA\u94AB\u94AC"+ - "\u94AD\u94AE\u94AF\u94B0\u94B1\u94B3\u94B4\u94B5"+ - "\u94B6\u94B7\u94B8\u94B9\u94BA\u94BB\u94BC\u94BD"+ - "\u94C1\u94C2\u94C3\u94C4\u94C5\u94C6\u94C7\u94C8"+ - "\u94C9\u94CA\u94CB\u94CC\u94CD\u94CE\u94CF\u94D0"+ - "\u94D1\u94D3\u94D4\u94D5\u94D6\u94D7\u94D8\u94D9"+ - "\u94DA\u94DB\u94DC\u94DD\u94E1\u94E2\u94E3\u94E4"+ - "\u94E5\u94E6\u94E7\u94E8\u94E9\u94EA\u94EB\u94EC"+ - "\u94ED\u94EE\u94EF\u94F0\u94F1\u94F3\u94F4\u94F5"+ - "\u94F6\u94F7\u94F8\u94F9\u94FA\u94FB\u94FC\u94FD"+ - "\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548"+ - "\u9549\u954A\u954B\u954C\u954D\u954E\u954F\u9550"+ - "\u9551\u9553\u9554\u9555\u9556\u9557\u9558\u9559"+ - "\u955A\u955B\u955C\u955D\u9561\u9562\u9563\u9564"+ - "\u9565\u9566\u9567\u9568\u9569\u956A\u956B\u956C"+ - "\u956D\u956E\u956F\u9570\u9571\u9573\u9574\u9575"+ - "\u9576\u9577\u9578\u9579\u957A\u957B\u957C\u957D"+ - "\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588"+ - "\u9589\u958A\u958B\u958C\u958D\u958E\u958F\u9590"+ - "\u9591\u9593\u9594\u9595\u9596\u9597\u9598\u9599"+ - "\u959A\u959B\u959C\u959D\u95A1\u95A2\u95A3\u95A4"+ - "\u95A5\u95A6\u95A7\u95A8\u95A9\u95AA\u95AB\u95AC"+ - "\u95AD\u95AE\u95AF\u95B0\u95B1\u95B3\u95B4\u95B5"+ - "\u95B6\u95B7\u95B8\u95B9\u95BA\u95BB\u95BC\u95BD"+ - "\u95C1\u95C2\u95C3\u95C4\u95C5\u95C6\u95C7\u95C8"+ - "\u95C9\u95CA\u95CB\u95CC\u95CD\u95CE\u95CF\u95D0"+ - "\u95D1\u95D3\u95D4\u95D5\u95D6\u95D7\u95D8\u95D9"+ - "\u95DA\u95DB\u95DC\u95DD\u95E1\u95E2\u95E3\u95E4"+ - "\u95E5\u95E6\u95E7\u95E8\u95E9\u95EA\u95EB\u95EC"+ - "\u95ED\u95EE\u95EF\u95F0\u95F1\u95F3\u95F4\u95F5"+ - "\u95F6\u95F7\u95F8\u95F9\u95FA\u95FB\u95FC\u95FD"+ - "\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648"+ - "\u9649\u964A\u964B\u964C\u964D\u964E\u964F\u9650"+ - "\u9651\u9653\u9654\u9655\u9656\u9657\u9658\u9659"+ - "\u965A\u965B\u965C\u965D\u9661\u9662\u9663\u9664"+ - "\u9665\u9666\u9667\u9668\u9669\u966A\u966B\u966C"+ - "\u966D\u966E\u966F\u9670\u9671\u9673\u9674\u9675"+ - "\u9676\u9677\u9678\u9679\u967A\u967B\u967C\u967D"+ - "\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688"+ - "\u9689\u968A\u968B\u968C\u968D\u968E\u968F\u9690"+ - "\u9691\u9693\u9694\u9695\u9696\u9697\u9698\u9699"+ - "\u969A\u969B\u969C\u969D\u96A1\u96A2\u96A3\u96A4"+ - "\u96A5\u96A6\u96A7\u96A8\u96A9\u96AA\u96AB\u96AC"+ - "\u96AD\u96AE\u96AF\u96B0\u96B1\u96B3\u96B4\u96B5"+ - "\u96B6\u96B7\u96B8\u96B9\u96BA\u96BB\u96BC\u96BD"+ - "\u96C1\u96C2\u96C3\u96C4\u96C5\u96C6\u96C7\u96C8"+ - "\u96C9\u96CA\u96CB\u96CC\u96CD\u96CE\u96CF\u96D0"+ - "\u96D1\u96D3\u96D4\u96D5\u96D6\u96D7\u96D8\u96D9"+ - "\u96DA\u96DB\u96DC\u96DD\u96E1\u96E2\u96E3\u96E4"+ - "\u96E5\u96E6\u96E7\u96E8\u96E9\u96EA\u96EB\u96EC"+ - "\u96ED\u96EE\u96EF\u96F0\u96F1\u96F3\u96F4\u96F5"+ - "\u96F6\u96F7\u96F8\u96F9\u96FA\u96FB\u96FC\u96FD"+ - "\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748"+ - "\u9749\u974A\u974B\u974C\u974D\u974E\u974F\u9750"+ - "\u9751\u9753\u9754\u9755\u9756\u9757\u9758\u9759"+ - "\u975A\u975B\u975C\u975D\u9761\u9762\u9763\u9764"+ - "\u9765\u9766\u9767\u9768\u9769\u976A\u976B\u976C"+ - "\u976D\u976E\u976F\u9770\u9771\u9773\u9774\u9775"+ - "\u9776\u9777\u9778\u9779\u977A\u977B\u977C\u977D"+ - "\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788"+ - "\u9789\u978A\u978B\u978C\u978D\u978E\u978F\u9790"+ - "\u9791\u9793\u9794\u9795\u9796\u9797\u9798\u9799"+ - "\u979A\u979B\u979C\u979D\u97A1\u97A2\u97A3\u97A4"+ - "\u97A5\u97A6\u97A7\u97A8\u97A9\u97AA\u97AB\u97AC"+ - "\u97AD\u97AE\u97AF\u97B0\u97B1\u97B3\u97B4\u97B5"+ - "\u97B6\u97B7\u97B8\u97B9\u97BA\u97BB\u97BC\u97BD"+ - "\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868"+ - "\u9869\u986A\u986B\u986C\u986D\u986E\u986F\u9870"+ - "\u9871\u9873\u9874\u9875\u9876\u9877\u9878\u9879"+ - "\u987A\u987B\u987C\u987D\u9881\u9882\u9883\u9884"+ - "\u9885\u9886\u9887\u9888\u9889\u988A\u988B\u988C"+ - "\u988D\u988E\u988F\u9890\u9891\u9893\u9894\u9895"+ - "\u9896\u9897\u9898\u9899\u989A\u989B\u989C\u989D"+ - "\u98A1\u98A2\u98A3\u98A4\u98A5\u98A6\u98A7\u98A8"+ - "\u98A9\u98AA\u98AB\u98AC\u98AD\u98AE\u98AF\u98B0"+ - "\u98B1\u98B3\u98B4\u98B5\u98B6\u98B7\u98B8\u98B9"+ - "\u98BA\u98BB\u98BC\u98BD\u98C1\u98C2\u98C3\u98C4"+ - "\u98C5\u98C6\u98C7\u98C8\u98C9\u98CA\u98CB\u98CC"+ - "\u98CD\u98CE\u98CF\u98D0\u98D1\u98D3\u98D4\u98D5"+ - "\u98D6\u98D7\u98D8\u98D9\u98DA\u98DB\u98DC\u98DD"+ - "\u98E1\u98E2\u98E3\u98E4\u98E5\u98E6\u98E7\u98E8"+ - "\u98E9\u98EA\u98EB\u98EC\u98ED\u98EE\u98EF\u98F0"+ - "\u98F1\u98F3\u98F4\u98F5\u98F6\u98F7\u98F8\u98F9"+ - "\u98FA\u98FB\u98FC\u98FD\u9941\u9942\u9943\u9944"+ - "\u9945\u9946\u9947\u9948\u9949\u994A\u994B\u994C"+ - "\u994D\u994E\u994F\u9950\u9951\u9953\u9954\u9955"+ - "\u9956\u9957\u9958\u9959\u995A\u995B\u995C\u995D"+ - "\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968"+ - "\u9969\u996A\u996B\u996C\u996D\u996E\u996F\u9970"+ - "\u9971\u9973\u9974\u9975\u9976\u9977\u9978\u9979"+ - "\u997A\u997B\u997C\u997D\u9981\u9982\u9983\u9984"+ - "\u9985\u9986\u9987\u9988\u9989\u998A\u998B\u998C"+ - "\u998D\u998E\u998F\u9990\u9991\u9993\u9994\u9995"+ - "\u9996\u9997\u9998\u9999\u999A\u999B\u999C\u999D"+ - "\u99A1\u99A2\u99A3\u99A4\u99A5\u99A6\u99A7\u99A8"+ - "\u99A9\u99AA\u99AB\u99AC\u99AD\u99AE\u99AF\u99B0"+ - "\u99B1\u99B3\u99B4\u99B5\u99B6\u99B7\u99B8\u99B9"+ - "\u99BA\u99BB\u99BC\u99BD\u99C1\u99C2\u99C3\u99C4"+ - "\u99C5\u99C6\u99C7\u99C8\u99C9\u99CA\u99CB\u99CC"+ - "\u99CD\u99CE\u99CF\u99D0\u99D1\u99D3\u99D4\u99D5"+ - "\u99D6\u99D7\u99D8\u99D9\u99DA\u99DB\u99DC\u99DD"+ - "\u99E1\u99E2\u99E3\u99E4\u99E5\u99E6\u99E7\u99E8"+ - "\u99E9\u99EA\u99EB\u99EC\u99ED\u99EE\u99EF\u99F0"+ - "\u99F1\u99F3\u99F4\u99F5\u99F6\u99F7\u99F8\u99F9"+ - "\u99FA\u99FB\u99FC\u99FD\u9A41\u9A42\u9A43\u9A44"+ - "\u9A45\u9A46\u9A47\u9A48\u9A49\u9A4A\u9A4B\u9A4C"+ - "\u9A4D\u9A4E\u9A4F\u9A50\u9A51\u9A53\u9A54\u9A55"+ - "\u9A56\u9A57\u9A58\u9A59\u9A5A\u9A5B\u9A5C\u9A5D"+ - "\u9A61\u9A62\u9A63\u9A64\u9A65\u9A66\u9A67\u9A68"+ - "\u9A69\u9A6A\u9A6B\u9A6C\u9A6D\u9A6E\u9A6F\u9A70"+ - "\u9A71\u9A73\u9A74\u9A75\u9A76\u9A77\u9A78\u9A79"+ - "\u9A7A\u9A7B\u9A7C\u9A7D\u9A81\u9A82\u9A83\u9A84"+ - "\u9A85\u9A86\u9A87\u9A88\u9A89\u9A8A\u9A8B\u9A8C"+ - "\u9A8D\u9A8E\u9A8F\u9A90\u9A91\u9A93\u9A94\u9A95"+ - "\u9A96\u9A97\u9A98\u9A99\u9A9A\u9A9B\u9A9C\u9A9D"+ - "\u9AA1\u9AA2\u9AA3\u9AA4\u9AA5\u9AA6\u9AA7\u9AA8"+ - "\u9AA9\u9AAA\u9AAB\u9AAC\u9AAD\u9AAE\u9AAF\u9AB0"+ - "\u9AB1\u9AB3\u9AB4\u9AB5\u9AB6\u9AB7\u9AB8\u9AB9"+ - "\u9ABA\u9ABB\u9ABC\u9ABD\u9AC1\u9AC2\u9AC3\u9AC4"+ - "\u9AC5\u9AC6\u9AC7\u9AC8\u9AC9\u9ACA\u9ACB\u9ACC"+ - "\u9ACD\u9ACE\u9ACF\u9AD0\u9AD1\u9AD3\u9AD4\u9AD5"+ - "\u9AD6\u9AD7\u9AD8\u9AD9\u9ADA\u9ADB\u9ADC\u9ADD"+ - "\u9AE1\u9AE2\u9AE3\u9AE4\u9AE5\u9AE6\u9AE7\u9AE8"+ - "\u9AE9\u9AEA\u9AEB\u9AEC\u9AED\u9AEE\u9AEF\u9AF0"+ - "\u9AF1\u9AF3\u9AF4\u9AF5\u9AF6\u9AF7\u9AF8\u9AF9"+ - "\u9AFA\u9AFB\u9AFC\u9AFD\u9B41\u9B42\u9B43\u9B44"+ - "\u9B45\u9B46\u9B47\u9B48\u9B49\u9B4A\u9B4B\u9B4C"+ - "\u9B4D\u9B4E\u9B4F\u9B50\u9B51\u9B53\u9B54\u9B55"+ - "\u9B56\u9B57\u9B58\u9B59\u9B5A\u9B5B\u9B5C\u9B5D"+ - "\u9B61\u9B62\u9B63\u9B64\u9B65\u9B66\u9B67\u9B68"+ - "\u9B69\u9B6A\u9B6B\u9B6C\u9B6D\u9B6E\u9B6F\u9B70"+ - "\u9B71\u9B73\u9B74\u9B75\u9B76\u9B77\u9B78\u9B79"+ - "\u9B7A\u9B7B\u9B7C\u9B7D\u9B81\u9B82\u9B83\u9B84"+ - "\u9B85\u9B86\u9B87\u9B88\u9B89\u9B8A\u9B8B\u9B8C"+ - "\u9B8D\u9B8E\u9B8F\u9B90\u9B91\u9B93\u9B94\u9B95"+ - "\u9B96\u9B97\u9B98\u9B99\u9B9A\u9B9B\u9B9C\u9B9D"+ - "\u9BA1\u9BA2\u9BA3\u9BA4\u9BA5\u9BA6\u9BA7\u9BA8"+ - "\u9BA9\u9BAA\u9BAB\u9BAC\u9BAD\u9BAE\u9BAF\u9BB0"+ - "\u9BB1\u9BB3\u9BB4\u9BB5\u9BB6\u9BB7\u9BB8\u9BB9"+ - "\u9BBA\u9BBB\u9BBC\u9BBD\u9C61\u9C62\u9C63\u9C64"+ - "\u9C65\u9C66\u9C67\u9C68\u9C69\u9C6A\u9C6B\u9C6C"+ - "\u9C6D\u9C6E\u9C6F\u9C70\u9C71\u9C73\u9C74\u9C75"+ - "\u9C76\u9C77\u9C78\u9C79\u9C7A\u9C7B\u9C7C\u9C7D"+ - "\u9C81\u9C82\u9C83\u9C84\u9C85\u9C86\u9C87\u9C88"+ - "\u9C89\u9C8A\u9C8B\u9C8C\u9C8D\u9C8E\u9C8F\u9C90"+ - "\u9C91\u9C93\u9C94\u9C95\u9C96\u9C97\u9C98\u9C99"+ - "\u9C9A\u9C9B\u9C9C\u9C9D\u9CA1\u9CA2\u9CA3\u9CA4"+ - "\u9CA5\u9CA6\u9CA7\u9CA8\u9CA9\u9CAA\u9CAB\u9CAC"+ - "\u9CAD\u9CAE\u9CAF\u9CB0\u9CB1\u9CB3\u9CB4\u9CB5"+ - "\u9CB6\u9CB7\u9CB8\u9CB9\u9CBA\u9CBB\u9CBC\u9CBD"+ - "\u9CC1\u9CC2\u9CC3\u9CC4\u9CC5\u9CC6\u9CC7\u9CC8"+ - "\u9CC9\u9CCA\u9CCB\u9CCC\u9CCD\u9CCE\u9CCF\u9CD0"+ - "\u9CD1\u9CD3\u9CD4\u9CD5\u9CD6\u9CD7\u9CD8\u9CD9"+ - "\u9CDA\u9CDB\u9CDC\u9CDD\u9CE1\u9CE2\u9CE3\u9CE4"+ - "\u9CE5\u9CE6\u9CE7\u9CE8\u9CE9\u9CEA\u9CEB\u9CEC"+ - "\u9CED\u9CEE\u9CEF\u9CF0\u9CF1\u9CF3\u9CF4\u9CF5"+ - "\u9CF6\u9CF7\u9CF8\u9CF9\u9CFA\u9CFB\u9CFC\u9CFD"+ - "\u9D41\u9D42\u9D43\u9D44\u9D45\u9D46\u9D47\u9D48"+ - "\u9D49\u9D4A\u9D4B\u9D4C\u9D4D\u9D4E\u9D4F\u9D50"+ - "\u9D51\u9D53\u9D54\u9D55\u9D56\u9D57\u9D58\u9D59"+ - "\u9D5A\u9D5B\u9D5C\u9D5D\u9D61\u9D62\u9D63\u9D64"+ - "\u9D65\u9D66\u9D67\u9D68\u9D69\u9D6A\u9D6B\u9D6C"+ - "\u9D6D\u9D6E\u9D6F\u9D70\u9D71\u9D73\u9D74\u9D75"+ - "\u9D76\u9D77\u9D78\u9D79\u9D7A\u9D7B\u9D7C\u9D7D"+ - "\u9D81\u9D82\u9D83\u9D84\u9D85\u9D86\u9D87\u9D88"+ - "\u9D89\u9D8A\u9D8B\u9D8C\u9D8D\u9D8E\u9D8F\u9D90"+ - "\u9D91\u9D93\u9D94\u9D95\u9D96\u9D97\u9D98\u9D99"+ - "\u9D9A\u9D9B\u9D9C\u9D9D\u9DA1\u9DA2\u9DA3\u9DA4"+ - "\u9DA5\u9DA6\u9DA7\u9DA8\u9DA9\u9DAA\u9DAB\u9DAC"+ - "\u9DAD\u9DAE\u9DAF\u9DB0\u9DB1\u9DB3\u9DB4\u9DB5"+ - "\u9DB6\u9DB7\u9DB8\u9DB9\u9DBA\u9DBB\u9DBC\u9DBD"+ - "\u9DC1\u9DC2\u9DC3\u9DC4\u9DC5\u9DC6\u9DC7\u9DC8"+ - "\u9DC9\u9DCA\u9DCB\u9DCC\u9DCD\u9DCE\u9DCF\u9DD0"+ - "\u9DD1\u9DD3\u9DD4\u9DD5\u9DD6\u9DD7\u9DD8\u9DD9"+ - "\u9DDA\u9DDB\u9DDC\u9DDD\u9DE1\u9DE2\u9DE3\u9DE4"+ - "\u9DE5\u9DE6\u9DE7\u9DE8\u9DE9\u9DEA\u9DEB\u9DEC"+ - "\u9DED\u9DEE\u9DEF\u9DF0\u9DF1\u9DF3\u9DF4\u9DF5"+ - "\u9DF6\u9DF7\u9DF8\u9DF9\u9DFA\u9DFB\u9DFC\u9DFD"+ - "\u9E41\u9E42\u9E43\u9E44\u9E45\u9E46\u9E47\u9E48"+ - "\u9E49\u9E4A\u9E4B\u9E4C\u9E4D\u9E4E\u9E4F\u9E50"+ - "\u9E51\u9E53\u9E54\u9E55\u9E56\u9E57\u9E58\u9E59"+ - "\u9E5A\u9E5B\u9E5C\u9E5D\u9E61\u9E62\u9E63\u9E64"+ - "\u9E65\u9E66\u9E67\u9E68\u9E69\u9E6A\u9E6B\u9E6C"+ - "\u9E6D\u9E6E\u9E6F\u9E70\u9E71\u9E73\u9E74\u9E75"+ - "\u9E76\u9E77\u9E78\u9E79\u9E7A\u9E7B\u9E7C\u9E7D"+ - "\u9E81\u9E82\u9E83\u9E84\u9E85\u9E86\u9E87\u9E88"+ - "\u9E89\u9E8A\u9E8B\u9E8C\u9E8D\u9E8E\u9E8F\u9E90"+ - "\u9E91\u9E93\u9E94\u9E95\u9E96\u9E97\u9E98\u9E99"; - - private final static String innerIndex7= - "\u9E9A\u9E9B\u9E9C\u9E9D\u9EA1\u9EA2\u9EA3\u9EA4"+ - "\u9EA5\u9EA6\u9EA7\u9EA8\u9EA9\u9EAA\u9EAB\u9EAC"+ - "\u9EAD\u9EAE\u9EAF\u9EB0\u9EB1\u9EB3\u9EB4\u9EB5"+ - "\u9EB6\u9EB7\u9EB8\u9EB9\u9EBA\u9EBB\u9EBC\u9EBD"+ - "\u9EC1\u9EC2\u9EC3\u9EC4\u9EC5\u9EC6\u9EC7\u9EC8"+ - "\u9EC9\u9ECA\u9ECB\u9ECC\u9ECD\u9ECE\u9ECF\u9ED0"+ - "\u9ED1\u9ED3\u9ED4\u9ED5\u9ED6\u9ED7\u9ED8\u9ED9"+ - "\u9EDA\u9EDB\u9EDC\u9EDD\u9EE1\u9EE2\u9EE3\u9EE4"+ - "\u9EE5\u9EE6\u9EE7\u9EE8\u9EE9\u9EEA\u9EEB\u9EEC"+ - "\u9EED\u9EEE\u9EEF\u9EF0\u9EF1\u9EF3\u9EF4\u9EF5"+ - "\u9EF6\u9EF7\u9EF8\u9EF9\u9EFA\u9EFB\u9EFC\u9EFD"+ - "\u9F41\u9F42\u9F43\u9F44\u9F45\u9F46\u9F47\u9F48"+ - "\u9F49\u9F4A\u9F4B\u9F4C\u9F4D\u9F4E\u9F4F\u9F50"+ - "\u9F51\u9F53\u9F54\u9F55\u9F56\u9F57\u9F58\u9F59"+ - "\u9F5A\u9F5B\u9F5C\u9F5D\u9F61\u9F62\u9F63\u9F64"+ - "\u9F65\u9F66\u9F67\u9F68\u9F69\u9F6A\u9F6B\u9F6C"+ - "\u9F6D\u9F6E\u9F6F\u9F70\u9F71\u9F73\u9F74\u9F75"+ - "\u9F76\u9F77\u9F78\u9F79\u9F7A\u9F7B\u9F7C\u9F7D"+ - "\u9F81\u9F82\u9F83\u9F84\u9F85\u9F86\u9F87\u9F88"+ - "\u9F89\u9F8A\u9F8B\u9F8C\u9F8D\u9F8E\u9F8F\u9F90"+ - "\u9F91\u9F93\u9F94\u9F95\u9F96\u9F97\u9F98\u9F99"+ - "\u9F9A\u9F9B\u9F9C\u9F9D\u9FA1\u9FA2\u9FA3\u9FA4"+ - "\u9FA5\u9FA6\u9FA7\u9FA8\u9FA9\u9FAA\u9FAB\u9FAC"+ - "\u9FAD\u9FAE\u9FAF\u9FB0\u9FB1\u9FB3\u9FB4\u9FB5"+ - "\u9FB6\u9FB7\u9FB8\u9FB9\u9FBA\u9FBB\u9FBC\u9FBD"+ - "\uA061\uA062\uA063\uA064\uA065\uA066\uA067\uA068"+ - "\uA069\uA06A\uA06B\uA06C\uA06D\uA06E\uA06F\uA070"+ - "\uA071\uA073\uA074\uA075\uA076\uA077\uA078\uA079"+ - "\uA07A\uA07B\uA07C\uA07D\uA081\uA082\uA083\uA084"+ - "\uA085\uA086\uA087\uA088\uA089\uA08A\uA08B\uA08C"+ - "\uA08D\uA08E\uA08F\uA090\uA091\uA093\uA094\uA095"+ - "\uA096\uA097\uA098\uA099\uA09A\uA09B\uA09C\uA09D"+ - "\uA0A1\uA0A2\uA0A3\uA0A4\uA0A5\uA0A6\uA0A7\uA0A8"+ - "\uA0A9\uA0AA\uA0AB\uA0AC\uA0AD\uA0AE\uA0AF\uA0B0"+ - "\uA0B1\uA0B3\uA0B4\uA0B5\uA0B6\uA0B7\uA0B8\uA0B9"+ - "\uA0BA\uA0BB\uA0BC\uA0BD\uA0C1\uA0C2\uA0C3\uA0C4"+ - "\uA0C5\uA0C6\uA0C7\uA0C8\uA0C9\uA0CA\uA0CB\uA0CC"+ - "\uA0CD\uA0CE\uA0CF\uA0D0\uA0D1\uA0D3\uA0D4\uA0D5"+ - "\uA0D6\uA0D7\uA0D8\uA0D9\uA0DA\uA0DB\uA0DC\uA0DD"+ - "\uA0E1\uA0E2\uA0E3\uA0E4\uA0E5\uA0E6\uA0E7\uA0E8"+ - "\uA0E9\uA0EA\uA0EB\uA0EC\uA0ED\uA0EE\uA0EF\uA0F0"+ - "\uA0F1\uA0F3\uA0F4\uA0F5\uA0F6\uA0F7\uA0F8\uA0F9"+ - "\uA0FA\uA0FB\uA0FC\uA0FD\uA141\uA142\uA143\uA144"+ - "\uA145\uA146\uA147\uA148\uA149\uA14A\uA14B\uA14C"+ - "\uA14D\uA14E\uA14F\uA150\uA151\uA153\uA154\uA155"+ - "\uA156\uA157\uA158\uA159\uA15A\uA15B\uA15C\uA15D"+ - "\uA161\uA162\uA163\uA164\uA165\uA166\uA167\uA168"+ - "\uA169\uA16A\uA16B\uA16C\uA16D\uA16E\uA16F\uA170"+ - "\uA171\uA173\uA174\uA175\uA176\uA177\uA178\uA179"+ - "\uA17A\uA17B\uA17C\uA17D\uA181\uA182\uA183\uA184"+ - "\uA185\uA186\uA187\uA188\uA189\uA18A\uA18B\uA18C"+ - "\uA18D\uA18E\uA18F\uA190\uA191\uA193\uA194\uA195"+ - "\uA196\uA197\uA198\uA199\uA19A\uA19B\uA19C\uA19D"+ - "\uA1A1\uA1A2\uA1A3\uA1A4\uA1A5\uA1A6\uA1A7\uA1A8"+ - "\uA1A9\uA1AA\uA1AB\uA1AC\uA1AD\uA1AE\uA1AF\uA1B0"+ - "\uA1B1\uA1B3\uA1B4\uA1B5\uA1B6\uA1B7\uA1B8\uA1B9"+ - "\uA1BA\uA1BB\uA1BC\uA1BD\uA1C1\uA1C2\uA1C3\uA1C4"+ - "\uA1C5\uA1C6\uA1C7\uA1C8\uA1C9\uA1CA\uA1CB\uA1CC"+ - "\uA1CD\uA1CE\uA1CF\uA1D0\uA1D1\uA1D3\uA1D4\uA1D5"+ - "\uA1D6\uA1D7\uA1D8\uA1D9\uA1DA\uA1DB\uA1DC\uA1DD"+ - "\uA1E1\uA1E2\uA1E3\uA1E4\uA1E5\uA1E6\uA1E7\uA1E8"+ - "\uA1E9\uA1EA\uA1EB\uA1EC\uA1ED\uA1EE\uA1EF\uA1F0"+ - "\uA1F1\uA1F3\uA1F4\uA1F5\uA1F6\uA1F7\uA1F8\uA1F9"+ - "\uA1FA\uA1FB\uA1FC\uA1FD\uA241\uA242\uA243\uA244"+ - "\uA245\uA246\uA247\uA248\uA249\uA24A\uA24B\uA24C"+ - "\uA24D\uA24E\uA24F\uA250\uA251\uA253\uA254\uA255"+ - "\uA256\uA257\uA258\uA259\uA25A\uA25B\uA25C\uA25D"+ - "\uA261\uA262\uA263\uA264\uA265\uA266\uA267\uA268"+ - "\uA269\uA26A\uA26B\uA26C\uA26D\uA26E\uA26F\uA270"+ - "\uA271\uA273\uA274\uA275\uA276\uA277\uA278\uA279"+ - "\uA27A\uA27B\uA27C\uA27D\uA281\uA282\uA283\uA284"+ - "\uA285\uA286\uA287\uA288\uA289\uA28A\uA28B\uA28C"+ - "\uA28D\uA28E\uA28F\uA290\uA291\uA293\uA294\uA295"+ - "\uA296\uA297\uA298\uA299\uA29A\uA29B\uA29C\uA29D"+ - "\uA2A1\uA2A2\uA2A3\uA2A4\uA2A5\uA2A6\uA2A7\uA2A8"+ - "\uA2A9\uA2AA\uA2AB\uA2AC\uA2AD\uA2AE\uA2AF\uA2B0"+ - "\uA2B1\uA2B3\uA2B4\uA2B5\uA2B6\uA2B7\uA2B8\uA2B9"+ - "\uA2BA\uA2BB\uA2BC\uA2BD\uA2C1\uA2C2\uA2C3\uA2C4"+ - "\uA2C5\uA2C6\uA2C7\uA2C8\uA2C9\uA2CA\uA2CB\uA2CC"+ - "\uA2CD\uA2CE\uA2CF\uA2D0\uA2D1\uA2D3\uA2D4\uA2D5"+ - "\uA2D6\uA2D7\uA2D8\uA2D9\uA2DA\uA2DB\uA2DC\uA2DD"+ - "\uA2E1\uA2E2\uA2E3\uA2E4\uA2E5\uA2E6\uA2E7\uA2E8"+ - "\uA2E9\uA2EA\uA2EB\uA2EC\uA2ED\uA2EE\uA2EF\uA2F0"+ - "\uA2F1\uA2F3\uA2F4\uA2F5\uA2F6\uA2F7\uA2F8\uA2F9"+ - "\uA2FA\uA2FB\uA2FC\uA2FD\uA341\uA342\uA343\uA344"+ - "\uA345\uA346\uA347\uA348\uA349\uA34A\uA34B\uA34C"+ - "\uA34D\uA34E\uA34F\uA350\uA351\uA353\uA354\uA355"+ - "\uA356\uA357\uA358\uA359\uA35A\uA35B\uA35C\uA35D"+ - "\uA361\uA362\uA363\uA364\uA365\uA366\uA367\uA368"+ - "\uA369\uA36A\uA36B\uA36C\uA36D\uA36E\uA36F\uA370"+ - "\uA371\uA373\uA374\uA375\uA376\uA377\uA378\uA379"+ - "\uA37A\uA37B\uA37C\uA37D\uA381\uA382\uA383\uA384"+ - "\uA385\uA386\uA387\uA388\uA389\uA38A\uA38B\uA38C"+ - "\uA38D\uA38E\uA38F\uA390\uA391\uA393\uA394\uA395"+ - "\uA396\uA397\uA398\uA399\uA39A\uA39B\uA39C\uA39D"+ - "\uA3A1\uA3A2\uA3A3\uA3A4\uA3A5\uA3A6\uA3A7\uA3A8"+ - "\uA3A9\uA3AA\uA3AB\uA3AC\uA3AD\uA3AE\uA3AF\uA3B0"+ - "\uA3B1\uA3B3\uA3B4\uA3B5\uA3B6\uA3B7\uA3B8\uA3B9"+ - "\uA3BA\uA3BB\uA3BC\uA3BD\uA461\uA462\uA463\uA464"+ - "\uA465\uA466\uA467\uA468\uA469\uA46A\uA46B\uA46C"+ - "\uA46D\uA46E\uA46F\uA470\uA471\uA473\uA474\uA475"+ - "\uA476\uA477\uA478\uA479\uA47A\uA47B\uA47C\uA47D"+ - "\uA481\uA482\uA483\uA484\uA485\uA486\uA487\uA488"+ - "\uA489\uA48A\uA48B\uA48C\uA48D\uA48E\uA48F\uA490"+ - "\uA491\uA493\uA494\uA495\uA496\uA497\uA498\uA499"+ - "\uA49A\uA49B\uA49C\uA49D\uA4A1\uA4A2\uA4A3\uA4A4"+ - "\uA4A5\uA4A6\uA4A7\uA4A8\uA4A9\uA4AA\uA4AB\uA4AC"+ - "\uA4AD\uA4AE\uA4AF\uA4B0\uA4B1\uA4B3\uA4B4\uA4B5"+ - "\uA4B6\uA4B7\uA4B8\uA4B9\uA4BA\uA4BB\uA4BC\uA4BD"+ - "\uA4C1\uA4C2\uA4C3\uA4C4\uA4C5\uA4C6\uA4C7\uA4C8"+ - "\uA4C9\uA4CA\uA4CB\uA4CC\uA4CD\uA4CE\uA4CF\uA4D0"+ - "\uA4D1\uA4D3\uA4D4\uA4D5\uA4D6\uA4D7\uA4D8\uA4D9"+ - "\uA4DA\uA4DB\uA4DC\uA4DD\uA4E1\uA4E2\uA4E3\uA4E4"+ - "\uA4E5\uA4E6\uA4E7\uA4E8\uA4E9\uA4EA\uA4EB\uA4EC"+ - "\uA4ED\uA4EE\uA4EF\uA4F0\uA4F1\uA4F3\uA4F4\uA4F5"+ - "\uA4F6\uA4F7\uA4F8\uA4F9\uA4FA\uA4FB\uA4FC\uA4FD"+ - "\uA541\uA542\uA543\uA544\uA545\uA546\uA547\uA548"+ - "\uA549\uA54A\uA54B\uA54C\uA54D\uA54E\uA54F\uA550"+ - "\uA551\uA553\uA554\uA555\uA556\uA557\uA558\uA559"+ - "\uA55A\uA55B\uA55C\uA55D\uA561\uA562\uA563\uA564"+ - "\uA565\uA566\uA567\uA568\uA569\uA56A\uA56B\uA56C"+ - "\uA56D\uA56E\uA56F\uA570\uA571\uA573\uA574\uA575"+ - "\uA576\uA577\uA578\uA579\uA57A\uA57B\uA57C\uA57D"+ - "\uA581\uA582\uA583\uA584\uA585\uA586\uA587\uA588"+ - "\uA589\uA58A\uA58B\uA58C\uA58D\uA58E\uA58F\uA590"+ - "\uA591\uA593\uA594\uA595\uA596\uA597\uA598\uA599"+ - "\uA59A\uA59B\uA59C\uA59D\uA5A1\uA5A2\uA5A3\uA5A4"+ - "\uA5A5\uA5A6\uA5A7\uA5A8\uA5A9\uA5AA\uA5AB\uA5AC"+ - "\uA5AD\uA5AE\uA5AF\uA5B0\uA5B1\uA5B3\uA5B4\uA5B5"+ - "\uA5B6\uA5B7\uA5B8\uA5B9\uA5BA\uA5BB\uA5BC\uA5BD"+ - "\uA5C1\uA5C2\uA5C3\uA5C4\uA5C5\uA5C6\uA5C7\uA5C8"+ - "\uA5C9\uA5CA\uA5CB\uA5CC\uA5CD\uA5CE\uA5CF\uA5D0"+ - "\uA5D1\uA5D3\uA5D4\uA5D5\uA5D6\uA5D7\uA5D8\uA5D9"+ - "\uA5DA\uA5DB\uA5DC\uA5DD\uA5E1\uA5E2\uA5E3\uA5E4"+ - "\uA5E5\uA5E6\uA5E7\uA5E8\uA5E9\uA5EA\uA5EB\uA5EC"+ - "\uA5ED\uA5EE\uA5EF\uA5F0\uA5F1\uA5F3\uA5F4\uA5F5"+ - "\uA5F6\uA5F7\uA5F8\uA5F9\uA5FA\uA5FB\uA5FC\uA5FD"+ - "\uA641\uA642\uA643\uA644\uA645\uA646\uA647\uA648"+ - "\uA649\uA64A\uA64B\uA64C\uA64D\uA64E\uA64F\uA650"+ - "\uA651\uA653\uA654\uA655\uA656\uA657\uA658\uA659"+ - "\uA65A\uA65B\uA65C\uA65D\uA661\uA662\uA663\uA664"+ - "\uA665\uA666\uA667\uA668\uA669\uA66A\uA66B\uA66C"+ - "\uA66D\uA66E\uA66F\uA670\uA671\uA673\uA674\uA675"+ - "\uA676\uA677\uA678\uA679\uA67A\uA67B\uA67C\uA67D"+ - "\uA681\uA682\uA683\uA684\uA685\uA686\uA687\uA688"+ - "\uA689\uA68A\uA68B\uA68C\uA68D\uA68E\uA68F\uA690"+ - "\uA691\uA693\uA694\uA695\uA696\uA697\uA698\uA699"+ - "\uA69A\uA69B\uA69C\uA69D\uA6A1\uA6A2\uA6A3\uA6A4"+ - "\uA6A5\uA6A6\uA6A7\uA6A8\uA6A9\uA6AA\uA6AB\uA6AC"+ - "\uA6AD\uA6AE\uA6AF\uA6B0\uA6B1\uA6B3\uA6B4\uA6B5"+ - "\uA6B6\uA6B7\uA6B8\uA6B9\uA6BA\uA6BB\uA6BC\uA6BD"+ - "\uA6C1\uA6C2\uA6C3\uA6C4\uA6C5\uA6C6\uA6C7\uA6C8"+ - "\uA6C9\uA6CA\uA6CB\uA6CC\uA6CD\uA6CE\uA6CF\uA6D0"+ - "\uA6D1\uA6D3\uA6D4\uA6D5\uA6D6\uA6D7\uA6D8\uA6D9"+ - "\uA6DA\uA6DB\uA6DC\uA6DD\uA6E1\uA6E2\uA6E3\uA6E4"+ - "\uA6E5\uA6E6\uA6E7\uA6E8\uA6E9\uA6EA\uA6EB\uA6EC"+ - "\uA6ED\uA6EE\uA6EF\uA6F0\uA6F1\uA6F3\uA6F4\uA6F5"+ - "\uA6F6\uA6F7\uA6F8\uA6F9\uA6FA\uA6FB\uA6FC\uA6FD"+ - "\uA741\uA742\uA743\uA744\uA745\uA746\uA747\uA748"+ - "\uA749\uA74A\uA74B\uA74C\uA74D\uA74E\uA74F\uA750"+ - "\uA751\uA753\uA754\uA755\uA756\uA757\uA758\uA759"+ - "\uA75A\uA75B\uA75C\uA75D\uA761\uA762\uA763\uA764"+ - "\uA765\uA766\uA767\uA768\uA769\uA76A\uA76B\uA76C"+ - "\uA76D\uA76E\uA76F\uA770\uA771\uA773\uA774\uA775"+ - "\uA776\uA777\uA778\uA779\uA77A\uA77B\uA77C\uA77D"+ - "\uA781\uA782\uA783\uA784\uA785\uA786\uA787\uA788"+ - "\uA789\uA78A\uA78B\uA78C\uA78D\uA78E\uA78F\uA790"+ - "\uA791\uA793\uA794\uA795\uA796\uA797\uA798\uA799"+ - "\uA79A\uA79B\uA79C\uA79D\uA7A1\uA7A2\uA7A3\uA7A4"+ - "\uA7A5\uA7A6\uA7A7\uA7A8\uA7A9\uA7AA\uA7AB\uA7AC"+ - "\uA7AD\uA7AE\uA7AF\uA7B0\uA7B1\uA7B3\uA7B4\uA7B5"+ - "\uA7B6\uA7B7\uA7B8\uA7B9\uA7BA\uA7BB\uA7BC\uA7BD"+ - "\uA861\uA862\uA863\uA864\uA865\uA866\uA867\uA868"+ - "\uA869\uA86A\uA86B\uA86C\uA86D\uA86E\uA86F\uA870"+ - "\uA871\uA873\uA874\uA875\uA876\uA877\uA878\uA879"+ - "\uA87A\uA87B\uA87C\uA87D\uA881\uA882\uA883\uA884"+ - "\uA885\uA886\uA887\uA888\uA889\uA88A\uA88B\uA88C"+ - "\uA88D\uA88E\uA88F\uA890\uA891\uA893\uA894\uA895"+ - "\uA896\uA897\uA898\uA899\uA89A\uA89B\uA89C\uA89D"+ - "\uA8A1\uA8A2\uA8A3\uA8A4\uA8A5\uA8A6\uA8A7\uA8A8"+ - "\uA8A9\uA8AA\uA8AB\uA8AC\uA8AD\uA8AE\uA8AF\uA8B0"+ - "\uA8B1\uA8B3\uA8B4\uA8B5\uA8B6\uA8B7\uA8B8\uA8B9"+ - "\uA8BA\uA8BB\uA8BC\uA8BD\uA8C1\uA8C2\uA8C3\uA8C4"+ - "\uA8C5\uA8C6\uA8C7\uA8C8\uA8C9\uA8CA\uA8CB\uA8CC"+ - "\uA8CD\uA8CE\uA8CF\uA8D0\uA8D1\uA8D3\uA8D4\uA8D5"+ - "\uA8D6\uA8D7\uA8D8\uA8D9\uA8DA\uA8DB\uA8DC\uA8DD"+ - "\uA8E1\uA8E2\uA8E3\uA8E4\uA8E5\uA8E6\uA8E7\uA8E8"+ - "\uA8E9\uA8EA\uA8EB\uA8EC\uA8ED\uA8EE\uA8EF\uA8F0"+ - "\uA8F1\uA8F3\uA8F4\uA8F5\uA8F6\uA8F7\uA8F8\uA8F9"+ - "\uA8FA\uA8FB\uA8FC\uA8FD\uA941\uA942\uA943\uA944"+ - "\uA945\uA946\uA947\uA948\uA949\uA94A\uA94B\uA94C"+ - "\uA94D\uA94E\uA94F\uA950\uA951\uA953\uA954\uA955"+ - "\uA956\uA957\uA958\uA959\uA95A\uA95B\uA95C\uA95D"+ - "\uA961\uA962\uA963\uA964\uA965\uA966\uA967\uA968"+ - "\uA969\uA96A\uA96B\uA96C\uA96D\uA96E\uA96F\uA970"+ - "\uA971\uA973\uA974\uA975\uA976\uA977\uA978\uA979"+ - "\uA97A\uA97B\uA97C\uA97D\uA981\uA982\uA983\uA984"+ - "\uA985\uA986\uA987\uA988\uA989\uA98A\uA98B\uA98C"+ - "\uA98D\uA98E\uA98F\uA990\uA991\uA993\uA994\uA995"+ - "\uA996\uA997\uA998\uA999\uA99A\uA99B\uA99C\uA99D"+ - "\uA9A1\uA9A2\uA9A3\uA9A4\uA9A5\uA9A6\uA9A7\uA9A8"+ - "\uA9A9\uA9AA\uA9AB\uA9AC\uA9AD\uA9AE\uA9AF\uA9B0"+ - "\uA9B1\uA9B3\uA9B4\uA9B5\uA9B6\uA9B7\uA9B8\uA9B9"+ - "\uA9BA\uA9BB\uA9BC\uA9BD\uA9C1\uA9C2\uA9C3\uA9C4"+ - "\uA9C5\uA9C6\uA9C7\uA9C8\uA9C9\uA9CA\uA9CB\uA9CC"+ - "\uA9CD\uA9CE\uA9CF\uA9D0\uA9D1\uA9D3\uA9D4\uA9D5"+ - "\uA9D6\uA9D7\uA9D8\uA9D9\uA9DA\uA9DB\uA9DC\uA9DD"+ - "\uA9E1\uA9E2\uA9E3\uA9E4\uA9E5\uA9E6\uA9E7\uA9E8"+ - "\uA9E9\uA9EA\uA9EB\uA9EC\uA9ED\uA9EE\uA9EF\uA9F0"+ - "\uA9F1\uA9F3\uA9F4\uA9F5\uA9F6\uA9F7\uA9F8\uA9F9"+ - "\uA9FA\uA9FB\uA9FC\uA9FD\uAA41\uAA42\uAA43\uAA44"+ - "\uAA45\uAA46\uAA47\uAA48\uAA49\uAA4A\uAA4B\uAA4C"+ - "\uAA4D\uAA4E\uAA4F\uAA50\uAA51\uAA53\uAA54\uAA55"+ - "\uAA56\uAA57\uAA58\uAA59\uAA5A\uAA5B\uAA5C\uAA5D"+ - "\uAA61\uAA62\uAA63\uAA64\uAA65\uAA66\uAA67\uAA68"+ - "\uAA69\uAA6A\uAA6B\uAA6C\uAA6D\uAA6E\uAA6F\uAA70"+ - "\uAA71\uAA73\uAA74\uAA75\uAA76\uAA77\uAA78\uAA79"+ - "\uAA7A\uAA7B\uAA7C\uAA7D\uAA81\uAA82\uAA83\uAA84"+ - "\uAA85\uAA86\uAA87\uAA88\uAA89\uAA8A\uAA8B\uAA8C"+ - "\uAA8D\uAA8E\uAA8F\uAA90\uAA91\uAA93\uAA94\uAA95"+ - "\uAA96\uAA97\uAA98\uAA99\uAA9A\uAA9B\uAA9C\uAA9D"+ - "\uAAA1\uAAA2\uAAA3\uAAA4\uAAA5\uAAA6\uAAA7\uAAA8"+ - "\uAAA9\uAAAA\uAAAB\uAAAC\uAAAD\uAAAE\uAAAF\uAAB0"+ - "\uAAB1\uAAB3\uAAB4\uAAB5\uAAB6\uAAB7\uAAB8\uAAB9"+ - "\uAABA\uAABB\uAABC\uAABD\uAAC1\uAAC2\uAAC3\uAAC4"+ - "\uAAC5\uAAC6\uAAC7\uAAC8\uAAC9\uAACA\uAACB\uAACC"+ - "\uAACD\uAACE\uAACF\uAAD0\uAAD1\uAAD3\uAAD4\uAAD5"+ - "\uAAD6\uAAD7\uAAD8\uAAD9\uAADA\uAADB\uAADC\uAADD"+ - "\uAAE1\uAAE2\uAAE3\uAAE4\uAAE5\uAAE6\uAAE7\uAAE8"+ - "\uAAE9\uAAEA\uAAEB\uAAEC\uAAED\uAAEE\uAAEF\uAAF0"+ - "\uAAF1\uAAF3\uAAF4\uAAF5\uAAF6\uAAF7\uAAF8\uAAF9"+ - "\uAAFA\uAAFB\uAAFC\uAAFD\uAB41\uAB42\uAB43\uAB44"+ - "\uAB45\uAB46\uAB47\uAB48\uAB49\uAB4A\uAB4B\uAB4C"+ - "\uAB4D\uAB4E\uAB4F\uAB50\uAB51\uAB53\uAB54\uAB55"+ - "\uAB56\uAB57\uAB58\uAB59\uAB5A\uAB5B\uAB5C\uAB5D"+ - "\uAB61\uAB62\uAB63\uAB64\uAB65\uAB66\uAB67\uAB68"+ - "\uAB69\uAB6A\uAB6B\uAB6C\uAB6D\uAB6E\uAB6F\uAB70"+ - "\uAB71\uAB73\uAB74\uAB75\uAB76\uAB77\uAB78\uAB79"+ - "\uAB7A\uAB7B\uAB7C\uAB7D\uAB81\uAB82\uAB83\uAB84"+ - "\uAB85\uAB86\uAB87\uAB88\uAB89\uAB8A\uAB8B\uAB8C"+ - "\uAB8D\uAB8E\uAB8F\uAB90\uAB91\uAB93\uAB94\uAB95"+ - "\uAB96\uAB97\uAB98\uAB99\uAB9A\uAB9B\uAB9C\uAB9D"+ - "\uABA1\uABA2\uABA3\uABA4\uABA5\uABA6\uABA7\uABA8"+ - "\uABA9\uABAA\uABAB\uABAC\uABAD\uABAE\uABAF\uABB0"+ - "\uABB1\uABB3\uABB4\uABB5\uABB6\uABB7\uABB8\uABB9"+ - "\uABBA\uABBB\uABBC\uABBD\uAC61\uAC62\uAC63\uAC64"+ - "\uAC65\uAC66\uAC67\uAC68\uAC69\uAC6A\uAC6B\uAC6C"+ - "\uAC6D\uAC6E\uAC6F\uAC70\uAC71\uAC73\uAC74\uAC75"+ - "\uAC76\uAC77\uAC78\uAC79\uAC7A\uAC7B\uAC7C\uAC7D"+ - "\uAC81\uAC82\uAC83\uAC84\uAC85\uAC86\uAC87\uAC88"+ - "\uAC89\uAC8A\uAC8B\uAC8C\uAC8D\uAC8E\uAC8F\uAC90"+ - "\uAC91\uAC93\uAC94\uAC95\uAC96\uAC97\uAC98\uAC99"+ - "\uAC9A\uAC9B\uAC9C\uAC9D\uACA1\uACA2\uACA3\uACA4"+ - "\uACA5\uACA6\uACA7\uACA8\uACA9\uACAA\uACAB\uACAC"+ - "\uACAD\uACAE\uACAF\uACB0\uACB1\uACB3\uACB4\uACB5"+ - "\uACB6\uACB7\uACB8\uACB9\uACBA\uACBB\uACBC\uACBD"+ - "\uACC1\uACC2\uACC3\uACC4\uACC5\uACC6\uACC7\uACC8"+ - "\uACC9\uACCA\uACCB\uACCC\uACCD\uACCE\uACCF\uACD0"+ - "\uACD1\uACD3\uACD4\uACD5\uACD6\uACD7\uACD8\uACD9"+ - "\uACDA\uACDB\uACDC\uACDD\uACE1\uACE2\uACE3\uACE4"+ - "\uACE5\uACE6\uACE7\uACE8\uACE9\uACEA\uACEB\uACEC"+ - "\uACED\uACEE\uACEF\uACF0\uACF1\uACF3\uACF4\uACF5"+ - "\uACF6\uACF7\uACF8\uACF9\uACFA\uACFB\uACFC\uACFD"+ - "\uAD41\uAD42\uAD43\uAD44\uAD45\uAD46\uAD47\uAD48"+ - "\uAD49\uAD4A\uAD4B\uAD4C\uAD4D\uAD4E\uAD4F\uAD50"+ - "\uAD51\uAD53\uAD54\uAD55\uAD56\uAD57\uAD58\uAD59"+ - "\uAD5A\uAD5B\uAD5C\uAD5D\uAD61\uAD62\uAD63\uAD64"+ - "\uAD65\uAD66\uAD67\uAD68\uAD69\uAD6A\uAD6B\uAD6C"+ - "\uAD6D\uAD6E\uAD6F\uAD70\uAD71\uAD73\uAD74\uAD75"+ - "\uAD76\uAD77\uAD78\uAD79\uAD7A\uAD7B\uAD7C\uAD7D"+ - "\uAD81\uAD82\uAD83\uAD84\uAD85\uAD86\uAD87\uAD88"+ - "\uAD89\uAD8A\uAD8B\uAD8C\uAD8D\uAD8E\uAD8F\uAD90"+ - "\uAD91\uAD93\uAD94\uAD95\uAD96\uAD97\uAD98\uAD99"+ - "\uAD9A\uAD9B\uAD9C\uAD9D\uADA1\uADA2\uADA3\uADA4"+ - "\uADA5\uADA6\uADA7\uADA8\uADA9\uADAA\uADAB\uADAC"+ - "\uADAD\uADAE\uADAF\uADB0\uADB1\uADB3\uADB4\uADB5"+ - "\uADB6\uADB7\uADB8\uADB9\uADBA\uADBB\uADBC\uADBD"+ - "\uADC1\uADC2\uADC3\uADC4\uADC5\uADC6\uADC7\uADC8"+ - "\uADC9\uADCA\uADCB\uADCC\uADCD\uADCE\uADCF\uADD0"+ - "\uADD1\uADD3\uADD4\uADD5\uADD6\uADD7\uADD8\uADD9"+ - "\uADDA\uADDB\uADDC\uADDD\uADE1\uADE2\uADE3\uADE4"+ - "\uADE5\uADE6\uADE7\uADE8\uADE9\uADEA\uADEB\uADEC"+ - "\uADED\uADEE\uADEF\uADF0\uADF1\uADF3\uADF4\uADF5"+ - "\uADF6\uADF7\uADF8\uADF9\uADFA\uADFB\uADFC\uADFD"+ - "\uAE41\uAE42\uAE43\uAE44\uAE45\uAE46\uAE47\uAE48"+ - "\uAE49\uAE4A\uAE4B\uAE4C\uAE4D\uAE4E\uAE4F\uAE50"+ - "\uAE51\uAE53\uAE54\uAE55\uAE56\uAE57\uAE58\uAE59"+ - "\uAE5A\uAE5B\uAE5C\uAE5D\uAE61\uAE62\uAE63\uAE64"+ - "\uAE65\uAE66\uAE67\uAE68\uAE69\uAE6A\uAE6B\uAE6C"+ - "\uAE6D\uAE6E\uAE6F\uAE70\uAE71\uAE73\uAE74\uAE75"+ - "\uAE76\uAE77\uAE78\uAE79\uAE7A\uAE7B\uAE7C\uAE7D"+ - "\uAE81\uAE82\uAE83\uAE84\uAE85\uAE86\uAE87\uAE88"+ - "\uAE89\uAE8A\uAE8B\uAE8C\uAE8D\uAE8E\uAE8F\uAE90"+ - "\uAE91\uAE93\uAE94\uAE95\uAE96\uAE97\uAE98\uAE99"+ - "\uAE9A\uAE9B\uAE9C\uAE9D\uAEA1\uAEA2\uAEA3\uAEA4"+ - "\uAEA5\uAEA6\uAEA7\uAEA8\uAEA9\uAEAA\uAEAB\uAEAC"+ - "\uAEAD\uAEAE\uAEAF\uAEB0\uAEB1\uAEB3\uAEB4\uAEB5"+ - "\uAEB6\uAEB7\uAEB8\uAEB9\uAEBA\uAEBB\uAEBC\uAEBD"+ - "\uAEC1\uAEC2\uAEC3\uAEC4\uAEC5\uAEC6\uAEC7\uAEC8"+ - "\uAEC9\uAECA\uAECB\uAECC\uAECD\uAECE\uAECF\uAED0"+ - "\uAED1\uAED3\uAED4\uAED5\uAED6\uAED7\uAED8\uAED9"+ - "\uAEDA\uAEDB\uAEDC\uAEDD\uAEE1\uAEE2\uAEE3\uAEE4"+ - "\uAEE5\uAEE6\uAEE7\uAEE8\uAEE9\uAEEA\uAEEB\uAEEC"+ - "\uAEED\uAEEE\uAEEF\uAEF0\uAEF1\uAEF3\uAEF4\uAEF5"+ - "\uAEF6\uAEF7\uAEF8\uAEF9\uAEFA\uAEFB\uAEFC\uAEFD"+ - "\uAF41\uAF42\uAF43\uAF44\uAF45\uAF46\uAF47\uAF48"+ - "\uAF49\uAF4A\uAF4B\uAF4C\uAF4D\uAF4E\uAF4F\uAF50"+ - "\uAF51\uAF53\uAF54\uAF55\uAF56\uAF57\uAF58\uAF59"+ - "\uAF5A\uAF5B\uAF5C\uAF5D\uAF61\uAF62\uAF63\uAF64"+ - "\uAF65\uAF66\uAF67\uAF68\uAF69\uAF6A\uAF6B\uAF6C"+ - "\uAF6D\uAF6E\uAF6F\uAF70\uAF71\uAF73\uAF74\uAF75"+ - "\uAF76\uAF77\uAF78\uAF79\uAF7A\uAF7B\uAF7C\uAF7D"+ - "\uAF81\uAF82\uAF83\uAF84\uAF85\uAF86\uAF87\uAF88"+ - "\uAF89\uAF8A\uAF8B\uAF8C\uAF8D\uAF8E\uAF8F\uAF90"+ - "\uAF91\uAF93\uAF94\uAF95\uAF96\uAF97\uAF98\uAF99"+ - "\uAF9A\uAF9B\uAF9C\uAF9D\uAFA1\uAFA2\uAFA3\uAFA4"+ - "\uAFA5\uAFA6\uAFA7\uAFA8\uAFA9\uAFAA\uAFAB\uAFAC"+ - "\uAFAD\uAFAE\uAFAF\uAFB0\uAFB1\uAFB3\uAFB4\uAFB5"+ - "\uAFB6\uAFB7\uAFB8\uAFB9\uAFBA\uAFBB\uAFBC\uAFBD"+ - "\uB061\uB062\uB063\uB064\uB065\uB066\uB067\uB068"+ - "\uB069\uB06A\uB06B\uB06C\uB06D\uB06E\uB06F\uB070"+ - "\uB071\uB073\uB074\uB075\uB076\uB077\uB078\uB079"+ - "\uB07A\uB07B\uB07C\uB07D\uB081\uB082\uB083\uB084"+ - "\uB085\uB086\uB087\uB088\uB089\uB08A\uB08B\uB08C"+ - "\uB08D\uB08E\uB08F\uB090\uB091\uB093\uB094\uB095"+ - "\uB096\uB097\uB098\uB099\uB09A\uB09B\uB09C\uB09D"+ - "\uB0A1\uB0A2\uB0A3\uB0A4\uB0A5\uB0A6\uB0A7\uB0A8"+ - "\uB0A9\uB0AA\uB0AB\uB0AC\uB0AD\uB0AE\uB0AF\uB0B0"+ - "\uB0B1\uB0B3\uB0B4\uB0B5\uB0B6\uB0B7\uB0B8\uB0B9"+ - "\uB0BA\uB0BB\uB0BC\uB0BD\uB0C1\uB0C2\uB0C3\uB0C4"+ - "\uB0C5\uB0C6\uB0C7\uB0C8\uB0C9\uB0CA\uB0CB\uB0CC"+ - "\uB0CD\uB0CE\uB0CF\uB0D0\uB0D1\uB0D3\uB0D4\uB0D5"+ - "\uB0D6\uB0D7\uB0D8\uB0D9\uB0DA\uB0DB\uB0DC\uB0DD"+ - "\uB0E1\uB0E2\uB0E3\uB0E4\uB0E5\uB0E6\uB0E7\uB0E8"+ - "\uB0E9\uB0EA\uB0EB\uB0EC\uB0ED\uB0EE\uB0EF\uB0F0"+ - "\uB0F1\uB0F3\uB0F4\uB0F5\uB0F6\uB0F7\uB0F8\uB0F9"+ - "\uB0FA\uB0FB\uB0FC\uB0FD\uB141\uB142\uB143\uB144"+ - "\uB145\uB146\uB147\uB148\uB149\uB14A\uB14B\uB14C"+ - "\uB14D\uB14E\uB14F\uB150\uB151\uB153\uB154\uB155"+ - "\uB156\uB157\uB158\uB159\uB15A\uB15B\uB15C\uB15D"+ - "\uB161\uB162\uB163\uB164\uB165\uB166\uB167\uB168"+ - "\uB169\uB16A\uB16B\uB16C\uB16D\uB16E\uB16F\uB170"+ - "\uB171\uB173\uB174\uB175\uB176\uB177\uB178\uB179"+ - "\uB17A\uB17B\uB17C\uB17D\uB181\uB182\uB183\uB184"+ - "\uB185\uB186\uB187\uB188\uB189\uB18A\uB18B\uB18C"+ - "\uB18D\uB18E\uB18F\uB190\uB191\uB193\uB194\uB195"+ - "\uB196\uB197\uB198\uB199\uB19A\uB19B\uB19C\uB19D"+ - "\uB1A1\uB1A2\uB1A3\uB1A4\uB1A5\uB1A6\uB1A7\uB1A8"+ - "\uB1A9\uB1AA\uB1AB\uB1AC\uB1AD\uB1AE\uB1AF\uB1B0"+ - "\uB1B1\uB1B3\uB1B4\uB1B5\uB1B6\uB1B7\uB1B8\uB1B9"+ - "\uB1BA\uB1BB\uB1BC\uB1BD\uB1C1\uB1C2\uB1C3\uB1C4"+ - "\uB1C5\uB1C6\uB1C7\uB1C8\uB1C9\uB1CA\uB1CB\uB1CC"+ - "\uB1CD\uB1CE\uB1CF\uB1D0\uB1D1\uB1D3\uB1D4\uB1D5"+ - "\uB1D6\uB1D7\uB1D8\uB1D9\uB1DA\uB1DB\uB1DC\uB1DD"+ - "\uB1E1\uB1E2\uB1E3\uB1E4\uB1E5\uB1E6\uB1E7\uB1E8"+ - "\uB1E9\uB1EA\uB1EB\uB1EC\uB1ED\uB1EE\uB1EF\uB1F0"+ - "\uB1F1\uB1F3\uB1F4\uB1F5\uB1F6\uB1F7\uB1F8\uB1F9"+ - "\uB1FA\uB1FB\uB1FC\uB1FD\uB241\uB242\uB243\uB244"+ - "\uB245\uB246\uB247\uB248\uB249\uB24A\uB24B\uB24C"+ - "\uB24D\uB24E\uB24F\uB250\uB251\uB253\uB254\uB255"+ - "\uB256\uB257\uB258\uB259\uB25A\uB25B\uB25C\uB25D"+ - "\uB261\uB262\uB263\uB264\uB265\uB266\uB267\uB268"+ - "\uB269\uB26A\uB26B\uB26C\uB26D\uB26E\uB26F\uB270"+ - "\uB271\uB273\uB274\uB275\uB276\uB277\uB278\uB279"+ - "\uB27A\uB27B\uB27C\uB27D\uB281\uB282\uB283\uB284"+ - "\uB285\uB286\uB287\uB288\uB289\uB28A\uB28B\uB28C"+ - "\uB28D\uB28E\uB28F\uB290\uB291\uB293\uB294\uB295"+ - "\uB296\uB297\uB298\uB299\uB29A\uB29B\uB29C\uB29D"+ - "\uB2A1\uB2A2\uB2A3\uB2A4\uB2A5\uB2A6\uB2A7\uB2A8"+ - "\uB2A9\uB2AA\uB2AB\uB2AC\uB2AD\uB2AE\uB2AF\uB2B0"+ - "\uB2B1\uB2B3\uB2B4\uB2B5\uB2B6\uB2B7\uB2B8\uB2B9"+ - "\uB2BA\uB2BB\uB2BC\uB2BD\uB2C1\uB2C2\uB2C3\uB2C4"+ - "\uB2C5\uB2C6\uB2C7\uB2C8\uB2C9\uB2CA\uB2CB\uB2CC"+ - "\uB2CD\uB2CE\uB2CF\uB2D0\uB2D1\uB2D3\uB2D4\uB2D5"+ - "\uB2D6\uB2D7\uB2D8\uB2D9\uB2DA\uB2DB\uB2DC\uB2DD"+ - "\uB2E1\uB2E2\uB2E3\uB2E4\uB2E5\uB2E6\uB2E7\uB2E8"+ - "\uB2E9\uB2EA\uB2EB\uB2EC\uB2ED\uB2EE\uB2EF\uB2F0"+ - "\uB2F1\uB2F3\uB2F4\uB2F5\uB2F6\uB2F7\uB2F8\uB2F9"+ - "\uB2FA\uB2FB\uB2FC\uB2FD\uB341\uB342\uB343\uB344"+ - "\uB345\uB346\uB347\uB348\uB349\uB34A\uB34B\uB34C"+ - "\uB34D\uB34E\uB34F\uB350\uB351\uB353\uB354\uB355"+ - "\uB356\uB357\uB358\uB359\uB35A\uB35B\uB35C\uB35D"+ - "\uB361\uB362\uB363\uB364\uB365\uB366\uB367\uB368"+ - "\uB369\uB36A\uB36B\uB36C\uB36D\uB36E\uB36F\uB370"+ - "\uB371\uB373\uB374\uB375\uB376\uB377\uB378\uB379"+ - "\uB37A\uB37B\uB37C\uB37D\uB381\uB382\uB383\uB384"+ - "\uB385\uB386\uB387\uB388\uB389\uB38A\uB38B\uB38C"+ - "\uB38D\uB38E\uB38F\uB390\uB391\uB393\uB394\uB395"+ - "\uB396\uB397\uB398\uB399\uB39A\uB39B\uB39C\uB39D"+ - "\uB3A1\uB3A2\uB3A3\uB3A4\uB3A5\uB3A6\uB3A7\uB3A8"+ - "\uB3A9\uB3AA\uB3AB\uB3AC\uB3AD\uB3AE\uB3AF\uB3B0"+ - "\uB3B1\uB3B3\uB3B4\uB3B5\uB3B6\uB3B7\uB3B8\uB3B9"+ - "\uB3BA\uB3BB\uB3BC\uB3BD\uB461\uB462\uB463\uB464"+ - "\uB465\uB466\uB467\uB468\uB469\uB46A\uB46B\uB46C"+ - "\uB46D\uB46E\uB46F\uB470\uB471\uB473\uB474\uB475"+ - "\uB476\uB477\uB478\uB479\uB47A\uB47B\uB47C\uB47D"+ - "\uB481\uB482\uB483\uB484\uB485\uB486\uB487\uB488"+ - "\uB489\uB48A\uB48B\uB48C\uB48D\uB48E\uB48F\uB490"+ - "\uB491\uB493\uB494\uB495\uB496\uB497\uB498\uB499"+ - "\uB49A\uB49B\uB49C\uB49D\uB4A1\uB4A2\uB4A3\uB4A4"+ - "\uB4A5\uB4A6\uB4A7\uB4A8\uB4A9\uB4AA\uB4AB\uB4AC"+ - "\uB4AD\uB4AE\uB4AF\uB4B0\uB4B1\uB4B3\uB4B4\uB4B5"+ - "\uB4B6\uB4B7\uB4B8\uB4B9\uB4BA\uB4BB\uB4BC\uB4BD"+ - "\uB4C1\uB4C2\uB4C3\uB4C4\uB4C5\uB4C6\uB4C7\uB4C8"+ - "\uB4C9\uB4CA\uB4CB\uB4CC\uB4CD\uB4CE\uB4CF\uB4D0"+ - "\uB4D1\uB4D3\uB4D4\uB4D5\uB4D6\uB4D7\uB4D8\uB4D9"+ - "\uB4DA\uB4DB\uB4DC\uB4DD\uB4E1\uB4E2\uB4E3\uB4E4"+ - "\uB4E5\uB4E6\uB4E7\uB4E8\uB4E9\uB4EA\uB4EB\uB4EC"+ - "\uB4ED\uB4EE\uB4EF\uB4F0\uB4F1\uB4F3\uB4F4\uB4F5"+ - "\uB4F6\uB4F7\uB4F8\uB4F9\uB4FA\uB4FB\uB4FC\uB4FD"+ - "\uB541\uB542\uB543\uB544\uB545\uB546\uB547\uB548"+ - "\uB549\uB54A\uB54B\uB54C\uB54D\uB54E\uB54F\uB550"+ - "\uB551\uB553\uB554\uB555\uB556\uB557\uB558\uB559"+ - "\uB55A\uB55B\uB55C\uB55D\uB561\uB562\uB563\uB564"+ - "\uB565\uB566\uB567\uB568\uB569\uB56A\uB56B\uB56C"+ - "\uB56D\uB56E\uB56F\uB570\uB571\uB573\uB574\uB575"+ - "\uB576\uB577\uB578\uB579\uB57A\uB57B\uB57C\uB57D"+ - "\uB581\uB582\uB583\uB584\uB585\uB586\uB587\uB588"+ - "\uB589\uB58A\uB58B\uB58C\uB58D\uB58E\uB58F\uB590"+ - "\uB591\uB593\uB594\uB595\uB596\uB597\uB598\uB599"+ - "\uB59A\uB59B\uB59C\uB59D\uB5A1\uB5A2\uB5A3\uB5A4"+ - "\uB5A5\uB5A6\uB5A7\uB5A8\uB5A9\uB5AA\uB5AB\uB5AC"+ - "\uB5AD\uB5AE\uB5AF\uB5B0\uB5B1\uB5B3\uB5B4\uB5B5"+ - "\uB5B6\uB5B7\uB5B8\uB5B9\uB5BA\uB5BB\uB5BC\uB5BD"+ - "\uB5C1\uB5C2\uB5C3\uB5C4\uB5C5\uB5C6\uB5C7\uB5C8"+ - "\uB5C9\uB5CA\uB5CB\uB5CC\uB5CD\uB5CE\uB5CF\uB5D0"+ - "\uB5D1\uB5D3\uB5D4\uB5D5\uB5D6\uB5D7\uB5D8\uB5D9"+ - "\uB5DA\uB5DB\uB5DC\uB5DD\uB5E1\uB5E2\uB5E3\uB5E4"+ - "\uB5E5\uB5E6\uB5E7\uB5E8\uB5E9\uB5EA\uB5EB\uB5EC"+ - "\uB5ED\uB5EE\uB5EF\uB5F0\uB5F1\uB5F3\uB5F4\uB5F5"+ - "\uB5F6\uB5F7\uB5F8\uB5F9\uB5FA\uB5FB\uB5FC\uB5FD"+ - "\uB641\uB642\uB643\uB644\uB645\uB646\uB647\uB648"+ - "\uB649\uB64A\uB64B\uB64C\uB64D\uB64E\uB64F\uB650"+ - "\uB651\uB653\uB654\uB655\uB656\uB657\uB658\uB659"+ - "\uB65A\uB65B\uB65C\uB65D\uB661\uB662\uB663\uB664"+ - "\uB665\uB666\uB667\uB668\uB669\uB66A\uB66B\uB66C"+ - "\uB66D\uB66E\uB66F\uB670\uB671\uB673\uB674\uB675"+ - "\uB676\uB677\uB678\uB679\uB67A\uB67B\uB67C\uB67D"+ - "\uB681\uB682\uB683\uB684\uB685\uB686\uB687\uB688"+ - "\uB689\uB68A\uB68B\uB68C\uB68D\uB68E\uB68F\uB690"+ - "\uB691\uB693\uB694\uB695\uB696\uB697\uB698\uB699"+ - "\uB69A\uB69B\uB69C\uB69D\uB6A1\uB6A2\uB6A3\uB6A4"+ - "\uB6A5\uB6A6\uB6A7\uB6A8\uB6A9\uB6AA\uB6AB\uB6AC"+ - "\uB6AD\uB6AE\uB6AF\uB6B0\uB6B1\uB6B3\uB6B4\uB6B5"+ - "\uB6B6\uB6B7\uB6B8\uB6B9\uB6BA\uB6BB\uB6BC\uB6BD"+ - "\uB6C1\uB6C2\uB6C3\uB6C4\uB6C5\uB6C6\uB6C7\uB6C8"+ - "\uB6C9\uB6CA\uB6CB\uB6CC\uB6CD\uB6CE\uB6CF\uB6D0"+ - "\uB6D1\uB6D3\uB6D4\uB6D5\uB6D6\uB6D7\uB6D8\uB6D9"+ - "\uB6DA\uB6DB\uB6DC\uB6DD\uB6E1\uB6E2\uB6E3\uB6E4"+ - "\uB6E5\uB6E6\uB6E7\uB6E8\uB6E9\uB6EA\uB6EB\uB6EC"+ - "\uB6ED\uB6EE\uB6EF\uB6F0\uB6F1\uB6F3\uB6F4\uB6F5"+ - "\uB6F6\uB6F7\uB6F8\uB6F9\uB6FA\uB6FB\uB6FC\uB6FD"+ - "\uB741\uB742\uB743\uB744\uB745\uB746\uB747\uB748"+ - "\uB749\uB74A\uB74B\uB74C\uB74D\uB74E\uB74F\uB750"+ - "\uB751\uB753\uB754\uB755\uB756\uB757\uB758\uB759"+ - "\uB75A\uB75B\uB75C\uB75D\uB761\uB762\uB763\uB764"+ - "\uB765\uB766\uB767\uB768\uB769\uB76A\uB76B\uB76C"+ - "\uB76D\uB76E\uB76F\uB770\uB771\uB773\uB774\uB775"+ - "\uB776\uB777\uB778\uB779\uB77A\uB77B\uB77C\uB77D"+ - "\uB781\uB782\uB783\uB784\uB785\uB786\uB787\uB788"+ - "\uB789\uB78A\uB78B\uB78C\uB78D\uB78E\uB78F\uB790"+ - "\uB791\uB793\uB794\uB795\uB796\uB797\uB798\uB799"+ - "\uB79A\uB79B\uB79C\uB79D\uB7A1\uB7A2\uB7A3\uB7A4"+ - "\uB7A5\uB7A6\uB7A7\uB7A8\uB7A9\uB7AA\uB7AB\uB7AC"+ - "\uB7AD\uB7AE\uB7AF\uB7B0\uB7B1\uB7B3\uB7B4\uB7B5"+ - "\uB7B6\uB7B7\uB7B8\uB7B9\uB7BA\uB7BB\uB7BC\uB7BD"+ - "\uB861\uB862\uB863\uB864\uB865\uB866\uB867\uB868"+ - "\uB869\uB86A\uB86B\uB86C\uB86D\uB86E\uB86F\uB870"+ - "\uB871\uB873\uB874\uB875\uB876\uB877\uB878\uB879"+ - "\uB87A\uB87B\uB87C\uB87D\uB881\uB882\uB883\uB884"+ - "\uB885\uB886\uB887\uB888\uB889\uB88A\uB88B\uB88C"+ - "\uB88D\uB88E\uB88F\uB890\uB891\uB893\uB894\uB895"+ - "\uB896\uB897\uB898\uB899\uB89A\uB89B\uB89C\uB89D"+ - "\uB8A1\uB8A2\uB8A3\uB8A4\uB8A5\uB8A6\uB8A7\uB8A8"+ - "\uB8A9\uB8AA\uB8AB\uB8AC\uB8AD\uB8AE\uB8AF\uB8B0"+ - "\uB8B1\uB8B3\uB8B4\uB8B5\uB8B6\uB8B7\uB8B8\uB8B9"+ - "\uB8BA\uB8BB\uB8BC\uB8BD\uB8C1\uB8C2\uB8C3\uB8C4"+ - "\uB8C5\uB8C6\uB8C7\uB8C8\uB8C9\uB8CA\uB8CB\uB8CC"+ - "\uB8CD\uB8CE\uB8CF\uB8D0\uB8D1\uB8D3\uB8D4\uB8D5"+ - "\uB8D6\uB8D7\uB8D8\uB8D9\uB8DA\uB8DB\uB8DC\uB8DD"+ - "\uB8E1\uB8E2\uB8E3\uB8E4\uB8E5\uB8E6\uB8E7\uB8E8"+ - "\uB8E9\uB8EA\uB8EB\uB8EC\uB8ED\uB8EE\uB8EF\uB8F0"+ - "\uB8F1\uB8F3\uB8F4\uB8F5\uB8F6\uB8F7\uB8F8\uB8F9"+ - "\uB8FA\uB8FB\uB8FC\uB8FD\uB941\uB942\uB943\uB944"+ - "\uB945\uB946\uB947\uB948\uB949\uB94A\uB94B\uB94C"+ - "\uB94D\uB94E\uB94F\uB950\uB951\uB953\uB954\uB955"+ - "\uB956\uB957\uB958\uB959\uB95A\uB95B\uB95C\uB95D"+ - "\uB961\uB962\uB963\uB964\uB965\uB966\uB967\uB968"+ - "\uB969\uB96A\uB96B\uB96C\uB96D\uB96E\uB96F\uB970"+ - "\uB971\uB973\uB974\uB975\uB976\uB977\uB978\uB979"+ - "\uB97A\uB97B\uB97C\uB97D\uB981\uB982\uB983\uB984"+ - "\uB985\uB986\uB987\uB988\uB989\uB98A\uB98B\uB98C"+ - "\uB98D\uB98E\uB98F\uB990\uB991\uB993\uB994\uB995"+ - "\uB996\uB997\uB998\uB999\uB99A\uB99B\uB99C\uB99D"+ - "\uB9A1\uB9A2\uB9A3\uB9A4\uB9A5\uB9A6\uB9A7\uB9A8"+ - "\uB9A9\uB9AA\uB9AB\uB9AC\uB9AD\uB9AE\uB9AF\uB9B0"+ - "\uB9B1\uB9B3\uB9B4\uB9B5\uB9B6\uB9B7\uB9B8\uB9B9"+ - "\uB9BA\uB9BB\uB9BC\uB9BD\uB9C1\uB9C2\uB9C3\uB9C4"+ - "\uB9C5\uB9C6\uB9C7\uB9C8\uB9C9\uB9CA\uB9CB\uB9CC"+ - "\uB9CD\uB9CE\uB9CF\uB9D0\uB9D1\uB9D3\uB9D4\uB9D5"+ - "\uB9D6\uB9D7\uB9D8\uB9D9\uB9DA\uB9DB\uB9DC\uB9DD"+ - "\uB9E1\uB9E2\uB9E3\uB9E4\uB9E5\uB9E6\uB9E7\uB9E8"+ - "\uB9E9\uB9EA\uB9EB\uB9EC\uB9ED\uB9EE\uB9EF\uB9F0"+ - "\uB9F1\uB9F3\uB9F4\uB9F5\uB9F6\uB9F7\uB9F8\uB9F9"+ - "\uB9FA\uB9FB\uB9FC\uB9FD\uBA41\uBA42\uBA43\uBA44"+ - "\uBA45\uBA46\uBA47\uBA48\uBA49\uBA4A\uBA4B\uBA4C"+ - "\uBA4D\uBA4E\uBA4F\uBA50\uBA51\uBA53\uBA54\uBA55"+ - "\uBA56\uBA57\uBA58\uBA59\uBA5A\uBA5B\uBA5C\uBA5D"+ - "\uBA61\uBA62\uBA63\uBA64\uBA65\uBA66\uBA67\uBA68"+ - "\uBA69\uBA6A\uBA6B\uBA6C\uBA6D\uBA6E\uBA6F\uBA70"+ - "\uBA71\uBA73\uBA74\uBA75\uBA76\uBA77\uBA78\uBA79"+ - "\uBA7A\uBA7B\uBA7C\uBA7D\uBA81\uBA82\uBA83\uBA84"; - - private final static String innerIndex8= - "\uBA85\uBA86\uBA87\uBA88\uBA89\uBA8A\uBA8B\uBA8C"+ - "\uBA8D\uBA8E\uBA8F\uBA90\uBA91\uBA93\uBA94\uBA95"+ - "\uBA96\uBA97\uBA98\uBA99\uBA9A\uBA9B\uBA9C\uBA9D"+ - "\uBAA1\uBAA2\uBAA3\uBAA4\uBAA5\uBAA6\uBAA7\uBAA8"+ - "\uBAA9\uBAAA\uBAAB\uBAAC\uBAAD\uBAAE\uBAAF\uBAB0"+ - "\uBAB1\uBAB3\uBAB4\uBAB5\uBAB6\uBAB7\uBAB8\uBAB9"+ - "\uBABA\uBABB\uBABC\uBABD\uBAC1\uBAC2\uBAC3\uBAC4"+ - "\uBAC5\uBAC6\uBAC7\uBAC8\uBAC9\uBACA\uBACB\uBACC"+ - "\uBACD\uBACE\uBACF\uBAD0\uBAD1\uBAD3\uBAD4\uBAD5"+ - "\uBAD6\uBAD7\uBAD8\uBAD9\uBADA\uBADB\uBADC\uBADD"+ - "\uBAE1\uBAE2\uBAE3\uBAE4\uBAE5\uBAE6\uBAE7\uBAE8"+ - "\uBAE9\uBAEA\uBAEB\uBAEC\uBAED\uBAEE\uBAEF\uBAF0"+ - "\uBAF1\uBAF3\uBAF4\uBAF5\uBAF6\uBAF7\uBAF8\uBAF9"+ - "\uBAFA\uBAFB\uBAFC\uBAFD\uBB41\uBB42\uBB43\uBB44"+ - "\uBB45\uBB46\uBB47\uBB48\uBB49\uBB4A\uBB4B\uBB4C"+ - "\uBB4D\uBB4E\uBB4F\uBB50\uBB51\uBB53\uBB54\uBB55"+ - "\uBB56\uBB57\uBB58\uBB59\uBB5A\uBB5B\uBB5C\uBB5D"+ - "\uBB61\uBB62\uBB63\uBB64\uBB65\uBB66\uBB67\uBB68"+ - "\uBB69\uBB6A\uBB6B\uBB6C\uBB6D\uBB6E\uBB6F\uBB70"+ - "\uBB71\uBB73\uBB74\uBB75\uBB76\uBB77\uBB78\uBB79"+ - "\uBB7A\uBB7B\uBB7C\uBB7D\uBB81\uBB82\uBB83\uBB84"+ - "\uBB85\uBB86\uBB87\uBB88\uBB89\uBB8A\uBB8B\uBB8C"+ - "\uBB8D\uBB8E\uBB8F\uBB90\uBB91\uBB93\uBB94\uBB95"+ - "\uBB96\uBB97\uBB98\uBB99\uBB9A\uBB9B\uBB9C\uBB9D"+ - "\uBBA1\uBBA2\uBBA3\uBBA4\uBBA5\uBBA6\uBBA7\uBBA8"+ - "\uBBA9\uBBAA\uBBAB\uBBAC\uBBAD\uBBAE\uBBAF\uBBB0"+ - "\uBBB1\uBBB3\uBBB4\uBBB5\uBBB6\uBBB7\uBBB8\uBBB9"+ - "\uBBBA\uBBBB\uBBBC\uBBBD\uBC61\uBC62\uBC63\uBC64"+ - "\uBC65\uBC66\uBC67\uBC68\uBC69\uBC6A\uBC6B\uBC6C"+ - "\uBC6D\uBC6E\uBC6F\uBC70\uBC71\uBC73\uBC74\uBC75"+ - "\uBC76\uBC77\uBC78\uBC79\uBC7A\uBC7B\uBC7C\uBC7D"+ - "\uBC81\uBC82\uBC83\uBC84\uBC85\uBC86\uBC87\uBC88"+ - "\uBC89\uBC8A\uBC8B\uBC8C\uBC8D\uBC8E\uBC8F\uBC90"+ - "\uBC91\uBC93\uBC94\uBC95\uBC96\uBC97\uBC98\uBC99"+ - "\uBC9A\uBC9B\uBC9C\uBC9D\uBCA1\uBCA2\uBCA3\uBCA4"+ - "\uBCA5\uBCA6\uBCA7\uBCA8\uBCA9\uBCAA\uBCAB\uBCAC"+ - "\uBCAD\uBCAE\uBCAF\uBCB0\uBCB1\uBCB3\uBCB4\uBCB5"+ - "\uBCB6\uBCB7\uBCB8\uBCB9\uBCBA\uBCBB\uBCBC\uBCBD"+ - "\uBCC1\uBCC2\uBCC3\uBCC4\uBCC5\uBCC6\uBCC7\uBCC8"+ - "\uBCC9\uBCCA\uBCCB\uBCCC\uBCCD\uBCCE\uBCCF\uBCD0"+ - "\uBCD1\uBCD3\uBCD4\uBCD5\uBCD6\uBCD7\uBCD8\uBCD9"+ - "\uBCDA\uBCDB\uBCDC\uBCDD\uBCE1\uBCE2\uBCE3\uBCE4"+ - "\uBCE5\uBCE6\uBCE7\uBCE8\uBCE9\uBCEA\uBCEB\uBCEC"+ - "\uBCED\uBCEE\uBCEF\uBCF0\uBCF1\uBCF3\uBCF4\uBCF5"+ - "\uBCF6\uBCF7\uBCF8\uBCF9\uBCFA\uBCFB\uBCFC\uBCFD"+ - "\uBD41\uBD42\uBD43\uBD44\uBD45\uBD46\uBD47\uBD48"+ - "\uBD49\uBD4A\uBD4B\uBD4C\uBD4D\uBD4E\uBD4F\uBD50"+ - "\uBD51\uBD53\uBD54\uBD55\uBD56\uBD57\uBD58\uBD59"+ - "\uBD5A\uBD5B\uBD5C\uBD5D\uBD61\uBD62\uBD63\uBD64"+ - "\uBD65\uBD66\uBD67\uBD68\uBD69\uBD6A\uBD6B\uBD6C"+ - "\uBD6D\uBD6E\uBD6F\uBD70\uBD71\uBD73\uBD74\uBD75"+ - "\uBD76\uBD77\uBD78\uBD79\uBD7A\uBD7B\uBD7C\uBD7D"+ - "\uBD81\uBD82\uBD83\uBD84\uBD85\uBD86\uBD87\uBD88"+ - "\uBD89\uBD8A\uBD8B\uBD8C\uBD8D\uBD8E\uBD8F\uBD90"+ - "\uBD91\uBD93\uBD94\uBD95\uBD96\uBD97\uBD98\uBD99"+ - "\uBD9A\uBD9B\uBD9C\uBD9D\uBDA1\uBDA2\uBDA3\uBDA4"+ - "\uBDA5\uBDA6\uBDA7\uBDA8\uBDA9\uBDAA\uBDAB\uBDAC"+ - "\uBDAD\uBDAE\uBDAF\uBDB0\uBDB1\uBDB3\uBDB4\uBDB5"+ - "\uBDB6\uBDB7\uBDB8\uBDB9\uBDBA\uBDBB\uBDBC\uBDBD"+ - "\uBDC1\uBDC2\uBDC3\uBDC4\uBDC5\uBDC6\uBDC7\uBDC8"+ - "\uBDC9\uBDCA\uBDCB\uBDCC\uBDCD\uBDCE\uBDCF\uBDD0"+ - "\uBDD1\uBDD3\uBDD4\uBDD5\uBDD6\uBDD7\uBDD8\uBDD9"+ - "\uBDDA\uBDDB\uBDDC\uBDDD\uBDE1\uBDE2\uBDE3\uBDE4"+ - "\uBDE5\uBDE6\uBDE7\uBDE8\uBDE9\uBDEA\uBDEB\uBDEC"+ - "\uBDED\uBDEE\uBDEF\uBDF0\uBDF1\uBDF3\uBDF4\uBDF5"+ - "\uBDF6\uBDF7\uBDF8\uBDF9\uBDFA\uBDFB\uBDFC\uBDFD"+ - "\uBE41\uBE42\uBE43\uBE44\uBE45\uBE46\uBE47\uBE48"+ - "\uBE49\uBE4A\uBE4B\uBE4C\uBE4D\uBE4E\uBE4F\uBE50"+ - "\uBE51\uBE53\uBE54\uBE55\uBE56\uBE57\uBE58\uBE59"+ - "\uBE5A\uBE5B\uBE5C\uBE5D\uBE61\uBE62\uBE63\uBE64"+ - "\uBE65\uBE66\uBE67\uBE68\uBE69\uBE6A\uBE6B\uBE6C"+ - "\uBE6D\uBE6E\uBE6F\uBE70\uBE71\uBE73\uBE74\uBE75"+ - "\uBE76\uBE77\uBE78\uBE79\uBE7A\uBE7B\uBE7C\uBE7D"+ - "\uBE81\uBE82\uBE83\uBE84\uBE85\uBE86\uBE87\uBE88"+ - "\uBE89\uBE8A\uBE8B\uBE8C\uBE8D\uBE8E\uBE8F\uBE90"+ - "\uBE91\uBE93\uBE94\uBE95\uBE96\uBE97\uBE98\uBE99"+ - "\uBE9A\uBE9B\uBE9C\uBE9D\uBEA1\uBEA2\uBEA3\uBEA4"+ - "\uBEA5\uBEA6\uBEA7\uBEA8\uBEA9\uBEAA\uBEAB\uBEAC"+ - "\uBEAD\uBEAE\uBEAF\uBEB0\uBEB1\uBEB3\uBEB4\uBEB5"+ - "\uBEB6\uBEB7\uBEB8\uBEB9\uBEBA\uBEBB\uBEBC\uBEBD"+ - "\uBEC1\uBEC2\uBEC3\uBEC4\uBEC5\uBEC6\uBEC7\uBEC8"+ - "\uBEC9\uBECA\uBECB\uBECC\uBECD\uBECE\uBECF\uBED0"+ - "\uBED1\uBED3\uBED4\uBED5\uBED6\uBED7\uBED8\uBED9"+ - "\uBEDA\uBEDB\uBEDC\uBEDD\uBEE1\uBEE2\uBEE3\uBEE4"+ - "\uBEE5\uBEE6\uBEE7\uBEE8\uBEE9\uBEEA\uBEEB\uBEEC"+ - "\uBEED\uBEEE\uBEEF\uBEF0\uBEF1\uBEF3\uBEF4\uBEF5"+ - "\uBEF6\uBEF7\uBEF8\uBEF9\uBEFA\uBEFB\uBEFC\uBEFD"+ - "\uBF41\uBF42\uBF43\uBF44\uBF45\uBF46\uBF47\uBF48"+ - "\uBF49\uBF4A\uBF4B\uBF4C\uBF4D\uBF4E\uBF4F\uBF50"+ - "\uBF51\uBF53\uBF54\uBF55\uBF56\uBF57\uBF58\uBF59"+ - "\uBF5A\uBF5B\uBF5C\uBF5D\uBF61\uBF62\uBF63\uBF64"+ - "\uBF65\uBF66\uBF67\uBF68\uBF69\uBF6A\uBF6B\uBF6C"+ - "\uBF6D\uBF6E\uBF6F\uBF70\uBF71\uBF73\uBF74\uBF75"+ - "\uBF76\uBF77\uBF78\uBF79\uBF7A\uBF7B\uBF7C\uBF7D"+ - "\uBF81\uBF82\uBF83\uBF84\uBF85\uBF86\uBF87\uBF88"+ - "\uBF89\uBF8A\uBF8B\uBF8C\uBF8D\uBF8E\uBF8F\uBF90"+ - "\uBF91\uBF93\uBF94\uBF95\uBF96\uBF97\uBF98\uBF99"+ - "\uBF9A\uBF9B\uBF9C\uBF9D\uBFA1\uBFA2\uBFA3\uBFA4"+ - "\uBFA5\uBFA6\uBFA7\uBFA8\uBFA9\uBFAA\uBFAB\uBFAC"+ - "\uBFAD\uBFAE\uBFAF\uBFB0\uBFB1\uBFB3\uBFB4\uBFB5"+ - "\uBFB6\uBFB7\uBFB8\uBFB9\uBFBA\uBFBB\uBFBC\uBFBD"+ - "\uC061\uC062\uC063\uC064\uC065\uC066\uC067\uC068"+ - "\uC069\uC06A\uC06B\uC06C\uC06D\uC06E\uC06F\uC070"+ - "\uC071\uC073\uC074\uC075\uC076\uC077\uC078\uC079"+ - "\uC07A\uC07B\uC07C\uC07D\uC081\uC082\uC083\uC084"+ - "\uC085\uC086\uC087\uC088\uC089\uC08A\uC08B\uC08C"+ - "\uC08D\uC08E\uC08F\uC090\uC091\uC093\uC094\uC095"+ - "\uC096\uC097\uC098\uC099\uC09A\uC09B\uC09C\uC09D"+ - "\uC0A1\uC0A2\uC0A3\uC0A4\uC0A5\uC0A6\uC0A7\uC0A8"+ - "\uC0A9\uC0AA\uC0AB\uC0AC\uC0AD\uC0AE\uC0AF\uC0B0"+ - "\uC0B1\uC0B3\uC0B4\uC0B5\uC0B6\uC0B7\uC0B8\uC0B9"+ - "\uC0BA\uC0BB\uC0BC\uC0BD\uC0C1\uC0C2\uC0C3\uC0C4"+ - "\uC0C5\uC0C6\uC0C7\uC0C8\uC0C9\uC0CA\uC0CB\uC0CC"+ - "\uC0CD\uC0CE\uC0CF\uC0D0\uC0D1\uC0D3\uC0D4\uC0D5"+ - "\uC0D6\uC0D7\uC0D8\uC0D9\uC0DA\uC0DB\uC0DC\uC0DD"+ - "\uC0E1\uC0E2\uC0E3\uC0E4\uC0E5\uC0E6\uC0E7\uC0E8"+ - "\uC0E9\uC0EA\uC0EB\uC0EC\uC0ED\uC0EE\uC0EF\uC0F0"+ - "\uC0F1\uC0F3\uC0F4\uC0F5\uC0F6\uC0F7\uC0F8\uC0F9"+ - "\uC0FA\uC0FB\uC0FC\uC0FD\uC141\uC142\uC143\uC144"+ - "\uC145\uC146\uC147\uC148\uC149\uC14A\uC14B\uC14C"+ - "\uC14D\uC14E\uC14F\uC150\uC151\uC153\uC154\uC155"+ - "\uC156\uC157\uC158\uC159\uC15A\uC15B\uC15C\uC15D"+ - "\uC161\uC162\uC163\uC164\uC165\uC166\uC167\uC168"+ - "\uC169\uC16A\uC16B\uC16C\uC16D\uC16E\uC16F\uC170"+ - "\uC171\uC173\uC174\uC175\uC176\uC177\uC178\uC179"+ - "\uC17A\uC17B\uC17C\uC17D\uC181\uC182\uC183\uC184"+ - "\uC185\uC186\uC187\uC188\uC189\uC18A\uC18B\uC18C"+ - "\uC18D\uC18E\uC18F\uC190\uC191\uC193\uC194\uC195"+ - "\uC196\uC197\uC198\uC199\uC19A\uC19B\uC19C\uC19D"+ - "\uC1A1\uC1A2\uC1A3\uC1A4\uC1A5\uC1A6\uC1A7\uC1A8"+ - "\uC1A9\uC1AA\uC1AB\uC1AC\uC1AD\uC1AE\uC1AF\uC1B0"+ - "\uC1B1\uC1B3\uC1B4\uC1B5\uC1B6\uC1B7\uC1B8\uC1B9"+ - "\uC1BA\uC1BB\uC1BC\uC1BD\uC1C1\uC1C2\uC1C3\uC1C4"+ - "\uC1C5\uC1C6\uC1C7\uC1C8\uC1C9\uC1CA\uC1CB\uC1CC"+ - "\uC1CD\uC1CE\uC1CF\uC1D0\uC1D1\uC1D3\uC1D4\uC1D5"+ - "\uC1D6\uC1D7\uC1D8\uC1D9\uC1DA\uC1DB\uC1DC\uC1DD"+ - "\uC1E1\uC1E2\uC1E3\uC1E4\uC1E5\uC1E6\uC1E7\uC1E8"+ - "\uC1E9\uC1EA\uC1EB\uC1EC\uC1ED\uC1EE\uC1EF\uC1F0"+ - "\uC1F1\uC1F3\uC1F4\uC1F5\uC1F6\uC1F7\uC1F8\uC1F9"+ - "\uC1FA\uC1FB\uC1FC\uC1FD\uC241\uC242\uC243\uC244"+ - "\uC245\uC246\uC247\uC248\uC249\uC24A\uC24B\uC24C"+ - "\uC24D\uC24E\uC24F\uC250\uC251\uC253\uC254\uC255"+ - "\uC256\uC257\uC258\uC259\uC25A\uC25B\uC25C\uC25D"+ - "\uC261\uC262\uC263\uC264\uC265\uC266\uC267\uC268"+ - "\uC269\uC26A\uC26B\uC26C\uC26D\uC26E\uC26F\uC270"+ - "\uC271\uC273\uC274\uC275\uC276\uC277\uC278\uC279"+ - "\uC27A\uC27B\uC27C\uC27D\uC281\uC282\uC283\uC284"+ - "\uC285\uC286\uC287\uC288\uC289\uC28A\uC28B\uC28C"+ - "\uC28D\uC28E\uC28F\uC290\uC291\uC293\uC294\uC295"+ - "\uC296\uC297\uC298\uC299\uC29A\uC29B\uC29C\uC29D"+ - "\uC2A1\uC2A2\uC2A3\uC2A4\uC2A5\uC2A6\uC2A7\uC2A8"+ - "\uC2A9\uC2AA\uC2AB\uC2AC\uC2AD\uC2AE\uC2AF\uC2B0"+ - "\uC2B1\uC2B3\uC2B4\uC2B5\uC2B6\uC2B7\uC2B8\uC2B9"+ - "\uC2BA\uC2BB\uC2BC\uC2BD\uC2C1\uC2C2\uC2C3\uC2C4"+ - "\uC2C5\uC2C6\uC2C7\uC2C8\uC2C9\uC2CA\uC2CB\uC2CC"+ - "\uC2CD\uC2CE\uC2CF\uC2D0\uC2D1\uC2D3\uC2D4\uC2D5"+ - "\uC2D6\uC2D7\uC2D8\uC2D9\uC2DA\uC2DB\uC2DC\uC2DD"+ - "\uC2E1\uC2E2\uC2E3\uC2E4\uC2E5\uC2E6\uC2E7\uC2E8"+ - "\uC2E9\uC2EA\uC2EB\uC2EC\uC2ED\uC2EE\uC2EF\uC2F0"+ - "\uC2F1\uC2F3\uC2F4\uC2F5\uC2F6\uC2F7\uC2F8\uC2F9"+ - "\uC2FA\uC2FB\uC2FC\uC2FD\uC341\uC342\uC343\uC344"+ - "\uC345\uC346\uC347\uC348\uC349\uC34A\uC34B\uC34C"+ - "\uC34D\uC34E\uC34F\uC350\uC351\uC353\uC354\uC355"+ - "\uC356\uC357\uC358\uC359\uC35A\uC35B\uC35C\uC35D"+ - "\uC361\uC362\uC363\uC364\uC365\uC366\uC367\uC368"+ - "\uC369\uC36A\uC36B\uC36C\uC36D\uC36E\uC36F\uC370"+ - "\uC371\uC373\uC374\uC375\uC376\uC377\uC378\uC379"+ - "\uC37A\uC37B\uC37C\uC37D\uC381\uC382\uC383\uC384"+ - "\uC385\uC386\uC387\uC388\uC389\uC38A\uC38B\uC38C"+ - "\uC38D\uC38E\uC38F\uC390\uC391\uC393\uC394\uC395"+ - "\uC396\uC397\uC398\uC399\uC39A\uC39B\uC39C\uC39D"+ - "\uC3A1\uC3A2\uC3A3\uC3A4\uC3A5\uC3A6\uC3A7\uC3A8"+ - "\uC3A9\uC3AA\uC3AB\uC3AC\uC3AD\uC3AE\uC3AF\uC3B0"+ - "\uC3B1\uC3B3\uC3B4\uC3B5\uC3B6\uC3B7\uC3B8\uC3B9"+ - "\uC3BA\uC3BB\uC3BC\uC3BD\uC461\uC462\uC463\uC464"+ - "\uC465\uC466\uC467\uC468\uC469\uC46A\uC46B\uC46C"+ - "\uC46D\uC46E\uC46F\uC470\uC471\uC473\uC474\uC475"+ - "\uC476\uC477\uC478\uC479\uC47A\uC47B\uC47C\uC47D"+ - "\uC481\uC482\uC483\uC484\uC485\uC486\uC487\uC488"+ - "\uC489\uC48A\uC48B\uC48C\uC48D\uC48E\uC48F\uC490"+ - "\uC491\uC493\uC494\uC495\uC496\uC497\uC498\uC499"+ - "\uC49A\uC49B\uC49C\uC49D\uC4A1\uC4A2\uC4A3\uC4A4"+ - "\uC4A5\uC4A6\uC4A7\uC4A8\uC4A9\uC4AA\uC4AB\uC4AC"+ - "\uC4AD\uC4AE\uC4AF\uC4B0\uC4B1\uC4B3\uC4B4\uC4B5"+ - "\uC4B6\uC4B7\uC4B8\uC4B9\uC4BA\uC4BB\uC4BC\uC4BD"+ - "\uC4C1\uC4C2\uC4C3\uC4C4\uC4C5\uC4C6\uC4C7\uC4C8"+ - "\uC4C9\uC4CA\uC4CB\uC4CC\uC4CD\uC4CE\uC4CF\uC4D0"+ - "\uC4D1\uC4D3\uC4D4\uC4D5\uC4D6\uC4D7\uC4D8\uC4D9"+ - "\uC4DA\uC4DB\uC4DC\uC4DD\uC4E1\uC4E2\uC4E3\uC4E4"+ - "\uC4E5\uC4E6\uC4E7\uC4E8\uC4E9\uC4EA\uC4EB\uC4EC"+ - "\uC4ED\uC4EE\uC4EF\uC4F0\uC4F1\uC4F3\uC4F4\uC4F5"+ - "\uC4F6\uC4F7\uC4F8\uC4F9\uC4FA\uC4FB\uC4FC\uC4FD"+ - "\uC541\uC542\uC543\uC544\uC545\uC546\uC547\uC548"+ - "\uC549\uC54A\uC54B\uC54C\uC54D\uC54E\uC54F\uC550"+ - "\uC551\uC553\uC554\uC555\uC556\uC557\uC558\uC559"+ - "\uC55A\uC55B\uC55C\uC55D\uC561\uC562\uC563\uC564"+ - "\uC565\uC566\uC567\uC568\uC569\uC56A\uC56B\uC56C"+ - "\uC56D\uC56E\uC56F\uC570\uC571\uC573\uC574\uC575"+ - "\uC576\uC577\uC578\uC579\uC57A\uC57B\uC57C\uC57D"+ - "\uC581\uC582\uC583\uC584\uC585\uC586\uC587\uC588"+ - "\uC589\uC58A\uC58B\uC58C\uC58D\uC58E\uC58F\uC590"+ - "\uC591\uC593\uC594\uC595\uC596\uC597\uC598\uC599"+ - "\uC59A\uC59B\uC59C\uC59D\uC5A1\uC5A2\uC5A3\uC5A4"+ - "\uC5A5\uC5A6\uC5A7\uC5A8\uC5A9\uC5AA\uC5AB\uC5AC"+ - "\uC5AD\uC5AE\uC5AF\uC5B0\uC5B1\uC5B3\uC5B4\uC5B5"+ - "\uC5B6\uC5B7\uC5B8\uC5B9\uC5BA\uC5BB\uC5BC\uC5BD"+ - "\uC5C1\uC5C2\uC5C3\uC5C4\uC5C5\uC5C6\uC5C7\uC5C8"+ - "\uC5C9\uC5CA\uC5CB\uC5CC\uC5CD\uC5CE\uC5CF\uC5D0"+ - "\uC5D1\uC5D3\uC5D4\uC5D5\uC5D6\uC5D7\uC5D8\uC5D9"+ - "\uC5DA\uC5DB\uC5DC\uC5DD\uC5E1\uC5E2\uC5E3\uC5E4"+ - "\uC5E5\uC5E6\uC5E7\uC5E8\uC5E9\uC5EA\uC5EB\uC5EC"+ - "\uC5ED\uC5EE\uC5EF\uC5F0\uC5F1\uC5F3\uC5F4\uC5F5"+ - "\uC5F6\uC5F7\uC5F8\uC5F9\uC5FA\uC5FB\uC5FC\uC5FD"+ - "\uC641\uC642\uC643\uC644\uC645\uC646\uC647\uC648"+ - "\uC649\uC64A\uC64B\uC64C\uC64D\uC64E\uC64F\uC650"+ - "\uC651\uC653\uC654\uC655\uC656\uC657\uC658\uC659"+ - "\uC65A\uC65B\uC65C\uC65D\uC661\uC662\uC663\uC664"+ - "\uC665\uC666\uC667\uC668\uC669\uC66A\uC66B\uC66C"+ - "\uC66D\uC66E\uC66F\uC670\uC671\uC673\uC674\uC675"+ - "\uC676\uC677\uC678\uC679\uC67A\uC67B\uC67C\uC67D"+ - "\uC681\uC682\uC683\uC684\uC685\uC686\uC687\uC688"+ - "\uC689\uC68A\uC68B\uC68C\uC68D\uC68E\uC68F\uC690"+ - "\uC691\uC693\uC694\uC695\uC696\uC697\uC698\uC699"+ - "\uC69A\uC69B\uC69C\uC69D\uC6A1\uC6A2\uC6A3\uC6A4"+ - "\uC6A5\uC6A6\uC6A7\uC6A8\uC6A9\uC6AA\uC6AB\uC6AC"+ - "\uC6AD\uC6AE\uC6AF\uC6B0\uC6B1\uC6B3\uC6B4\uC6B5"+ - "\uC6B6\uC6B7\uC6B8\uC6B9\uC6BA\uC6BB\uC6BC\uC6BD"+ - "\uC6C1\uC6C2\uC6C3\uC6C4\uC6C5\uC6C6\uC6C7\uC6C8"+ - "\uC6C9\uC6CA\uC6CB\uC6CC\uC6CD\uC6CE\uC6CF\uC6D0"+ - "\uC6D1\uC6D3\uC6D4\uC6D5\uC6D6\uC6D7\uC6D8\uC6D9"+ - "\uC6DA\uC6DB\uC6DC\uC6DD\uC6E1\uC6E2\uC6E3\uC6E4"+ - "\uC6E5\uC6E6\uC6E7\uC6E8\uC6E9\uC6EA\uC6EB\uC6EC"+ - "\uC6ED\uC6EE\uC6EF\uC6F0\uC6F1\uC6F3\uC6F4\uC6F5"+ - "\uC6F6\uC6F7\uC6F8\uC6F9\uC6FA\uC6FB\uC6FC\uC6FD"+ - "\uC741\uC742\uC743\uC744\uC745\uC746\uC747\uC748"+ - "\uC749\uC74A\uC74B\uC74C\uC74D\uC74E\uC74F\uC750"+ - "\uC751\uC753\uC754\uC755\uC756\uC757\uC758\uC759"+ - "\uC75A\uC75B\uC75C\uC75D\uC761\uC762\uC763\uC764"+ - "\uC765\uC766\uC767\uC768\uC769\uC76A\uC76B\uC76C"+ - "\uC76D\uC76E\uC76F\uC770\uC771\uC773\uC774\uC775"+ - "\uC776\uC777\uC778\uC779\uC77A\uC77B\uC77C\uC77D"+ - "\uC781\uC782\uC783\uC784\uC785\uC786\uC787\uC788"+ - "\uC789\uC78A\uC78B\uC78C\uC78D\uC78E\uC78F\uC790"+ - "\uC791\uC793\uC794\uC795\uC796\uC797\uC798\uC799"+ - "\uC79A\uC79B\uC79C\uC79D\uC7A1\uC7A2\uC7A3\uC7A4"+ - "\uC7A5\uC7A6\uC7A7\uC7A8\uC7A9\uC7AA\uC7AB\uC7AC"+ - "\uC7AD\uC7AE\uC7AF\uC7B0\uC7B1\uC7B3\uC7B4\uC7B5"+ - "\uC7B6\uC7B7\uC7B8\uC7B9\uC7BA\uC7BB\uC7BC\uC7BD"+ - "\uC861\uC862\uC863\uC864\uC865\uC866\uC867\uC868"+ - "\uC869\uC86A\uC86B\uC86C\uC86D\uC86E\uC86F\uC870"+ - "\uC871\uC873\uC874\uC875\uC876\uC877\uC878\uC879"+ - "\uC87A\uC87B\uC87C\uC87D\uC881\uC882\uC883\uC884"+ - "\uC885\uC886\uC887\uC888\uC889\uC88A\uC88B\uC88C"+ - "\uC88D\uC88E\uC88F\uC890\uC891\uC893\uC894\uC895"+ - "\uC896\uC897\uC898\uC899\uC89A\uC89B\uC89C\uC89D"+ - "\uC8A1\uC8A2\uC8A3\uC8A4\uC8A5\uC8A6\uC8A7\uC8A8"+ - "\uC8A9\uC8AA\uC8AB\uC8AC\uC8AD\uC8AE\uC8AF\uC8B0"+ - "\uC8B1\uC8B3\uC8B4\uC8B5\uC8B6\uC8B7\uC8B8\uC8B9"+ - "\uC8BA\uC8BB\uC8BC\uC8BD\uC8C1\uC8C2\uC8C3\uC8C4"+ - "\uC8C5\uC8C6\uC8C7\uC8C8\uC8C9\uC8CA\uC8CB\uC8CC"+ - "\uC8CD\uC8CE\uC8CF\uC8D0\uC8D1\uC8D3\uC8D4\uC8D5"+ - "\uC8D6\uC8D7\uC8D8\uC8D9\uC8DA\uC8DB\uC8DC\uC8DD"+ - "\uC8E1\uC8E2\uC8E3\uC8E4\uC8E5\uC8E6\uC8E7\uC8E8"+ - "\uC8E9\uC8EA\uC8EB\uC8EC\uC8ED\uC8EE\uC8EF\uC8F0"+ - "\uC8F1\uC8F3\uC8F4\uC8F5\uC8F6\uC8F7\uC8F8\uC8F9"+ - "\uC8FA\uC8FB\uC8FC\uC8FD\uC941\uC942\uC943\uC944"+ - "\uC945\uC946\uC947\uC948\uC949\uC94A\uC94B\uC94C"+ - "\uC94D\uC94E\uC94F\uC950\uC951\uC953\uC954\uC955"+ - "\uC956\uC957\uC958\uC959\uC95A\uC95B\uC95C\uC95D"+ - "\uC961\uC962\uC963\uC964\uC965\uC966\uC967\uC968"+ - "\uC969\uC96A\uC96B\uC96C\uC96D\uC96E\uC96F\uC970"+ - "\uC971\uC973\uC974\uC975\uC976\uC977\uC978\uC979"+ - "\uC97A\uC97B\uC97C\uC97D\uC981\uC982\uC983\uC984"+ - "\uC985\uC986\uC987\uC988\uC989\uC98A\uC98B\uC98C"+ - "\uC98D\uC98E\uC98F\uC990\uC991\uC993\uC994\uC995"+ - "\uC996\uC997\uC998\uC999\uC99A\uC99B\uC99C\uC99D"+ - "\uC9A1\uC9A2\uC9A3\uC9A4\uC9A5\uC9A6\uC9A7\uC9A8"+ - "\uC9A9\uC9AA\uC9AB\uC9AC\uC9AD\uC9AE\uC9AF\uC9B0"+ - "\uC9B1\uC9B3\uC9B4\uC9B5\uC9B6\uC9B7\uC9B8\uC9B9"+ - "\uC9BA\uC9BB\uC9BC\uC9BD\uC9C1\uC9C2\uC9C3\uC9C4"+ - "\uC9C5\uC9C6\uC9C7\uC9C8\uC9C9\uC9CA\uC9CB\uC9CC"+ - "\uC9CD\uC9CE\uC9CF\uC9D0\uC9D1\uC9D3\uC9D4\uC9D5"+ - "\uC9D6\uC9D7\uC9D8\uC9D9\uC9DA\uC9DB\uC9DC\uC9DD"+ - "\uC9E1\uC9E2\uC9E3\uC9E4\uC9E5\uC9E6\uC9E7\uC9E8"+ - "\uC9E9\uC9EA\uC9EB\uC9EC\uC9ED\uC9EE\uC9EF\uC9F0"+ - "\uC9F1\uC9F3\uC9F4\uC9F5\uC9F6\uC9F7\uC9F8\uC9F9"+ - "\uC9FA\uC9FB\uC9FC\uC9FD\uCA41\uCA42\uCA43\uCA44"+ - "\uCA45\uCA46\uCA47\uCA48\uCA49\uCA4A\uCA4B\uCA4C"+ - "\uCA4D\uCA4E\uCA4F\uCA50\uCA51\uCA53\uCA54\uCA55"+ - "\uCA56\uCA57\uCA58\uCA59\uCA5A\uCA5B\uCA5C\uCA5D"+ - "\uCA61\uCA62\uCA63\uCA64\uCA65\uCA66\uCA67\uCA68"+ - "\uCA69\uCA6A\uCA6B\uCA6C\uCA6D\uCA6E\uCA6F\uCA70"+ - "\uCA71\uCA73\uCA74\uCA75\uCA76\uCA77\uCA78\uCA79"+ - "\uCA7A\uCA7B\uCA7C\uCA7D\uCA81\uCA82\uCA83\uCA84"+ - "\uCA85\uCA86\uCA87\uCA88\uCA89\uCA8A\uCA8B\uCA8C"+ - "\uCA8D\uCA8E\uCA8F\uCA90\uCA91\uCA93\uCA94\uCA95"+ - "\uCA96\uCA97\uCA98\uCA99\uCA9A\uCA9B\uCA9C\uCA9D"+ - "\uCAA1\uCAA2\uCAA3\uCAA4\uCAA5\uCAA6\uCAA7\uCAA8"+ - "\uCAA9\uCAAA\uCAAB\uCAAC\uCAAD\uCAAE\uCAAF\uCAB0"+ - "\uCAB1\uCAB3\uCAB4\uCAB5\uCAB6\uCAB7\uCAB8\uCAB9"+ - "\uCABA\uCABB\uCABC\uCABD\uCAC1\uCAC2\uCAC3\uCAC4"+ - "\uCAC5\uCAC6\uCAC7\uCAC8\uCAC9\uCACA\uCACB\uCACC"+ - "\uCACD\uCACE\uCACF\uCAD0\uCAD1\uCAD3\uCAD4\uCAD5"+ - "\uCAD6\uCAD7\uCAD8\uCAD9\uCADA\uCADB\uCADC\uCADD"+ - "\uCAE1\uCAE2\uCAE3\uCAE4\uCAE5\uCAE6\uCAE7\uCAE8"+ - "\uCAE9\uCAEA\uCAEB\uCAEC\uCAED\uCAEE\uCAEF\uCAF0"+ - "\uCAF1\uCAF3\uCAF4\uCAF5\uCAF6\uCAF7\uCAF8\uCAF9"+ - "\uCAFA\uCAFB\uCAFC\uCAFD\uCB41\uCB42\uCB43\uCB44"+ - "\uCB45\uCB46\uCB47\uCB48\uCB49\uCB4A\uCB4B\uCB4C"+ - "\uCB4D\uCB4E\uCB4F\uCB50\uCB51\uCB53\uCB54\uCB55"+ - "\uCB56\uCB57\uCB58\uCB59\uCB5A\uCB5B\uCB5C\uCB5D"+ - "\uCB61\uCB62\uCB63\uCB64\uCB65\uCB66\uCB67\uCB68"+ - "\uCB69\uCB6A\uCB6B\uCB6C\uCB6D\uCB6E\uCB6F\uCB70"+ - "\uCB71\uCB73\uCB74\uCB75\uCB76\uCB77\uCB78\uCB79"+ - "\uCB7A\uCB7B\uCB7C\uCB7D\uCB81\uCB82\uCB83\uCB84"+ - "\uCB85\uCB86\uCB87\uCB88\uCB89\uCB8A\uCB8B\uCB8C"+ - "\uCB8D\uCB8E\uCB8F\uCB90\uCB91\uCB93\uCB94\uCB95"+ - "\uCB96\uCB97\uCB98\uCB99\uCB9A\uCB9B\uCB9C\uCB9D"+ - "\uCBA1\uCBA2\uCBA3\uCBA4\uCBA5\uCBA6\uCBA7\uCBA8"+ - "\uCBA9\uCBAA\uCBAB\uCBAC\uCBAD\uCBAE\uCBAF\uCBB0"+ - "\uCBB1\uCBB3\uCBB4\uCBB5\uCBB6\uCBB7\uCBB8\uCBB9"+ - "\uCBBA\uCBBB\uCBBC\uCBBD\uCC61\uCC62\uCC63\uCC64"+ - "\uCC65\uCC66\uCC67\uCC68\uCC69\uCC6A\uCC6B\uCC6C"+ - "\uCC6D\uCC6E\uCC6F\uCC70\uCC71\uCC73\uCC74\uCC75"+ - "\uCC76\uCC77\uCC78\uCC79\uCC7A\uCC7B\uCC7C\uCC7D"+ - "\uCC81\uCC82\uCC83\uCC84\uCC85\uCC86\uCC87\uCC88"+ - "\uCC89\uCC8A\uCC8B\uCC8C\uCC8D\uCC8E\uCC8F\uCC90"+ - "\uCC91\uCC93\uCC94\uCC95\uCC96\uCC97\uCC98\uCC99"+ - "\uCC9A\uCC9B\uCC9C\uCC9D\uCCA1\uCCA2\uCCA3\uCCA4"+ - "\uCCA5\uCCA6\uCCA7\uCCA8\uCCA9\uCCAA\uCCAB\uCCAC"+ - "\uCCAD\uCCAE\uCCAF\uCCB0\uCCB1\uCCB3\uCCB4\uCCB5"+ - "\uCCB6\uCCB7\uCCB8\uCCB9\uCCBA\uCCBB\uCCBC\uCCBD"+ - "\uCCC1\uCCC2\uCCC3\uCCC4\uCCC5\uCCC6\uCCC7\uCCC8"+ - "\uCCC9\uCCCA\uCCCB\uCCCC\uCCCD\uCCCE\uCCCF\uCCD0"+ - "\uCCD1\uCCD3\uCCD4\uCCD5\uCCD6\uCCD7\uCCD8\uCCD9"+ - "\uCCDA\uCCDB\uCCDC\uCCDD\uCCE1\uCCE2\uCCE3\uCCE4"+ - "\uCCE5\uCCE6\uCCE7\uCCE8\uCCE9\uCCEA\uCCEB\uCCEC"+ - "\uCCED\uCCEE\uCCEF\uCCF0\uCCF1\uCCF3\uCCF4\uCCF5"+ - "\uCCF6\uCCF7\uCCF8\uCCF9\uCCFA\uCCFB\uCCFC\uCCFD"+ - "\uCD41\uCD42\uCD43\uCD44\uCD45\uCD46\uCD47\uCD48"+ - "\uCD49\uCD4A\uCD4B\uCD4C\uCD4D\uCD4E\uCD4F\uCD50"+ - "\uCD51\uCD53\uCD54\uCD55\uCD56\uCD57\uCD58\uCD59"+ - "\uCD5A\uCD5B\uCD5C\uCD5D\uCD61\uCD62\uCD63\uCD64"+ - "\uCD65\uCD66\uCD67\uCD68\uCD69\uCD6A\uCD6B\uCD6C"+ - "\uCD6D\uCD6E\uCD6F\uCD70\uCD71\uCD73\uCD74\uCD75"+ - "\uCD76\uCD77\uCD78\uCD79\uCD7A\uCD7B\uCD7C\uCD7D"+ - "\uCD81\uCD82\uCD83\uCD84\uCD85\uCD86\uCD87\uCD88"+ - "\uCD89\uCD8A\uCD8B\uCD8C\uCD8D\uCD8E\uCD8F\uCD90"+ - "\uCD91\uCD93\uCD94\uCD95\uCD96\uCD97\uCD98\uCD99"+ - "\uCD9A\uCD9B\uCD9C\uCD9D\uCDA1\uCDA2\uCDA3\uCDA4"+ - "\uCDA5\uCDA6\uCDA7\uCDA8\uCDA9\uCDAA\uCDAB\uCDAC"+ - "\uCDAD\uCDAE\uCDAF\uCDB0\uCDB1\uCDB3\uCDB4\uCDB5"+ - "\uCDB6\uCDB7\uCDB8\uCDB9\uCDBA\uCDBB\uCDBC\uCDBD"+ - "\uCDC1\uCDC2\uCDC3\uCDC4\uCDC5\uCDC6\uCDC7\uCDC8"+ - "\uCDC9\uCDCA\uCDCB\uCDCC\uCDCD\uCDCE\uCDCF\uCDD0"+ - "\uCDD1\uCDD3\uCDD4\uCDD5\uCDD6\uCDD7\uCDD8\uCDD9"+ - "\uCDDA\uCDDB\uCDDC\uCDDD\uCDE1\uCDE2\uCDE3\uCDE4"+ - "\uCDE5\uCDE6\uCDE7\uCDE8\uCDE9\uCDEA\uCDEB\uCDEC"+ - "\uCDED\uCDEE\uCDEF\uCDF0\uCDF1\uCDF3\uCDF4\uCDF5"+ - "\uCDF6\uCDF7\uCDF8\uCDF9\uCDFA\uCDFB\uCDFC\uCDFD"+ - "\uCE41\uCE42\uCE43\uCE44\uCE45\uCE46\uCE47\uCE48"+ - "\uCE49\uCE4A\uCE4B\uCE4C\uCE4D\uCE4E\uCE4F\uCE50"+ - "\uCE51\uCE53\uCE54\uCE55\uCE56\uCE57\uCE58\uCE59"+ - "\uCE5A\uCE5B\uCE5C\uCE5D\uCE61\uCE62\uCE63\uCE64"+ - "\uCE65\uCE66\uCE67\uCE68\uCE69\uCE6A\uCE6B\uCE6C"+ - "\uCE6D\uCE6E\uCE6F\uCE70\uCE71\uCE73\uCE74\uCE75"+ - "\uCE76\uCE77\uCE78\uCE79\uCE7A\uCE7B\uCE7C\uCE7D"+ - "\uCE81\uCE82\uCE83\uCE84\uCE85\uCE86\uCE87\uCE88"+ - "\uCE89\uCE8A\uCE8B\uCE8C\uCE8D\uCE8E\uCE8F\uCE90"+ - "\uCE91\uCE93\uCE94\uCE95\uCE96\uCE97\uCE98\uCE99"+ - "\uCE9A\uCE9B\uCE9C\uCE9D\uCEA1\uCEA2\uCEA3\uCEA4"+ - "\uCEA5\uCEA6\uCEA7\uCEA8\uCEA9\uCEAA\uCEAB\uCEAC"+ - "\uCEAD\uCEAE\uCEAF\uCEB0\uCEB1\uCEB3\uCEB4\uCEB5"+ - "\uCEB6\uCEB7\uCEB8\uCEB9\uCEBA\uCEBB\uCEBC\uCEBD"+ - "\uCEC1\uCEC2\uCEC3\uCEC4\uCEC5\uCEC6\uCEC7\uCEC8"+ - "\uCEC9\uCECA\uCECB\uCECC\uCECD\uCECE\uCECF\uCED0"+ - "\uCED1\uCED3\uCED4\uCED5\uCED6\uCED7\uCED8\uCED9"+ - "\uCEDA\uCEDB\uCEDC\uCEDD\uCEE1\uCEE2\uCEE3\uCEE4"+ - "\uCEE5\uCEE6\uCEE7\uCEE8\uCEE9\uCEEA\uCEEB\uCEEC"+ - "\uCEED\uCEEE\uCEEF\uCEF0\uCEF1\uCEF3\uCEF4\uCEF5"+ - "\uCEF6\uCEF7\uCEF8\uCEF9\uCEFA\uCEFB\uCEFC\uCEFD"+ - "\uCF41\uCF42\uCF43\uCF44\uCF45\uCF46\uCF47\uCF48"+ - "\uCF49\uCF4A\uCF4B\uCF4C\uCF4D\uCF4E\uCF4F\uCF50"+ - "\uCF51\uCF53\uCF54\uCF55\uCF56\uCF57\uCF58\uCF59"+ - "\uCF5A\uCF5B\uCF5C\uCF5D\uCF61\uCF62\uCF63\uCF64"+ - "\uCF65\uCF66\uCF67\uCF68\uCF69\uCF6A\uCF6B\uCF6C"+ - "\uCF6D\uCF6E\uCF6F\uCF70\uCF71\uCF73\uCF74\uCF75"+ - "\uCF76\uCF77\uCF78\uCF79\uCF7A\uCF7B\uCF7C\uCF7D"+ - "\uCF81\uCF82\uCF83\uCF84\uCF85\uCF86\uCF87\uCF88"+ - "\uCF89\uCF8A\uCF8B\uCF8C\uCF8D\uCF8E\uCF8F\uCF90"+ - "\uCF91\uCF93\uCF94\uCF95\uCF96\uCF97\uCF98\uCF99"+ - "\uCF9A\uCF9B\uCF9C\uCF9D\uCFA1\uCFA2\uCFA3\uCFA4"+ - "\uCFA5\uCFA6\uCFA7\uCFA8\uCFA9\uCFAA\uCFAB\uCFAC"+ - "\uCFAD\uCFAE\uCFAF\uCFB0\uCFB1\uCFB3\uCFB4\uCFB5"+ - "\uCFB6\uCFB7\uCFB8\uCFB9\uCFBA\uCFBB\uCFBC\uCFBD"+ - "\uD061\uD062\uD063\uD064\uD065\uD066\uD067\uD068"+ - "\uD069\uD06A\uD06B\uD06C\uD06D\uD06E\uD06F\uD070"+ - "\uD071\uD073\uD074\uD075\uD076\uD077\uD078\uD079"+ - "\uD07A\uD07B\uD07C\uD07D\uD081\uD082\uD083\uD084"+ - "\uD085\uD086\uD087\uD088\uD089\uD08A\uD08B\uD08C"+ - "\uD08D\uD08E\uD08F\uD090\uD091\uD093\uD094\uD095"+ - "\uD096\uD097\uD098\uD099\uD09A\uD09B\uD09C\uD09D"+ - "\uD0A1\uD0A2\uD0A3\uD0A4\uD0A5\uD0A6\uD0A7\uD0A8"+ - "\uD0A9\uD0AA\uD0AB\uD0AC\uD0AD\uD0AE\uD0AF\uD0B0"+ - "\uD0B1\uD0B3\uD0B4\uD0B5\uD0B6\uD0B7\uD0B8\uD0B9"+ - "\uD0BA\uD0BB\uD0BC\uD0BD\uD0C1\uD0C2\uD0C3\uD0C4"+ - "\uD0C5\uD0C6\uD0C7\uD0C8\uD0C9\uD0CA\uD0CB\uD0CC"+ - "\uD0CD\uD0CE\uD0CF\uD0D0\uD0D1\uD0D3\uD0D4\uD0D5"+ - "\uD0D6\uD0D7\uD0D8\uD0D9\uD0DA\uD0DB\uD0DC\uD0DD"+ - "\uD0E1\uD0E2\uD0E3\uD0E4\uD0E5\uD0E6\uD0E7\uD0E8"+ - "\uD0E9\uD0EA\uD0EB\uD0EC\uD0ED\uD0EE\uD0EF\uD0F0"+ - "\uD0F1\uD0F3\uD0F4\uD0F5\uD0F6\uD0F7\uD0F8\uD0F9"+ - "\uD0FA\uD0FB\uD0FC\uD0FD\uD141\uD142\uD143\uD144"+ - "\uD145\uD146\uD147\uD148\uD149\uD14A\uD14B\uD14C"+ - "\uD14D\uD14E\uD14F\uD150\uD151\uD153\uD154\uD155"+ - "\uD156\uD157\uD158\uD159\uD15A\uD15B\uD15C\uD15D"+ - "\uD161\uD162\uD163\uD164\uD165\uD166\uD167\uD168"+ - "\uD169\uD16A\uD16B\uD16C\uD16D\uD16E\uD16F\uD170"+ - "\uD171\uD173\uD174\uD175\uD176\uD177\uD178\uD179"+ - "\uD17A\uD17B\uD17C\uD17D\uD181\uD182\uD183\uD184"+ - "\uD185\uD186\uD187\uD188\uD189\uD18A\uD18B\uD18C"+ - "\uD18D\uD18E\uD18F\uD190\uD191\uD193\uD194\uD195"+ - "\uD196\uD197\uD198\uD199\uD19A\uD19B\uD19C\uD19D"+ - "\uD1A1\uD1A2\uD1A3\uD1A4\uD1A5\uD1A6\uD1A7\uD1A8"+ - "\uD1A9\uD1AA\uD1AB\uD1AC\uD1AD\uD1AE\uD1AF\uD1B0"+ - "\uD1B1\uD1B3\uD1B4\uD1B5\uD1B6\uD1B7\uD1B8\uD1B9"+ - "\uD1BA\uD1BB\uD1BC\uD1BD\uD1C1\uD1C2\uD1C3\uD1C4"+ - "\uD1C5\uD1C6\uD1C7\uD1C8\uD1C9\uD1CA\uD1CB\uD1CC"+ - "\uD1CD\uD1CE\uD1CF\uD1D0\uD1D1\uD1D3\uD1D4\uD1D5"+ - "\uD1D6\uD1D7\uD1D8\uD1D9\uD1DA\uD1DB\uD1DC\uD1DD"+ - "\uD1E1\uD1E2\uD1E3\uD1E4\uD1E5\uD1E6\uD1E7\uD1E8"+ - "\uD1E9\uD1EA\uD1EB\uD1EC\uD1ED\uD1EE\uD1EF\uD1F0"+ - "\uD1F1\uD1F3\uD1F4\uD1F5\uD1F6\uD1F7\uD1F8\uD1F9"+ - "\uD1FA\uD1FB\uD1FC\uD1FD\uD241\uD242\uD243\uD244"+ - "\uD245\uD246\uD247\uD248\uD249\uD24A\uD24B\uD24C"+ - "\uD24D\uD24E\uD24F\uD250\uD251\uD253\uD254\uD255"+ - "\uD256\uD257\uD258\uD259\uD25A\uD25B\uD25C\uD25D"+ - "\uD261\uD262\uD263\uD264\uD265\uD266\uD267\uD268"+ - "\uD269\uD26A\uD26B\uD26C\uD26D\uD26E\uD26F\uD270"+ - "\uD271\uD273\uD274\uD275\uD276\uD277\uD278\uD279"+ - "\uD27A\uD27B\uD27C\uD27D\uD281\uD282\uD283\uD284"+ - "\uD285\uD286\uD287\uD288\uD289\uD28A\uD28B\uD28C"+ - "\uD28D\uD28E\uD28F\uD290\uD291\uD293\uD294\uD295"+ - "\uD296\uD297\uD298\uD299\uD29A\uD29B\uD29C\uD29D"+ - "\uD2A1\uD2A2\uD2A3\uD2A4\uD2A5\uD2A6\uD2A7\uD2A8"+ - "\uD2A9\uD2AA\uD2AB\uD2AC\uD2AD\uD2AE\uD2AF\uD2B0"+ - "\uD2B1\uD2B3\uD2B4\uD2B5\uD2B6\uD2B7\uD2B8\uD2B9"+ - "\uD2BA\uD2BB\uD2BC\uD2BD\uD2C1\uD2C2\uD2C3\uD2C4"+ - "\uD2C5\uD2C6\uD2C7\uD2C8\uD2C9\uD2CA\uD2CB\uD2CC"+ - "\uD2CD\uD2CE\uD2CF\uD2D0\uD2D1\uD2D3\uD2D4\uD2D5"+ - "\uD2D6\uD2D7\uD2D8\uD2D9\uD2DA\uD2DB\uD2DC\uD2DD"+ - "\uD2E1\uD2E2\uD2E3\uD2E4\uD2E5\uD2E6\uD2E7\uD2E8"+ - "\uD2E9\uD2EA\uD2EB\uD2EC\uD2ED\uD2EE\uD2EF\uD2F0"+ - "\uD2F1\uD2F3\uD2F4\uD2F5\uD2F6\uD2F7\uD2F8\uD2F9"+ - "\uD2FA\uD2FB\uD2FC\uD2FD\uD341\uD342\uD343\uD344"+ - "\uD345\uD346\uD347\uD348\uD349\uD34A\uD34B\uD34C"+ - "\uD34D\uD34E\uD34F\uD350\uD351\uD353\uD354\uD355"+ - "\uD356\uD357\uD358\uD359\uD35A\uD35B\uD35C\uD35D"+ - "\uD361\uD362\uD363\uD364\uD365\uD366\uD367\uD368"+ - "\uD369\uD36A\uD36B\uD36C\uD36D\uD36E\uD36F\uD370"+ - "\uD371\uD373\uD374\uD375\uD376\uD377\uD378\uD379"+ - "\uD37A\uD37B\uD37C\uD37D\uD381\uD382\uD383\uD384"+ - "\uD385\uD386\uD387\uD388\uD389\uD38A\uD38B\uD38C"+ - "\uD38D\uD38E\uD38F\uD390\uD391\uD393\uD394\uD395"+ - "\uD396\uD397\uD398\uD399\uD39A\uD39B\uD39C\uD39D"+ - "\uD3A1\uD3A2\uD3A3\uD3A4\uD3A5\uD3A6\uD3A7\uD3A8"+ - "\uD3A9\uD3AA\uD3AB\uD3AC\uD3AD\uD3AE\uD3AF\uD3B0"+ - "\uD3B1\uD3B3\uD3B4\uD3B5\uD3B6\uD3B7\uD3B8\uD3B9"+ - "\uD3BA\uD3BB\uD3BC\uD3BD\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uE0D0\uE0D6\uE0E7\uE1CF\uE1E8\uE23D\uE2FB\uE332"+ - "\uE348\uE360\uE36D\uE3D4\uE3D5\uE3D8\uE3DB\uE3DC"+ - "\uE3DD\uE3DE\uE3DF\uE3E0\uE3E2\uE3E3\uE3E4\uE3E5"+ - "\uE3E6\uE3E8\uE3E9\uE3EA\uE3EB\uE3ED\uE3EF\uE3F0"+ - "\uE3F2\uE3F6\uE3FA\uE3FC\uE3FD\uE3FE\uE432\uE433"+ - "\uE437\uE438\uE439\uE43A\uE43B\uE43D\uE442\uE44E"+ - "\uE452\uE453\uE454\uE456\uE457\uE458\uE459\uE45A"+ - "\uE45B\uE45D\uE45E\uE45F\uE460\uE461\uE462\uE463"+ - "\uE464\uE465\uE466\uE467\uE469\uE46A\uE46E\uE46F"+ - "\uE471\uE472\uE474\uE475\uE476\uE477\uE478\uE479"+ - "\uE47A\uE47B\uE492\uE493\uE494\uE495\uE496\uE497"+ - "\uE499\uE49A\uE576\uE59E\uE5A5\uE5AB\uE5AE\uE648"+ - "\uE65D\uE6CB\uE6E4\uE8C5\uE8E4\uE935\uE9A5\uE9D5"+ - "\uE9F4\uEA9E\uEAA0\uEAB3\uEAE1\uEAE8\uEB93\uEBAD"+ - "\uEBED\uECF5\uED31\uED39\uEDAE\uEDB1\uEDB2\uEDB9"+ - "\uEDBB\uEDBC\uEDC4\uEDCE\uEDD0\uEDD2\uEDD6\uEDFA"+ - "\uEDFB\uEDFC\uEDFE\uEE31\uEE34\uEE37\uEE3D\uEE3F"+ - "\uEE40\uEE41\uEE43\uEE47\uEE48\uEE4C\uEE54\uEE56"+ - "\uEE57\uEE5A\uEE62\uEE66\uEE69\uEE6C\uEE6F\uEE71"+ - "\uEE74\uEE75\uEE76\uEE78\uEE7A\uEE7B\uEE7C\uEE91"+ - "\uEE93\uEE94\uEE97\uEE98\uEE99\uEE9B\uEEA1\uEEA6"+ - "\uEEA9\uEEAA\uEEAC\uEEAD\uEEB0\uEEBF\uEEC1\uEEC6"+ - "\uEEC7\uEECB\uEECD\uEECF\uEED0\uEED3\uEEDF\uEEE4"+ - "\uEEE6\uEEF7\uEF77\uEF78\uEF92\uEF93\uEF99\uEF9B"+ - "\uEF9D\uEFA0\uEFA7\uEFAC\uEFCC\uEFF7\uF051\uF075"+ - "\uF096\uF099\uF09E\uF0A0\uF0A4\uF0A7\uF0A9\uF0AA"+ - "\uF0BA\uF0BB\uF0BD\uF0C1\uF0C2\uF0C6\uF0C7\uF0CC"+ - "\uF0CF\uF0D0\uF0D1\uF0D2\uF0D8\uF136\uF137\uF13A"+ - "\uF13F\uF140\uF141\uF142\uF145\uF148\uF14A\uF150"+ - "\uF151\uF155\uF156\uF159\uF15A\uF165\uF16D\uF16E"+ - "\uF171\uF174\uF177\uF178\uF199\uF19A\uF19C\uF1A1"+ - "\uF1A2\uF1A3\uF1EE\uF26B\uF44D\uF49C\uF4B1\uF537"; - - private final static String innerIndex9= - "\uF57E\uF696\uF698\uF6B8\uF6C8\uF6D3\uF76B\uF792"+ - "\uF831\uF832\uF876\uF939\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\uDA31\uDA32\uDA33\uDA34\uDA35\uDA36\uDA37"+ - "\uDA38\uDA39\uDA3A\uDA3B\uDA3C\uDA3D\uDA3E\uDA3F"+ - "\uDA40\uDA41\uDA42\uDA43\uDA44\uDA45\uDA46\uDA47"+ - "\uDA48\uDA49\uDA4A\uDA4B\uDA4C\uDA4D\uDA4E\uDA4F"+ - "\uDA50\uDA51\uDA52\uDA53\uDA54\uDA55\uDA56\uDA57"+ - "\uDA58\uDA59\uDA5A\uDA5B\uDA5C\uDA5D\uDA5E\uDA5F"+ - "\uDA60\uDA61\uDA62\uDA63\uDA64\uDA65\uDA66\uDA67"+ - "\uDA68\uDA69\uDA6A\uDA6B\uD93C\uDA6D\uDA6E\uDA6F"+ - "\uDA70\uDA71\uDA72\uDA73\uDA74\uDA75\uDA76\uDA77"+ - "\uDA78\uDA79\uDA7A\uDA7B\uDA7C\uDA7D\uDA7E\uDA91"+ - "\uDA92\uDA93\uDA94\uDA95\uDA96\uDA97\uDA98\uDA99"+ - "\uDA9A\uDA9B\uDA9C\uDA9D\uDA9E\uDA9F\uD9A6\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\uD95B\uD95C\uD9A0\uDAA0\u0000\uD95D\uDA6C\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"; - - private final static short index1[] = { - 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 0, 0, 0, 0, 145 - }; - - String index2[] = { - innerIndex0, - innerIndex1, - innerIndex2, - innerIndex3, - innerIndex4, - innerIndex5, - innerIndex6, - innerIndex7, - innerIndex8, - innerIndex9 - }; } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/net/httpserver/Request.java --- a/jdk/src/share/classes/sun/net/httpserver/Request.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/net/httpserver/Request.java Sat Apr 18 14:10:27 2009 -0700 @@ -52,6 +52,9 @@ os = rawout; do { startLine = readLine(); + if (startLine == null) { + return; + } /* skip blank lines */ } while (startLine == null ? false : startLine.equals ("")); } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/net/httpserver/ServerImpl.java --- a/jdk/src/share/classes/sun/net/httpserver/ServerImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/net/httpserver/ServerImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -433,6 +433,7 @@ rawin = sslStreams.getInputStream(); rawout = sslStreams.getOutputStream(); engine = sslStreams.getSSLEngine(); + connection.sslStreams = sslStreams; } else { rawin = new BufferedInputStream( new Request.ReadStream ( @@ -442,6 +443,8 @@ ServerImpl.this, chan ); } + connection.raw = rawin; + connection.rawout = rawout; } Request req = new Request (rawin, rawout); requestLine = req.requestLine(); diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java --- a/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -113,16 +113,16 @@ } } - final void invalidateAllLocks() { + final void invalidateAllLocks() throws IOException { if (fileLockTable != null) { - try { - fileLockTable.removeAll( new FileLockTable.Releaser() { - public void release(FileLock fl) { - ((FileLockImpl)fl).invalidate(); + for (FileLock fl: fileLockTable.removeAll()) { + synchronized (fl) { + if (fl.isValid()) { + FileLockImpl fli = (FileLockImpl)fl; + implRelease(fli); + fli.invalidate(); } - }); - } catch (IOException e) { - throw new AssertionError(e); + } } } } @@ -158,7 +158,21 @@ } /** - * Invoked by FileLockImpl to release lock acquired by this channel. + * Releases the given file lock. + */ + protected abstract void implRelease(FileLockImpl fli) throws IOException; + + /** + * Invoked by FileLockImpl to release the given file lock and remove it + * from the lock table. */ - abstract void release(FileLockImpl fli) throws IOException; + final void release(FileLockImpl fli) throws IOException { + try { + begin(); + implRelease(fli); + removeFromFileLockTable(fli); + } finally { + end(); + } + } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java --- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -33,8 +33,6 @@ import java.nio.channels.*; import java.util.ArrayList; import java.util.List; -import java.util.Iterator; -import java.lang.reflect.Field; import java.security.AccessController; import javax.management.ObjectName; import javax.management.MalformedObjectNameException; @@ -95,14 +93,16 @@ // -- Standard channel operations -- protected void implCloseChannel() throws IOException { - // Invalidate and release any locks that we still hold + // Release and invalidate any locks that we still hold if (fileLockTable != null) { - fileLockTable.removeAll( new FileLockTable.Releaser() { - public void release(FileLock fl) throws IOException { - ((FileLockImpl)fl).invalidate(); - nd.release(fd, fl.position(), fl.size()); + for (FileLock fl: fileLockTable.removeAll()) { + synchronized (fl) { + if (fl.isValid()) { + nd.release(fd, fl.position(), fl.size()); + ((FileLockImpl)fl).invalidate(); + } } - }); + } } nd.preClose(fd); @@ -912,32 +912,33 @@ FileLockImpl fli = new FileLockImpl(this, position, size, shared); FileLockTable flt = fileLockTable(); flt.add(fli); - boolean i = true; + boolean completed = false; int ti = -1; try { begin(); ti = threads.add(); if (!isOpen()) return null; - int result = nd.lock(fd, true, position, size, shared); - if (result == FileDispatcher.RET_EX_LOCK) { - assert shared; - FileLockImpl fli2 = new FileLockImpl(this, position, size, - false); - flt.replace(fli, fli2); - return fli2; + int n; + do { + n = nd.lock(fd, true, position, size, shared); + } while ((n == FileDispatcher.INTERRUPTED) && isOpen()); + if (isOpen()) { + if (n == FileDispatcher.RET_EX_LOCK) { + assert shared; + FileLockImpl fli2 = new FileLockImpl(this, position, size, + false); + flt.replace(fli, fli2); + fli = fli2; + } + completed = true; } - if (result == FileDispatcher.INTERRUPTED || result == FileDispatcher.NO_LOCK) { + } finally { + if (!completed) flt.remove(fli); - i = false; - } - } catch (IOException e) { - flt.remove(fli); - throw e; - } finally { threads.remove(ti); try { - end(i); + end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } @@ -985,7 +986,6 @@ } void release(FileLockImpl fli) throws IOException { - ensureOpen(); int ti = threads.add(); try { ensureOpen(); @@ -1005,7 +1005,7 @@ */ private static class SimpleFileLockTable extends FileLockTable { // synchronize on list for access - private List lockList = new ArrayList(2); + private final List lockList = new ArrayList(2); public SimpleFileLockTable() { } @@ -1034,14 +1034,11 @@ } } - public void removeAll(Releaser releaser) throws IOException { + public List removeAll() { synchronized(lockList) { - Iterator i = lockList.iterator(); - while (i.hasNext()) { - FileLock fl = i.next(); - releaser.release(fl); - i.remove(); - } + List result = new ArrayList(lockList); + lockList.clear(); + return result; } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/nio/ch/FileLockImpl.java --- a/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -31,25 +31,24 @@ public class FileLockImpl extends FileLock { - boolean valid; + private volatile boolean valid = true; FileLockImpl(FileChannel channel, long position, long size, boolean shared) { super(channel, position, size, shared); - this.valid = true; } FileLockImpl(AsynchronousFileChannel channel, long position, long size, boolean shared) { super(channel, position, size, shared); - this.valid = true; } - public synchronized boolean isValid() { + public boolean isValid() { return valid; } - synchronized void invalidate() { + void invalidate() { + assert Thread.holdsLock(this); valid = false; } @@ -66,5 +65,4 @@ valid = false; } } - } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/nio/ch/FileLockTable.java --- a/jdk/src/share/classes/sun/nio/ch/FileLockTable.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/nio/ch/FileLockTable.java Sat Apr 18 14:10:27 2009 -0700 @@ -61,22 +61,11 @@ public abstract void remove(FileLock fl); /** - * An implementation of this interface releases a given file lock. - * Used with removeAll. + * Removes all file locks from the table. + * + * @return The list of file locks removed */ - public abstract interface Releaser { - void release(FileLock fl) throws IOException; - } - - /** - * Removes all file locks from the table. - *

    - * The Releaser#release method is invoked for each file lock before - * it is removed. - * - * @throws IOException if the release method throws IOException - */ - public abstract void removeAll(Releaser r) throws IOException; + public abstract List removeAll(); /** * Replaces an existing file lock in the table. @@ -195,7 +184,7 @@ FileLockReference ref = list.get(index); FileLock lock = ref.get(); if (lock == fl) { - assert (lock != null) && (lock.channel() == channel); + assert (lock != null) && (lock.acquiredBy() == channel); ref.clear(); list.remove(index); break; @@ -206,7 +195,8 @@ } @Override - public void removeAll(Releaser releaser) throws IOException { + public List removeAll() { + List result = new ArrayList(); List list = lockMap.get(fileKey); if (list != null) { synchronized (list) { @@ -216,13 +206,13 @@ FileLock lock = ref.get(); // remove locks obtained by this channel - if (lock != null && lock.channel() == channel) { - // invoke the releaser to invalidate/release the lock - releaser.release(lock); - + if (lock != null && lock.acquiredBy() == channel) { // remove the lock from the list ref.clear(); list.remove(index); + + // add to result + result.add(lock); } else { index++; } @@ -232,6 +222,7 @@ removeKeyIfEmpty(fileKey, list); } } + return result; } @Override diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java --- a/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -97,6 +97,9 @@ // then it will throw ClosedChannelException } + // Invalidate and release any locks that we still hold + invalidateAllLocks(); + // signal any threads blocked on this channel nd.preClose(fdObj); threads.signalAndWait(); @@ -109,9 +112,6 @@ closeLock.writeLock().unlock(); } - // Invalidate and release any locks that we still hold - invalidateAllLocks(); - // close file nd.close(fdObj); @@ -226,11 +226,9 @@ do { n = nd.lock(fdObj, true, position, size, shared); } while ((n == FileDispatcher.INTERRUPTED) && isOpen()); - if (n == FileDispatcher.LOCKED) { + if (n == FileDispatcher.LOCKED && isOpen()) { result.setResult(fli); } else { - if (n != FileDispatcher.INTERRUPTED) - throw new AssertionError(); throw new AsynchronousCloseException(); } } catch (IOException x) { @@ -279,16 +277,16 @@ do { n = nd.lock(fdObj, false, position, size, shared); } while ((n == FileDispatcher.INTERRUPTED) && isOpen()); - if (n != FileDispatcher.LOCKED) { - if (n == FileDispatcher.NO_LOCK) - return null; // locked by someone else - if (n == FileDispatcher.INTERRUPTED) - throw new AsynchronousCloseException(); - // should not get here - throw new AssertionError(); + if (n == FileDispatcher.LOCKED && isOpen()) { + gotLock = true; + return fli; // lock acquired } - gotLock = true; - return fli; + if (n == FileDispatcher.NO_LOCK) + return null; // locked by someone else + if (n == FileDispatcher.INTERRUPTED) + throw new AsynchronousCloseException(); + // should not get here + throw new AssertionError(); } finally { if (!gotLock) removeFromFileLockTable(fli); @@ -298,14 +296,8 @@ } @Override - void release(FileLockImpl fli) throws IOException { - try { - begin(); - nd.release(fdObj, fli.position(), fli.size()); - removeFromFileLockTable(fli); - } finally { - end(); - } + protected void implRelease(FileLockImpl fli) throws IOException { + nd.release(fdObj, fli.position(), fli.size()); } @Override diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/krb5/Config.java --- a/jdk/src/share/classes/sun/security/krb5/Config.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/krb5/Config.java Sat Apr 18 14:10:27 2009 -0700 @@ -736,6 +736,14 @@ return name; } + private static String trimmed(String s) { + s = s.trim(); + if (s.charAt(0) == '"' && s.charAt(s.length()-1) == '"' || + s.charAt(0) == '\'' && s.charAt(s.length()-1) == '\'') { + s = s.substring(1, s.length()-1).trim(); + } + return s; + } /** * Parses key-value pairs under a stanza name. */ @@ -747,7 +755,7 @@ for (int j = 0; j < line.length(); j++) { if (line.charAt(j) == '=') { String key = (line.substring(0, j)).trim(); - String value = (line.substring(j + 1)).trim(); + String value = trimmed(line.substring(j + 1)); table.put(key, value); break; } @@ -820,7 +828,7 @@ } else { nameVector = table.get(key); } - nameVector.addElement((line.substring(j + 1)).trim()); + nameVector.addElement(trimmed(line.substring(j + 1))); table.put(key, nameVector); break; } @@ -1263,4 +1271,32 @@ } } + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + toStringIndented("", stanzaTable, sb); + return sb.toString(); + } + private static void toStringIndented(String prefix, Object obj, + StringBuffer sb) { + if (obj instanceof String) { + sb.append(prefix); + sb.append(obj); + sb.append('\n'); + } else if (obj instanceof Hashtable) { + Hashtable tab = (Hashtable)obj; + for (Object o: tab.keySet()) { + sb.append(prefix); + sb.append(o); + sb.append(" = {\n"); + toStringIndented(prefix + " ", tab.get(o), sb); + sb.append(prefix + "}\n"); + } + } else if (obj instanceof Vector) { + Vector v = (Vector)obj; + for (Object o: v.toArray()) { + toStringIndented(prefix + " ", o, sb); + } + } + } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java --- a/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java Sat Apr 18 14:10:27 2009 -0700 @@ -274,27 +274,31 @@ + ",Attempt =" + i + ", #bytes=" + obuf.length); } - /* - * Send the data to the kdc. - */ + try { + /* + * Send the data to the kdc. + */ kdcClient.send(obuf); - /* - * And get a response. - */ - try { - ibuf = kdcClient.receive(); - break; - } catch (SocketTimeoutException se) { - if (DEBUG) { - System.out.println ("SocketTimeOutException with " + - "attempt: " + i); + /* + * And get a response. + */ + try { + ibuf = kdcClient.receive(); + break; + } catch (SocketTimeoutException se) { + if (DEBUG) { + System.out.println ("SocketTimeOutException with " + + "attempt: " + i); + } + if (i == DEFAULT_KDC_RETRY_LIMIT) { + ibuf = null; + throw se; + } } - if (i == DEFAULT_KDC_RETRY_LIMIT) { - ibuf = null; - throw se; - } + } finally { + kdcClient.close(); } } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java --- a/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java Sat Apr 18 14:10:27 2009 -0700 @@ -93,4 +93,7 @@ return data; } + public void close() { + dgSocket.close(); + } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java --- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -38,6 +38,8 @@ import sun.security.pkcs11.wrapper.*; import static sun.security.pkcs11.wrapper.PKCS11Constants.*; +import sun.security.rsa.RSAKeyFactory; + /** * KeyPairGenerator implementation class. This class currently supports * RSA, DSA, DH, and EC. @@ -66,7 +68,7 @@ private AlgorithmParameterSpec params; // for RSA, selected or default value of public exponent, always valid - private BigInteger rsaPublicExponent; + private BigInteger rsaPublicExponent = RSAKeyGenParameterSpec.F4; // SecureRandom instance, if specified in init private SecureRandom random; @@ -88,19 +90,19 @@ public void initialize(int keySize, SecureRandom random) { token.ensureValid(); try { - checkKeySize(keySize); + checkKeySize(keySize, null); } catch (InvalidAlgorithmParameterException e) { throw new InvalidParameterException(e.getMessage()); } this.keySize = keySize; this.params = null; this.random = random; - this.rsaPublicExponent = RSAKeyGenParameterSpec.F4; if (algorithm.equals("EC")) { params = P11ECKeyFactory.getECParameterSpec(keySize); if (params == null) { - throw new InvalidParameterException - ("No EC parameters available for key size " + keySize + " bits"); + throw new InvalidParameterException( + "No EC parameters available for key size " + + keySize + " bits"); } } } @@ -115,8 +117,10 @@ ("DHParameterSpec required for Diffie-Hellman"); } DHParameterSpec dhParams = (DHParameterSpec)params; - this.keySize = dhParams.getP().bitLength(); - this.params = params; + int tmpKeySize = dhParams.getP().bitLength(); + checkKeySize(tmpKeySize, dhParams); + this.keySize = tmpKeySize; + this.params = dhParams; // XXX sanity check params } else if (algorithm.equals("RSA")) { if (params instanceof RSAKeyGenParameterSpec == false) { @@ -124,7 +128,9 @@ ("RSAKeyGenParameterSpec required for RSA"); } RSAKeyGenParameterSpec rsaParams = (RSAKeyGenParameterSpec)params; - this.keySize = rsaParams.getKeysize(); + int tmpKeySize = rsaParams.getKeysize(); + checkKeySize(tmpKeySize, rsaParams); + this.keySize = tmpKeySize; this.params = null; this.rsaPublicExponent = rsaParams.getPublicExponent(); // XXX sanity check params @@ -134,13 +140,16 @@ ("DSAParameterSpec required for DSA"); } DSAParameterSpec dsaParams = (DSAParameterSpec)params; - this.keySize = dsaParams.getP().bitLength(); - this.params = params; + int tmpKeySize = dsaParams.getP().bitLength(); + checkKeySize(tmpKeySize, dsaParams); + this.keySize = tmpKeySize; + this.params = dsaParams; // XXX sanity check params } else if (algorithm.equals("EC")) { ECParameterSpec ecParams; if (params instanceof ECParameterSpec) { - ecParams = P11ECKeyFactory.getECParameterSpec((ECParameterSpec)params); + ecParams = P11ECKeyFactory.getECParameterSpec( + (ECParameterSpec)params); if (ecParams == null) { throw new InvalidAlgorithmParameterException ("Unsupported curve: " + params); @@ -156,16 +165,17 @@ throw new InvalidAlgorithmParameterException ("ECParameterSpec or ECGenParameterSpec required for EC"); } - this.keySize = ecParams.getCurve().getField().getFieldSize(); + int tmpKeySize = ecParams.getCurve().getField().getFieldSize(); + checkKeySize(tmpKeySize, ecParams); + this.keySize = tmpKeySize; this.params = ecParams; } else { throw new ProviderException("Unknown algorithm: " + algorithm); } this.random = random; - checkKeySize(keySize); } - private void checkKeySize(int keySize) + private void checkKeySize(int keySize, AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException { if (algorithm.equals("EC")) { if (keySize < 112) { @@ -178,13 +188,28 @@ ("Key size must be at most 2048 bit"); } return; + } else if (algorithm.equals("RSA")) { + BigInteger tmpExponent = rsaPublicExponent; + if (params != null) { + // Already tested for instanceof RSAKeyGenParameterSpec above + tmpExponent = + ((RSAKeyGenParameterSpec)params).getPublicExponent(); + } + try { + // This provider supports 64K or less. + RSAKeyFactory.checkKeyLengths(keySize, tmpExponent, + 512, 64 * 1024); + } catch (InvalidKeyException e) { + throw new InvalidAlgorithmParameterException(e.getMessage()); + } + return; } + if (keySize < 512) { throw new InvalidAlgorithmParameterException ("Key size must be at least 512 bit"); } - if (algorithm.equals("RSA") || - (algorithm.equals("DH") && (params != null))) { + if (algorithm.equals("DH") && (params != null)) { // sanity check, nobody really wants keys this large if (keySize > 64 * 1024) { throw new InvalidAlgorithmParameterException diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java --- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java Sat Apr 18 14:10:27 2009 -0700 @@ -80,6 +80,8 @@ import sun.security.pkcs11.wrapper.*; import static sun.security.pkcs11.wrapper.PKCS11Constants.*; +import sun.security.rsa.RSAKeyFactory; + final class P11KeyStore extends KeyStoreSpi { private static final CK_ATTRIBUTE ATTR_CLASS_CERT = @@ -1328,6 +1330,15 @@ BigInteger modulus = attrs[0].getBigInteger(); keyLength = modulus.bitLength(); + // This check will combine our "don't care" values here + // with the system-wide min/max values. + try { + RSAKeyFactory.checkKeyLengths(keyLength, null, + -1, Integer.MAX_VALUE); + } catch (InvalidKeyException e) { + throw new KeyStoreException(e.getMessage()); + } + return P11Key.privateKey(session, oHandle, keyType, diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java --- a/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -35,6 +35,8 @@ import sun.security.pkcs11.wrapper.*; import static sun.security.pkcs11.wrapper.PKCS11Constants.*; +import sun.security.rsa.RSAKeyFactory; + /** * RSA KeyFactory implemenation. * @@ -131,6 +133,9 @@ } catch (PKCS11Exception e) { throw new InvalidKeySpecException ("Could not create RSA public key", e); + } catch (InvalidKeyException e) { + throw new InvalidKeySpecException + ("Could not create RSA public key", e); } } @@ -175,11 +180,15 @@ } catch (PKCS11Exception e) { throw new InvalidKeySpecException ("Could not create RSA private key", e); + } catch (InvalidKeyException e) { + throw new InvalidKeySpecException + ("Could not create RSA private key", e); } } private PublicKey generatePublic(BigInteger n, BigInteger e) - throws PKCS11Exception { + throws PKCS11Exception, InvalidKeyException { + RSAKeyFactory.checkKeyLengths(n.bitLength(), e, -1, 64 * 1024); CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_CLASS, CKO_PUBLIC_KEY), new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA), @@ -200,7 +209,8 @@ } private PrivateKey generatePrivate(BigInteger n, BigInteger d) - throws PKCS11Exception { + throws PKCS11Exception, InvalidKeyException { + RSAKeyFactory.checkKeyLengths(n.bitLength(), null, -1, 64 * 1024); CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_CLASS, CKO_PRIVATE_KEY), new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA), @@ -222,7 +232,9 @@ private PrivateKey generatePrivate(BigInteger n, BigInteger e, BigInteger d, BigInteger p, BigInteger q, BigInteger pe, - BigInteger qe, BigInteger coeff) throws PKCS11Exception { + BigInteger qe, BigInteger coeff) throws PKCS11Exception, + InvalidKeyException { + RSAKeyFactory.checkKeyLengths(n.bitLength(), e, -1, 64 * 1024); CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_CLASS, CKO_PRIVATE_KEY), new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA), diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java --- a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Sat Apr 18 14:10:27 2009 -0700 @@ -120,11 +120,13 @@ } /** - * @deprecated use new SunPKCS11(String) or new SunPKCS11(InputStream) instead + * @deprecated use new SunPKCS11(String) or new SunPKCS11(InputStream) + * instead */ @Deprecated public SunPKCS11(String configName, InputStream configStream) { - super("SunPKCS11-" + Config.getConfig(configName, configStream).getName(), + super("SunPKCS11-" + + Config.getConfig(configName, configStream).getName(), 1.7d, Config.getConfig(configName, configStream).getDescription()); this.configName = configName; this.config = Config.removeConfig(configName); @@ -153,7 +155,8 @@ // // If we are in Secmod mode and configured to use either the // nssKeyStore or the nssTrustAnchors module, we automatically - // switch to using the NSS trust attributes for trusted certs (KeyStore). + // switch to using the NSS trust attributes for trusted certs + // (KeyStore). // if (useSecmod) { @@ -168,33 +171,40 @@ if (secmod.isInitialized()) { if (nssSecmodDirectory != null) { String s = secmod.getConfigDir(); - if ((s != null) && (s.equals(nssSecmodDirectory) == false)) { + if ((s != null) && + (s.equals(nssSecmodDirectory) == false)) { throw new ProviderException("Secmod directory " + nssSecmodDirectory - + " invalid, NSS already initialized with " + s); + + " invalid, NSS already initialized with " + + s); } } if (nssLibraryDirectory != null) { String s = secmod.getLibDir(); - if ((s != null) && (s.equals(nssLibraryDirectory) == false)) { + if ((s != null) && + (s.equals(nssLibraryDirectory) == false)) { throw new ProviderException("NSS library directory " + nssLibraryDirectory - + " invalid, NSS already initialized with " + s); + + " invalid, NSS already initialized with " + + s); } } } else { if (nssDbMode != DbMode.NO_DB) { if (nssSecmodDirectory == null) { - throw new ProviderException("Secmod not initialized and " - + "nssSecmodDirectory not specified"); + throw new ProviderException( + "Secmod not initialized and " + + "nssSecmodDirectory not specified"); } } else { if (nssSecmodDirectory != null) { - throw new ProviderException - ("nssSecmodDirectory must not be specified in noDb mode"); + throw new ProviderException( + "nssSecmodDirectory must not be " + + "specified in noDb mode"); } } - secmod.initialize(nssDbMode, nssSecmodDirectory, nssLibraryDirectory); + secmod.initialize(nssDbMode, nssSecmodDirectory, + nssLibraryDirectory); } } catch (IOException e) { // XXX which exception to throw @@ -211,7 +221,8 @@ if (nssModule != null) { moduleName = "fips"; } else { - moduleName = (nssDbMode == DbMode.NO_DB) ? "crypto" : "keystore"; + moduleName = (nssDbMode == DbMode.NO_DB) ? + "crypto" : "keystore"; } } if (moduleName.equals("fips")) { @@ -253,10 +264,12 @@ + ": only " + k + " external NSS modules available"); } } else { - throw new ProviderException("Unknown NSS module: " + moduleName); + throw new ProviderException( + "Unknown NSS module: " + moduleName); } if (nssModule == null) { - throw new ProviderException("NSS module not available: " + moduleName); + throw new ProviderException( + "NSS module not available: " + moduleName); } if (nssModule.hasInitializedProvider()) { throw new ProviderException("Secmod module already configured"); @@ -296,8 +309,9 @@ initArgs.flags = CKF_OS_LOCKING_OK; PKCS11 tmpPKCS11; try { - tmpPKCS11 = PKCS11.getInstance - (library, functionList, initArgs, config.getOmitInitialize()); + tmpPKCS11 = PKCS11.getInstance( + library, functionList, initArgs, + config.getOmitInitialize()); } catch (PKCS11Exception e) { if (debug != null) { debug.println("Multi-threaded initialization failed: " + e); @@ -312,8 +326,8 @@ } else { initArgs.flags = 0; } - tmpPKCS11 = PKCS11.getInstance - (library, functionList, initArgs, config.getOmitInitialize()); + tmpPKCS11 = PKCS11.getInstance(library, + functionList, initArgs, config.getOmitInitialize()); } p11 = tmpPKCS11; @@ -336,8 +350,10 @@ System.out.println("Slots with tokens: " + toString(slots)); } if (slotID < 0) { - if ((slotListIndex < 0) || (slotListIndex >= slots.length)) { - throw new ProviderException("slotListIndex is " + slotListIndex + if ((slotListIndex < 0) + || (slotListIndex >= slots.length)) { + throw new ProviderException("slotListIndex is " + + slotListIndex + " but token only has " + slots.length + " slots"); } slotID = slots[slotListIndex]; @@ -575,12 +591,15 @@ d(KF, "DH", P11DHKeyFactory, s("DiffieHellman"), m(CKM_DH_PKCS_KEY_PAIR_GEN, CKM_DH_PKCS_DERIVE)); d(KF, "EC", P11DHKeyFactory, - m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, CKM_ECDSA, CKM_ECDSA_SHA1)); + m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, + CKM_ECDSA, CKM_ECDSA_SHA1)); // AlgorithmParameters for EC. // Only needed until we have an EC implementation in the SUN provider. - d(AGP, "EC", "sun.security.ec.ECParameters", s("1.2.840.10045.2.1"), - m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, CKM_ECDSA, CKM_ECDSA_SHA1)); + d(AGP, "EC", "sun.security.ec.ECParameters", + s("1.2.840.10045.2.1"), + m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, + CKM_ECDSA, CKM_ECDSA_SHA1)); d(KA, "DH", P11KeyAgreement, s("DiffieHellman"), m(CKM_DH_PKCS_DERIVE)); @@ -654,12 +673,16 @@ d(SIG, "SHA512withRSA", P11Signature, m(CKM_SHA512_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509)); - d(KG, "SunTlsRsaPremasterSecret", "sun.security.pkcs11.P11TlsRsaPremasterSecretGenerator", + d(KG, "SunTlsRsaPremasterSecret", + "sun.security.pkcs11.P11TlsRsaPremasterSecretGenerator", m(CKM_SSL3_PRE_MASTER_KEY_GEN, CKM_TLS_PRE_MASTER_KEY_GEN)); - d(KG, "SunTlsMasterSecret", "sun.security.pkcs11.P11TlsMasterSecretGenerator", + d(KG, "SunTlsMasterSecret", + "sun.security.pkcs11.P11TlsMasterSecretGenerator", m(CKM_SSL3_MASTER_KEY_DERIVE, CKM_TLS_MASTER_KEY_DERIVE, - CKM_SSL3_MASTER_KEY_DERIVE_DH, CKM_TLS_MASTER_KEY_DERIVE_DH)); - d(KG, "SunTlsKeyMaterial", "sun.security.pkcs11.P11TlsKeyMaterialGenerator", + CKM_SSL3_MASTER_KEY_DERIVE_DH, + CKM_TLS_MASTER_KEY_DERIVE_DH)); + d(KG, "SunTlsKeyMaterial", + "sun.security.pkcs11.P11TlsKeyMaterialGenerator", m(CKM_SSL3_KEY_AND_MAC_DERIVE, CKM_TLS_KEY_AND_MAC_DERIVE)); d(KG, "SunTlsPrf", "sun.security.pkcs11.P11TlsPrfGenerator", m(CKM_TLS_PRF, CKM_NSS_TLS_PRF_GENERAL)); @@ -773,6 +796,13 @@ System.out.println(token.tokenInfo); } long[] supportedMechanisms = p11.C_GetMechanismList(slotID); + + // Create a map from the various Descriptors to the "most + // preferred" mechanism that was defined during the + // static initialization. For example, DES/CBC/PKCS5Padding + // could be mapped to CKM_DES_CBC_PAD or CKM_DES_CBC. Prefer + // the earliest entry. When asked for "DES/CBC/PKCS5Padding", we + // return a CKM_DES_CBC_PAD. final Map supportedAlgs = new HashMap(); for (int i = 0; i < supportedMechanisms.length; i++) { @@ -807,6 +837,9 @@ supportedAlgs.put(d, integerMech); continue; } + // See if there is something "more preferred" + // than what we currently have in the supportedAlgs + // map. int intOldMech = oldMech.intValue(); for (int j = 0; j < d.mechanisms.length; j++) { int nextMech = d.mechanisms[j]; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java --- a/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -31,6 +31,8 @@ import java.security.interfaces.*; import java.security.spec.*; +import sun.security.action.GetPropertyAction; + /** * KeyFactory for RSA keys. Keys must be instances of PublicKey or PrivateKey * and getAlgorithm() must return "RSA". For such keys, it supports conversion @@ -68,6 +70,24 @@ private final static Class x509KeySpecClass = X509EncodedKeySpec.class; private final static Class pkcs8KeySpecClass = PKCS8EncodedKeySpec.class; + public final static int MIN_MODLEN = 512; + public final static int MAX_MODLEN = 16384; + + /* + * If the modulus length is above this value, restrict the size of + * the exponent to something that can be reasonably computed. We + * could simply hardcode the exp len to something like 64 bits, but + * this approach allows flexibility in case impls would like to use + * larger module and exponent values. + */ + public final static int MAX_MODLEN_RESTRICT_EXP = 3072; + public final static int MAX_RESTRICTED_EXPLEN = 64; + + private static final boolean restrictExpLen = + "true".equalsIgnoreCase(AccessController.doPrivileged( + new GetPropertyAction( + "sun.security.rsa.restrictRSAExponent", "true"))); + // instance used for static translateKey(); private final static RSAKeyFactory INSTANCE = new RSAKeyFactory(); @@ -76,74 +96,79 @@ } /** - * Static method to convert Key into a useable instance of - * RSAPublicKey or RSAPrivate(Crt)Key. Check the key and convert it - * to a SunRsaSign key if necessary. If the key is not an RSA key - * or cannot be used, throw an InvalidKeyException. - * - * The difference between this method and engineTranslateKey() is that - * we do not convert keys of other providers that are already an - * instance of RSAPublicKey or RSAPrivate(Crt)Key. + * Static method to convert Key into an instance of RSAPublicKeyImpl + * or RSAPrivate(Crt)KeyImpl. If the key is not an RSA key or cannot be + * used, throw an InvalidKeyException. * * Used by RSASignature and RSACipher. */ public static RSAKey toRSAKey(Key key) throws InvalidKeyException { - if (key instanceof RSAKey) { - RSAKey rsaKey = (RSAKey)key; - checkKey(rsaKey); - return rsaKey; + if ((key instanceof RSAPrivateKeyImpl) || + (key instanceof RSAPrivateCrtKeyImpl) || + (key instanceof RSAPublicKeyImpl)) { + return (RSAKey)key; } else { return (RSAKey)INSTANCE.engineTranslateKey(key); } } - /** - * Check that the given RSA key is valid. + /* + * Single test entry point for all of the mechanisms in the SunRsaSign + * provider (RSA*KeyImpls). All of the tests are the same. + * + * For compatibility, we round up to the nearest byte here: + * some Key impls might pass in a value within a byte of the + * real value. */ - private static void checkKey(RSAKey key) throws InvalidKeyException { - // check for subinterfaces, omit additional checks for our keys - if (key instanceof RSAPublicKey) { - if (key instanceof RSAPublicKeyImpl) { - return; - } - } else if (key instanceof RSAPrivateKey) { - if ((key instanceof RSAPrivateCrtKeyImpl) - || (key instanceof RSAPrivateKeyImpl)) { - return; - } - } else { - throw new InvalidKeyException("Neither a public nor a private key"); - } - // RSAKey does not extend Key, so we need to do a cast - String keyAlg = ((Key)key).getAlgorithm(); - if (keyAlg.equals("RSA") == false) { - throw new InvalidKeyException("Not an RSA key: " + keyAlg); - } - BigInteger modulus; - // some providers implement RSAKey for keys where the values are - // not accessible (although they should). Detect those here - // for a more graceful failure. - try { - modulus = key.getModulus(); - if (modulus == null) { - throw new InvalidKeyException("Modulus is missing"); - } - } catch (RuntimeException e) { - throw new InvalidKeyException(e); - } - checkKeyLength(modulus); + static void checkRSAProviderKeyLengths(int modulusLen, BigInteger exponent) + throws InvalidKeyException { + checkKeyLengths(((modulusLen + 7) & ~7), exponent, + RSAKeyFactory.MIN_MODLEN, Integer.MAX_VALUE); } /** - * Check the length of the modulus of an RSA key. We only support keys - * at least 505 bits long. + * Check the length of an RSA key modulus/exponent to make sure it + * is not too short or long. Some impls have their own min and + * max key sizes that may or may not match with a system defined value. + * + * @param modulusLen the bit length of the RSA modulus. + * @param exponent the RSA exponent + * @param minModulusLen if > 0, check to see if modulusLen is at + * least this long, otherwise unused. + * @param maxModulusLen caller will allow this max number of bits. + * Allow the smaller of the system-defined maximum and this param. + * + * @throws InvalidKeyException if any of the values are unacceptable. */ - static void checkKeyLength(BigInteger modulus) throws InvalidKeyException { - if (modulus.bitLength() < 505) { - // some providers may generate slightly shorter keys - // accept them if the encoding is at least 64 bytes long - throw new InvalidKeyException - ("RSA keys must be at least 512 bits long"); + public static void checkKeyLengths(int modulusLen, BigInteger exponent, + int minModulusLen, int maxModulusLen) throws InvalidKeyException { + + if ((minModulusLen > 0) && (modulusLen < (minModulusLen))) { + throw new InvalidKeyException( "RSA keys must be at least " + + minModulusLen + " bits long"); + } + + // Even though our policy file may allow this, we don't want + // either value (mod/exp) to be too big. + + int maxLen = Math.min(maxModulusLen, MAX_MODLEN); + + // If a RSAPrivateKey/RSAPublicKey, make sure the + // modulus len isn't too big. + if (modulusLen > maxLen) { + throw new InvalidKeyException( + "RSA keys must be no longer than " + maxLen + " bits"); + } + + // If a RSAPublicKey, make sure the exponent isn't too big. + if (restrictExpLen && (exponent != null) && + (modulusLen > MAX_MODLEN_RESTRICT_EXP) && + (exponent.bitLength() > MAX_RESTRICTED_EXPLEN)) { + throw new InvalidKeyException( + "RSA exponents can be no longer than " + + MAX_RESTRICTED_EXPLEN + " bits " + + " if modulus is greater than " + + MAX_MODLEN_RESTRICT_EXP + " bits"); } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java --- a/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -47,7 +47,7 @@ // public exponent to use private BigInteger publicExponent; - // size of the key to generate, >= 512 + // size of the key to generate, >= RSAKeyFactory.MIN_MODLEN private int keySize; // PRNG to use @@ -60,15 +60,16 @@ // initialize the generator. See JCA doc public void initialize(int keySize, SecureRandom random) { - if (keySize < 512) { - throw new InvalidParameterException - ("Key size must be at least 512 bits"); + + // do not allow unreasonably small or large key sizes, + // probably user error + try { + RSAKeyFactory.checkKeyLengths(keySize, RSAKeyGenParameterSpec.F4, + 512, 64 * 1024); + } catch (InvalidKeyException e) { + throw new InvalidParameterException(e.getMessage()); } - if (keySize > 64 * 1024) { - // do not allow unreasonably large key sizes, probably user error - throw new InvalidParameterException - ("Key size must be 65536 bits or less"); - } + this.keySize = keySize; this.random = random; this.publicExponent = RSAKeyGenParameterSpec.F4; @@ -77,35 +78,41 @@ // second initialize method. See JCA doc. public void initialize(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { + if (params instanceof RSAKeyGenParameterSpec == false) { throw new InvalidAlgorithmParameterException ("Params must be instance of RSAKeyGenParameterSpec"); } + RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec)params; - keySize = rsaSpec.getKeysize(); - publicExponent = rsaSpec.getPublicExponent(); - this.random = random; - if (keySize < 512) { - throw new InvalidAlgorithmParameterException - ("Key size must be at least 512 bits"); - } - if (keySize > 64 * 1024) { - // do not allow unreasonably large key sizes, probably user error - throw new InvalidAlgorithmParameterException - ("Key size must be 65536 bits or less"); - } - if (publicExponent == null) { - publicExponent = RSAKeyGenParameterSpec.F4; + int tmpKeySize = rsaSpec.getKeysize(); + BigInteger tmpPublicExponent = rsaSpec.getPublicExponent(); + + if (tmpPublicExponent == null) { + tmpPublicExponent = RSAKeyGenParameterSpec.F4; } else { - if (publicExponent.compareTo(RSAKeyGenParameterSpec.F0) < 0) { + if (tmpPublicExponent.compareTo(RSAKeyGenParameterSpec.F0) < 0) { throw new InvalidAlgorithmParameterException ("Public exponent must be 3 or larger"); } - if (publicExponent.bitLength() > keySize) { + if (tmpPublicExponent.bitLength() > tmpKeySize) { throw new InvalidAlgorithmParameterException ("Public exponent must be smaller than key size"); } } + + // do not allow unreasonably large key sizes, probably user error + try { + RSAKeyFactory.checkKeyLengths(tmpKeySize, tmpPublicExponent, + 512, 64 * 1024); + } catch (InvalidKeyException e) { + throw new InvalidAlgorithmParameterException( + "Invalid key sizes", e); + } + + this.keySize = tmpKeySize; + this.publicExponent = tmpPublicExponent; + this.random = random; } // generate the keypair. See JCA doc diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java --- a/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -89,7 +89,7 @@ */ RSAPrivateCrtKeyImpl(byte[] encoded) throws InvalidKeyException { decode(encoded); - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); } /** @@ -107,7 +107,8 @@ this.pe = pe; this.qe = qe; this.coeff = coeff; - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); + // generate the encoding algid = rsaId; try { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java --- a/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -61,7 +61,7 @@ RSAPrivateKeyImpl(BigInteger n, BigInteger d) throws InvalidKeyException { this.n = n; this.d = d; - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), null); // generate the encoding algid = RSAPrivateCrtKeyImpl.rsaId; try { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java --- a/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -56,10 +56,11 @@ * Construct a key from its components. Used by the * RSAKeyFactory and the RSAKeyPairGenerator. */ - public RSAPublicKeyImpl(BigInteger n, BigInteger e) throws InvalidKeyException { + public RSAPublicKeyImpl(BigInteger n, BigInteger e) + throws InvalidKeyException { this.n = n; this.e = e; - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); // generate the encoding algid = RSAPrivateCrtKeyImpl.rsaId; try { @@ -80,7 +81,7 @@ */ public RSAPublicKeyImpl(byte[] encoded) throws InvalidKeyException { decode(encoded); - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); } // see JCA doc diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/classes/sun/security/util/ObjectIdentifier.java --- a/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java Sat Apr 18 14:10:27 2009 -0700 @@ -26,7 +26,8 @@ package sun.security.util; import java.io.*; - +import java.math.BigInteger; +import java.util.Arrays; /** * Represent an ISO Object Identifier. @@ -44,105 +45,186 @@ * hierarchy, and other organizations can easily acquire the ability * to assign such unique identifiers. * - * * @author David Brownell * @author Amit Kapoor * @author Hemma Prafullchandra */ + final public class ObjectIdentifier implements Serializable { - /** use serialVersionUID from JDK 1.1. for interoperability */ + /** + * We use the DER value (no tag, no length) as the internal format + * @serial + */ + private byte[] encoding = null; + + private transient volatile String stringForm; + + /* + * IMPORTANT NOTES FOR CODE CHANGES (bug 4811968) IN JDK 1.7.0 + * =========================================================== + * + * (Almost) serialization compatibility with old versions: + * + * serialVersionUID is unchanged. Old field "component" is changed to + * type Object so that "poison" (unknown object type for old versions) + * can be put inside if there are huge components that cannot be saved + * as integers. + * + * New version use the new filed "encoding" only. + * + * Below are all 4 cases in a serialization/deserialization process: + * + * 1. old -> old: Not covered here + * 2. old -> new: There's no "encoding" field, new readObject() reads + * "components" and "componentLen" instead and inits correctly. + * 3. new -> new: "encoding" field exists, new readObject() uses it + * (ignoring the other 2 fields) and inits correctly. + * 4. new -> old: old readObject() only recognizes "components" and + * "componentLen" fields. If no huge components are involved, they + * are serialized as legal values and old object can init correctly. + * Otherwise, old object cannot recognize the form (component not int[]) + * and throw a ClassNotFoundException at deserialization time. + * + * Therfore, for the first 3 cases, exact compatibility is preserved. In + * the 4th case, non-huge OID is still supportable in old versions, while + * huge OID is not. + */ private static final long serialVersionUID = 8697030238860181294L; - private static final int maxFirstComponent = 2; - private static final int maxSecondComponent = 39; /** - * Constructs an object identifier from a string. This string - * should be of the form 1.23.34.45.56 etc. + * Changed to Object + * @serial + */ + private Object components = null; // path from root + /** + * @serial + */ + private int componentLen = -1; // how much is used. + + // Is the components field calculated? + transient private boolean componentsCalculated = false; + + private void readObject(ObjectInputStream is) + throws IOException, ClassNotFoundException { + is.defaultReadObject(); + + if (encoding == null) { // from an old version + init((int[])components, componentLen); + } + } + + private void writeObject(ObjectOutputStream os) + throws IOException { + if (!componentsCalculated) { + int[] comps = toIntArray(); + if (comps != null) { // every one understands this + components = comps; + componentLen = comps.length; + } else { + components = HugeOidNotSupportedByOldJDK.theOne; + } + componentsCalculated = true; + } + os.defaultWriteObject(); + } + + static class HugeOidNotSupportedByOldJDK implements Serializable { + private static final long serialVersionUID = 1L; + static HugeOidNotSupportedByOldJDK theOne = new HugeOidNotSupportedByOldJDK(); + } + + /** + * Constructs, from a string. This string should be of the form 1.23.56. + * Validity check included. */ public ObjectIdentifier (String oid) throws IOException { int ch = '.'; - int start = 0; + int start = 0; int end = 0; - // Calculate length of oid - componentLen = 0; - while ((end = oid.indexOf(ch,start)) != -1) { - start = end + 1; - componentLen += 1; - } - componentLen += 1; - components = new int[componentLen]; + int pos = 0; + byte[] tmp = new byte[oid.length()]; + int first = 0, second; + int count = 0; + + try { + String comp = null; + do { + int length = 0; // length of one section + end = oid.indexOf(ch,start); + if (end == -1) { + comp = oid.substring(start); + length = oid.length() - start; + } else { + comp = oid.substring(start,end); + length = end - start; + } - start = 0; - int i = 0; - String comp = null; - try { - while ((end = oid.indexOf(ch,start)) != -1) { - comp = oid.substring(start,end); - components[i++] = Integer.valueOf(comp).intValue(); + if (length > 9) { + BigInteger bignum = new BigInteger(comp); + if (count == 0) { + checkFirstComponent(bignum); + first = bignum.intValue(); + } else { + if (count == 1) { + checkSecondComponent(first, bignum); + bignum = bignum.add(BigInteger.valueOf(40*first)); + } else { + checkOtherComponent(count, bignum); + } + pos += pack7Oid(bignum, tmp, pos); + } + } else { + int num = Integer.parseInt(comp); + if (count == 0) { + checkFirstComponent(num); + first = num; + } else { + if (count == 1) { + checkSecondComponent(first, num); + num += 40 * first; + } else { + checkOtherComponent(count, num); + } + pos += pack7Oid(num, tmp, pos); + } + } start = end + 1; - } - comp = oid.substring(start); - components[i] = Integer.valueOf(comp).intValue(); + count++; + } while (end != -1); + + checkCount(count); + encoding = new byte[pos]; + System.arraycopy(tmp, 0, encoding, 0, pos); + this.stringForm = oid; + } catch (IOException ioe) { // already detected by checkXXX + throw ioe; } catch (Exception e) { throw new IOException("ObjectIdentifier() -- Invalid format: " + e.toString(), e); } - checkValidOid(components, componentLen); - this.stringForm = oid; } /** - * Check if the values make a legal OID. There must be at least 2 - * components and they must be all non-negative. The first component - * should be 0,1 or 2. When the first component is 0 or 1, the - * second component should be less than or equal to 39 - * - * @param values the components that will make the OID - * @param len the number of components to check. Note that the allocation - * size of values may be longer than len. - * In this case, only the first len items are checked. - * @exception IOException if this is not a legal OID - */ - private void checkValidOid(int[] values, int len) throws IOException { - if (values == null || len < 2) { - throw new IOException("ObjectIdentifier() -- " + - "Must be at least two oid components "); - } - - for (int i=0; i maxFirstComponent) { - throw new IOException("ObjectIdentifier() -- " + - "First oid component is invalid "); - } - - if (values[0] < 2 && values[1] > maxSecondComponent) { - throw new IOException("ObjectIdentifier() -- " + - "Second oid component is invalid "); - } - } - /** - * Constructs an object ID from an array of integers. This - * is used to construct constant object IDs. + * Constructor, from an array of integers. + * Validity check included. */ public ObjectIdentifier (int values []) throws IOException { - checkValidOid(values, values.length); - components = values.clone(); - componentLen = values.length; + checkCount(values.length); + checkFirstComponent(values[0]); + checkSecondComponent(values[0], values[1]); + for (int i=2; i bufferEnd; - ) { - component = getComponent (in); - if (component < 0) { - throw new IOException( - "ObjectIdentifier() -- " + - "component values must be nonnegative"); - } - if (first_subid) { - int X, Y; + DerInputStream in = new DerInputStream(buf); + encoding = new byte[in.available()]; + in.getBytes(encoding); + check(encoding); + } - /* - * NOTE: the allocation quantum is large enough that we know - * we don't have to reallocate here! - */ - if (component < 40) - X = 0; - else if (component < 80) - X = 1; - else - X = 2; - Y = component - ( X * 40); - components [0] = X; - components [1] = Y; - componentLen = 2; - - first_subid = false; + private void init(int[] components, int length) { + int pos = 0; + byte[] tmp = new byte[length*5+1]; // +1 for empty input - } else { - - /* - * Other components are encoded less exotically. The only - * potential trouble is the need to grow the array. - */ - if (componentLen >= components.length) { - int tmp_components []; - - tmp_components = new int [components.length - + allocationQuantum]; - System.arraycopy (components, 0, tmp_components, 0, - components.length); - components = tmp_components; - } - components [componentLen++] = component; - } + if (components[1] < Integer.MAX_VALUE - components[0]*40) + pos += pack7Oid(components[0]*40+components[1], tmp, pos); + else { + BigInteger big = BigInteger.valueOf(components[1]); + big = big.add(BigInteger.valueOf(components[0]*40)); + pos += pack7Oid(big, tmp, pos); } - checkValidOid(components, componentLen); + for (int i=2; i>>= 7; - if (val == 0) - break; - } - for ( ; i > 0; --i) - out.write (buf [i] | 0x080); - out.write (buf [0]); - } - - // XXX this API should probably facilitate the JDK sort utility - - /** - * Compares this identifier with another, for sorting purposes. - * An identifier does not precede itself. - * - * @param other identifer that may precede this one. - * @return true iff other precedes this one - * in a particular sorting order. - */ - public boolean precedes (ObjectIdentifier other) - { - int i; - - // shorter IDs go first - if (other == this || componentLen < other.componentLen) - return false; - if (other.componentLen < componentLen) - return true; - - // for each component, the lesser component goes first - for (i = 0; i < componentLen; i++) { - if (other.components [i] < components [i]) - return true; - } - - // identical IDs don't precede each other - return false; + out.write (DerValue.tag_ObjectId, encoding); } /** @@ -398,6 +331,7 @@ * * @return true iff the names are identical. */ + @Override public boolean equals(Object obj) { if (this == obj) { return true; @@ -406,23 +340,71 @@ return false; } ObjectIdentifier other = (ObjectIdentifier)obj; - if (componentLen != other.componentLen) { - return false; - } - for (int i = 0; i < componentLen; i++) { - if (components[i] != other.components[i]) { - return false; + return Arrays.equals(encoding, other.encoding); + } + + @Override + public int hashCode() { + return Arrays.hashCode(encoding); + } + + /** + * Private helper method for serialization. To be compatible with old + * versions of JDK. + * @return components in an int array, if all the components are less than + * Integer.MAX_VALUE. Otherwise, null. + */ + private int[] toIntArray() { + int length = encoding.length; + int[] result = new int[20]; + int which = 0; + int fromPos = 0; + for (int i = 0; i < length; i++) { + if ((encoding[i] & 0x80) == 0) { + // one section [fromPos..i] + if (i - fromPos + 1 > 4) { + BigInteger big = new BigInteger(pack(encoding, fromPos, i-fromPos+1, 7, 8)); + if (fromPos == 0) { + result[which++] = 2; + BigInteger second = big.subtract(BigInteger.valueOf(80)); + if (second.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 1) { + return null; + } else { + result[which++] = second.intValue(); + } + } else { + if (big.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 1) { + return null; + } else { + result[which++] = big.intValue(); + } + } + } else { + int retval = 0; + for (int j = fromPos; j <= i; j++) { + retval <<= 7; + byte tmp = encoding[j]; + retval |= (tmp & 0x07f); + } + if (fromPos == 0) { + if (retval < 80) { + result[which++] = retval / 40; + result[which++] = retval % 40; + } else { + result[which++] = 2; + result[which++] = retval - 80; + } + } else { + result[which++] = retval; + } + } + fromPos = i+1; + } + if (which >= result.length) { + result = Arrays.copyOf(result, which + 10); } } - return true; - } - - public int hashCode() { - int h = componentLen; - for (int i = 0; i < componentLen; i++) { - h += components[i] * 37; - } - return h; + return Arrays.copyOf(result, which); } /** @@ -431,15 +413,52 @@ * user-friendly descriptive strings, since those strings * will not be understood everywhere. */ + @Override public String toString() { String s = stringForm; if (s == null) { - StringBuffer sb = new StringBuffer(componentLen * 4); - for (int i = 0; i < componentLen; i++) { - if (i != 0) { - sb.append('.'); + int length = encoding.length; + StringBuffer sb = new StringBuffer(length * 4); + + int fromPos = 0; + for (int i = 0; i < length; i++) { + if ((encoding[i] & 0x80) == 0) { + // one section [fromPos..i] + if (fromPos != 0) { // not the first segment + sb.append('.'); + } + if (i - fromPos + 1 > 4) { // maybe big integer + BigInteger big = new BigInteger(pack(encoding, fromPos, i-fromPos+1, 7, 8)); + if (fromPos == 0) { + // first section encoded with more than 4 bytes, + // must be 2.something + sb.append("2."); + sb.append(big.subtract(BigInteger.valueOf(80))); + } else { + sb.append(big); + } + } else { // small integer + int retval = 0; + for (int j = fromPos; j <= i; j++) { + retval <<= 7; + byte tmp = encoding[j]; + retval |= (tmp & 0x07f); + } + if (fromPos == 0) { + if (retval < 80) { + sb.append(retval/40); + sb.append('.'); + sb.append(retval%40); + } else { + sb.append("2."); + sb.append(retval - 80); + } + } else { + sb.append(retval); + } + } + fromPos = i+1; } - sb.append(components[i]); } s = sb.toString(); stringForm = s; @@ -447,15 +466,197 @@ return s; } - /* - * To simplify, we assume no individual component of an object ID is - * larger than 32 bits. Then we represent the path from the root as - * an array that's (usually) only filled at the beginning. + /** + * Repack all bits from input to output. On the both sides, only a portion + * (from the least significant bit) of the 8 bits in a byte is used. This + * number is defined as the number of useful bits (NUB) for the array. All the + * used bits from the input byte array and repacked into the output in the + * exactly same order. The output bits are aligned so that the final bit of + * the input (the least significant bit in the last byte), when repacked as + * the final bit of the output, is still at the least significant position. + * Zeroes will be padded on the left side of the first output byte if + * necessary. All unused bits in the output are also zeroed. + * + * For example: if the input is 01001100 with NUB 8, the output which + * has a NUB 6 will look like: + * 00000001 00001100 + * The first 2 bits of the output bytes are unused bits. The other bits + * turn out to be 000001 001100. While the 8 bits on the right are from + * the input, the left 4 zeroes are padded to fill the 6 bits space. + * + * @param in the input byte array + * @param ioffset start point inside in + * @param ilength number of bytes to repack + * @param iw NUB for input + * @param ow NUB for output + * @return the repacked bytes + */ + private static byte[] pack(byte[] in, int ioffset, int ilength, int iw, int ow) { + assert (iw > 0 && iw <= 8): "input NUB must be between 1 and 8"; + assert (ow > 0 && ow <= 8): "output NUB must be between 1 and 8"; + + if (iw == ow) { + return in.clone(); + } + + int bits = ilength * iw; // number of all used bits + byte[] out = new byte[(bits+ow-1)/ow]; + + // starting from the 0th bit in the input + int ipos = 0; + + // the number of padding 0's needed in the output, skip them + int opos = (bits+ow-1)/ow*ow-bits; + + while(ipos < bits) { + int count = iw - ipos%iw; // unpacked bits in current input byte + if (count > ow - opos%ow) { // free space available in output byte + count = ow - opos%ow; // choose the smaller number + } + // and move them! + out[opos/ow] |= // paste! + (((in[ioffset+ipos/iw]+256) // locate the byte (+256 so that it's never negative) + >> (iw-ipos%iw-count)) // move to the end of a byte + & ((1 << (count))-1)) // zero out all other bits + << (ow-opos%ow-count); // move to the output position + ipos += count; // advance + opos += count; // advance + } + return out; + } + + /** + * Repack from NUB 8 to a NUB 7 OID sub-identifier, remove all + * unnecessary 0 headings, set the first bit of all non-tail + * output bytes to 1 (as ITU-T Rec. X.690 8.19.2 says), and + * paste it into an existing byte array. + * @param out the existing array to be pasted into + * @param ooffset the starting position to paste + * @return the number of bytes pasted + */ + private static int pack7Oid(byte[] in, int ioffset, int ilength, byte[] out, int ooffset) { + byte[] pack = pack(in, ioffset, ilength, 8, 7); + int firstNonZero = pack.length-1; // paste at least one byte + for (int i=pack.length-2; i>=0; i--) { + if (pack[i] != 0) { + firstNonZero = i; + } + pack[i] |= 0x80; + } + System.arraycopy(pack, firstNonZero, out, ooffset, pack.length-firstNonZero); + return pack.length-firstNonZero; + } + + /** + * Repack from NUB 7 to NUB 8, remove all unnecessary 0 + * headings, and paste it into an existing byte array. + * @param out the existing array to be pasted into + * @param ooffset the starting position to paste + * @return the number of bytes pasted */ - private int components []; // path from root - private int componentLen; // how much is used. + private static int pack8(byte[] in, int ioffset, int ilength, byte[] out, int ooffset) { + byte[] pack = pack(in, ioffset, ilength, 7, 8); + int firstNonZero = pack.length-1; // paste at least one byte + for (int i=pack.length-2; i>=0; i--) { + if (pack[i] != 0) { + firstNonZero = i; + } + } + System.arraycopy(pack, firstNonZero, out, ooffset, pack.length-firstNonZero); + return pack.length-firstNonZero; + } + + /** + * Pack the int into a OID sub-identifier DER encoding + */ + private static int pack7Oid(int input, byte[] out, int ooffset) { + byte[] b = new byte[4]; + b[0] = (byte)(input >> 24); + b[1] = (byte)(input >> 16); + b[2] = (byte)(input >> 8); + b[3] = (byte)(input); + return pack7Oid(b, 0, 4, out, ooffset); + } + + /** + * Pack the BigInteger into a OID subidentifier DER encoding + */ + private static int pack7Oid(BigInteger input, byte[] out, int ooffset) { + byte[] b = input.toByteArray(); + return pack7Oid(b, 0, b.length, out, ooffset); + } + + /** + * Private methods to check validity of OID. They must be -- + * 1. at least 2 components + * 2. all components must be non-negative + * 3. the first must be 0, 1 or 2 + * 4. if the first is 0 or 1, the second must be <40 + */ - private transient volatile String stringForm; - - private static final int allocationQuantum = 5; // >= 2 + /** + * Check the DER encoding. Since DER encoding defines that the integer bits + * are unsigned, so there's no need to check the MSB. + */ + private static void check(byte[] encoding) throws IOException { + int length = encoding.length; + if (length < 1 || // too short + (encoding[length - 1] & 0x80) != 0) { // not ended + throw new IOException("ObjectIdentifier() -- " + + "Invalid DER encoding, not ended"); + } + for (int i=0; i 2) { + throw new IOException("ObjectIdentifier() -- " + + "First oid component is invalid "); + } + } + private static void checkFirstComponent(BigInteger first) throws IOException { + if (first.signum() == -1 || + first.compareTo(BigInteger.valueOf(2)) == 1) { + throw new IOException("ObjectIdentifier() -- " + + "First oid component is invalid "); + } + } + private static void checkSecondComponent(int first, int second) throws IOException { + if (second < 0 || first != 2 && second > 39) { + throw new IOException("ObjectIdentifier() -- " + + "Second oid component is invalid "); + } + } + private static void checkSecondComponent(int first, BigInteger second) throws IOException { + if (second.signum() == -1 || + first != 2 && + second.compareTo(BigInteger.valueOf(39)) == 1) { + throw new IOException("ObjectIdentifier() -- " + + "Second oid component is invalid "); + } + } + private static void checkOtherComponent(int i, int num) throws IOException { + if (num < 0) { + throw new IOException("ObjectIdentifier() -- " + + "oid component #" + (i+1) + " must be non-negative "); + } + } + private static void checkOtherComponent(int i, BigInteger num) throws IOException { + if (num.signum() == -1) { + throw new IOException("ObjectIdentifier() -- " + + "oid component #" + (i+1) + " must be non-negative "); + } + } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/lib/management/jmxremote.access --- a/jdk/src/share/lib/management/jmxremote.access Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/lib/management/jmxremote.access Sat Apr 18 14:10:27 2009 -0700 @@ -8,7 +8,7 @@ # passwords. To be functional, a role must have an entry in # both the password and the access files. # -# Default location of this file is $JRE/lib/management/jmxremote.access +# The default location of this file is $JRE/lib/management/jmxremote.access # You can specify an alternate location by specifying a property in # the management config file $JRE/lib/management/management.properties # (See that file for details) @@ -16,7 +16,7 @@ # The file format for password and access files is syntactically the same # as the Properties file format. The syntax is described in the Javadoc # for java.util.Properties.load. -# Typical access file has multiple lines, where each line is blank, +# A typical access file has multiple lines, where each line is blank, # a comment (like this one), or an access control entry. # # An access control entry consists of a role name, and an @@ -29,10 +29,38 @@ # role can read measurements but cannot perform any action # that changes the environment of the running program. # "readwrite" grants access to read and write attributes of MBeans, -# to invoke operations on them, and to create or remove them. -# This access should be granted to only trusted clients, -# since they can potentially interfere with the smooth -# operation of a running program +# to invoke operations on them, and optionally +# to create or remove them. This access should be granted +# only to trusted clients, since they can potentially +# interfere with the smooth operation of a running program. +# +# The "readwrite" access level can optionally be followed by the "create" and/or +# "unregister" keywords. The "unregister" keyword grants access to unregister +# (delete) MBeans. The "create" keyword grants access to create MBeans of a +# particular class or of any class matching a particular pattern. Access +# should only be granted to create MBeans of known and trusted classes. +# +# For example, the following entry would grant readwrite access +# to "controlRole", as well as access to create MBeans of the class +# javax.management.monitor.CounterMonitor and to unregister any MBean: +# controlRole readwrite \ +# create javax.management.monitor.CounterMonitorMBean \ +# unregister +# or equivalently: +# controlRole readwrite unregister create javax.management.monitor.CounterMBean +# +# The following entry would grant readwrite access as well as access to create +# MBeans of any class in the packages javax.management.monitor and +# javax.management.timer: +# controlRole readwrite \ +# create javax.management.monitor.*,javax.management.timer.* \ +# unregister +# +# The \ character is defined in the Properties file syntax to allow continuation +# lines as shown here. A * in a class pattern matches a sequence of characters +# other than dot (.), so javax.management.monitor.* matches +# javax.management.monitor.CounterMonitor but not +# javax.management.monitor.foo.Bar. # # A given role should have at most one entry in this file. If a role # has no entry, it has no access. @@ -42,7 +70,10 @@ # # Default access control entries: # o The "monitorRole" role has readonly access. -# o The "controlRole" role has readwrite access. +# o The "controlRole" role has readwrite access and can create the standard +# Timer and Monitor MBeans defined by the JMX API. monitorRole readonly -controlRole readwrite +controlRole readwrite \ + create javax.management.monitor.*,javax.management.timer.* \ + unregister diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp --- a/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2009 Sun Microsystems, Inc. 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 @@ -94,6 +94,7 @@ assert(!valc->isMalloc); } xvs.init(u->rp, u->rplimit, valc); + CHECK; int X = xvs.getInt(); if (valc->S() != 0) { assert(valc->min <= -256); @@ -117,6 +118,7 @@ byte XB_byte = (byte) XB; byte* XB_ptr = &XB_byte; cm.init(u->rp, u->rplimit, XB_ptr, 0, defc, length, null); + CHECK; } else { NOT_PRODUCT(byte* meta_rp0 = u->meta_rp); assert(u->meta_rp != null); @@ -215,8 +217,19 @@ if (length == 0) return 0; if (total_memo > 0) return total_memo-1; int total = getInt(); + // overflow checks require that none of the addends are <0, + // and that the partial sums never overflow (wrap negative) + if (total < 0) { + abort("overflow detected"); + return 0; + } for (int k = length-1; k > 0; k--) { + int prev_total = total; total += vs[0].getInt(); + if (total < prev_total) { + abort("overflow detected"); + return 0; + } } rewind(); total_memo = total+1; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp --- a/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp Sat Apr 18 14:10:27 2009 -0700 @@ -56,7 +56,7 @@ return; } byte* oldptr = ptr; - ptr = (byte*)::realloc(ptr, len_+1); + ptr = (len_ >= PSIZE_MAX) ? null : (byte*)::realloc(ptr, len_+1); if (ptr != null) { mtrace('r', oldptr, 0); mtrace('m', ptr, len_+1); @@ -128,7 +128,7 @@ // Make sure there are 'o' bytes beyond the fill pointer, // advance the fill pointer, and return the old fill pointer. byte* fillbytes::grow(size_t s) { - size_t nlen = b.len+s; + size_t nlen = add_size(b.len, s); if (nlen <= allocated) { b.len = nlen; return limit()-s; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp --- a/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2009 Sun Microsystems, Inc. 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 @@ -814,6 +814,7 @@ } band_rp = vs.rp; } + CHECK; // Get an accurate upper limit now. vs0.rplimit = band_rp; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/defines.h --- a/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2009 Sun Microsystems, Inc. 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 @@ -47,11 +47,13 @@ #define NOT_PRODUCT(xxx) #define assert(p) #define PRINTCR(args) +#define VERSION_STRING "%s version %s\n" #else #define IF_PRODUCT(xxx) #define NOT_PRODUCT(xxx) xxx #define assert(p) ((p) || assert_failed(#p)) #define PRINTCR(args) u->verbose && u->printcr_if_verbose args +#define VERSION_STRING "%s version non-product %s\n" extern "C" void breakpoint(); extern int assert_failed(const char*); #define BREAK (breakpoint()) @@ -79,9 +81,9 @@ #define lengthof(array) (sizeof(array)/sizeof(array[0])) -#define NEW(T, n) (T*) must_malloc((int)(sizeof(T)*(n))) -#define U_NEW(T, n) (T*) u->alloc(sizeof(T)*(n)) -#define T_NEW(T, n) (T*) u->temp_alloc(sizeof(T)*(n)) +#define NEW(T, n) (T*) must_malloc((int)(scale_size(n, sizeof(T)))) +#define U_NEW(T, n) (T*) u->alloc(scale_size(n, sizeof(T))) +#define T_NEW(T, n) (T*) u->temp_alloc(scale_size(n, sizeof(T))) // bytes and byte arrays @@ -153,6 +155,8 @@ #define CHECK_NULL_(y,p) _CHECK_DO((p)==null, return y) #define CHECK_NULL_0(p) _CHECK_DO((p)==null, return 0) +#define CHECK_COUNT(t) if (t < 0){abort("bad value count");} CHECK + #define STR_TRUE "true" #define STR_FALSE "false" diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp --- a/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp Sat Apr 18 14:10:27 2009 -0700 @@ -299,7 +299,7 @@ case 'J': argp += 1; break; // skip ignored -Jxxx parameter case 'V': - fprintf(u.errstrm, "%s version %s\n", nbasename(argv[0]), sccsver); + fprintf(u.errstrm, VERSION_STRING, nbasename(argv[0]), sccsver); exit(0); case 'h': diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp --- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2009 Sun Microsystems, Inc. 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 @@ -523,15 +523,39 @@ enum { MAGIC_BYTES = 4, AH_LENGTH_0 = 3, //minver, majver, options are outside of archive_size + AH_LENGTH_0_MAX = AH_LENGTH_0 + 1, // options might have 2 bytes AH_LENGTH = 26, //maximum archive header length (w/ all fields) // Length contributions from optional header fields: AH_FILE_HEADER_LEN = 5, // sizehi/lo/next/modtime/files + AH_ARCHIVE_SIZE_LEN = 2, // sizehi/lo only; part of AH_FILE_HEADER_LEN AH_CP_NUMBER_LEN = 4, // int/float/long/double AH_SPECIAL_FORMAT_LEN = 2, // layouts/band-headers AH_LENGTH_MIN = AH_LENGTH -(AH_FILE_HEADER_LEN+AH_SPECIAL_FORMAT_LEN+AH_CP_NUMBER_LEN), + ARCHIVE_SIZE_MIN = AH_LENGTH_MIN - (AH_LENGTH_0 + AH_ARCHIVE_SIZE_LEN), FIRST_READ = MAGIC_BYTES + AH_LENGTH_MIN }; + + assert(AH_LENGTH_MIN == 15); // # of UNSIGNED5 fields required after archive_magic + assert(ARCHIVE_SIZE_MIN == 10); // # of UNSIGNED5 fields required after archive_size + // An absolute minimum null archive is magic[4], {minver,majver,options}[3], + // archive_size[0], cp_counts[8], class_counts[4], for a total of 19 bytes. + // (Note that archive_size is optional; it may be 0..10 bytes in length.) + // The first read must capture everything up through the options field. + // This happens to work even if {minver,majver,options} is a pathological + // 15 bytes long. Legal pack files limit those three fields to 1+1+2 bytes. + assert(FIRST_READ >= MAGIC_BYTES + AH_LENGTH_0 * B_MAX); + + // Up through archive_size, the largest possible archive header is + // magic[4], {minver,majver,options}[4], archive_size[10]. + // (Note only the low 12 bits of options are allowed to be non-zero.) + // In order to parse archive_size, we need at least this many bytes + // in the first read. Of course, if archive_size_hi is more than + // a byte, we probably will fail to allocate the buffer, since it + // will be many gigabytes long. This is a practical, not an + // architectural limit to Pack200 archive sizes. + assert(FIRST_READ >= MAGIC_BYTES + AH_LENGTH_0_MAX + 2*B_MAX); + bool foreign_buf = (read_input_fn == null); byte initbuf[(int)FIRST_READ + (int)C_SLOP + 200]; // 200 is for JAR I/O if (foreign_buf) { @@ -547,7 +571,7 @@ // There is no way to tell the caller that we used only part of them. // Therefore, the caller must use only a bare minimum of read-ahead. if (inbytes.len > FIRST_READ) { - abort("too much pushback"); + abort("too much read-ahead"); return; } input.set(initbuf, sizeof(initbuf)); @@ -557,7 +581,7 @@ rplimit += inbytes.len; bytes_read += inbytes.len; } - // Read only 19 bytes, which is certain to contain #archive_size fields, + // Read only 19 bytes, which is certain to contain #archive_options fields, // but is certain not to overflow past the archive_header. input.b.len = FIRST_READ; if (!ensure_input(FIRST_READ)) @@ -629,26 +653,25 @@ #undef ORBIT if ((archive_options & ~OPTION_LIMIT) != 0) { fprintf(errstrm, "Warning: Illegal archive options 0x%x\n", - archive_options); - // Do not abort. If the format really changes, version numbers will bump. - //abort("illegal archive options"); + archive_options); + abort("illegal archive options"); + return; } if ((archive_options & AO_HAVE_FILE_HEADERS) != 0) { uint hi = hdr.getInt(); uint lo = hdr.getInt(); - archive_size = band::makeLong(hi, lo); + julong x = band::makeLong(hi, lo); + archive_size = (size_t) x; + if (archive_size != x) { + // Silly size specified; force overflow. + archive_size = PSIZE_MAX+1; + } hdrVals += 2; } else { hdrValsSkipped += 2; } - if (archive_size != (size_t)archive_size) { - // Silly size specified. - abort("archive too large"); - return; - } - // Now we can size the whole archive. // Read everything else into a mega-buffer. rp = hdr.rp; @@ -662,9 +685,18 @@ abort("EOF reading fixed input buffer"); return; } - } else if (archive_size > 0) { - input.set(U_NEW(byte, (size_t)(header_size_0 + archive_size + C_SLOP)), - (size_t) header_size_0 + (size_t)archive_size); + } else if (archive_size != 0) { + if (archive_size < ARCHIVE_SIZE_MIN) { + abort("impossible archive size"); // bad input data + return; + } + if (archive_size < header_size_1) { + abort("too much read-ahead"); // somehow we pre-fetched too much? + return; + } + input.set(U_NEW(byte, add_size(header_size_0, archive_size, C_SLOP)), + (size_t) header_size_0 + archive_size); + CHECK; assert(input.limit()[0] == 0); // Move all the bytes we read initially into the real buffer. input.b.copyFrom(initbuf, header_size); @@ -673,17 +705,17 @@ } else { // It's more complicated and painful. // A zero archive_size means that we must read until EOF. - assert(archive_size == 0); input.init(CHUNK*2); CHECK; input.b.len = input.allocated; rp = rplimit = input.base(); // Set up input buffer as if we already read the header: input.b.copyFrom(initbuf, header_size); + CHECK; rplimit += header_size; while (ensure_input(input.limit() - rp)) { size_t dataSoFar = input_remaining(); - size_t nextSize = dataSoFar + CHUNK; + size_t nextSize = add_size(dataSoFar, CHUNK); input.ensureSize(nextSize); CHECK; input.b.len = input.allocated; @@ -715,8 +747,10 @@ if ((archive_options & AO_HAVE_FILE_HEADERS) != 0) { archive_next_count = hdr.getInt(); + CHECK_COUNT(archive_next_count); archive_modtime = hdr.getInt(); file_count = hdr.getInt(); + CHECK_COUNT(file_count); hdrVals += 3; } else { hdrValsSkipped += 3; @@ -724,7 +758,9 @@ if ((archive_options & AO_HAVE_SPECIAL_FORMATS) != 0) { band_headers_size = hdr.getInt(); + CHECK_COUNT(band_headers_size); attr_definition_count = hdr.getInt(); + CHECK_COUNT(attr_definition_count); hdrVals += 2; } else { hdrValsSkipped += 2; @@ -744,13 +780,16 @@ } } cp_counts[k] = hdr.getInt(); + CHECK_COUNT(cp_counts[k]); hdrVals += 1; } ic_count = hdr.getInt(); + CHECK_COUNT(ic_count); default_class_minver = hdr.getInt(); default_class_majver = hdr.getInt(); class_count = hdr.getInt(); + CHECK_COUNT(class_count); hdrVals += 4; // done with archive_header @@ -807,7 +846,6 @@ bytes::of(band_headers.limit(), C_SLOP).clear(_meta_error); } - void unpacker::finish() { if (verbose >= 1) { fprintf(errstrm, @@ -973,12 +1011,12 @@ // First band: Read lengths of shared prefixes. if (len > PREFIX_SKIP_2) cp_Utf8_prefix.readData(len - PREFIX_SKIP_2); - NOT_PRODUCT(else cp_Utf8_prefix.readData(0)); // for asserts + NOT_PRODUCT(else cp_Utf8_prefix.readData(0)); // for asserts // Second band: Read lengths of unshared suffixes: if (len > SUFFIX_SKIP_1) cp_Utf8_suffix.readData(len - SUFFIX_SKIP_1); - NOT_PRODUCT(else cp_Utf8_suffix.readData(0)); // for asserts + NOT_PRODUCT(else cp_Utf8_suffix.readData(0)); // for asserts bytes* allsuffixes = T_NEW(bytes, len); CHECK; @@ -2117,6 +2155,7 @@ field_descr.readData(field_count); read_attrs(ATTR_CONTEXT_FIELD, field_count); + CHECK; method_descr.readData(method_count); read_attrs(ATTR_CONTEXT_METHOD, method_count); @@ -2124,6 +2163,7 @@ CHECK; read_attrs(ATTR_CONTEXT_CLASS, class_count); + CHECK; read_code_headers(); @@ -2150,10 +2190,12 @@ assert(endsWith(xxx_flags_hi.name, "_flags_hi")); if (haveLongFlags) xxx_flags_hi.readData(obj_count); + CHECK; band& xxx_flags_lo = ad.xxx_flags_lo(); assert(endsWith(xxx_flags_lo.name, "_flags_lo")); xxx_flags_lo.readData(obj_count); + CHECK; // pre-scan flags, counting occurrences of each index bit julong indexMask = ad.flagIndexMask(); // which flag bits are index bits? @@ -2176,11 +2218,13 @@ assert(endsWith(xxx_attr_count.name, "_attr_count")); // There is one count element for each 1<<16 bit set in flags: xxx_attr_count.readData(ad.predefCount(X_ATTR_OVERFLOW)); + CHECK; band& xxx_attr_indexes = ad.xxx_attr_indexes(); assert(endsWith(xxx_attr_indexes.name, "_attr_indexes")); int overflowIndexCount = xxx_attr_count.getIntTotal(); xxx_attr_indexes.readData(overflowIndexCount); + CHECK; // pre-scan attr indexes, counting occurrences of each value for (i = 0; i < overflowIndexCount; i++) { idx = xxx_attr_indexes.getInt(); @@ -2211,6 +2255,7 @@ } } ad.xxx_attr_calls().readData(backwardCounts); + CHECK; // Read built-in bands. // Mostly, these are hand-coded equivalents to readBandData(). @@ -2219,42 +2264,53 @@ count = ad.predefCount(CLASS_ATTR_SourceFile); class_SourceFile_RUN.readData(count); + CHECK; count = ad.predefCount(CLASS_ATTR_EnclosingMethod); class_EnclosingMethod_RC.readData(count); class_EnclosingMethod_RDN.readData(count); + CHECK; count = ad.predefCount(X_ATTR_Signature); class_Signature_RS.readData(count); + CHECK; ad.readBandData(X_ATTR_RuntimeVisibleAnnotations); ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations); count = ad.predefCount(CLASS_ATTR_InnerClasses); class_InnerClasses_N.readData(count); + CHECK; + count = class_InnerClasses_N.getIntTotal(); class_InnerClasses_RC.readData(count); class_InnerClasses_F.readData(count); + CHECK; // Drop remaining columns wherever flags are zero: count -= class_InnerClasses_F.getIntCount(0); class_InnerClasses_outer_RCN.readData(count); class_InnerClasses_name_RUN.readData(count); + CHECK; count = ad.predefCount(CLASS_ATTR_ClassFile_version); class_ClassFile_version_minor_H.readData(count); class_ClassFile_version_major_H.readData(count); + CHECK; break; case ATTR_CONTEXT_FIELD: count = ad.predefCount(FIELD_ATTR_ConstantValue); field_ConstantValue_KQ.readData(count); + CHECK; count = ad.predefCount(X_ATTR_Signature); field_Signature_RS.readData(count); + CHECK; ad.readBandData(X_ATTR_RuntimeVisibleAnnotations); ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations); + CHECK; break; case ATTR_CONTEXT_METHOD: @@ -2266,15 +2322,18 @@ method_Exceptions_N.readData(count); count = method_Exceptions_N.getIntTotal(); method_Exceptions_RC.readData(count); + CHECK; count = ad.predefCount(X_ATTR_Signature); method_Signature_RS.readData(count); + CHECK; ad.readBandData(X_ATTR_RuntimeVisibleAnnotations); ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations); ad.readBandData(METHOD_ATTR_RuntimeVisibleParameterAnnotations); ad.readBandData(METHOD_ATTR_RuntimeInvisibleParameterAnnotations); ad.readBandData(METHOD_ATTR_AnnotationDefault); + CHECK; break; case ATTR_CONTEXT_CODE: @@ -2286,8 +2345,10 @@ return; } code_StackMapTable_N.readData(count); + CHECK; count = code_StackMapTable_N.getIntTotal(); code_StackMapTable_frame_T.readData(count); + CHECK; // the rest of it depends in a complicated way on frame tags { int fat_frame_count = 0; @@ -2321,18 +2382,23 @@ // deal completely with fat frames: offset_count += fat_frame_count; code_StackMapTable_local_N.readData(fat_frame_count); + CHECK; type_count += code_StackMapTable_local_N.getIntTotal(); code_StackMapTable_stack_N.readData(fat_frame_count); type_count += code_StackMapTable_stack_N.getIntTotal(); + CHECK; // read the rest: code_StackMapTable_offset.readData(offset_count); code_StackMapTable_T.readData(type_count); + CHECK; // (7) [RCH] count = code_StackMapTable_T.getIntCount(7); code_StackMapTable_RC.readData(count); + CHECK; // (8) [PH] count = code_StackMapTable_T.getIntCount(8); code_StackMapTable_P.readData(count); + CHECK; } count = ad.predefCount(CODE_ATTR_LineNumberTable); @@ -2654,6 +2720,7 @@ code_max_na_locals.readData(); code_handler_count.readData(); totalHandlerCount += code_handler_count.getIntTotal(); + CHECK; // Read handler specifications. // Cf. PackageReader.readCodeHandlers. @@ -2661,8 +2728,10 @@ code_handler_end_PO.readData(totalHandlerCount); code_handler_catch_PO.readData(totalHandlerCount); code_handler_class_RCN.readData(totalHandlerCount); + CHECK; read_attrs(ATTR_CONTEXT_CODE, totalFlagsCount); + CHECK; } static inline bool is_in_range(uint n, uint min, uint max) { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h --- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h Sat Apr 18 14:10:27 2009 -0700 @@ -204,7 +204,7 @@ // archive header fields int magic, minver, majver; - julong archive_size; + size_t archive_size; int archive_next_count, archive_options, archive_modtime; int band_headers_size; int file_count, attr_definition_count, ic_count, class_count; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp --- a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp Sat Apr 18 14:10:27 2009 -0700 @@ -46,14 +46,13 @@ #include "unpack.h" -void* must_malloc(int size) { - int msize = size; - assert(size >= 0); +void* must_malloc(size_t size) { + size_t msize = size; #ifdef USE_MTRACE - if (msize < sizeof(int)) + if (msize >= 0 && msize < sizeof(int)) msize = sizeof(int); // see 0xbaadf00d below #endif - void* ptr = malloc(msize); + void* ptr = (msize > PSIZE_MAX) ? null : malloc(msize); if (ptr != null) { memset(ptr, 0, size); } else { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/com/sun/java/util/jar/pack/utils.h --- a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h Sat Apr 18 14:10:27 2009 -0700 @@ -25,13 +25,31 @@ //Definitions of our util functions -void* must_malloc(int size); +void* must_malloc(size_t size); #ifndef USE_MTRACE #define mtrace(c, ptr, size) #else void mtrace(char c, void* ptr, size_t size); #endif +// overflow management +#define OVERFLOW ((size_t)-1) +#define PSIZE_MAX (OVERFLOW/2) /* normal size limit */ + +inline size_t scale_size(size_t size, size_t scale) { + return (size > PSIZE_MAX / scale) ? OVERFLOW : size * scale; +} + +inline size_t add_size(size_t size1, size_t size2) { + return ((size1 | size2 | (size1 + size2)) > PSIZE_MAX) + ? OVERFLOW + : size1 + size2; +} + +inline size_t add_size(size_t size1, size_t size2, int size3) { + return add_size(add_size(size1, size2), size3); +} + // These may be expensive, because they have to go via Java TSD, // if the optional u argument is missing. struct unpacker; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/java/util/zip/ZipEntry.c --- a/jdk/src/share/native/java/util/zip/ZipEntry.c Thu Apr 16 11:22:52 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/* - * Copyright 1998 Sun Microsystems, Inc. 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. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -/* - * Native method support for java.util.zip.ZipEntry - */ - -#include -#include -#include "jlong.h" -#include "jvm.h" -#include "jni.h" -#include "jni_util.h" -#include "zip_util.h" - -#include "java_util_zip_ZipEntry.h" - -#define DEFLATED 8 -#define STORED 0 - -static jfieldID nameID; -static jfieldID timeID; -static jfieldID crcID; -static jfieldID sizeID; -static jfieldID csizeID; -static jfieldID methodID; -static jfieldID extraID; -static jfieldID commentID; - -JNIEXPORT void JNICALL -Java_java_util_zip_ZipEntry_initIDs(JNIEnv *env, jclass cls) -{ - nameID = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); - timeID = (*env)->GetFieldID(env, cls, "time", "J"); - crcID = (*env)->GetFieldID(env, cls, "crc", "J"); - sizeID = (*env)->GetFieldID(env, cls, "size", "J"); - csizeID = (*env)->GetFieldID(env, cls, "csize", "J"); - methodID = (*env)->GetFieldID(env, cls, "method", "I"); - extraID = (*env)->GetFieldID(env, cls, "extra", "[B"); - commentID = (*env)->GetFieldID(env, cls, "comment", "Ljava/lang/String;"); -} - -JNIEXPORT void JNICALL -Java_java_util_zip_ZipEntry_initFields(JNIEnv *env, jobject obj, jlong zentry) -{ - jzentry *ze = jlong_to_ptr(zentry); - jstring name = (*env)->GetObjectField(env, obj, nameID); - - if (name == 0) { - name = (*env)->NewStringUTF(env, ze->name); - if (name == 0) { - return; - } - (*env)->SetObjectField(env, obj, nameID, name); - } - (*env)->SetLongField(env, obj, timeID, (jlong)ze->time & 0xffffffffUL); - (*env)->SetLongField(env, obj, crcID, (jlong)ze->crc & 0xffffffffUL); - (*env)->SetLongField(env, obj, sizeID, (jlong)ze->size); - if (ze->csize == 0) { - (*env)->SetLongField(env, obj, csizeID, (jlong)ze->size); - (*env)->SetIntField(env, obj, methodID, STORED); - } else { - (*env)->SetLongField(env, obj, csizeID, (jlong)ze->csize); - (*env)->SetIntField(env, obj, methodID, DEFLATED); - } - if (ze->extra != 0) { - unsigned char *bp = (unsigned char *)&ze->extra[0]; - jsize len = (bp[0] | (bp[1] << 8)); - jbyteArray extra = (*env)->NewByteArray(env, len); - if (extra == 0) { - return; - } - (*env)->SetByteArrayRegion(env, extra, 0, len, &ze->extra[2]); - (*env)->SetObjectField(env, obj, extraID, extra); - } - if (ze->comment != 0) { - jstring comment = (*env)->NewStringUTF(env, ze->comment); - if (comment == 0) { - return; - } - (*env)->SetObjectField(env, obj, commentID, comment); - } -} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/java/util/zip/ZipFile.c --- a/jdk/src/share/native/java/util/zip/ZipFile.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/java/util/zip/ZipFile.c Sat Apr 18 14:10:27 2009 -0700 @@ -141,12 +141,11 @@ JNIEXPORT jlong JNICALL Java_java_util_zip_ZipFile_getEntry(JNIEnv *env, jclass cls, jlong zfile, - jstring name, jboolean addSlash) + jbyteArray name, jboolean addSlash) { #define MAXNAME 1024 jzfile *zip = jlong_to_ptr(zfile); - jsize slen = (*env)->GetStringLength(env, name); - jsize ulen = (*env)->GetStringUTFLength(env, name); + jsize ulen = (*env)->GetArrayLength(env, name); char buf[MAXNAME+2], *path; jzentry *ze; @@ -159,7 +158,7 @@ } else { path = buf; } - (*env)->GetStringUTFRegion(env, name, 0, slen, path); + (*env)->GetByteArrayRegion(env, name, 0, ulen, (jbyte *)path); path[ulen] = '\0'; if (addSlash == JNI_FALSE) { ze = ZIP_GetEntry(zip, path, 0); @@ -186,32 +185,85 @@ jint n) { jzentry *ze = ZIP_GetNextEntry(jlong_to_ptr(zfile), n); - return ptr_to_jlong(ze); } JNIEXPORT jint JNICALL -Java_java_util_zip_ZipFile_getMethod(JNIEnv *env, jclass cls, jlong zentry) +Java_java_util_zip_ZipFile_getEntryMethod(JNIEnv *env, jclass cls, jlong zentry) { jzentry *ze = jlong_to_ptr(zentry); - return ze->csize != 0 ? DEFLATED : STORED; } -JNIEXPORT jlong JNICALL -Java_java_util_zip_ZipFile_getCSize(JNIEnv *env, jclass cls, jlong zentry) +JNIEXPORT jint JNICALL +Java_java_util_zip_ZipFile_getEntryFlag(JNIEnv *env, jclass cls, jlong zentry) { jzentry *ze = jlong_to_ptr(zentry); + return ze->flag; +} +JNIEXPORT jlong JNICALL +Java_java_util_zip_ZipFile_getEntryCSize(JNIEnv *env, jclass cls, jlong zentry) +{ + jzentry *ze = jlong_to_ptr(zentry); return ze->csize != 0 ? ze->csize : ze->size; } JNIEXPORT jlong JNICALL -Java_java_util_zip_ZipFile_getSize(JNIEnv *env, jclass cls, jlong zentry) +Java_java_util_zip_ZipFile_getEntrySize(JNIEnv *env, jclass cls, jlong zentry) +{ + jzentry *ze = jlong_to_ptr(zentry); + return ze->size; +} + +JNIEXPORT jlong JNICALL +Java_java_util_zip_ZipFile_getEntryTime(JNIEnv *env, jclass cls, jlong zentry) +{ + jzentry *ze = jlong_to_ptr(zentry); + return (jlong)ze->time & 0xffffffffUL; +} + +JNIEXPORT jlong JNICALL +Java_java_util_zip_ZipFile_getEntryCrc(JNIEnv *env, jclass cls, jlong zentry) +{ + jzentry *ze = jlong_to_ptr(zentry); + return (jlong)ze->crc & 0xffffffffUL; +} + +JNIEXPORT jbyteArray JNICALL +Java_java_util_zip_ZipFile_getEntryBytes(JNIEnv *env, jclass cls, jlong zentry, jint type) { jzentry *ze = jlong_to_ptr(zentry); - - return ze->size; + int len = 0; + jbyteArray jba = NULL; + switch (type) { + case java_util_zip_ZipFile_JZENTRY_NAME: + if (ze->name != 0) { + len = (int)strlen(ze->name); + if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte *)ze->name); + } + break; + case java_util_zip_ZipFile_JZENTRY_EXTRA: + if (ze->extra != 0) { + unsigned char *bp = (unsigned char *)&ze->extra[0]; + len = (bp[0] | (bp[1] << 8)); + if (len <= 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, &ze->extra[2]); + } + break; + case java_util_zip_ZipFile_JZENTRY_COMMENT: + if (ze->comment != 0) { + len = (int)strlen(ze->comment); + if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte*)ze->comment); + } + break; + } + return jba; } JNIEXPORT jint JNICALL diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/java/util/zip/zip_util.c --- a/jdk/src/share/native/java/util/zip/zip_util.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/java/util/zip/zip_util.c Sat Apr 18 14:10:27 2009 -0700 @@ -512,7 +512,6 @@ /* Clear previous zip error */ zip->msg = NULL; - /* Get position of END header */ if ((endpos = findEND(zip, endbuf)) == -1) return -1; /* no END header or system error */ @@ -520,7 +519,6 @@ if (endpos == 0) return 0; /* only END header present */ freeCEN(zip); - /* Get position and length of central directory */ cenlen = ENDSIZ(endbuf); cenoff = ENDOFF(endbuf); @@ -935,6 +933,7 @@ ze->crc = CENCRC(cen); locoff = CENOFF(cen); ze->pos = -(zip->locpos + locoff); + ze->flag = CENFLG(cen); if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch; memcpy(ze->name, cen + CENHDR, nlen); diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/java/util/zip/zip_util.h --- a/jdk/src/share/native/java/util/zip/zip_util.h Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/java/util/zip/zip_util.h Sat Apr 18 14:10:27 2009 -0700 @@ -168,6 +168,7 @@ char *comment; /* optional zip file comment */ jbyte *extra; /* optional extra data */ jlong pos; /* position of LOC header or entry data */ + jint flag; /* general purpose flag */ } jzentry; /* diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/sun/awt/giflib/dgif_lib.c --- a/jdk/src/share/native/sun/awt/giflib/dgif_lib.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/sun/awt/giflib/dgif_lib.c Sat Apr 18 14:10:27 2009 -0700 @@ -722,6 +722,10 @@ GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; READ(GifFile, &CodeSize, 1); /* Read Code size from file. */ + if (CodeSize >= 12) { + /* Invalid initial code size: report failure */ + return GIF_ERROR; + } BitsPerPixel = CodeSize; Private->Buf[0] = 0; /* Input Buffer empty. */ @@ -964,10 +968,13 @@ /* If code cannot fit into RunningBits bits, must raise its size. Note * however that codes above 4095 are used for special signaling. */ - if (++Private->RunningCode > Private->MaxCode1 && - Private->RunningBits < LZ_BITS) { - Private->MaxCode1 <<= 1; - Private->RunningBits++; + if (++Private->RunningCode > Private->MaxCode1) { + if (Private->RunningBits < LZ_BITS) { + Private->MaxCode1 <<= 1; + Private->RunningBits++; + } else { + Private->RunningCode = Private->MaxCode1; + } } return GIF_OK; } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/sun/awt/image/gif/gifdecoder.c --- a/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Sat Apr 18 14:10:27 2009 -0700 @@ -191,6 +191,11 @@ int passht = passinc; int len; + /* We have verified the initial code size on the java layer. + * Here we just check bounds for particular indexes. */ + if (freeCode >= 4096 || maxCode >= 4096) { + return 0; + } if (blockh == 0 || raslineh == 0 || prefixh == 0 || suffixh == 0 || outCodeh == 0) diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c --- a/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Sat Apr 18 14:10:27 2009 -0700 @@ -216,6 +216,16 @@ #endif /* ! DEBUG */ +static int +getMlibEdgeHint(jint edgeHint) { + switch (edgeHint) { + case java_awt_image_ConvolveOp_EDGE_NO_OP: + return MLIB_EDGE_DST_COPY_SRC; + case java_awt_image_ConvolveOp_EDGE_ZERO_FILL: + default: + return MLIB_EDGE_DST_FILL_ZERO; + } +} /*************************************************************************** * External Functions * @@ -400,22 +410,10 @@ } } - if (edgeHint == java_awt_image_ConvolveOp_EDGE_NO_OP) { - int kw2 = kwidth>>1; - int kh2 = kheight>>1; - int bsize = mlib_ImageGetChannels(src)* - (mlib_ImageGetType(src) == MLIB_BYTE ? 1 : 2); - - void *dstDataP = mlib_ImageGetData(dst); - void *srcDataP = mlib_ImageGetData(src); - /* REMIND: Copy a smaller area */ - memcpy(dstDataP, srcDataP, dst->width*dst->height*bsize); - } - cmask = (1<channels)-1; status = (*sMlibFns[MLIB_CONVMxN].fptr)(dst, src, kdata, w, h, (w-1)/2, (h-1)/2, scale, cmask, - MLIB_EDGE_DST_NO_WRITE); + getMlibEdgeHint(edgeHint)); if (status != MLIB_SUCCESS) { printMedialibError(status); @@ -660,22 +658,10 @@ } } - if (edgeHint == java_awt_image_ConvolveOp_EDGE_NO_OP) { - int kw2 = kwidth>>1; - int kh2 = kheight>>1; - int bsize = mlib_ImageGetChannels(src)* - (mlib_ImageGetType(src) == MLIB_BYTE ? 1 : 2); - - void *dstDataP = mlib_ImageGetData(dst); - void *srcDataP = mlib_ImageGetData(src); - /* REMIND: Copy a smaller area */ - memcpy(dstDataP, srcDataP, dst->width*dst->height*bsize); - } - cmask = (1<channels)-1; status = (*sMlibFns[MLIB_CONVMxN].fptr)(dst, src, kdata, w, h, (w-1)/2, (h-1)/2, scale, cmask, - MLIB_EDGE_DST_NO_WRITE); + getMlibEdgeHint(edgeHint)); if (status != MLIB_SUCCESS) { printMedialibError(status); diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h Sat Apr 18 14:10:27 2009 -0700 @@ -31,7 +31,7 @@ /* here come some very simple macros */ /* advance a pointer p by sizeof(type)*n bytes */ -#define INCPN(type,p,n) ((p) = (type*)(p)+n) +#define INCPN(type,p,n) ((p) = (type*)(p)+(n)) /* advance a pointer by sizeof(type) */ #define INCP(type,p) INCPN(type,(p),1) diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c Sat Apr 18 14:10:27 2009 -0700 @@ -62,6 +62,15 @@ return rc; } +/* These macro help to ensure that we only take part of frame that fits into + logical screen. */ + +/* Ensure that p belongs to [pmin, pmax) interval. Returns fixed point (if fix is needed) */ +#define FIX_POINT(p, pmin, pmax) ( ((p) < (pmin)) ? (pmin) : (((p) > (pmax)) ? (pmax) : (p))) +/* Ensures that line starting at point p does not exceed boundary pmax. + Returns fixed length (if fix is needed) */ +#define FIX_LENGTH(p, len, pmax) ( ((p) + (len)) > (pmax) ? ((pmax) - (p)) : (len)) + int SplashDecodeGif(Splash * splash, GifFileType * gif) { @@ -70,6 +79,7 @@ byte_t *pBitmapBits, *pOldBitmapBits; int i, j; int imageIndex; + int cx, cy, cw, ch; /* clamped coordinates */ const int interlacedOffset[] = { 0, 4, 2, 1, 0 }; /* The way Interlaced image should. */ const int interlacedJumps[] = { 8, 8, 4, 2, 1 }; /* be read - offsets and jumps... */ @@ -79,14 +89,31 @@ SplashCleanup(splash); + if (!SAFE_TO_ALLOC(gif->SWidth, splash->imageFormat.depthBytes)) { + return 0; + } stride = gif->SWidth * splash->imageFormat.depthBytes; if (splash->byteAlignment > 1) stride = (stride + splash->byteAlignment - 1) & ~(splash->byteAlignment - 1); + if (!SAFE_TO_ALLOC(gif->SHeight, stride)) { + return 0; + } + + if (!SAFE_TO_ALLOC(gif->ImageCount, sizeof(SplashImage*))) { + return 0; + } bufferSize = stride * gif->SHeight; pBitmapBits = (byte_t *) malloc(bufferSize); + if (!pBitmapBits) { + return 0; + } pOldBitmapBits = (byte_t *) malloc(bufferSize); + if (!pOldBitmapBits) { + free(pBitmapBits); + return 0; + } memset(pBitmapBits, 0, bufferSize); splash->width = gif->SWidth; @@ -94,6 +121,11 @@ splash->frameCount = gif->ImageCount; splash->frames = (SplashImage *) malloc(sizeof(SplashImage) * gif->ImageCount); + if (!splash->frames) { + free(pBitmapBits); + free(pOldBitmapBits); + return 0; + } memset(splash->frames, 0, sizeof(SplashImage) * gif->ImageCount); splash->loopCount = 1; @@ -109,6 +141,11 @@ int colorCount = 0; rgbquad_t colorMapBuf[SPLASH_COLOR_MAP_SIZE]; + cx = FIX_POINT(desc->Left, 0, gif->SWidth); + cy = FIX_POINT(desc->Top, 0, gif->SHeight); + cw = FIX_LENGTH(desc->Left, desc->Width, gif->SWidth); + ch = FIX_LENGTH(desc->Top, desc->Height, gif->SHeight); + if (colorMap) { if (colorMap->ColorCount <= SPLASH_COLOR_MAP_SIZE) { colorCount = colorMap->ColorCount; @@ -195,13 +232,22 @@ for (; pass < npass; ++pass) { int jump = interlacedJumps[pass]; int ofs = interlacedOffset[pass]; - int numLines = (desc->Height + jump - 1 - ofs) / jump; + /* Number of source lines for current pass */ + int numPassLines = (desc->Height + jump - ofs - 1) / jump; + /* Number of lines that fits to dest buffer */ + int numLines = (ch + jump - ofs - 1) / jump; initRect(&srcRect, 0, 0, desc->Width, numLines, 1, desc->Width, pSrc, &srcFormat); - initRect(&dstRect, desc->Left, desc->Top + ofs, desc->Width, - numLines, jump, stride, pBitmapBits, &splash->imageFormat); - pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST); + + if (numLines > 0) { + initRect(&dstRect, cx, cy + ofs, cw, + numLines , jump, stride, pBitmapBits, &splash->imageFormat); + + pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST); + } + // skip extra source data + pSrc += (numPassLines - numLines) * srcRect.stride; } } @@ -209,6 +255,12 @@ splash->frames[imageIndex].bitmapBits = (rgbquad_t *) malloc(bufferSize); + if (!splash->frames[imageIndex].bitmapBits) { + free(pBitmapBits); + free(pOldBitmapBits); + /* Assuming that callee will take care of splash frames we have already allocated */ + return 0; + } memcpy(splash->frames[imageIndex].bitmapBits, pBitmapBits, bufferSize); SplashInitFrameShape(splash, imageIndex); @@ -224,27 +276,29 @@ { ImageRect dstRect; rgbquad_t fillColor = 0; // 0 is transparent - if (transparentColor < 0) { + + if (transparentColor > 0) { fillColor= MAKE_QUAD_GIF( colorMap->Colors[gif->SBackGroundColor], 0xff); } - initRect(&dstRect, desc->Left, desc->Top, - desc->Width, desc->Height, 1, stride, - pBitmapBits, &splash->imageFormat); + initRect(&dstRect, + cx, cy, cw, ch, + 1, stride, + pBitmapBits, &splash->imageFormat); fillRect(fillColor, &dstRect); } break; case GIF_DISPOSE_RESTORE: { - - int lineSize = desc->Width * splash->imageFormat.depthBytes; - - for (j = 0; j < desc->Height; j++) { - int lineIndex = stride * (j + desc->Top) + - desc->Left * splash->imageFormat.depthBytes; - - memcpy(pBitmapBits + lineIndex, pOldBitmapBits + lineIndex, - lineSize); + int lineSize = cw * splash->imageFormat.depthBytes; + if (lineSize > 0) { + int lineOffset = cx * splash->imageFormat.depthBytes; + int lineIndex = cy * stride + lineOffset; + for (j=0; j 0) && ((sz) > 0) && \ + ((0xffffffffu / ((unsigned int)(c))) > (unsigned int)(sz))) + #define dbgprintf printf #endif diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c --- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c Sat Apr 18 14:10:27 2009 -0700 @@ -103,9 +103,17 @@ rowbytes = png_get_rowbytes(png_ptr, info_ptr); + if (!SAFE_TO_ALLOC(rowbytes, height)) { + goto done; + } + if ((image_data = (unsigned char *) malloc(rowbytes * height)) == NULL) { goto done; } + + if (!SAFE_TO_ALLOC(height, sizeof(png_bytep))) { + goto done; + } if ((row_pointers = (png_bytepp) malloc(height * sizeof(png_bytep))) == NULL) { goto done; @@ -121,13 +129,28 @@ splash->width = width; splash->height = height; + if (!SAFE_TO_ALLOC(splash->width, splash->imageFormat.depthBytes)) { + goto done; + } stride = splash->width * splash->imageFormat.depthBytes; + if (!SAFE_TO_ALLOC(splash->height, stride)) { + goto done; + } splash->frameCount = 1; splash->frames = (SplashImage *) malloc(sizeof(SplashImage) * splash->frameCount); + + if (splash->frames == NULL) { + goto done; + } + splash->loopCount = 1; splash->frames[0].bitmapBits = malloc(stride * splash->height); + if (splash->frames[0].bitmapBits == NULL) { + free(splash->frames); + goto done; + } splash->frames[0].delay = 0; /* FIXME: sort out the real format */ diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java --- a/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java Sat Apr 18 14:10:27 2009 -0700 @@ -354,16 +354,9 @@ } } - // invoke by FileFileImpl to release lock @Override - void release(FileLockImpl fli) throws IOException { - try { - begin(); - nd.release(fdObj, fli.position(), fli.size()); - removeFromFileLockTable(fli); - } finally { - end(); - } + protected void implRelease(FileLockImpl fli) throws IOException { + nd.release(fdObj, fli.position(), fli.size()); } /** diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java --- a/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. 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 @@ -31,6 +31,7 @@ import java.security.spec.RSAKeyGenParameterSpec; import sun.security.jca.JCAUtil; +import sun.security.rsa.RSAKeyFactory; /** * RSA keypair generator. @@ -43,8 +44,8 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // Supported by Microsoft Base, Strong and Enhanced Cryptographic Providers - private static final int KEY_SIZE_MIN = 512; // disallow MSCAPI min. of 384 - private static final int KEY_SIZE_MAX = 16384; + static final int KEY_SIZE_MIN = 512; // disallow MSCAPI min. of 384 + static final int KEY_SIZE_MAX = 16384; private static final int KEY_SIZE_DEFAULT = 1024; // size of the key to generate, KEY_SIZE_MIN <= keySize <= KEY_SIZE_MAX @@ -59,7 +60,14 @@ // random is always ignored public void initialize(int keySize, SecureRandom random) { - checkKeySize(keySize); + try { + RSAKeyFactory.checkKeyLengths(keySize, null, + KEY_SIZE_MIN, KEY_SIZE_MAX); + } catch (InvalidKeyException e) { + throw new InvalidParameterException(e.getMessage()); + } + + this.keySize = keySize; } // second initialize method. See JCA doc @@ -67,21 +75,31 @@ public void initialize(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { + int tmpSize; if (params == null) { - checkKeySize(KEY_SIZE_DEFAULT); - + tmpSize = KEY_SIZE_DEFAULT; } else if (params instanceof RSAKeyGenParameterSpec) { if (((RSAKeyGenParameterSpec) params).getPublicExponent() != null) { throw new InvalidAlgorithmParameterException ("Exponent parameter is not supported"); } - checkKeySize(((RSAKeyGenParameterSpec) params).getKeysize()); + tmpSize = ((RSAKeyGenParameterSpec) params).getKeysize(); } else { throw new InvalidAlgorithmParameterException ("Params must be an instance of RSAKeyGenParameterSpec"); } + + try { + RSAKeyFactory.checkKeyLengths(tmpSize, null, + KEY_SIZE_MIN, KEY_SIZE_MAX); + } catch (InvalidKeyException e) { + throw new InvalidAlgorithmParameterException( + "Invalid Key sizes", e); + } + + this.keySize = tmpSize; } // generate the keypair. See JCA doc @@ -95,18 +113,6 @@ return new KeyPair(keys.getPublic(), keys.getPrivate()); } - private void checkKeySize(int keySize) throws InvalidParameterException { - if (keySize < KEY_SIZE_MIN) { - throw new InvalidParameterException - ("Key size must be at least " + KEY_SIZE_MIN + " bits"); - } - if (keySize > KEY_SIZE_MAX) { - throw new InvalidParameterException - ("Key size must be " + KEY_SIZE_MAX + " bits or less"); - } - this.keySize = keySize; - } - private static native RSAKeyPair generateRSAKeyPair(int keySize, String keyContainerName); } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/windows/classes/sun/security/mscapi/RSASignature.java --- a/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. 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 @@ -38,6 +38,9 @@ import java.security.Signature; import java.security.SignatureSpi; import java.security.SignatureException; +import java.math.BigInteger; + +import sun.security.rsa.RSAKeyFactory; /** * RSA signature implementation. Supports RSA signing using PKCS#1 v1.5 padding. @@ -124,7 +127,16 @@ // convert key to MSCAPI format - byte[] modulusBytes = rsaKey.getModulus().toByteArray(); + BigInteger modulus = rsaKey.getModulus(); + BigInteger exponent = rsaKey.getPublicExponent(); + + // Check against the local and global values to make sure + // the sizes are ok. Round up to the nearest byte. + RSAKeyFactory.checkKeyLengths(((modulus.bitLength() + 7) & ~7), + exponent, -1, RSAKeyPairGenerator.KEY_SIZE_MAX); + + byte[] modulusBytes = modulus.toByteArray(); + byte[] exponentBytes = exponent.toByteArray(); // Adjust key length due to sign bit int keyBitLength = (modulusBytes[0] == 0) @@ -132,8 +144,7 @@ : modulusBytes.length * 8; byte[] keyBlob = generatePublicKeyBlob( - keyBitLength, modulusBytes, - rsaKey.getPublicExponent().toByteArray()); + keyBitLength, modulusBytes, exponentBytes); publicKey = importPublicKey(keyBlob, keyBitLength); @@ -166,12 +177,11 @@ } privateKey = (sun.security.mscapi.RSAPrivateKey) key; - // Determine byte length from bit length - int keySize = (privateKey.bitLength() + 7) >> 3; - - if (keySize < 64) - throw new InvalidKeyException( - "RSA keys must be at least 512 bits long"); + // Check against the local and global values to make sure + // the sizes are ok. Round up to nearest byte. + RSAKeyFactory.checkKeyLengths(((privateKey.bitLength() + 7) & ~7), + null, RSAKeyPairGenerator.KEY_SIZE_MIN, + RSAKeyPairGenerator.KEY_SIZE_MAX); if (needsReset) { messageDigest.reset(); diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c --- a/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c Sat Apr 18 14:10:27 2009 -0700 @@ -414,7 +414,7 @@ o.Offset = lowPos; o.OffsetHigh = highPos; result = UnlockFileEx(h, 0, lowNumBytes, highNumBytes, &o); - if (result == 0) { + if (result == 0 && GetLastError() != ERROR_NOT_LOCKED) { JNU_ThrowIOExceptionWithLastError(env, "Release failed"); } } diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/src/windows/native/sun/security/krb5/NativeCreds.c --- a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c Sat Apr 18 14:10:27 2009 -0700 @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2009 Sun Microsystems, Inc. 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 @@ -73,6 +73,7 @@ * Function prototypes for internal routines * */ +BOOL native_debug = 0; BOOL PackageConnectLookup(PHANDLE,PULONG); @@ -113,208 +114,221 @@ jclass cls; JNIEnv *env; + jfieldID fldDEBUG; if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2)) { return JNI_EVERSION; /* JNI version not supported */ } + cls = (*env)->FindClass(env,"sun/security/krb5/internal/Krb5"); + if (cls == NULL) { + printf("LSA: Couldn't find Krb5\n"); + return JNI_ERR; + } + fldDEBUG = (*env)->GetStaticFieldID(env, cls, "DEBUG", "Z"); + if (fldDEBUG == NULL) { + printf("LSA: Krb5 has no DEBUG field\n"); + return JNI_ERR; + } + native_debug = (*env)->GetStaticBooleanField(env, cls, fldDEBUG); + cls = (*env)->FindClass(env,"sun/security/krb5/internal/Ticket"); if (cls == NULL) { - printf("Couldn't find Ticket\n"); + printf("LSA: Couldn't find Ticket\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found Ticket\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found Ticket\n"); + } ticketClass = (*env)->NewWeakGlobalRef(env,cls); if (ticketClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Made NewWeakGlobalRef\n"); + } cls = (*env)->FindClass(env, "sun/security/krb5/PrincipalName"); if (cls == NULL) { - printf("Couldn't find PrincipalName\n"); + printf("LSA: Couldn't find PrincipalName\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found PrincipalName\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found PrincipalName\n"); + } principalNameClass = (*env)->NewWeakGlobalRef(env,cls); if (principalNameClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Made NewWeakGlobalRef\n"); + } cls = (*env)->FindClass(env,"sun/security/util/DerValue"); if (cls == NULL) { - printf("Couldn't find DerValue\n"); + printf("LSA: Couldn't find DerValue\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found DerValue\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found DerValue\n"); + } derValueClass = (*env)->NewWeakGlobalRef(env,cls); if (derValueClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Made NewWeakGlobalRef\n"); + } cls = (*env)->FindClass(env,"sun/security/krb5/EncryptionKey"); if (cls == NULL) { - printf("Couldn't find EncryptionKey\n"); + printf("LSA: Couldn't find EncryptionKey\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found EncryptionKey\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found EncryptionKey\n"); + } encryptionKeyClass = (*env)->NewWeakGlobalRef(env,cls); if (encryptionKeyClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Made NewWeakGlobalRef\n"); + } cls = (*env)->FindClass(env,"sun/security/krb5/internal/TicketFlags"); if (cls == NULL) { - printf("Couldn't find TicketFlags\n"); + printf("LSA: Couldn't find TicketFlags\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found TicketFlags\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found TicketFlags\n"); + } ticketFlagsClass = (*env)->NewWeakGlobalRef(env,cls); if (ticketFlagsClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Made NewWeakGlobalRef\n"); + } cls = (*env)->FindClass(env,"sun/security/krb5/internal/KerberosTime"); if (cls == NULL) { - printf("Couldn't find KerberosTime\n"); + printf("LSA: Couldn't find KerberosTime\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found KerberosTime\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found KerberosTime\n"); + } kerberosTimeClass = (*env)->NewWeakGlobalRef(env,cls); if (kerberosTimeClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Made NewWeakGlobalRef\n"); + } cls = (*env)->FindClass(env,"java/lang/String"); if (cls == NULL) { - printf("Couldn't find String\n"); + printf("LSA: Couldn't find String\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found String\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found String\n"); + } javaLangStringClass = (*env)->NewWeakGlobalRef(env,cls); if (javaLangStringClass == NULL) { return JNI_ERR; } - #ifdef DEBUG - printf("Made NewWeakGlobalRef\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Made NewWeakGlobalRef\n"); + } derValueConstructor = (*env)->GetMethodID(env, derValueClass, "", "([B)V"); if (derValueConstructor == 0) { - printf("Couldn't find DerValue constructor\n"); + printf("LSA: Couldn't find DerValue constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found DerValue constructor\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found DerValue constructor\n"); + } ticketConstructor = (*env)->GetMethodID(env, ticketClass, "", "(Lsun/security/util/DerValue;)V"); if (ticketConstructor == 0) { - printf("Couldn't find Ticket constructor\n"); + printf("LSA: Couldn't find Ticket constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found Ticket constructor\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found Ticket constructor\n"); + } principalNameConstructor = (*env)->GetMethodID(env, principalNameClass, "", "([Ljava/lang/String;)V"); if (principalNameConstructor == 0) { - printf("Couldn't find PrincipalName constructor\n"); + printf("LSA: Couldn't find PrincipalName constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found PrincipalName constructor\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found PrincipalName constructor\n"); + } encryptionKeyConstructor = (*env)->GetMethodID(env, encryptionKeyClass, "", "(I[B)V"); if (encryptionKeyConstructor == 0) { - printf("Couldn't find EncryptionKey constructor\n"); + printf("LSA: Couldn't find EncryptionKey constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found EncryptionKey constructor\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found EncryptionKey constructor\n"); + } ticketFlagsConstructor = (*env)->GetMethodID(env, ticketFlagsClass, "", "(I[B)V"); if (ticketFlagsConstructor == 0) { - printf("Couldn't find TicketFlags constructor\n"); + printf("LSA: Couldn't find TicketFlags constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found TicketFlags constructor\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found TicketFlags constructor\n"); + } kerberosTimeConstructor = (*env)->GetMethodID(env, kerberosTimeClass, "", "(Ljava/lang/String;)V"); if (kerberosTimeConstructor == 0) { - printf("Couldn't find KerberosTime constructor\n"); + printf("LSA: Couldn't find KerberosTime constructor\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Found KerberosTime constructor\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Found KerberosTime constructor\n"); + } // load the setRealm method in PrincipalName setRealmMethod = (*env)->GetMethodID(env, principalNameClass, "setRealm", "(Ljava/lang/String;)V"); if (setRealmMethod == 0) { - printf("Couldn't find setRealm in PrincipalName\n"); + printf("LSA: Couldn't find setRealm in PrincipalName\n"); return JNI_ERR; } - #ifdef DEBUG - printf("Finished OnLoad processing\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Finished OnLoad processing\n"); + } return JNI_VERSION_1_2; } @@ -389,16 +403,25 @@ if (krbcredsConstructor == 0) { krbcredsConstructor = (*env)->GetMethodID(env, krbcredsClass, "", - "(Lsun/security/krb5/internal/Ticket;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/EncryptionKey;Lsun/security/krb5/internal/TicketFlags;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/HostAddresses;)V"); + "(Lsun/security/krb5/internal/Ticket;" + "Lsun/security/krb5/PrincipalName;" + "Lsun/security/krb5/PrincipalName;" + "Lsun/security/krb5/EncryptionKey;" + "Lsun/security/krb5/internal/TicketFlags;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/KerberosTime;" + "Lsun/security/krb5/internal/HostAddresses;)V"); if (krbcredsConstructor == 0) { - printf("Couldn't find sun.security.krb5.Credentials constructor\n"); + printf("LSA: Couldn't find sun.security.krb5.Credentials constructor\n"); break; } } - #ifdef DEBUG - printf("Found KrbCreds constructor\n"); - #endif + if (native_debug) { + printf("LSA: Found KrbCreds constructor\n"); + } // // Get the logon handle and package ID from the @@ -407,9 +430,9 @@ if (!PackageConnectLookup(&LogonHandle, &PackageId)) break; - #ifdef DEBUG - printf("Got handle to Kerberos package\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Got handle to Kerberos package\n"); + } // Get the MS TGT from cache CacheRequest.MessageType = KerbRetrieveTicketMessage; @@ -426,9 +449,9 @@ &SubStatus ); - #ifdef DEBUG - printf("Response size is %d\n", rspSize); - #endif + if (native_debug) { + printf("LSA: Response size is %d\n", rspSize); + } if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) { if (!LSA_SUCCESS(Status)) { @@ -467,9 +490,9 @@ } if (ignore_cache) { - #ifdef DEBUG - printf("MS TGT in cache is invalid/not supported; request new ticket\n"); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n"); + } // use domain to request Ticket Status = ConstructTicketRequest(msticket->TargetDomainName, @@ -493,9 +516,9 @@ &SubStatus ); - #ifdef DEBUG - printf("Response size is %d\n", responseSize); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: Response size is %d\n", responseSize); + } if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) { if (!LSA_SUCCESS(Status)) { @@ -788,7 +811,9 @@ static WCHAR szMsgBuf[MAX_MSG_SIZE]; DWORD dwRes; - printf("Error calling function %s: %lu\n", szAPI, dwError); + if (native_debug) { + printf("LSA: Error calling function %s: %lu\n", szAPI, dwError); + } dwRes = FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM, @@ -798,11 +823,13 @@ szMsgBuf, MAX_MSG_SIZE, NULL); - if (0 == dwRes) { - printf("FormatMessage failed with %d\n", GetLastError()); - // ExitProcess(EXIT_FAILURE); - } else { - printf("%S",szMsgBuf); + if (native_debug) { + if (0 == dwRes) { + printf("LSA: FormatMessage failed with %d\n", GetLastError()); + // ExitProcess(EXIT_FAILURE); + } else { + printf("LSA: %S",szMsgBuf); + } } } @@ -896,17 +923,19 @@ ((domainName.Length)*sizeof(WCHAR) + sizeof(UNICODE_NULL))); wcsncpy(realm, domainName.Buffer, domainName.Length/sizeof(WCHAR)); - #ifdef DEBUG - printf("Principal domain is %S\n", realm); - printf("Name type is %x\n", principalName->NameType); - printf("Name count is %x\n", principalName->NameCount); - #endif + if (native_debug) { + printf("LSA: Principal domain is %S\n", realm); + printf("LSA: Name type is %x\n", principalName->NameType); + printf("LSA: Name count is %x\n", principalName->NameCount); + } nameCount = principalName->NameCount; stringArray = (*env)->NewObjectArray(env, nameCount, javaLangStringClass, NULL); if (stringArray == NULL) { - printf("Can't allocate String array for Principal\n"); + if (native_debug) { + printf("LSA: Can't allocate String array for Principal\n"); + } LocalFree(realm); return principal; } @@ -941,6 +970,17 @@ // First, need to build a byte array jbyteArray ary; jobject encryptionKey = NULL; + unsigned int i; + + for (i=0; iLength; i++) { + if (cryptoKey->Value[i]) break; + } + if (i == cryptoKey->Length) { + if (native_debug) { + printf("LSA: Session key all zero. Stop.\n"); + } + return NULL; + } ary = (*env)->NewByteArray(env,cryptoKey->Length); (*env)->SetByteArrayRegion(env, ary, (jsize) 0, cryptoKey->Length, @@ -1005,9 +1045,9 @@ hour, minute, second ); - #ifdef DEBUG - printf("%S\n", (wchar_t *)timeString); - #endif /* DEBUG */ + if (native_debug) { + printf("LSA: %S\n", (wchar_t *)timeString); + } stringTime = (*env)->NewString(env, timeString, (sizeof(timeString)/sizeof(WCHAR))-1); if (stringTime != NULL) { // everything's OK so far diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/awt/FontClass/CreateFont/A.ttf Binary file jdk/test/java/awt/FontClass/CreateFont/A.ttf has changed diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/awt/FontClass/CreateFont/BigFont.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/FontClass/CreateFont/BigFont.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,139 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.applet.*; +import java.awt.*; +import java.io.*; +import java.net.*; + +public class BigFont extends Applet { + + static private class SizedInputStream extends InputStream { + + int size; + int cnt = 0; + + SizedInputStream(int size) { + this.size = size; + } + + public int read() { + if (cnt < size) { + cnt++; + return 0; + } else { + return -1; + } + } + + public int getCurrentSize() { + return cnt; + } + } + + String id; + String fileName; + + public void init() { + id = getParameter("number"); + fileName = getParameter("font"); + + System.out.println("Applet " + id + " "+ + Thread.currentThread().getThreadGroup()); + // Larger than size for a single font. + int fontSize = 64 * 1000 * 1000; + SizedInputStream sis = new SizedInputStream(fontSize); + try { + Font font = Font.createFont(Font.TRUETYPE_FONT, sis); + } catch (Throwable t) { + if (t instanceof FontFormatException || + fontSize <= sis.getCurrentSize()) + { + System.out.println(sis.getCurrentSize()); + System.out.println(t); + throw new RuntimeException("Allowed file to be too large."); + } + } + // The following part of the test was verified manually but + // is impractical to enable because it requires a fairly large + // valid font to be part of the test, and we can't easily include + // that, nor dependably reference one from the applet environment. + /* + if (fileName == null) { + return; + } + int size = getFileSize(fileName); + if (size == 0) { + return; + } + int fontCnt = 1000 * 1000 * 1000 / size; + loadMany(size, fontCnt, fileName); + System.gc(); System.gc(); + fontCnt = fontCnt / 2; + System.out.println("Applet " + id + " load more."); + loadMany(size, fontCnt, fileName); + */ + System.out.println("Applet " + id + " finished."); + } + + int getFileSize(String fileName) { + try { + URL url = new URL(getCodeBase(), fileName); + InputStream inStream = url.openStream(); + BufferedInputStream fontStream = new BufferedInputStream(inStream); + int size = 0; + while (fontStream.read() != -1) { + size++; + } + fontStream.close(); + return size; + } catch (IOException e) { + return 0; + } + + } + void loadMany(int oneFont, int fontCnt, String fileName) { + System.out.println("fontcnt= " + fontCnt); + Font[] fonts = new Font[fontCnt]; + int totalSize = 0; + boolean gotException = false; + for (int i=0; i + + + + Test Font Creation Limits + + +


    + + + + + + + + +
    + + + diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,83 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6652929 + * @summary verify handling of File.getPath() + */ + +import java.awt.*; +import java.io.*; + +public class FontFile { + public static void main(String[] args) throws Exception { + String sep = System.getProperty("file.separator"); + String fname = ".." + sep + "A.ttf"; + String dir = System.getProperty("test.src"); + if (dir != null) { + fname = dir + sep + fname; + } + final String name = fname; + System.out.println("Will try to access " + name); + if (!(new File(name)).canRead()) { + System.out.println("File not available : can't run test"); + return; + } + System.out.println("File is available. Verify no access under SM"); + + System.setSecurityManager(new SecurityManager()); + + + // Check cannot read file. + try { + new FileInputStream(name); + throw new Error("Something wrong with test environment"); + } catch (SecurityException exc) { + // Good. + } + + try { + Font font = Font.createFont(Font.TRUETYPE_FONT, + new File("nosuchfile") { + private boolean read; + @Override public String getPath() { + if (read) { + return name; + } else { + read = true; + return "somefile"; + } + } + @Override public boolean canRead() { + return true; + } + } + ); + System.err.println(font.getFontName()); + throw new RuntimeException("No expected exception"); + } catch (IOException e) { + System.err.println("Test passed."); + } + } +} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,95 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6726779 + * @summary Test verifies that ConvolveOp with the EDGE_NO_OP edge condition + * does not cause JVM crash if size of source raster elements is + * greather than size of the destination raster element. + * + * @run main EdgeNoOpCrash + */ +import java.awt.Point; +import java.awt.image.ConvolveOp; +import java.awt.image.DataBuffer; +import java.awt.image.ImagingOpException; +import java.awt.image.Kernel; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; +import java.util.Arrays; + +public class EdgeNoOpCrash { + private static final int w = 3000; + private static final int h = 200; + + public static void main(String[] args) { + crashTest(); + } + + private static void crashTest() { + Raster src = createSrcRaster(); + WritableRaster dst = createDstRaster(); + ConvolveOp op = createConvolveOp(ConvolveOp.EDGE_NO_OP); + try { + op.filter(src, dst); + } catch (ImagingOpException e) { + /* + * The test pair of source and destination rasters + * may cause failure of the medialib convolution routine, + * so this exception is expected. + * + * The JVM crash is the only manifestation of this + * test failure. + */ + } + System.out.println("Test PASSED."); + } + + private static Raster createSrcRaster() { + WritableRaster r = Raster.createInterleavedRaster(DataBuffer.TYPE_USHORT, + w, h, 4, new Point(0, 0)); + + return r; + } + + private static WritableRaster createDstRaster() { + WritableRaster r = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, + w, h, 4, new Point(0, 0)); + + return r; + } + + private static ConvolveOp createConvolveOp(int edgeHint) { + final int kw = 3; + final int kh = 3; + float[] kdata = new float[kw * kh]; + float v = 1f / kdata.length; + Arrays.fill(kdata, v); + + Kernel k = new Kernel(kw, kh, kdata); + ConvolveOp op = new ConvolveOp(k, edgeHint, null); + + return op; + } +} \ No newline at end of file diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/Basic-X.java --- a/jdk/test/java/nio/Buffer/Basic-X.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/Basic-X.java Sat Apr 18 14:10:27 2009 -0700 @@ -365,8 +365,11 @@ b.position(2); ck(b, b.charAt(1), 'd'); - CharBuffer c = (CharBuffer)b.subSequence(1, 4); - ck(b, b.subSequence(1, 4).toString().equals("def")); + CharBuffer c = b.subSequence(1, 4); + ck(c, c.capacity(), b.capacity()); + ck(c, c.position(), b.position()+1); + ck(c, c.limit(), b.position()+4); + ck(c, b.subSequence(1, 4).toString().equals("def")); // 4938424 b.position(4); @@ -722,6 +725,8 @@ ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); + b.position(6); + ck(b, b.subSequence(0,3).toString().equals("ghi")); // The index, relative to the position, must be non-negative and // smaller than remaining(). diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/Basic.java --- a/jdk/test/java/nio/Buffer/Basic.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/Basic.java Sat Apr 18 14:10:27 2009 -0700 @@ -25,7 +25,7 @@ * @summary Unit test for buffers * @bug 4413135 4414911 4416536 4416562 4418782 4471053 4472779 4490253 4523725 * 4526177 4463011 4660660 4661219 4663521 4782970 4804304 4938424 6231529 - * 6221101 6234263 6535542 6591971 6593946 + * 6221101 6234263 6535542 6591971 6593946 6795561 * @author Mark Reinhold */ diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/BasicByte.java --- a/jdk/test/java/nio/Buffer/BasicByte.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/BasicByte.java Sat Apr 18 14:10:27 2009 -0700 @@ -375,6 +375,9 @@ + + + // Compact relPut(b); @@ -786,6 +789,8 @@ + + public static void test(final byte [] ba) { int offset = 47; int length = 900; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/BasicChar.java --- a/jdk/test/java/nio/Buffer/BasicChar.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/BasicChar.java Sat Apr 18 14:10:27 2009 -0700 @@ -365,8 +365,11 @@ b.position(2); ck(b, b.charAt(1), 'd'); - CharBuffer c = (CharBuffer)b.subSequence(1, 4); - ck(b, b.subSequence(1, 4).toString().equals("def")); + CharBuffer c = b.subSequence(1, 4); + ck(c, c.capacity(), b.capacity()); + ck(c, c.position(), b.position()+1); + ck(c, c.limit(), b.position()+4); + ck(c, b.subSequence(1, 4).toString().equals("def")); // 4938424 b.position(4); @@ -722,6 +725,8 @@ ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); + b.position(6); + ck(b, b.subSequence(0,3).toString().equals("ghi")); // The index, relative to the position, must be non-negative and // smaller than remaining(). diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/BasicDouble.java --- a/jdk/test/java/nio/Buffer/BasicDouble.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/BasicDouble.java Sat Apr 18 14:10:27 2009 -0700 @@ -375,6 +375,9 @@ + + + // Compact relPut(b); @@ -786,6 +789,8 @@ + + public static void test(final double [] ba) { int offset = 47; int length = 900; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/BasicFloat.java --- a/jdk/test/java/nio/Buffer/BasicFloat.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/BasicFloat.java Sat Apr 18 14:10:27 2009 -0700 @@ -375,6 +375,9 @@ + + + // Compact relPut(b); @@ -786,6 +789,8 @@ + + public static void test(final float [] ba) { int offset = 47; int length = 900; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/BasicInt.java --- a/jdk/test/java/nio/Buffer/BasicInt.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/BasicInt.java Sat Apr 18 14:10:27 2009 -0700 @@ -375,6 +375,9 @@ + + + // Compact relPut(b); @@ -786,6 +789,8 @@ + + public static void test(final int [] ba) { int offset = 47; int length = 900; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/BasicLong.java --- a/jdk/test/java/nio/Buffer/BasicLong.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/BasicLong.java Sat Apr 18 14:10:27 2009 -0700 @@ -375,6 +375,9 @@ + + + // Compact relPut(b); @@ -786,6 +789,8 @@ + + public static void test(final long [] ba) { int offset = 47; int length = 900; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/Buffer/BasicShort.java --- a/jdk/test/java/nio/Buffer/BasicShort.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/Buffer/BasicShort.java Sat Apr 18 14:10:27 2009 -0700 @@ -375,6 +375,9 @@ + + + // Compact relPut(b); @@ -786,6 +789,8 @@ + + public static void test(final short [] ba) { int offset = 47; int length = 900; diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java --- a/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java Sat Apr 18 14:10:27 2009 -0700 @@ -22,7 +22,7 @@ */ /* @test - * @bug 4607272 + * @bug 4607272 6822643 * @summary Unit test for AsynchronousFileChannel */ @@ -51,7 +51,6 @@ // run tests testUsingCompletionHandlers(ch); testUsingWaitOnResult(ch); - testLocking(ch); testInterruptHandlerThread(ch); // close channel and invoke test that expects channel to be closed @@ -59,6 +58,7 @@ testClosedChannel(ch); // these tests open the file themselves + testLocking(blah.toPath()); testCustomThreadPool(blah.toPath()); testAsynchronousClose(blah.toPath()); testCancel(blah.toPath()); @@ -160,47 +160,54 @@ } // exercise lock methods - static void testLocking(AsynchronousFileChannel ch) - throws IOException - { + static void testLocking(Path file) throws IOException { System.out.println("testLocking"); - // test 1 - acquire lock and check that tryLock throws - // OverlappingFileLockException + AsynchronousFileChannel ch = AsynchronousFileChannel + .open(file, READ, WRITE); FileLock fl; try { - fl = ch.lock().get(); - } catch (ExecutionException x) { - throw new RuntimeException(x); - } catch (InterruptedException x) { - throw new RuntimeException("Should not be interrupted"); - } - if (!fl.acquiredBy().equals(ch)) - throw new RuntimeException("FileLock#acquiredBy returned incorrect channel"); - try { - ch.tryLock(); - throw new RuntimeException("OverlappingFileLockException expected"); - } catch (OverlappingFileLockException x) { - } - fl.release(); + // test 1 - acquire lock and check that tryLock throws + // OverlappingFileLockException + try { + fl = ch.lock().get(); + } catch (ExecutionException x) { + throw new RuntimeException(x); + } catch (InterruptedException x) { + throw new RuntimeException("Should not be interrupted"); + } + if (!fl.acquiredBy().equals(ch)) + throw new RuntimeException("FileLock#acquiredBy returned incorrect channel"); + try { + ch.tryLock(); + throw new RuntimeException("OverlappingFileLockException expected"); + } catch (OverlappingFileLockException x) { + } + fl.release(); - // test 2 - acquire try and check that lock throws OverlappingFileLockException - fl = ch.tryLock(); - if (fl == null) - throw new RuntimeException("Unable to acquire lock"); - try { - ch.lock(null, new CompletionHandler () { - public void completed(FileLock result, Void att) { - } - public void failed(Throwable exc, Void att) { - } - public void cancelled(Void att) { - } - }); - throw new RuntimeException("OverlappingFileLockException expected"); - } catch (OverlappingFileLockException x) { + // test 2 - acquire try and check that lock throws OverlappingFileLockException + fl = ch.tryLock(); + if (fl == null) + throw new RuntimeException("Unable to acquire lock"); + try { + ch.lock(null, new CompletionHandler () { + public void completed(FileLock result, Void att) { + } + public void failed(Throwable exc, Void att) { + } + public void cancelled(Void att) { + } + }); + throw new RuntimeException("OverlappingFileLockException expected"); + } catch (OverlappingFileLockException x) { + } + } finally { + ch.close(); } - fl.release(); + + // test 3 - channel is closed so FileLock should no longer be valid + if (fl.isValid()) + throw new RuntimeException("FileLock expected to be invalid"); } // interrupt should not close channel diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java --- a/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java Sat Apr 18 14:10:27 2009 -0700 @@ -23,7 +23,7 @@ /* @test - * @bug 4607272 + * @bug 4607272 6814948 * @summary Unit test for AsynchronousFileChannel#lock method */ diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,98 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6543863 + * @summary Try to cause a deadlock between (Asynchronous)FileChannel.close + * and FileLock.release + */ + +import java.io.*; +import java.nio.file.Path; +import static java.nio.file.StandardOpenOption.*; +import java.nio.channels.*; +import java.util.concurrent.*; + +public class ReleaseOnCloseDeadlock { + private static final int LOCK_COUNT = 1024; + + public static void main(String[] args) throws IOException { + File blah = File.createTempFile("blah", null); + blah.deleteOnExit(); + for (int i=0; i<100; i++) { + test(blah.toPath()); + } + } + + static void test(Path file) throws IOException { + FileLock[] locks = new FileLock[LOCK_COUNT]; + + FileChannel fc = FileChannel.open(file, READ, WRITE); + for (int i=0; i zes = zf.entries(); + ZipEntry e = (ZipEntry)zes.nextElement(); + if (! name.equals(e.getName()) || + ! comment.equals(e.getComment())) + throw new RuntimeException("ZipFile: name/comment doesn't match!"); + InputStream is = zf.getInputStream(e); + if (is == null) + throw new RuntimeException("ZipFile: getIS failed!"); + byte[] bBuf = new byte[bb.length << 1]; + int n = 0; + int nn =0; + while ((nn = is.read(bBuf, n, bBuf.length-n)) != -1) { + n += nn; + } + if (n != bb.length || + !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) { + throw new RuntimeException("ZipFile content doesn't match!"); + } + zf.close(); + } + + static void test(String csn, String name, String comment) + throws Exception + { + byte[] bb = "This is the conent of the zipfile".getBytes("ISO-8859-1"); + Charset cs = Charset.forName(csn); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(baos, cs); + + ZipEntry e = new ZipEntry(name); + e.setComment(comment); + zos.putNextEntry(e); + zos.write(bb, 0, bb.length); + zos.closeEntry(); + zos.close(); + ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray()); + testZipInputStream(bis, cs, name, comment, bb); + + if ("utf-8".equals(csn)) { + // EFS should be set + bis.reset(); + testZipInputStream(bis, Charset.forName("MS932"), name, comment, bb); + } + + File f = new File(new File(System.getProperty("test.dir", ".")), + "zfcoding.zip"); + FileOutputStream fos = new FileOutputStream(f); + baos.writeTo(fos); + fos.close(); + testZipFile(f, cs, name, comment, bb); + if ("utf-8".equals(csn)) { + testZipFile(f, Charset.forName("MS932"), name, comment, bb); + } + f.delete(); + } +} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/java/util/zip/zip.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/zip/zip.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,743 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.io.*; +import java.nio.charset.Charset; +import java.util.*; +import java.util.zip.*; +import java.text.MessageFormat; + +/** + * A stripped-down version of Jar tool with a "-encoding" option to + * support non-UTF8 encoidng for entry name and comment. + */ +public class zip { + String program; + PrintStream out, err; + String fname; + String zname = ""; + String[] files; + Charset cs = Charset.forName("UTF-8"); + + Map entryMap = new HashMap(); + Set entries = new LinkedHashSet(); + List paths = new ArrayList(); + + CRC32 crc32 = new CRC32(); + /* + * cflag: create + * uflag: update + * xflag: xtract + * tflag: table + * vflag: verbose + * flag0: no zip compression (store only) + */ + boolean cflag, uflag, xflag, tflag, vflag, flag0; + + private static ResourceBundle rsrc; + static { + try { + // just use the jar message + rsrc = ResourceBundle.getBundle("sun.tools.jar.resources.jar"); + } catch (MissingResourceException e) { + throw new Error("Fatal: Resource for jar is missing"); + } + } + + public zip(PrintStream out, PrintStream err, String program) { + this.out = out; + this.err = err; + this.program = program; + } + + private boolean ok; + + public synchronized boolean run(String args[]) { + ok = true; + if (!parseArgs(args)) { + return false; + } + try { + if (cflag || uflag) { + if (fname != null) { + zname = fname.replace(File.separatorChar, '/'); + if (zname.startsWith("./")) { + zname = zname.substring(2); + } + } + } + if (cflag) { + OutputStream out; + if (fname != null) { + out = new FileOutputStream(fname); + } else { + out = new FileOutputStream(FileDescriptor.out); + if (vflag) { + vflag = false; + } + } + expand(null, files, false); + create(new BufferedOutputStream(out, 4096)); + out.close(); + } else if (uflag) { + File inputFile = null, tmpFile = null; + FileInputStream in; + FileOutputStream out; + if (fname != null) { + inputFile = new File(fname); + String path = inputFile.getParent(); + tmpFile = File.createTempFile("tmp", null, + new File((path == null) ? "." : path)); + in = new FileInputStream(inputFile); + out = new FileOutputStream(tmpFile); + } else { + in = new FileInputStream(FileDescriptor.in); + out = new FileOutputStream(FileDescriptor.out); + vflag = false; + } + expand(null, files, true); + boolean updateOk = update(in, new BufferedOutputStream(out)); + if (ok) { + ok = updateOk; + } + in.close(); + out.close(); + if (fname != null) { + inputFile.delete(); + if (!tmpFile.renameTo(inputFile)) { + tmpFile.delete(); + throw new IOException(getMsg("error.write.file")); + } + tmpFile.delete(); + } + } else if (tflag) { + replaceFSC(files); + if (fname != null) { + list(fname, files); + } else { + InputStream in = new FileInputStream(FileDescriptor.in); + try{ + list(new BufferedInputStream(in), files); + } finally { + in.close(); + } + } + } else if (xflag) { + replaceFSC(files); + if (fname != null && files != null) { + extract(fname, files); + } else { + InputStream in = (fname == null) + ? new FileInputStream(FileDescriptor.in) + : new FileInputStream(fname); + try { + extract(new BufferedInputStream(in), files); + } finally { + in.close(); + } + } + } + } catch (IOException e) { + fatalError(e); + ok = false; + } catch (Error ee) { + ee.printStackTrace(); + ok = false; + } catch (Throwable t) { + t.printStackTrace(); + ok = false; + } + out.flush(); + err.flush(); + return ok; + } + + + boolean parseArgs(String args[]) { + try { + args = parse(args); + } catch (FileNotFoundException e) { + fatalError(formatMsg("error.cant.open", e.getMessage())); + return false; + } catch (IOException e) { + fatalError(e); + return false; + } + int count = 1; + try { + String flags = args[0]; + if (flags.startsWith("-")) { + flags = flags.substring(1); + } + for (int i = 0; i < flags.length(); i++) { + switch (flags.charAt(i)) { + case 'c': + if (xflag || tflag || uflag) { + usageError(); + return false; + } + cflag = true; + break; + case 'u': + if (cflag || xflag || tflag) { + usageError(); + return false; + } + uflag = true; + break; + case 'x': + if (cflag || uflag || tflag) { + usageError(); + return false; + } + xflag = true; + break; + case 't': + if (cflag || uflag || xflag) { + usageError(); + return false; + } + tflag = true; + break; + case 'v': + vflag = true; + break; + case 'f': + fname = args[count++]; + break; + case '0': + flag0 = true; + break; + default: + error(formatMsg("error.illegal.option", + String.valueOf(flags.charAt(i)))); + usageError(); + return false; + } + } + } catch (ArrayIndexOutOfBoundsException e) { + usageError(); + return false; + } + if (!cflag && !tflag && !xflag && !uflag) { + error(getMsg("error.bad.option")); + usageError(); + return false; + } + /* parse file arguments */ + int n = args.length - count; + if (n > 0) { + int k = 0; + String[] nameBuf = new String[n]; + try { + for (int i = count; i < args.length; i++) { + if (args[i].equals("-encoding")) { + cs = Charset.forName(args[++i]); + } else if (args[i].equals("-C")) { + /* change the directory */ + String dir = args[++i]; + dir = (dir.endsWith(File.separator) ? + dir : (dir + File.separator)); + dir = dir.replace(File.separatorChar, '/'); + while (dir.indexOf("//") > -1) { + dir = dir.replace("//", "/"); + } + paths.add(dir.replace(File.separatorChar, '/')); + nameBuf[k++] = dir + args[++i]; + } else { + nameBuf[k++] = args[i]; + } + } + } catch (ArrayIndexOutOfBoundsException e) { + e.printStackTrace(); + usageError(); + return false; + } + if (k != 0) { + files = new String[k]; + System.arraycopy(nameBuf, 0, files, 0, k); + } + } else if (cflag || uflag) { + error(getMsg("error.bad.uflag")); + usageError(); + return false; + } + return true; + } + + void expand(File dir, String[] files, boolean isUpdate) { + if (files == null) { + return; + } + for (int i = 0; i < files.length; i++) { + File f; + if (dir == null) { + f = new File(files[i]); + } else { + f = new File(dir, files[i]); + } + if (f.isFile()) { + if (entries.add(f)) { + if (isUpdate) + entryMap.put(entryName(f.getPath()), f); + } + } else if (f.isDirectory()) { + if (entries.add(f)) { + if (isUpdate) { + String dirPath = f.getPath(); + dirPath = (dirPath.endsWith(File.separator)) ? dirPath : + (dirPath + File.separator); + entryMap.put(entryName(dirPath), f); + } + expand(f, f.list(), isUpdate); + } + } else { + error(formatMsg("error.nosuch.fileordir", String.valueOf(f))); + ok = false; + } + } + } + + void create(OutputStream out) throws IOException + { + ZipOutputStream zos = new ZipOutputStream(out, cs); + if (flag0) { + zos.setMethod(ZipOutputStream.STORED); + } + for (File file: entries) { + addFile(zos, file); + } + zos.close(); + } + + boolean update(InputStream in, OutputStream out) throws IOException + { + ZipInputStream zis = new ZipInputStream(in, cs); + ZipOutputStream zos = new ZipOutputStream(out, cs); + ZipEntry e = null; + byte[] buf = new byte[1024]; + int n = 0; + boolean updateOk = true; + + // put the old entries first, replace if necessary + while ((e = zis.getNextEntry()) != null) { + String name = e.getName(); + if (!entryMap.containsKey(name)) { // copy the old stuff + // do our own compression + ZipEntry e2 = new ZipEntry(name); + e2.setMethod(e.getMethod()); + e2.setTime(e.getTime()); + e2.setComment(e.getComment()); + e2.setExtra(e.getExtra()); + if (e.getMethod() == ZipEntry.STORED) { + e2.setSize(e.getSize()); + e2.setCrc(e.getCrc()); + } + zos.putNextEntry(e2); + while ((n = zis.read(buf, 0, buf.length)) != -1) { + zos.write(buf, 0, n); + } + } else { // replace with the new files + File f = entryMap.get(name); + addFile(zos, f); + entryMap.remove(name); + entries.remove(f); + } + } + + // add the remaining new files + for (File f: entries) { + addFile(zos, f); + } + zis.close(); + zos.close(); + return updateOk; + } + + private String entryName(String name) { + name = name.replace(File.separatorChar, '/'); + String matchPath = ""; + for (String path : paths) { + if (name.startsWith(path) && (path.length() > matchPath.length())) { + matchPath = path; + } + } + name = name.substring(matchPath.length()); + + if (name.startsWith("/")) { + name = name.substring(1); + } else if (name.startsWith("./")) { + name = name.substring(2); + } + return name; + } + + void addFile(ZipOutputStream zos, File file) throws IOException { + String name = file.getPath(); + boolean isDir = file.isDirectory(); + if (isDir) { + name = name.endsWith(File.separator) ? name : + (name + File.separator); + } + name = entryName(name); + + if (name.equals("") || name.equals(".") || name.equals(zname)) { + return; + } + + long size = isDir ? 0 : file.length(); + + if (vflag) { + out.print(formatMsg("out.adding", name)); + } + ZipEntry e = new ZipEntry(name); + e.setTime(file.lastModified()); + if (size == 0) { + e.setMethod(ZipEntry.STORED); + e.setSize(0); + e.setCrc(0); + } else if (flag0) { + e.setSize(size); + e.setMethod(ZipEntry.STORED); + crc32File(e, file); + } + zos.putNextEntry(e); + if (!isDir) { + byte[] buf = new byte[8192]; + int len; + InputStream is = new BufferedInputStream(new FileInputStream(file)); + while ((len = is.read(buf, 0, buf.length)) != -1) { + zos.write(buf, 0, len); + } + is.close(); + } + zos.closeEntry(); + /* report how much compression occurred. */ + if (vflag) { + size = e.getSize(); + long csize = e.getCompressedSize(); + out.print(formatMsg2("out.size", String.valueOf(size), + String.valueOf(csize))); + if (e.getMethod() == ZipEntry.DEFLATED) { + long ratio = 0; + if (size != 0) { + ratio = ((size - csize) * 100) / size; + } + output(formatMsg("out.deflated", String.valueOf(ratio))); + } else { + output(getMsg("out.stored")); + } + } + } + + private void crc32File(ZipEntry e, File f) throws IOException { + InputStream is = new BufferedInputStream(new FileInputStream(f)); + byte[] buf = new byte[8192]; + crc32.reset(); + int r = 0; + int nread = 0; + long len = f.length(); + while ((r = is.read(buf)) != -1) { + nread += r; + crc32.update(buf, 0, r); + } + is.close(); + if (nread != (int) len) { + throw new ZipException(formatMsg( + "error.incorrect.length", f.getPath())); + } + e.setCrc(crc32.getValue()); + } + + void replaceFSC(String files[]) { + if (files != null) { + for (String file : files) { + file = file.replace(File.separatorChar, '/'); + } + } + } + + Set newDirSet() { + return new HashSet() { + public boolean add(ZipEntry e) { + return (e == null || super.add(e)); + }}; + } + + void updateLastModifiedTime(Set zes) throws IOException { + for (ZipEntry ze : zes) { + long lastModified = ze.getTime(); + if (lastModified != -1) { + File f = new File(ze.getName().replace('/', File.separatorChar)); + f.setLastModified(lastModified); + } + } + } + + void extract(InputStream in, String files[]) throws IOException { + ZipInputStream zis = new ZipInputStream(in, cs); + ZipEntry e; + Set dirs = newDirSet(); + while ((e = zis.getNextEntry()) != null) { + if (files == null) { + dirs.add(extractFile(zis, e)); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + dirs.add(extractFile(zis, e)); + break; + } + } + } + } + updateLastModifiedTime(dirs); + } + + void extract(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname, cs); + Set dirs = newDirSet(); + Enumeration zes = zf.entries(); + while (zes.hasMoreElements()) { + ZipEntry e = zes.nextElement(); + InputStream is; + if (files == null) { + dirs.add(extractFile(zf.getInputStream(e), e)); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + dirs.add(extractFile(zf.getInputStream(e), e)); + break; + } + } + } + } + zf.close(); + updateLastModifiedTime(dirs); + } + + ZipEntry extractFile(InputStream is, ZipEntry e) throws IOException { + ZipEntry rc = null; + String name = e.getName(); + File f = new File(e.getName().replace('/', File.separatorChar)); + if (e.isDirectory()) { + if (f.exists()) { + if (!f.isDirectory()) { + throw new IOException(formatMsg("error.create.dir", + f.getPath())); + } + } else { + if (!f.mkdirs()) { + throw new IOException(formatMsg("error.create.dir", + f.getPath())); + } else { + rc = e; + } + } + if (vflag) { + output(formatMsg("out.create", name)); + } + } else { + if (f.getParent() != null) { + File d = new File(f.getParent()); + if (!d.exists() && !d.mkdirs() || !d.isDirectory()) { + throw new IOException(formatMsg( + "error.create.dir", d.getPath())); + } + } + OutputStream os = new FileOutputStream(f); + byte[] b = new byte[8192]; + int len; + try { + while ((len = is.read(b, 0, b.length)) != -1) { + os.write(b, 0, len); + } + } finally { + if (is instanceof ZipInputStream) + ((ZipInputStream)is).closeEntry(); + else + is.close(); + os.close(); + } + if (vflag) { + if (e.getMethod() == ZipEntry.DEFLATED) { + output(formatMsg("out.inflated", name)); + } else { + output(formatMsg("out.extracted", name)); + } + } + } + long lastModified = e.getTime(); + if (lastModified != -1) { + f.setLastModified(lastModified); + } + return rc; + } + + void list(InputStream in, String files[]) throws IOException { + ZipInputStream zis = new ZipInputStream(in, cs); + ZipEntry e; + while ((e = zis.getNextEntry()) != null) { + zis.closeEntry(); + printEntry(e, files); + } + } + + void list(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname, cs); + Enumeration zes = zf.entries(); + while (zes.hasMoreElements()) { + printEntry(zes.nextElement(), files); + } + zf.close(); + } + + void printEntry(ZipEntry e, String[] files) throws IOException { + if (files == null) { + printEntry(e); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + printEntry(e); + return; + } + } + } + } + + void printEntry(ZipEntry e) throws IOException { + if (vflag) { + StringBuilder sb = new StringBuilder(); + String s = Long.toString(e.getSize()); + for (int i = 6 - s.length(); i > 0; --i) { + sb.append(' '); + } + sb.append(s).append(' ').append(new Date(e.getTime()).toString()); + sb.append(' ').append(e.getName()); + output(sb.toString()); + } else { + output(e.getName()); + } + } + + void usageError() { + error( + "Usage: zip {ctxu}[vf0] [zip-file] [-encoding encname][-C dir] files ...\n" + + "Options:\n" + + " -c create new archive\n" + + " -t list table of contents for archive\n" + + " -x extract named (or all) files from archive\n" + + " -u update existing archive\n" + + " -v generate verbose output on standard output\n" + + " -f specify archive file name\n" + + " -0 store only; use no ZIP compression\n" + + " -C change to the specified directory and include the following file\n" + + "If any file is a directory then it is processed recursively.\n"); + } + + void fatalError(Exception e) { + e.printStackTrace(); + } + + + void fatalError(String s) { + error(program + ": " + s); + } + + + protected void output(String s) { + out.println(s); + } + + protected void error(String s) { + err.println(s); + } + + private String getMsg(String key) { + try { + return (rsrc.getString(key)); + } catch (MissingResourceException e) { + throw new Error("Error in message file"); + } + } + + private String formatMsg(String key, String arg) { + String msg = getMsg(key); + String[] args = new String[1]; + args[0] = arg; + return MessageFormat.format(msg, (Object[]) args); + } + + private String formatMsg2(String key, String arg, String arg1) { + String msg = getMsg(key); + String[] args = new String[2]; + args[0] = arg; + args[1] = arg1; + return MessageFormat.format(msg, (Object[]) args); + } + + public static String[] parse(String[] args) throws IOException + { + ArrayList newArgs = new ArrayList(args.length); + for (int i = 0; i < args.length; i++) { + String arg = args[i]; + if (arg.length() > 1 && arg.charAt(0) == '@') { + arg = arg.substring(1); + if (arg.charAt(0) == '@') { + newArgs.add(arg); + } else { + loadCmdFile(arg, newArgs); + } + } else { + newArgs.add(arg); + } + } + return newArgs.toArray(new String[newArgs.size()]); + } + + private static void loadCmdFile(String name, List args) throws IOException + { + Reader r = new BufferedReader(new FileReader(name)); + StreamTokenizer st = new StreamTokenizer(r); + st.resetSyntax(); + st.wordChars(' ', 255); + st.whitespaceChars(0, ' '); + st.commentChar('#'); + st.quoteChar('"'); + st.quoteChar('\''); + while (st.nextToken() != st.TT_EOF) { + args.add(st.sval); + } + r.close(); + } + + public static void main(String args[]) { + zip z = new zip(System.out, System.err, "zip"); + System.exit(z.run(args) ? 0 : 1); + } +} + diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/javax/print/attribute/MediaMappingsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/print/attribute/MediaMappingsTest.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6652463 + * @summary Verify media size-> media mappings can't be altered + * @run main MediaMappingsTest +*/ + +import javax.print.attribute.standard.MediaSize; +import javax.print.attribute.standard.MediaSizeName; + +public class MediaMappingsTest { + + public static void main(String args[]) { + MediaSize sizeA = MediaSize.getMediaSizeForName(MediaSizeName.A); + new MediaSize(1.0f, 2.0f, MediaSize.MM, MediaSizeName.A); + if (!sizeA.equals(MediaSize.getMediaSizeForName(MediaSizeName.A))) { + throw new RuntimeException("mapping changed"); + } + MediaSize sizeB = MediaSize.getMediaSizeForName(MediaSizeName.B); + new MediaSize(1, 2, MediaSize.MM, MediaSizeName.B); + if (!sizeB.equals(MediaSize.getMediaSizeForName(MediaSizeName.B))) { + throw new RuntimeException("mapping changed"); + } + } +} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/sun/security/krb5/ConfigWithQuotations.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/ConfigWithQuotations.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,47 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +/* + * @test + * @bug 6714845 + * @summary Quotes in Kerberos configuration file are included in the values + */ + +import sun.security.krb5.Config; + +public class ConfigWithQuotations { + public static void main(String[] args) throws Exception { + // This config file is generated using Kerberos.app on a Mac + System.setProperty("java.security.krb5.conf", + System.getProperty("test.src", ".") +"/edu.mit.Kerberos"); + Config config = Config.getInstance(); + + System.out.println(config); + + if (!config.getDefaultRealm().equals("MAC.LOCAL")) { + throw new Exception("Realm error"); + } + if (!config.getKDCList("MAC.LOCAL").equals("kdc.mac.local:88")) { + throw new Exception("KDC error"); + } + } +} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/sun/security/krb5/edu.mit.Kerberos --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/edu.mit.Kerberos Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,15 @@ +[domain_realm] + +[libdefaults] + default_realm = "MAC.LOCAL" + dns_fallback = "no" + +[logging] + admin_server = "FILE:/var/log/krb5kdc/kadmin.log" + kdc = "FILE:/var/log/krb5kdc/kdc.log" + +[realms] + MAC.LOCAL = { + kdc = "kdc.mac.local:88" + } + diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/sun/security/util/Oid/OidFormat.java --- a/jdk/test/sun/security/util/Oid/OidFormat.java Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/sun/security/util/Oid/OidFormat.java Sat Apr 18 14:10:27 2009 -0700 @@ -63,9 +63,22 @@ "1.2.3", "1.2.3445", "1.3.6.1.4.1.42.2.17", // 4811968: ASN.1 cannot handle huge OID components - //"2.16.764.1.3101555394.1.0.100.2.1", - //"1.2.2147483647.4", - //"1.2.268435456.4", + "2.16.764.1.3101555394.1.0.100.2.1", + "2.2726957624935694386592435", // as huge as possible + "1.2.777777777777777777", + "1.2.888888888888888888.111111111111111.2222222222222.33333333333333333.44444444444444", + "1.2." + + "1111111111111111111111111111111111111111111111111111111111111." + + "2222222222222222222222222222222222222222222222222222222222222222." + + "333333333333333333333333333333333333333333333333333333333333333." + + "4444444444444444444444444444444444444444444444444444444." + + "55555555555555555555555555555555555555555555555555555555555555555555555." + + "666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666." + + "77777777777777777777777777777777777777777777777777777777777777777777777777." + + "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888." + + "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999", + "1.2.2147483647.4", + "1.2.268435456.4", }; for (String s: goodOids) { diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/sun/security/util/Oid/S11N.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/util/Oid/S11N.sh Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,164 @@ +# +# Copyright 2004-2005 Sun Microsystems, Inc. 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. +# +# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, +# CA 95054 USA or visit www.sun.com if you need additional information or +# have any questions. +# +# @test +# @bug 4811968 +# @summary Serialization compatibility with old versions +# @author Weijun Wang +# +# set a few environment variables so that the shell-script can run stand-alone +# in the source directory + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC="." +fi +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES="." +fi +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi + +# set platform-dependent variables +PF="" + +OS=`uname -s` +case "$OS" in + SunOS ) + FS="/" + ARCH=`isainfo` + case "$ARCH" in + sparc* ) + PF="solaris-sparc" + ;; + i[3-6]86 ) + PF="solaris-i586" + ;; + amd64* ) + PF="solaris-amd64" + ;; + * ) + echo "Unsupported System: Solaris ${ARCH}" + exit 0; + ;; + esac + ;; + Linux ) + ARCH=`uname -m` + FS="/" + case "$ARCH" in + i[3-6]86 ) + PF="linux-i586" + ;; + amd64* ) + PF="linux-amd64" + ;; + * ) + echo "Unsupported System: Linux ${ARCH}" + exit 0; + ;; + esac + ;; + Windows* ) + FS="\\" + PF="windows-i586" + + # 'uname -m' does not give us enough information - + # should rely on $PROCESSOR_IDENTIFIER (as is done in Defs-windows.gmk), + # but JTREG does not pass this env variable when executing a shell script. + # + # execute test program - rely on it to exit if platform unsupported + + ;; + * ) + echo "Unsupported System: ${OS}" + exit 0; + ;; +esac + +# the test code + +${TESTJAVA}${FS}bin${FS}javac -source 1.3 -target 1.3 -d . ${TESTSRC}${FS}SerialTest.java || exit 10 + +OLDJAVA=" + /java/re/j2se/1.6.0/latest/binaries/${PF} + /java/re/j2se/1.5.0/latest/binaries/${PF} + /java/re/j2se/1.4.2/latest/binaries/${PF} +" + +SMALL=" + 0.0 + 1.1 + 2.2 + 1.2.3456 + 1.2.2147483647.4 + 1.2.268435456.4 +" + +HUGE=" + 2.16.764.1.3101555394.1.0.100.2.1 + 1.2.2147483648.4 + 2.3.4444444444444444444444 + 1.2.888888888888888888.111111111111111.2222222222222.33333333333333333.44444444444444 +" + +for oid in ${SMALL}; do + echo ${oid} + # new -> + ${TESTJAVA}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial || exit 1 + # -> new + ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 2 + for oldj in ${OLDJAVA}; do + if [ -d ${oldj} ]; then + echo ${oldj} + # -> old + ${oldj}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 3 + # old -> + ${oldj}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial.old || exit 4 + # -> new + ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial.old || exit 5 + fi + done +done + +for oid in ${HUGE}; do + echo ${oid} + # new -> + ${TESTJAVA}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial || exit 1 + # -> new + ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 2 + for oldj in ${OLDJAVA}; do + if [ -d ${oldj} ]; then + echo ${oldj} + # -> old + ${oldj}${FS}bin${FS}java SerialTest badin < tmp.oid.serial || exit 3 + fi + done +done + +rm -f tmp.oid.serial +rm -f tmp.oid.serial.old +rm -f SerialTest.class + +exit 0 diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/sun/security/util/Oid/SerialTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/util/Oid/SerialTest.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,66 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * read S11.sh + */ +import java.io.*; +import sun.security.util.*; + +/** + * Test OID serialization between versions + * + * java SerialTest out oid // write a OID into System.out + * java SerialTest in oid // read from System.in and compare it with oid + * java SerialTest badin // make sure *cannot* read from System.in + */ +class SerialTest { + public static void main(String[] args) throws Exception { + if (args[0].equals("out")) + out(args[1]); + else if (args[0].equals("in")) + in(args[1]); + else + badin(); + } + + static void in(String oid) throws Exception { + ObjectIdentifier o = (ObjectIdentifier) (new ObjectInputStream(System.in).readObject()); + if (!o.toString().equals(oid)) + throw new Exception("Read Fail " + o + ", not " + oid); + } + + static void badin() throws Exception { + boolean pass = true; + try { + new ObjectInputStream(System.in).readObject(); + } catch (Exception e) { + pass = false; + } + if (pass) throw new Exception("Should fail but not"); + } + + static void out(String oid) throws Exception { + new ObjectOutputStream(System.out).writeObject(new ObjectIdentifier(oid)); + } +} diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/tools/launcher/MultipleJRE.sh --- a/jdk/test/tools/launcher/MultipleJRE.sh Thu Apr 16 11:22:52 2009 -0700 +++ b/jdk/test/tools/launcher/MultipleJRE.sh Sat Apr 18 14:10:27 2009 -0700 @@ -1,14 +1,14 @@ # @test MultipleJRE.sh -# @bug 4811102 4953711 4955505 4956301 4991229 4998210 5018605 6387069 +# @bug 4811102 4953711 4955505 4956301 4991229 4998210 5018605 6387069 6733959 # @build PrintVersion # @build UglyPrintVersion +# @build ZipMeUp # @run shell MultipleJRE.sh # @summary Verify Multiple JRE version support # @author Joseph E. Kowalski - # -# Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -49,11 +49,26 @@ exit 1 fi +JAVAEXE="$TESTJAVA/bin/java" JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES" JAR="$TESTJAVA/bin/jar" OS=`uname -s`; # +# Tests whether we are on windows (true) or not. +# +IsWindows() { + case "$OS" in + Windows* | CYGWIN* ) + printf "true" + ;; + * ) + printf "false" + ;; + esac +} + +# # Shell routine to test for the proper rejection of syntactically incorrect # version specifications. # @@ -139,7 +154,6 @@ $PACKAGE/UglyPrintVersion.class } - # # Constructs a jar file with a fair number of "zip directory" entries and # the MANIFEST.MF entry at or near the end of that directory to validate @@ -262,6 +276,29 @@ fi } +# Tests very long Main-Class attribute in the jar +TestLongMainClass() { + JVER=$1 + if [ "$JVER" = "mklink" ]; then + JVER=XX + JDKXX=jdk/j2re$JVER + rm -rf jdk + mkdir jdk + ln -s $TESTJAVA $JDKXX + JAVA_VERSION_PATH="`pwd`/jdk" + export JAVA_VERSION_PATH + fi + $JAVAEXE -cp $TESTCLASSES ZipMeUp UglyBetty.jar 4097 + message="`$JAVAEXE -version:$JVER -jar UglyBetty.jar 2>&1`" + echo $message | grep "Error: main-class: attribute exceeds system limits" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + printf "Long manifest test did not get expected error" + exit 1 + fi + unset JAVA_VERSION_PATH + rm -rf jdk +} + # # Main test sequence starts here # @@ -280,14 +317,11 @@ LaunchVM "" "${RELEASE}" CreateJar "" "0" LaunchVM "" "${RELEASE}" -case "$OS" in - Windows* | CYGWIN* ) - MAXIMUM_PATH=255; - ;; - *) - MAXIMUM_PATH=1024; - ;; -esac +if [ `IsWindows` = "true" ]; then + MAXIMUM_PATH=255; +else + MAXIMUM_PATH=1024; +fi PATH_LENGTH=`printf "%s" "$UGLYCLASS" | wc -c` if [ ${PATH_LENGTH} -lt ${MAXIMUM_PATH} ]; then @@ -346,7 +380,6 @@ LaunchVM "" "${RELEASE}" fi - # # Throw some syntactically challenged (illegal) version specifiers at # the interface. Failure (of the launcher) is success for the test. @@ -357,15 +390,28 @@ TestSyntax "1.2+.3" # Embedded modifier TestSyntax "1.2.4+&1.2*&1++" # Long and invalid +# On windows we see if there is another jre installed, usually +# there is, then we test using that, otherwise links are created +# to get through to SelectVersion. +if [ `IsWindows` = "false" ]; then + TestLongMainClass "mklink" +else + $JAVAEXE -version:1.0+ + if [ $? -eq 0 ]; then + TestLongMainClass "1.0+" + else + printf "Warning: TestLongMainClass skipped as there is no" + printf "viable MJRE installed.\n" + fi +fi + # # Because scribbling in the registry can be rather destructive, only a # subset of the tests are run on Windows. # -case "$OS" in - Windows* | CYGWIN* ) - exit 0; - ;; -esac +if [ `IsWindows` = "true" ]; then + exit 0; +fi # # Additional version specifiers containing spaces. (Sigh, unable to diff -r 824a5ff07bcb -r c66fa5c0e626 jdk/test/tools/launcher/ZipMeUp.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/launcher/ZipMeUp.java Sat Apr 18 14:10:27 2009 -0700 @@ -0,0 +1,91 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * A simple class to create our erring Jar with a very long Main-Class + * attribute in the manifest. + */ +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.zip.CRC32; +import java.util.zip.CheckedOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +public class ZipMeUp { + + static final CRC32 crc = new CRC32(); + + private static String SOME_KLASS = ".Some"; + + static byte[] getManifestAsBytes(int nchars) throws IOException { + crc.reset(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + CheckedOutputStream cos = new CheckedOutputStream(baos, crc); + PrintStream ps = new PrintStream(cos); + ps.println("Manifest-Version: 1.0"); + ps.print("Main-Class: "); + for (int i = 0 ; i < nchars - SOME_KLASS.length() ; i++) { + ps.print(i%10); + } + ps.println(SOME_KLASS); + cos.flush(); + cos.close(); + ps.close(); + return baos.toByteArray(); + } + + /** + * The arguments are: filename_to_create length + * @param args + * @throws java.lang.Exception + */ + public static void main(String...args) throws Exception { + FileOutputStream fos = new FileOutputStream(args[0]); + ZipOutputStream zos = new ZipOutputStream(fos); + byte[] manifest = getManifestAsBytes(Integer.parseInt(args[1])); + ZipEntry ze = new ZipEntry("META-INF/MANIFEST.MF"); + ze.setMethod(ZipEntry.STORED); + ze.setSize(manifest.length); + ze.setCompressedSize(manifest.length); + ze.setCrc(crc.getValue()); + ze.setTime(System.currentTimeMillis()); + zos.putNextEntry(ze); + zos.write(manifest); + zos.flush(); + + // add a zero length class + ze = new ZipEntry(SOME_KLASS + ".class"); + ze.setMethod(ZipEntry.STORED); + ze.setSize(0); + ze.setCompressedSize(0); + ze.setCrc(0); + ze.setTime(System.currentTimeMillis()); + zos.putNextEntry(ze); + zos.flush(); + zos.closeEntry(); + zos.close(); + System.exit(0); + } +}