diff --git a/.hgtags b/.hgtags index a611fd31d77def3b972d7212e8eebbafec13fa0f..b33e53b49340ec9af5dcf15a8ca6ca15ab137ef6 100644 --- a/.hgtags +++ b/.hgtags @@ -28,3 +28,6 @@ b4ac413b1f129eeef0acab3f31081c1b7dfe3b27 jdk7-b47 fea0898259ae41c73620b1815aa48f036216155c jdk7-b51 bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52 a2033addca678f9e4c0d92ffa1e389171cc9321d jdk7-b53 +d1c43d1f5676a24ba86221ac7cad5694f3a9afda jdk7-b54 +522bb5aa17e0c0cff00b1ed7d1b51bc4db2cfef9 jdk7-b55 +7fd3bc37afe36f8f6165ba679db1229716db822a jdk7-b56 diff --git a/make/com/sun/Makefile b/make/com/sun/Makefile index 188e73670ad8ce715ee9e2921c168eaa1b884b30..a6549e2a4d1296364ef1e6e6fd64baa3493351ec 100644 --- a/make/com/sun/Makefile +++ b/make/com/sun/Makefile @@ -41,7 +41,7 @@ endif # Omit mirror since it's built with the apt tool. SUBDIRS = $(SCRIPT_SUBDIR) image security crypto/provider jndi jmx \ java inputmethods org xml rowset net/httpserver net/ssl demo \ - tools jarsigner tracing servicetag + tools jarsigner tracing servicetag nio all build clean clobber:: $(SUBDIRS-loop) diff --git a/make/com/sun/nio/Makefile b/make/com/sun/nio/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..74151db7d610493f6c4d4abaeae878dae7cd1333 --- /dev/null +++ b/make/com/sun/nio/Makefile @@ -0,0 +1,38 @@ +# +# 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. +# + +# +# Makefile for com.sun.nio packages. +# + +BUILDDIR = ../../.. +include $(BUILDDIR)/common/Defs.gmk + +SUBDIRS = sctp +all build clean clobber:: + $(SUBDIRS-loop) + +clean clobber:: + $(RM) -r $(CLASSDESTDIR)/com/sun/nio diff --git a/make/com/sun/nio/sctp/Exportedfiles.gmk b/make/com/sun/nio/sctp/Exportedfiles.gmk new file mode 100644 index 0000000000000000000000000000000000000000..df60b97c3a09458a98547f20dbb726f7d93eeae4 --- /dev/null +++ b/make/com/sun/nio/sctp/Exportedfiles.gmk @@ -0,0 +1,39 @@ +# +# 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. +# + +# +# These are the names of Java classes for which we will make .h files. +# + +ifneq ($(PLATFORM), windows) +FILES_export = \ + sun/nio/ch/SctpAssocChange.java \ + sun/nio/ch/SctpChannelImpl.java \ + sun/nio/ch/SctpNet.java \ + sun/nio/ch/SctpPeerAddrChange.java \ + sun/nio/ch/SctpResultContainer.java \ + sun/nio/ch/SctpServerChannelImpl.java \ + sun/nio/ch/SctpStdSocketOption.java +endif diff --git a/make/com/sun/nio/sctp/FILES_c.gmk b/make/com/sun/nio/sctp/FILES_c.gmk new file mode 100644 index 0000000000000000000000000000000000000000..55c687aeabdc8f439fed40022a8275253fc9b8ee --- /dev/null +++ b/make/com/sun/nio/sctp/FILES_c.gmk @@ -0,0 +1,31 @@ +# +# 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. +# + +ifneq ($(PLATFORM),windows) +FILES_c = \ + SctpNet.c \ + SctpChannelImpl.c \ + SctpServerChannelImpl.c +endif diff --git a/make/com/sun/nio/sctp/FILES_java.gmk b/make/com/sun/nio/sctp/FILES_java.gmk new file mode 100644 index 0000000000000000000000000000000000000000..8be820fae9cab2a4b81c3e978128a24ea4bd2bda --- /dev/null +++ b/make/com/sun/nio/sctp/FILES_java.gmk @@ -0,0 +1,67 @@ +# +# 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. +# +FILES_java = \ + com/sun/nio/sctp/AbstractNotificationHandler.java \ + com/sun/nio/sctp/Association.java \ + com/sun/nio/sctp/AssociationChangeNotification.java \ + com/sun/nio/sctp/HandlerResult.java \ + com/sun/nio/sctp/IllegalReceiveException.java \ + com/sun/nio/sctp/IllegalUnbindException.java \ + com/sun/nio/sctp/InvalidStreamException.java \ + com/sun/nio/sctp/MessageInfo.java \ + com/sun/nio/sctp/Notification.java \ + com/sun/nio/sctp/NotificationHandler.java \ + com/sun/nio/sctp/PeerAddressChangeNotification.java \ + com/sun/nio/sctp/SctpChannel.java \ + com/sun/nio/sctp/SctpMultiChannel.java \ + com/sun/nio/sctp/SctpServerChannel.java \ + com/sun/nio/sctp/SctpSocketOption.java \ + com/sun/nio/sctp/SctpStandardSocketOption.java \ + com/sun/nio/sctp/SendFailedNotification.java \ + com/sun/nio/sctp/ShutdownNotification.java \ + \ + sun/nio/ch/SctpMessageInfoImpl.java \ + sun/nio/ch/SctpStdSocketOption.java + +ifneq ($(PLATFORM), windows) +FILES_java += \ + sun/nio/ch/SctpAssocChange.java \ + sun/nio/ch/SctpAssociationImpl.java \ + sun/nio/ch/SctpChannelImpl.java \ + sun/nio/ch/SctpMultiChannelImpl.java \ + sun/nio/ch/SctpNet.java \ + sun/nio/ch/SctpNotification.java \ + sun/nio/ch/SctpPeerAddrChange.java \ + sun/nio/ch/SctpResultContainer.java \ + sun/nio/ch/SctpSendFailed.java \ + sun/nio/ch/SctpServerChannelImpl.java \ + sun/nio/ch/SctpShutdown.java \ + sun/nio/ch/SctpSocketDispatcher.java +else +FILES_java += \ + sun/nio/ch/SctpChannelImpl.java \ + sun/nio/ch/SctpMultiChannelImpl.java \ + sun/nio/ch/SctpServerChannelImpl.java +endif diff --git a/make/com/sun/nio/sctp/Makefile b/make/com/sun/nio/sctp/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d5acea340a95a9f3f92ed96ebc268eef87e76d2d --- /dev/null +++ b/make/com/sun/nio/sctp/Makefile @@ -0,0 +1,80 @@ +# +# 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. +# + +# +# Makefile for com.sun.nio.sctp +# + +BUILDDIR = ../../../.. +PACKAGE = com.sun.nio.sctp +LIBRARY = sctp +PRODUCT = sun +#OTHER_JAVACFLAGS += -Xmaxwarns 1000 -Xlint +include $(BUILDDIR)/common/Defs.gmk + +# +# Files to compile +# +include FILES_c.gmk +include FILES_java.gmk +include Exportedfiles.gmk + +ifneq ($(PLATFORM), windows) +include $(BUILDDIR)/common/Mapfile-vers.gmk +include $(BUILDDIR)/common/Library.gmk + +# +# Find platform-specific C source files +# +vpath %.c $(PLATFORM_SRC)/native/sun/nio/ch + +# +# Include nio.h, net_util.h, sun_nio_ch_IOStatus.h, etc +# +OTHER_INCLUDES += \ + -I$(SHARE_SRC)/native/sun/nio/ch \ + -I$(SHARE_SRC)/native/java/net \ + -I$(PLATFORM_SRC)/native/java/net \ + -I$(CLASSHDRDIR)/../../../../java/java.nio/nio/CClassHeaders + +ifeq ($(PLATFORM), linux) +COMPILER_WARNINGS_FATAL=true +#OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread -ldl +OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -lnio -lnet -lpthread -ldl +endif +ifeq ($(PLATFORM), solaris) +#LIBSCTP = -lsctp +OTHER_LDLIBS += $(LIBSOCKET) -L$(LIBDIR)/$(LIBARCH) -lnet -lnio +endif # PLATFORM + +else # windows +include $(BUILDDIR)/common/Classes.gmk +endif # ifneq windows + + +clean clobber:: + $(RM) -r $(CLASSDESTDIR)/com/sun/nio/sctp + $(RM) -r $(CLASSDESTDIR)/sun/nio/ch + diff --git a/make/com/sun/nio/sctp/mapfile-vers b/make/com/sun/nio/sctp/mapfile-vers new file mode 100644 index 0000000000000000000000000000000000000000..8ffd4c66675c9ea5f0b41fcda9129b830aebe02e --- /dev/null +++ b/make/com/sun/nio/sctp/mapfile-vers @@ -0,0 +1,49 @@ +# +# 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. +# + +SUNWprivate_1.1 { + global: + Java_sun_nio_ch_SctpNet_socket0; + Java_sun_nio_ch_SctpNet_bindx; + Java_sun_nio_ch_SctpNet_getLocalAddresses0; + Java_sun_nio_ch_SctpNet_getRemoteAddresses0; + Java_sun_nio_ch_SctpNet_getPrimAddrOption0; + Java_sun_nio_ch_SctpNet_setPrimAddrOption0; + Java_sun_nio_ch_SctpNet_setPeerPrimAddrOption0; + Java_sun_nio_ch_SctpNet_getInitMsgOption0; + Java_sun_nio_ch_SctpNet_setInitMsgOption0; + Java_sun_nio_ch_SctpNet_getIntOption0; + Java_sun_nio_ch_SctpNet_setIntOption0; + Java_sun_nio_ch_SctpNet_shutdown0; + Java_sun_nio_ch_SctpChannelImpl_initIDs; + Java_sun_nio_ch_SctpChannelImpl_checkConnect; + Java_sun_nio_ch_SctpChannelImpl_receive0; + Java_sun_nio_ch_SctpChannelImpl_send0; + Java_sun_nio_ch_SctpServerChannelImpl_initIDs; + Java_sun_nio_ch_SctpServerChannelImpl_accept0; + JNI_OnLoad; + local: + *; +}; diff --git a/make/docs/CORE_PKGS.gmk b/make/docs/CORE_PKGS.gmk index f9b9ee59cc1c6738106fb9979489727acff849bf..9ea6f0c09ba9a9daf0856707a52071a74545f603 100644 --- a/make/docs/CORE_PKGS.gmk +++ b/make/docs/CORE_PKGS.gmk @@ -233,6 +233,7 @@ CORE_PKGS = \ javax.xml.ws.http \ javax.xml.ws.soap \ javax.xml.ws.spi \ + javax.xml.ws.wsaddressing \ javax.xml.transform \ javax.xml.transform.sax \ javax.xml.transform.dom \ diff --git a/make/docs/NON_CORE_PKGS.gmk b/make/docs/NON_CORE_PKGS.gmk index 6028a85da34e47121702f290a147570ca2075e5f..b6793c2fd693f0b26d4cd0e5d9eec654d216e40b 100644 --- a/make/docs/NON_CORE_PKGS.gmk +++ b/make/docs/NON_CORE_PKGS.gmk @@ -86,6 +86,8 @@ TREEAPI_PKGS = com.sun.source.tree \ SMARTCARDIO_PKGS = javax.smartcardio +SCTPAPI_PKGS = com.sun.nio.sctp + TRACING_PKGS = com.sun.tracing \ com.sun.tracing.dtrace @@ -98,4 +100,6 @@ NON_CORE_PKGS = $(DOMAPI_PKGS) \ $(OLD_JSSE_PKGS) \ $(HTTPSERVER_PKGS) \ $(SMARTCARDIO_PKGS) \ - $(TRACING_PKGS) + $(TRACING_PKGS) \ + $(SCTPAPI_PKGS) + diff --git a/make/java/java/mapfile-vers b/make/java/java/mapfile-vers index 77a78301af721f9aca72358a1b4ae554bbf2bc49..a9231b4d648a4e63a92b0fae070a2d26d4467c10 100644 --- a/make/java/java/mapfile-vers +++ b/make/java/java/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 @@ -135,7 +135,8 @@ SUNWprivate_1.1 { Java_java_lang_ClassLoader_00024NativeLibrary_find; Java_java_lang_ClassLoader_00024NativeLibrary_load; Java_java_lang_ClassLoader_00024NativeLibrary_unload; - Java_java_lang_ClassLoader_registerNatives; + Java_java_lang_ClassLoader_getCaller; + Java_java_lang_ClassLoader_registerNatives; Java_java_lang_Compiler_registerNatives; Java_java_lang_Double_longBitsToDouble; Java_java_lang_Double_doubleToRawLongBits; diff --git a/make/java/net/FILES_c.gmk b/make/java/net/FILES_c.gmk index 2eb4daa2cbb689344b059c77dba87dbba965266c..0e638816d1046fe39d3b06af5e9a60d70f7a9a71 100644 --- a/make/java/net/FILES_c.gmk +++ b/make/java/net/FILES_c.gmk @@ -39,6 +39,10 @@ FILES_c = \ ResolverConfigurationImpl.c \ DefaultProxySelector.c +ifeq ($(PLATFORM), solaris) + FILES_c += SdpProvider.c +endif + ifeq ($(PLATFORM), linux) FILES_c += linux_close.c endif diff --git a/make/java/net/Makefile b/make/java/net/Makefile index b9a3defdb8ccae2429ade7227b77a2816bf6ac2f..203b059a3888e9514395af9d135f6a34fe401e63 100644 --- a/make/java/net/Makefile +++ b/make/java/net/Makefile @@ -108,11 +108,24 @@ CLASSES.export += java.lang.Integer java.io.FileDescriptor java.net.InetAddressI # LOCALE_SET_DEFINITION = jre -properties: $(LIBDIR) $(LIBDIR)/net.properties +MISC_FILES = $(LIBDIR) $(LIBDIR)/net.properties $(LIBDIR)/net.properties: $(SHARE_SRC)/lib/net.properties @$(RM) $@ $(CP) $< $@ -build: properties +# +# SDP configuration template +# +ifeq ($(PLATFORM), solaris) +SDP_PATH = sdp/sdp.conf.template +SDP_CONF = $(LIBDIR)/$(SDP_PATH) +$(SDP_CONF): $(PLATFORM_SRC)/lib/$(SDP_PATH) + @$(RM) $* + $(install-file) + +MISC_FILES += $(SDP_CONF) +endif + +build: $(MISC_FILES) diff --git a/make/java/net/mapfile-vers b/make/java/net/mapfile-vers index d9803f8f9446c5d5d891aeffaafb43e0c3b1f558..c30803cbfefb9806840a7d5a79ba6039e5588d80 100644 --- a/make/java/net/mapfile-vers +++ b/make/java/net/mapfile-vers @@ -90,6 +90,7 @@ SUNWprivate_1.1 { Java_sun_net_dns_ResolverConfigurationImpl_fallbackDomain0; Java_sun_net_spi_DefaultProxySelector_init; Java_sun_net_spi_DefaultProxySelector_getSystemProxy; + Java_sun_net_spi_SdpProvider_convert; NET_AllocSockaddr; NET_SockaddrToInetAddress; NET_SockaddrEqualsInetAddress; diff --git a/make/java/nio/mapfile-linux b/make/java/nio/mapfile-linux index 0bd240811c58875c1d8ca6082f6403d2b6190483..13353edcdb7c8e580046c77ed373d7bbc9361234 100644 --- a/make/java/nio/mapfile-linux +++ b/make/java/nio/mapfile-linux @@ -189,6 +189,7 @@ SUNWprivate_1.1 { Java_sun_nio_fs_UnixNativeDispatcher_getgrnam0; Java_sun_nio_fs_UnixNativeDispatcher_getextmntent; Java_sun_nio_fs_UnixCopyFile_transfer; + handleSocketError; local: *; diff --git a/make/java/nio/mapfile-solaris b/make/java/nio/mapfile-solaris index 2192a5a7751deebe108399b34983a4d4fa065377..129eaf477c0f0f679e4f9ae77fc56bb13bd81f0f 100644 --- a/make/java/nio/mapfile-solaris +++ b/make/java/nio/mapfile-solaris @@ -175,6 +175,7 @@ SUNWprivate_1.1 { Java_sun_nio_fs_SolarisWatchService_portDissociate; Java_sun_nio_fs_SolarisWatchService_portSend; Java_sun_nio_fs_SolarisWatchService_portGetn; + handleSocketError; local: *; diff --git a/make/java/text/FILES_java.gmk b/make/java/text/FILES_java.gmk index 67b4c19c66efece0ae1b285fea650514bc2a8743..88dc12903cc9e28eb6a386037e8083767119f5c3 100644 --- a/make/java/text/FILES_java.gmk +++ b/make/java/text/FILES_java.gmk @@ -92,11 +92,11 @@ FILES_java = \ sun/text/normalizer/SymbolTable.java \ sun/text/normalizer/Trie.java \ sun/text/normalizer/TrieIterator.java \ + sun/text/normalizer/UBiDiProps.java \ sun/text/normalizer/UCharacter.java \ sun/text/normalizer/UCharacterIterator.java \ sun/text/normalizer/UCharacterProperty.java \ sun/text/normalizer/UCharacterPropertyReader.java \ - sun/text/normalizer/UProperty.java \ sun/text/normalizer/UTF16.java \ sun/text/normalizer/UnicodeMatcher.java \ sun/text/normalizer/UnicodeSet.java \ diff --git a/make/java/text/Makefile b/make/java/text/Makefile index 76955e22d81ae0e67a5e702a658238685e4a82ee..4db338926f38cf87bc6b3be0d41760ff2b804aef 100644 --- a/make/java/text/Makefile +++ b/make/java/text/Makefile @@ -64,7 +64,8 @@ BIFILES = $(TEXT_CLASSDIR)/CharacterBreakIteratorData \ $(TEXT_CLASSDIR)/SentenceBreakIteratorData ICU_FILES = $(TEXT_CLASSDIR)/unorm.icu \ - $(TEXT_CLASSDIR)/uprops.icu + $(TEXT_CLASSDIR)/uprops.icu \ + $(TEXT_CLASSDIR)/ubidi.icu # builder GENERATEBREAKITERATORDATA_JARFILE = \ @@ -89,7 +90,7 @@ $(BIFILES): $(GENERATEBREAKITERATORDATA_JARFILE) \ build: $(BIFILES) $(ICU_FILES) # -# Extra rules to copy unorm.icu and uprops.icu +# Extra rules to copy unorm.icu, uprops.icu, and ubidi.icu # $(TEXT_CLASSDIR)/unorm.icu: $(TEXT_SRCDIR)/unorm.icu $(install-file) @@ -97,6 +98,9 @@ $(TEXT_CLASSDIR)/unorm.icu: $(TEXT_SRCDIR)/unorm.icu $(TEXT_CLASSDIR)/uprops.icu: $(TEXT_SRCDIR)/uprops.icu $(install-file) +$(TEXT_CLASSDIR)/ubidi.icu: $(TEXT_SRCDIR)/ubidi.icu + $(install-file) + clean clobber:: $(RM) -r $(TEXT_CLASSES) $(RM) -r $(BIFILES) diff --git a/make/java/zip/FILES_c.gmk b/make/java/zip/FILES_c.gmk index 6426cea2ced2c265d425c359e0a1f89b08bef9a5..f88386c8ee9dbad1fa91f875b06c14e159c611a2 100644 --- a/make/java/zip/FILES_c.gmk +++ b/make/java/zip/FILES_c.gmk @@ -29,7 +29,6 @@ FILES_c = \ Deflater.c \ Inflater.c \ ZipFile.c \ - ZipEntry.c \ zadler32.c \ zcrc32.c \ deflate.c \ diff --git a/make/java/zip/mapfile-vers b/make/java/zip/mapfile-vers index 443ea67c83e70aae4346f0a67e29d574680377f3..096fa35e434eb3bd6187531296f6092a5408ec17 100644 --- a/make/java/zip/mapfile-vers +++ b/make/java/zip/mapfile-vers @@ -50,15 +50,17 @@ SUNWprivate_1.1 { 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 --git a/make/java/zip/reorder-i586 b/make/java/zip/reorder-i586 index d1af81c9d7a09070111cc69a6d9782024f770708..d9e90ead4350bb9608937dea9a697a06846c2da5 100644 --- a/make/java/zip/reorder-i586 +++ b/make/java/zip/reorder-i586 @@ -20,12 +20,14 @@ text: .text%Java_java_util_zip_ZipFile_initIDs; 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 --git a/make/java/zip/reorder-sparc b/make/java/zip/reorder-sparc index b004b3c7d0c0325ddd30319d59ba859282937035..82cc81b6322968666237a427502db2f6b8b7aae4 100644 --- a/make/java/zip/reorder-sparc +++ b/make/java/zip/reorder-sparc @@ -19,12 +19,14 @@ text: .text%Java_java_util_zip_ZipFile_initIDs; 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 --git a/make/java/zip/reorder-sparcv9 b/make/java/zip/reorder-sparcv9 index e1061f8ebaeb69e5ae95f7e35cc19d2caa850cec..a2b0f467df026d7da11197b0e9a9d4f5be59e2f2 100644 --- a/make/java/zip/reorder-sparcv9 +++ b/make/java/zip/reorder-sparcv9 @@ -20,12 +20,14 @@ text: .text%Java_java_util_zip_ZipFile_initIDs; 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 --git a/make/sun/awt/Depend.mak b/make/sun/awt/Depend.mak index 047204206089f24fb7018a301e95696dd8a1bd4d..98c02da56e15bdc4c111c3efb88c5bdae4fed1ef 100644 --- a/make/sun/awt/Depend.mak +++ b/make/sun/awt/Depend.mak @@ -71,6 +71,7 @@ STUBFILES = \ $(STUBDIR)/Ole2.h \ $(STUBDIR)/Zmouse.h \ $(STUBDIR)/cderr.h \ + $(STUBDIR)/commctrl.h \ $(STUBDIR)/commdlg.h \ $(STUBDIR)/direct.h \ $(STUBDIR)/d3dcom.h \ diff --git a/make/sun/awt/FILES_c_windows.gmk b/make/sun/awt/FILES_c_windows.gmk index 211ab1c6b398ec6cfc4752dbf5b3cec2f2294a33..c9eb3482ea676019432749c5f5bc1b150ecb216b 100644 --- a/make/sun/awt/FILES_c_windows.gmk +++ b/make/sun/awt/FILES_c_windows.gmk @@ -1,5 +1,5 @@ # -# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-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 @@ -103,7 +103,8 @@ FILES_c = \ OGLVertexCache.c \ WGLGraphicsConfig.c \ WGLSurfaceData.c \ - AccelGlyphCache.c + AccelGlyphCache.c \ + rect.c FILES_cpp = \ CmdIDList.cpp \ @@ -198,5 +199,6 @@ FILES_cpp = \ ShellFolder2.cpp \ ThemeReader.cpp \ ComCtl32Util.cpp \ + DllUtil.cpp \ initIDs.cpp \ MouseInfo.cpp diff --git a/make/sun/awt/FILES_export_unix.gmk b/make/sun/awt/FILES_export_unix.gmk index 43637e7c4cbbf66845d39c796998e768352a20be..79246c6bc41bb10de8ec4ce83e7f2a7fa6550f6b 100644 --- a/make/sun/awt/FILES_export_unix.gmk +++ b/make/sun/awt/FILES_export_unix.gmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# 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 @@ -107,7 +107,8 @@ FILES_export = \ sun/java2d/x11/X11Renderer.java \ sun/java2d/x11/X11SurfaceData.java \ com/sun/java/swing/plaf/gtk/GTKEngine.java \ - com/sun/java/swing/plaf/gtk/GTKStyle.java + com/sun/java/swing/plaf/gtk/GTKStyle.java \ + sun/awt/ExtendedKeyCodes.java FILES_export2 = \ diff --git a/make/sun/awt/FILES_export_windows.gmk b/make/sun/awt/FILES_export_windows.gmk index 95933ceb396cf7087dfb4b6f582f00d8059b41f9..27627494458aff6ccdb7f496613a210dcfaa8a7f 100644 --- a/make/sun/awt/FILES_export_windows.gmk +++ b/make/sun/awt/FILES_export_windows.gmk @@ -1,5 +1,5 @@ # -# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. +# 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 @@ -154,7 +154,7 @@ FILES_export2 = \ sun/awt/datatransfer/DataTransferer.java \ sun/awt/datatransfer/SunClipboard.java \ sun/awt/dnd/SunDragSourceContextPeer.java \ - sun/awt/windows/WToolkitThreadBlockedHandler.java + sun/awt/windows/WToolkitThreadBlockedHandler.java FILES_export3 = \ java/awt/CheckboxMenuItem.java \ @@ -214,6 +214,7 @@ FILES_export3 = \ sun/awt/windows/WBufferStrategy.java \ sun/awt/windows/WTrayIconPeer.java \ sun/awt/image/ImagingLib.java \ + sun/awt/ExtendedKeyCodes.java \ sun/java2d/pipe/hw/AccelSurface.java \ sun/java2d/pipe/hw/AccelDeviceEventNotifier.java \ sun/java2d/pipe/hw/ContextCapabilities.java \ diff --git a/make/sun/awt/Makefile b/make/sun/awt/Makefile index ef1be7354acc851861376705a2de5edb916f49e2..c3c1745ff54993decc7759eced0d5bb81ce782b3 100644 --- a/make/sun/awt/Makefile +++ b/make/sun/awt/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-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 @@ -219,6 +219,7 @@ vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/image/cvutils vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/shell vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/medialib vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/debug +vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/utility vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/loops vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe diff --git a/make/sun/awt/README b/make/sun/awt/README index 5246150c394065718f3a023626964b06c51041c3..2fe5bb639a68fa34ec953fc6f130500868cc4879 100644 --- a/make/sun/awt/README +++ b/make/sun/awt/README @@ -6,11 +6,9 @@ runtime, it will probably work with other versions of that compiler. Included in this project is a generated file, make.depend, which lists all interdependencies of the source files. This file is generated *on -Solaris* with the following commands: +Solaris or Linux* with the following command: - % sccs edit make.depend % gnumake -f Depend.mak - % sccs delget make.depend This step only needs to be run when new files are added to the project, or include statements are changed. diff --git a/make/sun/awt/make.depend b/make/sun/awt/make.depend index 650e4c7fde830524982795fa899402d47db839fa..ed367d746912e5660de929a9a3679bb45d58a311 100644 --- a/make/sun/awt/make.depend +++ b/make/sun/awt/make.depend @@ -1,4 +1,4 @@ -$(OBJDIR)/AccelGlyphCache.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/AccelGlyphCache.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/AlphaMacros.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -14,143 +14,143 @@ $(OBJDIR)/AnyInt.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/sha $(OBJDIR)/AnyShort.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_BitmapUtil.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_BitmapUtil.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Desktop.obj:: ../../../src/share/javavm/export/jni.h ../../../src/windows/javavm/export/jni_md.h +$(OBJDIR)/awt_Desktop.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_ImageRep.obj:: $(CLASSHDRDIR)/sun_awt_image_ImageRepresentation.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/awt_ImagingLib.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_image_ConvolveOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h -$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_Mlib.obj:: $(CLASSHDRDIR)/java_awt_image_BufferedImage.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Mlib.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_parseImage.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h -$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/DllUtil.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/DllUtil.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h - -$(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/BlitBg.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_BlitBg.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/BufferedMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedMaskBlit.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/BufferedRenderPipe.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/BufferedMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedMaskBlit.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h + +$(OBJDIR)/BufferedRenderPipe.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/BufImgSurfaceData.obj:: $(CLASSHDRDIR)/sun_awt_image_BufImgSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/BufImgSurfaceData.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/img_util_md.h @@ -160,62 +160,64 @@ $(OBJDIR)/ByteBinary2Bit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../.. $(OBJDIR)/ByteBinary4Bit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByteBinary.h ../../../src/share/native/sun/java2d/loops/ByteBinary4Bit.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/ByteGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/ByteGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/ByteIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/ByteIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DShaders.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DShaders.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DGlyphCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DGlyphCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DMaskCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DMaskCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DVertexCacher.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/D3DVertexCacher.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/DataBufferNative.obj:: $(CLASSHDRDIR)/sun_awt_image_DataBufferNative.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/DataBufferNative.obj:: $(CLASSHDRDIR)/sun_awt_image_DataBufferNative.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_assert.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_assert.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_mem.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_mem.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_trace.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/debug_util.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/debug_util.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/Disposer.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/dither.obj:: ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/windows/native/sun/windows/colordata.h +$(OBJDIR)/DllUtil.obj:: ../../../src/windows/native/sun/windows/DllUtil.h + $(OBJDIR)/DrawLine.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawLine.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/DrawPath.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -230,27 +232,27 @@ $(OBJDIR)/FillRect.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR) $(OBJDIR)/FillSpans.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillSpans.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/FourByteAbgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgr.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/FourByteAbgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgr.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/FourByteAbgrPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgrPre.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/FourByteAbgrPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgrPre.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/gifdecoder.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/GraphicsPrimitiveMgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_GraphicsPrimitiveMgr.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/imageInitIDs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/img_colors.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/img_colors.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/img_globals.obj:: $(CLASSHDRDIR)/java_awt_image_DirectColorModel.h $(CLASSHDRDIR)/java_awt_image_IndexColorModel.h $(CLASSHDRDIR)/java_awt_Transparency.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/windows/javavm/export/jni_md.h @@ -260,49 +262,49 @@ $(OBJDIR)/Index8Gray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src $(OBJDIR)/initIDs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/IntArgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntArgbBm.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntArgbBm.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntArgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/IntArgbPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntRgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntRgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/IntRgbx.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/IntRgbx.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLFuncs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLFuncs.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedPaints.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedPaints.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h -$(OBJDIR)/OGLVertexCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h +$(OBJDIR)/OGLVertexCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h $(OBJDIR)/ProcessPath.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -314,36 +316,36 @@ $(OBJDIR)/ScaledBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDI $(OBJDIR)/ShapeSpanIterator.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_ShapeSpanIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/PathConsumer2D.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/SpanClipRenderer.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_RegionIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_SpanClipRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/SurfaceData.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any3Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any3Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h +$(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/TransformHelper.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_loops_TransformHelper.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort555Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort555Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort555Rgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgbx.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort555Rgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgbx.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Ushort565Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/Ushort565Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/UshortGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/UshortGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/UshortIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/loops/UshortIndexed.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/UshortIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/loops/UshortIndexed.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/WGLGraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h +$(OBJDIR)/WGLGraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h -$(OBJDIR)/WGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h +$(OBJDIR)/WGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h -$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h diff --git a/make/sun/awt/mapfile-mawt-vers b/make/sun/awt/mapfile-mawt-vers index 7eeef21f27812a0dadaed9147355dc3212b886c5..d04e646c6fcbae57731c94bc27fd7bf860a7bb4f 100644 --- a/make/sun/awt/mapfile-mawt-vers +++ b/make/sun/awt/mapfile-mawt-vers @@ -291,6 +291,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11GraphicsConfig_createBackBuffer; Java_sun_awt_X11GraphicsConfig_destroyBackBuffer; Java_sun_awt_X11GraphicsConfig_swapBuffers; + Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable; Java_sun_awt_X11GraphicsDevice_isDBESupported; Java_sun_awt_X11GraphicsDevice_getDisplay; Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals; diff --git a/make/sun/awt/mapfile-vers-linux b/make/sun/awt/mapfile-vers-linux index 2d1f0893a4bb58982ca38fc610ad88a4bff8a649..c1f9d133adfa8a95e1e1febba7bd48eb8e05e04e 100644 --- a/make/sun/awt/mapfile-vers-linux +++ b/make/sun/awt/mapfile-vers-linux @@ -406,6 +406,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11GraphicsConfig_getNumColors; Java_sun_awt_X11GraphicsConfig_getXResolution; Java_sun_awt_X11GraphicsConfig_getYResolution; + Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable; Java_sun_awt_X11GraphicsDevice_isDBESupported; Java_sun_awt_X11GraphicsDevice_getDisplay; Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals; diff --git a/make/sun/net/FILES_java.gmk b/make/sun/net/FILES_java.gmk index 55b6477fc26711e460bb82b9d3b7bd5cde767981..1ab771a37f10cbb53414f4d8ea8356e135fc776f 100644 --- a/make/sun/net/FILES_java.gmk +++ b/make/sun/net/FILES_java.gmk @@ -39,6 +39,7 @@ FILES_java = \ sun/net/TransferProtocolClient.java \ sun/net/ConnectionResetException.java \ sun/net/NetProperties.java \ + sun/net/NetHooks.java \ sun/net/util/IPAddressUtil.java \ sun/net/dns/ResolverConfiguration.java \ sun/net/dns/ResolverConfigurationImpl.java \ @@ -123,3 +124,7 @@ FILES_java = \ ifeq ($(PLATFORM), windows) FILES_java += sun/net/www/protocol/http/NTLMAuthSequence.java endif + +ifeq ($(PLATFORM), solaris) + FILES_java += sun/net/spi/SdpProvider.java +endif diff --git a/make/sun/xawt/FILES_c_unix.gmk b/make/sun/xawt/FILES_c_unix.gmk index c40d146384fc9346566eb153aca81c8373418d4f..604955e1e6edac31cc214c141c2ad215b7075998 100644 --- a/make/sun/xawt/FILES_c_unix.gmk +++ b/make/sun/xawt/FILES_c_unix.gmk @@ -78,4 +78,5 @@ FILES_c = \ awt_Plugin.c \ gtk2_interface.c \ swing_GTKEngine.c \ - swing_GTKStyle.c + swing_GTKStyle.c \ + rect.c diff --git a/make/sun/xawt/Makefile b/make/sun/xawt/Makefile index 4c56c5ea9a4a7ef445ec5854919a0e6ffd5a35bd..3cb408d99075248f42631d3a843b33a2a8db2d0e 100644 --- a/make/sun/xawt/Makefile +++ b/make/sun/xawt/Makefile @@ -79,6 +79,7 @@ vpath %.c $(SHARE_SRC)/native/sun/java2d vpath %.c $(SHARE_SRC)/native/sun/java2d/loops vpath %.c $(SHARE_SRC)/native/sun/java2d/pipe vpath %.c $(SHARE_SRC)/native/sun/awt/medialib +vpath %.c $(SHARE_SRC)/native/sun/awt/utility vpath %.cpp $(SHARE_SRC)/native/sun/image vpath %.c $(SHARE_SRC)/native/sun/font vpath %.c $(PLATFORM_SRC)/native/sun/awt/robot_child @@ -274,6 +275,23 @@ ICONS = \ $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon32.png \ $(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon48.png + +ICONPATH=$(PLATFORM_SRC)/classes/sun/awt/X11 + +ICONS += \ + $(ICONPATH)/security-icon-bw16.png \ + $(ICONPATH)/security-icon-interim16.png \ + $(ICONPATH)/security-icon-yellow16.png \ + $(ICONPATH)/security-icon-bw24.png \ + $(ICONPATH)/security-icon-interim24.png \ + $(ICONPATH)/security-icon-yellow24.png \ + $(ICONPATH)/security-icon-bw32.png \ + $(ICONPATH)/security-icon-interim32.png \ + $(ICONPATH)/security-icon-yellow32.png \ + $(ICONPATH)/security-icon-bw48.png \ + $(ICONPATH)/security-icon-interim48.png \ + $(ICONPATH)/security-icon-yellow48.png + TEMPDIR_CLASSES = $(TEMPDIR)/classes $(TEMPDIR_CLASSES)/sun/awt/X11/ToBin.class: ToBin.java diff --git a/make/sun/xawt/mapfile-vers b/make/sun/xawt/mapfile-vers index 3913f4060f1ec554e5f2e15b07d8b27d07149517..c117a0972687f07ac506c2c9a1a4cd608d25f210 100644 --- a/make/sun/xawt/mapfile-vers +++ b/make/sun/xawt/mapfile-vers @@ -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 @@ -93,6 +93,9 @@ SUNWprivate_1.1 { Java_sun_awt_X11_XlibWrapper_XGetWMHints; Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension; Java_sun_awt_X11_XlibWrapper_SetRectangularShape; + Java_sun_awt_X11_XlibWrapper_SetBitmapShape; + Java_sun_awt_X11_XlibWrapper_XConfigureWindow; + Java_sun_awt_X11_XlibWrapper_SetZOrder; Java_sun_awt_X11_XToolkit_initIDs; Java_sun_awt_X11_XWindow_getNativeColor; Java_sun_awt_X11_XWindow_getWMInsets; @@ -217,6 +220,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11GraphicsConfig_createBackBuffer; Java_sun_awt_X11GraphicsConfig_destroyBackBuffer; Java_sun_awt_X11GraphicsConfig_swapBuffers; + Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable; Java_java_awt_Insets_initIDs; Java_java_awt_KeyboardFocusManager_initIDs; Java_java_awt_Font_initIDs; @@ -289,16 +293,26 @@ SUNWprivate_1.1 { Java_sun_awt_X11_XlibWrapper_XGetIconSizes; Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym; Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode; - Java_sun_awt_X11_XlibWrapper_XQueryKeymap; + Java_sun_awt_X11_XlibWrapper_XQueryKeymap; + Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup; + Java_sun_awt_X11_XlibWrapper_XkbSelectEvents; + Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails; + Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym; + Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion; + Java_sun_awt_X11_XlibWrapper_XkbQueryExtension; + Java_sun_awt_X11_XlibWrapper_XkbGetMap; + Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap; + Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard; + Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode; Java_sun_awt_X11_XlibWrapper_XGetModifierMapping; - Java_sun_awt_X11_XlibWrapper_XFreeModifiermap; + Java_sun_awt_X11_XlibWrapper_XFreeModifiermap; Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab; Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent; Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop; Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList; Java_sun_awt_X11_XlibWrapper_XGrabServer; Java_sun_awt_X11_XlibWrapper_XUngrabServer; - Java_sun_awt_X11_XlibWrapper_XPutBackEvent; + Java_sun_awt_X11_XlibWrapper_XPutBackEvent; Java_sun_awt_X11_XlibWrapper_XConvertCase; Java_sun_awt_X11_XlibWrapper_XSynchronize; Java_java_awt_FileDialog_initIDs; diff --git a/make/tools/GenerateCharacter/CharacterData00.java.template b/make/tools/GenerateCharacter/CharacterData00.java.template index c790f374ef6710084913c2d1898614e548ac46c2..554c7cf57cb832595a6e6e992f37b52292282483 100644 --- a/make/tools/GenerateCharacter/CharacterData00.java.template +++ b/make/tools/GenerateCharacter/CharacterData00.java.template @@ -144,6 +144,55 @@ class CharacterData00 extends CharacterData { case 0x1FBC : mapChar = 0x1FB3; break; case 0x1FCC : mapChar = 0x1FC3; break; case 0x1FFC : mapChar = 0x1FF3; break; + + case 0x023A : mapChar = 0x2C65; break; + case 0x023E : mapChar = 0x2C66; break; + case 0x10A0 : mapChar = 0x2D00; break; + case 0x10A1 : mapChar = 0x2D01; break; + case 0x10A2 : mapChar = 0x2D02; break; + case 0x10A3 : mapChar = 0x2D03; break; + case 0x10A4 : mapChar = 0x2D04; break; + case 0x10A5 : mapChar = 0x2D05; break; + case 0x10A6 : mapChar = 0x2D06; break; + case 0x10A7 : mapChar = 0x2D07; break; + case 0x10A8 : mapChar = 0x2D08; break; + case 0x10A9 : mapChar = 0x2D09; break; + case 0x10AA : mapChar = 0x2D0A; break; + case 0x10AB : mapChar = 0x2D0B; break; + case 0x10AC : mapChar = 0x2D0C; break; + case 0x10AD : mapChar = 0x2D0D; break; + case 0x10AE : mapChar = 0x2D0E; break; + case 0x10AF : mapChar = 0x2D0F; break; + case 0x10B0 : mapChar = 0x2D10; break; + case 0x10B1 : mapChar = 0x2D11; break; + case 0x10B2 : mapChar = 0x2D12; break; + case 0x10B3 : mapChar = 0x2D13; break; + case 0x10B4 : mapChar = 0x2D14; break; + case 0x10B5 : mapChar = 0x2D15; break; + case 0x10B6 : mapChar = 0x2D16; break; + case 0x10B7 : mapChar = 0x2D17; break; + case 0x10B8 : mapChar = 0x2D18; break; + case 0x10B9 : mapChar = 0x2D19; break; + case 0x10BA : mapChar = 0x2D1A; break; + case 0x10BB : mapChar = 0x2D1B; break; + case 0x10BC : mapChar = 0x2D1C; break; + case 0x10BD : mapChar = 0x2D1D; break; + case 0x10BE : mapChar = 0x2D1E; break; + case 0x10BF : mapChar = 0x2D1F; break; + case 0x10C0 : mapChar = 0x2D20; break; + case 0x10C1 : mapChar = 0x2D21; break; + case 0x10C2 : mapChar = 0x2D22; break; + case 0x10C3 : mapChar = 0x2D23; break; + case 0x10C4 : mapChar = 0x2D24; break; + case 0x10C5 : mapChar = 0x2D25; break; + case 0x1E9E : mapChar = 0x00DF; break; + case 0x2C62 : mapChar = 0x026B; break; + case 0x2C63 : mapChar = 0x1D7D; break; + case 0x2C64 : mapChar = 0x027D; break; + case 0x2C6D : mapChar = 0x0251; break; + case 0x2C6E : mapChar = 0x0271; break; + case 0x2C6F : mapChar = 0x0250; break; + case 0xA77D : mapChar = 0x1D79; break; // default mapChar is already set, so no // need to redo it here. // default : mapChar = ch; @@ -196,6 +245,54 @@ class CharacterData00 extends CharacterData { case 0x1FB3 : mapChar = 0x1FBC; break; case 0x1FC3 : mapChar = 0x1FCC; break; case 0x1FF3 : mapChar = 0x1FFC; break; + + case 0x0250 : mapChar = 0x2C6F; break; + case 0x0251 : mapChar = 0x2C6D; break; + case 0x026B : mapChar = 0x2C62; break; + case 0x0271 : mapChar = 0x2C6E; break; + case 0x027D : mapChar = 0x2C64; break; + case 0x1D79 : mapChar = 0xA77D; break; + case 0x1D7D : mapChar = 0x2C63; break; + case 0x2C65 : mapChar = 0x023A; break; + case 0x2C66 : mapChar = 0x023E; break; + case 0x2D00 : mapChar = 0x10A0; break; + case 0x2D01 : mapChar = 0x10A1; break; + case 0x2D02 : mapChar = 0x10A2; break; + case 0x2D03 : mapChar = 0x10A3; break; + case 0x2D04 : mapChar = 0x10A4; break; + case 0x2D05 : mapChar = 0x10A5; break; + case 0x2D06 : mapChar = 0x10A6; break; + case 0x2D07 : mapChar = 0x10A7; break; + case 0x2D08 : mapChar = 0x10A8; break; + case 0x2D09 : mapChar = 0x10A9; break; + case 0x2D0A : mapChar = 0x10AA; break; + case 0x2D0B : mapChar = 0x10AB; break; + case 0x2D0C : mapChar = 0x10AC; break; + case 0x2D0D : mapChar = 0x10AD; break; + case 0x2D0E : mapChar = 0x10AE; break; + case 0x2D0F : mapChar = 0x10AF; break; + case 0x2D10 : mapChar = 0x10B0; break; + case 0x2D11 : mapChar = 0x10B1; break; + case 0x2D12 : mapChar = 0x10B2; break; + case 0x2D13 : mapChar = 0x10B3; break; + case 0x2D14 : mapChar = 0x10B4; break; + case 0x2D15 : mapChar = 0x10B5; break; + case 0x2D16 : mapChar = 0x10B6; break; + case 0x2D17 : mapChar = 0x10B7; break; + case 0x2D18 : mapChar = 0x10B8; break; + case 0x2D19 : mapChar = 0x10B9; break; + case 0x2D1A : mapChar = 0x10BA; break; + case 0x2D1B : mapChar = 0x10BB; break; + case 0x2D1C : mapChar = 0x10BC; break; + case 0x2D1D : mapChar = 0x10BD; break; + case 0x2D1E : mapChar = 0x10BE; break; + case 0x2D1F : mapChar = 0x10BF; break; + case 0x2D20 : mapChar = 0x10C0; break; + case 0x2D21 : mapChar = 0x10C1; break; + case 0x2D22 : mapChar = 0x10C2; break; + case 0x2D23 : mapChar = 0x10C3; break; + case 0x2D24 : mapChar = 0x10C4; break; + case 0x2D25 : mapChar = 0x10C5; break; // ch must have a 1:M case mapping, but we // can't handle it here. Return ch. // since mapChar is already set, no need @@ -315,6 +412,12 @@ class CharacterData00 extends CharacterData { case 0x32BE: retval = 49; break; // CIRCLED NUMBER FORTY NINE case 0x32BF: retval = 50; break; // CIRCLED NUMBER FIFTY + case 0x0D71: retval = 100; break; // MALAYALAM NUMBER ONE HUNDRED + case 0x0D72: retval = 1000; break; // MALAYALAM NUMBER ONE THOUSAND + case 0x2186: retval = 50; break; // ROMAN NUMERAL FIFTY EARLY FORM + case 0x2187: retval = 50000; break; // ROMAN NUMERAL FIFTY THOUSAND + case 0x2188: retval = 100000; break; // ROMAN NUMERAL ONE HUNDRED THOUSAND + default: retval = -2; break; } break; @@ -383,6 +486,54 @@ class CharacterData00 extends CharacterData { case 0x00B5 : mapChar = 0x039C; break; case 0x017F : mapChar = 0x0053; break; case 0x1FBE : mapChar = 0x0399; break; + + case 0x0250 : mapChar = 0x2C6F; break; + case 0x0251 : mapChar = 0x2C6D; break; + case 0x026B : mapChar = 0x2C62; break; + case 0x0271 : mapChar = 0x2C6E; break; + case 0x027D : mapChar = 0x2C64; break; + case 0x1D79 : mapChar = 0xA77D; break; + case 0x1D7D : mapChar = 0x2C63; break; + case 0x2C65 : mapChar = 0x023A; break; + case 0x2C66 : mapChar = 0x023E; break; + case 0x2D00 : mapChar = 0x10A0; break; + case 0x2D01 : mapChar = 0x10A1; break; + case 0x2D02 : mapChar = 0x10A2; break; + case 0x2D03 : mapChar = 0x10A3; break; + case 0x2D04 : mapChar = 0x10A4; break; + case 0x2D05 : mapChar = 0x10A5; break; + case 0x2D06 : mapChar = 0x10A6; break; + case 0x2D07 : mapChar = 0x10A7; break; + case 0x2D08 : mapChar = 0x10A8; break; + case 0x2D09 : mapChar = 0x10A9; break; + case 0x2D0A : mapChar = 0x10AA; break; + case 0x2D0B : mapChar = 0x10AB; break; + case 0x2D0C : mapChar = 0x10AC; break; + case 0x2D0D : mapChar = 0x10AD; break; + case 0x2D0E : mapChar = 0x10AE; break; + case 0x2D0F : mapChar = 0x10AF; break; + case 0x2D10 : mapChar = 0x10B0; break; + case 0x2D11 : mapChar = 0x10B1; break; + case 0x2D12 : mapChar = 0x10B2; break; + case 0x2D13 : mapChar = 0x10B3; break; + case 0x2D14 : mapChar = 0x10B4; break; + case 0x2D15 : mapChar = 0x10B5; break; + case 0x2D16 : mapChar = 0x10B6; break; + case 0x2D17 : mapChar = 0x10B7; break; + case 0x2D18 : mapChar = 0x10B8; break; + case 0x2D19 : mapChar = 0x10B9; break; + case 0x2D1A : mapChar = 0x10BA; break; + case 0x2D1B : mapChar = 0x10BB; break; + case 0x2D1C : mapChar = 0x10BC; break; + case 0x2D1D : mapChar = 0x10BD; break; + case 0x2D1E : mapChar = 0x10BE; break; + case 0x2D1F : mapChar = 0x10BF; break; + case 0x2D20 : mapChar = 0x10C0; break; + case 0x2D21 : mapChar = 0x10C1; break; + case 0x2D22 : mapChar = 0x10C2; break; + case 0x2D23 : mapChar = 0x10C3; break; + case 0x2D24 : mapChar = 0x10C4; break; + case 0x2D25 : mapChar = 0x10C5; break; default : mapChar = Character.ERROR; break; } } diff --git a/make/tools/GenerateCharacter/CharacterData01.java.template b/make/tools/GenerateCharacter/CharacterData01.java.template index 9a228b769c1a2744c013b23771dcbc4752cb6e90..c42f9807a18824eb1db1b06b4813fc537ed6c96f 100644 --- a/make/tools/GenerateCharacter/CharacterData01.java.template +++ b/make/tools/GenerateCharacter/CharacterData01.java.template @@ -218,6 +218,48 @@ class CharacterData01 extends CharacterData { case 0x10132: retval = 80000; break; // AEGEAN NUMBER EIGHTY THOUSAND case 0x10133: retval = 90000; break; // AEGEAN NUMBER NINETY THOUSAND case 0x10323: retval = 50; break; // OLD ITALIC NUMERAL FIFTY + + case 0x010144: retval = 50; break; // ACROPHONIC ATTIC FIFTY + case 0x010145: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED + case 0x010146: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND + case 0x010147: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND + case 0x01014A: retval = 50; break; // ACROPHONIC ATTIC FIFTY TALENTS + case 0x01014B: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED TALENTS + case 0x01014C: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED TALENTS + case 0x01014D: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND TALENTS + case 0x01014E: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND TALENTS + case 0x010151: retval = 50; break; // ACROPHONIC ATTIC FIFTY STATERS + case 0x010152: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED STATERS + case 0x010153: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED STATERS + case 0x010154: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND STATERS + case 0x010155: retval = 10000; break; // ACROPHONIC ATTIC TEN THOUSAND STATERS + case 0x010156: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND STATERS + case 0x010166: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY + case 0x010167: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM + case 0x010168: retval = 50; break; // ACROPHONIC HERMIONIAN FIFTY + case 0x010169: retval = 50; break; // ACROPHONIC THESPIAN FIFTY + case 0x01016A: retval = 100; break; // ACROPHONIC THESPIAN ONE HUNDRED + case 0x01016B: retval = 300; break; // ACROPHONIC THESPIAN THREE HUNDRED + case 0x01016C: retval = 500; break; // ACROPHONIC EPIDAUREAN FIVE HUNDRED + case 0x01016D: retval = 500; break; // ACROPHONIC TROEZENIAN FIVE HUNDRED + case 0x01016E: retval = 500; break; // ACROPHONIC THESPIAN FIVE HUNDRED + case 0x01016F: retval = 500; break; // ACROPHONIC CARYSTIAN FIVE HUNDRED + case 0x010170: retval = 500; break; // ACROPHONIC NAXIAN FIVE HUNDRED + case 0x010171: retval = 1000; break; // ACROPHONIC THESPIAN ONE THOUSAND + case 0x010172: retval = 5000; break; // ACROPHONIC THESPIAN FIVE THOUSAND + case 0x010174: retval = 50; break; // ACROPHONIC STRATIAN FIFTY MNAS + case 0x010341: retval = 90; break; // GOTHIC LETTER NINETY + case 0x01034A: retval = 900; break; // GOTHIC LETTER NINE HUNDRED + case 0x0103D5: retval = 100; break; // OLD PERSIAN NUMBER HUNDRED + case 0x010919: retval = 100; break; // PHOENICIAN NUMBER ONE HUNDRED + case 0x010A46: retval = 100; break; // KHAROSHTHI NUMBER ONE HUNDRED + case 0x010A47: retval = 1000; break; // KHAROSHTHI NUMBER ONE THOUSAND + case 0x01D36C: retval = 40; break; // COUNTING ROD TENS DIGIT FOUR + case 0x01D36D: retval = 50; break; // COUNTING ROD TENS DIGIT FIVE + case 0x01D36E: retval = 60; break; // COUNTING ROD TENS DIGIT SIX + case 0x01D36F: retval = 70; break; // COUNTING ROD TENS DIGIT SEVEN + case 0x01D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT + case 0x01D371: retval = 90; break; // COUNTING ROD TENS DIGIT NINE default: retval = -2; break; } diff --git a/make/tools/UnicodeData/SpecialCasing.txt b/make/tools/UnicodeData/SpecialCasing.txt index 34d1c61de37ea47eb7a43bd6b8aae8c93b4bc87b..92e70a4a3d23c1d6533d33e1920c29f40ba84d20 100644 --- a/make/tools/UnicodeData/SpecialCasing.txt +++ b/make/tools/UnicodeData/SpecialCasing.txt @@ -1,12 +1,17 @@ -# SpecialCasing-4.0.0.txt -# Date: 2003-03-14, 20:22:04 GMT [MD] +# SpecialCasing-5.1.0.txt +# Date: 2008-03-03, 21:58:10 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2008 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html # # Special Casing Properties # # This file is a supplement to the UnicodeData file. # It contains additional information about the casing of Unicode characters. # (For compatibility, the UnicodeData.txt file only contains case mappings for -# characters where they are 1-1, and does not have locale-specific mappings.) +# characters where they are 1-1, and independent of context and language. # For more information, see the discussion of Case Mappings in the Unicode Standard. # # All code points not listed in this file that do not have a simple case mappings @@ -18,31 +23,31 @@ # # ; ; ; <upper> ; (<condition_list> ;)? # <comment> # -# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more than -# one character, they are separated by spaces. Other than as used to separate elements, -# spaces are to be ignored. +# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more +# than one character, they are separated by spaces. Other than as used to separate +# elements, spaces are to be ignored. # -# The <condition_list> is optional. Where present, it consists of one or more locales or contexts, -# separated by spaces. In these conditions: +# The <condition_list> is optional. Where present, it consists of one or more language IDs +# or contexts, separated by spaces. In these conditions: # - A condition list overrides the normal behavior if all of the listed conditions are true. # - The context is always the context of the characters in the original string, # NOT in the resulting string. # - Case distinctions in the condition list are not significant. # - Conditions preceded by "Not_" represent the negation of the condition. +# The condition list is not represented in the UCD as a formal property. # -# A locale is defined as: -# <locale> := <ISO_639_code> ( "_" <ISO_3166_code> ( "_" <variant> )? )? -# <ISO_3166_code> := 2-letter ISO country code, -# <ISO_639_code> := 2-letter ISO language code +# A language ID is defined by BCP 47, with '-' and '_' treated equivalently. # -# A context is one of the following, as defined in the Unicode Standard: -# Final_Sigma, After_Soft_Dotted, More_Above, Before_Dot, Not_Before_Dot, After_I +# A context for a character C is defined by Section 3.13 Default Case +# Operations, of The Unicode Standard, Version 5.0. +# (This is identical to the context defined by Unicode 4.1.0, +# as specified in http://www.unicode.org/versions/Unicode4.1.0/) # # Parsers of this file must be prepared to deal with future additions to this format: # * Additional contexts # * Additional fields # ================================================================================ - +# @missing 0000..10FFFF; <slc>; <stc>; <suc> # ================================================================================ # Unconditional mappings # ================================================================================ @@ -170,7 +175,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH 1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI 1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -# Some characters with YPOGEGRAMMENI are also have no corresponding titlecases +# Some characters with YPOGEGRAMMENI also have no corresponding titlecases 1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI 1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI @@ -184,7 +189,14 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH 1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI # ================================================================================ -# Conditional mappings +# Conditional Mappings +# The remainder of this file provides conditional casing data used to produce +# full case mappings. +# ================================================================================ +# Language-Insensitive Mappings +# These are characters whose full case mappings do not depend on language, but do +# depend on context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. # ================================================================================ # Special case for final form of sigma @@ -203,7 +215,10 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH # 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA # ================================================================================ -# Locale-sensitive mappings +# Language-Sensitive Mappings +# These are characters whose full case mappings depend on language and perhaps also +# context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. # ================================================================================ # Lithuanian @@ -254,3 +269,6 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH # Note: the following case is already in the UnicodeData file. # 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I + +# EOF + diff --git a/make/tools/UnicodeData/UnicodeData.txt b/make/tools/UnicodeData/UnicodeData.txt index 86ea1cf9f684cca1f8d2690f1462a9aba177ba37..77db788cf29cb4a124bde6606f479f70d97b91af 100644 --- a/make/tools/UnicodeData/UnicodeData.txt +++ b/make/tools/UnicodeData/UnicodeData.txt @@ -41,11 +41,11 @@ 0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; 0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; 002A;ASTERISK;Po;0;ON;;;;;N;;;;; -002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; 002C;COMMA;Po;0;CS;;;;;N;;;;; -002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; 002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; -002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; 0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; 0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; 0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; @@ -171,7 +171,7 @@ 00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;; 00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;; 00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; -00AD;SOFT HYPHEN;Cf;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; 00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; 00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;; 00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; @@ -382,7 +382,7 @@ 017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; 017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D 017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053 -0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;; +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; 0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; 0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 @@ -408,7 +408,7 @@ 0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; 0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; 0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 -019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;; +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D 019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; 019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; 019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; @@ -565,8 +565,33 @@ 0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; 0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; 0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; -0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;; -0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;; +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;; +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D 0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;; 0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 @@ -592,13 +617,13 @@ 0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; -026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;; 026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; 026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; 026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C 0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; -0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E 0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D 0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; 0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; @@ -610,7 +635,7 @@ 027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; 027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; 027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; 027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; 0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6 @@ -622,10 +647,10 @@ 0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; 0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;; 0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE -0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;; +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 -028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;; +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; 028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; 028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; @@ -633,7 +658,7 @@ 0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; 0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; -0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; 0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; 0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; 0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; @@ -659,7 +684,7 @@ 02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; 02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; 02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK ;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; 02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; 02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;; 02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; @@ -721,7 +746,7 @@ 02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; 02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; 02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; 02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; 02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; 02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; @@ -829,6 +854,11 @@ 0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; 035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; 035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; 035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; @@ -848,9 +878,18 @@ 036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; 036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; 036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; -0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; 0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF 037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;; 0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;; 0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; @@ -924,6 +963,7 @@ 03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C 03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E 03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; 03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; @@ -931,7 +971,7 @@ 03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; 03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 -03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;; +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF 03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9; 03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8 03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; @@ -968,6 +1008,10 @@ 03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2; 03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; 03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; 0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; 0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; 0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452; @@ -1103,6 +1147,7 @@ 0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; 0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; 0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; 0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; 0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; 048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; @@ -1159,7 +1204,7 @@ 04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC 04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; 04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE -04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;; +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; 04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; 04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; @@ -1174,6 +1219,7 @@ 04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB 04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; 04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; 04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; @@ -1212,8 +1258,16 @@ 04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; 04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; 04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE 0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; 0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; @@ -1230,6 +1284,26 @@ 050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C 050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; 050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; 0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; 0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; @@ -1333,6 +1407,7 @@ 059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; 05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; 05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; 05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; 05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; 05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;; @@ -1356,16 +1431,20 @@ 05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; 05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; 05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; 05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; 05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;; 05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;; -05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; 05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; 05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;; 05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; 05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; 05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;; 05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; 05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; 05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; 05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; @@ -1398,10 +1477,16 @@ 05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; 05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; 05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; -0600;ARABIC NUMBER SIGN;Cf;0;AL;;;;;N;;;;; -0601;ARABIC SIGN SANAH;Cf;0;AL;;;;;N;;;;; -0602;ARABIC FOOTNOTE MARKER;Cf;0;AL;;;;;N;;;;; -0603;ARABIC SIGN SAFHA;Cf;0;AL;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; 060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; 060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; 060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; @@ -1411,8 +1496,14 @@ 0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; 0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; 0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; -0615;ARABIC SMALL HIGH TAH ;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; 061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; 061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; 0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; 0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; @@ -1440,6 +1531,11 @@ 0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; 0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; 063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; 0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; 0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; @@ -1465,6 +1561,12 @@ 0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; 0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; 0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; 0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; 0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; 0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; @@ -1590,7 +1692,7 @@ 06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; 06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; 06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; -06DD;ARABIC END OF AYAH;Cf;0;AL;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; 06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;; 06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; 06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; @@ -1702,6 +1804,54 @@ 074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; 074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; 074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; 0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; 0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; @@ -1752,6 +1902,65 @@ 07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; 07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; 07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; 0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -1857,6 +2066,13 @@ 096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; 0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -1918,6 +2134,7 @@ 09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; 09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; 09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; 09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; 09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; @@ -2004,6 +2221,7 @@ 0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; 0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; 0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; 0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; 0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; @@ -2024,6 +2242,7 @@ 0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; 0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; 0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; 0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2164,6 +2383,7 @@ 0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; 0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; @@ -2176,6 +2396,8 @@ 0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; 0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2221,6 +2443,7 @@ 0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; 0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; 0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; 0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; 0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; 0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; @@ -2236,7 +2459,9 @@ 0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; 0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; 0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; 0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; @@ -2309,6 +2534,7 @@ 0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; 0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; 0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; 0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; @@ -2325,8 +2551,12 @@ 0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; 0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; 0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2337,6 +2567,14 @@ 0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; 0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; @@ -2409,6 +2647,8 @@ 0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; 0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2419,6 +2659,8 @@ 0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;; 0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; @@ -2471,12 +2713,14 @@ 0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; 0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; 0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; 0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; @@ -2487,6 +2731,8 @@ 0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -2497,6 +2743,19 @@ 0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; 0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; 0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; 0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; @@ -2787,10 +3046,10 @@ 0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;; 0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;; 0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;; -0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;; -0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;; -0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;; -0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;gug ta yun;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;ang kang ye;;; 0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;; 0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;; 0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; @@ -2835,6 +3094,8 @@ 0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; 0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; 0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; 0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; 0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; 0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; @@ -2921,7 +3182,13 @@ 0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;; 0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;; 0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;dena deka;;; 0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;nyi tsek;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;da nying yik go dun ma;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;da nying yik go kab ma;;; 1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; 1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; 1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; @@ -2956,13 +3223,16 @@ 101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; 1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; 1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; 1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; 1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; 1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; 1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; 1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; 1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; 102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; 102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; @@ -2970,10 +3240,19 @@ 1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; 1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; 1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; 1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; 1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -3000,44 +3279,110 @@ 1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; 1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;; -10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;; -10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;; -10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;; -10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;; -10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;; -10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;; -10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;; -10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;; -10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;; -10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;; -10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;; -10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;; -10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;; -10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;; -10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;; -10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;; -10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;; -10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;; -10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;; -10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;; -10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;; -10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;; -10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;; -10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;; -10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;; -10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;; -10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;; -10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25; 10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; 10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; 10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; @@ -3079,7 +3424,10 @@ 10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; 10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; 10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; +10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; +10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; 10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;; 1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; 1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; 1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; @@ -3327,6 +3675,7 @@ 1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; 1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; 1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; 1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; 1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; 120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; @@ -3390,6 +3739,7 @@ 1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; 1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; 1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; 1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; 124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; 124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; @@ -3446,6 +3796,7 @@ 1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; 1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; 1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; 1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; 128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; 128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; @@ -3482,6 +3833,7 @@ 12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; 12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; 12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; 12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; 12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; 12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; @@ -3506,6 +3858,7 @@ 12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; 12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; 12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; 12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; 12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; 12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; @@ -3536,6 +3889,7 @@ 12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; 12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; 12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; 12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; 12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; 12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; @@ -3567,6 +3921,7 @@ 130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; 130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; 130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; 1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; 1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; 1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; @@ -3579,6 +3934,7 @@ 131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; 131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; 131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; 1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; 1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; 1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; @@ -3618,6 +3974,7 @@ 1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; 1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; 1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; 1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; 1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; 134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; @@ -3637,6 +3994,8 @@ 1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; 1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; 135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;; 1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; 1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; 1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; @@ -3645,15 +4004,15 @@ 1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; 1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; 1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; 1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; 1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; 1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; @@ -3665,6 +4024,32 @@ 137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; 137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; 137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; 13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; 13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; 13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; @@ -4407,8 +4792,8 @@ 1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; 1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; 169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; -169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;; -169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; 16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; 16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; 16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; @@ -4840,6 +5225,7 @@ 18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; 18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; 18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; 1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; 1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; 1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; @@ -4878,9 +5264,9 @@ 1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -1929;LIMBU SUBJOINED LETTER YA;Mc;0;NSM;;;;;N;;;;; -192A;LIMBU SUBJOINED LETTER RA;Mc;0;NSM;;;;;N;;;;; -192B;LIMBU SUBJOINED LETTER WA;Mc;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; 1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; 1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; 1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; @@ -4941,6 +5327,86 @@ 1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; 1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; 1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;; 19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; 19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; 19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; @@ -4973,6 +5439,334 @@ 19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; 19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; 19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; 1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; 1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; 1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; @@ -5081,6 +5875,131 @@ 1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;; 1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;; 1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; 1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; @@ -5237,6 +6156,10 @@ 1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; 1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; 1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; 1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; 1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; @@ -5327,6 +6250,12 @@ 1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; 1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE 1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A @@ -5571,7 +6500,7 @@ 2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; -200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; 200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; 200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; 200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; @@ -5607,7 +6536,7 @@ 202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; 202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; 202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; -202F;NARROW NO-BREAK SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;; 2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; 2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; 2032;PRIME;Po;0;ET;;;;;N;;;;; @@ -5628,7 +6557,7 @@ 2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; 2042;ASTERISM;Po;0;ON;;;;;N;;;;; 2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; -2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; 2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; 2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; 2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;; @@ -5645,12 +6574,22 @@ 2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; 2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; 2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; 205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; 2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; 2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; 2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; 206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; 206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; 206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; @@ -5665,8 +6604,8 @@ 2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; 2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; 2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; -207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET;<super> 002B;;;;N;;;;; -207B;SUPERSCRIPT MINUS;Sm;0;ET;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; 207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;; 207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; 207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; @@ -5681,11 +6620,16 @@ 2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; 2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; 2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; -208A;SUBSCRIPT PLUS SIGN;Sm;0;ET;<sub> 002B;;;;N;;;;; -208B;SUBSCRIPT MINUS;Sm;0;ET;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; 208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;; 208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; 208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;; 20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; 20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; 20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; @@ -5704,6 +6648,10 @@ 20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; 20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; 20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; @@ -5731,6 +6679,12 @@ 20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; 20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; 20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; 2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;; 2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;; 2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;; @@ -5781,7 +6735,7 @@ 212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;; 2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;; -2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; 2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;; 2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; @@ -5791,6 +6745,7 @@ 2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;; 213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; 213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; @@ -5806,6 +6761,10 @@ 2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; 214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; 2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; 2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; 2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; @@ -5854,7 +6813,12 @@ 2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; 2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; 2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; -2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; 2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; 2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; 2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; @@ -5985,7 +6949,7 @@ 220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; 2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; 2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; -2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; 2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; 2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; 2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; @@ -6403,9 +7367,9 @@ 23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; 23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; 23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; -23B4;TOP SQUARE BRACKET;Ps;0;ON;;;;;N;;;;; -23B5;BOTTOM SQUARE BRACKET;Pe;0;ON;;;;;N;;;;; -23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;Po;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; 23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; 23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; 23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; @@ -6432,6 +7396,29 @@ 23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; 23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; 23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; 2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; 2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; 2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; @@ -6482,46 +7469,46 @@ 2448;OCR DASH;So;0;ON;;;;;N;;;;; 2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; 244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; -2460;CIRCLED DIGIT ONE;No;0;EN;<circle> 0031;;1;1;N;;;;; -2461;CIRCLED DIGIT TWO;No;0;EN;<circle> 0032;;2;2;N;;;;; -2462;CIRCLED DIGIT THREE;No;0;EN;<circle> 0033;;3;3;N;;;;; -2463;CIRCLED DIGIT FOUR;No;0;EN;<circle> 0034;;4;4;N;;;;; -2464;CIRCLED DIGIT FIVE;No;0;EN;<circle> 0035;;5;5;N;;;;; -2465;CIRCLED DIGIT SIX;No;0;EN;<circle> 0036;;6;6;N;;;;; -2466;CIRCLED DIGIT SEVEN;No;0;EN;<circle> 0037;;7;7;N;;;;; -2467;CIRCLED DIGIT EIGHT;No;0;EN;<circle> 0038;;8;8;N;;;;; -2468;CIRCLED DIGIT NINE;No;0;EN;<circle> 0039;;9;9;N;;;;; -2469;CIRCLED NUMBER TEN;No;0;EN;<circle> 0031 0030;;;10;N;;;;; -246A;CIRCLED NUMBER ELEVEN;No;0;EN;<circle> 0031 0031;;;11;N;;;;; -246B;CIRCLED NUMBER TWELVE;No;0;EN;<circle> 0031 0032;;;12;N;;;;; -246C;CIRCLED NUMBER THIRTEEN;No;0;EN;<circle> 0031 0033;;;13;N;;;;; -246D;CIRCLED NUMBER FOURTEEN;No;0;EN;<circle> 0031 0034;;;14;N;;;;; -246E;CIRCLED NUMBER FIFTEEN;No;0;EN;<circle> 0031 0035;;;15;N;;;;; -246F;CIRCLED NUMBER SIXTEEN;No;0;EN;<circle> 0031 0036;;;16;N;;;;; -2470;CIRCLED NUMBER SEVENTEEN;No;0;EN;<circle> 0031 0037;;;17;N;;;;; -2471;CIRCLED NUMBER EIGHTEEN;No;0;EN;<circle> 0031 0038;;;18;N;;;;; -2472;CIRCLED NUMBER NINETEEN;No;0;EN;<circle> 0031 0039;;;19;N;;;;; -2473;CIRCLED NUMBER TWENTY;No;0;EN;<circle> 0032 0030;;;20;N;;;;; -2474;PARENTHESIZED DIGIT ONE;No;0;EN;<compat> 0028 0031 0029;;1;1;N;;;;; -2475;PARENTHESIZED DIGIT TWO;No;0;EN;<compat> 0028 0032 0029;;2;2;N;;;;; -2476;PARENTHESIZED DIGIT THREE;No;0;EN;<compat> 0028 0033 0029;;3;3;N;;;;; -2477;PARENTHESIZED DIGIT FOUR;No;0;EN;<compat> 0028 0034 0029;;4;4;N;;;;; -2478;PARENTHESIZED DIGIT FIVE;No;0;EN;<compat> 0028 0035 0029;;5;5;N;;;;; -2479;PARENTHESIZED DIGIT SIX;No;0;EN;<compat> 0028 0036 0029;;6;6;N;;;;; -247A;PARENTHESIZED DIGIT SEVEN;No;0;EN;<compat> 0028 0037 0029;;7;7;N;;;;; -247B;PARENTHESIZED DIGIT EIGHT;No;0;EN;<compat> 0028 0038 0029;;8;8;N;;;;; -247C;PARENTHESIZED DIGIT NINE;No;0;EN;<compat> 0028 0039 0029;;9;9;N;;;;; -247D;PARENTHESIZED NUMBER TEN;No;0;EN;<compat> 0028 0031 0030 0029;;;10;N;;;;; -247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN;<compat> 0028 0031 0031 0029;;;11;N;;;;; -247F;PARENTHESIZED NUMBER TWELVE;No;0;EN;<compat> 0028 0031 0032 0029;;;12;N;;;;; -2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN;<compat> 0028 0031 0033 0029;;;13;N;;;;; -2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN;<compat> 0028 0031 0034 0029;;;14;N;;;;; -2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN;<compat> 0028 0031 0035 0029;;;15;N;;;;; -2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN;<compat> 0028 0031 0036 0029;;;16;N;;;;; -2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN;<compat> 0028 0031 0037 0029;;;17;N;;;;; -2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN;<compat> 0028 0031 0038 0029;;;18;N;;;;; -2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN;<compat> 0028 0031 0039 0029;;;19;N;;;;; -2487;PARENTHESIZED NUMBER TWENTY;No;0;EN;<compat> 0028 0032 0030 0029;;;20;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;; 2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; 2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; 248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; @@ -6620,7 +7607,7 @@ 24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD 24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE 24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF -24EA;CIRCLED DIGIT ZERO;No;0;EN;<circle> 0030;;0;0;N;;;;; +24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;; 24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; 24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; 24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; @@ -6922,6 +7909,7 @@ 2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; 2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; 2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; 2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; 261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; 261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; @@ -7023,6 +8011,8 @@ 267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; 267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; 267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; 2680;DIE FACE-1;So;0;ON;;;;;N;;;;; 2681;DIE FACE-2;So;0;ON;;;;;N;;;;; 2682;DIE FACE-3;So;0;ON;;;;;N;;;;; @@ -7041,8 +8031,51 @@ 268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; 2690;WHITE FLAG;So;0;ON;;;;;N;;;;; 2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; 26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; 26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; 2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; 2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; 2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; @@ -7217,6 +8250,18 @@ 27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; 27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; 27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; 27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; 27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; 27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; @@ -7245,6 +8290,10 @@ 27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; 27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; 27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; 27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; 27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; 27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; @@ -7261,262 +8310,262 @@ 27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; -2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;; -2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;; -2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;; -2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;; -2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;; -2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;; -2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;; -2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;; -2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;; -2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;; -280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;; -280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;; -280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;; -280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;; -280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;; -280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;; -2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;; -2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;; -2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;; -2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;; -2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;; -2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;; -2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;; -2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;; -2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;; -2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;; -281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;; -281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;; -281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;; -281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;; -281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;; -281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;; -2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;; -2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;; -2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;; -2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;; -2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;; -2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;; -2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;; -2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;; -2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;; -2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;; -282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;; -282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;; -282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;; -282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;; -282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;; -282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;; -2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;; -2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;; -2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;; -2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;; -2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;; -2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;; -2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;; -2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;; -2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;; -2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;; -283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;; -283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;; -283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;; -283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;; -283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;; -283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;; -2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;; -2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;; -2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;; -2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;; -2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;; -2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;; -2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;; -2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;; -2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;; -2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;; -284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;; -284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;; -284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;; -284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;; -284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;; -284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;; -2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;; -2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;; -2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;; -2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;; -2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;; -2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;; -2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;; -2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;; -2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;; -2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;; -285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;; -285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;; -285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;; -285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;; -285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;; -285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;; -2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;; -2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;; -2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;; -2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;; -2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;; -2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;; -2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;; -2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;; -2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;; -2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;; -286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;; -286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;; -286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;; -286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;; -286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;; -286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;; -2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;; -2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;; -2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;; -2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;; -2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;; -2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;; -2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;; -2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;; -2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;; -2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;; -287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;; -287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;; -287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;; -287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;; -287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;; -287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;; -2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;; -2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;; -2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;; -2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;; -2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;; -2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;; -2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;; -2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;; -2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;; -2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;; -288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;; -288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;; -288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;; -288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;; -288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;; -288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;; -2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;; -2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;; -2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;; -2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;; -2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;; -2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;; -2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;; -2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;; -2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;; -2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;; -289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;; -289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;; -289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;; -289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;; -289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;; -289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;; -28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;; -28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;; -28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;; -28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;; -28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;; -28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;; -28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;; -28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;; -28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;; -28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;; -28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;; -28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;; -28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;; -28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;; -28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;; -28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;; -28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;; -28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;; -28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;; -28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;; -28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;; -28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;; -28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;; -28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;; -28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;; -28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;; -28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;; -28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;; -28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;; -28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;; -28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;; -28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;; -28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;; -28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;; -28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;; -28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;; -28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;; -28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;; -28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;; -28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;; -28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;; -28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;; -28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;; -28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;; -28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;; -28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;; -28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;; -28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;; -28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;; -28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;; -28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;; -28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;; -28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;; -28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;; -28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;; -28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;; -28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;; -28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;; -28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;; -28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;; -28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;; -28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;; -28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;; -28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;; -28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;; -28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;; -28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;; -28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;; -28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;; -28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;; -28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;; -28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;; -28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;; -28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;; -28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;; -28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;; -28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;; -28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;; -28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;; -28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;; -28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;; -28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;; -28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;; -28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;; -28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;; -28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;; -28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;; -28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;; -28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;; -28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;; -28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;; -28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;; -28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;; -28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;; -28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;; -28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; 2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; @@ -8043,6 +9092,564 @@ 2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5 +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; 2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; 2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; 2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; @@ -8632,7 +10239,7 @@ 30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; 30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; 30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; -30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; 30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; 30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; 30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; @@ -8677,6 +10284,7 @@ 312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; 312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; 312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; 3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;; 3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; 3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; @@ -8811,6 +10419,42 @@ 31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; 31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; 31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; 31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; 31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; 31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; @@ -8940,6 +10584,7 @@ 327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;; 327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;; 327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;; 327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; 3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;; 3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;; @@ -9391,7 +11036,7 @@ 4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; 4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; 4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; -9FA5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; +9FC3;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; @@ -9413,7 +11058,7 @@ A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; -A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; @@ -10612,6 +12257,879 @@ A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; @@ -10729,7 +13247,7 @@ F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; -F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; @@ -10737,12 +13255,12 @@ F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; -F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; -F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; @@ -10800,7 +13318,7 @@ F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; -F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; @@ -10831,9 +13349,9 @@ F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; -F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; -F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; @@ -10875,7 +13393,7 @@ F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; -F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; @@ -10983,6 +13501,112 @@ FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;; FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;; FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;; @@ -11007,7 +13631,7 @@ FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;; FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;; FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;; FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;; -FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET;<font> 002B;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;; FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; @@ -11652,10 +14276,23 @@ FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;; FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; @@ -11696,19 +14333,19 @@ FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;; FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;; FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;; FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;; -FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;N;SMALL OPENING PARENTHESIS;;;; -FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;N;SMALL CLOSING PARENTHESIS;;;; -FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;N;SMALL OPENING CURLY BRACKET;;;; -FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;; -FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;; -FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;; FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;; FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;; -FE62;SMALL PLUS SIGN;Sm;0;ET;<small> 002B;;;;N;;;;; -FE63;SMALL HYPHEN-MINUS;Pd;0;ET;<small> 002D;;;;N;;;;; -FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;N;;;;; -FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;; FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;; FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;; FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;; @@ -11865,11 +14502,11 @@ FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;; FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;; -FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET;<wide> 002B;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;; FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; -FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET;<wide> 002D;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;; FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; -FF0F;FULLWIDTH SOLIDUS;Po;0;ES;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;; FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;; FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;; @@ -11955,7 +14592,7 @@ FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGR FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;; -FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON;<narrow> 30FB;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;; FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;; FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;; FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;; @@ -12080,9 +14717,9 @@ FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;; FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;; FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;; FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;; -FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;; -FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;; -FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; @@ -12353,6 +14990,217 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; 1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; 1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; 10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; 10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; 10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; @@ -12405,7 +15253,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; 1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; 10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; -10341;GOTHIC LETTER NINETY;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; 10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; 10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; 10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; @@ -12414,7 +15262,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; 10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; 10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; -1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; 10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; 10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; 10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; @@ -12446,6 +15294,56 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; 1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; 1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; 10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; 10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; 10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; @@ -12669,6 +15567,1107 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; 1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; 1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; 1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; 1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; 1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; @@ -12954,6 +16953,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; 1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; 1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; 1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; 1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; 1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; @@ -13134,12 +17134,82 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; 1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; 1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; -1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; -1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; -1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; -1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; -1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;; 1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; 1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; 1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; @@ -13221,6 +17291,24 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; 1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; 1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; 1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; @@ -13873,6 +17961,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;; 1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; 1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; 1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; @@ -13924,7 +18014,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -13982,7 +18072,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -14040,7 +18130,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -14098,7 +18188,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; @@ -14156,13 +18246,15 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; -1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;; 1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; 1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; 1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; 1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;; 1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; 1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; 1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; @@ -14213,6 +18305,150 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; 1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; 1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; 20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; 2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;; 2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; @@ -14359,7 +18595,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; 2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; 2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; -2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; 2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; 2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; 2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; diff --git a/make/tools/UnicodeData/VERSION b/make/tools/UnicodeData/VERSION new file mode 100644 index 0000000000000000000000000000000000000000..831446cbd27a6de403344b21c9fa93a25357f43d --- /dev/null +++ b/make/tools/UnicodeData/VERSION @@ -0,0 +1 @@ +5.1.0 diff --git a/src/share/bin/emessages.h b/src/share/bin/emessages.h index 311a8fa61ce3bb5aa3f07d2c2592c1cf50f7de4a..dfb95a6d25ac77230070aa6d467a192443fadd6f 100644 --- a/src/share/bin/emessages.h +++ b/src/share/bin/emessages.h @@ -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 --git a/src/share/bin/java.c b/src/share/bin/java.c index 0feafc1ed41334485e7cb15c92f730acc44dbcc4..1801633fe5d440f255b6c9966e72587d372e2126 100644 --- a/src/share/bin/java.c +++ b/src/share/bin/java.c @@ -915,8 +915,14 @@ SelectVersion(int argc, char **argv, char **main_class) * 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 --git a/src/share/classes/com/sun/awt/AWTUtilities.java b/src/share/classes/com/sun/awt/AWTUtilities.java index 818ac6f53e0bf9452dae3b0d641d07f1b0cb467f..bf0628b4712219a93f00bcbf1bce084e59ebc7e1 100644 --- a/src/share/classes/com/sun/awt/AWTUtilities.java +++ b/src/share/classes/com/sun/awt/AWTUtilities.java @@ -1,5 +1,5 @@ /* - * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 @@ -26,17 +26,37 @@ package com.sun.awt; import java.awt.*; -import sun.awt.AWTAccessor; +import sun.awt.AWTAccessor; +import sun.awt.SunToolkit; /** * A collection of utility methods for AWT. * * The functionality provided by the static methods of the class includes: * <ul> + * <li>Setting shapes on top-level windows + * <li>Setting a constant alpha value for each pixel of a top-level window + * <li>Making a window non-opaque, after that it paints only explicitly + * painted pixels on the screen, with arbitrary alpha values for every pixel. * <li>Setting a 'mixing-cutout' shape for a component. * </ul> * <p> + * A "top-level window" is an instance of the {@code Window} class (or its + * descendant, such as {@code JFrame}). + * <p> + * Some of the mentioned features may not be supported by the native platform. + * To determine whether a particular feature is supported, the user must use + * the {@code isTranslucencySupported()} method of the class passing a desired + * translucency kind (a member of the {@code Translucency} enum) as an + * argument. + * <p> + * The per-pixel alpha feature also requires the user to create her/his + * windows using a translucency-capable graphics configuration. + * The {@code isTranslucencyCapable()} method must + * be used to verify whether any given GraphicsConfiguration supports + * the trasnlcency effects. + * <p> * <b>WARNING</b>: This class is an implementation detail and only meant * for limited use outside of the core platform. This API may change * drastically between update release, and it may even be @@ -50,6 +70,344 @@ public final class AWTUtilities { private AWTUtilities() { } + /** Kinds of translucency supported by the underlying system. + * @see #isTranslucencySupported + */ + public static enum Translucency { + /** + * Represents support in the underlying system for windows each pixel + * of which is guaranteed to be either completely opaque, with + * an alpha value of 1.0, or completely transparent, with an alpha + * value of 0.0. + */ + PERPIXEL_TRANSPARENT, + + /** + * Represents support in the underlying system for windows all of + * the pixels of which have the same alpha value between or including + * 0.0 and 1.0. + */ + TRANSLUCENT, + + /** + * Represents support in the underlying system for windows that + * contain or might contain pixels with arbitrary alpha values + * between and including 0.0 and 1.0. + */ + PERPIXEL_TRANSLUCENT; + } + + + /** + * Returns whether the given level of translucency is supported by + * the underlying system. + * + * Note that this method may sometimes return the value + * indicating that the particular level is supported, but + * the native windowing system may still not support the + * given level of translucency (due to the bugs in + * the windowing system). + * + * @param translucencyKind a kind of translucency support + * (either PERPIXEL_TRANSPARENT, + * TRANSLUCENT, or PERPIXEL_TRANSLUCENT) + * @return whether the given translucency kind is supported + */ + public static boolean isTranslucencySupported(Translucency translucencyKind) { + switch (translucencyKind) { + case PERPIXEL_TRANSPARENT: + return isWindowShapingSupported(); + case TRANSLUCENT: + return isWindowOpacitySupported(); + case PERPIXEL_TRANSLUCENT: + return isWindowTranslucencySupported(); + } + return false; + } + + + /** + * Returns whether the windowing system supports changing the opacity + * value of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * translucency (due to the bugs in the windowing system). + */ + private static boolean isWindowOpacitySupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowOpacitySupported(); + } + + /** + * Set the opacity of the window. The opacity is at the range [0..1]. + * Note that setting the opacity level of 0 may or may not disable + * the mouse event handling on this window. This is + * a platform-dependent behavior. + * + * In order for this method to enable the translucency effect, + * the isTranslucencySupported() method should indicate that the + * TRANSLUCENT level of translucency is supported. + * + * <p>Also note that the window must not be in the full-screen mode + * when setting the opacity value < 1.0f. Otherwise + * the IllegalArgumentException is thrown. + * + * @param window the window to set the opacity level to + * @param opacity the opacity level to set to the window + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the opacity is out of + * the range [0..1] + * @throws IllegalArgumentException if the window is in full screen mode, + * and the opacity is less than 1.0f + * @throws UnsupportedOperationException if the TRANSLUCENT translucency + * kind is not supported + */ + public static void setWindowOpacity(Window window, float opacity) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + + AWTAccessor.getWindowAccessor().setOpacity(window, opacity); + } + + /** + * Get the opacity of the window. If the opacity has not + * yet being set, this method returns 1.0. + * + * @param window the window to get the opacity level from + * @throws NullPointerException if the window argument is null + */ + public static float getWindowOpacity(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + + return AWTAccessor.getWindowAccessor().getOpacity(window); + } + + /** + * Returns whether the windowing system supports changing the shape + * of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * shaping (due to the bugs in the windowing system). + */ + public static boolean isWindowShapingSupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowShapingSupported(); + } + + /** + * Returns an object that implements the Shape interface and represents + * the shape previously set with the call to the setWindowShape() method. + * If no shape has been set yet, or the shape has been reset to null, + * this method returns null. + * + * @param window the window to get the shape from + * @return the current shape of the window + * @throws NullPointerException if the window argument is null + */ + public static Shape getWindowShape(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + return AWTAccessor.getWindowAccessor().getShape(window); + } + + /** + * Sets a shape for the given window. + * If the shape argument is null, this methods restores + * the default shape making the window rectangular. + * <p>Note that in order to set a shape, the window must be undecorated. + * If the window is decorated, this method ignores the {@code shape} + * argument and resets the shape to null. + * <p>Also note that the window must not be in the full-screen mode + * when setting a non-null shape. Otherwise the IllegalArgumentException + * is thrown. + * <p>Depending on the platform, the method may return without + * effecting the shape of the window if the window has a non-null warning + * string ({@link Window#getWarningString()}). In this case the passed + * shape object is ignored. + * + * @param window the window to set the shape to + * @param shape the shape to set to the window + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the window is in full screen mode, + * and the shape is not null + * @throws UnsupportedOperationException if the PERPIXEL_TRANSPARENT + * translucency kind is not supported + */ + public static void setWindowShape(Window window, Shape shape) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + AWTAccessor.getWindowAccessor().setShape(window, shape); + } + + private static boolean isWindowTranslucencySupported() { + /* + * Per-pixel alpha is supported if all the conditions are TRUE: + * 1. The toolkit is a sort of SunToolkit + * 2. The toolkit supports translucency in general + * (isWindowTranslucencySupported()) + * 3. There's at least one translucency-capable + * GraphicsConfiguration + */ + + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + + if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) { + return false; + } + + GraphicsEnvironment env = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + + // If the default GC supports translucency return true. + // It is important to optimize the verification this way, + // see CR 6661196 for more details. + if (isTranslucencyCapable(env.getDefaultScreenDevice() + .getDefaultConfiguration())) + { + return true; + } + + // ... otherwise iterate through all the GCs. + GraphicsDevice[] devices = env.getScreenDevices(); + + for (int i = 0; i < devices.length; i++) { + GraphicsConfiguration[] configs = devices[i].getConfigurations(); + for (int j = 0; j < configs.length; j++) { + if (isTranslucencyCapable(configs[j])) { + return true; + } + } + } + + return false; + } + + /** + * Enables the per-pixel alpha support for the given window. + * Once the window becomes non-opaque (the isOpaque is set to false), + * the drawing sub-system is starting to respect the alpha value of each + * separate pixel. If a pixel gets painted with alpha color component + * equal to zero, it becomes visually transparent, if the alpha of the + * pixel is equal to 255, the pixel is fully opaque. Interim values + * of the alpha color component make the pixel semi-transparent (i.e. + * translucent). + * <p>Note that in order for the window to support the per-pixel alpha + * mode, the window must be created using the GraphicsConfiguration + * for which the {@link #isTranslucencyCapable} + * method returns true. + * <p>Also note that some native systems enable the per-pixel translucency + * mode for any window created using the translucency-compatible + * graphics configuration. However, it is highly recommended to always + * invoke the setWindowOpaque() method for these windows, at least for + * the sake of cross-platform compatibility reasons. + * <p>Also note that the window must not be in the full-screen mode + * when making it non-opaque. Otherwise the IllegalArgumentException + * is thrown. + * <p>If the window is a {@code Frame} or a {@code Dialog}, the window must + * be undecorated prior to enabling the per-pixel translucency effect (see + * {@link Frame#setUndecorated()} and/or {@link Dialog#setUndecorated()}). + * If the window becomes decorated through a subsequent call to the + * corresponding {@code setUndecorated()} method, the per-pixel + * translucency effect will be disabled and the opaque property reset to + * {@code true}. + * <p>Depending on the platform, the method may return without + * effecting the opaque property of the window if the window has a non-null + * warning string ({@link Window#getWarningString()}). In this case + * the passed 'isOpaque' value is ignored. + * + * @param window the window to set the shape to + * @param isOpaque whether the window must be opaque (true), + * or translucent (false) + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the window uses + * a GraphicsConfiguration for which the + * {@code isTranslucencyCapable()} + * method returns false + * @throws IllegalArgumentException if the window is in full screen mode, + * and the isOpaque is false + * @throws IllegalArgumentException if the window is decorated and the + * isOpaque argument is {@code false}. + * @throws UnsupportedOperationException if the PERPIXEL_TRANSLUCENT + * translucency kind is not supported + */ + public static void setWindowOpaque(Window window, boolean isOpaque) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + if (!isOpaque && !isTranslucencySupported(Translucency.PERPIXEL_TRANSLUCENT)) { + throw new UnsupportedOperationException( + "The PERPIXEL_TRANSLUCENT translucency kind is not supported"); + } + AWTAccessor.getWindowAccessor().setOpaque(window, isOpaque); + } + + /** + * Returns whether the window is opaque or translucent. + * + * @param window the window to set the shape to + * @return whether the window is currently opaque (true) + * or translucent (false) + * @throws NullPointerException if the window argument is null + */ + public static boolean isWindowOpaque(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + + return AWTAccessor.getWindowAccessor().isOpaque(window); + } + + /** + * Verifies whether a given GraphicsConfiguration supports + * the PERPIXEL_TRANSLUCENT kind of translucency. + * All windows that are intended to be used with the {@link #setWindowOpaque} + * method must be created using a GraphicsConfiguration for which this method + * returns true. + * <p>Note that some native systems enable the per-pixel translucency + * mode for any window created using a translucency-capable + * graphics configuration. However, it is highly recommended to always + * invoke the setWindowOpaque() method for these windows, at least + * for the sake of cross-platform compatibility reasons. + * + * @param gc GraphicsConfiguration + * @throws NullPointerException if the gc argument is null + * @return whether the given GraphicsConfiguration supports + * the translucency effects. + */ + public static boolean isTranslucencyCapable(GraphicsConfiguration gc) { + if (gc == null) { + throw new NullPointerException("The gc argument should not be null"); + } + /* + return gc.isTranslucencyCapable(); + */ + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isTranslucencyCapable(gc); + } + /** * Sets a 'mixing-cutout' shape for the given component. * diff --git a/src/share/classes/com/sun/awt/SecurityWarning.java b/src/share/classes/com/sun/awt/SecurityWarning.java new file mode 100644 index 0000000000000000000000000000000000000000..46dea38548d0ffb2344057cd23793842b5d77497 --- /dev/null +++ b/src/share/classes/com/sun/awt/SecurityWarning.java @@ -0,0 +1,169 @@ +/* + * Copyright 2008-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 com.sun.awt; + +import java.awt.*; +import java.awt.geom.*; + +import sun.awt.AWTAccessor; + + +/** + * Security Warning control interface. + * + * This class provides a couple of methods that help a developer relocate + * the AWT security warning to an appropriate position relative to the current + * window size. A "top-level window" is an instance of the {@code Window} + * class (or its descendant, such as {@code JFrame}). The security warning + * is applied to all windows created by an untrusted code. All such windows + * have a non-null "warning string" (see {@link Window#getWarningString()}). + * <p> + * <b>WARNING</b>: This class is an implementation detail and only meant + * for limited use outside of the core platform. This API may change + * drastically between update release, and it may even be + * removed or be moved to some other packages or classes. + */ +public final class SecurityWarning { + + /** + * The SecurityWarning class should not be instantiated + */ + private SecurityWarning() { + } + + /** + * Gets the size of the security warning. + * + * The returned value is not valid until the peer has been created. Before + * invoking this method a developer must call the {@link Window#pack()}, + * {@link Window#setVisible()}, or some other method that creates the peer. + * + * @param window the window to get the security warning size for + * + * @throws NullPointerException if the window argument is null + * @throws IllegalArgumentException if the window is trusted (i.e. + * the {@code getWarningString()} returns null) + */ + public static Dimension getSize(Window window) { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + if (window.getWarningString() == null) { + throw new IllegalArgumentException( + "The window must have a non-null warning string."); + } + // We don't check for a non-null peer since it may be destroyed + // after assigning a valid value to the security warning size. + + return AWTAccessor.getWindowAccessor().getSecurityWarningSize(window); + } + + /** + * Sets the position of the security warning. + * <p> + * The {@code alignmentX} and {@code alignmentY} arguments specify the + * origin of the coordinate system used to calculate the position of the + * security warning. The values must be in the range [0.0f...1.0f]. The + * {@code 0.0f} value represents the left (top) edge of the rectangular + * bounds of the window. The {@code 1.0f} value represents the right + * (bottom) edge of the bounds. Whenever the size of the window changes, + * the origin of the coordinate system gets relocated accordingly. For + * convenience a developer may use the {@code Component.*_ALIGNMENT} + * constants to pass predefined values for these arguments. + * <p> + * The {@code point} argument specifies the location of the security + * warning in the coordinate system described above. If both {@code x} and + * {@code y} coordinates of the point are equal to zero, the warning will + * be located right in the origin of the coordinate system. On the other + * hand, if both {@code alignmentX} and {@code alignmentY} are equal to + * zero (i.e. the origin of the coordinate system is placed at the top-left + * corner of the window), then the {@code point} argument represents the + * absolute location of the security warning relative to the location of + * the window. The "absolute" in this case means that the position of the + * security warning is not effected by resizing of the window. + * <p> + * Note that the security warning managment code guarantees that: + * <ul> + * <li>The security warning cannot be located farther than two pixels from + * the rectangular bounds of the window (see {@link Window#getBounds}), and + * <li>The security warning is always visible on the screen. + * </ul> + * If either of the conditions is violated, the calculated position of the + * security warning is adjusted by the system to meet both these + * conditions. + * <p> + * The default position of the security warning is in the upper-right + * corner of the window, two pixels to the right from the right edge. This + * corresponds to the following arguments passed to this method: + * <ul> + * <li>{@code alignmentX = Component.RIGHT_ALIGNMENT} + * <li>{@code alignmentY = Component.TOP_ALIGNMENT} + * <li>{@code point = (2, 0)} + * </ul> + * + * @param window the window to set the position of the security warning for + * @param alignmentX the horizontal origin of the coordinate system + * @param alignmentY the vertical origin of the coordinate system + * @param point the position of the security warning in the specified + * coordinate system + * + * @throws NullPointerException if the window argument is null + * @throws NullPointerException if the point argument is null + * @throws IllegalArgumentException if the window is trusted (i.e. + * the {@code getWarningString()} returns null + * @throws IllegalArgumentException if the alignmentX or alignmentY + * arguments are not within the range [0.0f ... 1.0f] + */ + public static void setPosition(Window window, Point2D point, + float alignmentX, float alignmentY) + { + if (window == null) { + throw new NullPointerException( + "The window argument should not be null."); + } + if (window.getWarningString() == null) { + throw new IllegalArgumentException( + "The window must have a non-null warning string."); + } + if (point == null) { + throw new NullPointerException( + "The point argument must not be null"); + } + if (alignmentX < 0.0f || alignmentX > 1.0f) { + throw new IllegalArgumentException( + "alignmentX must be in the range [0.0f ... 1.0f]."); + } + if (alignmentY < 0.0f || alignmentY > 1.0f) { + throw new IllegalArgumentException( + "alignmentY must be in the range [0.0f ... 1.0f]."); + } + + AWTAccessor.getWindowAccessor().setSecurityWarningPosition(window, + point, alignmentX, alignmentY); + } +} + diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java b/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java index 850aa154b83d58876eb1e099dd9d910272fa2ccb..23df1928fd4942f6b2944eaadb1c9a2afc8c2f70 100644 --- a/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java +++ b/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java @@ -279,20 +279,22 @@ class GTKIconFactory { public void paintIcon(SynthContext context, Graphics g, int x, int y, int w, int h) { - JToolBar toolbar = (JToolBar)context.getComponent(); - Orientation orientation = - (toolbar.getOrientation() == JToolBar.HORIZONTAL ? - Orientation.HORIZONTAL : Orientation.VERTICAL); - - if (style == null) { - style = SynthLookAndFeel.getStyleFactory().getStyle( - context.getComponent(), GTKRegion.HANDLE_BOX); - } - context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX, - style, SynthConstants.ENABLED); + if (context != null) { + JToolBar toolbar = (JToolBar)context.getComponent(); + Orientation orientation = + (toolbar.getOrientation() == JToolBar.HORIZONTAL ? + Orientation.HORIZONTAL : Orientation.VERTICAL); + + if (style == null) { + style = SynthLookAndFeel.getStyleFactory().getStyle( + context.getComponent(), GTKRegion.HANDLE_BOX); + } + context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX, + style, SynthConstants.ENABLED); - GTKPainter.INSTANCE.paintIcon(context, g, - getMethod(), x, y, w, h, orientation); + GTKPainter.INSTANCE.paintIcon(context, g, + getMethod(), x, y, w, h, orientation); + } } public int getIconWidth(SynthContext context) { @@ -336,12 +338,14 @@ class GTKIconFactory { public void paintIcon(SynthContext context, Graphics g, int x, int y, int w, int h) { - ArrowType arrowDir = ArrowType.RIGHT; - if (!context.getComponent().getComponentOrientation().isLeftToRight()) { - arrowDir = ArrowType.LEFT; + if (context != null) { + ArrowType arrowDir = ArrowType.RIGHT; + if (!context.getComponent().getComponentOrientation().isLeftToRight()) { + arrowDir = ArrowType.LEFT; + } + GTKPainter.INSTANCE.paintIcon(context, g, + getMethod(), x, y, w, h, arrowDir); } - GTKPainter.INSTANCE.paintIcon(context, g, - getMethod(), x, y, w, h, arrowDir); } } } diff --git a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java index 57af97958dd0646a431aeed8b22135bf66ddfc2e..79d06782e8b4b3cdabae0464904dedb89915b982 100644 --- a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java +++ b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java @@ -39,6 +39,8 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.*; +import java.security.AccessController; +import java.security.PrivilegedAction; import sun.awt.shell.ShellFolder; import sun.awt.OSInfo; @@ -1143,7 +1145,11 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { File[] baseFolders; if (useShellFolder) { - baseFolders = (File[])ShellFolder.get("fileChooserComboBoxFolders"); + baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { + public File[] run() { + return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); + } + }); } else { baseFolders = fsv.getRoots(); } diff --git a/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java b/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java index cb94371fdc99705570da591ff9072095b33c9633..e10773aca7a67d459ea3778ce75efb217f24d8cc 100644 --- a/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java +++ b/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java @@ -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.List; 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 @@ import com.sun.jmx.remote.util.EnvHelp; public abstract class ClientNotifForwarder { - public ClientNotifForwarder(Map<String, ?> env) { + + private final AccessControlContext acc; + + public ClientNotifForwarder(Map env) { this(null, env); } @@ -87,6 +90,8 @@ public abstract class ClientNotifForwarder { this.command = command; if (thread == null) { thread = new Thread() { + + @Override public void run() { while (true) { Runnable r; @@ -130,6 +135,7 @@ public abstract class ClientNotifForwarder { this.defaultClassLoader = defaultClassLoader; this.executor = ex; + this.acc = AccessController.getContext(); } /** @@ -380,28 +386,85 @@ public abstract class ClientNotifForwarder { 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<ClassLoader>() { + 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<Void>() { - public Void run() { - Thread.currentThread(). - setContextClassLoader(defaultClassLoader); - return null; - } - }); - } NotificationResult nr = null; if (!shouldStop() && (nr = fetchNotifs()) != null) { @@ -434,8 +497,9 @@ public abstract class ClientNotifForwarder { // 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 @@ public abstract class ClientNotifForwarder { private long clientSequenceNumber = -1; private final int maxNotifications; private final long timeout; - private Integer mbeanRemovedNotifID = null; - private Thread currentFetchThread; // state diff --git a/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java b/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java index d75f829c321947165698a6fc60bfafa2acd14c3c..71e6f6ff0198cb24416818779318e39d7b1b7ec2 100644 --- a/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java +++ b/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java @@ -111,6 +111,22 @@ public abstract class MBeanServerAccessController */ 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 @@ public abstract class MBeanServerAccessController } /** - * Call <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, ObjectName name) @@ -158,7 +174,7 @@ public abstract class MBeanServerAccessController MBeanRegistrationException, MBeanException, NotCompliantMBeanException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className); @@ -170,7 +186,7 @@ public abstract class MBeanServerAccessController } /** - * Call <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, ObjectName name, @@ -181,7 +197,7 @@ public abstract class MBeanServerAccessController MBeanRegistrationException, MBeanException, NotCompliantMBeanException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className, @@ -196,7 +212,7 @@ public abstract class MBeanServerAccessController } /** - * Call <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, @@ -209,7 +225,7 @@ public abstract class MBeanServerAccessController MBeanException, NotCompliantMBeanException, InstanceNotFoundException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className, @@ -222,7 +238,7 @@ public abstract class MBeanServerAccessController } /** - * Call <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, then forward this method to the * wrapped object. */ public ObjectInstance createMBean(String className, @@ -237,7 +253,7 @@ public abstract class MBeanServerAccessController MBeanException, NotCompliantMBeanException, InstanceNotFoundException { - checkWrite(); + checkCreate(className); SecurityManager sm = System.getSecurityManager(); if (sm == null) { Object object = getMBeanServer().instantiate(className, @@ -394,45 +410,45 @@ public abstract class MBeanServerAccessController } /** - * Call <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, then forward this method to the * wrapped object. */ public Object instantiate(String className) throws ReflectionException, MBeanException { - checkWrite(); + checkCreate(className); return getMBeanServer().instantiate(className); } /** - * Call <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, 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 <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, 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 <code>checkWrite()</code>, then forward this method to the + * Call <code>checkCreate(className)</code>, 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 @@ public abstract class MBeanServerAccessController } /** - * Call <code>checkWrite()</code>, then forward this method to the + * Call <code>checkUnregister()</code>, then forward this method to the * wrapped object. */ public void unregisterMBean(ObjectName name) throws InstanceNotFoundException, MBeanRegistrationException { - checkWrite(); + checkUnregister(name); getMBeanServer().unregisterMBean(name); } diff --git a/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java b/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java index 66c78f2775eda63860b0033692b3051414dac47e..a753e3a09ba03f27d72907768411de7500f2444c 100644 --- a/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java +++ b/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java @@ -31,11 +31,17 @@ import java.security.AccessControlContext; 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 @@ import javax.security.auth.Subject; * not allowed; in this case the request is not forwarded to the * wrapped object.</p> * - * <p>This class implements the {@link #checkRead()} and {@link #checkWrite()} + * <p>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 @@ import javax.security.auth.Subject; * has exactly one access level. The same access level can be shared by several * usernames.</p> * - * <p>The supported access level values are <i>readonly</i> and - * <i>readwrite</i>.</p> + * <p>The supported access level values are {@code readonly} and + * {@code readwrite}. The {@code readwrite} access level can be + * qualified by one or more <i>clauses</i>, where each clause looks + * like <code>create <i>classNamePattern</i></code> or {@code + * unregister}. For example:</p> + * + * <pre> + * monitorRole readonly + * controlRole readwrite \ + * create javax.management.timer.*,javax.management.monitor.* \ + * unregister + * </pre> + * + * <p>(The continuation lines with {@code \} come from the parser for + * Properties files.)</p> */ 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<String> 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]; + } /** * <p>Create a new MBeanServerAccessController that forwards all the @@ -87,8 +130,8 @@ public class MBeanServerFileAccessController throws IOException { super(); this.accessFileName = accessFileName; - props = propertiesFromFile(accessFileName); - checkValues(props); + Properties props = propertiesFromFile(accessFileName); + parseProperties(props); } /** @@ -123,14 +166,14 @@ public class MBeanServerFileAccessController * #setMBeanServer} method after doing access checks based on read and * write permissions.</p> * - * <p>This instance is initialized from the specified properties instance. - * This constructor makes a copy of the properties instance using its - * <code>clone</code> 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 - * <code>MBeanServerFileAccessController</code> will make a new copy of the - * properties object at that time.</p> + * <p>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 + * <code>MBeanServerFileAccessController</code> will make a new + * copy of the properties object at that time.</p> * * @param accessFileProps properties list containing the username/access * level entries. @@ -145,8 +188,7 @@ public class MBeanServerFileAccessController if (accessFileProps == null) throw new IllegalArgumentException("Null properties"); originalProps = accessFileProps; - props = (Properties) accessFileProps.clone(); - checkValues(props); + parseProperties(accessFileProps); } /** @@ -155,14 +197,14 @@ public class MBeanServerFileAccessController * #setMBeanServer} method after doing access checks based on read and * write permissions.</p> * - * <p>This instance is initialized from the specified properties instance. - * This constructor makes a copy of the properties instance using its - * <code>clone</code> 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 - * <code>MBeanServerFileAccessController</code> will make a new copy of the - * properties object at that time.</p> + * <p>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 + * <code>MBeanServerFileAccessController</code> will make a new + * copy of the properties object at that time.</p> * * @param accessFileProps properties list containing the username/access * level entries. @@ -184,16 +226,36 @@ public class MBeanServerFileAccessController * 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 @@ public class MBeanServerFileAccessController * @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 @@ public class MBeanServerFileAccessController } } - 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<Subject>() { @@ -249,39 +310,235 @@ public class MBeanServerFileAccessController } }); if (s == null) return; /* security has not been enabled */ - final Set<Principal> 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 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<String, Access>(); + for (Map.Entry<Object, Object> entry : props.entrySet()) { + String identity = (String) entry.getKey(); + String accessString = (String) entry.getValue(); + Access access = Parser.parseAccess(identity, accessString); + accessMap.put(identity, access); + } } - 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 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<String> createClasses = new ArrayList<String>(); + 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<String> 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 Properties props; + private Map<String, Access> accessMap; private Properties originalProps; private String accessFileName; } diff --git a/src/share/classes/com/sun/jndi/ldap/LdapCtx.java b/src/share/classes/com/sun/jndi/ldap/LdapCtx.java index bec6fd0e761f8cc5c091008ce17c472a35413ae7..5f9462c593172511980ec9de87adc719feab5889 100644 --- a/src/share/classes/com/sun/jndi/ldap/LdapCtx.java +++ b/src/share/classes/com/sun/jndi/ldap/LdapCtx.java @@ -302,7 +302,16 @@ final public class LdapCtx extends ComponentDirContext 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 --git a/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java b/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java index a4131166d30b59ae44fff97a5d0450e5e9f6f6bf..0f6a70e04c9e42d47dcc3848c0549042fcd0afde 100644 --- a/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java +++ b/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java @@ -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 @@ import java.security.PrivilegedAction; 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<String>() { + 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 --git a/src/share/classes/com/sun/nio/sctp/AbstractNotificationHandler.java b/src/share/classes/com/sun/nio/sctp/AbstractNotificationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..2d9afb711c2a2d709ba55cef921804ddf3f463fa --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/AbstractNotificationHandler.java @@ -0,0 +1,140 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * A skeletal handler that consumes notifications and continues. + * + * <P> This class trivially implements the {@code handleNotification} methods to + * return {@link HandlerResult#CONTINUE CONTINUE} so that all notifications are + * consumed and the channel continues to try and receive a message. + * + * <P> It also provides overloaded versions of the {@code handleNotification} + * methods, one for each of the required supported notification types, {@link + * AssociationChangeNotification}, {@link PeerAddressChangeNotification}, + * {@link SendFailedNotification}, and {@link ShutdownNotification}. The + * appropriate method will be invoked when the notification is received. + * + * @since 1.7 + */ +public class AbstractNotificationHandler<T> + implements NotificationHandler<T> +{ + /** + * Initializes a new instance of this class. + */ + protected AbstractNotificationHandler() {} + + /** + * Invoked when an implementation specific notification is received from the + * SCTP stack. + * + * @param notification + * The notification + * + * @param attachment + * The object attached to the {@code receive} operation when it was + * initiated. + * + * @return The handler result + */ + @Override + public HandlerResult handleNotification(Notification notification, + T attachment) { + return HandlerResult.CONTINUE; + } + + /** + * Invoked when an {@link AssociationChangeNotification} is received from + * the SCTP stack. + * + * @param notification + * The notification + * + * @param attachment + * The object attached to the {@code receive} operation when it was + * initiated. + * + * @return The handler result + */ + public HandlerResult handleNotification(AssociationChangeNotification notification, + T attachment) { + return HandlerResult.CONTINUE; + } + + /** + * Invoked when an {@link PeerAddressChangeNotification} is received from + * the SCTP stack. + * + * @param notification + * The notification + * + * @param attachment + * The object attached to the {@code receive} operation when it was + * initiated. + * + * @return The handler result + */ + public HandlerResult handleNotification(PeerAddressChangeNotification notification, + T attachment) { + return HandlerResult.CONTINUE; + } + + /** + * Invoked when an {@link SendFailedNotification} is received from + * the SCTP stack. + * + * @param notification + * The notification + * + * @param attachment + * The object attached to the {@code receive} operation when it was + * initiated. + * + * @return The handler result + */ + public HandlerResult handleNotification(SendFailedNotification notification, + T attachment) { + return HandlerResult.CONTINUE; + } + + /** + * Invoked when an {@link ShutdownNotification} is received from + * the SCTP stack. + * + * @param notification + * The notification + * + * @param attachment + * The object attached to the {@code receive} operation when it was + * initiated. + * + * @return The handler result + */ + public HandlerResult handleNotification(ShutdownNotification notification, + T attachment) { + return HandlerResult.CONTINUE; + } +} diff --git a/src/share/classes/com/sun/nio/sctp/Association.java b/src/share/classes/com/sun/nio/sctp/Association.java new file mode 100644 index 0000000000000000000000000000000000000000..a00bd126bb65e2945e0ab4a8d69f9a0236340bfb --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/Association.java @@ -0,0 +1,104 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * A class that represents an SCTP association. + * + * <P> An association exists between two SCTP endpoints. Each endpoint is + * represented by a list of transport addresses through which that endpoint can + * be reached and from which it will originate SCTP messages. The association + * spans over all of the possible source/destination combinations which may be + * generated from each endpoint's lists of addresses. + * + * <P> Associations are identified by their Association ID. + * Association ID's are guaranteed to be unique for the lifetime of the + * association. An association ID may be reused after the association has been + * shutdown. An association ID is not unique across multiple SCTP channels. + * An Association's local and remote addresses may change if the SCTP + * implementation supports <I>Dynamic Address Reconfiguration</I> as defined by + * <A HREF="http://tools.ietf.org/html/rfc5061">RFC5061</A>, see the + * {@code bindAddress} and {@code unbindAddress} methods of {@link SctpChannel}, + * {@link SctpServerChannel}, and {@link SctpMultiChannel}. + * + * <P> An {@code Association} is returned from an {@link + * SctpChannel#association SctpChannel} or an {@link + * SctpMultiChannel#associations SctpMultiChannel}, as well + * as being given as a parameter to {@link NotificationHandler + * NotificationHandler} methods. + * + * @since 1.7 + */ +public class Association { + private final int associationID; + private final int maxInStreams; + private final int maxOutStreams; + + /** + * Initializes a new instance of this class. + */ + protected Association(int associationID, + int maxInStreams, + int maxOutStreams) { + this.associationID = associationID; + this.maxInStreams = maxInStreams; + this.maxOutStreams = maxOutStreams; + } + + /** + * Returns the associationID. + * + * @return The association ID + */ + public final int associationID() { + return associationID; + }; + + /** + * Returns the maximum number of inbound streams that this association + * supports. + * + * <P> Data received on this association will be on stream number + * {@code s}, where {@code 0 <= s < maxInboundStreams()}. + * + * @return The maximum number of inbound streams + */ + public final int maxInboundStreams() { + return maxInStreams; + }; + + /** + * Returns the maximum number of outbound streams that this association + * supports. + * + * <P> Data sent on this association must be on stream number + * {@code s}, where {@code 0 <= s < maxOutboundStreams()}. + * + * @return The maximum number of outbound streams + */ + public final int maxOutboundStreams() { + return maxOutStreams; + }; +} diff --git a/src/share/classes/com/sun/nio/sctp/AssociationChangeNotification.java b/src/share/classes/com/sun/nio/sctp/AssociationChangeNotification.java new file mode 100644 index 0000000000000000000000000000000000000000..0262ffb8e607910436f61fcdddcfa32e624597d8 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/AssociationChangeNotification.java @@ -0,0 +1,92 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * Notification emitted when an association has either opened or closed. + * + * @since 1.7 + */ +public abstract class AssociationChangeNotification + implements Notification +{ + /** + * Defines the type of change event that happened to the association. + * + * @since 1.7 + */ + public enum AssocChangeEvent + { + /** + * A new association is now ready and data may be exchanged with this peer. + */ + COMM_UP, + + /** + * The association has failed. A series of SCTP send failed notifications + * will follow this notification, one for each outstanding message. + */ + COMM_LOST, + + /** + * SCTP has detected that the peer has restarted. + */ + RESTART, + + /** + * The association has gracefully closed. + */ + SHUTDOWN, + + /** + * The association failed to setup. If a message was sent on a {@link + * SctpMultiChannel} in non-blocking mode, an + * SCTP send failed notification will follow this notification for the + * outstanding message. + */ + CANT_START + } + + /** + * Initializes a new instance of this class. + */ + protected AssociationChangeNotification() {} + + /** + * Returns the association that this notification is applicable to. + * + * @return The association whose state has changed, or {@code null} if + * there is no association, that is {@linkplain + * AssocChangeEvent#CANT_START CANT_START} + */ + public abstract Association association(); + + /** + * Returns the type of change event. + * + * @return The event + */ + public abstract AssocChangeEvent event(); +} diff --git a/src/share/classes/com/sun/nio/sctp/HandlerResult.java b/src/share/classes/com/sun/nio/sctp/HandlerResult.java new file mode 100644 index 0000000000000000000000000000000000000000..5b5f8ec0f1953de82881530a11df9a9943cd4898 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/HandlerResult.java @@ -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. 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 com.sun.nio.sctp; + +/** + * Defines notification handler results. + * + * <P> The {@code HandlerResult} is used to determine the behavior of the + * channel after it handles a notification from the SCTP stack. Essentially its + * value determines if the channel should try to receive another notificaiton or + * a message before returning. + * + * @since 1.7 + */ +public enum HandlerResult { + /** + * Try to receieve another message or notification. + */ + CONTINUE, + + /** + * Return without trying to receive any more data. + */ + RETURN; +} diff --git a/src/share/classes/com/sun/nio/sctp/IllegalReceiveException.java b/src/share/classes/com/sun/nio/sctp/IllegalReceiveException.java new file mode 100644 index 0000000000000000000000000000000000000000..09d087e5643d96250573a599e9320f20ff651d80 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/IllegalReceiveException.java @@ -0,0 +1,49 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * Unchecked exception thrown when an attempt is made to invoke the + * {@code receive} method of {@link SctpChannel} or {@link SctpMultiChannel} + * from a notification handler. + * + * @since 1.7 + */ +public class IllegalReceiveException extends IllegalStateException { + private static final long serialVersionUID = 2296619040988576224L; + + /** + * Constructs an instance of this class. + */ + public IllegalReceiveException() { } + + /** + * Constructs an instance of this class with the specified message. + */ + public IllegalReceiveException(String msg) { + super(msg); + } +} + diff --git a/src/share/classes/com/sun/nio/sctp/IllegalUnbindException.java b/src/share/classes/com/sun/nio/sctp/IllegalUnbindException.java new file mode 100644 index 0000000000000000000000000000000000000000..c24025fc84bb5c40c7386869aeed285805d661b4 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/IllegalUnbindException.java @@ -0,0 +1,49 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * Unchecked exception thrown when an attempt is made to remove an + * address that is not bound to the channel, or remove an address from a + * channel that has only one address bound to it. + * + * @since 1.7 + */ +public class IllegalUnbindException extends IllegalStateException { + private static final long serialVersionUID = -310540883995532224L; + + /** + * Constructs an instance of this class. + */ + public IllegalUnbindException() { } + + /** + * Constructs an instance of this class with the specified detailed message. + */ + public IllegalUnbindException(String msg) { + super(msg); + } +} + diff --git a/src/share/classes/com/sun/nio/sctp/InvalidStreamException.java b/src/share/classes/com/sun/nio/sctp/InvalidStreamException.java new file mode 100644 index 0000000000000000000000000000000000000000..de2100fee50adbd36705fc682749a2dc35e00804 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/InvalidStreamException.java @@ -0,0 +1,48 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * Unchecked exception thrown when an attempt is made to send a + * message to an invalid stream. + * + * @since 1.7 + */ +public class InvalidStreamException extends IllegalArgumentException { + private static final long serialVersionUID = -9172703378046665558L; + + /** + * Constructs an instance of this class. + */ + public InvalidStreamException() { } + + /** + * Constructs an instance of this class with the specified detailed message. + */ + public InvalidStreamException(String msg) { + super(msg); + } +} + diff --git a/src/share/classes/com/sun/nio/sctp/MessageInfo.java b/src/share/classes/com/sun/nio/sctp/MessageInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..69c47cf3be1685882d3b0623f88de0c6be8a9315 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/MessageInfo.java @@ -0,0 +1,303 @@ +/* + * 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 com.sun.nio.sctp; + +import java.net.SocketAddress; + +/** + * The {@code MessageInfo} class provides additional ancillary information about + * messages. + * + * <P> Received SCTP messages, returned by + * {@link SctpChannel#receive SctpChannel.receive} and {@link + * SctpMultiChannel#receive SctpMultiChannel.receive}, + * return a {@code MessageInfo} instance that can be queried to determine + * ancillary information about the received message. Messages being sent should + * use one of the {@link #createOutgoing(java.net.SocketAddress,int) + * createOutgoing} methods to provide ancillary data for the message being + * sent, and may use the appropriate setter methods to override the default + * values provided for {@link #isUnordered() unordered}, {@link #timeToLive() + * timeToLive}, {@link #isComplete() complete} and {@link #payloadProtocolID() + * payloadProtocolID}, before sending the message. + * + * <P> For out going messages the {@code timeToLive} parameter is a time period + * that the sending side SCTP stack may expire the message if it has not been + * sent. This time period is an indication to the stack that the message is no + * longer required to be sent after the time period expires. It is not a hard + * timeout and may be influenced by whether the association supports the partial + * reliability extension, <a href=http://www.ietf.org/rfc/rfc3758.txt>RFC 3758 + * <a> + * + * <P> {@code MessageInfo} instances are not safe for use by multiple concurrent + * threads. If a MessageInfo is to be used by more than one thread then access + * to the MessageInfo should be controlled by appropriate synchronization. + * + * @since 1.7 + */ +public abstract class MessageInfo { + /** + * Initializes a new instance of this class. + */ + protected MessageInfo() {} + + /** + * Creates a {@code MessageInfo} instance suitable for use when + * sending a message. + * + * <P> The returned instance will have its {@link #isUnordered() unordered} + * value set to {@code false}, its {@link #timeToLive() timeToLive} value + * set to {@code 0}, its {@link #isComplete() complete} value set + * to {@code true}, and its {@link #payloadProtocolID() payloadProtocolID} + * value set to {@code 0}. These values, if required, can be set through + * the appropriate setter method before sending the message. + * + * @param address + * For a connected {@code SctpChannel} the address is the + * preferred peer address of the association to send the message + * to, or {@code null} to use the peer primary address. For an + * {@code SctpMultiChannel} the address is used to determine + * the association, or if no association exists with a peer of that + * address then one is setup. + * + * @param streamNumber + * The stream number that the message will be sent on + * + * @return The outgoing message info + * + * @throws IllegalArgumentException + * If the streamNumber is negative or greater than {@code 65536} + */ + public static MessageInfo createOutgoing(SocketAddress address, + int streamNumber) { + if (streamNumber < 0 || streamNumber > 65536) + throw new IllegalArgumentException("Invalid stream number"); + + return new sun.nio.ch.SctpMessageInfoImpl(null, address, streamNumber); + } + /** + * Creates a {@code MessageInfo} instance suitable for use when + * sending a message to a given association. Typically used for + * {@code SctpMultiChannel} when an association has already been setup. + * + * <P> The returned instance will have its {@link #isUnordered() unordered} + * value set to {@code false}, its {@link #timeToLive() timeToLive} value + * set to {@code 0}, its {@link #isComplete() complete} value set + * to {@code true}, and its {@link #payloadProtocolID() payloadProtocolID} + * value set to {@code 0}. These values, if required, can be set through + * the appropriate setter method before sending the message. + * + * @param association + * The association to send the message on + * + * @param address + * The preferred peer address of the association to send the message + * to, or {@code null} to use the peer primary address + * + * @param streamNumber + * The stream number that the message will be sent on. + * + * @return The outgoing message info + * + * @throws IllegalArgumentException + * If {@code association} is {@code null}, or the streamNumber is + * negative or greater than {@code 65536} + */ + public static MessageInfo createOutgoing(Association association, + SocketAddress address, + int streamNumber) { + if (association == null) + throw new IllegalArgumentException("association cannot be null"); + + if (streamNumber < 0 || streamNumber > 65536) + throw new IllegalArgumentException("Invalid stream number"); + + return new sun.nio.ch.SctpMessageInfoImpl(association, address, + streamNumber); + } + + /** + * Returns the source socket address if the message has been received, + * otherwise the preferred destination of the message to be sent. + * + * @return The socket address, or {@code null} if this instance is to be + * used for sending a message and has been construced without + * specifying a preferred destination address + * + */ + public abstract SocketAddress address(); + + /** + * Returns the association that the message was received on, if the message + * has been received, otherwise the association that the message is to be + * sent on. + * + * @return The association, or {@code null} if this instance is to be + * used for sending a message and has been construced using the + * the {@link #createOutgoing(SocketAddress,int) + * createOutgoing(SocketAddress,int)} static factory method + */ + public abstract Association association(); + + /** + * Returns the number of bytes read for the received message. + * + * <P> This method is only appicable for received messages, it has no + * meaning for messages being sent. + * + * @return The number of bytes read, {@code -1} if the channel is an {@link + * SctpChannel} that has reached end-of-stream, otherwise + * {@code 0} + */ + public abstract int bytes(); + + /** + * Tells whether or not the message is complete. + * + * <P> For received messages {@code true} indicates that the message was + * completely received. For messages being sent {@code true} indicates that + * the message is complete, {@code false} indicates that the message is not + * complete. How the send channel interprets this value depends on the value + * of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE + * SCTP_EXPLICIT_COMPLETE} socket option. + * + * @return {@code true} if, and only if, the message is complete + */ + public abstract boolean isComplete(); + + /** + * Sets whether or not the message is complete. + * + * <P> For messages being sent {@code true} indicates that + * the message is complete, {@code false} indicates that the message is not + * complete. How the send channel interprets this value depends on the value + * of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE + * SCTP_EXPLICIT_COMPLETE} socket option. + * + * @param complete + * {@code true} if, and only if, the message is complete + * + * @return This MessageInfo + * + * @see MessageInfo#isComplete() + */ + public abstract MessageInfo complete(boolean complete); + + /** + * Tells whether or not the message is unordered. For received messages + * {@code true} indicates that the message was sent non-ordered. For + * messages being sent {@code true} requests the un-ordered delivery of the + * message, {@code false} indicates that the message is ordered. + * + * @return {@code true} if the message is unordered, otherwise + * {@code false} + */ + public abstract boolean isUnordered(); + + /** + * Sets whether or not the message is unordered. + * + * @param unordered + * {@code true} requests the un-ordered delivery of the message, + * {@code false} indicates that the message is ordered. + * + * @return This MessageInfo + * + * @see MessageInfo#isUnordered() + */ + public abstract MessageInfo unordered(boolean unordered); + + /** + * Returns the payload protocol Identifier. + * + * <P> A value indicating the type of payload protocol data being + * transmitted/received. This value is passed as opaque data by SCTP. + * {@code 0} indicates an unspecified payload protocol identifier. + * + * @return The Payload Protocol Identifier + */ + public abstract int payloadProtocolID(); + + /** + * Sets the payload protocol Identifier. + * + * <P> A value indicating the type of payload protocol data being + * transmitted. This value is passed as opaque data by SCTP. + * + * @param ppid + * The Payload Protocol Identifier, or {@code 0} indicate an + * unspecified payload protocol identifier. + * + * @return This MessageInfo + * + * @see MessageInfo#payloadProtocolID() + */ + public abstract MessageInfo payloadProtocolID(int ppid); + + /** + * Returns the stream number that the message was received on, if the + * message has been received, otherwise the stream number that the message + * is to be sent on. + * + * @return The stream number + */ + public abstract int streamNumber(); + + /** + * Sets the stream number that the message is to be sent on. + * + * @param streamNumber + * The stream number + * + * @throws IllegalArgumentException + * If the streamNumber is negative or greater than {@code 65536} + * + * @return This MessageInfo + */ + public abstract MessageInfo streamNumber(int streamNumber); + + /** + * The time period that the sending side may expire the message if it has + * not been sent, or {@code 0} to indicate that no timeout should occur. This + * value is only applicable for messages being sent, it has no meaning for + * received messages. + * + * @return The time period in milliseconds, or {@code 0} + */ + public abstract long timeToLive(); + + /** + * Sets the time period that the sending side may expire the message if it + * has not been sent. + * + * @param millis + * The time period in milliseconds, or {@code 0} to indicate that no + * timeout should occur + * + * @return This MessageInfo + * + * @see MessageInfo#timeToLive() + */ + public abstract MessageInfo timeToLive(long millis); +} diff --git a/src/share/classes/com/sun/nio/sctp/Notification.java b/src/share/classes/com/sun/nio/sctp/Notification.java new file mode 100644 index 0000000000000000000000000000000000000000..073f11f61fa2910004dd35db29dca1c451d4d1b5 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/Notification.java @@ -0,0 +1,45 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * A notification from the SCTP stack. + * + * <P> Objects of this type are passed to the {@link NotificationHandler} when + * a notification is received. + * + * <P> An SCTP channel supports the following notifications: {@link + * AssociationChangeNotification}, {@link PeerAddressChangeNotification}, + * {@link SendFailedNotification}, {@link ShutdownNotification}, and may support + * additional implementation specific notifications. + * + * @since 1.7 + */ +public interface Notification { + /** + * Returns the association that this notification is applicable to. + */ + public Association association(); +} diff --git a/src/share/classes/com/sun/nio/sctp/NotificationHandler.java b/src/share/classes/com/sun/nio/sctp/NotificationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..65eb8b7777bd77c367bb27a28ed75fbe95fc43c7 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/NotificationHandler.java @@ -0,0 +1,65 @@ +/* + * 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 com.sun.nio.sctp; + +/** + * A handler for consuming notifications from the SCTP stack. + * + * <P> The SCTP channels defined in this package allow a notification handler to + * be specified to consume notifications from the SCTP stack. When a + * notification is received the {@linkplain #handleNotification + * handleNotification} method of the handler is invoked to handle that + * notification. + * + * <P> Additionally, an attachment object can be attached to the {@code receive} + * operation to provide context when consuming the notification. The + * attachment is important for cases where a <i>state-less</i> {@code + * NotificationHandler} is used to consume the result of many {@code receive} + * operations. + * + * <P> Handler implementations are encouraged to extend the {@link + * AbstractNotificationHandler} class which implements this interface and + * provide notification specific methods. However, an API should generally use + * this handler interface as the type for parameters, return type, etc. rather + * than the abstract class. + * + * @param T The type of the object attached to the receive operation + * + * @since 1.7 + */ +public interface NotificationHandler<T> { + /** + * Invoked when a notification is received from the SCTP stack. + * + * @param notification + * The notification + * + * @param attachment + * The object attached to the receive operation when it was initiated. + * + * @return The handler result + */ + HandlerResult handleNotification(Notification notification, T attachment); +} diff --git a/src/share/classes/com/sun/nio/sctp/PeerAddressChangeNotification.java b/src/share/classes/com/sun/nio/sctp/PeerAddressChangeNotification.java new file mode 100644 index 0000000000000000000000000000000000000000..ded8cbd23aa2743ebb454ecd0133394307bfb91e --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/PeerAddressChangeNotification.java @@ -0,0 +1,107 @@ +/* + * 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 com.sun.nio.sctp; + +import java.net.SocketAddress; + +/** + * Notification emitted when a destination address on a multi-homed peer + * encounters a change. + * + * @since 1.7 + */ +public abstract class PeerAddressChangeNotification + implements Notification +{ + /** + * Defines the type of address change event that occurred to the destination + * address on a multi-homed peer when it encounters a change of interface + * details. + * + * <P> Some of these events types are only generated when the association + * supports dynamic address reconfiguration, e.g. {@code SCTP_ADDR_ADDED}, + * {@code SCTP_ADDR_REMOVED}, etc. + * + * @since 1.7 + */ + public enum AddressChangeEvent { + /** + * This address is now reachable. + */ + ADDR_AVAILABLE, + + /** + * The address specified can no longer be reached. Any data sent to this + * address is rerouted to an alternate until this address becomes reachable. + */ + ADDR_UNREACHABLE, + + /** + * The address is no longer part of the association. + */ + ADDR_REMOVED, + + /** + * The address is now part of the association. + */ + ADDR_ADDED, + + /** + * This address has now been made to be the primary destination address. + */ + ADDR_MADE_PRIMARY, + + /** + * This address has now been confirmed as a valid address. + */ + ADDR_CONFIRMED; + } + + /** + * Initializes a new instance of this class. + */ + protected PeerAddressChangeNotification() {} + + /** + * Returns the peer address. + * + * @return The peer address + */ + public abstract SocketAddress address(); + + /** + * Returns the association that this notification is applicable to. + * + * @return The association whose peer address changed + */ + public abstract Association association(); + + /** + * Returns the type of change event. + * + * @return The event + */ + public abstract AddressChangeEvent event(); +} diff --git a/src/share/classes/com/sun/nio/sctp/SctpChannel.java b/src/share/classes/com/sun/nio/sctp/SctpChannel.java new file mode 100644 index 0000000000000000000000000000000000000000..2f062638940e442976013abf87bbdfd43aad0b14 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/SctpChannel.java @@ -0,0 +1,859 @@ +/* + * 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 com.sun.nio.sctp; + +import java.net.SocketAddress; +import java.net.InetAddress; +import java.io.IOException; +import java.util.Set; +import java.nio.ByteBuffer; +import java.nio.channels.spi.AbstractSelectableChannel; +import java.nio.channels.spi.SelectorProvider; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.SelectionKey; + +/** + * A selectable channel for message-oriented connected SCTP sockets. + * + * <P> An SCTP channel can only control one SCTP association. + * An {@code SCTPChannel} is created by invoking one of the + * {@link #open open} methods of this class. A newly-created channel is open but + * not yet connected, that is, there is no association setup with a remote peer. + * An attempt to invoke an I/O operation upon an unconnected + * channel will cause a {@link java.nio.channels.NotYetConnectedException} to be + * thrown. An association can be setup by connecting the channel using one of + * its {@link #connect connect} methods. Once connected, the channel remains + * connected until it is closed. Whether or not a channel is connected may be + * determined by invoking {@link #getRemoteAddresses getRemoteAddresses}. + * + * <p> SCTP channels support <i>non-blocking connection:</i> A + * channel may be created and the process of establishing the link to + * the remote socket may be initiated via the {@link #connect connect} method + * for later completion by the {@link #finishConnect finishConnect} method. + * Whether or not a connection operation is in progress may be determined by + * invoking the {@link #isConnectionPending isConnectionPending} method. + * + * <p> Socket options are configured using the + * {@link #setOption(SctpSocketOption,Object) setOption} method. An SCTP + * channel support the following options: + * <blockquote> + * <table border> + * <tr> + * <th>Option Name</th> + * <th>Description</th> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS + * SCTP_DISABLE_FRAGMENTS} </td> + * <td> Enables or disables message fragmentation </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE + * SCTP_EXPLICIT_COMPLETE} </td> + * <td> Enables or disables explicit message completion </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE + * SCTP_FRAGMENT_INTERLEAVE} </td> + * <td> Controls how the presentation of messages occur for the message + * receiver </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS + * SCTP_INIT_MAXSTREAMS} </td> + * <td> The maximum number of streams requested by the local endpoint during + * association initialization </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td> + * <td> Enables or disable a Nagle-like algorithm </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR + * SCTP_PRIMARY_ADDR} </td> + * <td> Requests that the local SCTP stack use the given peer address as the + * association primary </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR + * SCTP_SET_PEER_PRIMARY_ADDR} </td> + * <td> Requests that the peer mark the enclosed address as the association + * primary </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SO_SNDBUF + * SO_SNDBUF} </td> + * <td> The size of the socket send buffer </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SO_RCVBUF + * SO_RCVBUF} </td> + * <td> The size of the socket receive buffer </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SO_LINGER + * SO_LINGER} </td> + * <td> Linger on close if data is present (when configured in blocking mode + * only) </td> + * </tr> + * </table> + * </blockquote> + * Additional (implementation specific) options may also be supported. The list + * of options supported is obtained by invoking the {@link #supportedOptions() + * supportedOptions} method. + * + * <p> SCTP channels are safe for use by multiple concurrent threads. + * They support concurrent reading and writing, though at most one thread may be + * reading and at most one thread may be writing at any given time. The + * {@link #connect connect} and {@link #finishConnect + * finishConnect} methods are mutually synchronized against each other, and + * an attempt to initiate a send or receive operation while an invocation of one + * of these methods is in progress will block until that invocation is complete. + * + * @since 1.7 + */ +public abstract class SctpChannel + extends AbstractSelectableChannel +{ + /** + * Initializes a new instance of this class. + * + * @param provider + * The selector provider for this channel + */ + protected SctpChannel(SelectorProvider provider) { + super(provider); + } + + /** + * Opens an SCTP channel. + * + * <P> The new channel is unbound and unconnected. + * + * @return A new SCTP channel + * + * @throws UnsupportedOperationException + * If the SCTP protocol is not supported + * + * @throws IOException + * If an I/O error occurs + */ + public static SctpChannel open() throws + IOException { + return new sun.nio.ch.SctpChannelImpl((SelectorProvider)null); + } + + /** + * Opens an SCTP channel and connects it to a remote address. + * + * <P> This is a convenience method and is equivalent to evaluating the + * following expression: + * <blockquote><pre> + * open().connect(remote, maxOutStreams, maxInStreams); + * </pre></blockquote> + * + * @param remote + * The remote address to which the new channel is to be connected + * + * @param maxOutStreams + * The number of streams that the application wishes to be able + * to send to. Must be non negative and no larger than {@code 65536}. + * {@code 0} to use the endpoints default value. + * + * @param maxInStreams + * The maximum number of inbound streams the application is prepared + * to support. Must be non negative and no larger than {@code 65536}. + * {@code 0} to use the endpoints default value. + * + * @return A new SCTP channel connected to the given address + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the connect operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the connect operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws java.nio.channels.UnresolvedAddressException + * If the given remote address is not fully resolved + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given remote address is not supported + * + * @throws SecurityException + * If a security manager has been installed + * and it does not permit access to the given remote peer + * + * @throws UnsupportedOperationException + * If the SCTP protocol is not supported + * + * @throws IOException + * If some other I/O error occurs + */ + public static SctpChannel open(SocketAddress remote, int maxOutStreams, + int maxInStreams) throws IOException { + SctpChannel ssc = SctpChannel.open(); + ssc.connect(remote, maxOutStreams, maxInStreams); + return ssc; + } + + /** + * Returns the association on this channel's socket. + * + * @return the association, or {@code null} if the channel's socket is not + * connected. + * + * @throws ClosedChannelException + * If the channel is closed + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract Association association() throws IOException; + + /** + * Binds the channel's socket to a local address. + * + * <P> This method is used to establish a relationship between the socket + * and the local addresses. Once a relationship is established then + * the socket remains bound until the channel is closed. This relationship + * may not necesssarily be with the address {@code local} as it may be removed + * by {@link #unbindAddress unbindAddress}, but there will always be at least + * one local address bound to the channel's socket once an invocation of + * this method successfully completes. + * + * <P> Once the channel's socket has been successfully bound to a specific + * address, that is not automatically assigned, more addresses + * may be bound to it using {@link #bindAddress bindAddress}, or removed + * using {@link #unbindAddress unbindAddress}. + * + * @param local + * The local address to bind the socket, or {@code null} to + * bind the socket to an automatically assigned socket address + * + * @return This channel + * + * @throws java.nio.channels.AlreadyConnectedException + * If this channel is already connected + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.ConnectionPendingException + * If a non-blocking connection operation is already in progress on this channel + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given address is not supported + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpChannel bind(SocketAddress local) + throws IOException; + + /** + * Adds the given address to the bound addresses for the channel's + * socket. + * + * <P> The given address must not be the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address. + * The channel must be first bound using {@link #bind bind} before + * invoking this method, otherwise {@link + * java.nio.channels.NotYetBoundException} is thrown. The {@link #bind bind} + * method takes a {@code SocketAddress} as its argument which typically + * contains a port number as well as an address. Addresses subquently bound + * using this method are simply addresses as the SCTP port number remains + * the same for the lifetime of the channel. + * + * <P> Adding addresses to a connected association is optional functionality. + * If the endpoint supports dynamic address reconfiguration then it may + * send the appropriate message to the peer to change the peers address + * lists. + * + * @param address + * The address to add to the bound addresses for the socket + * + * @return This channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.ConnectionPendingException + * If a non-blocking connection operation is already in progress on + * this channel + * + * @throws java.nio.channels.NotYetBoundException + * If this channel is not yet bound + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound to the given address + * + * @throws IllegalArgumentException + * If address is {@code null} or the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpChannel bindAddress(InetAddress address) + throws IOException; + + /** + * Removes the given address from the bound addresses for the channel's + * socket. + * + * <P> The given address must not be the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address. + * The channel must be first bound using {@link #bind bind} before + * invoking this method, otherwise {@link java.nio.channels.NotYetBoundException} + * is thrown. If this method is invoked on a channel that does not have + * {@code address} as one of its bound addresses or that has only one + * local address bound to it, then this method throws + * {@link IllegalUnbindException}. + * The initial address that the channel's socket is bound to using {@link + * #bind bind} may be removed from the bound addresses for the channel's socket. + * + * <P> Removing addresses from a connected association is optional + * functionality. If the endpoint supports dynamic address reconfiguration + * then it may send the appropriate message to the peer to change the peers + * address lists. + * + * @param address + * The address to remove from the bound addresses for the socket + * + * @return This channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.ConnectionPendingException + * If a non-blocking connection operation is already in progress on + * this channel + * + * @throws java.nio.channels.NotYetBoundException + * If this channel is not yet bound + * + * @throws IllegalArgumentException + * If address is {@code null} or the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address + * + * @throws IllegalUnbindException + * If {@code address} is not bound to the channel's socket. or + * the channel has only one address bound to it + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpChannel unbindAddress(InetAddress address) + throws IOException; + + /** + * Connects this channel's socket. + * + * <P> If this channel is in non-blocking mode then an invocation of this + * method initiates a non-blocking connection operation. If the connection + * is established immediately, as can happen with a local connection, then + * this method returns {@code true}. Otherwise this method returns + * {@code false} and the connection operation must later be completed by + * invoking the {@link #finishConnect finishConnect} method. + * + * <P> If this channel is in blocking mode then an invocation of this + * method will block until the connection is established or an I/O error + * occurs. + * + * <P> If a security manager has been installed then this method verifies + * that its {@link java.lang.SecurityManager#checkConnect checkConnect} + * method permits connecting to the address and port number of the given + * remote peer. + * + * <p> This method may be invoked at any time. If a {@link #send send} or + * {@link #receive receive} operation upon this channel is invoked while an + * invocation of this method is in progress then that operation will first + * block until this invocation is complete. If a connection attempt is + * initiated but fails, that is, if an invocation of this method throws a + * checked exception, then the channel will be closed. + * + * @param remote + * The remote peer to which this channel is to be connected + * + * @return {@code true} if a connection was established, {@code false} if + * this channel is in non-blocking mode and the connection + * operation is in progress + * + * @throws java.nio.channels.AlreadyConnectedException + * If this channel is already connected + * + * @throws java.nio.channels.ConnectionPendingException + * If a non-blocking connection operation is already in progress on + * this channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the connect operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the connect operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws java.nio.channels.UnresolvedAddressException + * If the given remote address is not fully resolved + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given remote address is not supported + * + * @throws SecurityException + * If a security manager has been installed + * and it does not permit access to the given remote peer + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract boolean connect(SocketAddress remote) throws IOException; + + /** + * Connects this channel's socket. + * + * <P> This is a convience method and is equivalent to evaluating the + * following expression: + * <blockquote><pre> + * setOption(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams)) + * .connect(remote); + * </pre></blockquote> + * + * <P> The {@code maxOutStreams} and {@code maxInStreams} parameters + * represent the maximum number of streams that the application wishes to be + * able to send to and receive from. They are negotiated with the remote + * peer and may be limited by the operating system. + * + * @param remote + * The remote peer to which this channel is to be connected + * + * @param maxOutStreams + * Must be non negative and no larger than {@code 65536}. + * {@code 0} to use the endpoints default value. + * + * @param maxInStreams + * Must be non negative and no larger than {@code 65536}. + * {@code 0} to use the endpoints default value. + * + * @return {@code true} if a connection was established, {@code false} if + * this channel is in non-blocking mode and the connection operation + * is in progress + * + * @throws java.nio.channels.AlreadyConnectedException + * If this channel is already connected + * + * @throws java.nio.channels.ConnectionPendingException + * If a non-blocking connection operation is already in progress on + * this channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the connect operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the connect operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws java.nio.channels.UnresolvedAddressException + * If the given remote address is not fully resolved + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given remote address is not supported + * + * @throws SecurityException + * If a security manager has been installed + * and it does not permit access to the given remote peer + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract boolean connect(SocketAddress remote, + int maxOutStreams, + int maxInStreams) + throws IOException; + + /** + * Tells whether or not a connection operation is in progress on this channel. + * + * @return {@code true} if, and only if, a connection operation has been initiated + * on this channel but not yet completed by invoking the + * {@link #finishConnect} method + */ + public abstract boolean isConnectionPending(); + + /** + * Finishes the process of connecting an SCTP channel. + * + * <P> A non-blocking connection operation is initiated by placing a socket + * channel in non-blocking mode and then invoking one of its {@link #connect + * connect} methods. Once the connection is established, or the attempt has + * failed, the channel will become connectable and this method may + * be invoked to complete the connection sequence. If the connection + * operation failed then invoking this method will cause an appropriate + * {@link java.io.IOException} to be thrown. + * + * <P> If this channel is already connected then this method will not block + * and will immediately return <tt>true</tt>. If this channel is in + * non-blocking mode then this method will return <tt>false</tt> if the + * connection process is not yet complete. If this channel is in blocking + * mode then this method will block until the connection either completes + * or fails, and will always either return <tt>true</tt> or throw a checked + * exception describing the failure. + * + * <P> This method may be invoked at any time. If a {@link #send send} or {@link #receive receive} + * operation upon this channel is invoked while an invocation of this + * method is in progress then that operation will first block until this + * invocation is complete. If a connection attempt fails, that is, if an + * invocation of this method throws a checked exception, then the channel + * will be closed. + * + * @return {@code true} if, and only if, this channel's socket is now + * connected + * + * @throws java.nio.channels.NoConnectionPendingException + * If this channel is not connected and a connection operation + * has not been initiated + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the connect operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the connect operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract boolean finishConnect() throws IOException; + + /** + * Returns all of the socket addresses to which this channel's socket is + * bound. + * + * @return All the socket addresses that this channel's socket is + * bound to, or an empty {@code Set} if the channel's socket is not + * bound + * + * @throws ClosedChannelException + * If the channel is closed + * + * @throws IOException + * If an I/O error occurs + */ + public abstract Set<SocketAddress> getAllLocalAddresses() + throws IOException; + + /** + * Returns all of the remote addresses to which this channel's socket + * is connected. + * + * <P> If the channel is connected to a remote peer that is bound to + * multiple addresses then it is these addresses that the channel's socket + * is connected. + * + * @return All of the remote addresses to which this channel's socket + * is connected, or an empty {@code Set} if the channel's socket is + * not connected + * + * @throws ClosedChannelException + * If the channel is closed + * + * @throws IOException + * If an I/O error occurs + */ + public abstract Set<SocketAddress> getRemoteAddresses() + throws IOException; + + /** + * Shutdown a connection without closing the channel. + * + * <P> Sends a shutdown command to the remote peer, effectively preventing + * any new data from being written to the socket by either peer. Further + * sends will throw {@link java.nio.channels.ClosedChannelException}. The + * channel remains open to allow the for any data (and notifications) to be + * received that may have been sent by the peer before it received the + * shutdown command. If the channel is already shutdown then invoking this + * method has no effect. + * + * @return This channel + * + * @throws java.nio.channels.NotYetConnectedException + * If this channel is not yet connected + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpChannel shutdown() throws IOException; + + /** + * Returns the value of a socket option. + * + * @param name + * The socket option + * + * @return The value of the socket option. A value of {@code null} may be + * a valid value for some socket options. + * + * @throws UnsupportedOperationException + * If the socket option is not supported by this channel + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If an I/O error occurs + * + * @see SctpStandardSocketOption + */ + public abstract <T> T getOption(SctpSocketOption<T> name) + throws IOException; + + /** + * Sets the value of a socket option. + * + * @param name + * The socket option + * + * @param value + * The value of the socket option. A value of {@code null} may be + * a valid value for some socket options. + * + * @return This channel + * + * @throws UnsupportedOperationException + * If the socket option is not supported by this channel + * + * @throws IllegalArgumentException + * If the value is not a valid value for this socket option + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If an I/O error occurs + * + * @see SctpStandardSocketOption + */ + public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value) + throws IOException; + + /** + * Returns a set of the socket options supported by this channel. + * + * <P> This method will continue to return the set of options even after the + * channel has been closed. + * + * @return A set of the socket options supported by this channel + */ + public abstract Set<SctpSocketOption<?>> supportedOptions(); + + /** + * Returns an operation set identifying this channel's supported operations. + * + * <P> SCTP channels support connecting, reading, and writing, so this + * method returns <tt>(</tt>{@link SelectionKey#OP_CONNECT} + * <tt>|</tt> {@link SelectionKey#OP_READ} <tt>|</tt> {@link + * SelectionKey#OP_WRITE}<tt>)</tt>. </p> + * + * @return The valid-operation set + */ + @Override + public final int validOps() { + return (SelectionKey.OP_READ | + SelectionKey.OP_WRITE | + SelectionKey.OP_CONNECT); + } + + /** + * Receives a message into the given buffer and/or handles a notification. + * + * <P> If a message or notification is immediately available, or if this + * channel is in blocking mode and one eventually becomes available, then + * the message or notification is returned or handled, respectively. If this + * channel is in non-blocking mode and a message or notification is not + * immediately available then this method immediately returns {@code null}. + * + * <P> If this method receives a message it is copied into the given byte + * buffer. The message is transferred into the given byte buffer starting at + * its current position and the buffers position is incremented by the + * number of bytes read. If there are fewer bytes remaining in the buffer + * than are required to hold the message, or the underlying input buffer + * does not contain the complete message, then an invocation of {@link + * MessageInfo#isComplete isComplete} on the returned {@code + * MessageInfo} will return {@code false}, and more invocations of this + * method will be necessary to completely consume the messgae. Only + * one message at a time will be partially delivered in any stream. The + * socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE + * SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of + * messages occurs. + * + * <P> If this method receives a notification then the appropriate method of + * the given handler, if there is one, is invoked. If the handler returns + * {@link HandlerResult#CONTINUE CONTINUE} then this method will try to + * receive another message/notification, otherwise, if {@link + * HandlerResult#RETURN RETURN} is returned this method will return {@code + * null}. If an uncaught exception is thrown by the handler it will be + * propagated up the stack through this method. + * + * <P> This method may be invoked at any time. If another thread has + * already initiated a receive operation upon this channel, then an + * invocation of this method will block until the first operation is + * complete. The given handler is invoked without holding any locks used + * to enforce the above synchronization policy, that way handlers + * will not stall other threads from receiving. A handler should not invoke + * the {@code receive} method of this channel, if it does an + * {@link IllegalReceiveException} will be thrown. + * + * @param dst + * The buffer into which message bytes are to be transferred + * + * @param attachment + * The object to attach to the receive operation; can be + * {@code null} + * + * @param handler + * A handler to handle notifications from the SCTP stack, or {@code + * null} to ignore any notifications. + * + * @return The {@code MessageInfo}, {@code null} if this channel is in + * non-blocking mode and no messages are immediately available or + * the notification handler returns {@link HandlerResult#RETURN + * RETURN} after handling a notification + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the read operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the read operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws java.nio.channels.NotYetConnectedException + * If this channel is not yet connected + * + * @throws IllegalReceiveException + * If the given handler invokes the {@code receive} method of this + * channel + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract <T> MessageInfo receive(ByteBuffer dst, + T attachment, + NotificationHandler<T> handler) + throws IOException; + + /** + * Sends a message via this channel. + * + * <P> If this channel is in non-blocking mode and there is sufficient room + * in the underlying output buffer, or if this channel is in blocking mode + * and sufficient room becomes available, then the remaining bytes in the + * given byte buffer are transmitted as a single message. Sending a message + * is atomic unless explicit message completion {@link + * SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE} + * socket option is enabled on this channel's socket. + * + * <P> The message is transferred from the byte buffer as if by a regular + * {@link java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer) + * write} operation. + * + * <P> The bytes will be written to the stream number that is specified by + * {@link MessageInfo#streamNumber streamNumber} in the given {@code + * messageInfo}. + * + * <P> This method may be invoked at any time. If another thread has already + * initiated a send operation upon this channel, then an invocation of + * this method will block until the first operation is complete. + * + * @param src + * The buffer containing the message to be sent + * + * @param messageInfo + * Ancillary data about the message to be sent + * + * @return The number of bytes sent, which will be either the number of + * bytes that were remaining in the messages buffer when this method + * was invoked or, if this channel is non-blocking, may be zero if + * there was insufficient room for the message in the underlying + * output buffer + * + * @throws InvalidStreamExcepton + * If {@code streamNumner} is negative or greater than or equal to + * the maximum number of outgoing streams + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the read operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the read operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws java.nio.channels.NotYetConnectedException + * If this channel is not yet connected + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract int send(ByteBuffer src, MessageInfo messageInfo) + throws IOException; +} diff --git a/src/share/classes/com/sun/nio/sctp/SctpMultiChannel.java b/src/share/classes/com/sun/nio/sctp/SctpMultiChannel.java new file mode 100644 index 0000000000000000000000000000000000000000..d9325c103c740c592ca05cae9b8ddc5e8c8d48e9 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/SctpMultiChannel.java @@ -0,0 +1,731 @@ +/* + * 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 com.sun.nio.sctp; + +import java.net.SocketAddress; +import java.net.InetAddress; +import java.io.IOException; +import java.util.Set; +import java.nio.ByteBuffer; +import java.nio.channels.spi.AbstractSelectableChannel; +import java.nio.channels.spi.SelectorProvider; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.NotYetBoundException; +import java.nio.channels.SelectionKey; + +/** + * A selectable channel for message-oriented SCTP sockets. + * + * <P> An SCTP multi channel supports many associations on a single socket. + * An {@code SctpMultiChannel} is created by invoking the + * {@link #open open} method of this class. A newly-created channel is open but + * not yet bound. An attempt to invoke the {@link #receive receive} method of an + * unbound channel will cause the {@link NotYetBoundException} + * to be thrown. An attempt to invoke the {@link #send send} method of an + * unbound channel will cause it to first invoke the {@link #bind bind} method. + * The address(es) that the channel's socket is bound to can be retrieved by + * calling {@link #getAllLocalAddresses getAllLocalAddresses}. + * + * <P> Messages may be sent and received without explicitly setting up an + * association with the remote peer. The channel will implicitly setup + * a new association whenever it sends or receives a message from a remote + * peer if there is not already an association with that peer. Upon successful + * association setup, an {@link AssociationChangeNotification + * association changed} notification will be put to the SCTP stack with its + * {@code event} parameter set to {@link + * AssociationChangeNotification.AssocChangeEvent#COMM_UP + * COMM_UP}. This notification can be received by invoking {@link #receive + * receive}. + * + * <P> Socket options are configured using the + * {@link #setOption(SctpSocketOption,Object,Association) setOption} method. An + * {@code SctpMultiChannel} supports the following options: + * <blockquote> + * <table border> + * <tr> + * <th>Option Name</th> + * <th>Description</th> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS + * SCTP_DISABLE_FRAGMENTS} </td> + * <td> Enables or disables message fragmentation </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE + * SCTP_EXPLICIT_COMPLETE} </td> + * <td> Enables or disables explicit message completion </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE + * SCTP_FRAGMENT_INTERLEAVE} </td> + * <td> Controls how the presentation of messages occur for the message + * receiver </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS + * SCTP_INIT_MAXSTREAMS} </td> + * <td> The maximum number of streams requested by the local endpoint during + * association initialization </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td> + * <td> Enables or disable a Nagle-like algorithm </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR + * SCTP_PRIMARY_ADDR} </td> + * <td> Requests that the local SCTP stack use the given peer address as the + * association primary </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR + * SCTP_SET_PEER_PRIMARY_ADDR} </td> + * <td> Requests that the peer mark the enclosed address as the association + * primary </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SO_SNDBUF + * SO_SNDBUF} </td> + * <td> The size of the socket send buffer </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SO_RCVBUF + * SO_RCVBUF} </td> + * <td> The size of the socket receive buffer </td> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SO_LINGER + * SO_LINGER} </td> + * <td> Linger on close if data is present (when configured in blocking mode + * only) </td> + * </tr> + * </table> + * </blockquote> + * Additional (implementation specific) options may also be supported. The list + * of options supported is obtained by invoking the {@link #supportedOptions() + * supportedOptions} method. + * + * <p> SCTP multi channels are safe for use by multiple concurrent threads. + * They support concurrent sending and receiving, though at most one thread may be + * sending and at most one thread may be receiving at any given time. + * + * @since 1.7 + */ +public abstract class SctpMultiChannel + extends AbstractSelectableChannel +{ + /** + * Initializes a new instance of this class. + * + * @param provider + * The selector provider for this channel + */ + protected SctpMultiChannel(SelectorProvider provider) { + super(provider); + } + + /** + * Opens an SCTP multi channel. + * + * <P> The new channel is unbound. + * + * @return A new SCTP multi channel + * + * @throws UnsupportedOperationException + * If the SCTP protocol is not supported + * + * @throws IOException + * If an I/O error occurs + */ + public static SctpMultiChannel open() throws + IOException { + return new sun.nio.ch.SctpMultiChannelImpl((SelectorProvider)null); + } + + /** + * Returns the open associations on this channel's socket. + * + * <P> Only associations whose {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP + * COMM_UP} association change event has been received are included + * in the returned set of associations. Associations for which a + * {@link AssociationChangeNotification.AssocChangeEvent#COMM_LOST COMM_LOST} or {@link + * AssociationChangeNotification.AssocChangeEvent#SHUTDOWN SHUTDOWN} association change + * event have been receive are removed from the set of associations. + * + * <P> The returned set of associations is a snapshot of the open + * associations at the time that this method is invoked. + * + * @return A {@code Set} containing the open associations, or an empty + * {@code Set} if there are none. + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract Set<Association> associations() + throws IOException; + + /** + * Binds the channel's socket to a local address and configures the socket + * to listen for connections. + * + * <P> This method is used to establish a relationship between the socket + * and the local address. Once a relationship is established then + * the socket remains bound until the channel is closed. This relationship + * may not necesssarily be with the address {@code local} as it may be removed + * by {@link #unbindAddress unbindAddress}, but there will always be at least one local + * address bound to the channel's socket once an invocation of this method + * successfully completes. + * + * <P> Once the channel's socket has been successfully bound to a specific + * address, that is not automatically assigned, more addresses + * may be bound to it using {@link #bindAddress bindAddress}, or removed + * using {@link #unbindAddress unbindAddress}. + * + * <P> The backlog parameter is the maximum number of pending connections on + * the socket. Its exact semantics are implementation specific. An implementation + * may impose an implementation specific maximum length or may choose to ignore + * the parameter. If the backlog parameter has the value {@code 0}, or a negative + * value, then an implementation specific default is used. + * + * @param local + * The local address to bind the socket, or {@code null} to + * bind the socket to an automatically assigned socket address + * + * @param backlog + * The maximum number number of pending connections + * + * @return This channel + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given address is not supported + * + * @throws SecurityException + * If a security manager has been installed and its {@link + * java.lang.SecurityManager#checkListen(int) checkListen} method + * denies the operation + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpMultiChannel bind(SocketAddress local, + int backlog) + throws IOException; + + /** + * Binds the channel's socket to a local address and configures the socket + * to listen for connections. + * + * <P> This method works as if invoking it were equivalent to evaluating the + * expression: + * <blockquote><pre> + * bind(local, 0); + * </pre></blockquote> + * + * @param local + * The local address to bind the socket, or {@code null} to + * bind the socket to an automatically assigned socket address + * + * @return This channel + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given address is not supported + * + * @throws SecurityException + * If a security manager has been installed and its {@link + * java.lang.SecurityManager#checkListen(int) checkListen} method + * denies the operation + * + * @throws IOException + * If some other I/O error occurs + */ + public final SctpMultiChannel bind(SocketAddress local) + throws IOException { + return bind(local, 0); + } + + /** + * Adds the given address to the bound addresses for the channel's + * socket. + * + * <P> The given address must not be the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address. + * The channel must be first bound using {@link #bind bind} before + * invoking this method, otherwise {@link NotYetBoundException} is thrown. + * The {@link #bind bind} method takes a {@code SocketAddress} as its + * argument which typically contains a port number as well as an address. + * Addresses subquently bound using this method are simply addresses as the + * SCTP port number remains the same for the lifetime of the channel. + * + * <P> New associations setup after this method successfully completes + * will be associated with the given address. Adding addresses to existing + * associations is optional functionality. If the endpoint supports + * dynamic address reconfiguration then it may send the appropriate message + * to the peer to change the peers address lists. + * + * @param address + * The address to add to the bound addresses for the socket + * + * @return This channel + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws NotYetBoundException + * If this channel is not yet bound + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound to the given address + * + * @throws IllegalArgumentException + * If address is {@code null} or the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpMultiChannel bindAddress(InetAddress address) + throws IOException; + + /** + * Removes the given address from the bound addresses for the channel's + * socket. + * + * <P> The given address must not be the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address. + * The channel must be first bound using {@link #bind bind} before + * invoking this method, otherwise {@link NotYetBoundException} is thrown. + * + * <P> If this method is invoked on a channel that does + * not have {@code address} as one of its bound addresses, or that has only + * one local address bound to it, then this method throws + * {@link IllegalUnbindException}. + * + * <P> The initial address that the channel's socket is bound to using + * {@link #bind bind} may be removed from the bound addresses for the + * channel's socket. + * + * <P> New associations setup after this method successfully completes + * will not be associated with the given address. Removing addresses from + * existing associations is optional functionality. If the endpoint supports + * dynamic address reconfiguration then it may send the appropriate message + * to the peer to change the peers address lists. + * + * @param address + * The address to remove from the bound addresses for the socket + * + * @return This channel + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws NotYetBoundException + * If this channel is not yet bound + * + * @throws IllegalUnbindException + * {@code address} is not bound to the channel's socket, or the + * channel has only one address bound to it + * + * @throws IllegalArgumentException + * If address is {@code null} or the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpMultiChannel unbindAddress(InetAddress address) + throws IOException; + + /** + * Returns all of the socket addresses to which this channel's socket is + * bound. + * + * @return All the socket addresses that this channel's socket is + * bound to, or an empty {@code Set} if the channel's socket is not + * bound + * + * @throws ClosedChannelException + * If the channel is closed + * + * @throws IOException + * If an I/O error occurs + */ + public abstract Set<SocketAddress> getAllLocalAddresses() + throws IOException; + + /** + * Returns all of the remote addresses to which the given association on + * this channel's socket is connected. + * + * @return All of the remote addresses for the given association, or + * an empty {@code Set} if the association has been shutdown + * + * @throws ClosedChannelException + * If the channel is closed + * + * @throws IOException + * If an I/O error occurs + */ + public abstract Set<SocketAddress> getRemoteAddresses(Association association) + throws IOException; + + /** + * Shutdown an association without closing the channel. + * + * @param association + * The association to shutdown + * + * @return This channel + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpMultiChannel shutdown(Association association) + throws IOException; + + /** + * Returns the value of a socket option. + * + * <P> Note that some options are retrieved on the channel's socket, + * therefore the {@code association} parameter is not applicable and will be + * ignored if given. However, if the option is association specific then the + * association must be given. + * + * @param name + * The socket option + * + * @param association + * The association whose option should be retrieved, or {@code null} + * if this option should be retrieved at the channel's socket level. + * + * @return The value of the socket option. A value of {@code null} may be + * a valid value for some socket options. + * + * @throws UnsupportedOperationException + * If the socket option is not supported by this channel + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If an I/O error occurs + * + * @see SctpStandardSocketOption + */ + public abstract <T> T getOption(SctpSocketOption<T> name, + Association association) + throws IOException; + + /** + * Sets the value of a socket option. + * + * <P> Note that some options are retrieved on the channel's socket, + * therefore the {@code association} parameter is not applicable and will be + * ignored if given. However, if the option is association specific then the + * association must be given. + * + * @param name + * The socket option + * + * @param association + * The association whose option should be set, or {@code null} + * if this option should be set at the channel's socket level. + * + * @param value + * The value of the socket option. A value of {@code null} may be + * a valid value for some socket options. + * + * @return This channel + * + * @throws UnsupportedOperationException + * If the socket option is not supported by this channel + * + * @throws IllegalArgumentException + * If the value is not a valid value for this socket option + * + * @throws ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If an I/O error occurs + * + * @see SctpStandardSocketOption + */ + public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name, + T value, + Association association) + throws IOException; + + /** + * Returns a set of the socket options supported by this channel. + * + * <P> This method will continue to return the set of options even after the + * channel has been closed. + * + * @return A set of the socket options supported by this channel + */ + public abstract Set<SctpSocketOption<?>> supportedOptions(); + + /** + * Returns an operation set identifying this channel's supported operations. + * + * <P> SCTP multi channels support reading, and writing, so this + * method returns + * {@code (}{@link SelectionKey#OP_READ} {@code |} {@link + * SelectionKey#OP_WRITE}{@code )}. </p> + * + * @return The valid-operation set + */ + @Override + public final int validOps() { + return (SelectionKey.OP_READ | + SelectionKey.OP_WRITE ); + } + + /** + * Receives a message and/or handles a notification via this channel. + * + * <P> If a message or notification is immediately available, or if this + * channel is in blocking mode and one eventually becomes available, then + * the message or notification is returned or handled, respectively. If this + * channel is in non-blocking mode and a message or notification is not + * immediately available then this method immediately returns {@code null}. + * + * <P> If this method receives a message it is copied into the given byte + * buffer and an {@link MessageInfo} is returned. + * The message is transferred into the given byte buffer starting at its + * current position and the buffers position is incremented by the number of + * bytes read. If there are fewer bytes remaining in the buffer than are + * required to hold the message, or the underlying input buffer does not + * contain the complete message, then an invocation of {@link + * MessageInfo#isComplete isComplete} on the returned {@code + * MessageInfo} will return {@code false}, and more invocations of this + * method will be necessary to completely consume the messgae. Only + * one message at a time will be partially delivered in any stream. The + * socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE + * SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of + * messages occurs. + * + * <P> If this method receives a notification then the appropriate method of + * the given handler, if there is one, is invoked. If the handler returns {@link + * HandlerResult#CONTINUE CONTINUE} then this method will try to receive another + * message/notification, otherwise, if {@link HandlerResult#RETURN RETURN} is returned + * this method will return {@code null}. If an uncaught exception is thrown by the + * handler it will be propagated up the stack through this method. + * + * <P> If a security manager has been installed then for each new association + * setup this method verifies that the associations source address and port + * number are permitted by the security manager's {@link + * java.lang.SecurityManager#checkAccept(String,int) checkAccept} method. + * + * <P> This method may be invoked at any time. If another thread has + * already initiated a receive operation upon this channel, then an + * invocation of this method will block until the first operation is + * complete. The given handler is invoked without holding any locks used + * to enforce the above synchronization policy, that way handlers + * will not stall other threads from receiving. A handler should not invoke + * the {@code receive} method of this channel, if it does an + * {@link IllegalReceiveException} will be thrown. + * + * @param buffer + * The buffer into which bytes are to be transferred + * + * @param attachment + * The object to attach to the receive operation; can be + * {@code null} + * + * @param handler + * A handler to handle notifications from the SCTP stack, or + * {@code null} to ignore any notifications. + * + * @return The {@code MessageInfo}, {@code null} if this channel is in + * non-blocking mode and no messages are immediately available or + * the notification handler returns {@code RETURN} after handling + * a notification + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the read operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the read operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws NotYetBoundException + * If this channel is not yet bound + * + * @throws IllegalReceiveException + * If the given handler invokes the {@code receive} method of this + * channel + * + * @throws SecurityException + * If a security manager has been installed and it does not permit + * new associations to be accepted from the message's sender + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract <T> MessageInfo receive(ByteBuffer buffer, + T attachment, + NotificationHandler<T> handler) + throws IOException; + + /** + * Sends a message via this channel. + * + * <P> If this channel is unbound then this method will invoke {@link + * #bind(SocketAddress, int) bind(null, 0)} before sending any data. + * + * <P> If there is no association existing between this channel's socket + * and the intended receiver, identified by the address in the given messageInfo, then one + * will be automatically setup to the intended receiver. This is considered + * to be Implicit Association Setup. Upon successful association setup, an + * {@link AssociationChangeNotification association changed} + * notification will be put to the SCTP stack with its {@code event} parameter set + * to {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP COMM_UP} + * . This notification can be received by invoking {@link #receive + * receive}. + * + * <P> If this channel is in blocking mode, there is sufficient room in the + * underlying output buffer, then the remaining bytes in the given byte + * buffer are transmitted as a single message. Sending a message + * is atomic unless explicit message completion {@link + * SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE} + * socket option is enabled on this channel's socket. + * + * <P> If this channel is in non-blocking mode, there is sufficient room + * in the underlying output buffer, and an implicit association setup is + * required, then the remaining bytes in the given byte buffer are + * transmitted as a single message, subject to {@link + * SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}. + * If for any reason the message cannot + * be delivered an {@link AssociationChangeNotification association + * changed} notification is put on the SCTP stack with its {@code event} parameter set + * to {@link AssociationChangeNotification.AssocChangeEvent#CANT_START CANT_START}. + * + * <P> The message is transferred from the byte buffer as if by a regular + * {@link java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer) + * write} operation. + * + * <P> If a security manager has been installed then for each new association + * setup this method verifies that the given remote peers address and port + * number are permitted by the security manager's {@link + * java.lang.SecurityManager#checkConnect(String,int) checkConnect} method. + * + * <P> This method may be invoked at any time. If another thread has already + * initiated a send operation upon this channel, then an invocation of + * this method will block until the first operation is complete. + * + * @param buffer + * The buffer containing the message to be sent + * + * @param messageInfo + * Ancillary data about the message to be sent + * + * @return The number of bytes sent, which will be either the number of + * bytes that were remaining in the messages buffer when this method + * was invoked or, if this channel is non-blocking, may be zero if + * there was insufficient room for the message in the underlying + * output buffer + * + * @throws InvalidStreamExcepton + * If {@code streamNumber} is negative, or if an association already + * exists and {@code streamNumber} is greater than the maximum number + * of outgoing streams + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the read operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the read operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws SecurityException + * If a security manager has been installed and it does not permit + * new associations to be setup with the the messages's address + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract int send(ByteBuffer buffer, MessageInfo messageInfo) + throws IOException; + + /** + * Branches off an association. + * + * <P> An application can invoke this method to branch off an association + * into a separate channel. The new bound and connected {@link SctpChannel} + * will be created for the association. The branched off association will no + * longer be part of this channel. + * + * <P> This is particularly useful when, for instance, the application + * wishes to have a number of sporadic message senders/receivers remain + * under the original SCTP multi channel but branch off those + * associations carrying high volume data traffic into their own + * separate SCTP channels. + * + * @param association + * The association to branch off + * + * @return The {@code SctpChannel} + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpChannel branch(Association association) + throws IOException; +} diff --git a/src/share/classes/com/sun/nio/sctp/SctpServerChannel.java b/src/share/classes/com/sun/nio/sctp/SctpServerChannel.java new file mode 100644 index 0000000000000000000000000000000000000000..eb79c40f5228a7cc6522989dec1027df50e932df --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/SctpServerChannel.java @@ -0,0 +1,421 @@ +/* + * 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 com.sun.nio.sctp; + +import java.net.SocketAddress; +import java.net.InetAddress; +import java.io.IOException; +import java.util.Set; +import java.nio.channels.SelectionKey; +import java.nio.channels.spi.SelectorProvider; +import java.nio.channels.spi.AbstractSelectableChannel; + +/** + * A selectable channel for message-oriented listening SCTP sockets. + * + * <p> An {@code SCTPServerChannel} is created by invoking the + * {@link #open open} method of this class. A newly-created SCTP server + * channel is open but not yet bound. An attempt to invoke the + * {@link #accept accept} method of an unbound channel will cause the + * {@link java.nio.channels.NotYetBoundException} to be thrown. An SCTP server + * channel can be bound by invoking one of the + * {@link #bind(java.net.SocketAddress,int) bind} methods defined by this class. + * + * <p> Socket options are configured using the + * {@link #setOption(SctpSocketOption,Object) setOption} method. SCTP server socket + * channels support the following options: + * <blockquote> + * <table border> + * <tr> + * <th>Option Name</th> + * <th>Description</th> + * </tr> + * <tr> + * <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS + * SCTP_INIT_MAXSTREAMS} </td> + * <td> The maximum number of streams requested by the local endpoint during + * association initialization </td> + * </tr> + * </table> + * </blockquote> + * Additional (implementation specific) options may also be supported. The list + * of options supported is obtained by invoking the {@link #supportedOptions() + * supportedOptions} method. + * + * <p>SCTP server channels are safe for use by multiple concurrent threads. + * + * @since 1.7 + */ +public abstract class SctpServerChannel + extends AbstractSelectableChannel +{ + /** + * Initializes a new instance of this class. + * + * @param provider + * The selector provider for this channel + */ + protected SctpServerChannel(SelectorProvider provider) { + super(provider); + } + + /** + * Opens an SCTP server channel. + * + * <P> The new channel's socket is initially unbound; it must be bound + * to a specific address via one of its socket's {@link #bind bind} + * methods before associations can be accepted. + * + * @return A new SCTP server channel + * + * @throws UnsupportedOperationException + * If the SCTP protocol is not supported + * + * @throws IOException + * If an I/O error occurs + */ + public static SctpServerChannel open() throws + IOException { + return new sun.nio.ch.SctpServerChannelImpl((SelectorProvider)null); + } + + /** + * Accepts an association on this channel's socket. + * + * <P> If this channel is in non-blocking mode then this method will + * immediately return {@code null} if there are no pending associations. + * Otherwise it will block indefinitely until a new association is + * available or an I/O error occurs. + * + * <P> The {@code SCTPChannel} returned by this method, if any, will be in + * blocking mode regardless of the blocking mode of this channel. + * + * <P> If a security manager has been installed then for each new + * association this method verifies that the address and port number of the + * assocaitions's remote peer are permitted by the security manager's {@link + * java.lang.SecurityManager#checkAccept(String,int) checkAccept} method. + * + * @return The SCTP channel for the new association, or {@code null} + * if this channel is in non-blocking mode and no association is + * available to be accepted + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AsynchronousCloseException + * If another thread closes this channel + * while the accept operation is in progress + * + * @throws java.nio.channels.ClosedByInterruptException + * If another thread interrupts the current thread + * while the accept operation is in progress, thereby + * closing the channel and setting the current thread's + * interrupt status + * + * @throws java.nio.channels.NotYetBoundException + * If this channel's socket has not yet been bound + * + * @throws SecurityException + * If a security manager has been installed and it does not permit + * access to the remote peer of the new association + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpChannel accept() throws IOException; + + /** + * Binds the channel's socket to a local address and configures the socket + * to listen for associations. + * + * <P> This method works as if invoking it were equivalent to evaluating the + * expression: + * <blockquote><pre> + * bind(local, 0); + * </pre></blockquote> + * + * @param local + * The local address to bind the socket, or {@code null} to + * bind the socket to an automatically assigned socket address + * + * @return This channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given address is not supported + * + * @throws SecurityException + * If a security manager has been installed and its {@link + * java.lang.SecurityManager#checkListen(int) checkListen} method + * denies the operation + * + * @throws IOException + * If some other I/O error occurs + */ + public final SctpServerChannel bind(SocketAddress local) + throws IOException { + return bind(local, 0); + } + + /** + * Binds the channel's socket to a local address and configures the socket + * to listen for associations. + * + * <P> This method is used to establish a relationship between the socket + * and the local address. Once a relationship is established then + * the socket remains bound until the channel is closed. This relationship + * may not necesssarily be with the address {@code local} as it may be + * removed by {@link #unbindAddress unbindAddress}, but there will always be + * at least one local address bound to the channel's socket once an + * invocation of this method successfully completes. + * + * <P> Once the channel's socket has been successfully bound to a specific + * address, that is not automatically assigned, more addresses + * may be bound to it using {@link #bindAddress bindAddress}, or removed + * using {@link #unbindAddress unbindAddress}. + * + * <P> The backlog parameter is the maximum number of pending associations + * on the socket. Its exact semantics are implementation specific. An + * implementation may impose an implementation specific maximum length or + * may choose to ignore the parameter. If the backlog parameter has the + * value {@code 0}, or a negative value, then an implementation specific + * default is used. + * + * @param local + * The local address to bind the socket, or {@code null} to + * bind the socket to an automatically assigned socket address + * + * @param backlog + * The maximum number number of pending associations + * + * @return This channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound + * + * @throws java.nio.channels.UnsupportedAddressTypeException + * If the type of the given address is not supported + * + * @throws SecurityException + * If a security manager has been installed and its {@link + * java.lang.SecurityManager#checkListen(int) checkListen} method + * denies the operation + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpServerChannel bind(SocketAddress local, + int backlog) + throws IOException; + + /** + * Adds the given address to the bound addresses for the channel's + * socket. + * + * <P> The given address must not be the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address. + * The channel must be first bound using {@link #bind bind} before + * invoking this method, otherwise {@link + * java.nio.channels.NotYetBoundException} is thrown. The {@link #bind bind} + * method takes a {@code SocketAddress} as its argument which typically + * contains a port number as well as an address. Addresses subquently bound + * using this method are simply addresses as the SCTP port number remains + * the same for the lifetime of the channel. + * + * <P> New associations accepted after this method successfully completes + * will be associated with the given address. + * + * @param address + * The address to add to the bound addresses for the socket + * + * @return This channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.NotYetBoundException + * If this channel is not yet bound + * + * @throws java.nio.channels.AlreadyBoundException + * If this channel is already bound to the given address + * + * @throws IllegalArgumentException + * If address is {@code null} or the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpServerChannel bindAddress(InetAddress address) + throws IOException; + + /** + * Removes the given address from the bound addresses for the channel's + * socket. + * + * <P> The given address must not be the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address. + * The channel must be first bound using {@link #bind bind} before + * invoking this method, otherwise + * {@link java.nio.channels.NotYetBoundException} is thrown. + * If this method is invoked on a channel that does not have + * {@code address} as one of its bound addresses, or that has only one + * local address bound to it, then this method throws {@link + * IllegalUnbindException}. + * The initial address that the channel's socket is bound to using + * {@link #bind bind} may be removed from the bound addresses for the + * channel's socket. + * + * <P> New associations accepted after this method successfully completes + * will not be associated with the given address. + * + * @param address + * The address to remove from the bound addresses for the socket + * + * @return This channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws java.nio.channels.NotYetBoundException + * If this channel is not yet bound + * + * @throws IllegalArgumentException + * If address is {@code null} or the {@link + * java.net.InetAddress#isAnyLocalAddress wildcard} address + * + * @throws IllegalUnbindException + * If the implementation does not support removing addresses from a + * listening socket, {@code address} is not bound to the channel's + * socket, or the channel has only one address bound to it + * + * @throws IOException + * If some other I/O error occurs + */ + public abstract SctpServerChannel unbindAddress(InetAddress address) + throws IOException; + + /** + * Returns all of the socket addresses to which this channel's socket is + * bound. + * + * @return All the socket addresses that this channel's socket is + * bound to, or an empty {@code Set} if the channel's socket is not + * bound + * + * @throws java.nio.channels.ClosedChannelException + * If the channel is closed + * + * @throws IOException + * If an I/O error occurs + */ + public abstract Set<SocketAddress> getAllLocalAddresses() + throws IOException; + + /** + * Returns the value of a socket option. + * + * @param name + * The socket option + * + * @return The value of the socket option. A value of {@code null} may be + * a valid value for some socket options. + * + * @throws UnsupportedOperationException + * If the socket option is not supported by this channel + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If an I/O error occurs + * + * @see SctpStandardSocketOption + */ + public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException; + + /** + * Sets the value of a socket option. + * + * @param name + * The socket option + * + * @param value + * The value of the socket option. A value of {@code null} may be + * a valid value for some socket options. + * + * @return This channel + * + * @throws UnsupportedOperationException + * If the socket option is not supported by this channel + * + * @throws IllegalArgumentException + * If the value is not a valid value for this socket option + * + * @throws java.nio.channels.ClosedChannelException + * If this channel is closed + * + * @throws IOException + * If an I/O error occurs + * + * @see SctpStandardSocketOption + */ + public abstract <T> SctpServerChannel setOption(SctpSocketOption<T> name, + T value) + throws IOException; + + /** + * Returns a set of the socket options supported by this channel. + * + * <P> This method will continue to return the set of options even after the + * channel has been closed. + * + * @return A set of the socket options supported by this channel + */ + public abstract Set<SctpSocketOption<?>> supportedOptions(); + + /** + * Returns an operation set identifying this channel's supported + * operations. + * + * <P> SCTP server channels only support the accepting of new + * associations, so this method returns + * {@link java.nio.channels.SelectionKey#OP_ACCEPT}. + * + * @return The valid-operation set + */ + @Override + public final int validOps() { + return SelectionKey.OP_ACCEPT; + } +} diff --git a/src/windows/native/sun/windows/awt_KeyboardFocusManager.h b/src/share/classes/com/sun/nio/sctp/SctpSocketOption.java similarity index 66% rename from src/windows/native/sun/windows/awt_KeyboardFocusManager.h rename to src/share/classes/com/sun/nio/sctp/SctpSocketOption.java index 26087c21a3c0f6d2bba5fb680be98fbd5dbe7635..091f91aec58e72a0841d6b77681748d24120a563 100644 --- a/src/windows/native/sun/windows/awt_KeyboardFocusManager.h +++ b/src/share/classes/com/sun/nio/sctp/SctpSocketOption.java @@ -1,5 +1,5 @@ /* - * Copyright 2001-2002 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -22,22 +22,17 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ +package com.sun.nio.sctp; -#ifndef AWT_KEYBOARDFOCUSMANAGER_H -#define AWT_KEYBOARDFOCUSMANAGER_H +import java.net.SocketOption; -#include <jni.h> - -class AwtKeyboardFocusManager { -public: - - static jclass keyboardFocusManagerCls; - static jmethodID shouldNativelyFocusHeavyweightMID; - static jmethodID heavyweightButtonDownMID; - static jmethodID markClearGlobalFocusOwnerMID; - static jmethodID removeLastFocusRequestMID; - static jfieldID isProxyActive; - static jmethodID processSynchronousTransfer; -}; - -#endif // AWT_KEYBOARDFOCUSMANAGER_H +/** + * A socket option associated with an SCTP channel. + * + * @param <T> The type of the socket option value. + * + * @since 1.7 + * + * @see SctpStandardSocketOption + */ +public interface SctpSocketOption<T> extends SocketOption<T> { } diff --git a/src/share/classes/com/sun/nio/sctp/SctpStandardSocketOption.java b/src/share/classes/com/sun/nio/sctp/SctpStandardSocketOption.java new file mode 100644 index 0000000000000000000000000000000000000000..ce581d3b6a48d0ca38625ad958d47d4cfe13b6ce --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/SctpStandardSocketOption.java @@ -0,0 +1,419 @@ +/* + * 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 com.sun.nio.sctp; + +import java.net.SocketAddress; +import sun.nio.ch.SctpStdSocketOption; + +/** + * SCTP channels supports the socket options defined by this class + * (as well as those listed in the particular channel class) and may support + * additional Implementation specific socket options. + * + * @since 1.7 + */ +public class SctpStandardSocketOption { + private SctpStandardSocketOption() {} + /** + * Enables or disables message fragmentation. + * + * <P> The value of this socket option is a {@code Boolean} that represents + * whether the option is enabled or disabled. If enabled no SCTP message + * fragmentation will be performed. Instead if a message being sent + * exceeds the current PMTU size, the message will NOT be sent and + * an error will be indicated to the user. + * + * <P> It is implementation specific whether or not this option is + * supported. + */ + public static final SctpSocketOption<Boolean> SCTP_DISABLE_FRAGMENTS = new + SctpStdSocketOption<Boolean>("SCTP_DISABLE_FRAGMENTS", Boolean.class, + sun.nio.ch.SctpStdSocketOption.SCTP_DISABLE_FRAGMENTS); + + /** + * Enables or disables explicit message completion. + * + * <p> The value of this socket option is a {@code Boolean} that represents + * whether the option is enabled or disabled. When this option is enabled, + * the {@code send} method may be invoked multiple times to a send message. + * The {@code isComplete} parameter of the {@link MessageInfo} must only + * be set to {@code true} for the final send to indicate that the message is + * complete. If this option is disabled then each individual {@code send} + * invocation is considered complete. + * + * <P> The default value of the option is {@code false} indicating that the + * option is disabled. It is implementation specific whether or not this + * option is supported. + */ + public static final SctpSocketOption<Boolean> SCTP_EXPLICIT_COMPLETE = new + SctpStdSocketOption<Boolean>("SCTP_EXPLICIT_COMPLETE", Boolean.class, + sun.nio.ch.SctpStdSocketOption.SCTP_EXPLICIT_COMPLETE); + + /** + * Fragmented interleave controls how the presentation of messages occur + * for the message receiver. There are three levels of fragment interleave + * defined. Two of the levels effect {@link SctpChannel}, while + * {@link SctpMultiChannel} is effected by all three levels. + * + * <P> This option takes an {@code Integer} value. It can be set to a value + * of {@code 0}, {@code 1} or {@code 2}. + * + * <P> Setting the three levels provides the following receiver + * interactions: + * + * <P> {@code level 0} - Prevents the interleaving of any messages. This + * means that when a partial delivery begins, no other messages will be + * received except the message being partially delivered. If another message + * arrives on a different stream (or association) that could be delivered, + * it will be blocked waiting for the user to read all of the partially + * delivered message. + * + * <P> {@code level 1} - Allows interleaving of messages that are from + * different associations. For {@code SctpChannel}, level 0 and + * level 1 have the same meaning since an {@code SctpChannel} always + * receives messages from the same association. Note that setting an {@code + * SctpMultiChannel} to this level may cause multiple partial + * delivers from different associations but for any given association, only + * one message will be delivered until all parts of a message have been + * delivered. This means that one large message, being read with an + * association identification of "X", will block other messages from + * association "X" from being delivered. + * + * <P> {@code level 2} - Allows complete interleaving of messages. This + * level requires that the sender carefully observe not only the peer + * {@code Association} but also must pay careful attention to the stream + * number. With this option enabled a partially delivered message may begin + * being delivered for association "X" stream "Y" and the next subsequent + * receive may return a message from association "X" stream "Z". Note that + * no other messages would be delivered for association "X" stream "Y" + * until all of stream "Y"'s partially delivered message was read. + * Note that this option effects both channel types. Also note that + * for an {@code SctpMultiChannel} not only may another streams + * message from the same association be delivered from the next receive, + * some other associations message may be delivered upon the next receive. + * + * <P> It is implementation specific whether or not this option is + * supported. + */ + public static final SctpSocketOption<Integer> SCTP_FRAGMENT_INTERLEAVE = + new SctpStdSocketOption<Integer>("SCTP_FRAGMENT_INTERLEAVE", + Integer.class, + sun.nio.ch.SctpStdSocketOption.SCTP_FRAGMENT_INTERLEAVE); + + /** + * The maximum number of streams requested by the local endpoint during + * association initialization. + * + * <P> The value of this socket option is an {@link + * SctpStandardSocketOption.InitMaxStreams InitMaxStreams}, that represents + * the maximum number of inbound and outbound streams that an association + * on the channel is prepared to support. + * + * <P> For an {@link SctpChannel} this option may only be used to + * change the number of inbound/outbound streams prior to connecting. + * + * <P> For an {@link SctpMultiChannel} this option determines + * the maximum number of inbound/outbound streams new associations setup + * on the channel will be prepared to support. + * + * <P> For an {@link SctpServerChannel} this option determines the + * maximum number of inbound/outbound streams accepted sockets will + * negotiate with their connecting peer. + * + * <P> In all cases the value set by this option is used in the negotiation + * of new associations setup on the channel's socket and the actual + * maximum number of inbound/outbound streams that have been negotiated + * with the peer can be retrieved from the appropriate {@link + * Association}. The {@code Association} can be retrieved from the + * {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP COMM_UP} + * {@link AssociationChangeNotification} belonging to that association. + * + * <p> This value is bounded by the actual implementation. In other + * words the user may be able to support more streams than the Operating + * System. In such a case, the Operating System limit may override the + * value requested by the user. The default value of 0 indicates to use + * the endpoints default value. + */ + public static final SctpSocketOption + <SctpStandardSocketOption.InitMaxStreams> SCTP_INIT_MAXSTREAMS = + new SctpStdSocketOption<SctpStandardSocketOption.InitMaxStreams>( + "SCTP_INIT_MAXSTREAMS", SctpStandardSocketOption.InitMaxStreams.class); + + /** + * Enables or disables a Nagle-like algorithm. + * + * <P> The value of this socket option is a {@code Boolean} that represents + * whether the option is enabled or disabled. SCTP uses an algorithm like + * <em>The Nagle Algorithm</em> to coalesce short segments and + * improve network efficiency. + */ + public static final SctpSocketOption<Boolean> SCTP_NODELAY = + new SctpStdSocketOption<Boolean>("SCTP_NODELAY", Boolean.class, + sun.nio.ch.SctpStdSocketOption.SCTP_NODELAY); + + /** + * Requests that the local SCTP stack use the given peer address as + * the association primary. + * + * <P> The value of this socket option is a {@code SocketAddress} + * that represents the peer address that the local SCTP stack should use as + * the association primary. The address must be one of the association + * peer's addresses. + * + * <P> An {@code SctpMultiChannel} can control more than one + * association, the association parameter must be given when setting or + * retrieving this option. + * + * <P> Since {@code SctpChannel} only controls one association, + * the association parameter is not required and this option can be + * set or queried directly. + */ + public static final SctpSocketOption<SocketAddress> SCTP_PRIMARY_ADDR = + new SctpStdSocketOption<SocketAddress> + ("SCTP_PRIMARY_ADDR", SocketAddress.class); + + /** + * Requests that the peer mark the enclosed address as the association + * primary. + * + * <P> The value of this socket option is a {@code SocketAddress} + * that represents the local address that the peer should use as its + * primary address. The given address must be one of the association's + * locally bound addresses. + * + * <P> An {@code SctpMultiChannel} can control more than one + * association, the association parameter must be given when setting or + * retrieving this option. + * + * <P> Since {@code SctpChannel} only controls one association, + * the association parameter is not required and this option can be + * queried directly. + * + * <P> Note, this is a set only option and cannot be retrieved by {@code + * getOption}. It is implementation specific whether or not this + * option is supported. + */ + public static final SctpSocketOption<SocketAddress> SCTP_SET_PEER_PRIMARY_ADDR = + new SctpStdSocketOption<SocketAddress> + ("SCTP_SET_PEER_PRIMARY_ADDR", SocketAddress.class); + + /** + * The size of the socket send buffer. + * + * <p> The value of this socket option is an {@code Integer} that is the + * size of the socket send buffer in bytes. The socket send buffer is an + * output buffer used by the networking implementation. It may need to be + * increased for high-volume connections. The value of the socket option is + * a <em>hint</em> to the implementation to size the buffer and the actual + * size may differ. The socket option can be queried to retrieve the actual + * size. + * + * <p> For {@code SctpChannel}, this controls the amount of data + * the SCTP stack may have waiting in internal buffers to be sent. This + * option therefore bounds the maximum size of data that can be sent in a + * single send call. + * + * <P> For {@code SctpMultiChannel}, the effect is the same as for {@code + * SctpChannel}, except that it applies to all associations. The option + * applies to each association's window size separately. + * + * <p> An implementation allows this socket option to be set before the + * socket is bound or connected. Whether an implementation allows the + * socket send buffer to be changed after the socket is bound is system + * dependent. + */ + public static final SctpSocketOption<Integer> SO_SNDBUF = + new SctpStdSocketOption<Integer>("SO_SNDBUF", Integer.class, + sun.nio.ch.SctpStdSocketOption.SO_SNDBUF); + + /** + * The size of the socket receive buffer. + * + * <P> The value of this socket option is an {@code Integer} that is the + * size of the socket receive buffer in bytes. The socket receive buffer is + * an input buffer used by the networking implementation. It may need to be + * increased for high-volume connections or decreased to limit the possible + * backlog of incoming data. The value of the socket option is a + * <em>hint</em> to the implementation to size the buffer and the actual + * size may differ. + * + * <P> For {@code SctpChannel}, this controls the receiver window size. + * + * <P> For {@code SctpMultiChannel}, the meaning is implementation + * dependent. It might control the receive buffer for each association bound + * to the socket descriptor or it might control the receive buffer for the + * whole socket. + * + * <p> An implementation allows this socket option to be set before the + * socket is bound or connected. Whether an implementation allows the + * socket receive buffer to be changed after the socket is bound is system + * dependent. + */ + public static final SctpSocketOption<Integer> SO_RCVBUF = + new SctpStdSocketOption<Integer>("SO_RCVBUF", Integer.class, + sun.nio.ch.SctpStdSocketOption.SO_RCVBUF); + + /** + * Linger on close if data is present. + * + * <p> The value of this socket option is an {@code Integer} that controls + * the action taken when unsent data is queued on the socket and a method + * to close the socket is invoked. If the value of the socket option is zero + * or greater, then it represents a timeout value, in seconds, known as the + * <em>linger interval</em>. The linger interval is the timeout for the + * {@code close} method to block while the operating system attempts to + * transmit the unsent data or it decides that it is unable to transmit the + * data. If the value of the socket option is less than zero then the option + * is disabled. In that case the {@code close} method does not wait until + * unsent data is transmitted; if possible the operating system will transmit + * any unsent data before the connection is closed. + * + * <p> This socket option is intended for use with sockets that are configured + * in {@link java.nio.channels.SelectableChannel#isBlocking() blocking} mode + * only. The behavior of the {@code close} method when this option is + * enabled on a non-blocking socket is not defined. + * + * <p> The initial value of this socket option is a negative value, meaning + * that the option is disabled. The option may be enabled, or the linger + * interval changed, at any time. The maximum value of the linger interval + * is system dependent. Setting the linger interval to a value that is + * greater than its maximum value causes the linger interval to be set to + * its maximum value. + */ + public static final SctpSocketOption<Integer> SO_LINGER = + new SctpStdSocketOption<Integer>("SO_LINGER", Integer.class, + sun.nio.ch.SctpStdSocketOption.SO_LINGER); + + /** + * This class is used to set the maximum number of inbound/outbound streams + * used by the local endpoint during association initialization. An + * instance of this class is used to set the {@link + * SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS SCTP_INIT_MAXSTREAMS} + * socket option. + * + * @since 1.7 + */ + public static class InitMaxStreams { + private int maxInStreams; + private int maxOutStreams; + + private InitMaxStreams(int maxInStreams, int maxOutStreams) { + this.maxInStreams = maxInStreams; + this.maxOutStreams = maxOutStreams; + } + + /** + * Creates an InitMaxStreams instance. + * + * @param maxInStreams + * The maximum number of inbound streams, where + * {@code 0 <= maxInStreams <= 65536} + * + * @param maxOutStreams + * The maximum number of outbound streams, where + * {@code 0 <= maxOutStreams <= 65536} + * + * @return An {@code InitMaxStreams} instance + * + * @throws IllegalArgumentException + * If an argument is outside of specified bounds + */ + public static InitMaxStreams create + (int maxInStreams, int maxOutStreams) { + if (maxOutStreams < 0 || maxOutStreams > 65535) + throw new IllegalArgumentException( + "Invalid maxOutStreams value"); + if (maxInStreams < 0 || maxInStreams > 65535) + throw new IllegalArgumentException( + "Invalid maxInStreams value"); + + return new InitMaxStreams(maxInStreams, maxOutStreams); + } + + /** + * Returns the maximum number of inbound streams. + * + * @return Maximum inbound streams + */ + public int maxInStreams() { + return maxInStreams; + } + + /** + * Returns the maximum number of outbound streams. + * + * @return Maximum outbound streams + */ + public int maxOutStreams() { + return maxOutStreams; + } + + /** + * Returns a string representation of this init max streams, including + * the maximum in and out bound streams. + * + * @return A string representation of this init max streams + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()).append(" ["); + sb.append("maxInStreams:").append(maxInStreams); + sb.append("maxOutStreams:").append(maxOutStreams).append("]"); + return sb.toString(); + } + + /** + * Returns true if the specified object is another {@code InitMaxStreams} + * instance with the same number of in and out bound streams. + * + * @param obj + * The object to be compared with this init max streams + * + * @return true if the specified object is another + * {@code InitMaxStreams} instance with the same number of in + * and out bound streams + */ + @Override + public boolean equals(Object obj) { + if (obj != null && obj instanceof InitMaxStreams) { + InitMaxStreams that = (InitMaxStreams) obj; + if (this.maxInStreams == that.maxInStreams && + this.maxOutStreams == that.maxOutStreams) + return true; + } + return false; + } + + /** + * Returns a hash code value for this init max streams. + */ + @Override + public int hashCode() { + int hash = 7 ^ maxInStreams ^ maxOutStreams; + return hash; + } + } +} diff --git a/src/share/classes/com/sun/nio/sctp/SendFailedNotification.java b/src/share/classes/com/sun/nio/sctp/SendFailedNotification.java new file mode 100644 index 0000000000000000000000000000000000000000..9df25f02ea3e95400613026026ab53a06876ed59 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/SendFailedNotification.java @@ -0,0 +1,89 @@ +/* + * 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 com.sun.nio.sctp; + +import java.nio.ByteBuffer; +import java.net.SocketAddress; + +/** + * Notification emitted when a send failed notification has been received. + * + * <P> A send failed notification indicates that a message cannot be delivered. + * Typically this is because the association has been shutdown with unsent data + * in the socket output buffer, or in the case of a {@link SctpMultiChannel} + * the association failed to setup. + * + * @since 1.7 + */ +public abstract class SendFailedNotification implements Notification { + /** + * Initializes a new instance of this class. + */ + protected SendFailedNotification() {} + + /** + * Returns the association that this notification is applicable to. + * + * @return The association that failed to send, or {@code null} if + * there is no association, that is, the notification follows a + * {@linkplain + * com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent#CANT_START} + */ + @Override + public abstract Association association(); + + /** + * Returns the address. + * + * @return The peer primary address of the association or the address that + * the message was sent to + */ + public abstract SocketAddress address(); + + /** + * Returns the data that was to be sent. + * + * @return The user data. The buffers position will be {@code 0} and its + * limit will be set to the end of the data. + */ + public abstract ByteBuffer buffer(); + + /** + * Returns the error code. + * + * <P> The errorCode gives the reason why the send failed, and if set, will + * be a SCTP protocol error code as defined in RFC2960 section 3.3.10 + * + * @return The error code + */ + public abstract int errorCode(); + + /** + * Returns the stream number that the messge was to be sent on. + * + * @return The stream number + */ + public abstract int streamNumber(); +} diff --git a/src/share/classes/com/sun/nio/sctp/ShutdownNotification.java b/src/share/classes/com/sun/nio/sctp/ShutdownNotification.java new file mode 100644 index 0000000000000000000000000000000000000000..027b09737c6357ffd1682ab02f4bf634c45e6ba8 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/ShutdownNotification.java @@ -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. 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 com.sun.nio.sctp; + +/** + * Notification emitted when a peers shutdowns an the association. + * + * <P> When a peer sends a <i>SHUTDOWN</i>, the SCTP stack delivers this + * notification to inform the application that it should cease sending data. + * + * @since 1.7 + */ +public abstract class ShutdownNotification implements Notification { + /** + * Initializes a new instance of this class. + */ + protected ShutdownNotification() {} + + /** + * Returns the association that this notification is applicable to. + * + * @return The association that received the shutdown + */ + public abstract Association association(); +} diff --git a/src/share/classes/com/sun/nio/sctp/package-info.java b/src/share/classes/com/sun/nio/sctp/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..808c6a4ebf5d16f8346ef76f21b0118cdebfdb52 --- /dev/null +++ b/src/share/classes/com/sun/nio/sctp/package-info.java @@ -0,0 +1,75 @@ +/* + * 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. + */ + +/** + * A Java API for Stream Control Transport Protocol. + * + * <P> The Stream Control Transport Protocol (SCTP) is a reliable, + * message-oriented, transport protocol existing at an equivalent level with UDP + * (User Datagram Protocol) and TCP (Transmission Control Protocol). SCTP is + * session oriented and an association between the endpoints must be established + * before any data can be transmitted. + * + * <P> SCTP has direct support for multi-homing, meaning than an endpoint may be + * represented by more than one address and each address may be used for sending + * and receiving data, thus providing network redundancy. The connection between + * two endpoints is referred to as an association between those endpoints. + * Endpoints can exchange a list of addresses during association setup. One + * address is designated as the primary address, this is the default address that + * the peer will use for sending data. A single port number is used across the + * entire address list at an endpoint for a specific session. + * + * <P> SCTP is message based. I/O operations operate upon messages and message + * boundaries are preserved. Each association may support multiple independant + * logical streams. Each stream represents a sequence of messages within a single + * association and streams are independant of one another, meaning that stream + * identifiers and sequence numbers are included in the data packet to allow + * sequencing of messages on a per-stream basis. + * + * <P> This package provides two programming model styles. The one-to-one style + * supported by {@link com.sun.nio.sctp.SctpChannel} and {@link + * com.sun.nio.sctp.SctpServerChannel}, and the one-to-many + * style supported by {@link com.sun.nio.sctp.SctpMultiChannel}. + * The semantics of the one-to-one style interface are very similar to TCP. + * An {@code SctpChannel} can only control one SCTP association. The + * semantics of the one-to-many style interface are very similar to UDP. An + * {@code SctpMutliChannel} can control multiple SCTP associations. + * + * <P> Applications can send and receive per-message ancillary information through + * {@link com.sun.nio.sctp.MessageInfo}. For example, the stream number that + * the message it is to be sent or received from. The SCTP stack is event driven + * and applications can receive notifications of certain SCTP events by invoking + * the {@code receive} method of the SCTP channel with an appropriate {@link + * com.sun.nio.sctp.NotificationHandler notification handler}. + * + * <P> The SCTP protocol is defined by + * <A HREF="http://tools.ietf.org/html/rfc4960">RFC4960</A>, and the optional + * extension for <I>Dynamic Address Reconfiguration</I> is defined by + * <A HREF="http://tools.ietf.org/html/rfc5061">RFC5061</A>. + * + * @since 1.7 + */ + +package com.sun.nio.sctp; diff --git a/src/share/classes/java/awt/AWTKeyStroke.java b/src/share/classes/java/awt/AWTKeyStroke.java index 12e43dc0a1448197398aacbbf35a75587f590196..35f57bae358d9637087ecfba9d933ba4e0887526 100644 --- a/src/share/classes/java/awt/AWTKeyStroke.java +++ b/src/share/classes/java/awt/AWTKeyStroke.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -329,6 +329,9 @@ public class AWTKeyStroke implements Serializable { * <li><code>java.awt.event.KeyEvent.VK_TAB</code> * <li><code>java.awt.event.KeyEvent.VK_SPACE</code> * </ul> + * Alternatively, the key code may be obtained by calling + * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>. + * * The modifiers consist of any combination of:<ul> * <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK * <li>java.awt.event.InputEvent.CTRL_DOWN_MASK diff --git a/src/share/classes/java/awt/Canvas.java b/src/share/classes/java/awt/Canvas.java index 04b3bc2dca46e58b5e99d7216919dfd5a3085c9f..86315e7c12ecf6b0993e88905606414515789974 100644 --- a/src/share/classes/java/awt/Canvas.java +++ b/src/share/classes/java/awt/Canvas.java @@ -25,6 +25,7 @@ package java.awt; import java.awt.image.BufferStrategy; +import java.awt.peer.CanvasPeer; import javax.accessibility.*; /** @@ -65,7 +66,17 @@ public class Canvas extends Component implements Accessible { */ public Canvas(GraphicsConfiguration config) { this(); - graphicsConfig = config; + setGraphicsConfiguration(config); + } + + @Override + void setGraphicsConfiguration(GraphicsConfiguration gc) { + CanvasPeer peer = (CanvasPeer)getPeer(); + if (peer != null) { + gc = peer.getAppropriateGraphicsConfiguration(gc); + } + + super.setGraphicsConfiguration(gc); } /** diff --git a/src/share/classes/java/awt/Component.java b/src/share/classes/java/awt/Component.java index afe091dccef838824ba0f2f6fbaff9d9ef74f068..03743332fc12d1eec97668b03a0dc59e9296f595 100644 --- a/src/share/classes/java/awt/Component.java +++ b/src/share/classes/java/awt/Component.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -300,7 +300,7 @@ public abstract class Component implements ImageObserver, MenuContainer, * @see GraphicsConfiguration * @see #getGraphicsConfiguration */ - transient GraphicsConfiguration graphicsConfig = null; + private transient GraphicsConfiguration graphicsConfig = null; /** * A reference to a <code>BufferStrategy</code> object @@ -799,8 +799,24 @@ public abstract class Component implements ImageObserver, MenuContainer, } } + // Whether this Component has had the background erase flag + // specified via SunToolkit.disableBackgroundErase(). This is + // needed in order to make this function work on X11 platforms, + // where currently there is no chance to interpose on the creation + // of the peer and therefore the call to XSetBackground. + transient boolean backgroundEraseDisabled; + static { AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() { + public void setBackgroundEraseDisabled(Component comp, boolean disabled) { + comp.backgroundEraseDisabled = disabled; + } + public boolean getBackgroundEraseDisabled(Component comp) { + return comp.backgroundEraseDisabled; + } + public Rectangle getBounds(Component comp) { + return new Rectangle(comp.x, comp.y, comp.width, comp.height); + } public void setMixingCutoutShape(Component comp, Shape shape) { Region region = shape == null ? null : Region.getInstance(shape, null); @@ -829,6 +845,22 @@ public abstract class Component implements ImageObserver, MenuContainer, } } } + + public void setGraphicsConfiguration(Component comp, + GraphicsConfiguration gc) + { + comp.setGraphicsConfiguration(gc); + } + public boolean requestFocus(Component comp, CausedFocusEvent.Cause cause) { + return comp.requestFocus(cause); + } + public boolean canBeFocusOwner(Component comp) { + return comp.canBeFocusOwner(); + } + + public boolean isVisible_NoClientCode(Component comp) { + return comp.isVisible_NoClientCode(); + } }); } @@ -996,50 +1028,21 @@ public abstract class Component implements ImageObserver, MenuContainer, */ public GraphicsConfiguration getGraphicsConfiguration() { synchronized(getTreeLock()) { - if (graphicsConfig != null) { - return graphicsConfig; - } else if (getParent() != null) { - return getParent().getGraphicsConfiguration(); - } else { - return null; - } + return getGraphicsConfiguration_NoClientCode(); } } final GraphicsConfiguration getGraphicsConfiguration_NoClientCode() { - GraphicsConfiguration graphicsConfig = this.graphicsConfig; - Container parent = this.parent; - if (graphicsConfig != null) { - return graphicsConfig; - } else if (parent != null) { - return parent.getGraphicsConfiguration_NoClientCode(); - } else { - return null; - } + return graphicsConfig; } - /** - * Resets this <code>Component</code>'s - * <code>GraphicsConfiguration</code> back to a default - * value. For most componenets, this is <code>null</code>. - * Called from the Toolkit thread, so NO CLIENT CODE. - */ - void resetGC() { + void setGraphicsConfiguration(GraphicsConfiguration gc) { synchronized(getTreeLock()) { - graphicsConfig = null; - } - } + graphicsConfig = gc; - /* - * Not called on Component, but needed for Canvas and Window - */ - void setGCFromPeer() { - synchronized(getTreeLock()) { - if (peer != null) { // can't imagine how this will be false, - // but just in case - graphicsConfig = peer.getGraphicsConfiguration(); - } else { - graphicsConfig = null; + ComponentPeer peer = getPeer(); + if (peer != null) { + peer.updateGraphicsData(gc); } } } @@ -6663,23 +6666,7 @@ public abstract class Component implements ImageObserver, MenuContainer, // Update stacking order - if (parent != null && parent.peer != null) { - ContainerPeer parentContPeer = (ContainerPeer) parent.peer; - // if our parent is lightweight and we are not - // we should call restack on nearest heavyweight - // container. - if (parentContPeer instanceof LightweightPeer - && ! (peer instanceof LightweightPeer)) - { - Container hwParent = getNativeContainer(); - if (hwParent != null && hwParent.peer != null) { - parentContPeer = (ContainerPeer) hwParent.peer; - } - } - if (parentContPeer.isRestackSupported()) { - parentContPeer.restack(); - } - } + peer.setZOrder(getHWPeerAboveMe()); if (!isAddNotifyComplete) { mixOnShowing(); @@ -7170,8 +7157,8 @@ public abstract class Component implements ImageObserver, MenuContainer, requestFocusHelper(false, true); } - void requestFocus(CausedFocusEvent.Cause cause) { - requestFocusHelper(false, true, cause); + boolean requestFocus(CausedFocusEvent.Cause cause) { + return requestFocusHelper(false, true, cause); } /** @@ -7456,7 +7443,7 @@ public abstract class Component implements ImageObserver, MenuContainer, // sometimes most recent focus owner may be null, but focus owner is not // e.g. we reset most recent focus owner if user removes focus owner focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); - if (focusOwner != null && getContainingWindow(focusOwner) != window) { + if (focusOwner != null && focusOwner.getContainingWindow() != window) { focusOwner = null; } } @@ -8689,31 +8676,9 @@ public abstract class Component implements ImageObserver, MenuContainer, * null, if component is not a part of window hierarchy */ Window getContainingWindow() { - return getContainingWindow(this); - } - /** - * Returns the <code>Window</code> ancestor of the component <code>comp</code>. - * @return Window ancestor of the component or component by itself if it is Window; - * null, if component is not a part of window hierarchy - */ - static Window getContainingWindow(Component comp) { - while (comp != null && !(comp instanceof Window)) { - comp = comp.getParent(); - } - - return (Window)comp; + return SunToolkit.getContainingWindow(this); } - - - - - - - - - - /** * Initialize JNI field and method IDs */ @@ -9575,6 +9540,27 @@ public abstract class Component implements ImageObserver, MenuContainer, return nextAbove < 0 ? -1 : nextAbove; } + final ComponentPeer getHWPeerAboveMe() { + checkTreeLock(); + + Container cont = getContainer(); + int indexAbove = getSiblingIndexAbove(); + + while (cont != null) { + for (int i = indexAbove; i > -1; i--) { + Component comp = cont.getComponent(i); + if (comp != null && comp.isDisplayable() && !comp.isLightweight()) { + return comp.getPeer(); + } + } + + indexAbove = cont.getSiblingIndexAbove(); + cont = cont.getContainer(); + } + + return null; + } + final int getSiblingIndexBelow() { checkTreeLock(); Container parent = getContainer(); @@ -9827,4 +9813,29 @@ public abstract class Component implements ImageObserver, MenuContainer, } // ****************** END OF MIXING CODE ******************************** + + private static boolean doesClassImplement(Class cls, String interfaceName) { + if (cls == null) return false; + + for (Class c : cls.getInterfaces()) { + if (c.getName().equals(interfaceName)) { + return true; + } + } + return doesClassImplement(cls.getSuperclass(), interfaceName); + } + + /** + * Checks that the given object implements the given interface. + * @param obj Object to be checked + * @param interfaceName The name of the interface. Must be fully-qualified interface name. + * @return true, if this object implements the given interface, + * false, otherwise, or if obj or interfaceName is null + */ + static boolean doesImplement(Object obj, String interfaceName) { + if (obj == null) return false; + if (interfaceName == null) return false; + + return doesClassImplement(obj.getClass(), interfaceName); + } } diff --git a/src/share/classes/java/awt/Container.java b/src/share/classes/java/awt/Container.java index 04425d5a45a51b6fd0c97aadecd2b9d8c5c8b54a..9a184a7a2ea046e0afd3c71e8da4f8ce25865c4a 100644 --- a/src/share/classes/java/awt/Container.java +++ b/src/share/classes/java/awt/Container.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -167,6 +167,9 @@ public class Container extends Component { transient int listeningBoundsChildren; transient int descendantsCount; + /* Non-opaque window support -- see Window.setLayersOpaque */ + transient Color preserveBackgroundColor = null; + /** * JDK 1.1 serialVersionUID */ @@ -267,9 +270,13 @@ public class Container extends Component { /** * Gets the number of components in this panel. + * <p> + * Note: This method should be called under AWT tree lock. + * * @return the number of components in this panel. * @see #getComponent * @since JDK1.1 + * @see Component#getTreeLock() */ public int getComponentCount() { return countComponents(); @@ -281,43 +288,65 @@ public class Container extends Component { */ @Deprecated public int countComponents() { - synchronized (getTreeLock()) { - return component.size(); - } + // This method is not synchronized under AWT tree lock. + // Instead, the calling code is responsible for the + // synchronization. See 6784816 for details. + return component.size(); } /** * Gets the nth component in this container. + * <p> + * Note: This method should be called under AWT tree lock. + * * @param n the index of the component to get. * @return the n<sup>th</sup> component in this container. * @exception ArrayIndexOutOfBoundsException * if the n<sup>th</sup> value does not exist. + * @see Component#getTreeLock() */ public Component getComponent(int n) { - synchronized (getTreeLock()) { - if ((n < 0) || (n >= component.size())) { - throw new ArrayIndexOutOfBoundsException("No such child: " + n); - } + // This method is not synchronized under AWT tree lock. + // Instead, the calling code is responsible for the + // synchronization. See 6784816 for details. + try { return component.get(n); + } catch (IndexOutOfBoundsException z) { + throw new ArrayIndexOutOfBoundsException("No such child: " + n); } } /** * Gets all the components in this container. + * <p> + * Note: This method should be called under AWT tree lock. + * * @return an array of all the components in this container. + * @see Component#getTreeLock() */ public Component[] getComponents() { + // This method is not synchronized under AWT tree lock. + // Instead, the calling code is responsible for the + // synchronization. See 6784816 for details. return getComponents_NoClientCode(); } + // NOTE: This method may be called by privileged threads. // This functionality is implemented in a package-private method // to insure that it cannot be overridden by client subclasses. // DO NOT INVOKE CLIENT CODE ON THIS THREAD! final Component[] getComponents_NoClientCode() { + return component.toArray(EMPTY_ARRAY); + } + + /* + * Wrapper for getComponents() method with a proper synchronization. + */ + Component[] getComponentsSync() { synchronized (getTreeLock()) { - return component.toArray(EMPTY_ARRAY); + return getComponents(); } - } // getComponents_NoClientCode() + } /** * Determines the insets of this container, which indicate the size @@ -503,6 +532,9 @@ public class Container extends Component { adjustDescendants(-(comp.countHierarchyMembers())); comp.parent = null; + if (needRemoveNotify) { + comp.setGraphicsConfiguration(null); + } component.remove(index); invalidateIfValid(); @@ -643,10 +675,7 @@ public class Container extends Component { // each HW descendant independently. return !comp.peer.isReparentSupported(); } else { - // if container didn't change we still might need to recreate component's window as - // changes to zorder should be reflected in native window stacking order and it might - // not be supported by the platform. This is important only for heavyweight child - return !((ContainerPeer)(newNativeContainer.peer)).isRestackSupported(); + return false; } } @@ -786,6 +815,7 @@ public class Container extends Component { component.add(index, comp); } comp.parent = this; + comp.setGraphicsConfiguration(getGraphicsConfiguration()); adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK, comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK)); @@ -802,11 +832,6 @@ public class Container extends Component { if (peer != null) { if (comp.peer == null) { // Remove notify was called or it didn't have peer - create new one comp.addNotify(); - // New created peer creates component on top of the stacking order - Container newNativeContainer = getHeavyweightContainer(); - if (((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported()) { - ((ContainerPeer)newNativeContainer.getPeer()).restack(); - } } else { // Both container and child have peers, it means child peer should be reparented. // In both cases we need to reparent native widgets. Container newNativeContainer = getHeavyweightContainer(); @@ -815,13 +840,8 @@ public class Container extends Component { // Native container changed - need to reparent native widgets newNativeContainer.reparentChild(comp); } - // If component still has a peer and it is either container or heavyweight - // and restack is supported we have to restack native windows since order might have changed - if ((!comp.isLightweight() || (comp instanceof Container)) - && ((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported()) - { - ((ContainerPeer)newNativeContainer.getPeer()).restack(); - } + comp.peer.setZOrder(comp.getHWPeerAboveMe()); + if (!comp.isLightweight() && isLightweight()) { // If component is heavyweight and one of the containers is lightweight // the location of the component should be fixed. @@ -1034,9 +1054,9 @@ public class Container extends Component { } checkAddToSelf(comp); checkNotAWindow(comp); - if (thisGC != null) { - comp.checkGD(thisGC.getDevice().getIDstring()); - } + if (thisGC != null) { + comp.checkGD(thisGC.getDevice().getIDstring()); + } /* Reparent the component and tidy up the tree's state. */ if (comp.parent != null) { @@ -1053,6 +1073,7 @@ public class Container extends Component { component.add(index, comp); } comp.parent = this; + comp.setGraphicsConfiguration(thisGC); adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK, comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK)); @@ -1091,6 +1112,19 @@ public class Container extends Component { } } + @Override + void setGraphicsConfiguration(GraphicsConfiguration gc) { + synchronized (getTreeLock()) { + super.setGraphicsConfiguration(gc); + + for (Component comp : component) { + if (comp != null) { + comp.setGraphicsConfiguration(gc); + } + } + } + } + /** * Checks that all Components that this Container contains are on * the same GraphicsDevice as this Container. If not, throws an @@ -1148,6 +1182,7 @@ public class Container extends Component { comp.parent = null; component.remove(index); + comp.setGraphicsConfiguration(null); invalidateIfValid(); if (containerListener != null || @@ -1224,6 +1259,7 @@ public class Container extends Component { layoutMgr.removeLayoutComponent(comp); } comp.parent = null; + comp.setGraphicsConfiguration(null); if (containerListener != null || (eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 || Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) { @@ -1339,7 +1375,7 @@ public class Container extends Component { } private int getListenersCount(int id, boolean enabledOnToolkit) { - assert Thread.holdsLock(getTreeLock()); + checkTreeLock(); if (enabledOnToolkit) { return descendantsCount; } @@ -1357,7 +1393,7 @@ public class Container extends Component { final int createHierarchyEvents(int id, Component changed, Container changedParent, long changeFlags, boolean enabledOnToolkit) { - assert Thread.holdsLock(getTreeLock()); + checkTreeLock(); int listeners = getListenersCount(id, enabledOnToolkit); for (int count = listeners, i = 0; count > 0; i++) { @@ -1372,7 +1408,7 @@ public class Container extends Component { final void createChildHierarchyEvents(int id, long changeFlags, boolean enabledOnToolkit) { - assert Thread.holdsLock(getTreeLock()); + checkTreeLock(); if (component.isEmpty()) { return; } @@ -1507,6 +1543,7 @@ public class Container extends Component { * @see #validate */ protected void validateTree() { + checkTreeLock(); if (!isValid()) { if (peer instanceof ContainerPeer) { ((ContainerPeer)peer).beginLayout(); @@ -1783,7 +1820,7 @@ public class Container extends Component { // super.paint(); -- Don't bother, since it's a NOP. GraphicsCallback.PaintCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS); + runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS); } } @@ -1838,7 +1875,7 @@ public class Container extends Component { } GraphicsCallback.PrintCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS); + runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS); } } @@ -1851,7 +1888,7 @@ public class Container extends Component { public void paintComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PaintAllCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES); + runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES); } } @@ -1873,8 +1910,8 @@ public class Container extends Component { void paintHeavyweightComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PaintHeavyweightComponentsCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS | - GraphicsCallback.HEAVYWEIGHTS); + runComponents(getComponentsSync(), g, + GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS); } } @@ -1887,7 +1924,7 @@ public class Container extends Component { public void printComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PrintAllCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES); + runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES); } } @@ -1909,8 +1946,8 @@ public class Container extends Component { void printHeavyweightComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PrintHeavyweightComponentsCallback.getInstance(). - runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS | - GraphicsCallback.HEAVYWEIGHTS); + runComponents(getComponentsSync(), g, + GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS); } } @@ -2460,9 +2497,7 @@ public class Container extends Component { * @since 1.2 */ public Component findComponentAt(int x, int y) { - synchronized (getTreeLock()) { - return findComponentAt(x, y, true); - } + return findComponentAt(x, y, true); } /** @@ -2475,58 +2510,60 @@ public class Container extends Component { * The addition of this feature is temporary, pending the * adoption of new, public API which exports this feature. */ - final Component findComponentAt(int x, int y, boolean ignoreEnabled) - { - if (isRecursivelyVisible()){ - return findComponentAtImpl(x, y, ignoreEnabled); + final Component findComponentAt(int x, int y, boolean ignoreEnabled) { + synchronized (getTreeLock()) { + if (isRecursivelyVisible()){ + return findComponentAtImpl(x, y, ignoreEnabled); + } } return null; } final Component findComponentAtImpl(int x, int y, boolean ignoreEnabled){ + checkTreeLock(); + if (!(contains(x, y) && visible && (ignoreEnabled || enabled))) { return null; } // Two passes: see comment in sun.awt.SunGraphicsCallback - synchronized (getTreeLock()) { - for (int i = 0; i < component.size(); i++) { - Component comp = component.get(i); - if (comp != null && - !(comp.peer instanceof LightweightPeer)) { - if (comp instanceof Container) { - comp = ((Container)comp).findComponentAtImpl(x - comp.x, - y - comp.y, - ignoreEnabled); - } else { - comp = comp.locate(x - comp.x, y - comp.y); - } - if (comp != null && comp.visible && - (ignoreEnabled || comp.enabled)) - { - return comp; - } + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null && + !(comp.peer instanceof LightweightPeer)) { + if (comp instanceof Container) { + comp = ((Container)comp).findComponentAtImpl(x - comp.x, + y - comp.y, + ignoreEnabled); + } else { + comp = comp.locate(x - comp.x, y - comp.y); + } + if (comp != null && comp.visible && + (ignoreEnabled || comp.enabled)) + { + return comp; } } - for (int i = 0; i < component.size(); i++) { - Component comp = component.get(i); - if (comp != null && - comp.peer instanceof LightweightPeer) { - if (comp instanceof Container) { - comp = ((Container)comp).findComponentAtImpl(x - comp.x, - y - comp.y, - ignoreEnabled); - } else { - comp = comp.locate(x - comp.x, y - comp.y); - } - if (comp != null && comp.visible && - (ignoreEnabled || comp.enabled)) - { - return comp; - } + } + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null && + comp.peer instanceof LightweightPeer) { + if (comp instanceof Container) { + comp = ((Container)comp).findComponentAtImpl(x - comp.x, + y - comp.y, + ignoreEnabled); + } else { + comp = comp.locate(x - comp.x, y - comp.y); + } + if (comp != null && comp.visible && + (ignoreEnabled || comp.enabled)) + { + return comp; } } } + return this; } @@ -2584,13 +2621,6 @@ public class Container extends Component { for (int i = 0; i < component.size(); i++) { component.get(i).addNotify(); } - // Update stacking order if native platform allows - ContainerPeer cpeer = (ContainerPeer)peer; - if (cpeer.isRestackSupported()) { - cpeer.restack(); - } - - } } @@ -3488,7 +3518,7 @@ public class Container extends Component { private void writeObject(ObjectOutputStream s) throws IOException { ObjectOutputStream.PutField f = s.putFields(); f.put("ncomponents", component.size()); - f.put("component", component.toArray(EMPTY_ARRAY)); + f.put("component", getComponentsSync()); f.put("layoutMgr", layoutMgr); f.put("dispatcher", dispatcher); f.put("maxSize", maxSize); diff --git a/src/share/classes/java/awt/DefaultKeyboardFocusManager.java b/src/share/classes/java/awt/DefaultKeyboardFocusManager.java index 5dd0d9061ff0ef2dfbfd42fa7a99ed0383624db0..71342bdaeedecf2be65eb34433e2c33332f6fcae 100644 --- a/src/share/classes/java/awt/DefaultKeyboardFocusManager.java +++ b/src/share/classes/java/awt/DefaultKeyboardFocusManager.java @@ -479,7 +479,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager { // that a Component outside of the focused Window receives a // FOCUS_GAINED event. We synthesize a WINDOW_GAINED_FOCUS // event in that case. - final Window newFocusedWindow = Component.getContainingWindow(newFocusOwner); + final Window newFocusedWindow = SunToolkit.getContainingWindow(newFocusOwner); final Window currentFocusedWindow = getGlobalFocusedWindow(); if (newFocusedWindow != null && newFocusedWindow != currentFocusedWindow) diff --git a/src/share/classes/java/awt/Dialog.java b/src/share/classes/java/awt/Dialog.java index 310e52350e1e70261555ac18b62b0db82aefe956..a67d94a32ae70cce8b0b570a5cf7e74ec317af91 100644 --- a/src/share/classes/java/awt/Dialog.java +++ b/src/share/classes/java/awt/Dialog.java @@ -1226,7 +1226,7 @@ public class Dialog extends Window { synchronized (getTreeLock()) { if (keepBlockingEDT) { keepBlockingEDT = false; - PeerEvent wakingEvent = new PeerEvent(this, new WakingRunnable(), PeerEvent.PRIORITY_EVENT); + PeerEvent wakingEvent = new PeerEvent(getToolkit(), new WakingRunnable(), PeerEvent.PRIORITY_EVENT); AppContext curAppContext = AppContext.getAppContext(); if (showAppContext != curAppContext) { // Wake up event dispatch thread on which the dialog was diff --git a/src/share/classes/java/awt/Font.java b/src/share/classes/java/awt/Font.java index 01f401e9702382197d681ce51ef7a8040e3909ac..f73e0e90c153d5347642e3776e75c2b6ffdaaae4 100644 --- a/src/share/classes/java/awt/Font.java +++ b/src/share/classes/java/awt/Font.java @@ -37,6 +37,8 @@ import java.awt.geom.Rectangle2D; 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.AttributeMap; 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 @@ public class Font implements java.io.Serializable } /* 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; @@ -787,6 +792,29 @@ public class Font implements java.io.Serializable return new Font(attributes); } + /** + * 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 <code>Font</code> using the specified font type * and input data. The new <code>Font</code> is @@ -822,58 +850,96 @@ public class Font implements java.io.Serializable 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; - } - }); - - 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"); + boolean copiedFontData = false; + + try { + final File tFile = AccessController.doPrivileged( + new PrivilegedExceptionAction<File>() { + public File run() throws IOException { + return File.createTempFile("+~JF", ".tmp", null); + } + } + ); + + int totalSize = 0; + CreatedFontTracker tracker = null; + try { + final OutputStream outStream = + AccessController.doPrivileged( + new PrivilegedExceptionAction<OutputStream>() { + 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<Void>() { + 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 class Font implements java.io.Serializable */ 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 @@ public class Font implements java.io.Serializable if (!fontFile.canRead()) { throw new IOException("Can't read " + fontFile); } - return new Font(fontFile, fontFormat, false); + return new Font(fontFile, fontFormat, false, null); } /** diff --git a/src/share/classes/java/awt/Frame.java b/src/share/classes/java/awt/Frame.java index 290f7f9bb3d2e64fe7b58ffcf68aa7d5b4ea4235..761b9b8420b306ced2de70dbe0d7d0969e63fa73 100644 --- a/src/share/classes/java/awt/Frame.java +++ b/src/share/classes/java/awt/Frame.java @@ -36,6 +36,7 @@ import java.io.ObjectInputStream; import java.io.IOException; import sun.awt.AppContext; import sun.awt.SunToolkit; +import sun.awt.AWTAccessor; import java.lang.ref.WeakReference; import javax.accessibility.*; @@ -738,11 +739,15 @@ public class Frame extends Window implements MenuContainer { * @since 1.4 * @see java.awt.Window#addWindowStateListener */ - public synchronized void setExtendedState(int state) { + public void setExtendedState(int state) { if ( !isFrameStateSupported( state ) ) { return; } - this.state = state; + synchronized (getObjectLock()) { + this.state = state; + } + // peer.setState must be called outside of object lock + // synchronization block to avoid possible deadlock FramePeer peer = (FramePeer)this.peer; if (peer != null) { peer.setState(state); @@ -804,12 +809,27 @@ public class Frame extends Window implements MenuContainer { * @see #setExtendedState(int) * @since 1.4 */ - public synchronized int getExtendedState() { - FramePeer peer = (FramePeer)this.peer; - if (peer != null) { - state = peer.getState(); + public int getExtendedState() { + synchronized (getObjectLock()) { + return state; } - return state; + } + + static { + AWTAccessor.setFrameAccessor( + new AWTAccessor.FrameAccessor() { + public void setExtendedState(Frame frame, int state) { + synchronized(frame.getObjectLock()) { + frame.state = state; + } + } + public int getExtendedState(Frame frame) { + synchronized(frame.getObjectLock()) { + return frame.state; + } + } + } + ); } /** @@ -967,7 +987,7 @@ public class Frame extends Window implements MenuContainer { if (resizable) { str += ",resizable"; } - getExtendedState(); // sync with peer + int state = getExtendedState(); if (state == NORMAL) { str += ",normal"; } diff --git a/src/share/classes/java/awt/GraphicsConfiguration.java b/src/share/classes/java/awt/GraphicsConfiguration.java index 03b147f8a4366d0d27c998939c9064ae99e17a2f..c520d310bbe566a57b220ed730264291380a682c 100644 --- a/src/share/classes/java/awt/GraphicsConfiguration.java +++ b/src/share/classes/java/awt/GraphicsConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -434,4 +434,20 @@ public abstract class GraphicsConfiguration { } return defaultImageCaps; } + + /** + * Returns whether this GraphicsConfiguration supports + * the {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT + * PERPIXEL_TRANSLUCENT} kind of translucency. + * + * @param gc GraphicsConfiguration + * @throws NullPointerException if the gc argument is null + * @return whether the given GraphicsConfiguration supports + * the translucency effects. + * @see Window#setBackground(Color) + */ + /*public */boolean isTranslucencyCapable() { + // Overridden in subclasses + return false; } +} diff --git a/src/share/classes/java/awt/GraphicsDevice.java b/src/share/classes/java/awt/GraphicsDevice.java index 47b578129ddfd0cbf78abad2671dda13e665193e..920687150d942a026b21cee43e81395a84e60a6c 100644 --- a/src/share/classes/java/awt/GraphicsDevice.java +++ b/src/share/classes/java/awt/GraphicsDevice.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -27,7 +27,10 @@ package java.awt; import java.awt.image.ColorModel; + +import sun.awt.AWTAccessor; import sun.awt.AppContext; +import sun.awt.SunToolkit; /** * The <code>GraphicsDevice</code> class describes the graphics devices @@ -109,6 +112,31 @@ public abstract class GraphicsDevice { */ public final static int TYPE_IMAGE_BUFFER = 2; + /** Kinds of translucency supported by the underlying system. + * @see #isTranslucencySupported + */ + /*public */static enum WindowTranslucency { + /** + * Represents support in the underlying system for windows each pixel + * of which is guaranteed to be either completely opaque, with + * an alpha value of 1.0, or completely transparent, with an alpha + * value of 0.0. + */ + PERPIXEL_TRANSPARENT, + /** + * Represents support in the underlying system for windows all of + * the pixels of which have the same alpha value between or including + * 0.0 and 1.0. + */ + TRANSLUCENT, + /** + * Represents support in the underlying system for windows that + * contain or might contain pixels with arbitrary alpha values + * between and including 0.0 and 1.0. + */ + PERPIXEL_TRANSLUCENT; + } + /** * Returns the type of this <code>GraphicsDevice</code>. * @return the type of this <code>GraphicsDevice</code>, which can @@ -235,6 +263,21 @@ public abstract class GraphicsDevice { * @since 1.4 */ public void setFullScreenWindow(Window w) { + if (w != null) { + //XXX: The actions should be documented in some non-update release. + /* + if (w.getShape() != null) { + w.setShape(w, null); + } + if (!w.isOpaque()) { + w.setOpaque(false); + } + if (w.getOpacity() < 1.0f) { + w.setOpacity(1.0f); + } + */ + } + if (fullScreenWindow != null && windowedModeBounds != null) { // if the window went into fs mode before it was realized it may // have (0,0) dimensions @@ -424,4 +467,94 @@ public abstract class GraphicsDevice { public int getAvailableAcceleratedMemory() { return -1; } + + /** + * Returns whether the given level of translucency is supported + * this graphics device. + * + * @param translucencyKind a kind of translucency support + * @return whether the given translucency kind is supported + */ + /*public */boolean isWindowTranslucencySupported(WindowTranslucency translucencyKind) { + switch (translucencyKind) { + case PERPIXEL_TRANSPARENT: + return isWindowShapingSupported(); + case TRANSLUCENT: + return isWindowOpacitySupported(); + case PERPIXEL_TRANSLUCENT: + return isWindowPerpixelTranslucencySupported(); + } + return false; + } + + /** + * Returns whether the windowing system supports changing the shape + * of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * shaping (due to the bugs in the windowing system). + */ + static boolean isWindowShapingSupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowShapingSupported(); + } + + /** + * Returns whether the windowing system supports changing the opacity + * value of top-level windows. + * Note that this method may sometimes return true, but the native + * windowing system may still not support the concept of + * translucency (due to the bugs in the windowing system). + */ + static boolean isWindowOpacitySupported() { + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + return ((SunToolkit)curToolkit).isWindowOpacitySupported(); + } + + boolean isWindowPerpixelTranslucencySupported() { + /* + * Per-pixel alpha is supported if all the conditions are TRUE: + * 1. The toolkit is a sort of SunToolkit + * 2. The toolkit supports translucency in general + * (isWindowTranslucencySupported()) + * 3. There's at least one translucency-capable + * GraphicsConfiguration + */ + Toolkit curToolkit = Toolkit.getDefaultToolkit(); + if (!(curToolkit instanceof SunToolkit)) { + return false; + } + if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) { + return false; + } + + // TODO: cache translucency capable GC + return getTranslucencyCapableGC() != null; + } + + GraphicsConfiguration getTranslucencyCapableGC() { + // If the default GC supports translucency return true. + // It is important to optimize the verification this way, + // see CR 6661196 for more details. + GraphicsConfiguration defaultGC = getDefaultConfiguration(); + if (defaultGC.isTranslucencyCapable()) { + return defaultGC; + } + + // ... otherwise iterate through all the GCs. + GraphicsConfiguration[] configs = getConfigurations(); + for (int j = 0; j < configs.length; j++) { + if (configs[j].isTranslucencyCapable()) { + return configs[j]; + } + } + + return null; + } } diff --git a/src/share/classes/java/awt/KeyboardFocusManager.java b/src/share/classes/java/awt/KeyboardFocusManager.java index b84b93b021eaca8d7056e2bb8b871b56a0461791..521c70403ae006c5ff6e7c1d94b8d48693d06cf9 100644 --- a/src/share/classes/java/awt/KeyboardFocusManager.java +++ b/src/share/classes/java/awt/KeyboardFocusManager.java @@ -61,6 +61,7 @@ import sun.awt.HeadlessToolkit; import sun.awt.SunToolkit; import sun.awt.CausedFocusEvent; import sun.awt.KeyboardFocusManagerPeerProvider; +import sun.awt.AWTAccessor; /** * The KeyboardFocusManager is responsible for managing the active and focused @@ -118,6 +119,32 @@ public abstract class KeyboardFocusManager if (!GraphicsEnvironment.isHeadless()) { initIDs(); } + AWTAccessor.setKeyboardFocusManagerAccessor( + new AWTAccessor.KeyboardFocusManagerAccessor() { + public int shouldNativelyFocusHeavyweight(Component heavyweight, + Component descendant, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time, + CausedFocusEvent.Cause cause) + { + return KeyboardFocusManager.shouldNativelyFocusHeavyweight( + heavyweight, descendant, temporary, focusedWindowChangeAllowed, time, cause); + } + public boolean processSynchronousLightweightTransfer(Component heavyweight, + Component descendant, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time) + { + return KeyboardFocusManager.processSynchronousLightweightTransfer( + heavyweight, descendant, temporary, focusedWindowChangeAllowed, time); + } + public void removeLastFocusRequest(Component heavyweight) { + KeyboardFocusManager.removeLastFocusRequest(heavyweight); + } + } + ); } transient KeyboardFocusManagerPeer peer; @@ -2208,7 +2235,7 @@ public abstract class KeyboardFocusManager boolean temporary, boolean focusedWindowChangeAllowed, long time) { - Window parentWindow = Component.getContainingWindow(heavyweight); + Window parentWindow = SunToolkit.getContainingWindow(heavyweight); if (parentWindow == null || !parentWindow.syncLWRequests) { return false; } @@ -2443,79 +2470,7 @@ public abstract class KeyboardFocusManager } } } - static void heavyweightButtonDown(Component heavyweight, long time) { - heavyweightButtonDown(heavyweight, time, false); - } - static void heavyweightButtonDown(Component heavyweight, long time, boolean acceptDuplicates) { - if (log.isLoggable(Level.FINE)) { - if (heavyweight == null) { - log.log(Level.FINE, "Assertion (heavyweight != null) failed"); - } - if (time == 0) { - log.log(Level.FINE, "Assertion (time != 0) failed"); - } - } - KeyboardFocusManager manager = getCurrentKeyboardFocusManager(SunToolkit.targetToAppContext(heavyweight)); - synchronized (heavyweightRequests) { - HeavyweightFocusRequest hwFocusRequest = getLastHWRequest(); - Component currentNativeFocusOwner = (hwFocusRequest == null) - ? manager.getNativeFocusOwner() - : hwFocusRequest.heavyweight; - - // Behavior for all use cases: - // 1. Heavyweight leaf Components (e.g., Button, Checkbox, Choice, - // List, TextComponent, Canvas) that respond to button down. - // - // Native platform will generate a FOCUS_GAINED if and only if - // the Component is not the focus owner (or, will not be the - // focus owner when all outstanding focus requests are - // processed). - // - // 2. Panel with no descendants. - // - // Same as (1). - // - // 3. Panel with at least one heavyweight descendant. - // - // This function should NOT be called for this case! - // - // 4. Panel with only lightweight descendants. - // - // Native platform will generate a FOCUS_GAINED if and only if - // neither the Panel, nor any of its recursive, lightweight - // descendants, is the focus owner. However, we want a - // requestFocus() for any lightweight descendant to win out over - // the focus request for the Panel. To accomplish this, we - // differ from the algorithm for shouldNativelyFocusHeavyweight - // as follows: - // a. If the requestFocus() for a lightweight descendant has - // been fully handled by the time this function is invoked, - // then 'hwFocusRequest' will be null and 'heavyweight' - // will be the native focus owner. Do *not* synthesize a - // focus transfer to the Panel. - // b. If the requestFocus() for a lightweight descendant has - // been recorded, but not handled, then 'hwFocusRequest' - // will be non-null and 'hwFocusRequest.heavyweight' will - // equal 'heavyweight'. Do *not* append 'heavyweight' to - // hwFocusRequest.lightweightRequests. - // c. If the requestFocus() for a lightweight descendant is - // yet to be made, then post a new HeavyweightFocusRequest. - // If no lightweight descendant ever requests focus, then - // the Panel will get focus. If some descendant does, then - // the descendant will get focus by either a synthetic - // focus transfer, or a lightweightRequests focus transfer. - - if (acceptDuplicates || heavyweight != currentNativeFocusOwner) { - getCurrentKeyboardFocusManager - (SunToolkit.targetToAppContext(heavyweight)). - enqueueKeyEvents(time, heavyweight); - heavyweightRequests.add - (new HeavyweightFocusRequest(heavyweight, heavyweight, - false, CausedFocusEvent.Cause.MOUSE_EVENT)); - } - } - } /** * Returns the Window which will be active after processing this request, * or null if this is a duplicate request. The active Window is useful @@ -2542,7 +2497,7 @@ public abstract class KeyboardFocusManager (HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER); Component activeWindow = ((hwFocusRequest != null) - ? Component.getContainingWindow(hwFocusRequest.heavyweight) + ? SunToolkit.getContainingWindow(hwFocusRequest.heavyweight) : nativeFocusedWindow); while (activeWindow != null && !((activeWindow instanceof Frame) || @@ -3013,8 +2968,8 @@ public abstract class KeyboardFocusManager } private static boolean focusedWindowChanged(Component to, Component from) { - Window wto = Component.getContainingWindow(to); - Window wfrom = Component.getContainingWindow(from); + Window wto = SunToolkit.getContainingWindow(to); + Window wfrom = SunToolkit.getContainingWindow(from); if (wto == null && wfrom == null) { return true; } @@ -3028,8 +2983,8 @@ public abstract class KeyboardFocusManager } private static boolean isTemporary(Component to, Component from) { - Window wto = Component.getContainingWindow(to); - Window wfrom = Component.getContainingWindow(from); + Window wto = SunToolkit.getContainingWindow(to); + Window wfrom = SunToolkit.getContainingWindow(from); if (wto == null && wfrom == null) { return false; } diff --git a/src/share/classes/java/awt/MenuItem.java b/src/share/classes/java/awt/MenuItem.java index 71dd760a9bd86c2e8eff046520d41b18c5568035..c8596d74f7407e5d97f6e0e5f32697b064c32a37 100644 --- a/src/share/classes/java/awt/MenuItem.java +++ b/src/share/classes/java/awt/MenuItem.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -398,9 +398,11 @@ public class MenuItem extends MenuComponent implements Accessible { boolean handleShortcut(KeyEvent e) { MenuShortcut s = new MenuShortcut(e.getKeyCode(), (e.getModifiers() & InputEvent.SHIFT_MASK) > 0); + MenuShortcut sE = new MenuShortcut(e.getExtendedKeyCode(), + (e.getModifiers() & InputEvent.SHIFT_MASK) > 0); // Fix For 6185151: Menu shortcuts of all menuitems within a menu // should be disabled when the menu itself is disabled - if (s.equals(shortcut) && isItemEnabled()) { + if ((s.equals(shortcut) || sE.equals(shortcut)) && isItemEnabled()) { // MenuShortcut match -- issue an event on keydown. if (e.getID() == KeyEvent.KEY_PRESSED) { doMenuEvent(e.getWhen(), e.getModifiers()); diff --git a/src/share/classes/java/awt/MenuShortcut.java b/src/share/classes/java/awt/MenuShortcut.java index 50eef973f13be1d8942bab79e103bc10ecb10526..004cf7c44fe338c1abd0ce2c5ddf59b51c4fc4db 100644 --- a/src/share/classes/java/awt/MenuShortcut.java +++ b/src/share/classes/java/awt/MenuShortcut.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -34,7 +34,21 @@ import java.awt.event.KeyEvent; * For example, a menu shortcut for Ctrl-a (assuming that Control is * the accelerator key) would be created with code like the following: * <p> - * MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false); + * <code>MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);</code> + * <p> or alternatively + * <p> + * <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('A'), false);</code> + * <p> + * Menu shortcuts may also be constructed for a wider set of keycodes + * using the <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code> call. + * For example, a menu shortcut for "Ctrl+cyrillic ef" is created by + * <p> + * <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('\u0444'), false);</code> + * <p> + * Note that shortcuts created with a keycode or an extended keycode defined as a constant in <code>KeyEvent</code> + * work regardless of the current keyboard layout. However, a shortcut made of + * an extended keycode not listed in <code>KeyEvent</code> + * only work if the current keyboard layout produces a corresponding letter. * <p> * The accelerator key is platform-dependent and may be obtained * via {@link Toolkit#getMenuShortcutKeyMask}. diff --git a/src/share/classes/java/awt/Window.java b/src/share/classes/java/awt/Window.java index 2651729f20d3677c3fd6894214709dc161829e69..01d9ff59d0038e9d5132cfb35c27aba0ae73d15c 100644 --- a/src/share/classes/java/awt/Window.java +++ b/src/share/classes/java/awt/Window.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -25,8 +25,10 @@ package java.awt; import java.awt.event.*; +import java.awt.geom.Point2D; import java.awt.im.InputContext; import java.awt.image.BufferStrategy; +import java.awt.image.BufferedImage; import java.awt.peer.ComponentPeer; import java.awt.peer.WindowPeer; import java.beans.PropertyChangeListener; @@ -49,6 +51,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.concurrent.atomic.AtomicBoolean; import javax.accessibility.*; +import sun.awt.AWTAccessor; import sun.awt.AppContext; import sun.awt.CausedFocusEvent; import sun.awt.SunToolkit; @@ -291,6 +294,25 @@ public class Window extends Container implements Accessible { */ transient boolean isInShow = false; + /* + * Opacity level of the window + * + * @see #setOpacity(float) + * @see #getOpacity() + * @since 1.7 + */ + private float opacity = 1.0f; + + /* + * The shape assigned to this window. This field is set to null if + * no shape is set (rectangular window). + * + * @see #getShape() + * @see #setShape(Shape) + * @since 1.7 + */ + private Shape shape = null; + private static final String base = "win"; private static int nameCounter = 0; @@ -305,6 +327,23 @@ public class Window extends Container implements Accessible { transient boolean isTrayIconWindow = false; + /** + * These fields are initialized in the native peer code + * or via AWTAccessor's WindowAccessor. + */ + private transient volatile int securityWarningWidth = 0; + private transient volatile int securityWarningHeight = 0; + + /** + * These fields represent the desired location for the security + * warning if this window is untrusted. + * See com.sun.awt.SecurityWarning for more details. + */ + private transient double securityWarningPointX = 2.0; + private transient double securityWarningPointY = 0.0; + private transient float securityWarningAlignmentX = RIGHT_ALIGNMENT; + private transient float securityWarningAlignmentY = TOP_ALIGNMENT; + static { /* ensure that the necessary native libraries are loaded */ Toolkit.loadLibraries(); @@ -373,6 +412,18 @@ public class Window extends Container implements Accessible { } } + private GraphicsConfiguration initGC(GraphicsConfiguration gc) { + GraphicsEnvironment.checkHeadless(); + + if (gc == null) { + gc = GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice().getDefaultConfiguration(); + } + setGraphicsConfiguration(gc); + + return gc; + } + private void init(GraphicsConfiguration gc) { GraphicsEnvironment.checkHeadless(); @@ -384,14 +435,10 @@ public class Window extends Container implements Accessible { setWarningString(); this.cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); this.visible = false; - if (gc == null) { - this.graphicsConfig = - GraphicsEnvironment.getLocalGraphicsEnvironment(). - getDefaultScreenDevice().getDefaultConfiguration(); - } else { - this.graphicsConfig = gc; - } - if (graphicsConfig.getDevice().getType() != + + gc = initGC(gc); + + if (gc.getDevice().getType() != GraphicsDevice.TYPE_RASTER_SCREEN) { throw new IllegalArgumentException("not a screen device"); } @@ -399,8 +446,8 @@ public class Window extends Container implements Accessible { /* offset the initial location with the original of the screen */ /* and any insets */ - Rectangle screenBounds = graphicsConfig.getBounds(); - Insets screenInsets = getToolkit().getScreenInsets(graphicsConfig); + Rectangle screenBounds = gc.getBounds(); + Insets screenInsets = getToolkit().getScreenInsets(gc); int x = getX() + screenBounds.x + screenInsets.left; int y = getY() + screenBounds.y + screenInsets.top; if (x != this.x || y != this.y) { @@ -2744,7 +2791,7 @@ public class Window extends Container implements Accessible { sun.java2d.Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this)); addToWindowList(); - + initGC(null); } private void deserializeResources(ObjectInputStream s) @@ -2849,6 +2896,15 @@ public class Window extends Container implements Accessible { if(aot) { setAlwaysOnTop(aot); // since 1.5; subject to permission check } + shape = (Shape)f.get("shape", null); + opacity = (Float)f.get("opacity", 1.0f); + + this.securityWarningWidth = 0; + this.securityWarningHeight = 0; + this.securityWarningPointX = 2.0; + this.securityWarningPointY = 0.0; + this.securityWarningAlignmentX = RIGHT_ALIGNMENT; + this.securityWarningAlignmentY = TOP_ALIGNMENT; deserializeResources(s); } @@ -2916,41 +2972,18 @@ public class Window extends Container implements Accessible { } // inner class AccessibleAWTWindow - /** - * This method returns the GraphicsConfiguration used by this Window. - * @since 1.3 - */ - public GraphicsConfiguration getGraphicsConfiguration() { - //NOTE: for multiscreen, this will need to take into account - //which screen the window is on/mostly on instead of returning the - //default or constructor argument config. - synchronized(getTreeLock()) { - if (graphicsConfig == null && !GraphicsEnvironment.isHeadless()) { - graphicsConfig = - GraphicsEnvironment. getLocalGraphicsEnvironment(). - getDefaultScreenDevice(). - getDefaultConfiguration(); - } - return graphicsConfig; - } - } - - /** - * Reset this Window's GraphicsConfiguration to match its peer. - */ - void resetGC() { - if (!GraphicsEnvironment.isHeadless()) { - // use the peer's GC - setGCFromPeer(); - // if it's still null, use the default - if (graphicsConfig == null) { - graphicsConfig = GraphicsEnvironment. + @Override + void setGraphicsConfiguration(GraphicsConfiguration gc) { + if (gc == null) { + gc = GraphicsEnvironment. getLocalGraphicsEnvironment(). getDefaultScreenDevice(). getDefaultConfiguration(); - } + } + synchronized (getTreeLock()) { + super.setGraphicsConfiguration(gc); if (log.isLoggable(Level.FINER)) { - log.finer("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this); + log.finer("+ Window.setGraphicsConfiguration(): new GC is \n+ " + getGraphicsConfiguration_NoClientCode() + "\n+ this is " + this); } } } @@ -3010,13 +3043,13 @@ public class Window extends Container implements Accessible { // target location int dx = 0, dy = 0; // target GC - GraphicsConfiguration gc = this.graphicsConfig; + GraphicsConfiguration gc = getGraphicsConfiguration_NoClientCode(); Rectangle gcBounds = gc.getBounds(); Dimension windowSize = getSize(); // search a top-level of c - Window componentWindow = Component.getContainingWindow(c); + Window componentWindow = SunToolkit.getContainingWindow(c); if ((c == null) || (componentWindow == null)) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); @@ -3304,6 +3337,225 @@ public class Window extends Container implements Accessible { } + // ******************** SHAPES & TRANSPARENCY CODE ******************** + + /** + * JavaDoc + */ + /*public */float getOpacity() { + synchronized (getTreeLock()) { + return opacity; + } + } + + /** + * JavaDoc + */ + /*public */void setOpacity(float opacity) { + synchronized (getTreeLock()) { + if (opacity < 0.0f || opacity > 1.0f) { + throw new IllegalArgumentException( + "The value of opacity should be in the range [0.0f .. 1.0f]."); + } + GraphicsConfiguration gc = getGraphicsConfiguration(); + GraphicsDevice gd = gc.getDevice(); + if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)) { + throw new UnsupportedOperationException( + "TRANSLUCENT translucency is not supported."); + } + if ((gc.getDevice().getFullScreenWindow() == this) && (opacity < 1.0f)) { + throw new IllegalArgumentException( + "Setting opacity for full-screen window is not supported."); + } + this.opacity = opacity; + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.setOpacity(opacity); + } + } + } + + /** + * JavaDoc + */ + /*public */Shape getShape() { + synchronized (getTreeLock()) { + return shape; + } + } + + /** + * JavaDoc + * + * @param window the window to set the shape to + * @param shape the shape to set to the window + * @throws IllegalArgumentException if the window is in full screen mode, + * and the shape is not null + */ + /*public */void setShape(Shape shape) { + synchronized (getTreeLock()) { + GraphicsConfiguration gc = getGraphicsConfiguration(); + GraphicsDevice gd = gc.getDevice(); + if (!gd.isWindowTranslucencySupported( + GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT)) + { + throw new UnsupportedOperationException( + "PERPIXEL_TRANSPARENT translucency is not supported."); + } + if ((gc.getDevice().getFullScreenWindow() == this) && (shape != null)) { + throw new IllegalArgumentException( + "Setting shape for full-screen window is not supported."); + } + this.shape = shape; + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.applyShape(shape == null ? null : Region.getInstance(shape, null)); + } + } + } + + /** + * JavaDoc + */ +/* + @Override + public void setBackground(Color bgColor) { + int alpha = bgColor.getAlpha(); + if (alpha < 255) { // non-opaque window + GraphicsConfiguration gc = getGraphicsConfiguration(); + GraphicsDevice gd = gc.getDevice(); + if (gc.getDevice().getFullScreenWindow() == this) { + throw new IllegalArgumentException( + "Making full-screen window non opaque is not supported."); + } + if (!gc.isTranslucencyCapable()) { + GraphicsConfiguration capableGC = gd.getTranslucencyCapableGC(); + if (capableGC == null) { + throw new IllegalArgumentException( + "PERPIXEL_TRANSLUCENT translucency is not supported"); + } + // TODO: change GC + } + setLayersOpaque(this, false); + } + + super.setBackground(bgColor); + + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.setOpaque(alpha == 255); + } + } +*/ + + private transient boolean opaque = true; + + void setOpaque(boolean opaque) { + synchronized (getTreeLock()) { + GraphicsConfiguration gc = getGraphicsConfiguration(); + if (!opaque && !com.sun.awt.AWTUtilities.isTranslucencyCapable(gc)) { + throw new IllegalArgumentException( + "The window must use a translucency-compatible graphics configuration"); + } + if (!com.sun.awt.AWTUtilities.isTranslucencySupported( + com.sun.awt.AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT)) + { + throw new UnsupportedOperationException( + "PERPIXEL_TRANSLUCENT translucency is not supported."); + } + if ((gc.getDevice().getFullScreenWindow() == this) && !opaque) { + throw new IllegalArgumentException( + "Making full-screen window non opaque is not supported."); + } + setLayersOpaque(this, opaque); + this.opaque = opaque; + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.setOpaque(opaque); + } + } + } + + private void updateWindow(BufferedImage backBuffer) { + synchronized (getTreeLock()) { + WindowPeer peer = (WindowPeer)getPeer(); + if (peer != null) { + peer.updateWindow(backBuffer); + } + } + } + + private static final Color TRANSPARENT_BACKGROUND_COLOR = new Color(0, 0, 0, 0); + + private static void setLayersOpaque(Component component, boolean isOpaque) { + // Shouldn't use instanceof to avoid loading Swing classes + // if it's a pure AWT application. + if (Component.doesImplement(component, "javax.swing.RootPaneContainer")) { + javax.swing.RootPaneContainer rpc = (javax.swing.RootPaneContainer)component; + javax.swing.JRootPane root = rpc.getRootPane(); + javax.swing.JLayeredPane lp = root.getLayeredPane(); + Container c = root.getContentPane(); + javax.swing.JComponent content = + (c instanceof javax.swing.JComponent) ? (javax.swing.JComponent)c : null; + javax.swing.JComponent gp = + (rpc.getGlassPane() instanceof javax.swing.JComponent) ? + (javax.swing.JComponent)rpc.getGlassPane() : null; + if (gp != null) { + gp.setDoubleBuffered(isOpaque); + } + lp.setOpaque(isOpaque); + root.setOpaque(isOpaque); + root.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround + if (content != null) { + content.setOpaque(isOpaque); + content.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround + + // Iterate down one level to see whether we have a JApplet + // (which is also a RootPaneContainer) which requires processing + int numChildren = content.getComponentCount(); + if (numChildren > 0) { + Component child = content.getComponent(0); + // It's OK to use instanceof here because we've + // already loaded the RootPaneContainer class by now + if (child instanceof javax.swing.RootPaneContainer) { + setLayersOpaque(child, isOpaque); + } + } + } + } + + Color bg = component.getBackground(); + boolean hasTransparentBg = TRANSPARENT_BACKGROUND_COLOR.equals(bg); + + Container container = null; + if (component instanceof Container) { + container = (Container) component; + } + + if (isOpaque) { + if (hasTransparentBg) { + // Note: we use the SystemColor.window color as the default. + // This color is used in the WindowPeer implementations to + // initialize the background color of the window if it is null. + // (This might not be the right thing to do for other + // RootPaneContainers we might be invoked with) + Color newColor = null; + if (container != null && container.preserveBackgroundColor != null) { + newColor = container.preserveBackgroundColor; + } else { + newColor = SystemColor.window; + } + component.setBackground(newColor); + } + } else { + if (!hasTransparentBg && container != null) { + container.preserveBackgroundColor = bg; + } + component.setBackground(TRANSPARENT_BACKGROUND_COLOR); + } + } + + // ************************** MIXING CODE ******************************* // A window has a parent, but it does NOT have a container @@ -3341,6 +3593,87 @@ public class Window extends Container implements Accessible { // ****************** END OF MIXING CODE ******************************** + // This method gets the window location/size as reported by the native + // system since the locally cached values may represent outdated data. + // NOTE: this method is invoked on the toolkit thread, and therefore + // is not supposed to become public/user-overridable. + private Point2D calculateSecurityWarningPosition(double x, double y, + double w, double h) + { + return new Point2D.Double( + x + w * securityWarningAlignmentX + securityWarningPointX, + y + h * securityWarningAlignmentY + securityWarningPointY); + } + + static { + AWTAccessor.setWindowAccessor(new AWTAccessor.WindowAccessor() { + public float getOpacity(Window window) { + return window.opacity; + } + public void setOpacity(Window window, float opacity) { + window.setOpacity(opacity); + } + public Shape getShape(Window window) { + return window.getShape(); + } + public void setShape(Window window, Shape shape) { + window.setShape(shape); + } + public boolean isOpaque(Window window) { + /* + return window.getBackground().getAlpha() < 255; + */ + synchronized (window.getTreeLock()) { + return window.opaque; + } + } + public void setOpaque(Window window, boolean opaque) { + /* + Color bg = window.getBackground(); + window.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(), + opaque ? 255 : 0)); + */ + window.setOpaque(opaque); + } + public void updateWindow(Window window, BufferedImage backBuffer) { + window.updateWindow(backBuffer); + } + + public Dimension getSecurityWarningSize(Window window) { + return new Dimension(window.securityWarningWidth, + window.securityWarningHeight); + } + + public void setSecurityWarningSize(Window window, int width, int height) + { + window.securityWarningWidth = width; + window.securityWarningHeight = height; + } + + public void setSecurityWarningPosition(Window window, + Point2D point, float alignmentX, float alignmentY) + { + window.securityWarningPointX = point.getX(); + window.securityWarningPointY = point.getY(); + window.securityWarningAlignmentX = alignmentX; + window.securityWarningAlignmentY = alignmentY; + + synchronized (window.getTreeLock()) { + WindowPeer peer = (WindowPeer)window.getPeer(); + if (peer != null) { + peer.repositionSecurityWarning(); + } + } + } + + public Point2D calculateSecurityWarningPosition(Window window, + double x, double y, double w, double h) + { + return window.calculateSecurityWarningPosition(x, y, w, h); + } + }); // WindowAccessor + } // static + } // class Window diff --git a/src/share/classes/java/awt/event/KeyEvent.java b/src/share/classes/java/awt/event/KeyEvent.java index 039675702972f64d4446bb0697d8cda02016a25a..1c0d3723d8a4b9e6a68a61546441f37656123235 100644 --- a/src/share/classes/java/awt/event/KeyEvent.java +++ b/src/share/classes/java/awt/event/KeyEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -65,15 +65,16 @@ import java.io.ObjectInputStream; * <p> * For key pressed and key released events, the getKeyCode method returns * the event's keyCode. For key typed events, the getKeyCode method - * always returns VK_UNDEFINED. + * always returns {@code VK_UNDEFINED}. The {@code getExtendedKeyCode} method + * may also be used with many international keyboard layouts. * * <p> * <em>"Key pressed" and "key released" events</em> are lower-level and depend * on the platform and keyboard layout. They are generated whenever a key is * pressed or released, and are the only way to find out about keys that don't * generate character input (e.g., action keys, modifier keys, etc.). The key - * being pressed or released is indicated by the getKeyCode method, which returns - * a virtual key code. + * being pressed or released is indicated by the {@code getKeyCode} and {@code getExtendedKeyCode} + * methods, which return a virtual key code. * * <p> * <em>Virtual key codes</em> are used to report which keyboard key has @@ -111,6 +112,11 @@ import java.io.ObjectInputStream; * platform and keyboard layout. For example, the key that generates VK_Q * when using a U.S. keyboard layout will generate VK_A when using a French * keyboard layout. + * <li>The key that generates {@code VK_Q} when using a U.S. keyboard layout also + * generates a unique code for Russian or Hebrew layout. There is no a + * {@code VK_} constant for these and many other codes in various layouts. These codes + * may be obtained by using {@code getExtendedKeyCode} and are used whenever + * a {@code VK_} constant is used. * <li>Not all characters have a keycode associated with them. For example, * there is no keycode for the question mark because there is no keyboard * for which it appears on the primary layer. @@ -891,6 +897,12 @@ public class KeyEvent extends InputEvent { */ int keyLocation; + //set from native code. + private transient long rawCode = 0; + private transient long primaryLevelUnicode = 0; + private transient long scancode = 0; // for MS Windows only + private transient long extendedKeyCode = 0; + /* * JDK 1.1 serialVersionUID */ @@ -1315,6 +1327,9 @@ public class KeyEvent extends InputEvent { return numpad + "-" + c; } + if ((keyCode & 0x01000000) != 0) { + return String.valueOf((char)(keyCode ^ 0x01000000 )); + } String unknown = Toolkit.getProperty("AWT.unknown", "Unknown"); return unknown + " keyCode: 0x" + Integer.toString(keyCode, 16); } @@ -1551,9 +1566,44 @@ public class KeyEvent extends InputEvent { str.append("KEY_LOCATION_UNKNOWN"); break; } + str.append(",rawCode=").append(rawCode); + str.append(",primaryLevelUnicode=").append(primaryLevelUnicode); + str.append(",scancode=").append(scancode); + str.append(",extendedKeyCode=0x").append(Long.toHexString(extendedKeyCode)); return str.toString(); } + /** + * Returns an extended key code for the event. + * The extended key code is a unique id assigned to a key on the keyboard + * just like {@code keyCode}. However, unlike {@code keyCode}, this value depends on the + * current keyboard layout. For instance, pressing the left topmost letter key + * in a common English layout produces the same value as {@code keyCode}, {@code VK_Q}. + * Pressing the same key in a regular Russian layout gives another code, unique for the + * letter "Cyrillic I short". + * + * @since 1.7 + * + */ + public int getExtendedKeyCode() { + return (int)extendedKeyCode; + } + /** + * Returns an extended key code for a unicode character. + * + * @return for a unicode character with a corresponding {@code VK_} constant -- this + * {@code VK_} constant; for a character appearing on the primary + * level of a known keyboard layout -- a unique integer. + * If a character does not appear on the primary level of a known keyboard, + * {@code VK_UNDEFINED} is returned. + * + * @since 1.7 + * + */ + public static int getExtendedKeyCodeForChar(int c) { + // Return a keycode (if any) associated with a character. + return sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(c); + } /** * Sets new modifiers by the old ones. The key modifiers diff --git a/src/share/classes/java/awt/peer/CanvasPeer.java b/src/share/classes/java/awt/peer/CanvasPeer.java index bbf6a111086352b8d1d725639de7a91aebd776ec..94b8d189d8deff2b9ed8abe5abad2992dc9d7c3b 100644 --- a/src/share/classes/java/awt/peer/CanvasPeer.java +++ b/src/share/classes/java/awt/peer/CanvasPeer.java @@ -25,6 +25,7 @@ package java.awt.peer; import java.awt.Canvas; +import java.awt.GraphicsConfiguration; /** * The peer interface for {@link Canvas}. @@ -36,4 +37,13 @@ import java.awt.Canvas; * instances. */ public interface CanvasPeer extends ComponentPeer { + /** + * Requests a GC that best suits this Canvas. The returned GC may differ + * from the requested GC passed as the argument to this method. This method + * must return a non-null value (given the argument is non-null as well). + * + * @since 1.7 + */ + GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc); } diff --git a/src/share/classes/java/awt/peer/ComponentPeer.java b/src/share/classes/java/awt/peer/ComponentPeer.java index e71ab27f7ac7dfe0a48fe80eb15b2d99c3f0b459..3c26d5c4fae89cf182c70d6300bc94d09efd899a 100644 --- a/src/share/classes/java/awt/peer/ComponentPeer.java +++ b/src/share/classes/java/awt/peer/ComponentPeer.java @@ -539,4 +539,16 @@ public interface ComponentPeer { */ void applyShape(Region shape); + /** + * Lowers this component at the bottom of the above HW peer. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + void setZOrder(ComponentPeer above); + + /** + * Updates internal data structures related to the component's GC. + * + * @since 1.7 + */ + void updateGraphicsData(GraphicsConfiguration gc); } diff --git a/src/share/classes/java/awt/peer/ContainerPeer.java b/src/share/classes/java/awt/peer/ContainerPeer.java index 092a54f2a24b9d5ed372be212c386dd115e6cea3..8bb3f10c1f13248111b013a983768769d488a12d 100644 --- a/src/share/classes/java/awt/peer/ContainerPeer.java +++ b/src/share/classes/java/awt/peer/ContainerPeer.java @@ -76,21 +76,4 @@ public interface ContainerPeer extends ComponentPeer { * @see Container#validateTree() */ void endLayout(); - - /** - * Restacks native windows - children of this native window - according to - * Java container order. - * - * @since 1.5 - */ - void restack(); - - /** - * Indicates availability of restacking operation in this container. - * - * @return Returns true if restack is supported, false otherwise - * - * @since 1.5 - */ - boolean isRestackSupported(); } diff --git a/src/share/classes/java/awt/peer/WindowPeer.java b/src/share/classes/java/awt/peer/WindowPeer.java index 7b5da857f405669f379aa4f9bdf19f354db89432..5cacef3c4857bfb12efe5445070da2077cf16b30 100644 --- a/src/share/classes/java/awt/peer/WindowPeer.java +++ b/src/share/classes/java/awt/peer/WindowPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -27,6 +27,8 @@ package java.awt.peer; import java.awt.*; +import java.awt.image.BufferedImage; + /** * The peer interface for {@link Window}. * @@ -92,4 +94,31 @@ public interface WindowPeer extends ContainerPeer { * @see Window#setIconImages(java.util.List) */ void updateIconImages(); + + /** + * Sets the level of opacity for the window. + * + * @see Window#setOpacity(float) + */ + void setOpacity(float opacity); + + /** + * Enables the per-pixel alpha support for the window. + * + * @see Window#setBackground(Color) + */ + void setOpaque(boolean isOpaque); + + /** + * Updates the native part of non-opaque window using + * the given image with color+alpha values for each pixel. + * + * @see Window#setBackground(Color) + */ + void updateWindow(BufferedImage backBuffer); + + /** + * Instructs the peer to update the position of the security warning. + */ + void repositionSecurityWarning(); } diff --git a/src/share/classes/java/beans/Beans.java b/src/share/classes/java/beans/Beans.java index f19b21aead21254efb06530874580db97d4a613e..8a750a8b15ca17fd02e4f5ee8c63cdd5693bc49b 100644 --- a/src/share/classes/java/beans/Beans.java +++ b/src/share/classes/java/beans/Beans.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -27,26 +27,41 @@ package java.beans; import com.sun.beans.finder.ClassFinder; -import java.applet.*; +import java.applet.Applet; +import java.applet.AppletContext; +import java.applet.AppletStub; +import java.applet.AudioClip; -import java.awt.*; - -import java.beans.AppletInitializer; +import java.awt.GraphicsEnvironment; +import java.awt.Image; import java.beans.beancontext.BeanContext; -import java.io.*; - -import java.lang.reflect.Constructor; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.io.StreamCorruptedException; import java.net.URL; -import java.lang.reflect.Array; + +import java.security.AccessController; +import java.security.PrivilegedAction; + +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Vector; + +import sun.awt.AppContext; /** * This class provides some general purpose beans control methods. */ public class Beans { + private static final Object DESIGN_TIME = new Object(); + private static final Object GUI_AVAILABLE = new Object(); /** * <p> @@ -59,12 +74,12 @@ public class Beans { * @param beanName the name of the bean within the class-loader. * For example "sun.beanbox.foobah" * - * @exception java.lang.ClassNotFoundException if the class of a serialized + * @exception ClassNotFoundException if the class of a serialized * object could not be found. - * @exception java.io.IOException if an I/O error occurs. + * @exception IOException if an I/O error occurs. */ - public static Object instantiate(ClassLoader cls, String beanName) throws java.io.IOException, ClassNotFoundException { + public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException { return Beans.instantiate(cls, beanName, null, null); } @@ -80,12 +95,12 @@ public class Beans { * For example "sun.beanbox.foobah" * @param beanContext The BeanContext in which to nest the new bean * - * @exception java.lang.ClassNotFoundException if the class of a serialized + * @exception ClassNotFoundException if the class of a serialized * object could not be found. - * @exception java.io.IOException if an I/O error occurs. + * @exception IOException if an I/O error occurs. */ - public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws java.io.IOException, ClassNotFoundException { + public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException { return Beans.instantiate(cls, beanName, beanContext, null); } @@ -135,19 +150,19 @@ public class Beans { * @param beanContext The BeanContext in which to nest the new bean * @param initializer The AppletInitializer for the new bean * - * @exception java.lang.ClassNotFoundException if the class of a serialized + * @exception ClassNotFoundException if the class of a serialized * object could not be found. - * @exception java.io.IOException if an I/O error occurs. + * @exception IOException if an I/O error occurs. */ public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer) - throws java.io.IOException, ClassNotFoundException { + throws IOException, ClassNotFoundException { - java.io.InputStream ins; - java.io.ObjectInputStream oins = null; + InputStream ins; + ObjectInputStream oins = null; Object result = null; boolean serialized = false; - java.io.IOException serex = null; + IOException serex = null; // If the given classloader is null, we check if an // system classloader is available and (if so) @@ -166,8 +181,8 @@ public class Beans { // Try to find a serialized object with this name final String serName = beanName.replace('.','/').concat(".ser"); final ClassLoader loader = cls; - ins = (InputStream)java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction() { + ins = (InputStream)AccessController.doPrivileged + (new PrivilegedAction() { public Object run() { if (loader == null) return ClassLoader.getSystemResourceAsStream(serName); @@ -185,7 +200,7 @@ public class Beans { result = oins.readObject(); serialized = true; oins.close(); - } catch (java.io.IOException ex) { + } catch (IOException ex) { ins.close(); // Drop through and try opening the class. But remember // the exception in case we can't find the class either. @@ -264,8 +279,8 @@ public class Beans { final ClassLoader cloader = cls; objectUrl = (URL) - java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction() { + AccessController.doPrivileged + (new PrivilegedAction() { public Object run() { if (cloader == null) return ClassLoader.getSystemResource @@ -377,10 +392,11 @@ public class Beans { * @return True if we are running in an application construction * environment. * - * @see java.beans.DesignMode + * @see DesignMode */ public static boolean isDesignTime() { - return designTime; + Object value = AppContext.getAppContext().get(DESIGN_TIME); + return (value instanceof Boolean) && (Boolean) value; } /** @@ -393,11 +409,12 @@ public class Beans { * false in a server environment or if an application is * running as part of a batch job. * - * @see java.beans.Visibility + * @see Visibility * */ public static boolean isGuiAvailable() { - return guiAvailable; + Object value = AppContext.getAppContext().get(GUI_AVAILABLE); + return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless(); } /** @@ -423,7 +440,7 @@ public class Beans { if (sm != null) { sm.checkPropertiesAccess(); } - designTime = isDesignTime; + AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime)); } /** @@ -449,14 +466,7 @@ public class Beans { if (sm != null) { sm.checkPropertiesAccess(); } - guiAvailable = isGuiAvailable; - } - - - private static boolean designTime; - private static boolean guiAvailable; - static { - guiAvailable = !GraphicsEnvironment.isHeadless(); + AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable)); } } @@ -501,7 +511,7 @@ class ObjectInputStreamWithLoader extends ObjectInputStream class BeansAppletContext implements AppletContext { Applet target; - java.util.Hashtable imageCache = new java.util.Hashtable(); + Hashtable imageCache = new Hashtable(); BeansAppletContext(Applet target) { this.target = target; @@ -546,8 +556,8 @@ class BeansAppletContext implements AppletContext { return null; } - public java.util.Enumeration getApplets() { - java.util.Vector applets = new java.util.Vector(); + public Enumeration getApplets() { + Vector applets = new Vector(); applets.addElement(target); return applets.elements(); } @@ -573,7 +583,7 @@ class BeansAppletContext implements AppletContext { return null; } - public java.util.Iterator getStreamKeys(){ + public Iterator getStreamKeys(){ // We do nothing. return null; } diff --git a/src/share/classes/java/beans/IndexedPropertyChangeEvent.java b/src/share/classes/java/beans/IndexedPropertyChangeEvent.java index ea78643e435070b739167b9b691eff94d4bee491..951cd871fe515c7c6ada00651b423856a995d21c 100644 --- a/src/share/classes/java/beans/IndexedPropertyChangeEvent.java +++ b/src/share/classes/java/beans/IndexedPropertyChangeEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -41,6 +41,7 @@ package java.beans; * @author Mark Davidson */ public class IndexedPropertyChangeEvent extends PropertyChangeEvent { + private static final long serialVersionUID = -320227448495806870L; private int index; diff --git a/src/share/classes/java/beans/IntrospectionException.java b/src/share/classes/java/beans/IntrospectionException.java index cac0b20fc0104b989b192db73c2b75fd39059978..2f5a65eda73656f7a744557b5ff410c64383999d 100644 --- a/src/share/classes/java/beans/IntrospectionException.java +++ b/src/share/classes/java/beans/IntrospectionException.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -36,6 +36,7 @@ package java.beans; public class IntrospectionException extends Exception { + private static final long serialVersionUID = -3728150539969542619L; /** * Constructs an <code>IntrospectionException</code> with a diff --git a/src/share/classes/java/beans/PropertyChangeEvent.java b/src/share/classes/java/beans/PropertyChangeEvent.java index 69f523d92e317640fdf1ffe1f7869daeb30d71f7..3e0c9cef6f979c0ce75f4b11d249573f669bdf47 100644 --- a/src/share/classes/java/beans/PropertyChangeEvent.java +++ b/src/share/classes/java/beans/PropertyChangeEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -44,6 +44,7 @@ package java.beans; */ public class PropertyChangeEvent extends java.util.EventObject { + private static final long serialVersionUID = 7042693688939648123L; /** * Constructs a new <code>PropertyChangeEvent</code>. diff --git a/src/share/classes/java/beans/PropertyVetoException.java b/src/share/classes/java/beans/PropertyVetoException.java index f736b3bade56bd04570c0512bcb44fef73a5e191..73376496b53c32c490f69bc16923952b9b32807c 100644 --- a/src/share/classes/java/beans/PropertyVetoException.java +++ b/src/share/classes/java/beans/PropertyVetoException.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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,7 +33,7 @@ package java.beans; public class PropertyVetoException extends Exception { - + private static final long serialVersionUID = 129596057694162164L; /** * Constructs a <code>PropertyVetoException</code> with a diff --git a/src/share/classes/java/beans/beancontext/BeanContextEvent.java b/src/share/classes/java/beans/beancontext/BeanContextEvent.java index 4574605a15478047f740f3de3ad2385fa5d5edb9..2530869534becdcc9551ca28320cc769146876f5 100644 --- a/src/share/classes/java/beans/beancontext/BeanContextEvent.java +++ b/src/share/classes/java/beans/beancontext/BeanContextEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -48,6 +48,7 @@ import java.beans.beancontext.BeanContext; */ public abstract class BeanContextEvent extends EventObject { + private static final long serialVersionUID = 7267998073569045052L; /** * Contruct a BeanContextEvent diff --git a/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java b/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java index 7e6c1ae0a69323fed8b9e22db6398200b6119257..3752e390341cf606f0b463298f56a7208b1b1d81 100644 --- a/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java +++ b/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -55,6 +55,7 @@ import java.util.Iterator; * @see java.beans.beancontext.BeanContextMembershipListener */ public class BeanContextMembershipEvent extends BeanContextEvent { + private static final long serialVersionUID = 3499346510334590959L; /** * Contruct a BeanContextMembershipEvent diff --git a/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java b/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java index 558c7f9f3637a0301d6348f7f96350fa28fc2e42..7bb47a660330a03041d9747f406a571e0c605ff0 100644 --- a/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java +++ b/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -40,6 +40,7 @@ import java.util.Iterator; */ public class BeanContextServiceAvailableEvent extends BeanContextEvent { + private static final long serialVersionUID = -5333985775656400778L; /** * Construct a <code>BeanContextAvailableServiceEvent</code>. diff --git a/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java b/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java index a508f4ca1578c88ee76ac24016665e34c2713c9b..50d888cdf7ea7534d22e419d47947dab4f52b796 100644 --- a/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java +++ b/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -37,6 +37,7 @@ import java.beans.beancontext.BeanContextServices; * </p> */ public class BeanContextServiceRevokedEvent extends BeanContextEvent { + private static final long serialVersionUID = -1295543154724961754L; /** * Construct a <code>BeanContextServiceEvent</code>. diff --git a/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java b/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java index d9552c8a34e45f6d41626e7fcfa8a78dbef2113a..54dfdd7d227e0c93fdb616e538ae1e8415c14b95 100644 --- a/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java +++ b/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -60,6 +60,7 @@ import java.util.Locale; public class BeanContextServicesSupport extends BeanContextSupport implements BeanContextServices { + private static final long serialVersionUID = -8494482757288719206L; /** * <p> @@ -594,6 +595,7 @@ public class BeanContextServicesSupport extends BeanContextSupport */ protected static class BCSSServiceProvider implements Serializable { + private static final long serialVersionUID = 861278251667444782L; BCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) { super(); diff --git a/src/share/classes/java/lang/Character.java b/src/share/classes/java/lang/Character.java index 33b936f9c01d47f02528b24ba7623ddc36b9d753..e33052ee170c6f951b49e9866a50618ac7089b2a 100644 --- a/src/share/classes/java/lang/Character.java +++ b/src/share/classes/java/lang/Character.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 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 @@ -920,9 +920,9 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara */ public static final UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS = new UnicodeBlock("COMBINING_MARKS_FOR_SYMBOLS", new String[] {"Combining Diacritical Marks for Symbols", - "CombiningDiacriticalMarksforSymbols", - "Combining Marks for Symbols", - "CombiningMarksforSymbols" }); + "CombiningDiacriticalMarksforSymbols", + "Combining Marks for Symbols", + "CombiningMarksforSymbols" }); /** * Constant for the "Letterlike Symbols" Unicode character block. @@ -1332,8 +1332,11 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara * @since 1.5 */ public static final UnicodeBlock CYRILLIC_SUPPLEMENTARY = - new UnicodeBlock("CYRILLIC_SUPPLEMENTARY", new String[] {"Cyrillic Supplementary", - "CyrillicSupplementary"}); + new UnicodeBlock("CYRILLIC_SUPPLEMENTARY", + new String[] {"Cyrillic Supplementary", + "CyrillicSupplementary", + "Cyrillic Supplement", + "CyrillicSupplement"}); /** * Constant for the "Tagalog" Unicode character block. @@ -1641,157 +1644,579 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara public static final UnicodeBlock LOW_SURROGATES = new UnicodeBlock("LOW_SURROGATES", new String[] {"Low Surrogates", "LowSurrogates"}); + /** + * Constant for the "Arabic Supplement" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ARABIC_SUPPLEMENT = + new UnicodeBlock("ARABIC_SUPPLEMENT", + new String[] { "Arabic Supplement", + "ArabicSupplement"}); + + /** + * Constant for the "NKo" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock NKO = new UnicodeBlock("NKO"); + + /** + * Constant for the "Ethiopic Supplement" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ETHIOPIC_SUPPLEMENT = + new UnicodeBlock("ETHIOPIC_SUPPLEMENT", + new String[] { "Ethiopic Supplement", + "EthiopicSupplement"}); + + /** + * Constant for the "New Tai Lue" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock NEW_TAI_LUE = + new UnicodeBlock("NEW_TAI_LUE", + new String[] { "New Tai Lue", + "NewTaiLue"}); + + /** + * Constant for the "Buginese" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock BUGINESE = + new UnicodeBlock("BUGINESE"); + + /** + * Constant for the "Balinese" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock BALINESE = + new UnicodeBlock("BALINESE"); + + /** + * Constant for the "Sundanese" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SUNDANESE = + new UnicodeBlock("SUNDANESE"); + + /** + * Constant for the "Lepcha" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LEPCHA = new UnicodeBlock("LEPCHA"); + + /** + * Constant for the "Ol Chiki" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock OL_CHIKI = + new UnicodeBlock("OL_CHIKI", + new String[] { "Ol Chiki", + "OlChiki"}); + + /** + * Constant for the "Phonetic Extensions Supplement" Unicode character + * block. + * @since 1.7 + */ + public static final UnicodeBlock PHONETIC_EXTENSIONS_SUPPLEMENT = + new UnicodeBlock("PHONETIC_EXTENSIONS_SUPPLEMENT", + new String[] { "Phonetic Extensions Supplement", + "PhoneticExtensionsSupplement"}); + + /** + * Constant for the "Combining Diacritical Marks Supplement" Unicode + * character block. + * @since 1.7 + */ + public static final UnicodeBlock COMBINING_DIACRITICAL_MARKS_SUPPLEMENT = + new UnicodeBlock("COMBINING_DIACRITICAL_MARKS_SUPPLEMENT", + new String[] { "Combining Diacritical Marks Supplement", + "CombiningDiacriticalMarksSupplement"}); + + /** + * Constant for the "Glagolitic" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock GLAGOLITIC = + new UnicodeBlock("GLAGOLITIC"); + + /** + * Constant for the "Latin Extended-C" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LATIN_EXTENDED_C = + new UnicodeBlock("LATIN_EXTENDED_C", + new String[] { "Latin Extended-C", + "LatinExtended-C"}); + + /** + * Constant for the "Coptic" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock COPTIC = new UnicodeBlock("COPTIC"); + + /** + * Constant for the "Georgian Supplement" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock GEORGIAN_SUPPLEMENT = + new UnicodeBlock("GEORGIAN_SUPPLEMENT", + new String[] { "Georgian Supplement", + "GeorgianSupplement"}); + + /** + * Constant for the "Tifinagh" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock TIFINAGH = + new UnicodeBlock("TIFINAGH"); + + /** + * Constant for the "Ethiopic Extended" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ETHIOPIC_EXTENDED = + new UnicodeBlock("ETHIOPIC_EXTENDED", + new String[] { "Ethiopic Extended", + "EthiopicExtended"}); + + /** + * Constant for the "Cyrillic Extended-A" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CYRILLIC_EXTENDED_A = + new UnicodeBlock("CYRILLIC_EXTENDED_A", + new String[] { "Cyrillic Extended-A", + "CyrillicExtended-A"}); + + /** + * Constant for the "Supplemental Punctuation" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SUPPLEMENTAL_PUNCTUATION = + new UnicodeBlock("SUPPLEMENTAL_PUNCTUATION", + new String[] { "Supplemental Punctuation", + "SupplementalPunctuation"}); + + /** + * Constant for the "CJK Strokes" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CJK_STROKES = + new UnicodeBlock("CJK_STROKES", + new String[] { "CJK Strokes", + "CJKStrokes"}); + + /** + * Constant for the "Vai" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock VAI = new UnicodeBlock("VAI"); + + /** + * Constant for the "Cyrillic Extended-B" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CYRILLIC_EXTENDED_B = + new UnicodeBlock("CYRILLIC_EXTENDED_B", + new String[] { "Cyrillic Extended-B", + "CyrillicExtended-B"}); + + /** + * Constant for the "Modifier Tone Letters" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock MODIFIER_TONE_LETTERS = + new UnicodeBlock("MODIFIER_TONE_LETTERS", + new String[] { "Modifier Tone Letters", + "ModifierToneLetters"}); + + /** + * Constant for the "Latin Extended-D" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LATIN_EXTENDED_D = + new UnicodeBlock("LATIN_EXTENDED_D", + new String[] { "Latin Extended-D", + "LatinExtended-D"}); + + /** + * Constant for the "Syloti Nagri" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SYLOTI_NAGRI = + new UnicodeBlock("SYLOTI_NAGRI", + new String[] { "Syloti Nagri", + "SylotiNagri"}); + + /** + * Constant for the "Phags-pa" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock PHAGS_PA = + new UnicodeBlock("PHAGS_PA", new String[] { "Phags-pa"}); + + /** + * Constant for the "Saurashtra" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock SAURASHTRA = + new UnicodeBlock("SAURASHTRA"); + + /** + * Constant for the "Kayah Li" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock KAYAH_LI = + new UnicodeBlock("KAYAH_LI", + new String[] { "Kayah Li", + "KayahLi"}); + + /** + * Constant for the "Rejang" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock REJANG = new UnicodeBlock("REJANG"); + + /** + * Constant for the "Cham" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CHAM = new UnicodeBlock("CHAM"); + + /** + * Constant for the "Vertical Forms" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock VERTICAL_FORMS = + new UnicodeBlock("VERTICAL_FORMS", + new String[] { "Vertical Forms", + "VerticalForms"}); + + /** + * Constant for the "Ancient Greek Numbers" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ANCIENT_GREEK_NUMBERS = + new UnicodeBlock("ANCIENT_GREEK_NUMBERS", + new String[] { "Ancient Greek Numbers", + "AncientGreekNumbers"}); + + /** + * Constant for the "Ancient Symbols" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock ANCIENT_SYMBOLS = + new UnicodeBlock("ANCIENT_SYMBOLS", + new String[] { "Ancient Symbols", + "AncientSymbols"}); + + /** + * Constant for the "Phaistos Disc" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock PHAISTOS_DISC = + new UnicodeBlock("PHAISTOS_DISC", + new String[] { "Phaistos Disc", + "PhaistosDisc"}); + + /** + * Constant for the "Lycian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LYCIAN = new UnicodeBlock("LYCIAN"); + + /** + * Constant for the "Carian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CARIAN = new UnicodeBlock("CARIAN"); + + /** + * Constant for the "Old Persian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock OLD_PERSIAN = + new UnicodeBlock("OLD_PERSIAN", + new String[] { "Old Persian", + "OldPersian"}); + + /** + * Constant for the "Phoenician" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock PHOENICIAN = + new UnicodeBlock("PHOENICIAN"); + + /** + * Constant for the "Lydian" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock LYDIAN = new UnicodeBlock("LYDIAN"); + + /** + * Constant for the "Kharoshthi" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock KHAROSHTHI = + new UnicodeBlock("KHAROSHTHI"); + + /** + * Constant for the "Cuneiform" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock CUNEIFORM = + new UnicodeBlock("CUNEIFORM"); + + /** + * Constant for the "Cuneiform Numbers and Punctuation" Unicode + * character block. + * @since 1.7 + */ + public static final UnicodeBlock CUNEIFORM_NUMBERS_AND_PUNCTUATION = + new UnicodeBlock("CUNEIFORM_NUMBERS_AND_PUNCTUATION", + new String[] { "Cuneiform Numbers and Punctuation", + "CuneiformNumbersandPunctuation"}); + + /** + * Constant for the "Ancient Greek Musical Notation" Unicode character + * block. + * @since 1.7 + */ + public static final UnicodeBlock ANCIENT_GREEK_MUSICAL_NOTATION = + new UnicodeBlock("ANCIENT_GREEK_MUSICAL_NOTATION", + new String[] { "Ancient Greek Musical Notation", + "AncientGreekMusicalNotation"}); + + /** + * Constant for the "Counting Rod Numerals" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock COUNTING_ROD_NUMERALS = + new UnicodeBlock("COUNTING_ROD_NUMERALS", + new String[] { "Counting Rod Numerals", + "CountingRodNumerals"}); + + /** + * Constant for the "Mahjong Tiles" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock MAHJONG_TILES = + new UnicodeBlock("MAHJONG_TILES", + new String[] { "Mahjong Tiles", + "MahjongTiles"}); + + /** + * Constant for the "Domino Tiles" Unicode character block. + * @since 1.7 + */ + public static final UnicodeBlock DOMINO_TILES = + new UnicodeBlock("DOMINO_TILES", + new String[] { "Domino Tiles", + "DominoTiles"}); + private static final int blockStarts[] = { - 0x0000, // Basic Latin - 0x0080, // Latin-1 Supplement - 0x0100, // Latin Extended-A - 0x0180, // Latin Extended-B - 0x0250, // IPA Extensions - 0x02B0, // Spacing Modifier Letters - 0x0300, // Combining Diacritical Marks - 0x0370, // Greek and Coptic - 0x0400, // Cyrillic - 0x0500, // Cyrillic Supplementary - 0x0530, // Armenian - 0x0590, // Hebrew - 0x0600, // Arabic - 0x0700, // Syriac - 0x0750, // unassigned - 0x0780, // Thaana - 0x07C0, // unassigned - 0x0900, // Devanagari - 0x0980, // Bengali - 0x0A00, // Gurmukhi - 0x0A80, // Gujarati - 0x0B00, // Oriya - 0x0B80, // Tamil - 0x0C00, // Telugu - 0x0C80, // Kannada - 0x0D00, // Malayalam - 0x0D80, // Sinhala - 0x0E00, // Thai - 0x0E80, // Lao - 0x0F00, // Tibetan - 0x1000, // Myanmar - 0x10A0, // Georgian - 0x1100, // Hangul Jamo - 0x1200, // Ethiopic - 0x1380, // unassigned - 0x13A0, // Cherokee - 0x1400, // Unified Canadian Aboriginal Syllabics - 0x1680, // Ogham - 0x16A0, // Runic - 0x1700, // Tagalog - 0x1720, // Hanunoo - 0x1740, // Buhid - 0x1760, // Tagbanwa - 0x1780, // Khmer - 0x1800, // Mongolian - 0x18B0, // unassigned - 0x1900, // Limbu - 0x1950, // Tai Le - 0x1980, // unassigned - 0x19E0, // Khmer Symbols - 0x1A00, // unassigned - 0x1D00, // Phonetic Extensions - 0x1D80, // unassigned - 0x1E00, // Latin Extended Additional - 0x1F00, // Greek Extended - 0x2000, // General Punctuation - 0x2070, // Superscripts and Subscripts - 0x20A0, // Currency Symbols - 0x20D0, // Combining Diacritical Marks for Symbols - 0x2100, // Letterlike Symbols - 0x2150, // Number Forms - 0x2190, // Arrows - 0x2200, // Mathematical Operators - 0x2300, // Miscellaneous Technical - 0x2400, // Control Pictures - 0x2440, // Optical Character Recognition - 0x2460, // Enclosed Alphanumerics - 0x2500, // Box Drawing - 0x2580, // Block Elements - 0x25A0, // Geometric Shapes - 0x2600, // Miscellaneous Symbols - 0x2700, // Dingbats - 0x27C0, // Miscellaneous Mathematical Symbols-A - 0x27F0, // Supplemental Arrows-A - 0x2800, // Braille Patterns - 0x2900, // Supplemental Arrows-B - 0x2980, // Miscellaneous Mathematical Symbols-B - 0x2A00, // Supplemental Mathematical Operators - 0x2B00, // Miscellaneous Symbols and Arrows - 0x2C00, // unassigned - 0x2E80, // CJK Radicals Supplement - 0x2F00, // Kangxi Radicals - 0x2FE0, // unassigned - 0x2FF0, // Ideographic Description Characters - 0x3000, // CJK Symbols and Punctuation - 0x3040, // Hiragana - 0x30A0, // Katakana - 0x3100, // Bopomofo - 0x3130, // Hangul Compatibility Jamo - 0x3190, // Kanbun - 0x31A0, // Bopomofo Extended - 0x31C0, // unassigned - 0x31F0, // Katakana Phonetic Extensions - 0x3200, // Enclosed CJK Letters and Months - 0x3300, // CJK Compatibility - 0x3400, // CJK Unified Ideographs Extension A - 0x4DC0, // Yijing Hexagram Symbols - 0x4E00, // CJK Unified Ideographs - 0xA000, // Yi Syllables - 0xA490, // Yi Radicals - 0xA4D0, // unassigned - 0xAC00, // Hangul Syllables - 0xD7B0, // unassigned - 0xD800, // High Surrogates - 0xDB80, // High Private Use Surrogates - 0xDC00, // Low Surrogates - 0xE000, // Private Use - 0xF900, // CJK Compatibility Ideographs - 0xFB00, // Alphabetic Presentation Forms - 0xFB50, // Arabic Presentation Forms-A - 0xFE00, // Variation Selectors - 0xFE10, // unassigned - 0xFE20, // Combining Half Marks - 0xFE30, // CJK Compatibility Forms - 0xFE50, // Small Form Variants - 0xFE70, // Arabic Presentation Forms-B - 0xFF00, // Halfwidth and Fullwidth Forms - 0xFFF0, // Specials - 0x10000, // Linear B Syllabary - 0x10080, // Linear B Ideograms - 0x10100, // Aegean Numbers - 0x10140, // unassigned - 0x10300, // Old Italic - 0x10330, // Gothic - 0x10350, // unassigned - 0x10380, // Ugaritic - 0x103A0, // unassigned - 0x10400, // Deseret - 0x10450, // Shavian - 0x10480, // Osmanya - 0x104B0, // unassigned - 0x10800, // Cypriot Syllabary - 0x10840, // unassigned - 0x1D000, // Byzantine Musical Symbols - 0x1D100, // Musical Symbols - 0x1D200, // unassigned - 0x1D300, // Tai Xuan Jing Symbols - 0x1D360, // unassigned - 0x1D400, // Mathematical Alphanumeric Symbols - 0x1D800, // unassigned - 0x20000, // CJK Unified Ideographs Extension B - 0x2A6E0, // unassigned - 0x2F800, // CJK Compatibility Ideographs Supplement - 0x2FA20, // unassigned - 0xE0000, // Tags - 0xE0080, // unassigned - 0xE0100, // Variation Selectors Supplement - 0xE01F0, // unassigned - 0xF0000, // Supplementary Private Use Area-A - 0x100000, // Supplementary Private Use Area-B + 0x0000, // 0000..007F; Basic Latin + 0x0080, // 0080..00FF; Latin-1 Supplement + 0x0100, // 0100..017F; Latin Extended-A + 0x0180, // 0180..024F; Latin Extended-B + 0x0250, // 0250..02AF; IPA Extensions + 0x02B0, // 02B0..02FF; Spacing Modifier Letters + 0x0300, // 0300..036F; Combining Diacritical Marks + 0x0370, // 0370..03FF; Greek and Coptic + 0x0400, // 0400..04FF; Cyrillic + 0x0500, // 0500..052F; Cyrillic Supplement + 0x0530, // 0530..058F; Armenian + 0x0590, // 0590..05FF; Hebrew + 0x0600, // 0600..06FF; Arabic + 0x0700, // 0700..074F; Syria + 0x0750, // 0750..077F; Arabic Supplement + 0x0780, // 0780..07BF; Thaana + 0x07C0, // 07C0..07FF; NKo + 0x0800, // unassigned + 0x0900, // 0900..097F; Devanagari + 0x0980, // 0980..09FF; Bengali + 0x0A00, // 0A00..0A7F; Gurmukhi + 0x0A80, // 0A80..0AFF; Gujarati + 0x0B00, // 0B00..0B7F; Oriya + 0x0B80, // 0B80..0BFF; Tamil + 0x0C00, // 0C00..0C7F; Telugu + 0x0C80, // 0C80..0CFF; Kannada + 0x0D00, // 0D00..0D7F; Malayalam + 0x0D80, // 0D80..0DFF; Sinhala + 0x0E00, // 0E00..0E7F; Thai + 0x0E80, // 0E80..0EFF; Lao + 0x0F00, // 0F00..0FFF; Tibetan + 0x1000, // 1000..109F; Myanmar + 0x10A0, // 10A0..10FF; Georgian + 0x1100, // 1100..11FF; Hangul Jamo + 0x1200, // 1200..137F; Ethiopic + 0x1380, // 1380..139F; Ethiopic Supplement + 0x13A0, // 13A0..13FF; Cherokee + 0x1400, // 1400..167F; Unified Canadian Aboriginal Syllabics + 0x1680, // 1680..169F; Ogham + 0x16A0, // 16A0..16FF; Runic + 0x1700, // 1700..171F; Tagalog + 0x1720, // 1720..173F; Hanunoo + 0x1740, // 1740..175F; Buhid + 0x1760, // 1760..177F; Tagbanwa + 0x1780, // 1780..17FF; Khmer + 0x1800, // 1800..18AF; Mongolian + 0x18B0, // unassigned + 0x1900, // 1900..194F; Limbu + 0x1950, // 1950..197F; Tai Le + 0x1980, // 1980..19DF; New Tai Lue + 0x19E0, // 19E0..19FF; Khmer Symbols + 0x1A00, // 1A00..1A1F; Buginese + 0x1A20, // unassigned + 0x1B00, // 1B00..1B7F; Balinese + 0x1B80, // 1B80..1BBF; Sundanese + 0x1BC0, // unassigned + 0x1C00, // 1C00..1C4F; Lepcha + 0x1C50, // 1C50..1C7F; Ol Chiki + 0x1C80, // unassigned + 0x1D00, // 1D00..1D7F; Phonetic Extensions + 0x1D80, // 1D80..1DBF; Phonetic Extensions Supplement + 0x1DC0, // 1DC0..1DFF; Combining Diacritical Marks Supplement + 0x1E00, // 1E00..1EFF; Latin Extended Additional + 0x1F00, // 1F00..1FFF; Greek Extended + 0x2000, // 2000..206F; General Punctuation + 0x2070, // 2070..209F; Superscripts and Subscripts + 0x20A0, // 20A0..20CF; Currency Symbols + 0x20D0, // 20D0..20FF; Combining Diacritical Marks for Symbols + 0x2100, // 2100..214F; Letterlike Symbols + 0x2150, // 2150..218F; Number Forms + 0x2190, // 2190..21FF; Arrows + 0x2200, // 2200..22FF; Mathematical Operators + 0x2300, // 2300..23FF; Miscellaneous Technical + 0x2400, // 2400..243F; Control Pictures + 0x2440, // 2440..245F; Optical Character Recognition + 0x2460, // 2460..24FF; Enclosed Alphanumerics + 0x2500, // 2500..257F; Box Drawing + 0x2580, // 2580..259F; Block Elements + 0x25A0, // 25A0..25FF; Geometric Shapes + 0x2600, // 2600..26FF; Miscellaneous Symbols + 0x2700, // 2700..27BF; Dingbats + 0x27C0, // 27C0..27EF; Miscellaneous Mathematical Symbols-A + 0x27F0, // 27F0..27FF; Supplemental Arrows-A + 0x2800, // 2800..28FF; Braille Patterns + 0x2900, // 2900..297F; Supplemental Arrows-B + 0x2980, // 2980..29FF; Miscellaneous Mathematical Symbols-B + 0x2A00, // 2A00..2AFF; Supplemental Mathematical Operators + 0x2B00, // 2B00..2BFF; Miscellaneous Symbols and Arrows + 0x2C00, // 2C00..2C5F; Glagolitic + 0x2C60, // 2C60..2C7F; Latin Extended-C + 0x2C80, // 2C80..2CFF; Coptic + 0x2D00, // 2D00..2D2F; Georgian Supplement + 0x2D30, // 2D30..2D7F; Tifinagh + 0x2D80, // 2D80..2DDF; Ethiopic Extended + 0x2DE0, // 2DE0..2DFF; Cyrillic Extended-A + 0x2E00, // 2E00..2E7F; Supplemental Punctuation + 0x2E80, // 2E80..2EFF; CJK Radicals Supplement + 0x2F00, // 2F00..2FDF; Kangxi Radicals + 0x2FE0, // unassigned + 0x2FF0, // 2FF0..2FFF; Ideographic Description Characters + 0x3000, // 3000..303F; CJK Symbols and Punctuation + 0x3040, // 3040..309F; Hiragana + 0x30A0, // 30A0..30FF; Katakana + 0x3100, // 3100..312F; Bopomofo + 0x3130, // 3130..318F; Hangul Compatibility Jamo + 0x3190, // 3190..319F; Kanbun + 0x31A0, // 31A0..31BF; Bopomofo Extended + 0x31C0, // 31C0..31EF; CJK Strokes + 0x31F0, // 31F0..31FF; Katakana Phonetic Extensions + 0x3200, // 3200..32FF; Enclosed CJK Letters and Months + 0x3300, // 3300..33FF; CJK Compatibility + 0x3400, // 3400..4DBF; CJK Unified Ideographs Extension A + 0x4DC0, // 4DC0..4DFF; Yijing Hexagram Symbols + 0x4E00, // 4E00..9FFF; CJK Unified Ideograph + 0xA000, // A000..A48F; Yi Syllables + 0xA490, // A490..A4CF; Yi Radicals + 0xA4D0, // unassigned + 0xA500, // A500..A63F; Vai + 0xA640, // A640..A69F; Cyrillic Extended-B + 0xA6A0, // unassigned + 0xA700, // A700..A71F; Modifier Tone Letters + 0xA720, // A720..A7FF; Latin Extended-D + 0xA800, // A800..A82F; Syloti Nagri + 0xA830, // unassigned + 0xA840, // A840..A87F; Phags-pa + 0xA880, // A880..A8DF; Saurashtra + 0xA8E0, // unassigned + 0xA900, // A900..A92F; Kayah Li + 0xA930, // A930..A95F; Rejang + 0xA960, // unassigned + 0xAA00, // AA00..AA5F; Cham + 0xAA60, // unassigned + 0xAC00, // AC00..D7AF; Hangul Syllables + 0xD7B0, // unassigned + 0xD800, // D800..DB7F; High Surrogates + 0xDB80, // DB80..DBFF; High Private Use Surrogates + 0xDC00, // DC00..DFFF; Low Surrogates + 0xE000, // E000..F8FF; Private Use Area + 0xF900, // F900..FAFF; CJK Compatibility Ideographs + 0xFB00, // FB00..FB4F; Alphabetic Presentation Forms + 0xFB50, // FB50..FDFF; Arabic Presentation Forms-A + 0xFE00, // FE00..FE0F; Variation Selectors + 0xFE10, // FE10..FE1F; Vertical Forms + 0xFE20, // FE20..FE2F; Combining Half Marks + 0xFE30, // FE30..FE4F; CJK Compatibility Forms + 0xFE50, // FE50..FE6F; Small Form Variants + 0xFE70, // FE70..FEFF; Arabic Presentation Forms-B + 0xFF00, // FF00..FFEF; Halfwidth and Fullwidth Forms + 0xFFF0, // FFF0..FFFF; Specials + 0x10000, // 10000..1007F; Linear B Syllabary + 0x10080, // 10080..100FF; Linear B Ideograms + 0x10100, // 10100..1013F; Aegean Numbers + 0x10140, // 10140..1018F; Ancient Greek Numbers + 0x10190, // 10190..101CF; Ancient Symbols + 0x101D0, // 101D0..101FF; Phaistos Disc + 0x10200, // unassigned + 0x10280, // 10280..1029F; Lycian + 0x102A0, // 102A0..102DF; Carian + 0x102E0, // unassigned + 0x10300, // 10300..1032F; Old Italic + 0x10330, // 10330..1034F; Gothic + 0x10350, // unassigned + 0x10380, // 10380..1039F; Ugaritic + 0x103A0, // 103A0..103DF; Old Persian + 0x103E0, // unassigned + 0x10400, // 10400..1044F; Desere + 0x10450, // 10450..1047F; Shavian + 0x10480, // 10480..104AF; Osmanya + 0x104B0, // unassigned + 0x10800, // 10800..1083F; Cypriot Syllabary + 0x10840, // unassigned + 0x10900, // 10900..1091F; Phoenician + 0x10920, // 10920..1093F; Lydian + 0x10940, // unassigned + 0x10A00, // 10A00..10A5F; Kharoshthi + 0x10A60, // unassigned + 0x12000, // 12000..123FF; Cuneiform + 0x12400, // 12400..1247F; Cuneiform Numbers and Punctuation + 0x12480, // unassigned + 0x1D000, // 1D000..1D0FF; Byzantine Musical Symbols + 0x1D100, // 1D100..1D1FF; Musical Symbols + 0x1D200, // 1D200..1D24F; Ancient Greek Musical Notation + 0x1D250, // unassigned + 0x1D300, // 1D300..1D35F; Tai Xuan Jing Symbols + 0x1D360, // 1D360..1D37F; Counting Rod Numerals + 0x1D380, // unassigned + 0x1D400, // 1D400..1D7FF; Mathematical Alphanumeric Symbols + 0x1D800, // unassigned + 0x1F000, // 1F000..1F02F; Mahjong Tiles + 0x1F030, // 1F030..1F09F; Domino Tiles + 0x1F0A0, // unassigned + 0x20000, // 20000..2A6DF; CJK Unified Ideographs Extension B + 0x2A6E0, // unassigned + 0x2F800, // 2F800..2FA1F; CJK Compatibility Ideographs Supplement + 0x2FA20, // unassigned + 0xE0000, // E0000..E007F; Tags + 0xE0080, // unassigned + 0xE0100, // E0100..E01EF; Variation Selectors Supplement + 0xE01F0, // unassigned + 0xF0000, // F0000..FFFFF; Supplementary Private Use Area-A + 0x100000, // 100000..10FFFF; Supplementary Private Use Area-B }; private static final UnicodeBlock[] blocks = { @@ -1809,8 +2234,9 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara HEBREW, ARABIC, SYRIAC, - null, + ARABIC_SUPPLEMENT, THAANA, + NKO, null, DEVANAGARI, BENGALI, @@ -1829,7 +2255,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara GEORGIAN, HANGUL_JAMO, ETHIOPIC, - null, + ETHIOPIC_SUPPLEMENT, CHEROKEE, UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, OGHAM, @@ -1843,11 +2269,19 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara null, LIMBU, TAI_LE, - null, + NEW_TAI_LUE, KHMER_SYMBOLS, + BUGINESE, null, - PHONETIC_EXTENSIONS, + BALINESE, + SUNDANESE, + null, + LEPCHA, + OL_CHIKI, null, + PHONETIC_EXTENSIONS, + PHONETIC_EXTENSIONS_SUPPLEMENT, + COMBINING_DIACRITICAL_MARKS_SUPPLEMENT, LATIN_EXTENDED_ADDITIONAL, GREEK_EXTENDED, GENERAL_PUNCTUATION, @@ -1874,7 +2308,14 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B, SUPPLEMENTAL_MATHEMATICAL_OPERATORS, MISCELLANEOUS_SYMBOLS_AND_ARROWS, - null, + GLAGOLITIC, + LATIN_EXTENDED_C, + COPTIC, + GEORGIAN_SUPPLEMENT, + TIFINAGH, + ETHIOPIC_EXTENDED, + CYRILLIC_EXTENDED_A, + SUPPLEMENTAL_PUNCTUATION, CJK_RADICALS_SUPPLEMENT, KANGXI_RADICALS, null, @@ -1886,7 +2327,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara HANGUL_COMPATIBILITY_JAMO, KANBUN, BOPOMOFO_EXTENDED, - null, + CJK_STROKES, KATAKANA_PHONETIC_EXTENSIONS, ENCLOSED_CJK_LETTERS_AND_MONTHS, CJK_COMPATIBILITY, @@ -1896,6 +2337,21 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara YI_SYLLABLES, YI_RADICALS, null, + VAI, + CYRILLIC_EXTENDED_B, + null, + MODIFIER_TONE_LETTERS, + LATIN_EXTENDED_D, + SYLOTI_NAGRI, + null, + PHAGS_PA, + SAURASHTRA, + null, + KAYAH_LI, + REJANG, + null, + CHAM, + null, HANGUL_SYLLABLES, null, HIGH_SURROGATES, @@ -1906,7 +2362,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara ALPHABETIC_PRESENTATION_FORMS, ARABIC_PRESENTATION_FORMS_A, VARIATION_SELECTORS, - null, + VERTICAL_FORMS, COMBINING_HALF_MARKS, CJK_COMPATIBILITY_FORMS, SMALL_FORM_VARIANTS, @@ -1916,11 +2372,18 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara LINEAR_B_SYLLABARY, LINEAR_B_IDEOGRAMS, AEGEAN_NUMBERS, + ANCIENT_GREEK_NUMBERS, + ANCIENT_SYMBOLS, + PHAISTOS_DISC, + null, + LYCIAN, + CARIAN, null, OLD_ITALIC, GOTHIC, null, UGARITIC, + OLD_PERSIAN, null, DESERET, SHAVIAN, @@ -1928,13 +2391,26 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara null, CYPRIOT_SYLLABARY, null, + PHOENICIAN, + LYDIAN, + null, + KHAROSHTHI, + null, + CUNEIFORM, + CUNEIFORM_NUMBERS_AND_PUNCTUATION, + null, BYZANTINE_MUSICAL_SYMBOLS, MUSICAL_SYMBOLS, + ANCIENT_GREEK_MUSICAL_NOTATION, null, TAI_XUAN_JING_SYMBOLS, + COUNTING_ROD_NUMERALS, null, MATHEMATICAL_ALPHANUMERIC_SYMBOLS, null, + MAHJONG_TILES, + DOMINO_TILES, + null, CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B, null, CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT, diff --git a/src/share/classes/java/lang/Class.java b/src/share/classes/java/lang/Class.java index 63f56764d450150ae5e72f0aba6a1ddfdf1f15be..4ba497c64cf280c41d6148b59110e22e0263f00e 100644 --- a/src/share/classes/java/lang/Class.java +++ b/src/share/classes/java/lang/Class.java @@ -1,5 +1,5 @@ /* - * Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1994-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 @@ -2846,14 +2846,14 @@ public final if (loader == null) return desiredAssertionStatus0(this); - synchronized(loader) { - // If the classloader has been initialized with - // the assertion directives, ask it. Otherwise, - // ask the VM. - return (loader.classAssertionStatus == null ? - desiredAssertionStatus0(this) : - loader.desiredAssertionStatus(getName())); + // If the classloader has been initialized with the assertion + // directives, ask it. Otherwise, ask the VM. + synchronized(loader.assertionLock) { + if (loader.classAssertionStatus != null) { + return loader.desiredAssertionStatus(getName()); + } } + return desiredAssertionStatus0(this); } // Retrieves the desired assertion status of this class from the VM diff --git a/src/share/classes/java/lang/ClassLoader.java b/src/share/classes/java/lang/ClassLoader.java index c0caa01dcf3229bad0ae3fb135e08f7021340fcb..cc0987a5864cafb73414ed368ceb8b0f8d8430c2 100644 --- a/src/share/classes/java/lang/ClassLoader.java +++ b/src/share/classes/java/lang/ClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1994-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 @@ -40,14 +40,17 @@ import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.ProtectionDomain; import java.security.cert.Certificate; +import java.util.Collections; import java.util.Enumeration; -import java.util.Hashtable; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import java.util.Stack; import java.util.Map; import java.util.Vector; +import java.util.Hashtable; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import sun.misc.ClassFileTransformer; import sun.misc.CompoundEnumeration; import sun.misc.Resource; @@ -91,6 +94,17 @@ import sun.security.util.SecurityConstants; * called the "bootstrap class loader", does not itself have a parent but may * serve as the parent of a <tt>ClassLoader</tt> instance. * + * <p> Class loaders that support concurrent loading of classes are known as + * <em>parallel capable</em> class loaders and are required to register + * themselves at their class initialization time by invoking the + * {@link + * #registerAsParallelCapable <tt>ClassLoader.registerAsParallelCapable</tt>} + * method. In environments in which the delegation model is not strictly + * hierarchical, class loaders need to be parallel capable, otherise class + * loading can lead to deadlocks because the loader lock is held for the + * duration of the class loading process (see {@link #loadClass + * <tt>loadClass</tt>} methods). + * * <p> Normally, the Java virtual machine loads classes from the local file * system in a platform-dependent manner. For example, on UNIX systems, the * virtual machine loads classes from the directory defined by the @@ -160,31 +174,51 @@ import sun.security.util.SecurityConstants; public abstract class ClassLoader { private static native void registerNatives(); + + // Set of classes which are registered as parallel capable class loaders + private static final Set<Class<? extends ClassLoader>> parallelLoaders + = Collections.newSetFromMap(Collections.synchronizedMap + (new WeakHashMap<Class<? extends ClassLoader>, Boolean>())); + static { registerNatives(); + parallelLoaders.add(ClassLoader.class); } // If initialization succeed this is set to true and security checks will // succeed. Otherwise the object is not initialized and the object is // useless. - private boolean initialized = false; + private final boolean initialized; // The parent class loader for delegation - private ClassLoader parent; + // Note: VM hardcoded the offset of this field, thus all new fields + // must be added *after* it. + private final ClassLoader parent; + + // Maps class name to the corresponding lock object when the current + // class loader is parallel capable. + // Note: VM also uses this field to decide if the current class loader + // is parallel capable and the appropriate lock object for class loading. + private final ConcurrentHashMap<String, Object> parallelLockMap; // Hashtable that maps packages to certs - private Hashtable<String, Certificate[]> package2certs - = new Hashtable<String, Certificate[]>(11); + private final Map <String, Certificate[]> package2certs; // Shared among all packages with unsigned classes - Certificate[] nocerts; + private static final Certificate[] nocerts = new Certificate[0]; - // The classes loaded by this class loader. The only purpose of this table + // The classes loaded by this class loader. The only purpose of this table // is to keep the classes from being GC'ed until the loader is GC'ed. - private Vector<Class<?>> classes = new Vector<Class<?>>(); + private final Vector<Class<?>> classes = new Vector<Class<?>>(); + + // The "default" domain. Set as the default ProtectionDomain on newly + // created classes. + private final ProtectionDomain defaultDomain = + new ProtectionDomain(new CodeSource(null, (Certificate[]) null), + null, this, null); // The initiating protection domains for all classes loaded by this loader - private Set<ProtectionDomain> domains = new HashSet<ProtectionDomain>(); + private final Set<ProtectionDomain> domains; // Invoked by the VM to record every loaded class with this loader. void addClass(Class c) { @@ -193,7 +227,9 @@ public abstract class ClassLoader { // The packages defined in this class loader. Each package name is mapped // to its corresponding Package object. - private HashMap<String, Package> packages = new HashMap<String, Package>(); + // @GuardedBy("itself") + private final HashMap<String, Package> packages = + new HashMap<String, Package>(); /** * Creates a new class loader using the specified parent class loader for @@ -220,6 +256,19 @@ public abstract class ClassLoader { security.checkCreateClassLoader(); } this.parent = parent; + if (parallelLoaders.contains(this.getClass())) { + parallelLockMap = new ConcurrentHashMap<String, Object>(); + package2certs = new ConcurrentHashMap<String, Certificate[]>(); + domains = + Collections.synchronizedSet(new HashSet<ProtectionDomain>()); + assertionLock = new Object(); + } else { + // no finer-grained lock; lock on the classloader instance + parallelLockMap = null; + package2certs = new Hashtable<String, Certificate[]>(); + domains = new HashSet<ProtectionDomain>(); + assertionLock = this; + } initialized = true; } @@ -244,10 +293,22 @@ public abstract class ClassLoader { security.checkCreateClassLoader(); } this.parent = getSystemClassLoader(); + if (parallelLoaders.contains(this.getClass())) { + parallelLockMap = new ConcurrentHashMap<String, Object>(); + package2certs = new ConcurrentHashMap<String, Certificate[]>(); + domains = + Collections.synchronizedSet(new HashSet<ProtectionDomain>()); + assertionLock = new Object(); + } else { + // no finer-grained lock; lock on the classloader instance + parallelLockMap = null; + package2certs = new Hashtable<String, Certificate[]>(); + domains = new HashSet<ProtectionDomain>(); + assertionLock = this; + } initialized = true; } - // -- Class -- /** @@ -296,6 +357,10 @@ public abstract class ClassLoader { * <p> Subclasses of <tt>ClassLoader</tt> are encouraged to override {@link * #findClass(String)}, rather than this method. </p> * + * <p> Unless overridden, this method synchronizes on the result of + * {@link #getClassLoadingLock <tt>getClassLoadingLock</tt>} method + * during the entire class loading process. + * * @param name * The <a href="#name">binary name</a> of the class * @@ -307,37 +372,80 @@ public abstract class ClassLoader { * @throws ClassNotFoundException * If the class could not be found */ - protected synchronized Class<?> loadClass(String name, boolean resolve) + protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { - // First, check if the class has already been loaded - Class c = findLoadedClass(name); - if (c == null) { - try { - if (parent != null) { - c = parent.loadClass(name, false); - } else { - c = findBootstrapClass0(name); + synchronized (getClassLoadingLock(name)) { + // First, check if the class has already been loaded + Class c = findLoadedClass(name); + if (c == null) { + try { + if (parent != null) { + c = parent.loadClass(name, false); + } else { + c = findBootstrapClass0(name); + } + } catch (ClassNotFoundException e) { + // If still not found, then invoke findClass in order + // to find the class. + c = findClass(name); } - } catch (ClassNotFoundException e) { - // If still not found, then invoke findClass in order - // to find the class. - c = findClass(name); } + if (resolve) { + resolveClass(c); + } + return c; } - if (resolve) { - resolveClass(c); + } + + /** + * Returns the lock object for class loading operations. + * For backward compatibility, the default implementation of this method + * behaves as follows. If this ClassLoader object is registered as + * parallel capable, the method returns a dedicated object associated + * with the specified class name. Otherwise, the method returns this + * ClassLoader object. </p> + * + * @param className + * The name of the to-be-loaded class + * + * @return the lock for class loading operations + * + * @throws NullPointerException + * If registered as parallel capable and <tt>className</tt> is null + * + * @see #loadClass(String, boolean) + * + * @since 1.7 + */ + protected Object getClassLoadingLock(String className) { + Object lock = this; + if (parallelLockMap != null) { + Object newLock = new Object(); + lock = parallelLockMap.putIfAbsent(className, newLock); + if (lock == null) { + lock = newLock; + } } - return c; + return lock; } // This method is invoked by the virtual machine to load a class. - private synchronized Class loadClassInternal(String name) + private Class loadClassInternal(String name) throws ClassNotFoundException { - return loadClass(name); + // For backward compatibility, explicitly lock on 'this' when + // the current class loader is not parallel capable. + if (parallelLockMap == null) { + synchronized (this) { + return loadClass(name); + } + } else { + return loadClass(name); + } } + // Invoked by the VM after loading class with this loader. private void checkPackageAccess(Class cls, ProtectionDomain pd) { final SecurityManager sm = System.getSecurityManager(); if (sm != null) { @@ -486,31 +594,32 @@ public abstract class ClassLoader { /* Determine protection domain, and check that: - not define java.* class, - - signer of this class matches signers for the rest of the classes in package. + - signer of this class matches signers for the rest of the classes in + package. */ private ProtectionDomain preDefineClass(String name, - ProtectionDomain protectionDomain) + ProtectionDomain pd) { if (!checkName(name)) throw new NoClassDefFoundError("IllegalName: " + name); if ((name != null) && name.startsWith("java.")) { - throw new SecurityException("Prohibited package name: " + - name.substring(0, name.lastIndexOf('.'))); + throw new SecurityException + ("Prohibited package name: " + + name.substring(0, name.lastIndexOf('.'))); } - if (protectionDomain == null) { - protectionDomain = getDefaultDomain(); + if (pd == null) { + pd = defaultDomain; } - if (name != null) - checkCerts(name, protectionDomain.getCodeSource()); + if (name != null) checkCerts(name, pd.getCodeSource()); - return protectionDomain; + return pd; } - private String defineClassSourceLocation(ProtectionDomain protectionDomain) + private String defineClassSourceLocation(ProtectionDomain pd) { - CodeSource cs = protectionDomain.getCodeSource(); + CodeSource cs = pd.getCodeSource(); String source = null; if (cs != null && cs.getLocation() != null) { source = cs.getLocation().toString(); @@ -519,14 +628,15 @@ public abstract class ClassLoader { } private Class defineTransformedClass(String name, byte[] b, int off, int len, - ProtectionDomain protectionDomain, + ProtectionDomain pd, ClassFormatError cfe, String source) throws ClassFormatError { // Class format error - try to transform the bytecode and // define the class again // - ClassFileTransformer[] transformers = ClassFileTransformer.getTransformers(); + ClassFileTransformer[] transformers = + ClassFileTransformer.getTransformers(); Class c = null; if (transformers != null) { @@ -535,7 +645,7 @@ public abstract class ClassLoader { // Transform byte code using transformer byte[] tb = transformer.transform(b, off, len); c = defineClass1(name, tb, 0, tb.length, - protectionDomain, source); + pd, source); break; } catch (ClassFormatError cfe2) { // If ClassFormatError occurs, try next transformer @@ -552,11 +662,10 @@ public abstract class ClassLoader { return c; } - private void postDefineClass(Class c, ProtectionDomain protectionDomain) + private void postDefineClass(Class c, ProtectionDomain pd) { - if (protectionDomain.getCodeSource() != null) { - Certificate certs[] = - protectionDomain.getCodeSource().getCertificates(); + if (pd.getCodeSource() != null) { + Certificate certs[] = pd.getCodeSource().getCertificates(); if (certs != null) setSigners(c, certs); } @@ -641,7 +750,8 @@ public abstract class ClassLoader { try { c = defineClass1(name, b, off, len, protectionDomain, source); } catch (ClassFormatError cfe) { - c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, source); + c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, + source); } postDefineClass(c, protectionDomain); @@ -656,10 +766,10 @@ public abstract class ClassLoader { * specified in the documentation for {@link #defineClass(String, byte[], * int, int)}. Before the class can be used it must be resolved. * - * <p>The rules about the first class defined in a package determining the set of - * certificates for the package, and the restrictions on class names are identical - * to those specified in the documentation for {@link #defineClass(String, byte[], - * int, int, ProtectionDomain)}. + * <p>The rules about the first class defined in a package determining the + * set of certificates for the package, and the restrictions on class names + * are identical to those specified in the documentation for {@link + * #defineClass(String, byte[], int, int, ProtectionDomain)}. * * <p> An invocation of this method of the form * <i>cl</i><tt>.defineClass(</tt><i>name</i><tt>,</tt> @@ -668,12 +778,13 @@ public abstract class ClassLoader { * * <blockquote><tt> * ...<br> - * byte[] temp = new byte[</tt><i>bBuffer</i><tt>.{@link java.nio.ByteBuffer#remaining - * remaining}()];<br> + * byte[] temp = new byte[</tt><i>bBuffer</i><tt>.{@link + * java.nio.ByteBuffer#remaining remaining}()];<br> * </tt><i>bBuffer</i><tt>.{@link java.nio.ByteBuffer#get(byte[]) * get}(temp);<br> * return {@link #defineClass(String, byte[], int, int, ProtectionDomain) - * </tt><i>cl</i><tt>.defineClass}(</tt><i>name</i><tt>, temp, 0, temp.length, </tt><i>pd</i><tt>);<br> + * </tt><i>cl</i><tt>.defineClass}(</tt><i>name</i><tt>, temp, 0, + * temp.length, </tt><i>pd</i><tt>);<br> * </tt></blockquote> * * @param name @@ -682,9 +793,9 @@ public abstract class ClassLoader { * * @param b * The bytes that make up the class data. The bytes from positions - * <tt>b.position()</tt> through <tt>b.position() + b.limit() -1 </tt> - * should have the format of a valid class file as defined by the <a - * href="http://java.sun.com/docs/books/vmspec/">Java Virtual + * <tt>b.position()</tt> through <tt>b.position() + b.limit() -1 + * </tt> should have the format of a valid class file as defined by + * the <a href="http://java.sun.com/docs/books/vmspec/">Java Virtual * Machine Specification</a>. * * @param protectionDomain @@ -738,11 +849,13 @@ public abstract class ClassLoader { String source = defineClassSourceLocation(protectionDomain); try { - c = defineClass2(name, b, b.position(), len, protectionDomain, source); + c = defineClass2(name, b, b.position(), len, protectionDomain, + source); } catch (ClassFormatError cfe) { byte[] tb = new byte[len]; b.get(tb); // get bytes out of byte buffer. - c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe, source); + c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe, + source); } postDefineClass(c, protectionDomain); @@ -769,33 +882,29 @@ public abstract class ClassLoader { return true; } - private synchronized void checkCerts(String name, CodeSource cs) { + private void checkCerts(String name, CodeSource cs) { int i = name.lastIndexOf('.'); String pname = (i == -1) ? "" : name.substring(0, i); - Certificate[] pcerts = package2certs.get(pname); - if (pcerts == null) { - // first class in this package gets to define which - // certificates must be the same for all other classes - // in this package - if (cs != null) { - pcerts = cs.getCertificates(); - } - if (pcerts == null) { - if (nocerts == null) - nocerts = new Certificate[0]; - pcerts = nocerts; - } - package2certs.put(pname, pcerts); - } else { - Certificate[] certs = null; - if (cs != null) { - certs = cs.getCertificates(); - } - if (!compareCerts(pcerts, certs)) { - throw new SecurityException("class \""+ name + - "\"'s signer information does not match signer information of other classes in the same package"); + Certificate[] certs = null; + if (cs != null) { + certs = cs.getCertificates(); + } + Certificate[] pcerts = null; + if (parallelLockMap == null) { + synchronized (this) { + pcerts = package2certs.get(pname); + if (pcerts == null) { + package2certs.put(pname, (certs == null? nocerts:certs)); + } } + } else { + pcerts = ((ConcurrentHashMap<String, Certificate[]>)package2certs). + putIfAbsent(pname, (certs == null? nocerts:certs)); + } + if (pcerts != null && !compareCerts(pcerts, certs)) { + throw new SecurityException("class \""+ name + + "\"'s signer information does not match signer information of other classes in the same package"); } } @@ -1075,6 +1184,47 @@ public abstract class ClassLoader { return java.util.Collections.emptyEnumeration(); } + // index 0: java.lang.ClassLoader.class + // index 1: the immediate caller of index 0. + // index 2: the immediate caller of index 1. + private static native Class<? extends ClassLoader> getCaller(int index); + + /** + * Registers the caller class loader as parallel capable. + * In order for the registration to succeed, all super classes + * of the caller class loader must also be registered as + * parallel capable when this method is called. </p> + * Note that once a class loader is registered as + * parallel capable, there is no way to change it back. + * In addition, registration should be done statically before + * any instance of the caller classloader being constructed. </p> + * + * @return true if the caller is successfully registered as + * parallel capable and false if otherwise. + * + * @since 1.7 + */ + protected static boolean registerAsParallelCapable() { + Class<? extends ClassLoader> caller = getCaller(1); + Class superCls = caller.getSuperclass(); + boolean result = false; + // Explicit synchronization needed for composite action + synchronized (parallelLoaders) { + if (!parallelLoaders.contains(caller)) { + if (parallelLoaders.contains(superCls)) { + // register the immediate caller as parallel capable + // if and only if all of its super classes are. + // Note: given current classloading sequence, if + // the immediate super class is parallel capable, + // all the super classes higher up must be too. + result = true; + parallelLoaders.add(caller); + } + } else result = true; + } + return result; + } + /** * Find a resource of the specified name from the search path used to load * classes. This method locates the resource through the system class @@ -1141,7 +1291,8 @@ public abstract class ClassLoader { private static Enumeration<URL> getBootstrapResources(String name) throws IOException { - final Enumeration<Resource> e = getBootstrapClassPath().getResources(name); + final Enumeration<Resource> e = + getBootstrapClassPath().getResources(name); return new Enumeration<URL> () { public URL nextElement() { return e.nextElement().getURL(); @@ -1377,9 +1528,11 @@ public abstract class ClassLoader { } // The class loader for the system + // @GuardedBy("ClassLoader.class") private static ClassLoader scl; // Set to true once the system class loader has been set + // @GuardedBy("ClassLoader.class") private static boolean sclSet; @@ -1592,19 +1745,6 @@ public abstract class ClassLoader { } } - // The "default" domain. Set as the default ProtectionDomain on newly - // created classes. - private ProtectionDomain defaultDomain = null; - - // Returns (and initializes) the default domain. - private synchronized ProtectionDomain getDefaultDomain() { - if (defaultDomain == null) { - CodeSource cs = new CodeSource(null, (Certificate[]) null); - defaultDomain = new ProtectionDomain(cs, null, this, null); - } - return defaultDomain; - } - // All native library names we've loaded. private static Vector<String> loadedLibraryNames = new Vector<String>(); @@ -1622,8 +1762,8 @@ public abstract class ClassLoader { = new Stack<NativeLibrary>(); // The paths searched for libraries - static private String usr_paths[]; - static private String sys_paths[]; + private static String usr_paths[]; + private static String sys_paths[]; private static String[] initializePath(String propname) { String ldpath = System.getProperty(propname, ""); @@ -1803,7 +1943,10 @@ public abstract class ClassLoader { // -- Assertion management -- + final Object assertionLock; + // The default toggle for assertion checking. + // @GuardedBy("assertionLock") private boolean defaultAssertionStatus = false; // Maps String packageName to Boolean package default assertion status Note @@ -1811,12 +1954,14 @@ public abstract class ClassLoader { // is null then we are delegating assertion status queries to the VM, i.e., // none of this ClassLoader's assertion status modification methods have // been invoked. + // @GuardedBy("assertionLock") private Map<String, Boolean> packageAssertionStatus = null; // Maps String fullyQualifiedClassName to Boolean assertionStatus If this // field is null then we are delegating assertion status queries to the VM, // i.e., none of this ClassLoader's assertion status modification methods // have been invoked. + // @GuardedBy("assertionLock") Map<String, Boolean> classAssertionStatus = null; /** @@ -1834,11 +1979,13 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void setDefaultAssertionStatus(boolean enabled) { - if (classAssertionStatus == null) - initializeJavaAssertionMaps(); + public void setDefaultAssertionStatus(boolean enabled) { + synchronized (assertionLock) { + if (classAssertionStatus == null) + initializeJavaAssertionMaps(); - defaultAssertionStatus = enabled; + defaultAssertionStatus = enabled; + } } /** @@ -1878,13 +2025,14 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void setPackageAssertionStatus(String packageName, - boolean enabled) - { - if (packageAssertionStatus == null) - initializeJavaAssertionMaps(); + public void setPackageAssertionStatus(String packageName, + boolean enabled) { + synchronized (assertionLock) { + if (packageAssertionStatus == null) + initializeJavaAssertionMaps(); - packageAssertionStatus.put(packageName, enabled); + packageAssertionStatus.put(packageName, enabled); + } } /** @@ -1909,13 +2057,13 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void setClassAssertionStatus(String className, - boolean enabled) - { - if (classAssertionStatus == null) - initializeJavaAssertionMaps(); + public void setClassAssertionStatus(String className, boolean enabled) { + synchronized (assertionLock) { + if (classAssertionStatus == null) + initializeJavaAssertionMaps(); - classAssertionStatus.put(className, enabled); + classAssertionStatus.put(className, enabled); + } } /** @@ -1928,15 +2076,16 @@ public abstract class ClassLoader { * * @since 1.4 */ - public synchronized void clearAssertionStatus() { + public void clearAssertionStatus() { /* * Whether or not "Java assertion maps" are initialized, set * them to empty maps, effectively ignoring any present settings. */ - classAssertionStatus = new HashMap<String, Boolean>(); - packageAssertionStatus = new HashMap<String, Boolean>(); - - defaultAssertionStatus = false; + synchronized (assertionLock) { + classAssertionStatus = new HashMap<String, Boolean>(); + packageAssertionStatus = new HashMap<String, Boolean>(); + defaultAssertionStatus = false; + } } /** @@ -1961,39 +2110,40 @@ public abstract class ClassLoader { * * @since 1.4 */ - synchronized boolean desiredAssertionStatus(String className) { - Boolean result; - - // assert classAssertionStatus != null; - // assert packageAssertionStatus != null; + boolean desiredAssertionStatus(String className) { + synchronized (assertionLock) { + // assert classAssertionStatus != null; + // assert packageAssertionStatus != null; - // Check for a class entry - result = classAssertionStatus.get(className); - if (result != null) - return result.booleanValue(); - - // Check for most specific package entry - int dotIndex = className.lastIndexOf("."); - if (dotIndex < 0) { // default package - result = packageAssertionStatus.get(null); + // Check for a class entry + Boolean result = classAssertionStatus.get(className); if (result != null) return result.booleanValue(); - } - while(dotIndex > 0) { - className = className.substring(0, dotIndex); - result = packageAssertionStatus.get(className); - if (result != null) - return result.booleanValue(); - dotIndex = className.lastIndexOf(".", dotIndex-1); - } - // Return the classloader default - return defaultAssertionStatus; + // Check for most specific package entry + int dotIndex = className.lastIndexOf("."); + if (dotIndex < 0) { // default package + result = packageAssertionStatus.get(null); + if (result != null) + return result.booleanValue(); + } + while(dotIndex > 0) { + className = className.substring(0, dotIndex); + result = packageAssertionStatus.get(className); + if (result != null) + return result.booleanValue(); + dotIndex = className.lastIndexOf(".", dotIndex-1); + } + + // Return the classloader default + return defaultAssertionStatus; + } } // Set up the assertions with information provided by the VM. + // Note: Should only be called inside a synchronized block private void initializeJavaAssertionMaps() { - // assert Thread.holdsLock(this); + // assert Thread.holdsLock(assertionLock); classAssertionStatus = new HashMap<String, Boolean>(); packageAssertionStatus = new HashMap<String, Boolean>(); diff --git a/src/share/classes/java/lang/ConditionalSpecialCasing.java b/src/share/classes/java/lang/ConditionalSpecialCasing.java index d81e550eef5ffcb00a5b0ad30fc6c97cf86e0f92..0e66326069c770be473111d450d95b081c607153 100644 --- a/src/share/classes/java/lang/ConditionalSpecialCasing.java +++ b/src/share/classes/java/lang/ConditionalSpecialCasing.java @@ -74,6 +74,7 @@ final class ConditionalSpecialCasing { new Entry(0x00CC, new char[]{0x0069, 0x0307, 0x0300}, new char[]{0x00CC}, "lt", 0), // # LATIN CAPITAL LETTER I WITH GRAVE new Entry(0x00CD, new char[]{0x0069, 0x0307, 0x0301}, new char[]{0x00CD}, "lt", 0), // # LATIN CAPITAL LETTER I WITH ACUTE new Entry(0x0128, new char[]{0x0069, 0x0307, 0x0303}, new char[]{0x0128}, "lt", 0), // # LATIN CAPITAL LETTER I WITH TILDE + new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "lt", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE //# ================================================================================ //# Turkish and Azeri @@ -84,7 +85,10 @@ final class ConditionalSpecialCasing { new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "az", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN SMALL LETTER I - new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0) // # LATIN SMALL LETTER I + new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN SMALL LETTER I + //# ================================================================================ + //# Other + new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "en", 0), // # LATIN CAPITALLETTER I WITH DOT ABOVE }; // A hash table that contains the above entries diff --git a/src/share/classes/java/lang/Integer.java b/src/share/classes/java/lang/Integer.java index f984f177275ae305e6c0d40a8964deef397e34d7..50863dd7e9fa646f6312ddb856b3aa1c56abee76 100644 --- a/src/share/classes/java/lang/Integer.java +++ b/src/share/classes/java/lang/Integer.java @@ -25,6 +25,8 @@ package java.lang; +import java.util.Properties; + /** * The {@code Integer} class wraps a value of the primitive type * {@code int} in an object. An object of type {@code Integer} @@ -442,6 +444,12 @@ public final class Integer extends Number implements Comparable<Integer> { public static int parseInt(String s, int radix) throws NumberFormatException { + /* + * WARNING: This method may be invoked early during VM initialization + * before IntegerCache is initialized. Care must be taken to not use + * the valueOf method. + */ + if (s == null) { throw new NumberFormatException("null"); } @@ -545,7 +553,7 @@ public final class Integer extends Number implements Comparable<Integer> { * does not contain a parsable {@code int}. */ public static Integer valueOf(String s, int radix) throws NumberFormatException { - return new Integer(parseInt(s,radix)); + return Integer.valueOf(parseInt(s,radix)); } /** @@ -570,20 +578,56 @@ public final class Integer extends Number implements Comparable<Integer> { * @exception NumberFormatException if the string cannot be parsed * as an integer. */ - public static Integer valueOf(String s) throws NumberFormatException - { - return new Integer(parseInt(s, 10)); + public static Integer valueOf(String s) throws NumberFormatException { + return Integer.valueOf(parseInt(s, 10)); } - private static class IntegerCache { - private IntegerCache(){} + /** + * Cache to support the object identity semantics of autoboxing for values between + * -128 and 127 (inclusive) as required by JLS. + * + * The cache is initialized on first usage. During VM initialization the + * getAndRemoveCacheProperties method may be used to get and remove any system + * properites that configure the cache size. At this time, the size of the + * cache may be controlled by the -XX:AutoBoxCacheMax=<size> option. + */ + + // value of java.lang.Integer.IntegerCache.high property (obtained during VM init) + private static String integerCacheHighPropValue; - static final Integer cache[] = new Integer[-(-128) + 127 + 1]; + static void getAndRemoveCacheProperties() { + if (!sun.misc.VM.isBooted()) { + Properties props = System.getProperties(); + integerCacheHighPropValue = + (String)props.remove("java.lang.Integer.IntegerCache.high"); + if (integerCacheHighPropValue != null) + System.setProperties(props); // remove from system props + } + } + + private static class IntegerCache { + static final int low = -128; + static final int high; + static final Integer cache[]; static { - for(int i = 0; i < cache.length; i++) - cache[i] = new Integer(i - 128); + // high value may be configured by property + int h = 127; + if (integerCacheHighPropValue != null) { + int i = parseInt(integerCacheHighPropValue); + i = Math.max(i, 127); + // Maximum array size is Integer.MAX_VALUE + h = Math.min(i, Integer.MAX_VALUE - (-low)); + } + high = h; + + cache = new Integer[(high - low) + 1]; + int j = low; + for(int k = 0; k < cache.length; k++) + cache[k] = new Integer(j++); } + + private IntegerCache() {} } /** @@ -599,10 +643,9 @@ public final class Integer extends Number implements Comparable<Integer> { * @since 1.5 */ public static Integer valueOf(int i) { - final int offset = 128; - if (i >= -128 && i <= 127) { // must cache - return IntegerCache.cache[i + offset]; - } + assert IntegerCache.high >= 127; + if (i >= IntegerCache.low && i <= IntegerCache.high) + return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } @@ -806,7 +849,7 @@ public final class Integer extends Number implements Comparable<Integer> { */ public static Integer getInteger(String nm, int val) { Integer result = getInteger(nm, null); - return (result == null) ? new Integer(val) : result; + return (result == null) ? Integer.valueOf(val) : result; } /** @@ -938,7 +981,7 @@ public final class Integer extends Number implements Comparable<Integer> { try { result = Integer.valueOf(nm.substring(index), radix); - result = negative ? new Integer(-result.intValue()) : result; + result = negative ? Integer.valueOf(-result.intValue()) : result; } catch (NumberFormatException e) { // If number is Integer.MIN_VALUE, we'll end up here. The next line // handles this case, and causes any genuine format error to be diff --git a/src/share/classes/java/lang/Long.java b/src/share/classes/java/lang/Long.java index 62400a9b967fe8ac6ead9ab8ecd1967c3e0845ac..c632d5df2d9b15af976ac8632744362478762d24 100644 --- a/src/share/classes/java/lang/Long.java +++ b/src/share/classes/java/lang/Long.java @@ -510,7 +510,7 @@ public final class Long extends Number implements Comparable<Long> { * contain a parsable {@code long}. */ public static Long valueOf(String s, int radix) throws NumberFormatException { - return new Long(parseLong(s, radix)); + return Long.valueOf(parseLong(s, radix)); } /** @@ -537,7 +537,7 @@ public final class Long extends Number implements Comparable<Long> { */ public static Long valueOf(String s) throws NumberFormatException { - return new Long(parseLong(s, 10)); + return Long.valueOf(parseLong(s, 10)); } private static class LongCache { @@ -650,7 +650,7 @@ public final class Long extends Number implements Comparable<Long> { try { result = Long.valueOf(nm.substring(index), radix); - result = negative ? new Long(-result.longValue()) : result; + result = negative ? Long.valueOf(-result.longValue()) : result; } catch (NumberFormatException e) { // If number is Long.MIN_VALUE, we'll end up here. The next line // handles this case, and causes any genuine format error to be @@ -869,7 +869,7 @@ public final class Long extends Number implements Comparable<Long> { */ public static Long getLong(String nm, long val) { Long result = Long.getLong(nm, null); - return (result == null) ? new Long(val) : result; + return (result == null) ? Long.valueOf(val) : result; } /** diff --git a/src/share/classes/java/lang/NoSuchFieldError.java b/src/share/classes/java/lang/NoSuchFieldError.java index 8b77c71b18cffa097abd41017c826cb224b7848e..8adebca0dfd275d04ac786aa15510fbeea878cb6 100644 --- a/src/share/classes/java/lang/NoSuchFieldError.java +++ b/src/share/classes/java/lang/NoSuchFieldError.java @@ -41,14 +41,14 @@ class NoSuchFieldError extends IncompatibleClassChangeError { private static final long serialVersionUID = -3456430195886129035L; /** - * Constructs a <code>NoSuchFieldException</code> with no detail message. + * Constructs a <code>NoSuchFieldError</code> with no detail message. */ public NoSuchFieldError() { super(); } /** - * Constructs a <code>NoSuchFieldException</code> with the specified + * Constructs a <code>NoSuchFieldError</code> with the specified * detail message. * * @param s the detail message. diff --git a/src/share/classes/java/lang/String.java b/src/share/classes/java/lang/String.java index 28d96de741b0ce008c84b7ed3f88fbc474002e58..316da645f3c8dfb16eab5681c957b2aa92a26bd2 100644 --- a/src/share/classes/java/lang/String.java +++ b/src/share/classes/java/lang/String.java @@ -2451,14 +2451,21 @@ public final class String } if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale); + } else if (srcChar == '\u0130') { // LATIN CAPITAL LETTER I DOT + lowerChar = Character.ERROR; } else { lowerChar = Character.toLowerCase(srcChar); } if ((lowerChar == Character.ERROR) || (lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) { if (lowerChar == Character.ERROR) { - lowerCharArray = - ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale); + if (!localeDependent && srcChar == '\u0130') { + lowerCharArray = + ConditionalSpecialCasing.toLowerCaseCharArray(this, i, Locale.ENGLISH); + } else { + lowerCharArray = + ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale); + } } else if (srcCount == 2) { resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount; continue; diff --git a/src/share/classes/java/lang/System.java b/src/share/classes/java/lang/System.java index 68958dd0898dbcd604871af94e132ad73a0b8f43..6c539b28e1c8ade97eb264fe87938854633df703 100644 --- a/src/share/classes/java/lang/System.java +++ b/src/share/classes/java/lang/System.java @@ -1105,6 +1105,13 @@ public final class System { props = new Properties(); initProperties(props); sun.misc.Version.init(); + + // Gets and removes system properties that configure the Integer + // cache used to support the object identity semantics of autoboxing. + // At this time, the size of the cache may be controlled by the + // -XX:AutoBoxCacheMax=<size> option. + Integer.getAndRemoveCacheProperties(); + FileInputStream fdIn = new FileInputStream(FileDescriptor.in); FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); diff --git a/src/share/classes/java/lang/ref/ReferenceQueue.java b/src/share/classes/java/lang/ref/ReferenceQueue.java index 872ee14f8e27fc7a15f1c869b608af4a03cb2b15..9882844e5a8323d2bb14641192e1dd461ee53720 100644 --- a/src/share/classes/java/lang/ref/ReferenceQueue.java +++ b/src/share/classes/java/lang/ref/ReferenceQueue.java @@ -51,7 +51,7 @@ public class ReferenceQueue<T> { static private class Lock { }; private Lock lock = new Lock(); - private Reference<? extends T> head = null; + private volatile Reference<? extends T> head = null; private long queueLength = 0; boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */ @@ -95,6 +95,8 @@ public class ReferenceQueue<T> { * otherwise <code>null</code> */ public Reference<? extends T> poll() { + if (head == null) + return null; synchronized (lock) { return reallyPoll(); } diff --git a/src/share/classes/java/lang/ref/SoftReference.java b/src/share/classes/java/lang/ref/SoftReference.java index 35c6710d18e457ab4cabe0245acb7464707bf956..4a6428efaf487885074825d436828daf85a1876b 100644 --- a/src/share/classes/java/lang/ref/SoftReference.java +++ b/src/share/classes/java/lang/ref/SoftReference.java @@ -63,11 +63,13 @@ package java.lang.ref; public class SoftReference<T> extends Reference<T> { - /* Timestamp clock, updated by the garbage collector + /** + * Timestamp clock, updated by the garbage collector */ static private long clock; - /* Timestamp updated by each invocation of the get method. The VM may use + /** + * Timestamp updated by each invocation of the get method. The VM may use * this field when selecting soft references to be cleared, but it is not * required to do so. */ @@ -108,7 +110,8 @@ public class SoftReference<T> extends Reference<T> { */ public T get() { T o = super.get(); - if (o != null) this.timestamp = clock; + if (o != null && this.timestamp != clock) + this.timestamp = clock; return o; } diff --git a/src/share/classes/java/net/AbstractPlainSocketImpl.java b/src/share/classes/java/net/AbstractPlainSocketImpl.java index 597783bf730628fcf39cac13680ade28120e4e82..18af8d6db64b67b3cc05e409c2383f8bc1976d12 100644 --- a/src/share/classes/java/net/AbstractPlainSocketImpl.java +++ b/src/share/classes/java/net/AbstractPlainSocketImpl.java @@ -33,6 +33,7 @@ import java.io.FileDescriptor; import java.io.ByteArrayOutputStream; import sun.net.ConnectionResetException; +import sun.net.NetHooks; /** * Default Socket Implementation. This implementation does @@ -304,6 +305,11 @@ abstract class AbstractPlainSocketImpl extends SocketImpl */ synchronized void doConnect(InetAddress address, int port, int timeout) throws IOException { + synchronized (fdLock) { + if (!closePending && (socket == null || !socket.isBound())) { + NetHooks.beforeTcpConnect(fd, address, port); + } + } try { FileDescriptor fd = acquireFD(); try { @@ -339,6 +345,11 @@ abstract class AbstractPlainSocketImpl extends SocketImpl protected synchronized void bind(InetAddress address, int lport) throws IOException { + synchronized (fdLock) { + if (!closePending && (socket == null || !socket.isBound())) { + NetHooks.beforeTcpBind(fd, address, lport); + } + } socketBind(address, lport); if (socket != null) socket.setBound(); diff --git a/src/share/classes/java/net/URLClassLoader.java b/src/share/classes/java/net/URLClassLoader.java index afb92b8c9389e7c319ea44db7ec0274beefdd30f..601601a56529604e84a03700619d00df63541db7 100644 --- a/src/share/classes/java/net/URLClassLoader.java +++ b/src/share/classes/java/net/URLClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -74,10 +74,10 @@ import sun.security.util.SecurityConstants; */ public class URLClassLoader extends SecureClassLoader implements Closeable { /* The search path for classes and resources */ - URLClassPath ucp; + private final URLClassPath ucp; /* The context to be used when loading classes and resources */ - private AccessControlContext acc; + private final AccessControlContext acc; /** * Constructs a new URLClassLoader for the given URLs. The URLs will be @@ -105,7 +105,19 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { security.checkCreateClassLoader(); } ucp = new URLClassPath(urls); - acc = AccessController.getContext(); + this.acc = AccessController.getContext(); + } + + URLClassLoader(URL[] urls, ClassLoader parent, + AccessControlContext acc) { + super(parent); + // this is to make the stack depth consistent with 1.1 + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkCreateClassLoader(); + } + ucp = new URLClassPath(urls); + this.acc = acc; } /** @@ -136,7 +148,18 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { security.checkCreateClassLoader(); } ucp = new URLClassPath(urls); - acc = AccessController.getContext(); + this.acc = AccessController.getContext(); + } + + URLClassLoader(URL[] urls, AccessControlContext acc) { + super(); + // this is to make the stack depth consistent with 1.1 + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkCreateClassLoader(); + } + ucp = new URLClassPath(urls); + this.acc = acc; } /** @@ -599,17 +622,14 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { public static URLClassLoader newInstance(final URL[] urls, final ClassLoader parent) { // Save the caller's context - AccessControlContext acc = AccessController.getContext(); + final AccessControlContext acc = AccessController.getContext(); // Need a privileged block to create the class loader URLClassLoader ucl = AccessController.doPrivileged( new PrivilegedAction<URLClassLoader>() { public URLClassLoader run() { - return new FactoryURLClassLoader(urls, parent); + return new FactoryURLClassLoader(urls, parent, acc); } }); - // Now set the context on the loader using the one we saved, - // not the one inside the privileged block... - ucl.acc = acc; return ucl; } @@ -626,18 +646,14 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { */ public static URLClassLoader newInstance(final URL[] urls) { // Save the caller's context - AccessControlContext acc = AccessController.getContext(); + final AccessControlContext acc = AccessController.getContext(); // Need a privileged block to create the class loader URLClassLoader ucl = AccessController.doPrivileged( new PrivilegedAction<URLClassLoader>() { public URLClassLoader run() { - return new FactoryURLClassLoader(urls); + return new FactoryURLClassLoader(urls, acc); } }); - - // Now set the context on the loader using the one we saved, - // not the one inside the privileged block... - ucl.acc = acc; return ucl; } @@ -649,20 +665,26 @@ public class URLClassLoader extends SecureClassLoader implements Closeable { } } ); + ClassLoader.registerAsParallelCapable(); } } final class FactoryURLClassLoader extends URLClassLoader { - FactoryURLClassLoader(URL[] urls, ClassLoader parent) { - super(urls, parent); + static { + ClassLoader.registerAsParallelCapable(); + } + + FactoryURLClassLoader(URL[] urls, ClassLoader parent, + AccessControlContext acc) { + super(urls, parent, acc); } - FactoryURLClassLoader(URL[] urls) { - super(urls); + FactoryURLClassLoader(URL[] urls, AccessControlContext acc) { + super(urls, acc); } - public final synchronized Class loadClass(String name, boolean resolve) + public final Class loadClass(String name, boolean resolve) throws ClassNotFoundException { // First check if we have permission to access the package. This diff --git a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java index 15626425a0efb68be947520c77ace191c83b4596..60be7479c49f71102b678189e4d82f2811aec083 100644 --- a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java +++ b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java @@ -196,10 +196,12 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private 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 --git a/src/share/classes/java/nio/Direct-X-Buffer.java b/src/share/classes/java/nio/Direct-X-Buffer.java index 5f738b7811e74930ef93434526b7b1a8cd301ec3..a977626351e1a943c3a6711ab424be71e2519222 100644 --- a/src/share/classes/java/nio/Direct-X-Buffer.java +++ b/src/share/classes/java/nio/Direct-X-Buffer.java @@ -412,10 +412,12 @@ class Direct$Type$Buffer$RW$$BO$ 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 --git a/src/share/classes/java/nio/Heap-X-Buffer.java b/src/share/classes/java/nio/Heap-X-Buffer.java index b615ba3c633d14fba3d45e3594c11498b82111fc..864161fa02eb65006647517471095ed9478f3123 100644 --- a/src/share/classes/java/nio/Heap-X-Buffer.java +++ b/src/share/classes/java/nio/Heap-X-Buffer.java @@ -572,10 +572,13 @@ class Heap$Type$Buffer$RW$ || (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 --git a/src/share/classes/java/nio/StringCharBuffer.java b/src/share/classes/java/nio/StringCharBuffer.java index 648b1986fca36c0c5ff63246810567c76d0c0a2e..8871b943f4186afc833fbf08f28f99f9d6c4e23f 100644 --- a/src/share/classes/java/nio/StringCharBuffer.java +++ b/src/share/classes/java/nio/StringCharBuffer.java @@ -102,10 +102,12 @@ class StringCharBuffer // package-private 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 --git a/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java b/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java index 6a9d9f09715862a1b1fb4b757fd113b7be4a24eb..65b90d0f29d4ce611f31b34dedd6f5e60c55a70d 100644 --- a/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java +++ b/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java @@ -443,7 +443,7 @@ public abstract class AsynchronousDatagramChannel * at least care must be taken to ensure that the buffer is not accessed * while the channel remains open. * - * <p> If there is a security manager installed and the the channel is not + * <p> 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 --git a/src/share/classes/java/nio/channels/DatagramChannel.java b/src/share/classes/java/nio/channels/DatagramChannel.java index c7bd3df8b8344de85bf9aff1a7561bf134b5e231..cbf402f5933c3551cedb67360ed3dc58e47d957a 100644 --- a/src/share/classes/java/nio/channels/DatagramChannel.java +++ b/src/share/classes/java/nio/channels/DatagramChannel.java @@ -261,7 +261,10 @@ public abstract class DatagramChannel * * <p> This method may be invoked at any time. It will not have any effect * on read or write operations that are already in progress at the moment - * that it is invoked. </p> + * that it is invoked. If this channel's socket is not bound then this method + * will first cause the socket to be bound to an address that is assigned + * automatically, as if invoking the {@link #bind bind} method with a + * parameter of {@code null}. </p> * * @param remote * The remote address to which this channel is to be connected @@ -356,7 +359,10 @@ public abstract class DatagramChannel * <p> This method may be invoked at any time. If another thread has * already initiated a read operation upon this channel, however, then an * invocation of this method will block until the first operation is - * complete. </p> + * complete. If this channel's socket is not bound then this method will + * first cause the socket to be bound to an address that is assigned + * automatically, as if invoking the {@link #bind bind} method with a + * parameter of {@code null}. </p> * * @param dst * The buffer into which the datagram is to be transferred @@ -413,7 +419,10 @@ public abstract class DatagramChannel * <p> This method may be invoked at any time. If another thread has * already initiated a write operation upon this channel, however, then an * invocation of this method will block until the first operation is - * complete. </p> + * complete. If this channel's socket is not bound then this method will + * first cause the socket to be bound to an address that is assigned + * automatically, as if by invoking the {@link #bind bind) method with a + * parameter of {@code null}. </p> * * @param src * The buffer containing the datagram to be sent diff --git a/src/share/classes/java/nio/file/Path.java b/src/share/classes/java/nio/file/Path.java index 55bf8fd2675995dddb3dad50da5b867f0369ac3e..8f796b6c32e9e546994f1c13fc5613ee9d04b334 100644 --- a/src/share/classes/java/nio/file/Path.java +++ b/src/share/classes/java/nio/file/Path.java @@ -494,7 +494,7 @@ public abstract class Path * @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}<tt>("symbolic")</tt> * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to the path of the symbolic link. @@ -531,7 +531,7 @@ public abstract class Path * @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}<tt>("hard")</tt> * or its {@link SecurityManager#checkWrite(String) checkWrite} * method denies write access to both this path and the path of the @@ -560,7 +560,7 @@ public abstract class Path * @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 @@ public abstract class Path * 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 @@ public abstract class Path * @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 @@ public abstract class Path * @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 --git a/src/share/classes/java/nio/file/SecureDirectoryStream.java b/src/share/classes/java/nio/file/SecureDirectoryStream.java index b2555c14185774a154dd292b8ac213e892313fd6..7268c41c54df3fba0903258e81dd3e63d3d784d9 100644 --- a/src/share/classes/java/nio/file/SecureDirectoryStream.java +++ b/src/share/classes/java/nio/file/SecureDirectoryStream.java @@ -208,7 +208,7 @@ public abstract class SecureDirectoryStream * @throws ClosedDirectoryStreamException * if the directory stream is closed * @throws NoSuchFileException - * if the the directory does not exist <i>(optional specific exception)</i> + * if the directory does not exist <i>(optional specific exception)</i> * @throws DirectoryNotEmptyException * if the directory could not otherwise be deleted because it is * not empty <i>(optional specific exception)</i> diff --git a/src/share/classes/java/security/AccessController.java b/src/share/classes/java/security/AccessController.java index dd49271ef87e3c2e6ab5e15313a220757f4f27e7..47b8a93dc0e12427d6a90558378a4c7c26f24105 100644 --- a/src/share/classes/java/security/AccessController.java +++ b/src/share/classes/java/security/AccessController.java @@ -425,7 +425,7 @@ public final class AccessController { * Performs the specified <code>PrivilegedExceptionAction</code> with * privileges enabled and restricted by the specified * <code>AccessControlContext</code>. 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 <code>AccessControlContext</code>. * <p> diff --git a/src/share/classes/java/security/AlgorithmParametersSpi.java b/src/share/classes/java/security/AlgorithmParametersSpi.java index 4bff86ded5c628caa4001c75d718e86165affd2b..a70faf376c307e8fdacfafc23c1cb6eb1037b397 100644 --- a/src/share/classes/java/security/AlgorithmParametersSpi.java +++ b/src/share/classes/java/security/AlgorithmParametersSpi.java @@ -102,7 +102,7 @@ public abstract class AlgorithmParametersSpi { * parameters should be returned in an instance of the * <code>DSAParameterSpec</code> 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 --git a/src/share/classes/java/security/PrivilegedActionException.java b/src/share/classes/java/security/PrivilegedActionException.java index 4f42c02b2f818f975436022749a1f1f0072c4470..d17d21a528a7813c1b1d147cea3481f13c9e7252 100644 --- a/src/share/classes/java/security/PrivilegedActionException.java +++ b/src/share/classes/java/security/PrivilegedActionException.java @@ -87,7 +87,7 @@ public class PrivilegedActionException extends Exception { } /** - * 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 * <code>PrivilegedActionException</code>). * diff --git a/src/share/classes/java/security/SecureClassLoader.java b/src/share/classes/java/security/SecureClassLoader.java index fac4596359c98bea961a2a30b0ad7d5938724328..ff11f38aaaa22638a30990e05fd4723545c52171 100644 --- a/src/share/classes/java/security/SecureClassLoader.java +++ b/src/share/classes/java/security/SecureClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -45,14 +45,19 @@ public class SecureClassLoader extends ClassLoader { * succeed. Otherwise the object is not initialized and the object is * useless. */ - private boolean initialized = false; + private final boolean initialized; // HashMap that maps CodeSource to ProtectionDomain - private HashMap<CodeSource, ProtectionDomain> pdcache = + // @GuardedBy("pdcache") + private final HashMap<CodeSource, ProtectionDomain> pdcache = new HashMap<CodeSource, ProtectionDomain>(11); private static final Debug debug = Debug.getInstance("scl"); + static { + ClassLoader.registerAsParallelCapable(); + } + /** * Creates a new SecureClassLoader using the specified parent * class loader for delegation. @@ -136,10 +141,7 @@ public class SecureClassLoader extends ClassLoader { byte[] b, int off, int len, CodeSource cs) { - if (cs == null) - return defineClass(name, b, off, len); - else - return defineClass(name, b, off, len, getProtectionDomain(cs)); + return defineClass(name, b, off, len, getProtectionDomain(cs)); } /** @@ -172,10 +174,7 @@ public class SecureClassLoader extends ClassLoader { protected final Class<?> defineClass(String name, java.nio.ByteBuffer b, CodeSource cs) { - if (cs == null) - return defineClass(name, b, (ProtectionDomain)null); - else - return defineClass(name, b, getProtectionDomain(cs)); + return defineClass(name, b, getProtectionDomain(cs)); } /** @@ -209,12 +208,10 @@ public class SecureClassLoader extends ClassLoader { if (pd == null) { PermissionCollection perms = getPermissions(cs); pd = new ProtectionDomain(cs, perms, this, null); - if (pd != null) { - pdcache.put(cs, pd); - if (debug != null) { - debug.println(" getPermissions "+ pd); - debug.println(""); - } + pdcache.put(cs, pd); + if (debug != null) { + debug.println(" getPermissions "+ pd); + debug.println(""); } } } diff --git a/src/share/classes/java/security/Security.java b/src/share/classes/java/security/Security.java index 7ed79566a1c94adc10c52bd2bb47a139b27673c2..c7d69501711505b9cb60013e9248baced24003f4 100644 --- a/src/share/classes/java/security/Security.java +++ b/src/share/classes/java/security/Security.java @@ -501,7 +501,7 @@ public final class Security { * <li> <i><crypto_service>.<algorithm_or_type> * <attribute_name>:< attribute_value></i> * <p> 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 * <i><algorithm_or_type></i> and the <i><attribute_name></i>. * <p> A provider satisfies this selection criterion iff the * provider implements the specified algorithm or type for the specified diff --git a/src/share/classes/java/security/SecurityPermission.java b/src/share/classes/java/security/SecurityPermission.java index 41744ae73e8be2784a78ba76bf2d279890538cdf..1d9049d5beca90370699b2f86129902eae41dc70 100644 --- a/src/share/classes/java/security/SecurityPermission.java +++ b/src/share/classes/java/security/SecurityPermission.java @@ -118,7 +118,7 @@ import java.util.StringTokenizer; * <td>setProperty.{key}</td> * <td>Setting of the security property with the specified key</td> * <td>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 --git a/src/share/classes/java/security/SignatureSpi.java b/src/share/classes/java/security/SignatureSpi.java index 4b6049c192fe0d79b429a17db41d1d770b072f23..b6bf347d65594e326cb6386d7ab482aad21bf933 100644 --- a/src/share/classes/java/security/SignatureSpi.java +++ b/src/share/classes/java/security/SignatureSpi.java @@ -316,7 +316,7 @@ public abstract class SignatureSpi { * 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 --git a/src/share/classes/java/security/cert/CertificateFactory.java b/src/share/classes/java/security/cert/CertificateFactory.java index 961e15de30e59073a29e5c90106cef02871dba3b..f1059d1c5ff01e15df158713def572fefec0c752 100644 --- a/src/share/classes/java/security/cert/CertificateFactory.java +++ b/src/share/classes/java/security/cert/CertificateFactory.java @@ -460,7 +460,7 @@ public class CertificateFactory { * {@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 --git a/src/share/classes/java/security/cert/CertificateFactorySpi.java b/src/share/classes/java/security/cert/CertificateFactorySpi.java index 5c24027a440a85d1cc81a512695cb1e30e196590..29eb74bfae8847fc37d9315c29f6ebeab54a0bc1 100644 --- a/src/share/classes/java/security/cert/CertificateFactorySpi.java +++ b/src/share/classes/java/security/cert/CertificateFactorySpi.java @@ -88,7 +88,7 @@ public abstract class CertificateFactorySpi { * {@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 @@ public abstract class CertificateFactorySpi { * {@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 --git a/src/share/classes/java/util/Calendar.java b/src/share/classes/java/util/Calendar.java index 7fa8296433c00011aaca10e5c676a9fcf82eb0e2..5b7e27509ce2f7c8c13e1239d8d460f69aa9bd2c 100644 --- a/src/share/classes/java/util/Calendar.java +++ b/src/share/classes/java/util/Calendar.java @@ -41,9 +41,14 @@ package java.util; 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 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca } } + 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 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca 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<ZoneInfo>() { + 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 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca // 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 --git a/src/share/classes/java/util/TreeMap.java b/src/share/classes/java/util/TreeMap.java index 6a1c6b411f53e91a95887eaf25a201a461f3ccc0..cf97bccb7e7dc9101ae945a63b4cca64b299e108 100644 --- a/src/share/classes/java/util/TreeMap.java +++ b/src/share/classes/java/util/TreeMap.java @@ -1068,14 +1068,14 @@ public class TreeMap<K,V> } public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { - return new TreeSet<E>(m.subMap(fromElement, fromInclusive, - toElement, toInclusive)); + return new KeySet<E>(m.subMap(fromElement, fromInclusive, + toElement, toInclusive)); } public NavigableSet<E> headSet(E toElement, boolean inclusive) { - return new TreeSet<E>(m.headMap(toElement, inclusive)); + return new KeySet<E>(m.headMap(toElement, inclusive)); } public NavigableSet<E> tailSet(E fromElement, boolean inclusive) { - return new TreeSet<E>(m.tailMap(fromElement, inclusive)); + return new KeySet<E>(m.tailMap(fromElement, inclusive)); } public SortedSet<E> subSet(E fromElement, E toElement) { return subSet(fromElement, true, toElement, false); @@ -1087,7 +1087,7 @@ public class TreeMap<K,V> return tailSet(fromElement, true); } public NavigableSet<E> descendingSet() { - return new TreeSet(m.descendingMap()); + return new KeySet(m.descendingMap()); } } diff --git a/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java index 143d06713b4b69626677628c6ae2ec928d4d7baf..323482acb4ea0ffbd18622d93c223bf396ad66bb 100644 --- a/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java +++ b/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java @@ -2394,15 +2394,14 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V> boolean fromInclusive, E toElement, boolean toInclusive) { - return new ConcurrentSkipListSet<E> - (m.subMap(fromElement, fromInclusive, - toElement, toInclusive)); + return new KeySet<E>(m.subMap(fromElement, fromInclusive, + toElement, toInclusive)); } public NavigableSet<E> headSet(E toElement, boolean inclusive) { - return new ConcurrentSkipListSet<E>(m.headMap(toElement, inclusive)); + return new KeySet<E>(m.headMap(toElement, inclusive)); } public NavigableSet<E> tailSet(E fromElement, boolean inclusive) { - return new ConcurrentSkipListSet<E>(m.tailMap(fromElement, inclusive)); + return new KeySet<E>(m.tailMap(fromElement, inclusive)); } public NavigableSet<E> subSet(E fromElement, E toElement) { return subSet(fromElement, true, toElement, false); @@ -2414,7 +2413,7 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V> return tailSet(fromElement, true); } public NavigableSet<E> descendingSet() { - return new ConcurrentSkipListSet(m.descendingMap()); + return new KeySet(m.descendingMap()); } } diff --git a/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java b/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java index a7f048e8bdb13e52a64e0d864246ad06f45b3b5e..68135015c291d684a522c62b3a955bc1f4243895 100644 --- a/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java +++ b/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java @@ -166,6 +166,11 @@ public abstract class AbstractQueuedLongSynchronizer static final int SIGNAL = -1; /** waitStatus value to indicate thread is waiting on condition */ static final int CONDITION = -2; + /** + * waitStatus value to indicate the next acquireShared should + * unconditionally propagate + */ + static final int PROPAGATE = -3; /** * Status field, taking on only the values: @@ -180,10 +185,16 @@ public abstract class AbstractQueuedLongSynchronizer * Nodes never leave this state. In particular, * a thread with cancelled node never again blocks. * CONDITION: This node is currently on a condition queue. - * It will not be used as a sync queue node until - * transferred. (Use of this value here - * has nothing to do with the other uses - * of the field, but simplifies mechanics.) + * It will not be used as a sync queue node + * until transferred, at which time the status + * will be set to 0. (Use of this value here has + * nothing to do with the other uses of the + * field, but simplifies mechanics.) + * PROPAGATE: A releaseShared should be propagated to other + * nodes. This is set (for head node only) in + * doReleaseShared to ensure propagation + * continues, even if other operations have + * since intervened. * 0: None of the above * * The values are arranged numerically to simplify use. @@ -403,10 +414,13 @@ public abstract class AbstractQueuedLongSynchronizer */ private void unparkSuccessor(Node node) { /* - * Try to clear status in anticipation of signalling. It is - * OK if this fails or if status is changed by waiting thread. + * If status is negative (i.e., possibly needing signal) try + * to clear in anticipation of signalling. It is OK if this + * fails or if status is changed by waiting thread. */ - compareAndSetWaitStatus(node, Node.SIGNAL, 0); + int ws = node.waitStatus; + if (ws < 0) + compareAndSetWaitStatus(node, ws, 0); /* * Thread to unpark is held in successor, which is normally @@ -425,24 +439,71 @@ public abstract class AbstractQueuedLongSynchronizer LockSupport.unpark(s.thread); } + /** + * Release action for shared mode -- signal successor and ensure + * propagation. (Note: For exclusive mode, release just amounts + * to calling unparkSuccessor of head if it needs signal.) + */ + private void doReleaseShared() { + /* + * Ensure that a release propagates, even if there are other + * in-progress acquires/releases. This proceeds in the usual + * way of trying to unparkSuccessor of head if it needs + * signal. But if it does not, status is set to PROPAGATE to + * ensure that upon release, propagation continues. + * Additionally, we must loop in case a new node is added + * while we are doing this. Also, unlike other uses of + * unparkSuccessor, we need to know if CAS to reset status + * fails, if so rechecking. + */ + for (;;) { + Node h = head; + if (h != null && h != tail) { + int ws = h.waitStatus; + if (ws == Node.SIGNAL) { + if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) + continue; // loop to recheck cases + unparkSuccessor(h); + } + else if (ws == 0 && + !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) + continue; // loop on failed CAS + } + if (h == head) // loop if head changed + break; + } + } + /** * Sets head of queue, and checks if successor may be waiting - * in shared mode, if so propagating if propagate > 0. + * in shared mode, if so propagating if either propagate > 0 or + * PROPAGATE status was set. * - * @param pred the node holding waitStatus for node * @param node the node * @param propagate the return value from a tryAcquireShared */ private void setHeadAndPropagate(Node node, long propagate) { + Node h = head; // Record old head for check below setHead(node); - if (propagate > 0 && node.waitStatus != 0) { - /* - * Don't bother fully figuring out successor. If it - * looks null, call unparkSuccessor anyway to be safe. - */ + /* + * Try to signal next queued node if: + * Propagation was indicated by caller, + * or was recorded (as h.waitStatus) by a previous operation + * (note: this uses sign-check of waitStatus because + * PROPAGATE status may transition to SIGNAL.) + * and + * The next node is waiting in shared mode, + * or we don't know, because it appears null + * + * The conservatism in both of these checks may cause + * unnecessary wake-ups, but only when there are multiple + * racing acquires/releases, so most need signals now or soon + * anyway. + */ + if (propagate > 0 || h == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) - unparkSuccessor(node); + doReleaseShared(); } } @@ -465,23 +526,27 @@ public abstract class AbstractQueuedLongSynchronizer while (pred.waitStatus > 0) node.prev = pred = pred.prev; - // Getting this before setting waitStatus ensures staleness + // predNext is the apparent node to unsplice. CASes below will + // fail if not, in which case, we lost race vs another cancel + // or signal, so no further action is necessary. Node predNext = pred.next; - // Can use unconditional write instead of CAS here + // Can use unconditional write instead of CAS here. + // After this atomic step, other Nodes can skip past us. + // Before, we are free of interference from other threads. node.waitStatus = Node.CANCELLED; - // If we are the tail, remove ourselves + // If we are the tail, remove ourselves. if (node == tail && compareAndSetTail(node, pred)) { compareAndSetNext(pred, predNext, null); } else { - // If "active" predecessor found... - if (pred != head - && (pred.waitStatus == Node.SIGNAL - || compareAndSetWaitStatus(pred, 0, Node.SIGNAL)) - && pred.thread != null) { - - // If successor is active, set predecessor's next link + // If successor needs signal, try to set pred's next-link + // so it will get one. Otherwise wake it up to propagate. + int ws; + if (pred != head && + ((ws = pred.waitStatus) == Node.SIGNAL || + (ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) && + pred.thread != null) { Node next = node.next; if (next != null && next.waitStatus <= 0) compareAndSetNext(pred, predNext, next); @@ -503,14 +568,14 @@ public abstract class AbstractQueuedLongSynchronizer * @return {@code true} if thread should block */ private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) { - int s = pred.waitStatus; - if (s < 0) + int ws = pred.waitStatus; + if (ws == Node.SIGNAL) /* * This node has already set status asking a release * to signal it, so it can safely park. */ return true; - if (s > 0) { + if (ws > 0) { /* * Predecessor was cancelled. Skip over predecessors and * indicate retry. @@ -519,14 +584,14 @@ public abstract class AbstractQueuedLongSynchronizer node.prev = pred = pred.prev; } while (pred.waitStatus > 0); pred.next = node; - } - else + } else { /* - * Indicate that we need a signal, but don't park yet. Caller - * will need to retry to make sure it cannot acquire before - * parking. + * waitStatus must be 0 or PROPAGATE. Indicate that we + * need a signal, but don't park yet. Caller will need to + * retry to make sure it cannot acquire before parking. */ - compareAndSetWaitStatus(pred, 0, Node.SIGNAL); + compareAndSetWaitStatus(pred, ws, Node.SIGNAL); + } return false; } @@ -1046,9 +1111,7 @@ public abstract class AbstractQueuedLongSynchronizer */ public final boolean releaseShared(long arg) { if (tryReleaseShared(arg)) { - Node h = head; - if (h != null && h.waitStatus != 0) - unparkSuccessor(h); + doReleaseShared(); return true; } return false; @@ -1390,8 +1453,8 @@ public abstract class AbstractQueuedLongSynchronizer * case the waitStatus can be transiently and harmlessly wrong). */ Node p = enq(node); - int c = p.waitStatus; - if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL)) + int ws = p.waitStatus; + if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL)) LockSupport.unpark(node.thread); return true; } diff --git a/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java b/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java index 39219bb5fd9111950c61c46f9eb02631f382190e..8de1cad1d503997b052c0ca2b875330d90d67d22 100644 --- a/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java +++ b/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java @@ -389,6 +389,11 @@ public abstract class AbstractQueuedSynchronizer static final int SIGNAL = -1; /** waitStatus value to indicate thread is waiting on condition */ static final int CONDITION = -2; + /** + * waitStatus value to indicate the next acquireShared should + * unconditionally propagate + */ + static final int PROPAGATE = -3; /** * Status field, taking on only the values: @@ -403,10 +408,16 @@ public abstract class AbstractQueuedSynchronizer * Nodes never leave this state. In particular, * a thread with cancelled node never again blocks. * CONDITION: This node is currently on a condition queue. - * It will not be used as a sync queue node until - * transferred. (Use of this value here - * has nothing to do with the other uses - * of the field, but simplifies mechanics.) + * It will not be used as a sync queue node + * until transferred, at which time the status + * will be set to 0. (Use of this value here has + * nothing to do with the other uses of the + * field, but simplifies mechanics.) + * PROPAGATE: A releaseShared should be propagated to other + * nodes. This is set (for head node only) in + * doReleaseShared to ensure propagation + * continues, even if other operations have + * since intervened. * 0: None of the above * * The values are arranged numerically to simplify use. @@ -626,10 +637,13 @@ public abstract class AbstractQueuedSynchronizer */ private void unparkSuccessor(Node node) { /* - * Try to clear status in anticipation of signalling. It is - * OK if this fails or if status is changed by waiting thread. + * If status is negative (i.e., possibly needing signal) try + * to clear in anticipation of signalling. It is OK if this + * fails or if status is changed by waiting thread. */ - compareAndSetWaitStatus(node, Node.SIGNAL, 0); + int ws = node.waitStatus; + if (ws < 0) + compareAndSetWaitStatus(node, ws, 0); /* * Thread to unpark is held in successor, which is normally @@ -648,24 +662,71 @@ public abstract class AbstractQueuedSynchronizer LockSupport.unpark(s.thread); } + /** + * Release action for shared mode -- signal successor and ensure + * propagation. (Note: For exclusive mode, release just amounts + * to calling unparkSuccessor of head if it needs signal.) + */ + private void doReleaseShared() { + /* + * Ensure that a release propagates, even if there are other + * in-progress acquires/releases. This proceeds in the usual + * way of trying to unparkSuccessor of head if it needs + * signal. But if it does not, status is set to PROPAGATE to + * ensure that upon release, propagation continues. + * Additionally, we must loop in case a new node is added + * while we are doing this. Also, unlike other uses of + * unparkSuccessor, we need to know if CAS to reset status + * fails, if so rechecking. + */ + for (;;) { + Node h = head; + if (h != null && h != tail) { + int ws = h.waitStatus; + if (ws == Node.SIGNAL) { + if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) + continue; // loop to recheck cases + unparkSuccessor(h); + } + else if (ws == 0 && + !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) + continue; // loop on failed CAS + } + if (h == head) // loop if head changed + break; + } + } + /** * Sets head of queue, and checks if successor may be waiting - * in shared mode, if so propagating if propagate > 0. + * in shared mode, if so propagating if either propagate > 0 or + * PROPAGATE status was set. * - * @param pred the node holding waitStatus for node * @param node the node * @param propagate the return value from a tryAcquireShared */ private void setHeadAndPropagate(Node node, int propagate) { + Node h = head; // Record old head for check below setHead(node); - if (propagate > 0 && node.waitStatus != 0) { - /* - * Don't bother fully figuring out successor. If it - * looks null, call unparkSuccessor anyway to be safe. - */ + /* + * Try to signal next queued node if: + * Propagation was indicated by caller, + * or was recorded (as h.waitStatus) by a previous operation + * (note: this uses sign-check of waitStatus because + * PROPAGATE status may transition to SIGNAL.) + * and + * The next node is waiting in shared mode, + * or we don't know, because it appears null + * + * The conservatism in both of these checks may cause + * unnecessary wake-ups, but only when there are multiple + * racing acquires/releases, so most need signals now or soon + * anyway. + */ + if (propagate > 0 || h == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) - unparkSuccessor(node); + doReleaseShared(); } } @@ -688,23 +749,27 @@ public abstract class AbstractQueuedSynchronizer while (pred.waitStatus > 0) node.prev = pred = pred.prev; - // Getting this before setting waitStatus ensures staleness + // predNext is the apparent node to unsplice. CASes below will + // fail if not, in which case, we lost race vs another cancel + // or signal, so no further action is necessary. Node predNext = pred.next; - // Can use unconditional write instead of CAS here + // Can use unconditional write instead of CAS here. + // After this atomic step, other Nodes can skip past us. + // Before, we are free of interference from other threads. node.waitStatus = Node.CANCELLED; - // If we are the tail, remove ourselves + // If we are the tail, remove ourselves. if (node == tail && compareAndSetTail(node, pred)) { compareAndSetNext(pred, predNext, null); } else { - // If "active" predecessor found... - if (pred != head - && (pred.waitStatus == Node.SIGNAL - || compareAndSetWaitStatus(pred, 0, Node.SIGNAL)) - && pred.thread != null) { - - // If successor is active, set predecessor's next link + // If successor needs signal, try to set pred's next-link + // so it will get one. Otherwise wake it up to propagate. + int ws; + if (pred != head && + ((ws = pred.waitStatus) == Node.SIGNAL || + (ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) && + pred.thread != null) { Node next = node.next; if (next != null && next.waitStatus <= 0) compareAndSetNext(pred, predNext, next); @@ -726,14 +791,14 @@ public abstract class AbstractQueuedSynchronizer * @return {@code true} if thread should block */ private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) { - int s = pred.waitStatus; - if (s < 0) + int ws = pred.waitStatus; + if (ws == Node.SIGNAL) /* * This node has already set status asking a release * to signal it, so it can safely park. */ return true; - if (s > 0) { + if (ws > 0) { /* * Predecessor was cancelled. Skip over predecessors and * indicate retry. @@ -742,14 +807,14 @@ public abstract class AbstractQueuedSynchronizer node.prev = pred = pred.prev; } while (pred.waitStatus > 0); pred.next = node; - } - else + } else { /* - * Indicate that we need a signal, but don't park yet. Caller - * will need to retry to make sure it cannot acquire before - * parking. + * waitStatus must be 0 or PROPAGATE. Indicate that we + * need a signal, but don't park yet. Caller will need to + * retry to make sure it cannot acquire before parking. */ - compareAndSetWaitStatus(pred, 0, Node.SIGNAL); + compareAndSetWaitStatus(pred, ws, Node.SIGNAL); + } return false; } @@ -1269,9 +1334,7 @@ public abstract class AbstractQueuedSynchronizer */ public final boolean releaseShared(int arg) { if (tryReleaseShared(arg)) { - Node h = head; - if (h != null && h.waitStatus != 0) - unparkSuccessor(h); + doReleaseShared(); return true; } return false; @@ -1613,8 +1676,8 @@ public abstract class AbstractQueuedSynchronizer * case the waitStatus can be transiently and harmlessly wrong). */ Node p = enq(node); - int c = p.waitStatus; - if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL)) + int ws = p.waitStatus; + if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL)) LockSupport.unpark(node.thread); return true; } diff --git a/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java b/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java index 8888efb2477a57994432cdb724ba0969333a567f..e767dfa62b1d2974bcc2d5aa23c4a848e740ba67 100644 --- a/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java +++ b/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java @@ -276,7 +276,7 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab * Maintained as a ThreadLocal; cached in cachedHoldCounter */ static final class HoldCounter { - int count; + int count = 0; // Use id, not reference, to avoid garbage retention final long tid = Thread.currentThread().getId(); } @@ -293,8 +293,9 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab } /** - * The number of read locks held by current thread. + * The number of reentrant read locks held by current thread. * Initialized only in constructor and readObject. + * Removed whenever a thread's read hold count drops to 0. */ private transient ThreadLocalHoldCounter readHolds; @@ -304,17 +305,35 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab * where the next thread to release is the last one to * acquire. This is non-volatile since it is just used * as a heuristic, and would be great for threads to cache. + * + * <p>Can outlive the Thread for which it is caching the read + * hold count, but avoids garbage retention by not retaining a + * reference to the Thread. + * + * <p>Accessed via a benign data race; relies on the memory + * model's final field and out-of-thin-air guarantees. */ private transient HoldCounter cachedHoldCounter; /** * firstReader is the first thread to have acquired the read lock. * firstReaderHoldCount is firstReader's hold count. - * This allows tracking of read holds for uncontended read + * + * <p>More precisely, firstReader is the unique thread that last + * changed the shared count from 0 to 1, and has not released the + * read lock since then; null if there is no such thread. + * + * <p>Cannot cause garbage retention unless the thread terminated + * without relinquishing its read locks, since tryReleaseShared + * sets it to null. + * + * <p>Accessed via a benign data race; relies on the memory + * model's out-of-thin-air guarantees for references. + * + * <p>This allows tracking of read holds for uncontended read * locks to be very cheap. */ - private final static long INVALID_THREAD_ID = -1; - private transient long firstReader = INVALID_THREAD_ID; + private transient Thread firstReader = null; private transient int firstReaderHoldCount; Sync() { @@ -393,16 +412,16 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab } protected final boolean tryReleaseShared(int unused) { - long tid = Thread.currentThread().getId(); - if (firstReader == tid) { + Thread current = Thread.currentThread(); + if (firstReader == current) { // assert firstReaderHoldCount > 0; if (firstReaderHoldCount == 1) - firstReader = INVALID_THREAD_ID; + firstReader = null; else firstReaderHoldCount--; } else { HoldCounter rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) + if (rh == null || rh.tid != current.getId()) rh = readHolds.get(); int count = rh.count; if (count <= 1) { @@ -416,6 +435,9 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab int c = getState(); int nextc = c - SHARED_UNIT; if (compareAndSetState(c, nextc)) + // Releasing the read lock has no effect on readers, + // but it may allow waiting writers to proceed if + // both read and write locks are now free. return nextc == 0; } } @@ -450,15 +472,14 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (!readerShouldBlock() && r < MAX_COUNT && compareAndSetState(c, c + SHARED_UNIT)) { - long tid = current.getId(); if (r == 0) { - firstReader = tid; + firstReader = current; firstReaderHoldCount = 1; - } else if (firstReader == tid) { + } else if (firstReader == current) { firstReaderHoldCount++; } else { HoldCounter rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) + if (rh == null || rh.tid != current.getId()) cachedHoldCounter = rh = readHolds.get(); else if (rh.count == 0) readHolds.set(rh); @@ -485,19 +506,17 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab int c = getState(); if (exclusiveCount(c) != 0) { if (getExclusiveOwnerThread() != current) - //if (removeNeeded) readHolds.remove(); return -1; // else we hold the exclusive lock; blocking here // would cause deadlock. } else if (readerShouldBlock()) { // Make sure we're not acquiring read lock reentrantly - long tid = current.getId(); - if (firstReader == tid) { + if (firstReader == current) { // assert firstReaderHoldCount > 0; } else { if (rh == null) { rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) { + if (rh == null || rh.tid != current.getId()) { rh = readHolds.get(); if (rh.count == 0) readHolds.remove(); @@ -510,25 +529,20 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (sharedCount(c) == MAX_COUNT) throw new Error("Maximum lock count exceeded"); if (compareAndSetState(c, c + SHARED_UNIT)) { - long tid = current.getId(); if (sharedCount(c) == 0) { - firstReader = tid; + firstReader = current; firstReaderHoldCount = 1; - } else if (firstReader == tid) { + } else if (firstReader == current) { firstReaderHoldCount++; } else { - if (rh == null) { + if (rh == null) rh = cachedHoldCounter; - if (rh != null && rh.tid == tid) { - if (rh.count == 0) - readHolds.set(rh); - } else { - rh = readHolds.get(); - } - } else if (rh.count == 0) + if (rh == null || rh.tid != current.getId()) + rh = readHolds.get(); + else if (rh.count == 0) readHolds.set(rh); - cachedHoldCounter = rh; // cache for release rh.count++; + cachedHoldCounter = rh; // cache for release } return 1; } @@ -572,15 +586,14 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (r == MAX_COUNT) throw new Error("Maximum lock count exceeded"); if (compareAndSetState(c, c + SHARED_UNIT)) { - long tid = current.getId(); if (r == 0) { - firstReader = tid; + firstReader = current; firstReaderHoldCount = 1; - } else if (firstReader == tid) { + } else if (firstReader == current) { firstReaderHoldCount++; } else { HoldCounter rh = cachedHoldCounter; - if (rh == null || rh.tid != tid) + if (rh == null || rh.tid != current.getId()) cachedHoldCounter = rh = readHolds.get(); else if (rh.count == 0) readHolds.set(rh); @@ -626,12 +639,12 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab if (getReadLockCount() == 0) return 0; - long tid = Thread.currentThread().getId(); - if (firstReader == tid) + Thread current = Thread.currentThread(); + if (firstReader == current) return firstReaderHoldCount; HoldCounter rh = cachedHoldCounter; - if (rh != null && rh.tid == tid) + if (rh != null && rh.tid == current.getId()) return rh.count; int count = readHolds.get().count; @@ -647,7 +660,6 @@ public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); readHolds = new ThreadLocalHoldCounter(); - firstReader = INVALID_THREAD_ID; setState(0); // reset to unlocked state } diff --git a/src/share/classes/java/util/logging/LogRecord.java b/src/share/classes/java/util/logging/LogRecord.java index 6eda211f1115f6520594597617f8f514aff56952..0acf9fa78cde225d2b36b3c77c08f7d2b47e215f 100644 --- a/src/share/classes/java/util/logging/LogRecord.java +++ b/src/share/classes/java/util/logging/LogRecord.java @@ -25,6 +25,8 @@ package java.util.logging; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.io.*; /** @@ -64,9 +66,24 @@ import java.io.*; */ public class LogRecord implements java.io.Serializable { - private static long globalSequenceNumber; - private static int nextThreadId=10; - private static ThreadLocal<Integer> threadIds = new ThreadLocal<Integer>(); + private static final AtomicLong globalSequenceNumber + = new AtomicLong(0); + + /** + * The default value of threadID will be the current thread's + * thread id, for ease of correlation, unless it is greater than + * MIN_SEQUENTIAL_THREAD_ID, in which case we try harder to keep + * our promise to keep threadIDs unique by avoiding collisions due + * to 32-bit wraparound. Unfortunately, LogRecord.getThreadID() + * returns int, while Thread.getId() returns long. + */ + private static final int MIN_SEQUENTIAL_THREAD_ID = Integer.MAX_VALUE / 2; + + private static final AtomicInteger nextThreadId + = new AtomicInteger(MIN_SEQUENTIAL_THREAD_ID); + + private static final ThreadLocal<Integer> threadIds + = new ThreadLocal<Integer>(); /** * @serial Logging message level @@ -122,6 +139,23 @@ public class LogRecord implements java.io.Serializable { private transient Object parameters[]; private transient ResourceBundle resourceBundle; + /** + * Returns the default value for a new LogRecord's threadID. + */ + private int defaultThreadID() { + long tid = Thread.currentThread().getId(); + if (tid < MIN_SEQUENTIAL_THREAD_ID) { + return (int) tid; + } else { + Integer id = threadIds.get(); + if (id == null) { + id = nextThreadId.getAndIncrement(); + threadIds.set(id); + } + return id; + } + } + /** * Construct a LogRecord with the given level and message values. * <p> @@ -144,15 +178,8 @@ public class LogRecord implements java.io.Serializable { this.level = level; message = msg; // Assign a thread ID and a unique sequence number. - synchronized (LogRecord.class) { - sequenceNumber = globalSequenceNumber++; - Integer id = threadIds.get(); - if (id == null) { - id = new Integer(nextThreadId++); - threadIds.set(id); - } - threadID = id.intValue(); - } + sequenceNumber = globalSequenceNumber.getAndIncrement(); + threadID = defaultThreadID(); millis = System.currentTimeMillis(); needToInferCaller = true; } diff --git a/src/share/classes/java/util/logging/Logger.java b/src/share/classes/java/util/logging/Logger.java index 28f942a0f2acadf80550ebab3109d141267d29b0..5ae2b42713361f38875dd8141a1c172ebb1861e4 100644 --- a/src/share/classes/java/util/logging/Logger.java +++ b/src/share/classes/java/util/logging/Logger.java @@ -477,7 +477,7 @@ public class Logger { Logger logger = this; while (logger != null) { - for (Handler handler : logger.handlers) { + for (Handler handler : logger.getHandlers()) { handler.publish(record); } diff --git a/src/share/classes/java/util/zip/ZipCoder.java b/src/share/classes/java/util/zip/ZipCoder.java new file mode 100644 index 0000000000000000000000000000000000000000..6442bea819d56adf4ac53af2769f5bde49c486ef --- /dev/null +++ b/src/share/classes/java/util/zip/ZipCoder.java @@ -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 --git a/src/share/classes/java/util/zip/ZipConstants64.java b/src/share/classes/java/util/zip/ZipConstants64.java new file mode 100644 index 0000000000000000000000000000000000000000..b844b2cccee64e21cb2845a09dcd9364bf1b7543 --- /dev/null +++ b/src/share/classes/java/util/zip/ZipConstants64.java @@ -0,0 +1,84 @@ +/* + * Copyright 1995-1996 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; + +/* + * This class defines the constants that are used by the classes + * which manipulate Zip64 files. + */ + +class ZipConstants64 { + + /* + * ZIP64 constants + */ + static final long ZIP64_ENDSIG = 0x06064b50L; // "PK\006\006" + static final long ZIP64_LOCSIG = 0x07064b50L; // "PK\006\007" + static final int ZIP64_ENDHDR = 56; // ZIP64 end header size + static final int ZIP64_LOCHDR = 20; // ZIP64 end loc header size + static final int ZIP64_EXTHDR = 24; // EXT header size + static final int ZIP64_EXTID = 0x0001; // Extra field Zip64 header ID + + static final int ZIP64_MAGICCOUNT = 0xFFFF; + static final long ZIP64_MAGICVAL = 0xFFFFFFFFL; + + /* + * Zip64 End of central directory (END) header field offsets + */ + static final int ZIP64_ENDLEN = 4; // size of zip64 end of central dir + static final int ZIP64_ENDVEM = 12; // version made by + static final int ZIP64_ENDVER = 14; // version needed to extract + static final int ZIP64_ENDNMD = 16; // number of this disk + static final int ZIP64_ENDDSK = 20; // disk number of start + static final int ZIP64_ENDTOD = 24; // total number of entries on this disk + static final int ZIP64_ENDTOT = 32; // total number of entries + static final int ZIP64_ENDSIZ = 40; // central directory size in bytes + static final int ZIP64_ENDOFF = 48; // offset of first CEN header + static final int ZIP64_ENDEXT = 56; // zip64 extensible data sector + + /* + * Zip64 End of central directory locator field offsets + */ + static final int ZIP64_LOCDSK = 4; // disk number start + static final int ZIP64_LOCOFF = 8; // offset of zip64 end + static final int ZIP64_LOCTOT = 16; // total number of disks + + /* + * Zip64 Extra local (EXT) header field offsets + */ + static final int ZIP64_EXTCRC = 4; // uncompressed file crc-32 value + 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 --git a/src/share/classes/java/util/zip/ZipEntry.java b/src/share/classes/java/util/zip/ZipEntry.java index bcc27e63a0fceaf6c71b69ea06d063d8fda6d35d..96e3b4d828e530d954786b3554cac603f32770fd 100644 --- a/src/share/classes/java/util/zip/ZipEntry.java +++ b/src/share/classes/java/util/zip/ZipEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -40,6 +40,7 @@ class ZipEntry implements ZipConstants, Cloneable { 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 @@ class ZipEntry implements ZipConstants, Cloneable { */ 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 @@ class ZipEntry implements ZipConstants, Cloneable { 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. @@ -144,11 +125,13 @@ class ZipEntry implements ZipConstants, Cloneable { * Sets the uncompressed size of the entry data. * @param size the uncompressed size in bytes * @exception IllegalArgumentException if the specified size is less - * than 0 or greater than 0xFFFFFFFF bytes + * than 0, is greater than 0xFFFFFFFF when + * <a href="package-summary.html#zip64">ZIP64 format</a> is not supported, + * or is less than 0 when ZIP64 is supported * @see #getSize() */ public void setSize(long size) { - if (size < 0 || size > 0xFFFFFFFFL) { + if (size < 0) { throw new IllegalArgumentException("invalid entry size"); } this.size = size; @@ -256,16 +239,16 @@ class ZipEntry implements ZipConstants, Cloneable { /** * Sets the optional comment string for the entry. + * + * <p>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 --git a/src/share/classes/java/util/zip/ZipFile.java b/src/share/classes/java/util/zip/ZipFile.java index 37e92ddecb77084c3bb64d75b70f184f403a0e4c..8ee0bc2eb57241ac82e3766a30dbadb4c4c746eb 100644 --- a/src/share/classes/java/util/zip/ZipFile.java +++ b/src/share/classes/java/util/zip/ZipFile.java @@ -29,9 +29,11 @@ import java.io.InputStream; 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 @@ class ZipFile implements ZipConstants { /** * Opens a zip file for reading. * - * <p>First, if there is a security - * manager, its <code>checkRead</code> method - * is called with the <code>name</code> argument - * as its argument to ensure the read is allowed. + * <p>First, if there is a security manager, its <code>checkRead</code> + * method is called with the <code>name</code> argument as its argument + * to ensure the read is allowed. + * + * <p>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 * <code>checkRead</code> 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 @@ class ZipFile implements ZipConstants { * method is called with the <code>name</code> argument as its argument to * ensure the read is allowed. * + * <p>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 @@ class ZipFile implements ZipConstants { * @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. + * + * <p>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 <code>ZipFile</code> to read from the specified + * <code>File</code> object in the specified mode. The mode argument + * must be either <tt>OPEN_READ</tt> or <tt>OPEN_READ | OPEN_DELETE</tt>. + * + * <p>First, if there is a security manager, its <code>checkRead</code> + * method is called with the <code>name</code> 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 <code>checkRead</code> + * method doesn't allow read access to the file,or its + * <code>checkDelete</code> method doesn't allow deleting the + * file when the <tt>OPEN_DELETE</tt> flag is set + * + * @throws IllegalArgumentException if the <tt>mode</tt> 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 @@ class ZipFile implements ZipConstants { 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. + * + * <p>First, if there is a security manager, its <code>checkRead</code> + * method is called with the <code>name</code> 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 <code>checkRead</code> + * 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 <a href="package-summary.html#lang_encoding"> language + * encoding bit</a> 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 @@ class ZipFile implements ZipConstants { 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 @@ class ZipFile implements ZipConstants { 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 @@ class ZipFile implements ZipConstants { * @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 @@ class ZipFile implements ZipConstants { } } - 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 @@ class ZipFile implements ZipConstants { ",\n message = " + message ); } - ZipEntry ze = new ZipEntry(jzentry); + ZipEntry ze = getZipEntry(null, jzentry); freeEntry(jzfile, jzentry); return ze; } @@ -351,6 +441,38 @@ class ZipFile implements ZipConstants { }; } + 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 @@ class ZipFile implements ZipConstants { ZipFileInputStream(long jzentry) { pos = 0; - rem = getCSize(jzentry); - size = getSize(jzentry); + rem = getEntryCSize(jzentry); + size = getEntrySize(jzentry); this.jzentry = jzentry; } @@ -514,13 +636,25 @@ class ZipFile implements ZipConstants { } + + 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 --git a/src/share/classes/java/util/zip/ZipInputStream.java b/src/share/classes/java/util/zip/ZipInputStream.java index e8f0ebdc5d96f311b8494941d05e5764c67bf052..83f9ad4b75302ba330949bbedbd4de970d6ae894 100644 --- a/src/share/classes/java/util/zip/ZipInputStream.java +++ b/src/share/classes/java/util/zip/ZipInputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -29,6 +29,8 @@ import java.io.InputStream; import java.io.IOException; import java.io.EOFException; import java.io.PushbackInputStream; +import java.nio.charset.Charset; +import static java.util.zip.ZipConstants64.*; /** * This class implements an input stream filter for reading files in the @@ -53,6 +55,8 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { // one entry private boolean entryEOF = false; + private ZipCoder zc; + /** * Check to make sure that this stream has not been closed */ @@ -64,14 +68,39 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { /** * Creates a new ZIP input stream. + * + * <p>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 + * <a href="package-summary.html#lang_encoding"> language + * encoding bit</a> 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); } /** @@ -140,8 +169,8 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { * @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 <code>b</code> is <code>null</code>. - * @exception IndexOutOfBoundsException If <code>off</code> is negative, + * @exception NullPointerException if <code>b</code> is <code>null</code>. + * @exception IndexOutOfBoundsException if <code>off</code> is negative, * <code>len</code> is negative, or <code>len</code> is greater than * <code>b.length - off</code> * @exception ZipException if a ZIP file error has occurred @@ -251,6 +280,8 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { 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; @@ -261,9 +292,11 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { 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"); } @@ -285,73 +318,31 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { byte[] bb = new byte[len]; readFully(bb, 0, len); e.setExtra(bb); - } - 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(); + // extra fields are in "HeaderID(2)DataSize(2)Data... format + if (e.csize == ZIP64_MAGICVAL || e.size == ZIP64_MAGICVAL) { + int off = 0; + while (off + 4 < len) { + int sz = get16(bb, off + 2); + if (get16(bb, off) == ZIP64_EXTID) { + off += 4; + // LOC extra zip64 entry MUST include BOTH original and + // compressed file size fields + if (sz < 16 || (off + sz) > len ) { + // Invalid zip64 extra fields, simply skip. Even it's + // rare, it's possible the entry size happens to be + // the magic value and it "accidnetly" has some bytes + // in extra match the id. + return e; + } + e.size = get64(bb, off); + e.csize = get64(bb, off + 8); + break; + } + off += (sz + 4); } - 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); + return e; } /** @@ -375,18 +366,36 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { } if ((flag & 8) == 8) { /* "Data Descriptor" present */ - readFully(tmpbuf, 0, EXTHDR); - long sig = get32(tmpbuf, 0); - if (sig != EXTSIG) { // no EXTSIG present - e.crc = sig; - e.csize = get32(tmpbuf, EXTSIZ - EXTCRC); - e.size = get32(tmpbuf, EXTLEN - EXTCRC); - ((PushbackInputStream)in).unread( - tmpbuf, EXTHDR - EXTCRC - 1, EXTCRC); + if (inf.getBytesWritten() > ZIP64_MAGICVAL || + inf.getBytesRead() > ZIP64_MAGICVAL) { + // ZIP64 format + readFully(tmpbuf, 0, ZIP64_EXTHDR); + long sig = get32(tmpbuf, 0); + if (sig != EXTSIG) { // no EXTSIG present + e.crc = sig; + e.csize = get64(tmpbuf, ZIP64_EXTSIZ - ZIP64_EXTCRC); + e.size = get64(tmpbuf, ZIP64_EXTLEN - ZIP64_EXTCRC); + ((PushbackInputStream)in).unread( + tmpbuf, ZIP64_EXTHDR - ZIP64_EXTCRC - 1, ZIP64_EXTCRC); + } else { + e.crc = get32(tmpbuf, ZIP64_EXTCRC); + e.csize = get64(tmpbuf, ZIP64_EXTSIZ); + e.size = get64(tmpbuf, ZIP64_EXTLEN); + } } else { - e.crc = get32(tmpbuf, EXTCRC); - e.csize = get32(tmpbuf, EXTSIZ); - e.size = get32(tmpbuf, EXTLEN); + readFully(tmpbuf, 0, EXTHDR); + long sig = get32(tmpbuf, 0); + if (sig != EXTSIG) { // no EXTSIG present + e.crc = sig; + e.csize = get32(tmpbuf, EXTSIZ - EXTCRC); + e.size = get32(tmpbuf, EXTLEN - EXTCRC); + ((PushbackInputStream)in).unread( + tmpbuf, EXTHDR - EXTCRC - 1, EXTCRC); + } else { + e.crc = get32(tmpbuf, EXTCRC); + e.csize = get32(tmpbuf, EXTSIZ); + e.size = get32(tmpbuf, EXTLEN); + } } } if (e.size != inf.getBytesWritten()) { @@ -433,6 +442,14 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { * The bytes are assumed to be in Intel (little-endian) byte order. */ private static final long get32(byte b[], int off) { - return get16(b, off) | ((long)get16(b, off+2) << 16); + return (get16(b, off) | ((long)get16(b, off+2) << 16)) & 0xffffffffL; + } + + /* + * Fetches signed 64-bit value from byte array at specified offset. + * The bytes are assumed to be in Intel (little-endian) byte order. + */ + private static final long get64(byte b[], int off) { + return get32(b, off) | (get32(b, off+4) << 32); } } diff --git a/src/share/classes/java/util/zip/ZipOutputStream.java b/src/share/classes/java/util/zip/ZipOutputStream.java index 797a37392fe4e73ac57a3d8ee14a8887ee11b6b7..da35ed97f14bd47b7305a8a946548430551673c3 100644 --- a/src/share/classes/java/util/zip/ZipOutputStream.java +++ b/src/share/classes/java/util/zip/ZipOutputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -27,8 +27,10 @@ package java.util.zip; 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.*; /** * This class implements an output stream filter for writing files in the @@ -43,19 +45,9 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { 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; } } @@ -65,12 +57,14 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { 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; @@ -99,10 +93,31 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { /** * Creates a new ZIP output stream. + * + * <p>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 </code>charset<code>} + * 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; } @@ -113,11 +128,11 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { * 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; } /** @@ -166,8 +181,15 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { 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 @@ -191,6 +213,8 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { 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); @@ -212,7 +236,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { 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( @@ -342,27 +366,53 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { */ private void writeLOC(XEntry xentry) throws IOException { ZipEntry e = xentry.entry; - int flag = xentry.flag; - writeInt(LOCSIG); // LOC header signature - writeShort(version(e)); // version needed to extract - writeShort(flag); // general purpose bit flag - writeShort(e.method); // compression method - writeInt(e.time); // last modification time + int flag = e.flag; + int elen = (e.extra != null) ? e.extra.length : 0; + boolean hasZip64 = false; + + writeInt(LOCSIG); // LOC header signature + if ((flag & 8) == 8) { + writeShort(version(e)); // version needed to extract + writeShort(flag); // general purpose bit flag + writeShort(e.method); // compression method + writeInt(e.time); // last modification time + // store size, uncompressed size, and crc-32 in data descriptor // immediately following compressed entry data writeInt(0); writeInt(0); writeInt(0); } else { - writeInt(e.crc); // crc-32 - writeInt(e.csize); // compressed size - writeInt(e.size); // uncompressed size + if (e.csize >= ZIP64_MAGICVAL || e.size >= ZIP64_MAGICVAL) { + hasZip64 = true; + writeShort(45); // ver 4.5 for zip64 + } else { + writeShort(version(e)); // version needed to extract + } + writeShort(flag); // general purpose bit flag + writeShort(e.method); // compression method + writeInt(e.time); // last modification time + writeInt(e.crc); // crc-32 + if (hasZip64) { + writeInt(ZIP64_MAGICVAL); + writeInt(ZIP64_MAGICVAL); + elen += 20; //headid(2) + size(2) + size(8) + csize(8) + } else { + writeInt(e.csize); // compressed size + writeInt(e.size); // uncompressed size + } } - byte[] nameBytes = getUTF8Bytes(e.name); + byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); - writeShort(e.extra != null ? e.extra.length : 0); + writeShort(elen); writeBytes(nameBytes, 0, nameBytes.length); + if (hasZip64) { + writeShort(ZIP64_EXTID); + writeShort(16); + writeLong(e.size); + writeLong(e.csize); + } if (e.extra != null) { writeBytes(e.extra, 0, e.extra.length); } @@ -375,8 +425,13 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { private void writeEXT(ZipEntry e) throws IOException { writeInt(EXTSIG); // EXT header signature writeInt(e.crc); // crc-32 - writeInt(e.csize); // compressed size - writeInt(e.size); // uncompressed size + if (e.csize >= ZIP64_MAGICVAL || e.size >= ZIP64_MAGICVAL) { + writeLong(e.csize); + writeLong(e.size); + } else { + writeInt(e.csize); // compressed size + writeInt(e.size); // uncompressed size + } } /* @@ -385,24 +440,55 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { */ 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; + long size = e.size; + long offset = xentry.offset; + int e64len = 0; + boolean hasZip64 = false; + if (e.csize >= ZIP64_MAGICVAL) { + csize = ZIP64_MAGICVAL; + e64len += 8; // csize(8) + hasZip64 = true; + } + if (e.size >= ZIP64_MAGICVAL) { + size = ZIP64_MAGICVAL; // size(8) + e64len += 8; + hasZip64 = true; + } + if (xentry.offset >= ZIP64_MAGICVAL) { + offset = ZIP64_MAGICVAL; + e64len += 8; // offset(8) + hasZip64 = true; + } writeInt(CENSIG); // CEN header signature - writeShort(version); // version made by - writeShort(version); // version needed to extract + if (hasZip64) { + writeShort(45); // ver 4.5 for zip64 + writeShort(45); + } else { + writeShort(version); // version made by + writeShort(version); // version needed to extract + } writeShort(flag); // general purpose bit flag writeShort(e.method); // compression method writeInt(e.time); // last modification time writeInt(e.crc); // crc-32 - writeInt(e.csize); // compressed size - writeInt(e.size); // uncompressed size - byte[] nameBytes = getUTF8Bytes(e.name); + writeInt(csize); // compressed size + writeInt(size); // uncompressed size + byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); - writeShort(e.extra != null ? e.extra.length : 0); + if (hasZip64) { + // + headid(2) + datasize(2) + writeShort(e64len + 4 + (e.extra != null ? e.extra.length : 0)); + } else { + writeShort(e.extra != null ? e.extra.length : 0); + } 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); @@ -410,13 +496,23 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { writeShort(0); // starting disk number writeShort(0); // internal file attributes (unused) writeInt(0); // external file attributes (unused) - writeInt(xentry.offset); // relative offset of local header + writeInt(offset); // relative offset of local header writeBytes(nameBytes, 0, nameBytes.length); + if (hasZip64) { + writeShort(ZIP64_EXTID);// Zip64 extra + writeShort(e64len); + if (size == ZIP64_MAGICVAL) + writeLong(e.size); + if (csize == ZIP64_MAGICVAL) + writeLong(e.csize); + if (offset == ZIP64_MAGICVAL) + writeLong(xentry.offset); + } if (e.extra != null) { writeBytes(e.extra, 0, e.extra.length); } if (commentBytes != null) { - writeBytes(commentBytes, 0, commentBytes.length); + writeBytes(commentBytes, 0, Math.min(commentBytes.length, 0xffff)); } } @@ -424,18 +520,52 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { * Writes end of central directory (END) header. */ private void writeEND(long off, long len) throws IOException { + boolean hasZip64 = false; + long xlen = len; + long xoff = off; + if (xlen >= ZIP64_MAGICVAL) { + xlen = ZIP64_MAGICVAL; + hasZip64 = true; + } + if (xoff >= ZIP64_MAGICVAL) { + xoff = ZIP64_MAGICVAL; + hasZip64 = true; + } int count = xentries.size(); - writeInt(ENDSIG); // END record signature - writeShort(0); // number of this disk - writeShort(0); // central directory start disk - writeShort(count); // number of directory entries on disk - writeShort(count); // total number of directory entries - writeInt(len); // length of central directory - writeInt(off); // offset of central directory - if (comment != null) { // zip file comment - byte[] b = getUTF8Bytes(comment); - writeShort(b.length); - writeBytes(b, 0, b.length); + if (count >= ZIP64_MAGICCOUNT) { + count = ZIP64_MAGICCOUNT; + hasZip64 = true; + } + if (hasZip64) { + long off64 = written; + //zip64 end of central directory record + writeInt(ZIP64_ENDSIG); // zip64 END record signature + writeLong(ZIP64_ENDHDR - 12); // size of zip64 end + writeShort(45); // version made by + writeShort(45); // version needed to extract + writeInt(0); // number of this disk + writeInt(0); // central directory start disk + writeLong(xentries.size()); // number of directory entires on disk + writeLong(xentries.size()); // number of directory entires + writeLong(len); // length of central directory + writeLong(off); // offset of central directory + + //zip64 end of central directory locator + writeInt(ZIP64_LOCSIG); // zip64 END locator signature + writeInt(0); // zip64 END start disk + writeLong(off64); // offset of zip64 END + writeInt(1); // total number of disks (?) + } + writeInt(ENDSIG); // END record signature + writeShort(0); // number of this disk + writeShort(0); // central directory start disk + writeShort(count); // number of directory entries on disk + writeShort(count); // total number of directory entries + writeInt(xlen); // length of central directory + writeInt(xoff); // offset of central directory + if (comment != null) { // zip file comment + writeShort(comment.length); + writeBytes(comment, 0, comment.length); } else { writeShort(0); } @@ -464,66 +594,26 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { } /* - * Writes an array of bytes to the output stream. + * Writes a 64-bit int to the output stream in little-endian byte order. */ - private void writeBytes(byte[] b, int off, int len) throws IOException { - 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; + private void writeLong(long v) throws IOException { + OutputStream out = this.out; + out.write((int)((v >>> 0) & 0xff)); + out.write((int)((v >>> 8) & 0xff)); + out.write((int)((v >>> 16) & 0xff)); + out.write((int)((v >>> 24) & 0xff)); + out.write((int)((v >>> 32) & 0xff)); + out.write((int)((v >>> 40) & 0xff)); + out.write((int)((v >>> 48) & 0xff)); + out.write((int)((v >>> 56) & 0xff)); + written += 8; } /* - * Returns an array of bytes representing the UTF8 encoding - * of the specified String. + * Writes an array of bytes to the output stream. */ - 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; + private void writeBytes(byte[] b, int off, int len) throws IOException { + super.out.write(b, off, len); + written += len; } } diff --git a/src/share/classes/java/util/zip/package.html b/src/share/classes/java/util/zip/package.html index d32e0fa0f4a5f44b554ea5dc1eaaf95ce2afd06f..83d117de55e11afc02e60127882be32284abf57a 100644 --- a/src/share/classes/java/util/zip/package.html +++ b/src/share/classes/java/util/zip/package.html @@ -45,6 +45,18 @@ input streams. Info-ZIP Application Note 970311 </a> - a detailed description of the Info-ZIP format upon which the <code>java.util.zip</code> classes are based. +<p> + <a name="zip64"> + <li>An implementation may optionally support the ZIP64(tm) format extensions + defined by the + <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT"> + PKWARE ZIP File Format Specification</a>. The ZIP64(tm) format extensions + are used to overcome the size limitations of the original ZIP format. +<p> + <a name="lang_encoding"> + <li>APPENDIX D of <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT"> + PKWARE ZIP File Format Specification</a> - Language Encoding Flag (EFS) to + encode ZIP entry filename and comment fields using UTF-8. <p> <li><a href="http://www.isi.edu/in-notes/rfc1950.txt"> ZLIB Compressed Data Format Specification version 3.3</a> @@ -70,7 +82,6 @@ input streams. <li>CRC-32 checksum is described in RFC 1952 (above) <p> <li>Adler-32 checksum is described in RFC 1950 (above) - </ul> diff --git a/src/share/classes/javax/management/monitor/CounterMonitor.java b/src/share/classes/javax/management/monitor/CounterMonitor.java index b27e57f62273e490716936b17aaffea2d39fda9d..cb1244e35b0718cdf2cd39e86c5624621569cca2 100644 --- a/src/share/classes/javax/management/monitor/CounterMonitor.java +++ b/src/share/classes/javax/management/monitor/CounterMonitor.java @@ -599,7 +599,7 @@ public class CounterMonitor extends Monitor implements CounterMonitorMBean { */ @Override public MBeanNotificationInfo[] getNotificationInfo() { - return notifsInfo; + return notifsInfo.clone(); } /* diff --git a/src/share/classes/javax/management/monitor/GaugeMonitor.java b/src/share/classes/javax/management/monitor/GaugeMonitor.java index ab71f10af4be5afe1c8a0fddaae9b75b11f1998b..2662c42a05b9b91c8c84c1b744b8b34d752d770e 100644 --- a/src/share/classes/javax/management/monitor/GaugeMonitor.java +++ b/src/share/classes/javax/management/monitor/GaugeMonitor.java @@ -481,7 +481,7 @@ public class GaugeMonitor extends Monitor implements GaugeMonitorMBean { */ @Override public MBeanNotificationInfo[] getNotificationInfo() { - return notifsInfo; + return notifsInfo.clone(); } /* diff --git a/src/share/classes/javax/management/monitor/Monitor.java b/src/share/classes/javax/management/monitor/Monitor.java index fb3e1a476f0cfd0ef8cdc68736f097aeca92f8d6..2e37d8fc39c86029ade5e06a6cb8692f73bec687 100644 --- a/src/share/classes/javax/management/monitor/Monitor.java +++ b/src/share/classes/javax/management/monitor/Monitor.java @@ -32,7 +32,10 @@ import java.io.IOException; 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 @@ public abstract class Monitor /** * 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 @@ public abstract class Monitor new DaemonThreadFactory("Scheduler")); /** - * Maximum Pool Size + * Map containing the thread pool executor per thread group. */ - private static final int maximumPoolSize; + private static final Map<ThreadPoolExecutor, Void> executors = + new WeakHashMap<ThreadPoolExecutor, Void>(); + + /** + * Lock for executors map. + */ + private static final Object executorsLock = new Object(); /** - * Executor Service. + * Maximum Pool Size */ - private static final ThreadPoolExecutor executor; + private static final int maximumPoolSize; static { final String maximumPoolSizeSysProp = "jmx.x.monitor.maximum.pool.size"; final String maximumPoolSizeStr = AccessController.doPrivileged( @@ -210,21 +222,8 @@ public abstract class Monitor maximumPoolSize = maximumPoolSizeTmp; } } - executor = new ThreadPoolExecutor( - maximumPoolSize, - maximumPoolSize, - 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue<Runnable>(), - 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. */ @@ -233,7 +232,7 @@ public abstract class Monitor /** * 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 @@ public abstract class Monitor // Start the scheduler. // cleanupFutures(); + schedulerTask.setMonitorTask(new MonitorTask()); schedulerFuture = scheduler.schedule(schedulerTask, getGranularityPeriod(), TimeUnit.MILLISECONDS); @@ -748,7 +748,7 @@ public abstract class Monitor // Reset the AccessControlContext. // - acc = null; + acc = noPermissionsACC; // Reset the complex type attribute information // such that it is recalculated again. @@ -1467,7 +1467,7 @@ public abstract class Monitor */ private class SchedulerTask implements Runnable { - private Runnable task = null; + private MonitorTask task; /* * ------------------------------------------ @@ -1475,7 +1475,16 @@ public abstract class Monitor * ------------------------------------------ */ - public SchedulerTask(Runnable task) { + public SchedulerTask() { + } + + /* + * ------------------------------------------ + * GETTERS/SETTERS + * ------------------------------------------ + */ + + public void setMonitorTask(MonitorTask task) { this.task = task; } @@ -1487,7 +1496,7 @@ public abstract class Monitor public void run() { synchronized (Monitor.this) { - Monitor.this.monitorFuture = executor.submit(task); + Monitor.this.monitorFuture = task.submit(); } } } @@ -1500,6 +1509,8 @@ public abstract class Monitor */ private class MonitorTask implements Runnable { + private ThreadPoolExecutor executor; + /* * ------------------------------------------ * CONSTRUCTORS @@ -1507,6 +1518,38 @@ public abstract class Monitor */ 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<Runnable>(), + new DaemonThreadFactory("ThreadGroup<" + + group.getName() + "> Executor", group)); + executor.allowCoreThreadTimeOut(true); + executors.put(executor, null); + } + } } /* @@ -1515,12 +1558,18 @@ public abstract class Monitor * ------------------------------------------ */ + 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<Void>() { + PrivilegedAction<Void> action = new PrivilegedAction<Void>() { public Void run() { if (Monitor.this.isActive()) { final int an[] = alreadyNotifieds; @@ -1533,7 +1582,11 @@ public abstract class Monitor } 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 @@ public abstract class Monitor 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 --git a/src/share/classes/javax/management/monitor/StringMonitor.java b/src/share/classes/javax/management/monitor/StringMonitor.java index 3c2bbc5641061ae54685882237bda3d0372e6cfa..9b4af52d41ed939c7c66480ab79f344ba09526f3 100644 --- a/src/share/classes/javax/management/monitor/StringMonitor.java +++ b/src/share/classes/javax/management/monitor/StringMonitor.java @@ -184,6 +184,7 @@ public class StringMonitor extends Monitor implements StringMonitorMBean { * @return The derived gauge of the specified object. * */ + @Override public synchronized String getDerivedGauge(ObjectName object) { return (String) super.getDerivedGauge(object); } @@ -199,6 +200,7 @@ public class StringMonitor extends Monitor implements StringMonitorMBean { * @return The derived gauge timestamp of the specified object. * */ + @Override public synchronized long getDerivedGaugeTimeStamp(ObjectName object) { return super.getDerivedGaugeTimeStamp(object); } @@ -341,8 +343,9 @@ public class StringMonitor extends Monitor implements StringMonitorMBean { * 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 --git a/src/share/classes/javax/print/attribute/standard/MediaSize.java b/src/share/classes/javax/print/attribute/standard/MediaSize.java index 55cd1aed923462fa50d8ea0d7589e719240e17b2..3b6262d2387e31b7268dd368edf7b0a377bc44e9 100644 --- a/src/share/classes/javax/print/attribute/standard/MediaSize.java +++ b/src/share/classes/javax/print/attribute/standard/MediaSize.java @@ -123,8 +123,10 @@ public class MediaSize extends Size2DSyntax implements Attribute { 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 @@ public class MediaSize extends Size2DSyntax implements Attribute { 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 --git a/src/share/classes/javax/swing/AbstractButton.java b/src/share/classes/javax/swing/AbstractButton.java index d48108101283e68fa821f870c9f353c8eb2459af..06a48991d73c2df638544c924f7db8818d1ef761 100644 --- a/src/share/classes/javax/swing/AbstractButton.java +++ b/src/share/classes/javax/swing/AbstractButton.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1545,6 +1545,9 @@ public abstract class AbstractButton extends JComponent implements ItemSelectabl * A mnemonic must correspond to a single key on the keyboard * and should be specified using one of the <code>VK_XXX</code> * keycodes defined in <code>java.awt.event.KeyEvent</code>. + * These codes and the wider array of codes for international + * keyboards may be obtained through + * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>. * Mnemonics are case-insensitive, therefore a key event * with the corresponding keycode would cause the button to be * activated whether or not the Shift modifier was pressed. diff --git a/src/share/classes/javax/swing/Action.java b/src/share/classes/javax/swing/Action.java index c996244fd5de1c1df5dab70a9c3f8e58c3198dd3..4a13a42da893dd3ec3e40a84785f7ced70c22a0b 100644 --- a/src/share/classes/javax/swing/Action.java +++ b/src/share/classes/javax/swing/Action.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -272,7 +272,9 @@ public interface Action extends ActionListener { * one of the <code>KeyEvent</code> key codes. The value is * commonly used to specify a mnemonic. For example: * <code>myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_A)</code> - * sets the mnemonic of <code>myAction</code> to 'a'. + * sets the mnemonic of <code>myAction</code> to 'a', while + * <code>myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.getExtendedKeyCodeForChar('\u0444'))</code> + * sets the mnemonic of <code>myAction</code> to Cyrillic letter "Ef". * * @since 1.3 */ diff --git a/src/share/classes/javax/swing/JComponent.java b/src/share/classes/javax/swing/JComponent.java index 831dc717a072bf37ea30fc5d7cb52bc0a57ea09d..ebed19256085a961d3e6c987a4c4f561887b3131 100644 --- a/src/share/classes/javax/swing/JComponent.java +++ b/src/share/classes/javax/swing/JComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -2888,7 +2888,10 @@ public abstract class JComponent extends Container implements Serializable, return false; } // Get the KeyStroke + // There may be two keystrokes associated with a low-level key event; + // in this case a keystroke made of an extended key code has a priority. KeyStroke ks; + KeyStroke ksE = null; if (e.getID() == KeyEvent.KEY_TYPED) { ks = KeyStroke.getKeyStroke(e.getKeyChar()); @@ -2896,9 +2899,18 @@ public abstract class JComponent extends Container implements Serializable, else { ks = KeyStroke.getKeyStroke(e.getKeyCode(),e.getModifiers(), (pressed ? false:true)); + if (e.getKeyCode() != e.getExtendedKeyCode()) { + ksE = KeyStroke.getKeyStroke(e.getExtendedKeyCode(),e.getModifiers(), + (pressed ? false:true)); + } } - /* Do we have a key binding for e? */ + // Do we have a key binding for e? + // If we have a binding by an extended code, use it. + // If not, check for regular code binding. + if(ksE != null && processKeyBinding(ksE, e, WHEN_FOCUSED, pressed)) { + return true; + } if(processKeyBinding(ks, e, WHEN_FOCUSED, pressed)) return true; @@ -2910,6 +2922,9 @@ public abstract class JComponent extends Container implements Serializable, while (parent != null && !(parent instanceof Window) && !(parent instanceof Applet)) { if(parent instanceof JComponent) { + if(ksE != null && ((JComponent)parent).processKeyBinding(ksE, e, + WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed)) + return true; if(((JComponent)parent).processKeyBinding(ks, e, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed)) return true; diff --git a/src/share/classes/javax/swing/JLabel.java b/src/share/classes/javax/swing/JLabel.java index 417892a83234ead1e849da8512333fe9f1e50436..a9641b9bef108c8129575f5b76ea943ea946292b 100644 --- a/src/share/classes/javax/swing/JLabel.java +++ b/src/share/classes/javax/swing/JLabel.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -503,10 +503,10 @@ public class JLabel extends JComponent implements SwingConstants, Accessible * @see #setDisplayedMnemonic(int) */ public void setDisplayedMnemonic(char aChar) { - int vk = (int) aChar; - if(vk >= 'a' && vk <='z') - vk -= ('a' - 'A'); - setDisplayedMnemonic(vk); + int vk = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(aChar); + if (vk != java.awt.event.KeyEvent.VK_UNDEFINED) { + setDisplayedMnemonic(vk); + } } diff --git a/src/share/classes/javax/swing/JTabbedPane.java b/src/share/classes/javax/swing/JTabbedPane.java index 2c74189fd33e1eaa141d56dade872ea2d9aed23d..e53cde113cded9a0cdc2365a018aef1543989d54 100644 --- a/src/share/classes/javax/swing/JTabbedPane.java +++ b/src/share/classes/javax/swing/JTabbedPane.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1628,7 +1628,9 @@ public class JTabbedPane extends JComponent * <p> * A mnemonic must correspond to a single key on the keyboard * and should be specified using one of the <code>VK_XXX</code> - * keycodes defined in <code>java.awt.event.KeyEvent</code>. + * keycodes defined in <code>java.awt.event.KeyEvent</code> + * or one of the extended keycodes obtained through + * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>. * Mnemonics are case-insensitive, therefore a key event * with the corresponding keycode would cause the button to be * activated whether or not the Shift modifier was pressed. diff --git a/src/share/classes/javax/swing/KeyStroke.java b/src/share/classes/javax/swing/KeyStroke.java index 8a1e860ce298d0d971d7c45909ad7c6dfc928b75..2eb3c41d5dbda3f09e539a47a77628259cd9a12a 100644 --- a/src/share/classes/javax/swing/KeyStroke.java +++ b/src/share/classes/javax/swing/KeyStroke.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -162,6 +162,9 @@ public class KeyStroke extends AWTKeyStroke { * <li>java.awt.event.KeyEvent.VK_TAB * <li>java.awt.event.KeyEvent.VK_SPACE * </ul> + * Alternatively, the key code may be obtained by calling + * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>. + * * The modifiers consist of any combination of:<ul> * <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK * <li>java.awt.event.InputEvent.CTRL_DOWN_MASK @@ -210,6 +213,9 @@ public class KeyStroke extends AWTKeyStroke { * <li>java.awt.event.KeyEvent.VK_TAB * <li>java.awt.event.KeyEvent.VK_SPACE * </ul> + * Alternatively, the key code may be obtained by calling + * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>. + * * The modifiers consist of any combination of:<ul> * <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK * <li>java.awt.event.InputEvent.CTRL_DOWN_MASK diff --git a/src/share/classes/javax/swing/KeyboardManager.java b/src/share/classes/javax/swing/KeyboardManager.java index 1e4f032aec6dfe6137dbd8b49fbb8a37703d2c38..e88139e9f6da3cf2d11cc86511072e7909b2d635 100644 --- a/src/share/classes/javax/swing/KeyboardManager.java +++ b/src/share/classes/javax/swing/KeyboardManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -212,19 +212,35 @@ class KeyboardManager { Thread.dumpStack(); } + // There may be two keystrokes associated with a low-level key event; + // in this case a keystroke made of an extended key code has a priority. KeyStroke ks; + KeyStroke ksE = null; if(e.getID() == KeyEvent.KEY_TYPED) { ks=KeyStroke.getKeyStroke(e.getKeyChar()); } else { + if(e.getKeyCode() != e.getExtendedKeyCode()) { + ksE=KeyStroke.getKeyStroke(e.getExtendedKeyCode(), e.getModifiers(), !pressed); + } ks=KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers(), !pressed); } Hashtable keyMap = containerMap.get(topAncestor); if (keyMap != null) { // this container isn't registered, so bail - Object tmp = keyMap.get(ks); + Object tmp = null; + // extended code has priority + if( ksE != null ) { + tmp = keyMap.get(ksE); + if( tmp != null ) { + ks = ksE; + } + } + if( tmp == null ) { + tmp = keyMap.get(ks); + } if (tmp == null) { // don't do anything @@ -269,7 +285,12 @@ class KeyboardManager { while (iter.hasMoreElements()) { JMenuBar mb = (JMenuBar)iter.nextElement(); if ( mb.isShowing() && mb.isEnabled() ) { // don't want to give these out - fireBinding(mb, ks, e, pressed); + if( !(ks.equals(ksE)) ) { + fireBinding(mb, ksE, e, pressed); + } + if(ks.equals(ksE) || !e.isConsumed()) { + fireBinding(mb, ks, e, pressed); + } if (e.isConsumed()) { return true; } diff --git a/src/share/classes/javax/swing/PopupFactory.java b/src/share/classes/javax/swing/PopupFactory.java index 753959cea1fa61bed0ad12aaf4eac0fd9ae504ec..1eb6d1b54057e9d8b7cfd67ed9b567d74a495525 100644 --- a/src/share/classes/javax/swing/PopupFactory.java +++ b/src/share/classes/javax/swing/PopupFactory.java @@ -552,14 +552,15 @@ public class PopupFactory { boolean result = false; Component component = getComponent(); if (owner != null && component != null) { - Container parent = (Container) SwingUtilities.getRoot(owner); int popupWidth = component.getWidth(); int popupHeight = component.getHeight(); - Rectangle parentBounds = parent.getBounds(); + + Container parent = (Container) SwingUtilities.getRoot(owner); if (parent instanceof JFrame || parent instanceof JDialog || parent instanceof JWindow) { + Rectangle parentBounds = parent.getBounds(); Insets i = parent.getInsets(); parentBounds.x += i.left; parentBounds.y += i.top; @@ -577,11 +578,11 @@ public class PopupFactory { .contains(x, y, popupWidth, popupHeight); } } else if (parent instanceof JApplet) { + Rectangle parentBounds = parent.getBounds(); Point p = parent.getLocationOnScreen(); parentBounds.x = p.x; parentBounds.y = p.y; - result = parentBounds - .contains(x, y, popupWidth, popupHeight); + result = parentBounds.contains(x, y, popupWidth, popupHeight); } } return result; diff --git a/src/share/classes/javax/swing/RepaintManager.java b/src/share/classes/javax/swing/RepaintManager.java index f51bf4ec27ac683488440203bd48f1e546741e7f..4e022d0a6650712ddcb0f3b136eed0e21271c4eb 100644 --- a/src/share/classes/javax/swing/RepaintManager.java +++ b/src/share/classes/javax/swing/RepaintManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -34,6 +34,7 @@ import java.security.AccessController; import java.util.*; import java.applet.*; +import sun.awt.AWTAccessor; import sun.awt.AppContext; import sun.awt.DisplayChangedListener; import sun.awt.SunToolkit; @@ -716,6 +717,44 @@ public class RepaintManager } } + private Map<Component,Rectangle> + updateWindows(Map<Component,Rectangle> dirtyComponents) + { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (!(toolkit instanceof SunToolkit && + ((SunToolkit)toolkit).needUpdateWindow())) + { + return dirtyComponents; + } + + Set<Window> windows = new HashSet<Window>(); + Set<Component> dirtyComps = dirtyComponents.keySet(); + for (Iterator<Component> it = dirtyComps.iterator(); it.hasNext();) { + Component dirty = it.next(); + Window window = dirty instanceof Window ? + (Window)dirty : + SwingUtilities.getWindowAncestor(dirty); + + if (window != null && + !AWTAccessor.getWindowAccessor().isOpaque(window)) + { + // if this component's toplevel is perpixel translucent, it will + // be repainted below + it.remove(); + // add to the set of windows to update (so that we don't update + // the window many times for each component to be repainted that + // belongs to this window) + windows.add(window); + } + } + + for (Window window : windows) { + AWTAccessor.getWindowAccessor().updateWindow(window, null); + } + + return dirtyComponents; + } + /** * Paint all of the components that have been marked dirty. * @@ -749,6 +788,10 @@ public class RepaintManager int localBoundsW; Enumeration keys; + // the components belonging to perpixel-translucent windows will be + // removed from the list + tmpDirtyComponents = updateWindows(tmpDirtyComponents); + roots = new ArrayList<Component>(count); for (Component dirty : tmpDirtyComponents.keySet()) { diff --git a/src/share/classes/javax/swing/SwingUtilities.java b/src/share/classes/javax/swing/SwingUtilities.java index 0493510a7bb44bf22d2e205b84aab6c45867def4..21a75ce1d9772c569b9cef7996c08370b42b361a 100644 --- a/src/share/classes/javax/swing/SwingUtilities.java +++ b/src/share/classes/javax/swing/SwingUtilities.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -1589,15 +1589,6 @@ public class SwingUtilities implements SwingConstants * processing the key bindings associated with JComponents. */ static boolean isValidKeyEventForKeyBindings(KeyEvent e) { - if (e.getID() == KeyEvent.KEY_TYPED) { - int mod = e.getModifiers(); - if (((mod & ActionEvent.ALT_MASK) != 0) && - ((mod & ActionEvent.CTRL_MASK) == 0)) { - // filter out typed "alt-?" keys, but not those created - // with AltGr, and not control characters - return false; - } - } return true; } diff --git a/src/share/classes/javax/swing/SwingWorker.java b/src/share/classes/javax/swing/SwingWorker.java index 9eca7d535f63413cdf4f26f66e9f4b9bd722a98c..263284acc4eb6b0b8da4a552f523388cdb806ce2 100644 --- a/src/share/classes/javax/swing/SwingWorker.java +++ b/src/share/classes/javax/swing/SwingWorker.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 @@ -778,35 +778,33 @@ public abstract class SwingWorker<T, V> implements RunnableFuture<T> { threadFactory); appContext.put(SwingWorker.class, executorService); - //register shutdown hook for this executor service + // Don't use ShutdownHook here as it's not enough. We should track + // AppContext disposal instead of JVM shutdown, see 6799345 for details final ExecutorService es = executorService; - final Runnable shutdownHook = - new Runnable() { - final WeakReference<ExecutorService> executorServiceRef = - new WeakReference<ExecutorService>(es); - public void run() { - final ExecutorService executorService = - executorServiceRef.get(); - if (executorService != null) { - AccessController.doPrivileged( - new PrivilegedAction<Void>() { - public Void run() { - executorService.shutdown(); - return null; + appContext.addPropertyChangeListener(AppContext.DISPOSED_PROPERTY_NAME, + new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent pce) { + boolean disposed = (Boolean)pce.getNewValue(); + if (disposed) { + final WeakReference<ExecutorService> executorServiceRef = + new WeakReference<ExecutorService>(es); + final ExecutorService executorService = + executorServiceRef.get(); + if (executorService != null) { + AccessController.doPrivileged( + new PrivilegedAction<Void>() { + public Void run() { + executorService.shutdown(); + return null; + } } - }); + ); + } } } - }; - - AccessController.doPrivileged( - new PrivilegedAction<Void>() { - public Void run() { - Runtime.getRuntime().addShutdownHook( - new Thread(shutdownHook)); - return null; - } - }); + } + ); } return executorService; } diff --git a/src/share/classes/javax/swing/TimerQueue.java b/src/share/classes/javax/swing/TimerQueue.java index 8cd7d16d87c526b5c453f59ba86ba9d2ed6954dc..642bc56bac74511017d4d327f761a2746ff660f9 100644 --- a/src/share/classes/javax/swing/TimerQueue.java +++ b/src/share/classes/javax/swing/TimerQueue.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -191,7 +191,12 @@ class TimerQueue implements Runnable } finally { timer.getLock().unlock(); } - } catch (InterruptedException ignore) { + } catch (InterruptedException ie) { + // Shouldn't ignore InterruptedExceptions here, so AppContext + // is disposed gracefully, see 6799345 for details + if (AppContext.getAppContext().isDisposed()) { + break; + } } } } diff --git a/src/share/classes/javax/swing/UIManager.java b/src/share/classes/javax/swing/UIManager.java index 43476f2d6933756877c9b5952e28282718a9c928..bd6f6ac9144f3bf4805dffd0efbbe73880cb8a49 100644 --- a/src/share/classes/javax/swing/UIManager.java +++ b/src/share/classes/javax/swing/UIManager.java @@ -58,6 +58,8 @@ import sun.awt.OSInfo; import sun.security.action.GetPropertyAction; import sun.swing.SwingUtilities2; import java.lang.reflect.Method; +import java.util.HashMap; +import sun.awt.AppContext; /** @@ -1323,19 +1325,29 @@ public class UIManager implements Serializable return; } - String metalLnf = getCrossPlatformLookAndFeelClassName(); - String lnfDefault = metalLnf; + // Try to get default LAF from system property, then from AppContext + // (6653395), then use cross-platform one by default. + String lafName = null; + HashMap lafData = + (HashMap) AppContext.getAppContext().remove("swing.lafdata"); + if (lafData != null) { + lafName = (String) lafData.remove("defaultlaf"); + } + if (lafName == null) { + lafName = getCrossPlatformLookAndFeelClassName(); + } + lafName = swingProps.getProperty(defaultLAFKey, lafName); - String lnfName = "<undefined>" ; try { - lnfName = swingProps.getProperty(defaultLAFKey, lnfDefault); - setLookAndFeel(lnfName); + setLookAndFeel(lafName); } catch (Exception e) { - try { - lnfName = swingProps.getProperty(defaultLAFKey, metalLnf); - setLookAndFeel(lnfName); - } catch (Exception e2) { - throw new Error("can't load " + lnfName); + throw new Error("Cannot load " + lafName); + } + + // Set any properties passed through AppContext (6653395). + if (lafData != null) { + for (Object key: lafData.keySet()) { + UIManager.put(key, lafData.get(key)); } } } diff --git a/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java b/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java index 8cff0a3e7cb4accf6153592881333ef874e23082..b823553b627172769771cb72b7b6b6ee0c777547 100644 --- a/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java +++ b/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java @@ -27,6 +27,7 @@ package javax.swing.plaf.basic; import java.io.File; import java.util.*; +import java.util.concurrent.Callable; import javax.swing.*; import javax.swing.filechooser.*; import javax.swing.event.*; @@ -223,113 +224,115 @@ public class BasicDirectoryModel extends AbstractListModel implements PropertyCh this.fid = fid; } - private void invokeLater(DoChangeContents runnable) { - runnables.addElement(runnable); - SwingUtilities.invokeLater(runnable); - } - public void run() { run0(); setBusy(false, fid); } public void run0() { - FileSystemView fileSystem = filechooser.getFileSystemView(); + DoChangeContents doChangeContents = ShellFolder.getInvoker().invoke(new Callable<DoChangeContents>() { + public DoChangeContents call() throws Exception { + FileSystemView fileSystem = filechooser.getFileSystemView(); - File[] list = fileSystem.getFiles(currentDirectory, filechooser.isFileHidingEnabled()); + File[] list = fileSystem.getFiles(currentDirectory, filechooser.isFileHidingEnabled()); - Vector<File> acceptsList = new Vector<File>(); + Vector<File> acceptsList = new Vector<File>(); - if (isInterrupted()) { - return; - } + if (isInterrupted()) { + return null; + } - // run through the file list, add directories and selectable files to fileCache - for (File file : list) { - if (filechooser.accept(file)) { - acceptsList.addElement(file); - } - } + // run through the file list, add directories and selectable files to fileCache + for (File file : list) { + if (filechooser.accept(file)) { + acceptsList.addElement(file); + } + } - if (isInterrupted()) { - return; - } + if (isInterrupted()) { + return null; + } - // First sort alphabetically by filename - sort(acceptsList); - - Vector<File> newDirectories = new Vector<File>(50); - Vector<File> newFiles = new Vector<File>(); - // run through list grabbing directories in chunks of ten - for(int i = 0; i < acceptsList.size(); i++) { - File f = acceptsList.elementAt(i); - boolean isTraversable = filechooser.isTraversable(f); - if (isTraversable) { - newDirectories.addElement(f); - } else if (!isTraversable && filechooser.isFileSelectionEnabled()) { - newFiles.addElement(f); - } - if(isInterrupted()) { - return; - } - } + // First sort alphabetically by filename + sort(acceptsList); + + Vector<File> newDirectories = new Vector<File>(50); + Vector<File> newFiles = new Vector<File>(); + // run through list grabbing directories in chunks of ten + for (int i = 0; i < acceptsList.size(); i++) { + File f = acceptsList.elementAt(i); + boolean isTraversable = filechooser.isTraversable(f); + if (isTraversable) { + newDirectories.addElement(f); + } else if (!isTraversable && filechooser.isFileSelectionEnabled()) { + newFiles.addElement(f); + } + if (isInterrupted()) { + return null; + } + } - Vector<File> newFileCache = new Vector<File>(newDirectories); - newFileCache.addAll(newFiles); - - int newSize = newFileCache.size(); - int oldSize = fileCache.size(); - - if (newSize > oldSize) { - //see if interval is added - int start = oldSize; - int end = newSize; - for (int i = 0; i < oldSize; i++) { - if (!newFileCache.get(i).equals(fileCache.get(i))) { - start = i; - for (int j = i; j < newSize; j++) { - if (newFileCache.get(j).equals(fileCache.get(i))) { - end = j; + Vector<File> newFileCache = new Vector<File>(newDirectories); + newFileCache.addAll(newFiles); + + int newSize = newFileCache.size(); + int oldSize = fileCache.size(); + + if (newSize > oldSize) { + //see if interval is added + int start = oldSize; + int end = newSize; + for (int i = 0; i < oldSize; i++) { + if (!newFileCache.get(i).equals(fileCache.get(i))) { + start = i; + for (int j = i; j < newSize; j++) { + if (newFileCache.get(j).equals(fileCache.get(i))) { + end = j; + break; + } + } break; } } - break; - } - } - if (start >= 0 && end > start - && newFileCache.subList(end, newSize).equals(fileCache.subList(start, oldSize))) { - if(isInterrupted()) { - return; - } - invokeLater(new DoChangeContents(newFileCache.subList(start, end), start, null, 0, fid)); - newFileCache = null; - } - } else if (newSize < oldSize) { - //see if interval is removed - int start = -1; - int end = -1; - for (int i = 0; i < newSize; i++) { - if (!newFileCache.get(i).equals(fileCache.get(i))) { - start = i; - end = i + oldSize - newSize; - break; + if (start >= 0 && end > start + && newFileCache.subList(end, newSize).equals(fileCache.subList(start, oldSize))) { + if (isInterrupted()) { + return null; + } + return new DoChangeContents(newFileCache.subList(start, end), start, null, 0, fid); + } + } else if (newSize < oldSize) { + //see if interval is removed + int start = -1; + int end = -1; + for (int i = 0; i < newSize; i++) { + if (!newFileCache.get(i).equals(fileCache.get(i))) { + start = i; + end = i + oldSize - newSize; + break; + } + } + if (start >= 0 && end > start + && fileCache.subList(end, oldSize).equals(newFileCache.subList(start, newSize))) { + if (isInterrupted()) { + return null; + } + return new DoChangeContents(null, 0, new Vector(fileCache.subList(start, end)), start, fid); + } } - } - if (start >= 0 && end > start - && fileCache.subList(end, oldSize).equals(newFileCache.subList(start, newSize))) { - if(isInterrupted()) { - return; + if (!fileCache.equals(newFileCache)) { + if (isInterrupted()) { + cancelRunnables(runnables); + } + return new DoChangeContents(newFileCache, 0, fileCache, 0, fid); } - invokeLater(new DoChangeContents(null, 0, new Vector<File>(fileCache.subList(start, end)), - start, fid)); - newFileCache = null; - } - } - if (newFileCache != null && !fileCache.equals(newFileCache)) { - if (isInterrupted()) { - cancelRunnables(runnables); + return null; } - invokeLater(new DoChangeContents(newFileCache, 0, fileCache, 0, fid)); + }); + + if (doChangeContents != null) { + runnables.addElement(doChangeContents); + SwingUtilities.invokeLater(doChangeContents); } } diff --git a/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index 864ad13264a7dcf231aaca6dac0e4641ff955dd7..0a858d41c18b33f37740fcbebcb14f07b15b0031 100644 --- a/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -1004,47 +1004,62 @@ public class BasicSliderUI extends SliderUI{ g.setColor(DefaultLookup.getColor(slider, this, "Slider.tickColor", Color.black)); if ( slider.getOrientation() == JSlider.HORIZONTAL ) { - g.translate( 0, tickBounds.y); + g.translate(0, tickBounds.y); - int value = slider.getMinimum(); - int xPos; + if (slider.getMinorTickSpacing() > 0) { + int value = slider.getMinimum(); - if ( slider.getMinorTickSpacing() > 0 ) { while ( value <= slider.getMaximum() ) { - xPos = xPositionForValue( value ); + int xPos = xPositionForValue(value); paintMinorTickForHorizSlider( g, tickBounds, xPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMinorTickSpacing() < value) { + break; + } + value += slider.getMinorTickSpacing(); } } - if ( slider.getMajorTickSpacing() > 0 ) { - value = slider.getMinimum(); + if (slider.getMajorTickSpacing() > 0) { + int value = slider.getMinimum(); while ( value <= slider.getMaximum() ) { - xPos = xPositionForValue( value ); + int xPos = xPositionForValue(value); paintMajorTickForHorizSlider( g, tickBounds, xPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMajorTickSpacing() < value) { + break; + } + value += slider.getMajorTickSpacing(); } } g.translate( 0, -tickBounds.y); - } - else { - g.translate(tickBounds.x, 0); - - int value = slider.getMinimum(); - int yPos; + } else { + g.translate(tickBounds.x, 0); - if ( slider.getMinorTickSpacing() > 0 ) { + if (slider.getMinorTickSpacing() > 0) { int offset = 0; if(!BasicGraphicsUtils.isLeftToRight(slider)) { offset = tickBounds.width - tickBounds.width / 2; g.translate(offset, 0); } - while ( value <= slider.getMaximum() ) { - yPos = yPositionForValue( value ); + int value = slider.getMinimum(); + + while (value <= slider.getMaximum()) { + int yPos = yPositionForValue(value); paintMinorTickForVertSlider( g, tickBounds, yPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMinorTickSpacing() < value) { + break; + } + value += slider.getMinorTickSpacing(); } @@ -1053,15 +1068,22 @@ public class BasicSliderUI extends SliderUI{ } } - if ( slider.getMajorTickSpacing() > 0 ) { - value = slider.getMinimum(); + if (slider.getMajorTickSpacing() > 0) { if(!BasicGraphicsUtils.isLeftToRight(slider)) { g.translate(2, 0); } - while ( value <= slider.getMaximum() ) { - yPos = yPositionForValue( value ); + int value = slider.getMinimum(); + + while (value <= slider.getMaximum()) { + int yPos = yPositionForValue(value); paintMajorTickForVertSlider( g, tickBounds, yPos ); + + // Overflow checking + if (Integer.MAX_VALUE - slider.getMajorTickSpacing() < value) { + break; + } + value += slider.getMajorTickSpacing(); } @@ -1775,8 +1797,6 @@ public class BasicSliderUI extends SliderUI{ thumbMiddle = thumbLeft + halfThumbWidth; slider.setValue(valueForXPosition(thumbMiddle)); break; - default: - return; } } diff --git a/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java b/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java index 4636e07c4fdb543e3f28e4e72b16959953e9d7db..58063f585b241c59efd6a56457ff0dad514ef10c 100644 --- a/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java +++ b/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java @@ -38,6 +38,8 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.*; +import java.security.AccessController; +import java.security.PrivilegedAction; import javax.accessibility.*; import sun.awt.shell.ShellFolder; @@ -937,7 +939,11 @@ public class MetalFileChooserUI extends BasicFileChooserUI { File[] baseFolders; if (useShellFolder) { - baseFolders = (File[])ShellFolder.get("fileChooserComboBoxFolders"); + baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { + public File[] run() { + return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); + } + }); } else { baseFolders = fsv.getRoots(); } diff --git a/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java b/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java index 975056a1c69896a001d20dcb1353bcca0d3e3651..ac91419f11504cb06e977726034529146fc44bfd 100644 --- a/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java +++ b/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java @@ -233,7 +233,7 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh tabContext.getStyle().getGraphicsUtils(tabContext).layoutText( tabContext, metrics, title, icon, SwingUtilities.CENTER, SwingUtilities.CENTER, SwingUtilities.LEADING, - SwingUtilities.TRAILING, calcRect, + SwingUtilities.CENTER, calcRect, iconRect, textRect, textIconGap); return textRect.y + metrics.getAscent() + getBaselineOffset(); } @@ -426,7 +426,7 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh ss.getStyle().getGraphicsUtils(ss).layoutText(ss, metrics, title, icon, SwingUtilities.CENTER, SwingUtilities.CENTER, - SwingUtilities.LEADING, SwingUtilities.TRAILING, + SwingUtilities.LEADING, SwingUtilities.CENTER, tabRect, iconRect, textRect, textIconGap); tabPane.putClientProperty("html", null); diff --git a/src/share/classes/javax/swing/text/GlyphView.java b/src/share/classes/javax/swing/text/GlyphView.java index 3cb4efe59f97a8fc6fedfa3bc96228c897cd1417..364fd69e8eedd2d2a65408fb60a3d5c5faf07f6c 100644 --- a/src/share/classes/javax/swing/text/GlyphView.java +++ b/src/share/classes/javax/swing/text/GlyphView.java @@ -30,6 +30,7 @@ import javax.swing.event.*; import java.util.BitSet; import java.util.Locale; +import javax.swing.UIManager; import sun.swing.SwingUtilities2; /** @@ -382,11 +383,10 @@ public class GlyphView extends View implements TabableView, Cloneable { Color bg = getBackground(); Color fg = getForeground(); - if (c instanceof JTextComponent) { - JTextComponent tc = (JTextComponent) c; - if (!tc.isEnabled()) { - fg = tc.getDisabledTextColor(); - } + if (c != null && ! c.isEnabled()) { + fg = (c instanceof JTextComponent ? + ((JTextComponent)c).getDisabledTextColor() : + UIManager.getColor("textInactiveText")); } if (bg != null) { g.setColor(bg); diff --git a/src/share/classes/javax/swing/text/html/ImageView.java b/src/share/classes/javax/swing/text/html/ImageView.java index 4b645b6a72598cf4ed61a632ba1d3080c16c37ef..0831e2567cd3a4fad406db336d178f6745561c10 100644 --- a/src/share/classes/javax/swing/text/html/ImageView.java +++ b/src/share/classes/javax/swing/text/html/ImageView.java @@ -25,9 +25,7 @@ package javax.swing.text.html; import java.awt.*; -import java.awt.event.*; import java.awt.image.ImageObserver; -import java.io.*; import java.net.*; import java.util.Dictionary; import javax.swing.*; @@ -97,6 +95,7 @@ public class ImageView extends View { private AttributeSet attr; private Image image; + private Image disabledImage; private int width; private int height; /** Bitmask containing some of the above bitmask values. Because the @@ -193,6 +192,17 @@ public class ImageView extends View { return image; } + private Image getImage(boolean enabled) { + Image img = getImage(); + if (! enabled) { + if (disabledImage == null) { + disabledImage = GrayFilter.createDisabledImage(img); + } + img = disabledImage; + } + return img; + } + /** * Sets how the image is loaded. If <code>newValue</code> is true, * the image we be loaded when first asked for, otherwise it will @@ -338,8 +348,6 @@ public class ImageView extends View { Rectangle rect = (a instanceof Rectangle) ? (Rectangle)a : a.getBounds(); - - Image image = getImage(); Rectangle clip = g.getClipBounds(); fBounds.setBounds(rect); @@ -350,29 +358,29 @@ public class ImageView extends View { rect.width - leftInset - rightInset, rect.height - topInset - bottomInset); } - if (image != null) { - if (!hasPixels(image)) { - // No pixels yet, use the default - Icon icon = (image == null) ? getNoImageIcon() : - getLoadingImageIcon(); + Container host = getContainer(); + Image img = getImage(host == null || host.isEnabled()); + if (img != null) { + if (! hasPixels(img)) { + // No pixels yet, use the default + Icon icon = getLoadingImageIcon(); if (icon != null) { - icon.paintIcon(getContainer(), g, rect.x + leftInset, - rect.y + topInset); + icon.paintIcon(host, g, + rect.x + leftInset, rect.y + topInset); } } else { // Draw the image - g.drawImage(image, rect.x + leftInset, rect.y + topInset, + g.drawImage(img, rect.x + leftInset, rect.y + topInset, width, height, imageObserver); } } else { Icon icon = getNoImageIcon(); - if (icon != null) { - icon.paintIcon(getContainer(), g, rect.x + leftInset, - rect.y + topInset); + icon.paintIcon(host, g, + rect.x + leftInset, rect.y + topInset); } View view = getAltView(); // Paint the view representing the alt text, if its non-null @@ -855,7 +863,9 @@ public class ImageView extends View { // it will pick up the new height/width, if necessary. public boolean imageUpdate(Image img, int flags, int x, int y, int newWidth, int newHeight ) { - if (image == null || image != img || getParent() == null) { + if (img != image && img != disabledImage || + image == null || getParent() == null) { + return false; } @@ -873,6 +883,8 @@ public class ImageView extends View { if ((state & HEIGHT_FLAG) != HEIGHT_FLAG) { height = DEFAULT_HEIGHT; } + } else { + disabledImage = null; } if ((state & LOADING_FLAG) == LOADING_FLAG) { // No need to resize or repaint, still in the process @@ -885,38 +897,37 @@ public class ImageView extends View { return false; } - // Resize image if necessary: - short changed = 0; - if ((flags & ImageObserver.HEIGHT) != 0 && !getElement(). - getAttributes().isDefined(HTML.Attribute.HEIGHT)) { - changed |= 1; - } - if ((flags & ImageObserver.WIDTH) != 0 && !getElement(). - getAttributes().isDefined(HTML.Attribute.WIDTH)) { - changed |= 2; - } - - synchronized(ImageView.this) { - if (image != img) { - return false; + if (image == img) { + // Resize image if necessary: + short changed = 0; + if ((flags & ImageObserver.HEIGHT) != 0 && !getElement(). + getAttributes().isDefined(HTML.Attribute.HEIGHT)) { + changed |= 1; } - if ((changed & 1) == 1 && (state & WIDTH_FLAG) == 0) { - width = newWidth; + if ((flags & ImageObserver.WIDTH) != 0 && !getElement(). + getAttributes().isDefined(HTML.Attribute.WIDTH)) { + changed |= 2; } - if ((changed & 2) == 2 && (state & HEIGHT_FLAG) == 0) { - height = newHeight; + + synchronized(ImageView.this) { + if ((changed & 1) == 1 && (state & WIDTH_FLAG) == 0) { + width = newWidth; + } + if ((changed & 2) == 2 && (state & HEIGHT_FLAG) == 0) { + height = newHeight; + } + if ((state & LOADING_FLAG) == LOADING_FLAG) { + // No need to resize or repaint, still in the process of + // loading. + return true; + } } - if ((state & LOADING_FLAG) == LOADING_FLAG) { - // No need to resize or repaint, still in the process of - // loading. + if (changed != 0) { + // May need to resize myself, asynchronously: + safePreferenceChanged(); return true; } } - if (changed != 0) { - // May need to resize myself, asynchronously: - safePreferenceChanged(); - return true; - } // Repaint when done or when new pixels arrive: if ((flags & (FRAMEBITS|ALLBITS)) != 0) { diff --git a/src/share/classes/javax/swing/text/html/StyleSheet.java b/src/share/classes/javax/swing/text/html/StyleSheet.java index 0cf1804787229e2e3dcd0e24374f738e617e6477..c2a07739a049f99a3a293848dc6a8ffdaf738eea 100644 --- a/src/share/classes/javax/swing/text/html/StyleSheet.java +++ b/src/share/classes/javax/swing/text/html/StyleSheet.java @@ -31,6 +31,7 @@ import java.io.*; import java.net.*; import javax.swing.Icon; import javax.swing.ImageIcon; +import javax.swing.UIManager; import javax.swing.border.*; import javax.swing.event.ChangeListener; import javax.swing.text.*; @@ -2161,6 +2162,7 @@ public class StyleSheet extends StyleContext { */ public void paint(Graphics g, float x, float y, float w, float h, View v, int item) { View cv = v.getView(item); + Container host = v.getContainer(); Object name = cv.getElement().getAttributes().getAttribute (StyleConstants.NameAttribute); // Only draw something if the View is a list item. This won't @@ -2171,7 +2173,7 @@ public class StyleSheet extends StyleContext { } // deside on what side draw bullets, etc. isLeftToRight = - cv.getContainer().getComponentOrientation().isLeftToRight(); + host.getComponentOrientation().isLeftToRight(); // How the list indicator is aligned is not specified, it is // left up to the UA. IE and NS differ on this behavior. @@ -2200,15 +2202,15 @@ public class StyleSheet extends StyleContext { } // set the color of a decoration - if (ss != null) { - g.setColor(ss.getForeground(cv.getAttributes())); - } else { - g.setColor(Color.black); - } + Color c = (host.isEnabled() + ? (ss != null + ? ss.getForeground(cv.getAttributes()) + : host.getForeground()) + : UIManager.getColor("textInactiveText")); + g.setColor(c); if (img != null) { - drawIcon(g, (int) x, (int) y, (int) w, (int) h, align, - v.getContainer()); + drawIcon(g, (int) x, (int) y, (int) w, (int) h, align, host); return; } CSS.Value childtype = getChildType(cv); diff --git a/src/share/classes/sun/awt/AWTAccessor.java b/src/share/classes/sun/awt/AWTAccessor.java index 41b933c4a61eed7bce7fb5ed314fd32579e655a1..a82ba3146666ac0ded576ec70bb1dc168e28dd25 100644 --- a/src/share/classes/sun/awt/AWTAccessor.java +++ b/src/share/classes/sun/awt/AWTAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-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 @@ -26,46 +26,229 @@ package sun.awt; import java.awt.*; +import java.awt.geom.Point2D; +import java.awt.image.BufferedImage; + import sun.misc.Unsafe; -/** The AWTAccessor utility class. +/** + * The AWTAccessor utility class. * The main purpose of this class is to enable accessing * private and package-private fields of classes from * different classes/packages. See sun.misc.SharedSecretes * for another example. */ public final class AWTAccessor { + private static final Unsafe unsafe = Unsafe.getUnsafe(); - /** We don't need any objects of this class. + /* + * We don't need any objects of this class. * It's rather a collection of static methods * and interfaces. */ private AWTAccessor() { } - /** An accessor for the java.awt.Component class. + /* + * An interface of accessor for the java.awt.Component class. */ public interface ComponentAccessor { - // See 6797587 - // Also see: 6776743, 6768307, and 6768332. - /** + /* + * Sets whether the native background erase for a component + * has been disabled via SunToolkit.disableBackgroundErase(). + */ + void setBackgroundEraseDisabled(Component comp, boolean disabled); + /* + * Indicates whether the native background erase for a + * component has been disabled via + * SunToolkit.disableBackgroundErase(). + */ + boolean getBackgroundEraseDisabled(Component comp); + /* + * + * Gets the bounds of this component in the form of a + * <code>Rectangle</code> object. The bounds specify this + * component's width, height, and location relative to + * its parent. + */ + Rectangle getBounds(Component comp); + /* * Sets the shape of a lw component to cut out from hw components. + * + * See 6797587, 6776743, 6768307, and 6768332 for details */ void setMixingCutoutShape(Component comp, Shape shape); + + /** + * Sets GraphicsConfiguration value for the component. + */ + void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc); + /* + * Requests focus to the component. + */ + boolean requestFocus(Component comp, CausedFocusEvent.Cause cause); + /* + * Determines if the component can gain focus. + */ + boolean canBeFocusOwner(Component comp); + + /** + * Returns whether the component is visible without invoking + * any client code. + */ + boolean isVisible_NoClientCode(Component comp); + } + + /* + * An interface of accessor for java.awt.Window class. + */ + public interface WindowAccessor { + /* + * Get opacity level of the given window. + */ + float getOpacity(Window window); + /* + * Set opacity level to the given window. + */ + void setOpacity(Window window, float opacity); + /* + * Get a shape assigned to the given window. + */ + Shape getShape(Window window); + /* + * Set a shape to the given window. + */ + void setShape(Window window, Shape shape); + /* + * Identify whether the given window is opaque (true) + * or translucent (false). + */ + boolean isOpaque(Window window); + /* + * Set the opaque preoperty to the given window. + */ + void setOpaque(Window window, boolean isOpaque); + /* + * Update the image of a non-opaque (translucent) window. + */ + void updateWindow(Window window, BufferedImage backBuffer); + + /** Get the size of the security warning. + */ + Dimension getSecurityWarningSize(Window w); + + /** + * Set the size of the security warning. + */ + void setSecurityWarningSize(Window w, int width, int height); + + /** Set the position of the security warning. + */ + void setSecurityWarningPosition(Window w, Point2D point, + float alignmentX, float alignmentY); + + /** Request to recalculate the new position of the security warning for + * the given window size/location as reported by the native system. + */ + Point2D calculateSecurityWarningPosition(Window window, + double x, double y, double w, double h); + } + + /* + * An accessor for the AWTEvent class. + */ + public interface AWTEventAccessor { + /* + * + * Sets the flag on this AWTEvent indicating that it was + * generated by the system. + */ + void setSystemGenerated(AWTEvent ev); + /* + * + * Indicates whether this AWTEvent was generated by the system. + */ + boolean isSystemGenerated(AWTEvent ev); + } + + /* + * An accessor for the java.awt.Frame class. + */ + public interface FrameAccessor { + /* + * Sets the state of this frame. + */ + void setExtendedState(Frame frame, int state); + /* + * Gets the state of this frame. + */ + int getExtendedState(Frame frame); } - /* The java.awt.Component class accessor object. + /* + * An interface of accessor for the java.awt.KeyboardFocusManager class. + */ + public interface KeyboardFocusManagerAccessor { + /* + * Indicates whether the native implementation should + * proceed with a pending focus request for the heavyweight. + */ + int shouldNativelyFocusHeavyweight(Component heavyweight, + Component descendant, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time, + CausedFocusEvent.Cause cause); + /* + * Delivers focus for the lightweight descendant of the heavyweight + * synchronously. + */ + boolean processSynchronousLightweightTransfer(Component heavyweight, + Component descendant, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time); + /* + * Removes the last focus request for the heavyweight from the queue. + */ + void removeLastFocusRequest(Component heavyweight); + } + + /* + * The java.awt.Component class accessor object. */ private static ComponentAccessor componentAccessor; - /** Set an accessor object for the java.awt.Component class. + /* + * The java.awt.Window class accessor object. + */ + private static WindowAccessor windowAccessor; + + /* + * The java.awt.AWTEvent class accessor object. + */ + private static AWTEventAccessor awtEventAccessor; + + /* + * The java.awt.Frame class accessor object. + */ + private static FrameAccessor frameAccessor; + + /* + * The java.awt.KeyboardFocusManager class accessor object. + */ + private static KeyboardFocusManagerAccessor kfmAccessor; + + /* + * Set an accessor object for the java.awt.Component class. */ public static void setComponentAccessor(ComponentAccessor ca) { componentAccessor = ca; } - /** Retrieve the accessor object for the java.awt.Window class. + /* + * Retrieve the accessor object for the java.awt.Window class. */ public static ComponentAccessor getComponentAccessor() { if (componentAccessor == null) { @@ -74,4 +257,69 @@ public final class AWTAccessor { return componentAccessor; } + + /* + * Set an accessor object for the java.awt.Window class. + */ + public static void setWindowAccessor(WindowAccessor wa) { + windowAccessor = wa; + } + + /* + * Retrieve the accessor object for the java.awt.Window class. + */ + public static WindowAccessor getWindowAccessor() { + if (windowAccessor == null) { + unsafe.ensureClassInitialized(Window.class); + } + return windowAccessor; + } + + /* + * Set an accessor object for the java.awt.AWTEvent class. + */ + public static void setAWTEventAccessor(AWTEventAccessor aea) { + awtEventAccessor = aea; + } + + /* + * Retrieve the accessor object for the java.awt.AWTEvent class. + */ + public static AWTEventAccessor getAWTEventAccessor() { + return awtEventAccessor; + } + + /* + * Set an accessor object for the java.awt.Frame class. + */ + public static void setFrameAccessor(FrameAccessor fa) { + frameAccessor = fa; + } + + /* + * Retrieve the accessor object for the java.awt.Frame class. + */ + public static FrameAccessor getFrameAccessor() { + if (frameAccessor == null) { + unsafe.ensureClassInitialized(Frame.class); + } + return frameAccessor; + } + + /* + * Set an accessor object for the java.awt.KeyboardFocusManager class. + */ + public static void setKeyboardFocusManagerAccessor(KeyboardFocusManagerAccessor kfma) { + kfmAccessor = kfma; + } + + /* + * Retrieve the accessor object for the java.awt.KeyboardFocusManager class. + */ + public static KeyboardFocusManagerAccessor getKeyboardFocusManagerAccessor() { + if (kfmAccessor == null) { + unsafe.ensureClassInitialized(KeyboardFocusManager.class); + } + return kfmAccessor; + } } diff --git a/src/share/classes/sun/awt/ComponentAccessor.java b/src/share/classes/sun/awt/ComponentAccessor.java index af3abcf8a9581402a36e41f2a6d5d9090d9ac269..49a383815db21d806c1bd18baed13fe8a69cb97f 100644 --- a/src/share/classes/sun/awt/ComponentAccessor.java +++ b/src/share/classes/sun/awt/ComponentAccessor.java @@ -73,7 +73,6 @@ public class ComponentAccessor private static Field fieldPacked; private static Field fieldIgnoreRepaint; private static Field fieldPeer; - private static Method methodResetGC; private static Field fieldVisible; private static Method methodIsEnabledImpl; private static Method methodGetCursorNoClientCode; @@ -124,9 +123,6 @@ public class ComponentAccessor fieldPeer = componentClass.getDeclaredField("peer"); fieldPeer.setAccessible(true); - methodResetGC = componentClass.getDeclaredMethod("resetGC", (Class[]) null); - methodResetGC.setAccessible(true); - fieldVisible = componentClass.getDeclaredField("visible"); fieldVisible.setAccessible(true); @@ -425,18 +421,6 @@ public class ComponentAccessor return false; } - public static void resetGC(Component c) { - try { - methodResetGC.invoke(c, (Object[]) null); - } - catch (IllegalAccessException e) { - log.log(Level.FINE, "Unable to access the Component object", e); - } - catch (InvocationTargetException e) { - log.log(Level.FINE, "Unable to invoke on the Component object", e); - } - } - public static boolean getVisible(Component c) { try { return fieldVisible.getBoolean(c); diff --git a/src/share/classes/sun/awt/EmbeddedFrame.java b/src/share/classes/sun/awt/EmbeddedFrame.java index d7450bebe1df9354d89b72cdb38b32a10330a491..7b77862d5f72bc7dfa579bffee3781af38734f59 100644 --- a/src/share/classes/sun/awt/EmbeddedFrame.java +++ b/src/share/classes/sun/awt/EmbeddedFrame.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -585,5 +585,14 @@ public abstract class EmbeddedFrame extends Frame } public void updateMinimumSize() { } - } + + public void setOpacity(float opacity) { + } + public void setOpaque(boolean isOpaque) { + } + public void updateWindow(BufferedImage backBuffer) { + } + public void repositionSecurityWarning() { + } + } } // class EmbeddedFrame diff --git a/src/share/classes/sun/awt/ExtendedKeyCodes.java b/src/share/classes/sun/awt/ExtendedKeyCodes.java new file mode 100644 index 0000000000000000000000000000000000000000..37dfafb72ed738c33e75860cc00b811e23972f9e --- /dev/null +++ b/src/share/classes/sun/awt/ExtendedKeyCodes.java @@ -0,0 +1,670 @@ +package sun.awt; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.awt.event.KeyEvent; + +public class ExtendedKeyCodes { + /** + * ATTN: These are the readonly hashes with load factor == 1; + * adding a value, please set the inital capacity to exact number of items + * or higher. + */ + // Keycodes declared in KeyEvent.java with corresponding Unicode values. + private final static HashMap<Integer, Integer> regularKeyCodesMap = + new HashMap<Integer,Integer>(122, 1.0f); + + // Keycodes derived from Unicode values. Here should be collected codes + // for characters appearing on the primary layer of at least one + // known keyboard layout. For instance, sterling sign is on the primary layer + // of the Mac Italian layout. + private final static HashSet<Integer> extendedKeyCodesSet = + new HashSet<Integer>(501, 1.0f); + final public static int getExtendedKeyCodeForChar( int c ) { + int rc = KeyEvent.VK_UNDEFINED; + int uc = Character.toUpperCase( c ); + int lc = Character.toLowerCase( c ); + if (regularKeyCodesMap.containsKey( c )) { + if(regularKeyCodesMap.containsKey(uc)) { + return regularKeyCodesMap.get( uc ); + } + return regularKeyCodesMap.get( c ); + } + uc += 0x01000000; + lc += 0x01000000; + if (extendedKeyCodesSet.contains( uc )) { + return uc; + }else if (extendedKeyCodesSet.contains( lc )) { + return lc; + } + return rc; + } + static { + regularKeyCodesMap.put(0x0a, KeyEvent.VK_ENTER); + regularKeyCodesMap.put(0x08, KeyEvent.VK_BACK_SPACE); + regularKeyCodesMap.put(0x09, KeyEvent.VK_TAB); + regularKeyCodesMap.put(0x1B, KeyEvent.VK_ESCAPE); + regularKeyCodesMap.put(0x20, KeyEvent.VK_SPACE); + regularKeyCodesMap.put(0x21, KeyEvent.VK_PAGE_UP); + regularKeyCodesMap.put(0x22, KeyEvent.VK_PAGE_DOWN); + regularKeyCodesMap.put(0x23, KeyEvent.VK_END); + regularKeyCodesMap.put(0x24, KeyEvent.VK_HOME); + regularKeyCodesMap.put(0x25, KeyEvent.VK_LEFT); + regularKeyCodesMap.put(0x26, KeyEvent.VK_UP); + regularKeyCodesMap.put(0x27, KeyEvent.VK_RIGHT); + regularKeyCodesMap.put(0x28, KeyEvent.VK_DOWN); + regularKeyCodesMap.put(0x2C, KeyEvent.VK_COMMA); + regularKeyCodesMap.put(0x2D, KeyEvent.VK_MINUS); + regularKeyCodesMap.put(0x2E, KeyEvent.VK_PERIOD); + regularKeyCodesMap.put(0x2F, KeyEvent.VK_SLASH); + regularKeyCodesMap.put(0x30, KeyEvent.VK_0); + regularKeyCodesMap.put(0x31, KeyEvent.VK_1); + regularKeyCodesMap.put(0x32, KeyEvent.VK_2); + regularKeyCodesMap.put(0x33, KeyEvent.VK_3); + regularKeyCodesMap.put(0x34, KeyEvent.VK_4); + regularKeyCodesMap.put(0x35, KeyEvent.VK_5); + regularKeyCodesMap.put(0x36, KeyEvent.VK_6); + regularKeyCodesMap.put(0x37, KeyEvent.VK_7); + regularKeyCodesMap.put(0x38, KeyEvent.VK_8); + regularKeyCodesMap.put(0x39, KeyEvent.VK_9); + regularKeyCodesMap.put(0x3B, KeyEvent.VK_SEMICOLON); + regularKeyCodesMap.put(0x3D, KeyEvent.VK_EQUALS); + regularKeyCodesMap.put(0x41, KeyEvent.VK_A); + regularKeyCodesMap.put(0x61, KeyEvent.VK_A); + regularKeyCodesMap.put(0x42, KeyEvent.VK_B); + regularKeyCodesMap.put(0x62, KeyEvent.VK_B); + regularKeyCodesMap.put(0x43, KeyEvent.VK_C); + regularKeyCodesMap.put(0x63, KeyEvent.VK_C); + regularKeyCodesMap.put(0x44, KeyEvent.VK_D); + regularKeyCodesMap.put(0x64, KeyEvent.VK_D); + regularKeyCodesMap.put(0x45, KeyEvent.VK_E); + regularKeyCodesMap.put(0x65, KeyEvent.VK_E); + regularKeyCodesMap.put(0x46, KeyEvent.VK_F); + regularKeyCodesMap.put(0x66, KeyEvent.VK_F); + regularKeyCodesMap.put(0x47, KeyEvent.VK_G); + regularKeyCodesMap.put(0x67, KeyEvent.VK_G); + regularKeyCodesMap.put(0x48, KeyEvent.VK_H); + regularKeyCodesMap.put(0x68, KeyEvent.VK_H); + regularKeyCodesMap.put(0x49, KeyEvent.VK_I); + regularKeyCodesMap.put(0x69, KeyEvent.VK_I); + regularKeyCodesMap.put(0x4A, KeyEvent.VK_J); + regularKeyCodesMap.put(0x6A, KeyEvent.VK_J); + regularKeyCodesMap.put(0x4B, KeyEvent.VK_K); + regularKeyCodesMap.put(0x6B, KeyEvent.VK_K); + regularKeyCodesMap.put(0x4C, KeyEvent.VK_L); + regularKeyCodesMap.put(0x6C, KeyEvent.VK_L); + regularKeyCodesMap.put(0x4D, KeyEvent.VK_M); + regularKeyCodesMap.put(0x6D, KeyEvent.VK_M); + regularKeyCodesMap.put(0x4E, KeyEvent.VK_N); + regularKeyCodesMap.put(0x6E, KeyEvent.VK_N); + regularKeyCodesMap.put(0x4F, KeyEvent.VK_O); + regularKeyCodesMap.put(0x6F, KeyEvent.VK_O); + regularKeyCodesMap.put(0x50, KeyEvent.VK_P); + regularKeyCodesMap.put(0x70, KeyEvent.VK_P); + regularKeyCodesMap.put(0x51, KeyEvent.VK_Q); + regularKeyCodesMap.put(0x71, KeyEvent.VK_Q); + regularKeyCodesMap.put(0x52, KeyEvent.VK_R); + regularKeyCodesMap.put(0x72, KeyEvent.VK_R); + regularKeyCodesMap.put(0x53, KeyEvent.VK_S); + regularKeyCodesMap.put(0x73, KeyEvent.VK_S); + regularKeyCodesMap.put(0x54, KeyEvent.VK_T); + regularKeyCodesMap.put(0x74, KeyEvent.VK_T); + regularKeyCodesMap.put(0x55, KeyEvent.VK_U); + regularKeyCodesMap.put(0x75, KeyEvent.VK_U); + regularKeyCodesMap.put(0x56, KeyEvent.VK_V); + regularKeyCodesMap.put(0x76, KeyEvent.VK_V); + regularKeyCodesMap.put(0x57, KeyEvent.VK_W); + regularKeyCodesMap.put(0x77, KeyEvent.VK_W); + regularKeyCodesMap.put(0x58, KeyEvent.VK_X); + regularKeyCodesMap.put(0x78, KeyEvent.VK_X); + regularKeyCodesMap.put(0x59, KeyEvent.VK_Y); + regularKeyCodesMap.put(0x79, KeyEvent.VK_Y); + regularKeyCodesMap.put(0x5A, KeyEvent.VK_Z); + regularKeyCodesMap.put(0x7A, KeyEvent.VK_Z); + regularKeyCodesMap.put(0x5B, KeyEvent.VK_OPEN_BRACKET); + regularKeyCodesMap.put(0x5C, KeyEvent.VK_BACK_SLASH); + regularKeyCodesMap.put(0x5D, KeyEvent.VK_CLOSE_BRACKET); +// regularKeyCodesMap.put(0x60, KeyEvent.VK_NUMPAD0); +// regularKeyCodesMap.put(0x61, KeyEvent.VK_NUMPAD1); +// regularKeyCodesMap.put(0x62, KeyEvent.VK_NUMPAD2); +// regularKeyCodesMap.put(0x63, KeyEvent.VK_NUMPAD3); +// regularKeyCodesMap.put(0x64, KeyEvent.VK_NUMPAD4); +// regularKeyCodesMap.put(0x65, KeyEvent.VK_NUMPAD5); +// regularKeyCodesMap.put(0x66, KeyEvent.VK_NUMPAD6); +// regularKeyCodesMap.put(0x67, KeyEvent.VK_NUMPAD7); +// regularKeyCodesMap.put(0x68, KeyEvent.VK_NUMPAD8); +// regularKeyCodesMap.put(0x69, KeyEvent.VK_NUMPAD9); + regularKeyCodesMap.put(0x6A, KeyEvent.VK_MULTIPLY); + regularKeyCodesMap.put(0x6B, KeyEvent.VK_ADD); + regularKeyCodesMap.put(0x6C, KeyEvent.VK_SEPARATER); + regularKeyCodesMap.put(0x6D, KeyEvent.VK_SUBTRACT); + regularKeyCodesMap.put(0x6E, KeyEvent.VK_DECIMAL); + regularKeyCodesMap.put(0x6F, KeyEvent.VK_DIVIDE); + regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE); + regularKeyCodesMap.put(0xC0, KeyEvent.VK_BACK_QUOTE); + regularKeyCodesMap.put(0xDE, KeyEvent.VK_QUOTE); + regularKeyCodesMap.put(0x26, KeyEvent.VK_AMPERSAND); + regularKeyCodesMap.put(0x2A, KeyEvent.VK_ASTERISK); + regularKeyCodesMap.put(0x22, KeyEvent.VK_QUOTEDBL); + regularKeyCodesMap.put(0x3C, KeyEvent.VK_LESS); + regularKeyCodesMap.put(0x3E, KeyEvent.VK_GREATER); + regularKeyCodesMap.put(0x7B, KeyEvent.VK_BRACELEFT); + regularKeyCodesMap.put(0x7D, KeyEvent.VK_BRACERIGHT); + regularKeyCodesMap.put(0x40, KeyEvent.VK_AT); + regularKeyCodesMap.put(0x3A, KeyEvent.VK_COLON); + regularKeyCodesMap.put(0x5E, KeyEvent.VK_CIRCUMFLEX); + regularKeyCodesMap.put(0x24, KeyEvent.VK_DOLLAR); + regularKeyCodesMap.put(0x20AC, KeyEvent.VK_EURO_SIGN); + regularKeyCodesMap.put(0x21, KeyEvent.VK_EXCLAMATION_MARK); + regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK); + regularKeyCodesMap.put(0x28, KeyEvent.VK_LEFT_PARENTHESIS); + regularKeyCodesMap.put(0x23, KeyEvent.VK_NUMBER_SIGN); + regularKeyCodesMap.put(0x2B, KeyEvent.VK_PLUS); + regularKeyCodesMap.put(0x29, KeyEvent.VK_RIGHT_PARENTHESIS); + regularKeyCodesMap.put(0x5F, KeyEvent.VK_UNDERSCORE); + + + extendedKeyCodesSet.add(0x01000000+0x0060); + extendedKeyCodesSet.add(0x01000000+0x007C); + extendedKeyCodesSet.add(0x01000000+0x007E); + extendedKeyCodesSet.add(0x01000000+0x00A2); + extendedKeyCodesSet.add(0x01000000+0x00A3); + extendedKeyCodesSet.add(0x01000000+0x00A5); + extendedKeyCodesSet.add(0x01000000+0x00A7); + extendedKeyCodesSet.add(0x01000000+0x00A8); + extendedKeyCodesSet.add(0x01000000+0x00AB); + extendedKeyCodesSet.add(0x01000000+0x00B0); + extendedKeyCodesSet.add(0x01000000+0x00B1); + extendedKeyCodesSet.add(0x01000000+0x00B2); + extendedKeyCodesSet.add(0x01000000+0x00B3); + extendedKeyCodesSet.add(0x01000000+0x00B4); + extendedKeyCodesSet.add(0x01000000+0x00B5); + extendedKeyCodesSet.add(0x01000000+0x00B6); + extendedKeyCodesSet.add(0x01000000+0x00B7); + extendedKeyCodesSet.add(0x01000000+0x00B9); + extendedKeyCodesSet.add(0x01000000+0x00BA); + extendedKeyCodesSet.add(0x01000000+0x00BB); + extendedKeyCodesSet.add(0x01000000+0x00BC); + extendedKeyCodesSet.add(0x01000000+0x00BD); + extendedKeyCodesSet.add(0x01000000+0x00BE); + extendedKeyCodesSet.add(0x01000000+0x00BF); + extendedKeyCodesSet.add(0x01000000+0x00C4); + extendedKeyCodesSet.add(0x01000000+0x00C5); + extendedKeyCodesSet.add(0x01000000+0x00C6); + extendedKeyCodesSet.add(0x01000000+0x00C7); + extendedKeyCodesSet.add(0x01000000+0x00D1); + extendedKeyCodesSet.add(0x01000000+0x00D6); + extendedKeyCodesSet.add(0x01000000+0x00D7); + extendedKeyCodesSet.add(0x01000000+0x00D8); + extendedKeyCodesSet.add(0x01000000+0x00DF); + extendedKeyCodesSet.add(0x01000000+0x00E0); + extendedKeyCodesSet.add(0x01000000+0x00E1); + extendedKeyCodesSet.add(0x01000000+0x00E2); + extendedKeyCodesSet.add(0x01000000+0x00E4); + extendedKeyCodesSet.add(0x01000000+0x00E5); + extendedKeyCodesSet.add(0x01000000+0x00E6); + extendedKeyCodesSet.add(0x01000000+0x00E7); + extendedKeyCodesSet.add(0x01000000+0x00E8); + extendedKeyCodesSet.add(0x01000000+0x00E9); + extendedKeyCodesSet.add(0x01000000+0x00EA); + extendedKeyCodesSet.add(0x01000000+0x00EB); + extendedKeyCodesSet.add(0x01000000+0x00EC); + extendedKeyCodesSet.add(0x01000000+0x00ED); + extendedKeyCodesSet.add(0x01000000+0x00EE); + extendedKeyCodesSet.add(0x01000000+0x00F0); + extendedKeyCodesSet.add(0x01000000+0x00F1); + extendedKeyCodesSet.add(0x01000000+0x00F2); + extendedKeyCodesSet.add(0x01000000+0x00F3); + extendedKeyCodesSet.add(0x01000000+0x00F4); + extendedKeyCodesSet.add(0x01000000+0x00F5); + extendedKeyCodesSet.add(0x01000000+0x00F6); + extendedKeyCodesSet.add(0x01000000+0x00F7); + extendedKeyCodesSet.add(0x01000000+0x00F8); + extendedKeyCodesSet.add(0x01000000+0x00F9); + extendedKeyCodesSet.add(0x01000000+0x00FA); + extendedKeyCodesSet.add(0x01000000+0x00FB); + extendedKeyCodesSet.add(0x01000000+0x00FC); + extendedKeyCodesSet.add(0x01000000+0x00FD); + extendedKeyCodesSet.add(0x01000000+0x00FE); + extendedKeyCodesSet.add(0x01000000+0x0105); + extendedKeyCodesSet.add(0x01000000+0x02DB); + extendedKeyCodesSet.add(0x01000000+0x0142); + extendedKeyCodesSet.add(0x01000000+0x013E); + extendedKeyCodesSet.add(0x01000000+0x015B); + extendedKeyCodesSet.add(0x01000000+0x0161); + extendedKeyCodesSet.add(0x01000000+0x015F); + extendedKeyCodesSet.add(0x01000000+0x0165); + extendedKeyCodesSet.add(0x01000000+0x017E); + extendedKeyCodesSet.add(0x01000000+0x017C); + extendedKeyCodesSet.add(0x01000000+0x0103); + extendedKeyCodesSet.add(0x01000000+0x0107); + extendedKeyCodesSet.add(0x01000000+0x010D); + extendedKeyCodesSet.add(0x01000000+0x0119); + extendedKeyCodesSet.add(0x01000000+0x011B); + extendedKeyCodesSet.add(0x01000000+0x0111); + extendedKeyCodesSet.add(0x01000000+0x0148); + extendedKeyCodesSet.add(0x01000000+0x0151); + extendedKeyCodesSet.add(0x01000000+0x0171); + extendedKeyCodesSet.add(0x01000000+0x0159); + extendedKeyCodesSet.add(0x01000000+0x016F); + extendedKeyCodesSet.add(0x01000000+0x0163); + extendedKeyCodesSet.add(0x01000000+0x02D9); + extendedKeyCodesSet.add(0x01000000+0x0130); + extendedKeyCodesSet.add(0x01000000+0x0127); + extendedKeyCodesSet.add(0x01000000+0x0125); + extendedKeyCodesSet.add(0x01000000+0x0131); + extendedKeyCodesSet.add(0x01000000+0x011F); + extendedKeyCodesSet.add(0x01000000+0x0135); + extendedKeyCodesSet.add(0x01000000+0x010B); + extendedKeyCodesSet.add(0x01000000+0x0109); + extendedKeyCodesSet.add(0x01000000+0x0121); + extendedKeyCodesSet.add(0x01000000+0x011D); + extendedKeyCodesSet.add(0x01000000+0x016D); + extendedKeyCodesSet.add(0x01000000+0x015D); + extendedKeyCodesSet.add(0x01000000+0x0138); + extendedKeyCodesSet.add(0x01000000+0x0157); + extendedKeyCodesSet.add(0x01000000+0x013C); + extendedKeyCodesSet.add(0x01000000+0x0113); + extendedKeyCodesSet.add(0x01000000+0x0123); + extendedKeyCodesSet.add(0x01000000+0x0167); + extendedKeyCodesSet.add(0x01000000+0x014B); + extendedKeyCodesSet.add(0x01000000+0x0101); + extendedKeyCodesSet.add(0x01000000+0x012F); + extendedKeyCodesSet.add(0x01000000+0x0117); + extendedKeyCodesSet.add(0x01000000+0x012B); + extendedKeyCodesSet.add(0x01000000+0x0146); + extendedKeyCodesSet.add(0x01000000+0x014D); + extendedKeyCodesSet.add(0x01000000+0x0137); + extendedKeyCodesSet.add(0x01000000+0x0173); + extendedKeyCodesSet.add(0x01000000+0x016B); + extendedKeyCodesSet.add(0x01000000+0x0153); + extendedKeyCodesSet.add(0x01000000+0x30FC); + extendedKeyCodesSet.add(0x01000000+0x30A2); + extendedKeyCodesSet.add(0x01000000+0x30A4); + extendedKeyCodesSet.add(0x01000000+0x30A6); + extendedKeyCodesSet.add(0x01000000+0x30A8); + extendedKeyCodesSet.add(0x01000000+0x30AA); + extendedKeyCodesSet.add(0x01000000+0x30AB); + extendedKeyCodesSet.add(0x01000000+0x30AD); + extendedKeyCodesSet.add(0x01000000+0x30AF); + extendedKeyCodesSet.add(0x01000000+0x30B1); + extendedKeyCodesSet.add(0x01000000+0x30B3); + extendedKeyCodesSet.add(0x01000000+0x30B5); + extendedKeyCodesSet.add(0x01000000+0x30B7); + extendedKeyCodesSet.add(0x01000000+0x30B9); + extendedKeyCodesSet.add(0x01000000+0x30BB); + extendedKeyCodesSet.add(0x01000000+0x30BD); + extendedKeyCodesSet.add(0x01000000+0x30BF); + extendedKeyCodesSet.add(0x01000000+0x30C1); + extendedKeyCodesSet.add(0x01000000+0x30C4); + extendedKeyCodesSet.add(0x01000000+0x30C6); + extendedKeyCodesSet.add(0x01000000+0x30C8); + extendedKeyCodesSet.add(0x01000000+0x30CA); + extendedKeyCodesSet.add(0x01000000+0x30CB); + extendedKeyCodesSet.add(0x01000000+0x30CC); + extendedKeyCodesSet.add(0x01000000+0x30CD); + extendedKeyCodesSet.add(0x01000000+0x30CE); + extendedKeyCodesSet.add(0x01000000+0x30CF); + extendedKeyCodesSet.add(0x01000000+0x30D2); + extendedKeyCodesSet.add(0x01000000+0x30D5); + extendedKeyCodesSet.add(0x01000000+0x30D8); + extendedKeyCodesSet.add(0x01000000+0x30DB); + extendedKeyCodesSet.add(0x01000000+0x30DE); + extendedKeyCodesSet.add(0x01000000+0x30DF); + extendedKeyCodesSet.add(0x01000000+0x30E0); + extendedKeyCodesSet.add(0x01000000+0x30E1); + extendedKeyCodesSet.add(0x01000000+0x30E2); + extendedKeyCodesSet.add(0x01000000+0x30E4); + extendedKeyCodesSet.add(0x01000000+0x30E6); + extendedKeyCodesSet.add(0x01000000+0x30E8); + extendedKeyCodesSet.add(0x01000000+0x30E9); + extendedKeyCodesSet.add(0x01000000+0x30EA); + extendedKeyCodesSet.add(0x01000000+0x30EB); + extendedKeyCodesSet.add(0x01000000+0x30EC); + extendedKeyCodesSet.add(0x01000000+0x30ED); + extendedKeyCodesSet.add(0x01000000+0x30EF); + extendedKeyCodesSet.add(0x01000000+0x30F3); + extendedKeyCodesSet.add(0x01000000+0x309B); + extendedKeyCodesSet.add(0x01000000+0x309C); + extendedKeyCodesSet.add(0x01000000+0x06F0); + extendedKeyCodesSet.add(0x01000000+0x06F1); + extendedKeyCodesSet.add(0x01000000+0x06F2); + extendedKeyCodesSet.add(0x01000000+0x06F3); + extendedKeyCodesSet.add(0x01000000+0x06F4); + extendedKeyCodesSet.add(0x01000000+0x06F5); + extendedKeyCodesSet.add(0x01000000+0x06F6); + extendedKeyCodesSet.add(0x01000000+0x06F7); + extendedKeyCodesSet.add(0x01000000+0x06F8); + extendedKeyCodesSet.add(0x01000000+0x06F9); + extendedKeyCodesSet.add(0x01000000+0x0670); + extendedKeyCodesSet.add(0x01000000+0x067E); + extendedKeyCodesSet.add(0x01000000+0x0686); + extendedKeyCodesSet.add(0x01000000+0x060C); + extendedKeyCodesSet.add(0x01000000+0x06D4); + extendedKeyCodesSet.add(0x01000000+0x0660); + extendedKeyCodesSet.add(0x01000000+0x0661); + extendedKeyCodesSet.add(0x01000000+0x0662); + extendedKeyCodesSet.add(0x01000000+0x0663); + extendedKeyCodesSet.add(0x01000000+0x0664); + extendedKeyCodesSet.add(0x01000000+0x0665); + extendedKeyCodesSet.add(0x01000000+0x0666); + extendedKeyCodesSet.add(0x01000000+0x0667); + extendedKeyCodesSet.add(0x01000000+0x0668); + extendedKeyCodesSet.add(0x01000000+0x0669); + extendedKeyCodesSet.add(0x01000000+0x061B); + extendedKeyCodesSet.add(0x01000000+0x0621); + extendedKeyCodesSet.add(0x01000000+0x0624); + extendedKeyCodesSet.add(0x01000000+0x0626); + extendedKeyCodesSet.add(0x01000000+0x0627); + extendedKeyCodesSet.add(0x01000000+0x0628); + extendedKeyCodesSet.add(0x01000000+0x0629); + extendedKeyCodesSet.add(0x01000000+0x062A); + extendedKeyCodesSet.add(0x01000000+0x062B); + extendedKeyCodesSet.add(0x01000000+0x062C); + extendedKeyCodesSet.add(0x01000000+0x062D); + extendedKeyCodesSet.add(0x01000000+0x062E); + extendedKeyCodesSet.add(0x01000000+0x062F); + extendedKeyCodesSet.add(0x01000000+0x0630); + extendedKeyCodesSet.add(0x01000000+0x0631); + extendedKeyCodesSet.add(0x01000000+0x0632); + extendedKeyCodesSet.add(0x01000000+0x0633); + extendedKeyCodesSet.add(0x01000000+0x0634); + extendedKeyCodesSet.add(0x01000000+0x0635); + extendedKeyCodesSet.add(0x01000000+0x0636); + extendedKeyCodesSet.add(0x01000000+0x0637); + extendedKeyCodesSet.add(0x01000000+0x0638); + extendedKeyCodesSet.add(0x01000000+0x0639); + extendedKeyCodesSet.add(0x01000000+0x063A); + extendedKeyCodesSet.add(0x01000000+0x0641); + extendedKeyCodesSet.add(0x01000000+0x0642); + extendedKeyCodesSet.add(0x01000000+0x0643); + extendedKeyCodesSet.add(0x01000000+0x0644); + extendedKeyCodesSet.add(0x01000000+0x0645); + extendedKeyCodesSet.add(0x01000000+0x0646); + extendedKeyCodesSet.add(0x01000000+0x0647); + extendedKeyCodesSet.add(0x01000000+0x0648); + extendedKeyCodesSet.add(0x01000000+0x0649); + extendedKeyCodesSet.add(0x01000000+0x064A); + extendedKeyCodesSet.add(0x01000000+0x064E); + extendedKeyCodesSet.add(0x01000000+0x064F); + extendedKeyCodesSet.add(0x01000000+0x0650); + extendedKeyCodesSet.add(0x01000000+0x0652); + extendedKeyCodesSet.add(0x01000000+0x0698); + extendedKeyCodesSet.add(0x01000000+0x06A4); + extendedKeyCodesSet.add(0x01000000+0x06A9); + extendedKeyCodesSet.add(0x01000000+0x06AF); + extendedKeyCodesSet.add(0x01000000+0x06BE); + extendedKeyCodesSet.add(0x01000000+0x06CC); + extendedKeyCodesSet.add(0x01000000+0x06CC); + extendedKeyCodesSet.add(0x01000000+0x06D2); + extendedKeyCodesSet.add(0x01000000+0x0493); + extendedKeyCodesSet.add(0x01000000+0x0497); + extendedKeyCodesSet.add(0x01000000+0x049B); + extendedKeyCodesSet.add(0x01000000+0x049D); + extendedKeyCodesSet.add(0x01000000+0x04A3); + extendedKeyCodesSet.add(0x01000000+0x04AF); + extendedKeyCodesSet.add(0x01000000+0x04B1); + extendedKeyCodesSet.add(0x01000000+0x04B3); + extendedKeyCodesSet.add(0x01000000+0x04B9); + extendedKeyCodesSet.add(0x01000000+0x04BB); + extendedKeyCodesSet.add(0x01000000+0x04D9); + extendedKeyCodesSet.add(0x01000000+0x04E9); + extendedKeyCodesSet.add(0x01000000+0x0452); + extendedKeyCodesSet.add(0x01000000+0x0453); + extendedKeyCodesSet.add(0x01000000+0x0451); + extendedKeyCodesSet.add(0x01000000+0x0454); + extendedKeyCodesSet.add(0x01000000+0x0455); + extendedKeyCodesSet.add(0x01000000+0x0456); + extendedKeyCodesSet.add(0x01000000+0x0457); + extendedKeyCodesSet.add(0x01000000+0x0458); + extendedKeyCodesSet.add(0x01000000+0x0459); + extendedKeyCodesSet.add(0x01000000+0x045A); + extendedKeyCodesSet.add(0x01000000+0x045B); + extendedKeyCodesSet.add(0x01000000+0x045C); + extendedKeyCodesSet.add(0x01000000+0x0491); + extendedKeyCodesSet.add(0x01000000+0x045E); + extendedKeyCodesSet.add(0x01000000+0x045F); + extendedKeyCodesSet.add(0x01000000+0x2116); + extendedKeyCodesSet.add(0x01000000+0x044E); + extendedKeyCodesSet.add(0x01000000+0x0430); + extendedKeyCodesSet.add(0x01000000+0x0431); + extendedKeyCodesSet.add(0x01000000+0x0446); + extendedKeyCodesSet.add(0x01000000+0x0434); + extendedKeyCodesSet.add(0x01000000+0x0435); + extendedKeyCodesSet.add(0x01000000+0x0444); + extendedKeyCodesSet.add(0x01000000+0x0433); + extendedKeyCodesSet.add(0x01000000+0x0445); + extendedKeyCodesSet.add(0x01000000+0x0438); + extendedKeyCodesSet.add(0x01000000+0x0439); + extendedKeyCodesSet.add(0x01000000+0x043A); + extendedKeyCodesSet.add(0x01000000+0x043B); + extendedKeyCodesSet.add(0x01000000+0x043C); + extendedKeyCodesSet.add(0x01000000+0x043D); + extendedKeyCodesSet.add(0x01000000+0x043E); + extendedKeyCodesSet.add(0x01000000+0x043F); + extendedKeyCodesSet.add(0x01000000+0x044F); + extendedKeyCodesSet.add(0x01000000+0x0440); + extendedKeyCodesSet.add(0x01000000+0x0441); + extendedKeyCodesSet.add(0x01000000+0x0442); + extendedKeyCodesSet.add(0x01000000+0x0443); + extendedKeyCodesSet.add(0x01000000+0x0436); + extendedKeyCodesSet.add(0x01000000+0x0432); + extendedKeyCodesSet.add(0x01000000+0x044C); + extendedKeyCodesSet.add(0x01000000+0x044B); + extendedKeyCodesSet.add(0x01000000+0x0437); + extendedKeyCodesSet.add(0x01000000+0x0448); + extendedKeyCodesSet.add(0x01000000+0x044D); + extendedKeyCodesSet.add(0x01000000+0x0449); + extendedKeyCodesSet.add(0x01000000+0x0447); + extendedKeyCodesSet.add(0x01000000+0x044A); + extendedKeyCodesSet.add(0x01000000+0x2015); + extendedKeyCodesSet.add(0x01000000+0x03B1); + extendedKeyCodesSet.add(0x01000000+0x03B2); + extendedKeyCodesSet.add(0x01000000+0x03B3); + extendedKeyCodesSet.add(0x01000000+0x03B4); + extendedKeyCodesSet.add(0x01000000+0x03B5); + extendedKeyCodesSet.add(0x01000000+0x03B6); + extendedKeyCodesSet.add(0x01000000+0x03B7); + extendedKeyCodesSet.add(0x01000000+0x03B8); + extendedKeyCodesSet.add(0x01000000+0x03B9); + extendedKeyCodesSet.add(0x01000000+0x03BA); + extendedKeyCodesSet.add(0x01000000+0x03BB); + extendedKeyCodesSet.add(0x01000000+0x03BC); + extendedKeyCodesSet.add(0x01000000+0x03BD); + extendedKeyCodesSet.add(0x01000000+0x03BE); + extendedKeyCodesSet.add(0x01000000+0x03BF); + extendedKeyCodesSet.add(0x01000000+0x03C0); + extendedKeyCodesSet.add(0x01000000+0x03C1); + extendedKeyCodesSet.add(0x01000000+0x03C3); + extendedKeyCodesSet.add(0x01000000+0x03C2); + extendedKeyCodesSet.add(0x01000000+0x03C4); + extendedKeyCodesSet.add(0x01000000+0x03C5); + extendedKeyCodesSet.add(0x01000000+0x03C6); + extendedKeyCodesSet.add(0x01000000+0x03C7); + extendedKeyCodesSet.add(0x01000000+0x03C8); + extendedKeyCodesSet.add(0x01000000+0x03C9); + extendedKeyCodesSet.add(0x01000000+0x2190); + extendedKeyCodesSet.add(0x01000000+0x2192); + extendedKeyCodesSet.add(0x01000000+0x2193); + extendedKeyCodesSet.add(0x01000000+0x2013); + extendedKeyCodesSet.add(0x01000000+0x201C); + extendedKeyCodesSet.add(0x01000000+0x201D); + extendedKeyCodesSet.add(0x01000000+0x201E); + extendedKeyCodesSet.add(0x01000000+0x05D0); + extendedKeyCodesSet.add(0x01000000+0x05D1); + extendedKeyCodesSet.add(0x01000000+0x05D2); + extendedKeyCodesSet.add(0x01000000+0x05D3); + extendedKeyCodesSet.add(0x01000000+0x05D4); + extendedKeyCodesSet.add(0x01000000+0x05D5); + extendedKeyCodesSet.add(0x01000000+0x05D6); + extendedKeyCodesSet.add(0x01000000+0x05D7); + extendedKeyCodesSet.add(0x01000000+0x05D8); + extendedKeyCodesSet.add(0x01000000+0x05D9); + extendedKeyCodesSet.add(0x01000000+0x05DA); + extendedKeyCodesSet.add(0x01000000+0x05DB); + extendedKeyCodesSet.add(0x01000000+0x05DC); + extendedKeyCodesSet.add(0x01000000+0x05DD); + extendedKeyCodesSet.add(0x01000000+0x05DE); + extendedKeyCodesSet.add(0x01000000+0x05DF); + extendedKeyCodesSet.add(0x01000000+0x05E0); + extendedKeyCodesSet.add(0x01000000+0x05E1); + extendedKeyCodesSet.add(0x01000000+0x05E2); + extendedKeyCodesSet.add(0x01000000+0x05E3); + extendedKeyCodesSet.add(0x01000000+0x05E4); + extendedKeyCodesSet.add(0x01000000+0x05E5); + extendedKeyCodesSet.add(0x01000000+0x05E6); + extendedKeyCodesSet.add(0x01000000+0x05E7); + extendedKeyCodesSet.add(0x01000000+0x05E8); + extendedKeyCodesSet.add(0x01000000+0x05E9); + extendedKeyCodesSet.add(0x01000000+0x05EA); + extendedKeyCodesSet.add(0x01000000+0x0E01); + extendedKeyCodesSet.add(0x01000000+0x0E02); + extendedKeyCodesSet.add(0x01000000+0x0E03); + extendedKeyCodesSet.add(0x01000000+0x0E04); + extendedKeyCodesSet.add(0x01000000+0x0E05); + extendedKeyCodesSet.add(0x01000000+0x0E07); + extendedKeyCodesSet.add(0x01000000+0x0E08); + extendedKeyCodesSet.add(0x01000000+0x0E0A); + extendedKeyCodesSet.add(0x01000000+0x0E0C); + extendedKeyCodesSet.add(0x01000000+0x0E14); + extendedKeyCodesSet.add(0x01000000+0x0E15); + extendedKeyCodesSet.add(0x01000000+0x0E16); + extendedKeyCodesSet.add(0x01000000+0x0E17); + extendedKeyCodesSet.add(0x01000000+0x0E19); + extendedKeyCodesSet.add(0x01000000+0x0E1A); + extendedKeyCodesSet.add(0x01000000+0x0E1B); + extendedKeyCodesSet.add(0x01000000+0x0E1C); + extendedKeyCodesSet.add(0x01000000+0x0E1D); + extendedKeyCodesSet.add(0x01000000+0x0E1E); + extendedKeyCodesSet.add(0x01000000+0x0E1F); + extendedKeyCodesSet.add(0x01000000+0x0E20); + extendedKeyCodesSet.add(0x01000000+0x0E21); + extendedKeyCodesSet.add(0x01000000+0x0E22); + extendedKeyCodesSet.add(0x01000000+0x0E23); + extendedKeyCodesSet.add(0x01000000+0x0E25); + extendedKeyCodesSet.add(0x01000000+0x0E27); + extendedKeyCodesSet.add(0x01000000+0x0E2A); + extendedKeyCodesSet.add(0x01000000+0x0E2B); + extendedKeyCodesSet.add(0x01000000+0x0E2D); + extendedKeyCodesSet.add(0x01000000+0x0E30); + extendedKeyCodesSet.add(0x01000000+0x0E31); + extendedKeyCodesSet.add(0x01000000+0x0E32); + extendedKeyCodesSet.add(0x01000000+0x0E33); + extendedKeyCodesSet.add(0x01000000+0x0E34); + extendedKeyCodesSet.add(0x01000000+0x0E35); + extendedKeyCodesSet.add(0x01000000+0x0E36); + extendedKeyCodesSet.add(0x01000000+0x0E37); + extendedKeyCodesSet.add(0x01000000+0x0E38); + extendedKeyCodesSet.add(0x01000000+0x0E39); + extendedKeyCodesSet.add(0x01000000+0x0E3F); + extendedKeyCodesSet.add(0x01000000+0x0E40); + extendedKeyCodesSet.add(0x01000000+0x0E41); + extendedKeyCodesSet.add(0x01000000+0x0E43); + extendedKeyCodesSet.add(0x01000000+0x0E44); + extendedKeyCodesSet.add(0x01000000+0x0E45); + extendedKeyCodesSet.add(0x01000000+0x0E46); + extendedKeyCodesSet.add(0x01000000+0x0E47); + extendedKeyCodesSet.add(0x01000000+0x0E48); + extendedKeyCodesSet.add(0x01000000+0x0E49); + extendedKeyCodesSet.add(0x01000000+0x0E50); + extendedKeyCodesSet.add(0x01000000+0x0E51); + extendedKeyCodesSet.add(0x01000000+0x0E52); + extendedKeyCodesSet.add(0x01000000+0x0E53); + extendedKeyCodesSet.add(0x01000000+0x0E54); + extendedKeyCodesSet.add(0x01000000+0x0E55); + extendedKeyCodesSet.add(0x01000000+0x0E56); + extendedKeyCodesSet.add(0x01000000+0x0E57); + extendedKeyCodesSet.add(0x01000000+0x0E58); + extendedKeyCodesSet.add(0x01000000+0x0E59); + extendedKeyCodesSet.add(0x01000000+0x0587); + extendedKeyCodesSet.add(0x01000000+0x0589); + extendedKeyCodesSet.add(0x01000000+0x0589); + extendedKeyCodesSet.add(0x01000000+0x055D); + extendedKeyCodesSet.add(0x01000000+0x055D); + extendedKeyCodesSet.add(0x01000000+0x055B); + extendedKeyCodesSet.add(0x01000000+0x055B); + extendedKeyCodesSet.add(0x01000000+0x055E); + extendedKeyCodesSet.add(0x01000000+0x055E); + extendedKeyCodesSet.add(0x01000000+0x0561); + extendedKeyCodesSet.add(0x01000000+0x0562); + extendedKeyCodesSet.add(0x01000000+0x0563); + extendedKeyCodesSet.add(0x01000000+0x0564); + extendedKeyCodesSet.add(0x01000000+0x0565); + extendedKeyCodesSet.add(0x01000000+0x0566); + extendedKeyCodesSet.add(0x01000000+0x0567); + extendedKeyCodesSet.add(0x01000000+0x0568); + extendedKeyCodesSet.add(0x01000000+0x0569); + extendedKeyCodesSet.add(0x01000000+0x056A); + extendedKeyCodesSet.add(0x01000000+0x056B); + extendedKeyCodesSet.add(0x01000000+0x056C); + extendedKeyCodesSet.add(0x01000000+0x056D); + extendedKeyCodesSet.add(0x01000000+0x056E); + extendedKeyCodesSet.add(0x01000000+0x056F); + extendedKeyCodesSet.add(0x01000000+0x0570); + extendedKeyCodesSet.add(0x01000000+0x0571); + extendedKeyCodesSet.add(0x01000000+0x0572); + extendedKeyCodesSet.add(0x01000000+0x0573); + extendedKeyCodesSet.add(0x01000000+0x0574); + extendedKeyCodesSet.add(0x01000000+0x0575); + extendedKeyCodesSet.add(0x01000000+0x0576); + extendedKeyCodesSet.add(0x01000000+0x0577); + extendedKeyCodesSet.add(0x01000000+0x0578); + extendedKeyCodesSet.add(0x01000000+0x0579); + extendedKeyCodesSet.add(0x01000000+0x057A); + extendedKeyCodesSet.add(0x01000000+0x057B); + extendedKeyCodesSet.add(0x01000000+0x057C); + extendedKeyCodesSet.add(0x01000000+0x057D); + extendedKeyCodesSet.add(0x01000000+0x057E); + extendedKeyCodesSet.add(0x01000000+0x057F); + extendedKeyCodesSet.add(0x01000000+0x0580); + extendedKeyCodesSet.add(0x01000000+0x0581); + extendedKeyCodesSet.add(0x01000000+0x0582); + extendedKeyCodesSet.add(0x01000000+0x0583); + extendedKeyCodesSet.add(0x01000000+0x0584); + extendedKeyCodesSet.add(0x01000000+0x0585); + extendedKeyCodesSet.add(0x01000000+0x0586); + extendedKeyCodesSet.add(0x01000000+0x10D0); + extendedKeyCodesSet.add(0x01000000+0x10D1); + extendedKeyCodesSet.add(0x01000000+0x10D2); + extendedKeyCodesSet.add(0x01000000+0x10D3); + extendedKeyCodesSet.add(0x01000000+0x10D4); + extendedKeyCodesSet.add(0x01000000+0x10D5); + extendedKeyCodesSet.add(0x01000000+0x10D6); + extendedKeyCodesSet.add(0x01000000+0x10D7); + extendedKeyCodesSet.add(0x01000000+0x10D8); + extendedKeyCodesSet.add(0x01000000+0x10D9); + extendedKeyCodesSet.add(0x01000000+0x10DA); + extendedKeyCodesSet.add(0x01000000+0x10DB); + extendedKeyCodesSet.add(0x01000000+0x10DC); + extendedKeyCodesSet.add(0x01000000+0x10DD); + extendedKeyCodesSet.add(0x01000000+0x10DE); + extendedKeyCodesSet.add(0x01000000+0x10DF); + extendedKeyCodesSet.add(0x01000000+0x10E0); + extendedKeyCodesSet.add(0x01000000+0x10E1); + extendedKeyCodesSet.add(0x01000000+0x10E2); + extendedKeyCodesSet.add(0x01000000+0x10E3); + extendedKeyCodesSet.add(0x01000000+0x10E4); + extendedKeyCodesSet.add(0x01000000+0x10E5); + extendedKeyCodesSet.add(0x01000000+0x10E6); + extendedKeyCodesSet.add(0x01000000+0x10E7); + extendedKeyCodesSet.add(0x01000000+0x10E8); + extendedKeyCodesSet.add(0x01000000+0x10E9); + extendedKeyCodesSet.add(0x01000000+0x10EA); + extendedKeyCodesSet.add(0x01000000+0x10EB); + extendedKeyCodesSet.add(0x01000000+0x10EC); + extendedKeyCodesSet.add(0x01000000+0x10ED); + extendedKeyCodesSet.add(0x01000000+0x10EE); + extendedKeyCodesSet.add(0x01000000+0x10EF); + extendedKeyCodesSet.add(0x01000000+0x10F0); + extendedKeyCodesSet.add(0x01000000+0x01E7); + extendedKeyCodesSet.add(0x01000000+0x0259); + extendedKeyCodesSet.add(0x01000000+0x1EB9); + extendedKeyCodesSet.add(0x01000000+0x1ECB); + extendedKeyCodesSet.add(0x01000000+0x1ECD); + extendedKeyCodesSet.add(0x01000000+0x1EE5); + extendedKeyCodesSet.add(0x01000000+0x01A1); + extendedKeyCodesSet.add(0x01000000+0x01B0); + extendedKeyCodesSet.add(0x01000000+0x20AB); + } +} diff --git a/src/share/classes/sun/awt/HeadlessToolkit.java b/src/share/classes/sun/awt/HeadlessToolkit.java index 18ccc446be57fd83b4f8afc46018c98086044dec..cfc5a47a357a589247f7b7f8ad92bcf221c11907 100644 --- a/src/share/classes/sun/awt/HeadlessToolkit.java +++ b/src/share/classes/sun/awt/HeadlessToolkit.java @@ -179,9 +179,9 @@ public class HeadlessToolkit extends Toolkit throw new HeadlessException(); } - public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) throws HeadlessException { - KeyboardFocusManagerPeerImpl peer = new KeyboardFocusManagerPeerImpl(manager); - return peer; + public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) + throws HeadlessException { + throw new HeadlessException(); } public TrayIconPeer createTrayIcon(TrayIcon target) diff --git a/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java b/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java index 0d47a3fd286d78a532680b5cc6e75f3cac506c33..6a8708a2abef9c874cf61369b418db2a1f24cb3b 100644 --- a/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java +++ b/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -27,47 +27,150 @@ package sun.awt; import java.awt.Component; import java.awt.KeyboardFocusManager; import java.awt.Window; +import java.awt.Canvas; +import java.awt.Scrollbar; +import java.awt.Panel; + +import java.awt.event.FocusEvent; import java.awt.peer.KeyboardFocusManagerPeer; +import java.awt.peer.ComponentPeer; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.logging.Level; +import java.util.logging.Logger; + +public abstract class KeyboardFocusManagerPeerImpl implements KeyboardFocusManagerPeer { + + private static final Logger focusLog = Logger.getLogger("sun.awt.focus.KeyboardFocusManagerPeerImpl"); + + private static AWTAccessor.KeyboardFocusManagerAccessor kfmAccessor = + AWTAccessor.getKeyboardFocusManagerAccessor(); -public class KeyboardFocusManagerPeerImpl implements KeyboardFocusManagerPeer { - static native Window getNativeFocusedWindow(); - static native Component getNativeFocusOwner(); - static native void clearNativeGlobalFocusOwner(Window activeWindow); + // The constants are copied from java.awt.KeyboardFocusManager + public static final int SNFH_FAILURE = 0; + public static final int SNFH_SUCCESS_HANDLED = 1; + public static final int SNFH_SUCCESS_PROCEED = 2; - KeyboardFocusManagerPeerImpl(KeyboardFocusManager manager) { + protected KeyboardFocusManager manager; + + public KeyboardFocusManagerPeerImpl(KeyboardFocusManager manager) { + this.manager = manager; } - public Window getCurrentFocusedWindow() { - return getNativeFocusedWindow(); + @Override + public void clearGlobalFocusOwner(Window activeWindow) { + if (activeWindow != null) { + Component focusOwner = activeWindow.getFocusOwner(); + if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Clearing global focus owner " + focusOwner); + if (focusOwner != null) { + FocusEvent fl = new CausedFocusEvent(focusOwner, FocusEvent.FOCUS_LOST, false, null, + CausedFocusEvent.Cause.CLEAR_GLOBAL_FOCUS_OWNER); + SunToolkit.postPriorityEvent(fl); + } + } + } + + /* + * WARNING: Don't call it on the Toolkit thread. + * + * Checks if the component: + * 1) accepts focus on click (in general) + * 2) may be a focus owner (in particular) + */ + public static boolean shouldFocusOnClick(Component component) { + boolean acceptFocusOnClick = false; + + // A component is generally allowed to accept focus on click + // if its peer is focusable. There're some exceptions though. + + + // CANVAS & SCROLLBAR accept focus on click + if (component instanceof Canvas || + component instanceof Scrollbar) + { + acceptFocusOnClick = true; + + // PANEL, empty only, accepts focus on click + } else if (component instanceof Panel) { + acceptFocusOnClick = (((Panel)component).getComponentCount() == 0); + + + // Other components + } else { + ComponentPeer peer = (component != null ? component.getPeer() : null); + acceptFocusOnClick = (peer != null ? peer.isFocusable() : false); + } + return acceptFocusOnClick && + AWTAccessor.getComponentAccessor().canBeFocusOwner(component); } - public void setCurrentFocusOwner(Component comp) { + /* + * Posts proper lost/gain focus events to the event queue. + */ + public static boolean deliverFocus(Component lightweightChild, + Component target, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time, + CausedFocusEvent.Cause cause, + Component currentFocusOwner) // provided by the descendant peers + { + if (lightweightChild == null) { + lightweightChild = (Component)target; + } + + Component currentOwner = currentFocusOwner; + if (currentOwner != null && currentOwner.getPeer() == null) { + currentOwner = null; + } + if (currentOwner != null) { + FocusEvent fl = new CausedFocusEvent(currentOwner, FocusEvent.FOCUS_LOST, + false, lightweightChild, cause); + + if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Posting focus event: " + fl); + SunToolkit.postPriorityEvent(fl); + } + + FocusEvent fg = new CausedFocusEvent(lightweightChild, FocusEvent.FOCUS_GAINED, + false, currentOwner, cause); + + if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Posting focus event: " + fg); + SunToolkit.postPriorityEvent(fg); + return true; } - public Component getCurrentFocusOwner() { - return getNativeFocusOwner(); + // WARNING: Don't call it on the Toolkit thread. + public static boolean requestFocusFor(Component target, CausedFocusEvent.Cause cause) { + return AWTAccessor.getComponentAccessor().requestFocus(target, cause); } - public void clearGlobalFocusOwner(Window activeWindow) { - clearNativeGlobalFocusOwner(activeWindow); + + // WARNING: Don't call it on the Toolkit thread. + public static int shouldNativelyFocusHeavyweight(Component heavyweight, + Component descendant, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time, + CausedFocusEvent.Cause cause) + { + return kfmAccessor.shouldNativelyFocusHeavyweight( + heavyweight, descendant, temporary, focusedWindowChangeAllowed, time, cause); } - static Method m_removeLastFocusRequest = null; public static void removeLastFocusRequest(Component heavyweight) { - try { - if (m_removeLastFocusRequest == null) { - m_removeLastFocusRequest = SunToolkit.getMethod(KeyboardFocusManager.class, "removeLastFocusRequest", - new Class[] {Component.class}); - } - m_removeLastFocusRequest.invoke(null, new Object[]{heavyweight}); - } catch (InvocationTargetException ite) { - ite.printStackTrace(); - } catch (IllegalAccessException ex) { - ex.printStackTrace(); - } + kfmAccessor.removeLastFocusRequest(heavyweight); + } + + // WARNING: Don't call it on the Toolkit thread. + public static boolean processSynchronousLightweightTransfer(Component heavyweight, + Component descendant, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time) + { + return kfmAccessor.processSynchronousLightweightTransfer( + heavyweight, descendant, temporary, focusedWindowChangeAllowed, time); } } diff --git a/src/share/classes/sun/awt/NullComponentPeer.java b/src/share/classes/sun/awt/NullComponentPeer.java index 8818c472877263980d57b92debd846056fda11f1..471aa75b51c792f95d18ff6abb880a4269e89250 100644 --- a/src/share/classes/sun/awt/NullComponentPeer.java +++ b/src/share/classes/sun/awt/NullComponentPeer.java @@ -278,19 +278,6 @@ public class NullComponentPeer implements LightweightPeer, throw new UnsupportedOperationException(); } - /** - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - throw new UnsupportedOperationException(); - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return false; - } public void layout() { } @@ -305,4 +292,19 @@ public class NullComponentPeer implements LightweightPeer, */ public void applyShape(Region shape) { } + + /** + * Lowers this component at the bottom of the above HW peer. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + public void setZOrder(ComponentPeer above) { + } + + public void updateGraphicsData(GraphicsConfiguration gc) {} + + public GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc) + { + return gc; + } } diff --git a/src/share/classes/sun/awt/SunToolkit.java b/src/share/classes/sun/awt/SunToolkit.java index 7c6f74856a9a1d86d822ad6e007e2e038bff1a1b..ac99f4bab5afe413112ae398eb516ae484ace0ae 100644 --- a/src/share/classes/sun/awt/SunToolkit.java +++ b/src/share/classes/sun/awt/SunToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -32,14 +32,10 @@ import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.peer.*; import java.awt.event.WindowEvent; import java.awt.event.KeyEvent; -import java.awt.im.spi.InputMethodDescriptor; import java.awt.image.*; -import java.awt.geom.AffineTransform; import java.awt.TrayIcon; import java.awt.SystemTray; -import java.io.*; import java.net.URL; -import java.net.JarURLConnection; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; @@ -49,7 +45,6 @@ import java.util.logging.Logger; import sun.misc.SoftCache; import sun.font.FontDesignMetrics; import sun.awt.im.InputContext; -import sun.awt.im.SimpleInputMethodWindow; import sun.awt.image.*; import sun.security.action.GetPropertyAction; import sun.security.action.GetBooleanAction; @@ -225,10 +220,8 @@ public abstract class SunToolkit extends Toolkit public abstract RobotPeer createRobot(Robot target, GraphicsDevice screen) throws AWTException; - public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) throws HeadlessException { - KeyboardFocusManagerPeerImpl peer = new KeyboardFocusManagerPeerImpl(manager); - return peer; - } + public abstract KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) + throws HeadlessException; /** * The AWT lock is typically only used on Unix platforms to synchronize @@ -824,16 +817,31 @@ public abstract class SunToolkit extends Toolkit } /** - * Disables erasing of background on the canvas before painting - * if this is supported by the current toolkit. - * - * @throws IllegalStateException if the canvas is not displayable - * @see java.awt.Component#isDisplayable + * Disables erasing of background on the canvas before painting if + * this is supported by the current toolkit. It is recommended to + * call this method early, before the Canvas becomes displayable, + * because some Toolkit implementations do not support changing + * this property once the Canvas becomes displayable. */ public void disableBackgroundErase(Canvas canvas) { - if (!canvas.isDisplayable()) { - throw new IllegalStateException("Canvas must have a valid peer"); - } + disableBackgroundEraseImpl(canvas); + } + + /** + * Disables the native erasing of the background on the given + * component before painting if this is supported by the current + * toolkit. This only has an effect for certain components such as + * Canvas, Panel and Window. It is recommended to call this method + * early, before the Component becomes displayable, because some + * Toolkit implementations do not support changing this property + * once the Component becomes displayable. + */ + public void disableBackgroundErase(Component component) { + disableBackgroundEraseImpl(component); + } + + private void disableBackgroundEraseImpl(Component component) { + AWTAccessor.getComponentAccessor().setBackgroundEraseDisabled(component, true); } /** @@ -1972,6 +1980,18 @@ public abstract class SunToolkit extends Toolkit AWTAutoShutdown.getInstance().dumpPeers(aLog); } + /** + * Returns the <code>Window</code> ancestor of the component <code>comp</code>. + * @return Window ancestor of the component or component by itself if it is Window; + * null, if component is not a part of window hierarchy + */ + public static Window getContainingWindow(Component comp) { + while (comp != null && !(comp instanceof Window)) { + comp = comp.getParent(); + } + return (Window)comp; + } + private static Boolean sunAwtDisableMixing = null; /** @@ -1995,6 +2015,73 @@ public abstract class SunToolkit extends Toolkit public boolean isNativeGTKAvailable() { return false; } + + // Cosntant alpha + public boolean isWindowOpacitySupported() { + return false; + } + + // Shaping + public boolean isWindowShapingSupported() { + return false; + } + + // Per-pixel alpha + public boolean isWindowTranslucencySupported() { + return false; + } + + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + return false; + } + + /** + * Returns whether or not a containing top level window for the passed + * component is + * {@link com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT PERPIXEL_TRANSLUCENT}. + * + * @param c a Component which toplevel's to check + * @return {@code true} if the passed component is not null and has a + * containing toplevel window which is opaque (so per-pixel translucency + * is not enabled), {@code false} otherwise + * @see com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT + * @see com.sun.awt.AWTUtilities#isWindowOpaque(Window) + */ + public static boolean isContainingTopLevelOpaque(Component c) { + Window w = getContainingWindow(c); + // return w != null && (w).isOpaque(); + return w != null && com.sun.awt.AWTUtilities.isWindowOpaque(w); + } + + /** + * Returns whether or not a containing top level window for the passed + * component is + * {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}. + * + * @param c a Component which toplevel's to check + * @return {@code true} if the passed component is not null and has a + * containing toplevel window which has opacity less than + * 1.0f (which means that it is translucent), {@code false} otherwise + * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT + * @see com.sun.awt.AWTUtilities#getWindowOpacity(Window) + */ + public static boolean isContainingTopLevelTranslucent(Component c) { + Window w = getContainingWindow(c); + // return w != null && (w).getOpacity() < 1.0f; + return w != null && com.sun.awt.AWTUtilities.getWindowOpacity((Window)w) < 1.0f; + } + + /** + * Returns whether the native system requires using the peer.updateWindow() + * method to update the contents of a non-opaque window, or if usual + * painting procedures are sufficient. The default return value covers + * the X11 systems. On MS Windows this method is overriden in WToolkit + * to return true. + */ + public boolean needUpdateWindow() { + return false; + } + } // class SunToolkit diff --git a/src/share/classes/sun/awt/image/GifImageDecoder.java b/src/share/classes/sun/awt/image/GifImageDecoder.java index aa87fb82ef76280ab472d9923b719286fe623b03..b0679afc437d9dd4da6b694791a4edcdc43b6434 100644 --- a/src/share/classes/sun/awt/image/GifImageDecoder.java +++ b/src/share/classes/sun/awt/image/GifImageDecoder.java @@ -585,9 +585,16 @@ public class GifImageDecoder extends ImageDecoder { 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 --git a/src/share/classes/sun/awt/shell/ShellFolder.java b/src/share/classes/sun/awt/shell/ShellFolder.java index 16c1b12cb80ef6e3ce5a5f1355322d93a24b4009..0e75ac183dcfa8eefea46171691abadc3fe7098c 100644 --- a/src/share/classes/sun/awt/shell/ShellFolder.java +++ b/src/share/classes/sun/awt/shell/ShellFolder.java @@ -31,6 +31,7 @@ import java.awt.Toolkit; import java.io.*; import java.io.FileNotFoundException; import java.util.*; +import java.util.concurrent.Callable; /** * @author Michael Martak @@ -461,6 +462,35 @@ public abstract class ShellFolder extends File { return null; } + private static Invoker invoker; + + /** + * Provides the single access point to the {@link Invoker}. It is guaranteed that the value + * returned by this method will be always the same. + * + * @return the singleton instance of {@link Invoker} + */ + public static Invoker getInvoker() { + if (invoker == null) { + invoker = shellFolderManager.createInvoker(); + } + return invoker; + } + + /** + * Interface allowing to invoke tasks in different environments on different platforms. + */ + public static interface Invoker { + /** + * Invokes a callable task. If the {@code task} throws a checked exception, + * it will be wrapped into a {@link RuntimeException} + * + * @param task a task to invoke + * @return the result of {@code task}'s invokation + */ + <T> T invoke(Callable<T> task); + } + /** * Provides a default comparator for the default column set */ diff --git a/src/share/classes/sun/awt/shell/ShellFolderManager.java b/src/share/classes/sun/awt/shell/ShellFolderManager.java index 8fb15bf0cf8c39b48310d92155cdc5ebe0006811..dc8901f7bc5aebc4fb185d661b0c4bd40a06d118 100644 --- a/src/share/classes/sun/awt/shell/ShellFolderManager.java +++ b/src/share/classes/sun/awt/shell/ShellFolderManager.java @@ -27,6 +27,7 @@ package sun.awt.shell; import java.io.File; import java.io.FileNotFoundException; +import java.util.concurrent.Callable; /** * @author Michael Martak @@ -96,9 +97,23 @@ class ShellFolderManager { } public boolean isFileSystemRoot(File dir) { - if (dir instanceof ShellFolder && !((ShellFolder)dir).isFileSystem()) { + if (dir instanceof ShellFolder && !((ShellFolder) dir).isFileSystem()) { return false; } return (dir.getParentFile() == null); } + + protected ShellFolder.Invoker createInvoker() { + return new DirectInvoker(); + } + + private static class DirectInvoker implements ShellFolder.Invoker { + public <T> T invoke(Callable<T> task) { + try { + return task.call(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } } diff --git a/src/share/classes/sun/beans/editors/ColorEditor.java b/src/share/classes/sun/beans/editors/ColorEditor.java index a3610e0ee2ef9d7c64c74c0f627de2bd3c6571f6..55dd9137be1ef1f605f0e972f5be0fca96d31b54 100644 --- a/src/share/classes/sun/beans/editors/ColorEditor.java +++ b/src/share/classes/sun/beans/editors/ColorEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -29,6 +29,8 @@ import java.awt.*; import java.beans.*; public class ColorEditor extends Panel implements PropertyEditor { + private static final long serialVersionUID = 1781257185164716054L; + public ColorEditor() { setLayout(null); diff --git a/src/share/classes/sun/beans/editors/FontEditor.java b/src/share/classes/sun/beans/editors/FontEditor.java index 88de9aea48f7bf8ed2939b88340a7245c34b0053..04d4c187e22c6e1d1c37dd6f5198af2dcd34b453 100644 --- a/src/share/classes/sun/beans/editors/FontEditor.java +++ b/src/share/classes/sun/beans/editors/FontEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -29,6 +29,7 @@ import java.awt.*; import java.beans.*; public class FontEditor extends Panel implements java.beans.PropertyEditor { + private static final long serialVersionUID = 6732704486002715933L; public FontEditor() { setLayout(null); diff --git a/src/share/classes/sun/font/CreatedFontTracker.java b/src/share/classes/sun/font/CreatedFontTracker.java new file mode 100644 index 0000000000000000000000000000000000000000..741337d5b1902d174b8a6d9996c92c32280bd806 --- /dev/null +++ b/src/share/classes/sun/font/CreatedFontTracker.java @@ -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 --git a/src/share/classes/sun/font/FileFont.java b/src/share/classes/sun/font/FileFont.java index b6a2099d2a41ff1ac70c6e37d7697ff848c79e03..5aad11b2acd9ff35e0929bb1fbad6551237e942e 100644 --- a/src/share/classes/sun/font/FileFont.java +++ b/src/share/classes/sun/font/FileFont.java @@ -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 @@ public abstract class FileFont extends PhysicalFont { 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 @@ public abstract class FileFont extends PhysicalFont { 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 abstract class FileFont extends PhysicalFont { 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 --git a/src/share/classes/sun/font/FontManager.java b/src/share/classes/sun/font/FontManager.java index a8b721daffc014c47d5baaac16b7815eb5c0191d..6ac89628e2a661c401b1f193af40a22be9cc0b4c 100644 --- a/src/share/classes/sun/font/FontManager.java +++ b/src/share/classes/sun/font/FontManager.java @@ -2357,19 +2357,21 @@ public final class FontManager { static Vector<File> 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 @@ public final class FontManager { 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 @@ public final class FontManager { throw(e); } if (isCopy) { - font2D.setFileToRemove(fontFile); + font2D.setFileToRemove(fontFile, tracker); synchronized (FontManager.class) { if (tmpFontFiles == null) { diff --git a/src/share/classes/sun/font/TrueTypeFont.java b/src/share/classes/sun/font/TrueTypeFont.java index 75318514b29d9d76ec7fa9f79874e9a910da85ab..7a87e81a0e2353658e676bfeb315a60e19573c80 100644 --- a/src/share/classes/sun/font/TrueTypeFont.java +++ b/src/share/classes/sun/font/TrueTypeFont.java @@ -175,8 +175,17 @@ public class TrueTypeFont extends FileFont { 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 --git a/src/share/classes/sun/font/Type1Font.java b/src/share/classes/sun/font/Type1Font.java index 36841b6e848a973aea001dd12d213725c5466579..a117310577494546b4b936a6e9b68487b199dcbf 100644 --- a/src/share/classes/sun/font/Type1Font.java +++ b/src/share/classes/sun/font/Type1Font.java @@ -39,6 +39,7 @@ import java.nio.BufferUnderflowException; 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 @@ import java.awt.Font; */ 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; @@ -124,6 +146,17 @@ public class Type1Font extends FileFont { } + /** + * 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). @@ -131,12 +164,25 @@ public class Type1Font extends FileFont { * @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 --git a/src/share/classes/sun/io/ByteToCharBig5.java b/src/share/classes/sun/io/ByteToCharBig5.java index 1857023a791cdbed9262a2201286c700e09c8208..50951e46a5878202bc632308e9e66dc3e3e4a3f1 100644 --- a/src/share/classes/sun/io/ByteToCharBig5.java +++ b/src/share/classes/sun/io/ByteToCharBig5.java @@ -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 @@ package sun.io; 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 --git a/src/share/classes/sun/io/CharToByteJohab.java b/src/share/classes/sun/io/CharToByteJohab.java index 37ed253a7bbd26295dca0a06b6db23ea17a432a7..b3b609d85f016a7cd52416de0c279f9f368e7ab9 100644 --- a/src/share/classes/sun/io/CharToByteJohab.java +++ b/src/share/classes/sun/io/CharToByteJohab.java @@ -46,4728 +46,4 @@ public class CharToByteJohab extends CharToByteDoubleByte { 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 --git a/src/share/classes/sun/misc/Launcher.java b/src/share/classes/sun/misc/Launcher.java index a64986e6260eb48a9c14766ec7ce376ba7f0c164..030d3e571a1498909b4ccb271c043ba13cde899a 100644 --- a/src/share/classes/sun/misc/Launcher.java +++ b/src/share/classes/sun/misc/Launcher.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -120,7 +120,10 @@ public class Launcher { * The class loader used for loading installed extensions. */ static class ExtClassLoader extends URLClassLoader { - private File[] dirs; + + static { + ClassLoader.registerAsParallelCapable(); + } /** * create an ExtClassLoader. The ExtClassLoader is created @@ -146,12 +149,12 @@ public class Launcher { } }); } catch (java.security.PrivilegedActionException e) { - throw (IOException) e.getException(); + throw (IOException) e.getException(); } } void addExtURL(URL url) { - super.addURL(url); + super.addURL(url); } /* @@ -159,7 +162,6 @@ public class Launcher { */ public ExtClassLoader(File[] dirs) throws IOException { super(getExtURLs(dirs), null, factory); - this.dirs = dirs; } private static File[] getExtDirs() { @@ -206,20 +208,27 @@ public class Launcher { */ public String findLibrary(String name) { name = System.mapLibraryName(name); - for (int i = 0; i < dirs.length; i++) { - // Look in architecture-specific subdirectory first - String arch = System.getProperty("os.arch"); - if (arch != null) { - File file = new File(new File(dirs[i], arch), name); + URL[] urls = super.getURLs(); + File prevDir = null; + for (int i = 0; i < urls.length; i++) { + // Get the ext directory from the URL + File dir = new File(urls[i].getPath()).getParentFile(); + if (dir != null && !dir.equals(prevDir)) { + // Look in architecture-specific subdirectory first + String arch = System.getProperty("os.arch"); + if (arch != null) { + File file = new File(new File(dir, arch), name); + if (file.exists()) { + return file.getAbsolutePath(); + } + } + // Then check the extension directory + File file = new File(dir, name); if (file.exists()) { return file.getAbsolutePath(); } } - // Then check the extension directory - File file = new File(dirs[i], name); - if (file.exists()) { - return file.getAbsolutePath(); - } + prevDir = dir; } return null; } @@ -248,6 +257,10 @@ public class Launcher { */ static class AppClassLoader extends URLClassLoader { + static { + ClassLoader.registerAsParallelCapable(); + } + public static ClassLoader getAppClassLoader(final ClassLoader extcl) throws IOException { @@ -281,7 +294,7 @@ public class Launcher { /** * Override loadClass so we can checkPackageAccess. */ - public synchronized Class loadClass(String name, boolean resolve) + public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { int i = name.lastIndexOf('.'); diff --git a/src/share/classes/sun/net/httpserver/Request.java b/src/share/classes/sun/net/httpserver/Request.java index 80bc31dc761796039d45e08a4b04f683c3034c1c..542e8e8f52e759fb7ccd16235808a56fe141a6fd 100644 --- a/src/share/classes/sun/net/httpserver/Request.java +++ b/src/share/classes/sun/net/httpserver/Request.java @@ -52,6 +52,9 @@ class Request { os = rawout; do { startLine = readLine(); + if (startLine == null) { + return; + } /* skip blank lines */ } while (startLine == null ? false : startLine.equals ("")); } diff --git a/src/share/classes/sun/net/httpserver/ServerImpl.java b/src/share/classes/sun/net/httpserver/ServerImpl.java index cfff8dd0f6aae03fbad77598dcdeb180bf9840df..8f5c8bee03822a8261bb380dbba043316347dcfc 100644 --- a/src/share/classes/sun/net/httpserver/ServerImpl.java +++ b/src/share/classes/sun/net/httpserver/ServerImpl.java @@ -433,6 +433,7 @@ class ServerImpl implements TimeSource { rawin = sslStreams.getInputStream(); rawout = sslStreams.getOutputStream(); engine = sslStreams.getSSLEngine(); + connection.sslStreams = sslStreams; } else { rawin = new BufferedInputStream( new Request.ReadStream ( @@ -442,6 +443,8 @@ class ServerImpl implements TimeSource { ServerImpl.this, chan ); } + connection.raw = rawin; + connection.rawout = rawout; } Request req = new Request (rawin, rawout); requestLine = req.requestLine(); diff --git a/src/share/classes/sun/net/spi/DefaultProxySelector.java b/src/share/classes/sun/net/spi/DefaultProxySelector.java index a4fd7df23e15ede56b2a2795bb00681e4dc58566..714dc4ce5c3ba133a47825a1a13ab674ead65e63 100644 --- a/src/share/classes/sun/net/spi/DefaultProxySelector.java +++ b/src/share/classes/sun/net/spi/DefaultProxySelector.java @@ -78,7 +78,6 @@ public class DefaultProxySelector extends ProxySelector { }; private static boolean hasSystemProxies = false; - private static Properties defprops = new Properties(); static { final String key = "java.net.useSystemProxies"; @@ -107,6 +106,9 @@ public class DefaultProxySelector extends ProxySelector { RegexpPool hostsPool; String property; + static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null); + static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null); + NonProxyInfo(String p, String s, RegexpPool pool) { property = p; hostsSource = s; @@ -114,8 +116,6 @@ public class DefaultProxySelector extends ProxySelector { } } - private static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null); - private static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null); /** * select() method. Where all the hard work is done. @@ -175,13 +175,13 @@ public class DefaultProxySelector extends ProxySelector { NonProxyInfo pinfo = null; if ("http".equalsIgnoreCase(protocol)) { - pinfo = httpNonProxyInfo; + pinfo = NonProxyInfo.httpNonProxyInfo; } else if ("https".equalsIgnoreCase(protocol)) { // HTTPS uses the same property as HTTP, for backward // compatibility - pinfo = httpNonProxyInfo; + pinfo = NonProxyInfo.httpNonProxyInfo; } else if ("ftp".equalsIgnoreCase(protocol)) { - pinfo = ftpNonProxyInfo; + pinfo = NonProxyInfo.ftpNonProxyInfo; } /** @@ -334,7 +334,6 @@ public class DefaultProxySelector extends ProxySelector { } } - private static final Pattern p6 = Pattern.compile("::1|(0:){7}1|(0:){1,6}:1"); private boolean isLoopback(String host) { if (host == null || host.length() == 0) return false; @@ -364,6 +363,7 @@ public class DefaultProxySelector extends ProxySelector { } if (host.endsWith(":1")) { + final Pattern p6 = Pattern.compile("::1|(0:){7}1|(0:){1,6}:1"); return p6.matcher(host).matches(); } return false; diff --git a/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java b/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java index 2735a5a29cdd2a4024848505cd6167e81fa92e20..180238d841357a42a1cdb6bd3b5cd5d510eb5fe5 100644 --- a/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java +++ b/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java @@ -113,16 +113,16 @@ abstract class AsynchronousFileChannelImpl } } - 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 @@ abstract class AsynchronousFileChannelImpl } /** - * 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 --git a/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java b/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java index b4fcb9c2c30b12ddb0c8979c29d2c744d50f3f26..492319301590ea115c0540502ea56d5e4888b97d 100644 --- a/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java +++ b/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java @@ -37,6 +37,7 @@ import java.util.HashSet; import java.util.Collections; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import sun.net.NetHooks; /** * Base implementation of AsynchronousServerSocketChannel. @@ -131,6 +132,7 @@ abstract class AsynchronousServerSocketChannelImpl synchronized (stateLock) { if (localAddress != null) throw new AlreadyBoundException(); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); Net.listen(fd, backlog < 1 ? 50 : backlog); localAddress = Net.localAddress(fd); diff --git a/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java b/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java index 09637fbae1bd1b93156ee7a81c5005b7a7090aca..84b81a0c8b0bf93f0b0e13826b0259f9e5f3791a 100644 --- a/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java +++ b/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java @@ -38,6 +38,7 @@ import java.util.HashSet; import java.util.Collections; import java.util.concurrent.*; import java.util.concurrent.locks.*; +import sun.net.NetHooks; /** * Base implementation of AsynchronousSocketChannel @@ -387,6 +388,7 @@ abstract class AsynchronousSocketChannelImpl throw new AlreadyBoundException(); InetSocketAddress isa = (local == null) ? new InetSocketAddress(0) : Net.checkAddress(local); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); localAddress = Net.localAddress(fd); } diff --git a/src/share/classes/sun/nio/ch/DatagramChannelImpl.java b/src/share/classes/sun/nio/ch/DatagramChannelImpl.java index e5ec5e0632dfd1fe4aa816f889de2d1b00c7ea9e..57b35c9bc20a120d15f0907a39538f3d4ce16841 100644 --- a/src/share/classes/sun/nio/ch/DatagramChannelImpl.java +++ b/src/share/classes/sun/nio/ch/DatagramChannelImpl.java @@ -313,11 +313,9 @@ class DatagramChannelImpl throw new NullPointerException(); synchronized (readLock) { ensureOpen(); - // If socket is not bound then behave as if nothing received - // Will be fixed by 6621699 - if (localAddress() == null) { - return null; - } + // Socket was not bound before attempting receive + if (localAddress() == null) + bind(null); int n = 0; ByteBuffer bb = null; try { diff --git a/src/share/classes/sun/nio/ch/FileChannelImpl.java b/src/share/classes/sun/nio/ch/FileChannelImpl.java index 1e622e1f4ae94d203d8271ee54908b4ea0acea31..d0461b30b9a7c3517e9d81558f510478068980c7 100644 --- a/src/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/src/share/classes/sun/nio/ch/FileChannelImpl.java @@ -33,8 +33,6 @@ import java.nio.BufferPoolMXBean; 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 @@ public class FileChannelImpl // -- 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); @@ -128,9 +128,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); synchronized (positionLock) { int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -151,9 +152,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); synchronized (positionLock) { long n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -183,9 +185,10 @@ public class FileChannelImpl throw new NonWritableChannelException(); synchronized (positionLock) { int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -206,9 +209,10 @@ public class FileChannelImpl throw new NonWritableChannelException(); synchronized (positionLock) { long n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -239,9 +243,10 @@ public class FileChannelImpl ensureOpen(); synchronized (positionLock) { long p = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return 0; do { @@ -262,9 +267,10 @@ public class FileChannelImpl throw new IllegalArgumentException(); synchronized (positionLock) { long p = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return null; do { @@ -283,9 +289,10 @@ public class FileChannelImpl ensureOpen(); synchronized (positionLock) { long s = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -311,9 +318,10 @@ public class FileChannelImpl synchronized (positionLock) { int rv = -1; long p = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return null; @@ -350,9 +358,10 @@ public class FileChannelImpl public void force(boolean metaData) throws IOException { ensureOpen(); int rv = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return; do { @@ -406,9 +415,10 @@ public class FileChannelImpl return IOStatus.UNSUPPORTED; long n = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -612,9 +622,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); ensureOpen(); int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -637,9 +648,10 @@ public class FileChannelImpl throw new NonWritableChannelException(); ensureOpen(); int n = 0; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return -1; do { @@ -731,9 +743,10 @@ public class FileChannelImpl throw new NonReadableChannelException(); long addr = -1; - int ti = threads.add(); + int ti = -1; try { begin(); + ti = threads.add(); if (!isOpen()) return null; if (size() < position + size) { // Extend file size @@ -899,31 +912,33 @@ public class FileChannelImpl FileLockImpl fli = new FileLockImpl(this, position, size, shared); FileLockTable flt = fileLockTable(); flt.add(fli); - boolean i = true; - int ti = threads.add(); + 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; - } - if (result == FileDispatcher.INTERRUPTED || result == FileDispatcher.NO_LOCK) { - flt.remove(fli); - i = false; + 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; } - } catch (IOException e) { - flt.remove(fli); - throw e; } finally { + if (!completed) + flt.remove(fli); threads.remove(ti); try { - end(i); + end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } @@ -971,7 +986,6 @@ public class FileChannelImpl } void release(FileLockImpl fli) throws IOException { - ensureOpen(); int ti = threads.add(); try { ensureOpen(); @@ -991,7 +1005,7 @@ public class FileChannelImpl */ private static class SimpleFileLockTable extends FileLockTable { // synchronize on list for access - private List<FileLock> lockList = new ArrayList<FileLock>(2); + private final List<FileLock> lockList = new ArrayList<FileLock>(2); public SimpleFileLockTable() { } @@ -1020,14 +1034,11 @@ public class FileChannelImpl } } - public void removeAll(Releaser releaser) throws IOException { + public List<FileLock> removeAll() { synchronized(lockList) { - Iterator<FileLock> i = lockList.iterator(); - while (i.hasNext()) { - FileLock fl = i.next(); - releaser.release(fl); - i.remove(); - } + List<FileLock> result = new ArrayList<FileLock>(lockList); + lockList.clear(); + return result; } } diff --git a/src/share/classes/sun/nio/ch/FileLockImpl.java b/src/share/classes/sun/nio/ch/FileLockImpl.java index 9efd1532b50ab787703266f51a5189ebc5de212e..8f12bcf0fdbd37330b79f049762018703e371beb 100644 --- a/src/share/classes/sun/nio/ch/FileLockImpl.java +++ b/src/share/classes/sun/nio/ch/FileLockImpl.java @@ -31,25 +31,24 @@ import java.nio.channels.*; 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 @@ public class FileLockImpl valid = false; } } - } diff --git a/src/share/classes/sun/nio/ch/FileLockTable.java b/src/share/classes/sun/nio/ch/FileLockTable.java index 137ab88872b050bfeec744d66a5ee4570ec8660a..39cee5abfe8f1063d5f74aa84d02ea3eea82aa77 100644 --- a/src/share/classes/sun/nio/ch/FileLockTable.java +++ b/src/share/classes/sun/nio/ch/FileLockTable.java @@ -60,23 +60,12 @@ abstract class FileLockTable { */ public abstract void remove(FileLock fl); - /** - * An implementation of this interface releases a given file lock. - * Used with removeAll. - */ - public abstract interface Releaser { - void release(FileLock fl) throws IOException; - } - /** * Removes all file locks from the table. - * <p> - * The Releaser#release method is invoked for each file lock before - * it is removed. * - * @throws IOException if the release method throws IOException + * @return The list of file locks removed */ - public abstract void removeAll(Releaser r) throws IOException; + public abstract List<FileLock> removeAll(); /** * Replaces an existing file lock in the table. @@ -195,7 +184,7 @@ class SharedFileLockTable extends FileLockTable { 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 @@ class SharedFileLockTable extends FileLockTable { } @Override - public void removeAll(Releaser releaser) throws IOException { + public List<FileLock> removeAll() { + List<FileLock> result = new ArrayList<FileLock>(); List<FileLockReference> list = lockMap.get(fileKey); if (list != null) { synchronized (list) { @@ -216,13 +206,13 @@ class SharedFileLockTable extends FileLockTable { 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 @@ class SharedFileLockTable extends FileLockTable { removeKeyIfEmpty(fileKey, list); } } + return result; } @Override diff --git a/src/share/classes/sun/nio/ch/SctpMessageInfoImpl.java b/src/share/classes/sun/nio/ch/SctpMessageInfoImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..cc5a064676a0350c17a209456bf44a0e8c101db7 --- /dev/null +++ b/src/share/classes/sun/nio/ch/SctpMessageInfoImpl.java @@ -0,0 +1,170 @@ +/* + * 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 sun.nio.ch; + +import java.net.SocketAddress; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.Association; + +/** + * An implementation of a MessageInfo. + */ +public class SctpMessageInfoImpl extends MessageInfo { + private final SocketAddress address; + private final int bytes; /* 0 */ + + private Association association; + private int assocId; + private int streamNumber; + private boolean complete = true; + private boolean unordered; /* false */ + private long timeToLive; /* 0L */ + private int ppid; /* 0 */ + + public SctpMessageInfoImpl(Association association, + SocketAddress address, + int streamNumber) { + this.association = association; + this.address = address; + this.streamNumber = streamNumber; + bytes = 0; + } + + /* Invoked from native */ + private SctpMessageInfoImpl(int assocId, + SocketAddress address, + int bytes, + int streamNumber, + boolean complete, + boolean unordered, + int ppid) { + this.assocId = assocId; + this.address = address; + this.bytes = bytes; + this.streamNumber = streamNumber; + this.complete = complete; + this.unordered = unordered; + this.ppid = ppid; + } + + @Override + public Association association() { + return association; + } + + /** + * SctpMessageInfoImpl instances created from native will need to have their + * association set from the channel. + */ + void setAssociation(Association association) { + this.association = association; + } + + int associationID() { + return assocId; + } + + @Override + public SocketAddress address() { + return address; + } + + @Override + public int bytes() { + return bytes; + } + + @Override + public int streamNumber() { + return streamNumber; + } + + @Override + public MessageInfo streamNumber(int streamNumber) { + if (streamNumber < 0 || streamNumber > 65536) + throw new IllegalArgumentException("Invalid stream number"); + + this.streamNumber = streamNumber; + return this; + } + + @Override + public int payloadProtocolID() { + return ppid; + } + + @Override + public MessageInfo payloadProtocolID(int ppid) { + this.ppid = ppid; + return this; + } + + @Override + public boolean isComplete() { + return complete; + } + + @Override + public MessageInfo complete(boolean complete) { + this.complete = complete; + return this; + } + + @Override + public boolean isUnordered() { + return unordered; + } + + @Override + public MessageInfo unordered(boolean unordered) { + this.unordered = unordered; + return this; + } + + @Override + public long timeToLive() { + return timeToLive; + } + + @Override + public MessageInfo timeToLive(long millis) { + timeToLive = millis; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(super.toString()); + sb.append( "[Address: ").append(address) + .append(", Association: ").append(association) + .append(", Assoc ID: ").append(assocId) + .append(", Bytes: ").append(bytes) + .append(", Stream Number: ").append(streamNumber) + .append(", Complete: ").append(complete) + .append(", isUnordered: ").append(unordered) + .append("]"); + return sb.toString(); + } +} diff --git a/src/share/classes/sun/nio/ch/SctpStdSocketOption.java b/src/share/classes/sun/nio/ch/SctpStdSocketOption.java new file mode 100644 index 0000000000000000000000000000000000000000..34f917a53fe0e43f71a3450c9a2556a4091520e1 --- /dev/null +++ b/src/share/classes/sun/nio/ch/SctpStdSocketOption.java @@ -0,0 +1,76 @@ +/* + * 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 sun.nio.ch; + +import com.sun.nio.sctp.SctpSocketOption; + +public class SctpStdSocketOption<T> + implements SctpSocketOption<T> +{ + /* for native mapping of int options */ + public static final int SCTP_DISABLE_FRAGMENTS = 1; + public static final int SCTP_EXPLICIT_COMPLETE = 2; + public static final int SCTP_FRAGMENT_INTERLEAVE = 3; + public static final int SCTP_NODELAY = 4; + public static final int SO_SNDBUF = 5; + public static final int SO_RCVBUF = 6; + public static final int SO_LINGER = 7; + + private final String name; + private final Class<T> type; + + /* for native mapping of int options */ + private int constValue; + + public SctpStdSocketOption(String name, Class<T> type) { + this.name = name; + this.type = type; + } + + public SctpStdSocketOption(String name, Class<T> type, int constValue) { + this.name = name; + this.type = type; + this.constValue = constValue; + } + + @Override + public String name() { + return name; + } + + @Override + public Class<T> type() { + return type; + } + + @Override + public String toString() { + return name; + } + + int constValue() { + return constValue; + } +} diff --git a/src/share/classes/sun/nio/ch/SelChImpl.java b/src/share/classes/sun/nio/ch/SelChImpl.java index 0ef4d357f8d1be3f05cb8bad40e0eeb0bf6ac18e..fb1571d84d2039ddf2e82ac428c28c76beb4e882 100644 --- a/src/share/classes/sun/nio/ch/SelChImpl.java +++ b/src/share/classes/sun/nio/ch/SelChImpl.java @@ -25,6 +25,7 @@ package sun.nio.ch; +import java.nio.channels.Channel; import java.io.FileDescriptor; import java.io.IOException; @@ -35,7 +36,7 @@ import java.io.IOException; * @since 1.4 */ -interface SelChImpl { +interface SelChImpl extends Channel { FileDescriptor getFD(); diff --git a/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java b/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java index d509198aee203ee3318f1328bbe068abfd822b67..0b0e4b6aee24f0d7473d2c49c609ab8e6fbddaff 100644 --- a/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java +++ b/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java @@ -31,6 +31,7 @@ import java.net.*; import java.nio.channels.*; import java.nio.channels.spi.*; import java.util.*; +import sun.net.NetHooks; /** @@ -191,6 +192,7 @@ class ServerSocketChannelImpl SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkListen(isa.getPort()); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); Net.listen(fd, backlog < 1 ? 50 : backlog); synchronized (stateLock) { diff --git a/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java b/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java index 52fe5a2802f18aca761735535aa0b1e79a2c1ecf..fb82f330be457dc0030b7b4b0cd984f21d3af38e 100644 --- a/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java +++ b/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java @@ -97,6 +97,9 @@ public class SimpleAsynchronousFileChannelImpl // 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 @@ public class SimpleAsynchronousFileChannelImpl closeLock.writeLock().unlock(); } - // Invalidate and release any locks that we still hold - invalidateAllLocks(); - // close file nd.close(fdObj); @@ -226,11 +226,9 @@ public class SimpleAsynchronousFileChannelImpl 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 @@ public class SimpleAsynchronousFileChannelImpl 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 @@ public class SimpleAsynchronousFileChannelImpl } @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 --git a/src/share/classes/sun/nio/ch/SocketChannelImpl.java b/src/share/classes/sun/nio/ch/SocketChannelImpl.java index 20944774d4ee58e06c5f5441a828701abf15b893..ec4f8f5754b05fdb431c67b936e2e88cbf7785a0 100644 --- a/src/share/classes/sun/nio/ch/SocketChannelImpl.java +++ b/src/share/classes/sun/nio/ch/SocketChannelImpl.java @@ -32,6 +32,7 @@ import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.channels.spi.*; import java.util.*; +import sun.net.NetHooks; /** @@ -526,6 +527,7 @@ class SocketChannelImpl throw new AlreadyBoundException(); InetSocketAddress isa = (local == null) ? new InetSocketAddress(0) : Net.checkAddress(local); + NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort()); localAddress = Net.localAddress(fd); } @@ -577,6 +579,12 @@ class SocketChannelImpl if (!isOpen()) { return false; } + // notify hook only if unbound + if (localAddress == null) { + NetHooks.beforeTcpConnect(fd, + isa.getAddress(), + isa.getPort()); + } readerThread = NativeThread.current(); } for (;;) { diff --git a/src/share/classes/sun/security/jca/ProviderConfig.java b/src/share/classes/sun/security/jca/ProviderConfig.java index 9b40307b1668cdcfd7a1393cd312c4605b618e40..576c68032049fd6ea4fe9a5d14de15dfac57a66f 100644 --- a/src/share/classes/sun/security/jca/ProviderConfig.java +++ b/src/share/classes/sun/security/jca/ProviderConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -60,37 +60,6 @@ final class ProviderConfig { // use by doLoadProvider() private final static Class[] CL_STRING = { String.class }; - // lock to use while loading a provider. it ensures that each provider - // is loaded only once and that we can detect recursion. - // NOTE that because of 4944382 we use the system classloader as lock. - // By using the same lock to load classes as to load providers we avoid - // deadlock due to lock ordering. However, this class may be initialized - // early in the startup when the system classloader has not yet been set - // up. Use a temporary lock object if that is the case. - // Any of this may break if the class loading implementation is changed. - private static volatile Object LOCK = new Object(); - - private static Object getLock() { - Object o = LOCK; - // check if lock is already set to the class loader - if (o instanceof ClassLoader) { - return o; - } - Object cl = AccessController.doPrivileged( - new PrivilegedAction<Object>() { - public Object run() { - return ClassLoader.getSystemClassLoader(); - } - }); - // check if class loader initialized now (non-null) - if (cl != null) { - LOCK = cl; - o = cl; - } - return o; - } - - // name of the provider class private final String className; @@ -194,7 +163,7 @@ final class ProviderConfig { /** * Get the provider object. Loads the provider if it is not already loaded. */ - Provider getProvider() { + synchronized Provider getProvider() { // volatile variable load Provider p = provider; if (p != null) { @@ -203,30 +172,23 @@ final class ProviderConfig { if (shouldLoad() == false) { return null; } - synchronized (getLock()) { - p = provider; - if (p != null) { - // loaded by another thread while we were blocked on lock - return p; - } - if (isLoading) { - // because this method is synchronized, this can only - // happen if there is recursion. - if (debug != null) { - debug.println("Recursion loading provider: " + this); - new Exception("Call trace").printStackTrace(); - } - return null; + if (isLoading) { + // because this method is synchronized, this can only + // happen if there is recursion. + if (debug != null) { + debug.println("Recursion loading provider: " + this); + new Exception("Call trace").printStackTrace(); } - try { - isLoading = true; - tries++; - p = doLoadProvider(); - } finally { - isLoading = false; - } - provider = p; + return null; + } + try { + isLoading = true; + tries++; + p = doLoadProvider(); + } finally { + isLoading = false; } + provider = p; return p; } diff --git a/src/share/classes/sun/security/krb5/Config.java b/src/share/classes/sun/security/krb5/Config.java index 07c78e2959ab26cb41497485c5e209645519ea41..e036776f53e1c964c6e164f1355dd1e48a57ba3a 100644 --- a/src/share/classes/sun/security/krb5/Config.java +++ b/src/share/classes/sun/security/krb5/Config.java @@ -736,6 +736,14 @@ public class Config { 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 @@ public class Config { 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 @@ public class Config { } 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 @@ public class Config { } } + @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 --git a/src/share/classes/sun/security/krb5/KrbKdcReq.java b/src/share/classes/sun/security/krb5/KrbKdcReq.java index e9ff9cc04d5fe9f7e3aba44bc337fb71b84d4e51..259aedd66fa35a848e221a065ba54cdb1b53991a 100644 --- a/src/share/classes/sun/security/krb5/KrbKdcReq.java +++ b/src/share/classes/sun/security/krb5/KrbKdcReq.java @@ -274,27 +274,31 @@ public abstract class KrbKdcReq { + ",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); - } - if (i == DEFAULT_KDC_RETRY_LIMIT) { - ibuf = null; - throw se; + /* + * 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; + } } + } finally { + kdcClient.close(); } } } diff --git a/src/share/classes/sun/security/krb5/internal/UDPClient.java b/src/share/classes/sun/security/krb5/internal/UDPClient.java index c9e440f1ef7e1ef3915b3974eed3eb1a1c0b4e53..670df9210df2dd002ef97f9d1a01e9b47cb2d58e 100644 --- a/src/share/classes/sun/security/krb5/internal/UDPClient.java +++ b/src/share/classes/sun/security/krb5/internal/UDPClient.java @@ -93,4 +93,7 @@ public class UDPClient { return data; } + public void close() { + dgSocket.close(); + } } diff --git a/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java b/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java index 701e104d52942f54247a6be9b319c21dde4e1133..1027df9ddb77b174d3e76652e4acb8fa6047b513 100644 --- a/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java +++ b/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java @@ -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 static sun.security.pkcs11.TemplateManager.*; 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 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("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 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("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 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("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 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ final class P11KeyPairGenerator extends KeyPairGeneratorSpi { ("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 --git a/src/share/classes/sun/security/pkcs11/P11KeyStore.java b/src/share/classes/sun/security/pkcs11/P11KeyStore.java index 839a2f3ba64bcc02ca5411012843e78cf15e290a..b0e20711dc8907eb64a6c2797361a34e895b5645 100644 --- a/src/share/classes/sun/security/pkcs11/P11KeyStore.java +++ b/src/share/classes/sun/security/pkcs11/P11KeyStore.java @@ -80,6 +80,8 @@ import static sun.security.pkcs11.P11Util.*; 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 @@ final class P11KeyStore extends KeyStoreSpi { 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 --git a/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java b/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java index 5f3cbbf93c9eac09928339f8f317c008c6dda188..1bd764d326eb06f660ecb7c64887f9535627d93e 100644 --- a/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java +++ b/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java @@ -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 static sun.security.pkcs11.TemplateManager.*; import sun.security.pkcs11.wrapper.*; import static sun.security.pkcs11.wrapper.PKCS11Constants.*; +import sun.security.rsa.RSAKeyFactory; + /** * RSA KeyFactory implemenation. * @@ -131,6 +133,9 @@ final class P11RSAKeyFactory extends P11KeyFactory { } 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 @@ final class P11RSAKeyFactory extends P11KeyFactory { } 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 @@ final class P11RSAKeyFactory extends P11KeyFactory { } 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 @@ final class P11RSAKeyFactory extends P11KeyFactory { 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 --git a/src/share/classes/sun/security/pkcs11/SunPKCS11.java b/src/share/classes/sun/security/pkcs11/SunPKCS11.java index b6eb1c258f457342f8a8dc3819f1d6ca79d03172..6d0e045f2ee811256082a798714ce4ec67b3af71 100644 --- a/src/share/classes/sun/security/pkcs11/SunPKCS11.java +++ b/src/share/classes/sun/security/pkcs11/SunPKCS11.java @@ -120,11 +120,13 @@ public final class SunPKCS11 extends AuthProvider { } /** - * @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 @@ public final class SunPKCS11 extends AuthProvider { // // 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 @@ public final class SunPKCS11 extends AuthProvider { 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 @@ public final class SunPKCS11 extends AuthProvider { 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 @@ public final class SunPKCS11 extends AuthProvider { + ": 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 @@ public final class SunPKCS11 extends AuthProvider { 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 @@ public final class SunPKCS11 extends AuthProvider { } 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 @@ public final class SunPKCS11 extends AuthProvider { 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 @@ public final class SunPKCS11 extends AuthProvider { 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 @@ public final class SunPKCS11 extends AuthProvider { 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 @@ public final class SunPKCS11 extends AuthProvider { 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<Descriptor,Integer> supportedAlgs = new HashMap<Descriptor,Integer>(); for (int i = 0; i < supportedMechanisms.length; i++) { @@ -807,6 +837,9 @@ public final class SunPKCS11 extends AuthProvider { 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 --git a/src/share/classes/sun/security/rsa/RSAKeyFactory.java b/src/share/classes/sun/security/rsa/RSAKeyFactory.java index 17ce8cde639f89695dd00257c853aad3503129c5..d877f28fb54b12c20cc81955d6d831b031806cda 100644 --- a/src/share/classes/sun/security/rsa/RSAKeyFactory.java +++ b/src/share/classes/sun/security/rsa/RSAKeyFactory.java @@ -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.*; 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 @@ public final class RSAKeyFactory extends KeyFactorySpi { 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 @@ public final class RSAKeyFactory extends KeyFactorySpi { } /** - * 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 --git a/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java b/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java index f800dec543b4292485cb1be978176a354da9d133..2898a3d1f51fddbb91ae4ada09726a3eea4f6b73 100644 --- a/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java +++ b/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java @@ -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 final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // 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 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // 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"); - } - 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"); + + // 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()); } + this.keySize = keySize; this.random = random; this.publicExponent = RSAKeyGenParameterSpec.F4; @@ -77,35 +78,41 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // 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 --git a/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java b/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java index ac296b49f60cd2adc33b3506d488763595596ddc..640972a2495f9ee08a6ace69713a6a6230a2d129 100644 --- a/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java +++ b/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java @@ -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 @@ public final class RSAPrivateCrtKeyImpl */ RSAPrivateCrtKeyImpl(byte[] encoded) throws InvalidKeyException { decode(encoded); - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); } /** @@ -107,7 +107,8 @@ public final class RSAPrivateCrtKeyImpl this.pe = pe; this.qe = qe; this.coeff = coeff; - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); + // generate the encoding algid = rsaId; try { diff --git a/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java b/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java index 1f883f4205d901bab2045997f5343360d315ec13..860e7706bc9ae529b71db08ae4bc89537ea0bc12 100644 --- a/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java +++ b/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java @@ -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 @@ public final class RSAPrivateKeyImpl extends PKCS8Key implements RSAPrivateKey { 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 --git a/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java b/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java index c500ca2dee47a2c16a48d5c9fc646f624e062a40..6db08f6a3936a08a7db2b6b56a67d944d4473683 100644 --- a/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java +++ b/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java @@ -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 @@ public final class RSAPublicKeyImpl extends X509Key implements RSAPublicKey { * 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 final class RSAPublicKeyImpl extends X509Key implements RSAPublicKey { */ public RSAPublicKeyImpl(byte[] encoded) throws InvalidKeyException { decode(encoded); - RSAKeyFactory.checkKeyLength(n); + RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e); } // see JCA doc diff --git a/src/share/classes/sun/security/tools/JarSigner.java b/src/share/classes/sun/security/tools/JarSigner.java index d8d1ee3d517ed82506a339145f1a61d4347ac3b4..2de2e52b08a64dd80e4ecbe58bd684fd87642664 100644 --- a/src/share/classes/sun/security/tools/JarSigner.java +++ b/src/share/classes/sun/security/tools/JarSigner.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -32,28 +32,44 @@ import java.util.jar.*; import java.math.BigInteger; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.SocketTimeoutException; import java.text.Collator; import java.text.MessageFormat; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.security.cert.CertificateException; -import java.security.cert.CertificateExpiredException; -import java.security.cert.CertificateNotYetValidException; import java.security.*; import java.lang.reflect.Constructor; import com.sun.jarsigner.ContentSigner; import com.sun.jarsigner.ContentSignerParameters; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLClassLoader; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertificateExpiredException; +import java.security.cert.CertificateFactory; +import java.security.cert.CertificateNotYetValidException; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.util.Map.Entry; import sun.security.x509.*; import sun.security.util.*; import sun.misc.BASE64Encoder; + /** * <p>The jarsigner utility. * + * The exit codes for the main method are: + * + * 0: success + * 1: any error that the jar cannot be signed or verified, including: + * keystore loading error + * TSP communciation error + * jarsigner command line error... + * otherwise: error codes from -strict + * * @author Roland Schemers * @author Jan Luehe */ @@ -84,8 +100,6 @@ public class JarSigner { // Attention: // This is the entry that get launched by the security tool jarsigner. - // It's marked as exported private per AppServer Team's request. - // See http://ccc.sfbay/6428446 public static void main(String args[]) throws Exception { JarSigner js = new JarSigner(); js.run(args); @@ -93,31 +107,32 @@ public class JarSigner { static final String VERSION = "1.0"; - static final int IN_KEYSTORE = 0x01; + static final int IN_KEYSTORE = 0x01; // signer is in keystore static final int IN_SCOPE = 0x02; + static final int NOT_ALIAS = 0x04; // alias list is NOT empty and + // signer is not in alias list + static final int SIGNED_BY_ALIAS = 0x08; // signer is in alias list - // signer's certificate chain (when composing) - X509Certificate[] certChain; - - /* - * private key - */ - PrivateKey privateKey; - KeyStore store; + X509Certificate[] certChain; // signer's cert chain (when composing) + PrivateKey privateKey; // private key + KeyStore store; // the keystore specified by -keystore + // or the default keystore, never null IdentityScope scope; String keystore; // key store file boolean nullStream = false; // null keystore input stream (NONE) boolean token = false; // token-based keystore - String jarfile; // jar file to sign + String jarfile; // jar file to sign or verify String alias; // alias to sign jar with + List<String> ckaliases = new ArrayList<String>(); // aliases in -verify char[] storepass; // keystore password boolean protectedPath; // protected authentication path String storetype; // keystore type String providerName; // provider name Vector<String> providers = null; // list of providers - HashMap<String,String> providerArgs = new HashMap<String, String>(); // arguments for provider constructors + // arguments for provider constructors + HashMap<String,String> providerArgs = new HashMap<String, String>(); char[] keypass; // private key password String sigfile; // name of .SF file String sigalg; // name of signature algorithm @@ -125,12 +140,14 @@ public class JarSigner { String signedjar; // output filename String tsaUrl; // location of the Timestamping Authority String tsaAlias; // alias for the Timestamping Authority's certificate + String altCertChain; // file to read alternative cert chain from boolean verify = false; // verify the jar - boolean verbose = false; // verbose output when signing/verifying + String verbose = null; // verbose output when signing/verifying boolean showcerts = false; // show certs when verifying boolean debug = false; // debug boolean signManifest = true; // "sign" the whole manifest boolean externalSF = true; // leave the .SF out of the PKCS7 block + boolean strict = false; // treat warnings as error // read zip entry raw bytes private ByteArrayOutputStream baos = new ByteArrayOutputStream(2048); @@ -139,14 +156,22 @@ public class JarSigner { private String altSignerClass = null; private String altSignerClasspath = null; private ZipFile zipFile = null; + private boolean hasExpiredCert = false; private boolean hasExpiringCert = false; private boolean notYetValidCert = false; - + private boolean chainNotValidated = false; + private boolean notSignedByAlias = false; + private boolean aliasNotInStore = false; + private boolean hasUnsignedEntry = false; private boolean badKeyUsage = false; private boolean badExtendedKeyUsage = false; private boolean badNetscapeCertType = false; + CertificateFactory certificateFactory; + CertPathValidator validator; + PKIXParameters pkixParameters; + public void run(String args[]) { try { parseArgs(args); @@ -184,14 +209,6 @@ public class JarSigner { } } - hasExpiredCert = false; - hasExpiringCert = false; - notYetValidCert = false; - - badKeyUsage = false; - badExtendedKeyUsage = false; - badNetscapeCertType = false; - if (verify) { try { loadKeyStore(keystore, false); @@ -238,6 +255,29 @@ public class JarSigner { storepass = null; } } + + if (strict) { + int exitCode = 0; + if (hasExpiringCert) { + exitCode |= 2; + } + if (chainNotValidated) { + // hasExpiredCert and notYetValidCert included in this case + exitCode |= 4; + } + if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType) { + exitCode |= 8; + } + if (hasUnsignedEntry) { + exitCode |= 16; + } + if (notSignedByAlias || aliasNotInStore) { + exitCode |= 32; + } + if (exitCode != 0) { + System.exit(exitCode); + } + } } /* @@ -247,25 +287,26 @@ public class JarSigner { /* parse flags */ int n = 0; - for (n=0; (n < args.length) && args[n].startsWith("-"); n++) { + if (args.length == 0) fullusage(); + for (n=0; n < args.length; n++) { String flags = args[n]; if (collator.compare(flags, "-keystore") == 0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); keystore = args[n]; } else if (collator.compare(flags, "-storepass") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); storepass = args[n].toCharArray(); } else if (collator.compare(flags, "-storetype") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); storetype = args[n]; } else if (collator.compare(flags, "-providerName") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); providerName = args[n]; } else if ((collator.compare(flags, "-provider") == 0) || (collator.compare(flags, "-providerClass") == 0)) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); if (providers == null) { providers = new Vector<String>(3); } @@ -274,35 +315,38 @@ public class JarSigner { if (args.length > (n+1)) { flags = args[n+1]; if (collator.compare(flags, "-providerArg") == 0) { - if (args.length == (n+2)) usage(); + if (args.length == (n+2)) usageNoArg(); providerArgs.put(args[n], args[n+2]); n += 2; } } } else if (collator.compare(flags, "-protected") ==0) { protectedPath = true; + } else if (collator.compare(flags, "-certchain") ==0) { + if (++n == args.length) usageNoArg(); + altCertChain = args[n]; } else if (collator.compare(flags, "-debug") ==0) { debug = true; } else if (collator.compare(flags, "-keypass") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); keypass = args[n].toCharArray(); } else if (collator.compare(flags, "-sigfile") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); sigfile = args[n]; } else if (collator.compare(flags, "-signedjar") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); signedjar = args[n]; } else if (collator.compare(flags, "-tsa") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); tsaUrl = args[n]; } else if (collator.compare(flags, "-tsacert") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); tsaAlias = args[n]; } else if (collator.compare(flags, "-altsigner") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); altSignerClass = args[n]; } else if (collator.compare(flags, "-altsignerpath") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); altSignerClasspath = args[n]; } else if (collator.compare(flags, "-sectionsonly") ==0) { signManifest = false; @@ -311,30 +355,56 @@ public class JarSigner { } else if (collator.compare(flags, "-verify") ==0) { verify = true; } else if (collator.compare(flags, "-verbose") ==0) { - verbose = true; + verbose = "all"; + } else if (collator.compare(flags, "-verbose:all") ==0) { + verbose = "all"; + } else if (collator.compare(flags, "-verbose:summary") ==0) { + verbose = "summary"; + } else if (collator.compare(flags, "-verbose:grouped") ==0) { + verbose = "grouped"; } else if (collator.compare(flags, "-sigalg") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); sigalg = args[n]; } else if (collator.compare(flags, "-digestalg") ==0) { - if (++n == args.length) usage(); + if (++n == args.length) usageNoArg(); digestalg = args[n]; } else if (collator.compare(flags, "-certs") ==0) { showcerts = true; + } else if (collator.compare(flags, "-strict") ==0) { + strict = true; } else if (collator.compare(flags, "-h") == 0 || collator.compare(flags, "-help") == 0) { - usage(); + fullusage(); } else { - System.err.println(rb.getString("Illegal option: ") + flags); - usage(); + if (!flags.startsWith("-")) { + if (jarfile == null) { + jarfile = flags; + } else { + alias = flags; + ckaliases.add(alias); + } + } else { + System.err.println( + rb.getString("Illegal option: ") + flags); + usage(); + } } } - if (n == args.length) usage(); - jarfile = args[n++]; + // -certs must always be specified with -verbose + if (verbose == null) showcerts = false; - if (!verify) { - if (n == args.length) usage(); - alias = args[n++]; + if (jarfile == null) { + System.err.println(rb.getString("Please specify jarfile name")); + usage(); + } + if (!verify && alias == null) { + System.err.println(rb.getString("Please specify alias name")); + usage(); + } + if (!verify && ckaliases.size() > 1) { + System.err.println(rb.getString("Only one alias can be specified")); + usage(); } if (storetype == null) { @@ -357,7 +427,6 @@ public class JarSigner { if (token && !nullStream) { System.err.println(MessageFormat.format(rb.getString ("-keystore must be NONE if -storetype is {0}"), storetype)); - System.err.println(); usage(); } @@ -365,7 +434,6 @@ public class JarSigner { System.err.println(MessageFormat.format(rb.getString ("-keypass can not be specified " + "if -storetype is {0}"), storetype)); - System.err.println(); usage(); } @@ -374,7 +442,6 @@ public class JarSigner { System.err.println(rb.getString ("If -protected is specified, " + "then -storepass and -keypass must not be specified")); - System.err.println(); usage(); } } @@ -383,17 +450,27 @@ public class JarSigner { System.err.println(rb.getString ("If keystore is not password protected, " + "then -storepass and -keypass must not be specified")); - System.err.println(); usage(); } } } + void usageNoArg() { + System.out.println(rb.getString("Option lacks argument")); + usage(); + } + void usage() { + System.out.println(); + System.out.println(rb.getString("Please type jarsigner -help for usage")); + System.exit(1); + } + + void fullusage() { System.out.println(rb.getString ("Usage: jarsigner [options] jar-file alias")); System.out.println(rb.getString - (" jarsigner -verify [options] jar-file")); + (" jarsigner -verify [options] jar-file [alias...]")); System.out.println(); System.out.println(rb.getString ("[-keystore <url>] keystore location")); @@ -407,6 +484,9 @@ public class JarSigner { System.out.println(rb.getString ("[-keypass <password>] password for private key (if different)")); System.out.println(); + System.out.println(rb.getString + ("[-certchain <file>] name of alternative certchain file")); + System.out.println(); System.out.println(rb.getString ("[-sigfile <file>] name of .SF/.DSA file")); System.out.println(); @@ -423,7 +503,9 @@ public class JarSigner { ("[-verify] verify a signed JAR file")); System.out.println(); System.out.println(rb.getString - ("[-verbose] verbose output when signing/verifying")); + ("[-verbose[:suboptions]] verbose output when signing/verifying.")); + System.out.println(rb.getString + (" suboptions can be all, grouped or summary")); System.out.println(); System.out.println(rb.getString ("[-certs] display certificates when verbose and verifying")); @@ -457,15 +539,17 @@ public class JarSigner { System.out.println(rb.getString (" [-providerArg <arg>]] ... master class file and constructor argument")); System.out.println(); + System.out.println(rb.getString + ("[-strict] treat warnings as errors")); + System.out.println(); - System.exit(1); + System.exit(0); } void verifyJar(String jarName) throws Exception { - boolean anySigned = false; - boolean hasUnsignedEntry = false; + boolean anySigned = false; // if there exists entry inside jar signed JarFile jf = null; try { @@ -494,11 +578,18 @@ public class JarSigner { Manifest man = jf.getManifest(); + // The map to record display info, only used when -verbose provided + // key: signer info string + // value: the list of files with common key + Map<String,List<String>> output = + new LinkedHashMap<String,List<String>>(); + if (man != null) { - if (verbose) System.out.println(); + if (verbose != null) System.out.println(); Enumeration<JarEntry> e = entriesVec.elements(); long now = System.currentTimeMillis(); + String tab = rb.getString(" "); while (e.hasMoreElements()) { JarEntry je = e.nextElement(); @@ -509,77 +600,118 @@ public class JarSigner { hasUnsignedEntry |= !je.isDirectory() && !isSigned && !signatureRelated(name); - if (verbose) { - int inStoreOrScope = inKeyStore(signers); - boolean inStore = (inStoreOrScope & IN_KEYSTORE) != 0; - boolean inScope = (inStoreOrScope & IN_SCOPE) != 0; + int inStoreOrScope = inKeyStore(signers); + + boolean inStore = (inStoreOrScope & IN_KEYSTORE) != 0; + boolean inScope = (inStoreOrScope & IN_SCOPE) != 0; + + notSignedByAlias |= (inStoreOrScope & NOT_ALIAS) != 0; + aliasNotInStore |= isSigned && (!inStore && !inScope); + + // Only used when -verbose provided + StringBuffer sb = null; + if (verbose != null) { + sb = new StringBuffer(); boolean inManifest = ((man.getAttributes(name) != null) || (man.getAttributes("./"+name) != null) || (man.getAttributes("/"+name) != null)); - System.out.print( + sb.append( (isSigned ? rb.getString("s") : rb.getString(" ")) + (inManifest ? rb.getString("m") : rb.getString(" ")) + (inStore ? rb.getString("k") : rb.getString(" ")) + (inScope ? rb.getString("i") : rb.getString(" ")) + - rb.getString(" ")); - StringBuffer sb = new StringBuffer(); + ((inStoreOrScope & NOT_ALIAS) != 0 ?"X":" ") + + rb.getString(" ")); + sb.append("|"); + } + + // When -certs provided, display info has extra empty + // lines at the beginning and end. + if (isSigned) { + if (showcerts) sb.append('\n'); + for (CodeSigner signer: signers) { + // signerInfo() must be called even if -verbose + // not provided. The method updates various + // warning flags. + String si = signerInfo(signer, tab, now); + if (showcerts) { + sb.append(si); + sb.append('\n'); + } + } + } else if (showcerts && !verbose.equals("all")) { + // Print no info for unsigned entries when -verbose:all, + // to be consistent with old behavior. + if (signatureRelated(name)) { + sb.append("\n" + tab + rb.getString( + "(Signature related entries)") + "\n\n"); + } else { + sb.append("\n" + tab + rb.getString( + "(Unsigned entries)") + "\n\n"); + } + } + + if (verbose != null) { + String label = sb.toString(); + if (signatureRelated(name)) { + // Entries inside META-INF and other unsigned + // entries are grouped separately. + label = "-" + label.substring(1); + } + + // The label finally contains 2 parts separated by '|': + // The legend displayed before the entry names, and + // the cert info (if -certs specfied). + + if (!output.containsKey(label)) { + output.put(label, new ArrayList<String>()); + } + + StringBuffer fb = new StringBuffer(); String s = Long.toString(je.getSize()); for (int i = 6 - s.length(); i > 0; --i) { - sb.append(' '); - } - sb.append(s).append(' '). - append(new Date(je.getTime()).toString()); - sb.append(' ').append(je.getName()); - System.out.println(sb.toString()); - - if (signers != null && showcerts) { - String tab = rb.getString(" "); - for (int i = 0; i < signers.length; i++) { - System.out.println(); - List<? extends Certificate> certs = - signers[i].getSignerCertPath() - .getCertificates(); - // display the signature timestamp, if present - Timestamp timestamp = signers[i].getTimestamp(); - if (timestamp != null) { - System.out.println( - printTimestamp(tab, timestamp)); - } - // display the certificate(s) - for (Certificate c : certs) { - System.out.println( - printCert(tab, c, true, now)); - } - } - System.out.println(); + fb.append(' '); } + fb.append(s).append(' '). + append(new Date(je.getTime()).toString()); + fb.append(' ').append(name); + output.get(label).add(fb.toString()); } - if (isSigned) { - for (int i = 0; i < signers.length; i++) { - Certificate cert = - signers[i].getSignerCertPath() - .getCertificates().get(0); - if (cert instanceof X509Certificate) { - checkCertUsage((X509Certificate)cert, null); - if (!showcerts) { - long notAfter = ((X509Certificate)cert) - .getNotAfter().getTime(); - - if (notAfter < now) { - hasExpiredCert = true; - } else if (notAfter < now + SIX_MONTHS) { - hasExpiringCert = true; - } - } + } + } + if (verbose != null) { + for (Entry<String,List<String>> s: output.entrySet()) { + List<String> files = s.getValue(); + String key = s.getKey(); + if (key.charAt(0) == '-') { // the signature-related group + key = ' ' + key.substring(1); + } + int pipe = key.indexOf('|'); + if (verbose.equals("all")) { + for (String f: files) { + System.out.println(key.substring(0, pipe) + f); + System.out.printf(key.substring(pipe+1)); + } + } else { + if (verbose.equals("grouped")) { + for (String f: files) { + System.out.println(key.substring(0, pipe) + f); + } + } else if (verbose.equals("summary")) { + System.out.print(key.substring(0, pipe)); + if (files.size() > 1) { + System.out.println(files.get(0) + " " + + String.format(rb.getString( + "(and %d more)"), files.size()-1)); + } else { + System.out.println(files.get(0)); } } + System.out.printf(key.substring(pipe+1)); } - } - } - if (verbose) { System.out.println(); System.out.println(rb.getString( " s = signature was verified ")); @@ -589,9 +721,12 @@ public class JarSigner { " k = at least one certificate was found in keystore")); System.out.println(rb.getString( " i = at least one certificate was found in identity scope")); + if (ckaliases.size() > 0) { + System.out.println(( + " X = not signed by specified alias(es)")); + } System.out.println(); } - if (man == null) System.out.println(rb.getString("no manifest.")); @@ -602,7 +737,8 @@ public class JarSigner { System.out.println(rb.getString("jar verified.")); if (hasUnsignedEntry || hasExpiredCert || hasExpiringCert || badKeyUsage || badExtendedKeyUsage || badNetscapeCertType || - notYetValidCert) { + notYetValidCert || chainNotValidated || + aliasNotInStore || notSignedByAlias) { System.out.println(); System.out.println(rb.getString("Warning: ")); @@ -638,14 +774,27 @@ public class JarSigner { "This jar contains entries whose signer certificate is not yet valid. ")); } - if (! (verbose && showcerts)) { + if (chainNotValidated) { + System.out.println( + rb.getString("This jar contains entries whose certificate chain is not validated.")); + } + + if (notSignedByAlias) { + System.out.println( + rb.getString("This jar contains signed entries which is not signed by the specified alias(es).")); + } + + if (aliasNotInStore) { + System.out.println(rb.getString("This jar contains signed entries that's not signed by alias in this keystore.")); + } + if (! (verbose != null && showcerts)) { System.out.println(); System.out.println(rb.getString( "Re-run with the -verbose and -certs options for more details.")); } } } - System.exit(0); + return; } catch (Exception e) { System.out.println(rb.getString("jarsigner: ") + e); if (debug) { @@ -660,15 +809,6 @@ public class JarSigner { System.exit(1); } - /* - * Display some details about a certificate: - * - * <cert-type> [", " <subject-DN>] [" (" <keystore-entry-alias> ")"] - */ - String printCert(Certificate c) { - return printCert("", c, false, 0); - } - private static MessageFormat validityTimeForm = null; private static MessageFormat notYetTimeForm = null; private static MessageFormat expiredTimeForm = null; @@ -679,6 +819,8 @@ public class JarSigner { * * [<tab>] <cert-type> [", " <subject-DN>] [" (" <keystore-entry-alias> ")"] * [<validity-period> | <expiry-warning>] + * + * Note: no newline character at the end */ String printCert(String tab, Certificate c, boolean checkValidityPeriod, long now) { @@ -788,54 +930,75 @@ public class JarSigner { .append(signTimeForm.format(source)).append("]").toString(); } + private Map<CodeSigner,Integer> cacheForInKS = + new IdentityHashMap<CodeSigner,Integer>(); + + private int inKeyStoreForOneSigner(CodeSigner signer) { + if (cacheForInKS.containsKey(signer)) { + return cacheForInKS.get(signer); + } + + boolean found = false; + int result = 0; + List<? extends Certificate> certs = signer.getSignerCertPath().getCertificates(); + for (Certificate c : certs) { + String alias = storeHash.get(c); + if (alias != null) { + if (alias.startsWith("(")) { + result |= IN_KEYSTORE; + } else if (alias.startsWith("[")) { + result |= IN_SCOPE; + } + if (ckaliases.contains(alias.substring(1, alias.length() - 1))) { + result |= SIGNED_BY_ALIAS; + } + } else { + if (store != null) { + try { + alias = store.getCertificateAlias(c); + } catch (KeyStoreException kse) { + // never happens, because keystore has been loaded + } + if (alias != null) { + storeHash.put(c, "(" + alias + ")"); + found = true; + result |= IN_KEYSTORE; + } + } + if (!found && (scope != null)) { + Identity id = scope.getIdentity(c.getPublicKey()); + if (id != null) { + result |= IN_SCOPE; + storeHash.put(c, "[" + id.getName() + "]"); + } + } + if (ckaliases.contains(alias)) { + result |= SIGNED_BY_ALIAS; + } + } + } + cacheForInKS.put(signer, result); + return result; + } + Hashtable<Certificate, String> storeHash = new Hashtable<Certificate, String>(); int inKeyStore(CodeSigner[] signers) { - int result = 0; if (signers == null) return 0; - boolean found = false; - - for (int i = 0; i < signers.length; i++) { - found = false; - List<? extends Certificate> certs = - signers[i].getSignerCertPath().getCertificates(); + int output = 0; - for (Certificate c : certs) { - String alias = storeHash.get(c); - - if (alias != null) { - if (alias.startsWith("(")) - result |= IN_KEYSTORE; - else if (alias.startsWith("[")) - result |= IN_SCOPE; - } else { - if (store != null) { - try { - alias = store.getCertificateAlias(c); - } catch (KeyStoreException kse) { - // never happens, because keystore has been loaded - } - if (alias != null) { - storeHash.put(c, "("+alias+")"); - found = true; - result |= IN_KEYSTORE; - } - } - if (!found && (scope != null)) { - Identity id = scope.getIdentity(c.getPublicKey()); - if (id != null) { - result |= IN_SCOPE; - storeHash.put(c, "["+id.getName()+"]"); - } - } - } - } + for (CodeSigner signer: signers) { + int result = inKeyStoreForOneSigner(signer); + output |= result; } - return result; + if (ckaliases.size() > 0 && (output & SIGNED_BY_ALIAS) == 0) { + output |= NOT_ALIAS; + } + return output; } void signJar(String jarName, String alias, String[] args) @@ -1025,7 +1188,7 @@ public class JarSigner { // manifest file has new length mfFile = new ZipEntry(JarFile.MANIFEST_NAME); } - if (verbose) { + if (verbose != null) { if (mfCreated) { System.out.println(rb.getString(" adding: ") + mfFile.getName()); @@ -1076,7 +1239,7 @@ public class JarSigner { // signature file zos.putNextEntry(sfFile); sf.write(zos); - if (verbose) { + if (verbose != null) { if (zipFile.getEntry(sfFilename) != null) { System.out.println(rb.getString(" updating: ") + sfFilename); @@ -1086,7 +1249,7 @@ public class JarSigner { } } - if (verbose) { + if (verbose != null) { if (tsaUrl != null || tsaCert != null) { System.out.println( rb.getString("requesting a signature timestamp")); @@ -1101,8 +1264,8 @@ public class JarSigner { System.out.println(rb.getString("TSA location: ") + certUrl); } - System.out.println( - rb.getString("TSA certificate: ") + printCert(tsaCert)); + System.out.println(rb.getString("TSA certificate: ") + + printCert("", tsaCert, false, 0)); } if (signingMechanism != null) { System.out.println( @@ -1113,7 +1276,7 @@ public class JarSigner { // signature block file zos.putNextEntry(bkFile); block.write(zos); - if (verbose) { + if (verbose != null) { if (zipFile.getEntry(bkFilename) != null) { System.out.println(rb.getString(" updating: ") + bkFilename); @@ -1140,7 +1303,7 @@ public class JarSigner { ZipEntry ze = enum_.nextElement(); if (!ze.getName().startsWith(META_INF)) { - if (verbose) { + if (verbose != null) { if (manifest.getAttributes(ze.getName()) != null) System.out.println(rb.getString(" signing: ") + ze.getName()); @@ -1194,7 +1357,8 @@ public class JarSigner { } if (hasExpiredCert || hasExpiringCert || notYetValidCert - || badKeyUsage || badExtendedKeyUsage || badNetscapeCertType) { + || badKeyUsage || badExtendedKeyUsage + || badNetscapeCertType || chainNotValidated) { System.out.println(); System.out.println(rb.getString("Warning: ")); @@ -1223,6 +1387,11 @@ public class JarSigner { System.out.println( rb.getString("The signer certificate is not yet valid.")); } + + if (chainNotValidated) { + System.out.println( + rb.getString("The signer's certificate chain is not validated.")); + } } // no IOException thrown in the above try clause, so disable @@ -1274,6 +1443,40 @@ public class JarSigner { return false; } + Map<CodeSigner,String> cacheForSignerInfo = new IdentityHashMap<CodeSigner,String>(); + + /** + * Returns a string of singer info, with a newline at the end + */ + private String signerInfo(CodeSigner signer, String tab, long now) { + if (cacheForSignerInfo.containsKey(signer)) { + return cacheForSignerInfo.get(signer); + } + StringBuffer s = new StringBuffer(); + List<? extends Certificate> certs = signer.getSignerCertPath().getCertificates(); + // display the signature timestamp, if present + Timestamp timestamp = signer.getTimestamp(); + if (timestamp != null) { + s.append(printTimestamp(tab, timestamp)); + } + // display the certificate(s) + for (Certificate c : certs) { + s.append(printCert(tab, c, true, now)); + s.append('\n'); + } + try { + CertPath cp = certificateFactory.generateCertPath(certs); + validator.validate(cp, pkixParameters); + } catch (Exception e) { + chainNotValidated = true; + s.append(tab + rb.getString("[CertPath not validated: ") + + e.getLocalizedMessage() + "]\n"); // TODO + } + String result = s.toString(); + cacheForSignerInfo.put(signer, result); + return result; + } + private void writeEntry(ZipFile zf, ZipOutputStream os, ZipEntry ze) throws IOException { @@ -1360,6 +1563,48 @@ public class JarSigner { } } } + Set<TrustAnchor> tas = new HashSet<TrustAnchor>(); + try { + KeyStore caks = KeyTool.getCacertsKeyStore(); + if (caks != null) { + Enumeration<String> aliases = caks.aliases(); + while (aliases.hasMoreElements()) { + String a = aliases.nextElement(); + try { + tas.add(new TrustAnchor((X509Certificate)caks.getCertificate(a), null)); + } catch (Exception e2) { + // ignore, when a SecretkeyEntry does not include a cert + } + } + } + } catch (Exception e) { + // Ignore, if cacerts cannot be loaded + } + if (store != null) { + Enumeration<String> aliases = store.aliases(); + while (aliases.hasMoreElements()) { + String a = aliases.nextElement(); + try { + X509Certificate c = (X509Certificate)store.getCertificate(a); + // Only add TrustedCertificateEntry and self-signed + // PrivateKeyEntry + if (store.isCertificateEntry(a) || + c.getSubjectDN().equals(c.getIssuerDN())) { + tas.add(new TrustAnchor(c, null)); + } + } catch (Exception e2) { + // ignore, when a SecretkeyEntry does not include a cert + } + } + } + certificateFactory = CertificateFactory.getInstance("X.509"); + validator = CertPathValidator.getInstance("PKIX"); + try { + pkixParameters = new PKIXParameters(tas); + pkixParameters.setRevocationEnabled(false); + } catch (InvalidAlgorithmParameterException ex) { + // Only if tas is empty + } } catch (IOException ioe) { throw new RuntimeException(rb.getString("keystore load: ") + ioe.getMessage()); @@ -1408,7 +1653,8 @@ public class JarSigner { void checkCertUsage(X509Certificate userCert, boolean[] bad) { // Can act as a signer? - // 1. if KeyUsage, then [0] should be true + // 1. if KeyUsage, then [0:digitalSignature] or + // [1:nonRepudiation] should be true // 2. if ExtendedKeyUsage, then should contains ANY or CODE_SIGNING // 3. if NetscapeCertType, then should contains OBJECT_SIGNING // 1,2,3 must be true @@ -1419,10 +1665,10 @@ public class JarSigner { boolean[] keyUsage = userCert.getKeyUsage(); if (keyUsage != null) { - if (keyUsage.length < 1 || !keyUsage[0]) { + keyUsage = Arrays.copyOf(keyUsage, 9); + if (!keyUsage[0] && !keyUsage[1]) { if (bad != null) { bad[0] = true; - } else { badKeyUsage = true; } } @@ -1435,7 +1681,6 @@ public class JarSigner { && !xKeyUsage.contains("1.3.6.1.5.5.7.3.3")) { // codeSigning if (bad != null) { bad[1] = true; - } else { badExtendedKeyUsage = true; } } @@ -1462,7 +1707,6 @@ public class JarSigner { if (!val) { if (bad != null) { bad[2] = true; - } else { badNetscapeCertType = true; } } @@ -1477,19 +1721,36 @@ public class JarSigner { Key key = null; try { - java.security.cert.Certificate[] cs = null; - - try { - cs = store.getCertificateChain(alias); - } catch (KeyStoreException kse) { - // this never happens, because keystore has been loaded + if (altCertChain != null) { + try { + cs = CertificateFactory.getInstance("X.509"). + generateCertificates(new FileInputStream(altCertChain)). + toArray(new Certificate[0]); + } catch (CertificateException ex) { + error(rb.getString("Cannot restore certchain from file specified")); + } catch (FileNotFoundException ex) { + error(rb.getString("File specified by -certchain does not exist")); + } + } else { + try { + cs = store.getCertificateChain(alias); + } catch (KeyStoreException kse) { + // this never happens, because keystore has been loaded + } } - if (cs == null) { - MessageFormat form = new MessageFormat(rb.getString - ("Certificate chain not found for: alias. alias must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.")); - Object[] source = {alias, alias}; - error(form.format(source)); + if (cs == null || cs.length == 0) { + if (altCertChain != null) { + error(rb.getString + ("Certificate chain not found in the file specified.")); + } else { + MessageFormat form = new MessageFormat(rb.getString + ("Certificate chain not found for: alias. alias must" + + " reference a valid KeyStore key entry containing a" + + " private key and corresponding public key certificate chain.")); + Object[] source = {alias, alias}; + error(form.format(source)); + } } certChain = new X509Certificate[cs.length]; @@ -1501,56 +1762,15 @@ public class JarSigner { certChain[i] = (X509Certificate)cs[i]; } - // order the cert chain if necessary (put user cert first, - // root-cert last in the chain) - X509Certificate userCert - = (X509Certificate)store.getCertificate(alias); + // We don't meant to print anything, the next call + // checks validity and keyUsage etc + printCert("", certChain[0], true, 0); - // check validity of signer certificate try { - userCert.checkValidity(); - - if (userCert.getNotAfter().getTime() < - System.currentTimeMillis() + SIX_MONTHS) { - - hasExpiringCert = true; - } - } catch (CertificateExpiredException cee) { - hasExpiredCert = true; - - } catch (CertificateNotYetValidException cnyve) { - notYetValidCert = true; - } - - checkCertUsage(userCert, null); - - if (!userCert.equals(certChain[0])) { - // need to order ... - X509Certificate[] certChainTmp - = new X509Certificate[certChain.length]; - certChainTmp[0] = userCert; - Principal issuer = userCert.getIssuerDN(); - for (int i=1; i<certChain.length; i++) { - int j; - // look for the cert whose subject corresponds to the - // given issuer - for (j=0; j<certChainTmp.length; j++) { - if (certChainTmp[j] == null) - continue; - Principal subject = certChainTmp[j].getSubjectDN(); - if (issuer.equals(subject)) { - certChain[i] = certChainTmp[j]; - issuer = certChainTmp[j].getIssuerDN(); - certChainTmp[j] = null; - break; - } - } - if (j == certChainTmp.length) { - error(rb.getString("incomplete certificate chain")); - } - - } - certChain = certChainTmp; // ordered + CertPath cp = certificateFactory.generateCertPath(Arrays.asList(certChain)); + validator.validate(cp, pkixParameters); + } catch (Exception e) { + chainNotValidated = true; } try { diff --git a/src/share/classes/sun/security/tools/JarSignerResources.java b/src/share/classes/sun/security/tools/JarSignerResources.java index 473ea3b035d970adbc018f5da5d5e99c4ea7b490..7e259e8e8fec3731652a223307730197a9fc6c12 100644 --- a/src/share/classes/sun/security/tools/JarSignerResources.java +++ b/src/share/classes/sun/security/tools/JarSignerResources.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -54,8 +54,8 @@ public class JarSignerResources extends java.util.ListResourceBundle { "If keystore is not password protected, then -storepass and -keypass must not be specified"}, {"Usage: jarsigner [options] jar-file alias", "Usage: jarsigner [options] jar-file alias"}, - {" jarsigner -verify [options] jar-file", - " jarsigner -verify [options] jar-file"}, + {" jarsigner -verify [options] jar-file [alias...]", + " jarsigner -verify [options] jar-file [alias...]"}, {"[-keystore <url>] keystore location", "[-keystore <url>] keystore location"}, {"[-storepass <password>] password for keystore integrity", @@ -64,6 +64,8 @@ public class JarSignerResources extends java.util.ListResourceBundle { "[-storetype <type>] keystore type"}, {"[-keypass <password>] password for private key (if different)", "[-keypass <password>] password for private key (if different)"}, + {"[-certchain <file>] name of alternative certchain file", + "[-certchain <file>] name of alternative certchain file"}, {"[-sigfile <file>] name of .SF/.DSA file", "[-sigfile <file>] name of .SF/.DSA file"}, {"[-signedjar <file>] name of signed JAR file", @@ -74,8 +76,10 @@ public class JarSignerResources extends java.util.ListResourceBundle { "[-sigalg <algorithm>] name of signature algorithm"}, {"[-verify] verify a signed JAR file", "[-verify] verify a signed JAR file"}, - {"[-verbose] verbose output when signing/verifying", - "[-verbose] verbose output when signing/verifying"}, + {"[-verbose[:suboptions]] verbose output when signing/verifying.", + "[-verbose[:suboptions]] verbose output when signing/verifying."}, + {" suboptions can be all, grouped or summary", + " suboptions can be all, grouped or summary"}, {"[-certs] display certificates when verbose and verifying", "[-certs] display certificates when verbose and verifying"}, {"[-tsa <url>] location of the Timestamping Authority", @@ -98,10 +102,22 @@ public class JarSignerResources extends java.util.ListResourceBundle { "[-providerClass <class> name of cryptographic service provider's"}, {" [-providerArg <arg>]] ... master class file and constructor argument", " [-providerArg <arg>]] ... master class file and constructor argument"}, + {"[-strict] treat warnings as errors", + "[-strict] treat warnings as errors"}, + {"Option lacks argument", "Option lacks argument"}, + {"Please type jarsigner -help for usage", "Please type jarsigner -help for usage"}, + {"Please specify jarfile name", "Please specify jarfile name"}, + {"Please specify alias name", "Please specify alias name"}, + {"Only one alias can be specified", "Only one alias can be specified"}, + {"This jar contains signed entries which is not signed by the specified alias(es).", + "This jar contains signed entries which is not signed by the specified alias(es)."}, + {"This jar contains signed entries that's not signed by alias in this keystore.", + "This jar contains signed entries that's not signed by alias in this keystore."}, {"s", "s"}, {"m", "m"}, {"k", "k"}, {"i", "i"}, + {"(and %d more)", "(and %d more)"}, {" s = signature was verified ", " s = signature was verified "}, {" m = entry is listed in manifest", @@ -110,7 +126,11 @@ public class JarSignerResources extends java.util.ListResourceBundle { " k = at least one certificate was found in keystore"}, {" i = at least one certificate was found in identity scope", " i = at least one certificate was found in identity scope"}, + {" X = not signed by specified alias(es)", + " X = not signed by specified alias(es)"}, {"no manifest.", "no manifest."}, + {"(Signature related entries)","(Signature related entries)"}, + {"(Unsigned entries)", "(Unsigned entries)"}, {"jar is unsigned. (signatures missing or not parsable)", "jar is unsigned. (signatures missing or not parsable)"}, {"jar verified.", "jar verified."}, @@ -134,6 +154,12 @@ public class JarSignerResources extends java.util.ListResourceBundle { "unable to instantiate keystore class: "}, {"Certificate chain not found for: alias. alias must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.", "Certificate chain not found for: {0}. {1} must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain."}, + {"File specified by -certchain does not exist", + "File specified by -certchain does not exist"}, + {"Cannot restore certchain from file specified", + "Cannot restore certchain from file specified"}, + {"Certificate chain not found in the file specified.", + "Certificate chain not found in the file specified."}, {"found non-X.509 certificate in signer's chain", "found non-X.509 certificate in signer's chain"}, {"incomplete certificate chain", "incomplete certificate chain"}, @@ -149,6 +175,7 @@ public class JarSignerResources extends java.util.ListResourceBundle { {"certificate is not valid until", "certificate is not valid until {0}"}, {"certificate will expire on", "certificate will expire on {0}"}, + {"[CertPath not validated: ", "[CertPath not validated: "}, {"requesting a signature timestamp", "requesting a signature timestamp"}, {"TSA location: ", "TSA location: "}, @@ -189,14 +216,18 @@ public class JarSignerResources extends java.util.ListResourceBundle { "The signer certificate's ExtendedKeyUsage extension doesn't allow code signing."}, {"The signer certificate's NetscapeCertType extension doesn't allow code signing.", "The signer certificate's NetscapeCertType extension doesn't allow code signing."}, - {"This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.", - "This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing."}, - {"This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing.", - "This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing."}, - {"This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing.", - "This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing."}, + {"This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.", + "This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing."}, + {"This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing.", + "This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing."}, + {"This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing.", + "This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing."}, {"[{0} extension does not support code signing]", "[{0} extension does not support code signing]"}, + {"The signer's certificate chain is not validated.", + "The signer's certificate chain is not validated."}, + {"This jar contains entries whose certificate chain is not validated.", + "This jar contains entries whose certificate chain is not validated."}, }; /** diff --git a/src/share/classes/sun/security/tools/KeyTool.java b/src/share/classes/sun/security/tools/KeyTool.java index 163e78fc5cfe58194b9b21c670043251594ef313..9b4b16fa11dacc7eab35d24bba9c3a5300ca9b85 100644 --- a/src/share/classes/sun/security/tools/KeyTool.java +++ b/src/share/classes/sun/security/tools/KeyTool.java @@ -2545,7 +2545,19 @@ public final class KeyTool { * Returns true if the certificate is self-signed, false otherwise. */ private boolean isSelfSigned(X509Certificate cert) { - return cert.getSubjectDN().equals(cert.getIssuerDN()); + return signedBy(cert, cert); + } + + private boolean signedBy(X509Certificate end, X509Certificate ca) { + if (!ca.getSubjectDN().equals(end.getIssuerDN())) { + return false; + } + try { + end.verify(ca.getPublicKey()); + return true; + } catch (Exception e) { + return false; + } } /** @@ -2869,20 +2881,18 @@ public final class KeyTool { Certificate tmpCert = replyCerts[0]; replyCerts[0] = replyCerts[i]; replyCerts[i] = tmpCert; - Principal issuer = ((X509Certificate)replyCerts[0]).getIssuerDN(); + + X509Certificate thisCert = (X509Certificate)replyCerts[0]; for (i=1; i < replyCerts.length-1; i++) { - // find a cert in the reply whose "subject" is the same as the - // given "issuer" + // find a cert in the reply who signs thisCert int j; for (j=i; j<replyCerts.length; j++) { - Principal subject; - subject = ((X509Certificate)replyCerts[j]).getSubjectDN(); - if (subject.equals(issuer)) { + if (signedBy(thisCert, (X509Certificate)replyCerts[j])) { tmpCert = replyCerts[i]; replyCerts[i] = replyCerts[j]; replyCerts[j] = tmpCert; - issuer = ((X509Certificate)replyCerts[i]).getIssuerDN(); + thisCert = (X509Certificate)replyCerts[i]; break; } } @@ -2892,18 +2902,6 @@ public final class KeyTool { } } - // now verify each cert in the ordered chain - for (i=0; i<replyCerts.length-1; i++) { - PublicKey pubKey = replyCerts[i+1].getPublicKey(); - try { - replyCerts[i].verify(pubKey); - } catch (Exception e) { - throw new Exception(rb.getString - ("Certificate chain in reply does not verify: ") + - e.getMessage()); - } - } - if (noprompt) { return replyCerts; } @@ -3035,9 +3033,8 @@ public final class KeyTool { private boolean buildChain(X509Certificate certToVerify, Vector<Certificate> chain, Hashtable<Principal, Vector<Certificate>> certs) { - Principal subject = certToVerify.getSubjectDN(); Principal issuer = certToVerify.getIssuerDN(); - if (subject.equals(issuer)) { + if (isSelfSigned(certToVerify)) { // reached self-signed root cert; // no verification needed because it's trusted. chain.addElement(certToVerify); @@ -3108,7 +3105,7 @@ public final class KeyTool { /** * Returns the keystore with the configured CA certificates. */ - private KeyStore getCacertsKeyStore() + public static KeyStore getCacertsKeyStore() throws Exception { String sep = File.separator; diff --git a/src/share/classes/sun/security/util/ManifestEntryVerifier.java b/src/share/classes/sun/security/util/ManifestEntryVerifier.java index c528d95c8b1b181eb81eeb4a4ec9282986c23b0c..b713f16e768a5a23ea5bdf9b685e12fc72b7b5ef 100644 --- a/src/share/classes/sun/security/util/ManifestEntryVerifier.java +++ b/src/share/classes/sun/security/util/ManifestEntryVerifier.java @@ -44,8 +44,6 @@ public class ManifestEntryVerifier { private static final Debug debug = Debug.getInstance("jar"); - private static final Provider digestProvider = Providers.getSunProvider(); - /** the created digest objects */ HashMap<String, MessageDigest> createdDigests; @@ -127,7 +125,7 @@ public class ManifestEntryVerifier { try { digest = MessageDigest.getInstance - (algorithm, digestProvider); + (algorithm, Providers.getSunProvider()); createdDigests.put(algorithm, digest); } catch (NoSuchAlgorithmException nsae) { // ignore diff --git a/src/share/classes/sun/security/util/ObjectIdentifier.java b/src/share/classes/sun/security/util/ObjectIdentifier.java index 2ad04c0b36081d6d9fd8fa3b433f5b68c3b9c5e0..717e5bcf65e00cf9e11185d4b520d511a6ba525f 100644 --- a/src/share/classes/sun/security/util/ObjectIdentifier.java +++ b/src/share/classes/sun/security/util/ObjectIdentifier.java @@ -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 @@ import java.io.*; * 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 */ - public ObjectIdentifier (String oid) throws IOException - { - int ch = '.'; - int start = 0; - int end = 0; + private Object components = null; // path from root + /** + * @serial + */ + private int componentLen = -1; // how much is used. - // Calculate length of oid - componentLen = 0; - while ((end = oid.indexOf(ch,start)) != -1) { - start = end + 1; - componentLen += 1; + // 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); } - componentLen += 1; - components = new int[componentLen]; + } - 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(); - start = end + 1; + 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; } - comp = oid.substring(start); - components[i] = Integer.valueOf(comp).intValue(); - } catch (Exception e) { - throw new IOException("ObjectIdentifier() -- Invalid format: " - + e.toString(), e); + componentsCalculated = true; } - checkValidOid(components, componentLen); - this.stringForm = oid; + os.defaultWriteObject(); + } + + static class HugeOidNotSupportedByOldJDK implements Serializable { + private static final long serialVersionUID = 1L; + static HugeOidNotSupportedByOldJDK theOne = new HugeOidNotSupportedByOldJDK(); } /** - * 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 <code>values</code> may be longer than <code>len</code>. - * In this case, only the first <code>len</code> items are checked. - * @exception IOException if this is not a legal OID + * Constructs, from a string. This string should be of the form 1.23.56. + * Validity check included. */ - 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 "); - } + public ObjectIdentifier (String oid) throws IOException + { + int ch = '.'; + int start = 0; + int end = 0; - for (int i=0; i<len; i++) { - if (values[i] < 0) { - throw new IOException("ObjectIdentifier() -- " + - "oid component #" + (i+1) + " must be non-negative "); - } - } + int pos = 0; + byte[] tmp = new byte[oid.length()]; + int first = 0, second; + int count = 0; - if (values[0] > maxFirstComponent) { - throw new IOException("ObjectIdentifier() -- " + - "First oid component is invalid "); - } + 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; + } - if (values[0] < 2 && values[1] > maxSecondComponent) { - throw new IOException("ObjectIdentifier() -- " + - "Second oid component is invalid "); + 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; + 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); } } + /** - * 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<values.length; i++) + checkOtherComponent(i, values[i]); + init(values, values.length); } /** - * Constructs an object ID from an ASN.1 encoded input stream. + * Constructor, from an ASN.1 encoded input stream. + * Validity check NOT included. * The encoding of the ID in the stream uses "DER", a BER/1 subset. * In this case, that means a triple { typeId, length, data }. * @@ -152,8 +234,7 @@ class ObjectIdentifier implements Serializable * @param in DER-encoded data holding an object ID * @exception IOException indicates a decoding error */ - public ObjectIdentifier (DerInputStream in) - throws IOException + public ObjectIdentifier (DerInputStream in) throws IOException { byte type_id; int bufferEnd; @@ -174,215 +255,67 @@ class ObjectIdentifier implements Serializable + " (tag = " + type_id + ")" ); - bufferEnd = in.available () - in.getLength () - 1; - if (bufferEnd < 0) - throw new IOException ( - "ObjectIdentifier() -- not enough data"); - - initFromEncoding (in, bufferEnd); + encoding = new byte[in.getLength()]; + in.getBytes(encoding); + check(encoding); } /* - * Build the OID from the rest of a DER input buffer; the tag - * and length have been removed/verified + * Constructor, from the rest of a DER input buffer; + * the tag and length have been removed/verified + * Validity check NOT included. */ ObjectIdentifier (DerInputBuffer buf) throws IOException { - initFromEncoding (new DerInputStream (buf), 0); + DerInputStream in = new DerInputStream(buf); + encoding = new byte[in.available()]; + in.getBytes(encoding); + check(encoding); } - /** - * Private constructor for use by newInternal(). Dummy argument - * to avoid clash with the public constructor. - */ - private ObjectIdentifier(int[] components, boolean dummy) { - this.components = components; - this.componentLen = components.length; + private void init(int[] components, int length) { + int pos = 0; + byte[] tmp = new byte[length*5+1]; // +1 for empty input + + 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); + } + + for (int i=2; i<length; i++) { + pos += pack7Oid(components[i], tmp, pos); + } + encoding = new byte[pos]; + System.arraycopy(tmp, 0, encoding, 0, pos); } /** - * Create a new ObjectIdentifier for internal use. The values are + * This method is kept for compatibility reasons. The new implementation + * does the check and conversion. All around the JDK, the method is called + * in static blocks to initialize pre-defined ObjectIdentifieies. No + * obvious performance hurt will be made after this change. + * + * Old doc: Create a new ObjectIdentifier for internal use. The values are * neither checked nor cloned. */ public static ObjectIdentifier newInternal(int[] values) { - return new ObjectIdentifier(values, true); - } - - /* - * Helper function -- get the OID from a stream, after tag and - * length are verified. - */ - private void initFromEncoding (DerInputStream in, int bufferEnd) - throws IOException - { - - /* - * Now get the components ("sub IDs") one at a time. We fill a - * temporary buffer, resizing it as needed. - */ - int component; - boolean first_subid = true; - - for (components = new int [allocationQuantum], componentLen = 0; - in.available () > bufferEnd; - ) { - component = getComponent (in); - if (component < 0) { - throw new IOException( - "ObjectIdentifier() -- " + - "component values must be nonnegative"); - } - if (first_subid) { - int X, Y; - - /* - * 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; - - } 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; - } - } - - checkValidOid(components, componentLen); - - /* - * Final sanity check -- if we didn't use exactly the number of bytes - * specified, something's quite wrong. - */ - if (in.available () != bufferEnd) { - throw new IOException ( - "ObjectIdentifier() -- malformed input data"); + try { + return new ObjectIdentifier(values); + } catch (IOException ex) { + throw new RuntimeException(ex); + // Should not happen, internal calls always uses legal values. } } - /* * n.b. the only public interface is DerOutputStream.putOID() */ void encode (DerOutputStream out) throws IOException { - DerOutputStream bytes = new DerOutputStream (); - int i; - - // According to ISO X.660, when the 1st component is 0 or 1, the 2nd - // component is restricted to be less than or equal to 39, thus make - // it small enough to be encoded into one single byte. - if (components[0] < 2) { - bytes.write ((components [0] * 40) + components [1]); - } else { - putComponent(bytes, (components [0] * 40) + components [1]); - } - for (i = 2; i < componentLen; i++) - putComponent (bytes, components [i]); - - /* - * Now that we've constructed the component, encode - * it in the stream we were given. - */ - out.write (DerValue.tag_ObjectId, bytes); - } - - /* - * Tricky OID component parsing technique ... note that one bit - * per octet is lost, this returns at most 28 bits of component. - * Also, notice this parses in big-endian format. - */ - private static int getComponent (DerInputStream in) - throws IOException - { - int retval, i, tmp; - - for (i = 0, retval = 0; i < 4; i++) { - retval <<= 7; - tmp = in.getByte (); - retval |= (tmp & 0x07f); - if ((tmp & 0x080) == 0) - return retval; - } - - throw new IOException ("ObjectIdentifier() -- component value too big"); - } - - /* - * Reverse of the above routine. Notice it needs to emit in - * big-endian form, so it buffers the output until it's ready. - * (Minimum length encoding is a DER requirement.) - */ - private static void putComponent (DerOutputStream out, int val) - throws IOException - { - int i; - // TODO: val must be <128*128*128*128 here, otherwise, 4 bytes is not - // enough to hold it. Will address this later. - byte buf [] = new byte [4] ; - - for (i = 0; i < 4; i++) { - buf [i] = (byte) (val & 0x07f); - val >>>= 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 <em>other</em> 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 @@ class ObjectIdentifier implements Serializable * * @return true iff the names are identical. */ + @Override public boolean equals(Object obj) { if (this == obj) { return true; @@ -406,23 +340,71 @@ class ObjectIdentifier implements Serializable 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 true; + return Arrays.equals(encoding, other.encoding); } + @Override public int hashCode() { - int h = componentLen; - for (int i = 0; i < componentLen; i++) { - h += components[i] * 37; + 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 h; + return Arrays.copyOf(result, which); } /** @@ -431,15 +413,52 @@ class ObjectIdentifier implements Serializable * 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 @@ class ObjectIdentifier implements Serializable 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 <code>in</code> + * @param ilength number of bytes to repack + * @param iw NUB for input + * @param ow NUB for output + * @return the repacked bytes */ - private int components []; // path from root - private int componentLen; // how much is used. + 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"; - private transient volatile String stringForm; + 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; - private static final int allocationQuantum = 5; // >= 2 + 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 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 + */ + + /** + * 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<length; i++) { + // 0x80 at the beginning of a subidentifier + if (encoding[i] == (byte)0x80 && + (i==0 || (encoding[i-1] & 0x80) == 0)) { + throw new IOException("ObjectIdentifier() -- " + + "Invalid DER encoding, useless extra octet detected"); + } + } + } + private static void checkCount(int count) throws IOException { + if (count < 2) { + throw new IOException("ObjectIdentifier() -- " + + "Must be at least two oid components "); + } + } + private static void checkFirstComponent(int first) throws IOException { + if (first < 0 || first > 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 --git a/src/share/classes/sun/swing/FilePane.java b/src/share/classes/sun/swing/FilePane.java index de5ad7c48312a90b45128ba55df1eadfdb1f4956..71112b319d8c328c91236bc719ce0a0638565faa 100644 --- a/src/share/classes/sun/swing/FilePane.java +++ b/src/share/classes/sun/swing/FilePane.java @@ -34,6 +34,7 @@ import java.text.DateFormat; import java.text.MessageFormat; import java.util.*; import java.util.List; +import java.util.concurrent.Callable; import javax.swing.*; import javax.swing.border.*; @@ -900,6 +901,16 @@ public class FilePane extends JPanel implements PropertyChangeListener { } } + @Override + public void sort() { + ShellFolder.getInvoker().invoke(new Callable<Void>() { + public Void call() throws Exception { + DetailsTableRowSorter.super.sort(); + return null; + } + }); + } + public void modelStructureChanged() { super.modelStructureChanged(); updateComparators(detailsTableModel.getColumns()); diff --git a/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java b/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java index 5ded9d729a4cb79be4f77fae26b34553b6c61fef..7069c394ad6a7019b0f7a824ba8bc3b38ca40252 100644 --- a/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java +++ b/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java @@ -29,6 +29,8 @@ import java.awt.event.*; import java.beans.*; import java.io.*; import java.util.*; +import java.security.AccessController; +import java.security.PrivilegedAction; import javax.swing.*; import javax.swing.event.*; @@ -749,7 +751,11 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { File[] baseFolders; if (useShellFolder) { - baseFolders = (File[])ShellFolder.get("fileChooserComboBoxFolders"); + baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { + public File[] run() { + return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); + } + }); } else { baseFolders = fsv.getRoots(); } diff --git a/src/share/classes/sun/text/normalizer/CharTrie.java b/src/share/classes/sun/text/normalizer/CharTrie.java index 3069de8650e65c6411e9a5e4c77101f0d66e93d5..eadbce37c225c190c797e7b1a4b837c76b4d7b7a 100644 --- a/src/share/classes/sun/text/normalizer/CharTrie.java +++ b/src/share/classes/sun/text/normalizer/CharTrie.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -77,6 +76,66 @@ public class CharTrie extends Trie m_friendAgent_ = new FriendAgent(); } + /** + * Make a dummy CharTrie. + * A dummy trie is an empty runtime trie, used when a real data trie cannot + * be loaded. + * + * The trie always returns the initialValue, + * or the leadUnitValue for lead surrogate code points. + * The Latin-1 part is always set up to be linear. + * + * @param initialValue the initial value that is set for all code points + * @param leadUnitValue the value for lead surrogate code _units_ that do not + * have associated supplementary data + * @param dataManipulate object which provides methods to parse the char data + */ + public CharTrie(int initialValue, int leadUnitValue, DataManipulate dataManipulate) { + super(new char[BMP_INDEX_LENGTH+SURROGATE_BLOCK_COUNT], HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_, dataManipulate); + + int dataLength, latin1Length, i, limit; + char block; + + /* calculate the actual size of the dummy trie data */ + + /* max(Latin-1, block 0) */ + dataLength=latin1Length= INDEX_STAGE_1_SHIFT_<=8 ? 256 : DATA_BLOCK_LENGTH; + if(leadUnitValue!=initialValue) { + dataLength+=DATA_BLOCK_LENGTH; + } + m_data_=new char[dataLength]; + m_dataLength_=dataLength; + + m_initialValue_=(char)initialValue; + + /* fill the index and data arrays */ + + /* indexes are preset to 0 (block 0) */ + + /* Latin-1 data */ + for(i=0; i<latin1Length; ++i) { + m_data_[i]=(char)initialValue; + } + + if(leadUnitValue!=initialValue) { + /* indexes for lead surrogate code units to the block after Latin-1 */ + block=(char)(latin1Length>>INDEX_STAGE_2_SHIFT_); + i=0xd800>>INDEX_STAGE_1_SHIFT_; + limit=0xdc00>>INDEX_STAGE_1_SHIFT_; + for(; i<limit; ++i) { + m_index_[i]=block; + } + + /* data for lead surrogate code units */ + limit=latin1Length+DATA_BLOCK_LENGTH; + for(i=latin1Length; i<limit; ++i) { + m_data_[i]=(char)leadUnitValue; + } + } + + m_friendAgent_ = new FriendAgent(); + } + /** * Java friend implementation */ @@ -130,7 +189,18 @@ public class CharTrie extends Trie */ public final char getCodePointValue(int ch) { - int offset = getCodePointOffset(ch); + int offset; + + // fastpath for U+0000..U+D7FF + if(0 <= ch && ch < UTF16.LEAD_SURROGATE_MIN_VALUE) { + // copy of getRawOffset() + offset = (m_index_[ch >> INDEX_STAGE_1_SHIFT_] << INDEX_STAGE_2_SHIFT_) + + (ch & INDEX_STAGE_3_MASK_); + return m_data_[offset]; + } + + // handle U+D800..U+10FFFF + offset = getCodePointOffset(ch); // return -1 if there is an error, in this case we return the default // value: m_initialValue_ diff --git a/src/share/classes/sun/text/normalizer/NormalizerBase.java b/src/share/classes/sun/text/normalizer/NormalizerBase.java index c2fc1ab291dc40a523045e85e7139d7b7b9cd4c4..a82475c6009b3356110a348c26f4a740285cc18a 100644 --- a/src/share/classes/sun/text/normalizer/NormalizerBase.java +++ b/src/share/classes/sun/text/normalizer/NormalizerBase.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -127,7 +126,7 @@ import java.text.Normalizer; * normalize(FCD) may be implemented with NFD. * * For more details on FCD see the collation design document: - * http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/collation/ICU_collation_design.htm + * http://source.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm * * ICU collation performs either NFD or FCD normalization automatically if * normalization is turned on for the collator object. Beyond collation and diff --git a/src/share/classes/sun/text/normalizer/NormalizerDataReader.java b/src/share/classes/sun/text/normalizer/NormalizerDataReader.java index 0378d5b592376b64e851baa685ba04504d144fe6..69b120d36e48de6b32460897af0afa1751d5cbc9 100644 --- a/src/share/classes/sun/text/normalizer/NormalizerDataReader.java +++ b/src/share/classes/sun/text/normalizer/NormalizerDataReader.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -331,7 +330,7 @@ final class NormalizerDataReader implements ICUBinary.Authenticate { throws IOException{ //Read the bytes that make up the normTrie - dataInputStream.read(normBytes); + dataInputStream.readFully(normBytes); //normTrieStream= new ByteArrayInputStream(normBytes); @@ -346,11 +345,11 @@ final class NormalizerDataReader implements ICUBinary.Authenticate { } //Read the fcdTrie - dataInputStream.read(fcdBytes); + dataInputStream.readFully(fcdBytes); //Read the AuxTrie - dataInputStream.read(auxBytes); + dataInputStream.readFully(auxBytes); } public byte[] getDataFormatVersion(){ diff --git a/src/share/classes/sun/text/normalizer/NormalizerImpl.java b/src/share/classes/sun/text/normalizer/NormalizerImpl.java index cd4669063c6fa0a8b61f1279617440ce1a3c6dd1..112afb0dac0b3c3876dac0739494e4afb745848e 100644 --- a/src/share/classes/sun/text/normalizer/NormalizerImpl.java +++ b/src/share/classes/sun/text/normalizer/NormalizerImpl.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -102,7 +101,7 @@ public final class NormalizerImpl { private static final long MIN_SPECIAL = (long)(0xfc000000 & UNSIGNED_INT_MASK); private static final long SURROGATES_TOP = (long)(0xfff00000 & UNSIGNED_INT_MASK); private static final long MIN_HANGUL = (long)(0xfff00000 & UNSIGNED_INT_MASK); - private static final long MIN_JAMO_V = (long)(0xfff20000 & UNSIGNED_INT_MASK); +// private static final long MIN_JAMO_V = (long)(0xfff20000 & UNSIGNED_INT_MASK); private static final long JAMO_V_TOP = (long)(0xfff30000 & UNSIGNED_INT_MASK); @@ -908,7 +907,7 @@ public final class NormalizerImpl { buffer = composePart(args,prevStarter,src,srcStart,srcLimit,options,nx); // compare the normalized version with the original - if(0!=strCompare(buffer,0,args.length,src,prevStarter,(srcStart-prevStarter), false)) { + if(0!=strCompare(buffer,0,args.length,src,prevStarter,srcStart, false)) { result=NormalizerBase.NO; // normalization differs break; } @@ -2291,7 +2290,7 @@ public final class NormalizerImpl { private static final int OPTIONS_NX_MASK=0x1f; private static final int OPTIONS_UNICODE_MASK=0xe0; public static final int OPTIONS_SETS_MASK=0xff; - private static final int OPTIONS_UNICODE_SHIFT=5; +// private static final int OPTIONS_UNICODE_SHIFT=5; private static final UnicodeSet[] nxCache = new UnicodeSet[OPTIONS_SETS_MASK+1]; /* Constants for options flags for normalization.*/ diff --git a/src/share/classes/sun/text/normalizer/Trie.java b/src/share/classes/sun/text/normalizer/Trie.java index 378a6005c1cfd82d87d65837d6ab4c873a05df3a..16c0f92108985ec7e8b43b074ecd744e0cfe6454 100644 --- a/src/share/classes/sun/text/normalizer/Trie.java +++ b/src/share/classes/sun/text/normalizer/Trie.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -37,10 +36,9 @@ package sun.text.normalizer; -import java.io.InputStream; import java.io.DataInputStream; +import java.io.InputStream; import java.io.IOException; -import java.util.Arrays; /** * <p>A trie is a kind of compressed, serializable table of values @@ -81,7 +79,6 @@ public abstract class Trie * This interface specifies methods to be implemented in order for * com.ibm.impl.Trie, to surrogate offset information encapsulated within * the data. - * @draft 2.1 */ public static interface DataManipulate { @@ -92,11 +89,17 @@ public abstract class Trie * @param value data value for a surrogate from the trie, including the * folding offset * @return data offset or 0 if there is no data for the lead surrogate - * @draft 2.1 */ public int getFoldingOffset(int value); } + // default implementation + private static class DefaultGetFoldingOffset implements DataManipulate { + public int getFoldingOffset(int value) { + return value; + } + } + // protected constructor ------------------------------------------- /** @@ -107,7 +110,6 @@ public abstract class Trie * trie data * @throws IOException thrown when input stream does not have the * right header. - * @draft 2.1 */ protected Trie(InputStream inputStream, DataManipulate dataManipulate) throws IOException @@ -121,7 +123,11 @@ public abstract class Trie throw new IllegalArgumentException("ICU data file error: Trie header authentication failed, please check if you have the most updated ICU data file"); } - m_dataManipulate_ = dataManipulate; + if(dataManipulate != null) { + m_dataManipulate_ = dataManipulate; + } else { + m_dataManipulate_ = new DefaultGetFoldingOffset(); + } m_isLatin1Linear_ = (m_options_ & HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_) != 0; m_dataOffset_ = input.readInt(); @@ -135,19 +141,21 @@ public abstract class Trie * @param options used by the trie * @param dataManipulate object containing the information to parse the * trie data - * @draft 2.2 */ protected Trie(char index[], int options, DataManipulate dataManipulate) { m_options_ = options; - m_dataManipulate_ = dataManipulate; + if(dataManipulate != null) { + m_dataManipulate_ = dataManipulate; + } else { + m_dataManipulate_ = new DefaultGetFoldingOffset(); + } m_isLatin1Linear_ = (m_options_ & HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_) != 0; m_index_ = index; m_dataOffset_ = m_index_.length; } - // protected data members ------------------------------------------ /** @@ -158,7 +166,6 @@ public abstract class Trie protected static final int LEAD_INDEX_OFFSET_ = 0x2800 >> 5; /** * Shift size for shifting right the input index. 1..9 - * @draft 2.1 */ protected static final int INDEX_STAGE_1_SHIFT_ = 5; /** @@ -168,31 +175,39 @@ public abstract class Trie * This requires blocks of stage 2 data to be aligned by * DATA_GRANULARITY. * 0..INDEX_STAGE_1_SHIFT - * @draft 2.1 */ protected static final int INDEX_STAGE_2_SHIFT_ = 2; + /** + * Number of data values in a stage 2 (data array) block. + */ + protected static final int DATA_BLOCK_LENGTH=1<<INDEX_STAGE_1_SHIFT_; /** * Mask for getting the lower bits from the input index. - * DATA_BLOCK_LENGTH_ - 1. - * @draft 2.1 + * DATA_BLOCK_LENGTH - 1. */ - protected static final int INDEX_STAGE_3_MASK_ = - (1 << INDEX_STAGE_1_SHIFT_) - 1; + protected static final int INDEX_STAGE_3_MASK_ = DATA_BLOCK_LENGTH - 1; + /** Number of bits of a trail surrogate that are used in index table lookups. */ + protected static final int SURROGATE_BLOCK_BITS=10-INDEX_STAGE_1_SHIFT_; + /** + * Number of index (stage 1) entries per lead surrogate. + * Same as number of index entries for 1024 trail surrogates, + * ==0x400>>INDEX_STAGE_1_SHIFT_ + */ + protected static final int SURROGATE_BLOCK_COUNT=(1<<SURROGATE_BLOCK_BITS); + /** Length of the BMP portion of the index (stage 1) array. */ + protected static final int BMP_INDEX_LENGTH=0x10000>>INDEX_STAGE_1_SHIFT_; /** * Surrogate mask to use when shifting offset to retrieve supplementary * values - * @draft 2.1 */ protected static final int SURROGATE_MASK_ = 0x3FF; /** * Index or UTF16 characters - * @draft 2.1 */ protected char m_index_[]; /** * Internal TrieValue which handles the parsing of the data value. * This class is to be implemented by the user - * @draft 2.1 */ protected DataManipulate m_dataManipulate_; /** @@ -200,7 +215,6 @@ public abstract class Trie * index and data into a char array, so this is used to indicate the * initial offset to the data portion. * Note this index always points to the initial value. - * @draft 2.1 */ protected int m_dataOffset_; /** @@ -215,7 +229,6 @@ public abstract class Trie * @param lead lead surrogate * @param trail trailing surrogate * @return offset to data - * @draft 2.1 */ protected abstract int getSurrogateOffset(char lead, char trail); @@ -223,14 +236,12 @@ public abstract class Trie * Gets the value at the argument index * @param index value at index will be retrieved * @return 32 bit value - * @draft 2.1 */ protected abstract int getValue(int index); /** * Gets the default initial value * @return 32 bit value - * @draft 2.1 */ protected abstract int getInitialValue(); @@ -247,7 +258,6 @@ public abstract class Trie * @param offset index offset which ch is to start from * @param ch index to be used after offset * @return offset to the data - * @draft 2.1 */ protected final int getRawOffset(int offset, char ch) { @@ -261,7 +271,6 @@ public abstract class Trie * Treats a lead surrogate as a normal code point. * @param ch BMP character * @return offset to data - * @draft 2.1 */ protected final int getBMPOffset(char ch) { @@ -279,7 +288,6 @@ public abstract class Trie * the next trailing surrogate character. * @param ch lead surrogate character * @return offset to data - * @draft 2.1 */ protected final int getLeadOffset(char ch) { @@ -293,26 +301,27 @@ public abstract class Trie * Gets the offset to data which the codepoint points to * @param ch codepoint * @return offset to data - * @draft 2.1 */ protected final int getCodePointOffset(int ch) { // if ((ch >> 16) == 0) slower - if (ch >= UTF16.CODEPOINT_MIN_VALUE - && ch < UTF16.SUPPLEMENTARY_MIN_VALUE) { + if (ch < 0) { + return -1; + } else if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE) { + // fastpath for the part of the BMP below surrogates (D800) where getRawOffset() works + return getRawOffset(0, (char)ch); + } else if (ch < UTF16.SUPPLEMENTARY_MIN_VALUE) { // BMP codepoint return getBMPOffset((char)ch); - } - // for optimization - if (ch >= UTF16.CODEPOINT_MIN_VALUE - && ch <= UCharacter.MAX_VALUE) { + } else if (ch <= UCharacter.MAX_VALUE) { // look at the construction of supplementary characters // trail forms the ends of it. return getSurrogateOffset(UTF16.getLeadSurrogate(ch), (char)(ch & SURROGATE_MASK_)); + } else { + // return -1 // if there is an error, in this case we return + return -1; } - // return -1 if there is an error, in this case we return - return -1; } /** @@ -320,7 +329,6 @@ public abstract class Trie * <p>This is overwritten by the child classes. * @param inputStream input stream containing the trie information * @exception IOException thrown when data reading fails. - * @draft 2.1 */ protected void unserialize(InputStream inputStream) throws IOException { @@ -335,7 +343,6 @@ public abstract class Trie /** * Determines if this is a 32 bit trie * @return true if options specifies this is a 32 bit trie - * @draft 2.1 */ protected final boolean isIntTrie() { @@ -345,7 +352,6 @@ public abstract class Trie /** * Determines if this is a 16 bit trie * @return true if this is a 16 bit trie - * @draft 2.1 */ protected final boolean isCharTrie() { @@ -354,40 +360,20 @@ public abstract class Trie // private data members -------------------------------------------- - /** - * Signature index - */ - private static final int HEADER_SIGNATURE_INDEX_ = 0; - /** - * Options index - */ - private static final int HEADER_OPTIONS_INDEX_ = 1 << 1; - /** - * Index length index - */ - private static final int HEADER_INDEX_LENGTH_INDEX_ = 2 << 1; - /** - * Data length index - */ - private static final int HEADER_DATA_LENGTH_INDEX_ = 3 << 1; - /** - * Size of header - */ - private static final int HEADER_LENGTH_ = 4 << 1; /** * Latin 1 option mask */ - private static final int HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_ = 0x200; + protected static final int HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_ = 0x200; /** * Constant number to authenticate the byte block */ - private static final int HEADER_SIGNATURE_ = 0x54726965; + protected static final int HEADER_SIGNATURE_ = 0x54726965; /** * Header option formatting */ private static final int HEADER_OPTIONS_SHIFT_MASK_ = 0xF; - private static final int HEADER_OPTIONS_INDEX_SHIFT_ = 4; - private static final int HEADER_OPTIONS_DATA_IS_32_BIT_ = 0x100; + protected static final int HEADER_OPTIONS_INDEX_SHIFT_ = 4; + protected static final int HEADER_OPTIONS_DATA_IS_32_BIT_ = 0x100; /** * Flag indicator for Latin quick access data block @@ -409,9 +395,8 @@ public abstract class Trie /** * Authenticates raw data header. * Checking the header information, signature and options. - * @param rawdata array of char data to be checked + * @param signature This contains the options and type of a Trie * @return true if the header is authenticated valid - * @draft 2.1 */ private final boolean checkHeader(int signature) { diff --git a/src/share/classes/sun/text/normalizer/TrieIterator.java b/src/share/classes/sun/text/normalizer/TrieIterator.java index 9810c1002cba83f2c4efa9e28c03af2c3a3f1ce1..b29ab1c569b09d827d919bd28167c52ff1a05dbd 100644 --- a/src/share/classes/sun/text/normalizer/TrieIterator.java +++ b/src/share/classes/sun/text/normalizer/TrieIterator.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -108,15 +107,14 @@ package sun.text.normalizer; * @since release 2.1, Jan 17 2002 */ public class TrieIterator implements RangeValueIterator - { + // public constructor --------------------------------------------- /** * TrieEnumeration constructor * @param trie to be used * @exception IllegalArgumentException throw when argument is null. - * @draft 2.1 */ public TrieIterator(Trie trie) { @@ -141,7 +139,6 @@ public class TrieIterator implements RangeValueIterator * @return true if we are not at the end of the iteration, false otherwise. * @exception NoSuchElementException - if no more elements exist. * @see com.ibm.icu.util.RangeValueIterator.Element - * @draft 2.1 */ public final boolean next(Element element) { @@ -158,7 +155,6 @@ public class TrieIterator implements RangeValueIterator /** * Resets the iterator to the beginning of the iteration - * @draft 2.1 */ public final void reset() { @@ -186,7 +182,6 @@ public class TrieIterator implements RangeValueIterator * The default function is to return the value as it is. * @param value a value from the trie * @return extracted value - * @draft 2.1 */ protected int extract(int value) { @@ -278,7 +273,6 @@ public class TrieIterator implements RangeValueIterator * Note, if there are no more iterations, it will never get to here. * Blocked out by next(). * @param element return result object - * @draft 2.1 */ private final void calculateNextSupplementaryElement(Element element) { @@ -516,10 +510,6 @@ public class TrieIterator implements RangeValueIterator */ private static final int TRAIL_SURROGATE_MIN_VALUE_ = 0xDC00; /** - * Trail surrogate maximum value - */ - private static final int TRAIL_SURROGATE_MAX_VALUE_ = 0xDFFF; - /** * Number of trail surrogate */ private static final int TRAIL_SURROGATE_COUNT_ = 0x400; @@ -538,11 +528,6 @@ public class TrieIterator implements RangeValueIterator private static final int DATA_BLOCK_LENGTH_ = 1 << Trie.INDEX_STAGE_1_SHIFT_; /** - * Number of codepoints in a stage 2 block - */ - private static final int DATA_BLOCK_SUPPLEMENTARY_LENGTH_ = - DATA_BLOCK_LENGTH_ << 10; - /** * Trie instance */ private Trie m_trie_; @@ -560,10 +545,4 @@ public class TrieIterator implements RangeValueIterator private int m_nextBlock_; private int m_nextBlockIndex_; private int m_nextTrailIndexOffset_; - /** - * This is the return result element - */ - private int m_start_; - private int m_limit_; - private int m_value_; } diff --git a/src/share/classes/sun/text/normalizer/UBiDiProps.java b/src/share/classes/sun/text/normalizer/UBiDiProps.java new file mode 100644 index 0000000000000000000000000000000000000000..0f5d960020362133d6b7625e7bc91a44dbf01c7c --- /dev/null +++ b/src/share/classes/sun/text/normalizer/UBiDiProps.java @@ -0,0 +1,179 @@ +/* + * Portions Copyright 2005-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. + */ +/* + ******************************************************************************* + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * + * * + * The original version of this source code and documentation is copyrighted * + * and owned by IBM, These materials are provided under terms of a License * + * Agreement between IBM and Sun. This technology is protected by multiple * + * US and International patents. This notice and attribution to IBM may not * + * to removed. * + ******************************************************************************* +* file name: UBiDiProps.java +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2005jan16 +* created by: Markus W. Scherer +* +* Low-level Unicode bidi/shaping properties access. +* Java port of ubidi_props.h/.c. +*/ + +package sun.text.normalizer; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.InputStream; +import java.io.IOException; + +public final class UBiDiProps { + // constructors etc. --------------------------------------------------- *** + + // port of ubidi_openProps() + public UBiDiProps() throws IOException{ + InputStream is=ICUData.getStream(DATA_FILE_NAME); + BufferedInputStream b=new BufferedInputStream(is, 4096 /* data buffer size */); + readData(b); + b.close(); + is.close(); + + } + + private void readData(InputStream is) throws IOException { + DataInputStream inputStream=new DataInputStream(is); + + // read the header + ICUBinary.readHeader(inputStream, FMT, new IsAcceptable()); + + // read indexes[] + int i, count; + count=inputStream.readInt(); + if(count<IX_INDEX_TOP) { + throw new IOException("indexes[0] too small in "+DATA_FILE_NAME); + } + indexes=new int[count]; + + indexes[0]=count; + for(i=1; i<count; ++i) { + indexes[i]=inputStream.readInt(); + } + + // read the trie + trie=new CharTrie(inputStream, null); + + // read mirrors[] + count=indexes[IX_MIRROR_LENGTH]; + if(count>0) { + mirrors=new int[count]; + for(i=0; i<count; ++i) { + mirrors[i]=inputStream.readInt(); + } + } + + // read jgArray[] + count=indexes[IX_JG_LIMIT]-indexes[IX_JG_START]; + jgArray=new byte[count]; + for(i=0; i<count; ++i) { + jgArray[i]=inputStream.readByte(); + } + } + + // implement ICUBinary.Authenticate + private final class IsAcceptable implements ICUBinary.Authenticate { + public boolean isDataVersionAcceptable(byte version[]) { + return version[0]==1 && + version[2]==Trie.INDEX_STAGE_1_SHIFT_ && version[3]==Trie.INDEX_STAGE_2_SHIFT_; + } + } + + // UBiDiProps singleton + private static UBiDiProps gBdp=null; + + // port of ubidi_getSingleton() + public static final synchronized UBiDiProps getSingleton() throws IOException { + if(gBdp==null) { + gBdp=new UBiDiProps(); + } + return gBdp; + } + + // UBiDiProps dummy singleton + private static UBiDiProps gBdpDummy=null; + + private UBiDiProps(boolean makeDummy) { // ignore makeDummy, only creates a unique signature + indexes=new int[IX_TOP]; + indexes[0]=IX_TOP; + trie=new CharTrie(0, 0, null); // dummy trie, always returns 0 + } + + /** + * Get a singleton dummy object, one that works with no real data. + * This can be used when the real data is not available. + * Using the dummy can reduce checks for available data after an initial failure. + * Port of ucase_getDummy(). + */ + public static final synchronized UBiDiProps getDummy() { + if(gBdpDummy==null) { + gBdpDummy=new UBiDiProps(true); + } + return gBdpDummy; + } + + public final int getClass(int c) { + return getClassFromProps(trie.getCodePointValue(c)); + } + + // data members -------------------------------------------------------- *** + private int indexes[]; + private int mirrors[]; + private byte jgArray[]; + + private CharTrie trie; + + // data format constants ----------------------------------------------- *** + private static final String DATA_FILE_NAME = "/sun/text/resources/ubidi.icu"; + + /* format "BiDi" */ + private static final byte FMT[]={ 0x42, 0x69, 0x44, 0x69 }; + + /* indexes into indexes[] */ + private static final int IX_INDEX_TOP=0; + private static final int IX_MIRROR_LENGTH=3; + + private static final int IX_JG_START=4; + private static final int IX_JG_LIMIT=5; + + private static final int IX_TOP=16; + + private static final int CLASS_MASK= 0x0000001f; + + private static final int getClassFromProps(int props) { + return props&CLASS_MASK; + } + +} diff --git a/src/share/classes/sun/text/normalizer/UCharacter.java b/src/share/classes/sun/text/normalizer/UCharacter.java index 26a5eca99fce1191cd34863e666f8065ae7cfd74..8225517f07cd9c5b2dda4f1744507867ab5c7c26 100644 --- a/src/share/classes/sun/text/normalizer/UCharacter.java +++ b/src/share/classes/sun/text/normalizer/UCharacter.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -24,7 +24,7 @@ */ /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -36,19 +36,18 @@ package sun.text.normalizer; -import java.lang.ref.SoftReference; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.io.IOException; +import java.util.MissingResourceException; /** * <p> * The UCharacter class provides extensions to the - * <a href=http://java.sun.com/j2se/1.3/docs/api/java/lang/Character.html> + * <a href="http://java.sun.com/j2se/1.5/docs/api/java/lang/Character.html"> * java.lang.Character</a> class. These extensions provide support for - * Unicode 3.2 properties and together with the <a href=../text/UTF16.html>UTF16</a> + * more Unicode properties and together with the <a href=../text/UTF16.html>UTF16</a> * class, provide support for supplementary characters (those with code * points above U+FFFF). + * Each ICU release supports the latest version of Unicode available at that time. * </p> * <p> * Code points are represented in these API using ints. While it would be @@ -67,7 +66,7 @@ import java.util.Map; * <i>$ICU4J_CLASS/com.ibm.icu.impl.data</i>. * </p> * <p> - * Aside from the additions for UTF-16 support, and the updated Unicode 3.1 + * Aside from the additions for UTF-16 support, and the updated Unicode * properties, the main differences between UCharacter and Character are: * <ul> * <li> UCharacter is not designed to be a char wrapper and does not have @@ -77,7 +76,7 @@ import java.util.Map; * <li> char charValue(), * <li> int compareTo(java.lang.Character, java.lang.Character), etc. * </ul> - * <li> UCharacter does not include Character APIs that are deprecated, not + * <li> UCharacter does not include Character APIs that are deprecated, nor * does it include the Java-specific character information, such as * boolean isJavaIdentifierPart(char ch). * <li> Character maps characters 'A' - 'Z' and 'a' - 'z' to the numeric @@ -89,10 +88,75 @@ import java.util.Map; * </ul> * <p> * Further detail differences can be determined from the program - * <a href = http://oss.software.ibm.com/developerworks/opensource/cvs/icu4j/~checkout~/icu4j/src/com/ibm/icu/dev/test/lang/UCharacterCompare.java> + * <a href="http://source.icu-project.org/repos/icu/icu4j/trunk/src/com/ibm/icu/dev/test/lang/UCharacterCompare.java"> * com.ibm.icu.dev.test.lang.UCharacterCompare</a> * </p> * <p> + * In addition to Java compatibility functions, which calculate derived properties, + * this API provides low-level access to the Unicode Character Database. + * </p> + * <p> + * Unicode assigns each code point (not just assigned character) values for + * many properties. + * Most of them are simple boolean flags, or constants from a small enumerated list. + * For some properties, values are strings or other relatively more complex types. + * </p> + * <p> + * For more information see + * "About the Unicode Character Database" (http://www.unicode.org/ucd/) + * and the ICU User Guide chapter on Properties (http://www.icu-project.org/userguide/properties.html). + * </p> + * <p> + * There are also functions that provide easy migration from C/POSIX functions + * like isblank(). Their use is generally discouraged because the C/POSIX + * standards do not define their semantics beyond the ASCII range, which means + * that different implementations exhibit very different behavior. + * Instead, Unicode properties should be used directly. + * </p> + * <p> + * There are also only a few, broad C/POSIX character classes, and they tend + * to be used for conflicting purposes. For example, the "isalpha()" class + * is sometimes used to determine word boundaries, while a more sophisticated + * approach would at least distinguish initial letters from continuation + * characters (the latter including combining marks). + * (In ICU, BreakIterator is the most sophisticated API for word boundaries.) + * Another example: There is no "istitle()" class for titlecase characters. + * </p> + * <p> + * ICU 3.4 and later provides API access for all twelve C/POSIX character classes. + * ICU implements them according to the Standard Recommendations in + * Annex C: Compatibility Properties of UTS #18 Unicode Regular Expressions + * (http://www.unicode.org/reports/tr18/#Compatibility_Properties). + * </p> + * <p> + * API access for C/POSIX character classes is as follows: + * - alpha: isUAlphabetic(c) or hasBinaryProperty(c, UProperty.ALPHABETIC) + * - lower: isULowercase(c) or hasBinaryProperty(c, UProperty.LOWERCASE) + * - upper: isUUppercase(c) or hasBinaryProperty(c, UProperty.UPPERCASE) + * - punct: ((1<<getType(c)) & ((1<<DASH_PUNCTUATION)|(1<<START_PUNCTUATION)|(1<<END_PUNCTUATION)|(1<<CONNECTOR_PUNCTUATION)|(1<<OTHER_PUNCTUATION)|(1<<INITIAL_PUNCTUATION)|(1<<FINAL_PUNCTUATION)))!=0 + * - digit: isDigit(c) or getType(c)==DECIMAL_DIGIT_NUMBER + * - xdigit: hasBinaryProperty(c, UProperty.POSIX_XDIGIT) + * - alnum: hasBinaryProperty(c, UProperty.POSIX_ALNUM) + * - space: isUWhiteSpace(c) or hasBinaryProperty(c, UProperty.WHITE_SPACE) + * - blank: hasBinaryProperty(c, UProperty.POSIX_BLANK) + * - cntrl: getType(c)==CONTROL + * - graph: hasBinaryProperty(c, UProperty.POSIX_GRAPH) + * - print: hasBinaryProperty(c, UProperty.POSIX_PRINT) + * </p> + * <p> + * The C/POSIX character classes are also available in UnicodeSet patterns, + * using patterns like [:graph:] or \p{graph}. + * </p> + * <p> + * Note: There are several ICU (and Java) whitespace functions. + * Comparison: + * - isUWhiteSpace=UCHAR_WHITE_SPACE: Unicode White_Space property; + * most of general categories "Z" (separators) + most whitespace ISO controls + * (including no-break spaces, but excluding IS1..IS4 and ZWSP) + * - isWhitespace: Java isWhitespace; Z + whitespace ISO controls but excluding no-break spaces + * - isSpaceChar: just Z (including no-break spaces) + * </p> + * <p> * This class is not subclassable * </p> * @author Syn Wee Quek @@ -110,95 +174,10 @@ public final class UCharacter */ public static interface NumericType { - /** - * @stable ICU 2.4 - */ - public static final int NONE = 0; /** * @stable ICU 2.4 */ public static final int DECIMAL = 1; - /** - * @stable ICU 2.4 - */ - public static final int DIGIT = 2; - /** - * @stable ICU 2.4 - */ - public static final int NUMERIC = 3; - /** - * @stable ICU 2.4 - */ - public static final int COUNT = 4; - } - - /** - * Hangul Syllable Type constants. - * - * @see UProperty#HANGUL_SYLLABLE_TYPE - * @stable ICU 2.6 - */ - public static interface HangulSyllableType - { - /** - * @stable ICU 2.6 - */ - public static final int NOT_APPLICABLE = 0; /*[NA]*/ /*See note !!*/ - /** - * @stable ICU 2.6 - */ - public static final int LEADING_JAMO = 1; /*[L]*/ - /** - * @stable ICU 2.6 - */ - public static final int VOWEL_JAMO = 2; /*[V]*/ - /** - * @stable ICU 2.6 - */ - public static final int TRAILING_JAMO = 3; /*[T]*/ - /** - * @stable ICU 2.6 - */ - public static final int LV_SYLLABLE = 4; /*[LV]*/ - /** - * @stable ICU 2.6 - */ - public static final int LVT_SYLLABLE = 5; /*[LVT]*/ - /** - * @stable ICU 2.6 - */ - public static final int COUNT = 6; - } - - /** - * [Sun] This interface moved from UCharacterEnums.java. - * - * 'Enum' for the CharacterCategory constants. These constants are - * compatible in name <b>but not in value</b> with those defined in - * <code>java.lang.Character</code>. - * @see UCharacterCategory - * @draft ICU 3.0 - * @deprecated This is a draft API and might change in a future release of ICU. - */ - public static interface ECharacterCategory - { - /** - * Character type Lu - * @stable ICU 2.1 - */ - public static final int UPPERCASE_LETTER = 1; - - /** - * Character type Lt - * @stable ICU 2.1 - */ - public static final int TITLECASE_LETTER = 3; - - /** - * Character type Lo - * @stable ICU 2.1 - */ - public static final int OTHER_LETTER = 5; } // public data members ----------------------------------------------- @@ -225,14 +204,6 @@ public final class UCharacter public static final int SUPPLEMENTARY_MIN_VALUE = UTF16.SUPPLEMENTARY_MIN_VALUE; - /** - * Special value that is returned by getUnicodeNumericValue(int) when no - * numeric value is defined for a code point. - * @stable ICU 2.4 - * @see #getUnicodeNumericValue - */ - public static final double NO_NUMERIC_VALUE = -123456789; - // public methods ---------------------------------------------------- /** @@ -262,139 +233,30 @@ public final class UCharacter { // when ch is out of bounds getProperty == 0 int props = getProperty(ch); - if (getNumericType(props) != NumericType.DECIMAL) { - return (radix <= 10) ? -1 : getEuropeanDigit(ch); - } - // if props == 0, it will just fall through and return -1 - if (isNotExceptionIndicator(props)) { - // not contained in exception data - // getSignedValue is just shifting so we can check for the sign - // first - // Optimization - // int result = UCharacterProperty.getSignedValue(props); - // if (result >= 0) { - // return result; - // } - if (props >= 0) { - return UCharacterProperty.getSignedValue(props); - } - } - else { - int index = UCharacterProperty.getExceptionIndex(props); - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_NUMERIC_VALUE_)) { - int result = PROPERTY_.getException(index, - UCharacterProperty.EXC_NUMERIC_VALUE_); - if (result >= 0) { - return result; - } - } - } - - if (radix > 10) { - int result = getEuropeanDigit(ch); - if (result >= 0 && result < radix) { - return result; - } - } - return -1; - } - - /** - * <p>Get the numeric value for a Unicode code point as defined in the - * Unicode Character Database.</p> - * <p>A "double" return type is necessary because some numeric values are - * fractions, negative, or too large for int.</p> - * <p>For characters without any numeric values in the Unicode Character - * Database, this function will return NO_NUMERIC_VALUE.</p> - * <p><em>API Change:</em> In release 2.2 and prior, this API has a - * return type int and returns -1 when the argument ch does not have a - * corresponding numeric value. This has been changed to synch with ICU4C - * </p> - * This corresponds to the ICU4C function u_getNumericValue. - * @param ch Code point to get the numeric value for. - * @return numeric value of ch, or NO_NUMERIC_VALUE if none is defined. - * @stable ICU 2.4 - */ - public static double getUnicodeNumericValue(int ch) - { - // equivalent to c version double u_getNumericValue(UChar32 c) - int props = PROPERTY_.getProperty(ch); - int numericType = getNumericType(props); - if (numericType > NumericType.NONE && numericType < NumericType.COUNT) { - if (isNotExceptionIndicator(props)) { - return UCharacterProperty.getSignedValue(props); - } - else { - int index = UCharacterProperty.getExceptionIndex(props); - boolean nex = false; - boolean dex = false; - double numerator = 0; - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_NUMERIC_VALUE_)) { - int num = PROPERTY_.getException(index, - UCharacterProperty.EXC_NUMERIC_VALUE_); - // There are special values for huge numbers that are - // powers of ten. genprops/store.c documents: - // if numericValue = 0x7fffff00 + x then - // numericValue = 10 ^ x - if (num >= NUMERATOR_POWER_LIMIT_) { - num &= 0xff; - // 10^x without math.h - numerator = Math.pow(10, num); - } - else { - numerator = num; - } - nex = true; - } - double denominator = 0; - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_DENOMINATOR_VALUE_)) { - denominator = PROPERTY_.getException(index, - UCharacterProperty.EXC_DENOMINATOR_VALUE_); - // faster path not in c - if (numerator != 0) { - return numerator / denominator; - } - dex = true; - } - - if (nex) { - if (dex) { - return numerator / denominator; - } - return numerator; - } - if (dex) { - return 1 / denominator; - } - } + int value; + if (getNumericType(props) == NumericType.DECIMAL) { + value = UCharacterProperty.getUnsignedValue(props); + } else { + value = getEuropeanDigit(ch); } - return NO_NUMERIC_VALUE; + return (0 <= value && value < radix) ? value : -1; } /** - * Returns a value indicating a code point's Unicode category. - * Up-to-date Unicode implementation of java.lang.Character.getType() - * except for the above mentioned code points that had their category - * changed.<br> - * Return results are constants from the interface - * <a href=UCharacterCategory.html>UCharacterCategory</a><br> - * <em>NOTE:</em> the UCharacterCategory values are <em>not</em> compatible with - * those returned by java.lang.Character.getType. UCharacterCategory values - * match the ones used in ICU4C, while java.lang.Character type - * values, though similar, skip the value 17.</p> - * @param ch code point whose type is to be determined - * @return category which is a value of UCharacterCategory + * Returns the Bidirection property of a code point. + * For example, 0x0041 (letter A) has the LEFT_TO_RIGHT directional + * property.<br> + * Result returned belongs to the interface + * <a href=UCharacterDirection.html>UCharacterDirection</a> + * @param ch the code point to be determined its direction + * @return direction constant from UCharacterDirection. * @stable ICU 2.1 */ - public static int getType(int ch) + public static int getDirection(int ch) { - return getProperty(ch) & UCharacterProperty.TYPE_MASK; + return gBdp.getClass(ch); } - //// for StringPrep /** * Returns a code point corresponding to the two UTF16 characters. * @param lead the lead char @@ -406,135 +268,12 @@ public final class UCharacter */ public static int getCodePoint(char lead, char trail) { - if (lead >= UTF16.LEAD_SURROGATE_MIN_VALUE && - lead <= UTF16.LEAD_SURROGATE_MAX_VALUE && - trail >= UTF16.TRAIL_SURROGATE_MIN_VALUE && - trail <= UTF16.TRAIL_SURROGATE_MAX_VALUE) { + if (UTF16.isLeadSurrogate(lead) && UTF16.isTrailSurrogate(trail)) { return UCharacterProperty.getRawSupplementary(lead, trail); } throw new IllegalArgumentException("Illegal surrogate characters"); } - //// for StringPrep - /** - * Returns the Bidirection property of a code point. - * For example, 0x0041 (letter A) has the LEFT_TO_RIGHT directional - * property.<br> - * Result returned belongs to the interface - * <a href=UCharacterDirection.html>UCharacterDirection</a> - * @param ch the code point to be determined its direction - * @return direction constant from UCharacterDirection. - * @stable ICU 2.1 - */ - public static int getDirection(int ch) - { - // when ch is out of bounds getProperty == 0 - return (getProperty(ch) >> BIDI_SHIFT_) & BIDI_MASK_AFTER_SHIFT_; - } - - /** - * The given string is mapped to its case folding equivalent according to - * UnicodeData.txt and CaseFolding.txt; if any character has no case - * folding equivalent, the character itself is returned. - * "Full", multiple-code point case folding mappings are returned here. - * For "simple" single-code point mappings use the API - * foldCase(int ch, boolean defaultmapping). - * @param str the String to be converted - * @param defaultmapping Indicates if all mappings defined in - * CaseFolding.txt is to be used, otherwise the - * mappings for dotted I and dotless i marked with - * 'I' in CaseFolding.txt will be skipped. - * @return the case folding equivalent of the character, if - * any; otherwise the character itself. - * @see #foldCase(int, boolean) - * @stable ICU 2.1 - */ - public static String foldCase(String str, boolean defaultmapping) - { - int size = str.length(); - StringBuffer result = new StringBuffer(size); - int offset = 0; - int ch; - - // case mapping loop - while (offset < size) { - ch = UTF16.charAt(str, offset); - offset += UTF16.getCharCount(ch); - int props = PROPERTY_.getProperty(ch); - if (isNotExceptionIndicator(props)) { - int type = UCharacterProperty.TYPE_MASK & props; - if (type == ECharacterCategory.UPPERCASE_LETTER || - type == ECharacterCategory.TITLECASE_LETTER) { - ch += UCharacterProperty.getSignedValue(props); - } - } - else { - int index = UCharacterProperty.getExceptionIndex(props); - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_CASE_FOLDING_)) { - int exception = PROPERTY_.getException(index, - UCharacterProperty.EXC_CASE_FOLDING_); - if (exception != 0) { - PROPERTY_.getFoldCase(exception & LAST_CHAR_MASK_, - exception >> SHIFT_24_, result); - } - else { - // special case folding mappings, hardcoded - if (ch != 0x49 && ch != 0x130) { - // return ch itself because there is no special - // mapping for it - UTF16.append(result, ch); - continue; - } - if (defaultmapping) { - // default mappings - if (ch == 0x49) { - // 0049; C; 0069; # LATIN CAPITAL LETTER I - result.append( - UCharacterProperty.LATIN_SMALL_LETTER_I_); - } - else if (ch == 0x130) { - // 0130; F; 0069 0307; - // # LATIN CAPITAL LETTER I WITH DOT ABOVE - result.append( - UCharacterProperty.LATIN_SMALL_LETTER_I_); - result.append((char)0x307); - } - } - else { - // Turkic mappings - if (ch == 0x49) { - // 0049; T; 0131; # LATIN CAPITAL LETTER I - result.append((char)0x131); - } - else if (ch == 0x130) { - // 0130; T; 0069; - // # LATIN CAPITAL LETTER I WITH DOT ABOVE - result.append( - UCharacterProperty.LATIN_SMALL_LETTER_I_); - } - } - } - // do not fall through to the output of c - continue; - } - else { - if (PROPERTY_.hasExceptionValue(index, - UCharacterProperty.EXC_LOWERCASE_)) { - ch = PROPERTY_.getException(index, - UCharacterProperty.EXC_LOWERCASE_); - } - } - - } - - // handle 1:1 code point mappings from UnicodeData.txt - UTF16.append(result, ch); - } - - return result.toString(); - } - /** * <p>Get the "age" of the code point.</p> * <p>The "age" is the Unicode version when the code point was first @@ -555,83 +294,6 @@ public final class UCharacter return PROPERTY_.getAge(ch); } - /** - * <p>Gets the property value for an Unicode property type of a code point. - * Also returns binary and mask property values.</p> - * <p>Unicode, especially in version 3.2, defines many more properties than - * the original set in UnicodeData.txt.</p> - * <p>The properties APIs are intended to reflect Unicode properties as - * defined in the Unicode Character Database (UCD) and Unicode Technical - * Reports (UTR). For details about the properties see - * http://www.unicode.org/.</p> - * <p>For names of Unicode properties see the UCD file PropertyAliases.txt. - * </p> - * <pre> - * Sample usage: - * int ea = UCharacter.getIntPropertyValue(c, UProperty.EAST_ASIAN_WIDTH); - * int ideo = UCharacter.getIntPropertyValue(c, UProperty.IDEOGRAPHIC); - * boolean b = (ideo == 1) ? true : false; - * </pre> - * @param ch code point to test. - * @param type UProperty selector constant, identifies which binary - * property to check. Must be - * UProperty.BINARY_START <= type < UProperty.BINARY_LIMIT or - * UProperty.INT_START <= type < UProperty.INT_LIMIT or - * UProperty.MASK_START <= type < UProperty.MASK_LIMIT. - * @return numeric value that is directly the property value or, - * for enumerated properties, corresponds to the numeric value of - * the enumerated constant of the respective property value - * enumeration type (cast to enum type if necessary). - * Returns 0 or 1 (for false / true) for binary Unicode properties. - * Returns a bit-mask for mask properties. - * Returns 0 if 'type' is out of bounds or if the Unicode version - * does not have data for the property at all, or not for this code - * point. - * @see UProperty - * @see #hasBinaryProperty - * @see #getIntPropertyMinValue - * @see #getIntPropertyMaxValue - * @see #getUnicodeVersion - * @stable ICU 2.4 - */ - public static int getIntPropertyValue(int ch, int type) - { - /* - * For Normalizer with Unicode 3.2, this method is called only for - * HANGUL_SYLLABLE_TYPE in UnicodeSet.addPropertyStarts(). - */ - if (type == UProperty.HANGUL_SYLLABLE_TYPE) { - /* purely algorithmic; hardcode known characters, check for assigned new ones */ - if(ch<NormalizerImpl.JAMO_L_BASE) { - /* NA */ - } else if(ch<=0x11ff) { - /* Jamo range */ - if(ch<=0x115f) { - /* Jamo L range, HANGUL CHOSEONG ... */ - if(ch==0x115f || ch<=0x1159 || getType(ch)==ECharacterCategory.OTHER_LETTER) { - return HangulSyllableType.LEADING_JAMO; - } - } else if(ch<=0x11a7) { - /* Jamo V range, HANGUL JUNGSEONG ... */ - if(ch<=0x11a2 || getType(ch)==ECharacterCategory.OTHER_LETTER) { - return HangulSyllableType.VOWEL_JAMO; - } - } else { - /* Jamo T range */ - if(ch<=0x11f9 || getType(ch)==ECharacterCategory.OTHER_LETTER) { - return HangulSyllableType.TRAILING_JAMO; - } - } - } else if((ch-=NormalizerImpl.HANGUL_BASE)<0) { - /* NA */ - } else if(ch<NormalizerImpl.HANGUL_COUNT) { - /* Hangul syllable */ - return ch%NormalizerImpl.JAMO_T_COUNT==0 ? HangulSyllableType.LV_SYLLABLE : HangulSyllableType.LVT_SYLLABLE; - } - } - return 0; /* NA */ - } - // private variables ------------------------------------------------- /** @@ -643,143 +305,43 @@ public final class UCharacter */ private static final char[] PROPERTY_TRIE_INDEX_; private static final char[] PROPERTY_TRIE_DATA_; - private static final int[] PROPERTY_DATA_; private static final int PROPERTY_INITIAL_VALUE_; + private static final UBiDiProps gBdp; + // block to initialise character property database static { try { - PROPERTY_ = UCharacterProperty.getInstance(); - PROPERTY_TRIE_INDEX_ = PROPERTY_.m_trieIndex_; - PROPERTY_TRIE_DATA_ = PROPERTY_.m_trieData_; - PROPERTY_DATA_ = PROPERTY_.m_property_; - PROPERTY_INITIAL_VALUE_ - = PROPERTY_DATA_[PROPERTY_.m_trieInitialValue_]; + PROPERTY_ = UCharacterProperty.getInstance(); + PROPERTY_TRIE_INDEX_ = PROPERTY_.m_trieIndex_; + PROPERTY_TRIE_DATA_ = PROPERTY_.m_trieData_; + PROPERTY_INITIAL_VALUE_ = PROPERTY_.m_trieInitialValue_; } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + throw new MissingResourceException(e.getMessage(),"",""); } - } - - /** - * To get the last character out from a data type - */ - private static final int LAST_CHAR_MASK_ = 0xFFFF; - - /** - * To get the last byte out from a data type - */ -// private static final int LAST_BYTE_MASK_ = 0xFF; - - /** - * Shift 16 bits - */ -// private static final int SHIFT_16_ = 16; - /** - * Shift 24 bits - */ - private static final int SHIFT_24_ = 24; + UBiDiProps bdp; + try { + bdp=UBiDiProps.getSingleton(); + } catch(IOException e) { + bdp=UBiDiProps.getDummy(); + } + gBdp=bdp; + } /** * Shift to get numeric type */ - private static final int NUMERIC_TYPE_SHIFT_ = 12; + private static final int NUMERIC_TYPE_SHIFT_ = 5; /** * Mask to get numeric type */ private static final int NUMERIC_TYPE_MASK_ = 0x7 << NUMERIC_TYPE_SHIFT_; - /** - * Shift to get bidi bits - */ - private static final int BIDI_SHIFT_ = 6; - /** - * Mask to be applied after shifting to get bidi bits - */ - private static final int BIDI_MASK_AFTER_SHIFT_ = 0x1F; - - /** - * <p>Numerator power limit. - * There are special values for huge numbers that are powers of ten.</p> - * <p>c version genprops/store.c documents: - * if numericValue = 0x7fffff00 + x then numericValue = 10 ^ x</p> - */ - private static final int NUMERATOR_POWER_LIMIT_ = 0x7fffff00; - /** - * Integer properties mask and shift values for joining type. - * Equivalent to icu4c UPROPS_JT_MASK. - */ - private static final int JOINING_TYPE_MASK_ = 0x00003800; - /** - * Integer properties mask and shift values for joining type. - * Equivalent to icu4c UPROPS_JT_SHIFT. - */ - private static final int JOINING_TYPE_SHIFT_ = 11; - /** - * Integer properties mask and shift values for joining group. - * Equivalent to icu4c UPROPS_JG_MASK. - */ - private static final int JOINING_GROUP_MASK_ = 0x000007e0; - /** - * Integer properties mask and shift values for joining group. - * Equivalent to icu4c UPROPS_JG_SHIFT. - */ - private static final int JOINING_GROUP_SHIFT_ = 5; - /** - * Integer properties mask for decomposition type. - * Equivalent to icu4c UPROPS_DT_MASK. - */ - private static final int DECOMPOSITION_TYPE_MASK_ = 0x0000001f; - /** - * Integer properties mask and shift values for East Asian cell width. - * Equivalent to icu4c UPROPS_EA_MASK - */ - private static final int EAST_ASIAN_MASK_ = 0x00038000; - /** - * Integer properties mask and shift values for East Asian cell width. - * Equivalent to icu4c UPROPS_EA_SHIFT - */ - private static final int EAST_ASIAN_SHIFT_ = 15; - - /** - * Integer properties mask and shift values for line breaks. - * Equivalent to icu4c UPROPS_LB_MASK - */ - private static final int LINE_BREAK_MASK_ = 0x007C0000; - /** - * Integer properties mask and shift values for line breaks. - * Equivalent to icu4c UPROPS_LB_SHIFT - */ - private static final int LINE_BREAK_SHIFT_ = 18; - /** - * Integer properties mask and shift values for blocks. - * Equivalent to icu4c UPROPS_BLOCK_MASK - */ - private static final int BLOCK_MASK_ = 0x00007f80; - /** - * Integer properties mask and shift values for blocks. - * Equivalent to icu4c UPROPS_BLOCK_SHIFT - */ - private static final int BLOCK_SHIFT_ = 7; - /** - * Integer properties mask and shift values for scripts. - * Equivalent to icu4c UPROPS_SHIFT_MASK - */ - private static final int SCRIPT_MASK_ = 0x0000007f; - - // private constructor ----------------------------------------------- - ///CLOVER:OFF - /** - * Private constructor to prevent instantiation - */ - private UCharacter() - { - } - ///CLOVER:ON // private methods --------------------------------------------------- /** @@ -818,17 +380,6 @@ public final class UCharacter return (props & NUMERIC_TYPE_MASK_) >> NUMERIC_TYPE_SHIFT_; } - /** - * Checks if the property value has a exception indicator - * @param props 32 bit property value - * @return true if property does not have a exception indicator, false - * otherwise - */ - private static boolean isNotExceptionIndicator(int props) - { - return (props & UCharacterProperty.EXCEPTION_MASK) == 0; - } - /** * Gets the property value at the index. * This is optimized. @@ -841,35 +392,34 @@ public final class UCharacter * @return property value of code point * @stable ICU 2.6 */ - private static int getProperty(int ch) + private static final int getProperty(int ch) { if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE || (ch > UTF16.LEAD_SURROGATE_MAX_VALUE && ch < UTF16.SUPPLEMENTARY_MIN_VALUE)) { - // BMP codepoint - try { // using try for < 0 ch is faster than using an if statement - return PROPERTY_DATA_[ - PROPERTY_TRIE_DATA_[ + // BMP codepoint 0000..D7FF or DC00..FFFF + try { // using try for ch < 0 is faster than using an if statement + return PROPERTY_TRIE_DATA_[ (PROPERTY_TRIE_INDEX_[ch >> 5] << 2) - + (ch & 0x1f)]]; + + (ch & 0x1f)]; } catch (ArrayIndexOutOfBoundsException e) { return PROPERTY_INITIAL_VALUE_; } } if (ch <= UTF16.LEAD_SURROGATE_MAX_VALUE) { - // surrogate - return PROPERTY_DATA_[ - PROPERTY_TRIE_DATA_[ + // lead surrogate D800..DBFF + return PROPERTY_TRIE_DATA_[ (PROPERTY_TRIE_INDEX_[(0x2800 >> 5) + (ch >> 5)] << 2) - + (ch & 0x1f)]]; + + (ch & 0x1f)]; } // for optimization if (ch <= UTF16.CODEPOINT_MAX_VALUE) { + // supplementary code point 10000..10FFFF // look at the construction of supplementary characters // trail forms the ends of it. - return PROPERTY_DATA_[PROPERTY_.m_trie_.getSurrogateValue( + return PROPERTY_.m_trie_.getSurrogateValue( UTF16.getLeadSurrogate(ch), - (char)(ch & 0x3ff))]; + (char)(ch & 0x3ff)); } // return m_dataOffset_ if there is an error, in this case we return // the default value: m_initialValue_ @@ -877,4 +427,5 @@ public final class UCharacter // this is for optimization. return PROPERTY_INITIAL_VALUE_; } + } diff --git a/src/share/classes/sun/text/normalizer/UCharacterProperty.java b/src/share/classes/sun/text/normalizer/UCharacterProperty.java index 1a748ff173121c420b18d219faad05b7ae5b1445..a7412588ec1a8499de53c0b2221818a2b7113262 100644 --- a/src/share/classes/sun/text/normalizer/UCharacterProperty.java +++ b/src/share/classes/sun/text/normalizer/UCharacterProperty.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -40,8 +39,7 @@ package sun.text.normalizer; import java.io.BufferedInputStream; import java.io.InputStream; import java.io.IOException; -import java.text.BreakIterator; -import java.util.Locale; +import java.util.MissingResourceException; /** * <p>Internal class used for Unicode character property database.</p> @@ -56,10 +54,9 @@ import java.util.Locale; * <a href=UCharacter.html>UCharacter</a>.</p> * @author Syn Wee Quek * @since release 2.1, february 1st 2002 -* @draft 2.1 */ -public final class UCharacterProperty implements Trie.DataManipulate +public final class UCharacterProperty { // public data members ----------------------------------------------- @@ -83,68 +80,16 @@ public final class UCharacterProperty implements Trie.DataManipulate */ public int m_trieInitialValue_; /** - * Character property table - */ - public int m_property_[]; - /** * Unicode version */ public VersionInfo m_unicodeVersion_; - /** - * Exception indicator for uppercase type - */ - public static final int EXC_UPPERCASE_ = 0; - /** - * Exception indicator for lowercase type - */ - public static final int EXC_LOWERCASE_ = 1; - /** - * Exception indicator for titlecase type - */ - public static final int EXC_TITLECASE_ = 2; - /** - * Exception indicator for digit type - */ - public static final int EXC_UNUSED_ = 3; - /** - * Exception indicator for numeric type - */ - public static final int EXC_NUMERIC_VALUE_ = 4; - /** - * Exception indicator for denominator type - */ - public static final int EXC_DENOMINATOR_VALUE_ = 5; - /** - * Exception indicator for mirror type - */ - public static final int EXC_MIRROR_MAPPING_ = 6; - /** - * Exception indicator for special casing type - */ - public static final int EXC_SPECIAL_CASING_ = 7; - /** - * Exception indicator for case folding type - */ - public static final int EXC_CASE_FOLDING_ = 8; - /** - * EXC_COMBINING_CLASS_ is not found in ICU. - * Used to retrieve the combining class of the character in the exception - * value - */ - public static final int EXC_COMBINING_CLASS_ = 9; - /** - * Latin lowercase i - */ - public static final char LATIN_SMALL_LETTER_I_ = 0x69; - /** - * Character type mask - */ - public static final int TYPE_MASK = 0x1F; - /** - * Exception test mask - */ - public static final int EXCEPTION_MASK = 0x20; + // uprops.h enum UPropertySource --------------------------------------- *** + + /** From uchar.c/uprops.icu properties vectors trie */ + public static final int SRC_PROPSVEC=2; + /** One more than the highest UPropertySource (SRC_) constant. */ + public static final int SRC_COUNT=9; // public methods ---------------------------------------------------- @@ -158,23 +103,6 @@ public final class UCharacterProperty implements Trie.DataManipulate m_trieInitialValue_ = friendagent.getPrivateInitialValue(); } - /** - * Called by com.ibm.icu.util.Trie to extract from a lead surrogate's - * data the index array offset of the indexes for that lead surrogate. - * @param value data value for a surrogate from the trie, including the - * folding offset - * @return data offset or 0 if there is no data for the lead surrogate - */ - public int getFoldingOffset(int value) - { - if ((value & SUPPLEMENTARY_FOLD_INDICATOR_MASK_) != 0) { - return (value & SUPPLEMENTARY_FOLD_OFFSET_MASK_); - } - else { - return 0; - } - } - /** * Gets the property value at the index. * This is optimized. @@ -183,129 +111,79 @@ public final class UCharacterProperty implements Trie.DataManipulate * @param ch code point whose property value is to be retrieved * @return property value of code point */ - public int getProperty(int ch) + public final int getProperty(int ch) { if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE || (ch > UTF16.LEAD_SURROGATE_MAX_VALUE && ch < UTF16.SUPPLEMENTARY_MIN_VALUE)) { - // BMP codepoint + // BMP codepoint 0000..D7FF or DC00..FFFF // optimized - try { - return m_property_[ - m_trieData_[ + try { // using try for ch < 0 is faster than using an if statement + return m_trieData_[ (m_trieIndex_[ch >> Trie.INDEX_STAGE_1_SHIFT_] << Trie.INDEX_STAGE_2_SHIFT_) - + (ch & Trie.INDEX_STAGE_3_MASK_)]]; + + (ch & Trie.INDEX_STAGE_3_MASK_)]; } catch (ArrayIndexOutOfBoundsException e) { - return m_property_[m_trieInitialValue_]; + return m_trieInitialValue_; } } if (ch <= UTF16.LEAD_SURROGATE_MAX_VALUE) { - return m_property_[ - m_trieData_[ + // lead surrogate D800..DBFF + return m_trieData_[ (m_trieIndex_[Trie.LEAD_INDEX_OFFSET_ + (ch >> Trie.INDEX_STAGE_1_SHIFT_)] << Trie.INDEX_STAGE_2_SHIFT_) - + (ch & Trie.INDEX_STAGE_3_MASK_)]]; + + (ch & Trie.INDEX_STAGE_3_MASK_)]; } - // for optimization if (ch <= UTF16.CODEPOINT_MAX_VALUE) { + // supplementary code point 10000..10FFFF // look at the construction of supplementary characters // trail forms the ends of it. - return m_property_[m_trie_.getSurrogateValue( + return m_trie_.getSurrogateValue( UTF16.getLeadSurrogate(ch), - (char)(ch & Trie.SURROGATE_MASK_))]; + (char)(ch & Trie.SURROGATE_MASK_)); } + // ch is out of bounds // return m_dataOffset_ if there is an error, in this case we return // the default value: m_initialValue_ // we cannot assume that m_initialValue_ is at offset 0 // this is for optimization. - return m_property_[m_trieInitialValue_]; - // return m_property_[m_trie_.getCodePointValue(ch)]; + return m_trieInitialValue_; + + // this all is an inlined form of return m_trie_.getCodePointValue(ch); } /** - * Getting the signed numeric value of a character embedded in the property + * Getting the unsigned numeric value of a character embedded in the property * argument * @param prop the character - * @return signed numberic value - */ - public static int getSignedValue(int prop) - { - return (prop >> VALUE_SHIFT_); - } - - /** - * Getting the exception index for argument property - * @param prop character property - * @return exception index + * @return unsigned numberic value */ - public static int getExceptionIndex(int prop) + public static int getUnsignedValue(int prop) { return (prop >> VALUE_SHIFT_) & UNSIGNED_VALUE_MASK_AFTER_SHIFT_; } - /** - * Determines if the exception value passed in has the kind of information - * which the indicator wants, e.g if the exception value contains the digit - * value of the character - * @param index exception index - * @param indicator type indicator - * @return true if type value exist - */ - public boolean hasExceptionValue(int index, int indicator) - { - return (m_exception_[index] & (1 << indicator)) != 0; - } - - /** - * Gets the exception value at the index, assuming that data type is - * available. Result is undefined if data is not available. Use - * hasExceptionValue() to determine data's availability. - * @param index - * @param etype exception data type - * @return exception data type value at index - */ - public int getException(int index, int etype) - { - // contained in exception data - if (etype == EXC_COMBINING_CLASS_) { - return m_exception_[index]; - } - // contained in the exception digit address - index = addExceptionOffset(m_exception_[index], etype, ++ index); - return m_exception_[index]; - } - - /** - * Gets the folded case value at the index - * @param index of the case value to be retrieved - * @param count number of characters to retrieve - * @param str string buffer to which to append the result - */ - public void getFoldCase(int index, int count, StringBuffer str) - { - // first 2 chars are for the simple mappings - index += 2; - while (count > 0) { - str.append(m_case_[index]); - index ++; - count --; - } - } - /** * Gets the unicode additional properties. * C version getUnicodeProperties. * @param codepoint codepoint whose additional properties is to be * retrieved + * @param column * @return unicode properties */ - public int getAdditional(int codepoint) { - return m_additionalVectors_[m_additionalTrie_.getCodePointValue(codepoint)]; + public int getAdditional(int codepoint, int column) { + if (column == -1) { + return getProperty(codepoint); + } + if (column < 0 || column >= m_additionalColumnsCount_) { + return 0; + } + return m_additionalVectors_[ + m_additionalTrie_.getCodePointValue(codepoint) + column]; } - /** + /** * <p>Get the "age" of the code point.</p> * <p>The "age" is the Unicode version when the code point was first * designated (as a non-character or for Private Use) or assigned a @@ -316,11 +194,10 @@ public final class UCharacterProperty implements Trie.DataManipulate * <p>This API does not check the validity of the codepoint.</p> * @param codepoint The code point. * @return the Unicode version number - * @draft ICU 2.1 */ public VersionInfo getAge(int codepoint) { - int version = getAdditional(codepoint) >> AGE_SHIFT_; + int version = getAdditional(codepoint, 0) >> AGE_SHIFT_; return VersionInfo.getInstance( (version >> FIRST_NIBBLE_SHIFT_) & LAST_NIBBLE_MASK_, version & LAST_NIBBLE_MASK_, 0, 0); @@ -341,16 +218,16 @@ public final class UCharacterProperty implements Trie.DataManipulate /** * Loads the property data and initialize the UCharacterProperty instance. - * @throws RuntimeException when data is missing or data has been corrupted + * @throws MissingResourceException when data is missing or data has been corrupted */ - public static UCharacterProperty getInstance() throws RuntimeException + public static UCharacterProperty getInstance() { - if (INSTANCE_ == null) { + if(INSTANCE_ == null) { try { INSTANCE_ = new UCharacterProperty(); } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + throw new MissingResourceException(e.getMessage(),"",""); } } return INSTANCE_; @@ -359,6 +236,9 @@ public final class UCharacterProperty implements Trie.DataManipulate /** * Checks if the argument c is to be treated as a white space in ICU * rules. Usually ICU rule white spaces are ignored unless quoted. + * Equivalent to test for Pattern_White_Space Unicode property. + * Stable set of characters, won't change. + * See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/ * @param c codepoint to check * @return true if c is a ICU white space */ @@ -366,8 +246,9 @@ public final class UCharacterProperty implements Trie.DataManipulate { /* "white space" in the sense of ICU rule parsers This is a FIXED LIST that is NOT DEPENDENT ON UNICODE PROPERTIES. - See UTR #31: http://www.unicode.org/reports/tr31/. + See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/ U+0009..U+000D, U+0020, U+0085, U+200E..U+200F, and U+2028..U+2029 + Equivalent to test for Pattern_White_Space Unicode property. */ return (c >= 0x0009 && c <= 0x2029 && (c <= 0x000D || c == 0x0020 || c == 0x0085 || @@ -376,15 +257,6 @@ public final class UCharacterProperty implements Trie.DataManipulate // protected variables ----------------------------------------------- - /** - * Case table - */ - char m_case_[]; - - /** - * Exception property table - */ - int m_exception_[]; /** * Extra property trie */ @@ -426,78 +298,20 @@ public final class UCharacterProperty implements Trie.DataManipulate */ private static final int DATA_BUFFER_SIZE_ = 25000; - /** - * This, from what i infer is the max size of the indicators used for the - * exception values. - * Number of bits in an 8-bit integer value - */ - private static final int EXC_GROUP_ = 8; - - /** - * Mask to get the group - */ - private static final int EXC_GROUP_MASK_ = 255; - - /** - * Mask to get the digit value in the exception result - */ - private static final int EXC_DIGIT_MASK_ = 0xFFFF; - - /** - * Offset table for data in exception block.<br> - * Table formed by the number of bits used for the index, e.g. 0 = 0 bits, - * 1 = 1 bits. - */ - private static final byte FLAGS_OFFSET_[] = - { - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 - }; - /** * Numeric value shift */ - private static final int VALUE_SHIFT_ = 20; + private static final int VALUE_SHIFT_ = 8; /** * Mask to be applied after shifting to obtain an unsigned numeric value */ - private static final int UNSIGNED_VALUE_MASK_AFTER_SHIFT_ = 0x7FF; - - /** - * - */ - private static final int NUMERIC_TYPE_SHIFT = 12; - - /** - * Folding indicator mask - */ - private static final int SUPPLEMENTARY_FOLD_INDICATOR_MASK_ = 0x8000; - - /** - * Folding offset mask - */ - private static final int SUPPLEMENTARY_FOLD_OFFSET_MASK_ = 0x7FFF; + private static final int UNSIGNED_VALUE_MASK_AFTER_SHIFT_ = 0xFF; /** * Shift value for lead surrogate to form a supplementary character. */ private static final int LEAD_SURROGATE_SHIFT_ = 10; - /** * Offset to add to combined surrogate pair to avoid msking. */ @@ -507,16 +321,12 @@ public final class UCharacterProperty implements Trie.DataManipulate LEAD_SURROGATE_SHIFT_) - UTF16.TRAIL_SURROGATE_MIN_VALUE; - /** - * To get the last character out from a data type - */ - private static final int LAST_CHAR_MASK_ = 0xFFFF; + // additional properties ---------------------------------------------- /** * First nibble shift */ private static final int FIRST_NIBBLE_SHIFT_ = 0x4; - /** * Second nibble mask */ @@ -530,7 +340,7 @@ public final class UCharacterProperty implements Trie.DataManipulate /** * Constructor - * @exception thrown when data reading fails or data corrupted + * @exception IOException thrown when data reading fails or data corrupted */ private UCharacterProperty() throws IOException { @@ -544,275 +354,16 @@ public final class UCharacterProperty implements Trie.DataManipulate m_trie_.putIndexData(this); } - /* Is followed by {case-ignorable}* cased ? */ - /** - * Getting the correct address for data in the exception value - * @param evalue exception value - * @param indicator type of data to retrieve - * @param address current address to move from - * @return the correct address - */ - private int addExceptionOffset(int evalue, int indicator, int address) - { - int result = address; - if (indicator >= EXC_GROUP_) { - result += FLAGS_OFFSET_[evalue & EXC_GROUP_MASK_]; - evalue >>= EXC_GROUP_; - indicator -= EXC_GROUP_; - } - int mask = (1 << indicator) - 1; - result += FLAGS_OFFSET_[evalue & mask]; - return result; - } - - private static final int TAB = 0x0009; - private static final int LF = 0x000a; - private static final int FF = 0x000c; - private static final int CR = 0x000d; - private static final int U_A = 0x0041; - private static final int U_Z = 0x005a; - private static final int U_a = 0x0061; - private static final int U_z = 0x007a; - private static final int DEL = 0x007f; - private static final int NL = 0x0085; - private static final int NBSP = 0x00a0; - private static final int CGJ = 0x034f; - private static final int FIGURESP= 0x2007; - private static final int HAIRSP = 0x200a; - private static final int ZWNJ = 0x200c; - private static final int ZWJ = 0x200d; - private static final int RLM = 0x200f; - private static final int NNBSP = 0x202f; - private static final int WJ = 0x2060; - private static final int INHSWAP = 0x206a; - private static final int NOMDIG = 0x206f; - private static final int ZWNBSP = 0xfeff; - - public UnicodeSet addPropertyStarts(UnicodeSet set) { - int c; - - /* add the start code point of each same-value range of each trie */ - //utrie_enum(&normTrie, NULL, _enumPropertyStartsRange, set); - TrieIterator propsIter = new TrieIterator(m_trie_); - RangeValueIterator.Element propsResult = new RangeValueIterator.Element(); - while(propsIter.next(propsResult)){ - set.add(propsResult.start); - } - //utrie_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, set); - TrieIterator propsVectorsIter = new TrieIterator(m_additionalTrie_); - RangeValueIterator.Element propsVectorsResult = new RangeValueIterator.Element(); - while(propsVectorsIter.next(propsVectorsResult)){ - set.add(propsVectorsResult.start); - } - - - /* add code points with hardcoded properties, plus the ones following them */ - - /* add for IS_THAT_CONTROL_SPACE() */ - set.add(TAB); /* range TAB..CR */ - set.add(CR+1); - set.add(0x1c); - set.add(0x1f+1); - set.add(NL); - set.add(NL+1); - - /* add for u_isIDIgnorable() what was not added above */ - set.add(DEL); /* range DEL..NBSP-1, NBSP added below */ - set.add(HAIRSP); - set.add(RLM+1); - set.add(INHSWAP); - set.add(NOMDIG+1); - set.add(ZWNBSP); - set.add(ZWNBSP+1); - - /* add no-break spaces for u_isWhitespace() what was not added above */ - set.add(NBSP); - set.add(NBSP+1); - set.add(FIGURESP); - set.add(FIGURESP+1); - set.add(NNBSP); - set.add(NNBSP+1); - - /* add for u_charDigitValue() */ - set.add(0x3007); - set.add(0x3008); - set.add(0x4e00); - set.add(0x4e01); - set.add(0x4e8c); - set.add(0x4e8d); - set.add(0x4e09); - set.add(0x4e0a); - set.add(0x56db); - set.add(0x56dc); - set.add(0x4e94); - set.add(0x4e95); - set.add(0x516d); - set.add(0x516e); - set.add(0x4e03); - set.add(0x4e04); - set.add(0x516b); - set.add(0x516c); - set.add(0x4e5d); - set.add(0x4e5e); - - /* add for u_digit() */ - set.add(U_a); - set.add(U_z+1); - set.add(U_A); - set.add(U_Z+1); - - /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */ - set.add(WJ); /* range WJ..NOMDIG */ - set.add(0xfff0); - set.add(0xfffb+1); - set.add(0xe0000); - set.add(0xe0fff+1); - - /* add for UCHAR_GRAPHEME_BASE and others */ - set.add(CGJ); - set.add(CGJ+1); - - /* add for UCHAR_JOINING_TYPE */ - set.add(ZWNJ); /* range ZWNJ..ZWJ */ - set.add(ZWJ+1); - - /* add Jamo type boundaries for UCHAR_HANGUL_SYLLABLE_TYPE */ - set.add(0x1100); - int value= UCharacter.HangulSyllableType.LEADING_JAMO; - int value2; - for(c=0x115a; c<=0x115f; ++c) { - value2= UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE); - if(value!=value2) { - value=value2; - set.add(c); - } - } - - set.add(0x1160); - value=UCharacter.HangulSyllableType.VOWEL_JAMO; - for(c=0x11a3; c<=0x11a7; ++c) { - value2=UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE); - if(value!=value2) { - value=value2; - set.add(c); - } - } - - set.add(0x11a8); - value=UCharacter.HangulSyllableType.TRAILING_JAMO; - for(c=0x11fa; c<=0x11ff; ++c) { - value2=UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE); - if(value!=value2) { - value=value2; - set.add(c); + public void upropsvec_addPropertyStarts(UnicodeSet set) { + /* add the start code point of each same-value range of the properties vectors trie */ + if(m_additionalColumnsCount_>0) { + /* if m_additionalColumnsCount_==0 then the properties vectors trie may not be there at all */ + TrieIterator propsVectorsIter = new TrieIterator(m_additionalTrie_); + RangeValueIterator.Element propsVectorsResult = new RangeValueIterator.Element(); + while(propsVectorsIter.next(propsVectorsResult)){ + set.add(propsVectorsResult.start); } } - - - /* - * Omit code points for u_charCellWidth() because - * - it is deprecated and not a real Unicode property - * - they are probably already set from the trie enumeration - */ - - /* - * Omit code points with hardcoded specialcasing properties - * because we do not build property UnicodeSets for them right now. - */ - return set; // for chaining - } -/*---------------------------------------------------------------- - * Inclusions list - *----------------------------------------------------------------*/ - - /* - * Return a set of characters for property enumeration. - * The set implicitly contains 0x110000 as well, which is one more than the highest - * Unicode code point. - * - * This set is used as an ordered list - its code points are ordered, and - * consecutive code points (in Unicode code point order) in the set define a range. - * For each two consecutive characters (start, limit) in the set, - * all of the UCD/normalization and related properties for - * all code points start..limit-1 are all the same, - * except for character names and ISO comments. - * - * All Unicode code points U+0000..U+10ffff are covered by these ranges. - * The ranges define a partition of the Unicode code space. - * ICU uses the inclusions set to enumerate properties for generating - * UnicodeSets containing all code points that have a certain property value. - * - * The Inclusion List is generated from the UCD. It is generated - * by enumerating the data tries, and code points for hardcoded properties - * are added as well. - * - * -------------------------------------------------------------------------- - * - * The following are ideas for getting properties-unique code point ranges, - * with possible optimizations beyond the current implementation. - * These optimizations would require more code and be more fragile. - * The current implementation generates one single list (set) for all properties. - * - * To enumerate properties efficiently, one needs to know ranges of - * repetitive values, so that the value of only each start code point - * can be applied to the whole range. - * This information is in principle available in the uprops.icu/unorm.icu data. - * - * There are two obstacles: - * - * 1. Some properties are computed from multiple data structures, - * making it necessary to get repetitive ranges by intersecting - * ranges from multiple tries. - * - * 2. It is not economical to write code for getting repetitive ranges - * that are precise for each of some 50 properties. - * - * Compromise ideas: - * - * - Get ranges per trie, not per individual property. - * Each range contains the same values for a whole group of properties. - * This would generate currently five range sets, two for uprops.icu tries - * and three for unorm.icu tries. - * - * - Combine sets of ranges for multiple tries to get sufficient sets - * for properties, e.g., the uprops.icu main and auxiliary tries - * for all non-normalization properties. - * - * Ideas for representing ranges and combining them: - * - * - A UnicodeSet could hold just the start code points of ranges. - * Multiple sets are easily combined by or-ing them together. - * - * - Alternatively, a UnicodeSet could hold each even-numbered range. - * All ranges could be enumerated by using each start code point - * (for the even-numbered ranges) as well as each limit (end+1) code point - * (for the odd-numbered ranges). - * It should be possible to combine two such sets by xor-ing them, - * but no more than two. - * - * The second way to represent ranges may(?!) yield smaller UnicodeSet arrays, - * but the first one is certainly simpler and applicable for combining more than - * two range sets. - * - * It is possible to combine all range sets for all uprops/unorm tries into one - * set that can be used for all properties. - * As an optimization, there could be less-combined range sets for certain - * groups of properties. - * The relationship of which less-combined range set to use for which property - * depends on the implementation of the properties and must be hardcoded - * - somewhat error-prone and higher maintenance but can be tested easily - * by building property sets "the simple way" in test code. - * - * --- - * - * Do not use a UnicodeSet pattern because that causes infinite recursion; - * UnicodeSet depends on the inclusions set. - */ - public UnicodeSet getInclusions() { - UnicodeSet set = new UnicodeSet(); - NormalizerImpl.addPropertyStarts(set); - addPropertyStarts(set); - return set; } } diff --git a/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java b/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java index bb44a8f9b4ca045b7ad31cdc6805b514dfbd8ee1..60cb327c4d80c39402b27fc130f2e6575996ec15 100644 --- a/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java +++ b/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -37,8 +36,8 @@ package sun.text.normalizer; -import java.io.InputStream; import java.io.DataInputStream; +import java.io.InputStream; import java.io.IOException; /** @@ -50,254 +49,13 @@ import java.io.IOException; * </p> * <p>uprops.icu which is in big-endian format is jared together with this * package.</p> +* +* Unicode character properties file format see +* (ICU4C)/source/tools/genprops/store.c +* * @author Syn Wee Quek * @since release 2.1, February 1st 2002 -* @draft 2.1 */ -/* Unicode character properties file format ------------------------------------ - -The file format prepared and written here contains several data -structures that store indexes or data. - - - -The following is a description of format version 3 . - -Data contents: - -The contents is a parsed, binary form of several Unicode character -database files, most prominently UnicodeData.txt. - -Any Unicode code point from 0 to 0x10ffff can be looked up to get -the properties, if any, for that code point. This means that the input -to the lookup are 21-bit unsigned integers, with not all of the -21-bit range used. - -It is assumed that client code keeps a uint32_t pointer -to the beginning of the data: - - const uint32_t *p32; - -Formally, the file contains the following structures: - - const int32_t indexes[16] with values i0..i15: - - i0 propsIndex; -- 32-bit unit index to the table of 32-bit properties words - i1 exceptionsIndex; -- 32-bit unit index to the table of 32-bit exception words - i2 exceptionsTopIndex; -- 32-bit unit index to the array of UChars for special mappings - - i3 additionalTrieIndex; -- 32-bit unit index to the additional trie for more properties - i4 additionalVectorsIndex; -- 32-bit unit index to the table of properties vectors - i5 additionalVectorsColumns; -- number of 32-bit words per properties vector - - i6 reservedItemIndex; -- 32-bit unit index to the top of the properties vectors table - i7..i9 reservedIndexes; -- reserved values; 0 for now - - i10 maxValues; -- maximum code values for vector word 0, see uprops.h (format version 3.1+) - i11 maxValues2; -- maximum code values for vector word 2, see uprops.h (format version 3.2) - i12..i15 reservedIndexes; -- reserved values; 0 for now - - PT serialized properties trie, see utrie.h (byte size: 4*(i0-16)) - - P const uint32_t props32[i1-i0]; - E const uint32_t exceptions[i2-i1]; - U const UChar uchars[2*(i3-i2)]; - - AT serialized trie for additional properties (byte size: 4*(i4-i3)) - PV const uint32_t propsVectors[(i6-i4)/i5][i5]==uint32_t propsVectors[i6-i4]; - -Trie lookup and properties: - -In order to condense the data for the 21-bit code space, several properties of -the Unicode code assignment are exploited: -- The code space is sparse. -- There are several 10k of consecutive codes with the same properties. -- Characters and scripts are allocated in groups of 16 code points. -- Inside blocks for scripts the properties are often repetitive. -- The 21-bit space is not fully used for Unicode. - -The lookup of properties for a given code point is done with a trie lookup, -using the UTrie implementation. -The trie lookup result is a 16-bit index in the props32[] table where the -actual 32-bit properties word is stored. This is done to save space. - -(There are thousands of 16-bit entries in the trie data table, but -only a few hundred unique 32-bit properties words. -If the trie data table contained 32-bit words directly, then that would be -larger because the length of the table would be the same as now but the -width would be 32 bits instead of 16. This saves more than 10kB.) - -With a given Unicode code point - - UChar32 c; - -and 0<=c<0x110000, the lookup is done like this: - - uint16_t i; - UTRIE_GET16(c, i); - uint32_t props=p32[i]; - -For some characters, not all of the properties can be efficiently encoded -using 32 bits. For them, the 32-bit word contains an index into the exceptions[] -array: - - if(props&EXCEPTION_BIT)) { - uint16_t e=(uint16_t)(props>>VALUE_SHIFT); - ... - } - -The exception values are a variable number of uint32_t starting at - - const uint32_t *pe=p32+exceptionsIndex+e; - -The first uint32_t there contains flags about what values actually follow it. -Some of the exception values are UChar32 code points for the case mappings, -others are numeric values etc. - -32-bit properties sets: - -Each 32-bit properties word contains: - - 0.. 4 general category - 5 has exception values - 6..10 BiDi category -11 is mirrored -12..14 numericType: - 0 no numeric value - 1 decimal digit value - 2 digit value - 3 numeric value - ### TODO: type 4 for Han digits & numbers?! -15..19 reserved -20..31 value according to bits 0..5: - if(has exception) { - exception index; - } else switch(general category) { - case Ll: delta to uppercase; -- same as titlecase - case Lu: -delta to lowercase; -- titlecase is same as c - case Lt: -delta to lowercase; -- uppercase is same as c - default: - if(is mirrored) { - delta to mirror; - } else if(numericType!=0) { - numericValue; - } else { - 0; - }; - } - -Exception values: - -In the first uint32_t exception word for a code point, -bits -31..16 reserved -15..0 flags that indicate which values follow: - -bit - 0 has uppercase mapping - 1 has lowercase mapping - 2 has titlecase mapping - 3 unused - 4 has numeric value (numerator) - if numericValue=0x7fffff00+x then numericValue=10^x - 5 has denominator value - 6 has a mirror-image Unicode code point - 7 has SpecialCasing.txt entries - 8 has CaseFolding.txt entries - -According to the flags in this word, one or more uint32_t words follow it -in the sequence of the bit flags in the flags word; if a flag is not set, -then the value is missing or 0: - -For the case mappings and the mirror-image Unicode code point, -one uint32_t or UChar32 each is the code point. -If the titlecase mapping is missing, then it is the same as the uppercase mapping. - -For the digit values, bits 31..16 contain the decimal digit value, and -bits 15..0 contain the digit value. A value of -1 indicates that -this value is missing. - -For the numeric/numerator value, an int32_t word contains the value directly, -except for when there is no numerator but a denominator, then the numerator -is implicitly 1. This means: - numerator denominator result - none none none - x none x - none y 1/y - x y x/y - -If the numerator value is 0x7fffff00+x then it is replaced with 10^x. - -For the denominator value, a uint32_t word contains the value directly. - -For special casing mappings, the 32-bit exception word contains: -31 if set, this character has complex, conditional mappings - that are not stored; - otherwise, the mappings are stored according to the following bits -30..24 number of UChars used for mappings -23..16 reserved -15.. 0 UChar offset from the beginning of the UChars array where the - UChars for the special case mappings are stored in the following format: - -Format of special casing UChars: -One UChar value with lengths as follows: -14..10 number of UChars for titlecase mapping - 9.. 5 number of UChars for uppercase mapping - 4.. 0 number of UChars for lowercase mapping - -Followed by the UChars for lowercase, uppercase, titlecase mappings in this order. - -For case folding mappings, the 32-bit exception word contains: -31..24 number of UChars used for the full mapping -23..16 reserved -15.. 0 UChar offset from the beginning of the UChars array where the - UChars for the special case mappings are stored in the following format: - -Format of case folding UChars: -Two UChars contain the simple mapping as follows: - 0, 0 no simple mapping - BMP,0 a simple mapping to a BMP code point - s1, s2 a simple mapping to a supplementary code point stored as two surrogates -This is followed by the UChars for the full case folding mappings. - -Example: -U+2160, ROMAN NUMERAL ONE, needs an exception because it has a lowercase -mapping and a numeric value. -Its exception values would be stored as 3 uint32_t words: - -- flags=0x0a (see above) with combining class 0 -- lowercase mapping 0x2170 -- numeric value=1 - ---- Additional properties (new in format version 2.1) --- - -The second trie for additional properties (AT) is also a UTrie with 16-bit data. -The data words consist of 32-bit unit indexes (not row indexes!) into the -table of unique properties vectors (PV). -Each vector contains a set of properties. -The width of a vector (number of uint32_t per row) may change -with the formatVersion, it is stored in i5. - -Current properties: see icu/source/common/uprops.h - ---- Changes in format version 3.1 --- - -See i10 maxValues above, contains only UBLOCK_COUNT and USCRIPT_CODE_LIMIT. - ---- Changes in format version 3.2 --- - -- The tries use linear Latin-1 ranges. -- The additional properties bits store full properties XYZ instead - of partial Other_XYZ, so that changes in the derivation formulas - need not be tracked in runtime library code. -- Joining Type and Line Break are also stored completely, so that uprops.c - needs no runtime formulas for enumerated properties either. -- Store the case-sensitive flag in the main properties word. -- i10 also contains U_LB_COUNT and U_EA_COUNT. -- i11 contains maxValues2 for vector word 2. - ------------------------------------------------------------------------------ */ - final class UCharacterPropertyReader implements ICUBinary.Authenticate { // public methods ---------------------------------------------------- @@ -315,7 +73,6 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate * <p>Protected constructor.</p> * @param inputStream ICU uprop.dat file input stream * @exception IOException throw if data file fails authentication - * @draft 2.1 */ protected UCharacterPropertyReader(InputStream inputStream) throws IOException @@ -331,8 +88,7 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate * <p>Reads uprops.icu, parse it into blocks of data to be stored in * UCharacterProperty.</P * @param ucharppty UCharacterProperty instance - * @exception thrown when data reading fails - * @draft 2.1 + * @exception IOException thrown when data reading fails */ protected void read(UCharacterProperty ucharppty) throws IOException { @@ -362,38 +118,30 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate // read the trie index block // m_props_index_ in terms of ints - ucharppty.m_trie_ = new CharTrie(m_dataInputStream_, ucharppty); + ucharppty.m_trie_ = new CharTrie(m_dataInputStream_, null); - // reads the 32 bit properties block + // skip the 32 bit properties block int size = m_exceptionOffset_ - m_propertyOffset_; - ucharppty.m_property_ = new int[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_property_[i] = m_dataInputStream_.readInt(); - } + m_dataInputStream_.skipBytes(size * 4); // reads the 32 bit exceptions block size = m_caseOffset_ - m_exceptionOffset_; - ucharppty.m_exception_ = new int[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_exception_[i] = m_dataInputStream_.readInt(); - } + m_dataInputStream_.skipBytes(size * 4); // reads the 32 bit case block size = (m_additionalOffset_ - m_caseOffset_) << 1; - ucharppty.m_case_ = new char[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_case_[i] = m_dataInputStream_.readChar(); - } - - // reads the additional property block - ucharppty.m_additionalTrie_ = new CharTrie(m_dataInputStream_, - ucharppty); - - // additional properties - size = m_reservedOffset_ - m_additionalVectorsOffset_; - ucharppty.m_additionalVectors_ = new int[size]; - for (int i = 0; i < size; i ++) { - ucharppty.m_additionalVectors_[i] = m_dataInputStream_.readInt(); + m_dataInputStream_.skipBytes(size * 2); + + if(m_additionalColumnsCount_ > 0) { + // reads the additional property block + ucharppty.m_additionalTrie_ = new CharTrie(m_dataInputStream_, null); + + // additional properties + size = m_reservedOffset_ - m_additionalVectorsOffset_; + ucharppty.m_additionalVectors_ = new int[size]; + for (int i = 0; i < size; i ++) { + ucharppty.m_additionalVectors_[i] = m_dataInputStream_.readInt(); + } } m_dataInputStream_.close(); @@ -428,12 +176,15 @@ final class UCharacterPropertyReader implements ICUBinary.Authenticate private byte m_unicodeVersion_[]; /** - * File format version that this class understands. - * No guarantees are made if a older version is used + * Data format "UPro". */ private static final byte DATA_FORMAT_ID_[] = {(byte)0x55, (byte)0x50, (byte)0x72, (byte)0x6F}; - private static final byte DATA_FORMAT_VERSION_[] = {(byte)0x3, (byte)0x1, + /** + * Format version; this code works with all versions with the same major + * version number and the same Trie bit distribution. + */ + private static final byte DATA_FORMAT_VERSION_[] = {(byte)0x5, (byte)0, (byte)Trie.INDEX_STAGE_1_SHIFT_, (byte)Trie.INDEX_STAGE_2_SHIFT_}; } diff --git a/src/share/classes/sun/text/normalizer/UProperty.java b/src/share/classes/sun/text/normalizer/UProperty.java deleted file mode 100644 index 3b8c097f43a37583b0cf18410e32962ae16e7776..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/text/normalizer/UProperty.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Portions Copyright 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. 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. - */ - -/* - ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * - * * - * The original version of this source code and documentation is copyrighted * - * and owned by IBM, These materials are provided under terms of a License * - * Agreement between IBM and Sun. This technology is protected by multiple * - * US and International patents. This notice and attribution to IBM may not * - * to removed. * - ******************************************************************************* - */ - -package sun.text.normalizer; - -/** - * <p>Selection constants for Unicode properties. </p> - * <p>These constants are used in functions like - * UCharacter.hasBinaryProperty(int) to select one of the Unicode properties. - * </p> - * <p>The properties APIs are intended to reflect Unicode properties as - * defined in the Unicode Character Database (UCD) and Unicode Technical - * Reports (UTR).</p> - * <p>For details about the properties see <a href=http://www.unicode.org> - * http://www.unicode.org</a>.</p> - * <p>For names of Unicode properties see the UCD file PropertyAliases.txt. - * </p> - * <p>Important: If ICU is built with UCD files from Unicode versions below - * 3.2, then properties marked with "new" are not or not fully - * available. Check UCharacter.getUnicodeVersion() to be sure.</p> - * @author Syn Wee Quek - * @stable ICU 2.6 - * @see com.ibm.icu.lang.UCharacter - */ -public interface UProperty -{ - // public data member -------------------------------------------------- - - /** - * Enumerated property Hangul_Syllable_Type, new in Unicode 4. - * Returns HangulSyllableType values. - * @stable ICU 2.6 - */ - public static final int HANGUL_SYLLABLE_TYPE = 0x100B; - - /** - * Bitmask property General_Category_Mask. - * This is the General_Category property returned as a bit mask. - * When used in UCharacter.getIntPropertyValue(c), - * returns bit masks for UCharacterCategory values where exactly one bit is set. - * When used with UCharacter.getPropertyValueName() and UCharacter.getPropertyValueEnum(), - * a multi-bit mask is used for sets of categories like "Letters". - * @stable ICU 2.4 - */ - public static final int GENERAL_CATEGORY_MASK = 0x2000; -} diff --git a/src/share/classes/sun/text/normalizer/UTF16.java b/src/share/classes/sun/text/normalizer/UTF16.java index 3b872a6063fe68bee273f8390fbb701e9706684a..2aa7c6d3571961f59ad12858f44441c992dde9af 100644 --- a/src/share/classes/sun/text/normalizer/UTF16.java +++ b/src/share/classes/sun/text/normalizer/UTF16.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -184,15 +183,16 @@ public final class UTF16 * bounds. * @stable ICU 2.1 */ - public static int charAt(String source, int offset16) - { - if (offset16 < 0 || offset16 >= source.length()) { - throw new StringIndexOutOfBoundsException(offset16); + public static int charAt(String source, int offset16) { + char single = source.charAt(offset16); + if (single < LEAD_SURROGATE_MIN_VALUE) { + return single; } + return _charAt(source, offset16, single); + } - char single = source.charAt(offset16); - if (single < LEAD_SURROGATE_MIN_VALUE || - single > TRAIL_SURROGATE_MAX_VALUE) { + private static int _charAt(String source, int offset16, char single) { + if (single > TRAIL_SURROGATE_MAX_VALUE) { return single; } @@ -201,29 +201,23 @@ public final class UTF16 // low, look both directions. if (single <= LEAD_SURROGATE_MAX_VALUE) { - ++ offset16; + ++offset16; if (source.length() != offset16) { char trail = source.charAt(offset16); - if (trail >= TRAIL_SURROGATE_MIN_VALUE && - trail <= TRAIL_SURROGATE_MAX_VALUE) { - return UCharacterProperty.getRawSupplementary(single, - trail); + if (trail >= TRAIL_SURROGATE_MIN_VALUE && trail <= TRAIL_SURROGATE_MAX_VALUE) { + return UCharacterProperty.getRawSupplementary(single, trail); } } - } - else - { - -- offset16; - if (offset16 >= 0) { - // single is a trail surrogate so - char lead = source.charAt(offset16); - if (lead >= LEAD_SURROGATE_MIN_VALUE && - lead <= LEAD_SURROGATE_MAX_VALUE) { - return UCharacterProperty.getRawSupplementary(lead, - single); - } + } else { + --offset16; + if (offset16 >= 0) { + // single is a trail surrogate so + char lead = source.charAt(offset16); + if (lead >= LEAD_SURROGATE_MIN_VALUE && lead <= LEAD_SURROGATE_MAX_VALUE) { + return UCharacterProperty.getRawSupplementary(lead, single); } } + } return single; // return unmatched surrogate } diff --git a/src/share/classes/sun/text/normalizer/UnicodeSet.java b/src/share/classes/sun/text/normalizer/UnicodeSet.java index eaffb7c8b44160a09d469bff9932bb646d839dad..21ab0c883de4ac8a9b18f62d32e526ae2eb85f12 100644 --- a/src/share/classes/sun/text/normalizer/UnicodeSet.java +++ b/src/share/classes/sun/text/normalizer/UnicodeSet.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -38,11 +37,8 @@ package sun.text.normalizer; import java.text.ParsePosition; -import java.util.Map; -import java.util.HashMap; -import java.util.TreeSet; import java.util.Iterator; -import java.util.Collection; +import java.util.TreeSet; /** * A mutable set of Unicode characters and multicharacter strings. Objects of this class @@ -130,8 +126,8 @@ import java.util.Collection; * "[:Lu:]" and the Perl-like syntax "\p{Lu}" are recognized. For a * complete list of supported property patterns, see the User's Guide * for UnicodeSet at - * <a href="http://oss.software.ibm.com/icu/userguide/unicodeSet.html"> - * http://oss.software.ibm.com/icu/userguide/unicodeSet.html</a>. + * <a href="http://www.icu-project.org/userguide/unicodeSet.html"> + * http://www.icu-project.org/userguide/unicodeSet.html</a>. * Actual determination of property data is defined by the underlying * Unicode database as implemented by UCharacter. * @@ -271,9 +267,11 @@ import java.util.Collection; * </tr> * </table> * </blockquote> + * <p>To iterate over contents of UnicodeSet, use UnicodeSetIterator class. * * @author Alan Liu * @stable ICU 2.0 + * @see UnicodeSetIterator */ public class UnicodeSet implements UnicodeMatcher { @@ -322,7 +320,7 @@ public class UnicodeSet implements UnicodeMatcher { * properties are all exactly alike, e.g. CJK Ideographs from * U+4E00 to U+9FA5. */ - private static UnicodeSet INCLUSIONS = null; + private static UnicodeSet INCLUSIONS[] = null; //---------------------------------------------------------------- // Public API @@ -471,17 +469,18 @@ public class UnicodeSet implements UnicodeMatcher { return result; } - return _generatePattern(result, escapeUnprintable); + return _generatePattern(result, escapeUnprintable, true); } /** * Generate and append a string representation of this set to result. * This does not use this.pat, the cleaned up copy of the string * passed to applyPattern(). - * @stable ICU 2.0 + * @param includeStrings if false, doesn't include the strings. + * @stable ICU 3.8 */ public StringBuffer _generatePattern(StringBuffer result, - boolean escapeUnprintable) { + boolean escapeUnprintable, boolean includeStrings) { result.append('['); int count = getRangeCount(); @@ -524,7 +523,7 @@ public class UnicodeSet implements UnicodeMatcher { } } - if (strings.size() > 0) { + if (includeStrings && strings.size() > 0) { Iterator it = strings.iterator(); while (it.hasNext()) { result.append('{'); @@ -535,19 +534,8 @@ public class UnicodeSet implements UnicodeMatcher { return result.append(']'); } - /** - * Adds the specified range to this set if it is not already - * present. If this set already contains the specified range, - * the call leaves this set unchanged. If <code>end > start</code> - * then an empty range is added, leaving the set unchanged. - * - * @param start first character, inclusive, of range to be added - * to this set. - * @param end last character, inclusive, of range to be added - * to this set. - * @stable ICU 2.0 - */ - public UnicodeSet add(int start, int end) { + // for internal use, after checkFrozen has been called + private UnicodeSet add_unchecked(int start, int end) { if (start < MIN_VALUE || start > MAX_VALUE) { throw new IllegalArgumentException("Invalid code point U+" + Utility.hex(start, 6)); } @@ -569,6 +557,11 @@ public class UnicodeSet implements UnicodeMatcher { * @stable ICU 2.0 */ public final UnicodeSet add(int c) { + return add_unchecked(c); + } + + // for internal use only, after checkFrozen has been called + private final UnicodeSet add_unchecked(int c) { if (c < MIN_VALUE || c > MAX_VALUE) { throw new IllegalArgumentException("Invalid code point U+" + Utility.hex(c, 6)); } @@ -663,13 +656,12 @@ public class UnicodeSet implements UnicodeMatcher { * @stable ICU 2.0 */ public final UnicodeSet add(String s) { - int cp = getSingleCP(s); if (cp < 0) { strings.add(s); pat = null; } else { - add(cp, cp); + add_unchecked(cp, cp); } return this; } @@ -981,7 +973,6 @@ public class UnicodeSet implements UnicodeMatcher { */ void applyPattern(RuleCharacterIterator chars, SymbolTable symbols, StringBuffer rebuiltPat, int options) { - // Syntax characters: [ ] ^ - & { } // Recognized special forms for chars, sets: c-c s-s s&s @@ -992,7 +983,7 @@ public class UnicodeSet implements UnicodeMatcher { opts |= RuleCharacterIterator.SKIP_WHITESPACE; } - StringBuffer pat = new StringBuffer(), buf = null; + StringBuffer patBuf = new StringBuffer(), buf = null; boolean usePat = false; UnicodeSet scratch = null; Object backup = null; @@ -1049,13 +1040,13 @@ public class UnicodeSet implements UnicodeMatcher { } else { // Handle opening '[' delimiter mode = 1; - pat.append('['); + patBuf.append('['); backup = chars.getPos(backup); // prepare to backup c = chars.next(opts); literal = chars.isEscaped(); if (c == '^' && !literal) { invert = true; - pat.append('^'); + patBuf.append('^'); backup = chars.getPos(backup); // prepare to backup c = chars.next(opts); literal = chars.isEscaped(); @@ -1093,13 +1084,13 @@ public class UnicodeSet implements UnicodeMatcher { if (op != 0) { syntaxError(chars, "Char expected after operator"); } - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); lastItem = op = 0; } if (op == '-' || op == '&') { - pat.append(op); + patBuf.append(op); } if (nested == null) { @@ -1108,14 +1099,14 @@ public class UnicodeSet implements UnicodeMatcher { } switch (setMode) { case 1: - nested.applyPattern(chars, symbols, pat, options); + nested.applyPattern(chars, symbols, patBuf, options); break; case 2: chars.skipIgnored(opts); - nested.applyPropertyPattern(chars, pat, symbols); + nested.applyPropertyPattern(chars, patBuf, symbols); break; case 3: // `nested' already parsed - nested._toPattern(pat, false); + nested._toPattern(patBuf, false); break; } @@ -1158,17 +1149,17 @@ public class UnicodeSet implements UnicodeMatcher { switch (c) { case ']': if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); } // Treat final trailing '-' as a literal if (op == '-') { - add(op, op); - pat.append(op); + add_unchecked(op, op); + patBuf.append(op); } else if (op == '&') { syntaxError(chars, "Trailing '&'"); } - pat.append(']'); + patBuf.append(']'); mode = 2; continue; case '-': @@ -1178,11 +1169,11 @@ public class UnicodeSet implements UnicodeMatcher { continue; } else { // Treat final trailing '-' as a literal - add(c, c); + add_unchecked(c, c); c = chars.next(opts); literal = chars.isEscaped(); if (c == ']' && !literal) { - pat.append("-]"); + patBuf.append("-]"); mode = 2; continue; } @@ -1202,8 +1193,8 @@ public class UnicodeSet implements UnicodeMatcher { syntaxError(chars, "Missing operand after operator"); } if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); } lastItem = 0; if (buf == null) { @@ -1228,9 +1219,9 @@ public class UnicodeSet implements UnicodeMatcher { // we don't need to drop through to the further // processing add(buf.toString()); - pat.append('{'); - _appendToPat(pat, buf.toString(), false); - pat.append('}'); + patBuf.append('{'); + _appendToPat(patBuf, buf.toString(), false); + patBuf.append('}'); continue; case SymbolTable.SYMBOL_REF: // symbols nosymbols @@ -1250,12 +1241,12 @@ public class UnicodeSet implements UnicodeMatcher { } if (anchor && op == 0) { if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); } - add(UnicodeMatcher.ETHER); + add_unchecked(UnicodeMatcher.ETHER); usePat = true; - pat.append(SymbolTable.SYMBOL_REF).append(']'); + patBuf.append(SymbolTable.SYMBOL_REF).append(']'); mode = 2; continue; } @@ -1281,14 +1272,14 @@ public class UnicodeSet implements UnicodeMatcher { // these are most likely typos. syntaxError(chars, "Invalid range"); } - add(lastChar, c); - _appendToPat(pat, lastChar, false); - pat.append(op); - _appendToPat(pat, c, false); + add_unchecked(lastChar, c); + _appendToPat(patBuf, lastChar, false); + patBuf.append(op); + _appendToPat(patBuf, c, false); lastItem = op = 0; } else { - add(lastChar, lastChar); - _appendToPat(pat, lastChar, false); + add_unchecked(lastChar, lastChar); + _appendToPat(patBuf, lastChar, false); lastChar = c; } break; @@ -1315,9 +1306,9 @@ public class UnicodeSet implements UnicodeMatcher { // Use the rebuilt pattern (pat) only if necessary. Prefer the // generated pattern. if (usePat) { - rebuiltPat.append(pat.toString()); + rebuiltPat.append(patBuf.toString()); } else { - _generatePattern(rebuiltPat, false); + _generatePattern(rebuiltPat, false, true); } } @@ -1590,7 +1581,9 @@ public class UnicodeSet implements UnicodeMatcher { private static class VersionFilter implements Filter { VersionInfo version; + VersionFilter(VersionInfo version) { this.version = version; } + public boolean contains(int ch) { VersionInfo v = UCharacter.getAge(ch); // Reference comparison ok; VersionInfo caches and reuses @@ -1600,18 +1593,28 @@ public class UnicodeSet implements UnicodeMatcher { } } - private static synchronized UnicodeSet getInclusions() { + private static synchronized UnicodeSet getInclusions(int src) { if (INCLUSIONS == null) { - UCharacterProperty property = UCharacterProperty.getInstance(); - INCLUSIONS = property.getInclusions(); + INCLUSIONS = new UnicodeSet[UCharacterProperty.SRC_COUNT]; + } + if(INCLUSIONS[src] == null) { + UnicodeSet incl = new UnicodeSet(); + switch(src) { + case UCharacterProperty.SRC_PROPSVEC: + UCharacterProperty.getInstance().upropsvec_addPropertyStarts(incl); + break; + default: + throw new IllegalStateException("UnicodeSet.getInclusions(unknown src "+src+")"); + } + INCLUSIONS[src] = incl; } - return INCLUSIONS; + return INCLUSIONS[src]; } /** * Generic filter-based scanning code for UCD property UnicodeSets. */ - private UnicodeSet applyFilter(Filter filter) { + private UnicodeSet applyFilter(Filter filter, int src) { // Walk through all Unicode characters, noting the start // and end of each range for which filter.contain(c) is // true. Add each range to a set. @@ -1629,7 +1632,7 @@ public class UnicodeSet implements UnicodeMatcher { clear(); int startHasProperty = -1; - UnicodeSet inclusions = getInclusions(); + UnicodeSet inclusions = getInclusions(src); int limitRange = inclusions.getRangeCount(); for (int j=0; j<limitRange; ++j) { @@ -1646,19 +1649,18 @@ public class UnicodeSet implements UnicodeMatcher { startHasProperty = ch; } } else if (startHasProperty >= 0) { - add(startHasProperty, ch-1); + add_unchecked(startHasProperty, ch-1); startHasProperty = -1; } } } if (startHasProperty >= 0) { - add(startHasProperty, 0x10FFFF); + add_unchecked(startHasProperty, 0x10FFFF); } return this; } - /** * Remove leading and trailing rule white space and compress * internal rule white space to a single space character. @@ -1686,10 +1688,6 @@ public class UnicodeSet implements UnicodeMatcher { return buf.toString(); } - //---------------------------------------------------------------- - // Property set API - //---------------------------------------------------------------- - /** * Modifies this set to contain those code points which have the * given value for the given property. Prior contents of this @@ -1699,22 +1697,21 @@ public class UnicodeSet implements UnicodeMatcher { * @param symbols if not null, then symbols are first called to see if a property * is available. If true, then everything else is skipped. * @return this set - * @draft ICU 3.2 - * @deprecated This is a draft API and might change in a future release of ICU. + * @stable ICU 3.2 */ public UnicodeSet applyPropertyAlias(String propertyAlias, String valueAlias, SymbolTable symbols) { - if (propertyAlias.equals("Age")) - { - // Must munge name, since - // VersionInfo.getInstance() does not do - // 'loose' matching. - VersionInfo version = VersionInfo.getInstance(mungeCharName(valueAlias)); - applyFilter(new VersionFilter(version)); - return this; - } - else - throw new IllegalArgumentException("Unsupported property"); + if (valueAlias.length() > 0) { + if (propertyAlias.equals("Age")) { + // Must munge name, since + // VersionInfo.getInstance() does not do + // 'loose' matching. + VersionInfo version = VersionInfo.getInstance(mungeCharName(valueAlias)); + applyFilter(new VersionFilter(version), UCharacterProperty.SRC_PROPSVEC); + return this; + } + } + throw new IllegalArgumentException("Unsupported property: " + propertyAlias); } /** @@ -1840,14 +1837,14 @@ public class UnicodeSet implements UnicodeMatcher { */ private void applyPropertyPattern(RuleCharacterIterator chars, StringBuffer rebuiltPat, SymbolTable symbols) { - String pat = chars.lookahead(); + String patStr = chars.lookahead(); ParsePosition pos = new ParsePosition(0); - applyPropertyPattern(pat, pos, symbols); + applyPropertyPattern(patStr, pos, symbols); if (pos.getIndex() == 0) { syntaxError(chars, "Invalid property pattern"); } chars.jumpahead(pos.getIndex()); - rebuiltPat.append(pat.substring(0, pos.getIndex())); + rebuiltPat.append(patStr.substring(0, pos.getIndex())); } //---------------------------------------------------------------- @@ -1860,8 +1857,9 @@ public class UnicodeSet implements UnicodeMatcher { * which UCharacterProperty.isRuleWhiteSpace() returns true, * unless they are quoted or escaped. This may be ORed together * with other selectors. - * @internal + * @stable ICU 3.8 */ public static final int IGNORE_SPACE = 1; } + diff --git a/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java b/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java index 4d558da18dd9650bc01f45ac5b7b9fd2090bfa6d..0d8ffe84f2dc48cd9c6ded13b24947652f8ee65e 100644 --- a/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java +++ b/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ - /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -167,8 +166,8 @@ public class UnicodeSetIterator { * @param set the set to iterate over. * @stable ICU 2.0 */ - public void reset(UnicodeSet set) { - this.set = set; + public void reset(UnicodeSet uset) { + set = uset; reset(); } @@ -213,8 +212,8 @@ public class UnicodeSetIterator { /** * @internal */ - protected void loadRange(int range) { - nextElement = set.getRangeStart(range); - endElement = set.getRangeEnd(range); + protected void loadRange(int aRange) { + nextElement = set.getRangeStart(aRange); + endElement = set.getRangeEnd(aRange); } } diff --git a/src/share/classes/sun/text/normalizer/Utility.java b/src/share/classes/sun/text/normalizer/Utility.java index 895097f13d25566434db7a558b12499b16f61fbb..7d8b33b9d59ecf8bb929e08e96c40821fe313532 100644 --- a/src/share/classes/sun/text/normalizer/Utility.java +++ b/src/share/classes/sun/text/normalizer/Utility.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -24,7 +24,7 @@ */ /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * @@ -36,10 +36,27 @@ package sun.text.normalizer; -// This class contains utility functions so testing not needed -///CLOVER:OFF public final class Utility { + /** + * Convenience utility to compare two Object[]s + * Ought to be in System. + * @param len the length to compare. + * The start indices and start+len must be valid. + */ + public final static boolean arrayRegionMatches(char[] source, int sourceStart, + char[] target, int targetStart, + int len) + { + int sourceEnd = sourceStart + len; + int delta = targetStart - sourceStart; + for (int i = sourceStart; i < sourceEnd; i++) { + if (source[i]!=target[i + delta]) + return false; + } + return true; + } + /** * Convert characters outside the range U+0020 to U+007F to * Unicode escapes, and convert backslash to a double backslash. @@ -344,7 +361,6 @@ public final class Utility { return false; } - //// for StringPrep /** * Similar to StringBuffer.getChars, version 1.3. * Since JDK 1.2 implements StringBuffer.getChars differently, this method @@ -356,7 +372,6 @@ public final class Utility { * @param dst char array to store the retrieved chars * @param dstBegin offset to the start of the destination char array to * store the retrieved chars - * @draft since ICU4J 2.0 */ public static void getChars(StringBuffer src, int srcBegin, int srcEnd, char dst[], int dstBegin) @@ -367,23 +382,4 @@ public final class Utility { src.getChars(srcBegin, srcEnd, dst, dstBegin); } - /** - * Convenience utility to compare two char[]s. - * @param len the length to compare. - * The start indices and start+len must be valid. - */ - public final static boolean arrayRegionMatches(char[] source, int sourceStart, - char[] target, int targetStart, - int len) - { - int sourceEnd = sourceStart + len; - int delta = targetStart - sourceStart; - for (int i = sourceStart; i < sourceEnd; i++) { - if (source[i] != target[i + delta]) - return false; - } - return true; - } - } -///CLOVER:ON diff --git a/src/share/classes/sun/text/normalizer/VersionInfo.java b/src/share/classes/sun/text/normalizer/VersionInfo.java index e1a0d92ddb5f3428b4996fb04442681b5977bec0..2b0f7c7918b3ac9c93677fe628c99196ea9fec78 100644 --- a/src/share/classes/sun/text/normalizer/VersionInfo.java +++ b/src/share/classes/sun/text/normalizer/VersionInfo.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2005-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 @@ -24,7 +24,7 @@ */ /* ******************************************************************************* - * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * + * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * * * * The original version of this source code and documentation is copyrighted * * and owned by IBM, These materials are provided under terms of a License * diff --git a/src/share/classes/sun/text/resources/ubidi.icu b/src/share/classes/sun/text/resources/ubidi.icu new file mode 100644 index 0000000000000000000000000000000000000000..e4a2d8194077ab61854c6137d99294cca071a401 Binary files /dev/null and b/src/share/classes/sun/text/resources/ubidi.icu differ diff --git a/src/share/classes/sun/text/resources/unorm.icu b/src/share/classes/sun/text/resources/unorm.icu index 5d56aa22fc2d496f555fa7ccab2c4d42b3363972..96560e6dcfbe398ac577a9017acf6359017d6138 100644 Binary files a/src/share/classes/sun/text/resources/unorm.icu and b/src/share/classes/sun/text/resources/unorm.icu differ diff --git a/src/share/classes/sun/text/resources/uprops.icu b/src/share/classes/sun/text/resources/uprops.icu index 610ad5abee0bb4f0d30b18adb3c4591f473a0c80..0140aa29928e3a10a42fbf93dc8a46c2d708852a 100644 Binary files a/src/share/classes/sun/text/resources/uprops.icu and b/src/share/classes/sun/text/resources/uprops.icu differ diff --git a/src/share/lib/management/jmxremote.access b/src/share/lib/management/jmxremote.access index 765f118a364a24afb32cdc4487acc8989fc6fb54..ce80b47a1a82d3fab01d4fc4eadf4f7d63a7c84b 100644 --- a/src/share/lib/management/jmxremote.access +++ b/src/share/lib/management/jmxremote.access @@ -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 --git a/src/share/native/com/sun/java/util/jar/pack/bands.cpp b/src/share/native/com/sun/java/util/jar/pack/bands.cpp index c78644c289dae8309cef819ac6dc2a823b4de2cc..a0d64dc63f4a6ff30313ecd66dde2e42eb5d0d78 100644 --- a/src/share/native/com/sun/java/util/jar/pack/bands.cpp +++ b/src/share/native/com/sun/java/util/jar/pack/bands.cpp @@ -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 @@ void band::readData(int expectedLength) { 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 @@ void band::readData(int expectedLength) { 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 @@ int band::getIntTotal() { 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 --git a/src/share/native/com/sun/java/util/jar/pack/bytes.cpp b/src/share/native/com/sun/java/util/jar/pack/bytes.cpp index ecc45ce2cb560ca15a2a845b51eb090c8f502f28..097c51cee4204ffd3fa70f11398ba8eabafbdb3f 100644 --- a/src/share/native/com/sun/java/util/jar/pack/bytes.cpp +++ b/src/share/native/com/sun/java/util/jar/pack/bytes.cpp @@ -56,7 +56,7 @@ void bytes::realloc(size_t len_) { 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 @@ const char* bytes::string() { // 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 --git a/src/share/native/com/sun/java/util/jar/pack/coding.cpp b/src/share/native/com/sun/java/util/jar/pack/coding.cpp index dec681ccfe4af7ec4596ce1fb78c185ad554c663..df021042d625fb3c45f44aafcb3d05d7872da83a 100644 --- a/src/share/native/com/sun/java/util/jar/pack/coding.cpp +++ b/src/share/native/com/sun/java/util/jar/pack/coding.cpp @@ -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 @@ void coding_method::init(byte* &band_rp, byte* band_limit, } band_rp = vs.rp; } + CHECK; // Get an accurate upper limit now. vs0.rplimit = band_rp; diff --git a/src/share/native/com/sun/java/util/jar/pack/defines.h b/src/share/native/com/sun/java/util/jar/pack/defines.h index 0bf25d5b0dd7fe65373279e3fa7598b8c7f09c49..87ce338067d358f0417d03bb68c48a6ad8da4bb8 100644 --- a/src/share/native/com/sun/java/util/jar/pack/defines.h +++ b/src/share/native/com/sun/java/util/jar/pack/defines.h @@ -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 @@ extern int assert_failed(const char*); #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 @@ enum { false, true }; #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 --git a/src/share/native/com/sun/java/util/jar/pack/main.cpp b/src/share/native/com/sun/java/util/jar/pack/main.cpp index 789841d2251be968695dca40bc18f69875679741..104f38bfff9d79c8d99d01f0c4619d1103a4d92c 100644 --- a/src/share/native/com/sun/java/util/jar/pack/main.cpp +++ b/src/share/native/com/sun/java/util/jar/pack/main.cpp @@ -299,7 +299,7 @@ int unpacker::run(int argc, char **argv) { 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 --git a/src/share/native/com/sun/java/util/jar/pack/unpack.cpp b/src/share/native/com/sun/java/util/jar/pack/unpack.cpp index 90b9f72e4eec01aed98d8eb19de543ce07af3f6b..a6f4ca0c2c8e5d5f90a6f79bb2b5bebc6e19eb4e 100644 --- a/src/share/native/com/sun/java/util/jar/pack/unpack.cpp +++ b/src/share/native/com/sun/java/util/jar/pack/unpack.cpp @@ -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 @@ void unpacker::read_file_header() { 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 @@ void unpacker::read_file_header() { // 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 @@ void unpacker::read_file_header() { 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 @@ void unpacker::read_file_header() { #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 @@ void unpacker::read_file_header() { 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 @@ void unpacker::read_file_header() { } 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 @@ void unpacker::read_file_header() { 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 @@ void unpacker::read_file_header() { 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 @@ void unpacker::read_file_header() { } } 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 @@ void unpacker::read_file_header() { bytes::of(band_headers.limit(), C_SLOP).clear(_meta_error); } - void unpacker::finish() { if (verbose >= 1) { fprintf(errstrm, @@ -973,12 +1011,12 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) { // 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 @@ void unpacker::read_classes() { 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 @@ void unpacker::read_classes() { CHECK; read_attrs(ATTR_CONTEXT_CLASS, class_count); + CHECK; read_code_headers(); @@ -2150,10 +2190,12 @@ void unpacker::read_attrs(int attrc, int obj_count) { 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 @@ void unpacker::read_attrs(int attrc, int obj_count) { 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 @@ void unpacker::read_attrs(int attrc, int obj_count) { } } ad.xxx_attr_calls().readData(backwardCounts); + CHECK; // Read built-in bands. // Mostly, these are hand-coded equivalents to readBandData(). @@ -2219,42 +2264,53 @@ void unpacker::read_attrs(int attrc, int obj_count) { 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 @@ void unpacker::read_attrs(int attrc, int obj_count) { 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 @@ void unpacker::read_attrs(int attrc, int obj_count) { 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 @@ void unpacker::read_attrs(int attrc, int obj_count) { // 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 @@ void unpacker::read_code_headers() { 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 @@ void unpacker::read_code_headers() { 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 --git a/src/share/native/com/sun/java/util/jar/pack/unpack.h b/src/share/native/com/sun/java/util/jar/pack/unpack.h index 8bad674e0850870a1abe52e7db12d15958c2de1b..4f5965ddfb1a43f60e413073acbf09acb1545c0a 100644 --- a/src/share/native/com/sun/java/util/jar/pack/unpack.h +++ b/src/share/native/com/sun/java/util/jar/pack/unpack.h @@ -204,7 +204,7 @@ struct unpacker { // 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 --git a/src/share/native/com/sun/java/util/jar/pack/utils.cpp b/src/share/native/com/sun/java/util/jar/pack/utils.cpp index 9566e541233d40365720f5e0564619d2ac7b3782..b812e739bba53ea2b980aa8a17e4fc3154ef6f1c 100644 --- a/src/share/native/com/sun/java/util/jar/pack/utils.cpp +++ b/src/share/native/com/sun/java/util/jar/pack/utils.cpp @@ -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 --git a/src/share/native/com/sun/java/util/jar/pack/utils.h b/src/share/native/com/sun/java/util/jar/pack/utils.h index 2fc1728d8e7359e5d20d38c0e71eddcaac04b144..a4dc2c88b653da137b59ee714555bc4ead7806c6 100644 --- a/src/share/native/com/sun/java/util/jar/pack/utils.h +++ b/src/share/native/com/sun/java/util/jar/pack/utils.h @@ -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 --git a/src/share/native/java/lang/ClassLoader.c b/src/share/native/java/lang/ClassLoader.c index 6f5960af5bf54fe8c1651e252df603193a3eaffe..bedf87ce7e6571ad4fa3cce43edf456ff4581d6b 100644 --- a/src/share/native/java/lang/ClassLoader.c +++ b/src/share/native/java/lang/ClassLoader.c @@ -1,5 +1,5 @@ /* - * Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -437,3 +437,21 @@ Java_java_lang_ClassLoader_00024NativeLibrary_find (*env)->ReleaseStringUTFChars(env, name, cname); return res; } + +JNIEXPORT jobject JNICALL +Java_java_lang_ClassLoader_getCaller(JNIEnv *env, jclass cls, jint index) +{ + jobjectArray jcallerStack; + int len; + + jcallerStack = JVM_GetClassContext(env); + if ((*env)->ExceptionCheck(env)) { + return NULL; + } + len = (*env)->GetArrayLength(env, jcallerStack); + if (index < len) { + return (*env)->GetObjectArrayElement(env, jcallerStack, index); + } + return NULL; +} + diff --git a/src/share/native/java/util/zip/ZipEntry.c b/src/share/native/java/util/zip/ZipEntry.c deleted file mode 100644 index 94cd68e1b127990ba59d73f72d01f4895ff16809..0000000000000000000000000000000000000000 --- a/src/share/native/java/util/zip/ZipEntry.c +++ /dev/null @@ -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 <stdio.h> -#include <stdlib.h> -#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 --git a/src/share/native/java/util/zip/ZipFile.c b/src/share/native/java/util/zip/ZipFile.c index 0c20536b49adc9756cd0943ca9f111caca0b7cbf..d5cb1ecac8be441efa1c3a040a41fa8d10dd2926 100644 --- a/src/share/native/java/util/zip/ZipFile.c +++ b/src/share/native/java/util/zip/ZipFile.c @@ -141,12 +141,11 @@ Java_java_util_zip_ZipFile_close(JNIEnv *env, jclass cls, jlong zfile) 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 @@ Java_java_util_zip_ZipFile_getEntry(JNIEnv *env, jclass cls, jlong zfile, } 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,34 +185,87 @@ Java_java_util_zip_ZipFile_getNextEntry(JNIEnv *env, jclass cls, jlong zfile, 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); + 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 Java_java_util_zip_ZipFile_read(JNIEnv *env, jclass cls, jlong zfile, jlong zentry, jlong pos, jbyteArray bytes, diff --git a/src/share/native/java/util/zip/zip_util.c b/src/share/native/java/util/zip/zip_util.c index f381629712cb70e8c4182ad78b4b148aafec92d9..626d4118f7533b5704e4075a3c634bbf7d9ddb00 100644 --- a/src/share/native/java/util/zip/zip_util.c +++ b/src/share/native/java/util/zip/zip_util.c @@ -312,6 +312,38 @@ findEND(jzfile *zip, void *endbuf) return -1; /* END header not found */ } +/* + * Searches for the ZIP64 end of central directory (END) header. The + * contents of the ZIP64 END header will be read and placed in end64buf. + * Returns the file position of the ZIP64 END header, otherwise returns + * -1 if the END header was not found or an error occurred. + * + * The ZIP format specifies the "position" of each related record as + * ... + * [central directory] + * [zip64 end of central directory record] + * [zip64 end of central directory locator] + * [end of central directory record] + * + * The offset of zip64 end locator can be calculated from endpos as + * "endpos - ZIP64_LOCHDR". + * The "offset" of zip64 end record is stored in zip64 end locator. + */ +static jlong +findEND64(jzfile *zip, void *end64buf, jlong endpos) +{ + char loc64[ZIP64_LOCHDR]; + jlong end64pos; + if (readFullyAt(zip->zfd, loc64, ZIP64_LOCHDR, endpos - ZIP64_LOCHDR) == -1) { + return -1; // end64 locator not found + } + end64pos = ZIP64_LOCOFF(loc64); + if (readFullyAt(zip->zfd, end64buf, ZIP64_ENDHDR, end64pos) == -1) { + return -1; // end64 record not found + } + return end64pos; +} + /* * Returns a hash code value for a C-style NUL-terminated string. */ @@ -463,7 +495,7 @@ static jlong readCEN(jzfile *zip, jint knownTotal) { /* Following are unsigned 32-bit */ - jlong endpos, cenpos, cenlen; + jlong endpos, end64pos, cenpos, cenlen, cenoff; /* Following are unsigned 16-bit */ jint total, tablelen, i, j; unsigned char *cenbuf = NULL; @@ -474,12 +506,12 @@ readCEN(jzfile *zip, jint knownTotal) jlong offset; #endif unsigned char endbuf[ENDHDR]; + jint endhdrlen = ENDHDR; jzcell *entries; jint *table; /* 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 */ @@ -487,16 +519,29 @@ readCEN(jzfile *zip, jint knownTotal) if (endpos == 0) return 0; /* only END header present */ freeCEN(zip); - /* Get position and length of central directory */ cenlen = ENDSIZ(endbuf); + cenoff = ENDOFF(endbuf); + total = ENDTOT(endbuf); + if (cenlen == ZIP64_MAGICVAL || cenoff == ZIP64_MAGICVAL || + total == ZIP64_MAGICCOUNT) { + unsigned char end64buf[ZIP64_ENDHDR]; + if ((end64pos = findEND64(zip, end64buf, endpos)) != -1) { + cenlen = ZIP64_ENDSIZ(end64buf); + cenoff = ZIP64_ENDOFF(end64buf); + total = (jint)ZIP64_ENDTOT(end64buf); + endpos = end64pos; + endhdrlen = ZIP64_ENDHDR; + } + } + if (cenlen > endpos) ZIP_FORMAT_ERROR("invalid END header (bad central directory size)"); cenpos = endpos - cenlen; /* Get position of first local file (LOC) header, taking into * account that there may be a stub prefixed to the zip file. */ - zip->locpos = cenpos - ENDOFF(endbuf); + zip->locpos = cenpos - cenoff; if (zip->locpos < 0) ZIP_FORMAT_ERROR("invalid END header (bad central directory offset)"); @@ -527,7 +572,7 @@ readCEN(jzfile *zip, jint knownTotal) out the page size in order to make offset to be multiples of page size. */ - zip->mlen = cenpos - offset + cenlen + ENDHDR; + zip->mlen = cenpos - offset + cenlen + endhdrlen; zip->offset = offset; mappedAddr = mmap64(0, zip->mlen, PROT_READ, MAP_SHARED, zip->zfd, (off64_t) offset); zip->maddr = (mappedAddr == (void*) MAP_FAILED) ? NULL : @@ -551,8 +596,13 @@ readCEN(jzfile *zip, jint knownTotal) * is a 2-byte field, but we (and other zip implementations) * support approx. 2**31 entries, we do not trust ENDTOT, but * treat it only as a strong hint. When we call ourselves - * recursively, knownTotal will have the "true" value. */ - total = (knownTotal != -1) ? knownTotal : ENDTOT(endbuf); + * recursively, knownTotal will have the "true" value. + * + * Keep this path alive even with the Zip64 END support added, just + * for zip files that have more than 0xffff entries but don't have + * the Zip64 enabled. + */ + total = (knownTotal != -1) ? knownTotal : total; entries = zip->entries = calloc(total, sizeof(entries[0])); tablelen = zip->tablelen = ((total/2) | 1); // Odd -> fewer collisions table = zip->table = malloc(tablelen * sizeof(table[0])); @@ -854,6 +904,7 @@ typedef enum { ACCESS_RANDOM, ACCESS_SEQUENTIAL } AccessHint; static jzentry * newEntry(jzfile *zip, jzcell *zc, AccessHint accessHint) { + jlong locoff; jint nlen, elen, clen; jzentry *ze; char *cen; @@ -880,18 +931,56 @@ newEntry(jzfile *zip, jzcell *zc, AccessHint accessHint) ze->size = CENLEN(cen); ze->csize = (CENHOW(cen) == STORED) ? 0 : CENSIZ(cen); ze->crc = CENCRC(cen); - ze->pos = -(zip->locpos + CENOFF(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); ze->name[nlen] = '\0'; if (elen > 0) { + char *extra = cen + CENHDR + nlen; + /* This entry has "extra" data */ if ((ze->extra = malloc(elen + 2)) == NULL) goto Catch; ze->extra[0] = (unsigned char) elen; ze->extra[1] = (unsigned char) (elen >> 8); - memcpy(ze->extra+2, cen + CENHDR + nlen, elen); + memcpy(ze->extra+2, extra, elen); + if (ze->csize == ZIP64_MAGICVAL || ze->size == ZIP64_MAGICVAL || + locoff == ZIP64_MAGICVAL) { + jint off = 0; + while ((off + 4) < elen) { // spec: HeaderID+DataSize+Data + jint sz = SH(extra, off + 2); + if (SH(extra, off) == ZIP64_EXTID) { + off += 4; + if (ze->size == ZIP64_MAGICVAL) { + // if invalid zip64 extra fields, just skip + if (sz < 8 || (off + 8) > elen) + break; + ze->size = LL(extra, off); + sz -= 8; + off += 8; + } + if (ze->csize == ZIP64_MAGICVAL) { + if (sz < 8 || (off + 8) > elen) + break; + ze->csize = LL(extra, off); + sz -= 8; + off += 8; + } + if (locoff == ZIP64_MAGICVAL) { + if (sz < 8 || (off + 8) > elen) + break; + ze->pos = -(zip->locpos + LL(extra, off)); + sz -= 8; + off += 8; + } + break; + } + off += (sz + 4); + } + } } if (clen > 0) { diff --git a/src/share/native/java/util/zip/zip_util.h b/src/share/native/java/util/zip/zip_util.h index 3814ad02d4f34ee7b41382a2134d9964c182463e..311a9fcd9de6f57edaf799580dbd21d520045d04 100644 --- a/src/share/native/java/util/zip/zip_util.h +++ b/src/share/native/java/util/zip/zip_util.h @@ -38,9 +38,13 @@ #define CENSIG 0x02014b50L /* "PK\001\002" */ #define ENDSIG 0x06054b50L /* "PK\005\006" */ +#define ZIP64_ENDSIG 0x06064b50L /* "PK\006\006" */ +#define ZIP64_LOCSIG 0x07064b50L /* "PK\006\007" */ + /* * Header sizes including signatures */ + #ifdef USE_MMAP #define SIGSIZ 4 #endif @@ -49,12 +53,22 @@ #define CENHDR 46 #define ENDHDR 22 +#define ZIP64_ENDHDR 56 // ZIP64 end header size +#define ZIP64_LOCHDR 20 // ZIP64 end loc header size +#define ZIP64_EXTHDR 24 // EXT header size +#define ZIP64_EXTID 1 // Extra field Zip64 header ID + +#define ZIP64_MAGICVAL 0xffffffffLL +#define ZIP64_MAGICCOUNT 0xffff + + /* * Header field access macros */ #define CH(b, n) (((unsigned char *)(b))[n]) #define SH(b, n) (CH(b, n) | (CH(b, n+1) << 8)) -#define LG(b, n) (SH(b, n) | (SH(b, n+2) << 16)) +#define LG(b, n) ((SH(b, n) | (SH(b, n+2) << 16)) &0xffffffffUL) +#define LL(b, n) (((jlong)LG(b, n)) | (((jlong)LG(b, n+4)) << 32)) #define GETSIG(b) LG(b, 0) /* @@ -105,6 +119,26 @@ #define ENDOFF(b) LG(b, 16) /* central directory offset */ #define ENDCOM(b) SH(b, 20) /* size of zip file comment */ +/* + * Macros for getting Zip64 end of central directory header fields + */ +#define ZIP64_ENDLEN(b) LL(b, 4) /* size of zip64 end of central dir */ +#define ZIP64_ENDVEM(b) SH(b, 12) /* version made by */ +#define ZIP64_ENDVER(b) SH(b, 14) /* version needed to extract */ +#define ZIP64_ENDNMD(b) LG(b, 16) /* number of this disk */ +#define ZIP64_ENDDSK(b) LG(b, 20) /* disk number of start */ +#define ZIP64_ENDTOD(b) LL(b, 24) /* total number of entries on this disk */ +#define ZIP64_ENDTOT(b) LL(b, 32) /* total number of entries */ +#define ZIP64_ENDSIZ(b) LL(b, 40) /* central directory size in bytes */ +#define ZIP64_ENDOFF(b) LL(b, 48) /* offset of first CEN header */ + +/* + * Macros for getting Zip64 end of central directory locator fields + */ +#define ZIP64_LOCDSK(b) LG(b, 4) /* disk number start */ +#define ZIP64_LOCOFF(b) LL(b, 8) /* offset of zip64 end */ +#define ZIP64_LOCTOT(b) LG(b, 16) /* total number of disks */ + /* * Supported compression methods */ @@ -134,6 +168,7 @@ typedef struct jzentry { /* Zip file entry */ 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; /* @@ -145,7 +180,7 @@ typedef struct jzentry { /* Zip file entry */ */ typedef struct jzcell { unsigned int hash; /* 32 bit hashcode on name */ - unsigned int cenpos; /* Offset of central directory file header */ + jlong cenpos; /* Offset of central directory file header */ unsigned int next; /* hash chain: index into jzfile->entries */ } jzcell; diff --git a/src/share/native/java/util/zip/zlib-1.1.3/zlib.h b/src/share/native/java/util/zip/zlib-1.1.3/zlib.h index 9576715b2fa26e90404fc0cd280d53e7bc3e365a..00fdf06007d12dcf564ef8618ea15f8913dd207f 100644 --- a/src/share/native/java/util/zip/zlib-1.1.3/zlib.h +++ b/src/share/native/java/util/zip/zlib-1.1.3/zlib.h @@ -106,11 +106,11 @@ struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ + long long total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ + long long total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ diff --git a/src/share/native/sun/awt/giflib/dgif_lib.c b/src/share/native/sun/awt/giflib/dgif_lib.c index be91d3e781158d37070b2bd76ef4364c11f45281..f20372fe925f688dd3c3e1a004f82ca755b2a6e2 100644 --- a/src/share/native/sun/awt/giflib/dgif_lib.c +++ b/src/share/native/sun/awt/giflib/dgif_lib.c @@ -722,6 +722,10 @@ DGifSetupDecompress(GifFileType * GifFile) { 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 @@ DGifDecompressInput(GifFileType * GifFile, /* 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 --git a/src/share/native/sun/awt/image/gif/gifdecoder.c b/src/share/native/sun/awt/image/gif/gifdecoder.c index 1429931f8c6dba78ce9967a8be296126a22d011c..893007f136670ce778f4444011784897c80ff8ef 100644 --- a/src/share/native/sun/awt/image/gif/gifdecoder.c +++ b/src/share/native/sun/awt/image/gif/gifdecoder.c @@ -191,6 +191,11 @@ Java_sun_awt_image_GifImageDecoder_parseImage(JNIEnv *env, 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 --git a/src/share/native/sun/awt/medialib/awt_ImagingLib.c b/src/share/native/sun/awt/medialib/awt_ImagingLib.c index 681f26290b8aff59915a20030af08eb3340d79bb..157827fef29b105239e913872854a3c7c98cc02e 100644 --- a/src/share/native/sun/awt/medialib/awt_ImagingLib.c +++ b/src/share/native/sun/awt/medialib/awt_ImagingLib.c @@ -216,6 +216,16 @@ printMedialibError(int status) { #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 @@ Java_sun_awt_image_ImagingLib_convolveBI(JNIEnv *env, jobject this, } } - 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<<src->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 @@ Java_sun_awt_image_ImagingLib_convolveRaster(JNIEnv *env, jobject this, } } - 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<<src->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 --git a/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h b/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h index 1c55702fe73ac8f7d26487a24324cb466e59bb4a..32f7d4e2e47a4318f5dbfef02ab08e94b2c5ebfa 100644 --- a/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h +++ b/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h @@ -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 --git a/src/share/native/sun/awt/splashscreen/splashscreen_gif.c b/src/share/native/sun/awt/splashscreen/splashscreen_gif.c index f6d9acb0c36c6f2d256ee2028b21b1ce89cdddad..f1651ab1f4913686ee1b5b1f0c696657f8e56c8d 100644 --- a/src/share/native/sun/awt/splashscreen/splashscreen_gif.c +++ b/src/share/native/sun/awt/splashscreen/splashscreen_gif.c @@ -62,6 +62,15 @@ SplashStreamGifInputFunc(GifFileType * gif, GifByteType * buf, int n) 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 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) 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 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) 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 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) 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 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) 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 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) 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 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) 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 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) { 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<ch; j++) { + memcpy(pBitmapBits + lineIndex, pOldBitmapBits + lineIndex, + lineSize); + lineIndex += stride; + } } } break; diff --git a/src/share/native/sun/awt/splashscreen/splashscreen_impl.h b/src/share/native/sun/awt/splashscreen/splashscreen_impl.h index c6bad14c45acce73140333bc0f171afcc3c21dc2..6f4e03ef53ec88af76434b1b70f88f75fe286b84 100644 --- a/src/share/native/sun/awt/splashscreen/splashscreen_impl.h +++ b/src/share/native/sun/awt/splashscreen/splashscreen_impl.h @@ -155,6 +155,10 @@ int BitmapToYXBandedRectangles(ImageRect * pSrcRect, RECT_T * out); void SplashInitFrameShape(Splash * splash, int imageIndex); +#define SAFE_TO_ALLOC(c, sz) \ + (((c) > 0) && ((sz) > 0) && \ + ((0xffffffffu / ((unsigned int)(c))) > (unsigned int)(sz))) + #define dbgprintf printf #endif diff --git a/src/share/native/sun/awt/splashscreen/splashscreen_png.c b/src/share/native/sun/awt/splashscreen/splashscreen_png.c index f0926ec90dc4e3d4a031ccca14fc766526ed88a5..abc54dcb7536baf3bf42c8f661ae848c69956ae1 100644 --- a/src/share/native/sun/awt/splashscreen/splashscreen_png.c +++ b/src/share/native/sun/awt/splashscreen/splashscreen_png.c @@ -103,9 +103,17 @@ SplashDecodePng(Splash * splash, png_rw_ptr read_func, void *io_ptr) 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 @@ SplashDecodePng(Splash * splash, png_rw_ptr read_func, void *io_ptr) 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 --git a/src/share/native/sun/awt/utility/rect.c b/src/share/native/sun/awt/utility/rect.c new file mode 100644 index 0000000000000000000000000000000000000000..00bbecb6e11d4747953705c2a33a146465d35102 --- /dev/null +++ b/src/share/native/sun/awt/utility/rect.c @@ -0,0 +1,102 @@ +/* + * Copyright 2008-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. + */ + +#include "utility/rect.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** + * bitsPerPixel must be 32 for now. + * outBuf must be large enough to conatin all the rectangles. + */ +int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height, unsigned char * buf, RECT_T * outBuf) +{ + //XXX: we might want to reuse the code in the splashscreen library, + // though we'd have to deal with the ALPHA_THRESHOLD and different + // image formats in this case. + int widthBytes = width * bitsPerPixel / 8; + int alignedWidth = (((widthBytes - 1) / 4) + 1) * 4; + + RECT_T * out = outBuf; + + RECT_T *pPrevLine = NULL, *pFirst = out, *pThis = pFirst; + int i, j, i0; + int length; + + for (j = 0; j < height; j++) { + /* generate data for a scanline */ + + unsigned char *pSrc = (unsigned char *) buf + j * alignedWidth; + RECT_T *pLine = pThis; + + i = 0; + + do { + // pSrc[0,1,2] == B,G,R; pSrc[3] == Alpha + while (i < width && !pSrc[3]) { + pSrc += 4; + ++i; + } + if (i >= width) + break; + i0 = i; + while (i < width && pSrc[3]) { + pSrc += 4; + ++i; + } + RECT_SET(*pThis, i0, j, i - i0, 1); + ++pThis; + } while (i < width); + + /* check if the previous scanline is exactly the same, merge if so + (this is the only optimization we can use for YXBanded rectangles, + and win32 supports YXBanded only */ + + length = pThis - pLine; + if (pPrevLine && pLine - pPrevLine == length) { + for (i = 0; i < length && RECT_EQ_X(pPrevLine[i], pLine[i]); ++i) { + } + if (i == pLine - pPrevLine) { + // do merge + for (i = 0; i < length; i++) { + RECT_INC_HEIGHT(pPrevLine[i]); + } + pThis = pLine; + continue; + } + } + /* or else use the generated scanline */ + + pPrevLine = pLine; + } + + return pThis - pFirst; +} + +#if defined(__cplusplus) +} +#endif diff --git a/src/share/sample/nio/file/Copy.java b/src/share/sample/nio/file/Copy.java index e1d5d044ef5192e0f3cb5fb4a99a5840e908ab14..bcd3af0c68275fcb4e347a0c008ccc904690859e 100644 --- a/src/share/sample/nio/file/Copy.java +++ b/src/share/sample/nio/file/Copy.java @@ -52,7 +52,7 @@ public class Copy { /** * Copy source file to target location. If {@code prompt} is true then - * prompted user to overwrite target if it exists. The {@code preserve} + * prompt user to overwrite target if it exists. The {@code preserve} * parameter determines if file attributes should be copied/preserved. */ static void copyFile(Path source, Path target, boolean prompt, boolean preserve) { @@ -63,7 +63,7 @@ public class Copy { try { source.copyTo(target, options); } catch (IOException x) { - System.err.format("Unable to create: %s: %s%n", target, x); + System.err.format("Unable to copy: %s: %s%n", source, x); } } } @@ -124,13 +124,13 @@ public class Copy { public FileVisitResult postVisitDirectory(Path dir, IOException exc) { // fix up modification time of directory when done if (exc == null && preserve) { + Path newdir = target.resolve(source.relativize(dir)); try { BasicFileAttributes attrs = Attributes.readBasicFileAttributes(dir); - Path newdir = target.resolve(source.relativize(dir)); Attributes.setLastModifiedTime(newdir, attrs.lastModifiedTime(), attrs.resolution()); } catch (IOException x) { - // ignore + System.err.format("Unable to copy all attributes to: %s: %s%n", newdir, x); } } return CONTINUE; @@ -191,6 +191,7 @@ public class Copy { try { isDir = Attributes.readBasicFileAttributes(target).isDirectory(); } catch (IOException x) { + // ignore (probably target does not exist) } // copy each source file/directory to target @@ -201,7 +202,7 @@ public class Copy { // follow links when copying files EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); TreeCopier tc = new TreeCopier(source[i], dest, prompt, preserve); - Files.walkFileTree(source[i], opts, -1, tc); + Files.walkFileTree(source[i], opts, Integer.MAX_VALUE, tc); } else { // not recursive so source must not be a directory try { @@ -209,7 +210,9 @@ public class Copy { System.err.format("%s: is a directory%n", source[i]); continue; } - } catch (IOException x) { } + } catch (IOException x) { + // assume not directory + } copyFile(source[i], dest, prompt, preserve); } } diff --git a/src/solaris/classes/sun/awt/X11/InfoWindow.java b/src/solaris/classes/sun/awt/X11/InfoWindow.java new file mode 100644 index 0000000000000000000000000000000000000000..ea485b2be9fb94d60cb69c9b944f194971972716 --- /dev/null +++ b/src/solaris/classes/sun/awt/X11/InfoWindow.java @@ -0,0 +1,495 @@ +/* + * 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 sun.awt.X11; + +import java.awt.*; +import java.awt.event.*; +import java.awt.peer.TrayIconPeer; +import sun.awt.*; +import java.awt.image.*; +import java.text.BreakIterator; +import java.util.logging.Logger; +import java.util.logging.Level; +import java.util.concurrent.ArrayBlockingQueue; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.lang.reflect.InvocationTargetException; + +/** + * An utility window class. This is a base class for Tooltip and Balloon. + */ +public abstract class InfoWindow extends Window { + private Container container; + private Closer closer; + + protected InfoWindow(Frame parent, Color borderColor) { + super(parent); + container = new Container() { + @Override + public Insets getInsets() { + return new Insets(1, 1, 1, 1); + } + }; + setLayout(new BorderLayout()); + setBackground(borderColor); + add(container, BorderLayout.CENTER); + container.setLayout(new BorderLayout()); + + closer = new Closer(); + } + + public Component add(Component c) { + container.add(c, BorderLayout.CENTER); + return c; + } + + protected void setCloser(Runnable action, int time) { + closer.set(action, time); + } + + // Must be executed on EDT. + protected void show(Point corner, int indent) { + assert SunToolkit.isDispatchThreadForAppContext(this); + + pack(); + + Dimension size = getSize(); + // TODO: When 6356322 is fixed we should get screen bounds in + // this way: eframe.getGraphicsConfiguration().getBounds(). + Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); + + if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square + setLocation(corner.x + indent, corner.y + indent); + + } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square + setLocation(corner.x - indent - size.width, corner.y + indent); + + } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square + setLocation(corner.x + indent, corner.y - indent - size.height); + + } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square + setLocation(corner.x - indent - size.width, corner.y - indent - size.height); + } + + super.show(); + closer.schedule(); + } + + public void hide() { + closer.close(); + } + + private class Closer implements Runnable { + Runnable action; + int time; + + public void run() { + doClose(); + } + + void set(Runnable action, int time) { + this.action = action; + this.time = time; + } + + void schedule() { + XToolkit.schedule(this, time); + } + + void close() { + XToolkit.remove(this); + doClose(); + } + + // WARNING: this method may be executed on Toolkit thread. + private void doClose() { + SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() { + public void run() { + InfoWindow.super.hide(); + invalidate(); + if (action != null) { + action.run(); + } + } + }); + } + } + + + private interface LiveArguments { + /** Whether the target of the InfoWindow is disposed. */ + boolean isDisposed(); + + /** The bounds of the target of the InfoWindow. */ + Rectangle getBounds(); + } + + public static class Tooltip extends InfoWindow { + + public interface LiveArguments extends InfoWindow.LiveArguments { + /** The tooltip to be displayed. */ + String getTooltipString(); + } + + private final Object target; + private final LiveArguments liveArguments; + + private final Label textLabel = new Label(""); + private final Runnable starter = new Runnable() { + public void run() { + display(); + }}; + + private final static int TOOLTIP_SHOW_TIME = 10000; + private final static int TOOLTIP_START_DELAY_TIME = 1000; + private final static int TOOLTIP_MAX_LENGTH = 64; + private final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5; + private final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220); + private final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont(); + + public Tooltip(Frame parent, Object target, + LiveArguments liveArguments) + { + super(parent, Color.black); + + this.target = target; + this.liveArguments = liveArguments; + + XTrayIconPeer.suppressWarningString(this); + + setCloser(null, TOOLTIP_SHOW_TIME); + textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR); + textLabel.setFont(TOOLTIP_TEXT_FONT); + add(textLabel); + } + + /* + * WARNING: this method is executed on Toolkit thread! + */ + private void display() { + String tooltipString = liveArguments.getTooltipString(); + if (tooltipString == null) { + return; + } else if (tooltipString.length() > TOOLTIP_MAX_LENGTH) { + textLabel.setText(tooltipString.substring(0, TOOLTIP_MAX_LENGTH)); + } else { + textLabel.setText(tooltipString); + } + + // Execute on EDT to avoid deadlock (see 6280857). + SunToolkit.executeOnEventHandlerThread(target, new Runnable() { + public void run() { + if (liveArguments.isDisposed()) { + return; + } + Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + if (!isPointerOverTrayIcon(liveArguments.getBounds())) { + return null; + } + return MouseInfo.getPointerInfo().getLocation(); + } + }); + if (pointer == null) { + return; + } + show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT); + } + }); + } + + public void enter() { + XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME); + } + + public void exit() { + XToolkit.remove(starter); + if (isVisible()) { + hide(); + } + } + + private boolean isPointerOverTrayIcon(Rectangle trayRect) { + Point p = MouseInfo.getPointerInfo().getLocation(); + return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) || + p.y < trayRect.y || p.y > (trayRect.y + trayRect.height)); + } + } + + public static class Balloon extends InfoWindow { + + public interface LiveArguments extends InfoWindow.LiveArguments { + /** The action to be performed upon clicking the baloon. */ + String getActionCommand(); + } + + private final LiveArguments liveArguments; + private final Object target; + + private final static int BALLOON_SHOW_TIME = 10000; + private final static int BALLOON_TEXT_MAX_LENGTH = 256; + private final static int BALLOON_WORD_LINE_MAX_LENGTH = 16; + private final static int BALLOON_WORD_LINE_MAX_COUNT = 4; + private final static int BALLOON_ICON_WIDTH = 32; + private final static int BALLOON_ICON_HEIGHT = 32; + private final static int BALLOON_TRAY_ICON_INDENT = 0; + private final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255); + private final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12); + + private Panel mainPanel = new Panel(); + private Panel captionPanel = new Panel(); + private Label captionLabel = new Label(""); + private Button closeButton = new Button("X"); + private Panel textPanel = new Panel(); + private XTrayIconPeer.IconCanvas iconCanvas = new XTrayIconPeer.IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT); + private Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT]; + private ActionPerformer ap = new ActionPerformer(); + + private Image iconImage; + private Image errorImage; + private Image warnImage; + private Image infoImage; + private boolean gtkImagesLoaded; + + private Displayer displayer = new Displayer(); + + public Balloon(Frame parent, Object target, LiveArguments liveArguments) { + super(parent, new Color(90, 80 ,190)); + this.liveArguments = liveArguments; + this.target = target; + + XTrayIconPeer.suppressWarningString(this); + + setCloser(new Runnable() { + public void run() { + if (textPanel != null) { + textPanel.removeAll(); + textPanel.setSize(0, 0); + iconCanvas.setSize(0, 0); + XToolkit.awtLock(); + try { + displayer.isDisplayed = false; + XToolkit.awtLockNotifyAll(); + } finally { + XToolkit.awtUnlock(); + } + } + } + }, BALLOON_SHOW_TIME); + + add(mainPanel); + + captionLabel.setFont(BALLOON_CAPTION_FONT); + captionLabel.addMouseListener(ap); + + captionPanel.setLayout(new BorderLayout()); + captionPanel.add(captionLabel, BorderLayout.WEST); + captionPanel.add(closeButton, BorderLayout.EAST); + captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR); + captionPanel.addMouseListener(ap); + + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + hide(); + } + }); + + mainPanel.setLayout(new BorderLayout()); + mainPanel.setBackground(Color.white); + mainPanel.add(captionPanel, BorderLayout.NORTH); + mainPanel.add(iconCanvas, BorderLayout.WEST); + mainPanel.add(textPanel, BorderLayout.CENTER); + + iconCanvas.addMouseListener(ap); + + for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) { + lineLabels[i] = new Label(); + lineLabels[i].addMouseListener(ap); + lineLabels[i].setBackground(Color.white); + } + + displayer.start(); + } + + public void display(String caption, String text, String messageType) { + if (!gtkImagesLoaded) { + loadGtkImages(); + } + displayer.display(caption, text, messageType); + } + + private void _display(String caption, String text, String messageType) { + captionLabel.setText(caption); + + BreakIterator iter = BreakIterator.getWordInstance(); + if (text != null) { + iter.setText(text); + int start = iter.first(), end; + int nLines = 0; + + do { + end = iter.next(); + + if (end == BreakIterator.DONE || + text.substring(start, end).length() >= 50) + { + lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ? + iter.last() : end)); + textPanel.add(lineLabels[nLines++]); + start = end; + } + if (nLines == BALLOON_WORD_LINE_MAX_COUNT) { + if (end != BreakIterator.DONE) { + lineLabels[nLines - 1].setText( + new String(lineLabels[nLines - 1].getText() + " ...")); + } + break; + } + } while (end != BreakIterator.DONE); + + + textPanel.setLayout(new GridLayout(nLines, 1)); + } + + if ("ERROR".equals(messageType)) { + iconImage = errorImage; + } else if ("WARNING".equals(messageType)) { + iconImage = warnImage; + } else if ("INFO".equals(messageType)) { + iconImage = infoImage; + } else { + iconImage = null; + } + + if (iconImage != null) { + Dimension tpSize = textPanel.getSize(); + iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ? + BALLOON_ICON_HEIGHT : tpSize.height)); + iconCanvas.validate(); + } + + SunToolkit.executeOnEventHandlerThread(target, new Runnable() { + public void run() { + if (liveArguments.isDisposed()) { + return; + } + Point parLoc = getParent().getLocationOnScreen(); + Dimension parSize = getParent().getSize(); + show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2), + BALLOON_TRAY_ICON_INDENT); + if (iconImage != null) { + iconCanvas.updateImage(iconImage); // call it after the show(..) above + } + } + }); + } + + public void dispose() { + displayer.interrupt(); + super.dispose(); + } + + private void loadGtkImages() { + if (!gtkImagesLoaded) { + errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( + "gtk.icon.gtk-dialog-error.6.rtl"); + warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( + "gtk.icon.gtk-dialog-warning.6.rtl"); + infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( + "gtk.icon.gtk-dialog-info.6.rtl"); + gtkImagesLoaded = true; + } + } + + private class ActionPerformer extends MouseAdapter { + public void mouseClicked(MouseEvent e) { + // hide the balloon by any click + hide(); + if (e.getButton() == MouseEvent.BUTTON1) { + ActionEvent aev = new ActionEvent(target, ActionEvent.ACTION_PERFORMED, + liveArguments.getActionCommand(), + e.getWhen(), e.getModifiers()); + Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev); + } + } + } + + private class Displayer extends Thread { + final int MAX_CONCURRENT_MSGS = 10; + + ArrayBlockingQueue<Message> messageQueue = new ArrayBlockingQueue<Message>(MAX_CONCURRENT_MSGS); + boolean isDisplayed; + + Displayer() { + setDaemon(true); + } + + public void run() { + while (true) { + Message msg = null; + try { + msg = (Message)messageQueue.take(); + } catch (InterruptedException e) { + return; + } + + /* + * Wait till the previous message is displayed if any + */ + XToolkit.awtLock(); + try { + while (isDisplayed) { + try { + XToolkit.awtLockWait(); + } catch (InterruptedException e) { + return; + } + } + isDisplayed = true; + } finally { + XToolkit.awtUnlock(); + } + _display(msg.caption, msg.text, msg.messageType); + } + } + + void display(String caption, String text, String messageType) { + messageQueue.offer(new Message(caption, text, messageType)); + } + } + + private static class Message { + String caption, text, messageType; + + Message(String caption, String text, String messageType) { + this.caption = caption; + this.text = text; + this.messageType = messageType; + } + } + } +} + diff --git a/src/solaris/classes/sun/awt/X11/XBaseWindow.java b/src/solaris/classes/sun/awt/X11/XBaseWindow.java index ace8b5830772d5591cb97c9b78636565876f37df..46491e04c1d67436750e5a6c3eae93f4aa2953ad 100644 --- a/src/solaris/classes/sun/awt/X11/XBaseWindow.java +++ b/src/solaris/classes/sun/awt/X11/XBaseWindow.java @@ -842,27 +842,35 @@ public class XBaseWindow { | XConstants.ButtonMotionMask); final int ownerEvents = 1; - int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(), - getContentWindow(), ownerEvents, eventMask, XConstants.GrabModeAsync, - XConstants.GrabModeAsync, XConstants.None, (XWM.isMotif() ? XToolkit.arrowCursor : XConstants.None), - XConstants.CurrentTime); - // Check grab results to be consistent with X server grab - if (ptrGrab != XConstants.GrabSuccess) { - XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); - XAwtState.setGrabWindow(null); - grabLog.fine(" Grab Failure - mouse"); - return false; - } - int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(), - getContentWindow(), ownerEvents, XConstants.GrabModeAsync, XConstants.GrabModeAsync, - XConstants.CurrentTime); - if (keyGrab != XConstants.GrabSuccess) { - XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); - XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); - XAwtState.setGrabWindow(null); - grabLog.fine(" Grab Failure - keyboard"); - return false; + //6714678: IDE (Netbeans, Eclipse, JDeveloper) Debugger hangs + //process on Linux + //The user must pass the sun.awt.disablegrab property to disable + //taking grabs. This prevents hanging of the GUI when a breakpoint + //is hit while a popup window taking the grab is open. + if (!XToolkit.getSunAwtDisableGrab()) { + int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(), + getContentWindow(), ownerEvents, eventMask, XConstants.GrabModeAsync, + XConstants.GrabModeAsync, XConstants.None, (XWM.isMotif() ? XToolkit.arrowCursor : XConstants.None), + XConstants.CurrentTime); + // Check grab results to be consistent with X server grab + if (ptrGrab != XConstants.GrabSuccess) { + XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); + XAwtState.setGrabWindow(null); + grabLog.fine(" Grab Failure - mouse"); + return false; + } + + int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(), + getContentWindow(), ownerEvents, XConstants.GrabModeAsync, XConstants.GrabModeAsync, + XConstants.CurrentTime); + if (keyGrab != XConstants.GrabSuccess) { + XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); + XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); + XAwtState.setGrabWindow(null); + grabLog.fine(" Grab Failure - keyboard"); + return false; + } } if (prevGrabWindow != null) { prevGrabWindow.ungrabInputImpl(); @@ -882,8 +890,10 @@ public class XBaseWindow { grabLog.log(Level.FINE, "UnGrab input on {0}", new Object[] {grabWindow}); if (grabWindow != null) { grabWindow.ungrabInputImpl(); - XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); - XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); + if (!XToolkit.getSunAwtDisableGrab()) { + XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime); + XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime); + } XAwtState.setGrabWindow(null); // we need to call XFlush() here to force ungrab // see 6384219 for details diff --git a/src/solaris/classes/sun/awt/X11/XCanvasPeer.java b/src/solaris/classes/sun/awt/X11/XCanvasPeer.java index 4c38c88b9fc9dcb9c6ba774b639b271c4a94872f..8fc6f1f7d2846cff23e77ecb043a53df51bb19d8 100644 --- a/src/solaris/classes/sun/awt/X11/XCanvasPeer.java +++ b/src/solaris/classes/sun/awt/X11/XCanvasPeer.java @@ -27,7 +27,6 @@ package sun.awt.X11; import java.awt.*; import java.awt.peer.*; -import sun.awt.ComponentAccessor; import sun.awt.SunToolkit; import sun.awt.X11GraphicsConfig; @@ -54,60 +53,45 @@ class XCanvasPeer extends XComponentPeer implements CanvasPeer { } } - void resetTargetGC(Component target) { - ComponentAccessor.resetGC(target); - } - - /* - * Called when the Window this - * Canvas is on is moved onto another Xinerama screen. - * - * Canvases can be created with a non-defulat GraphicsConfiguration. The - * GraphicsConfiguration needs to be changed to one on the new screen, - * preferably with the same visual ID. - * - * Up-called for other windows peer instances (XPanelPeer, XWindowPeer). - * - * Should only be called from the event thread. - */ - public void displayChanged(int screenNum) { - resetLocalGC(screenNum); - resetTargetGC(target); - } - - /* Set graphicsConfig to a GraphicsConfig with the same visual on the new + /* Get a GraphicsConfig with the same visual on the new * screen, which should be easy in Xinerama mode. - * - * Should only be called from displayChanged(), and therefore only from - * the event thread. */ - void resetLocalGC(int screenNum) { + public GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc) + { + if (graphicsConfig == null || gc == null) { + return gc; + } // Opt: Only need to do if we're not using the default GC - if (graphicsConfig != null) { - X11GraphicsConfig parentgc; - // save vis id of current gc - int visual = graphicsConfig.getVisual(); - X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment. - getLocalGraphicsEnvironment(). - getScreenDevices()[screenNum]; - - for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) { - if (visual == newDev.getConfigVisualId(i, screenNum)) { - // use that - graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i]; - break; - } - } - // just in case... - if (graphicsConfig == null) { - graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment. - getLocalGraphicsEnvironment(). - getScreenDevices()[screenNum]. - getDefaultConfiguration(); + int screenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen(); + + X11GraphicsConfig parentgc; + // save vis id of current gc + int visual = graphicsConfig.getVisual(); + + X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment. + getLocalGraphicsEnvironment(). + getScreenDevices()[screenNum]; + + for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) { + if (visual == newDev.getConfigVisualId(i, screenNum)) { + // use that + graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i]; + break; } } + // just in case... + if (graphicsConfig == null) { + graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment. + getLocalGraphicsEnvironment(). + getScreenDevices()[screenNum]. + getDefaultConfiguration(); + } + + return graphicsConfig; } + protected boolean shouldFocusOnClick() { // Canvas should always be able to be focused by mouse clicks. return true; diff --git a/src/solaris/classes/sun/awt/X11/XComponentPeer.java b/src/solaris/classes/sun/awt/X11/XComponentPeer.java index 8a14cfe5f0ff629d9a266af149d447d34371df38..26db17c72a4a4f150784a51daf3315c2aee14b23 100644 --- a/src/solaris/classes/sun/awt/X11/XComponentPeer.java +++ b/src/solaris/classes/sun/awt/X11/XComponentPeer.java @@ -35,6 +35,7 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; +import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.Insets; import java.awt.KeyboardFocusManager; @@ -76,11 +77,6 @@ import sun.java2d.pipe.Region; public class XComponentPeer extends XWindow implements ComponentPeer, DropTargetPeer, BackBufferCapsProvider { - /* FIX ME: these constants copied from java.awt.KeyboardFocusManager */ - static final int SNFH_FAILURE = 0; - static final int SNFH_SUCCESS_HANDLED = 1; - static final int SNFH_SUCCESS_PROCEED = 2; - private static final Logger log = Logger.getLogger("sun.awt.X11.XComponentPeer"); private static final Logger buffersLog = Logger.getLogger("sun.awt.X11.XComponentPeer.multibuffer"); private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XComponentPeer"); @@ -166,7 +162,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget enableLog.log(Level.FINE, "Initial enable state: {0}", new Object[] {Boolean.valueOf(enabled)}); if (target.isVisible()) { - show(); + setVisible(true); } } @@ -314,113 +310,27 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget return null; } - /** - * Returns whether or not this component should be given focus on mouse click. - * Default implementation return whether or not this peer is "focusable" - * Descendants might want to override it to extend/restrict conditions at which this - * component should be focused by click (see MCanvasPeer and MPanelPeer) - */ - protected boolean shouldFocusOnClick() { - return isFocusable(); - } - - /** - * Checks whether or not this component would be focused by native system if it would be allowed to do so. - * Currently it checks that it displayable, visible, enabled and focusable. - */ - static boolean canBeFocusedByClick(Component component) { - if (component == null) { - return false; - } else { - return component.isDisplayable() && component.isVisible() && component.isEnabled() && component.isFocusable(); - } - } - - static Window getContainingWindow(Component comp) { - while (comp != null && !(comp instanceof Window)) { - comp = comp.getParent(); - } - - return (Window)comp; - } - - static Method processSynchronousLightweightTransferMethod; - static boolean processSynchronousLightweightTransfer(Component heavyweight, Component descendant, - boolean temporary, boolean focusedWindowChangeAllowed, - long time) - { - try { - if (processSynchronousLightweightTransferMethod == null) { - processSynchronousLightweightTransferMethod = - (Method)AccessController.doPrivileged( - new PrivilegedExceptionAction() { - public Object run() throws IllegalAccessException, NoSuchMethodException - { - Method m = KeyboardFocusManager.class. - getDeclaredMethod("processSynchronousLightweightTransfer", - new Class[] {Component.class, Component.class, - Boolean.TYPE, Boolean.TYPE, - Long.TYPE}); - m.setAccessible(true); - return m; - } - }); - } - Object[] params = new Object[] { - heavyweight, - descendant, - Boolean.valueOf(temporary), - Boolean.valueOf(focusedWindowChangeAllowed), - Long.valueOf(time) - }; - return ((Boolean)processSynchronousLightweightTransferMethod.invoke(null, params)).booleanValue(); - } catch (PrivilegedActionException pae) { - pae.printStackTrace(); - return false; - } catch (IllegalAccessException iae) { - iae.printStackTrace(); - return false; - } catch (IllegalArgumentException iaee) { - iaee.printStackTrace(); - return false; - } catch (InvocationTargetException ite) { - ite.printStackTrace(); - return false; - } - } - - static Method requestFocusWithCause; - - static void callRequestFocus(Component target, CausedFocusEvent.Cause cause) { - if (requestFocusWithCause == null) { - requestFocusWithCause = SunToolkit.getMethod(Component.class, "requestFocus", new Class[] {CausedFocusEvent.Cause.class}); - } - if (requestFocusWithCause != null) { - try { - requestFocusWithCause.invoke(target, new Object[] {cause}); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - + // TODO: consider moving it to KeyboardFocusManagerPeerImpl final public boolean requestFocus(Component lightweightChild, boolean temporary, - boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) + boolean focusedWindowChangeAllowed, long time, + CausedFocusEvent.Cause cause) { - if (processSynchronousLightweightTransfer(target, lightweightChild, temporary, + if (XKeyboardFocusManagerPeer. + processSynchronousLightweightTransfer(target, lightweightChild, temporary, focusedWindowChangeAllowed, time)) { return true; } - int result = XKeyboardFocusManagerPeer - .shouldNativelyFocusHeavyweight(target, lightweightChild, - temporary, focusedWindowChangeAllowed, time, cause); + int result = XKeyboardFocusManagerPeer. + shouldNativelyFocusHeavyweight(target, lightweightChild, + temporary, focusedWindowChangeAllowed, + time, cause); switch (result) { - case SNFH_FAILURE: + case XKeyboardFocusManagerPeer.SNFH_FAILURE: return false; - case SNFH_SUCCESS_PROCEED: + case XKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED: // Currently we just generate focus events like we deal with lightweight instead of calling // XSetInputFocus on native window if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Proceeding with request to " + @@ -433,7 +343,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget * focus owner which had focus before WLF. So, we should not add request record for such requests * but store this component in mostRecent - and return true as before for compatibility. */ - Window parentWindow = getContainingWindow(target); + Window parentWindow = SunToolkit.getContainingWindow(target); if (parentWindow == null) { return rejectFocusRequestHelper("WARNING: Parent window is null"); } @@ -454,14 +364,13 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget if (!(res && parentWindow.isFocused())) { return rejectFocusRequestHelper("Waiting for asynchronous processing of the request"); } - - // NOTE: We simulate heavyweight behavior of Motif - component receives focus right - // after request, not after event. Normally, we should better listen for event - // by listeners. - return XKeyboardFocusManagerPeer.simulateMotifRequestFocus(lightweightChild, target, temporary, - focusedWindowChangeAllowed, time, cause); + return XKeyboardFocusManagerPeer.deliverFocus(lightweightChild, + (Component)target, + temporary, + focusedWindowChangeAllowed, + time, cause); // Motif compatibility code - case SNFH_SUCCESS_HANDLED: + case XKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED: // Either lightweight or excessive request - all events are generated. return true; } @@ -470,7 +379,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget private boolean rejectFocusRequestHelper(String logMsg) { if (focusLog.isLoggable(Level.FINER)) focusLog.finer(logMsg); - KeyboardFocusManagerPeerImpl.removeLastFocusRequest(target); + XKeyboardFocusManagerPeer.removeLastFocusRequest(target); return false; } @@ -496,10 +405,6 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget xSetVisible(b); } - public void show() { - setVisible(true); - } - public void hide() { setVisible(false); } @@ -618,8 +523,9 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget void handleJavaMouseEvent(MouseEvent e) { switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: - if (target == e.getSource() && shouldFocusOnClick() - && !target.isFocusOwner() && canBeFocusedByClick(target)) + if (target == e.getSource() && + !target.isFocusOwner() && + XKeyboardFocusManagerPeer.shouldFocusOnClick(target)) { XWindowPeer parentXWindow = getParentTopLevel(); Window parentWindow = ((Window)parentXWindow.getTarget()); @@ -633,7 +539,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget // WindowEvent wfg = new WindowEvent(parentWindow, WindowEvent.WINDOW_GAINED_FOCUS); // parentWindow.dispatchEvent(wfg); // } - callRequestFocus(target, CausedFocusEvent.Cause.MOUSE_EVENT); + XKeyboardFocusManagerPeer.requestFocusFor(target, CausedFocusEvent.Cause.MOUSE_EVENT); } break; } @@ -1418,59 +1324,21 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget } } - public void restack() { - synchronized(target.getTreeLock()) { - // Build the list of X windows in the window corresponding to this container - // This list is already in correct Java stacking order - Container cont = (Container)target; - Vector order = new Vector(cont.getComponentCount()); - HashSet set = new HashSet(); - - addTree(order, set, cont); - - XToolkit.awtLock(); - try { - // Get the current list of X window in X window. Some of the windows - // might be only native - XQueryTree qt = new XQueryTree(getContentWindow()); - try { - if (qt.execute() != 0) { - if (qt.get_nchildren() != 0) { - long pchildren = qt.get_children(); - int j = 0; // index to insert - for (int i = 0; i < qt.get_nchildren(); i++) { - Long w = Long.valueOf(Native.getLong(pchildren, i)); - if (!set.contains(w)) { - set.add(w); - order.add(j++, w); - } - } - } - } - - if (order.size() != 0) { - // Create native array of the windows - long windows = Native.allocateLongArray(order.size()); - Native.putLong(windows, order); - - // Restack native window according to the new order - XlibWrapper.XRestackWindows(XToolkit.getDisplay(), windows, order.size()); + /** + * Lowers this component at the bottom of the above HW peer. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + public void setZOrder(ComponentPeer above) { + long aboveWindow = (above != null) ? ((XComponentPeer)above).getWindow() : 0; - XlibWrapper.unsafe.freeMemory(windows); - } - } finally { - qt.dispose(); - } - } finally { - XToolkit.awtUnlock(); - } + XToolkit.awtLock(); + try{ + XlibWrapper.SetZOrder(XToolkit.getDisplay(), getWindow(), aboveWindow); + }finally{ + XToolkit.awtUnlock(); } } - public boolean isRestackSupported() { - return true; - } - private void addTree(Collection order, Set set, Container cont) { for (int i = 0; i < cont.getComponentCount(); i++) { Component comp = cont.getComponent(i); @@ -1560,4 +1428,8 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget } } } + + public void updateGraphicsData(GraphicsConfiguration gc) { + initGraphicsConfiguration(); + } } diff --git a/src/solaris/classes/sun/awt/X11/XConstants.java b/src/solaris/classes/sun/awt/X11/XConstants.java index 7d9077ee6a969dd432d7d04139c3643a9d7d5675..23275398a0777c985167eac3ac5c3d2543c3e5ff 100644 --- a/src/solaris/classes/sun/awt/X11/XConstants.java +++ b/src/solaris/classes/sun/awt/X11/XConstants.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -684,4 +684,19 @@ final public class XConstants { public static final int LSBFirst = 0 ; public static final int MSBFirst = 1 ; + + /* XKB support */ + public static final int XkbUseCoreKbd = 0x0100 ; + public static final int XkbNewKeyboardNotify = 0; + public static final int XkbMapNotify = 1; + public static final int XkbStateNotify = 2; + public static final long XkbNewKeyboardNotifyMask = (1L << 0); + public static final long XkbMapNotifyMask = (1L << 1); + public static final long XkbStateNotifyMask = (1L << 2); + public static final long XkbGroupStateMask = (1L << 4); + public static final long XkbKeyTypesMask = (1L<<0); + public static final long XkbKeySymsMask = (1L<<1); + public static final long XkbModifierMapMask = (1L<<2); + public static final long XkbVirtualModsMask = (1L<<6); //server map + } diff --git a/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java b/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java index 42ccabee313cfa0ce6cd10fc04111d9178f2c6af..739713dd71319b1dec20580c69c08422b11f6b29 100644 --- a/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java +++ b/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java @@ -383,7 +383,7 @@ abstract class XDecoratedPeer extends XWindowPeer { dimensions.setInsets(getRealInsets()); insets_corrected = true; - if (isMaximized() || isNull(correction)) { + if (isMaximized()) { return; } @@ -451,7 +451,7 @@ abstract class XDecoratedPeer extends XWindowPeer { public Insets getInsets() { Insets in = copy(getRealInsets()); - in.top += getMenuBarHeight() + getWarningWindowHeight(); + in.top += getMenuBarHeight(); if (insLog.isLoggable(Level.FINEST)) { insLog.log(Level.FINEST, "Get insets returns {0}", new Object[] {in}); } @@ -802,6 +802,8 @@ abstract class XDecoratedPeer extends XWindowPeer { } reconfigureContentWindow(newDimensions); updateChildrenSizes(); + + repositionSecurityWarning(); } private void checkShellRectSize(Rectangle shellRect) { diff --git a/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java b/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java index e4500043ae144003e477a22161176e221eae262e..b3474ffdb8e2f27d90e1a3b89aae12079d119d61 100644 --- a/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java +++ b/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java @@ -184,6 +184,7 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{ fl = new FocusEvent(currentOwner, FocusEvent.FOCUS_LOST, false, lightweightChild); } + // TODO: do we need to wrap in sequenced? if (fl != null) { postEvent(XComponentPeer.wrapInSequenced(fl)); } @@ -203,9 +204,9 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{ temporary, false, time, cause); switch (result) { - case XComponentPeer.SNFH_FAILURE: + case XKeyboardFocusManagerPeer.SNFH_FAILURE: return false; - case XComponentPeer.SNFH_SUCCESS_PROCEED: + case XKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED: // Currently we just generate focus events like we deal with lightweight instead of calling // XSetInputFocus on native window @@ -235,9 +236,11 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{ // NOTE: We simulate heavyweight behavior of Motif - component receives focus right // after request, not after event. Normally, we should better listen for event // by listeners. + + // TODO: consider replacing with XKeyboardFocusManagerPeer.deliverFocus return simulateMotifRequestFocus(lightweightChild, temporary, focusedWindowChangeAllowed, time); // Motif compatibility code - case XComponentPeer.SNFH_SUCCESS_HANDLED: + case XKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED: // Either lightweight or excessive requiest - all events are generated. return true; } @@ -379,4 +382,9 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{ public void applyShape(Region shape) { } + + public void setZOrder(ComponentPeer above) { + } + + public void updateGraphicsData(GraphicsConfiguration gc) {} } diff --git a/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java b/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java index 0675847af7912068c155f88c50f4a2ee8e7adce2..0b8085e759df58d0ec7411267eb32e2561b3f52c 100644 --- a/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java +++ b/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java @@ -739,7 +739,17 @@ class XFileDialogPeer extends XDialogPeer implements FileDialogPeer, ActionListe this.filter = filter; } - public void show() { + + public void dispose() { + FileDialog fd = (FileDialog)fileDialog; + if (fd != null) { + fd.removeAll(); + } + super.dispose(); + } + + // 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit + public void setVisible(boolean b){ if (fileDialog == null) { init((FileDialog)target); } @@ -754,34 +764,20 @@ class XFileDialogPeer extends XDialogPeer implements FileDialogPeer, ActionListe setFile(savedFile); } - super.show(); - selectionField.requestFocusInWindow(); - } - - public void dispose() { - FileDialog fd = (FileDialog)fileDialog; - if (fd != null) { - fd.removeAll(); - } - super.dispose(); - } - - // 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit - public void setVisible(boolean b){ super.setVisible(b); if (b == true){ // See 6240074 for more information XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer(); choicePeer.addXChoicePeerListener(this); - KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); }else{ // See 6240074 for more information XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer(); choicePeer.removeXChoicePeerListener(); - KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this); } + + selectionField.requestFocusInWindow(); } /* diff --git a/src/solaris/classes/sun/awt/X11/XFramePeer.java b/src/solaris/classes/sun/awt/X11/XFramePeer.java index 3820bf61013b8d05d77855d20c994a3314125a8d..22cb163ebbb5dfa31a504847b4c8677a12d07244 100644 --- a/src/solaris/classes/sun/awt/X11/XFramePeer.java +++ b/src/solaris/classes/sun/awt/X11/XFramePeer.java @@ -36,6 +36,7 @@ import java.awt.Rectangle; import java.awt.peer.FramePeer; import java.util.logging.Level; import java.util.logging.Logger; +import sun.awt.AWTAccessor; class XFramePeer extends XDecoratedPeer implements FramePeer { private static Logger log = Logger.getLogger("sun.awt.X11.XFramePeer"); @@ -231,13 +232,19 @@ class XFramePeer extends XDecoratedPeer implements FramePeer { } } - public int getState() { return state; } + public int getState() { + synchronized(getStateLock()) { + return state; + } + } public void setState(int newState) { - if (!isShowing()) { - stateLog.finer("Frame is not showing"); - state = newState; - return; + synchronized(getStateLock()) { + if (!isShowing()) { + stateLog.finer("Frame is not showing"); + state = newState; + return; + } } changeState(newState); } @@ -296,6 +303,9 @@ class XFramePeer extends XDecoratedPeer implements FramePeer { int old_state = state; state = newState; + // sync target with peer + AWTAccessor.getFrameAccessor().setExtendedState((Frame)target, state); + if ((changed & Frame.ICONIFIED) != 0) { if ((state & Frame.ICONIFIED) != 0) { stateLog.finer("Iconified"); diff --git a/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java b/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java index c4a10be59fddf4fb206523b022c1526c6aa18780..19c213441a0864824ded66a40751e0e3fb0da2d9 100644 --- a/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java +++ b/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java @@ -31,6 +31,7 @@ import java.awt.Window; import java.awt.event.FocusEvent; import java.awt.peer.KeyboardFocusManagerPeer; +import java.awt.peer.ComponentPeer; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -40,136 +41,90 @@ import java.util.logging.Logger; import sun.awt.CausedFocusEvent; import sun.awt.SunToolkit; +import sun.awt.KeyboardFocusManagerPeerImpl; -public class XKeyboardFocusManagerPeer implements KeyboardFocusManagerPeer { +public class XKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl { private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XKeyboardFocusManagerPeer"); - KeyboardFocusManager manager; - - XKeyboardFocusManagerPeer(KeyboardFocusManager manager) { - this.manager = manager; - } private static Object lock = new Object() {}; private static Component currentFocusOwner; private static Window currentFocusedWindow; - static void setCurrentNativeFocusOwner(Component comp) { - if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focus owner " + comp); - synchronized(lock) { - currentFocusOwner = comp; - } - } - - static void setCurrentNativeFocusedWindow(Window win) { - if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focused window " + win); - synchronized(lock) { - currentFocusedWindow = win; - } + XKeyboardFocusManagerPeer(KeyboardFocusManager manager) { + super(manager); } - static Component getCurrentNativeFocusOwner() { - synchronized(lock) { - return currentFocusOwner; - } + @Override + public void setCurrentFocusOwner(Component comp) { + setCurrentNativeFocusOwner(comp); } - static Window getCurrentNativeFocusedWindow() { - synchronized(lock) { - return currentFocusedWindow; - } + @Override + public Component getCurrentFocusOwner() { + return getCurrentNativeFocusOwner(); } + @Override public Window getCurrentFocusedWindow() { return getCurrentNativeFocusedWindow(); } - public void setCurrentFocusOwner(Component comp) { - setCurrentNativeFocusOwner(comp); + public static void setCurrentNativeFocusOwner(Component comp) { + synchronized (lock) { + currentFocusOwner = comp; + } } - public Component getCurrentFocusOwner() { - return getCurrentNativeFocusOwner(); + public static Component getCurrentNativeFocusOwner() { + synchronized(lock) { + return currentFocusOwner; + } } - public void clearGlobalFocusOwner(Window activeWindow) { - if (activeWindow != null) { - Component focusOwner = activeWindow.getFocusOwner(); - if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Clearing global focus owner " + focusOwner); - if (focusOwner != null) { -// XComponentPeer nativePeer = XComponentPeer.getNativeContainer(focusOwner); -// if (nativePeer != null) { - FocusEvent fl = new CausedFocusEvent(focusOwner, FocusEvent.FOCUS_LOST, false, null, - CausedFocusEvent.Cause.CLEAR_GLOBAL_FOCUS_OWNER); - XWindow.sendEvent(fl); -// } + public static void setCurrentNativeFocusedWindow(Window win) { + if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focused window " + win); + XWindowPeer from = null, to = null; + + synchronized(lock) { + if (currentFocusedWindow != null) { + from = (XWindowPeer)currentFocusedWindow.getPeer(); } - } - } - static boolean simulateMotifRequestFocus(Component lightweightChild, Component target, boolean temporary, - boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) - { - if (lightweightChild == null) { - lightweightChild = (Component)target; + currentFocusedWindow = win; + + if (currentFocusedWindow != null) { + to = (XWindowPeer)currentFocusedWindow.getPeer(); + } } - Component currentOwner = XKeyboardFocusManagerPeer.getCurrentNativeFocusOwner(); - if (currentOwner != null && currentOwner.getPeer() == null) { - currentOwner = null; + + if (from != null) { + from.updateSecurityWarningVisibility(); } - if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Simulating transfer from " + currentOwner + " to " + lightweightChild); - FocusEvent fg = new CausedFocusEvent(lightweightChild, FocusEvent.FOCUS_GAINED, false, currentOwner, cause); - FocusEvent fl = null; - if (currentOwner != null) { - fl = new CausedFocusEvent(currentOwner, FocusEvent.FOCUS_LOST, false, lightweightChild, cause); + if (to != null) { + to.updateSecurityWarningVisibility(); } + } - if (fl != null) { - XWindow.sendEvent(fl); + public static Window getCurrentNativeFocusedWindow() { + synchronized(lock) { + return currentFocusedWindow; } - XWindow.sendEvent(fg); - return true; } - static Method shouldNativelyFocusHeavyweightMethod; - - static int shouldNativelyFocusHeavyweight(Component heavyweight, - Component descendant, boolean temporary, - boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) + // TODO: do something to eliminate this forwarding + public static boolean deliverFocus(Component lightweightChild, + Component target, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time, + CausedFocusEvent.Cause cause) { - if (shouldNativelyFocusHeavyweightMethod == null) { - Class[] arg_types = - new Class[] { Component.class, - Component.class, - Boolean.TYPE, - Boolean.TYPE, - Long.TYPE, - CausedFocusEvent.Cause.class - }; - - shouldNativelyFocusHeavyweightMethod = - SunToolkit.getMethod(KeyboardFocusManager.class, - "shouldNativelyFocusHeavyweight", - arg_types); - } - Object[] args = new Object[] { heavyweight, - descendant, - Boolean.valueOf(temporary), - Boolean.valueOf(focusedWindowChangeAllowed), - Long.valueOf(time), cause}; - - int result = XComponentPeer.SNFH_FAILURE; - if (shouldNativelyFocusHeavyweightMethod != null) { - try { - result = ((Integer) shouldNativelyFocusHeavyweightMethod.invoke(null, args)).intValue(); - } - catch (IllegalAccessException e) { - assert false; - } - catch (InvocationTargetException e) { - assert false; - } - } - - return result; + return KeyboardFocusManagerPeerImpl.deliverFocus(lightweightChild, + target, + temporary, + focusedWindowChangeAllowed, + time, + cause, + getCurrentNativeFocusOwner()); } } diff --git a/src/solaris/classes/sun/awt/X11/XKeysym.java b/src/solaris/classes/sun/awt/X11/XKeysym.java index 9ec3d1c71097cb3cff25363febe735aafa3367f3..bac5aba2ab3bf00ca25933aa19f16108c0bfb9e0 100644 --- a/src/solaris/classes/sun/awt/X11/XKeysym.java +++ b/src/solaris/classes/sun/awt/X11/XKeysym.java @@ -1,7 +1,7 @@ // This is a generated file: do not edit! Edit keysym2ucs.h if necessary. /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 @@ -89,14 +89,47 @@ public class XKeysym { Character ch = keysym2UCSHash.get(ks); return ch == null ? (char)0 : ch.charValue(); } + static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) { + XToolkit.awtLock(); + try { + return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx); + } finally { + XToolkit.awtUnlock(); + } + } + static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) { + XToolkit.awtLock(); + try { + int mods = ev.get_state(); + if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) { + // I don't know all possible meanings of 'ndx' in case of XKB + // and don't want to speculate. But this particular case + // clearly means that caller needs a so called primary keysym. + mods ^= XConstants.ShiftMask; + } + XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(), + mods, XlibWrapper.iarg1, XlibWrapper.larg3); + //XXX unconsumed modifiers? + return Native.getLong(XlibWrapper.larg3); + } finally { + XToolkit.awtUnlock(); + } + } static long xkeycode2keysym(XKeyEvent ev, int ndx) { XToolkit.awtLock(); try { - return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ); + if (XToolkit.canUseXKBCalls()) { + return xkeycode2keysym_xkb(ev, ndx); + }else{ + return xkeycode2keysym_noxkb(ev, ndx); + } } finally { XToolkit.awtUnlock(); } } + static long xkeycode2primary_keysym(XKeyEvent ev) { + return xkeycode2keysym(ev, 0); + } public static boolean isKPEvent( XKeyEvent ev ) { // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. @@ -198,6 +231,27 @@ public class XKeysym { Keysym2JavaKeycode jkc = getJavaKeycode( ev ); return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); } + /** + * Return an integer java keycode apprx as it was before extending keycodes range. + * This call would ignore for instance XKB and process whatever is on the bottom + * of keysym stack. Result will not depend on actual locale, will differ between + * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian) + * but will be someway compatible with old releases. + */ + static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) { + long keysym = XConstants.NoSymbol; + int ndx = 0; + if( (ev.get_state() & XToolkit.numLockMask) != 0 && + isKPEvent(ev)) { + keysym = getKeypadKeysym( ev ); + } else { + // we only need primary-layer keysym to derive a java keycode. + ndx = 0; + keysym = xkeycode2keysym_noxkb(ev, ndx); + } + Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym ); + return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); + } static long javaKeycode2Keysym( int jkey ) { Long ks = javaKeycode2KeysymHash.get( jkey ); return (ks == null ? 0 : ks.longValue()); diff --git a/src/solaris/classes/sun/awt/X11/XNETProtocol.java b/src/solaris/classes/sun/awt/X11/XNETProtocol.java index 68145a74f79a8f5d2118b19e0ad69cc192e0d796..1bc8829d9bc225d386e2f4b017a45dcead479862 100644 --- a/src/solaris/classes/sun/awt/X11/XNETProtocol.java +++ b/src/solaris/classes/sun/awt/X11/XNETProtocol.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -169,6 +169,34 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt return ((layer == LAYER_ALWAYS_ON_TOP) || (layer == LAYER_NORMAL)) && doLayerProtocol(); } + public void requestState(XWindow window, XAtom state, boolean isAdd) { + XClientMessageEvent req = new XClientMessageEvent(); + try { + req.set_type((int)XConstants.ClientMessage); + req.set_window(window.getWindow()); + req.set_message_type(XA_NET_WM_STATE.getAtom()); + req.set_format(32); + req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE); + req.set_data(1, state.getAtom()); + // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed + req.set_data(2, 0); + log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(isAdd)}); + XToolkit.awtLock(); + try { + XlibWrapper.XSendEvent(XToolkit.getDisplay(), + XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()), + false, + XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, + req.pData); + } + finally { + XToolkit.awtUnlock(); + } + } finally { + req.dispose(); + } + } + /** * Helper function to set/reset one state in NET_WM_STATE * If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list @@ -181,31 +209,7 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt new Object[] {Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()), Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())}); if (window.isShowing()) { - XClientMessageEvent req = new XClientMessageEvent(); - try { - req.set_type((int)XConstants.ClientMessage); - req.set_window(window.getWindow()); - req.set_message_type(XA_NET_WM_STATE.getAtom()); - req.set_format(32); - req.set_data(0, (!set) ? _NET_WM_STATE_REMOVE : _NET_WM_STATE_ADD); - req.set_data(1, state.getAtom()); - // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed - req.set_data(2, 0); - log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(set)}); - XToolkit.awtLock(); - try { - XlibWrapper.XSendEvent(XToolkit.getDisplay(), - XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()), - false, - XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, - req.pData); - } - finally { - XToolkit.awtUnlock(); - } - } finally { - req.dispose(); - } + requestState(window, state, set); } else { XAtomList net_wm_state = window.getNETWMState(); log.log(Level.FINE, "Current state on {0} is {1}", new Object[] {window, net_wm_state}); @@ -252,6 +256,8 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt XAtom XA_NET_WM_WINDOW_TYPE = XAtom.get("_NET_WM_WINDOW_TYPE"); XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG"); + XAtom XA_NET_WM_WINDOW_OPACITY = XAtom.get("_NET_WM_WINDOW_OPACITY"); + /* For _NET_WM_STATE ClientMessage requests */ final static int _NET_WM_STATE_REMOVE =0; /* remove/unset property */ final static int _NET_WM_STATE_ADD =1; /* add/set property */ @@ -289,6 +295,12 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL); return res; } + + boolean doOpacityProtocol() { + boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY); + return res; + } + boolean isWMName(String name) { if (!active()) { return false; diff --git a/src/solaris/classes/sun/awt/X11/XPanelPeer.java b/src/solaris/classes/sun/awt/X11/XPanelPeer.java index aac632569ad3c6097dbdd380357410cb3118a4fd..c070fcf3ad87db01f7dd93787b7d8df20f99069c 100644 --- a/src/solaris/classes/sun/awt/X11/XPanelPeer.java +++ b/src/solaris/classes/sun/awt/X11/XPanelPeer.java @@ -130,39 +130,6 @@ public class XPanelPeer extends XCanvasPeer implements PanelPeer { return getInsets(); } - /* - * This method is called from XWindowPeer.displayChanged, when - * the window this Panel is on is moved to the new screen, or - * display mode is changed. - * - * The notification is propagated to the child Canvas components. - * Top-level windows and other Panels are notified too as their - * peers are subclasses of XCanvasPeer. - */ - public void displayChanged(int screenNum) { - super.displayChanged(screenNum); - displayChanged((Container)target, screenNum); - } - - /* - * Recursively iterates through all the HW and LW children - * of the container and calls displayChanged() for HW peers. - * Iteration through children peers only is not enough as the - * displayChanged notification may not be propagated to HW - * components inside LW containers, see 4452373 for details. - */ - private static void displayChanged(Container target, int screenNum) { - Component children[] = ((Container)target).getComponents(); - for (Component child : children) { - ComponentPeer cpeer = child.getPeer(); - if (cpeer instanceof XCanvasPeer) { - ((XCanvasPeer)cpeer).displayChanged(screenNum); - } else if (child instanceof Container) { - displayChanged((Container)child, screenNum); - } - } - } - public void dispose() { if (embedder != null) { embedder.deinstall(); diff --git a/src/solaris/classes/sun/awt/X11/XToolkit.java b/src/solaris/classes/sun/awt/X11/XToolkit.java index c3011dfa6a200d408ae10cbf108aebe8c00a903b..8a5030c83a1043478350200cd7243b9ec0f3ad82 100644 --- a/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -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 @@ -54,6 +54,7 @@ import sun.awt.*; import sun.font.FontManager; import sun.misc.PerformanceLogger; import sun.print.PrintJob2D; +import sun.security.action.GetBooleanAction; public final class XToolkit extends UNIXToolkit implements Runnable { private static Logger log = Logger.getLogger("sun.awt.X11.XToolkit"); @@ -291,6 +292,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable { if (XlibWrapper.XSetLocaleModifiers("") == null) { log.finer("X locale modifiers are not supported, using default"); } + tryXKB(); AwtScreenData defaultScreen = new AwtScreenData(XToolkit.getDefaultScreenData()); awt_defaultFg = defaultScreen.get_blackpixel(); @@ -313,6 +315,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable { if (xs != null) { ((XAWTXSettings)xs).dispose(); } + freeXKB(); if (log.isLoggable(Level.FINE)) { dumpPeers(); } @@ -591,6 +594,9 @@ public final class XToolkit extends UNIXToolkit implements Runnable { if (ev.get_type() != XConstants.NoExpose) { eventNumber++; } + if (awt_UseXKB_Calls && ev.get_type() == awt_XKBBaseEventCode) { + processXkbChanges(ev); + } if (XDropTargetEventProcessor.processEvent(ev) || XDragSourceContextPeer.processEvent(ev)) { @@ -2093,8 +2099,12 @@ public final class XToolkit extends UNIXToolkit implements Runnable { static boolean awt_ServerInquired = false; static boolean awt_IsXsunServer = false; - static boolean awt_XKBInquired = false; static boolean awt_UseXKB = false; + static boolean awt_UseXKB_Calls = false; + static int awt_XKBBaseEventCode = 0; + static int awt_XKBEffectiveGroup = 0; // so far, I don't use it leaving all calculations + // to XkbTranslateKeyCode + static long awt_XKBDescPtr = 0; /** Try to understand if it is Xsun server. By now (2005) Sun is vendor of Xsun and Xorg servers; we only return true if Xsun is running. @@ -2124,23 +2134,143 @@ public final class XToolkit extends UNIXToolkit implements Runnable { awtUnlock(); } } + static boolean isXKBenabled() { + awtLock(); + try { + return awt_UseXKB; + } finally { + awtUnlock(); + } + } + /** Query XKEYBOARD extension. + If possible, initialize xkb library. */ - static boolean isXKBenabled() { + static boolean tryXKB() { awtLock(); try { - if( awt_XKBInquired ) { - return awt_UseXKB; - } - awt_XKBInquired = true; String name = "XKEYBOARD"; + // First, if there is extension at all. awt_UseXKB = XlibWrapper.XQueryExtension( getDisplay(), name, XlibWrapper.larg1, XlibWrapper.larg2, XlibWrapper.larg3); + if( awt_UseXKB ) { + // There is a keyboard extension. Check if a client library is compatible. + // If not, don't use xkb calls. + // In this case we still may be Xkb-capable application. + awt_UseXKB_Calls = XlibWrapper.XkbLibraryVersion( XlibWrapper.larg1, XlibWrapper.larg2); + if( awt_UseXKB_Calls ) { + awt_UseXKB_Calls = XlibWrapper.XkbQueryExtension( getDisplay(), XlibWrapper.larg1, XlibWrapper.larg2, + XlibWrapper.larg3, XlibWrapper.larg4, XlibWrapper.larg5); + if( awt_UseXKB_Calls ) { + awt_XKBBaseEventCode = Native.getInt(XlibWrapper.larg2); + XlibWrapper.XkbSelectEvents (getDisplay(), + XConstants.XkbUseCoreKbd, + XConstants.XkbNewKeyboardNotifyMask | + XConstants.XkbMapNotifyMask ,//| + //XConstants.XkbStateNotifyMask, + XConstants.XkbNewKeyboardNotifyMask | + XConstants.XkbMapNotifyMask );//| + //XConstants.XkbStateNotifyMask); + + XlibWrapper.XkbSelectEventDetails(getDisplay(), XConstants.XkbUseCoreKbd, + XConstants.XkbStateNotify, + XConstants.XkbGroupStateMask, + XConstants.XkbGroupStateMask); + //XXX ? XkbGroupLockMask last, XkbAllStateComponentsMask before last? + awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(), + XConstants.XkbKeyTypesMask | + XConstants.XkbKeySymsMask | + XConstants.XkbModifierMapMask | + XConstants.XkbVirtualModsMask, + XConstants.XkbUseCoreKbd); + } + } + } return awt_UseXKB; } finally { awtUnlock(); } } + static boolean canUseXKBCalls() { + awtLock(); + try { + return awt_UseXKB_Calls; + } finally { + awtUnlock(); + } + } + static int getXKBEffectiveGroup() { + awtLock(); + try { + return awt_XKBEffectiveGroup; + } finally { + awtUnlock(); + } + } + static int getXKBBaseEventCode() { + awtLock(); + try { + return awt_XKBBaseEventCode; + } finally { + awtUnlock(); + } + } + static long getXKBKbdDesc() { + awtLock(); + try { + return awt_XKBDescPtr; + } finally { + awtUnlock(); + } + } + void freeXKB() { + awtLock(); + try { + if (awt_UseXKB_Calls && awt_XKBDescPtr != 0) { + XlibWrapper.XkbFreeKeyboard(awt_XKBDescPtr, 0xFF, true); + } + } finally { + awtUnlock(); + } + } + private void processXkbChanges(XEvent ev) { + // mapping change --> refresh kbd map + // state change --> get a new effective group; do I really need it + // or that should be left for XkbTranslateKeyCode? + XkbEvent xke = new XkbEvent( ev.getPData() ); + int xkb_type = xke.get_any().get_xkb_type(); + switch( xkb_type ) { + case XConstants.XkbNewKeyboardNotify : + if( awt_XKBDescPtr != 0 ) { + freeXKB(); + } + awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(), + XConstants.XkbKeyTypesMask | + XConstants.XkbKeySymsMask | + XConstants.XkbModifierMapMask | + XConstants.XkbVirtualModsMask, + XConstants.XkbUseCoreKbd); + //System.out.println("XkbNewKeyboard:"+(xke.get_new_kbd())); + break; + case XConstants.XkbMapNotify : + //TODO: provide a simple unit test. + XlibWrapper.XkbGetUpdatedMap(getDisplay(), + XConstants.XkbKeyTypesMask | + XConstants.XkbKeySymsMask | + XConstants.XkbModifierMapMask | + XConstants.XkbVirtualModsMask, + awt_XKBDescPtr); + //System.out.println("XkbMap:"+(xke.get_map())); + break; + case XConstants.XkbStateNotify : + // May use it later e.g. to obtain an effective group etc. + //System.out.println("XkbState:"+(xke.get_state())); + break; + default: + //System.out.println("XkbEvent of xkb_type "+xkb_type); + break; + } + } private static long eventNumber; public static long getEventNumber() { @@ -2273,4 +2403,44 @@ public final class XToolkit extends UNIXToolkit implements Runnable { public boolean areExtraMouseButtonsEnabled() throws HeadlessException { return areExtraMouseButtonsEnabled; } + + @Override + public boolean isWindowOpacitySupported() { + XNETProtocol net_protocol = XWM.getWM().getNETProtocol(); + + if (net_protocol == null) { + return false; + } + + return net_protocol.doOpacityProtocol(); + } + + @Override + public boolean isWindowShapingSupported() { + return XlibUtil.isShapingSupported(); + } + + @Override + public boolean isWindowTranslucencySupported() { + //NOTE: it may not be supported. The actual check is being performed + // at com.sun.awt.AWTUtilities(). In X11 we need to check + // whether there's any translucency-capable GC available. + return true; + } + + @Override + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + if (!(gc instanceof X11GraphicsConfig)) { + return false; + } + return ((X11GraphicsConfig)gc).isTranslucencyCapable(); + } + + /** + * Returns the value of "sun.awt.disablegrab" property. Default + * value is {@code false}. + */ + public static boolean getSunAwtDisableGrab() { + return AccessController.doPrivileged(new GetBooleanAction("sun.awt.disablegrab")); + } } diff --git a/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java b/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java index ff690bf9d0690a5b9b212640b98f8c827daa2fe1..b1243abacf7b02cbbe3b400b8a7ce499d3f1e756 100644 --- a/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java +++ b/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java @@ -38,15 +38,18 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.lang.reflect.InvocationTargetException; -public class XTrayIconPeer implements TrayIconPeer { +public class XTrayIconPeer implements TrayIconPeer, + InfoWindow.Balloon.LiveArguments, + InfoWindow.Tooltip.LiveArguments +{ private static final Logger ctrLog = Logger.getLogger("sun.awt.X11.XTrayIconPeer.centering"); TrayIcon target; TrayIconEventProxy eventProxy; XTrayIconEmbeddedFrame eframe; TrayIconCanvas canvas; - Balloon balloon; - Tooltip tooltip; + InfoWindow.Balloon balloon; + InfoWindow.Tooltip tooltip; PopupMenu popup; String tooltipString; boolean isTrayIconDisplayed; @@ -255,8 +258,8 @@ public class XTrayIconPeer implements TrayIconPeer { eframe.setVisible(true); updateImage(); - balloon = new Balloon(this, eframe); - tooltip = new Tooltip(this, eframe); + balloon = new InfoWindow.Balloon(eframe, target, this); + tooltip = new InfoWindow.Tooltip(eframe, target, this); addListeners(); } @@ -300,6 +303,10 @@ public class XTrayIconPeer implements TrayIconPeer { tooltipString = tooltip; } + public String getTooltipString() { + return tooltipString; + } + public void updateImage() { Runnable r = new Runnable() { public void run() { @@ -385,7 +392,7 @@ public class XTrayIconPeer implements TrayIconPeer { return eframe.getLocationOnScreen(); } - private Rectangle getBounds() { + public Rectangle getBounds() { Point loc = getLocationOnScreen(); return new Rectangle(loc.x, loc.y, loc.x + TRAY_ICON_WIDTH, loc.y + TRAY_ICON_HEIGHT); } @@ -399,10 +406,14 @@ public class XTrayIconPeer implements TrayIconPeer { return ((XEmbeddedFramePeer)eframe.getPeer()).getWindow(); } - boolean isDisposed() { + public boolean isDisposed() { return isDisposed; } + public String getActionCommand() { + return target.getActionCommand(); + } + static class TrayIconEventProxy implements MouseListener, MouseMotionListener { XTrayIconPeer xtiPeer; @@ -474,8 +485,8 @@ public class XTrayIconPeer implements TrayIconPeer { } static boolean isTrayIconStuffWindow(Window w) { - return (w instanceof Tooltip) || - (w instanceof Balloon) || + return (w instanceof InfoWindow.Tooltip) || + (w instanceof InfoWindow.Balloon) || (w instanceof XTrayIconEmbeddedFrame); } @@ -530,7 +541,7 @@ public class XTrayIconPeer implements TrayIconPeer { } } - static class IconCanvas extends Canvas { + public static class IconCanvas extends Canvas { volatile Image image; IconObserver observer; int width, height; @@ -608,429 +619,4 @@ public class XTrayIconPeer implements TrayIconPeer { } } } - - // *************************************** - // Classes for toolitp and balloon windows - // *************************************** - - static class Tooltip extends InfoWindow { - XTrayIconPeer xtiPeer; - Label textLabel = new Label(""); - Runnable starter = new Runnable() { - public void run() { - display(); - }}; - - final static int TOOLTIP_SHOW_TIME = 10000; - final static int TOOLTIP_START_DELAY_TIME = 1000; - final static int TOOLTIP_MAX_LENGTH = 64; - final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5; - final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220); - final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont(); - - Tooltip(XTrayIconPeer xtiPeer, Frame parent) { - super(parent, Color.black); - this.xtiPeer = xtiPeer; - - suppressWarningString(this); - - setCloser(null, TOOLTIP_SHOW_TIME); - textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR); - textLabel.setFont(TOOLTIP_TEXT_FONT); - add(textLabel); - } - - /* - * WARNING: this method is executed on Toolkit thread! - */ - void display() { - String tip = xtiPeer.tooltipString; - if (tip == null) { - return; - } else if (tip.length() > TOOLTIP_MAX_LENGTH) { - textLabel.setText(tip.substring(0, TOOLTIP_MAX_LENGTH)); - } else { - textLabel.setText(tip); - } - - // Execute on EDT to avoid deadlock (see 6280857). - SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() { - public void run() { - if (xtiPeer.isDisposed()) { - return; - } - Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - if (!isPointerOverTrayIcon(xtiPeer.getBounds())) { - return null; - } - return MouseInfo.getPointerInfo().getLocation(); - } - }); - if (pointer == null) { - return; - } - show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT); - } - }); - } - - void enter() { - XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME); - } - - void exit() { - XToolkit.remove(starter); - if (isVisible()) { - hide(); - } - } - - boolean isPointerOverTrayIcon(Rectangle trayRect) { - Point p = MouseInfo.getPointerInfo().getLocation(); - return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) || - p.y < trayRect.y || p.y > (trayRect.y + trayRect.height)); - } - } - - static class Balloon extends InfoWindow { - final static int BALLOON_SHOW_TIME = 10000; - final static int BALLOON_TEXT_MAX_LENGTH = 256; - final static int BALLOON_WORD_LINE_MAX_LENGTH = 16; - final static int BALLOON_WORD_LINE_MAX_COUNT = 4; - final static int BALLOON_ICON_WIDTH = 32; - final static int BALLOON_ICON_HEIGHT = 32; - final static int BALLOON_TRAY_ICON_INDENT = 0; - final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255); - final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12); - - XTrayIconPeer xtiPeer; - Panel mainPanel = new Panel(); - Panel captionPanel = new Panel(); - Label captionLabel = new Label(""); - Button closeButton = new Button("X"); - Panel textPanel = new Panel(); - IconCanvas iconCanvas = new IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT); - Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT]; - ActionPerformer ap = new ActionPerformer(); - - Image iconImage; - Image errorImage; - Image warnImage; - Image infoImage; - boolean gtkImagesLoaded; - - Displayer displayer = new Displayer(); - - Balloon(final XTrayIconPeer xtiPeer, Frame parent) { - super(parent, new Color(90, 80 ,190)); - this.xtiPeer = xtiPeer; - - suppressWarningString(this); - - setCloser(new Runnable() { - public void run() { - if (textPanel != null) { - textPanel.removeAll(); - textPanel.setSize(0, 0); - iconCanvas.setSize(0, 0); - XToolkit.awtLock(); - try { - displayer.isDisplayed = false; - XToolkit.awtLockNotifyAll(); - } finally { - XToolkit.awtUnlock(); - } - } - } - }, BALLOON_SHOW_TIME); - - add(mainPanel); - - captionLabel.setFont(BALLOON_CAPTION_FONT); - captionLabel.addMouseListener(ap); - - captionPanel.setLayout(new BorderLayout()); - captionPanel.add(captionLabel, BorderLayout.WEST); - captionPanel.add(closeButton, BorderLayout.EAST); - captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR); - captionPanel.addMouseListener(ap); - - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - hide(); - } - }); - - mainPanel.setLayout(new BorderLayout()); - mainPanel.setBackground(Color.white); - mainPanel.add(captionPanel, BorderLayout.NORTH); - mainPanel.add(iconCanvas, BorderLayout.WEST); - mainPanel.add(textPanel, BorderLayout.CENTER); - - iconCanvas.addMouseListener(ap); - - for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) { - lineLabels[i] = new Label(); - lineLabels[i].addMouseListener(ap); - lineLabels[i].setBackground(Color.white); - } - - displayer.start(); - } - - void display(String caption, String text, String messageType) { - if (!gtkImagesLoaded) { - loadGtkImages(); - } - displayer.display(caption, text, messageType); - } - - private void _display(String caption, String text, String messageType) { - captionLabel.setText(caption); - - BreakIterator iter = BreakIterator.getWordInstance(); - if (text != null) { - iter.setText(text); - int start = iter.first(), end; - int nLines = 0; - - do { - end = iter.next(); - - if (end == BreakIterator.DONE || - text.substring(start, end).length() >= 50) - { - lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ? - iter.last() : end)); - textPanel.add(lineLabels[nLines++]); - start = end; - } - if (nLines == BALLOON_WORD_LINE_MAX_COUNT) { - if (end != BreakIterator.DONE) { - lineLabels[nLines - 1].setText( - new String(lineLabels[nLines - 1].getText() + " ...")); - } - break; - } - } while (end != BreakIterator.DONE); - - - textPanel.setLayout(new GridLayout(nLines, 1)); - } - - if ("ERROR".equals(messageType)) { - iconImage = errorImage; - } else if ("WARNING".equals(messageType)) { - iconImage = warnImage; - } else if ("INFO".equals(messageType)) { - iconImage = infoImage; - } else { - iconImage = null; - } - - if (iconImage != null) { - Dimension tpSize = textPanel.getSize(); - iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ? - BALLOON_ICON_HEIGHT : tpSize.height)); - iconCanvas.validate(); - } - - SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() { - public void run() { - if (xtiPeer.isDisposed()) { - return; - } - Point parLoc = getParent().getLocationOnScreen(); - Dimension parSize = getParent().getSize(); - show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2), - BALLOON_TRAY_ICON_INDENT); - if (iconImage != null) { - iconCanvas.updateImage(iconImage); // call it after the show(..) above - } - } - }); - } - - public void dispose() { - displayer.interrupt(); - super.dispose(); - } - - void loadGtkImages() { - if (!gtkImagesLoaded) { - errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( - "gtk.icon.gtk-dialog-error.6.rtl"); - warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( - "gtk.icon.gtk-dialog-warning.6.rtl"); - infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty( - "gtk.icon.gtk-dialog-info.6.rtl"); - gtkImagesLoaded = true; - } - } - - class ActionPerformer extends MouseAdapter { - public void mouseClicked(MouseEvent e) { - // hide the balloon by any click - hide(); - if (e.getButton() == MouseEvent.BUTTON1) { - ActionEvent aev = new ActionEvent(xtiPeer.target, ActionEvent.ACTION_PERFORMED, - xtiPeer.target.getActionCommand(), - e.getWhen(), e.getModifiers()); - Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev); - } - } - } - - class Displayer extends Thread { - final int MAX_CONCURRENT_MSGS = 10; - - ArrayBlockingQueue<Message> messageQueue = new ArrayBlockingQueue<Message>(MAX_CONCURRENT_MSGS); - boolean isDisplayed; - - Displayer() { - setDaemon(true); - } - - public void run() { - while (true) { - Message msg = null; - try { - msg = (Message)messageQueue.take(); - } catch (InterruptedException e) { - return; - } - - /* - * Wait till the previous message is displayed if any - */ - XToolkit.awtLock(); - try { - while (isDisplayed) { - try { - XToolkit.awtLockWait(); - } catch (InterruptedException e) { - return; - } - } - isDisplayed = true; - } finally { - XToolkit.awtUnlock(); - } - _display(msg.caption, msg.text, msg.messageType); - } - } - - void display(String caption, String text, String messageType) { - messageQueue.offer(new Message(caption, text, messageType)); - } - } - - class Message { - String caption, text, messageType; - - Message(String caption, String text, String messageType) { - this.caption = caption; - this.text = text; - this.messageType = messageType; - } - } - } - - static class InfoWindow extends Window { - Container container; - Closer closer; - - InfoWindow(Frame parent, Color borderColor) { - super(parent); - container = new Container() { - public Insets getInsets() { - return new Insets(1, 1, 1, 1); - } - }; - setLayout(new BorderLayout()); - setBackground(borderColor); - add(container, BorderLayout.CENTER); - container.setLayout(new BorderLayout()); - - closer = new Closer(); - } - - public Component add(Component c) { - container.add(c, BorderLayout.CENTER); - return c; - } - - void setCloser(Runnable action, int time) { - closer.set(action, time); - } - - // Must be executed on EDT. - protected void show(Point corner, int indent) { - assert SunToolkit.isDispatchThreadForAppContext(InfoWindow.this); - - pack(); - - Dimension size = getSize(); - // TODO: When 6356322 is fixed we should get screen bounds in - // this way: eframe.getGraphicsConfiguration().getBounds(). - Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); - - if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square - setLocation(corner.x + indent, corner.y + indent); - - } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square - setLocation(corner.x - indent - size.width, corner.y + indent); - - } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square - setLocation(corner.x + indent, corner.y - indent - size.height); - - } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square - setLocation(corner.x - indent - size.width, corner.y - indent - size.height); - } - - InfoWindow.super.show(); - InfoWindow.this.closer.schedule(); - } - - public void hide() { - closer.close(); - } - - class Closer implements Runnable { - Runnable action; - int time; - - public void run() { - doClose(); - } - - void set(Runnable action, int time) { - this.action = action; - this.time = time; - } - - void schedule() { - XToolkit.schedule(this, time); - } - - void close() { - XToolkit.remove(this); - doClose(); - } - - // WARNING: this method may be executed on Toolkit thread. - private void doClose() { - SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() { - public void run() { - InfoWindow.super.hide(); - invalidate(); - if (action != null) { - action.run(); - } - } - }); - } - } - } } diff --git a/src/solaris/classes/sun/awt/X11/XWM.java b/src/solaris/classes/sun/awt/X11/XWM.java index c3adec9aa0286c8dc12865f5f33a626af04da026..66ac1e0d7af21fafc5362ce923ddb2b549667163 100644 --- a/src/solaris/classes/sun/awt/X11/XWM.java +++ b/src/solaris/classes/sun/awt/X11/XWM.java @@ -896,7 +896,7 @@ final class XWM /* * Set MWM decorations. Set MWM functions depending on resizability. */ - static void setMotifDecor(XWindowPeer window, boolean resizable, int decorations, int functions) { + static void setMotifDecor(XWindow window, boolean resizable, int decorations, int functions) { /* Apparently some WMs don't implement MWM_*_ALL semantic correctly */ if ((decorations & MWMConstants.MWM_DECOR_ALL) != 0 && (decorations != MWMConstants.MWM_DECOR_ALL)) diff --git a/src/solaris/classes/sun/awt/X11/XWarningWindow.java b/src/solaris/classes/sun/awt/X11/XWarningWindow.java index f53034d0dc5749107691f7609fc592b9fc099cc7..adb536440d483aae04103e48ceeb56bd56e60b42 100644 --- a/src/solaris/classes/sun/awt/X11/XWarningWindow.java +++ b/src/solaris/classes/sun/awt/X11/XWarningWindow.java @@ -25,16 +25,194 @@ package sun.awt.X11; import java.awt.*; +import java.awt.event.*; +import java.awt.geom.Point2D; +import java.lang.ref.WeakReference; +import sun.java2d.SunGraphics2D; +import sun.java2d.pipe.Region; +import sun.awt.AWTAccessor; +import sun.awt.SunToolkit; class XWarningWindow extends XWindow { - final static int defaultHeight = 27; + private final static int showingDelay = 330; + private final static int hidingDelay = 2000; - Window ownerWindow; - XWarningWindow(Window ownerWindow, long parentWindow) { - super(ownerWindow, parentWindow); + private final Window ownerWindow; + private WeakReference<XWindowPeer> ownerPeer; + + public final Window getOwnerWindow() { + return ownerWindow; + } + private long parentWindow; + + private final static String OWNER = "OWNER"; + + private static XIconInfo[][] icons; + + private InfoWindow.Tooltip tooltip; + + private static synchronized XIconInfo getSecurityIconInfo(int size, int num) { + if (icons == null) { + icons = new XIconInfo[4][3]; + if (XlibWrapper.dataModel == 32) { + icons[0][0] = new XIconInfo(XAWTIcon32_security_icon_bw16_png.security_icon_bw16_png); + icons[0][1] = new XIconInfo(XAWTIcon32_security_icon_interim16_png.security_icon_interim16_png); + icons[0][2] = new XIconInfo(XAWTIcon32_security_icon_yellow16_png.security_icon_yellow16_png); + icons[1][0] = new XIconInfo(XAWTIcon32_security_icon_bw24_png.security_icon_bw24_png); + icons[1][1] = new XIconInfo(XAWTIcon32_security_icon_interim24_png.security_icon_interim24_png); + icons[1][2] = new XIconInfo(XAWTIcon32_security_icon_yellow24_png.security_icon_yellow24_png); + icons[2][0] = new XIconInfo(XAWTIcon32_security_icon_bw32_png.security_icon_bw32_png); + icons[2][1] = new XIconInfo(XAWTIcon32_security_icon_interim32_png.security_icon_interim32_png); + icons[2][2] = new XIconInfo(XAWTIcon32_security_icon_yellow32_png.security_icon_yellow32_png); + icons[3][0] = new XIconInfo(XAWTIcon32_security_icon_bw48_png.security_icon_bw48_png); + icons[3][1] = new XIconInfo(XAWTIcon32_security_icon_interim48_png.security_icon_interim48_png); + icons[3][2] = new XIconInfo(XAWTIcon32_security_icon_yellow48_png.security_icon_yellow48_png); + } else { + icons[0][0] = new XIconInfo(XAWTIcon64_security_icon_bw16_png.security_icon_bw16_png); + icons[0][1] = new XIconInfo(XAWTIcon64_security_icon_interim16_png.security_icon_interim16_png); + icons[0][2] = new XIconInfo(XAWTIcon64_security_icon_yellow16_png.security_icon_yellow16_png); + icons[1][0] = new XIconInfo(XAWTIcon64_security_icon_bw24_png.security_icon_bw24_png); + icons[1][1] = new XIconInfo(XAWTIcon64_security_icon_interim24_png.security_icon_interim24_png); + icons[1][2] = new XIconInfo(XAWTIcon64_security_icon_yellow24_png.security_icon_yellow24_png); + icons[2][0] = new XIconInfo(XAWTIcon64_security_icon_bw32_png.security_icon_bw32_png); + icons[2][1] = new XIconInfo(XAWTIcon64_security_icon_interim32_png.security_icon_interim32_png); + icons[2][2] = new XIconInfo(XAWTIcon64_security_icon_yellow32_png.security_icon_yellow32_png); + icons[3][0] = new XIconInfo(XAWTIcon64_security_icon_bw48_png.security_icon_bw48_png); + icons[3][1] = new XIconInfo(XAWTIcon64_security_icon_interim48_png.security_icon_interim48_png); + icons[3][2] = new XIconInfo(XAWTIcon64_security_icon_yellow48_png.security_icon_yellow48_png); + } + } + final int sizeIndex = size % icons.length; + return icons[sizeIndex][num % icons[sizeIndex].length]; + } + + private volatile int currentIcon = 0; + + /* -1 - uninitialized yet + * 0 - 16x16 + * 1 - 24x24 + * 2 - 32x32 + * 3 - 48x48 + */ + private volatile int currentSize = -1; + + /** Indicates whether the shape of the window must be updated + */ + private volatile boolean sizeUpdated = true; + + private synchronized boolean updateIconSize() { + int newSize = currentSize; + + if (ownerWindow != null) { + Insets insets = ownerWindow.getInsets(); + int max = Math.max(insets.top, Math.max(insets.bottom, + Math.max(insets.left, insets.right))); + if (max < 24) { + newSize = 0; + } else if (max < 32) { + newSize = 1; + } else if (max < 48) { + newSize = 2; + } else { + newSize = 3; + } + } + if (newSize != currentSize) { + currentSize = newSize; + sizeUpdated = true; + } + return sizeUpdated; + } + + private synchronized XIconInfo getSecurityIconInfo() { + updateIconSize(); + return getSecurityIconInfo(currentSize, currentIcon); + } + + XWarningWindow(final Window ownerWindow, long parentWindow, XWindowPeer ownerPeer) { + super(new XCreateWindowParams(new Object[] { + TARGET, ownerWindow, + OWNER, Long.valueOf(parentWindow) + })); this.ownerWindow = ownerWindow; - xSetVisible(true); - toFront(); + this.parentWindow = parentWindow; + this.tooltip = new InfoWindow.Tooltip(null, getTarget(), + new InfoWindow.Tooltip.LiveArguments() { + public boolean isDisposed() { + return XWarningWindow.this.isDisposed(); + } + public Rectangle getBounds() { + return XWarningWindow.this.getBounds(); + } + public String getTooltipString() { + return XWarningWindow.this.ownerWindow.getWarningString(); + } + }); + this.ownerPeer = new WeakReference<XWindowPeer>(ownerPeer); + } + + private void requestNoTaskbar() { + XNETProtocol netProtocol = XWM.getWM().getNETProtocol(); + if (netProtocol != null) { + netProtocol.requestState(this, netProtocol.XA_NET_WM_STATE_SKIP_TASKBAR, true); + } + } + + @Override + void postInit(XCreateWindowParams params) { + super.postInit(params); + XToolkit.awtLock(); + try { + XWM.setMotifDecor(this, false, 0, 0); + XWM.setOLDecor(this, false, 0); + + long parentWindow = ((Long)params.get(OWNER)).longValue(); + XlibWrapper.XSetTransientFor(XToolkit.getDisplay(), + getWindow(), parentWindow); + + XWMHints hints = getWMHints(); + hints.set_flags(hints.get_flags() | (int)XUtilConstants.InputHint | (int)XUtilConstants.StateHint); + hints.set_input(false); + hints.set_initial_state(XUtilConstants.NormalState); + XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData); + + initWMProtocols(); + requestNoTaskbar(); + } finally { + XToolkit.awtUnlock(); + } + } + + private void updateWarningWindowBounds() { + XWindowPeer peer = ownerPeer.get(); + if (peer != null) { + synchronized (this) { + if (updateIconSize()) { + XIconInfo ico = getSecurityIconInfo(); + XToolkit.awtLock(); + try { + XlibWrapper.SetBitmapShape(XToolkit.getDisplay(), getWindow(), + ico.getWidth(), ico.getHeight(), ico.getIntData()); + } finally { + XToolkit.awtUnlock(); + } + sizeUpdated = false; + AWTAccessor.getWindowAccessor().setSecurityWarningSize( + ownerWindow, ico.getWidth(), ico.getHeight()); + } + } + peer.repositionSecurityWarning(); + } + } + + /** + * @param x,y,w,h coordinates of the untrusted window + */ + public void reposition(int x, int y, int w, int h) { + Point2D point = AWTAccessor.getWindowAccessor(). + calculateSecurityWarningPosition(ownerWindow, + x, y, w, h); + reshape((int)point.getX(), (int)point.getY(), getWidth(), getHeight()); } protected String getWMName() { @@ -49,33 +227,19 @@ class XWarningWindow extends XWindow { getFont()); } void paint(Graphics g, int x, int y, int width, int height) { - String warningString = getWarningString(); - Rectangle bounds = getBounds(); - bounds.x = 0; - bounds.y = 0; - Rectangle updateRect = new Rectangle(x, y, width, height); - if (updateRect.intersects(bounds)) { - Rectangle updateArea = updateRect.intersection(bounds); - g.setClip(updateArea); - g.setColor(getBackground()); - g.fillRect(updateArea.x, updateArea.y, updateArea.width, updateArea.height); - g.setColor(getColor()); - g.setFont(getFont()); - FontMetrics fm = g.getFontMetrics(); - int warningWidth = fm.stringWidth(warningString); - int w_x = (bounds.width - warningWidth)/2; - int w_y = (bounds.height + fm.getMaxAscent() - fm.getMaxDescent())/2; - g.drawString(warningString, w_x, w_y); - g.drawLine(bounds.x, bounds.y+bounds.height-1, bounds.x+bounds.width-1, bounds.y+bounds.height-1); - } + g.drawImage(getSecurityIconInfo().getImage(), 0, 0, null); } String getWarningString() { return ownerWindow.getWarningString(); } + int getWidth() { + return getSecurityIconInfo().getWidth(); + } + int getHeight() { - return defaultHeight; // should implement depending on Font + return getSecurityIconInfo().getHeight(); } Color getBackground() { @@ -97,6 +261,7 @@ class XWarningWindow extends XWindow { } } + @Override public void handleExposeEvent(XEvent xev) { super.handleExposeEvent(xev); @@ -105,18 +270,156 @@ class XWarningWindow extends XWindow { final int y = xe.get_y(); final int width = xe.get_width(); final int height = xe.get_height(); - EventQueue.invokeLater(new Runnable() { - public void run() { - Graphics g = getGraphics(); - try { - paint(g, x, y, width, height); - } finally { - g.dispose(); - } - } - }); + SunToolkit.executeOnEventHandlerThread(target, + new Runnable() { + public void run() { + Graphics g = getGraphics(); + try { + paint(g, x, y, width, height); + } finally { + g.dispose(); + } + } + }); } + + @Override protected boolean isEventDisabled(XEvent e) { return true; } + + /** Send a synthetic UnmapNotify in order to withdraw the window. + */ + private void withdraw() { + XEvent req = new XEvent(); + try { + long root; + XToolkit.awtLock(); + try { + root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber()); + } + finally { + XToolkit.awtUnlock(); + } + + req.set_type(XConstants.UnmapNotify); + + XUnmapEvent umev = req.get_xunmap(); + + umev.set_event(root); + umev.set_window(getWindow()); + umev.set_from_configure(false); + + XToolkit.awtLock(); + try { + XlibWrapper.XSendEvent(XToolkit.getDisplay(), + root, + false, + XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, + req.pData); + } + finally { + XToolkit.awtUnlock(); + } + } finally { + req.dispose(); + } + } + + @Override + protected void stateChanged(long time, int oldState, int newState) { + if (newState == XUtilConstants.IconicState) { + super.xSetVisible(false); + withdraw(); + } + } + + @Override + protected void setMouseAbove(boolean above) { + super.setMouseAbove(above); + XWindowPeer p = ownerPeer.get(); + if (p != null) { + p.updateSecurityWarningVisibility(); + } + } + + @Override + protected void enterNotify(long window) { + super.enterNotify(window); + if (window == getWindow()) { + tooltip.enter(); + } + } + + @Override + protected void leaveNotify(long window) { + super.leaveNotify(window); + if (window == getWindow()) { + tooltip.exit(); + } + } + + @Override + public void xSetVisible(boolean visible) { + super.xSetVisible(visible); + + // The _NET_WM_STATE_SKIP_TASKBAR got reset upon hiding/showing, + // so we request it every time whenever we change the visibility. + requestNoTaskbar(); + } + + private final Runnable hidingTask = new Runnable() { + public void run() { + xSetVisible(false); + } + }; + + private final Runnable showingTask = new Runnable() { + public void run() { + new Thread() { + public void run() { + if (!isVisible()) { + xSetVisible(true); + updateWarningWindowBounds(); + } + repaint(); + if (currentIcon > 0) { + currentIcon--; + XToolkit.schedule(showingTask, showingDelay); + } + }}.start(); + } + }; + + public void setSecurityWarningVisible(boolean visible) { + setSecurityWarningVisible(visible, true); + } + + public void setSecurityWarningVisible(boolean visible, boolean doSchedule) { + if (visible) { + XToolkit.remove(hidingTask); + XToolkit.remove(showingTask); + if (isVisible()) { + currentIcon = 0; + } else { + currentIcon = 3; + } + if (doSchedule) { + XToolkit.schedule(showingTask, 1); + } else { + showingTask.run(); + } + } else { + XToolkit.remove(showingTask); + XToolkit.remove(hidingTask); + if (!isVisible()) { + return; + } + if (doSchedule) { + XToolkit.schedule(hidingTask, hidingDelay); + } else { + hidingTask.run(); + } + } + } } diff --git a/src/solaris/classes/sun/awt/X11/XWindow.java b/src/solaris/classes/sun/awt/X11/XWindow.java index 5601273d8791ce00de75fc6b8065ad5763535b12..6c517b196970332092f01f6874f0003a8ac21f2b 100644 --- a/src/solaris/classes/sun/awt/X11/XWindow.java +++ b/src/solaris/classes/sun/awt/X11/XWindow.java @@ -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 @@ -68,6 +68,15 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { int oldWidth = -1; int oldHeight = -1; + protected PropMwmHints mwm_hints; + protected static XAtom wm_protocols; + protected static XAtom wm_delete_window; + protected static XAtom wm_take_focus; + + private boolean stateChanged; // Indicates whether the value on savedState is valid + private int savedState; // Holds last known state of the top-level window + + XWindowAttributesData winAttr; protected X11GraphicsConfig graphicsConfig; protected AwtGraphicsConfigData graphicsConfigData; @@ -119,6 +128,9 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { private native static void initIDs(); private static Field isPostedField; + private static Field rawCodeField; + private static Field primaryLevelUnicodeField; + private static Field extendedKeyCodeField; static { initIDs(); } @@ -218,6 +230,20 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } params.putIfNull(BACKING_STORE, XToolkit.getBackingStoreType()); + + XToolkit.awtLock(); + try { + if (wm_protocols == null) { + wm_protocols = XAtom.get("WM_PROTOCOLS"); + wm_delete_window = XAtom.get("WM_DELETE_WINDOW"); + wm_take_focus = XAtom.get("WM_TAKE_FOCUS"); + } + } + finally { + XToolkit.awtUnlock(); + } + winAttr = new XWindowAttributesData(); + savedState = XUtilConstants.WithdrawnState; } void postInit(XCreateWindowParams params) { @@ -832,12 +858,42 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { public native boolean x11inputMethodLookupString(long event, long [] keysymArray); native boolean haveCurrentX11InputMethodInstance(); + private boolean mouseAboveMe; + + public boolean isMouseAbove() { + synchronized (getStateLock()) { + return mouseAboveMe; + } + } + protected void setMouseAbove(boolean above) { + synchronized (getStateLock()) { + mouseAboveMe = above; + } + } + + protected void enterNotify(long window) { + if (window == getWindow()) { + setMouseAbove(true); + } + } + protected void leaveNotify(long window) { + if (window == getWindow()) { + setMouseAbove(false); + } + } + public void handleXCrossingEvent(XEvent xev) { super.handleXCrossingEvent(xev); XCrossingEvent xce = xev.get_xcrossing(); if (eventLog.isLoggable(Level.FINEST)) eventLog.finest(xce.toString()); + if (xce.get_type() == XConstants.EnterNotify) { + enterNotify(xce.get_window()); + } else { // LeaveNotify: + leaveNotify(xce.get_window()); + } + // Skip event If it was caused by a grab // This is needed because on displays with focus-follows-mouse on MousePress X system generates // two XCrossing events with mode != NormalNotify. First of them notifies that the mouse has left @@ -984,7 +1040,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { Parameter is a keysym basically from keysymdef.h XXX: how about vendor keys? Is there some with Unicode value and not in the list? */ - char keysymToUnicode( long keysym, int state ) { + int keysymToUnicode( long keysym, int state ) { return XKeysym.convertKeysym( keysym, state ); } int keyEventType2Id( int xEventType ) { @@ -994,6 +1050,13 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { static private long xkeycodeToKeysym(XKeyEvent ev) { return XKeysym.getKeysym( ev ); } + private long xkeycodeToPrimaryKeysym(XKeyEvent ev) { + return XKeysym.xkeycode2primary_keysym( ev ); + } + static private int primaryUnicode2JavaKeycode(int uni) { + return (uni > 0? sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(uni) : 0); + //return (uni > 0? uni + 0x01000000 : 0); + } void logIncomingKeyEvent(XKeyEvent ev) { keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev); dumpKeysymArray(ev); @@ -1012,7 +1075,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // un-final it if you need to override it in a subclass. final void handleKeyPress(XKeyEvent ev) { long keysym[] = new long[2]; - char unicodeKey = 0; + int unicodeKey = 0; keysym[0] = XConstants.NoSymbol; if (keyEventLog.isLoggable(Level.FINE)) { @@ -1057,19 +1120,36 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } + + // Take the first keysym from a keysym array associated with the XKeyevent + // and convert it to Unicode. Then, even if a Java keycode for the keystroke + // is undefined, we still have a guess of what has been engraved on a keytop. + int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0); + if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ - ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; " + ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+ + " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+ + ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; " ); } + + int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible + int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ? + primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) : + jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED, ev.get_time(), - jkc.getJavaKeycode(), + jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), - ev.get_state(),ev.getPData(), XKeyEvent.getSize()); + ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), + unicodeFromPrimaryKeysym, + jkeyExtended); + + if( unicodeKey > 0 ) { keyEventLog.fine("fire _TYPED on "+unicodeKey); postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED, @@ -1077,7 +1157,10 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { java.awt.event.KeyEvent.VK_UNDEFINED, unicodeKey, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN, - ev.get_state(),ev.getPData(), XKeyEvent.getSize()); + ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)0, + unicodeFromPrimaryKeysym, + java.awt.event.KeyEvent.VK_UNDEFINED); + } @@ -1095,7 +1178,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // un-private it if you need to call it from elsewhere private void handleKeyRelease(XKeyEvent ev) { long keysym[] = new long[2]; - char unicodeKey = 0; + int unicodeKey = 0; keysym[0] = XConstants.NoSymbol; if (keyEventLog.isLoggable(Level.FINE)) { @@ -1113,7 +1196,9 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ - ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; " + ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+ + " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+ + ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; " ); } // We obtain keysym from IM and derive unicodeKey from it for KeyPress only. @@ -1124,15 +1209,76 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // That's why we use the same procedure as if there was no IM instance: do-it-yourself unicode. unicodeKey = keysymToUnicode( xkeycodeToKeysym(ev), ev.get_state() ); + // Take a first keysym from a keysym array associated with the XKeyevent + // and convert it to Unicode. Then, even if Java keycode for the keystroke + // is undefined, we still will have a guess of what was engraved on a keytop. + int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0); + + int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible + int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ? + primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) : + jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED, ev.get_time(), - jkc.getJavaKeycode(), + jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), - ev.get_state(),ev.getPData(), XKeyEvent.getSize()); + ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), + unicodeFromPrimaryKeysym, + jkeyExtended); + } + /* + * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are + * unreliable, since mapping changes can happen for a virtual desktop + * switch or MacOS style shading that became quite popular under X as + * well. Yes, it probably should not be this way, as it violates + * ICCCM, but reality is that quite a lot of window managers abuse + * mapping state. + */ + int getWMState() { + if (stateChanged) { + stateChanged = false; + WindowPropertyGetter getter = + new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false, + XWM.XA_WM_STATE); + try { + int status = getter.execute(); + if (status != XConstants.Success || getter.getData() == 0) { + return savedState = XUtilConstants.WithdrawnState; + } + + if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) { + return savedState = XUtilConstants.WithdrawnState; + } + savedState = (int)Native.getCard32(getter.getData()); + } finally { + getter.dispose(); + } + } + return savedState; + } + + /** + * Override this methods to get notifications when top-level window state changes. The state is + * meant in terms of ICCCM: WithdrawnState, IconicState, NormalState + */ + protected void stateChanged(long time, int oldState, int newState) { + } + + @Override + public void handlePropertyNotify(XEvent xev) { + super.handlePropertyNotify(xev); + XPropertyEvent ev = xev.get_xproperty(); + if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) { + // State has changed, invalidate saved value + stateChanged = true; + stateChanged(ev.get_time(), savedState, getWMState()); + } + } + public void reshape(Rectangle bounds) { reshape(bounds.x, bounds.y, bounds.width, bounds.height); } @@ -1277,20 +1423,77 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } } - public void postKeyEvent(int id, long when, int keyCode, char keyChar, - int keyLocation, int state, long event, int eventSize) + public void postKeyEvent(int id, long when, int keyCode, int keyChar, + int keyLocation, int state, long event, int eventSize, long rawCode, + int unicodeFromPrimaryKeysym, int extendedKeyCode) + { long jWhen = XToolkit.nowMillisUTC_offset(when); int modifiers = getModifiers(state, 0, keyCode); + if (rawCodeField == null) { + rawCodeField = XToolkit.getField(KeyEvent.class, "rawCode"); + } + if (primaryLevelUnicodeField == null) { + primaryLevelUnicodeField = XToolkit.getField(KeyEvent.class, "primaryLevelUnicode"); + } + if (extendedKeyCodeField == null) { + extendedKeyCodeField = XToolkit.getField(KeyEvent.class, "extendedKeyCode"); + } + KeyEvent ke = new KeyEvent((Component)getEventSource(), id, jWhen, - modifiers, keyCode, keyChar, keyLocation); + modifiers, keyCode, (char)keyChar, keyLocation); if (event != 0) { byte[] data = Native.toBytes(event, eventSize); setBData(ke, data); } + try { + rawCodeField.set(ke, rawCode); + primaryLevelUnicodeField.set(ke, (long)unicodeFromPrimaryKeysym); + extendedKeyCodeField.set(ke, (long)extendedKeyCode); + } catch (IllegalArgumentException e) { + assert(false); + } catch (IllegalAccessException e) { + assert(false); + } postEventToEventQueue(ke); } static native int getAWTKeyCodeForKeySym(int keysym); static native int getKeySymForAWTKeyCode(int keycode); + + /* These two methods are actually applicable to toplevel windows only. + * However, the functionality is required by both the XWindowPeer and + * XWarningWindow, both of which have the XWindow as a common ancestor. + * See XWM.setMotifDecor() for details. + */ + public PropMwmHints getMWMHints() { + if (mwm_hints == null) { + mwm_hints = new PropMwmHints(); + if (!XWM.XA_MWM_HINTS.getAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS)) { + mwm_hints.zero(); + } + } + return mwm_hints; + } + + public void setMWMHints(PropMwmHints hints) { + mwm_hints = hints; + if (hints != null) { + XWM.XA_MWM_HINTS.setAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS); + } + } + + protected final void initWMProtocols() { + wm_protocols.setAtomListProperty(this, getWMProtocols()); + } + + /** + * Returns list of protocols which should be installed on this window. + * Descendants can override this method to add class-specific protocols + */ + protected XAtomList getWMProtocols() { + // No protocols on simple window + return new XAtomList(); + } + } diff --git a/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/src/solaris/classes/sun/awt/X11/XWindowPeer.java index 5666cab8cda43b5ab90e5b03459725b3b3a8fdfe..41807dbf047bd872937b0759a18c81390f468211 100644 --- a/src/solaris/classes/sun/awt/X11/XWindowPeer.java +++ b/src/solaris/classes/sun/awt/X11/XWindowPeer.java @@ -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 @@ -30,6 +30,8 @@ import java.awt.event.ComponentEvent; import java.awt.event.FocusEvent; import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; + import java.awt.peer.ComponentPeer; import java.awt.peer.WindowPeer; @@ -42,13 +44,17 @@ import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; +import sun.awt.AWTAccessor; import sun.awt.ComponentAccessor; import sun.awt.WindowAccessor; +import sun.awt.AWTAccessor; import sun.awt.DisplayChangedListener; import sun.awt.SunToolkit; import sun.awt.X11GraphicsDevice; import sun.awt.X11GraphicsEnvironment; +import sun.java2d.pipe.Region; + class XWindowPeer extends XPanelPeer implements WindowPeer, DisplayChangedListener { @@ -61,16 +67,11 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // should be synchronized on awtLock private static Set<XWindowPeer> windows = new HashSet<XWindowPeer>(); - static XAtom wm_protocols; - static XAtom wm_delete_window; - static XAtom wm_take_focus; - XWindowAttributesData winAttr; private boolean cachedFocusableWindow; XWarningWindow warningWindow; private boolean alwaysOnTop; - PropMwmHints mwm_hints; private boolean locationByPlatform; Dialog modalBlocker; @@ -87,8 +88,6 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, private boolean grab = false; // Whether to do a grab during showing private boolean isMapped = false; // Is this window mapped or not - private boolean stateChanged; // Indicates whether the value on savedState is valid - private int savedState; // Holds last known state of the top-level window private boolean mustControlStackPosition = false; // Am override-redirect not on top private XEventDispatcher rootPropertyEventDispatcher = null; @@ -135,25 +134,18 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, super.preInit(params); params.putIfNull(BIT_GRAVITY, Integer.valueOf(XConstants.NorthWestGravity)); - savedState = XUtilConstants.WithdrawnState; + long eventMask = 0; + if (params.containsKey(EVENT_MASK)) { + eventMask = ((Long)params.get(EVENT_MASK)); + } + eventMask |= XConstants.VisibilityChangeMask; + params.put(EVENT_MASK, eventMask); + XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE"); - winAttr = new XWindowAttributesData(); params.put(OVERRIDE_REDIRECT, Boolean.valueOf(isOverrideRedirect())); - SunToolkit.awtLock(); - try { - windows.add(this); - if (wm_protocols == null) { - wm_protocols = XAtom.get("WM_PROTOCOLS"); - wm_delete_window = XAtom.get("WM_DELETE_WINDOW"); - wm_take_focus = XAtom.get("WM_TAKE_FOCUS"); - } - } - finally { - SunToolkit.awtUnlock(); - } cachedFocusableWindow = isFocusableWindow(); Font f = target.getFont(); @@ -186,20 +178,6 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, params.put(BOUNDS, constrainBounds(bounds.x, bounds.y, bounds.width, bounds.height)); } - private void initWMProtocols() { - wm_protocols.setAtomListProperty(this, getWMProtocols()); - } - - /** - * Returns list of protocols which should be installed on this window. - * Descendants can override this method to add class-specific protocols - */ - protected XAtomList getWMProtocols() { - // No protocols on simple window - return new XAtomList(); - } - - protected String getWMName() { String name = target.getName(); if (name == null || name.trim().equals("")) { @@ -253,13 +231,17 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip // and TrayIcon balloon windows without a warning window. if (!WindowAccessor.isTrayIconWindow((Window)target)) { - warningWindow = new XWarningWindow((Window)target, getWindow()); + warningWindow = new XWarningWindow((Window)target, getWindow(), this); } } setSaveUnder(true); updateIconImages(); + + updateShape(); + updateOpacity(); + // no need in updateOpaque() as it is no-op } public void updateIconImages() { @@ -417,6 +399,22 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, return defaultIconInfo; } + private void updateShape() { + // Shape shape = ((Window)target).getShape(); + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + applyShape(Region.getInstance(shape, null)); + } + } + + private void updateOpacity() { + // float opacity = ((Window)target).getOpacity(); + float opacity = AWTAccessor.getWindowAccessor().getOpacity((Window)target); + if (opacity < 1.0f) { + setOpacity(opacity); + } + } + public void updateMinimumSize() { //This function only saves minimumSize value in XWindowPeer //Setting WMSizeHints is implemented in XDecoratedPeer @@ -513,10 +511,15 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } - if (!bounds.getSize().equals(oldBounds.getSize())) { + boolean isResized = !bounds.getSize().equals(oldBounds.getSize()); + boolean isMoved = !bounds.getLocation().equals(oldBounds.getLocation()); + if (isMoved || isResized) { + repositionSecurityWarning(); + } + if (isResized) { postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_RESIZED)); } - if (!bounds.getLocation().equals(oldBounds.getLocation())) { + if (isMoved) { postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_MOVED)); } } finally { @@ -539,7 +542,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } public Insets getInsets() { - return new Insets(getWarningWindowHeight(), 0, 0, 0); + return new Insets(0, 0, 0, 0); } // NOTE: This method may be called by privileged threads. @@ -686,6 +689,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, int curScreenNum = ((X11GraphicsDevice)getGraphicsConfiguration().getDevice()).getScreen(); int newScreenNum = 0; GraphicsDevice gds[] = XToolkit.localEnv.getScreenDevices(); + GraphicsConfiguration newGC = null; Rectangle screenBounds; for (int i = 0; i < gds.length; i++) { @@ -701,11 +705,13 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (intAmt == area) { // Completely on this screen - done! newScreenNum = i; + newGC = gds[i].getDefaultConfiguration(); break; } if (intAmt > largestAmt) { largestAmt = intAmt; newScreenNum = i; + newGC = gds[i].getDefaultConfiguration(); } } } @@ -713,28 +719,20 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (log.isLoggable(Level.FINEST)) { log.finest("XWindowPeer: Moved to a new screen"); } - draggedToNewScreen(newScreenNum); + executeDisplayChangedOnEDT(newGC); } } - /* Xinerama - * called to update our GC when dragged onto another screen - */ - public void draggedToNewScreen(int screenNum) { - executeDisplayChangedOnEDT(screenNum); - } - /** * Helper method that executes the displayChanged(screen) method on * the event dispatch thread. This method is used in the Xinerama case * and after display mode change events. */ - private void executeDisplayChangedOnEDT(final int screenNum) { + private void executeDisplayChangedOnEDT(final GraphicsConfiguration gc) { Runnable dc = new Runnable() { public void run() { - // Updates this window's GC and notifies all the children. - // See XPanelPeer/XCanvasPeer.displayChanged(int) for details. - displayChanged(screenNum); + AWTAccessor.getComponentAccessor(). + setGraphicsConfiguration((Component)target, gc); } }; SunToolkit.executeOnEventHandlerThread((Component)target, dc); @@ -745,9 +743,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, * X11GraphicsDevice when the display mode has been changed. */ public void displayChanged() { - GraphicsConfiguration gc = getGraphicsConfiguration(); - int curScreenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen(); - executeDisplayChangedOnEDT(curScreenNum); + executeDisplayChangedOnEDT(getGraphicsConfiguration()); } /** @@ -761,6 +757,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, * Overridden to check if we need to update our GraphicsDevice/Config * Added for 4934052. */ + @Override public void handleConfigureNotifyEvent(XEvent xev) { // TODO: We create an XConfigureEvent every time we override // handleConfigureNotify() - too many! @@ -774,8 +771,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // there could be a race condition in which a ComponentListener could // see the old screen. super.handleConfigureNotifyEvent(xev); - // for 5085647: no applet warning window visible - updateChildrenSizes(); + repositionSecurityWarning(); } final void requestXFocus(long time) { @@ -1053,6 +1049,9 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } updateFocusability(); promoteDefaultPosition(); + if (!vis && warningWindow != null) { + warningWindow.setSecurityWarningVisible(false, false); + } super.setVisible(vis); if (!vis && !isWithdrawn()) { // ICCCM, 4.1.4. Changing Window State: @@ -1082,6 +1081,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, if (isOverrideRedirect() && vis) { updateChildrenSizes(); } + repositionSecurityWarning(); } protected void suppressWmTakeFocus(boolean doSuppress) { @@ -1099,21 +1099,64 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, return 0; } - // The height of area used to display Applet's warning about securit - int getWarningWindowHeight() { - if (warningWindow != null) { - return warningWindow.getHeight(); - } else { - return 0; - } - } - // Called when shell changes its size and requires children windows // to update their sizes appropriately void updateChildrenSizes() { + } + + public void repositionSecurityWarning() { + // NOTE: On KWin if the window/border snapping option is enabled, + // the Java window may be swinging while it's being moved. + // This doesn't make the application unusable though looks quite ugly. + // Probobly we need to find some hint to assign to our Security + // Warning window in order to exclude it from the snapping option. + // We are not currently aware of existance of such a property. if (warningWindow != null) { - warningWindow.reshape(0, getMenuBarHeight(), getSize().width, warningWindow.getHeight()); + // We can't use the coordinates stored in the XBaseWindow since + // they are zeros for decorated frames. + int x = ComponentAccessor.getX(target); + int y = ComponentAccessor.getY(target); + int width = ComponentAccessor.getWidth(target); + int height = ComponentAccessor.getHeight(target); + warningWindow.reposition(x, y, width, height); + } + } + + @Override + protected void setMouseAbove(boolean above) { + super.setMouseAbove(above); + updateSecurityWarningVisibility(); + } + + public void updateSecurityWarningVisibility() { + if (warningWindow == null) { + return; + } + + boolean show = false; + + int state = getWMState(); + + if (!isVisible()) { + return; // The warning window should already be hidden. + } + + // getWMState() always returns 0 (Withdrawn) for simple windows. Hence + // we ignore the state for such windows. + if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) { + if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() == + getTarget()) + { + show = true; + } + + if (isMouseAbove() || warningWindow.isMouseAbove()) + { + show = true; + } } + + warningWindow.setSecurityWarningVisible(show); } boolean isOverrideRedirect() { @@ -1165,16 +1208,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, // if (ve.get_state() == XlibWrapper.VisibilityUnobscured) { // // raiseInputMethodWindow // } - } - - public void handlePropertyNotify(XEvent xev) { - super.handlePropertyNotify(xev); - XPropertyEvent ev = xev.get_xproperty(); - if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) { - // State has changed, invalidate saved value - stateChanged = true; - stateChanged(ev.get_time(), savedState, getWMState()); - } + repositionSecurityWarning(); } void handleRootPropertyNotify(XEvent xev) { @@ -1275,6 +1309,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, * Override this methods to get notifications when top-level window state changes. The state is * meant in terms of ICCCM: WithdrawnState, IconicState, NormalState */ + @Override protected void stateChanged(long time, int oldState, int newState) { // Fix for 6401700, 6412803 // If this window is modal blocked, it is put into the transient_for @@ -1288,38 +1323,8 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, for (ToplevelStateListener topLevelListenerTmp : toplevelStateListeners) { topLevelListenerTmp.stateChangedICCCM(oldState, newState); } - } - - - /* - * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are - * unreliable, since mapping changes can happen for a virtual desktop - * switch or MacOS style shading that became quite popular under X as - * well. Yes, it probably should not be this way, as it violates - * ICCCM, but reality is that quite a lot of window managers abuse - * mapping state. - */ - int getWMState() { - if (stateChanged) { - stateChanged = false; - WindowPropertyGetter getter = - new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false, - XWM.XA_WM_STATE); - try { - int status = getter.execute(); - if (status != XConstants.Success || getter.getData() == 0) { - return savedState = XUtilConstants.WithdrawnState; - } - if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) { - return savedState = XUtilConstants.WithdrawnState; - } - savedState = (int)Native.getCard32(getter.getData()); - } finally { - getter.dispose(); - } - } - return savedState; + updateSecurityWarningVisibility(); } boolean isWithdrawn() { @@ -2064,4 +2069,44 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, } super.handleButtonPressRelease(xev); } + + public void print(Graphics g) { + // We assume we print the whole frame, + // so we expect no clip was set previously + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + g.setClip(shape); + } + super.print(g); + } + + @Override + public void setOpacity(float opacity) { + final long maxOpacity = 0xffffffffl; + long iOpacity = (long)(opacity * maxOpacity); + if (iOpacity < 0) { + iOpacity = 0; + } + if (iOpacity > maxOpacity) { + iOpacity = maxOpacity; + } + + XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY"); + + if (iOpacity == maxOpacity) { + netWmWindowOpacityAtom.DeleteProperty(getWindow()); + } else { + netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity); + } + } + + @Override + public void setOpaque(boolean isOpaque) { + // no-op + } + + @Override + public void updateWindow(BufferedImage backBuffer) { + // no-op + } } diff --git a/src/solaris/classes/sun/awt/X11/XlibWrapper.java b/src/solaris/classes/sun/awt/X11/XlibWrapper.java index eb6d5e77510d005ca4a59b1374710a700f64209e..0de0dc861633ea0e68e21e6cd35305ebf5ffe5d3 100644 --- a/src/solaris/classes/sun/awt/X11/XlibWrapper.java +++ b/src/solaris/classes/sun/awt/X11/XlibWrapper.java @@ -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 @@ -156,6 +156,8 @@ Window w; static native void XLowerWindow(long display, long window); static native void XRestackWindows(long display, long windows, int length); + static native void XConfigureWindow(long display, long window, + long value_mask, long values); static native void XSetInputFocus(long display, long window); static native void XSetInputFocus2(long display, long window, long time); static native long XGetInputFocus(long display); @@ -490,6 +492,21 @@ static native String XSetLocaleModifiers(String modifier_list); static native int XKeysymToKeycode(long display, long keysym); + // xkb-related + static native int XkbGetEffectiveGroup(long display); + static native long XkbKeycodeToKeysym(long display, int keycode, int group, int level); + static native void XkbSelectEvents(long display, long device, long bits_to_change, long values_for_bits); + static native void XkbSelectEventDetails(long display, long device, long event_type, + long bits_to_change, long values_for_bits); + static native boolean XkbQueryExtension(long display, long opcode_rtrn, long event_rtrn, + long error_rtrn, long major_in_out, long minor_in_out); + static native boolean XkbLibraryVersion(long lib_major_in_out, long lib_minor_in_out); + static native long XkbGetMap(long display, long which, long device_spec); + static native long XkbGetUpdatedMap(long display, long which, long xkb); + static native void XkbFreeKeyboard(long xkb, long which, boolean free_all); + static native boolean XkbTranslateKeyCode(long xkb, int keycode, long mods, long mods_rtrn, long keysym_rtrn); + + static native void XConvertCase(long keysym, long keysym_lowercase, long keysym_uppercase); @@ -533,6 +550,13 @@ static native String XSetLocaleModifiers(String modifier_list); static native void SetRectangularShape(long display, long window, int lox, int loy, int hix, int hiy, sun.java2d.pipe.Region region); + /** Each int in the bitmap array is one pixel with a 32-bit color: + * R, G, B, and Alpha. + */ + static native void SetBitmapShape(long display, long window, + int width, int height, int[] bitmap); + + static native void SetZOrder(long display, long window, long above); /* Global memory area used for X lib parameter passing */ @@ -608,6 +632,15 @@ static native String XSetLocaleModifiers(String modifier_list); } return buf.toString(); } + static String getEventToString( int type ) { + if( (type >= 0) && (type < eventToString.length)) { + return eventToString[type]; + }else if( type == XToolkit.getXKBBaseEventCode() ) { + //XXX TODO various xkb types + return "XkbEvent"; + } + return eventToString[0]; + } private static boolean getBuildInternal() { String javaVersion = XToolkit.getSystemProperty("java.version"); diff --git a/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java b/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java index 84cfa254e4caa9052b64d9db3c340b9a268f9cef..3ad8662bf705bdafcbb6f0362c535f14b73abc77 100644 --- a/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java +++ b/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-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 @@ -859,14 +859,14 @@ public class WrapperGenerator { pw.println("\n\tlong pData;"); pw.println("\n\tpublic long getPData() { return pData; }"); - pw.println("\n\n\t" + stp.getJavaClassName() + "(long addr) {"); + pw.println("\n\n\tpublic " + stp.getJavaClassName() + "(long addr) {"); if (generateLog) { pw.println("\t\tlog.finest(\"Creating\");"); } pw.println("\t\tpData=addr;"); pw.println("\t\tshould_free_memory = false;"); pw.println("\t}"); - pw.println("\n\n\t" + stp.getJavaClassName() + "() {"); + pw.println("\n\n\tpublic " + stp.getJavaClassName() + "() {"); if (generateLog) { pw.println("\t\tlog.finest(\"Creating\");"); } @@ -1138,6 +1138,7 @@ public class WrapperGenerator { pw.println("/* This file is an automatically generated file, please do not edit this file, modify the XlibParser.java file instead !*/\n" ); pw.println("#include <X11/Xlib.h>\n#include <X11/Xutil.h>\n#include <X11/Xos.h>\n#include <X11/Xatom.h>\n#include <stdio.h>\n"); pw.println("#include <X11/extensions/Xdbe.h>"); + pw.println("#include <X11/XKBlib.h>"); pw.println("#include \"awt_p.h\""); pw.println("#include \"color.h\""); pw.println("#include \"colordata.h\""); diff --git a/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 b/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 index 38ec9071b05621a5da68d4d4913431a66110ab28..bdeeee25e2fb5c967106856f6b5e76ca1c11a112 100644 --- a/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 +++ b/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 @@ -16,10 +16,38 @@ XIMStringConversionCallbackStruct.operation 8 XIMStringConversionCallbackStruct.factor 10 XIMStringConversionCallbackStruct.text 16 XIMStringConversionCallbackStruct 24 +XkbNewKeyboardNotifyEvent.type 0 +XkbNewKeyboardNotifyEvent.serial 8 +XkbNewKeyboardNotifyEvent.send_event 16 +XkbNewKeyboardNotifyEvent.display 24 +XkbNewKeyboardNotifyEvent.time 32 +XkbNewKeyboardNotifyEvent.xkb_type 40 +XkbNewKeyboardNotifyEvent.device 44 +XkbNewKeyboardNotifyEvent.old_device 48 +XkbNewKeyboardNotifyEvent.min_key_code 52 +XkbNewKeyboardNotifyEvent.max_key_code 56 +XkbNewKeyboardNotifyEvent.old_min_key_code 60 +XkbNewKeyboardNotifyEvent.old_max_key_code 64 +XkbNewKeyboardNotifyEvent.changed 68 +XkbNewKeyboardNotifyEvent.req_major 72 +XkbNewKeyboardNotifyEvent.req_minor 73 +XkbNewKeyboardNotifyEvent 80 XTimeCoord.time 0 XTimeCoord.x 8 XTimeCoord.y 10 XTimeCoord 16 +XkbCompatMapNotifyEvent.type 0 +XkbCompatMapNotifyEvent.serial 8 +XkbCompatMapNotifyEvent.send_event 16 +XkbCompatMapNotifyEvent.display 24 +XkbCompatMapNotifyEvent.time 32 +XkbCompatMapNotifyEvent.xkb_type 40 +XkbCompatMapNotifyEvent.device 44 +XkbCompatMapNotifyEvent.changed_groups 48 +XkbCompatMapNotifyEvent.first_si 52 +XkbCompatMapNotifyEvent.num_si 56 +XkbCompatMapNotifyEvent.num_total_si 60 +XkbCompatMapNotifyEvent 64 XIMStatusDrawCallbackStruct.type 0 XIMStatusDrawCallbackStruct.data 8 XIMStatusDrawCallbackStruct 16 @@ -289,6 +317,22 @@ XVisualInfo.blue_mask 48 XVisualInfo.colormap_size 56 XVisualInfo.bits_per_rgb 60 XVisualInfo 64 +XkbControlsNotifyEvent.type 0 +XkbControlsNotifyEvent.serial 8 +XkbControlsNotifyEvent.send_event 16 +XkbControlsNotifyEvent.display 24 +XkbControlsNotifyEvent.time 32 +XkbControlsNotifyEvent.xkb_type 40 +XkbControlsNotifyEvent.device 44 +XkbControlsNotifyEvent.changed_ctrls 48 +XkbControlsNotifyEvent.enabled_ctrls 52 +XkbControlsNotifyEvent.enabled_ctrl_changes 56 +XkbControlsNotifyEvent.num_groups 60 +XkbControlsNotifyEvent.keycode 64 +XkbControlsNotifyEvent.event_type 65 +XkbControlsNotifyEvent.req_major 66 +XkbControlsNotifyEvent.req_minor 67 +XkbControlsNotifyEvent 72 PropMwmHints.flags 0 PropMwmHints.functions 8 PropMwmHints.decorations 16 @@ -310,8 +354,26 @@ XAnyEvent.send_event 16 XAnyEvent.display 24 XAnyEvent.window 32 XAnyEvent 40 +XkbIndicatorNotifyEvent.type 0 +XkbIndicatorNotifyEvent.serial 8 +XkbIndicatorNotifyEvent.send_event 16 +XkbIndicatorNotifyEvent.display 24 +XkbIndicatorNotifyEvent.time 32 +XkbIndicatorNotifyEvent.xkb_type 40 +XkbIndicatorNotifyEvent.device 44 +XkbIndicatorNotifyEvent.changed 48 +XkbIndicatorNotifyEvent.state 52 +XkbIndicatorNotifyEvent 56 XIMPreeditStateNotifyCallbackStruct.state 0 XIMPreeditStateNotifyCallbackStruct 8 +XkbAnyEvent.type 0 +XkbAnyEvent.serial 8 +XkbAnyEvent.send_event 16 +XkbAnyEvent.display 24 +XkbAnyEvent.time 32 +XkbAnyEvent.xkb_type 40 +XkbAnyEvent.device 44 +XkbAnyEvent 48 XMotionEvent.type 0 XMotionEvent.serial 8 XMotionEvent.send_event 16 @@ -334,6 +396,23 @@ XIMHotKeyTriggers 16 XIMStyles.count_styles 0 XIMStyles.supported_styles 8 XIMStyles 16 +XkbExtensionDeviceNotifyEvent.type 0 +XkbExtensionDeviceNotifyEvent.serial 8 +XkbExtensionDeviceNotifyEvent.send_event 16 +XkbExtensionDeviceNotifyEvent.display 24 +XkbExtensionDeviceNotifyEvent.time 32 +XkbExtensionDeviceNotifyEvent.xkb_type 40 +XkbExtensionDeviceNotifyEvent.device 44 +XkbExtensionDeviceNotifyEvent.reason 48 +XkbExtensionDeviceNotifyEvent.supported 52 +XkbExtensionDeviceNotifyEvent.unsupported 56 +XkbExtensionDeviceNotifyEvent.first_btn 60 +XkbExtensionDeviceNotifyEvent.num_btns 64 +XkbExtensionDeviceNotifyEvent.leds_defined 68 +XkbExtensionDeviceNotifyEvent.led_state 72 +XkbExtensionDeviceNotifyEvent.led_class 76 +XkbExtensionDeviceNotifyEvent.led_id 80 +XkbExtensionDeviceNotifyEvent 88 XwcTextItem.chars 0 XwcTextItem.nchars 8 XwcTextItem.delta 12 @@ -419,6 +498,20 @@ XKeyEvent.state 80 XKeyEvent.keycode 84 XKeyEvent.same_screen 88 XKeyEvent 96 +XkbActionMessageEvent.type 0 +XkbActionMessageEvent.serial 8 +XkbActionMessageEvent.send_event 16 +XkbActionMessageEvent.display 24 +XkbActionMessageEvent.time 32 +XkbActionMessageEvent.xkb_type 40 +XkbActionMessageEvent.device 44 +XkbActionMessageEvent.keycode 48 +XkbActionMessageEvent.press 52 +XkbActionMessageEvent.key_event_follows 56 +XkbActionMessageEvent.group 60 +XkbActionMessageEvent.mods 64 +XkbActionMessageEvent.message 68 +XkbActionMessageEvent 80 XdbeSwapInfo.swap_window 0 XdbeSwapInfo.swap_action 8 XdbeSwapInfo 16 @@ -458,6 +551,18 @@ Visual 56 XOMOrientation.num_orientation 0 XOMOrientation.orientation 8 XOMOrientation 16 +XkbAccessXNotifyEvent.type 0 +XkbAccessXNotifyEvent.serial 8 +XkbAccessXNotifyEvent.send_event 16 +XkbAccessXNotifyEvent.display 24 +XkbAccessXNotifyEvent.time 32 +XkbAccessXNotifyEvent.xkb_type 40 +XkbAccessXNotifyEvent.device 44 +XkbAccessXNotifyEvent.detail 48 +XkbAccessXNotifyEvent.keycode 52 +XkbAccessXNotifyEvent.sk_delay 56 +XkbAccessXNotifyEvent.debounce_delay 60 +XkbAccessXNotifyEvent 64 XWindowAttributes.x 0 XWindowAttributes.y 4 XWindowAttributes.width 8 @@ -528,6 +633,33 @@ awtImageData.wsImageFormat 4 awtImageData.clrdata 16 awtImageData.convert 48 awtImageData 560 +XkbStateNotifyEvent.type 0 +XkbStateNotifyEvent.serial 8 +XkbStateNotifyEvent.send_event 16 +XkbStateNotifyEvent.display 24 +XkbStateNotifyEvent.time 32 +XkbStateNotifyEvent.xkb_type 40 +XkbStateNotifyEvent.device 44 +XkbStateNotifyEvent.changed 48 +XkbStateNotifyEvent.group 52 +XkbStateNotifyEvent.base_group 56 +XkbStateNotifyEvent.latched_group 60 +XkbStateNotifyEvent.locked_group 64 +XkbStateNotifyEvent.mods 68 +XkbStateNotifyEvent.base_mods 72 +XkbStateNotifyEvent.latched_mods 76 +XkbStateNotifyEvent.locked_mods 80 +XkbStateNotifyEvent.compat_state 84 +XkbStateNotifyEvent.grab_mods 88 +XkbStateNotifyEvent.compat_grab_mods 89 +XkbStateNotifyEvent.lookup_mods 90 +XkbStateNotifyEvent.compat_lookup_mods 91 +XkbStateNotifyEvent.ptr_buttons 92 +XkbStateNotifyEvent.keycode 96 +XkbStateNotifyEvent.event_type 97 +XkbStateNotifyEvent.req_major 98 +XkbStateNotifyEvent.req_minor 99 +XkbStateNotifyEvent 104 XExposeEvent.type 0 XExposeEvent.serial 8 XExposeEvent.send_event 16 @@ -539,6 +671,33 @@ XExposeEvent.width 48 XExposeEvent.height 52 XExposeEvent.count 56 XExposeEvent 64 +XkbMapNotifyEvent.type 0 +XkbMapNotifyEvent.serial 8 +XkbMapNotifyEvent.send_event 16 +XkbMapNotifyEvent.display 24 +XkbMapNotifyEvent.time 32 +XkbMapNotifyEvent.xkb_type 40 +XkbMapNotifyEvent.device 44 +XkbMapNotifyEvent.changed 48 +XkbMapNotifyEvent.flags 52 +XkbMapNotifyEvent.first_type 56 +XkbMapNotifyEvent.num_types 60 +XkbMapNotifyEvent.min_key_code 64 +XkbMapNotifyEvent.max_key_code 65 +XkbMapNotifyEvent.first_key_sym 66 +XkbMapNotifyEvent.first_key_act 67 +XkbMapNotifyEvent.first_key_behavior 68 +XkbMapNotifyEvent.first_key_explicit 69 +XkbMapNotifyEvent.first_modmap_key 70 +XkbMapNotifyEvent.first_vmodmap_key 71 +XkbMapNotifyEvent.num_key_syms 72 +XkbMapNotifyEvent.num_key_acts 76 +XkbMapNotifyEvent.num_key_behaviors 80 +XkbMapNotifyEvent.num_key_explicit 84 +XkbMapNotifyEvent.num_modmap_keys 88 +XkbMapNotifyEvent.num_vmodmap_keys 92 +XkbMapNotifyEvent.vmods 96 +XkbMapNotifyEvent 104 XGCValues.function 0 XGCValues.plane_mask 8 XGCValues.foreground 16 @@ -583,6 +742,22 @@ XMapEvent.event 32 XMapEvent.window 40 XMapEvent.override_redirect 48 XMapEvent 56 +XkbBellNotifyEvent.type 0 +XkbBellNotifyEvent.serial 8 +XkbBellNotifyEvent.send_event 16 +XkbBellNotifyEvent.display 24 +XkbBellNotifyEvent.time 32 +XkbBellNotifyEvent.xkb_type 40 +XkbBellNotifyEvent.device 44 +XkbBellNotifyEvent.percent 48 +XkbBellNotifyEvent.pitch 52 +XkbBellNotifyEvent.duration 56 +XkbBellNotifyEvent.bell_class 60 +XkbBellNotifyEvent.bell_id 64 +XkbBellNotifyEvent.name 72 +XkbBellNotifyEvent.window 80 +XkbBellNotifyEvent.event_only 88 +XkbBellNotifyEvent 96 XIMStringConversionText.length 0 XIMStringConversionText.feedback 8 XIMStringConversionText.encoding_is_wchar 16 @@ -596,6 +771,21 @@ XKeyboardState.led_mask 16 XKeyboardState.global_auto_repeat 24 XKeyboardState.auto_repeats 28 XKeyboardState 64 +XkbEvent.type 0 +XkbEvent.any 0 +XkbEvent.new_kbd 0 +XkbEvent.map 0 +XkbEvent.state 0 +XkbEvent.ctrls 0 +XkbEvent.indicators 0 +XkbEvent.names 0 +XkbEvent.compat 0 +XkbEvent.bell 0 +XkbEvent.message 0 +XkbEvent.accessx 0 +XkbEvent.device 0 +XkbEvent.core 0 +XkbEvent 192 XPoint.x 0 XPoint.y 2 XPoint 4 @@ -633,6 +823,26 @@ XRectangle.y 2 XRectangle.width 4 XRectangle.height 6 XRectangle 8 +XkbNamesNotifyEvent.type 0 +XkbNamesNotifyEvent.serial 8 +XkbNamesNotifyEvent.send_event 16 +XkbNamesNotifyEvent.display 24 +XkbNamesNotifyEvent.time 32 +XkbNamesNotifyEvent.xkb_type 40 +XkbNamesNotifyEvent.device 44 +XkbNamesNotifyEvent.changed 48 +XkbNamesNotifyEvent.first_type 52 +XkbNamesNotifyEvent.num_types 56 +XkbNamesNotifyEvent.first_lvl 60 +XkbNamesNotifyEvent.num_lvls 64 +XkbNamesNotifyEvent.num_aliases 68 +XkbNamesNotifyEvent.num_radio_groups 72 +XkbNamesNotifyEvent.changed_vmods 76 +XkbNamesNotifyEvent.changed_groups 80 +XkbNamesNotifyEvent.changed_indicators 84 +XkbNamesNotifyEvent.first_key 88 +XkbNamesNotifyEvent.num_keys 92 +XkbNamesNotifyEvent 96 XCreateWindowEvent.type 0 XCreateWindowEvent.serial 8 XCreateWindowEvent.send_event 16 @@ -774,7 +984,8 @@ AwtGraphicsConfigData.monoPixmapGC 128 AwtGraphicsConfigData.pixelStride 136 AwtGraphicsConfigData.color_data 144 AwtGraphicsConfigData.glxInfo 152 -AwtGraphicsConfigData 160 +AwtGraphicsConfigData.isTranslucencySupported 160 +AwtGraphicsConfigData 168 XColor.pixel 0 XColor.red 8 XColor.green 10 diff --git a/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt b/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt index 21bc3ce02a901af7334ee691650f858ff63494e3..8f691353fa572264505a321b88022d0eb0d3e139 100644 --- a/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt +++ b/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt @@ -119,7 +119,7 @@ XIMStringConversionText length short feedback pointer encoding_is_wchar Bool - string pointer + string pointer XKeymapEvent type int serial long @@ -574,7 +574,7 @@ XImage f.get_pixel pointer f.put_pixel pointer f.sub_image pointer - f.add_pixel pointer + f.add_pixel pointer XIMValuesList count_values short supported_values pointer @@ -728,7 +728,7 @@ ColorData awt_icmLUT pointer int awt_icmLUT2Colors pointer byte img_grays pointer byte - img_clr_tbl pointer byte + img_clr_tbl pointer byte img_oda_red pointer byte img_oda_green pointer byte img_oda_blue pointer byte @@ -750,6 +750,7 @@ AwtGraphicsConfigData pixelStride int color_data pointer ColorData glxInfo pointer + isTranslucencySupported int AwtScreenData numConfigs int @@ -797,3 +798,227 @@ XEvent xerror struct XErrorEvent xkeymap struct XKeymapEvent pad array long 24 + +XkbAnyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + +XkbNewKeyboardNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + old_device int + min_key_code int + max_key_code int + old_min_key_code int + old_max_key_code int + changed int + req_major byte + req_minor byte + +XkbMapNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + flags int + first_type int + num_types int + min_key_code int + max_key_code int + first_key_sym int + first_key_act int + first_key_behavior int + first_key_explicit int + first_modmap_key int + first_vmodmap_key int + num_key_syms int + num_key_acts int + num_key_behaviors int + num_key_explicit int + num_modmap_keys int + num_vmodmap_keys int + vmods int + +XkbStateNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + group int + base_group int + latched_group int + locked_group int + mods int + base_mods int + latched_mods int + locked_mods int + compat_state int + grab_mods byte + compat_grab_mods byte + lookup_mods byte + compat_lookup_mods byte + ptr_buttons int + keycode int + event_type byte + req_major byte + req_minor byte + +XkbControlsNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed_ctrls int + enabled_ctrls int + enabled_ctrl_changes int + num_groups int + keycode int + event_type byte + req_major byte + req_minor byte + +XkbIndicatorNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + state int + +XkbNamesNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed int + first_type int + num_types int + first_lvl int + num_lvls int + num_aliases int + num_radio_groups int + changed_vmods int + changed_groups int + changed_indicators int + first_key int + num_keys int + + +XkbCompatMapNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + changed_groups int + first_si int + num_si int + num_total_si int + +XkbBellNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + percent int + pitch int + duration int + bell_class int + bell_id int + name Atom + window long + event_only Bool + +XkbActionMessageEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + keycode int + press Bool + key_event_follows Bool + group int + mods int + message array byte 7 //XkbActionMessageLength+1 + +XkbAccessXNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + detail int + keycode int + sk_delay int + debounce_delay int + +XkbExtensionDeviceNotifyEvent + type int + serial ulong + send_event Bool + display long + time ulong + xkb_type int + device int + reason int + supported int + unsupported int + first_btn int + num_btns int + leds_defined int + led_state int + led_class int + led_id int + +XkbEvent + type int + any struct XkbAnyEvent + new_kbd struct XkbNewKeyboardNotifyEvent + map struct XkbMapNotifyEvent + state struct XkbStateNotifyEvent + ctrls struct XkbControlsNotifyEvent + indicators struct XkbIndicatorNotifyEvent + names struct XkbNamesNotifyEvent + compat struct XkbCompatMapNotifyEvent + bell struct XkbBellNotifyEvent + message struct XkbActionMessageEvent + accessx struct XkbAccessXNotifyEvent + device struct XkbExtensionDeviceNotifyEvent + core struct XEvent diff --git a/src/solaris/classes/sun/awt/X11/keysym2ucs.h b/src/solaris/classes/sun/awt/X11/keysym2ucs.h index c59ffde042a12f22bac0f0152d18da7269cee1ae..c47ac18f9ca09141fb4f0c4de91ef6b624fbf41a 100644 --- a/src/solaris/classes/sun/awt/X11/keysym2ucs.h +++ b/src/solaris/classes/sun/awt/X11/keysym2ucs.h @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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 @@ -39,7 +39,7 @@ */ tojava /* -tojava * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. +tojava * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved. tojava * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. tojava * tojava * This code is free software; you can redistribute it and/or modify it @@ -127,14 +127,47 @@ tojava tojava Character ch = keysym2UCSHash.get(ks); tojava return ch == null ? (char)0 : ch.charValue(); tojava } +tojava static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) { +tojava XToolkit.awtLock(); +tojava try { +tojava return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx); +tojava } finally { +tojava XToolkit.awtUnlock(); +tojava } +tojava } +tojava static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) { +tojava XToolkit.awtLock(); +tojava try { +tojava int mods = ev.get_state(); +tojava if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) { +tojava // I don't know all possible meanings of 'ndx' in case of XKB +tojava // and don't want to speculate. But this particular case +tojava // clearly means that caller needs a so called primary keysym. +tojava mods ^= XConstants.ShiftMask; +tojava } +tojava XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(), +tojava mods, XlibWrapper.iarg1, XlibWrapper.larg3); +tojava //XXX unconsumed modifiers? +tojava return Native.getLong(XlibWrapper.larg3); +tojava } finally { +tojava XToolkit.awtUnlock(); +tojava } +tojava } tojava static long xkeycode2keysym(XKeyEvent ev, int ndx) { tojava XToolkit.awtLock(); tojava try { -tojava return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ); +tojava if (XToolkit.canUseXKBCalls()) { +tojava return xkeycode2keysym_xkb(ev, ndx); +tojava }else{ +tojava return xkeycode2keysym_noxkb(ev, ndx); +tojava } tojava } finally { tojava XToolkit.awtUnlock(); tojava } tojava } +tojava static long xkeycode2primary_keysym(XKeyEvent ev) { +tojava return xkeycode2keysym(ev, 0); +tojava } tojava public static boolean isKPEvent( XKeyEvent ev ) tojava { tojava // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. @@ -236,6 +269,27 @@ tojava static int getJavaKeycodeOnly( XKeyEvent ev ) { tojava Keysym2JavaKeycode jkc = getJavaKeycode( ev ); tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); tojava } +tojava /** +tojava * Return an integer java keycode apprx as it was before extending keycodes range. +tojava * This call would ignore for instance XKB and process whatever is on the bottom +tojava * of keysym stack. Result will not depend on actual locale, will differ between +tojava * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian) +tojava * but will be someway compatible with old releases. +tojava */ +tojava static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) { +tojava long keysym = XConstants.NoSymbol; +tojava int ndx = 0; +tojava if( (ev.get_state() & XToolkit.numLockMask) != 0 && +tojava isKPEvent(ev)) { +tojava keysym = getKeypadKeysym( ev ); +tojava } else { +tojava // we only need primary-layer keysym to derive a java keycode. +tojava ndx = 0; +tojava keysym = xkeycode2keysym_noxkb(ev, ndx); +tojava } +tojava Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym ); +tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); +tojava } tojava static long javaKeycode2Keysym( int jkey ) { tojava Long ks = javaKeycode2KeysymHash.get( jkey ); tojava return (ks == null ? 0 : ks.longValue()); diff --git a/src/solaris/classes/sun/awt/X11/security-icon-bw16.png b/src/solaris/classes/sun/awt/X11/security-icon-bw16.png new file mode 100644 index 0000000000000000000000000000000000000000..98dcd0f4e77d099c6d344ed0a3cdb7287e838c14 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-bw16.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-bw24.png b/src/solaris/classes/sun/awt/X11/security-icon-bw24.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5acae2e43758d7e27c5fd1238d53478f375ab1 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-bw24.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-bw32.png b/src/solaris/classes/sun/awt/X11/security-icon-bw32.png new file mode 100644 index 0000000000000000000000000000000000000000..9d92b96e2fe8a2e27cb98f2ad4bf1fb92b28c0d2 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-bw32.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-bw48.png b/src/solaris/classes/sun/awt/X11/security-icon-bw48.png new file mode 100644 index 0000000000000000000000000000000000000000..9615364226a9744814bd2ce673adba31ccb72c07 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-bw48.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-interim16.png b/src/solaris/classes/sun/awt/X11/security-icon-interim16.png new file mode 100644 index 0000000000000000000000000000000000000000..f543f65d8b17d0d62180f75f35b2871124e5624b Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-interim16.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-interim24.png b/src/solaris/classes/sun/awt/X11/security-icon-interim24.png new file mode 100644 index 0000000000000000000000000000000000000000..753a2adab88e4719cf3dbd4d1e2b65ba5df5c64c Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-interim24.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-interim32.png b/src/solaris/classes/sun/awt/X11/security-icon-interim32.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea41d490eafe731f58b2ac42be774ce1815d530 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-interim32.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-interim48.png b/src/solaris/classes/sun/awt/X11/security-icon-interim48.png new file mode 100644 index 0000000000000000000000000000000000000000..b619966b88da2ef51dfed428ff320b265f70065f Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-interim48.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-yellow16.png b/src/solaris/classes/sun/awt/X11/security-icon-yellow16.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd91a92898a29c3b584f6474cf798a11980bc27 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-yellow16.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-yellow24.png b/src/solaris/classes/sun/awt/X11/security-icon-yellow24.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3205ff67c358e1f2e1d7475af9334a886710d1 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-yellow24.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-yellow32.png b/src/solaris/classes/sun/awt/X11/security-icon-yellow32.png new file mode 100644 index 0000000000000000000000000000000000000000..6e178672b1fe8dad627f677ce8b656ca32dc7af0 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-yellow32.png differ diff --git a/src/solaris/classes/sun/awt/X11/security-icon-yellow48.png b/src/solaris/classes/sun/awt/X11/security-icon-yellow48.png new file mode 100644 index 0000000000000000000000000000000000000000..fcbfd7ff567b6da2225d65603b63d5413fcc9001 Binary files /dev/null and b/src/solaris/classes/sun/awt/X11/security-icon-yellow48.png differ diff --git a/src/solaris/classes/sun/awt/X11GraphicsConfig.java b/src/solaris/classes/sun/awt/X11GraphicsConfig.java index 8ea5717ac2a8f5517567e1f1d0e8baf862003909..aa4b527208b5a38da89c18b8ca42684f9b116fad 100644 --- a/src/solaris/classes/sun/awt/X11GraphicsConfig.java +++ b/src/solaris/classes/sun/awt/X11GraphicsConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -450,4 +450,13 @@ public class X11GraphicsConfig extends GraphicsConfiguration return 0x00; // UNDEFINED } } + + /* + @Override + */ + public boolean isTranslucencyCapable() { + return isTranslucencyCapable(getAData()); + } + + private native boolean isTranslucencyCapable(long x11ConfigData); } diff --git a/src/solaris/classes/sun/awt/motif/MToolkit.java b/src/solaris/classes/sun/awt/motif/MToolkit.java index 717990da2f7e8067e0ad3bb0fb450e848d1a3880..672e6e2bcce34e5cb27cbadf040aea81736f6c28 100644 --- a/src/solaris/classes/sun/awt/motif/MToolkit.java +++ b/src/solaris/classes/sun/awt/motif/MToolkit.java @@ -336,6 +336,10 @@ public class MToolkit extends UNIXToolkit implements Runnable { return null; } + public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) { + return null; + } + //public MEmbeddedFramePeer createEmbeddedFrame(MEmbeddedFrame target) //{ //MEmbeddedFramePeer peer = new MEmbeddedFramePeer(target); diff --git a/src/solaris/classes/sun/net/NetHooks.java b/src/solaris/classes/sun/net/NetHooks.java new file mode 100644 index 0000000000000000000000000000000000000000..f847934190c4231e59a0628b964e5a0a718c837c --- /dev/null +++ b/src/solaris/classes/sun/net/NetHooks.java @@ -0,0 +1,122 @@ +/* + * 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 sun.net; + +import java.net.InetAddress; +import java.io.FileDescriptor; +import java.io.IOException; +import java.security.AccessController; +import java.security.PrivilegedAction; +import sun.security.action.GetPropertyAction; + +/** + * Defines static methods to be invoked prior to binding or connecting TCP sockets. + */ + +public final class NetHooks { + + /** + * A provider with hooks to allow sockets be converted prior to binding or + * connecting a TCP socket. + * + * <p> Concrete implementations of this class should define a zero-argument + * constructor and implement the abstract methods specified below. + */ + public static abstract class Provider { + /** + * Initializes a new instance of this class. + */ + protected Provider() {} + + /** + * Invoked prior to binding a TCP socket. + */ + public abstract void implBeforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException; + + /** + * Invoked prior to connecting an unbound TCP socket. + */ + public abstract void implBeforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException; + } + + /** + * For now, we load the SDP provider on Solaris. In the future this may + * be changed to use the ServiceLoader facility to allow the deployment of + * other providers. + */ + private static Provider loadProvider(final String cn) { + return AccessController + .doPrivileged(new PrivilegedAction<Provider>() { + @Override public Provider run() { + Class<Provider> c; + try { + c = (Class<Provider>)Class.forName(cn, true, null); + } catch (ClassNotFoundException x) { + throw new AssertionError(x); + } + try { + return c.newInstance(); + } catch (IllegalAccessException x) { + throw new AssertionError(x); + } catch (InstantiationException x) { + throw new AssertionError(x); + } + }}); + } + private static final Provider provider = AccessController + .doPrivileged(new GetPropertyAction("os.name")).equals("SunOS") ? + loadProvider("sun.net.spi.SdpProvider") : null; + + /** + * Invoke prior to binding a TCP socket. + */ + public static void beforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (provider != null) + provider.implBeforeTcpBind(fdObj, address, port); + } + + /** + * Invoke prior to connecting an unbound TCP socket. + */ + public static void beforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (provider != null) + provider.implBeforeTcpConnect(fdObj, address, port); + } +} diff --git a/src/solaris/classes/sun/net/spi/SdpProvider.java b/src/solaris/classes/sun/net/spi/SdpProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..4ae7d9fa58cd7fb50161b75809d0b00d98aed608 --- /dev/null +++ b/src/solaris/classes/sun/net/spi/SdpProvider.java @@ -0,0 +1,339 @@ +/* + * 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 sun.net.spi; + +import sun.net.NetHooks; +import java.net.InetAddress; +import java.net.Inet4Address; +import java.net.UnknownHostException; +import java.util.*; +import java.io.File; +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.PrintStream; + +import sun.misc.SharedSecrets; +import sun.misc.JavaIOFileDescriptorAccess; + +/** + * A NetHooks provider that converts sockets from the TCP to SDP protocol prior + * to binding or connecting. + */ + +public class SdpProvider extends NetHooks.Provider { + private static final JavaIOFileDescriptorAccess fdAccess = + SharedSecrets.getJavaIOFileDescriptorAccess(); + + // maximum port + private static final int MAX_PORT = 65535; + + // indicates if SDP is enabled and the rules for when the protocol is used + private final boolean enabled; + private final List<Rule> rules; + + // logging for debug purposes + private PrintStream log; + + public SdpProvider() { + // if this property is not defined then there is nothing to do. + String file = System.getProperty("com.sun.sdp.conf"); + if (file == null) { + this.enabled = false; + this.rules = null; + return; + } + + // load configuration file + List<Rule> list = null; + if (file != null) { + try { + list = loadRulesFromFile(file); + } catch (IOException e) { + fail("Error reading %s: %s", file, e.getMessage()); + } + } + + // check if debugging is enabled + PrintStream out = null; + String logfile = System.getProperty("com.sun.sdp.debug"); + if (logfile != null) { + out = System.out; + if (logfile.length() > 0) { + try { + out = new PrintStream(logfile); + } catch (IOException ignore) { } + } + } + + this.enabled = !list.isEmpty(); + this.rules = list; + this.log = out; + } + + // supported actions + private static enum Action { + BIND, + CONNECT; + } + + // a rule for matching a bind or connect request + private static interface Rule { + boolean match(Action action, InetAddress address, int port); + } + + // rule to match port[-end] + private static class PortRangeRule implements Rule { + private final Action action; + private final int portStart; + private final int portEnd; + PortRangeRule(Action action, int portStart, int portEnd) { + this.action = action; + this.portStart = portStart; + this.portEnd = portEnd; + } + Action action() { + return action; + } + @Override + public boolean match(Action action, InetAddress address, int port) { + return (action == this.action && + port >= this.portStart && + port <= this.portEnd); + } + } + + // rule to match address[/prefix] port[-end] + private static class AddressPortRangeRule extends PortRangeRule { + private final byte[] addressAsBytes; + private final int prefixByteCount; + private final byte mask; + AddressPortRangeRule(Action action, InetAddress address, + int prefix, int port, int end) + { + super(action, port, end); + this.addressAsBytes = address.getAddress(); + this.prefixByteCount = prefix >> 3; + this.mask = (byte)(0xff << (8 - (prefix % 8))); + } + @Override + public boolean match(Action action, InetAddress address, int port) { + if (action != action()) + return false; + byte[] candidate = address.getAddress(); + // same address type? + if (candidate.length != addressAsBytes.length) + return false; + // check bytes + for (int i=0; i<prefixByteCount; i++) { + if (candidate[i] != addressAsBytes[i]) + return false; + } + // check remaining bits + if ((prefixByteCount < addressAsBytes.length) && + ((candidate[prefixByteCount] & mask) != + (addressAsBytes[prefixByteCount] & mask))) + return false; + return super.match(action, address, port); + } + } + + // parses port:[-end] + private static int[] parsePortRange(String s) { + int pos = s.indexOf('-'); + try { + int[] result = new int[2]; + if (pos < 0) { + boolean all = s.equals("*"); + result[0] = all ? 0 : Integer.parseInt(s); + result[1] = all ? MAX_PORT : result[0]; + } else { + String low = s.substring(0, pos); + if (low.length() == 0) low = "*"; + String high = s.substring(pos+1); + if (high.length() == 0) high = "*"; + result[0] = low.equals("*") ? 0 : Integer.parseInt(low); + result[1] = high.equals("*") ? MAX_PORT : Integer.parseInt(high); + } + return result; + } catch (NumberFormatException e) { + return new int[0]; + } + } + + private static void fail(String msg, Object... args) { + Formatter f = new Formatter(); + f.format(msg, args); + throw new RuntimeException(f.out().toString()); + } + + // loads rules from the given file + // Each non-blank/non-comment line must have the format: + // ("bind" | "connect") 1*LWSP-char (hostname | ipaddress["/" prefix]) + // 1*LWSP-char ("*" | port) [ "-" ("*" | port) ] + private static List<Rule> loadRulesFromFile(String file) + throws IOException + { + Scanner scanner = new Scanner(new File(file)); + try { + List<Rule> result = new ArrayList<Rule>(); + while (scanner.hasNextLine()) { + String line = scanner.nextLine().trim(); + + // skip blank lines and comments + if (line.length() == 0 || line.charAt(0) == '#') + continue; + + // must have 3 fields + String[] s = line.split("\\s+"); + if (s.length != 3) { + fail("Malformed line '%s'", line); + continue; + } + + // first field is the action ("bind" or "connect") + Action action = null; + for (Action a: Action.values()) { + if (s[0].equalsIgnoreCase(a.name())) { + action = a; + break; + } + } + if (action == null) { + fail("Action '%s' not recognized", s[0]); + continue; + } + + // * port[-end] + int[] ports = parsePortRange(s[2]); + if (ports.length == 0) { + fail("Malformed port range '%s'", s[2]); + continue; + } + + // match all addresses + if (s[1].equals("*")) { + result.add(new PortRangeRule(action, ports[0], ports[1])); + continue; + } + + // hostname | ipaddress[/prefix] + int pos = s[1].indexOf('/'); + try { + if (pos < 0) { + // hostname or ipaddress (no prefix) + InetAddress[] addresses = InetAddress.getAllByName(s[1]); + for (InetAddress address: addresses) { + int prefix = + (address instanceof Inet4Address) ? 32 : 128; + result.add(new AddressPortRangeRule(action, address, + prefix, ports[0], ports[1])); + } + } else { + // ipaddress/prefix + InetAddress address = InetAddress + .getByName(s[1].substring(0, pos)); + int prefix = -1; + try { + prefix = Integer.parseInt(s[1].substring(pos+1)); + if (address instanceof Inet4Address) { + // must be 1-31 + if (prefix < 0 || prefix > 32) prefix = -1; + } else { + // must be 1-128 + if (prefix < 0 || prefix > 128) prefix = -1; + } + } catch (NumberFormatException e) { + } + + if (prefix > 0) { + result.add(new AddressPortRangeRule(action, + address, prefix, ports[0], ports[1])); + } else { + fail("Malformed prefix '%s'", s[1]); + continue; + } + } + } catch (UnknownHostException uhe) { + fail("Unknown host or malformed IP address '%s'", s[1]); + continue; + } + } + return result; + } finally { + scanner.close(); + } + } + + // converts unbound TCP socket to a SDP socket if it matches the rules + private void convertTcpToSdpIfMatch(FileDescriptor fdObj, + Action action, + InetAddress address, + int port) + throws IOException + { + boolean matched = false; + for (Rule rule: rules) { + if (rule.match(action, address, port)) { + int fd = fdAccess.get(fdObj); + convert(fd); + matched = true; + break; + } + } + if (log != null) { + String addr = (address instanceof Inet4Address) ? + address.getHostAddress() : "[" + address.getHostAddress() + "]"; + if (matched) { + log.format("%s to %s:%d (socket converted to SDP protocol)\n", action, addr, port); + } else { + log.format("%s to %s:%d (no match)\n", action, addr, port); + } + } + } + + @Override + public void implBeforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (enabled) + convertTcpToSdpIfMatch(fdObj, Action.BIND, address, port); + } + + @Override + public void implBeforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + if (enabled) + convertTcpToSdpIfMatch(fdObj, Action.CONNECT, address, port); + } + + // -- native methods -- + private static native void convert(int fd) throws IOException; +} diff --git a/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java b/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java index f569c2dbe093b2860e43dfe726df0de013aaa7bd..53693383eeda5532c875a2b679cff3d44d69b82c 100644 --- a/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java +++ b/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java @@ -76,20 +76,19 @@ class DevPollArrayWrapper { // Base address of the native pollArray private long pollArrayAddress; + // Array of pollfd structs used for driver updates + private AllocatedNativeObject updatePollArray; + // Maximum number of POLL_FD structs to update at once - private int MAX_UPDATE_SIZE = 10000; + private int MAX_UPDATE_SIZE = Math.min(OPEN_MAX, 10000); DevPollArrayWrapper() { int allocationSize = NUM_POLLFDS * SIZE_POLLFD; pollArray = new AllocatedNativeObject(allocationSize, true); pollArrayAddress = pollArray.address(); + allocationSize = MAX_UPDATE_SIZE * SIZE_POLLFD; + updatePollArray = new AllocatedNativeObject(allocationSize, true); wfd = init(); - - for (int i=0; i<NUM_POLLFDS; i++) { - putDescriptor(i, 0); - putEventOps(i, 0); - putReventOps(i, 0); - } } // Machinery for remembering fd registration changes @@ -129,21 +128,11 @@ class DevPollArrayWrapper { register(wfd, fd0, POLLIN); } - void putEventOps(int i, int event) { - int offset = SIZE_POLLFD * i + EVENT_OFFSET; - pollArray.putShort(offset, (short)event); - } - void putReventOps(int i, int revent) { int offset = SIZE_POLLFD * i + REVENT_OFFSET; pollArray.putShort(offset, (short)revent); } - void putDescriptor(int i, int fd) { - int offset = SIZE_POLLFD * i + FD_OFFSET; - pollArray.putInt(offset, fd); - } - int getEventOps(int i) { int offset = SIZE_POLLFD * i + EVENT_OFFSET; return pollArray.getShort(offset); @@ -174,9 +163,10 @@ class DevPollArrayWrapper { void closeDevPollFD() throws IOException { FileDispatcherImpl.closeIntFD(wfd); pollArray.free(); + updatePollArray.free(); } - int poll(long timeout) { + int poll(long timeout) throws IOException { updateRegistrations(); updated = poll0(pollArrayAddress, NUM_POLLFDS, timeout, wfd); for (int i=0; i<updated; i++) { @@ -189,60 +179,34 @@ class DevPollArrayWrapper { return updated; } - void updateRegistrations() { - // take snapshot of the updateList size to see if there are - // any registrations to update - int updateSize; + void updateRegistrations() throws IOException { + // Populate pollfd array with updated masks synchronized (updateList) { - updateSize = updateList.size(); - } - if (updateSize > 0) { - // Construct a pollfd array with updated masks; we may overallocate - // by some amount because if the events are already POLLREMOVE - // then the second pollfd of that pair will not be needed. The - // number of entries is limited to a reasonable number to avoid - // allocating a lot of memory. - int maxUpdates = Math.min(updateSize * 2, MAX_UPDATE_SIZE); - int allocationSize = maxUpdates * SIZE_POLLFD; - AllocatedNativeObject updatePollArray = - new AllocatedNativeObject(allocationSize, true); - - try { - synchronized (updateList) { - while (updateList.size() > 0) { - // We have to insert a dummy node in between each - // real update to use POLLREMOVE on the fd first because - // otherwise the changes are simply OR'd together - int index = 0; - Updator u = null; - while ((u = updateList.poll()) != null) { - // First add pollfd struct to clear out this fd - putPollFD(updatePollArray, index, u.fd, POLLREMOVE); - index++; - // Now add pollfd to update this fd, if necessary - if (u.mask != POLLREMOVE) { - putPollFD(updatePollArray, index, u.fd, - (short)u.mask); - index++; - } - - // Check against the max allocation size; these are - // all we will process. Valid index ranges from 0 to - // (maxUpdates - 1) and we can use up to 2 per loop - if (index > maxUpdates - 2) - break; - } - // Register the changes with /dev/poll - registerMultiple(wfd, updatePollArray.address(), index); - } + while (updateList.size() > 0) { + // We have to insert a dummy node in between each + // real update to use POLLREMOVE on the fd first because + // otherwise the changes are simply OR'd together + int index = 0; + Updator u = null; + while ((u = updateList.poll()) != null) { + // First add pollfd struct to clear out this fd + putPollFD(updatePollArray, index, u.fd, POLLREMOVE); + index++; + // Now add pollfd to update this fd, if necessary + if (u.mask != POLLREMOVE) { + putPollFD(updatePollArray, index, u.fd, (short)u.mask); + index++; + } + + // Check against the max update size; these are + // all we will process. Valid index ranges from 0 to + // (MAX_UPDATE_SIZE - 1) and we can use up to 2 per loop + if (index > MAX_UPDATE_SIZE - 2) + break; } - } finally { - // Free the native array - updatePollArray.free(); - // BUG: If an exception was thrown then the selector now believes - // that the last set of changes was updated but it probably - // was not. This should not be a likely occurrence. - } + // Register the changes with /dev/poll + registerMultiple(wfd, updatePollArray.address(), index); + } } } @@ -275,7 +239,8 @@ class DevPollArrayWrapper { private native int init(); private native void register(int wfd, int fd, int mask); - private native void registerMultiple(int wfd, long address, int len); + private native void registerMultiple(int wfd, long address, int len) + throws IOException; private native int poll0(long pollAddress, int numfds, long timeout, int wfd); private static native void interrupt(int fd); diff --git a/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java b/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java index 362bd97089c3b4c2a0a198879ffe9005c6ab5050..622ff8d4764ee5306c1b2fdb0cc1ddbc6d8e3aab 100644 --- a/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java +++ b/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java @@ -78,8 +78,8 @@ class EPollArrayWrapper { // Base address of the native pollArray private final long pollArrayAddress; - // Set of "idle" file descriptors - private final HashSet<Integer> idleSet; + // Set of "idle" channels + private final HashSet<SelChImpl> idleSet; EPollArrayWrapper() { // creates the epoll file descriptor @@ -96,19 +96,22 @@ class EPollArrayWrapper { } // create idle set - idleSet = new HashSet<Integer>(); + idleSet = new HashSet<SelChImpl>(); } // Used to update file description registrations private static class Updator { + SelChImpl channel; int opcode; - int fd; int events; - Updator(int opcode, int fd, int events) { + Updator(SelChImpl channel, int opcode, int events) { + this.channel = channel; this.opcode = opcode; - this.fd = fd; this.events = events; } + Updator(SelChImpl channel, int opcode) { + this(channel, opcode, 0); + } } private LinkedList<Updator> updateList = new LinkedList<Updator>(); @@ -163,60 +166,54 @@ class EPollArrayWrapper { } /** - * Update the events for a given file descriptor. + * Update the events for a given channel. */ - void setInterest(int fd, int mask) { + void setInterest(SelChImpl channel, int mask) { synchronized (updateList) { - - // if the interest events are 0 then add to idle set, and delete - // from epoll if registered (or pending) - if (mask == 0) { - if (idleSet.add(fd)) { - updateList.add(new Updator(EPOLL_CTL_DEL, fd, 0)); - } - return; - } - - // if file descriptor is idle then add to epoll - if (!idleSet.isEmpty() && idleSet.remove(fd)) { - updateList.add(new Updator(EPOLL_CTL_ADD, fd, mask)); - return; - } - // if the previous pending operation is to add this file descriptor // to epoll then update its event set if (updateList.size() > 0) { Updator last = updateList.getLast(); - if (last.fd == fd && last.opcode == EPOLL_CTL_ADD) { + if (last.channel == channel && last.opcode == EPOLL_CTL_ADD) { last.events = mask; return; } } // update existing registration - updateList.add(new Updator(EPOLL_CTL_MOD, fd, mask)); + updateList.add(new Updator(channel, EPOLL_CTL_MOD, mask)); } } /** - * Add a new file descriptor to epoll + * Add a channel's file descriptor to epoll */ - void add(int fd) { + void add(SelChImpl channel) { synchronized (updateList) { - updateList.add(new Updator(EPOLL_CTL_ADD, fd, 0)); + updateList.add(new Updator(channel, EPOLL_CTL_ADD)); } } /** - * Remove a file descriptor from epoll + * Remove a channel's file descriptor from epoll */ - void release(int fd) { + void release(SelChImpl channel) { synchronized (updateList) { - // if file descriptor is idle then remove from idle set, otherwise - // delete from epoll - if (!idleSet.remove(fd)) { - updateList.add(new Updator(EPOLL_CTL_DEL, fd, 0)); + // flush any pending updates + int i = 0; + while (i < updateList.size()) { + if (updateList.get(i).channel == channel) { + updateList.remove(i); + } else { + i++; + } } + + // remove from the idle set (if present) + idleSet.remove(channel); + + // remove from epoll (if registered) + epollCtl(epfd, EPOLL_CTL_DEL, channel.getFDVal(), 0); } } @@ -248,7 +245,26 @@ class EPollArrayWrapper { synchronized (updateList) { Updator u = null; while ((u = updateList.poll()) != null) { - epollCtl(epfd, u.opcode, u.fd, u.events); + SelChImpl ch = u.channel; + if (!ch.isOpen()) + continue; + + // if the events are 0 then file descriptor is put into "idle + // set" to prevent it being polled + if (u.events == 0) { + boolean added = idleSet.add(u.channel); + // if added to idle set then remove from epoll if registered + if (added && (u.opcode == EPOLL_CTL_MOD)) + epollCtl(epfd, EPOLL_CTL_DEL, ch.getFDVal(), 0); + } else { + // events are specified. If file descriptor was in idle set + // it must be re-registered (by converting opcode to ADD) + boolean idle = false; + if (!idleSet.isEmpty()) + idle = idleSet.remove(u.channel); + int opcode = (idle) ? EPOLL_CTL_ADD : u.opcode; + epollCtl(epfd, opcode, ch.getFDVal(), u.events); + } } } } diff --git a/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java b/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java index a9bf82353f6b600f1d60e03de15990c843570bb6..505d8b7bb4ef961ea9852a5600f7ac44680844b7 100644 --- a/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java +++ b/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java @@ -139,7 +139,6 @@ class EPollSelectorImpl FileDispatcherImpl.closeIntFD(fd0); FileDispatcherImpl.closeIntFD(fd1); - pollWrapper.release(fd0); pollWrapper.closeEPollFD(); // it is possible selectedKeys = null; @@ -162,17 +161,18 @@ class EPollSelectorImpl protected void implRegister(SelectionKeyImpl ski) { if (closed) throw new ClosedSelectorException(); - int fd = IOUtil.fdVal(ski.channel.getFD()); - fdToKey.put(Integer.valueOf(fd), ski); - pollWrapper.add(fd); + SelChImpl ch = ski.channel; + fdToKey.put(Integer.valueOf(ch.getFDVal()), ski); + pollWrapper.add(ch); keys.add(ski); } protected void implDereg(SelectionKeyImpl ski) throws IOException { assert (ski.getIndex() >= 0); - int fd = ski.channel.getFDVal(); + SelChImpl ch = ski.channel; + int fd = ch.getFDVal(); fdToKey.remove(Integer.valueOf(fd)); - pollWrapper.release(fd); + pollWrapper.release(ch); ski.setIndex(-1); keys.remove(ski); selectedKeys.remove(ski); @@ -185,8 +185,7 @@ class EPollSelectorImpl void putEventOps(SelectionKeyImpl sk, int ops) { if (closed) throw new ClosedSelectorException(); - int fd = IOUtil.fdVal(sk.channel.getFD()); - pollWrapper.setInterest(fd, ops); + pollWrapper.setInterest(sk.channel, ops); } public Selector wakeup() { diff --git a/src/solaris/classes/sun/nio/ch/SctpAssocChange.java b/src/solaris/classes/sun/nio/ch/SctpAssocChange.java new file mode 100644 index 0000000000000000000000000000000000000000..53638b1382369e70f5e90795ad84aabe7e5f5555 --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpAssocChange.java @@ -0,0 +1,120 @@ +/* + * 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 sun.nio.ch; + +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.AssociationChangeNotification; + +/** + * An implementation of AssociationChangeNotification + */ +public class SctpAssocChange extends AssociationChangeNotification + implements SctpNotification +{ + /* static final ints so that they can be referenced from native */ + private final static int SCTP_COMM_UP = 1; + private final static int SCTP_COMM_LOST = 2; + private final static int SCTP_RESTART = 3; + private final static int SCTP_SHUTDOWN = 4; + private final static int SCTP_CANT_START = 5; + + private Association association; + + /* assocId is used to lookup the association before the notification is + * returned to user code */ + private int assocId; + private AssocChangeEvent event; + private int maxOutStreams; + private int maxInStreams; + + /* Invoked from native */ + private SctpAssocChange(int assocId, + int intEvent, + int maxOutStreams, + int maxInStreams) { + switch (intEvent) { + case SCTP_COMM_UP : + this.event = AssocChangeEvent.COMM_UP; + break; + case SCTP_COMM_LOST : + this.event = AssocChangeEvent.COMM_LOST; + break; + case SCTP_RESTART : + this.event = AssocChangeEvent.RESTART; + break; + case SCTP_SHUTDOWN : + this.event = AssocChangeEvent.SHUTDOWN; + break; + case SCTP_CANT_START : + this.event = AssocChangeEvent.CANT_START; + break; + default : + throw new AssertionError( + "Unknown Association Change Event type: " + intEvent); + } + + this.assocId = assocId; + this.maxOutStreams = maxOutStreams; + this.maxInStreams = maxInStreams; + } + + @Override + public int assocId() { + return assocId; + } + + @Override + public void setAssociation(Association association) { + this.association = association; + } + + @Override + public Association association() { + assert association != null; + return association; + } + + @Override + public AssocChangeEvent event() { + return event; + } + + int maxOutStreams() { + return maxOutStreams; + } + + int maxInStreams() { + return maxInStreams; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()).append(" ["); + sb.append("Association:").append(association); + sb.append(", Event: ").append(event).append("]"); + return sb.toString(); + } +} diff --git a/src/solaris/classes/sun/nio/ch/SctpAssociationImpl.java b/src/solaris/classes/sun/nio/ch/SctpAssociationImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..0d580c9478422aedf0e041bdc974150830c89e8e --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpAssociationImpl.java @@ -0,0 +1,52 @@ +/* + * 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 sun.nio.ch; + +import com.sun.nio.sctp.Association; + +/** + * An implementation of Association + */ +public class SctpAssociationImpl extends Association { + public SctpAssociationImpl(int associationID, + int maxInStreams, + int maxOutStreams) { + super(associationID, maxInStreams, maxOutStreams); + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(super.toString()); + return sb.append("[associationID:") + .append(associationID()) + .append(", maxIn:") + .append(maxInboundStreams()) + .append(", maxOut:") + .append(maxOutboundStreams()) + .append("]") + .toString(); + } +} + diff --git a/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java b/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..0be9bea85489af2a2fbcffb13d7beae2f8d0ac3a --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java @@ -0,0 +1,1073 @@ +/* + * 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 sun.nio.ch; + +import java.net.InetAddress; +import java.net.SocketAddress; +import java.net.InetSocketAddress; +import java.io.FileDescriptor; +import java.io.IOException; +import java.util.Collections; +import java.util.Set; +import java.util.HashSet; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.ConnectionPendingException; +import java.nio.channels.NoConnectionPendingException; +import java.nio.channels.AlreadyBoundException; +import java.nio.channels.AlreadyConnectedException; +import java.nio.channels.NotYetBoundException; +import java.nio.channels.NotYetConnectedException; +import java.nio.channels.spi.SelectorProvider; +import com.sun.nio.sctp.AbstractNotificationHandler; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.AssociationChangeNotification; +import com.sun.nio.sctp.HandlerResult; +import com.sun.nio.sctp.IllegalReceiveException; +import com.sun.nio.sctp.InvalidStreamException; +import com.sun.nio.sctp.IllegalUnbindException; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.NotificationHandler; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpSocketOption; +import sun.nio.ch.NativeDispatcher; +import sun.nio.ch.PollArrayWrapper; +import sun.nio.ch.SelChImpl; +import static com.sun.nio.sctp.SctpStandardSocketOption.*; +import static sun.nio.ch.SctpResultContainer.SEND_FAILED; +import static sun.nio.ch.SctpResultContainer.ASSOCIATION_CHANGED; +import static sun.nio.ch.SctpResultContainer.PEER_ADDRESS_CHANGED; +import static sun.nio.ch.SctpResultContainer.SHUTDOWN; + +/** + * An implementation of an SctpChannel + */ +public class SctpChannelImpl extends SctpChannel + implements SelChImpl +{ + /* Used to make native close and preClose calls */ + private static NativeDispatcher nd; + + private final FileDescriptor fd; + + private final int fdVal; + + /* IDs of native threads doing send and receivess, for signalling */ + private volatile long receiverThread = 0; + private volatile long senderThread = 0; + + /* Lock held by current receiving or connecting thread */ + private final Object receiveLock = new Object(); + + /* Lock held by current sending or connecting thread */ + private final Object sendLock = new Object(); + + private final ThreadLocal<Boolean> receiveInvoked = + new ThreadLocal<Boolean>() { + @Override protected Boolean initialValue() { + return Boolean.FALSE; + } + }; + + /* Lock held by any thread that modifies the state fields declared below + DO NOT invoke a blocking I/O operation while holding this lock! */ + private final Object stateLock = new Object(); + + private enum ChannelState { + UNINITIALIZED, + UNCONNECTED, + PENDING, + CONNECTED, + KILLPENDING, + KILLED, + } + /* -- The following fields are protected by stateLock -- */ + private ChannelState state = ChannelState.UNINITIALIZED; + + /* Binding; Once bound the port will remain constant. */ + int port = -1; + private HashSet<InetSocketAddress> localAddresses = new HashSet<InetSocketAddress>(); + /* Has the channel been bound to the wildcard address */ + private boolean wildcard; /* false */ + //private InetSocketAddress remoteAddress = null; + + /* Input/Output open */ + private boolean readyToConnect; + + /* Shutdown */ + private boolean isShutdown; + + private Association association; + + /* -- End of fields protected by stateLock -- */ + + private SctpResultContainer commUpResultContainer; /* null */ + + /** + * Constructor for normal connecting sockets + */ + public SctpChannelImpl(SelectorProvider provider) throws IOException { + //TODO: update provider remove public modifier + super(provider); + this.fd = SctpNet.socket(true); + this.fdVal = IOUtil.fdVal(fd); + this.state = ChannelState.UNCONNECTED; + } + + /** + * Constructor for sockets obtained from server sockets + */ + public SctpChannelImpl(SelectorProvider provider, FileDescriptor fd) + throws IOException { + super(provider); + this.fd = fd; + this.fdVal = IOUtil.fdVal(fd); + this.state = ChannelState.CONNECTED; + port = (Net.localAddress(fd)).getPort(); + + /* Receive COMM_UP */ + ByteBuffer buf = Util.getTemporaryDirectBuffer(50); + try { + receive(buf, null, null, true); + } finally { + Util.releaseTemporaryDirectBuffer(buf); + } + } + + /** + * Binds the channel's socket to a local address. + */ + @Override + public SctpChannel bind(SocketAddress local) throws IOException { + synchronized (receiveLock) { + synchronized (sendLock) { + synchronized (stateLock) { + ensureOpenAndUnconnected(); + if (isBound()) + throw new AlreadyBoundException(); + InetSocketAddress isa = (local == null) ? + new InetSocketAddress(0) : Net.checkAddress(local); + Net.bind(fd, isa.getAddress(), isa.getPort()); + InetSocketAddress boundIsa = Net.localAddress(fd); + port = boundIsa.getPort(); + localAddresses.add(isa); + if (isa.getAddress().isAnyLocalAddress()) + wildcard = true; + } + } + } + return this; + } + + @Override + public SctpChannel bindAddress(InetAddress address) + throws IOException { + bindUnbindAddress(address, true); + localAddresses.add(new InetSocketAddress(address, port)); + return this; + } + + @Override + public SctpChannel unbindAddress(InetAddress address) + throws IOException { + bindUnbindAddress(address, false); + localAddresses.remove(new InetSocketAddress(address, port)); + return this; + } + + private SctpChannel bindUnbindAddress(InetAddress address, boolean add) + throws IOException { + if (address == null) + throw new IllegalArgumentException(); + + synchronized (receiveLock) { + synchronized (sendLock) { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + throw new NotYetBoundException(); + if (wildcard) + throw new IllegalStateException( + "Cannot add or remove addresses from a channel that is bound to the wildcard address"); + if (address.isAnyLocalAddress()) + throw new IllegalArgumentException( + "Cannot add or remove the wildcard address"); + if (add) { + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + throw new AlreadyBoundException(); + } + } + } else { /*removing */ + /* Verify that there is more than one address + * and that address is already bound */ + if (localAddresses.size() <= 1) + throw new IllegalUnbindException("Cannot remove address from a channel with only one address bound"); + boolean foundAddress = false; + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + foundAddress = true; + break; + } + } + if (!foundAddress ) + throw new IllegalUnbindException("Cannot remove address from a channel that is not bound to that address"); + } + + SctpNet.bindx(fdVal, new InetAddress[]{address}, port, add); + + /* Update our internal Set to reflect the addition/removal */ + if (add) + localAddresses.add(new InetSocketAddress(address, port)); + else { + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + localAddresses.remove(addr); + break; + } + } + } + } + } + } + return this; + } + + private boolean isBound() { + synchronized (stateLock) { + return port == -1 ? false : true; + } + } + + private boolean isConnected() { + synchronized (stateLock) { + return (state == ChannelState.CONNECTED); + } + } + + private void ensureOpenAndUnconnected() throws IOException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (isConnected()) + throw new AlreadyConnectedException(); + if (state == ChannelState.PENDING) + throw new ConnectionPendingException(); + } + } + + private boolean ensureReceiveOpen() throws ClosedChannelException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isConnected()) + throw new NotYetConnectedException(); + else + return true; + } + } + + private void ensureSendOpen() throws ClosedChannelException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (isShutdown) + throw new ClosedChannelException(); + if (!isConnected()) + throw new NotYetConnectedException(); + } + } + + private void receiverCleanup() throws IOException { + synchronized (stateLock) { + receiverThread = 0; + if (state == ChannelState.KILLPENDING) + kill(); + } + } + + private void senderCleanup() throws IOException { + synchronized (stateLock) { + senderThread = 0; + if (state == ChannelState.KILLPENDING) + kill(); + } + } + + @Override + public Association association() throws ClosedChannelException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isConnected()) + return null; + + return association; + } + } + + @Override + public boolean connect(SocketAddress endpoint) throws IOException { + synchronized (receiveLock) { + synchronized (sendLock) { + ensureOpenAndUnconnected(); + InetSocketAddress isa = Net.checkAddress(endpoint); + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkConnect(isa.getAddress().getHostAddress(), + isa.getPort()); + synchronized (blockingLock()) { + int n = 0; + try { + try { + begin(); + synchronized (stateLock) { + if (!isOpen()) { + return false; + } + receiverThread = NativeThread.current(); + } + for (;;) { + InetAddress ia = isa.getAddress(); + if (ia.isAnyLocalAddress()) + ia = InetAddress.getLocalHost(); + n = Net.connect(fd, ia, isa.getPort()); + if ( (n == IOStatus.INTERRUPTED) + && isOpen()) + continue; + break; + } + } finally { + receiverCleanup(); + end((n > 0) || (n == IOStatus.UNAVAILABLE)); + assert IOStatus.check(n); + } + } catch (IOException x) { + /* If an exception was thrown, close the channel after + * invoking end() so as to avoid bogus + * AsynchronousCloseExceptions */ + close(); + throw x; + } + + if (n > 0) { + synchronized (stateLock) { + /* Connection succeeded */ + state = ChannelState.CONNECTED; + if (!isBound()) { + InetSocketAddress boundIsa = + Net.localAddress(fd); + port = boundIsa.getPort(); + } + + /* Receive COMM_UP */ + ByteBuffer buf = Util.getTemporaryDirectBuffer(50); + try { + receive(buf, null, null, true); + } finally { + Util.releaseTemporaryDirectBuffer(buf); + } + return true; + } + } else { + synchronized (stateLock) { + /* If nonblocking and no exception then connection + * pending; disallow another invocation */ + if (!isBlocking()) + state = ChannelState.PENDING; + else + assert false; + } + } + } + return false; + } + } + } + + @Override + public boolean connect(SocketAddress endpoint, + int maxOutStreams, + int maxInStreams) + throws IOException { + return setOption(SCTP_INIT_MAXSTREAMS, InitMaxStreams. + create(maxInStreams, maxOutStreams)).connect(endpoint); + + } + + @Override + public boolean isConnectionPending() { + synchronized (stateLock) { + return (state == ChannelState.PENDING); + } + } + + @Override + public boolean finishConnect() throws IOException { + synchronized (receiveLock) { + synchronized (sendLock) { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (isConnected()) + return true; + if (state != ChannelState.PENDING) + throw new NoConnectionPendingException(); + } + int n = 0; + try { + try { + begin(); + synchronized (blockingLock()) { + synchronized (stateLock) { + if (!isOpen()) { + return false; + } + receiverThread = NativeThread.current(); + } + if (!isBlocking()) { + for (;;) { + n = checkConnect(fd, false, readyToConnect); + if ( (n == IOStatus.INTERRUPTED) + && isOpen()) + continue; + break; + } + } else { + for (;;) { + n = checkConnect(fd, true, readyToConnect); + if (n == 0) { + // Loop in case of + // spurious notifications + continue; + } + if ( (n == IOStatus.INTERRUPTED) + && isOpen()) + continue; + break; + } + } + } + } finally { + synchronized (stateLock) { + receiverThread = 0; + if (state == ChannelState.KILLPENDING) { + kill(); + /* poll()/getsockopt() does not report + * error (throws exception, with n = 0) + * on Linux platform after dup2 and + * signal-wakeup. Force n to 0 so the + * end() can throw appropriate exception */ + n = 0; + } + } + end((n > 0) || (n == IOStatus.UNAVAILABLE)); + assert IOStatus.check(n); + } + } catch (IOException x) { + /* If an exception was thrown, close the channel after + * invoking end() so as to avoid bogus + * AsynchronousCloseExceptions */ + close(); + throw x; + } + + if (n > 0) { + synchronized (stateLock) { + state = ChannelState.CONNECTED; + if (!isBound()) { + InetSocketAddress boundIsa = + Net.localAddress(fd); + port = boundIsa.getPort(); + } + + /* Receive COMM_UP */ + ByteBuffer buf = Util.getTemporaryDirectBuffer(50); + try { + receive(buf, null, null, true); + } finally { + Util.releaseTemporaryDirectBuffer(buf); + } + return true; + } + } + } + } + return false; + } + + @Override + protected void implConfigureBlocking(boolean block) throws IOException { + IOUtil.configureBlocking(fd, block); + } + + @Override + public void implCloseSelectableChannel() throws IOException { + synchronized (stateLock) { + nd.preClose(fd); + + if (receiverThread != 0) + NativeThread.signal(receiverThread); + + if (senderThread != 0) + NativeThread.signal(senderThread); + + if (!isRegistered()) + kill(); + } + } + + @Override + public FileDescriptor getFD() { + return fd; + } + + @Override + public int getFDVal() { + return fdVal; + } + + /** + * Translates native poll revent ops into a ready operation ops + */ + private boolean translateReadyOps(int ops, int initialOps, SelectionKeyImpl sk) { + int intOps = sk.nioInterestOps(); + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + + if ((ops & PollArrayWrapper.POLLNVAL) != 0) { + /* This should only happen if this channel is pre-closed while a + * selection operation is in progress + * ## Throw an error if this channel has not been pre-closed */ + return false; + } + + if ((ops & (PollArrayWrapper.POLLERR + | PollArrayWrapper.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + /* No need to poll again in checkConnect, + * the error will be detected there */ + readyToConnect = true; + return (newOps & ~oldOps) != 0; + } + + if (((ops & PollArrayWrapper.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0) && + isConnected()) + newOps |= SelectionKey.OP_READ; + + if (((ops & PollArrayWrapper.POLLCONN) != 0) && + ((intOps & SelectionKey.OP_CONNECT) != 0) && + ((state == ChannelState.UNCONNECTED) || (state == ChannelState.PENDING))) { + newOps |= SelectionKey.OP_CONNECT; + readyToConnect = true; + } + + if (((ops & PollArrayWrapper.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0) && + isConnected()) + newOps |= SelectionKey.OP_WRITE; + + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + + @Override + public boolean translateAndUpdateReadyOps(int ops, SelectionKeyImpl sk) { + return translateReadyOps(ops, sk.nioReadyOps(), sk); + } + + @Override + @SuppressWarnings("all") + public boolean translateAndSetReadyOps(int ops, SelectionKeyImpl sk) { + return translateReadyOps(ops, 0, sk); + } + + @Override + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + int newOps = 0; + if ((ops & SelectionKey.OP_READ) != 0) + newOps |= PollArrayWrapper.POLLIN; + if ((ops & SelectionKey.OP_WRITE) != 0) + newOps |= PollArrayWrapper.POLLOUT; + if ((ops & SelectionKey.OP_CONNECT) != 0) + newOps |= PollArrayWrapper.POLLCONN; + sk.selector.putEventOps(sk, newOps); + } + + @Override + public void kill() throws IOException { + synchronized (stateLock) { + if (state == ChannelState.KILLED) + return; + if (state == ChannelState.UNINITIALIZED) { + state = ChannelState.KILLED; + return; + } + assert !isOpen() && !isRegistered(); + + /* Postpone the kill if there is a waiting reader + * or writer thread. */ + if (receiverThread == 0 && senderThread == 0) { + nd.close(fd); + state = ChannelState.KILLED; + } else { + state = ChannelState.KILLPENDING; + } + } + } + + @Override + public <T> SctpChannel setOption(SctpSocketOption<T> name, T value) + throws IOException { + if (name == null) + throw new NullPointerException(); + if (!supportedOptions().contains(name)) + throw new UnsupportedOperationException("'" + name + "' not supported"); + + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + + SctpNet.setSocketOption(fdVal, name, value, 0 /*oneToOne*/); + } + return this; + } + + @Override + @SuppressWarnings("unchecked") + public <T> T getOption(SctpSocketOption<T> name) throws IOException { + if (name == null) + throw new NullPointerException(); + if (!supportedOptions().contains(name)) + throw new UnsupportedOperationException("'" + name + "' not supported"); + + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + + return (T)SctpNet.getSocketOption(fdVal, name, 0 /*oneToOne*/); + } + } + + private static class DefaultOptionsHolder { + static final Set<SctpSocketOption<?>> defaultOptions = defaultOptions(); + + private static Set<SctpSocketOption<?>> defaultOptions() { + HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(10); + set.add(SCTP_DISABLE_FRAGMENTS); + set.add(SCTP_EXPLICIT_COMPLETE); + set.add(SCTP_FRAGMENT_INTERLEAVE); + set.add(SCTP_INIT_MAXSTREAMS); + set.add(SCTP_NODELAY); + set.add(SCTP_PRIMARY_ADDR); + set.add(SCTP_SET_PEER_PRIMARY_ADDR); + set.add(SO_SNDBUF); + set.add(SO_RCVBUF); + set.add(SO_LINGER); + return Collections.unmodifiableSet(set); + } + } + + @Override + public final Set<SctpSocketOption<?>> supportedOptions() { + return DefaultOptionsHolder.defaultOptions; + } + + @Override + public <T> MessageInfo receive(ByteBuffer buffer, + T attachment, + NotificationHandler<T> handler) + throws IOException { + return receive(buffer, attachment, handler, false); + } + + private <T> MessageInfo receive(ByteBuffer buffer, + T attachment, + NotificationHandler<T> handler, + boolean fromConnect) + throws IOException { + if (buffer == null) + throw new IllegalArgumentException("buffer cannot be null"); + + if (buffer.isReadOnly()) + throw new IllegalArgumentException("Read-only buffer"); + + if (receiveInvoked.get()) + throw new IllegalReceiveException( + "cannot invoke receive from handler"); + receiveInvoked.set(Boolean.TRUE); + + try { + SctpResultContainer resultContainer = new SctpResultContainer(); + do { + resultContainer.clear(); + synchronized (receiveLock) { + if (!ensureReceiveOpen()) + return null; + + if (commUpResultContainer != null) { + resultContainer = commUpResultContainer; + commUpResultContainer = null; + continue; + } + + int n = 0; + try { + begin(); + + synchronized (stateLock) { + if(!isOpen()) + return null; + receiverThread = NativeThread.current(); + } + + do { + n = receive(fdVal, buffer, resultContainer); + } while ((n == IOStatus.INTERRUPTED) && isOpen()); + } finally { + receiverCleanup(); + end((n > 0) || (n == IOStatus.UNAVAILABLE)); + assert IOStatus.check(n); + } + + if (!resultContainer.isNotification()) { + /* message or nothing */ + if (resultContainer.hasSomething()) { + /* Set the association before returning */ + SctpMessageInfoImpl info = + resultContainer.getMessageInfo(); + synchronized (stateLock) { + assert association != null; + info.setAssociation(association); + } + return info; + } else + /* Non-blocking may return null if nothing available*/ + return null; + } else { /* notification */ + synchronized (stateLock) { + handleNotificationInternal( + resultContainer); + } + } + + if (fromConnect) { + /* If we reach here, then it was connect that invoked + * receive an received the COMM_UP. Save it and allow + * the user handler to process it upon next receive. */ + commUpResultContainer = resultContainer; + return null; + } + } /* receiveLock */ + } while (handler == null ? true : + (invokeNotificationHandler(resultContainer, handler, attachment) + == HandlerResult.CONTINUE)); + + return null; + } finally { + receiveInvoked.set(Boolean.FALSE); + } + } + + private int receive(int fd, + ByteBuffer dst, + SctpResultContainer resultContainer) + throws IOException { + int pos = dst.position(); + int lim = dst.limit(); + assert (pos <= lim); + int rem = (pos <= lim ? lim - pos : 0); + if (dst instanceof DirectBuffer && rem > 0) + return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos); + + /* Substitute a native buffer */ + int newSize = Math.max(rem, 1); + ByteBuffer bb = Util.getTemporaryDirectBuffer(newSize); + try { + int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0); + bb.flip(); + if (n > 0 && rem > 0) + dst.put(bb); + return n; + } finally { + Util.releaseTemporaryDirectBuffer(bb); + } + } + + private int receiveIntoNativeBuffer(int fd, + SctpResultContainer resultContainer, + ByteBuffer bb, + int rem, + int pos) + throws IOException + { + int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem); + + if (n > 0) + bb.position(pos + n); + return n; + } + + private InternalNotificationHandler<?> internalNotificationHandler = + new InternalNotificationHandler(); + + private void handleNotificationInternal(SctpResultContainer resultContainer) + { + invokeNotificationHandler(resultContainer, + internalNotificationHandler, null); + } + + private class InternalNotificationHandler<T> + extends AbstractNotificationHandler<T> + { + @Override + public HandlerResult handleNotification( + AssociationChangeNotification not, T unused) { + if (not.event().equals( + AssociationChangeNotification.AssocChangeEvent.COMM_UP)) { + assert association == null; + SctpAssocChange sac = (SctpAssocChange) not; + association = new SctpAssociationImpl + (sac.assocId(), sac.maxInStreams(), sac.maxOutStreams()); + } + return HandlerResult.CONTINUE; + } + } + + private <T> HandlerResult invokeNotificationHandler + (SctpResultContainer resultContainer, + NotificationHandler<T> handler, + T attachment) { + SctpNotification notification = resultContainer.notification(); + synchronized (stateLock) { + notification.setAssociation(association); + } + + if (!(handler instanceof AbstractNotificationHandler)) { + return handler.handleNotification(notification, attachment); + } + + /* AbstractNotificationHandler */ + AbstractNotificationHandler absHandler = + (AbstractNotificationHandler)handler; + switch(resultContainer.type()) { + case ASSOCIATION_CHANGED : + return absHandler.handleNotification( + resultContainer.getAssociationChanged(), attachment); + case PEER_ADDRESS_CHANGED : + return absHandler.handleNotification( + resultContainer.getPeerAddressChanged(), attachment); + case SEND_FAILED : + return absHandler.handleNotification( + resultContainer.getSendFailed(), attachment); + case SHUTDOWN : + return absHandler.handleNotification( + resultContainer.getShutdown(), attachment); + default : + /* implementation specific handlers */ + return absHandler.handleNotification( + resultContainer.notification(), attachment); + } + } + + private void checkAssociation(Association sendAssociation) { + synchronized (stateLock) { + if (sendAssociation != null && !sendAssociation.equals(association)) { + throw new IllegalArgumentException( + "Cannot send to another association"); + } + } + } + + private void checkStreamNumber(int streamNumber) { + synchronized (stateLock) { + if (association != null) { + if (streamNumber < 0 || + streamNumber >= association.maxOutboundStreams()) + throw new InvalidStreamException(); + } + } + } + + /* TODO: Add support for ttl and isComplete to both 121 12M + * SCTP_EOR not yet supported on reference platforms + * TTL support limited... + */ + @Override + public int send(ByteBuffer buffer, MessageInfo messageInfo) + throws IOException { + if (buffer == null) + throw new IllegalArgumentException("buffer cannot be null"); + + if (messageInfo == null) + throw new IllegalArgumentException("messageInfo cannot be null"); + + checkAssociation(messageInfo.association()); + checkStreamNumber(messageInfo.streamNumber()); + + synchronized (sendLock) { + ensureSendOpen(); + + int n = 0; + try { + begin(); + + synchronized (stateLock) { + if(!isOpen()) + return 0; + senderThread = NativeThread.current(); + } + + do { + n = send(fdVal, buffer, messageInfo); + } while ((n == IOStatus.INTERRUPTED) && isOpen()); + + return IOStatus.normalize(n); + } finally { + senderCleanup(); + end((n > 0) || (n == IOStatus.UNAVAILABLE)); + assert IOStatus.check(n); + } + } + } + + private int send(int fd, ByteBuffer src, MessageInfo messageInfo) + throws IOException { + int streamNumber = messageInfo.streamNumber(); + SocketAddress target = messageInfo.address(); + boolean unordered = messageInfo.isUnordered(); + int ppid = messageInfo.payloadProtocolID(); + int pos = src.position(); + int lim = src.limit(); + + assert (pos <= lim && streamNumber > 0); + int rem = (pos <= lim ? lim - pos : 0); + + if (src instanceof DirectBuffer) + return sendFromNativeBuffer(fd, src, rem, pos, target, streamNumber, + unordered, ppid); + + /* Substitute a native buffer */ + ByteBuffer bb = Util.getTemporaryDirectBuffer(rem); + try { + bb.put(src); + bb.flip(); + /* Do not update src until we see how many bytes were written */ + src.position(pos); + + int n = sendFromNativeBuffer(fd, bb, rem, pos, target, streamNumber, + unordered, ppid); + if (n > 0) { + /* now update src */ + src.position(pos + n); + } + return n; + } finally { + Util.releaseTemporaryDirectBuffer(bb); + } + } + + private int sendFromNativeBuffer(int fd, + ByteBuffer bb, + int rem, + int pos, + SocketAddress target, + int streamNumber, + boolean unordered, + int ppid) + throws IOException { + int written = send0(fd, ((DirectBuffer)bb).address() + pos, + rem, target, -1 /*121*/, streamNumber, unordered, ppid); + if (written > 0) + bb.position(pos + written); + return written; + } + + @Override + public SctpChannel shutdown() throws IOException { + synchronized(stateLock) { + if (isShutdown) + return this; + + ensureSendOpen(); + SctpNet.shutdown(fdVal, -1); + if (senderThread != 0) + NativeThread.signal(senderThread); + isShutdown = true; + } + return this; + } + + @Override + public Set<SocketAddress> getAllLocalAddresses() + throws IOException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + return Collections.EMPTY_SET; + + return SctpNet.getLocalAddresses(fdVal); + } + } + + @Override + public Set<SocketAddress> getRemoteAddresses() + throws IOException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isConnected()) + return Collections.EMPTY_SET; + + return SctpNet.getRemoteAddresses(fdVal, 0/*unused*/); + } + } + + /* Native */ + private static native void initIDs(); + + static native int receive0(int fd, SctpResultContainer resultContainer, + long address, int length) throws IOException; + + static native int send0(int fd, long address, int length, + SocketAddress target, int assocId, int streamNumber, + boolean unordered, int ppid) throws IOException; + + private static native int checkConnect(FileDescriptor fd, boolean block, + boolean ready) throws IOException; + + static { + Util.load(); /* loads nio & net native libraries */ + java.security.AccessController.doPrivileged( + new sun.security.action.LoadLibraryAction("sctp")); + initIDs(); + nd = new SctpSocketDispatcher(); + } +} diff --git a/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java b/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..c34e062a6307afe39317554e12b2e1f4a013fb03 --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java @@ -0,0 +1,959 @@ +/* + * 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 sun.nio.ch; + +import java.net.InetAddress; +import java.net.SocketAddress; +import java.net.InetSocketAddress; +import java.io.FileDescriptor; +import java.io.IOException; +import java.util.Collections; +import java.util.Set; +import java.util.HashSet; +import java.util.HashMap; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.AlreadyBoundException; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.NotYetBoundException; +import java.nio.channels.spi.SelectorProvider; +import com.sun.nio.sctp.AbstractNotificationHandler; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.AssociationChangeNotification; +import com.sun.nio.sctp.HandlerResult; +import com.sun.nio.sctp.IllegalReceiveException; +import com.sun.nio.sctp.InvalidStreamException; +import com.sun.nio.sctp.IllegalUnbindException; +import com.sun.nio.sctp.NotificationHandler; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpMultiChannel; +import com.sun.nio.sctp.SctpSocketOption; +import static com.sun.nio.sctp.SctpStandardSocketOption.*; +import static sun.nio.ch.SctpResultContainer.*; + +/** + * An implementation of SctpMultiChannel + */ +public class SctpMultiChannelImpl extends SctpMultiChannel + implements SelChImpl +{ + /* Used to make native close and preClose calls */ + private static NativeDispatcher nd; + + private final FileDescriptor fd; + + private final int fdVal; + + /* IDs of native threads doing send and receives, for signalling */ + private volatile long receiverThread = 0; + private volatile long senderThread = 0; + + /* Lock held by current receiving thread */ + private final Object receiveLock = new Object(); + + /* Lock held by current sending thread */ + private final Object sendLock = new Object(); + + /* Lock held by any thread that modifies the state fields declared below + * DO NOT invoke a blocking I/O operation while holding this lock! */ + private final Object stateLock = new Object(); + + private enum ChannelState { + UNINITIALIZED, + KILLPENDING, + KILLED, + } + + /* -- The following fields are protected by stateLock -- */ + private ChannelState state = ChannelState.UNINITIALIZED; + + /* Binding: Once bound the port will remain constant. */ + int port = -1; + private HashSet<InetSocketAddress> localAddresses = new HashSet<InetSocketAddress>(); + /* Has the channel been bound to the wildcard address */ + private boolean wildcard; /* false */ + + /* Keeps a map of addresses to association, and visa versa */ + private HashMap<SocketAddress, Association> addressMap = + new HashMap<SocketAddress, Association>(); + private HashMap<Association, Set<SocketAddress>> associationMap = + new HashMap<Association, Set<SocketAddress>>(); + + /* -- End of fields protected by stateLock -- */ + + /* If an association has been shutdown mark it for removal after + * the user handler has been invoked */ + private final ThreadLocal<Association> associationToRemove = + new ThreadLocal<Association>() { + @Override protected Association initialValue() { + return null; + } + }; + + /* A notification handler cannot invoke receive */ + private final ThreadLocal<Boolean> receiveInvoked = + new ThreadLocal<Boolean>() { + @Override protected Boolean initialValue() { + return Boolean.FALSE; + } + }; + + public SctpMultiChannelImpl(SelectorProvider provider) + throws IOException { + //TODO: update provider, remove public modifier + super(provider); + this.fd = SctpNet.socket(false /*one-to-many*/); + this.fdVal = IOUtil.fdVal(fd); + } + + @Override + public SctpMultiChannel bind(SocketAddress local, int backlog) + throws IOException { + synchronized (receiveLock) { + synchronized (sendLock) { + synchronized (stateLock) { + ensureOpen(); + if (isBound()) + throw new AlreadyBoundException(); + InetSocketAddress isa = (local == null) ? + new InetSocketAddress(0) : Net.checkAddress(local); + + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkListen(isa.getPort()); + Net.bind(fd, isa.getAddress(), isa.getPort()); + + InetSocketAddress boundIsa = Net.localAddress(fd); + port = boundIsa.getPort(); + localAddresses.add(isa); + if (isa.getAddress().isAnyLocalAddress()) + wildcard = true; + + Net.listen(fd, backlog < 1 ? 50 : backlog); + } + } + } + return this; + } + + @Override + public SctpMultiChannel bindAddress(InetAddress address) + throws IOException { + return bindUnbindAddress(address, true); + } + + @Override + public SctpMultiChannel unbindAddress(InetAddress address) + throws IOException { + return bindUnbindAddress(address, false); + } + + private SctpMultiChannel bindUnbindAddress(InetAddress address, + boolean add) + throws IOException { + if (address == null) + throw new IllegalArgumentException(); + + synchronized (receiveLock) { + synchronized (sendLock) { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + throw new NotYetBoundException(); + if (wildcard) + throw new IllegalStateException( + "Cannot add or remove addresses from a channel that is bound to the wildcard address"); + if (address.isAnyLocalAddress()) + throw new IllegalArgumentException( + "Cannot add or remove the wildcard address"); + if (add) { + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + throw new AlreadyBoundException(); + } + } + } else { /*removing */ + /* Verify that there is more than one address + * and that address is already bound */ + if (localAddresses.size() <= 1) + throw new IllegalUnbindException("Cannot remove address from a channel with only one address bound"); + boolean foundAddress = false; + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + foundAddress = true; + break; + } + } + if (!foundAddress ) + throw new IllegalUnbindException("Cannot remove address from a channel that is not bound to that address"); + } + + SctpNet.bindx(fdVal, new InetAddress[]{address}, port, add); + + /* Update our internal Set to reflect the addition/removal */ + if (add) + localAddresses.add(new InetSocketAddress(address, port)); + else { + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + localAddresses.remove(addr); + break; + } + } + } + } + } + } + return this; + } + + @Override + public Set<Association> associations() + throws ClosedChannelException, NotYetBoundException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + throw new NotYetBoundException(); + + return Collections.unmodifiableSet(associationMap.keySet()); + } + } + + private boolean isBound() { + synchronized (stateLock) { + return port == -1 ? false : true; + } + } + + private void ensureOpen() throws IOException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + } + } + + private void receiverCleanup() throws IOException { + synchronized (stateLock) { + receiverThread = 0; + if (state == ChannelState.KILLPENDING) + kill(); + } + } + + private void senderCleanup() throws IOException { + synchronized (stateLock) { + senderThread = 0; + if (state == ChannelState.KILLPENDING) + kill(); + } + } + + @Override + protected void implConfigureBlocking(boolean block) throws IOException { + IOUtil.configureBlocking(fd, block); + } + + @Override + public void implCloseSelectableChannel() throws IOException { + synchronized (stateLock) { + nd.preClose(fd); + + if (receiverThread != 0) + NativeThread.signal(receiverThread); + + if (senderThread != 0) + NativeThread.signal(senderThread); + + if (!isRegistered()) + kill(); + } + } + + @Override + public FileDescriptor getFD() { + return fd; + } + + @Override + public int getFDVal() { + return fdVal; + } + + /** + * Translates native poll revent ops into a ready operation ops + */ + private boolean translateReadyOps(int ops, int initialOps, + SelectionKeyImpl sk) { + int intOps = sk.nioInterestOps(); + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + + if ((ops & PollArrayWrapper.POLLNVAL) != 0) { + /* This should only happen if this channel is pre-closed while a + * selection operation is in progress + * ## Throw an error if this channel has not been pre-closed */ + return false; + } + + if ((ops & (PollArrayWrapper.POLLERR + | PollArrayWrapper.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + + if (((ops & PollArrayWrapper.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0)) + newOps |= SelectionKey.OP_READ; + + if (((ops & PollArrayWrapper.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0)) + newOps |= SelectionKey.OP_WRITE; + + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + + @Override + public boolean translateAndUpdateReadyOps(int ops, SelectionKeyImpl sk) { + return translateReadyOps(ops, sk.nioReadyOps(), sk); + } + + @Override + public boolean translateAndSetReadyOps(int ops, SelectionKeyImpl sk) { + return translateReadyOps(ops, 0, sk); + } + + @Override + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + int newOps = 0; + if ((ops & SelectionKey.OP_READ) != 0) + newOps |= PollArrayWrapper.POLLIN; + if ((ops & SelectionKey.OP_WRITE) != 0) + newOps |= PollArrayWrapper.POLLOUT; + sk.selector.putEventOps(sk, newOps); + } + + @Override + public void kill() throws IOException { + synchronized (stateLock) { + if (state == ChannelState.KILLED) + return; + if (state == ChannelState.UNINITIALIZED) { + state = ChannelState.KILLED; + return; + } + assert !isOpen() && !isRegistered(); + + /* Postpone the kill if there is a thread sending or receiving. */ + if (receiverThread == 0 && senderThread == 0) { + nd.close(fd); + state = ChannelState.KILLED; + } else { + state = ChannelState.KILLPENDING; + } + } + } + + @Override + public <T> SctpMultiChannel setOption(SctpSocketOption<T> name, + T value, + Association association) + throws IOException { + if (name == null) + throw new NullPointerException(); + if (!(supportedOptions().contains(name))) + throw new UnsupportedOperationException("'" + name + "' not supported"); + + synchronized (stateLock) { + if (association != null && (name.equals(SCTP_PRIMARY_ADDR) || + name.equals(SCTP_SET_PEER_PRIMARY_ADDR))) { + checkAssociation(association); + } + if (!isOpen()) + throw new ClosedChannelException(); + + SctpNet.setSocketOption(fdVal, name, value, + association.associationID()); + } + return this; + } + + @Override + @SuppressWarnings("unchecked") + public <T> T getOption(SctpSocketOption<T> name, Association association) + throws IOException { + if (name == null) + throw new NullPointerException(); + if (!supportedOptions().contains(name)) + throw new UnsupportedOperationException("'" + name + "' not supported"); + + synchronized (stateLock) { + checkAssociation(association); + if (!isOpen()) + throw new ClosedChannelException(); + + return (T)SctpNet.getSocketOption(fdVal, name, + association.associationID()); + } + } + + private static class DefaultOptionsHolder { + static final Set<SctpSocketOption<?>> defaultOptions = defaultOptions(); + + private static Set<SctpSocketOption<?>> defaultOptions() { + HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(10); + set.add(SCTP_DISABLE_FRAGMENTS); + set.add(SCTP_EXPLICIT_COMPLETE); + set.add(SCTP_FRAGMENT_INTERLEAVE); + set.add(SCTP_INIT_MAXSTREAMS); + set.add(SCTP_NODELAY); + set.add(SCTP_PRIMARY_ADDR); + set.add(SCTP_SET_PEER_PRIMARY_ADDR); + set.add(SO_SNDBUF); + set.add(SO_RCVBUF); + set.add(SO_LINGER); + return Collections.unmodifiableSet(set); + } + } + + @Override + public final Set<SctpSocketOption<?>> supportedOptions() { + return DefaultOptionsHolder.defaultOptions; + } + + @Override + public <T> MessageInfo receive(ByteBuffer buffer, + T attachment, + NotificationHandler<T> handler) + throws IOException { + if (buffer == null) + throw new IllegalArgumentException("buffer cannot be null"); + + if (buffer.isReadOnly()) + throw new IllegalArgumentException("Read-only buffer"); + + if (receiveInvoked.get()) + throw new IllegalReceiveException( + "cannot invoke receive from handler"); + receiveInvoked.set(Boolean.TRUE); + + try { + SctpResultContainer resultContainer = new SctpResultContainer(); + do { + resultContainer.clear(); + synchronized (receiveLock) { + ensureOpen(); + if (!isBound()) + throw new NotYetBoundException(); + + int n = 0; + try { + begin(); + + synchronized (stateLock) { + if(!isOpen()) + return null; + receiverThread = NativeThread.current(); + } + + do { + n = receive(fdVal, buffer, resultContainer); + } while ((n == IOStatus.INTERRUPTED) && isOpen()); + + } finally { + receiverCleanup(); + end((n > 0) || (n == IOStatus.UNAVAILABLE)); + assert IOStatus.check(n); + } + + if (!resultContainer.isNotification()) { + /* message or nothing */ + if (resultContainer.hasSomething()) { + /* Set the association before returning */ + SctpMessageInfoImpl info = + resultContainer.getMessageInfo(); + info.setAssociation(lookupAssociation(info. + associationID())); + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + InetSocketAddress isa = (InetSocketAddress)info.address(); + if (!addressMap.containsKey(isa)) { + /* must be a new association */ + try { + sm.checkAccept(isa.getAddress().getHostAddress(), + isa.getPort()); + } catch (SecurityException se) { + buffer.clear(); + throw se; + } + } + } + + assert info.association() != null; + return info; + } else { + /* Non-blocking may return null if nothing available*/ + return null; + } + } else { /* notification */ + synchronized (stateLock) { + handleNotificationInternal( + resultContainer); + } + } + } /* receiveLock */ + } while (handler == null ? true : + (invokeNotificationHandler(resultContainer, handler, attachment) + == HandlerResult.CONTINUE)); + } finally { + receiveInvoked.set(Boolean.FALSE); + } + + return null; + } + + private int receive(int fd, + ByteBuffer dst, + SctpResultContainer resultContainer) + throws IOException { + int pos = dst.position(); + int lim = dst.limit(); + assert (pos <= lim); + int rem = (pos <= lim ? lim - pos : 0); + if (dst instanceof DirectBuffer && rem > 0) + return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos); + + /* Substitute a native buffer. */ + int newSize = Math.max(rem, 1); + ByteBuffer bb = Util.getTemporaryDirectBuffer(newSize); + try { + int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0); + bb.flip(); + if (n > 0 && rem > 0) + dst.put(bb); + return n; + } finally { + Util.releaseTemporaryDirectBuffer(bb); + } + } + + private int receiveIntoNativeBuffer(int fd, + SctpResultContainer resultContainer, + ByteBuffer bb, + int rem, + int pos) + throws IOException { + int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem); + if (n > 0) + bb.position(pos + n); + return n; + } + + private InternalNotificationHandler internalNotificationHandler = + new InternalNotificationHandler(); + + private void handleNotificationInternal(SctpResultContainer resultContainer) + { + invokeNotificationHandler(resultContainer, + internalNotificationHandler, null); + } + + private class InternalNotificationHandler<T> + extends AbstractNotificationHandler<T> + { + @Override + public HandlerResult handleNotification( + AssociationChangeNotification not, T unused) { + SctpAssocChange sac = (SctpAssocChange) not; + + /* Update map to reflect change in association */ + switch (not.event()) { + case COMM_UP : + Association newAssociation = new SctpAssociationImpl + (sac.assocId(), sac.maxInStreams(), sac.maxOutStreams()); + addAssociation(newAssociation); + break; + case SHUTDOWN : + case COMM_LOST : + //case RESTART: ??? + /* mark association for removal after user handler invoked*/ + associationToRemove.set(lookupAssociation(sac.assocId())); + } + return HandlerResult.CONTINUE; + } + } + + private <T> HandlerResult invokeNotificationHandler( + SctpResultContainer resultContainer, + NotificationHandler<T> handler, + T attachment) { + HandlerResult result; + SctpNotification notification = resultContainer.notification(); + notification.setAssociation(lookupAssociation(notification.assocId())); + + if (!(handler instanceof AbstractNotificationHandler)) { + result = handler.handleNotification(notification, attachment); + } else { /* AbstractNotificationHandler */ + AbstractNotificationHandler absHandler = + (AbstractNotificationHandler)handler; + switch(resultContainer.type()) { + case ASSOCIATION_CHANGED : + result = absHandler.handleNotification( + resultContainer.getAssociationChanged(), attachment); + case PEER_ADDRESS_CHANGED : + result = absHandler.handleNotification( + resultContainer.getPeerAddressChanged(), attachment); + case SEND_FAILED : + result = absHandler.handleNotification( + resultContainer.getSendFailed(), attachment); + case SHUTDOWN : + result = absHandler.handleNotification( + resultContainer.getShutdown(), attachment); + default : + /* implementation specific handlers */ + result = absHandler.handleNotification( + resultContainer.notification(), attachment); + } + } + + if (!(handler instanceof InternalNotificationHandler)) { + /* Only remove associations after user handler + * has finished with them */ + Association assoc = associationToRemove.get(); + if (assoc != null) { + removeAssociation(assoc); + associationToRemove.set(null); + } + + } + + return result; + } + + private Association lookupAssociation(int assocId) { + /* Lookup the association in our internal map */ + synchronized (stateLock) { + Set<Association> assocs = associationMap.keySet(); + for (Association a : assocs) { + if (a.associationID() == assocId) { + return a; + } + } + } + return null; + } + + private void addAssociation(Association association) { + synchronized (stateLock) { + int assocId = association.associationID(); + Set<SocketAddress> addresses = null; + + try { + addresses = SctpNet.getRemoteAddresses(fdVal, assocId); + } catch (IOException unused) { + /* OK, determining connected addresses may not be possible + * shutdown, connection lost, etc */ + } + + associationMap.put(association, addresses); + if (addresses != null) { + for (SocketAddress addr : addresses) + addressMap.put(addr, association); + } + } + } + + private void removeAssociation(Association association) { + synchronized (stateLock) { + int assocId = association.associationID(); + Set<SocketAddress> addresses = null; + + try { + addresses = SctpNet.getRemoteAddresses(fdVal, assocId); + } catch (IOException unused) { + /* OK, determining connected addresses may not be possible + * shutdown, connection lost, etc */ + } + + Set<Association> assocs = associationMap.keySet(); + for (Association a : assocs) { + if (a.associationID() == assocId) { + associationMap.remove(a); + break; + } + } + if (addresses != null) { + for (SocketAddress addr : addresses) + addressMap.remove(addr); + } else { + /* We cannot determine the connected addresses */ + Set<java.util.Map.Entry<SocketAddress, Association>> addrAssocs = + addressMap.entrySet(); + for (java.util.Map.Entry<SocketAddress, Association> entry : addrAssocs) { + if (entry.getValue().equals(association)) { + addressMap.remove(entry.getKey()); + } + } + } + } + } + + /** + * @throws IllegalArgumentException + * If the given association is not controlled by this channel + * + * @return {@code true} if, and only if, the given association is one + * of the current associations controlled by this channel + */ + private boolean checkAssociation(Association messageAssoc) { + synchronized (stateLock) { + for (Association association : associationMap.keySet()) { + if (messageAssoc.equals(association)) { + return true; + } + } + } + throw new IllegalArgumentException( + "Given Association is not controlled by this channel"); + } + + private void checkStreamNumber(Association assoc, int streamNumber) { + synchronized (stateLock) { + if (streamNumber < 0 || streamNumber >= assoc.maxOutboundStreams()) + throw new InvalidStreamException(); + } + } + + /* TODO: Add support for ttl and isComplete to both 121 12M + * SCTP_EOR not yet supported on reference platforms + * TTL support limited... + */ + @Override + public int send(ByteBuffer buffer, MessageInfo messageInfo) + throws IOException { + if (buffer == null) + throw new IllegalArgumentException("buffer cannot be null"); + + if (messageInfo == null) + throw new IllegalArgumentException("messageInfo cannot be null"); + + synchronized (sendLock) { + ensureOpen(); + + if (!isBound()) + bind(null, 0); + + int n = 0; + try { + int assocId = -1; + SocketAddress address = null; + begin(); + + synchronized (stateLock) { + if(!isOpen()) + return 0; + senderThread = NativeThread.current(); + + /* Determine what address or association to send to */ + Association assoc = messageInfo.association(); + InetSocketAddress addr = (InetSocketAddress)messageInfo.address(); + if (assoc != null) { + checkAssociation(assoc); + checkStreamNumber(assoc, messageInfo.streamNumber()); + assocId = assoc.associationID(); + /* have we also got a preferred address */ + if (addr != null) { + if (!assoc.equals(addressMap.get(addr))) + throw new IllegalArgumentException("given preferred address is not part of this association"); + address = addr; + } + } else if (addr != null) { + address = addr; + Association association = addressMap.get(addr); + if (association != null) { + checkStreamNumber(association, messageInfo.streamNumber()); + assocId = association.associationID(); + + } else { /* must be new association */ + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkConnect(addr.getAddress().getHostAddress(), + addr.getPort()); + } + } else { + throw new AssertionError( + "Both association and address cannot be null"); + } + } + + do { + n = send(fdVal, buffer, assocId, address, messageInfo); + } while ((n == IOStatus.INTERRUPTED) && isOpen()); + + return IOStatus.normalize(n); + } finally { + senderCleanup(); + end((n > 0) || (n == IOStatus.UNAVAILABLE)); + assert IOStatus.check(n); + } + } + } + + private int send(int fd, + ByteBuffer src, + int assocId, + SocketAddress target, + MessageInfo messageInfo) + throws IOException { + int streamNumber = messageInfo.streamNumber(); + boolean unordered = messageInfo.isUnordered(); + int ppid = messageInfo.payloadProtocolID(); + int pos = src.position(); + int lim = src.limit(); + assert (pos <= lim && streamNumber > 0); + int rem = (pos <= lim ? lim - pos : 0); + + if (src instanceof DirectBuffer) + return sendFromNativeBuffer(fd, src, rem, pos, target, assocId, + streamNumber, unordered, ppid); + + /* Substitute a native buffer */ + ByteBuffer bb = Util.getTemporaryDirectBuffer(rem); + try { + bb.put(src); + bb.flip(); + /* Do not update src until we see how many bytes were written */ + src.position(pos); + + int n = sendFromNativeBuffer(fd, bb, rem, pos, target, assocId, + streamNumber, unordered, ppid); + if (n > 0) { + /* now update src */ + src.position(pos + n); + } + return n; + } finally { + Util.releaseTemporaryDirectBuffer(bb); + } + } + + private int sendFromNativeBuffer(int fd, + ByteBuffer bb, + int rem, + int pos, + SocketAddress target, + int assocId, + int streamNumber, + boolean unordered, + int ppid) + throws IOException { + int written = send0(fd, ((DirectBuffer)bb).address() + pos, + rem, target, assocId, streamNumber, unordered, ppid); + if (written > 0) + bb.position(pos + written); + return written; + } + + @Override + public SctpMultiChannel shutdown(Association association) + throws IOException { + synchronized (stateLock) { + checkAssociation(association); + if (!isOpen()) + throw new ClosedChannelException(); + + SctpNet.shutdown(fdVal, association.associationID()); + } + return this; + } + + @Override + public Set<SocketAddress> getAllLocalAddresses() + throws IOException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + return Collections.EMPTY_SET; + + return SctpNet.getLocalAddresses(fdVal); + } + } + + @Override + public Set<SocketAddress> getRemoteAddresses(Association association) + throws IOException { + synchronized (stateLock) { + checkAssociation(association); + if (!isOpen()) + throw new ClosedChannelException(); + + return SctpNet.getRemoteAddresses(fdVal, association.associationID()); + } + } + + @Override + public SctpChannel branch(Association association) + throws IOException { + synchronized (stateLock) { + return null; //TODO: implement + } + } + + /* Use common native implementation shared between + * one-to-one and one-to-many */ + private static int receive0(int fd, + SctpResultContainer resultContainer, + long address, + int length) + throws IOException{ + return SctpChannelImpl.receive0(fd, resultContainer, address, + length); + } + + private static int send0(int fd, + long address, + int length, + SocketAddress target, + int assocId, + int streamNumber, + boolean unordered, + int ppid) + throws IOException { + return SctpChannelImpl.send0(fd, address, length, target, assocId, + streamNumber, unordered, ppid); + } + + static { + Util.load(); /* loads nio & net native libraries */ + java.security.AccessController.doPrivileged( + new sun.security.action.LoadLibraryAction("sctp")); + nd = new SctpSocketDispatcher(); + } +} diff --git a/src/solaris/classes/sun/nio/ch/SctpNet.java b/src/solaris/classes/sun/nio/ch/SctpNet.java new file mode 100644 index 0000000000000000000000000000000000000000..1409324d205823a40728462ecc3aa451094b85f2 --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpNet.java @@ -0,0 +1,268 @@ +/* + * 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 sun.nio.ch; + +import java.io.FileDescriptor; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.Set; +import java.util.HashSet; +import java.security.AccessController; +import sun.security.action.GetPropertyAction; +import com.sun.nio.sctp.SctpSocketOption; +import static com.sun.nio.sctp.SctpStandardSocketOption.*; + +public class SctpNet { + static final String osName = AccessController.doPrivileged( + new GetPropertyAction("os.name")); + + /* -- Miscellaneous SCTP utilities -- */ + + static boolean bindxIPv4MappedAddresses() { + if ("SunOS".equals(osName)) { + /* Solaris supports IPv4Mapped Addresses with bindx */ + return true; + } /* else { //other OS/implementations */ + + /* lksctp/linux requires Ipv4 addresses */ + return false; + } + + /** + * @param oneToone + * if {@code true} returns a one-to-one sctp socket, otherwise + * returns a one-to-many sctp socket + */ + static FileDescriptor socket(boolean oneToOne) throws IOException { + int nativefd = socket0(oneToOne); + return IOUtil.newFD(nativefd); + } + + static void bindx(int fd, InetAddress[] addrs, int port, boolean add) + throws IOException { + bindx(fd, addrs, port, addrs.length, add, + bindxIPv4MappedAddresses()); + } + + static Set<SocketAddress> getLocalAddresses(int fd) + throws IOException { + HashSet<SocketAddress> set = null; + SocketAddress[] saa = getLocalAddresses0(fd); + + if (saa != null) { + set = new HashSet<SocketAddress>(saa.length); + for (SocketAddress sa : saa) + set.add(sa); + } + + return set; + } + + static Set<SocketAddress> getRemoteAddresses(int fd, int assocId) + throws IOException { + HashSet<SocketAddress> set = null; + SocketAddress[] saa = getRemoteAddresses0(fd, assocId); + + if (saa != null) { + set = new HashSet<SocketAddress>(saa.length); + for (SocketAddress sa : saa) + set.add(sa); + } + + return set; + } + + static void setSocketOption(int fd, + SctpSocketOption name, + Object value, + int assocId) + throws IOException { + if (value == null) + throw new IllegalArgumentException("Invalid option value"); + + Class<?> type = name.type(); + if (!type.isInstance(value)) + throw new IllegalArgumentException("Invalid option value"); + + if (name.equals(SCTP_INIT_MAXSTREAMS)) { + InitMaxStreams maxStreamValue = (InitMaxStreams)value; + SctpNet.setInitMsgOption0(fd, + maxStreamValue.maxInStreams(), maxStreamValue.maxOutStreams()); + } else if (name.equals(SCTP_PRIMARY_ADDR) || + name.equals(SCTP_SET_PEER_PRIMARY_ADDR)) { + + SocketAddress addr = (SocketAddress) value; + if (addr == null) + throw new IllegalArgumentException("Invalid option value"); + + Net.checkAddress(addr); + InetSocketAddress netAddr = (InetSocketAddress)addr; + + if (name.equals(SCTP_PRIMARY_ADDR)) { + setPrimAddrOption0(fd, assocId, + netAddr.getAddress(), netAddr.getPort()); + } else { + setPeerPrimAddrOption0(fd, assocId, + netAddr.getAddress(), netAddr.getPort()); + } + } else if (name.equals(SCTP_DISABLE_FRAGMENTS) || + name.equals(SCTP_EXPLICIT_COMPLETE) || + name.equals(SCTP_FRAGMENT_INTERLEAVE) || + name.equals(SCTP_NODELAY) || + name.equals(SO_SNDBUF) || + name.equals(SO_RCVBUF) || + name.equals(SO_LINGER)) { + setIntOption(fd, name, value); + } else { + throw new AssertionError("Unknown socket option"); + } + } + + static Object getSocketOption(int fd, SctpSocketOption name, int assocId) + throws IOException { + if (name.equals(SCTP_SET_PEER_PRIMARY_ADDR)) { + throw new IllegalArgumentException( + "SCTP_SET_PEER_PRIMARY_ADDR cannot be retrieved"); + } else if (name.equals(SCTP_INIT_MAXSTREAMS)) { + /* container for holding maxIn/Out streams */ + int[] values = new int[2]; + SctpNet.getInitMsgOption0(fd, values); + return InitMaxStreams.create(values[0], values[1]); + } else if (name.equals(SCTP_PRIMARY_ADDR)) { + return getPrimAddrOption0(fd, assocId); + } else if (name.equals(SCTP_DISABLE_FRAGMENTS) || + name.equals(SCTP_EXPLICIT_COMPLETE) || + name.equals(SCTP_FRAGMENT_INTERLEAVE) || + name.equals(SCTP_NODELAY) || + name.equals(SO_SNDBUF) || + name.equals(SO_RCVBUF) || + name.equals(SO_LINGER)) { + return getIntOption(fd, name); + } else { + throw new AssertionError("Unknown socket option"); + } + } + + static void setIntOption(int fd, SctpSocketOption name, Object value) + throws IOException { + if (value == null) + throw new IllegalArgumentException("Invalid option value"); + + Class<?> type = name.type(); + if (type != Integer.class && type != Boolean.class) + throw new AssertionError("Should not reach here"); + + if (name == SO_RCVBUF || + name == SO_SNDBUF) + { + int i = ((Integer)value).intValue(); + if (i < 0) + throw new IllegalArgumentException( + "Invalid send/receive buffer size"); + } else if (name == SO_LINGER) { + int i = ((Integer)value).intValue(); + if (i < 0) + value = Integer.valueOf(-1); + if (i > 65535) + value = Integer.valueOf(65535); + } else if (name.equals(SCTP_FRAGMENT_INTERLEAVE)) { + int i = ((Integer)value).intValue(); + if (i < 0 || i > 2) + throw new IllegalArgumentException( + "Invalid value for SCTP_FRAGMENT_INTERLEAVE"); + } + + int arg; + if (type == Integer.class) { + arg = ((Integer)value).intValue(); + } else { + boolean b = ((Boolean)value).booleanValue(); + arg = (b) ? 1 : 0; + } + + setIntOption0(fd, ((SctpStdSocketOption)name).constValue(), arg); + } + + static Object getIntOption(int fd, SctpSocketOption name) + throws IOException { + Class<?> type = name.type(); + + if (type != Integer.class && type != Boolean.class) + throw new AssertionError("Should not reach here"); + + if (!(name instanceof SctpStdSocketOption)) + throw new AssertionError("Should not reach here"); + + int value = getIntOption0(fd, + ((SctpStdSocketOption)name).constValue()); + + if (type == Integer.class) { + return Integer.valueOf(value); + } else { + return (value == 0) ? Boolean.FALSE : Boolean.TRUE; + } + } + + static void shutdown(int fd, int assocId) + throws IOException { + shutdown0(fd, assocId); + } + + /* Native Methods */ + static native int socket0(boolean oneToOne) throws IOException; + + static native void bindx(int fd, InetAddress[] addrs, int port, int length, + boolean add, boolean preferIPv6) throws IOException; + + static native int getIntOption0(int fd, int opt) throws IOException; + + static native void setIntOption0(int fd, int opt, int arg) + throws IOException; + + static native SocketAddress[] getLocalAddresses0(int fd) throws IOException; + + static native SocketAddress[] getRemoteAddresses0(int fd, int assocId) + throws IOException; + + static native void setPrimAddrOption0(int fd, int assocId, InetAddress ia, + int port) throws IOException; + + static native void setPeerPrimAddrOption0(int fd, int assocId, + InetAddress ia, int port) throws IOException; + + static native SocketAddress getPrimAddrOption0(int fd, int assocId) + throws IOException; + + /* retVals [0] maxInStreams, [1] maxOutStreams */ + static native void getInitMsgOption0(int fd, int[] retVals) throws IOException; + + static native void setInitMsgOption0(int fd, int arg1, int arg2) + throws IOException; + + static native void shutdown0(int fd, int assocId); +} + diff --git a/src/solaris/classes/sun/nio/ch/SctpNotification.java b/src/solaris/classes/sun/nio/ch/SctpNotification.java new file mode 100644 index 0000000000000000000000000000000000000000..95033cb5404268f03a1c639d691e6b043135b023 --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpNotification.java @@ -0,0 +1,37 @@ +/* + * 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 sun.nio.ch; + +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.Notification; + +/** + * All Notification implemenations MUST implement this interface to provide + * access to the native association identidier. + */ +interface SctpNotification extends Notification { + int assocId(); + void setAssociation(Association association); +} diff --git a/src/solaris/classes/sun/nio/ch/SctpPeerAddrChange.java b/src/solaris/classes/sun/nio/ch/SctpPeerAddrChange.java new file mode 100644 index 0000000000000000000000000000000000000000..94fdb77643ff0e908fc9dc12d7872cb3096c72c1 --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpPeerAddrChange.java @@ -0,0 +1,119 @@ +/* + * 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 sun.nio.ch; + +import java.net.SocketAddress; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.PeerAddressChangeNotification; + +/** + * An implementation of PeerAddressChangeNotification + */ +public class SctpPeerAddrChange extends PeerAddressChangeNotification + implements SctpNotification +{ + /* static final ints so that they can be referenced from native */ + private final static int SCTP_ADDR_AVAILABLE = 1; + private final static int SCTP_ADDR_UNREACHABLE = 2; + private final static int SCTP_ADDR_REMOVED = 3; + private final static int SCTP_ADDR_ADDED = 4; + private final static int SCTP_ADDR_MADE_PRIM = 5; + private final static int SCTP_ADDR_CONFIRMED =6; + + private Association association; + + /* assocId is used to lookup the association before the notification is + * returned to user code */ + private int assocId; + private SocketAddress address; + private AddressChangeEvent event; + + /* Invoked from native */ + private SctpPeerAddrChange(int assocId, SocketAddress address, int intEvent) { + switch (intEvent) { + case SCTP_ADDR_AVAILABLE : + this.event = AddressChangeEvent.ADDR_AVAILABLE; + break; + case SCTP_ADDR_UNREACHABLE : + this.event = AddressChangeEvent.ADDR_UNREACHABLE; + break; + case SCTP_ADDR_REMOVED : + this.event = AddressChangeEvent.ADDR_REMOVED; + break; + case SCTP_ADDR_ADDED : + this.event = AddressChangeEvent.ADDR_ADDED; + break; + case SCTP_ADDR_MADE_PRIM : + this.event = AddressChangeEvent.ADDR_MADE_PRIMARY; + break; + case SCTP_ADDR_CONFIRMED : + this.event = AddressChangeEvent.ADDR_CONFIRMED; + break; + default: + throw new AssertionError("Unknown event type"); + } + this.assocId = assocId; + this.address = address; + } + + @Override + public int assocId() { + return assocId; + } + + @Override + public void setAssociation(Association association) { + this.association = association; + } + + @Override + public SocketAddress address() { + assert address != null; + return address; + } + + @Override + public Association association() { + assert association != null; + return association; + } + + @Override + public AddressChangeEvent event() { + assert event != null; + return event; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()).append(" ["); + sb.append("Address: ").append(address); + sb.append(", Association:").append(association); + sb.append(", Event: ").append(event).append("]"); + return sb.toString(); + } +} + diff --git a/src/solaris/classes/sun/nio/ch/SctpResultContainer.java b/src/solaris/classes/sun/nio/ch/SctpResultContainer.java new file mode 100644 index 0000000000000000000000000000000000000000..430de7a75a8baf7ae62a4a453f2b502b54c3557b --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpResultContainer.java @@ -0,0 +1,126 @@ +/* + * 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 sun.nio.ch; + +/** + * Wraps the actual message or notification so that it can be + * set and returned from the native receive implementation. + */ +public class SctpResultContainer { + /* static final ints so that they can be referenced from native */ + static final int NOTHING = 0; + static final int MESSAGE = 1; + static final int SEND_FAILED = 2; + static final int ASSOCIATION_CHANGED = 3; + static final int PEER_ADDRESS_CHANGED = 4; + static final int SHUTDOWN = 5; + + private Object value; + private int type; + + int type() { + return type; + } + + boolean hasSomething() { + return type() != NOTHING; + } + + boolean isNotification() { + return type() != MESSAGE && type() != NOTHING ? true : false; + } + + void clear() { + type = NOTHING; + value = null; + } + + SctpNotification notification() { + assert type() != MESSAGE && type() != NOTHING; + + return (SctpNotification) value; + } + + SctpMessageInfoImpl getMessageInfo() { + assert type() == MESSAGE; + + if (value instanceof SctpMessageInfoImpl) + return (SctpMessageInfoImpl) value; + + return null; + } + + SctpSendFailed getSendFailed() { + assert type() == SEND_FAILED; + + if (value instanceof SctpSendFailed) + return (SctpSendFailed) value; + + return null; + } + + SctpAssocChange getAssociationChanged() { + assert type() == ASSOCIATION_CHANGED; + + if (value instanceof SctpAssocChange) + return (SctpAssocChange) value; + + return null; + } + + SctpPeerAddrChange getPeerAddressChanged() { + assert type() == PEER_ADDRESS_CHANGED; + + if (value instanceof SctpPeerAddrChange) + return (SctpPeerAddrChange) value; + + return null; + } + + SctpShutdown getShutdown() { + assert type() == SHUTDOWN; + + if (value instanceof SctpShutdown) + return (SctpShutdown) value; + + return null; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Type: "); + switch (type) { + case NOTHING: sb.append("NOTHING"); break; + case MESSAGE: sb.append("MESSAGE"); break; + case SEND_FAILED: sb.append("SEND FAILED"); break; + case ASSOCIATION_CHANGED: sb.append("ASSOCIATION CHANGE"); break; + case PEER_ADDRESS_CHANGED: sb.append("PEER ADDRESS CHANGE"); break; + case SHUTDOWN: sb.append("SHUTDOWN"); break; + default : sb.append("Unknown result type"); + } + return sb.append(", Value: ").append(value.toString()).toString(); + } +} diff --git a/src/solaris/classes/sun/nio/ch/SctpSendFailed.java b/src/solaris/classes/sun/nio/ch/SctpSendFailed.java new file mode 100644 index 0000000000000000000000000000000000000000..04a038da1fd674b1fca80e4b4be09c8ec90c498a --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpSendFailed.java @@ -0,0 +1,110 @@ +/* + * 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 sun.nio.ch; + +import java.nio.ByteBuffer; +import java.net.SocketAddress; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.SendFailedNotification; + +/** + * An implementation of SendFailedNotification + */ +public class SctpSendFailed extends SendFailedNotification + implements SctpNotification +{ + private Association association; + /* assocId is used to lookup the association before the notification is + * returned to user code */ + private int assocId; + private SocketAddress address; + private ByteBuffer buffer; + private int errorCode; + private int streamNumber; + + /* Invoked from native */ + private SctpSendFailed(int assocId, + SocketAddress address, + ByteBuffer buffer, + int errorCode, + int streamNumber) { + this.assocId = assocId; + this.errorCode = errorCode; + this.streamNumber = streamNumber; + this.address = address; + this.buffer = buffer; + } + + @Override + public int assocId() { + return assocId; + } + + @Override + public void setAssociation(Association association) { + this.association = association; + } + + @Override + public Association association() { + /* may be null */ + return association; + } + + @Override + public SocketAddress address() { + assert address != null; + return address; + } + + @Override + public ByteBuffer buffer() { + assert buffer != null; + return buffer; + } + + @Override + public int errorCode() { + return errorCode; + } + + @Override + public int streamNumber() { + return streamNumber; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()).append(" ["); + sb.append("Association:").append(association); + sb.append(", Address: ").append(address); + sb.append(", buffer: ").append(buffer); + sb.append(", errorCode: ").append(errorCode); + sb.append(", streamNumber: ").append(streamNumber); + sb.append("]"); + return sb.toString(); + } +} diff --git a/src/solaris/classes/sun/nio/ch/SctpServerChannelImpl.java b/src/solaris/classes/sun/nio/ch/SctpServerChannelImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..40126260a37bfd90f559c3b42552c3ada53f2ba8 --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpServerChannelImpl.java @@ -0,0 +1,429 @@ +/* + * 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 sun.nio.ch; + +import java.net.SocketAddress; +import java.net.InetSocketAddress; +import java.net.InetAddress; +import java.io.FileDescriptor; +import java.io.IOException; +import java.util.Collections; +import java.util.Set; +import java.util.HashSet; +import java.nio.channels.SelectionKey; +import java.nio.channels.AlreadyBoundException; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.NotYetBoundException; +import java.nio.channels.spi.SelectorProvider; +import com.sun.nio.sctp.IllegalUnbindException; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import com.sun.nio.sctp.SctpSocketOption; +import com.sun.nio.sctp.SctpStandardSocketOption; + +/** + * An implementation of SctpServerChannel + */ +public class SctpServerChannelImpl extends SctpServerChannel + implements SelChImpl +{ + /* Used to make native close and preClose calls */ + private static NativeDispatcher nd; + + private final FileDescriptor fd; + + private final int fdVal; + + /* IDs of native thread doing accept, for signalling */ + private volatile long thread = 0; + + /* Lock held by thread currently blocked in this channel */ + private final Object lock = new Object(); + + /* Lock held by any thread that modifies the state fields declared below + * DO NOT invoke a blocking I/O operation while holding this lock! */ + private final Object stateLock = new Object(); + + private enum ChannelState { + UNINITIALIZED, + INUSE, + KILLPENDING, + KILLED, + } + /* -- The following fields are protected by stateLock -- */ + private ChannelState state = ChannelState.UNINITIALIZED; + + /* Binding: Once bound the port will remain constant. */ + int port = -1; + private HashSet<InetSocketAddress> localAddresses = new HashSet<InetSocketAddress>(); + /* Has the channel been bound to the wildcard address */ + private boolean wildcard; /* false */ + + /* -- End of fields protected by stateLock -- */ + + /** + * Initializes a new instance of this class. + */ + public SctpServerChannelImpl(SelectorProvider provider) + throws IOException { + //TODO: update provider remove public modifier + super(provider); + this.fd = SctpNet.socket(true); + this.fdVal = IOUtil.fdVal(fd); + this.state = ChannelState.INUSE; + } + + @Override + public SctpServerChannel bind(SocketAddress local, int backlog) + throws IOException { + synchronized (lock) { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (isBound()) + throw new AlreadyBoundException(); + + InetSocketAddress isa = (local == null) ? + new InetSocketAddress(0) : Net.checkAddress(local); + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkListen(isa.getPort()); + Net.bind(fd, isa.getAddress(), isa.getPort()); + + InetSocketAddress boundIsa = Net.localAddress(fd); + port = boundIsa.getPort(); + localAddresses.add(isa); + if (isa.getAddress().isAnyLocalAddress()) + wildcard = true; + + Net.listen(fd, backlog < 1 ? 50 : backlog); + } + } + return this; + } + + @Override + public SctpServerChannel bindAddress(InetAddress address) + throws IOException { + return bindUnbindAddress(address, true); + } + + @Override + public SctpServerChannel unbindAddress(InetAddress address) + throws IOException { + return bindUnbindAddress(address, false); + } + + private SctpServerChannel bindUnbindAddress(InetAddress address, boolean add) + throws IOException { + if (address == null) + throw new IllegalArgumentException(); + + synchronized (lock) { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + throw new NotYetBoundException(); + if (wildcard) + throw new IllegalStateException( + "Cannot add or remove addresses from a channel that is bound to the wildcard address"); + if (address.isAnyLocalAddress()) + throw new IllegalArgumentException( + "Cannot add or remove the wildcard address"); + if (add) { + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + throw new AlreadyBoundException(); + } + } + } else { /*removing */ + /* Verify that there is more than one address + * and that address is already bound */ + if (localAddresses.size() <= 1) + throw new IllegalUnbindException("Cannot remove address from a channel with only one address bound"); + boolean foundAddress = false; + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + foundAddress = true; + break; + } + } + if (!foundAddress ) + throw new IllegalUnbindException("Cannot remove address from a channel that is not bound to that address"); + } + + SctpNet.bindx(fdVal, new InetAddress[]{address}, port, add); + + /* Update our internal Set to reflect the addition/removal */ + if (add) + localAddresses.add(new InetSocketAddress(address, port)); + else { + for (InetSocketAddress addr : localAddresses) { + if (addr.getAddress().equals(address)) { + localAddresses.remove(addr); + break; + } + } + } + } + } + return this; + } + + private boolean isBound() { + synchronized (stateLock) { + return port == -1 ? false : true; + } + } + + private void acceptCleanup() throws IOException { + synchronized (stateLock) { + thread = 0; + if (state == ChannelState.KILLPENDING) + kill(); + } + } + + @Override + public SctpChannel accept() throws IOException { + synchronized (lock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + throw new NotYetBoundException(); + SctpChannel sc = null; + + int n = 0; + FileDescriptor newfd = new FileDescriptor(); + InetSocketAddress[] isaa = new InetSocketAddress[1]; + + try { + begin(); + if (!isOpen()) + return null; + thread = NativeThread.current(); + for (;;) { + n = accept0(fd, newfd, isaa); + if ((n == IOStatus.INTERRUPTED) && isOpen()) + continue; + break; + } + } finally { + acceptCleanup(); + end(n > 0); + assert IOStatus.check(n); + } + + if (n < 1) + return null; + + IOUtil.configureBlocking(newfd, true); + InetSocketAddress isa = isaa[0]; + sc = new SctpChannelImpl(provider(), newfd); + + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkAccept(isa.getAddress().getHostAddress(), + isa.getPort()); + + return sc; + } + } + + @Override + protected void implConfigureBlocking(boolean block) throws IOException { + IOUtil.configureBlocking(fd, block); + } + + @Override + public void implCloseSelectableChannel() throws IOException { + synchronized (stateLock) { + nd.preClose(fd); + if (thread != 0) + NativeThread.signal(thread); + if (!isRegistered()) + kill(); + } + } + + @Override + public void kill() throws IOException { + synchronized (stateLock) { + if (state == ChannelState.KILLED) + return; + if (state == ChannelState.UNINITIALIZED) { + state = ChannelState.KILLED; + return; + } + assert !isOpen() && !isRegistered(); + + // Postpone the kill if there is a thread in accept + if (thread == 0) { + nd.close(fd); + state = ChannelState.KILLED; + } else { + state = ChannelState.KILLPENDING; + } + } + } + + @Override + public FileDescriptor getFD() { + return fd; + } + + @Override + public int getFDVal() { + return fdVal; + } + + /** + * Translates native poll revent ops into a ready operation ops + */ + private boolean translateReadyOps(int ops, int initialOps, + SelectionKeyImpl sk) { + int intOps = sk.nioInterestOps(); + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + + if ((ops & PollArrayWrapper.POLLNVAL) != 0) { + /* This should only happen if this channel is pre-closed while a + * selection operation is in progress + * ## Throw an error if this channel has not been pre-closed */ + return false; + } + + if ((ops & (PollArrayWrapper.POLLERR + | PollArrayWrapper.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + + if (((ops & PollArrayWrapper.POLLIN) != 0) && + ((intOps & SelectionKey.OP_ACCEPT) != 0)) + newOps |= SelectionKey.OP_ACCEPT; + + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + + @Override + public boolean translateAndUpdateReadyOps(int ops, SelectionKeyImpl sk) { + return translateReadyOps(ops, sk.nioReadyOps(), sk); + } + + @Override + public boolean translateAndSetReadyOps(int ops, SelectionKeyImpl sk) { + return translateReadyOps(ops, 0, sk); + } + + @Override + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + int newOps = 0; + + /* Translate ops */ + if ((ops & SelectionKey.OP_ACCEPT) != 0) + newOps |= PollArrayWrapper.POLLIN; + /* Place ops into pollfd array */ + sk.selector.putEventOps(sk, newOps); + + } + + @Override + public <T> SctpServerChannel setOption(SctpSocketOption<T> name, T value) + throws IOException { + if (name == null) + throw new NullPointerException(); + if (!supportedOptions().contains(name)) + throw new UnsupportedOperationException("'" + name + "' not supported"); + + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + + SctpNet.setSocketOption(fdVal, name, value, 0 /*oneToOne*/); + return this; + } + } + + @Override + public <T> T getOption(SctpSocketOption<T> name) throws IOException { + if (name == null) + throw new NullPointerException(); + if (!supportedOptions().contains(name)) + throw new UnsupportedOperationException("'" + name + "' not supported"); + + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + + return (T) SctpNet.getSocketOption(fdVal, name, 0 /*oneToOne*/); + } + } + + private static class DefaultOptionsHolder { + static final Set<SctpSocketOption<?>> defaultOptions = defaultOptions(); + + private static Set<SctpSocketOption<?>> defaultOptions() { + HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(1); + set.add(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS); + return Collections.unmodifiableSet(set); + } + } + + @Override + public final Set<SctpSocketOption<?>> supportedOptions() { + return DefaultOptionsHolder.defaultOptions; + } + + @Override + public Set<SocketAddress> getAllLocalAddresses() + throws IOException { + synchronized (stateLock) { + if (!isOpen()) + throw new ClosedChannelException(); + if (!isBound()) + return null; + + return SctpNet.getLocalAddresses(fdVal); + } + } + + /* Native */ + private static native void initIDs(); + + private static native int accept0(FileDescriptor ssfd, + FileDescriptor newfd, InetSocketAddress[] isaa) throws IOException; + + static { + Util.load(); // loads nio & net native libraries + java.security.AccessController.doPrivileged( + new sun.security.action.LoadLibraryAction("sctp")); + nd = new SctpSocketDispatcher(); + initIDs(); + } +} diff --git a/src/solaris/classes/sun/nio/ch/SctpShutdown.java b/src/solaris/classes/sun/nio/ch/SctpShutdown.java new file mode 100644 index 0000000000000000000000000000000000000000..0932fc550c1571b962a156dcb7fd728ca38aecaa --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpShutdown.java @@ -0,0 +1,69 @@ +/* + * 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 sun.nio.ch; + +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.ShutdownNotification; + +/** + * An implementation of ShutdownNotification + */ +public class SctpShutdown extends ShutdownNotification + implements SctpNotification +{ + private Association association; + /* assocId is used to lookup the association before the notification is + * returned to user code */ + private int assocId; + + /* Invoked from native */ + private SctpShutdown(int assocId) { + this.assocId = assocId; + } + + @Override + public int assocId() { + return assocId; + } + + @Override + public void setAssociation(Association association) { + this.association = association; + } + + @Override + public Association association() { + assert association != null; + return association; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()).append(" ["); + sb.append("Association:").append(association).append("]"); + return sb.toString(); + } +} diff --git a/src/solaris/classes/sun/nio/ch/SctpSocketDispatcher.java b/src/solaris/classes/sun/nio/ch/SctpSocketDispatcher.java new file mode 100644 index 0000000000000000000000000000000000000000..937a7392496daab9aa6a8b40a6bd780da5f7c274 --- /dev/null +++ b/src/solaris/classes/sun/nio/ch/SctpSocketDispatcher.java @@ -0,0 +1,68 @@ +/* + * 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 sun.nio.ch; + +import java.io.IOException; +import java.io.FileDescriptor; + +/** + * Only used for {@code close} and {@code preclose}. All other methods + * throw {@code IOException}. + */ +class SctpSocketDispatcher extends NativeDispatcher { + @Override + @SuppressWarnings("unused") + int read(FileDescriptor fd, long address, int len) throws IOException { + throw new IOException("Operation Unsupported"); + } + + @Override + @SuppressWarnings("unused") + long readv(FileDescriptor fd, long address, int len) throws IOException { + throw new IOException("Operation Unsupported"); + } + + @Override + @SuppressWarnings("unused") + int write(FileDescriptor fd, long address, int len) throws IOException { + throw new IOException("Operation Unsupported"); + } + + @Override + @SuppressWarnings("unused") + long writev(FileDescriptor fd, long address, int len) throws IOException { + throw new IOException("Operation Unsupported"); + } + + @Override + void close(FileDescriptor fd) throws IOException { + FileDispatcherImpl.close0(fd); + } + + @Override + void preClose(FileDescriptor fd) throws IOException { + FileDispatcherImpl.preClose0(fd); + } +} diff --git a/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java b/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java index 78ed152d3a1eefc1656b75b5dd886f4f2bbabc0b..e80f202bdff96c2324a63f36d4d82bedc1faab9c 100644 --- a/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java +++ b/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java @@ -32,6 +32,7 @@ import java.util.concurrent.*; import java.io.IOException; import java.io.FileDescriptor; import java.security.AccessController; +import sun.net.NetHooks; import sun.security.action.GetPropertyAction; /** @@ -305,6 +306,7 @@ class UnixAsynchronousSocketChannelImpl sm.checkConnect(isa.getAddress().getHostAddress(), isa.getPort()); // check and set state + boolean notifyBeforeTcpConnect; synchronized (stateLock) { if (state == ST_CONNECTED) throw new AlreadyConnectedException(); @@ -312,12 +314,16 @@ class UnixAsynchronousSocketChannelImpl throw new ConnectionPendingException(); state = ST_PENDING; pendingRemote = remote; + notifyBeforeTcpConnect = (localAddress == null); } AbstractFuture<Void,A> result = null; Throwable e = null; try { begin(); + // notify hook if unbound + if (notifyBeforeTcpConnect) + NetHooks.beforeTcpConnect(fd, isa.getAddress(), isa.getPort()); int n = Net.connect(fd, isa.getAddress(), isa.getPort()); if (n == IOStatus.UNAVAILABLE) { // connection could not be established immediately diff --git a/src/solaris/lib/sdp/sdp.conf.template b/src/solaris/lib/sdp/sdp.conf.template new file mode 100644 index 0000000000000000000000000000000000000000..71cb5c2ce84d0447d2714121efac0b71b7544831 --- /dev/null +++ b/src/solaris/lib/sdp/sdp.conf.template @@ -0,0 +1,30 @@ +# +# Configuration file to enable InfiniBand Sockets Direct Protocol. +# +# Each line that does not start with a comment (#) is a rule to indicate when +# the SDP transport protocol should be used. The format of a rule is as follows: +# ("bind"|"connect") 1*LWSP-char (hostname|ipaddress["/"prefix]) 1*LWSP-char ("*"|port)["-"("*"|port)] +# +# A "bind" rule indicates that the SDP protocol transport should be used when +# a TCP socket binds to an address/port that matches the rule. A "connect" rule +# indicates that the SDP protocol transport should be used when an unbound +# TCP socket attempts to connect to an address/port that matches the rule. +# Addresses may be specified as hostnames or literal Internet Protocol (IP) +# addresses. When a literal IP address is used then a prefix length may be used +# to indicate the number of bits for matching (useful when a block of addresses +# or subnet is allocated to the InfiniBand fabric). + +# Use SDP for all sockets that bind to specific local addresses +#bind 192.168.1.1 * +#bind fe80::21b:24ff:fe3d:7896 * + +# Use SDP for all sockets that bind to the wildcard address in a port range +#bind 0.0.0.0 5000-5999 +#bind ::0 5000-5999 + +# Use SDP when connecting to all application services on 192.168.1.* +#connect 192.168.1.0/24 1024-* + +# Use SDP when connecting to the http server or MySQL database on hpccluster. +#connect hpccluster.foo.com 80 +#connect hpccluster.foo.com 3306 diff --git a/src/solaris/native/sun/awt/awt_Component.h b/src/solaris/native/sun/awt/awt_Component.h index 8ee7fe82f456994157e5426be1d5b5c04624332f..d6ee776be01a6aaabe8c651db8a22001b4118662 100644 --- a/src/solaris/native/sun/awt/awt_Component.h +++ b/src/solaris/native/sun/awt/awt_Component.h @@ -41,7 +41,6 @@ struct ComponentIDs { jfieldID appContext; jmethodID getParent; jmethodID getLocationOnScreen; - jmethodID resetGCMID; }; /* field and method IDs for Container */ @@ -65,7 +64,3 @@ struct MComponentPeerIDs { extern void processTree(Widget from, Widget to, Boolean action); #endif // HEADLESS -/* fieldIDs for Canvas fields that may be accessed from C */ -struct CanvasIDs { - jmethodID setGCFromPeerMID; -}; diff --git a/src/solaris/native/sun/awt/awt_GraphicsEnv.c b/src/solaris/native/sun/awt/awt_GraphicsEnv.c index 03f5c23d1449d6ba3fe47563ebacf46c91a45549..2e80cf7206d9867987477a99f88dbfa4bd2f01ac 100644 --- a/src/solaris/native/sun/awt/awt_GraphicsEnv.c +++ b/src/solaris/native/sun/awt/awt_GraphicsEnv.c @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -354,6 +354,48 @@ makeDefaultConfig(JNIEnv *env, int screen) { return NULL; } +/* Note: until we include the <X11/extensions/Xrender.h> explicitly + * we have to define a couple of things ourselves. + */ +typedef unsigned long PictFormat; +#define PictTypeIndexed 0 +#define PictTypeDirect 1 + +typedef struct { + short red; + short redMask; + short green; + short greenMask; + short blue; + short blueMask; + short alpha; + short alphaMask; +} XRenderDirectFormat; + +typedef struct { + PictFormat id; + int type; + int depth; + XRenderDirectFormat direct; + Colormap colormap; +} XRenderPictFormat; + +#define PictFormatID (1 << 0) +#define PictFormatType (1 << 1) +#define PictFormatDepth (1 << 2) +#define PictFormatRed (1 << 3) +#define PictFormatRedMask (1 << 4) +#define PictFormatGreen (1 << 5) +#define PictFormatGreenMask (1 << 6) +#define PictFormatBlue (1 << 7) +#define PictFormatBlueMask (1 << 8) +#define PictFormatAlpha (1 << 9) +#define PictFormatAlphaMask (1 << 10) +#define PictFormatColormap (1 << 11) + +typedef XRenderPictFormat * +XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual); + static void getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { @@ -367,6 +409,9 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { int ind; char errmsg[128]; int xinawareScreen; + void* xrenderLibHandle = NULL; + XRenderFindVisualFormatFunc *XRenderFindVisualFormat = NULL; + int major_opcode, first_event, first_error; if (usingXinerama) { xinawareScreen = 0; @@ -449,6 +494,26 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { graphicsConfigs[0] = defaultConfig; nConfig = 1; /* reserve index 0 for default config */ + // Only use the RENDER extension if it is available on the X server + if (XQueryExtension(awt_display, "RENDER", + &major_opcode, &first_event, &first_error)) + { + xrenderLibHandle = dlopen("libXrender.so.1", RTLD_LAZY | RTLD_GLOBAL); + +#ifndef __linux__ /* SOLARIS */ + if (xrenderLibHandle == NULL) { + xrenderLibHandle = dlopen("/usr/sfw/lib/libXrender.so.1", + RTLD_LAZY | RTLD_GLOBAL); + } +#endif + + if (xrenderLibHandle != NULL) { + XRenderFindVisualFormat = + (XRenderFindVisualFormatFunc*)dlsym(xrenderLibHandle, + "XRenderFindVisualFormat"); + } + } + for (i = 0; i < nTrue; i++) { if (XVisualIDFromVisual(pVITrue[i].visual) == XVisualIDFromVisual(defaultConfig->awt_visInfo.visual) || @@ -462,6 +527,21 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) { graphicsConfigs [ind]->awt_depth = pVITrue [i].depth; memcpy (&graphicsConfigs [ind]->awt_visInfo, &pVITrue [i], sizeof (XVisualInfo)); + if (XRenderFindVisualFormat != NULL) { + XRenderPictFormat *format = XRenderFindVisualFormat (awt_display, + pVITrue [i].visual); + if (format && + format->type == PictTypeDirect && + format->direct.alphaMask) + { + graphicsConfigs [ind]->isTranslucencySupported = 1; + } + } + } + + if (xrenderLibHandle != NULL) { + dlclose(xrenderLibHandle); + xrenderLibHandle = NULL; } for (i = 0; i < n8p; i++) { @@ -1505,6 +1585,26 @@ Java_sun_awt_X11GraphicsConfig_swapBuffers AWT_FLUSH_UNLOCK(); } +/* + * Class: sun_awt_X11GraphicsConfig + * Method: isTranslucencyCapable + * Signature: (J)V + */ +JNIEXPORT jboolean JNICALL +Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable + (JNIEnv *env, jobject this, jlong configData) +{ +#ifdef HEADLESS + return JNI_FALSE; +#else + AwtGraphicsConfigDataPtr aData = (AwtGraphicsConfigDataPtr)jlong_to_ptr(configData); + if (aData == NULL) { + return JNI_FALSE; + } + return (jboolean)aData->isTranslucencySupported; +#endif +} + /* * Class: sun_awt_X11GraphicsDevice * Method: isDBESupported diff --git a/src/solaris/native/sun/awt/awt_Window.h b/src/solaris/native/sun/awt/awt_Window.h index 875f55b2fa1f16b5e81cb6fd47767fe458fb68cc..a93e4ad34d1ac5daafac7093cbd70c49db9dec1d 100644 --- a/src/solaris/native/sun/awt/awt_Window.h +++ b/src/solaris/native/sun/awt/awt_Window.h @@ -28,7 +28,6 @@ /* fieldIDs for Window fields that may be accessed from C */ struct WindowIDs { jfieldID warningString; - jmethodID resetGCMID; jfieldID locationByPlatform; jfieldID isAutoRequestFocus; }; diff --git a/src/solaris/native/sun/awt/awt_p.h b/src/solaris/native/sun/awt/awt_p.h index fb4f513f79f80f37f51b9b2c31bdd16a3ec2b36e..73e5dd0a88edb6de43adae2155836ed8ea0ebd29 100644 --- a/src/solaris/native/sun/awt/awt_p.h +++ b/src/solaris/native/sun/awt/awt_p.h @@ -1,5 +1,5 @@ /* - * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -135,6 +135,7 @@ typedef struct _AwtGraphicsConfigData { int pixelStride; /* Used in X11SurfaceData.c */ ColorData *color_data; struct _GLXGraphicsConfigInfo *glxInfo; + int isTranslucencySupported; /* Uses Xrender to find this out. */ } AwtGraphicsConfigData; typedef AwtGraphicsConfigData* AwtGraphicsConfigDataPtr; diff --git a/src/solaris/native/sun/awt/gtk2_interface.c b/src/solaris/native/sun/awt/gtk2_interface.c index cfbc5ef6f6ea6344e32157935b1fad3e3b6a31b8..1afeeef173b292515b6ee55ab846078eb0842970 100644 --- a/src/solaris/native/sun/awt/gtk2_interface.c +++ b/src/solaris/native/sun/awt/gtk2_interface.c @@ -93,6 +93,7 @@ static int gtk2_pixbuf_height = 0; /* Static buffer for conversion from java.lang.String to UTF-8 */ static char convertionBuffer[CONV_BUFFER_SIZE]; +static gboolean new_combo = TRUE; const char ENV_PREFIX[] = "GTK_MODULES="; /*******************/ @@ -608,6 +609,7 @@ gboolean gtk2_load() dlsym(gtk2_libhandle, "gtk_combo_box_entry_new"); if (fp_gtk_combo_box_entry_new == NULL) { fp_gtk_combo_box_entry_new = dl_symbol("gtk_combo_new"); + new_combo = FALSE; } fp_gtk_separator_tool_item_new = @@ -1423,17 +1425,13 @@ static GtkWidget *gtk2_get_widget(WidgetType widget_type) */ GtkWidget *combo = (*fp_gtk_combo_box_entry_new)(); - if (widget_type == COMBO_BOX_TEXT_FIELD) - (*fp_gtk_container_add)((GtkContainer *)combo, result); - else - { + if (new_combo && widget_type == COMBO_BOX_ARROW_BUTTON) { (*fp_gtk_widget_set_parent)(result, combo); ((GtkBin*)combo)->child = result; + } else { + (*fp_gtk_container_add)((GtkContainer *)combo, result); } - (*fp_gtk_container_add)((GtkContainer *)gtk2_fixed, combo); - (*fp_gtk_widget_realize)(result); - return result; } else if (widget_type != TOOL_TIP && widget_type != INTERNAL_FRAME && diff --git a/src/solaris/native/sun/awt/utility/rect.h b/src/solaris/native/sun/awt/utility/rect.h index 102d147a2c8584b185234032c13b7e9fe19e8ef5..d5ca97588c0b40414d7f306a1e25fbf6cf5ce1e3 100644 --- a/src/solaris/native/sun/awt/utility/rect.h +++ b/src/solaris/native/sun/awt/utility/rect.h @@ -43,4 +43,15 @@ typedef XRectangle RECT_T; #define RECT_INC_HEIGHT(r) (r).height++ +#if defined(__cplusplus) +extern "C" { +#endif + +int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height, + unsigned char * buf, RECT_T * outBuf); + +#if defined(__cplusplus) +} +#endif + #endif // _AWT_RECT_H diff --git a/src/solaris/native/sun/net/spi/SdpProvider.c b/src/solaris/native/sun/net/spi/SdpProvider.c new file mode 100644 index 0000000000000000000000000000000000000000..00d7f4ba6dc5591d1d4fe671ef50408d5bedc8d4 --- /dev/null +++ b/src/solaris/native/sun/net/spi/SdpProvider.c @@ -0,0 +1,74 @@ +/* + * 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. + */ + +#include <sys/types.h> +#include <sys/socket.h> + +#if defined(__solaris__) && !defined(PROTO_SDP) +#define PROTO_SDP 257 +#endif + +#include "jni.h" +#include "jni_util.h" +#include "net_util.h" + +#define RESTARTABLE(_cmd, _result) do { \ + do { \ + _result = _cmd; \ + } while((_result == -1) && (errno == EINTR)); \ +} while(0) + +JNIEXPORT void JNICALL +Java_sun_net_spi_SdpProvider_convert(JNIEnv *env, jclass cls, jint fd) +{ +#ifdef PROTO_SDP + int domain = ipv6_available() ? AF_INET6 : AF_INET; + int s = socket(domain, SOCK_STREAM, PROTO_SDP); + if (s < 0) { + JNU_ThrowIOExceptionWithLastError(env, "socket"); + } else { + int arg, len, res; + struct linger linger; + + /* copy socket options that are relevant to SDP */ + len = sizeof(arg); + if (getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, &len) == 0) + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, len); + len = sizeof(arg); + if (getsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, &len) == 0) + setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, len); + len = sizeof(linger); + if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (void*)&linger, &len) == 0) + setsockopt(s, SOL_SOCKET, SO_LINGER, (char*)&linger, len); + + RESTARTABLE(dup2(s, fd), res); + if (res < 0) + JNU_ThrowIOExceptionWithLastError(env, "dup2"); + RESTARTABLE(close(s), res); + } +#else + JNU_ThrowInternalError(env, "should not reach here"); +#endif +} diff --git a/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c b/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c index 090c77e6774d300a080f69485f742b076f958629..fa36f612bfff6a50f540d2ba6f6ae164acffde4a 100644 --- a/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c +++ b/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c @@ -28,6 +28,7 @@ #include "jvm.h" #include "jlong.h" #include "sun_nio_ch_DevPollArrayWrapper.h" +#include "java_lang_Integer.h" #include <sys/poll.h> #include <sys/resource.h> #include <unistd.h> @@ -192,7 +193,11 @@ Java_sun_nio_ch_DevPollArrayWrapper_fdLimit(JNIEnv *env, jclass this) JNU_ThrowIOExceptionWithLastError(env, "getrlimit failed"); } - return (jint)rlp.rlim_max; + if (rlp.rlim_max < 0 || rlp.rlim_max > java_lang_Integer_MAX_VALUE) { + return java_lang_Integer_MAX_VALUE; + } else { + return (jint)rlp.rlim_max; + } } JNIEXPORT void JNICALL diff --git a/src/solaris/native/sun/nio/ch/FileChannelImpl.c b/src/solaris/native/sun/nio/ch/FileChannelImpl.c index 7b37e6168b81cd1283d47ef8258eb8ae89993ff8..c1c3cc9e82678ae1105705639161ed03b555e48a 100644 --- a/src/solaris/native/sun/nio/ch/FileChannelImpl.c +++ b/src/solaris/native/sun/nio/ch/FileChannelImpl.c @@ -231,6 +231,8 @@ Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this, if (result < 0) { if (errno == EAGAIN) return IOS_UNAVAILABLE; + if (errno == EOPNOTSUPP) + return IOS_UNSUPPORTED_CASE; if ((errno == EINVAL) && ((ssize_t)count >= 0)) return IOS_UNSUPPORTED_CASE; if (errno == EINTR) diff --git a/src/solaris/native/sun/nio/ch/Sctp.h b/src/solaris/native/sun/nio/ch/Sctp.h new file mode 100644 index 0000000000000000000000000000000000000000..4c1fd3bcdf9d776c676fcc1bc0b0e9e6b4832219 --- /dev/null +++ b/src/solaris/native/sun/nio/ch/Sctp.h @@ -0,0 +1,329 @@ +/* + * 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. + */ + +#ifndef SUN_NIO_CH_SCTP_H +#define SUN_NIO_CH_SCTP_H + +#ifdef __solaris__ + +#define _XPG4_2 +#define __EXTENSIONS__ +#include <sys/socket.h> +#include <netinet/sctp.h> +#include "jni.h" + +/* Current Solaris headers don't comply with draft rfc */ +#ifndef SCTP_EOF +#define SCTP_EOF MSG_EOF +#endif + +#ifndef SCTP_UNORDERED +#define SCTP_UNORDERED MSG_UNORDERED +#endif + +/* The current version of the socket API extension shipped with Solaris does + * not define the following options that the Java API (optionally) supports */ +#ifndef SCTP_EXPLICIT_EOR +#define SCTP_EXPLICIT_EOR -1 +#endif +#ifndef SCTP_FRAGMENT_INTERLEAVE +#define SCTP_FRAGMENT_INTERLEAVE -1 +#endif +#ifndef SCTP_SET_PEER_PRIMARY_ADDR +#define SCTP_SET_PEER_PRIMARY_ADDR -1 +#endif + +/* Function types to support dynamic linking of socket API extension functions + * for SCTP. This is so that there is no linkage depandancy during build or + * runtime for libsctp.*/ +typedef int sctp_getladdrs_func(int sock, sctp_assoc_t id, void **addrs); +typedef int sctp_freeladdrs_func(void* addrs); +typedef int sctp_getpaddrs_func(int sock, sctp_assoc_t id, void **addrs); +typedef int sctp_freepaddrs_func(void *addrs); +typedef int sctp_bindx_func(int sock, void *addrs, int addrcnt, int flags); + + +#else /* __linux__ */ +#include <stdint.h> +#include <linux/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include "jni.h" + +//Causes compiler error if not found, should make warning and uncomment +/*#include <netinet/sctp.h>*/ + +#ifndef IPPROTO_SCTP +#define IPPROTO_SCTP 132 +#endif + +/* The current version of lksctp does + * not define the following option that the Java API (optionally) supports */ +#ifndef SCTP_EXPLICIT_EOR +#define SCTP_EXPLICIT_EOR -1 +#endif + +/* Definitions taken from lksctp-tools-1.0.8/src/include/netinet/sctp.h */ +#ifndef SCTP_INITMSG + +enum sctp_optname { + SCTP_RTOINFO, +#define SCTP_RTOINFO SCTP_RTOINFO + SCTP_ASSOCINFO, +#define SCTP_ASSOCINFO SCTP_ASSOCINFO + SCTP_INITMSG, +#define SCTP_INITMSG SCTP_INITMSG + SCTP_NODELAY, /* Get/set nodelay option. */ +#define SCTP_NODELAY SCTP_NODELAY + SCTP_AUTOCLOSE, +#define SCTP_AUTOCLOSE SCTP_AUTOCLOSE + SCTP_SET_PEER_PRIMARY_ADDR, +#define SCTP_SET_PEER_PRIMARY_ADDR SCTP_SET_PEER_PRIMARY_ADDR + SCTP_PRIMARY_ADDR, +#define SCTP_PRIMARY_ADDR SCTP_PRIMARY_ADDR + SCTP_ADAPTATION_LAYER, +#define SCTP_ADAPTATION_LAYER SCTP_ADAPTATION_LAYER + SCTP_DISABLE_FRAGMENTS, +#define SCTP_DISABLE_FRAGMENTS SCTP_DISABLE_FRAGMENTS + SCTP_PEER_ADDR_PARAMS, +#define SCTP_PEER_ADDR_PARAMS SCTP_PEER_ADDR_PARAMS + SCTP_DEFAULT_SEND_PARAM, +#define SCTP_DEFAULT_SEND_PARAM SCTP_DEFAULT_SEND_PARAM + SCTP_EVENTS, +#define SCTP_EVENTS SCTP_EVENTS + SCTP_I_WANT_MAPPED_V4_ADDR, /* Turn on/off mapped v4 addresses */ +#define SCTP_I_WANT_MAPPED_V4_ADDR SCTP_I_WANT_MAPPED_V4_ADDR + SCTP_MAXSEG, /* Get/set maximum fragment. */ +#define SCTP_MAXSEG SCTP_MAXSEG + SCTP_STATUS, +#define SCTP_STATUS SCTP_STATUS + SCTP_GET_PEER_ADDR_INFO, +#define SCTP_GET_PEER_ADDR_INFO SCTP_GET_PEER_ADDR_INFO + SCTP_DELAYED_ACK_TIME, +#define SCTP_DELAYED_ACK_TIME SCTP_DELAYED_ACK_TIME + SCTP_CONTEXT, /* Receive Context */ +#define SCTP_CONTEXT SCTP_CONTEXT + SCTP_FRAGMENT_INTERLEAVE, +#define SCTP_FRAGMENT_INTERLEAVE SCTP_FRAGMENT_INTERLEAVE + SCTP_PARTIAL_DELIVERY_POINT, /* Set/Get partial delivery point */ +#define SCTP_PARTIAL_DELIVERY_POINT SCTP_PARTIAL_DELIVERY_POINT + SCTP_MAX_BURST, /* Set/Get max burst */ +#define SCTP_MAX_BURST SCTP_MAX_BURST +}; + +enum sctp_sac_state { + SCTP_COMM_UP, + SCTP_COMM_LOST, + SCTP_RESTART, + SCTP_SHUTDOWN_COMP, + SCTP_CANT_STR_ASSOC, +}; + +enum sctp_spc_state { + SCTP_ADDR_AVAILABLE, + SCTP_ADDR_UNREACHABLE, + SCTP_ADDR_REMOVED, + SCTP_ADDR_ADDED, + SCTP_ADDR_MADE_PRIM, + SCTP_ADDR_CONFIRMED, +}; + +enum sctp_sinfo_flags { + SCTP_UNORDERED = 1, /* Send/receive message unordered. */ + SCTP_ADDR_OVER = 2, /* Override the primary destination. */ + SCTP_ABORT=4, /* Send an ABORT message to the peer. */ + SCTP_EOF=MSG_FIN, /* Initiate graceful shutdown process. */ +}; + +enum sctp_sn_type { + SCTP_SN_TYPE_BASE = (1<<15), + SCTP_ASSOC_CHANGE, + SCTP_PEER_ADDR_CHANGE, + SCTP_SEND_FAILED, + SCTP_REMOTE_ERROR, + SCTP_SHUTDOWN_EVENT, + SCTP_PARTIAL_DELIVERY_EVENT, + SCTP_ADAPTATION_INDICATION, +}; + +typedef enum sctp_cmsg_type { + SCTP_INIT, /* 5.2.1 SCTP Initiation Structure */ +#define SCTP_INIT SCTP_INIT + SCTP_SNDRCV, /* 5.2.2 SCTP Header Information Structure */ +#define SCTP_SNDRCV SCTP_SNDRCV +} sctp_cmsg_t; + +enum sctp_msg_flags { + MSG_NOTIFICATION = 0x8000, +#define MSG_NOTIFICATION MSG_NOTIFICATION +}; + +#define SCTP_BINDX_ADD_ADDR 0x01 +#define SCTP_BINDX_REM_ADDR 0x02 + +typedef __s32 sctp_assoc_t; + +struct sctp_initmsg { + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u16 sinit_max_attempts; + __u16 sinit_max_init_timeo; +}; + +struct sctp_sndrcvinfo { + __u16 sinfo_stream; + __u16 sinfo_ssn; + __u16 sinfo_flags; + __u32 sinfo_ppid; + __u32 sinfo_context; + __u32 sinfo_timetolive; + __u32 sinfo_tsn; + __u32 sinfo_cumtsn; + sctp_assoc_t sinfo_assoc_id; +}; + +struct sctp_event_subscribe { + __u8 sctp_data_io_event; + __u8 sctp_association_event; + __u8 sctp_address_event; + __u8 sctp_send_failure_event; + __u8 sctp_peer_error_event; + __u8 sctp_shutdown_event; + __u8 sctp_partial_delivery_event; + __u8 sctp_adaptation_layer_event; +}; + +struct sctp_send_failed { + __u16 ssf_type; + __u16 ssf_flags; + __u32 ssf_length; + __u32 ssf_error; + struct sctp_sndrcvinfo ssf_info; + sctp_assoc_t ssf_assoc_id; + __u8 ssf_data[0]; +}; + +struct sctp_assoc_change { + __u16 sac_type; + __u16 sac_flags; + __u32 sac_length; + __u16 sac_state; + __u16 sac_error; + __u16 sac_outbound_streams; + __u16 sac_inbound_streams; + sctp_assoc_t sac_assoc_id; + __u8 sac_info[0]; +}; + +struct sctp_shutdown_event { + __u16 sse_type; + __u16 sse_flags; + __u32 sse_length; + sctp_assoc_t sse_assoc_id; +}; + +struct sctp_paddr_change { + __u16 spc_type; + __u16 spc_flags; + __u32 spc_length; + struct sockaddr_storage spc_aaddr; + int spc_state; + int spc_error; + sctp_assoc_t spc_assoc_id; +} __attribute__((packed, aligned(4))); + +struct sctp_remote_error { + __u16 sre_type; + __u16 sre_flags; + __u32 sre_length; + __u16 sre_error; + sctp_assoc_t sre_assoc_id; + __u8 sre_data[0]; +}; + +struct sctp_adaptation_event { + __u16 sai_type; + __u16 sai_flags; + __u32 sai_length; + __u32 sai_adaptation_ind; + sctp_assoc_t sai_assoc_id; +}; + +struct sctp_setprim { + sctp_assoc_t ssp_assoc_id; + struct sockaddr_storage ssp_addr; +} __attribute__((packed, aligned(4))); + +struct sctp_setpeerprim { + sctp_assoc_t sspp_assoc_id; + struct sockaddr_storage sspp_addr; +} __attribute__((packed, aligned(4))); + + +struct sctp_pdapi_event { + __u16 pdapi_type; + __u16 pdapi_flags; + __u32 pdapi_length; + __u32 pdapi_indication; + sctp_assoc_t pdapi_assoc_id; +}; + +union sctp_notification { + struct { + __u16 sn_type; /* Notification type. */ + __u16 sn_flags; + __u32 sn_length; + } sn_header; + struct sctp_assoc_change sn_assoc_change; + struct sctp_paddr_change sn_paddr_change; + struct sctp_remote_error sn_remote_error; + struct sctp_send_failed sn_send_failed; + struct sctp_shutdown_event sn_shutdown_event; + struct sctp_adaptation_event sn_adaptation_event; + struct sctp_pdapi_event sn_pdapi_event; +}; + +#endif /* SCTP_INITMSG */ + +/* Function types to support dynamic linking of socket API extension functions + * for SCTP. This is so that there is no linkage depandancy during build or + * runtime for libsctp.*/ +typedef int sctp_getladdrs_func(int sd, sctp_assoc_t id, struct sockaddr **addrs); +typedef int sctp_freeladdrs_func(struct sockaddr *addrs); +typedef int sctp_getpaddrs_func(int sd, sctp_assoc_t id, struct sockaddr **addrs); +typedef int sctp_freepaddrs_func(struct sockaddr *addrs); +typedef int sctp_bindx_func(int sd, struct sockaddr *addrs, int addrcnt, int flags); + +#endif /* __linux__ */ + +sctp_getladdrs_func* nio_sctp_getladdrs; +sctp_freeladdrs_func* nio_sctp_freeladdrs; +sctp_getpaddrs_func* nio_sctp_getpaddrs; +sctp_freepaddrs_func* nio_sctp_freepaddrs; +sctp_bindx_func* nio_sctp_bindx; + +jboolean loadSocketExtensionFuncs(JNIEnv* env); + +#endif /* !SUN_NIO_CH_SCTP_H */ diff --git a/src/solaris/native/sun/nio/ch/SctpChannelImpl.c b/src/solaris/native/sun/nio/ch/SctpChannelImpl.c new file mode 100644 index 0000000000000000000000000000000000000000..744c5563fee85d769c251d42104f3c9d615909d2 --- /dev/null +++ b/src/solaris/native/sun/nio/ch/SctpChannelImpl.c @@ -0,0 +1,594 @@ +/* + * 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. + */ + +#include <stdlib.h> +#include <string.h> +#include "Sctp.h" + +#include "jni.h" +#include "nio_util.h" +#include "nio.h" +#include "net_util.h" +#include "net_util_md.h" +#include "sun_nio_ch_SctpNet.h" +#include "sun_nio_ch_SctpChannelImpl.h" +#include "sun_nio_ch_SctpAssocChange.h" +#include "sun_nio_ch_SctpResultContainer.h" +#include "sun_nio_ch_SctpPeerAddrChange.h" + +/* sizeof(union sctp_notification */ +#define NOTIFICATION_BUFFER_SIZE 280 + +#define MESSAGE_IMPL_CLASS "sun/nio/ch/SctpMessageInfoImpl" +#define RESULT_CONTAINER_CLASS "sun/nio/ch/SctpResultContainer" +#define SEND_FAILED_CLASS "sun/nio/ch/SctpSendFailed" +#define ASSOC_CHANGE_CLASS "sun/nio/ch/SctpAssocChange" +#define PEER_CHANGE_CLASS "sun/nio/ch/SctpPeerAddrChange" +#define SHUTDOWN_CLASS "sun/nio/ch/SctpShutdown" + +struct controlData { + int assocId; + unsigned short streamNumber; + jboolean unordered; + unsigned int ppid; +}; + +static jclass smi_class; /* sun.nio.ch.SctpMessageInfoImpl */ +static jmethodID smi_ctrID; /* sun.nio.ch.SctpMessageInfoImpl.<init> */ +static jfieldID src_valueID; /* sun.nio.ch.SctpResultContainer.value */ +static jfieldID src_typeID; /* sun.nio.ch.SctpResultContainer.type */ +static jclass ssf_class; /* sun.nio.ch.SctpSendFailed */ +static jmethodID ssf_ctrID; /* sun.nio.ch.SctpSendFailed.<init> */ +static jclass sac_class; /* sun.nio.ch.SctpAssociationChanged */ +static jmethodID sac_ctrID; /* sun.nio.ch.SctpAssociationChanged.<init> */ +static jclass spc_class; /* sun.nio.ch.SctpPeerAddressChanged */ +static jmethodID spc_ctrID; /* sun.nio.ch.SctpPeerAddressChanged.<init> */ +static jclass ss_class; /* sun.nio.ch.SctpShutdown */ +static jmethodID ss_ctrID; /* sun.nio.ch.SctpShutdown.<init> */ +static jfieldID isa_addrID; /* java.net.InetSocketAddress.addr */ +static jfieldID isa_portID; /* java.net.InetSocketAddress.port */ + +/* defined in SctpNet.c */ +jobject SockAddrToInetSocketAddress(JNIEnv* env, struct sockaddr* addr); + +/* use SocketChannelImpl's checkConnect implementation */ +extern jint Java_sun_nio_ch_SocketChannelImpl_checkConnect(JNIEnv* env, + jobject this, jobject fdo, jboolean block, jboolean ready); + +/* + * Class: sun_nio_ch_SctpChannelImpl + * Method: initIDs + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpChannelImpl_initIDs + (JNIEnv *env, jclass klass) { + jclass cls; + + /* SctpMessageInfoImpl */ + cls = (*env)->FindClass(env, MESSAGE_IMPL_CLASS); + CHECK_NULL(cls); + smi_class = (*env)->NewGlobalRef(env, cls); + CHECK_NULL(smi_class); + smi_ctrID = (*env)->GetMethodID(env, cls, "<init>", + "(ILjava/net/SocketAddress;IIZZI)V"); + CHECK_NULL(smi_ctrID); + + /* SctpResultContainer */ + cls = (*env)->FindClass(env, RESULT_CONTAINER_CLASS); + CHECK_NULL(cls); + src_valueID = (*env)->GetFieldID(env, cls, "value", "Ljava/lang/Object;"); + CHECK_NULL(src_valueID); + src_typeID = (*env)->GetFieldID(env, cls, "type", "I"); + CHECK_NULL(src_typeID); + + /* SctpSendFailed */ + cls = (*env)->FindClass(env, SEND_FAILED_CLASS); + CHECK_NULL(cls); + ssf_class = (*env)->NewGlobalRef(env, cls); + CHECK_NULL(ssf_class); + ssf_ctrID = (*env)->GetMethodID(env, cls, "<init>", + "(ILjava/net/SocketAddress;Ljava/nio/ByteBuffer;II)V"); + CHECK_NULL(ssf_ctrID); + + /* SctpAssocChange */ + cls = (*env)->FindClass(env, ASSOC_CHANGE_CLASS); + CHECK_NULL(cls); + sac_class = (*env)->NewGlobalRef(env, cls); + CHECK_NULL(sac_class); + sac_ctrID = (*env)->GetMethodID(env, cls, "<init>", "(IIII)V"); + CHECK_NULL(sac_ctrID); + + /* SctpPeerAddrChange */ + cls = (*env)->FindClass(env, PEER_CHANGE_CLASS); + CHECK_NULL(cls); + spc_class = (*env)->NewGlobalRef(env, cls); + CHECK_NULL(spc_class); + spc_ctrID = (*env)->GetMethodID(env, cls, "<init>", + "(ILjava/net/SocketAddress;I)V"); + CHECK_NULL(spc_ctrID); + + /* sun.nio.ch.SctpShutdown */ + cls = (*env)->FindClass(env, SHUTDOWN_CLASS); + CHECK_NULL(cls); + ss_class = (*env)->NewGlobalRef(env, cls); + CHECK_NULL(ss_class); + ss_ctrID = (*env)->GetMethodID(env, cls, "<init>", "(I)V"); + CHECK_NULL(ss_ctrID); + + /* InetSocketAddress */ + cls = (*env)->FindClass(env, "java/net/InetSocketAddress"); + CHECK_NULL(cls); + isa_addrID = (*env)->GetFieldID(env, cls, "addr", "Ljava/net/InetAddress;"); + CHECK_NULL(isa_addrID); + isa_portID = (*env)->GetFieldID(env, cls, "port", "I"); +} + +void getControlData + (struct msghdr* msg, struct controlData* cdata) { + struct cmsghdr* cmsg; + + for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_SCTP && cmsg->cmsg_type == SCTP_SNDRCV) { + struct sctp_sndrcvinfo *sri; + + sri = (struct sctp_sndrcvinfo *) CMSG_DATA(cmsg); + cdata->assocId = sri->sinfo_assoc_id; + cdata->streamNumber = sri->sinfo_stream; + cdata->unordered = (sri->sinfo_flags & SCTP_UNORDERED) ? JNI_TRUE : + JNI_FALSE; + cdata->ppid = ntohl(sri->sinfo_ppid); + + return; + } + } + return; +} + +void setControlData + (struct msghdr* msg, struct controlData* cdata) { + struct cmsghdr* cmsg; + struct sctp_sndrcvinfo *sri; + + cmsg = CMSG_FIRSTHDR(msg); + cmsg->cmsg_level = IPPROTO_SCTP; + cmsg->cmsg_type = SCTP_SNDRCV; + cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo)); + + /* Initialize the payload */ + sri = (struct sctp_sndrcvinfo*) CMSG_DATA(cmsg); + memset(sri, 0, sizeof (*sri)); + + if (cdata->streamNumber > 0) { + sri->sinfo_stream = cdata->streamNumber; + } + if (cdata->assocId > 0) { + sri->sinfo_assoc_id = cdata->assocId; + } + if (cdata->unordered == JNI_TRUE) { + sri->sinfo_flags = sri->sinfo_flags | SCTP_UNORDERED; + } + + if (cdata->ppid > 0) { + sri->sinfo_ppid = htonl(cdata->ppid); + } + + /* Sum of the length of all control messages in the buffer. */ + msg->msg_controllen = cmsg->cmsg_len; +} + +// TODO: test: can create send failed without any data? if so need to +// update API so that buffer can be null if no data. +void handleSendFailed + (JNIEnv* env, int fd, jobject resultContainerObj, struct sctp_send_failed *ssf, + int read, jboolean isEOR, struct sockaddr* sap) { + jobject bufferObj = NULL, resultObj, isaObj; + char *addressP; + struct sctp_sndrcvinfo *sri; + int remaining, dataLength; + + /* the actual undelivered message data is directly after the ssf */ + int dataOffset = sizeof(struct sctp_send_failed); + + sri = (struct sctp_sndrcvinfo*) &ssf->ssf_info; + + /* the number of bytes remaining to be read in the sctp_send_failed notif*/ + remaining = ssf->ssf_length - read; + + /* the size of the actual undelivered message */ + dataLength = ssf->ssf_length - dataOffset; + + /* retrieved address from sockaddr */ + isaObj = SockAddrToInetSocketAddress(env, sap); + + /* data retrieved from sff_data */ + if (dataLength > 0) { + struct iovec iov[1]; + struct msghdr msg[1]; + int rv, alreadyRead; + char *dataP = (char*) ssf; + dataP += dataOffset; + + if ((addressP = malloc(dataLength)) == NULL) { + JNU_ThrowOutOfMemoryError(env, "handleSendFailed"); + return; + } + + memset(msg, 0, sizeof (*msg)); + msg->msg_iov = iov; + msg->msg_iovlen = 1; + + bufferObj = (*env)->NewDirectByteBuffer(env, addressP, dataLength); + CHECK_NULL(bufferObj); + + alreadyRead = read - dataOffset; + if (alreadyRead > 0) { + memcpy(addressP, /*ssf->ssf_data*/ dataP, alreadyRead); + iov->iov_base = addressP + alreadyRead; + iov->iov_len = dataLength - alreadyRead; + } else { + iov->iov_base = addressP; + iov->iov_len = dataLength; + } + + if (remaining > 0) { + if ((rv = recvmsg(fd, msg, 0)) < 0) { + fprintf(stdout, "\nNative: handleSFN: recvmsg failed: errno = %d ", errno); + handleSocketError(env, errno); + return; + } + + if (rv != (dataLength - alreadyRead) || !(msg->msg_flags & MSG_EOR)) { + //TODO: assert false: "should not reach here"; + return; + } + // TODO: Set and document (in API) buffers position. + } + } + + /* create SctpSendFailed */ + resultObj = (*env)->NewObject(env, ssf_class, ssf_ctrID, ssf->ssf_assoc_id, + sri->sinfo_stream, ssf->ssf_error, isaObj, bufferObj); + CHECK_NULL(resultObj); + (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); + (*env)->SetIntField(env, resultContainerObj, src_typeID, + sun_nio_ch_SctpResultContainer_SEND_FAILED); +} + +void handleAssocChange + (JNIEnv* env, jobject resultContainerObj, struct sctp_assoc_change *sac) { + jobject resultObj; + int state = 0; + + switch (sac->sac_state) { + case SCTP_COMM_UP : + state = sun_nio_ch_SctpAssocChange_SCTP_COMM_UP; + break; + case SCTP_COMM_LOST : + state = sun_nio_ch_SctpAssocChange_SCTP_COMM_LOST; + break; + case SCTP_RESTART : + state = sun_nio_ch_SctpAssocChange_SCTP_RESTART; + break; + case SCTP_SHUTDOWN_COMP : + state = sun_nio_ch_SctpAssocChange_SCTP_SHUTDOWN; + break; + case SCTP_CANT_STR_ASSOC : + state = sun_nio_ch_SctpAssocChange_SCTP_CANT_START; + } + + /* create SctpAssociationChanged */ + resultObj = (*env)->NewObject(env, sac_class, sac_ctrID, sac->sac_assoc_id, + state, sac->sac_outbound_streams, sac->sac_inbound_streams); + CHECK_NULL(resultObj); + (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); + (*env)->SetIntField(env, resultContainerObj, src_typeID, + sun_nio_ch_SctpResultContainer_ASSOCIATION_CHANGED); +} + +void handleShutdown + (JNIEnv* env, jobject resultContainerObj, struct sctp_shutdown_event* sse) { + /* create SctpShutdown */ + jobject resultObj = (*env)->NewObject(env, ss_class, ss_ctrID, sse->sse_assoc_id); + CHECK_NULL(resultObj); + (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); + (*env)->SetIntField(env, resultContainerObj, src_typeID, + sun_nio_ch_SctpResultContainer_SHUTDOWN); +} + +void handlePeerAddrChange + (JNIEnv* env, jobject resultContainerObj, struct sctp_paddr_change* spc) { + int event = 0; + jobject addressObj, resultObj; + unsigned int state = spc->spc_state; + + switch (state) { + case SCTP_ADDR_AVAILABLE : + event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_AVAILABLE; + break; + case SCTP_ADDR_UNREACHABLE : + event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_UNREACHABLE; + break; + case SCTP_ADDR_REMOVED : + event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_REMOVED; + break; + case SCTP_ADDR_ADDED : + event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_ADDED; + break; + case SCTP_ADDR_MADE_PRIM : + event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_MADE_PRIM; +#ifdef __linux__ /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */ + break; + case SCTP_ADDR_CONFIRMED : + event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_CONFIRMED; +#endif /* __linux__ */ + } + + addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr); + + /* create SctpPeerAddressChanged */ + resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id, + addressObj, event); + CHECK_NULL(resultObj); + (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); + (*env)->SetIntField(env, resultContainerObj, src_typeID, + sun_nio_ch_SctpResultContainer_PEER_ADDRESS_CHANGED); +} + +void handleUninteresting + (union sctp_notification *snp) { + //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type); +} + +/** + * Handle notifications from the SCTP stack. + * Returns JNI_TRUE if the notification is one that is of interest to the + * Java API, otherwise JNI_FALSE. + */ +jboolean handleNotification + (JNIEnv* env, int fd, jobject resultContainerObj, union sctp_notification* snp, + int read, jboolean isEOR, struct sockaddr* sap) { + switch (snp->sn_header.sn_type) { + case SCTP_SEND_FAILED: + handleSendFailed(env, fd, resultContainerObj, &snp->sn_send_failed, + read, isEOR, sap); + return JNI_TRUE; + case SCTP_ASSOC_CHANGE: + handleAssocChange(env, resultContainerObj, &snp->sn_assoc_change); + return JNI_TRUE; + case SCTP_SHUTDOWN_EVENT: + handleShutdown(env, resultContainerObj, &snp->sn_shutdown_event); + return JNI_TRUE; + case SCTP_PEER_ADDR_CHANGE: + handlePeerAddrChange(env, resultContainerObj, &snp->sn_paddr_change); + return JNI_TRUE; + default : + /* the Java API is not interested in this event, maybe we are? */ + handleUninteresting(snp); + } + return JNI_FALSE; +} + +void handleMessage + (JNIEnv* env, jobject resultContainerObj, struct msghdr* msg,int read, + jboolean isEOR, struct sockaddr* sap) { + jobject isa, resultObj; + struct controlData cdata[1]; + + if (read == 0) { + /* we reached EOF */ + read = -1; + } + + isa = SockAddrToInetSocketAddress(env, sap); + getControlData(msg, cdata); + + /* create SctpMessageInfoImpl */ + resultObj = (*env)->NewObject(env, smi_class, smi_ctrID, cdata->assocId, + isa, read, cdata->streamNumber, + isEOR ? JNI_TRUE : JNI_FALSE, + cdata->unordered, cdata->ppid); + CHECK_NULL(resultObj); + (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); + (*env)->SetIntField(env, resultContainerObj, src_typeID, + sun_nio_ch_SctpResultContainer_MESSAGE); +} + +/* + * Class: sun_nio_ch_SctpChannelImpl + * Method: receive0 + * Signature: (ILsun/nio/ch/SctpResultContainer;JI)I + */ +JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0 + (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj, + jlong address, jint length) { + SOCKADDR sa; + int sa_len = sizeof(sa); + ssize_t rv = 0; + jlong *addr = jlong_to_ptr(address); + struct iovec iov[1]; + struct msghdr msg[1]; + char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))]; + + /* Set up the msghdr structure for receiving */ + memset(msg, 0, sizeof (*msg)); + msg->msg_name = &sa; + msg->msg_namelen = sa_len; + iov->iov_base = addr; + iov->iov_len = length; + msg->msg_iov = iov; + msg->msg_iovlen = 1; + msg->msg_control = cbuf; + msg->msg_controllen = sizeof(cbuf); + msg->msg_flags = 0; + + do { + if ((rv = recvmsg(fd, msg, 0)) < 0) { + if (errno == EWOULDBLOCK) { + return IOS_UNAVAILABLE; + } else if (errno == EINTR) { + return IOS_INTERRUPTED; + +#ifdef __linux__ + } else if (errno == ENOTCONN) { + /* ENOTCONN when EOF reached */ + rv = 0; + /* there will be no control data */ + msg->msg_controllen = 0; +#endif /* __linux__ */ + + } else { + handleSocketError(env, errno); + return 0; + } + } + + if (msg->msg_flags & MSG_NOTIFICATION) { + char *bufp = (char*)addr; + union sctp_notification *snp; + + if (!(msg->msg_flags & MSG_EOR) && length < NOTIFICATION_BUFFER_SIZE) { + char buf[NOTIFICATION_BUFFER_SIZE]; + int rvSAVE = rv; + memcpy(buf, addr, rv); + iov->iov_base = buf + rv; + iov->iov_len = NOTIFICATION_BUFFER_SIZE - rv; + if ((rv = recvmsg(fd, msg, 0)) < 0) { + handleSocketError(env, errno); + return 0; + } + bufp = buf; + rv += rvSAVE; + } + snp = (union sctp_notification *) bufp; + if (handleNotification(env, fd, resultContainerObj, snp, rv, + (msg->msg_flags & MSG_EOR), + (struct sockaddr*)&sa ) == JNI_TRUE) { + /* We have received a notification that is of interest to + to the Java API. The appropriate notification will be + set in the result container. */ + return 0; + } + + // set iov back to addr, and reset msg_controllen + iov->iov_base = addr; + iov->iov_len = length; + msg->msg_control = cbuf; + msg->msg_controllen = sizeof(cbuf); + } + } while (msg->msg_flags & MSG_NOTIFICATION); + + handleMessage(env, resultContainerObj, msg, rv, + (msg->msg_flags & MSG_EOR), (struct sockaddr*)&sa); + return rv; +} + +/* + * Class: sun_nio_ch_SctpChannelImpl + * Method: send0 + * Signature: (IJILjava/net/SocketAddress;IIZI)I + */ +JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_send0 + (JNIEnv *env, jclass klass, jint fd, jlong address, jint length, + jobject saTarget, jint assocId, jint streamNumber, jboolean unordered, + jint ppid) { + SOCKADDR sa; + int sa_len = sizeof(sa); + ssize_t rv = 0; + jlong *addr = jlong_to_ptr(address); + struct iovec iov[1]; + struct msghdr msg[1]; + int cbuf_size = CMSG_SPACE(sizeof (struct sctp_sndrcvinfo)); + char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))]; + struct controlData cdata[1]; + + /* SctpChannel: + * saTarget may contain the preferred address or NULL to use primary, + * assocId will always be -1 + * SctpMultiChannell: + * Setup new association, saTarget will contain address, assocId = -1 + * Association already existing, assocId != -1, saTarget = preferred addr + */ + if (saTarget != NULL /*&& assocId <= 0*/) { + + jobject targetAddress = (*env)->GetObjectField(env, saTarget, isa_addrID); + jint targetPort = (*env)->GetIntField(env, saTarget, isa_portID); + + if (NET_InetAddressToSockaddr(env, targetAddress, targetPort, + (struct sockaddr *)&sa, + &sa_len, JNI_TRUE) != 0) { + return IOS_THROWN; + } + } else { + memset(&sa, '\x0', sa_len); + sa_len = 0; + } + + /* Set up the msghdr structure for sending */ + memset(msg, 0, sizeof (*msg)); + memset(cbuf, 0, cbuf_size); + msg->msg_name = &sa; + msg->msg_namelen = sa_len; + iov->iov_base = addr; + iov->iov_len = length; + msg->msg_iov = iov; + msg->msg_iovlen = 1; + msg->msg_control = cbuf; + msg->msg_controllen = cbuf_size; + msg->msg_flags = 0; + + cdata->streamNumber = streamNumber; + cdata->assocId = assocId; + cdata->unordered = unordered; + cdata->ppid = ppid; + setControlData(msg, cdata); + + if ((rv = sendmsg(fd, msg, 0)) < 0) { + if (errno == EWOULDBLOCK) { + return IOS_UNAVAILABLE; + } else if (errno == EINTR) { + return IOS_INTERRUPTED; + } else if (errno == EPIPE) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Socket is shutdown for writing"); + } else { + handleSocketError(env, errno); + return 0; + } + } + + return rv; +} + +/* + * Class: sun_nio_ch_SctpChannelImpl + * Method: checkConnect + * Signature: (Ljava/io/FileDescriptor;ZZ)I + */ +JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_checkConnect + (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) { + return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this, + fdo, block, ready); +} + diff --git a/src/solaris/native/sun/nio/ch/SctpNet.c b/src/solaris/native/sun/nio/ch/SctpNet.c new file mode 100644 index 0000000000000000000000000000000000000000..d1b3b2f03f0f22a383288707b66fd594684191c4 --- /dev/null +++ b/src/solaris/native/sun/nio/ch/SctpNet.c @@ -0,0 +1,609 @@ +/* + * 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. + */ + +#include <stdlib.h> +#include <string.h> +#include <dlfcn.h> + +#include "Sctp.h" +#include "jni.h" +#include "jni_util.h" +#include "nio_util.h" +#include "nio.h" +#include "net_util.h" +#include "net_util_md.h" +#include "sun_nio_ch_SctpNet.h" +#include "sun_nio_ch_SctpStdSocketOption.h" + +static jclass isaCls = 0; +static jmethodID isaCtrID = 0; + +static const char* nativeSctpLib = "libsctp.so.1"; +static jboolean funcsLoaded = JNI_FALSE; + +JNIEXPORT jint JNICALL JNI_OnLoad + (JavaVM *vm, void *reserved) { + return JNI_VERSION_1_2; +} + +/** + * Loads the native sctp library that contains the socket extension + * functions, as well as locating the individual functions. + * There will be a pending exception if this method returns false. + */ +jboolean loadSocketExtensionFuncs + (JNIEnv* env) { + if (dlopen(nativeSctpLib, RTLD_GLOBAL | RTLD_LAZY) == NULL) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + dlerror()); + return JNI_FALSE; + } + + if ((nio_sctp_getladdrs = (sctp_getladdrs_func*) + dlsym(RTLD_DEFAULT, "sctp_getladdrs")) == NULL) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + dlerror()); + return JNI_FALSE; + } + + if ((nio_sctp_freeladdrs = (sctp_freeladdrs_func*) + dlsym(RTLD_DEFAULT, "sctp_freeladdrs")) == NULL) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + dlerror()); + return JNI_FALSE; + } + + if ((nio_sctp_getpaddrs = (sctp_getpaddrs_func*) + dlsym(RTLD_DEFAULT, "sctp_getpaddrs")) == NULL) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + dlerror()); + return JNI_FALSE; + } + + if ((nio_sctp_freepaddrs = (sctp_freepaddrs_func*) + dlsym(RTLD_DEFAULT, "sctp_freepaddrs")) == NULL) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + dlerror()); + return JNI_FALSE; + } + + if ((nio_sctp_bindx = (sctp_bindx_func*) + dlsym(RTLD_DEFAULT, "sctp_bindx")) == NULL) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + dlerror()); + return JNI_FALSE; + } + + funcsLoaded = JNI_TRUE; + return JNI_TRUE; +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: socket0 + * Signature: (Z)I + */ +JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpNet_socket0 + (JNIEnv *env, jclass klass, jboolean oneToOne) { + int fd; + struct sctp_event_subscribe event; + + /* Try to load the socket API extension functions */ + if (!funcsLoaded && !loadSocketExtensionFuncs(env)) { + return 0; + } + + fd = socket(ipv6_available() ? AF_INET6 : AF_INET, + (oneToOne ? SOCK_STREAM : SOCK_SEQPACKET), IPPROTO_SCTP); + + if (fd < 0) { + return handleSocketError(env, errno); + } + + /* Enable events */ + memset(&event, 0, sizeof(event)); + event.sctp_data_io_event = 1; + event.sctp_association_event = 1; + event.sctp_address_event = 1; + event.sctp_send_failure_event = 1; + //event.sctp_peer_error_event = 1; + event.sctp_shutdown_event = 1; + //event.sctp_partial_delivery_event = 1; + //event.sctp_adaptation_layer_event = 1; + if (setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(event)) != 0) { + handleSocketError(env, errno); + } + return fd; +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: bindx + * Signature: (I[Ljava/net/InetAddress;IIZ)V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_bindx + (JNIEnv *env, jclass klass, jint fd, jobjectArray addrs, jint port, + jint addrsLength, jboolean add, jboolean preferIPv6) { + SOCKADDR *sap, *tmpSap; + int i, sa_len = sizeof(SOCKADDR); + jobject ia; + + if (addrsLength < 1) + return; + + if ((sap = calloc(addrsLength, sa_len)) == NULL) { + JNU_ThrowOutOfMemoryError(env, "heap allocation failure"); + return; + } + + tmpSap = sap; + for (i=0; i<addrsLength; i++) { + ia = (*env)->GetObjectArrayElement(env, addrs, i); + if (NET_InetAddressToSockaddr(env, ia, port, (struct sockaddr*)tmpSap, + &sa_len, preferIPv6) != 0) { + free(sap); + return; + } + tmpSap++; + } + + if (nio_sctp_bindx(fd, (void*)sap, addrsLength, add ? SCTP_BINDX_ADD_ADDR : + SCTP_BINDX_REM_ADDR) != 0) { + handleSocketError(env, errno); + } + + free(sap); +} + +void initializeISA + (JNIEnv* env) { + if (isaCls == 0) { + jclass c = (*env)->FindClass(env, "java/net/InetSocketAddress"); + CHECK_NULL(c); + isaCls = (*env)->NewGlobalRef(env, c); + CHECK_NULL(isaCls); + (*env)->DeleteLocalRef(env, c); + isaCtrID = (*env)->GetMethodID(env, isaCls, "<init>", + "(Ljava/net/InetAddress;I)V"); + } +} + +jobject SockAddrToInetSocketAddress + (JNIEnv *env, struct sockaddr* sap) { + int port = 0; + + jobject ia = NET_SockaddrToInetAddress(env, sap, &port); + if (ia == NULL) + return NULL; + + if (isaCls == 0) { + initializeISA(env); + CHECK_NULL_RETURN(isaCls, NULL); + } + + return (*env)->NewObject(env, isaCls, isaCtrID, ia, port); +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: getLocalAddresses0 + * Signature: (I)[Ljava/net/SocketAddress; + */ +JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_SctpNet_getLocalAddresses0 + (JNIEnv *env, jclass klass, jint fd) { + void *addr_buf, *laddr; + struct sockaddr* sap; + int i, addrCount; + jobjectArray isaa; + +#ifdef __solaris__ + if ((addrCount = nio_sctp_getladdrs(fd, 0, (void **)&addr_buf)) == -1) { +#else /* __linux__ */ + if ((addrCount = nio_sctp_getladdrs(fd, 0, (struct sockaddr **)&addr_buf)) == -1) { +#endif + handleSocketError(env, errno); + return NULL; + } + + if (addrCount < 1) + return NULL; + + if (isaCls == 0) { + initializeISA(env); + CHECK_NULL_RETURN(isaCls, NULL); + } + + isaa = (*env)->NewObjectArray(env, addrCount, isaCls, NULL); + if (isaa == NULL) { + nio_sctp_freeladdrs(addr_buf); + return NULL; + } + + laddr = addr_buf; + for (i=0; i<addrCount; i++) { + int port = 0; + jobject isa = NULL, ia; + sap = (struct sockaddr*)addr_buf; + ia = NET_SockaddrToInetAddress(env, sap, &port); + if (ia != NULL) + isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port); + if (isa != NULL) + (*env)->SetObjectArrayElement(env, isaa, i, isa); + + if (sap->sa_family == AF_INET) + addr_buf = ((struct sockaddr_in*)addr_buf) + 1; + else + addr_buf = ((struct sockaddr_in6*)addr_buf) + 1; + } + + nio_sctp_freeladdrs(laddr); + return isaa; +} + +jobjectArray getRemoteAddresses + (JNIEnv *env, jint fd, sctp_assoc_t id) { + void *addr_buf, *paddr; + struct sockaddr* sap; + int i, addrCount; + jobjectArray isaa; + +#if __solaris__ + if ((addrCount = nio_sctp_getpaddrs(fd, id, (void **)&addr_buf)) == -1) { +#else /* __linux__ */ + if ((addrCount = nio_sctp_getpaddrs(fd, id, (struct sockaddr**)&addr_buf)) == -1) { +#endif + handleSocketError(env, errno); + return NULL; + } + + if (addrCount < 1) + return NULL; + + if (isaCls == 0) { + initializeISA(env); + CHECK_NULL_RETURN(isaCls, NULL); + } + + isaa = (*env)->NewObjectArray(env, addrCount, isaCls, NULL); + if (isaa == NULL) { + nio_sctp_freepaddrs(addr_buf); + return NULL; + } + + paddr = addr_buf; + for (i=0; i<addrCount; i++) { + jobject ia, isa = NULL; + int port; + sap = (struct sockaddr*)addr_buf; + ia = NET_SockaddrToInetAddress(env, sap, &port); + if (ia != NULL) + isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port); + if (isa != NULL) + (*env)->SetObjectArrayElement(env, isaa, i, isa); + + if (sap->sa_family == AF_INET) + addr_buf = ((struct sockaddr_in*)addr_buf) + 1; + else + addr_buf = ((struct sockaddr_in6*)addr_buf) + 1; + } + + nio_sctp_freepaddrs(paddr); + + return isaa; +} + + /* + * Class: sun_nio_ch_SctpNet + * Method: getRemoteAddresses0 + * Signature: (II)[Ljava/net/SocketAddress; + */ +JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_SctpNet_getRemoteAddresses0 + (JNIEnv *env, jclass klass, jint fd, jint assocId) { + return getRemoteAddresses(env, fd, assocId); +} + +/* Map the Java level option to the native level */ +int mapSocketOption + (jint cmd, int *level, int *optname) { + static struct { + jint cmd; + int level; + int optname; + } const opts[] = { + { sun_nio_ch_SctpStdSocketOption_SCTP_DISABLE_FRAGMENTS, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS }, + { sun_nio_ch_SctpStdSocketOption_SCTP_EXPLICIT_COMPLETE, IPPROTO_SCTP, SCTP_EXPLICIT_EOR }, + { sun_nio_ch_SctpStdSocketOption_SCTP_FRAGMENT_INTERLEAVE, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE }, + { sun_nio_ch_SctpStdSocketOption_SCTP_NODELAY, IPPROTO_SCTP, SCTP_NODELAY }, + { sun_nio_ch_SctpStdSocketOption_SO_SNDBUF, SOL_SOCKET, SO_SNDBUF }, + { sun_nio_ch_SctpStdSocketOption_SO_RCVBUF, SOL_SOCKET, SO_RCVBUF }, + { sun_nio_ch_SctpStdSocketOption_SO_LINGER, SOL_SOCKET, SO_LINGER } }; + + int i; + for (i=0; i<(int)(sizeof(opts) / sizeof(opts[0])); i++) { + if (cmd == opts[i].cmd) { + *level = opts[i].level; + *optname = opts[i].optname; + return 0; + } + } + + /* not found */ + return -1; +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: setIntOption0 + * Signature: (III)V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setIntOption0 + (JNIEnv *env, jclass klass, jint fd, jint opt, int arg) { + int klevel, kopt; + int result; + struct linger linger; + void *parg; + int arglen; + + if (mapSocketOption(opt, &klevel, &kopt) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "Unsupported socket option"); + return; + } + + if (opt == sun_nio_ch_SctpStdSocketOption_SO_LINGER) { + parg = (void *)&linger; + arglen = sizeof(linger); + if (arg >= 0) { + linger.l_onoff = 1; + linger.l_linger = arg; + } else { + linger.l_onoff = 0; + linger.l_linger = 0; + } + } else { + parg = (void *)&arg; + arglen = sizeof(arg); + } + + if (setsockopt(fd, klevel, kopt, parg, arglen) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "sun_nio_ch_SctpNet.setIntOption0"); + } +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: getIntOption0 + * Signature: (II)I + */ +JNIEXPORT int JNICALL Java_sun_nio_ch_SctpNet_getIntOption0 + (JNIEnv *env, jclass klass, jint fd, jint opt) { + int klevel, kopt; + int result; + struct linger linger; + void *arg; + unsigned int arglen; + + if (mapSocketOption(opt, &klevel, &kopt) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "Unsupported socket option"); + return -1; + } + + if (opt == sun_nio_ch_SctpStdSocketOption_SO_LINGER) { + arg = (void *)&linger; + arglen = sizeof(linger); + } else { + arg = (void *)&result; + arglen = sizeof(result); + } + + if (getsockopt(fd, klevel, kopt, arg, &arglen) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "sun.nio.ch.Net.getIntOption"); + return -1; + } + + if (opt == sun_nio_ch_SctpStdSocketOption_SO_LINGER) + return linger.l_onoff ? linger.l_linger : -1; + else + return result; +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: getPrimAddrOption0 + * Signature: (II)Ljava/net/SocketAddress; + */ +JNIEXPORT jobject JNICALL Java_sun_nio_ch_SctpNet_getPrimAddrOption0 + (JNIEnv *env, jclass klass, jint fd, jint assocId) { + struct sctp_setprim prim; + struct sockaddr_storage ss; + int ss_len = sizeof(ss); + unsigned int prim_len = sizeof(prim); + + prim.ssp_assoc_id = assocId; + prim.ssp_addr = ss; + + if (getsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, &prim_len) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "sun.nio.ch.SctpNet.getPrimAddrOption0"); + return NULL; + } + + return SockAddrToInetSocketAddress(env, (struct sockaddr*)&ss); +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: setPrimAddrOption0 + * Signature: (IILjava/net/InetAddress;I)V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setPrimAddrOption0 + (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) { + struct sctp_setprim prim; + struct sockaddr_storage ss; + int ss_len = sizeof(ss); + + if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&ss, + &ss_len, JNI_TRUE) != 0) { + return; + } + + prim.ssp_assoc_id = assocId; + prim.ssp_addr = ss; + + if (setsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, sizeof(prim)) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "sun.nio.ch.SctpNet.setPrimAddrOption0"); + } +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: setPeerPrimAddrOption0 + * Signature: (IILjava/net/InetAddress;I)V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setPeerPrimAddrOption0 + (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) { + struct sctp_setpeerprim prim; + struct sockaddr_storage ss; + int ss_len = sizeof(ss); + + if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&ss, + &ss_len, JNI_TRUE) != 0) { + return; + } + + prim.sspp_assoc_id = assocId; + prim.sspp_addr = ss; + + if (setsockopt(fd, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, &prim, + sizeof(prim)) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "sun.nio.ch.SctpNet.setPeerPrimAddrOption0"); + } +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: getInitMsgOption0 + * Signature: (I[I)V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_getInitMsgOption0 + (JNIEnv *env, jclass klass, jint fd, jintArray retVal) { + struct sctp_initmsg sctp_initmsg; + unsigned int sim_len = sizeof(sctp_initmsg); + int vals[2]; + + if (getsockopt(fd, IPPROTO_SCTP, SCTP_INITMSG, &sctp_initmsg, + &sim_len) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "sun.nio.ch.SctpNet.getInitMsgOption0"); + return; + } + + vals[0] = sctp_initmsg.sinit_max_instreams; + vals[1] = sctp_initmsg.sinit_num_ostreams; + (*env)->SetIntArrayRegion(env, retVal, 0, 2, vals); +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: setInitMsgOption0 + * Signature: (III)V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setInitMsgOption0 + (JNIEnv *env, jclass klass, jint fd, jint inArg, jint outArg) { + struct sctp_initmsg sctp_initmsg; + + sctp_initmsg.sinit_max_instreams = (unsigned int)inArg; + sctp_initmsg.sinit_num_ostreams = (unsigned int)outArg; + sctp_initmsg.sinit_max_attempts = 0; // default + sctp_initmsg.sinit_max_init_timeo = 0; // default + + if (setsockopt(fd, IPPROTO_SCTP, SCTP_INITMSG, &sctp_initmsg, + sizeof(sctp_initmsg)) < 0) { + JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "sun.nio.ch.SctpNet.setInitMsgOption0"); + } +} + +/* + * Class: sun_nio_ch_SctpNet + * Method: shutdown0 + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_shutdown0 + (JNIEnv *env, jclass klass, jint fd, jint assocId) { + int rv; + struct msghdr msg[1]; + struct iovec iov[1]; + int cbuf_size = CMSG_SPACE(sizeof (struct sctp_sndrcvinfo)); + char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))]; + struct cmsghdr* cmsg; + struct sctp_sndrcvinfo *sri; + + /* SctpSocketChannel */ + if (assocId < 0) { + shutdown(fd, SHUT_WR); + return; + } + + memset(msg, 0, sizeof (*msg)); + memset(cbuf, 0, cbuf_size); + msg->msg_name = NULL; + msg->msg_namelen = 0; + iov->iov_base = NULL; + iov->iov_len = 0; + msg->msg_iov = iov; + msg->msg_iovlen = 1; + msg->msg_control = cbuf; + msg->msg_controllen = cbuf_size; + msg->msg_flags = 0; + + cmsg = CMSG_FIRSTHDR(msg); + cmsg->cmsg_level = IPPROTO_SCTP; + cmsg->cmsg_type = SCTP_SNDRCV; + cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo)); + + /* Initialize the payload: */ + sri = (struct sctp_sndrcvinfo*) CMSG_DATA(cmsg); + memset(sri, 0, sizeof (*sri)); + + if (assocId > 0) { + sri->sinfo_assoc_id = assocId; + } + + sri->sinfo_flags = sri->sinfo_flags | SCTP_EOF; + + /* Sum of the length of all control messages in the buffer. */ + msg->msg_controllen = cmsg->cmsg_len; + + if ((rv = sendmsg(fd, msg, 0)) < 0) { + handleSocketError(env, errno); + } +} + diff --git a/src/solaris/native/sun/nio/ch/SctpServerChannelImpl.c b/src/solaris/native/sun/nio/ch/SctpServerChannelImpl.c new file mode 100644 index 0000000000000000000000000000000000000000..ba3742f75fd2644694eeec3f9f22c071def1c2b1 --- /dev/null +++ b/src/solaris/native/sun/nio/ch/SctpServerChannelImpl.c @@ -0,0 +1,53 @@ +/* + * 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. + */ + +#include "sun_nio_ch_SctpServerChannelImpl.h" + +extern void Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(JNIEnv* env, + jclass c); + +extern jint Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv* env, + jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa); + +/* + * Class: sun_nio_ch_SctpServerChannelImpl + * Method: initIDs + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_sun_nio_ch_SctpServerChannelImpl_initIDs + (JNIEnv* env, jclass c) { + Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(env, c); +} + +/* + * Class: sun_nio_ch_SctpServerChannelImpl + * Method: accept0 + * Signature: (Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;[Ljava/net/InetSocketAddress;)I + */ +JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpServerChannelImpl_accept0 + (JNIEnv* env, jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa) { + return Java_sun_nio_ch_ServerSocketChannelImpl_accept0(env, this, + ssfdo, newfdo, isaa); +} diff --git a/src/solaris/native/sun/xawt/XToolkit.c b/src/solaris/native/sun/xawt/XToolkit.c index ac3fecc0c7686705f9a08da77492b1774d969e0e..3b9669cb92ba6b57e99de902439d490585b8556c 100644 --- a/src/solaris/native/sun/xawt/XToolkit.c +++ b/src/solaris/native/sun/xawt/XToolkit.c @@ -182,9 +182,6 @@ Java_java_awt_Component_initIDs (*env)->GetMethodID(env, cls, "getLocationOnScreen_NoTreeLock", "()Ljava/awt/Point;"); - componentIDs.resetGCMID = - (*env)->GetMethodID(env, cls, "resetGC", "()V"); - keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent"); DASSERT (keyclass != NULL); @@ -197,9 +194,6 @@ Java_java_awt_Component_initIDs "Lsun/awt/AppContext;"); (*env)->DeleteLocalRef(env, keyclass); - - DASSERT(componentIDs.resetGCMID); - } diff --git a/src/solaris/native/sun/xawt/XlibWrapper.c b/src/solaris/native/sun/xawt/XlibWrapper.c index aee5cf9b080eb102a76a3519d187658a4176a159..93953af16a737f56c25d262b87a5a3f1cdc908ba 100644 --- a/src/solaris/native/sun/xawt/XlibWrapper.c +++ b/src/solaris/native/sun/xawt/XlibWrapper.c @@ -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 @@ -42,7 +42,9 @@ #include <jvm.h> #include <Region.h> +#include "utility/rect.h" +#include <X11/XKBlib.h> #if defined(DEBUG) || defined(INTERNAL_BUILD) static jmethodID lockIsHeldMID = NULL; @@ -303,6 +305,20 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRestackWindows } +/* + * Class: XlibWrapper + * Method: XConfigureWindow + * Signature: (JJJJ)V + */ +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow +(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask, + jlong values) +{ + AWT_CHECK_HAVE_LOCK(); + XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window, + (unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values)); +} + /* * Class: XlibWrapper * Method: XSetInputFocus @@ -434,6 +450,79 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSelectInput XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask); } +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents +(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change, jlong values_for_bits) +{ + AWT_CHECK_HAVE_LOCK(); + XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device, + (unsigned long)bits_to_change, + (unsigned long)values_for_bits); +} +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails +(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type, jlong bits_to_change, jlong values_for_bits) +{ + AWT_CHECK_HAVE_LOCK(); + XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device, + (unsigned int) event_type, + (unsigned long)bits_to_change, + (unsigned long)values_for_bits); +} +JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension +(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn, + jlong error_rtrn, jlong major_in_out, jlong minor_in_out) +{ + AWT_CHECK_HAVE_LOCK(); + return XkbQueryExtension( (Display *) jlong_to_ptr(display), + (int *) jlong_to_ptr(opcode_rtrn), + (int *) jlong_to_ptr(event_rtrn), + (int *) jlong_to_ptr(error_rtrn), + (int *) jlong_to_ptr(major_in_out), + (int *) jlong_to_ptr(minor_in_out)); +} +JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion +(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out) +{ + AWT_CHECK_HAVE_LOCK(); + *((int *)lib_major_in_out) = XkbMajorVersion; + *((int *)lib_minor_in_out) = XkbMinorVersion; + return XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out), (int *)jlong_to_ptr(lib_minor_in_out)); +} + +JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap +(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec) +{ + AWT_CHECK_HAVE_LOCK(); + return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display), + (unsigned int) which, + (unsigned int) device_spec); +} +JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap +(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb) +{ + AWT_CHECK_HAVE_LOCK(); + return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display), + (unsigned int) which, + (XkbDescPtr) jlong_to_ptr(xkb)); +} +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard +(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all) +{ + AWT_CHECK_HAVE_LOCK(); + XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all); +} +JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode +(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn) +{ + Bool b; + b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods, + (unsigned int *)jlong_to_ptr(mods_rtrn), + (KeySym *)jlong_to_ptr(keysym_rtrn)); + //printf("native, input: keycode:0x%0X; mods:0x%0X\n", keycode, mods); + //printf("native, output: keysym:0x%0X; mods:0x%0X\n", *(unsigned int *)jlong_to_ptr(keysym_rtrn), *(unsigned int *)jlong_to_ptr(mods_rtrn)); + return b; +} + + /* * Class: sun_awt_X11_XlibWrapper * Method: XNextEvent @@ -1657,6 +1746,39 @@ Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz, return XKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (int)index); } +JNIEXPORT jint JNICALL +Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz, + jlong display) { + XkbStateRec sr; + AWT_CHECK_HAVE_LOCK(); + memset(&sr, 0, sizeof(XkbStateRec)); + XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr); +// printf("-------------------------------------VVVV\n"); +// printf(" group:0x%0X\n",sr.group); +// printf(" base_group:0x%0X\n",sr.base_group); +// printf(" latched_group:0x%0X\n",sr.latched_group); +// printf(" locked_group:0x%0X\n",sr.locked_group); +// printf(" mods:0x%0X\n",sr.mods); +// printf(" base_mods:0x%0X\n",sr.base_mods); +// printf(" latched_mods:0x%0X\n",sr.latched_mods); +// printf(" locked_mods:0x%0X\n",sr.locked_mods); +// printf(" compat_state:0x%0X\n",sr.compat_state); +// printf(" grab_mods:0x%0X\n",sr.grab_mods); +// printf(" compat_grab_mods:0x%0X\n",sr.compat_grab_mods); +// printf(" lookup_mods:0x%0X\n",sr.lookup_mods); +// printf(" compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods); +// printf(" ptr_buttons:0x%0X\n",sr.ptr_buttons); +// printf("-------------------------------------^^^^\n"); + return (jint)(sr.group); +} +JNIEXPORT jlong JNICALL +Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz, + jlong display, jint keycode, + jint group, jint level) { + AWT_CHECK_HAVE_LOCK(); + return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level); +} + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz, jlong display, jlong keysym) { @@ -1945,3 +2067,77 @@ Java_sun_awt_X11_XlibWrapper_SetRectangularShape ShapeBounding, 0, 0, None, ShapeSet); } } + +/* + * Class: XlibWrapper + * Method: SetZOrder + */ + +JNIEXPORT void JNICALL +Java_sun_awt_X11_XlibWrapper_SetZOrder +(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above) +{ + AWT_CHECK_HAVE_LOCK(); + + XWindowChanges wc; + wc.sibling = (Window)jlong_to_ptr(above); + + unsigned int value_mask = CWStackMode; + + if (above == 0) { + wc.stack_mode = Above; + } else { + wc.stack_mode = Below; + value_mask |= CWSibling; + } + + XConfigureWindow((Display *)jlong_to_ptr(display), + (Window)jlong_to_ptr(window), + value_mask, &wc ); +} + +/* + * Class: XlibWrapper + * Method: SetBitmapShape + */ +JNIEXPORT void JNICALL +Java_sun_awt_X11_XlibWrapper_SetBitmapShape +(JNIEnv *env, jclass clazz, jlong display, jlong window, + jint width, jint height, jintArray bitmap) +{ + jsize len; + jint *values; + jboolean isCopy = JNI_FALSE; + size_t worstBufferSize = (size_t)((width / 2 + 1) * height); + RECT_T * pRect; + + AWT_CHECK_HAVE_LOCK(); + + len = (*env)->GetArrayLength(env, bitmap); + if (len == 0 || len < width * height) { + return; + } + + values = (*env)->GetIntArrayElements(env, bitmap, &isCopy); + if (JNU_IsNull(env, values)) { + return; + } + + pRect = (RECT_T *)malloc(worstBufferSize * sizeof(RECT_T)); + + /* Note: the values[0] and values[1] are supposed to contain the width + * and height (see XIconInfo.getIntData() for details). So, we do +2. + */ + int numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height, + (unsigned char *)(values + 2), pRect); + + XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded); + XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded); + + free(pRect); + + (*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT); +} + diff --git a/src/windows/classes/sun/awt/Win32GraphicsConfig.java b/src/windows/classes/sun/awt/Win32GraphicsConfig.java index d24ce0eb1bb7dafe576d93c38648aac655a7f19a..2eefb33f1ce8184369c2a5d8cd8b67e9701265f0 100644 --- a/src/windows/classes/sun/awt/Win32GraphicsConfig.java +++ b/src/windows/classes/sun/awt/Win32GraphicsConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -331,4 +331,12 @@ public class Win32GraphicsConfig extends GraphicsConfiguration } // the rest of the flip actions are not supported } + + /* + @Override + */ + public boolean isTranslucencyCapable() { + //XXX: worth checking if 8-bit? Anyway, it doesn't hurt. + return true; + } } diff --git a/src/windows/classes/sun/awt/Win32GraphicsDevice.java b/src/windows/classes/sun/awt/Win32GraphicsDevice.java index ba4769813d801b61ee08ba671d6de7ea0330392a..1da339ce9f17d69c659df8a560b3ce9e02b9fed6 100644 --- a/src/windows/classes/sun/awt/Win32GraphicsDevice.java +++ b/src/windows/classes/sun/awt/Win32GraphicsDevice.java @@ -380,7 +380,6 @@ public class Win32GraphicsDevice extends GraphicsDevice implements // fix for 4868278 peer.updateGC(); - peer.resetTargetGC(); } } diff --git a/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java b/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java index 73b73dbb033d58e0d5424510f82978453bd31287..69723c1131a7494b4f29f125d9caa83d2c304a10 100644 --- a/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java +++ b/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -398,4 +398,11 @@ public class Win32GraphicsEnvironment public boolean isDisplayLocal() { return true; } + + /** + * Used to find out if the OS is Windows Vista or later. + * + * @return {@code true} if the OS is Vista or later, {@code false} otherwise + */ + public static native boolean isVistaOS(); } diff --git a/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java b/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java index 418dc8f59dbb83417600c6f6ff5a1702d2beeb11..bc81b80e7931e85842640bb1965f25cd4d454a40 100644 --- a/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java +++ b/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java @@ -32,6 +32,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.*; +import java.util.concurrent.*; import javax.swing.SwingConstants; // NOTE: This class supersedes Win32ShellFolder, which was removed from @@ -184,15 +185,20 @@ final class Win32ShellFolder2 extends ShellFolder { boolean disposed; public void dispose() { if (disposed) return; - if (relativePIDL != 0) { - releasePIDL(relativePIDL); - } - if (absolutePIDL != 0) { - releasePIDL(absolutePIDL); - } - if (pIShellFolder != 0) { - releaseIShellFolder(pIShellFolder); - } + ShellFolder.getInvoker().invoke(new Callable<Void>() { + public Void call() throws Exception { + if (relativePIDL != 0) { + releasePIDL(relativePIDL); + } + if (absolutePIDL != 0) { + releasePIDL(absolutePIDL); + } + if (pIShellFolder != 0) { + releaseIShellFolder(pIShellFolder); + } + return null; + } + }); disposed = true; } } @@ -218,50 +224,59 @@ final class Win32ShellFolder2 extends ShellFolder { */ private boolean isPersonal; + private static String composePathForCsidl(int csidl) throws IOException { + String path = getFileSystemPath(csidl); + return path == null + ? ("ShellFolder: 0x" + Integer.toHexString(csidl)) + : path; + } /** * Create a system special shell folder, such as the * desktop or Network Neighborhood. */ - Win32ShellFolder2(int csidl) throws IOException { + Win32ShellFolder2(final int csidl) throws IOException { // Desktop is parent of DRIVES and NETWORK, not necessarily // other special shell folders. - super(null, - (getFileSystemPath(csidl) == null) - ? ("ShellFolder: 0x"+Integer.toHexString(csidl)) : getFileSystemPath(csidl)); - if (csidl == DESKTOP) { - initDesktop(); - } else { - initSpecial(getDesktop().getIShellFolder(), csidl); - // At this point, the native method initSpecial() has set our relativePIDL - // relative to the Desktop, which may not be our immediate parent. We need - // to traverse this ID list and break it into a chain of shell folders from - // the top, with each one having an immediate parent and a relativePIDL - // relative to that parent. - long pIDL = disposer.relativePIDL; - parent = getDesktop(); - while (pIDL != 0) { - // Get a child pidl relative to 'parent' - long childPIDL = copyFirstPIDLEntry(pIDL); - if (childPIDL != 0) { - // Get a handle to the the rest of the ID list - // i,e, parent's grandchilren and down - pIDL = getNextPIDLEntry(pIDL); - if (pIDL != 0) { - // Now we know that parent isn't immediate to 'this' because it - // has a continued ID list. Create a shell folder for this child - // pidl and make it the new 'parent'. - parent = new Win32ShellFolder2((Win32ShellFolder2)parent, childPIDL); - } else { - // No grandchildren means we have arrived at the parent of 'this', - // and childPIDL is directly relative to parent. - disposer.relativePIDL = childPIDL; - } + super(null, composePathForCsidl(csidl)); + ShellFolder.getInvoker().invoke(new Callable<Void>() { + public Void call() throws Exception { + if (csidl == DESKTOP) { + initDesktop(); } else { - break; + initSpecial(getDesktop().getIShellFolder(), csidl); + // At this point, the native method initSpecial() has set our relativePIDL + // relative to the Desktop, which may not be our immediate parent. We need + // to traverse this ID list and break it into a chain of shell folders from + // the top, with each one having an immediate parent and a relativePIDL + // relative to that parent. + long pIDL = disposer.relativePIDL; + parent = getDesktop(); + while (pIDL != 0) { + // Get a child pidl relative to 'parent' + long childPIDL = copyFirstPIDLEntry(pIDL); + if (childPIDL != 0) { + // Get a handle to the the rest of the ID list + // i,e, parent's grandchilren and down + pIDL = getNextPIDLEntry(pIDL); + if (pIDL != 0) { + // Now we know that parent isn't immediate to 'this' because it + // has a continued ID list. Create a shell folder for this child + // pidl and make it the new 'parent'. + parent = new Win32ShellFolder2((Win32ShellFolder2) parent, childPIDL); + } else { + // No grandchildren means we have arrived at the parent of 'this', + // and childPIDL is directly relative to parent. + disposer.relativePIDL = childPIDL; + } + } else { + break; + } + } } + return null; } - } + }); sun.java2d.Disposer.addRecord(this, disposer); } @@ -281,17 +296,26 @@ final class Win32ShellFolder2 extends ShellFolder { /** * Creates a shell folder with a parent and relative PIDL */ - Win32ShellFolder2(Win32ShellFolder2 parent, long relativePIDL) { - super(parent, getFileSystemPath(parent.getIShellFolder(), relativePIDL)); + Win32ShellFolder2(final Win32ShellFolder2 parent, final long relativePIDL) { + super(parent, + ShellFolder.getInvoker().invoke(new Callable<String>() { + public String call() throws Exception { + return getFileSystemPath(parent.getIShellFolder(), relativePIDL); + } + }) + ); this.disposer.relativePIDL = relativePIDL; getAbsolutePath(); sun.java2d.Disposer.addRecord(this, disposer); } // Initializes the desktop shell folder + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native void initDesktop(); + // Initializes a special, non-file system shell folder // from one of the above constants + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native void initSpecial(long desktopIShellFolder, int csidl); /** Marks this folder as being the My Documents (Personal) folder */ @@ -311,26 +335,30 @@ final class Win32ShellFolder2 extends ShellFolder { * drive (normally "C:\"). */ protected Object writeReplace() throws java.io.ObjectStreamException { - if (isFileSystem()) { - return new File(getPath()); - } else { - Win32ShellFolder2 drives = Win32ShellFolderManager2.getDrives(); - if (drives != null) { - File[] driveRoots = drives.listFiles(); - if (driveRoots != null) { - for (int i = 0; i < driveRoots.length; i++) { - if (driveRoots[i] instanceof Win32ShellFolder2) { - Win32ShellFolder2 sf = (Win32ShellFolder2)driveRoots[i]; - if (sf.isFileSystem() && !sf.hasAttribute(ATTRIB_REMOVABLE)) { - return new File(sf.getPath()); + return ShellFolder.getInvoker().invoke(new Callable<File>() { + public File call() throws Exception { + if (isFileSystem()) { + return new File(getPath()); + } else { + Win32ShellFolder2 drives = Win32ShellFolderManager2.getDrives(); + if (drives != null) { + File[] driveRoots = drives.listFiles(); + if (driveRoots != null) { + for (int i = 0; i < driveRoots.length; i++) { + if (driveRoots[i] instanceof Win32ShellFolder2) { + Win32ShellFolder2 sf = (Win32ShellFolder2) driveRoots[i]; + if (sf.isFileSystem() && !sf.hasAttribute(ATTRIB_REMOVABLE)) { + return new File(sf.getPath()); + } + } } } } + // Ouch, we have no hard drives. Return something "valid" anyway. + return new File("C:\\"); } } - // Ouch, we have no hard drives. Return something "valid" anyway. - return new File("C:\\"); - } + }); } @@ -364,6 +392,7 @@ final class Win32ShellFolder2 extends ShellFolder { static native void releasePIDL(long pIDL); // Release an IShellFolder object + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native void releaseIShellFolder(long pIShellFolder); /** @@ -371,18 +400,28 @@ final class Win32ShellFolder2 extends ShellFolder { */ public long getIShellFolder() { if (disposer.pIShellFolder == 0) { - assert(isDirectory()); - assert(parent != null); - long parentIShellFolder = getParentIShellFolder(); - if (parentIShellFolder == 0) { - throw new InternalError("Parent IShellFolder was null for " + getAbsolutePath()); - } - // We are a directory with a parent and a relative PIDL. - // We want to bind to the parent so we get an IShellFolder instance associated with us. - disposer.pIShellFolder = bindToObject(parentIShellFolder, disposer.relativePIDL); - if (disposer.pIShellFolder == 0) { - throw new InternalError("Unable to bind " + getAbsolutePath() + " to parent"); - } + disposer.pIShellFolder = + ShellFolder.getInvoker().invoke(new Callable<Long>() { + public Long call() throws Exception { + assert(isDirectory()); + assert(parent != null); + long parentIShellFolder = getParentIShellFolder(); + if (parentIShellFolder == 0) { + throw new InternalError("Parent IShellFolder was null for " + + getAbsolutePath()); + } + // We are a directory with a parent and a relative PIDL. + // We want to bind to the parent so we get an + // IShellFolder instance associated with us. + long pIShellFolder = bindToObject(parentIShellFolder, + disposer.relativePIDL); + if (pIShellFolder == 0) { + throw new InternalError("Unable to bind " + + getAbsolutePath() + " to parent"); + } + return pIShellFolder; + } + }); } return disposer.pIShellFolder; } @@ -472,24 +511,42 @@ final class Win32ShellFolder2 extends ShellFolder { return false; } - private static boolean pidlsEqual(long pIShellFolder, long pidl1, long pidl2) { - return (compareIDs(pIShellFolder, pidl1, pidl2) == 0); + private static boolean pidlsEqual(final long pIShellFolder, final long pidl1, final long pidl2) { + return ShellFolder.getInvoker().invoke(new Callable<Boolean>() { + public Boolean call() throws Exception { + return (compareIDs(pIShellFolder, pidl1, pidl2) == 0); + } + }); } + + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native int compareIDs(long pParentIShellFolder, long pidl1, long pidl2); + private Boolean cachedIsFileSystem; + /** * @return Whether this is a file system shell folder */ - public boolean isFileSystem() { - return hasAttribute(ATTRIB_FILESYSTEM); + public synchronized boolean isFileSystem() { + if (cachedIsFileSystem == null) { + cachedIsFileSystem = hasAttribute(ATTRIB_FILESYSTEM); + } + + return cachedIsFileSystem; } /** * Return whether the given attribute flag is set for this object */ - public boolean hasAttribute(int attribute) { - // Caching at this point doesn't seem to be cost efficient - return (getAttributes0(getParentIShellFolder(), getRelativePIDL(), attribute) & attribute) != 0; + public boolean hasAttribute(final int attribute) { + return ShellFolder.getInvoker().invoke(new Callable<Boolean>() { + public Boolean call() throws Exception { + // Caching at this point doesn't seem to be cost efficient + return (getAttributes0(getParentIShellFolder(), + getRelativePIDL(), attribute) + & attribute) != 0; + } + }); } /** @@ -498,26 +555,42 @@ final class Win32ShellFolder2 extends ShellFolder { * Could plausibly be used for attribute caching but have to be * very careful not to touch network drives and file system roots * with a full attrsMask + * NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details */ + private static native int getAttributes0(long pParentIShellFolder, long pIDL, int attrsMask); // Return the path to the underlying file system object - private static String getFileSystemPath(long parentIShellFolder, long relativePIDL) { - int linkedFolder = ATTRIB_LINK | ATTRIB_FOLDER; - if (parentIShellFolder == Win32ShellFolderManager2.getNetwork().getIShellFolder() && - getAttributes0(parentIShellFolder, relativePIDL, linkedFolder) == linkedFolder) { - - String s = - getFileSystemPath(Win32ShellFolderManager2.getDesktop().getIShellFolder(), - getLinkLocation(parentIShellFolder, relativePIDL, false)); - if (s != null && s.startsWith("\\\\")) { - return s; + private static String getFileSystemPath(final long parentIShellFolder, final long relativePIDL) { + return ShellFolder.getInvoker().invoke(new Callable<String>() { + public String call() throws Exception { + int linkedFolder = ATTRIB_LINK | ATTRIB_FOLDER; + if (parentIShellFolder == Win32ShellFolderManager2.getNetwork().getIShellFolder() && + getAttributes0(parentIShellFolder, relativePIDL, linkedFolder) == linkedFolder) { + + String s = + getFileSystemPath(Win32ShellFolderManager2.getDesktop().getIShellFolder(), + getLinkLocation(parentIShellFolder, relativePIDL, false)); + if (s != null && s.startsWith("\\\\")) { + return s; + } + } + return getDisplayNameOf(parentIShellFolder, relativePIDL, SHGDN_FORPARSING); } - } - return getDisplayNameOf(parentIShellFolder, relativePIDL, SHGDN_NORMAL | SHGDN_FORPARSING); + }); } + // Needs to be accessible to Win32ShellFolderManager2 - static native String getFileSystemPath(int csidl) throws IOException; + static String getFileSystemPath(final int csidl) throws IOException { + return ShellFolder.getInvoker().invoke(new Callable<String>() { + public String call() throws Exception { + return getFileSystemPath0(csidl); + } + }); + } + + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details + private static native String getFileSystemPath0(int csidl) throws IOException; // Return whether the path is a network root. // Path is assumed to be non-null @@ -557,24 +630,33 @@ final class Win32ShellFolder2 extends ShellFolder { */ // Returns an IEnumIDList interface for an IShellFolder. The value // returned must be released using releaseEnumObjects(). - private long getEnumObjects(long pIShellFolder, boolean includeHiddenFiles) { - boolean isDesktop = (disposer.pIShellFolder == getDesktopIShellFolder()); - return getEnumObjects(disposer.pIShellFolder, isDesktop, includeHiddenFiles); + private long getEnumObjects(long pIShellFolder, final boolean includeHiddenFiles) { + final boolean isDesktop = (disposer.pIShellFolder == getDesktopIShellFolder()); + return ShellFolder.getInvoker().invoke(new Callable<Long>() { + public Long call() throws Exception { + return getEnumObjects(disposer.pIShellFolder, isDesktop, includeHiddenFiles); + } + }); } + // Returns an IEnumIDList interface for an IShellFolder. The value // returned must be released using releaseEnumObjects(). + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native long getEnumObjects(long pIShellFolder, boolean isDesktop, boolean includeHiddenFiles); // Returns the next sequential child as a relative PIDL // from an IEnumIDList interface. The value returned must // be released using releasePIDL(). + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native long getNextChild(long pEnumObjects); // Releases the IEnumIDList interface + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native void releaseEnumObjects(long pEnumObjects); // Returns the IShellFolder of a child from a parent IShellFolder // and a relative PIDL. The value returned must be released // using releaseIShellFolder(). + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native long bindToObject(long parentIShellFolder, long pIDL); /** @@ -582,60 +664,64 @@ final class Win32ShellFolder2 extends ShellFolder { * object. The array will be empty if the folder is empty. Returns * <code>null</code> if this shellfolder does not denote a directory. */ - public File[] listFiles(boolean includeHiddenFiles) { + public File[] listFiles(final boolean includeHiddenFiles) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(getPath()); } - if (!isDirectory()) { - return null; - } - // Links to directories are not directories and cannot be parents. - // This does not apply to folders in My Network Places (NetHood) - // because they are both links and real directories! - if (isLink() && !hasAttribute(ATTRIB_FOLDER)) { - return new File[0]; - } - Win32ShellFolder2 desktop = Win32ShellFolderManager2.getDesktop(); - Win32ShellFolder2 personal = Win32ShellFolderManager2.getPersonal(); - - // If we are a directory, we have a parent and (at least) a - // relative PIDL. We must first ensure we are bound to the - // parent so we have an IShellFolder to query. - long pIShellFolder = getIShellFolder(); - // Now we can enumerate the objects in this folder. - ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>(); - long pEnumObjects = getEnumObjects(pIShellFolder, includeHiddenFiles); - if (pEnumObjects != 0) { - long childPIDL; - int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; - do { - if (Thread.currentThread().isInterrupted()) { - return new File[0]; + return ShellFolder.getInvoker().invoke(new Callable<File[]>() { + public File[] call() throws Exception { + if (!isDirectory()) { + return null; } - childPIDL = getNextChild(pEnumObjects); - boolean releasePIDL = true; - if (childPIDL != 0 && - (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) { - Win32ShellFolder2 childFolder = null; - if (this.equals(desktop) - && personal != null - && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { - childFolder = personal; - } else { - childFolder = new Win32ShellFolder2(this, childPIDL); - releasePIDL = false; - } - list.add(childFolder); + // Links to directories are not directories and cannot be parents. + // This does not apply to folders in My Network Places (NetHood) + // because they are both links and real directories! + if (isLink() && !hasAttribute(ATTRIB_FOLDER)) { + return new File[0]; } - if (releasePIDL) { - releasePIDL(childPIDL); + + Win32ShellFolder2 desktop = Win32ShellFolderManager2.getDesktop(); + Win32ShellFolder2 personal = Win32ShellFolderManager2.getPersonal(); + + // If we are a directory, we have a parent and (at least) a + // relative PIDL. We must first ensure we are bound to the + // parent so we have an IShellFolder to query. + long pIShellFolder = getIShellFolder(); + // Now we can enumerate the objects in this folder. + ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>(); + long pEnumObjects = getEnumObjects(pIShellFolder, includeHiddenFiles); + if (pEnumObjects != 0) { + long childPIDL; + int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; + do { + childPIDL = getNextChild(pEnumObjects); + boolean releasePIDL = true; + if (childPIDL != 0 && + (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) { + Win32ShellFolder2 childFolder; + if (Win32ShellFolder2.this.equals(desktop) + && personal != null + && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { + childFolder = personal; + } else { + childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL); + releasePIDL = false; + } + list.add(childFolder); + } + if (releasePIDL) { + releasePIDL(childPIDL); + } + } while (childPIDL != 0 && !Thread.currentThread().isInterrupted()); + releaseEnumObjects(pEnumObjects); } - } while (childPIDL != 0); - releaseEnumObjects(pEnumObjects); - } - return list.toArray(new ShellFolder[list.size()]); + return Thread.currentThread().isInterrupted() + ? new File[0] + : list.toArray(new ShellFolder[list.size()]); + } + }); } @@ -644,33 +730,43 @@ final class Win32ShellFolder2 extends ShellFolder { * * @return The child shellfolder, or null if not found. */ - Win32ShellFolder2 getChildByPath(String filePath) { - long pIShellFolder = getIShellFolder(); - long pEnumObjects = getEnumObjects(pIShellFolder, true); - Win32ShellFolder2 child = null; - long childPIDL; - - while ((childPIDL = getNextChild(pEnumObjects)) != 0) { - if (getAttributes0(pIShellFolder, childPIDL, ATTRIB_FILESYSTEM) != 0) { - String path = getFileSystemPath(pIShellFolder, childPIDL); - if (path != null && path.equalsIgnoreCase(filePath)) { - long childIShellFolder = bindToObject(pIShellFolder, childPIDL); - child = new Win32ShellFolder2(this, childIShellFolder, childPIDL, path); - break; + Win32ShellFolder2 getChildByPath(final String filePath) { + return ShellFolder.getInvoker().invoke(new Callable<Win32ShellFolder2>() { + public Win32ShellFolder2 call() throws Exception { + long pIShellFolder = getIShellFolder(); + long pEnumObjects = getEnumObjects(pIShellFolder, true); + Win32ShellFolder2 child = null; + long childPIDL = 0; + + while ((childPIDL = getNextChild(pEnumObjects)) != 0) { + if (getAttributes0(pIShellFolder, childPIDL, ATTRIB_FILESYSTEM) != 0) { + String path = getFileSystemPath(pIShellFolder, childPIDL); + if (path != null && path.equalsIgnoreCase(filePath)) { + long childIShellFolder = bindToObject(pIShellFolder, childPIDL); + child = new Win32ShellFolder2(Win32ShellFolder2.this, + childIShellFolder, childPIDL, path); + break; + } + } + releasePIDL(childPIDL); } + releaseEnumObjects(pEnumObjects); + return child; } - releasePIDL(childPIDL); - } - releaseEnumObjects(pEnumObjects); - return child; + }); } + private Boolean cachedIsLink; /** * @return Whether this shell folder is a link */ - public boolean isLink() { - return hasAttribute(ATTRIB_LINK); + public synchronized boolean isLink() { + if (cachedIsLink == null) { + cachedIsLink = hasAttribute(ATTRIB_LINK); + } + + return cachedIsLink; } /** @@ -682,6 +778,7 @@ final class Win32ShellFolder2 extends ShellFolder { // Return the link location of a shell folder + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native long getLinkLocation(long parentIShellFolder, long relativePIDL, boolean resolve); @@ -693,38 +790,52 @@ final class Win32ShellFolder2 extends ShellFolder { return getLinkLocation(true); } - private ShellFolder getLinkLocation(boolean resolve) { - if (!isLink()) { - return null; - } + private ShellFolder getLinkLocation(final boolean resolve) { + return ShellFolder.getInvoker().invoke(new Callable<ShellFolder>() { + public ShellFolder call() throws Exception { + if (!isLink()) { + return null; + } - ShellFolder location = null; - long linkLocationPIDL = getLinkLocation(getParentIShellFolder(), - getRelativePIDL(), resolve); - if (linkLocationPIDL != 0) { - try { - location = - Win32ShellFolderManager2.createShellFolderFromRelativePIDL(getDesktop(), - linkLocationPIDL); - } catch (InternalError e) { - // Could be a link to a non-bindable object, such as a network connection - // TODO: getIShellFolder() should throw FileNotFoundException instead + ShellFolder location = null; + long linkLocationPIDL = getLinkLocation(getParentIShellFolder(), + getRelativePIDL(), resolve); + if (linkLocationPIDL != 0) { + try { + location = + Win32ShellFolderManager2.createShellFolderFromRelativePIDL(getDesktop(), + linkLocationPIDL); + } catch (InternalError e) { + // Could be a link to a non-bindable object, such as a network connection + // TODO: getIShellFolder() should throw FileNotFoundException instead + } + } + return location; } - } - return location; + }); } // Parse a display name into a PIDL relative to the current IShellFolder. - long parseDisplayName(String name) throws FileNotFoundException { + long parseDisplayName(final String name) throws FileNotFoundException { try { - return parseDisplayName0(getIShellFolder(), name); - } catch (IOException e) { - throw new FileNotFoundException("Could not find file " + name); + return ShellFolder.getInvoker().invoke(new Callable<Long>() { + public Long call() throws Exception { + return parseDisplayName0(getIShellFolder(), name); + } + }); + } catch (RuntimeException e) { + if (e.getCause() instanceof IOException) { + throw new FileNotFoundException("Could not find file " + name); + } + throw e; } } + + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native long parseDisplayName0(long pIShellFolder, String name) throws IOException; // Return the display name of a shell folder + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native String getDisplayNameOf(long parentIShellFolder, long relativePIDL, int attrs); @@ -734,12 +845,19 @@ final class Win32ShellFolder2 extends ShellFolder { */ public String getDisplayName() { if (displayName == null) { - displayName = getDisplayNameOf(getParentIShellFolder(), getRelativePIDL(), SHGDN_NORMAL); + displayName = + ShellFolder.getInvoker().invoke(new Callable<String>() { + public String call() throws Exception { + return getDisplayNameOf(getParentIShellFolder(), + getRelativePIDL(), SHGDN_NORMAL); + } + }); } return displayName; } // Return the folder type of a shell folder + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native String getFolderType(long pIDL); /** @@ -747,7 +865,13 @@ final class Win32ShellFolder2 extends ShellFolder { */ public String getFolderType() { if (folderType == null) { - folderType = getFolderType(getAbsolutePIDL()); + final long absolutePIDL = getAbsolutePIDL(); + folderType = + ShellFolder.getInvoker().invoke(new Callable<String>() { + public String call() throws Exception { + return getFolderType(absolutePIDL); + } + }); } return folderType; } @@ -774,11 +898,16 @@ final class Win32ShellFolder2 extends ShellFolder { private static Map smallLinkedSystemImages = new HashMap(); private static Map largeLinkedSystemImages = new HashMap(); + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native long getIShellIcon(long pIShellFolder); + + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native int getIconIndex(long parentIShellIcon, long relativePIDL); // Return the icon of a file system shell folder in the form of an HICON private static native long getIcon(String absolutePath, boolean getLargeIcon); + + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native long extractIcon(long parentIShellFolder, long relativePIDL, boolean getLargeIcon); @@ -799,7 +928,12 @@ final class Win32ShellFolder2 extends ShellFolder { private long getIShellIcon() { if (pIShellIcon == -1L) { - pIShellIcon = getIShellIcon(getIShellFolder()); + pIShellIcon = + ShellFolder.getInvoker().invoke(new Callable<Long>() { + public Long call() throws Exception { + return getIShellIcon(getIShellFolder()); + } + }); } return pIShellIcon; } @@ -850,50 +984,60 @@ final class Win32ShellFolder2 extends ShellFolder { /** * @return The icon image used to display this shell folder */ - public Image getIcon(boolean getLargeIcon) { + public Image getIcon(final boolean getLargeIcon) { Image icon = getLargeIcon ? largeIcon : smallIcon; if (icon == null) { - long parentIShellIcon = (parent != null) ? ((Win32ShellFolder2)parent).getIShellIcon() : 0L; - long relativePIDL = getRelativePIDL(); - - if (isFileSystem()) { - // These are cached per type (using the index in the system image list) - int index = getIconIndex(parentIShellIcon, relativePIDL); - if (index > 0) { - Map imageCache; - if (isLink()) { - imageCache = getLargeIcon ? largeLinkedSystemImages : smallLinkedSystemImages; - } else { - imageCache = getLargeIcon ? largeSystemImages : smallSystemImages; - } - icon = (Image)imageCache.get(Integer.valueOf(index)); - if (icon == null) { - long hIcon = getIcon(getAbsolutePath(), getLargeIcon); - icon = makeIcon(hIcon, getLargeIcon); - disposeIcon(hIcon); - if (icon != null) { - imageCache.put(Integer.valueOf(index), icon); + icon = + ShellFolder.getInvoker().invoke(new Callable<Image>() { + public Image call() throws Exception { + Image newIcon = null; + if (isFileSystem()) { + long parentIShellIcon = (parent != null) + ? ((Win32ShellFolder2) parent).getIShellIcon() + : 0L; + long relativePIDL = getRelativePIDL(); + + // These are cached per type (using the index in the system image list) + int index = getIconIndex(parentIShellIcon, relativePIDL); + if (index > 0) { + Map imageCache; + if (isLink()) { + imageCache = getLargeIcon ? largeLinkedSystemImages : smallLinkedSystemImages; + } else { + imageCache = getLargeIcon ? largeSystemImages : smallSystemImages; + } + newIcon = (Image) imageCache.get(Integer.valueOf(index)); + if (newIcon == null) { + long hIcon = getIcon(getAbsolutePath(), getLargeIcon); + newIcon = makeIcon(hIcon, getLargeIcon); + disposeIcon(hIcon); + if (newIcon != null) { + imageCache.put(Integer.valueOf(index), newIcon); + } + } + } } - } - } - } - if (icon == null) { - // These are only cached per object - long hIcon = extractIcon(getParentIShellFolder(), getRelativePIDL(), getLargeIcon); - icon = makeIcon(hIcon, getLargeIcon); - disposeIcon(hIcon); - } + if (newIcon == null) { + // These are only cached per object + long hIcon = extractIcon(getParentIShellFolder(), + getRelativePIDL(), getLargeIcon); + newIcon = makeIcon(hIcon, getLargeIcon); + disposeIcon(hIcon); + } + if (newIcon == null) { + newIcon = Win32ShellFolder2.super.getIcon(getLargeIcon); + } + return newIcon; + } + }); if (getLargeIcon) { largeIcon = icon; } else { smallIcon = icon; } } - if (icon == null) { - icon = super.getIcon(getLargeIcon); - } return icon; } @@ -969,39 +1113,50 @@ final class Win32ShellFolder2 extends ShellFolder { private static final int LVCFMT_CENTER = 2; public ShellFolderColumnInfo[] getFolderColumns() { - ShellFolderColumnInfo[] columns = doGetColumnInfo(getIShellFolder()); - - if (columns != null) { - List<ShellFolderColumnInfo> notNullColumns = - new ArrayList<ShellFolderColumnInfo>(); - for (int i = 0; i < columns.length; i++) { - ShellFolderColumnInfo column = columns[i]; - if (column != null) { - column.setAlignment(column.getAlignment() == LVCFMT_RIGHT - ? SwingConstants.RIGHT - : column.getAlignment() == LVCFMT_CENTER - ? SwingConstants.CENTER - : SwingConstants.LEADING); - - column.setComparator(new ColumnComparator(getIShellFolder(), i)); - - notNullColumns.add(column); + return ShellFolder.getInvoker().invoke(new Callable<ShellFolderColumnInfo[]>() { + public ShellFolderColumnInfo[] call() throws Exception { + ShellFolderColumnInfo[] columns = doGetColumnInfo(getIShellFolder()); + + if (columns != null) { + List<ShellFolderColumnInfo> notNullColumns = + new ArrayList<ShellFolderColumnInfo>(); + for (int i = 0; i < columns.length; i++) { + ShellFolderColumnInfo column = columns[i]; + if (column != null) { + column.setAlignment(column.getAlignment() == LVCFMT_RIGHT + ? SwingConstants.RIGHT + : column.getAlignment() == LVCFMT_CENTER + ? SwingConstants.CENTER + : SwingConstants.LEADING); + + column.setComparator(new ColumnComparator(getIShellFolder(), i)); + + notNullColumns.add(column); + } + } + columns = new ShellFolderColumnInfo[notNullColumns.size()]; + notNullColumns.toArray(columns); } + return columns; } - columns = new ShellFolderColumnInfo[notNullColumns.size()]; - notNullColumns.toArray(columns); - } - return columns; + }); } - public Object getFolderColumnValue(int column) { - return doGetColumnValue(getParentIShellFolder(), getRelativePIDL(), column); + public Object getFolderColumnValue(final int column) { + return ShellFolder.getInvoker().invoke(new Callable<Object>() { + public Object call() throws Exception { + return doGetColumnValue(getParentIShellFolder(), getRelativePIDL(), column); + } + }); } + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native ShellFolderColumnInfo[] doGetColumnInfo(long iShellFolder2); + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native Object doGetColumnValue(long parentIShellFolder2, long childPIDL, int columnIdx); + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private static native int compareIDsByColumn(long pParentIShellFolder, long pidl1, long pidl2, int columnIdx); @@ -1020,17 +1175,20 @@ final class Win32ShellFolder2 extends ShellFolder { } // compares 2 objects within this folder by the specified column - public int compare(File o, File o1) { - if (o instanceof Win32ShellFolder2 - && o1 instanceof Win32ShellFolder2) { - // delegates comparison to native method - return compareIDsByColumn(parentIShellFolder, - ((Win32ShellFolder2) o).getRelativePIDL(), - ((Win32ShellFolder2) o1).getRelativePIDL(), - columnIdx); - } - return 0; + public int compare(final File o, final File o1) { + return ShellFolder.getInvoker().invoke(new Callable<Integer>() { + public Integer call() throws Exception { + if (o instanceof Win32ShellFolder2 + && o1 instanceof Win32ShellFolder2) { + // delegates comparison to native method + return compareIDsByColumn(parentIShellFolder, + ((Win32ShellFolder2) o).getRelativePIDL(), + ((Win32ShellFolder2) o1).getRelativePIDL(), + columnIdx); + } + return 0; + } + }); } } - } diff --git a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java index 0259e5533cde627f2a7de78c6d9b333928bbc403..563f474e2f2efe90fe8786f13d789fa56f17a1bc 100644 --- a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java +++ b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java @@ -31,7 +31,10 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.*; +import java.util.concurrent.*; + import sun.security.action.LoadLibraryAction; import static sun.awt.shell.Win32ShellFolder2.*; @@ -408,4 +411,102 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { return name1.compareTo(name2); } } + + @Override + protected Invoker createInvoker() { + return new ComInvoker(); + } + + private static class ComInvoker extends ThreadPoolExecutor implements ThreadFactory, ShellFolder.Invoker { + private static Thread comThread; + + private ComInvoker() { + super(1, 1, 0, TimeUnit.DAYS, new LinkedBlockingQueue<Runnable>()); + allowCoreThreadTimeOut(false); + setThreadFactory(this); + final Runnable shutdownHook = new Runnable() { + public void run() { + AccessController.doPrivileged(new PrivilegedAction<Void>() { + public Void run() { + shutdownNow(); + return null; + } + }); + } + }; + AccessController.doPrivileged(new PrivilegedAction<Void>() { + public Void run() { + Runtime.getRuntime().addShutdownHook( + new Thread(shutdownHook) + ); + return null; + } + }); + } + + public synchronized Thread newThread(final Runnable task) { + final Runnable comRun = new Runnable() { + public void run() { + try { + initializeCom(); + task.run(); + } finally { + uninitializeCom(); + } + } + }; + comThread = + AccessController.doPrivileged( + new PrivilegedAction<Thread>() { + public Thread run() { + /* The thread must be a member of a thread group + * which will not get GCed before VM exit. + * Make its parent the top-level thread group. + */ + ThreadGroup tg = Thread.currentThread().getThreadGroup(); + for (ThreadGroup tgn = tg; + tgn != null; + tg = tgn, tgn = tg.getParent()); + Thread thread = new Thread(tg, comRun, "Swing-Shell"); + thread.setDaemon(true); + return thread; + } + } + ); + return comThread; + } + + public <T> T invoke(Callable<T> task) { + try { + T result; + if (Thread.currentThread() == comThread) { + // if it's already called from the COM + // thread, we don't need to delegate the task + result = task.call(); + } else { + Future<T> future = submit(task); + try { + result = future.get(); + } catch (InterruptedException e) { + result = null; + future.cancel(true); + } + } + return result; + } catch (Exception e) { + Throwable cause = (e instanceof ExecutionException) ? e.getCause() : e; + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } + if (cause instanceof Error) { + throw (Error) cause; + } + throw new RuntimeException(cause); + } + } + } + + static native void initializeCom(); + + static native void uninitializeCom(); } diff --git a/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java b/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java new file mode 100644 index 0000000000000000000000000000000000000000..9f8193f9920524428abc657b2561828ca77a4d9f --- /dev/null +++ b/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java @@ -0,0 +1,398 @@ +/* + * Copyright 2008-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 sun.awt.windows; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Image; +import java.awt.Window; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferInt; +import java.awt.image.VolatileImage; +import java.lang.ref.WeakReference; +import java.security.AccessController; +import sun.awt.image.BufImgSurfaceData; +import sun.java2d.DestSurfaceProvider; +import sun.java2d.InvalidPipeException; +import sun.java2d.Surface; +import sun.java2d.pipe.RenderQueue; +import sun.java2d.pipe.hw.AccelGraphicsConfig; +import sun.java2d.pipe.hw.AccelSurface; +import sun.security.action.GetPropertyAction; + +import static java.awt.image.VolatileImage.*; +import static java.awt.Transparency.*; +import static sun.java2d.pipe.hw.AccelSurface.*; +import static sun.java2d.pipe.hw.ContextCapabilities.*; + +/** + * This class handles the updates of the non-opaque windows. + * The window associated with the peer is updated either given an image or + * the window is repainted to an internal buffer which is then used to update + * the window. + * + * Note: this class does not attempt to be thread safe, it is expected to be + * called from a single thread (EDT). + */ +public abstract class TranslucentWindowPainter { + + protected Window window; + protected WWindowPeer peer; + + // REMIND: we probably would want to remove this later + private static final boolean forceOpt = + Boolean.valueOf(AccessController.doPrivileged( + new GetPropertyAction("sun.java2d.twp.forceopt", "false"))); + private static final boolean forceSW = + Boolean.valueOf(AccessController.doPrivileged( + new GetPropertyAction("sun.java2d.twp.forcesw", "false"))); + + /** + * Creates an instance of the painter for particular peer. + */ + public static TranslucentWindowPainter createInstance(WWindowPeer peer) { + GraphicsConfiguration gc = peer.getGraphicsConfiguration(); + if (!forceSW && gc instanceof AccelGraphicsConfig) { + String gcName = gc.getClass().getSimpleName(); + AccelGraphicsConfig agc = (AccelGraphicsConfig)gc; + // this is a heuristic to check that we have a pcix board + // (those have higher transfer rate from gpu to cpu) + if ((agc.getContextCapabilities().getCaps() & CAPS_PS30) != 0 || + forceOpt) + { + // we check for name to avoid loading classes unnecessarily if + // a pipeline isn't enabled + if (gcName.startsWith("D3D")) { + return new VIOptD3DWindowPainter(peer); + } else if (forceOpt && gcName.startsWith("WGL")) { + // on some boards (namely, ATI, even on pcix bus) ogl is + // very slow reading pixels back so for now it is disabled + // unless forced + return new VIOptWGLWindowPainter(peer); + } + } + } + return new BIWindowPainter(peer); + } + + protected TranslucentWindowPainter(WWindowPeer peer) { + this.peer = peer; + this.window = (Window)peer.getTarget(); + } + + /** + * Creates (if needed), clears and returns the buffer for this painter. + */ + protected abstract Image getBackBuffer(); + + /** + * Updates the the window associated with this painter with the contents + * of the passed image. + * The image can not be null, and NPE will be thrown if it is. + */ + protected abstract boolean update(Image bb); + + /** + * Flushes the resources associated with the painter. They will be + * recreated as needed. + */ + public abstract void flush(); + + /** + * Updates the window associated with the painter given the passed image. + * If the passed image is null the painter will use its own buffer for + * rendering the contents of the window into it and updating the window. + * + * If the passed buffer has dimensions different from the window, it is + * copied into the internal buffer first and the latter is used to update + * the window. + * + * @param bb the image to update the non opaque window with, or null. + * If not null, the image must be of ARGB_PRE type. + */ + public void updateWindow(Image bb) { + boolean done = false; + if (bb != null && (window.getWidth() != bb.getWidth(null) || + window.getHeight() != bb.getHeight(null))) + { + Image ourBB = getBackBuffer(); + Graphics2D g = (Graphics2D)ourBB.getGraphics(); + g.drawImage(bb, 0, 0, null); + g.dispose(); + bb = ourBB; + } + do { + if (bb == null) { + bb = getBackBuffer(); + Graphics2D g = (Graphics2D)bb.getGraphics(); + try { + window.paintAll(g); + } finally { + g.dispose(); + } + } + + peer.paintAppletWarning((Graphics2D)bb.getGraphics(), + bb.getWidth(null), bb.getHeight(null)); + + done = update(bb); + // in case they passed us a lost VI, next time around we'll use our + // own bb because we can not validate and restore the contents of + // their VI + if (!done) { + bb = null; + } + } while (!done); + } + + private static final Image clearImage(Image bb) { + Graphics2D g = (Graphics2D)bb.getGraphics(); + int w = bb.getWidth(null); + int h = bb.getHeight(null); + + g.setComposite(AlphaComposite.Src); + g.setColor(new Color(0, 0, 0, 0)); + g.fillRect(0, 0, w, h); + + return bb; + } + + /** + * A painter which uses BufferedImage as the internal buffer. The window + * is painted into this buffer, and the contents then are uploaded + * into the layered window. + * + * This painter handles all types of images passed to its paint(Image) + * method (VI, BI, regular Images). + */ + private static class BIWindowPainter extends TranslucentWindowPainter { + private WeakReference<BufferedImage> biRef; + + protected BIWindowPainter(WWindowPeer peer) { + super(peer); + } + + private BufferedImage getBIBackBuffer() { + int w = window.getWidth(); + int h = window.getHeight(); + BufferedImage bb = biRef == null ? null : biRef.get(); + if (bb == null || bb.getWidth() != w || bb.getHeight() != h) { + if (bb != null) { + bb.flush(); + bb = null; + } + bb = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE); + biRef = new WeakReference<BufferedImage>(bb); + } + return (BufferedImage)clearImage(bb); + } + + @Override + protected Image getBackBuffer() { + return getBIBackBuffer(); + } + + @Override + protected boolean update(Image bb) { + VolatileImage viBB = null; + + if (bb instanceof BufferedImage) { + BufferedImage bi = (BufferedImage)bb; + int data[] = + ((DataBufferInt)bi.getRaster().getDataBuffer()).getData(); + peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight()); + return true; + } else if (bb instanceof VolatileImage) { + viBB = (VolatileImage)bb; + if (bb instanceof DestSurfaceProvider) { + Surface s = ((DestSurfaceProvider)bb).getDestSurface(); + if (s instanceof BufImgSurfaceData) { + // the image is probably lost, upload the data from the + // backup surface to avoid creating another heap-based + // image (the parent's buffer) + int w = viBB.getWidth(); + int h = viBB.getHeight(); + BufImgSurfaceData bisd = (BufImgSurfaceData)s; + int data[] = ((DataBufferInt)bisd.getRaster(0,0,w,h). + getDataBuffer()).getData(); + peer.updateWindowImpl(data, w, h); + return true; + } + } + } + + // copy the passed image into our own buffer, then upload + BufferedImage bi = getBIBackBuffer(); + Graphics2D g = (Graphics2D)bi.getGraphics(); + g.setComposite(AlphaComposite.Src); + g.drawImage(bb, 0, 0, null); + + int data[] = + ((DataBufferInt)bi.getRaster().getDataBuffer()).getData(); + peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight()); + + return (viBB != null ? !viBB.contentsLost() : true); + } + + public void flush() { + if (biRef != null) { + biRef.clear(); + } + } + } + + /** + * A version of the painter which uses VolatileImage as the internal buffer. + * The window is painted into this VI and then copied into the parent's + * Java heap-based buffer (which is then uploaded to the layered window) + */ + private static class VIWindowPainter extends BIWindowPainter { + private WeakReference<VolatileImage> viRef; + + protected VIWindowPainter(WWindowPeer peer) { + super(peer); + } + + @Override + protected Image getBackBuffer() { + int w = window.getWidth(); + int h = window.getHeight(); + GraphicsConfiguration gc = peer.getGraphicsConfiguration(); + + VolatileImage viBB = viRef == null ? null : viRef.get(); + + if (viBB == null || viBB.getWidth() != w || viBB.getHeight() != h || + viBB.validate(gc) == IMAGE_INCOMPATIBLE) + { + if (viBB != null) { + viBB.flush(); + viBB = null; + } + + if (gc instanceof AccelGraphicsConfig) { + AccelGraphicsConfig agc = ((AccelGraphicsConfig)gc); + viBB = agc.createCompatibleVolatileImage(w, h, + TRANSLUCENT, + RT_PLAIN); + } + if (viBB == null) { + viBB = gc.createCompatibleVolatileImage(w, h, TRANSLUCENT); + } + viBB.validate(gc); + viRef = new WeakReference<VolatileImage>(viBB); + } + + return clearImage(viBB); + } + + @Override + public void flush() { + if (viRef != null) { + VolatileImage viBB = viRef.get(); + if (viBB != null) { + viBB.flush(); + viBB = null; + } + viRef.clear(); + } + } + } + + /** + * Optimized version of hw painter. Uses VolatileImages for the + * buffer, and uses an optimized path to pull the data from those into + * the layered window, bypassing Java heap-based image. + */ + private abstract static class VIOptWindowPainter extends VIWindowPainter { + + protected VIOptWindowPainter(WWindowPeer peer) { + super(peer); + } + + protected abstract boolean updateWindowAccel(long psdops, int w, int h); + + @Override + protected boolean update(Image bb) { + if (bb instanceof DestSurfaceProvider) { + Surface s = ((DestSurfaceProvider)bb).getDestSurface(); + if (s instanceof AccelSurface) { + final int w = bb.getWidth(null); + final int h = bb.getHeight(null); + final boolean arr[] = { false }; + final AccelSurface as = (AccelSurface)s; + RenderQueue rq = as.getContext().getRenderQueue(); + rq.lock(); + try { + as.getContext().validateContext(as); + rq.flushAndInvokeNow(new Runnable() { + public void run() { + long psdops = as.getNativeOps(); + arr[0] = updateWindowAccel(psdops, w, h); + } + }); + } catch (InvalidPipeException e) { + // ignore, false will be returned + } finally { + rq.unlock(); + } + return arr[0]; + } + } + return super.update(bb); + } + } + + private static class VIOptD3DWindowPainter extends VIOptWindowPainter { + + protected VIOptD3DWindowPainter(WWindowPeer peer) { + super(peer); + } + + @Override + protected boolean updateWindowAccel(long psdops, int w, int h) { + // note: this method is executed on the toolkit thread, no sync is + // necessary at the native level, and a pointer to peer can be used + return sun.java2d.d3d.D3DSurfaceData. + updateWindowAccelImpl(psdops, peer.getData(), w, h); + } + } + + private static class VIOptWGLWindowPainter extends VIOptWindowPainter { + + protected VIOptWGLWindowPainter(WWindowPeer peer) { + super(peer); + } + + @Override + protected boolean updateWindowAccel(long psdops, int w, int h) { + // note: part of this method which deals with GDI will be on the + // toolkit thread + return sun.java2d.opengl.WGLSurfaceData. + updateWindowAccelImpl(psdops, peer, w, h); + } + } +} diff --git a/src/windows/classes/sun/awt/windows/WCanvasPeer.java b/src/windows/classes/sun/awt/windows/WCanvasPeer.java index 5d88a0c370370262ae6f544a02e4201f69f713e8..b97a3787b64c35f933aea19f30e60a1872a5c412 100644 --- a/src/windows/classes/sun/awt/windows/WCanvasPeer.java +++ b/src/windows/classes/sun/awt/windows/WCanvasPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -28,6 +28,7 @@ import java.awt.*; import java.awt.peer.*; import java.lang.ref.WeakReference; import java.lang.reflect.Method; +import sun.awt.AWTAccessor; import sun.awt.ComponentAccessor; import sun.awt.SunToolkit; import sun.awt.Win32GraphicsDevice; @@ -37,44 +38,12 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer { private boolean eraseBackground; - Method resetGCMethod; - // Toolkit & peer internals WCanvasPeer(Component target) { super(target); } - /* - * From the DisplayChangedListener interface. - * - * Overrides WComponentPeer version because Canvases can be created with - * a non-defulat GraphicsConfiguration, which is no longer valid. - * Up-called for other windows peer instances (WPanelPeer, WWindowPeer). - */ - public void displayChanged() { - clearLocalGC(); - resetTargetGC(); - super.displayChanged(); - } - - /* - * Reset the graphicsConfiguration member of our target Component. - * Component.resetGC() is a package-private method, so we have to call it - * through reflection. - */ - public void resetTargetGC() { - ComponentAccessor.resetGC((Component)target); - } - - /* - * Clears the peer's winGraphicsConfig member. - * Overridden by WWindowPeer, which shouldn't have a null winGraphicsConfig. - */ - void clearLocalGC() { - winGraphicsConfig = null; - } - native void create(WComponentPeer parent); void initialize() { @@ -110,16 +79,20 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer { } public void print(Graphics g) { - Dimension d = ((Component)target).getSize(); - if (g instanceof Graphics2D || - g instanceof sun.awt.Graphics2Delegate) { - // background color is setup correctly, so just use clearRect - g.clearRect(0, 0, d.width, d.height); - } else { - // emulate clearRect - g.setColor(((Component)target).getBackground()); - g.fillRect(0, 0, d.width, d.height); - g.setColor(((Component)target).getForeground()); + if (!(target instanceof Window) || + AWTAccessor.getWindowAccessor().isOpaque((Window)target)) + { + Dimension d = ((Component)target).getSize(); + if (g instanceof Graphics2D || + g instanceof sun.awt.Graphics2Delegate) { + // background color is setup correctly, so just use clearRect + g.clearRect(0, 0, d.width, d.height); + } else { + // emulate clearRect + g.setColor(((Component)target).getBackground()); + g.fillRect(0, 0, d.width, d.height); + g.setColor(((Component)target).getForeground()); + } } super.print(g); } @@ -147,4 +120,10 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer { */ private native void setNativeBackgroundErase(boolean doErase, boolean doEraseOnResize); + + public GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc) + { + return gc; + } } diff --git a/src/windows/classes/sun/awt/windows/WChoicePeer.java b/src/windows/classes/sun/awt/windows/WChoicePeer.java index 20ab610ff36cd3b18b0bae949bc150f00b1a444e..b72e6f741ab8d43276fa3aeb97078ec074be7a4f 100644 --- a/src/windows/classes/sun/awt/windows/WChoicePeer.java +++ b/src/windows/classes/sun/awt/windows/WChoicePeer.java @@ -27,6 +27,10 @@ package sun.awt.windows; import java.awt.*; import java.awt.peer.*; import java.awt.event.ItemEvent; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.awt.event.WindowAdapter; +import sun.awt.SunToolkit; class WChoicePeer extends WComponentPeer implements ChoicePeer { @@ -70,6 +74,8 @@ class WChoicePeer extends WComponentPeer implements ChoicePeer { public synchronized native void reshape(int x, int y, int width, int height); + private WindowListener windowListener; + // Toolkit & peer internals WChoicePeer(Choice target) { @@ -91,9 +97,38 @@ class WChoicePeer extends WComponentPeer implements ChoicePeer { select(opt.getSelectedIndex()); } } + + Window parentWindow = SunToolkit.getContainingWindow((Component)target); + if (parentWindow != null) { + WWindowPeer wpeer = (WWindowPeer)parentWindow.getPeer(); + if (wpeer != null) { + windowListener = new WindowAdapter() { + public void windowIconified(WindowEvent e) { + closeList(); + } + public void windowClosing(WindowEvent e) { + closeList(); + } + }; + wpeer.addWindowListener(windowListener); + } + } super.initialize(); } + protected void disposeImpl() { + // TODO: we should somehow reset the listener when the choice + // is moved to another toplevel without destroying its peer. + Window parentWindow = SunToolkit.getContainingWindow((Component)target); + if (parentWindow != null) { + WWindowPeer wpeer = (WWindowPeer)parentWindow.getPeer(); + if (wpeer != null) { + wpeer.removeWindowListener(windowListener); + } + } + super.disposeImpl(); + } + // native callbacks void handleAction(final int index) { @@ -121,4 +156,5 @@ class WChoicePeer extends WComponentPeer implements ChoicePeer { return getMinimumSize(); } + native void closeList(); } diff --git a/src/windows/classes/sun/awt/windows/WComponentPeer.java b/src/windows/classes/sun/awt/windows/WComponentPeer.java index afbd170cc7ffc0d6b1cfb5c251d5748b53484d9f..6ad608452a16acade081b2aff90a5e72cd39e240 100644 --- a/src/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/src/windows/classes/sun/awt/windows/WComponentPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -38,27 +38,32 @@ import java.awt.image.ColorModel; import java.awt.event.PaintEvent; import java.awt.event.InvocationEvent; import java.awt.event.KeyEvent; +import java.awt.event.FocusEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; +import java.awt.event.InputEvent; import sun.awt.Win32GraphicsConfig; +import sun.awt.Win32GraphicsEnvironment; import sun.java2d.InvalidPipeException; import sun.java2d.SurfaceData; -import sun.java2d.d3d.D3DScreenUpdateManager; -import static sun.java2d.d3d.D3DSurfaceData.*; import sun.java2d.ScreenUpdateManager; +import sun.java2d.d3d.D3DSurfaceData; import sun.java2d.opengl.OGLSurfaceData; +import sun.java2d.pipe.Region; import sun.awt.DisplayChangedListener; import sun.awt.PaintEventDispatcher; +import sun.awt.SunToolkit; import sun.awt.event.IgnorePaintEvent; import java.awt.dnd.DropTarget; import java.awt.dnd.peer.DropTargetPeer; import sun.awt.ComponentAccessor; - import java.util.logging.*; public abstract class WComponentPeer extends WObjectPeer - implements ComponentPeer, DropTargetPeer, DisplayChangedListener + implements ComponentPeer, DropTargetPeer { /** * Handle to native window @@ -67,6 +72,7 @@ public abstract class WComponentPeer extends WObjectPeer private static final Logger log = Logger.getLogger("sun.awt.windows.WComponentPeer"); private static final Logger shapeLog = Logger.getLogger("sun.awt.windows.shape.WComponentPeer"); + private static final Logger focusLog = Logger.getLogger("sun.awt.windows.focus.WComponentPeer"); // ComponentPeer implementation SurfaceData surfaceData; @@ -186,7 +192,7 @@ public abstract class WComponentPeer extends WObjectPeer cont.invalidate(); cont.validate(); - if (surfaceData instanceof D3DWindowSurfaceData || + if (surfaceData instanceof D3DSurfaceData.D3DWindowSurfaceData || surfaceData instanceof OGLSurfaceData) { // When OGL or D3D is enabled, it is necessary to @@ -258,7 +264,7 @@ public abstract class WComponentPeer extends WObjectPeer int[] pix = createPrintedPixels(0, startY, totalW, h); if (pix != null) { BufferedImage bim = new BufferedImage(totalW, h, - BufferedImage.TYPE_INT_RGB); + BufferedImage.TYPE_INT_ARGB); bim.setRGB(0, 0, totalW, h, pix, 0, totalW); g.drawImage(bim, 0, startY, null); bim.flush(); @@ -295,14 +301,35 @@ public abstract class WComponentPeer extends WObjectPeer // on handling '\n' to prevent it from being passed to native code public boolean handleJavaKeyEvent(KeyEvent e) { return false; } + public void handleJavaMouseEvent(MouseEvent e) { + switch (e.getID()) { + case MouseEvent.MOUSE_PRESSED: + // Note that Swing requests focus in its own mouse event handler. + if (target == e.getSource() && + !((Component)target).isFocusOwner() && + WKeyboardFocusManagerPeer.shouldFocusOnClick((Component)target)) + { + WKeyboardFocusManagerPeer.requestFocusFor((Component)target, + CausedFocusEvent.Cause.MOUSE_EVENT); + } + break; + } + } + native void nativeHandleEvent(AWTEvent e); public void handleEvent(AWTEvent e) { int id = e.getID(); - if (((Component)target).isEnabled() && (e instanceof KeyEvent) && !((KeyEvent)e).isConsumed()) { - if (handleJavaKeyEvent((KeyEvent)e)) { - return; + if ((e instanceof InputEvent) && !((InputEvent)e).isConsumed() && + ((Component)target).isEnabled()) + { + if (e instanceof MouseEvent && !(e instanceof MouseWheelEvent)) { + handleJavaMouseEvent((MouseEvent) e); + } else if (e instanceof KeyEvent) { + if (handleJavaKeyEvent((KeyEvent)e)) { + return; + } } } @@ -318,6 +345,9 @@ public abstract class WComponentPeer extends WObjectPeer paintArea.paint(target,shouldClearRectBeforePaint()); } return; + case FocusEvent.FOCUS_LOST: + case FocusEvent.FOCUS_GAINED: + handleJavaFocusEvent((FocusEvent)e); default: break; } @@ -326,6 +356,13 @@ public abstract class WComponentPeer extends WObjectPeer nativeHandleEvent(e); } + void handleJavaFocusEvent(FocusEvent fe) { + if (focusLog.isLoggable(Level.FINER)) focusLog.finer(fe.toString()); + setFocus(fe.getID() == FocusEvent.FOCUS_GAINED); + } + + native void setFocus(boolean doSetFocus); + public Dimension getMinimumSize() { return ((Component)target).getSize(); } @@ -451,15 +488,8 @@ public abstract class WComponentPeer extends WObjectPeer } } - /** - * From the DisplayChangedListener interface. - * - * Called after a change in the display mode. This event - * triggers replacing the surfaceData object (since that object - * reflects the current display depth information, which has - * just changed). - */ - public void displayChanged() { + public void updateGraphicsData(GraphicsConfiguration gc) { + winGraphicsConfig = (Win32GraphicsConfig)gc; try { replaceSurfaceData(); } catch (InvalidPipeException e) { @@ -467,13 +497,6 @@ public abstract class WComponentPeer extends WObjectPeer } } - /** - * Part of the DisplayChangedListener interface: components - * do not need to react to this event - */ - public void paletteChanged() { - } - //This will return null for Components not yet added to a Container public ColorModel getColorModel() { GraphicsConfiguration gc = getGraphicsConfiguration(); @@ -585,22 +608,64 @@ public abstract class WComponentPeer extends WObjectPeer WGlobalCursorManager.getCursorManager().updateCursorImmediately(); } - native static boolean processSynchronousLightweightTransfer(Component heavyweight, Component descendant, - boolean temporary, boolean focusedWindowChangeAllowed, - long time); - public boolean requestFocus - (Component lightweightChild, boolean temporary, - boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) { - if (processSynchronousLightweightTransfer((Component)target, lightweightChild, temporary, - focusedWindowChangeAllowed, time)) { + // TODO: consider moving it to KeyboardFocusManagerPeerImpl + public boolean requestFocus(Component lightweightChild, boolean temporary, + boolean focusedWindowChangeAllowed, long time, + CausedFocusEvent.Cause cause) + { + if (WKeyboardFocusManagerPeer. + processSynchronousLightweightTransfer((Component)target, lightweightChild, temporary, + focusedWindowChangeAllowed, time)) + { return true; - } else { - return _requestFocus(lightweightChild, temporary, focusedWindowChangeAllowed, time, cause); } + + int result = WKeyboardFocusManagerPeer + .shouldNativelyFocusHeavyweight((Component)target, lightweightChild, + temporary, focusedWindowChangeAllowed, + time, cause); + + switch (result) { + case WKeyboardFocusManagerPeer.SNFH_FAILURE: + return false; + case WKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED: + if (focusLog.isLoggable(Level.FINER)) { + focusLog.finer("Proceeding with request to " + lightweightChild + " in " + target); + } + Window parentWindow = SunToolkit.getContainingWindow((Component)target); + if (parentWindow == null) { + return rejectFocusRequestHelper("WARNING: Parent window is null"); + } + WWindowPeer wpeer = (WWindowPeer)parentWindow.getPeer(); + if (wpeer == null) { + return rejectFocusRequestHelper("WARNING: Parent window's peer is null"); + } + boolean res = wpeer.requestWindowFocus(cause); + + if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Requested window focus: " + res); + // If parent window can be made focused and has been made focused(synchronously) + // then we can proceed with children, otherwise we retreat. + if (!(res && parentWindow.isFocused())) { + return rejectFocusRequestHelper("Waiting for asynchronous processing of the request"); + } + return WKeyboardFocusManagerPeer.deliverFocus(lightweightChild, + (Component)target, + temporary, + focusedWindowChangeAllowed, + time, cause); + + case WKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED: + // Either lightweight or excessive request - all events are generated. + return true; + } + return false; + } + + private boolean rejectFocusRequestHelper(String logMsg) { + if (focusLog.isLoggable(Level.FINER)) focusLog.finer(logMsg); + WKeyboardFocusManagerPeer.removeLastFocusRequest((Component)target); + return false; } - public native boolean _requestFocus - (Component lightweightChild, boolean temporary, - boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause); public Image createImage(ImageProducer producer) { return new ToolkitImage(producer); @@ -713,7 +778,7 @@ public abstract class WComponentPeer extends WObjectPeer * NOTE: This is called on the privileged toolkit thread. Do not * call directly into user code using this thread! */ - void handlePaint(int x, int y, int w, int h) { + public void handlePaint(int x, int y, int w, int h) { postPaintIfNecessary(x, y, w, h); } @@ -731,9 +796,12 @@ public abstract class WComponentPeer extends WObjectPeer * Post an event. Queue it for execution by the callback thread. */ void postEvent(AWTEvent event) { + preprocessPostEvent(event); WToolkit.postEvent(WToolkit.targetToAppContext(target), event); } + void preprocessPostEvent(AWTEvent event) {} + // Routines to support deferred window positioning. public void beginLayout() { // Skip all painting till endLayout @@ -895,25 +963,6 @@ public abstract class WComponentPeer extends WObjectPeer public void setBoundsOperation(int operation) { } - - native void setRectangularShape(int lox, int loy, int hix, int hiy, - sun.java2d.pipe.Region region); - - - // REMIND: Temp workaround for issues with using HW acceleration - // in the browser on Vista when DWM is enabled. - // @return true if the toplevel container is not an EmbeddedFrame or - // if this EmbeddedFrame is acceleration capable, false otherwise - private static final boolean isContainingTopLevelAccelCapable(Component c) { - while (c != null && !(c instanceof WEmbeddedFrame)) { - c = c.getParent(); - } - if (c == null) { - return true; - } - return ((WEmbeddedFramePeer)c.getPeer()).isAccelCapable(); - } - /** * Returns whether this component is capable of being hw accelerated. * More specifically, whether rendering to this component or a @@ -928,28 +977,36 @@ public abstract class WComponentPeer extends WObjectPeer * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT */ public boolean isAccelCapable() { - // REMIND: Temp workaround for issues with using HW acceleration - // in the browser on Vista when DWM is enabled - if (!isContainingTopLevelAccelCapable((Component)target)) { - return false; - } - - // REMIND: translucent windows support-related -/* boolean isTranslucent = SunToolkit.isContainingTopLevelTranslucent((Component)target); // D3D/OGL and translucent windows interacted poorly in Windows XP; // these problems are no longer present in Vista return !isTranslucent || Win32GraphicsEnvironment.isVistaOS(); -*/ - return true; + } + + native void setRectangularShape(int lox, int loy, int hix, int hiy, + Region region); + + + // REMIND: Temp workaround for issues with using HW acceleration + // in the browser on Vista when DWM is enabled. + // @return true if the toplevel container is not an EmbeddedFrame or + // if this EmbeddedFrame is acceleration capable, false otherwise + private static final boolean isContainingTopLevelAccelCapable(Component c) { + while (c != null && !(c instanceof WEmbeddedFrame)) { + c = c.getParent(); + } + if (c == null) { + return true; + } + return ((WEmbeddedFramePeer)c.getPeer()).isAccelCapable(); } /** * Applies the shape to the native component window. * @since 1.7 */ - public void applyShape(sun.java2d.pipe.Region shape) { + public void applyShape(Region shape) { if (shapeLog.isLoggable(Level.FINER)) { shapeLog.finer( "*** INFO: Setting shape: PEER: " + this @@ -965,4 +1022,15 @@ public abstract class WComponentPeer extends WObjectPeer } } + /** + * Lowers this component at the bottom of the above component. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ + public void setZOrder(ComponentPeer above) { + long aboveHWND = (above != null) ? ((WComponentPeer)above).getHWnd() : 0; + + setZOrder(aboveHWND); + } + + private native void setZOrder(long above); } diff --git a/src/windows/classes/sun/awt/windows/WFileDialogPeer.java b/src/windows/classes/sun/awt/windows/WFileDialogPeer.java index 548dc3d41ee9fb6586f8f33807f4ea9c94be4fc6..979308ab545b82934864df387801a86a2d437b65 100644 --- a/src/windows/classes/sun/awt/windows/WFileDialogPeer.java +++ b/src/windows/classes/sun/awt/windows/WFileDialogPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -225,23 +225,16 @@ public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer { public void addDropTarget(DropTarget dt) {} public void removeDropTarget(DropTarget dt) {} public void updateFocusableWindowState() {} + public void setZOrder(ComponentPeer above) {} /** * Initialize JNI field and method ids */ private static native void initIDs(); - /** - * WFileDialogPeer doesn't have native pData so we don't do restack on it - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return false; - } + // The effects are not supported for system dialogs. + public void applyShape(sun.java2d.pipe.Region shape) {} + public void setOpacity(float opacity) {} + public void setOpaque(boolean isOpaque) {} + public void updateWindow(java.awt.image.BufferedImage backBuffer) {} } diff --git a/src/windows/classes/sun/awt/windows/WFramePeer.java b/src/windows/classes/sun/awt/windows/WFramePeer.java index 2353daf3d2968e35e5a6eb485cddf114cd4d6d5a..79bf6b77e41f28bce0de66f9bed2fbf7716dd0fc 100644 --- a/src/windows/classes/sun/awt/windows/WFramePeer.java +++ b/src/windows/classes/sun/awt/windows/WFramePeer.java @@ -25,27 +25,46 @@ package sun.awt.windows; import java.util.Vector; + import java.awt.*; import java.awt.peer.*; import java.awt.image.ImageObserver; -import sun.awt.image.ImageRepresentation; -import sun.awt.image.IntegerComponentRaster; -import sun.awt.image.ToolkitImage; + import java.awt.image.Raster; import java.awt.image.DataBuffer; import java.awt.image.DataBufferInt; import java.awt.image.BufferedImage; -import sun.awt.im.*; -import sun.awt.Win32GraphicsDevice; + import java.awt.image.ColorModel; +import sun.awt.image.ImageRepresentation; +import sun.awt.image.IntegerComponentRaster; +import sun.awt.image.ToolkitImage; +import sun.awt.im.*; +import sun.awt.Win32GraphicsDevice; +import sun.awt.AWTAccessor; class WFramePeer extends WWindowPeer implements FramePeer { + static { + initIDs(); + } + + // initialize JNI field and method IDs + private static native void initIDs(); + // FramePeer implementation public native void setState(int state); public native int getState(); + // sync target and peer + public void setExtendedState(int state) { + AWTAccessor.getFrameAccessor().setExtendedState((Frame)target, state); + } + public int getExtendedState() { + return AWTAccessor.getFrameAccessor().getExtendedState((Frame)target); + } + // Convenience methods to save us from trouble of extracting // Rectangle fields in native code. private native void setMaximizedBounds(int x, int y, int w, int h); diff --git a/src/windows/classes/sun/awt/windows/WKeyboardFocusManagerPeer.java b/src/windows/classes/sun/awt/windows/WKeyboardFocusManagerPeer.java new file mode 100644 index 0000000000000000000000000000000000000000..89289960316c5c04434465827eb2270c3a819b76 --- /dev/null +++ b/src/windows/classes/sun/awt/windows/WKeyboardFocusManagerPeer.java @@ -0,0 +1,75 @@ +/* + * 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 sun.awt.windows; + +import java.awt.KeyboardFocusManager; +import java.awt.Window; +import java.awt.Component; +import java.awt.peer.ComponentPeer; +import sun.awt.KeyboardFocusManagerPeerImpl; +import sun.awt.CausedFocusEvent; + +class WKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl { + static native void setNativeFocusOwner(ComponentPeer peer); + static native Component getNativeFocusOwner(); + static native Window getNativeFocusedWindow(); + + WKeyboardFocusManagerPeer(KeyboardFocusManager manager) { + super(manager); + } + + @Override + public void setCurrentFocusOwner(Component comp) { + setNativeFocusOwner(comp != null ? comp.getPeer() : null); + } + + @Override + public Component getCurrentFocusOwner() { + return getNativeFocusOwner(); + } + + @Override + public Window getCurrentFocusedWindow() { + return getNativeFocusedWindow(); + } + + public static boolean deliverFocus(Component lightweightChild, + Component target, + boolean temporary, + boolean focusedWindowChangeAllowed, + long time, + CausedFocusEvent.Cause cause) + { + // TODO: do something to eliminate this forwarding + return KeyboardFocusManagerPeerImpl.deliverFocus(lightweightChild, + target, + temporary, + focusedWindowChangeAllowed, + time, + cause, + getNativeFocusOwner()); + } +} diff --git a/src/windows/classes/sun/awt/windows/WPanelPeer.java b/src/windows/classes/sun/awt/windows/WPanelPeer.java index 8a0d7ffbcc18bca1912f1ed926a7344653596deb..10ca423146cb2224647f3d9aa710de9d59c58655 100644 --- a/src/windows/classes/sun/awt/windows/WPanelPeer.java +++ b/src/windows/classes/sun/awt/windows/WPanelPeer.java @@ -100,34 +100,6 @@ class WPanelPeer extends WCanvasPeer implements PanelPeer { return getInsets(); } - /* - * From the DisplayChangedListener interface. Often is - * up-called from a WWindowPeer instance. - */ - public void displayChanged() { - super.displayChanged(); - displayChanged((Container)target); - } - - /* - * Recursively iterates through all the HW and LW children - * of the container and calls displayChanged() for HW peers. - * Iteration through children peers only is not enough as the - * displayChanged notification may not be propagated to HW - * components inside LW containers, see 4452373 for details. - */ - private static void displayChanged(Container target) { - Component children[] = ((Container)target).getComponents(); - for (Component child : children) { - ComponentPeer cpeer = child.getPeer(); - if (cpeer instanceof WComponentPeer) { - ((WComponentPeer)cpeer).displayChanged(); - } else if (child instanceof Container) { - displayChanged((Container)child); - } - } - } - private native void pRestack(Object[] peers); private void restack(Container cont, Vector peers) { for (int i = 0; i < cont.getComponentCount(); i++) { diff --git a/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java b/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java index c1e06f53cb569f31f141084781cb51cef75efee9..db1bedc911874cbf114b8e2f1b9cda0b0bec97c3 100644 --- a/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java +++ b/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 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 @@ -27,6 +27,7 @@ package sun.awt.windows; import java.awt.*; import java.awt.peer.DialogPeer; +import java.awt.peer.ComponentPeer; import java.awt.dnd.DropTarget; import java.util.Vector; import sun.awt.AppContext; @@ -137,23 +138,16 @@ public class WPrintDialogPeer extends WWindowPeer implements DialogPeer { void invalidate(int x, int y, int width, int height) {} public void addDropTarget(DropTarget dt) {} public void removeDropTarget(DropTarget dt) {} + public void setZOrder(ComponentPeer above) {} /** * Initialize JNI field and method ids */ private static native void initIDs(); - /** - * WPrintDialogPeer doesn't have native pData so we don't do restack on it - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return false; - } + // The effects are not supported for system dialogs. + public void applyShape(sun.java2d.pipe.Region shape) {} + public void setOpacity(float opacity) {} + public void setOpaque(boolean isOpaque) {} + public void updateWindow(java.awt.image.BufferedImage backBuffer) {} } diff --git a/src/windows/classes/sun/awt/windows/WScrollPanePeer.java b/src/windows/classes/sun/awt/windows/WScrollPanePeer.java index 70b3725cf80bc497c62bb5ccfb6cda5965bfa012..2e8c5e60bd5b7cf0b647eb072854a954942b0596 100644 --- a/src/windows/classes/sun/awt/windows/WScrollPanePeer.java +++ b/src/windows/classes/sun/awt/windows/WScrollPanePeer.java @@ -269,10 +269,4 @@ class WScrollPanePeer extends WPanelPeer implements ScrollPanePeer { } } - /** - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - // Since ScrollPane can only have one child its restacking does nothing. - } } diff --git a/src/windows/classes/sun/awt/windows/WToolkit.java b/src/windows/classes/sun/awt/windows/WToolkit.java index 55c1dde092d163976f3a3517a2e7ea41ccc71182..62011b9b85c33a872723740e6150b7c3fcc225cc 100644 --- a/src/windows/classes/sun/awt/windows/WToolkit.java +++ b/src/windows/classes/sun/awt/windows/WToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -494,6 +494,12 @@ public class WToolkit extends SunToolkit implements Runnable { return true; } + public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) + throws HeadlessException + { + return new WKeyboardFocusManagerPeer(manager); + } + protected native void setDynamicLayoutNative(boolean b); public void setDynamicLayout(boolean b) { @@ -975,4 +981,34 @@ public class WToolkit extends SunToolkit implements Runnable { public boolean areExtraMouseButtonsEnabled() throws HeadlessException { return areExtraMouseButtonsEnabled; } + + @Override + public boolean isWindowOpacitySupported() { + // supported in Win2K and later + return true; + } + + @Override + public boolean isWindowShapingSupported() { + return true; + } + + @Override + public boolean isWindowTranslucencySupported() { + // supported in Win2K and later + return true; + } + + @Override + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + //XXX: worth checking if 8-bit? Anyway, it doesn't hurt. + return true; + } + + // On MS Windows one must use the peer.updateWindow() to implement + // non-opaque windows. + @Override + public boolean needUpdateWindow() { + return true; + } } diff --git a/src/windows/classes/sun/awt/windows/WWindowPeer.java b/src/windows/classes/sun/awt/windows/WWindowPeer.java index 6afdb2be6b94993609933d763966e8a82d5fc62f..3c62402093442ade1a0cca90c9b1304205dd83f7 100644 --- a/src/windows/classes/sun/awt/windows/WWindowPeer.java +++ b/src/windows/classes/sun/awt/windows/WWindowPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -31,19 +31,19 @@ import java.awt.peer.*; import java.beans.*; -import java.lang.ref.*; import java.lang.reflect.*; -import java.security.*; - import java.util.*; import java.util.List; import java.util.logging.*; import sun.awt.*; -import sun.awt.image.*; -public class WWindowPeer extends WPanelPeer implements WindowPeer { +import sun.java2d.pipe.Region; + +public class WWindowPeer extends WPanelPeer implements WindowPeer, + DisplayChangedListener +{ private static final Logger log = Logger.getLogger("sun.awt.windows.WWindowPeer"); private static final Logger screenLog = Logger.getLogger("sun.awt.windows.screen.WWindowPeer"); @@ -52,6 +52,10 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { // extends WWindowPeer, not WDialogPeer private WWindowPeer modalBlocker = null; + private boolean isOpaque; + + private volatile TranslucentWindowPainter painter; + /* * A key used for storing a list of active windows in AppContext. The value * is a list of windows, sorted by the time of activation: later a window is @@ -73,6 +77,12 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { private final static PropertyChangeListener guiDisposedListener = new GuiDisposedListener(); + /* + * Called (on the Toolkit thread) before the appropriate + * WindowStateEvent is posted to the EventQueue. + */ + private WindowListener windowListener; + /** * Initialize JNI field IDs */ @@ -91,9 +101,18 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { l.remove(this); } } + // Remove ourself from the Map of DisplayChangeListeners GraphicsConfiguration gc = getGraphicsConfiguration(); ((Win32GraphicsDevice)gc.getDevice()).removeDisplayChangedListener(this); + + TranslucentWindowPainter currentPainter = painter; + if (currentPainter != null) { + currentPainter.flush(); + // don't set the current one to null here; reduces the chances of + // MT issues (like NPEs) + } + super.disposeImpl(); } @@ -158,6 +177,10 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { initActiveWindowsTracking((Window)target); updateIconImages(); + + updateShape(); + updateOpacity(); + updateOpaque(); } native void createAwtWindow(WComponentPeer parent); @@ -183,7 +206,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { // super.displayChanged() in WWindowPeer.displayChanged() regardless of whether // GraphicsDevice was really changed, or not. So we need to track it here. updateGC(); - resetTargetGC(); realShow(); updateMinimumSize(); @@ -191,6 +213,8 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { if (((Window)target).isAlwaysOnTopSupported() && alwaysOnTop) { setAlwaysOnTop(alwaysOnTop); } + + updateWindow(null); } // Synchronize the insets members (here & in helper) with actual window @@ -214,27 +238,64 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { int[] smallIconRaster, int smw, int smh); synchronized native void reshapeFrame(int x, int y, int width, int height); - public boolean requestWindowFocus() { - // Win32 window doesn't need this - return false; + + public boolean requestWindowFocus(CausedFocusEvent.Cause cause) { + if (!focusAllowedFor()) { + return false; + } + return requestWindowFocus(cause == CausedFocusEvent.Cause.MOUSE_EVENT); } + public native boolean requestWindowFocus(boolean isMouseEventCause); public boolean focusAllowedFor() { - Window target = (Window)this.target; - if (!target.isVisible() || - !target.isEnabled() || - !target.isFocusable()) + Window window = (Window)this.target; + if (!window.isVisible() || + !window.isEnabled() || + !window.isFocusableWindow()) { return false; } - if (isModalBlocked()) { return false; } - return true; } + public void hide() { + WindowListener listener = windowListener; + if (listener != null) { + // We're not getting WINDOW_CLOSING from the native code when hiding + // the window programmatically. So, create it and notify the listener. + listener.windowClosing(new WindowEvent((Window)target, WindowEvent.WINDOW_CLOSING)); + } + super.hide(); + } + + // WARNING: it's called on the Toolkit thread! + void preprocessPostEvent(AWTEvent event) { + if (event instanceof WindowEvent) { + WindowListener listener = windowListener; + if (listener != null) { + switch(event.getID()) { + case WindowEvent.WINDOW_CLOSING: + listener.windowClosing((WindowEvent)event); + break; + case WindowEvent.WINDOW_ICONIFIED: + listener.windowIconified((WindowEvent)event); + break; + } + } + } + } + + synchronized void addWindowListener(WindowListener l) { + windowListener = AWTEventMulticaster.add(windowListener, l); + } + + synchronized void removeWindowListener(WindowListener l) { + windowListener = AWTEventMulticaster.remove(windowListener, l); + } + public void updateMinimumSize() { Dimension minimumSize = null; if (((Component)target).isMinimumSizeSet()) { @@ -273,6 +334,31 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { } } + private void updateShape() { + // Shape shape = ((Window)target).getShape(); + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + applyShape(Region.getInstance(shape, null)); + } + } + + private void updateOpacity() { + // float opacity = ((Window)target).getOpacity(); + float opacity = AWTAccessor.getWindowAccessor().getOpacity((Window)target); + if (opacity < 1.0f) { + setOpacity(opacity); + } + } + + private void updateOpaque() { + this.isOpaque = true; + // boolean opaque = ((Window)target).isOpaque(); + boolean opaque = AWTAccessor.getWindowAccessor().isOpaque((Window)target); + if (!opaque) { + setOpaque(opaque); + } + } + native void setMinSize(int width, int height); /* @@ -358,14 +444,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { }); } - - /* - * Called from WCanvasPeer.displayChanged(). - * Override to do nothing - Window and WWindowPeer GC must never be set to - * null! - */ - void clearLocalGC() {} - public void updateGC() { int scrn = getScreenImOn(); if (screenLog.isLoggable(Level.FINER)) { @@ -404,18 +482,36 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { oldDev.removeDisplayChangedListener(this); newDev.addDisplayChangedListener(this); } + + SunToolkit.executeOnEventHandlerThread((Component)target, + new Runnable() { + public void run() { + AWTAccessor.getComponentAccessor(). + setGraphicsConfiguration((Component)target, winGraphicsConfig); + } + }); } - /* - * From the DisplayChangedListener interface + /** + * From the DisplayChangedListener interface. * * This method handles a display change - either when the display settings * are changed, or when the window has been dragged onto a different * display. + * Called after a change in the display mode. This event + * triggers replacing the surfaceData object (since that object + * reflects the current display depth information, which has + * just changed). */ public void displayChanged() { updateGC(); - super.displayChanged(); + } + + /** + * Part of the DisplayChangedListener interface: components + * do not need to react to this event + */ + public void paletteChanged() { } private native int getScreenImOn(); @@ -451,8 +547,10 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { private volatile int sysH = 0; Rectangle constrainBounds(int x, int y, int width, int height) { + GraphicsConfiguration gc = this.winGraphicsConfig; + // We don't restrict the setBounds() operation if the code is trusted. - if (!hasWarningWindow()) { + if (!hasWarningWindow() || gc == null) { return new Rectangle(x, y, width, height); } @@ -461,24 +559,24 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { int newW = width; int newH = height; - GraphicsConfiguration gc = ((Window)target).getGraphicsConfiguration(); Rectangle sB = gc.getBounds(); - Insets sIn = ((Window)target).getToolkit().getScreenInsets(gc); + Insets sIn = Toolkit.getDefaultToolkit().getScreenInsets(gc); int screenW = sB.width - sIn.left - sIn.right; int screenH = sB.height - sIn.top - sIn.bottom; // If it's undecorated or is not currently visible - if (!((Window)target).isVisible() || isTargetUndecorated()) { + if (!AWTAccessor.getComponentAccessor().isVisible_NoClientCode( + (Component)target) || isTargetUndecorated()) + { // Now check each point is within the visible part of the screen int screenX = sB.x + sIn.left; int screenY = sB.y + sIn.top; - // First make sure the size is withing the visible part of the screen + // First make sure the size is within the visible part of the screen if (newW > screenW) { newW = screenW; } - if (newH > screenH) { newH = screenH; } @@ -489,7 +587,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { } else if (newX + newW > screenX + screenW) { newX = screenX + screenW - newW; } - if (newY < screenY) { newY = screenY; } else if (newY + newH > screenY + screenH) { @@ -504,7 +601,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { if (newW > maxW) { newW = maxW; } - if (newH > maxH) { newH = maxH; } @@ -513,6 +609,8 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { return new Rectangle(newX, newY, newW, newH); } + public native void repositionSecurityWarning(); + @Override public void setBounds(int x, int y, int width, int height, int op) { Rectangle newBounds = constrainBounds(x, y, width, height); @@ -525,6 +623,135 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer { super.setBounds(newBounds.x, newBounds.y, newBounds.width, newBounds.height, op); } + @Override + public void print(Graphics g) { + // We assume we print the whole frame, + // so we expect no clip was set previously + Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target); + if (shape != null) { + g.setClip(shape); + } + super.print(g); + } + + private void replaceSurfaceDataRecursively(Component c) { + if (c instanceof Container) { + for (Component child : ((Container)c).getComponents()) { + replaceSurfaceDataRecursively(child); + } + } + ComponentPeer cp = c.getPeer(); + if (cp instanceof WComponentPeer) { + ((WComponentPeer)cp).replaceSurfaceDataLater(); + } + } + + private native void setOpacity(int iOpacity); + + public void setOpacity(float opacity) { + if (!((SunToolkit)((Window)target).getToolkit()). + isWindowOpacitySupported()) + { + return; + } + + replaceSurfaceDataRecursively((Component)getTarget()); + + final int maxOpacity = 0xff; + int iOpacity = (int)(opacity * maxOpacity); + if (iOpacity < 0) { + iOpacity = 0; + } + if (iOpacity > maxOpacity) { + iOpacity = maxOpacity; + } + + setOpacity(iOpacity); + updateWindow(null); + } + + private native void setOpaqueImpl(boolean isOpaque); + + public void setOpaque(boolean isOpaque) { + Window target = (Window)getTarget(); + + SunToolkit sunToolkit = (SunToolkit)target.getToolkit(); + if (!sunToolkit.isWindowTranslucencySupported() || + !sunToolkit.isTranslucencyCapable(target.getGraphicsConfiguration())) + { + return; + } + + boolean opaqueChanged = this.isOpaque != isOpaque; + boolean isVistaOS = Win32GraphicsEnvironment.isVistaOS(); + + if (opaqueChanged && !isVistaOS){ + // non-Vista OS: only replace the surface data if the opacity + // status changed (see WComponentPeer.isAccelCapable() for more) + replaceSurfaceDataRecursively(target); + } + + this.isOpaque = isOpaque; + + setOpaqueImpl(isOpaque); + + if (opaqueChanged) { + if (isOpaque) { + TranslucentWindowPainter currentPainter = painter; + if (currentPainter != null) { + currentPainter.flush(); + painter = null; + } + } else { + painter = TranslucentWindowPainter.createInstance(this); + } + } + + if (opaqueChanged && isVistaOS) { + // On Vista: setting the window non-opaque makes the window look + // rectangular, though still catching the mouse clicks within + // its shape only. To restore the correct visual appearance + // of the window (i.e. w/ the correct shape) we have to reset + // the shape. + Shape shape = AWTAccessor.getWindowAccessor().getShape(target); + if (shape != null) { + AWTAccessor.getWindowAccessor().setShape(target, shape); + } + } + + updateWindow(null); + } + + public native void updateWindowImpl(int[] data, int width, int height); + + public void updateWindow(BufferedImage backBuffer) { + if (isOpaque) { + return; + } + + TranslucentWindowPainter currentPainter = painter; + if (currentPainter != null) { + currentPainter.updateWindow(backBuffer); + } else if (log.isLoggable(Level.FINER)) { + log.log(Level.FINER, + "Translucent window painter is null in updateWindow"); + } + } + + /** + * Paints the Applet Warning into the passed Graphics2D. This method is + * called by the TranslucentWindowPainter before updating the layered + * window. + * + * @param g Graphics context to paint the warning to + * @param w the width of the area + * @param h the height of the area + * @see TranslucentWindowPainter + */ + public void paintAppletWarning(Graphics2D g, int w, int h) { + // REMIND: the applet warning needs to be painted here + } + /* * The method maps the list of the active windows to the window's AppContext, * then the method registers ActiveWindowListener, GuiDisposedListener listeners; diff --git a/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java b/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java index b3b0fa8d5fce2f0293d1b701f3487f8676750bcd..53ae895ddfe94b870f995b7a38095532aa4cb8da 100644 --- a/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java +++ b/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 @@ -37,6 +37,7 @@ import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.HashMap; import sun.awt.SunToolkit; +import sun.awt.AWTAccessor; import sun.awt.Win32GraphicsConfig; import sun.awt.windows.WComponentPeer; import sun.java2d.InvalidPipeException; @@ -284,14 +285,12 @@ public class D3DScreenUpdateManager extends ScreenUpdateManager * @param peer for which target's the repaint should be issued */ private void repaintPeerTarget(WComponentPeer peer) { - // we don't want to call user code on our priveleged - // thread, delegate to EDT - final Component target = (Component)peer.getTarget(); - SunToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - target.repaint(); - } - }); + Component target = (Component)peer.getTarget(); + Rectangle bounds = AWTAccessor.getComponentAccessor().getBounds(target); + // the system-level painting operations should call the handlePaint() + // method of the WComponentPeer class to repaint the component; + // calling repaint() forces AWT to make call to update() + peer.handlePaint(0, 0, bounds.width, bounds.height); } /** diff --git a/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java b/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java index 27997aa8c59aded0aa7060878ea3c082fdb1f1ab..4164264a164d92cfc83e90c7e9f0de94316d1934 100644 --- a/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java +++ b/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-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 @@ -72,9 +72,8 @@ public abstract class WGLSurfaceData extends OGLSurfaceData { // the OGL pipeline can render directly to the screen and interfere // with layered windows, which is why we don't allow accelerated // surfaces in this case - if (!peer.isAccelCapable()) - // REMIND: commented until toplevel translucency is implemented -// || !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) + if (!peer.isAccelCapable() || + !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) { return null; } @@ -93,9 +92,8 @@ public abstract class WGLSurfaceData extends OGLSurfaceData { // the OGL pipeline can render directly to the screen and interfere // with layered windows, which is why we don't allow accelerated // surfaces in this case - if (!peer.isAccelCapable()) - // REMIND: commented until toplevel translucency is implemented -// || !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) + if (!peer.isAccelCapable() || + !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget())) { return null; } diff --git a/src/windows/classes/sun/net/NetHooks.java b/src/windows/classes/sun/net/NetHooks.java new file mode 100644 index 0000000000000000000000000000000000000000..0d8f60b3a42b9d7c0c63fd0febe0b6796f9ab82f --- /dev/null +++ b/src/windows/classes/sun/net/NetHooks.java @@ -0,0 +1,59 @@ +/* + * 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 sun.net; + +import java.net.InetAddress; +import java.io.FileDescriptor; +import java.io.IOException; + +/** + * Defines static methods to ensure that any installed net hooks are invoked + * prior to binding or connecting TCP sockets. + */ + +public final class NetHooks { + + /** + * Invoke prior to binding a TCP socket. + */ + public static void beforeTcpBind(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + // nothing to do + } + + /** + * Invoke prior to connecting an unbound TCP socket. + */ + public static void beforeTcpConnect(FileDescriptor fdObj, + InetAddress address, + int port) + throws IOException + { + // nothing to do + } +} diff --git a/src/windows/classes/sun/nio/ch/SctpChannelImpl.java b/src/windows/classes/sun/nio/ch/SctpChannelImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4a06a07ddfda7abba233aa2c3ff6af3b341f1232 --- /dev/null +++ b/src/windows/classes/sun/nio/ch/SctpChannelImpl.java @@ -0,0 +1,150 @@ +/* + * 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 sun.nio.ch; + +import java.net.SocketAddress; +import java.net.InetAddress; +import java.io.IOException; +import java.util.Set; +import java.nio.ByteBuffer; +import java.nio.channels.spi.SelectorProvider; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.NotificationHandler; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpSocketOption; + +/** + * Unimplemented. + */ +public class SctpChannelImpl extends SctpChannel +{ + private static final String message = "SCTP not supported on this platform"; + + public SctpChannelImpl(SelectorProvider provider) { + super(provider); + throw new UnsupportedOperationException(message); + } + + @Override + public Association association() { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpChannel bind(SocketAddress local) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpChannel bindAddress(InetAddress address) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpChannel unbindAddress(InetAddress address) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public boolean connect(SocketAddress remote) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public boolean connect(SocketAddress remote, int maxOutStreams, + int maxInStreams) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public boolean isConnectionPending() { + throw new UnsupportedOperationException(message); + } + + @Override + public boolean finishConnect() throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SocketAddress> getAllLocalAddresses() + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SocketAddress> getRemoteAddresses() + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpChannel shutdown() throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> T getOption(SctpSocketOption<T> name) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> SctpChannel setOption(SctpSocketOption<T> name, T value) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SctpSocketOption<?>> supportedOptions() { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> MessageInfo receive(ByteBuffer dst, T attachment, + NotificationHandler<T> handler) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public int send(ByteBuffer src, MessageInfo messageInfo) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + protected void implConfigureBlocking(boolean block) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public void implCloseSelectableChannel() throws IOException { + throw new UnsupportedOperationException(message); + } +} diff --git a/src/windows/classes/sun/nio/ch/SctpMultiChannelImpl.java b/src/windows/classes/sun/nio/ch/SctpMultiChannelImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..372a0616d9c2fab6993ede0f46d030e548d922e6 --- /dev/null +++ b/src/windows/classes/sun/nio/ch/SctpMultiChannelImpl.java @@ -0,0 +1,137 @@ +/* + * 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 sun.nio.ch; + +import java.net.SocketAddress; +import java.net.InetAddress; +import java.io.IOException; +import java.util.Set; +import java.nio.ByteBuffer; +import java.nio.channels.spi.SelectorProvider; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.NotificationHandler; +import com.sun.nio.sctp.SctpMultiChannel; +import com.sun.nio.sctp.SctpSocketOption; + +/** + * Unimplemented. + */ +public class SctpMultiChannelImpl extends SctpMultiChannel +{ + private static final String message = "SCTP not supported on this platform"; + + public SctpMultiChannelImpl(SelectorProvider provider) { + super(provider); + throw new UnsupportedOperationException(message); + } + + @Override + public Set<Association> associations() { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpMultiChannel bind(SocketAddress local, + int backlog) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpMultiChannel bindAddress(InetAddress address) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpMultiChannel unbindAddress(InetAddress address) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SocketAddress> getAllLocalAddresses() + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SocketAddress> getRemoteAddresses + (Association association) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpMultiChannel shutdown(Association association) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> T getOption(SctpSocketOption<T> name, + Association association) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> SctpMultiChannel setOption(SctpSocketOption<T> name, + T value, Association association) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SctpSocketOption<?>> supportedOptions() { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> MessageInfo receive(ByteBuffer buffer, T attachment, + NotificationHandler<T> handler) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public int send(ByteBuffer buffer, MessageInfo messageInfo) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpChannel branch(Association association) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + protected void implConfigureBlocking(boolean block) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public void implCloseSelectableChannel() throws IOException { + throw new UnsupportedOperationException(message); + } +} diff --git a/src/windows/classes/sun/nio/ch/SctpServerChannelImpl.java b/src/windows/classes/sun/nio/ch/SctpServerChannelImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..36fbbcfd95f1e9c9949da0fdd6b7d03197783715 --- /dev/null +++ b/src/windows/classes/sun/nio/ch/SctpServerChannelImpl.java @@ -0,0 +1,102 @@ +/* + * 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 sun.nio.ch; + +import java.net.SocketAddress; +import java.net.InetAddress; +import java.io.IOException; +import java.util.Set; +import java.nio.channels.spi.SelectorProvider; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import com.sun.nio.sctp.SctpSocketOption; + +/** + * Unimplemented. + */ +public class SctpServerChannelImpl extends SctpServerChannel +{ + private static final String message = "SCTP not supported on this platform"; + + public SctpServerChannelImpl(SelectorProvider provider) { + super(provider); + throw new UnsupportedOperationException(message); + } + + @Override + public SctpChannel accept() throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpServerChannel bind(SocketAddress local, + int backlog) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpServerChannel bindAddress(InetAddress address) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public SctpServerChannel unbindAddress(InetAddress address) + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SocketAddress> getAllLocalAddresses() + throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> T getOption(SctpSocketOption<T> name) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public <T> SctpServerChannel setOption(SctpSocketOption<T> name, + T value) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public Set<SctpSocketOption<?>> supportedOptions() { + throw new UnsupportedOperationException(message); + } + + @Override + protected void implConfigureBlocking(boolean block) throws IOException { + throw new UnsupportedOperationException(message); + } + + @Override + public void implCloseSelectableChannel() throws IOException { + throw new UnsupportedOperationException(message); + } +} diff --git a/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java b/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java index ef668648d673eaca7ff103a2e2da0192768b46c2..e08f460d91946a11dc65cc0706972736f96c9456 100644 --- a/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java +++ b/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java @@ -354,16 +354,9 @@ public class WindowsAsynchronousFileChannelImpl } } - // 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 --git a/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java b/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java index 5457a2cfb2cf673a8389ef396e7fee1753270c98..5df8c8cd6c06e060509d122620034c2e0684482e 100644 --- a/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java +++ b/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java @@ -34,7 +34,6 @@ import java.nio.channels.Selector; import java.nio.channels.ClosedSelectorException; import java.nio.channels.Pipe; import java.nio.channels.SelectableChannel; -import java.nio.channels.SelectionKey; import java.io.IOException; import java.util.List; import java.util.ArrayList; @@ -72,7 +71,7 @@ final class WindowsSelectorImpl extends SelectorImpl { private int threadsCount = 0; // A list of helper threads for select. - private final List<Thread> threads = new ArrayList<Thread>(); + private final List<SelectThread> threads = new ArrayList<SelectThread>(); //Pipe used as a wakeup object. private final Pipe wakeupPipe; @@ -201,7 +200,7 @@ final class WindowsSelectorImpl extends SelectorImpl { Thread.currentThread().interrupt(); } } - if (thread.index >= threads.size()) { // redundant thread + if (thread.isZombie()) { // redundant thread return true; // will cause run() to exit. } else { thread.lastRun = runsCounter; // update lastRun @@ -388,9 +387,10 @@ final class WindowsSelectorImpl extends SelectorImpl { // Represents a helper thread used for select. private final class SelectThread extends Thread { - private int index; // index of this thread - SubSelector subSelector; + private final int index; // index of this thread + final SubSelector subSelector; private long lastRun = 0; // last run number + private volatile boolean zombie; // Creates a new thread private SelectThread(int i) { this.index = i; @@ -398,6 +398,12 @@ final class WindowsSelectorImpl extends SelectorImpl { //make sure we wait for next round of poll this.lastRun = startLock.runsCounter; } + void makeZombie() { + zombie = true; + } + boolean isZombie() { + return zombie; + } public void run() { while (true) { // poll loop // wait for the start of poll. If this thread has become @@ -432,7 +438,7 @@ final class WindowsSelectorImpl extends SelectorImpl { } else if (threadsCount < threads.size()) { // Some threads become redundant. Remove them from the threads List. for (int i = threads.size() - 1 ; i >= threadsCount; i--) - threads.remove(i); + threads.remove(i).makeZombie(); } } @@ -468,10 +474,9 @@ final class WindowsSelectorImpl extends SelectorImpl { updateCount++; int numKeysUpdated = 0; numKeysUpdated += subSelector.processSelectedKeys(updateCount); - Iterator it = threads.iterator(); - while (it.hasNext()) - numKeysUpdated += ((SelectThread)it.next()).subSelector. - processSelectedKeys(updateCount); + for (SelectThread t: threads) { + numKeysUpdated += t.subSelector.processSelectedKeys(updateCount); + } return numKeysUpdated; } @@ -495,13 +500,13 @@ final class WindowsSelectorImpl extends SelectorImpl { } pollWrapper.free(); pollWrapper = null; - selectedKeys = null; - channelArray = null; - threads.clear(); - // Call startThreads. All remaining helper threads now exit, - // since threads.size() = 0; - startLock.startThreads(); - } + selectedKeys = null; + channelArray = null; + // Make all remaining helper threads exit + for (SelectThread t: threads) + t.makeZombie(); + startLock.startThreads(); + } } } } diff --git a/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java b/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java index 146d7c1632db9a6058d99c14d0d8708aef453ee3..44dd25ab8cd6ac3a799b5d4cf353805d9bd03643 100644 --- a/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java +++ b/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java @@ -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.AlgorithmParameterSpec; import java.security.spec.RSAKeyGenParameterSpec; import sun.security.jca.JCAUtil; +import sun.security.rsa.RSAKeyFactory; /** * RSA keypair generator. @@ -43,8 +44,8 @@ import sun.security.jca.JCAUtil; 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 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { // 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 final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { 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 @@ public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi { 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 --git a/src/windows/classes/sun/security/mscapi/RSASignature.java b/src/windows/classes/sun/security/mscapi/RSASignature.java index 606423d53a40d266de97f52be4bd0d1e2d8e7cf2..982e1836a7de04f2834952fdc1901fa2a9142793 100644 --- a/src/windows/classes/sun/security/mscapi/RSASignature.java +++ b/src/windows/classes/sun/security/mscapi/RSASignature.java @@ -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.SecureRandom; 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 @@ abstract class RSASignature extends java.security.SignatureSpi // 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 @@ abstract class RSASignature extends java.security.SignatureSpi : modulusBytes.length * 8; byte[] keyBlob = generatePublicKeyBlob( - keyBitLength, modulusBytes, - rsaKey.getPublicExponent().toByteArray()); + keyBitLength, modulusBytes, exponentBytes); publicKey = importPublicKey(keyBlob, keyBitLength); @@ -166,12 +177,11 @@ abstract class RSASignature extends java.security.SignatureSpi } 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 --git a/src/windows/native/java/io/WinNTFileSystem_md.c b/src/windows/native/java/io/WinNTFileSystem_md.c index 13d4c7e919bc6b103e2c42ccfdd931ed969b3103..f4cc691115b1be94e027188a15b831debdd9524b 100644 --- a/src/windows/native/java/io/WinNTFileSystem_md.c +++ b/src/windows/native/java/io/WinNTFileSystem_md.c @@ -309,12 +309,13 @@ Java_java_io_WinNTFileSystem_getLastModifiedTime(JNIEnv *env, jobject this, /* No template file */ NULL); if (h != INVALID_HANDLE_VALUE) { - GetFileTime(h, NULL, NULL, &t); + if (GetFileTime(h, NULL, NULL, &t)) { + modTime.LowPart = (DWORD) t.dwLowDateTime; + modTime.HighPart = (LONG) t.dwHighDateTime; + rv = modTime.QuadPart / 10000; + rv -= 11644473600000; + } CloseHandle(h); - modTime.LowPart = (DWORD) t.dwLowDateTime; - modTime.HighPart = (LONG) t.dwHighDateTime; - rv = modTime.QuadPart / 10000; - rv -= 11644473600000; } free(pathbuf); return rv; diff --git a/src/windows/native/java/lang/java_props_md.c b/src/windows/native/java/lang/java_props_md.c index f75721f9f71c9b91c32fab9ef9a6d38c7634c0b7..b15a9bafac05d8ffd40f97b51207eff2f052322b 100644 --- a/src/windows/native/java/lang/java_props_md.c +++ b/src/windows/native/java/lang/java_props_md.c @@ -717,6 +717,7 @@ GetJavaProperties(JNIEnv* env) * Windows Vista family 6 0 * Windows 2008 6 0 * where ((&ver.wServicePackMinor) + 2) = 1 + * Windows 7 6 1 * * This mapping will presumably be augmented as new Windows * versions are released. @@ -773,13 +774,18 @@ GetJavaProperties(JNIEnv* env) * and Windows Vista are identical, you must also test * whether the wProductType member is VER_NT_WORKSTATION. * If wProductType is VER_NT_WORKSTATION, the operating - * system is Windows Vista; otherwise, it is Windows + * system is Windows Vista or 7; otherwise, it is Windows * Server 2008." */ - if (ver.wProductType == VER_NT_WORKSTATION) - sprops.os_name = "Windows Vista"; - else + if (ver.wProductType == VER_NT_WORKSTATION) { + switch (ver.dwMinorVersion) { + case 0: sprops.os_name = "Windows Vista"; break; + case 1: sprops.os_name = "Windows 7"; break; + default: sprops.os_name = "Windows NT (unknown)"; + } + } else { sprops.os_name = "Windows Server 2008"; + } } else { sprops.os_name = "Windows NT (unknown)"; } diff --git a/src/windows/native/sun/awt/utility/rect.h b/src/windows/native/sun/awt/utility/rect.h index bc250e2ac1b7dea16f5995c176f3d5e1fd0f69d3..a8e9fc28bea452bc42f16287f8de01da7c682a0f 100644 --- a/src/windows/native/sun/awt/utility/rect.h +++ b/src/windows/native/sun/awt/utility/rect.h @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 @@ -43,5 +43,15 @@ typedef RECT RECT_T; #define RECT_INC_HEIGHT(r) (r).bottom++ +#if defined(__cplusplus) +extern "C" { +#endif + +int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height, + unsigned char * buf, RECT_T * outBuf); + +#if defined(__cplusplus) +} +#endif #endif // _AWT_RECT_H diff --git a/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp b/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp index 9c865dc971b0db4945c103d8acbf4c5e90c8464c..c6d4bb1b3ebcfb572d699dd13a2779d69fcd23fe 100644 --- a/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp +++ b/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 @@ -613,17 +613,15 @@ JNICALL Java_sun_java2d_d3d_D3DSurfaceData_updateWindowAccelImpl res = pTmpSurface->LockRect(&lockedRect, NULL, D3DLOCK_NOSYSLOCK); if (SUCCEEDED(res)) { - // REMIND: commented until translucent window support is integrated -// hBitmap = -// BitmapUtil::CreateBitmapFromARGBPre(w, h, -// lockedRect.Pitch, -// (int*)lockedRect.pBits); + hBitmap = + BitmapUtil::CreateBitmapFromARGBPre(w, h, + lockedRect.Pitch, + (int*)lockedRect.pBits); pTmpSurface->UnlockRect(); } RETURN_STATUS_IF_NULL(hBitmap, JNI_FALSE); - // REMIND: commented until translucent window support is integrated -// window->UpdateWindow(env, NULL, w, h, hBitmap); + window->UpdateWindow(env, NULL, w, h, hBitmap); // hBitmap is released in UpdateWindow diff --git a/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c b/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c index 71d5e876406cda55be1d12a51eba629e528b6859..3c3e09ceceac170050e60a3903d9cd0e59e3acae 100644 --- a/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c +++ b/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-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 @@ -625,17 +625,15 @@ JNIEXPORT jboolean JNICALL j2d_glPixelStorei(GL_PACK_ALIGNMENT, 4); // the pixels read from the surface are already premultiplied - // REMIND: commented until translucent window support is integrated -// hBitmap = BitmapUtil_CreateBitmapFromARGBPre(w, h, scanStride, -// (int*)pDst); + hBitmap = BitmapUtil_CreateBitmapFromARGBPre(w, h, scanStride, + (int*)pDst); free(pDst); if (hBitmap == NULL) { return JNI_FALSE; } - // REMIND: commented until translucent window support is integrated - // AwtWindow_UpdateWindow(env, peer, w, h, hBitmap); + AwtWindow_UpdateWindow(env, peer, w, h, hBitmap); // hBitmap is released in UpdateWindow diff --git a/src/windows/native/sun/nio/ch/FileDispatcherImpl.c b/src/windows/native/sun/nio/ch/FileDispatcherImpl.c index a65ad90e24d54e2326522794c027b7d23282b52c..7b41d86fad10e8770426f0f15d28872624882ae6 100644 --- a/src/windows/native/sun/nio/ch/FileDispatcherImpl.c +++ b/src/windows/native/sun/nio/ch/FileDispatcherImpl.c @@ -414,7 +414,7 @@ Java_sun_nio_ch_FileDispatcherImpl_release0(JNIEnv *env, jobject this, 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 --git a/src/windows/native/sun/security/krb5/NativeCreds.c b/src/windows/native/sun/security/krb5/NativeCreds.c index e112b86e9c3f64002b4f21f386168a471a8de0e1..c910c62be4a218bbddcaf7bfc1450d4a73177428 100644 --- a/src/windows/native/sun/security/krb5/NativeCreds.c +++ b/src/windows/native/sun/security/krb5/NativeCreds.c @@ -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 @@ jmethodID setRealmMethod = 0; * Function prototypes for internal routines * */ +BOOL native_debug = 0; BOOL PackageConnectLookup(PHANDLE,PULONG); @@ -113,208 +114,221 @@ JNIEXPORT jint JNICALL JNI_OnLoad( 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, "<init>", "([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, "<init>", "(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, "<init>", "([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, "<init>", "(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, "<init>", "(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, "<init>", "(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 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ if (krbcredsConstructor == 0) { krbcredsConstructor = (*env)->GetMethodID(env, krbcredsClass, "<init>", - "(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 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ 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 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ &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 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ } 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 @@ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativ &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 @@ ShowLastError( 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 @@ ShowLastError( 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 @@ jobject BuildPrincipal(JNIEnv *env, PKERB_EXTERNAL_NAME principalName, ((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 @@ jobject BuildEncryptionKey(JNIEnv *env, PKERB_CRYPTO_KEY cryptoKey) { // First, need to build a byte array jbyteArray ary; jobject encryptionKey = NULL; + unsigned int i; + + for (i=0; i<cryptoKey->Length; 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 @@ jobject BuildKerberosTime(JNIEnv *env, PLARGE_INTEGER kerbtime) { 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 --git a/src/windows/native/sun/windows/ComCtl32Util.cpp b/src/windows/native/sun/windows/ComCtl32Util.cpp index ac69cf3af60ef4ea24e08043e930ea8d9a1f642a..8ac9d764ab951fc0055825bdd76576bfc6fe12c3 100644 --- a/src/windows/native/sun/windows/ComCtl32Util.cpp +++ b/src/windows/native/sun/windows/ComCtl32Util.cpp @@ -27,6 +27,7 @@ #include "ComCtl32Util.h" ComCtl32Util::ComCtl32Util() { + m_bToolTipControlInitialized = FALSE; } ComCtl32Util::~ComCtl32Util() { @@ -36,7 +37,8 @@ void ComCtl32Util::InitLibraries() { INITCOMMONCONTROLSEX iccex; memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX)); iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); - ::InitCommonControlsEx(&iccex); + iccex.dwICC = ICC_TAB_CLASSES; + m_bToolTipControlInitialized = ::InitCommonControlsEx(&iccex); } WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) { diff --git a/src/windows/native/sun/windows/ComCtl32Util.h b/src/windows/native/sun/windows/ComCtl32Util.h index e137b43d0dfea11dc95a1d6c0f30ea353019697c..642667709670d72073ef1a4702d6ff6b3d188475 100644 --- a/src/windows/native/sun/windows/ComCtl32Util.h +++ b/src/windows/native/sun/windows/ComCtl32Util.h @@ -40,6 +40,10 @@ class ComCtl32Util void InitLibraries(); + INLINE BOOL IsToolTipControlInitialized() { + return m_bToolTipControlInitialized; + } + WNDPROC SubclassHWND(HWND hwnd, WNDPROC _WindowProc); // DefWindowProc is the same as returned from SubclassHWND void UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc); @@ -50,6 +54,8 @@ class ComCtl32Util ComCtl32Util(); ~ComCtl32Util(); + BOOL m_bToolTipControlInitialized; + // comctl32.dll version 6 window proc static LRESULT CALLBACK SharedWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, diff --git a/src/windows/native/sun/windows/DllUtil.cpp b/src/windows/native/sun/windows/DllUtil.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0c7077144c0dbad0c1667abe65247b50aa474c98 --- /dev/null +++ b/src/windows/native/sun/windows/DllUtil.cpp @@ -0,0 +1,87 @@ +/* + * 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. + */ + + +#include "DllUtil.h" + +// Disable warning about using this in the initializer list. +#pragma warning( disable : 4355) + +DllUtil::~DllUtil() +{ + if (module != NULL) { + ::FreeLibrary(module); + module = NULL; + } +} + +HMODULE DllUtil::GetModule() +{ + if (!module) { + module = ::LoadLibrary(name); + } + return module; +} + +FARPROC DllUtil::GetProcAddress(LPCSTR name) +{ + if (GetModule()) { + return ::GetProcAddress(GetModule(), name); + } + throw LibraryUnavailableException(); +} + +DwmAPI & DwmAPI::GetInstance() +{ + static DwmAPI dll; + return dll; +} + +DwmAPI::DwmAPI() : + DllUtil(_T("DWMAPI.DLL")), + DwmIsCompositionEnabledFunction((DllUtil*)this, "DwmIsCompositionEnabled"), + DwmGetWindowAttributeFunction((DllUtil*)this, "DwmGetWindowAttribute") +{ +} + +HRESULT DwmAPI::DwmIsCompositionEnabled(BOOL * pfEnabled) +{ + if (GetInstance().DwmIsCompositionEnabledFunction()) { + return GetInstance().DwmIsCompositionEnabledFunction()(pfEnabled); + } + throw FunctionUnavailableException(); +} + +HRESULT DwmAPI::DwmGetWindowAttribute(HWND hwnd, DWORD dwAttribute, + PVOID pvAttribute, DWORD cbAttribute) +{ + if (GetInstance().DwmGetWindowAttributeFunction()) { + return GetInstance().DwmGetWindowAttributeFunction()(hwnd, dwAttribute, + pvAttribute, cbAttribute); + } + throw FunctionUnavailableException(); +} + + diff --git a/src/windows/native/sun/windows/DllUtil.h b/src/windows/native/sun/windows/DllUtil.h new file mode 100644 index 0000000000000000000000000000000000000000..307d93d2b4f4f418f7b215bbd9f1d17d3c86384e --- /dev/null +++ b/src/windows/native/sun/windows/DllUtil.h @@ -0,0 +1,97 @@ +/* + * 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. + */ + +#ifndef DLLUTIL_H +#define DLLUTIL_H + +#include <tchar.h> +#include <windows.h> + +/** + * Utility class to handle dynamically loadable libraries. + * + * NOTE: THIS CLASS IS NOT THREAD-SAFE! + */ +class DllUtil { + public: + class Exception {}; + class LibraryUnavailableException : public Exception {}; + class FunctionUnavailableException : public Exception {}; + + FARPROC GetProcAddress(LPCSTR name); + + protected: + DllUtil(const TCHAR * name) : name(name), module(NULL) {} + virtual ~DllUtil(); + + HMODULE GetModule(); + + template <class FunctionType> class Function { + public: + Function(DllUtil * dll, LPCSTR name) : + dll(dll), name(name), function(NULL) {} + + inline FunctionType operator () () { + if (!function) { + function = (FunctionType)dll->GetProcAddress(name); + } + return function; + } + + private: + DllUtil * const dll; + LPCSTR name; + + FunctionType function; + }; + + private: + const TCHAR * const name; + HMODULE module; +}; + +class DwmAPI : public DllUtil { + public: + // See DWMWINDOWATTRIBUTE enum in dwmapi.h + static const DWORD DWMWA_EXTENDED_FRAME_BOUNDS = 9; + + static HRESULT DwmIsCompositionEnabled(BOOL * pfEnabled); + static HRESULT DwmGetWindowAttribute(HWND hwnd, DWORD dwAttribute, + PVOID pvAttribute, DWORD cbAttribute); + + private: + static DwmAPI & GetInstance(); + DwmAPI(); + + typedef HRESULT (WINAPI *DwmIsCompositionEnabledType)(BOOL*); + Function<DwmIsCompositionEnabledType> DwmIsCompositionEnabledFunction; + + typedef HRESULT (WINAPI *DwmGetWindowAttributeType)(HWND hwnd, DWORD dwAttribute, + PVOID pvAttribute, DWORD cbAttribute); + Function<DwmGetWindowAttributeType> DwmGetWindowAttributeFunction; +}; + +#endif // DLLUTIL_H + diff --git a/src/windows/native/sun/windows/ShellFolder2.cpp b/src/windows/native/sun/windows/ShellFolder2.cpp index 3baf5bcf9b907ccce53ec718404d0b607ffcfea9..6799b098218e96c19672b25447d8c2f88485856f 100644 --- a/src/windows/native/sun/windows/ShellFolder2.cpp +++ b/src/windows/native/sun/windows/ShellFolder2.cpp @@ -225,6 +225,34 @@ JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_initIDs FID_folderType = env->GetFieldID(cls, "folderType", "Ljava/lang/String;"); } + +/* +* Class: sun_awt_shell_Win32ShellFolderManager2 +* Method: initializeCom +* Signature: ()V +*/ +JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolderManager2_initializeCom + (JNIEnv* env, jclass cls) +{ + HRESULT hr = ::CoInitialize(NULL); + if (FAILED(hr)) { + char c[64]; + sprintf(c, "Could not initialize COM: HRESULT=0x%08X", hr); + JNU_ThrowInternalError(env, c); + } +} + +/* +* Class: sun_awt_shell_Win32ShellFolderManager2 +* Method: uninitializeCom +* Signature: ()V +*/ +JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolderManager2_uninitializeCom + (JNIEnv* env, jclass cls) +{ + ::CoUninitialize(); +} + static IShellIcon* getIShellIcon(IShellFolder* pIShellFolder) { // http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp HRESULT hres; @@ -239,29 +267,6 @@ static IShellIcon* getIShellIcon(IShellFolder* pIShellFolder) { return (IShellIcon*)NULL; } -// Fixed 6263669 -// -// CoInitialize wrapper -// call CoInitialize to initialize COM in STA mode and check result -// RPC_E_CHANGED_MODE means COM has already been initialized in MTA mode, -// so don't set the flag to call CoUninitialize later - -BOOL CoInit(BOOL& doCoUninit) { // returns TRUE if initialized successfully - switch(::CoInitialize(NULL)) { - case S_OK: - case S_FALSE: - doCoUninit = TRUE; - return TRUE; - break; - case RPC_E_CHANGED_MODE: - doCoUninit = FALSE; - return TRUE; - break; - default: - return FALSE; - } -} - /* * Class: sun_awt_shell_Win32ShellFolder2 @@ -507,10 +512,10 @@ JNIEXPORT jint JNICALL Java_sun_awt_shell_Win32ShellFolder2_getAttributes0 /* * Class: sun_awt_shell_Win32ShellFolder2 - * Method: getFileSystemPath + * Method: getFileSystemPath0 * Signature: (I)Ljava/lang/String; */ -JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getFileSystemPath__I +JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getFileSystemPath0 (JNIEnv* env, jclass cls, jint csidl) { LPITEMIDLIST relPIDL; @@ -611,18 +616,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_bindToObject if (SUCCEEDED (hr)) { return (jlong)pFolder; } - if (IS_WINVISTA) { - BOOL doCoUninit; - if (CoInit(doCoUninit)) { - hr = pParent->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&pFolder); - if (doCoUninit) { - ::CoUninitialize(); - } - if (SUCCEEDED (hr)) { - return (jlong)pFolder; - } - } - } return 0; } @@ -650,7 +643,10 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation return NULL; } - pParent->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_FORPARSING, &strret); + hres = pParent->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_FORPARSING, &strret); + if (FAILED(hres)) { + return NULL; + } switch (strret.uType) { case STRRET_CSTR : @@ -669,10 +665,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation break; } - BOOL doCoUninit; - if (!CoInit(doCoUninit)) { - return 0; - } IShellLinkW* psl; hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl); if (SUCCEEDED(hres)) { @@ -692,10 +684,10 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation } psl->Release(); } - if (doCoUninit) { - ::CoUninitialize(); - } + if (strret.uType == STRRET_WSTR) { + CoTaskMemFree(strret.pOleStr); + } if (SUCCEEDED(hres)) { return (jlong)pidl; } else { @@ -741,7 +733,7 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_parseDisplayName0 /* * Class: sun_awt_shell_Win32ShellFolder2 * Method: getDisplayNameOf - * Signature: (JJ)Ljava/lang/String; + * Signature: (JJI)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getDisplayNameOf (JNIEnv* env, jclass cls, jlong parentIShellFolder, jlong relativePIDL, jint attrs) @@ -758,7 +750,11 @@ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getDisplayNameOf if (pParent->GetDisplayNameOf(pidl, attrs, &strret) != S_OK) { return NULL; } - return jstringFromSTRRET(env, pidl, &strret); + jstring result = jstringFromSTRRET(env, pidl, &strret); + if (strret.uType == STRRET_WSTR) { + CoTaskMemFree(strret.pOleStr); + } + return result; } /* @@ -833,10 +829,6 @@ JNIEXPORT jint JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconIndex } INT index = -1; - BOOL doCoUninit; - if (!CoInit(doCoUninit)) { - return (jint)index; - } HRESULT hres; // http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp @@ -844,9 +836,6 @@ JNIEXPORT jint JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconIndex hres = pIShellIcon->GetIconOf(pidl, GIL_FORSHELL, &index); } - if (doCoUninit) { - ::CoUninitialize(); - } return (jint)index; } @@ -866,10 +855,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon } HICON hIcon = NULL; - BOOL doCoUninit; - if (!CoInit(doCoUninit)) { - return (jlong)hIcon; - } HRESULT hres; IExtractIconW* pIcon; @@ -894,9 +879,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon } pIcon->Release(); } - if (doCoUninit) { - ::CoUninitialize(); - } return (jlong)hIcon; } @@ -994,14 +976,10 @@ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getFileChooserB HINSTANCE libComCtl32; HINSTANCE libShell32; - libShell32 = LoadLibrary(TEXT("shell32.dll")); if (libShell32 != NULL) { - long osVersion = GetVersion(); - BOOL isVista = (!(osVersion & 0x80000000) && (LOBYTE(LOWORD(osVersion)) >= 6)); - hBitmap = (HBITMAP)LoadImage(libShell32, - isVista ? TEXT("IDB_TB_SH_DEF_16") : MAKEINTRESOURCE(216), + IS_WINVISTA ? TEXT("IDB_TB_SH_DEF_16") : MAKEINTRESOURCE(216), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); } if (hBitmap == NULL) { @@ -1095,46 +1073,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconResource } -// Helper functions for workaround COM initialization: - -static HRESULT GetDetailsOfFolder( - IShellFolder2 *folder, - LPCITEMIDLIST pidl, - UINT column, - SHELLDETAILS *psd) -{ - HRESULT hr = folder->GetDetailsOf(pidl, column, psd); - if (IS_WINVISTA && FAILED (hr)) { - BOOL doCoUninit; - if (CoInit(doCoUninit)) { - hr = folder->GetDetailsOf(pidl, column, psd); - if (doCoUninit) { - ::CoUninitialize(); - } - } - } - return hr; -} - -static HRESULT GetDetailsOf( - IShellDetails *details, - LPCITEMIDLIST pidl, - UINT column, - SHELLDETAILS *psd) -{ - HRESULT hr = details->GetDetailsOf(pidl, column, psd); - if (IS_WINVISTA && FAILED (hr)) { - BOOL doCoUninit; - if (CoInit(doCoUninit)) { - hr = details->GetDetailsOf(pidl, column, psd); - if (doCoUninit) { - ::CoUninitialize(); - } - } - } - return hr; -} - /* * Helper function for creating Java column info object */ @@ -1187,7 +1125,7 @@ JNIEXPORT jobjectArray JNICALL int colNum = -1; hr = S_OK; do{ - hr = GetDetailsOfFolder(pIShellFolder2, NULL, ++colNum, &sd); + hr = pIShellFolder2->GetDetailsOf(NULL, ++colNum, &sd); } while (SUCCEEDED (hr)); jobjectArray columns = @@ -1202,7 +1140,7 @@ JNIEXPORT jobjectArray JNICALL colNum = 0; hr = S_OK; while (SUCCEEDED (hr)) { - hr = GetDetailsOfFolder(pIShellFolder2, NULL, colNum, &sd); + hr = pIShellFolder2->GetDetailsOf(NULL, colNum, &sd); if (SUCCEEDED (hr)) { hr = pIShellFolder2->GetDefaultColumnState(colNum, &csFlags); @@ -1232,7 +1170,7 @@ JNIEXPORT jobjectArray JNICALL int colNum = -1; hr = S_OK; do{ - hr = GetDetailsOf(pIShellDetails, NULL, ++colNum, &sd); + hr = pIShellDetails->GetDetailsOf(NULL, ++colNum, &sd); } while (SUCCEEDED (hr)); jobjectArray columns = @@ -1246,7 +1184,7 @@ JNIEXPORT jobjectArray JNICALL colNum = 0; hr = S_OK; while (SUCCEEDED (hr)) { - hr = GetDetailsOf(pIShellDetails, NULL, colNum, &sd); + hr = pIShellDetails->GetDetailsOf(NULL, colNum, &sd); if (SUCCEEDED (hr)) { jobject column = CreateColumnInfo(env, &columnClass, &columnConstructor, @@ -1288,7 +1226,7 @@ JNIEXPORT jobject JNICALL if(SUCCEEDED (hr)) { // The folder exposes IShellFolder2 interface IShellFolder2 *pIShellFolder2 = (IShellFolder2*) pIUnknown; - hr = GetDetailsOfFolder(pIShellFolder2, pidl, (UINT)columnIdx, &sd); + hr = pIShellFolder2->GetDetailsOf(pidl, (UINT)columnIdx, &sd); pIShellFolder2->Release(); if (SUCCEEDED (hr)) { STRRET strRet = sd.str; @@ -1300,7 +1238,7 @@ JNIEXPORT jobject JNICALL if(SUCCEEDED (hr)) { // The folder exposes IShellDetails interface IShellDetails *pIShellDetails = (IShellDetails*) pIUnknown; - hr = GetDetailsOf(pIShellDetails, pidl, (UINT)columnIdx, &sd); + hr = pIShellDetails->GetDetailsOf(pidl, (UINT)columnIdx, &sd); pIShellDetails->Release(); if (SUCCEEDED (hr)) { STRRET strRet = sd.str; diff --git a/src/windows/native/sun/windows/awt.rc b/src/windows/native/sun/windows/awt.rc index c9c3f172125b3d71cacd6acd0902ae8801512ef0..7eb4d41afb11ef46b9ea5d6adf2de1ec3c4b25fd 100644 --- a/src/windows/native/sun/windows/awt.rc +++ b/src/windows/native/sun/windows/awt.rc @@ -35,6 +35,13 @@ HAND_CURSOR CURSOR DISCARDABLE "hand.cur" AWT_ICON ICON DISCARDABLE "awt.ico" CHECK_BITMAP BITMAP DISCARDABLE "check.bmp" +// Note: the number of icons used is specified in the +// securityWarningIconCounter constant in awt_Toolkit.cpp. +SECURITY_WARNING_0 ICON DISCARDABLE "security_warning_bw.ico" +SECURITY_WARNING_1 ICON DISCARDABLE "security_warning_int.ico" +SECURITY_WARNING_2 ICON DISCARDABLE "security_warning.ico" + + ///////////////////////////////////////////////////////////////////////////// // // Version diff --git a/src/windows/native/sun/windows/awt_BitmapUtil.cpp b/src/windows/native/sun/windows/awt_BitmapUtil.cpp index 64c52e2f8f8c425c2948cf47b7546883f78ad106..10e71b3e61e40abfaba60173ced69d93202dd61e 100644 --- a/src/windows/native/sun/windows/awt_BitmapUtil.cpp +++ b/src/windows/native/sun/windows/awt_BitmapUtil.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-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 @@ -28,9 +28,14 @@ #include <windowsx.h> #include <zmouse.h> +#include "GraphicsPrimitiveMgr.h" + #include "awt.h" #include "awt_BitmapUtil.h" +// Platform-dependent RECT_[EQ | SET | INC_HEIGHT] macros +#include "utility/rect.h" + HBITMAP BitmapUtil::CreateTransparencyMaskFromARGB(int width, int height, int* imageData) { //Scan lines should be aligned to word boundary @@ -148,3 +153,222 @@ HBITMAP BitmapUtil::CreateV4BitmapFromARGB(int width, int height, int* imageData ::GdiFlush(); return hBitmap; } + +/* + * Creates 32-bit premultiplied ARGB bitmap from specified ARGBPre data. + * This function may not work on OS prior to Win95. + * See MSDN articles for CreateDIBitmap, BITMAPINFOHEADER, + * BITMAPV4HEADER, BITMAPV5HEADER for additional info. + */ +HBITMAP BitmapUtil::CreateBitmapFromARGBPre(int width, int height, + int srcStride, + int* imageData) +{ + BITMAPINFOHEADER bmi; + void *bitmapBits = NULL; + + ZeroMemory(&bmi, sizeof(bmi)); + bmi.biSize = sizeof(bmi); + bmi.biWidth = width; + bmi.biHeight = -height; + bmi.biPlanes = 1; + bmi.biBitCount = 32; + bmi.biCompression = BI_RGB; + + HBITMAP hBitmap = + ::CreateDIBSection(NULL, (BITMAPINFO *) & bmi, DIB_RGB_COLORS, + &bitmapBits, NULL, 0); + + if (!bitmapBits) { + return NULL; + } + + int dstStride = width * 4; + + if (srcStride == dstStride) { + memcpy(bitmapBits, (void*)imageData, srcStride * height); + } else if (height > 0) { + void *pSrcPixels = (void*)imageData; + void *pDstPixels = bitmapBits; + do { + memcpy(pDstPixels, pSrcPixels, dstStride); + pSrcPixels = PtrAddBytes(pSrcPixels, srcStride); + pDstPixels = PtrAddBytes(pDstPixels, dstStride); + } while (--height > 0); + } + + return hBitmap; +} + +extern "C" { + +/** + * This method is called from the WGL pipeline when it needs to create a bitmap + * needed to update the layered window. + */ +HBITMAP BitmapUtil_CreateBitmapFromARGBPre(int width, int height, + int srcStride, + int* imageData) +{ + return BitmapUtil::CreateBitmapFromARGBPre(width, height, + srcStride, imageData); + +} + +} /* extern "C" */ + + +/** + * Transforms the given bitmap into an HRGN representing the transparency + * of the bitmap. The bitmap MUST BE 32bpp. Alpha value == 0 is considered + * transparent, alpha > 0 - opaque. + */ +HRGN BitmapUtil::BitmapToRgn(HBITMAP hBitmap) +{ + HDC hdc = ::CreateCompatibleDC(NULL); + ::SelectObject(hdc, hBitmap); + + BITMAPINFOEX bi; + ::ZeroMemory(&bi, sizeof(bi)); + + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + + BOOL r = ::GetDIBits(hdc, hBitmap, 0, 0, NULL, + reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS); + + if (!r || bi.bmiHeader.biBitCount != 32) + { + ::DeleteDC(hdc); + return NULL; + } + + UINT width = bi.bmiHeader.biWidth; + UINT height = abs(bi.bmiHeader.biHeight); + + BYTE * buf = (BYTE*)safe_Malloc(bi.bmiHeader.biSizeImage); + bi.bmiHeader.biHeight = -height; + ::GetDIBits(hdc, hBitmap, 0, height, buf, + reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS); + + /* reserving memory for the worst case */ + RGNDATA * pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) + + sizeof(RECT) * (width / 2 + 1) * height); + RGNDATAHEADER * pRgnHdr = (RGNDATAHEADER *) pRgnData; + pRgnHdr->dwSize = sizeof(RGNDATAHEADER); + pRgnHdr->iType = RDH_RECTANGLES; + pRgnHdr->nRgnSize = 0; + pRgnHdr->rcBound.top = 0; + pRgnHdr->rcBound.left = 0; + pRgnHdr->rcBound.bottom = height; + pRgnHdr->rcBound.right = width; + + pRgnHdr->nCount = BitmapToYXBandedRectangles(32, width, height, buf, + (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER))); + + HRGN rgn = ::ExtCreateRegion(NULL, + sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, + pRgnData); + + free(pRgnData); + ::DeleteDC(hdc); + free(buf); + + return rgn; +} + +/** + * Makes a copy of the given bitmap. Blends every pixel of the source + * with the given blendColor and alpha. If alpha == 0, the function + * simply makes a plain copy of the source without any blending. + */ +HBITMAP BitmapUtil::BlendCopy(HBITMAP hSrcBitmap, COLORREF blendColor, + BYTE alpha) +{ + HDC hdc = ::CreateCompatibleDC(NULL); + HBITMAP oldBitmap = (HBITMAP)::SelectObject(hdc, hSrcBitmap); + + BITMAPINFOEX bi; + ::ZeroMemory(&bi, sizeof(bi)); + + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + + BOOL r = ::GetDIBits(hdc, hSrcBitmap, 0, 0, NULL, + reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS); + + if (!r || bi.bmiHeader.biBitCount != 32) + { + ::DeleteDC(hdc); + return NULL; + } + + UINT width = bi.bmiHeader.biWidth; + UINT height = abs(bi.bmiHeader.biHeight); + + BYTE * buf = (BYTE*)safe_Malloc(bi.bmiHeader.biSizeImage); + bi.bmiHeader.biHeight = -height; + ::GetDIBits(hdc, hSrcBitmap, 0, height, buf, + reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS); + + UINT widthBytes = width * bi.bmiHeader.biBitCount / 8; + UINT alignedWidth = (((widthBytes - 1) / 4) + 1) * 4; + UINT i, j; + + for (j = 0; j < height; j++) { + BYTE *pSrc = (BYTE *) buf + j * alignedWidth; + for (i = 0; i < width; i++, pSrc += 4) { + // Note: if the current alpha is zero, the other three color + // components may (theoretically) contain some uninitialized + // data. The developer does not expect to display them, + // hence we handle this situation differently. + if (pSrc[3] == 0) { + pSrc[0] = GetBValue(blendColor) * alpha / 255; + pSrc[1] = GetGValue(blendColor) * alpha / 255; + pSrc[2] = GetRValue(blendColor) * alpha / 255; + pSrc[3] = alpha; + } else { + pSrc[0] = (GetBValue(blendColor) * alpha / 255) + + (pSrc[0] * (255 - alpha) / 255); + pSrc[1] = (GetGValue(blendColor) * alpha / 255) + + (pSrc[1] * (255 - alpha) / 255); + pSrc[2] = (GetRValue(blendColor) * alpha / 255) + + (pSrc[2] * (255 - alpha) / 255); + pSrc[3] = (alpha * alpha / 255) + + (pSrc[3] * (255 - alpha) / 255); + } + } + } + + HBITMAP hDstBitmap = ::CreateDIBitmap(hdc, + reinterpret_cast<BITMAPINFOHEADER*>(&bi), + CBM_INIT, + buf, + reinterpret_cast<BITMAPINFO*>(&bi), + DIB_RGB_COLORS + ); + + ::SelectObject(hdc, oldBitmap); + ::DeleteDC(hdc); + free(buf); + + return hDstBitmap; +} + +/** + * Creates a 32 bit ARGB bitmap. Returns the bitmap handle. The *bitmapBits + * contains the pointer to the bitmap data or NULL if an error occured. + */ +HBITMAP BitmapUtil::CreateARGBBitmap(int width, int height, void ** bitmapBitsPtr) +{ + BITMAPINFOHEADER bmi; + + ::ZeroMemory(&bmi, sizeof(bmi)); + bmi.biSize = sizeof(BITMAPINFOHEADER); + bmi.biWidth = width; + bmi.biHeight = -height; + bmi.biPlanes = 1; + bmi.biBitCount = 32; + bmi.biCompression = BI_RGB; + + return ::CreateDIBSection(NULL, (BITMAPINFO *) & bmi, DIB_RGB_COLORS, + bitmapBitsPtr, NULL, 0); +} diff --git a/src/windows/native/sun/windows/awt_BitmapUtil.h b/src/windows/native/sun/windows/awt_BitmapUtil.h index b32f3fe0a41e031d87ca5fd37817b982961ff139..2c039232fcb1e7fc433aff101dbb60843a725646 100644 --- a/src/windows/native/sun/windows/awt_BitmapUtil.h +++ b/src/windows/native/sun/windows/awt_BitmapUtil.h @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-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 @@ -45,6 +45,32 @@ public: */ static HBITMAP CreateV4BitmapFromARGB(int width, int height, int* imageData); + /** + * Creates 32-bit premultiplied ARGB V4 Bitmap (Win95-compatible) from + * specified ARGB Pre input data. + */ + static HBITMAP CreateBitmapFromARGBPre(int width, int height, + int srcStride, + int* imageData); + + /** + * Transforms the given bitmap into an HRGN representing the transparency + * of the bitmap. + */ + static HRGN BitmapToRgn(HBITMAP hBitmap); + + /** + * Makes a copy of the given bitmap. Blends every pixel of the source + * with the given blendColor and alpha. If alpha == 0, the function + * simply makes a plain copy of the source without any blending. + */ + static HBITMAP BlendCopy(HBITMAP hSrcBitmap, COLORREF blendColor, BYTE alpha); + + /** + * Creates a 32 bit ARGB bitmap. Returns the bitmap handle. + * The pointer to the bitmap data is stored into bitmapBitsPtr. + */ + static HBITMAP CreateARGBBitmap(int width, int height, void ** bitmapBitsPtr); }; #endif diff --git a/src/windows/native/sun/windows/awt_Button.cpp b/src/windows/native/sun/windows/awt_Button.cpp index 3764655cba4779129fb537ee51de92ea13cc5c96..2fb620fcd149c0f52fdcc623d865ff40112bd247 100644 --- a/src/windows/native/sun/windows/awt_Button.cpp +++ b/src/windows/native/sun/windows/awt_Button.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -30,7 +30,6 @@ #include "awt_Button.h" #include "awt_Canvas.h" #include "awt_Window.h" -#include "awt_KeyboardFocusManager.h" /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. */ @@ -143,19 +142,6 @@ done: return c; } -BOOL AwtButton::ActMouseMessage(MSG * pMsg) { - if (!IsFocusingMessage(pMsg->message)) { - return FALSE; - } - - if (pMsg->message == WM_LBUTTONDOWN) { - SendMessage(BM_SETSTATE, TRUE, 0); - } else if (pMsg->message == WM_LBUTTONUP) { - SendMessage(BM_SETSTATE, FALSE, 0); - } - return TRUE; -} - MsgRouting AwtButton::WmMouseDown(UINT flags, int x, int y, int button) { @@ -204,23 +190,6 @@ AwtButton::NotifyListeners() (jint)AwtComponent::GetJavaModifiers()); } -/* 4531849 fix. Previous to 1.4, mouse clicks and typing space bar on a - * Button would notify ActionListeners via WM_COMMAND/WmNotify(). In 1.4, mouse - * grabs are done for all presses in order to correctly send drag and release - * events. However, WM_COMMAND message aren't sent when the mouse is grabbed, - * so ActionListeners for mouse clicks are sent via WmMouseUp/WmNotify(). - * For some reason, if the right mouse button is held down when left-clicking - * on a Button, WM_COMMAND _IS_ sent. This resulted in two ActionEvents being - * sent in this case. To fix the problem, we handle typing space bar similar to - * left clicks - in WmKeyUp(), and do nothing for WM_COMMAND. -bchristi - */ -MsgRouting -AwtButton::WmKeyUp(UINT wkey, UINT repCnt, UINT flags, BOOL system) -{ - MsgRouting mrResult = AwtComponent::WmKeyUp(wkey, repCnt, flags, system); - return mrResult; -} - MsgRouting AwtButton::OwnerDrawItem(UINT /*ctrlId*/, DRAWITEMSTRUCT& drawInfo) { @@ -293,18 +262,26 @@ MsgRouting AwtButton::WmPaint(HDC) return mrDoDefault; } +BOOL AwtButton::IsFocusingMouseMessage(MSG *pMsg) { + return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP; +} + +BOOL AwtButton::IsFocusingKeyMessage(MSG *pMsg) { + return (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP) && + pMsg->wParam == VK_SPACE; +} + MsgRouting AwtButton::HandleEvent(MSG *msg, BOOL synthetic) { - if (AwtComponent::sm_focusOwner != GetHWnd() && - (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK)) - { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); + if (IsFocusingMouseMessage(msg)) { + SendMessage(BM_SETSTATE, msg->message == WM_LBUTTONDOWN ? TRUE : FALSE, 0); + delete msg; + return mrConsume; + } + if (IsFocusingKeyMessage(msg)) { + SendMessage(BM_SETSTATE, msg->message == WM_KEYDOWN ? TRUE : FALSE, 0); + delete msg; + return mrConsume; } return AwtComponent::HandleEvent(msg, synthetic); } diff --git a/src/windows/native/sun/windows/awt_Button.h b/src/windows/native/sun/windows/awt_Button.h index 795fbf9b5de342a3657c4460798e664e7f166d0f..5e6d2754aea71ba95954ff1a5161a925a3480fb1 100644 --- a/src/windows/native/sun/windows/awt_Button.h +++ b/src/windows/native/sun/windows/awt_Button.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -50,13 +50,13 @@ public: /* Windows message handler functions */ MsgRouting WmMouseDown(UINT flags, int x, int y, int button); MsgRouting WmMouseUp(UINT flags, int x, int y, int button); - MsgRouting WmKeyUp(UINT vkey, UINT repCnt, UINT flags, BOOL system); MsgRouting OwnerDrawItem(UINT ctrlId, DRAWITEMSTRUCT& drawInfo); MsgRouting WmPaint(HDC hDC); MsgRouting HandleEvent(MSG *msg, BOOL synthetic); - BOOL ActMouseMessage(MSG * pMsg); + BOOL IsFocusingMouseMessage(MSG *pMsg); + BOOL IsFocusingKeyMessage(MSG *pMsg); // called on Toolkit thread from JNI static void _SetLabel(void *param); diff --git a/src/windows/native/sun/windows/awt_Canvas.cpp b/src/windows/native/sun/windows/awt_Canvas.cpp index 4988152b8dda650a492ce64dea5228397296a2d1..b03a79817ce818ba01feb36d4a74172a5918b4ee 100644 --- a/src/windows/native/sun/windows/awt_Canvas.cpp +++ b/src/windows/native/sun/windows/awt_Canvas.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -26,7 +26,6 @@ #include "awt_Toolkit.h" #include "awt_Canvas.h" #include "awt_Win32GraphicsConfig.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Window.h" /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. @@ -176,27 +175,9 @@ MsgRouting AwtCanvas::WmPaint(HDC) MsgRouting AwtCanvas::HandleEvent(MSG *msg, BOOL synthetic) { - if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) { - /* - * Fix for BugTraq ID 4041703: keyDown not being invoked. - * Give the focus to a Canvas or Panel if it doesn't have heavyweight - * subcomponents so that they will behave the same way as on Solaris - * providing a possibility of giving keyboard focus to an empty Applet. - * Since ScrollPane doesn't receive focus on mouse press on Solaris, - * HandleEvent() is overriden there to do nothing with focus. - */ - if (AwtComponent::sm_focusOwner != GetHWnd() && - ::GetWindow(GetHWnd(), GW_CHILD) == NULL) - { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); - AwtSetFocus(); - } + if (IsFocusingMouseMessage(msg)) { + delete msg; + return mrConsume; } return AwtComponent::HandleEvent(msg, synthetic); } diff --git a/src/windows/native/sun/windows/awt_Checkbox.cpp b/src/windows/native/sun/windows/awt_Checkbox.cpp index 2e8cf9923db8ed120cfca9a4b00e73d52becefff..2830e56813b8198726b73419ecd95cccbb51eb01 100644 --- a/src/windows/native/sun/windows/awt_Checkbox.cpp +++ b/src/windows/native/sun/windows/awt_Checkbox.cpp @@ -26,7 +26,6 @@ #include "awt.h" #include "awt_Toolkit.h" #include "awt_Checkbox.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" #include "awt_Window.h" @@ -143,17 +142,6 @@ done: return checkbox; } -BOOL AwtCheckbox::ActMouseMessage(MSG* pMsg) { - if (!IsFocusingMessage(pMsg->message)) { - return FALSE; - } - - if (pMsg->message == WM_LBUTTONDOWN) { - SendMessage(BM_SETSTATE, ~SendMessage(BM_GETSTATE, 0, 0), 0); - } - return TRUE; -} - MsgRouting AwtCheckbox::WmMouseUp(UINT flags, int x, int y, int button) { @@ -329,18 +317,32 @@ MsgRouting AwtCheckbox::WmPaint(HDC) return mrDoDefault; } +BOOL AwtCheckbox::IsFocusingMouseMessage(MSG *pMsg) { + return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP; +} + +BOOL AwtCheckbox::IsFocusingKeyMessage(MSG *pMsg) { + return (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP) && + pMsg->wParam == VK_SPACE; +} + MsgRouting AwtCheckbox::HandleEvent(MSG *msg, BOOL synthetic) { - if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd() && - (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK)) - { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); + if (IsFocusingMouseMessage(msg)) { + SendMessage(BM_SETSTATE, (WPARAM)(msg->message == WM_LBUTTONDOWN ? TRUE : FALSE)); + delete msg; + return mrConsume; + } + if (IsFocusingKeyMessage(msg)) { + SendMessage(BM_SETSTATE, (WPARAM)(msg->message == WM_KEYDOWN ? TRUE : FALSE)); + if (msg->message == WM_KEYDOWN) { + m_fLButtonDowned = TRUE; + } else if (m_fLButtonDowned == TRUE) { + WmNotify(BN_CLICKED); + m_fLButtonDowned = TRUE; + } + delete msg; + return mrConsume; } return AwtComponent::HandleEvent(msg, synthetic); } diff --git a/src/windows/native/sun/windows/awt_Checkbox.h b/src/windows/native/sun/windows/awt_Checkbox.h index 581afcd6505c06cdebc6c4d8199f44ea8d0a5b92..4d913da00fba1ef1bb292e3349efe896b0ee1b44 100644 --- a/src/windows/native/sun/windows/awt_Checkbox.h +++ b/src/windows/native/sun/windows/awt_Checkbox.h @@ -69,7 +69,8 @@ public: MsgRouting HandleEvent(MSG *msg, BOOL synthetic); - BOOL ActMouseMessage(MSG* pMsg); + BOOL IsFocusingMouseMessage(MSG *pMsg); + BOOL IsFocusingKeyMessage(MSG *pMsg); // called on Toolkit thread from JNI static void _SetLabel(void *param); diff --git a/src/windows/native/sun/windows/awt_Choice.cpp b/src/windows/native/sun/windows/awt_Choice.cpp index ca7adb0ed6e431a0c143264759c9e71bd244584b..03fdde96f197b33705cb5980bc3e7071231a8aed 100644 --- a/src/windows/native/sun/windows/awt_Choice.cpp +++ b/src/windows/native/sun/windows/awt_Choice.cpp @@ -23,14 +23,17 @@ * have any questions. */ +#include <windowsx.h> + #include "awt_Toolkit.h" #include "awt_Choice.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" #include "awt_Dimension.h" #include "awt_Container.h" +#include "ComCtl32Util.h" + #include <java_awt_Toolkit.h> #include <java_awt_FontMetrics.h> #include <java_awt_event_InputEvent.h> @@ -71,18 +74,31 @@ BOOL AwtChoice::mouseCapture = FALSE; /* Bug #4338368: consume the spurious MouseUp when the choice loses focus */ BOOL AwtChoice::skipNextMouseUp = FALSE; + +BOOL AwtChoice::sm_isMouseMoveInList = FALSE; + +static const UINT MINIMUM_NUMBER_OF_VISIBLE_ITEMS = 8; + /************************************************************************* * AwtChoice class methods */ AwtChoice::AwtChoice() { - killFocusRouting = mrPassAlong; + m_hList = NULL; + m_listDefWindowProc = NULL; } LPCTSTR AwtChoice::GetClassName() { return TEXT("COMBOBOX"); /* System provided combobox class */ } +void AwtChoice::Dispose() { + if (m_hList != NULL && m_listDefWindowProc != NULL) { + ComCtl32Util::GetInstance().UnsubclassHWND(m_hList, ListWindowProc, m_listDefWindowProc); + } + AwtComponent::Dispose(); +} + AwtChoice* AwtChoice::Create(jobject peer, jobject parent) { @@ -162,6 +178,10 @@ AwtChoice* AwtChoice::Create(jobject peer, jobject parent) { env->SetIntField(target, AwtComponent::widthID, (jint) rc.right); env->SetIntField(target, AwtComponent::heightID, (jint) rc.bottom); + if (IS_WINXP) { + ::SendMessage(c->GetHWnd(), CB_SETMINVISIBLE, (WPARAM) MINIMUM_NUMBER_OF_VISIBLE_ITEMS, 0); + } + env->DeleteLocalRef(dimension); } } catch (...) { @@ -175,24 +195,13 @@ done: return c; } -BOOL AwtChoice::ActMouseMessage(MSG* pMsg) { - if (!IsFocusingMessage(pMsg->message)) { - return FALSE; - } - - if (pMsg->message == WM_LBUTTONDOWN) { - SendMessage(CB_SHOWDROPDOWN, ~SendMessage(CB_GETDROPPEDSTATE, 0, 0), 0); - } - return TRUE; -} - // calculate height of drop-down list part of the combobox // to show all the items up to a maximum of eight int AwtChoice::GetDropDownHeight() { int itemHeight =(int)::SendMessage(GetHWnd(), CB_GETITEMHEIGHT, (UINT)0,0); int numItemsToShow = (int)::SendMessage(GetHWnd(), CB_GETCOUNT, 0,0); - numItemsToShow = numItemsToShow > 8 ? 8 : numItemsToShow; + numItemsToShow = min(MINIMUM_NUMBER_OF_VISIBLE_ITEMS, numItemsToShow); // drop-down height snaps to nearest line, so add a // fudge factor of 1/2 line to ensure last line shows return itemHeight*numItemsToShow + itemHeight/2; @@ -253,6 +262,7 @@ void AwtChoice::SetDragCapture(UINT flags) } return; } + // don't want to interfere with other controls if (::GetCapture() == NULL) { ::SetCapture(GetHWnd()); @@ -370,6 +380,58 @@ void AwtChoice::SetFont(AwtFont* font) env->DeleteLocalRef(target); } +static int lastClickX = -1; +static int lastClickY = -1; + +LRESULT CALLBACK AwtChoice::ListWindowProc(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam) +{ + /* + * We don't pass the choice WM_LBUTTONDOWN message. As the result the choice's list + * doesn't forward mouse messages it captures. Below we do forward what we need. + */ + + TRY; + + DASSERT(::IsWindow(hwnd)); + + switch (message) { + case WM_LBUTTONDOWN: { + DWORD curPos = ::GetMessagePos(); + lastClickX = GET_X_LPARAM(curPos); + lastClickY = GET_Y_LPARAM(curPos); + break; + } + case WM_MOUSEMOVE: { + RECT rect; + ::GetClientRect(hwnd, &rect); + + POINT pt = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; + if (::PtInRect(&rect, pt)) { + sm_isMouseMoveInList = TRUE; + } + + POINT lastPt = {lastClickX, lastClickY}; + ::ScreenToClient(hwnd, &lastPt); + if (::PtInRect(&rect, lastPt)) { + break; // ignore when dragging inside the list + } + } + case WM_LBUTTONUP: { + lastClickX = -1; + lastClickY = -1; + + AwtChoice *c = (AwtChoice *)::GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (c != NULL) { + // forward the msg to the choice + c->WindowProc(message, wParam, lParam); + } + } + } + return ComCtl32Util::GetInstance().DefWindowProc(NULL, hwnd, message, wParam, lParam); + + CATCH_BAD_ALLOC_RET(0); +} MsgRouting AwtChoice::WmNotify(UINT notifyCode) @@ -379,15 +441,24 @@ MsgRouting AwtChoice::WmNotify(UINT notifyCode) if (itemSelect != CB_ERR){ DoCallback("handleAction", "(I)V", itemSelect); } - } else if (notifyCode == CBN_DROPDOWN && !IsFocusable()) { - // While non-focusable Choice is shown all WM_KILLFOCUS messages should be consumed. - killFocusRouting = mrConsume; - } else if (notifyCode == CBN_CLOSEUP && !IsFocusable()) { - // When non-focusable Choice is about to close, send it synthetic WM_KILLFOCUS - // message that should be processed by the native widget only. This will allow - // the native widget to properly process WM_KILLFOCUS that was earlier consumed. - killFocusRouting = mrDoDefault; - ::PostMessage(GetHWnd(), WM_KILLFOCUS, (LPARAM)sm_focusOwner, 0); + } else if (notifyCode == CBN_DROPDOWN) { + + if (m_hList == NULL) { + COMBOBOXINFO cbi; + cbi.cbSize = sizeof(COMBOBOXINFO); + ::GetComboBoxInfo(GetHWnd(), &cbi); + m_hList = cbi.hwndList; + m_listDefWindowProc = ComCtl32Util::GetInstance().SubclassHWND(m_hList, ListWindowProc); + DASSERT(::GetWindowLongPtr(m_hList, GWLP_USERDATA) == NULL); + ::SetWindowLongPtr(m_hList, GWLP_USERDATA, (LONG_PTR)this); + } + sm_isMouseMoveInList = FALSE; + + // Clicking in the dropdown list steals focus from the proxy. + // So, set the focus-restore flag up. + SetRestoreFocus(TRUE); + } else if (notifyCode == CBN_CLOSEUP) { + SetRestoreFocus(FALSE); } return mrDoDefault; } @@ -414,19 +485,7 @@ MsgRouting AwtChoice::WmKillFocus(HWND hWndGotFocus) { skipNextMouseUp = TRUE; - - switch (killFocusRouting) { - case mrConsume: - return mrConsume; - case mrDoDefault: - killFocusRouting = mrPassAlong; - return mrDoDefault; - case mrPassAlong: - return AwtComponent::WmKillFocus(hWndGotFocus); - } - - DASSERT(false); // must never reach here - return mrDoDefault; + return AwtComponent::WmKillFocus(hWndGotFocus); } MsgRouting @@ -441,27 +500,17 @@ AwtChoice::WmMouseUp(UINT flags, int x, int y, int button) MsgRouting AwtChoice::HandleEvent(MSG *msg, BOOL synthetic) { - /* - * 6366006 - * Note: the event can be sent in two cases: - * 1) The Choice is closed and user clicks on it to drop it down. - * 2) The Choice is non-focusable, it's droped down, user - * clicks on it (or outside) to close it. - * So, if the Choice is in droped down state, we shouldn't call - * heavyweightButtonDown() method. Otherwise it will set a typeahead marker - * that won't be removed, because no focus events will be generated. - */ - if (AwtComponent::sm_focusOwner != GetHWnd() && - (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) && - !IsChoiceOpened()) + if (IsFocusingMouseMessage(msg)) { + SendMessage(CB_SHOWDROPDOWN, ~SendMessage(CB_GETDROPPEDSTATE, 0, 0), 0); + delete msg; + return mrConsume; + } + // To simulate the native behavior, we close the list on WM_LBUTTONUP if + // WM_MOUSEMOVE has been dedected on the list since it has been dropped down. + if (msg->message == WM_LBUTTONUP && SendMessage(CB_GETDROPPEDSTATE, 0, 0) && + sm_isMouseMoveInList) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); + SendMessage(CB_SHOWDROPDOWN, FALSE, 0); } return AwtComponent::HandleEvent(msg, synthetic); } @@ -618,6 +667,26 @@ done: env->DeleteGlobalRef(choice); } +void AwtChoice::_CloseList(void *param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + jobject choice = (jobject)param; + + AwtChoice *c = NULL; + + PDATA pData; + JNI_CHECK_PEER_GOTO(choice, done); + + c = (AwtChoice *)pData; + if (::IsWindow(c->GetHWnd()) && c->SendMessage(CB_GETDROPPEDSTATE, 0, 0)) { + c->SendMessage(CB_SHOWDROPDOWN, FALSE, 0); + } + +done: + env->DeleteGlobalRef(choice); +} + /************************************************************************ * WChoicePeer native methods */ @@ -752,6 +821,23 @@ Java_sun_awt_windows_WChoicePeer_create(JNIEnv *env, jobject self, CATCH_BAD_ALLOC; } +/* + * Class: sun_awt_windows_WChoicePeer + * Method: closeList + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WChoicePeer_closeList(JNIEnv *env, jobject self) +{ + TRY; + + jobject selfGlobalRef = env->NewGlobalRef(self); + + AwtToolkit::GetInstance().SyncCall(AwtChoice::_CloseList, (void *)selfGlobalRef); + // global ref is deleted in _CloseList + + CATCH_BAD_ALLOC; +} } /* extern "C" */ diff --git a/src/windows/native/sun/windows/awt_Choice.h b/src/windows/native/sun/windows/awt_Choice.h index 075cb0c5ed9d1bbcfe170c7523f29e43a4f5a066..35e9174745e5f17cef5f8bfdbe7cc38843e39d54 100644 --- a/src/windows/native/sun/windows/awt_Choice.h +++ b/src/windows/native/sun/windows/awt_Choice.h @@ -43,6 +43,8 @@ public: virtual LPCTSTR GetClassName(); static AwtChoice* Create(jobject peer, jobject hParent); + virtual void Dispose(); + virtual void Reshape(int x, int y, int w, int h); void ResetDropDownHeight(); int GetDropDownHeight(); @@ -75,9 +77,6 @@ public: virtual void SetDragCapture(UINT flags); virtual void ReleaseDragCapture(UINT flags); - BOOL ActMouseMessage(MSG * pMsg); - INLINE BOOL AwtChoice::IsChoiceOpened() {return SendMessage(CB_GETDROPPEDSTATE, 0, 0);} - static BOOL mouseCapture; static BOOL skipNextMouseUp; @@ -87,11 +86,16 @@ public: static void _AddItems(void *param); static void _Remove(void *param); static void _RemoveAll(void *param); + static void _CloseList(void *param); private: int GetFieldHeight(); int GetTotalHeight(); - MsgRouting killFocusRouting; + static BOOL sm_isMouseMoveInList; + HWND m_hList; + WNDPROC m_listDefWindowProc; + static LRESULT CALLBACK ListWindowProc(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam); }; #endif /* AWT_CHOICE_H */ diff --git a/src/windows/native/sun/windows/awt_Component.cpp b/src/windows/native/sun/windows/awt_Component.cpp index 6f0df2e449f2c48905eacf55306692c3042676fa..9db8ec4b873dc7cd202e334561c00ae214e0f169 100644 --- a/src/windows/native/sun/windows/awt_Component.cpp +++ b/src/windows/native/sun/windows/awt_Component.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -38,7 +38,6 @@ #include "awt_InputTextInfor.h" #include "awt_Insets.h" #include "awt_KeyEvent.h" -#include "awt_KeyboardFocusManager.h" #include "awt_MenuItem.h" #include "awt_MouseEvent.h" #include "awt_Palette.h" @@ -58,7 +57,6 @@ #include <java_awt_Event.h> #include <java_awt_event_KeyEvent.h> #include <java_awt_Insets.h> -#include <java_awt_KeyboardFocusManager.h> #include <sun_awt_windows_WPanelPeer.h> #include <java_awt_event_InputEvent.h> #include <java_awt_event_InputMethodEvent.h> @@ -94,12 +92,13 @@ extern "C" { BOOL g_bUserHasChangedInputLang = FALSE; } -BOOL AwtComponent::sm_suppressFocusAndActivation; -HWND AwtComponent::sm_focusOwner; -HWND AwtComponent::sm_focusedWindow; -HWND AwtComponent::sm_realFocusOpposite; +BOOL AwtComponent::sm_suppressFocusAndActivation = FALSE; +BOOL AwtComponent::sm_restoreFocusAndActivation = FALSE; +HWND AwtComponent::sm_focusOwner = NULL; +HWND AwtComponent::sm_focusedWindow = NULL; BOOL AwtComponent::sm_bMenuLoop = FALSE; AwtComponent* AwtComponent::sm_getComponentCache = NULL; +BOOL AwtComponent::sm_inSynthesizeFocus = FALSE; /************************************************************************/ // Struct for _Reshape() and ReshapeNoCheck() methods @@ -123,15 +122,6 @@ struct SetFontStruct { jobject component; jobject font; }; -// Struct for _RequestFocus() method -struct RequestFocusStruct { - jobject component; - jobject lightweightChild; - jboolean temporary; - jboolean focusedWindowChangeAllowed; - jlong time; - jobject cause; -}; // Struct for _CreatePrintedPixels() method struct CreatePrintedPixelsStruct { jobject component; @@ -149,6 +139,16 @@ struct GetInsetsStruct { jobject window; RECT *insets; }; +// Struct for _SetZOrder function +struct SetZOrderStruct { + jobject component; + jlong above; +}; +// Struct for _SetFocus function +struct SetFocusStruct { + jobject component; + jboolean doSetFocus; +}; /************************************************************************/ ////////////////////////////////////////////////////////////////////////// @@ -199,8 +199,7 @@ BOOL AwtComponent::sm_rtl = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC || BOOL AwtComponent::sm_rtlReadingOrder = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC; -UINT AwtComponent::sm_95WheelMessage = WM_NULL; -UINT AwtComponent::sm_95WheelSupport = WM_NULL; +BOOL AwtComponent::sm_PrimaryDynamicTableBuilt = FALSE; HWND AwtComponent::sm_cursorOn; BOOL AwtComponent::m_QueryNewPaletteCalled = FALSE; @@ -208,8 +207,6 @@ BOOL AwtComponent::m_QueryNewPaletteCalled = FALSE; CriticalSection windowMoveLock; BOOL windowMoveLockHeld = FALSE; -int AwtComponent::sm_wheelRotationAmount = 0; - /************************************************************************ * AwtComponent methods */ @@ -237,7 +234,6 @@ AwtComponent::AwtComponent() m_InputMethod = NULL; m_useNativeCompWindow = TRUE; m_PendingLeadByte = 0; - m_skipNextSetFocus = FALSE; m_bitsCandType = 0; windowMoveLockPosX = 0; @@ -250,6 +246,12 @@ AwtComponent::AwtComponent() m_bSubclassed = FALSE; m_MessagesProcessing = 0; + m_wheelRotationAmount = 0; + if (!sm_PrimaryDynamicTableBuilt) { + // do it once. + AwtComponent::BuildPrimaryDynamicTable(); + sm_PrimaryDynamicTableBuilt = TRUE; + } } AwtComponent::~AwtComponent() @@ -265,8 +267,7 @@ AwtComponent::~AwtComponent() * the native one anymore. So we can safely destroy component's * handle. */ - AwtToolkit::DestroyComponentHWND(m_hwnd); - m_hwnd = NULL; + DestroyHWnd(); if (sm_getComponentCache == this) { sm_getComponentCache = NULL; @@ -275,15 +276,8 @@ AwtComponent::~AwtComponent() void AwtComponent::Dispose() { - if (sm_focusOwner == GetHWnd()) { - ::SetFocus(NULL); - } - if (sm_focusedWindow == GetHWnd()) { - sm_focusedWindow = NULL; - } - if (sm_realFocusOpposite == GetHWnd()) { - sm_realFocusOpposite = NULL; - } + // NOTE: in case the component/toplevel was focused, Java should + // have already taken care of proper transfering it or clearing. if (m_hdwp != NULL) { // end any deferred window positioning, regardless @@ -587,6 +581,17 @@ AwtComponent::CreateHWnd(JNIEnv *env, LPCWSTR title, env->DeleteLocalRef(bkgrd); } +/* + * Destroy this window's HWND + */ +void AwtComponent::DestroyHWnd() { + if (m_hwnd != NULL) { + AwtToolkit::DestroyComponentHWND(m_hwnd); + //AwtToolkit::DestroyComponent(this); + m_hwnd = NULL; + } +} + /* * Returns hwnd for target on non Toolkit thread */ @@ -888,27 +893,8 @@ void AwtComponent::Show() void AwtComponent::Hide() { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject peer = GetPeer(env); - BOOL oldValue = sm_suppressFocusAndActivation; m_visible = false; - - // On disposal the focus owner actually loses focus at the moment of hiding. - // So, focus change suppression (if requested) should be made here. - if (GetHWnd() == sm_focusOwner && - !JNU_CallMethodByName(env, NULL, peer, "isAutoFocusTransferOnDisposal", "()Z").z) - { - sm_suppressFocusAndActivation = TRUE; - // The native system may autotransfer focus on hiding to the parent - // of the component. Nevertheless this focus change won't be posted - // to the Java level, we're better to avoid this. Anyway, after - // the disposal focus should be requested to the right component. - ::SetFocus(NULL); - sm_focusOwner = NULL; - } ::ShowWindow(GetHWnd(), SW_HIDE); - - sm_suppressFocusAndActivation = oldValue; } BOOL @@ -1252,6 +1238,7 @@ void SpyWinMessage(HWND hwnd, UINT message, LPCTSTR szComment) { WIN_MSG(WM_AWT_COMPONENT_SHOW) WIN_MSG(WM_AWT_COMPONENT_HIDE) WIN_MSG(WM_AWT_COMPONENT_SETFOCUS) + WIN_MSG(WM_AWT_WINDOW_SETACTIVE) WIN_MSG(WM_AWT_LIST_SETMULTISELECT) WIN_MSG(WM_AWT_HANDLE_EVENT) WIN_MSG(WM_AWT_PRINT_COMPONENT) @@ -1503,67 +1490,54 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) sm_bMenuLoop = FALSE; break; + // We don't expect any focus messages on non-proxy component, + // except those that came from Java. case WM_SETFOCUS: - mr = (!sm_suppressFocusAndActivation && !m_skipNextSetFocus) - ? WmSetFocus((HWND)wParam) : mrConsume; - m_skipNextSetFocus = FALSE; + if (sm_inSynthesizeFocus) { + mr = WmSetFocus((HWND)wParam); + } else { + mr = mrConsume; + } break; case WM_KILLFOCUS: - mr = (!sm_suppressFocusAndActivation) - ? WmKillFocus((HWND)wParam) : mrConsume; + if (sm_inSynthesizeFocus) { + mr = WmKillFocus((HWND)wParam); + } else { + mr = mrConsume; + } break; - case WM_ACTIVATE: - { + case WM_ACTIVATE: { UINT nState = LOWORD(wParam); BOOL fMinimized = (BOOL)HIWORD(wParam); + mr = mrConsume; + if (!sm_suppressFocusAndActivation && (!fMinimized || (nState == WA_INACTIVE))) { mr = WmActivate(nState, fMinimized, (HWND)lParam); - m_skipNextSetFocus = FALSE; + // When the window is deactivated, send WM_IME_ENDCOMPOSITION // message to deactivate the composition window so that // it won't receive keyboard input focus. if (ImmGetContext() != NULL) { DefWindowProc(WM_IME_ENDCOMPOSITION, 0, 0); } - } else { - if (!sm_suppressFocusAndActivation - && fMinimized && (nState != WA_INACTIVE)) - { - m_skipNextSetFocus = TRUE; - } - mr = mrConsume; } + break; + } + case WM_MOUSEACTIVATE: { + AwtWindow *window = GetContainer(); + if (window && window->IsFocusableWindow()) { + // AWT/Swing will later request focus to a proper component + // on handling the Java mouse event. Anyway, we have to + // activate the window here as it works both for AWT & Swing. + // Do it in our own fassion, + window->AwtSetActiveWindow(TRUE, LOWORD(lParam)/*hittest*/); + } + mr = mrConsume; + retValue = MA_NOACTIVATE; + break; } - break; - case WM_MOUSEACTIVATE: { - AwtWindow * window = (AwtWindow*)GetComponent((HWND)wParam); - if (window != NULL) { - if (!window->IsFocusableWindow()) { - // if it is non-focusable window we can return - // MA_NOACTIVATExxx and it will not be activated. We - // return NOACTIVATE for a client part of the window so we - // receive mouse event responsible for activation. We - // return NOACTIVEA for Frame's non-client so user be able - // to resize and move frames by title and borders. We - // return NOACTIVATEANDEAT for Window non-client area as - // there is noone to listen for this event. - mr = mrConsume; - if ((window == this) && LOWORD(lParam) != HTCLIENT ) { - if (window->IsSimpleWindow()) { - retValue = MA_NOACTIVATEANDEAT; - } else { - retValue = MA_NOACTIVATE; - } - } else { - retValue = MA_NOACTIVATE; - } - } - } - break; - } - case WM_CTLCOLORMSGBOX: case WM_CTLCOLOREDIT: case WM_CTLCOLORLISTBOX: @@ -1920,7 +1894,15 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) break; case WM_AWT_COMPONENT_SETFOCUS: - retValue = (LRESULT)WmComponentSetFocus((WmComponentSetFocusData *)wParam); + if ((BOOL)wParam) { + retValue = SynthesizeWmSetFocus(GetHWnd(), NULL); + } else { + retValue = SynthesizeWmKillFocus(GetHWnd(), NULL); + } + mr = mrConsume; + break; + case WM_AWT_WINDOW_SETACTIVE: + retValue = (LRESULT)((AwtWindow*)this)->AwtSetActiveWindow((BOOL)wParam); mr = mrConsume; break; @@ -2048,188 +2030,16 @@ MsgRouting AwtComponent::WmShowWindow(BOOL show, UINT status) MsgRouting AwtComponent::WmSetFocus(HWND hWndLostFocus) { - if (sm_focusOwner == GetHWnd()) { - sm_realFocusOpposite = NULL; - return mrConsume; - } - - HWND toplevelHWnd = AwtComponent::GetTopLevelParentForWindow(GetHWnd()); - AwtComponent *comp = AwtComponent::GetComponent(toplevelHWnd); - - if (comp && comp->IsEmbeddedFrame() && - !((AwtFrame*)comp)->activateEmbeddedFrameOnSetFocus(hWndLostFocus)) - { - // Fix for 6562716. - // In order that AwtSetFocus() returns FALSE. - sm_suppressFocusAndActivation = TRUE; - ::SetFocus(NULL); - sm_suppressFocusAndActivation = FALSE; - - return mrConsume; - } - - sm_focusOwner = GetHWnd(); - sm_focusedWindow = toplevelHWnd; - - if (sm_realFocusOpposite != NULL) { - hWndLostFocus = sm_realFocusOpposite; - sm_realFocusOpposite = NULL; - } - - sm_wheelRotationAmount = 0; - - SendFocusEvent(java_awt_event_FocusEvent_FOCUS_GAINED, hWndLostFocus); - + m_wheelRotationAmount = 0; return mrDoDefault; } MsgRouting AwtComponent::WmKillFocus(HWND hWndGotFocus) { - if (sm_focusOwner != NULL && sm_focusOwner == hWndGotFocus) { - return mrConsume; - } - - if (sm_focusOwner != GetHWnd()) { - if (sm_focusOwner != NULL) { - if (hWndGotFocus != NULL && - AwtComponent::GetComponent(hWndGotFocus) != NULL) - { - sm_realFocusOpposite = sm_focusOwner; - } - ::SendMessage(sm_focusOwner, WM_KILLFOCUS, (WPARAM)hWndGotFocus, - 0); - } - return mrConsume; - } - - AwtComponent *comp = AwtComponent::GetComponent(sm_focusedWindow); - - if (comp && comp->IsEmbeddedFrame()) { - ((AwtFrame*)comp)->deactivateEmbeddedFrameOnKillFocus(hWndGotFocus); - } - - sm_focusOwner = NULL; - sm_wheelRotationAmount = 0; - - SendFocusEvent(java_awt_event_FocusEvent_FOCUS_LOST, hWndGotFocus); + m_wheelRotationAmount = 0; return mrDoDefault; } -jboolean -AwtComponent::WmComponentSetFocus(WmComponentSetFocusData *data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - if (env->EnsureLocalCapacity(1) < 0) { - env->DeleteGlobalRef(data->lightweightChild); - delete data; - return JNI_FALSE; - } - - jboolean result = JNI_FALSE; - - BOOL setSuppressFocusAndActivation = FALSE; - - /* - * This is a fix for 4628933. - * If sm_suppressFocusAndActivation is TRUE here then - * this means that we dispatch WM_COMPONENT_SET_FOCUS inside - * dispatching bounce activation, this unlikely but possible. - * So we reset sm_suppressFocusAndActivation to give a chance - * to dispatch focus events which will generate due this focus - * request to Java. - * - * son@sparc.spb.su - */ - if (sm_suppressFocusAndActivation) { - sm_suppressFocusAndActivation = FALSE; - setSuppressFocusAndActivation = TRUE; - } - - jobject heavyweight = GetTarget(env); - jint retval = env->CallStaticIntMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID, - heavyweight, data->lightweightChild, data->temporary, - data->focusedWindowChangeAllowed, data->time, data->cause); - - if (retval == java_awt_KeyboardFocusManager_SNFH_SUCCESS_HANDLED) { - result = JNI_TRUE; - } else if (retval == java_awt_KeyboardFocusManager_SNFH_SUCCESS_PROCEED) { - result = (AwtSetFocus()) ? JNI_TRUE : JNI_FALSE; - if (result == JNI_FALSE) { - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::removeLastFocusRequestMID, - heavyweight); - } - } else { - DASSERT(retval == java_awt_KeyboardFocusManager_SNFH_FAILURE); - result = JNI_FALSE; - } - env->DeleteLocalRef(heavyweight); - - /* - * Set sm_suppressFocusAndActivation back to TRUE if needed. - * Fix for 4628933 (son@sparc.spb.su) - */ - if (setSuppressFocusAndActivation) { - sm_suppressFocusAndActivation = TRUE; - } - - env->DeleteGlobalRef(data->lightweightChild); - delete data; - return result; -} - -BOOL -AwtComponent::AwtSetFocus() -{ - HWND hwnd = GetHWnd(); - - if (sm_focusOwner == hwnd) { - return TRUE; - } - - HWND fgWindow = ::GetForegroundWindow(); - if (NULL != fgWindow) { - DWORD fgProcessID; - ::GetWindowThreadProcessId(fgWindow, &fgProcessID); - - if (fgProcessID != ::GetCurrentProcessId() - && !AwtToolkit::GetInstance().IsEmbedderProcessId(fgProcessID)) - { - // fix for 6458497. we shouldn't request focus if it is out of both - // our and embedder process. - return FALSE; - } - } - - AwtWindow *pCont = GetContainer(); - AwtFrame *owner = pCont ? pCont->GetOwningFrameOrDialog() : NULL; - - if (owner == NULL) { - ::SetFocus(hwnd); - if (::GetFocus() != hwnd) { - return FALSE; - } - } else { - HWND oldFocusOwner = sm_focusOwner; - if (oldFocusOwner != NULL) { - ::SendMessage(oldFocusOwner, WM_KILLFOCUS, (WPARAM)hwnd, 0); - } - - sm_suppressFocusAndActivation = TRUE; - ::SetActiveWindow(owner->GetHWnd()); - ::SetFocus(owner->GetProxyFocusOwner()); - sm_suppressFocusAndActivation = FALSE; - - sm_focusedWindow = GetTopLevelParentForWindow(GetHWnd()); - ::SendMessage(hwnd, WM_SETFOCUS, (WPARAM)oldFocusOwner, 0); - } - - return TRUE; -} - MsgRouting AwtComponent::WmCtlColor(HDC hDC, HWND hCtrl, UINT ctlColor, HBRUSH& retBrush) { @@ -2524,7 +2334,6 @@ MsgRouting AwtComponent::WmMouseDown(UINT flags, int x, int y, int button) AwtWindow::GetGrabbedWindow()->Ungrab(); } } - return mrConsume; } @@ -2638,11 +2447,11 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y, BOOL result; UINT platformLines; - sm_wheelRotationAmount += wheelRotation; + m_wheelRotationAmount += wheelRotation; // AWT interprets wheel rotation differently than win32, so we need to // decode wheel amount. - jint roundedWheelRotation = sm_wheelRotationAmount / (-1 * WHEEL_DELTA); + jint roundedWheelRotation = m_wheelRotationAmount / (-1 * WHEEL_DELTA); jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA); MSG msg; @@ -2668,7 +2477,9 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y, eventPt.x, eventPt.y, GetJavaModifiers(), 0, 0, scrollType, scrollLines, roundedWheelRotation, preciseWheelRotation, &msg); - sm_wheelRotationAmount %= WHEEL_DELTA; + m_wheelRotationAmount %= WHEEL_DELTA; + // this message could be propagated up to the parent chain + // by the mouse message post processors return mrConsume; } @@ -3088,6 +2899,19 @@ static const CharToVKEntry charToDeadVKTable[] = { {0,0} }; +// The full map of the current keyboard state including +// windows virtual key, scancode, java virtual key, and unicode +// for this key sans modifiers. +// All but first element may be 0. +// XXX in the update releases this is an addition to the unchanged existing code +struct DynPrimaryKeymapEntry { + UINT wkey; + UINT scancode; + UINT jkey; + WCHAR unicode; +}; + +static DynPrimaryKeymapEntry dynPrimaryKeymap[256]; void AwtComponent::InitDynamicKeyMapTable() @@ -3096,6 +2920,8 @@ AwtComponent::InitDynamicKeyMapTable() if (!kbdinited) { AwtComponent::BuildDynamicKeyMapTable(); + // We cannot build it here since JNI is not available yet: + //AwtComponent::BuildPrimaryDynamicTable(); kbdinited = TRUE; } } @@ -3321,7 +3147,11 @@ UINT AwtComponent::WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers) for (int j = 0; dynamicKeyMapTable[j].windowsKey != 0; j++) { if (dynamicKeyMapTable[j].windowsKey == windowsKey) { - return dynamicKeyMapTable[j].javaKey; + if (dynamicKeyMapTable[j].javaKey != java_awt_event_KeyEvent_VK_UNDEFINED) { + return dynamicKeyMapTable[j].javaKey; + }else{ + break; + } } } @@ -3398,6 +3228,122 @@ BOOL AwtComponent::IsNumPadKey(UINT vkey, BOOL extended) return FALSE; } +static void +resetKbdState( BYTE kstate[256]) { + BYTE tmpState[256]; + WCHAR wc[2]; + memmove(tmpState, kstate, sizeof(kstate)); + tmpState[VK_SHIFT] = 0; + tmpState[VK_CONTROL] = 0; + tmpState[VK_MENU] = 0; + + ::ToUnicodeEx(VK_SPACE,::MapVirtualKey(VK_SPACE, 0), tmpState, wc, 2, 0, GetKeyboardLayout(0)); +} + +// XXX in the update releases this is an addition to the unchanged existing code +// After the call, a table will have a unicode associated with a windows virtual keycode +// sans modifiers. With some further simplification, one can +// derive java keycode from it, and anyway we will pass this unicode value +// all the way up in a comment to a KeyEvent. +void +AwtComponent::BuildPrimaryDynamicTable() { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + // XXX: how about that? + //CriticalSection::Lock l(GetLock()); + //if (GetPeer(env) == NULL) { + // /* event received during termination. */ + // return; + //} + + HKL hkl = GetKeyboardLayout(); + UINT sc = 0; + BYTE kbdState[AwtToolkit::KB_STATE_SIZE]; + memset(kbdState, 0, sizeof (kbdState)); + + // Use JNI call to obtain java key code. We should keep a list + // of currently available keycodes in a single place. + static jclass extKeyCodesCls; + if( extKeyCodesCls == NULL) { + jclass extKeyCodesClsLocal = env->FindClass("sun/awt/ExtendedKeyCodes"); + DASSERT(extKeyCodesClsLocal); + if (extKeyCodesClsLocal == NULL) { + /* exception already thrown */ + return; + } + extKeyCodesCls = (jclass)env->NewGlobalRef(extKeyCodesClsLocal); + env->DeleteLocalRef(extKeyCodesClsLocal); + } + static jmethodID getExtendedKeyCodeForChar; + if (getExtendedKeyCodeForChar == NULL) { + getExtendedKeyCodeForChar = + env->GetStaticMethodID(extKeyCodesCls, "getExtendedKeyCodeForChar", "(I)I"); + DASSERT(getExtendedKeyCodeForChar); + } + jint extJKC; //extended Java key code + + for (UINT i = 0; i < 256; i++) { + dynPrimaryKeymap[i].wkey = i; + dynPrimaryKeymap[i].jkey = java_awt_event_KeyEvent_VK_UNDEFINED; + dynPrimaryKeymap[i].unicode = 0; + + if ((sc = MapVirtualKey (i, 0)) == 0) { + dynPrimaryKeymap[i].scancode = 0; + continue; + } + dynPrimaryKeymap[i].scancode = sc; + + // XXX process cases like VK_SHIFT etc. + kbdState[i] = 0x80; // "key pressed". + WCHAR wc[16]; + int k = ::ToUnicodeEx(i, sc, kbdState, wc, 16, 0, hkl); + if (k == 1) { + // unicode + dynPrimaryKeymap[i].unicode = wc[0]; + if (dynPrimaryKeymap[i].jkey == java_awt_event_KeyEvent_VK_UNDEFINED) { + // Convert unicode to java keycode. + //dynPrimaryKeymap[i].jkey = ((UINT)(wc[0]) + 0x01000000); + // + //XXX If this key in on the keypad, we should force a special value equal to + //XXX an old java keycode: but how to say if it is a keypad key? + //XXX We'll do it in WmKeyUp/Down. + extJKC = env->CallStaticIntMethod(extKeyCodesCls, + getExtendedKeyCodeForChar, (jint)(wc[0])); + dynPrimaryKeymap[i].jkey = extJKC; + } + }else if (k == -1) { + // dead key: use charToDeadVKTable + dynPrimaryKeymap[i].unicode = wc[0]; + resetKbdState( kbdState ); + for (const CharToVKEntry *map = charToDeadVKTable; map->c != 0; ++map) { + if (wc[0] == map->c) { + dynPrimaryKeymap[i].jkey = map->javaKey; + break; + } + } + } else if (k == 0) { + // reset + resetKbdState( kbdState ); + }else { + printf ("++++Whats that? wkey 0x%x (%d)\n", i,i); + } + kbdState[i] = 0; // "key unpressed" + } +} +void +AwtComponent::UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers) +{ + if( wkey && wkey < 256 ) { + if(keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD) { + // At the creation time, + // dynPrimaryKeymap cannot distinguish between e.g. "/" and "NumPad /" + dynPrimaryKeymap[wkey].jkey = jkeyLegacy; + } + if(dynPrimaryKeymap[wkey].jkey == java_awt_event_KeyEvent_VK_UNDEFINED) { + // E.g. it is non-unicode key + dynPrimaryKeymap[wkey].jkey = jkeyLegacy; + } + } +} UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops) { @@ -3554,10 +3500,12 @@ MsgRouting AwtComponent::WmKeyDown(UINT wkey, UINT repCnt, jint keyLocation = GetKeyLocation(wkey, flags); UINT jkey = WindowsKeyToJavaKey(wkey, modifiers); UINT character = WindowsKeyToJavaChar(wkey, modifiers, SAVE); + UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers); + SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_PRESSED, TimeHelper::windowsToUTC(msg.time), jkey, character, - modifiers, keyLocation, &msg); + modifiers, keyLocation, (jlong)wkey, &msg); // bugid 4724007: Windows does not create a WM_CHAR for the Del key // for some reason, so we need to create the KEY_TYPED event on the @@ -3569,7 +3517,7 @@ MsgRouting AwtComponent::WmKeyDown(UINT wkey, UINT repCnt, TimeHelper::windowsToUTC(msg.time), java_awt_event_KeyEvent_VK_UNDEFINED, character, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN); + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0); } return mrConsume; @@ -3594,10 +3542,11 @@ MsgRouting AwtComponent::WmKeyUp(UINT wkey, UINT repCnt, jint keyLocation = GetKeyLocation(wkey, flags); UINT jkey = WindowsKeyToJavaKey(wkey, modifiers); UINT character = WindowsKeyToJavaChar(wkey, modifiers, LOAD); + UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers); SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_RELEASED, TimeHelper::windowsToUTC(msg.time), jkey, character, - modifiers, keyLocation, &msg); + modifiers, keyLocation, (jlong)wkey, &msg); return mrConsume; } @@ -3613,6 +3562,7 @@ MsgRouting AwtComponent::WmInputLangChange(UINT charset, HKL hKeyboardLayout) m_idLang = LOWORD(hKeyboardLayout); // lower word of HKL is LANGID m_CodePage = LangToCodePage(m_idLang); BuildDynamicKeyMapTable(); // compute new mappings for VK_OEM + BuildPrimaryDynamicTable(); return mrConsume; // do not propagate to children } @@ -3643,7 +3593,7 @@ MsgRouting AwtComponent::WmIMEChar(UINT character, UINT repCnt, UINT flags, BOOL TimeHelper::windowsToUTC(msg.time), java_awt_event_KeyEvent_VK_UNDEFINED, unicodeChar, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, &msg); return mrConsume; } @@ -3712,7 +3662,7 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags, TimeHelper::windowsToUTC(msg.time), java_awt_event_KeyEvent_VK_UNDEFINED, unicodeChar, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, &msg); return mrConsume; } @@ -4033,14 +3983,15 @@ HIMC AwtComponent::ImmAssociateContext(HIMC himc) HWND AwtComponent::GetProxyFocusOwner() { - AwtWindow * window = GetContainer(); + AwtWindow *window = GetContainer(); if (window != 0) { - AwtFrame * owner = window->GetOwningFrameOrDialog(); + AwtFrame *owner = window->GetOwningFrameOrDialog(); if (owner != 0) { return owner->GetProxyFocusOwner(); + } else if (!window->IsSimpleWindow()) { // isn't an owned simple window + return ((AwtFrame*)window)->GetProxyFocusOwner(); } } - return (HWND)NULL; } @@ -4562,6 +4513,25 @@ HDC AwtComponent::GetDCFromComponent() return hdc; } +void AwtComponent::FillBackground(HDC hMemoryDC, SIZE &size) +{ + RECT eraseR = { 0, 0, size.cx, size.cy }; + VERIFY(::FillRect(hMemoryDC, &eraseR, GetBackgroundBrush())); +} + +void AwtComponent::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha) +{ + if (bitmapBits) { + DWORD* dest = (DWORD*)bitmapBits; + //XXX: might be optimized to use one loop (cy*cx -> 0). + for (int i = 0; i < size.cy; i++ ) { + for (int j = 0; j < size.cx; j++ ) { + ((BYTE*)(dest++))[3] = alpha; + } + } + } +} + jintArray AwtComponent::CreatePrintedPixels(SIZE &loc, SIZE &size) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -4619,26 +4589,53 @@ jintArray AwtComponent::CreatePrintedPixels(SIZE &loc, SIZE &size) { return pixelArray; } -void * -AwtComponent::GetNativeFocusOwner() { +void* AwtComponent::SetNativeFocusOwner(void *self) { + if (self == NULL) { + // It means that the KFM wants to set focus to null + sm_focusOwner = NULL; + return NULL; + } + + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + AwtComponent *c = NULL; + jobject peer = (jobject)self; + + PDATA pData; + JNI_CHECK_NULL_GOTO(peer, "peer", ret); + pData = JNI_GET_PDATA(peer); + if (pData == NULL) { + goto ret; + } + c = (AwtComponent *)pData; + +ret: + if (c && ::IsWindow(c->GetHWnd())) { + sm_focusOwner = c->GetHWnd(); + AwtFrame *owner = (AwtFrame*)GetComponent(c->GetProxyToplevelContainer()); + if (owner) { + owner->SetLastProxiedFocusOwner(sm_focusOwner); + } + } else { + sm_focusOwner = NULL; + } + env->DeleteGlobalRef(peer); + return NULL; +} + +void* AwtComponent::GetNativeFocusedWindow() { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); AwtComponent *comp = - AwtComponent::GetComponent(AwtComponent::sm_focusOwner); + AwtComponent::GetComponent(AwtComponent::GetFocusedWindow()); return (comp != NULL) ? comp->GetTargetAsGlobalRef(env) : NULL; } -void * -AwtComponent::GetNativeFocusedWindow() { + +void* AwtComponent::GetNativeFocusOwner() { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); AwtComponent *comp = - AwtComponent::GetComponent(AwtComponent::sm_focusedWindow); + AwtComponent::GetComponent(AwtComponent::sm_focusOwner); return (comp != NULL) ? comp->GetTargetAsGlobalRef(env) : NULL; } -void -AwtComponent::ClearGlobalFocusOwner() { - if (AwtComponent::sm_focusOwner != NULL) { - ::SetFocus(NULL); - } -} AwtComponent* AwtComponent::SearchChild(UINT id) { ChildListItem* child; @@ -4674,7 +4671,7 @@ void AwtComponent::RemoveChild(UINT id) { } void AwtComponent::SendKeyEvent(jint id, jlong when, jint raw, jint cooked, - jint modifiers, jint keyLocation, MSG *pMsg) + jint modifiers, jint keyLocation, jlong nativeCode, MSG *pMsg) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); CriticalSection::Lock l(GetLock()); @@ -4711,6 +4708,18 @@ void AwtComponent::SendKeyEvent(jint id, jlong when, jint raw, jint cooked, if (safe_ExceptionOccurred(env)) env->ExceptionDescribe(); DASSERT(!safe_ExceptionOccurred(env)); DASSERT(keyEvent != NULL); + env->SetLongField(keyEvent, AwtKeyEvent::rawCodeID, nativeCode); + if( nativeCode && nativeCode < 256 ) { + env->SetLongField(keyEvent, AwtKeyEvent::primaryLevelUnicodeID, (jlong)(dynPrimaryKeymap[nativeCode].unicode)); + env->SetLongField(keyEvent, AwtKeyEvent::extendedKeyCodeID, (jlong)(dynPrimaryKeymap[nativeCode].jkey)); + if( nativeCode < 255 ) { + env->SetLongField(keyEvent, AwtKeyEvent::scancodeID, (jlong)(dynPrimaryKeymap[nativeCode].scancode)); + }else if( pMsg != NULL ) { + // unknown key with virtual keycode 0xFF. + // Its scancode is not in the table, pickup it from the message. + env->SetLongField(keyEvent, AwtKeyEvent::scancodeID, (jlong)(HIWORD(pMsg->lParam) & 0xFF)); + } + } if (pMsg != NULL) { AwtAWTEvent::saveMSG(env, pMsg, keyEvent); } @@ -4724,16 +4733,17 @@ void AwtComponent::SendKeyEventToFocusOwner(jint id, jlong when, jint raw, jint cooked, jint modifiers, jint keyLocation, + jlong nativeCode, MSG *msg) { /* * if focus owner is null, but focused window isn't * we will send key event to focused window */ - HWND hwndTarget = ((sm_focusOwner != NULL) ? sm_focusOwner : sm_focusedWindow); + HWND hwndTarget = ((sm_focusOwner != NULL) ? sm_focusOwner : AwtComponent::GetFocusedWindow()); if (hwndTarget == GetHWnd()) { - SendKeyEvent(id, when, raw, cooked, modifiers, keyLocation, msg); + SendKeyEvent(id, when, raw, cooked, modifiers, keyLocation, nativeCode, msg); } else { AwtComponent *target = NULL; if (hwndTarget != NULL) { @@ -4744,7 +4754,7 @@ AwtComponent::SendKeyEventToFocusOwner(jint id, jlong when, } if (target != NULL) { target->SendKeyEvent(id, when, raw, cooked, modifiers, - keyLocation, msg); + keyLocation, nativeCode, msg); } } } @@ -5158,14 +5168,7 @@ void AwtComponent::SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent) jint x = (env)->GetIntField(mouseEvent, AwtMouseEvent::xID); jint y = (env)->GetIntField(mouseEvent, AwtMouseEvent::yID); MSG* msg = CreateMessage(message, wParam, MAKELPARAM(x, y), x, y); - // If the window is not focusable but if this is a focusing - // message we should skip it then and perform our own actions. - AwtWindow *pCont = GetContainer(); - if ((pCont && pCont->IsFocusableWindow()) || !ActMouseMessage(msg)) { - PostHandleEventMessage(msg, TRUE); - } else { - delete msg; - } + PostHandleEventMessage(msg, TRUE); } BOOL AwtComponent::InheritsNativeMouseWheelBehavior() {return false;} @@ -5251,15 +5254,14 @@ void AwtComponent::UnlinkObjects() void AwtComponent::Enable(BOOL bEnable) { - sm_suppressFocusAndActivation = TRUE; - if (bEnable && IsTopLevel()) { // we should not enable blocked toplevels bEnable = !::IsWindow(AwtWindow::GetModalBlocker(GetHWnd())); } + // Shouldn't trigger native focus change + // (only the proxy may be the native focus owner). ::EnableWindow(GetHWnd(), bEnable); - sm_suppressFocusAndActivation = FALSE; CriticalSection::Lock l(GetLock()); VerifyState(); } @@ -5286,23 +5288,12 @@ void AwtComponent::DestroyDropTarget() { } } -/** - * Special procedure responsible for performing the actions which - * usually happen with component when mouse buttons are being - * pressed. It is required in case of non-focusable components - we - * don't pass mouse messages directly to the windows because otherwise - * it will try to focus component first which we don't want. This - * function receives MSG and should return TRUE if it processed the - * message and no furhter processing is allowed, FALSE otherwise. - * Default implementation returns TRUE it is the message on which - * Windows try to focus the component. Descendant components write - * their own implementation of this procedure. - */ -BOOL AwtComponent::ActMouseMessage(MSG * pMsg) { - if (IsFocusingMessage(pMsg->message)) { - return TRUE; - } - return FALSE; +BOOL AwtComponent::IsFocusingMouseMessage(MSG *pMsg) { + return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONDBLCLK; +} + +BOOL AwtComponent::IsFocusingKeyMessage(MSG *pMsg) { + return pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_SPACE; } void AwtComponent::_Show(void *param) @@ -5640,22 +5631,12 @@ void AwtComponent::_NativeHandleEvent(void *param) return; } - /* Post the message directly to the subclassed component. */ - if (self && (pData = JNI_GET_PDATA(self))) { - AwtComponent* p = (AwtComponent*)pData; - // If the window is not focusable but if this is a focusing - // message we should skip it then and perform our own actions. - AwtWindow *pCont = (AwtWindow*)(p->GetContainer()); - if ((pCont && pCont->IsFocusableWindow()) || - !p->ActMouseMessage(&msg)) - { - // Create copy for local msg - MSG* pCopiedMsg = new MSG; - memmove(pCopiedMsg, &msg, sizeof(MSG)); - // Event handler deletes msg - p->PostHandleEventMessage(pCopiedMsg, FALSE); - } - } + // Create copy for local msg + MSG* pCopiedMsg = new MSG; + memmove(pCopiedMsg, &msg, sizeof(MSG)); + // Event handler deletes msg + p->PostHandleEventMessage(pCopiedMsg, FALSE); + env->DeleteGlobalRef(self); env->DeleteGlobalRef(event); delete nhes; @@ -5777,19 +5758,15 @@ ret: delete sfs; } -jboolean AwtComponent::_RequestFocus(void *param) +// Sets or kills focus for a component. +void AwtComponent::_SetFocus(void *param) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - RequestFocusStruct *rfs = (RequestFocusStruct *)param; - jobject self = rfs->component; - jobject lightweightChild = rfs->lightweightChild; - jboolean temporary = rfs->temporary; - jboolean focusedWindowChangeAllowed = rfs->focusedWindowChangeAllowed; - jlong time = rfs->time; - jobject cause = rfs->cause; + SetFocusStruct *sfs = (SetFocusStruct *)param; + jobject self = sfs->component; + jboolean doSetFocus = sfs->doSetFocus; - jboolean result = JNI_FALSE; AwtComponent *c = NULL; PDATA pData; @@ -5801,25 +5778,13 @@ jboolean AwtComponent::_RequestFocus(void *param) } c = (AwtComponent *)pData; - if (::IsWindow(c->GetHWnd())) - { - WmComponentSetFocusData *data = new WmComponentSetFocusData; - data->lightweightChild = env->NewGlobalRef(lightweightChild); - data->temporary = temporary; - data->focusedWindowChangeAllowed = focusedWindowChangeAllowed; - data->time = time; - data->cause = cause; - result = (jboolean)c->SendMessage(WM_AWT_COMPONENT_SETFOCUS, (WPARAM)data, 0); - // data and global ref in it are deleted in WmComponentSetFocus + if (::IsWindow(c->GetHWnd())) { + c->SendMessage(WM_AWT_COMPONENT_SETFOCUS, (WPARAM)doSetFocus, 0); } ret: env->DeleteGlobalRef(self); - env->DeleteGlobalRef(lightweightChild); - env->DeleteGlobalRef(cause); - delete rfs; - - return result; + delete sfs; } void AwtComponent::_Start(void *param) @@ -6082,9 +6047,9 @@ void AwtComponent::SetParent(void * param) { HWND selfWnd = comps[0]->GetHWnd(); HWND parentWnd = comps[1]->GetHWnd(); if (::IsWindow(selfWnd) && ::IsWindow(parentWnd)) { - sm_suppressFocusAndActivation = TRUE; + // Shouldn't trigger native focus change + // (only the proxy may be the native focus owner). ::SetParent(selfWnd, parentWnd); - sm_suppressFocusAndActivation = FALSE; } } delete[] comps; @@ -6107,15 +6072,12 @@ void AwtComponent::_SetRectangularShape(void *param) AwtComponent *c = NULL; - - PDATA pData; JNI_CHECK_PEER_GOTO(self, ret); + c = (AwtComponent *)pData; - if (::IsWindow(c->GetHWnd())) - { + if (::IsWindow(c->GetHWnd())) { HRGN hRgn = NULL; - if (region || x1 || x2 || y1 || y2) { // If all the params are zeros, the shape must be simply reset. // Otherwise, convert it into a region. @@ -6157,6 +6119,33 @@ ret: delete data; } +void AwtComponent::_SetZOrder(void *param) { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + SetZOrderStruct *data = (SetZOrderStruct *)param; + jobject self = data->component; + HWND above = HWND_TOP; + if (data->above != 0) { + above = reinterpret_cast<HWND>(data->above); + } + + AwtComponent *c = NULL; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + + c = (AwtComponent *)pData; + if (::IsWindow(c->GetHWnd())) { + ::SetWindowPos(c->GetHWnd(), above, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE | SWP_ASYNCWINDOWPOS); + } + +ret: + env->DeleteGlobalRef(self); + + delete data; +} + void AwtComponent::PostUngrabEvent() { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); jobject target = GetTarget(env); @@ -6173,6 +6162,14 @@ void AwtComponent::PostUngrabEvent() { } } +void AwtComponent::SetFocusedWindow(HWND window) +{ + HWND old = sm_focusedWindow; + sm_focusedWindow = window; + + AwtWindow::FocusedWindowChanged(old, window); +} + /************************************************************************ * Component native methods */ @@ -6587,31 +6584,25 @@ Java_sun_awt_windows_WComponentPeer__1setFont(JNIEnv *env, jobject self, /* * Class: sun_awt_windows_WComponentPeer - * Method: requestFocus - * Signature: (Ljava/awt/Component;ZZJ)Z + * Method: focusGained + * Signature: (Z) */ -JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WComponentPeer__1requestFocus - (JNIEnv *env, jobject self, jobject lightweightChild, jboolean temporary, - jboolean focusedWindowChangeAllowed, jlong time, jobject cause) +JNIEXPORT void JNICALL Java_sun_awt_windows_WComponentPeer_setFocus + (JNIEnv *env, jobject self, jboolean doSetFocus) { TRY; jobject selfGlobalRef = env->NewGlobalRef(self); - jobject lightweightChildGlobalRef = env->NewGlobalRef(lightweightChild); - RequestFocusStruct *rfs = new RequestFocusStruct; - rfs->component = selfGlobalRef; - rfs->lightweightChild = lightweightChildGlobalRef; - rfs->temporary = temporary; - rfs->focusedWindowChangeAllowed = focusedWindowChangeAllowed; - rfs->time = time; - rfs->cause = env->NewGlobalRef(cause); + SetFocusStruct *sfs = new SetFocusStruct; + sfs->component = selfGlobalRef; + sfs->doSetFocus = doSetFocus; - return (jboolean)AwtToolkit::GetInstance().SyncCall( - (void*(*)(void*))AwtComponent::_RequestFocus, rfs); - // global refs and rfs are deleted in _RequestFocus + AwtToolkit::GetInstance().SyncCall( + (void*(*)(void*))AwtComponent::_SetFocus, sfs); + // global refs and self are deleted in _SetFocus - CATCH_BAD_ALLOC_RET(JNI_FALSE); + CATCH_BAD_ALLOC; } /* @@ -6823,25 +6814,6 @@ Java_sun_awt_windows_WComponentPeer_isObscured(JNIEnv* env, CATCH_BAD_ALLOC_RET(NULL); } -JNIEXPORT jboolean JNICALL -Java_sun_awt_windows_WComponentPeer_processSynchronousLightweightTransfer(JNIEnv *env, jclass cls, - jobject heavyweight, - jobject descendant, - jboolean temporary, - jboolean focusedWindowChangeAllowed, - jlong time) -{ - TRY; - - return env->CallStaticBooleanMethod(AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::processSynchronousTransfer, - heavyweight, descendant, temporary, - focusedWindowChangeAllowed, - time); - - CATCH_BAD_ALLOC_RET(JNI_TRUE); -} - JNIEXPORT void JNICALL Java_sun_awt_windows_WComponentPeer_pSetParent(JNIEnv* env, jobject self, jobject parent) { TRY; @@ -6883,6 +6855,21 @@ Java_sun_awt_windows_WComponentPeer_setRectangularShape(JNIEnv* env, jobject sel CATCH_BAD_ALLOC; } +JNIEXPORT void JNICALL +Java_sun_awt_windows_WComponentPeer_setZOrder(JNIEnv* env, jobject self, jlong above) +{ + TRY; + + SetZOrderStruct * data = new SetZOrderStruct; + data->component = env->NewGlobalRef(self); + data->above = above; + + AwtToolkit::GetInstance().SyncCall(AwtComponent::_SetZOrder, data); + // global refs and data are deleted in _SetLower + + CATCH_BAD_ALLOC; +} + } /* extern "C" */ diff --git a/src/windows/native/sun/windows/awt_Component.h b/src/windows/native/sun/windows/awt_Component.h index 0c18961ed49b05999077e2b7e4facecc62698e76..8eec52be821471b46abcff537cd8d55c034c5242 100644 --- a/src/windows/native/sun/windows/awt_Component.h +++ b/src/windows/native/sun/windows/awt_Component.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -78,8 +78,6 @@ class AwtPopupMenu; class AwtDropTarget; -struct WmComponentSetFocusData; - /* * Message routing codes */ @@ -139,12 +137,13 @@ public: virtual void RegisterClass(); virtual void UnregisterClass(); - void CreateHWnd(JNIEnv *env, LPCWSTR title, + virtual void CreateHWnd(JNIEnv *env, LPCWSTR title, DWORD windowStyle, DWORD windowExStyle, int x, int y, int w, int h, HWND hWndParent, HMENU hMenu, COLORREF colorForeground, COLORREF colorBackground, jobject peer); + virtual void DestroyHWnd(); void InitPeerGraphicsConfig(JNIEnv *env, jobject peer); virtual void Dispose(); @@ -221,17 +220,10 @@ public: virtual BOOL IsContainer() { return FALSE;} // Plain components can't /** - * Perform some actions which by default are being performed by Default Window procedure of - * this window class - * For detailed comments see implementation in awt_Component.cpp - */ - virtual BOOL ActMouseMessage(MSG * pMsg); - /** - * Returns TRUE if this message will this component to become focused. Returns FALSE otherwise. + * Returns TRUE if this message will trigger native focus change, FALSE otherwise. */ - inline BOOL IsFocusingMessage(UINT message) { - return message == WM_LBUTTONDOWN || message == WM_LBUTTONUP || message == WM_LBUTTONDBLCLK; - } + virtual BOOL IsFocusingKeyMessage(MSG *pMsg); + virtual BOOL IsFocusingMouseMessage(MSG *pMsg); BOOL IsFocusable(); @@ -373,7 +365,7 @@ public: } void SendKeyEventToFocusOwner(jint id, jlong when, jint raw, jint cooked, - jint modifiers, jint keyLocation, + jint modifiers, jint keyLocation, jlong nativeCode, MSG *msg = NULL); /* * Allocate and initialize a new java.awt.event.KeyEvent, and @@ -381,7 +373,7 @@ public: * from the target. */ void SendKeyEvent(jint id, jlong when, jint raw, jint cooked, - jint modifiers, jint keyLocation, + jint modifiers, jint keyLocation, jlong nativeCode, MSG *msg = NULL); /* @@ -431,13 +423,6 @@ public: */ virtual BOOL InheritsNativeMouseWheelBehavior(); - /* Functions for MouseWheel support on Windows95 - * These should only be called if running on 95 - */ - static void Wheel95Init(); - INLINE static UINT Wheel95GetMsg() {return sm_95WheelMessage;} - static UINT Wheel95GetScrLines(); - /* Determines whether the component is obscured by another window */ // Called on Toolkit thread static jboolean _IsObscured(void *param); @@ -457,6 +442,7 @@ public: static UINT GetButtonMK(int mouseButton); static UINT WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers); static void JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers, UINT originalWindowsKey); + static void UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers); INLINE static void AwtComponent::JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers) @@ -480,6 +466,12 @@ public: HIMC ImmGetContext(); HIMC ImmAssociateContext(HIMC himc); HWND GetProxyFocusOwner(); + + INLINE HWND GetProxyToplevelContainer() { + HWND proxyHWnd = GetProxyFocusOwner(); + return ::GetAncestor(proxyHWnd, GA_ROOT); // a browser in case of EmbeddedFrame + } + void CallProxyDefWindowProc(UINT message, WPARAM wParam, LPARAM lParam, @@ -517,11 +509,6 @@ public: virtual MsgRouting WmShowWindow(BOOL show, UINT status); virtual MsgRouting WmSetFocus(HWND hWndLost); virtual MsgRouting WmKillFocus(HWND hWndGot); - jboolean WmComponentSetFocus(WmComponentSetFocusData *data); - // Use instead of ::SetFocus to maintain special focusing semantics for - // Windows which are not Frames/Dialogs. - BOOL AwtSetFocus(); - virtual MsgRouting WmCtlColor(HDC hDC, HWND hCtrl, UINT ctlColor, HBRUSH& retBrush); virtual MsgRouting WmHScroll(UINT scrollCode, UINT pos, HWND hScrollBar); @@ -611,10 +598,6 @@ public: jintArray CreatePrintedPixels(SIZE &loc, SIZE &size); - static void * GetNativeFocusOwner(); - static void * GetNativeFocusedWindow(); - static void ClearGlobalFocusOwner(); - /* * HWND, AwtComponent and Java Peer interaction * @@ -673,7 +656,6 @@ public: static void _SetForeground(void *param); static void _SetBackground(void *param); static void _SetFont(void *param); - static jboolean _RequestFocus(void *param); static void _Start(void *param); static void _BeginValidate(void *param); static void _EndValidate(void *param); @@ -683,10 +665,40 @@ public: static jintArray _CreatePrintedPixels(void *param); static jboolean _NativeHandlesWheelScrolling(void *param); static void _SetRectangularShape(void *param); + static void _SetZOrder(void *param); static HWND sm_focusOwner; + +private: static HWND sm_focusedWindow; +public: + static inline HWND GetFocusedWindow() { return sm_focusedWindow; } + static void SetFocusedWindow(HWND window); + + static void _SetFocus(void *param); + + static void *SetNativeFocusOwner(void *self); + static void *GetNativeFocusedWindow(); + static void *GetNativeFocusOwner(); + + static BOOL sm_inSynthesizeFocus; + + // Execute on Toolkit only. + INLINE static LRESULT SynthesizeWmSetFocus(HWND targetHWnd, HWND oppositeHWnd) { + sm_inSynthesizeFocus = TRUE; + LRESULT res = ::SendMessage(targetHWnd, WM_SETFOCUS, (WPARAM)oppositeHWnd, 0); + sm_inSynthesizeFocus = FALSE; + return res; + } + // Execute on Toolkit only. + INLINE static LRESULT SynthesizeWmKillFocus(HWND targetHWnd, HWND oppositeHWnd) { + sm_inSynthesizeFocus = TRUE; + LRESULT res = ::SendMessage(targetHWnd, WM_KILLFOCUS, (WPARAM)oppositeHWnd, 0); + sm_inSynthesizeFocus = FALSE; + return res; + } + static BOOL sm_bMenuLoop; static INLINE BOOL isMenuLoopActive() { return sm_bMenuLoop; @@ -710,14 +722,25 @@ protected: BOOL m_visible; /* copy of Component.visible */ static BOOL sm_suppressFocusAndActivation; - static HWND sm_realFocusOpposite; + static BOOL sm_restoreFocusAndActivation; + + /* + * The function sets the focus-restore flag ON/OFF. + * When the flag is ON, focus is restored immidiately after the proxy loses it. + * All focus messages are suppressed. It's also assumed that sm_focusedWindow and + * sm_focusOwner don't change after the flag is set ON and before it's set OFF. + */ + static INLINE void SetRestoreFocus(BOOL doSet) { + sm_suppressFocusAndActivation = doSet; + sm_restoreFocusAndActivation = doSet; + } virtual void SetDragCapture(UINT flags); virtual void ReleaseDragCapture(UINT flags); - // 95 support for mouse wheel - static UINT sm_95WheelMessage; - static UINT sm_95WheelSupport; + //These functions are overridden in AwtWindow to handle non-opaque windows. + virtual void FillBackground(HDC hMemoryDC, SIZE &size); + virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha); private: /* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON @@ -761,6 +784,8 @@ private: static BOOL sm_rtl; static BOOL sm_rtlReadingOrder; + static BOOL sm_PrimaryDynamicTableBuilt; + jobject m_InputMethod; BOOL m_useNativeCompWindow; LPARAM m_bitsCandType; @@ -780,8 +805,6 @@ private: static BOOL m_QueryNewPaletteCalled; - BOOL m_skipNextSetFocus; - static AwtComponent* sm_getComponentCache; // a cache for the GetComponent(..) method. int windowMoveLockPosX; @@ -790,7 +813,7 @@ private: int windowMoveLockPosCY; // 6524352: support finer-resolution - static int sm_wheelRotationAmount; + int m_wheelRotationAmount; /* * The association list of children's IDs and corresponding components. @@ -826,6 +849,7 @@ private: AwtComponent* SearchChild(UINT id); void RemoveChild(UINT id) ; static BOOL IsNavigationKey(UINT wkey); + static void BuildPrimaryDynamicTable(); ChildListItem* m_childList; @@ -876,14 +900,6 @@ public: void RealizePalettes(int screen); }; -struct WmComponentSetFocusData { - jobject lightweightChild; - jboolean temporary; - jboolean focusedWindowChangeAllowed; - jlong time; - jobject cause; -}; - void ReleaseDCList(HWND hwnd, DCList &list); void MoveDCToPassiveList(HDC hDC); diff --git a/src/windows/native/sun/windows/awt_Dialog.cpp b/src/windows/native/sun/windows/awt_Dialog.cpp index ecf74549d464b23e02bf7a2f98712b34c3437f1a..147bcf711ebdc7b7a3c278967e681047abd3f586 100644 --- a/src/windows/native/sun/windows/awt_Dialog.cpp +++ b/src/windows/native/sun/windows/awt_Dialog.cpp @@ -230,25 +230,8 @@ LRESULT CALLBACK AwtDialog::ModalFilterProc(int code, if (::IsIconic(hWnd)) { ::ShowWindow(hWnd, SW_RESTORE); } - HWND topMostBlocker = blocker; - HWND toolkitHWnd = AwtToolkit::GetInstance().GetHWnd(); - while (::IsWindow(blocker)) { - topMostBlocker = blocker; - // fix for 6494032: restore the blocker if it was minimized - // together with its parent frame; in such cases the check - // ::IsIconic() for the blocker returns false, so we use - // ::IsWindowVisible() instead - if (!::IsWindowVisible(topMostBlocker) && - (topMostBlocker != toolkitHWnd)) - { - ::ShowWindow(topMostBlocker, SW_SHOWNA); - } - ::BringWindowToTop(blocker); - blocker = AwtWindow::GetModalBlocker(blocker); - } - if (topMostBlocker != toolkitHWnd) { - ::SetForegroundWindow(topMostBlocker); - } + PopupAllDialogs(blocker, TRUE, ::GetForegroundWindow(), FALSE); + // return 1 to prevent the system from allowing the operation return 1; } return CallNextHookEx(0, code, wParam, lParam); @@ -271,30 +254,11 @@ LRESULT CALLBACK AwtDialog::MouseHookProc(int nCode, (wParam == WM_NCRBUTTONDOWN)) { HWND blocker = AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(hWnd)); - HWND topMostBlocker = blocker; - HWND prevForegroundWindow = ::GetForegroundWindow(); if (::IsWindow(blocker)) { - ::BringWindowToTop(hWnd); - } - while (::IsWindow(blocker)) { - topMostBlocker = blocker; - ::BringWindowToTop(blocker); - blocker = AwtWindow::GetModalBlocker(blocker); - } - if (::IsWindow(topMostBlocker)) { - // no beep/flash if the mouse was clicked in the taskbar menu - // or the dialog is currently inactive - if ((::WindowFromPoint(mhs->pt) == hWnd) && - (prevForegroundWindow == topMostBlocker)) - { - ::MessageBeep(MB_OK); - // some heuristics: 3 times x 64 milliseconds - AwtWindow::FlashWindowEx(topMostBlocker, 3, 64, FLASHW_CAPTION); - } - if (topMostBlocker != AwtToolkit::GetInstance().GetHWnd()) { - ::BringWindowToTop(topMostBlocker); - ::SetForegroundWindow(topMostBlocker); - } + BOOL onTaskbar = !(::WindowFromPoint(mhs->pt) == hWnd); + PopupAllDialogs(hWnd, FALSE, ::GetForegroundWindow(), onTaskbar); + // return a nonzero value to prevent the system from passing + // the message to the target window procedure return 1; } } @@ -303,6 +267,63 @@ LRESULT CALLBACK AwtDialog::MouseHookProc(int nCode, return CallNextHookEx(0, nCode, wParam, lParam); } +/* + * The function goes through the heirarchy of the blocker dialogs and + * popups all the dialogs. Note that the function starts from the top + * blocker dialog and goes down to the dialog which is the bottom dialog. + * Using another traversal may cause to the flickering issue as a bottom + * dialog will cover a top dialog for some period of time. + */ +void AwtDialog::PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar) +{ + HWND blocker = AwtWindow::GetModalBlocker(dialog); + BOOL isBlocked = ::IsWindow(blocker); + if (isBlocked) { + PopupAllDialogs(blocker, isModalHook, prevFGWindow, onTaskbar); + } + PopupOneDialog(dialog, blocker, isModalHook, prevFGWindow, onTaskbar); +} + +/* + * The function popups the dialog, it distinguishes non-blocked dialogs + * and activates the dialogs (sets as foreground window). If the dialog is + * blocked, then it changes the Z-order of the dialog. + */ +void AwtDialog::PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar) +{ + if (dialog == AwtToolkit::GetInstance().GetHWnd()) { + return; + } + + // fix for 6494032 + if (isModalHook && !::IsWindowVisible(dialog)) { + ::ShowWindow(dialog, SW_SHOWNA); + } + + BOOL isBlocked = ::IsWindow(blocker); + UINT flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE; + + if (isBlocked) { + ::SetWindowPos(dialog, blocker, 0, 0, 0, 0, flags); + } else { + ::SetWindowPos(dialog, HWND_TOP, 0, 0, 0, 0, flags); + // no beep/flash if the mouse was clicked in the taskbar menu + // or the dialog is currently inactive + if (!isModalHook && !onTaskbar && (dialog == prevFGWindow)) { + AnimateModalBlocker(dialog); + } + ::BringWindowToTop(dialog); + ::SetForegroundWindow(dialog); + } +} + +void AwtDialog::AnimateModalBlocker(HWND window) +{ + ::MessageBeep(MB_OK); + // some heuristics: 3 times x 64 milliseconds + AwtWindow::FlashWindowEx(window, 3, 64, FLASHW_CAPTION); +} + LRESULT CALLBACK AwtDialog::MouseHookProc_NonTT(int nCode, WPARAM wParam, LPARAM lParam) { diff --git a/src/windows/native/sun/windows/awt_Dialog.h b/src/windows/native/sun/windows/awt_Dialog.h index 41ab6ad05b03c719f03bbb56c25a8205c12970c1..a697a8c9b1527a5dc2b4c3b2361f267c2dd74c45 100644 --- a/src/windows/native/sun/windows/awt_Dialog.h +++ b/src/windows/native/sun/windows/awt_Dialog.h @@ -76,7 +76,7 @@ public: * Thus we don't have to perform any transitive (a blocker of a blocker) checks. */ INLINE virtual BOOL IsFocusedWindowModalBlocker() { - return (sm_focusedWindow != NULL) && (GetModalBlocker(sm_focusedWindow) == GetHWnd()); + return (AwtComponent::GetFocusedWindow() != NULL) && (GetModalBlocker(AwtComponent::GetFocusedWindow()) == GetHWnd()); } // finds and activates some window after the modal dialog is hidden @@ -113,6 +113,9 @@ private: */ static void ModalPerformActivation(HWND hWnd); + static void PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar); + static void PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar); + public: // WH_CBT hook procedure used in modality, prevents modal @@ -129,6 +132,8 @@ public: // example on browser's thread when running in Java Plugin static LRESULT CALLBACK MouseHookProc_NonTT(int code, WPARAM wParam, LPARAM lParam); + + static void AnimateModalBlocker(HWND window); }; #endif /* AWT_DIALOG_H */ diff --git a/src/windows/native/sun/windows/awt_FileDialog.cpp b/src/windows/native/sun/windows/awt_FileDialog.cpp index 84339e40eeed68e62daaf59bb663ebd58db0b9c6..080e8d42741e4aa1912cc0651978cb6c6f288138 100644 --- a/src/windows/native/sun/windows/awt_FileDialog.cpp +++ b/src/windows/native/sun/windows/awt_FileDialog.cpp @@ -101,7 +101,8 @@ LRESULT CALLBACK FileDialogWndProc(HWND hWnd, UINT message, } } - return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam); + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); + return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); } static UINT_PTR CALLBACK @@ -135,16 +136,19 @@ FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) } // subclass dialog's parent to receive additional messages - ComCtl32Util::GetInstance().SubclassHWND(parent, - FileDialogWndProc); + WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(parent, + FileDialogWndProc); + ::SetProp(parent, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc)); break; } case WM_DESTROY: { + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(parent, NativeDialogWndProcProp)); ComCtl32Util::GetInstance().UnsubclassHWND(parent, FileDialogWndProc, - NULL); + lpfnWndProc); ::RemoveProp(parent, ModalDialogPeerProp); + ::RemoveProp(parent, NativeDialogWndProcProp); break; } case WM_NOTIFY: { diff --git a/src/windows/native/sun/windows/awt_Frame.cpp b/src/windows/native/sun/windows/awt_Frame.cpp index 60738e693576e1737d623522c045b55482950b74..50f41d102ee909ba3695afd9054721d177c3ecd6 100644 --- a/src/windows/native/sun/windows/awt_Frame.cpp +++ b/src/windows/native/sun/windows/awt_Frame.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -39,8 +39,6 @@ #include <sun_awt_windows_WEmbeddedFramePeer.h> -BOOL isAppActive = FALSE; - /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. */ @@ -90,8 +88,10 @@ struct BlockedThreadStruct { */ jfieldID AwtFrame::handleID; -jfieldID AwtFrame::stateID; + jfieldID AwtFrame::undecoratedID; +jmethodID AwtFrame::getExtendedStateMID; +jmethodID AwtFrame::setExtendedStateMID; jmethodID AwtFrame::activateEmbeddingTopLevelMID; @@ -110,6 +110,7 @@ AwtFrame::AwtFrame() { m_isInputMethodWindow = FALSE; m_isUndecorated = FALSE; m_proxyFocusOwner = NULL; + m_lastProxiedFocusOwner = NULL; m_actualFocusedWindow = NULL; m_iconic = FALSE; m_zoomed = FALSE; @@ -232,7 +233,7 @@ AwtFrame* AwtFrame::Create(jobject self, jobject parent) frame->InitPeerGraphicsConfig(env, self); AwtToolkit::GetInstance().RegisterEmbedderProcessId(hwndParent); } else { - jint state = env->GetIntField(target, AwtFrame::stateID); + jint state = env->CallIntMethod(self, AwtFrame::getExtendedStateMID); DWORD exStyle; DWORD style; @@ -285,7 +286,6 @@ AwtFrame* AwtFrame::Create(jobject self, jobject parent) ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOWFRAME), self); - /* * Reshape here instead of during create, so that a * WM_NCCALCSIZE is sent. @@ -319,12 +319,13 @@ LRESULT CALLBACK AwtFrame::ProxyWindowProc(HWND hwnd, UINT message, AwtComponent::GetComponentImpl(::GetParent(hwnd)); if (!parent || parent->GetProxyFocusOwner() != hwnd || - message == AwtComponent::WmAwtIsComponent) + message == AwtComponent::WmAwtIsComponent || + message == WM_GETOBJECT) { return ComCtl32Util::GetInstance().DefWindowProc(NULL, hwnd, message, wParam, lParam); } - AwtComponent *p = NULL; + AwtComponent *focusOwner = NULL; // IME and input language related messages need to be sent to a window // which has the Java input focus switch (message) { @@ -342,16 +343,37 @@ LRESULT CALLBACK AwtFrame::ProxyWindowProc(HWND hwnd, UINT message, case WM_IME_KEYUP: case WM_INPUTLANGCHANGEREQUEST: case WM_INPUTLANGCHANGE: - p = AwtComponent::GetComponent(sm_focusOwner); - if (p != NULL) { - return p->WindowProc(message, wParam, lParam); + // TODO: when a Choice's list is dropped down and we're scrolling in + // the list WM_MOUSEWHEEL messages come to the poxy, not to the list. Why? + case WM_MOUSEWHEEL: + focusOwner = AwtComponent::GetComponent(parent->GetLastProxiedFocusOwner()); + if (focusOwner != NULL) { + return focusOwner->WindowProc(message, wParam, lParam); } break; + case WM_SETFOCUS: + if (!sm_suppressFocusAndActivation && parent->IsEmbeddedFrame()) { + parent->AwtSetActiveWindow(); + } + return 0; + case WM_KILLFOCUS: + if (!sm_suppressFocusAndActivation && parent->IsEmbeddedFrame()) { + AwtWindow::SynthesizeWmActivate(FALSE, parent->GetHWnd(), NULL); + + } else if (sm_restoreFocusAndActivation) { + if (AwtComponent::GetFocusedWindow() != NULL) { + AwtWindow *focusedWindow = (AwtWindow*)GetComponent(AwtComponent::GetFocusedWindow()); + if (focusedWindow != NULL) { + // Will just silently restore native focus & activation. + focusedWindow->AwtSetActiveWindow(); + } + } + } + return 0; case 0x0127: // WM_CHANGEUISTATE case 0x0128: // WM_UPDATEUISTATE return 0; } - return parent->WindowProc(message, wParam, lParam); CATCH_BAD_ALLOC_RET(0); @@ -554,7 +576,6 @@ MsgRouting AwtFrame::WmNcMouseDown(WPARAM hitTest, int x, int y, int button) { if (m_grabbedWindow != NULL/* && !m_grabbedWindow->IsOneOfOwnersOf(this)*/) { m_grabbedWindow->Ungrab(); } - if (!IsFocusableWindow() && (button & LEFT_BUTTON)) { switch (hitTest) { case HTTOP: @@ -586,11 +607,6 @@ MsgRouting AwtFrame::WmNcMouseDown(WPARAM hitTest, int x, int y, int button) { return AwtWindow::WmNcMouseDown(hitTest, x, y, button); } -MsgRouting AwtFrame::WmWindowPosChanged(LPARAM windowPos) { - return mrDoDefault; -} - - // Override AwtWindow::Reshape() to handle minimized/maximized // frames (see 6525850, 4065534) void AwtFrame::Reshape(int x, int y, int width, int height) @@ -827,6 +843,11 @@ MsgRouting AwtFrame::WmGetMinMaxInfo(LPMINMAXINFO lpmmi) MsgRouting AwtFrame::WmSize(UINT type, int w, int h) { + currentWmSizeState = type; + if (currentWmSizeState == SIZE_MINIMIZED) { + UpdateSecurityWarningVisibility(); + } + if (m_ignoreWmSize) { return mrDoDefault; } @@ -883,6 +904,11 @@ MsgRouting AwtFrame::WmSize(UINT type, int w, int h) if (changed != 0) { DTRACE_PRINTLN2("AwtFrame::WmSize: reporting state change %x -> %x", oldState, newState); + + // sync target with peer + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + env->CallVoidMethod(GetPeer(env), AwtFrame::setExtendedStateMID, newState); + // report (de)iconification to old clients if (changed & java_awt_Frame_ICONIFIED) { if (newState & java_awt_Frame_ICONIFIED) { @@ -907,33 +933,16 @@ MsgRouting AwtFrame::WmSize(UINT type, int w, int h) MsgRouting AwtFrame::WmActivate(UINT nState, BOOL fMinimized, HWND opposite) { jint type; - BOOL doActivateFrame = TRUE; if (nState != WA_INACTIVE) { - if (!::IsWindow(AwtWindow::GetModalBlocker(GetHWnd()))) { - ::SetFocus(NULL); // The KeyboardFocusManager will set focus later - type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS; - isAppActive = TRUE; - sm_focusedWindow = GetHWnd(); - - /* - * Fix for 4823903. - * If the window to be focused is actually not this Frame - * and it's visible then send it WM_ACTIVATE. - */ - if (m_actualFocusedWindow != NULL) { - HWND hwnd = m_actualFocusedWindow->GetHWnd(); - - if (hwnd != NULL && ::IsWindowVisible(hwnd)) { - - ::SendMessage(hwnd, WM_ACTIVATE, MAKEWPARAM(nState, fMinimized), (LPARAM)opposite); - doActivateFrame = FALSE; - } - m_actualFocusedWindow = NULL; - } - } else { - doActivateFrame = FALSE; + if (::IsWindow(AwtWindow::GetModalBlocker(GetHWnd())) || + CheckActivateActualFocusedWindow(opposite)) + { + return mrConsume; } + type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS; + AwtComponent::SetFocusedWindow(GetHWnd()); + } else { if (!::IsWindow(AwtWindow::GetModalBlocker(opposite))) { // If deactivation happens because of press on grabbing @@ -955,37 +964,63 @@ MsgRouting AwtFrame::WmActivate(UINT nState, BOOL fMinimized, HWND opposite) } } } + CheckRetainActualFocusedWindow(opposite); - // If actual focused window is not this Frame - if (sm_focusedWindow != GetHWnd()) { + type = java_awt_event_WindowEvent_WINDOW_LOST_FOCUS; + AwtComponent::SetFocusedWindow(NULL); + sm_focusOwner = NULL; + } + } - // Check that the Frame is going to be really inactive (i.e. the opposite is not its owned window) - if (opposite != NULL) { - AwtWindow *wOpposite = (AwtWindow *)AwtComponent::GetComponent(opposite); + SendWindowEvent(type, opposite); + return mrConsume; +} - if (wOpposite != NULL && - wOpposite->GetOwningFrameOrDialog() != this) - { - AwtWindow *window = (AwtWindow *)AwtComponent::GetComponent(sm_focusedWindow); +BOOL AwtFrame::CheckActivateActualFocusedWindow(HWND deactivatedOpositeHWnd) +{ + if (m_actualFocusedWindow != NULL) { + HWND hwnd = m_actualFocusedWindow->GetHWnd(); + if (hwnd != NULL && ::IsWindowVisible(hwnd)) { + SynthesizeWmActivate(TRUE, hwnd, deactivatedOpositeHWnd); + return TRUE; + } + m_actualFocusedWindow = NULL; + } + return FALSE; +} - // If actual focused window is one of Frame's owned windows - if (window != NULL && window->GetOwningFrameOrDialog() == this) { - m_actualFocusedWindow = window; - } - } +void AwtFrame::CheckRetainActualFocusedWindow(HWND activatedOpositeHWnd) +{ + // If actual focused window is not this Frame + if (AwtComponent::GetFocusedWindow() != GetHWnd()) { + // Make sure the actual focused window is an owned window of this frame + AwtWindow *focusedWindow = (AwtWindow *)AwtComponent::GetComponent(AwtComponent::GetFocusedWindow()); + if (focusedWindow != NULL && focusedWindow->GetOwningFrameOrDialog() == this) { + + // Check that the opposite window is not this frame, nor an owned window of this frame + if (activatedOpositeHWnd != NULL) { + AwtWindow *oppositeWindow = (AwtWindow *)AwtComponent::GetComponent(activatedOpositeHWnd); + if (oppositeWindow && oppositeWindow != this && + oppositeWindow->GetOwningFrameOrDialog() != this) + { + m_actualFocusedWindow = focusedWindow; } + } else { + m_actualFocusedWindow = focusedWindow; } - - type = java_awt_event_WindowEvent_WINDOW_LOST_FOCUS; - isAppActive = FALSE; - sm_focusedWindow = NULL; } } +} - if (doActivateFrame) { - SendWindowEvent(type, opposite); +BOOL AwtFrame::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest) +{ + if (hittest == HTCLIENT) { + // Don't let the actualFocusedWindow to steal focus if: + // a) the frame is clicked in its client area; + // b) focus is requested to some of the frame's child. + m_actualFocusedWindow = NULL; } - return mrConsume; + return AwtWindow::AwtSetActiveWindow(isMouseEventCause); } MsgRouting AwtFrame::WmEnterMenuLoop(BOOL isTrackPopupMenu) @@ -1161,60 +1196,6 @@ LRESULT AwtFrame::WinThreadExecProc(ExecuteArgs * args) return 0L; } -/* - * hWndLostFocus - the opposite component - * Returns TRUE if WM_SETFOCUS may be processed further, otherwise FALSE. - */ -BOOL AwtFrame::activateEmbeddedFrameOnSetFocus(HWND hWndLostFocus) { - - // If the EmbeddedFrame is not yet active, then this is either: - // - requesting focus on smth in the EmbeddedFrame, or - // - Alt hitting in IE while its menu is active (see 6374321). - // In both these cases we get WM_SETFOCUS without WM_ACTIVATE - // on the EmbeddedFrame. - if (sm_focusedWindow != GetHWnd()) { - HWND oppositeToplevelHWnd = AwtComponent::GetTopLevelParentForWindow(hWndLostFocus); - - // As we get WM_SETFOCUS from the native system we expect - // the native toplevel be set to the active window. - HWND activeWindowHWnd = ::GetActiveWindow(); - DASSERT(activeWindowHWnd == ::GetAncestor(GetHWnd(), GA_ROOT)); - - // See 6538154. - ::BringWindowToTop(activeWindowHWnd); - ::SetForegroundWindow(activeWindowHWnd); - - SynthesizeWmActivate(TRUE, oppositeToplevelHWnd); - - return FALSE; - } - // If the EmbeddedFrame is already active, then this is a mouse click - // or activation (by Alt-Tab, start etc). - return TRUE; -} - -/* - * hWndGotFocus - the opposite component - * Returns TRUE if WM_KILLFOCUS may be processed further, otherwise FALSE. - */ -BOOL AwtFrame::deactivateEmbeddedFrameOnKillFocus(HWND hWndGotFocus) { - HWND oppositeToplevelHWnd = AwtComponent::GetTopLevelParentForWindow(hWndGotFocus); - - if (oppositeToplevelHWnd != sm_focusedWindow) { - SynthesizeWmActivate(FALSE, oppositeToplevelHWnd); - } - return TRUE; -} - -/* - * Execute on Toolkit only. - */ -void AwtFrame::SynthesizeWmActivate(BOOL doActivate, HWND opposite) { - if (::IsWindowVisible(GetHWnd())) { - ::SendMessage(GetHWnd(), WM_ACTIVATE, MAKEWPARAM(doActivate ? WA_ACTIVE : WA_INACTIVE, FALSE), (LPARAM) opposite); - } -} - void AwtFrame::_SynthesizeWmActivate(void *param) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -1229,7 +1210,7 @@ void AwtFrame::_SynthesizeWmActivate(void *param) JNI_CHECK_PEER_GOTO(self, ret); frame = (AwtFrame *)pData; - frame->SynthesizeWmActivate(doActivate, NULL); + SynthesizeWmActivate(doActivate, frame->GetHWnd(), NULL); ret: env->DeleteGlobalRef(self); @@ -1594,7 +1575,7 @@ void AwtFrame::_NotifyModalBlocked(void *param) extern "C" { /* - * Class: sun_awt_windows_WFramePeer + * Class: java_awt_Frame * Method: initIDs * Signature: ()V */ @@ -1603,15 +1584,31 @@ Java_java_awt_Frame_initIDs(JNIEnv *env, jclass cls) { TRY; - AwtFrame::stateID = env->GetFieldID(cls, "state", "I"); - DASSERT(AwtFrame::stateID != NULL); - AwtFrame::undecoratedID = env->GetFieldID(cls,"undecorated","Z"); DASSERT(AwtFrame::undecoratedID != NULL); CATCH_BAD_ALLOC; } +/* + * Class: sun_awt_windows_WFramePeer + * Method: initIDs + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WFramePeer_initIDs(JNIEnv *env, jclass cls) +{ + TRY; + + AwtFrame::setExtendedStateMID = env->GetMethodID(cls, "setExtendedState", "(I)V"); + AwtFrame::getExtendedStateMID = env->GetMethodID(cls, "getExtendedState", "()I"); + + DASSERT(AwtFrame::setExtendedStateMID); + DASSERT(AwtFrame::getExtendedStateMID); + + CATCH_BAD_ALLOC; +} + /* * Class: sun_awt_windows_WFramePeer * Method: setState diff --git a/src/windows/native/sun/windows/awt_Frame.h b/src/windows/native/sun/windows/awt_Frame.h index 3634f95924d3cbfbdd149a309c4e09b17ed4cb2b..a5821329e6f3a60891fbb0a038da75d7d92747b3 100644 --- a/src/windows/native/sun/windows/awt_Frame.h +++ b/src/windows/native/sun/windows/awt_Frame.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -48,14 +48,14 @@ public: FRAME_SETMENUBAR }; - /* int handle field for sun.awt.windows.WEmbeddedFrame */ + /* java.awt.Frame fields and method IDs */ + static jfieldID undecoratedID; + + /* sun.awt.windows.WEmbeddedFrame fields and method IDs */ static jfieldID handleID; - /* int state field for java.awt.Frame */ - static jfieldID stateID; - - /* boolean undecorated field for java.awt.Frame */ - static jfieldID undecoratedID; + static jmethodID setExtendedStateMID; + static jmethodID getExtendedStateMID; /* method id for WEmbeddedFrame.requestActivate() method */ static jmethodID activateEmbeddingTopLevelMID; @@ -108,7 +108,6 @@ public: MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button); MsgRouting WmNcMouseUp(WPARAM hitTest, int x, int y, int button); MsgRouting WmGetIcon(WPARAM iconType, LRESULT& retVal); - MsgRouting WmWindowPosChanged(LPARAM windowPos); MsgRouting WmShowWindow(BOOL show, UINT status); virtual MsgRouting WmSysCommand(UINT uCmdType, int xPos, int yPos); @@ -133,11 +132,6 @@ public: // adjusts the IME candidate window position if needed void AdjustCandidateWindowPos(); - void SynthesizeWmActivate(BOOL doActivate, HWND opposite); - - BOOL activateEmbeddedFrameOnSetFocus(HWND hWndLostFocus); - BOOL deactivateEmbeddedFrameOnKillFocus(HWND hWndGotFocus); - // invoked on Toolkit thread static jobject _GetBoundsPrivate(void *param); @@ -153,6 +147,14 @@ public: virtual void Reshape(int x, int y, int width, int height); + virtual BOOL AwtSetActiveWindow(BOOL isMouseEventCause = FALSE, UINT hittest = HTCLIENT); + + void CheckRetainActualFocusedWindow(HWND activatedOpositeHWnd); + BOOL CheckActivateActualFocusedWindow(HWND deactivatedOpositeHWnd); + + INLINE HWND GetLastProxiedFocusOwner() { return m_lastProxiedFocusOwner; } + INLINE void SetLastProxiedFocusOwner(HWND hwnd) { m_lastProxiedFocusOwner = hwnd; } + protected: /* The frame is undecorated. */ BOOL m_isUndecorated; @@ -189,6 +191,10 @@ private: or an AwtDialog (or one of its children) has the logical input focus. */ HWND m_proxyFocusOwner; + /* Retains the last/current sm_focusOwner proxied. Actually, it should be + * a component of an owned window last/currently active. */ + HWND m_lastProxiedFocusOwner; + /* * Fix for 4823903. * Retains a focus proxied window to set the focus correctly diff --git a/src/windows/native/sun/windows/awt_InputMethod.cpp b/src/windows/native/sun/windows/awt_InputMethod.cpp index bd78cdaf3ef3408959d2660f622ce8c1325e0afa..f23e1e1f6f6d7753859706e03dd846cc3a316041 100644 --- a/src/windows/native/sun/windows/awt_InputMethod.cpp +++ b/src/windows/native/sun/windows/awt_InputMethod.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-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 @@ -176,7 +176,7 @@ Java_sun_awt_windows_WInputMethod_handleNativeIMEEvent(JNIEnv *env, jobject self java_awt_event_KeyEvent_CHAR_UNDEFINED, unicodeChar, modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, &msg); } else { MSG* pCopiedMsg = new MSG; diff --git a/src/windows/native/sun/windows/awt_KeyEvent.cpp b/src/windows/native/sun/windows/awt_KeyEvent.cpp index cc795cfc8051c661349fa7daf986a7c62ce5bf22..0559741d45bdd5f323f3ead198a228399a2f3b46 100644 --- a/src/windows/native/sun/windows/awt_KeyEvent.cpp +++ b/src/windows/native/sun/windows/awt_KeyEvent.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -32,6 +32,10 @@ jfieldID AwtKeyEvent::keyCodeID; jfieldID AwtKeyEvent::keyCharID; +jfieldID AwtKeyEvent::rawCodeID; +jfieldID AwtKeyEvent::primaryLevelUnicodeID; +jfieldID AwtKeyEvent::scancodeID; +jfieldID AwtKeyEvent::extendedKeyCodeID; /************************************************************************ * AwtKeyEvent native methods @@ -45,9 +49,18 @@ Java_java_awt_event_KeyEvent_initIDs(JNIEnv *env, jclass cls) { AwtKeyEvent::keyCodeID = env->GetFieldID(cls, "keyCode", "I"); AwtKeyEvent::keyCharID = env->GetFieldID(cls, "keyChar", "C"); + AwtKeyEvent::rawCodeID = env->GetFieldID(cls, "rawCode", "J"); + AwtKeyEvent::primaryLevelUnicodeID = env->GetFieldID(cls, "primaryLevelUnicode", "J"); + AwtKeyEvent::scancodeID = env->GetFieldID(cls, "scancode", "J"); + AwtKeyEvent::extendedKeyCodeID = env->GetFieldID(cls, "extendedKeyCode", "J"); + DASSERT(AwtKeyEvent::keyCodeID != NULL); DASSERT(AwtKeyEvent::keyCharID != NULL); + DASSERT(AwtKeyEvent::rawCodeID != NULL); + DASSERT(AwtKeyEvent::primaryLevelUnicodeID != NULL); + DASSERT(AwtKeyEvent::scancodeID != NULL); + DASSERT(AwtKeyEvent::extendedKeyCodeID != NULL); CATCH_BAD_ALLOC; } diff --git a/src/windows/native/sun/windows/awt_KeyEvent.h b/src/windows/native/sun/windows/awt_KeyEvent.h index 2489051ea250a15e1421bdd0bbd212a6910331aa..0e47eacec4793bc9fa82452f84c582580e49af7d 100644 --- a/src/windows/native/sun/windows/awt_KeyEvent.h +++ b/src/windows/native/sun/windows/awt_KeyEvent.h @@ -39,7 +39,10 @@ public: /* java.awt.KeyEvent field ids */ static jfieldID keyCodeID; static jfieldID keyCharID; - + static jfieldID rawCodeID; + static jfieldID primaryLevelUnicodeID; + static jfieldID scancodeID; + static jfieldID extendedKeyCodeID; }; #endif // AWT_KEYEVENT_H diff --git a/src/windows/native/sun/windows/awt_KeyboardFocusManager.cpp b/src/windows/native/sun/windows/awt_KeyboardFocusManager.cpp index 907f0a303c5926f5ce67f9d50dbdaf3e82b9c17f..146dd0398ecc2c951085d968f120ea4b254a13b8 100644 --- a/src/windows/native/sun/windows/awt_KeyboardFocusManager.cpp +++ b/src/windows/native/sun/windows/awt_KeyboardFocusManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -24,30 +24,20 @@ */ #include "awt.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Component.h" #include "awt_Toolkit.h" #include <java_awt_KeyboardFocusManager.h> - -jclass AwtKeyboardFocusManager::keyboardFocusManagerCls; -jmethodID AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID; -jmethodID AwtKeyboardFocusManager::heavyweightButtonDownMID; -jmethodID AwtKeyboardFocusManager::markClearGlobalFocusOwnerMID; -jmethodID AwtKeyboardFocusManager::removeLastFocusRequestMID; -jfieldID AwtKeyboardFocusManager::isProxyActive; -jmethodID AwtKeyboardFocusManager::processSynchronousTransfer; +#include <jni.h> static jobject getNativeFocusState(JNIEnv *env, void*(*ftn)()) { - jobject lFocusState = NULL; + jobject gFocusState = (jobject)AwtToolkit::GetInstance().SyncCall(ftn); - jobject gFocusState = reinterpret_cast<jobject>(AwtToolkit::GetInstance(). - InvokeFunction(ftn)); if (gFocusState != NULL) { - lFocusState = env->NewLocalRef(gFocusState); + jobject lFocusState = env->NewLocalRef(gFocusState); env->DeleteGlobalRef(gFocusState); + return lFocusState; } - - return lFocusState; + return NULL; } extern "C" { @@ -61,53 +51,35 @@ JNIEXPORT void JNICALL Java_java_awt_KeyboardFocusManager_initIDs (JNIEnv *env, jclass cls) { - TRY; - - AwtKeyboardFocusManager::keyboardFocusManagerCls = (jclass) - env->NewGlobalRef(cls); - AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID = - env->GetStaticMethodID(cls, "shouldNativelyFocusHeavyweight", - "(Ljava/awt/Component;Ljava/awt/Component;ZZJLsun/awt/CausedFocusEvent$Cause;)I"); - AwtKeyboardFocusManager::heavyweightButtonDownMID = - env->GetStaticMethodID(cls, "heavyweightButtonDown", - "(Ljava/awt/Component;J)V"); - AwtKeyboardFocusManager::markClearGlobalFocusOwnerMID = - env->GetStaticMethodID(cls, "markClearGlobalFocusOwner", - "()Ljava/awt/Window;"); - AwtKeyboardFocusManager::removeLastFocusRequestMID = - env->GetStaticMethodID(cls, "removeLastFocusRequest", - "(Ljava/awt/Component;)V"); - - AwtKeyboardFocusManager::processSynchronousTransfer = - env->GetStaticMethodID(cls, "processSynchronousLightweightTransfer", - "(Ljava/awt/Component;Ljava/awt/Component;ZZJ)Z"); +} - jclass keyclass = env->FindClass("java/awt/event/KeyEvent"); - DASSERT (keyclass != NULL); +/* + * Class: sun_awt_windows_WKeyboardFocusManagerPeer + * Method: setNativeFocusOwner + * Signature: (Lsun/awt/windows/WComponentPeer) + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WKeyboardFocusManagerPeer_setNativeFocusOwner + (JNIEnv *env, jclass cls, jobject compPeer) +{ + TRY; - AwtKeyboardFocusManager::isProxyActive = - env->GetFieldID(keyclass, "isProxyActive", "Z"); + jobject peerGlobalRef = env->NewGlobalRef(compPeer); - env->DeleteLocalRef(keyclass); + AwtToolkit::GetInstance().SyncCall(AwtComponent::SetNativeFocusOwner, + (void*)peerGlobalRef); + // peerGlobalRef is deleted in SetNativeFocusOwner - DASSERT(AwtKeyboardFocusManager::keyboardFocusManagerCls != NULL); - DASSERT(AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID != - NULL); - DASSERT(AwtKeyboardFocusManager::heavyweightButtonDownMID != NULL); - DASSERT(AwtKeyboardFocusManager::markClearGlobalFocusOwnerMID != NULL); - DASSERT(AwtKeyboardFocusManager::removeLastFocusRequestMID != NULL); - DASSERT(AwtKeyboardFocusManager::processSynchronousTransfer != NULL); CATCH_BAD_ALLOC; } - /* - * Class: sun_awt_KeyboardFocusManagerPeerImpl + * Class: sun_awt_windows_WKeyboardFocusManagerPeer * Method: getNativeFocusOwner - * Signature: ()Ljava/awt/Component; + * Signature: (Lsun/awt/windows/WComponentPeer) */ JNIEXPORT jobject JNICALL -Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusOwner +Java_sun_awt_windows_WKeyboardFocusManagerPeer_getNativeFocusOwner (JNIEnv *env, jclass cls) { TRY; @@ -118,12 +90,12 @@ Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusOwner } /* - * Class: sun_awt_KeyboardFocusManagerPeerImpl + * Class: sun_awt_windows_WKeyboardFocusManagerPeer * Method: getNativeFocusedWindow * Signature: ()Ljava/awt/Window; */ JNIEXPORT jobject JNICALL -Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusedWindow +Java_sun_awt_windows_WKeyboardFocusManagerPeer_getNativeFocusedWindow (JNIEnv *env, jclass cls) { TRY; @@ -132,21 +104,4 @@ Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusedWindow CATCH_BAD_ALLOC_RET(NULL); } - -/* - * Class: sun_awt_KeyboardFocusManagerPeerImpl - * Method: clearNativeGlobalFocusOwner - * Signature: (Ljava/awt/Window;)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_KeyboardFocusManagerPeerImpl_clearNativeGlobalFocusOwner - (JNIEnv *env, jobject self, jobject activeWindow) -{ - TRY; - - AwtToolkit::GetInstance().InvokeFunction - ((void*(*)(void))AwtComponent::ClearGlobalFocusOwner); - - CATCH_BAD_ALLOC; -} } diff --git a/src/windows/native/sun/windows/awt_List.cpp b/src/windows/native/sun/windows/awt_List.cpp index 20844de78754b57e990e846bfa519ce32d093f57..453025ec98b02c864bfdbe957b19a3727879e3d4 100644 --- a/src/windows/native/sun/windows/awt_List.cpp +++ b/src/windows/native/sun/windows/awt_List.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -24,7 +24,6 @@ */ #include "awt_List.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" #include "awt_Dimension.h" #include "awt_Toolkit.h" @@ -154,28 +153,6 @@ done: return c; } -BOOL AwtList::ActMouseMessage(MSG * pMsg) { - if (!IsFocusingMessage(pMsg->message)) { - return FALSE; - } - - if (pMsg->message == WM_LBUTTONDOWN) { - LONG item = static_cast<LONG>(SendListMessage(LB_ITEMFROMPOINT, 0, pMsg->lParam)); - if (item != LB_ERR) { - if (isMultiSelect) { - if (IsItemSelected(item)) { - Deselect(item); - } else { - Select(item); - } - } else { - Select(item); - } - } - } - return TRUE; -} - void AwtList::SetDragCapture(UINT flags) { // don't want to interfere with other controls @@ -473,17 +450,11 @@ AwtList::WmMouseDown(UINT flags, int x, int y, int button) } /* - * Fix for 6240202. List being inside a non-focusable Window (or non-focusable List - * being a single component inside a focusable Window) won't trigger ActionEvent by - * double click. All focus events will be filtered (in the AWT focus hook) for such - * a Window containing the List. In such a case OS Windows won't generate WM_COMMAND - * (and no WmNotify() will be called for the List). Here we call WmCommand() - * synthetically. + * As we consume WM_LBUTONDOWN the list won't trigger ActionEvent by double click. + * We trigger it ourselves. (see also 6240202) */ int clickCount = GetClickCount(); - if (button == LEFT_BUTTON && clickCount >= 2 && clickCount % 2 == 0 && - !GetContainer()->IsFocusableWindow()) - { + if (button == LEFT_BUTTON && clickCount >= 2 && clickCount % 2 == 0) { WmCommand(0, GetListHandle(), LBN_DBLCLK); } return mrResult; @@ -500,67 +471,32 @@ AwtList::WmCtlColor(HDC hDC, HWND hCtrl, UINT ctlColor, HBRUSH& retBrush) return mrConsume; } -// Override WmSetFocus and WmKillFocus so that they operate on the List handle -// instead of the wrapper handle. Otherwise, the methods are the same as their -// AwtComponent counterparts. - -MsgRouting AwtList::WmSetFocus(HWND hWndLostFocus) { - if (sm_focusOwner == GetListHandle()) { - sm_realFocusOpposite = NULL; - return mrConsume; - } - - sm_focusOwner = GetListHandle(); - - if (sm_realFocusOpposite != NULL) { - hWndLostFocus = sm_realFocusOpposite; - sm_realFocusOpposite = NULL; - } - - SendFocusEvent(java_awt_event_FocusEvent_FOCUS_GAINED, hWndLostFocus); - - return mrDoDefault; +BOOL AwtList::IsFocusingMouseMessage(MSG *pMsg) +{ + return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONDBLCLK; } -MsgRouting AwtList::WmKillFocus(HWND hWndGotFocus) { - if (sm_focusOwner != NULL && sm_focusOwner == hWndGotFocus) { - return mrConsume; - } - - if (sm_focusOwner != GetListHandle()) { - if (sm_focusOwner != NULL) { - if (hWndGotFocus != NULL && - AwtComponent::GetComponent(hWndGotFocus) != NULL) - { - sm_realFocusOpposite = sm_focusOwner; +MsgRouting AwtList::HandleEvent(MSG *msg, BOOL synthetic) +{ + if (IsFocusingMouseMessage(msg)) { + LONG item = static_cast<LONG>(SendListMessage(LB_ITEMFROMPOINT, 0, msg->lParam)); + if (item != LB_ERR) { + if (isMultiSelect) { + if (IsItemSelected(item)) { + Deselect(item); + } else { + Select(item); } - ::SendMessage(sm_focusOwner, WM_KILLFOCUS, (WPARAM)hWndGotFocus, - 0); + } else { + Select(item); + } } + delete msg; return mrConsume; } - - sm_focusOwner = NULL; - - SendFocusEvent(java_awt_event_FocusEvent_FOCUS_LOST, hWndGotFocus); - - return mrDoDefault; -} - -MsgRouting AwtList::HandleEvent(MSG *msg, BOOL synthetic) -{ - if (AwtComponent::sm_focusOwner != GetListHandle() && - (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK)) - { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); + if (msg->message == WM_KEYDOWN && msg->wParam == VK_RETURN) { + WmNotify(LBN_DBLCLK); } - return AwtComponent::HandleEvent(msg, synthetic); } @@ -607,15 +543,6 @@ AwtList::WmNotify(UINT notifyCode) return mrDoDefault; } -MsgRouting -AwtList::WmKeyDown(UINT wkey, UINT repCnt, UINT flags, BOOL system) -{ - if (wkey == VK_RETURN) { - WmNotify(LBN_DBLCLK); - } - return AwtComponent::WmKeyDown(wkey, repCnt, flags, system); -} - BOOL AwtList::InheritsNativeMouseWheelBehavior() {return true;} jint AwtList::_GetMaxWidth(void *param) diff --git a/src/windows/native/sun/windows/awt_List.h b/src/windows/native/sun/windows/awt_List.h index 832e41c2c3d484d1b7da5e7656b2098946a00ae3..5389c63349bd874c6b86909d9b505e1b18326924 100644 --- a/src/windows/native/sun/windows/awt_List.h +++ b/src/windows/native/sun/windows/awt_List.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -97,8 +97,6 @@ public: } } - BOOL ActMouseMessage(MSG* pMsg); - // Netscape : Change the font on the list and redraw the // items nicely. virtual void SetFont(AwtFont *pFont); @@ -116,7 +114,6 @@ public: MsgRouting WmMouseDown(UINT flags, int x, int y, int button); MsgRouting WmMouseUp(UINT flags, int x, int y, int button); MsgRouting WmNotify(UINT notifyCode); - MsgRouting WmKeyDown(UINT vkey, UINT repCnt, UINT flags, BOOL system); /* for multifont list */ MsgRouting OwnerDrawItem(UINT ctrlId, DRAWITEMSTRUCT& drawInfo); @@ -127,8 +124,6 @@ public: MsgRouting WmCtlColor(HDC hDC, HWND hCtrl, UINT ctlColor, HBRUSH& retBrush); - MsgRouting WmSetFocus(HWND hWndLostFocus); - MsgRouting WmKillFocus(HWND hWndGotFocus); MsgRouting HandleEvent(MSG *msg, BOOL synthetic); @@ -170,6 +165,8 @@ public: virtual BOOL InheritsNativeMouseWheelBehavior(); + virtual BOOL IsFocusingMouseMessage(MSG *pMsg); + // some methods called on Toolkit thread static jint _GetMaxWidth(void *param); static void _UpdateMaxItemWidth(void *param); diff --git a/src/windows/native/sun/windows/awt_Panel.cpp b/src/windows/native/sun/windows/awt_Panel.cpp index 62c90bf5469701186e7752661cf97d4c5f3f7ba4..5f0e42673b0843082ff6fe5d2f8f9ec9cce74bfa 100644 --- a/src/windows/native/sun/windows/awt_Panel.cpp +++ b/src/windows/native/sun/windows/awt_Panel.cpp @@ -34,70 +34,6 @@ jfieldID AwtPanel::insets_ID; -static char* AWTPANEL_RESTACK_MSG_1 = "Peers array is null"; -static char* AWTPANEL_RESTACK_MSG_2 = "Peer null in JNI"; -static char* AWTPANEL_RESTACK_MSG_3 = "Native resources unavailable"; -static char* AWTPANEL_RESTACK_MSG_4 = "Child peer is null"; - -void* AwtPanel::Restack(void * param) { - TRY; - - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobjectArray peers = (jobjectArray)param; - - int peerCount = env->GetArrayLength(peers); - if (peerCount < 1) { - env->DeleteGlobalRef(peers); - return AWTPANEL_RESTACK_MSG_1; - } - - jobject self = env->GetObjectArrayElement(peers, 0); - // It's entirely possible that our native resources have been destroyed - // before our java peer - if we're dispose()d, for instance. - // Alert caller w/ IllegalComponentStateException. - if (self == NULL) { - env->DeleteGlobalRef(peers); - return AWTPANEL_RESTACK_MSG_2; - } - PDATA pData = JNI_GET_PDATA(self); - if (pData == NULL) { - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - return AWTPANEL_RESTACK_MSG_3; - } - - AwtPanel* panel = (AwtPanel*)pData; - - HWND prevWindow = 0; - - for (int i = 1; i < peerCount; i++) { - jobject peer = env->GetObjectArrayElement(peers, i); - if (peer == NULL) { - // Nonsense - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - return AWTPANEL_RESTACK_MSG_4; - } - PDATA child_pData = JNI_GET_PDATA(peer); - if (child_pData == NULL) { - env->DeleteLocalRef(peer); - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - return AWTPANEL_RESTACK_MSG_3; - } - AwtComponent* child_comp = (AwtComponent*)child_pData; - ::SetWindowPos(child_comp->GetHWnd(), prevWindow, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE | SWP_ASYNCWINDOWPOS); - prevWindow = child_comp->GetHWnd(); - env->DeleteLocalRef(peer); - } - env->DeleteGlobalRef(peers); - env->DeleteLocalRef(self); - - CATCH_BAD_ALLOC_RET("Allocation error"); - return NULL; -} - /************************************************************************ * AwtPanel native methods */ @@ -116,18 +52,4 @@ Java_sun_awt_windows_WPanelPeer_initIDs(JNIEnv *env, jclass cls) { CATCH_BAD_ALLOC; } -JNIEXPORT void JNICALL -Java_sun_awt_windows_WPanelPeer_pRestack(JNIEnv *env, jobject self, jobjectArray peers) { - - TRY; - - const char * error = (const char*)AwtToolkit::GetInstance().InvokeFunction(AwtPanel::Restack, env->NewGlobalRef(peers)); - if (error != NULL) { - JNU_ThrowByName(env, "java/awt/IllegalComponentStateException", error); - } - - CATCH_BAD_ALLOC; -} - - } /* extern "C" */ diff --git a/src/windows/native/sun/windows/awt_Panel.h b/src/windows/native/sun/windows/awt_Panel.h index 2e9ed6649c850714081e316834c830fe38c7050a..93084c71685ea38d4f609e31e8b45f9e81f5bd7d 100644 --- a/src/windows/native/sun/windows/awt_Panel.h +++ b/src/windows/native/sun/windows/awt_Panel.h @@ -35,11 +35,8 @@ class AwtPanel { public: - static void* Restack(void * param); - /* java.awt.Panel field ids */ static jfieldID insets_ID; - }; #endif // AWT_PANEL_H diff --git a/src/windows/native/sun/windows/awt_PrintDialog.cpp b/src/windows/native/sun/windows/awt_PrintDialog.cpp index 762ae2673ebf6f938ada590c384751db8280cbe2..14c7750cb92411c05e4f9a340008e2bd68bc3266 100644 --- a/src/windows/native/sun/windows/awt_PrintDialog.cpp +++ b/src/windows/native/sun/windows/awt_PrintDialog.cpp @@ -65,7 +65,8 @@ LRESULT CALLBACK PrintDialogWndProc(HWND hWnd, UINT message, } } - return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam); + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); + return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); } static UINT_PTR CALLBACK @@ -87,7 +88,7 @@ PrintDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) DWORD style = ::GetClassLong(hdlg, GCL_STYLE); ::SetClassLong(hdlg,GCL_STYLE, style & ~CS_SAVEBITS); - ::SetFocus(hdlg); + ::SetFocus(hdlg); // will not break synthetic focus as hdlg is a native toplevel // set appropriate icon for parentless dialogs jobject awtParent = env->GetObjectField(peer, AwtPrintDialog::parentID); @@ -99,16 +100,19 @@ PrintDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) } // subclass dialog's parent to receive additional messages - ComCtl32Util::GetInstance().SubclassHWND(hdlg, - PrintDialogWndProc); + WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(hdlg, + PrintDialogWndProc); + ::SetProp(hdlg, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc)); break; } case WM_DESTROY: { + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hdlg, NativeDialogWndProcProp)); ComCtl32Util::GetInstance().UnsubclassHWND(hdlg, PrintDialogWndProc, - NULL); + lpfnWndProc); ::RemoveProp(hdlg, ModalDialogPeerProp); + ::RemoveProp(hdlg, NativeDialogWndProcProp); break; } } diff --git a/src/windows/native/sun/windows/awt_PrintJob.cpp b/src/windows/native/sun/windows/awt_PrintJob.cpp index 9136b7864127464455ee645fda201f30b6c24d82..c3339778695281dc7bffc3d65fb819d49c28f1ea 100644 --- a/src/windows/native/sun/windows/awt_PrintJob.cpp +++ b/src/windows/native/sun/windows/awt_PrintJob.cpp @@ -2885,7 +2885,8 @@ LRESULT CALLBACK PageDialogWndProc(HWND hWnd, UINT message, } } - return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam); + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); + return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); } /** @@ -2919,16 +2920,19 @@ static UINT CALLBACK pageDlgHook(HWND hDlg, UINT msg, } // subclass dialog's parent to receive additional messages - ComCtl32Util::GetInstance().SubclassHWND(hDlg, - PageDialogWndProc); + WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(hDlg, + PageDialogWndProc); + ::SetProp(hDlg, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc)); break; } case WM_DESTROY: { + WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hDlg, NativeDialogWndProcProp)); ComCtl32Util::GetInstance().UnsubclassHWND(hDlg, PageDialogWndProc, - NULL); + lpfnWndProc); ::RemoveProp(hDlg, ModalDialogPeerProp); + ::RemoveProp(hDlg, NativeDialogWndProcProp); break; } } diff --git a/src/windows/native/sun/windows/awt_ScrollPane.cpp b/src/windows/native/sun/windows/awt_ScrollPane.cpp index 4d41e0b0cbe718f85d75cf84c6f4f77b5d29a4e6..bf11ecca3c08084abd678629845974d0974c3918 100644 --- a/src/windows/native/sun/windows/awt_ScrollPane.cpp +++ b/src/windows/native/sun/windows/awt_ScrollPane.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -361,13 +361,6 @@ void AwtScrollPane::PostScrollEvent(int orient, int scrollCode, int pos) { DASSERT(!safe_ExceptionOccurred(env)); } -BOOL AwtScrollPane::ActMouseMessage(MSG* pMsg) { - if (!IsFocusingMessage(pMsg->message)) { - return FALSE; - } - return TRUE; -} - MsgRouting AwtScrollPane::WmNcHitTest(UINT x, UINT y, LRESULT& retVal) { @@ -412,13 +405,10 @@ MsgRouting AwtScrollPane::WmHScroll(UINT scrollCode, UINT pos, HWND hScrollPane) return mrConsume; } -/* - * Fix for BugTraq ID 4041703: keyDown not being invoked. - * This method overrides AwtCanvas::HandleEvent() since we - * don't want ScrollPanel to receive focus on mouse press. - */ MsgRouting AwtScrollPane::HandleEvent(MSG *msg, BOOL synthetic) { + // SunAwtScrollPane control doesn't cause activation on mouse/key events, + // so we can safely (for synthetic focus) pass them to the system proc. return AwtComponent::HandleEvent(msg, synthetic); } diff --git a/src/windows/native/sun/windows/awt_ScrollPane.h b/src/windows/native/sun/windows/awt_ScrollPane.h index c583639693a0e5d03b512348ca2317dfe2515078..326e7fa75c7399ae0439971bd72ffc052f1da61b 100644 --- a/src/windows/native/sun/windows/awt_ScrollPane.h +++ b/src/windows/native/sun/windows/awt_ScrollPane.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -65,7 +65,6 @@ public: virtual void Reshape(int x, int y, int w, int h); virtual void BeginValidate() {} virtual void EndValidate() {} - BOOL ActMouseMessage(MSG* pMsg); /* * Fix for bug 4046446 diff --git a/src/windows/native/sun/windows/awt_Scrollbar.cpp b/src/windows/native/sun/windows/awt_Scrollbar.cpp index 879c1847fa871bc299785e69d92bda4681228af3..27b1b5ddbc96140e0b8f0edaf1508feb70265d4b 100644 --- a/src/windows/native/sun/windows/awt_Scrollbar.cpp +++ b/src/windows/native/sun/windows/awt_Scrollbar.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -27,7 +27,6 @@ #include "awt_Scrollbar.h" #include "awt_Canvas.h" #include "awt_Window.h" -#include "awt_KeyboardFocusManager.h" /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. */ @@ -61,7 +60,6 @@ AwtScrollbar::AwtScrollbar() { m_orientation = SB_HORZ; m_lineIncr = 0; m_pageIncr = 0; - m_ignoreFocusEvents = FALSE; m_prevCallback = NULL; m_prevCallbackPos = 0; ms_instanceCounter++; @@ -221,7 +219,6 @@ AwtScrollbar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) return retValue; } - MsgRouting AwtScrollbar::WmNcHitTest(UINT x, UINT y, LRESULT& retVal) { @@ -265,17 +262,10 @@ AwtScrollbar::WmMouseDown(UINT flags, int x, int y, int button) MsgRouting AwtScrollbar::HandleEvent(MSG *msg, BOOL synthetic) { - if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) { - if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd()) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); - AwtSetFocus(); - } + // SCROLLBAR control doesn't cause activation on mouse/key events, + // so we can safely (for synthetic focus) pass them to the system proc. + + if (IsFocusingMouseMessage(msg)) { // Left button press was already routed to default window // procedure in the WmMouseDown above. Propagating synthetic // press seems like a bad idea as internal message loop @@ -283,54 +273,19 @@ AwtScrollbar::HandleEvent(MSG *msg, BOOL synthetic) delete msg; return mrConsume; } - else { - return AwtComponent::HandleEvent(msg, synthetic); - } + return AwtComponent::HandleEvent(msg, synthetic); } - // Work around a windows bug descrbed in KB article Q73839. Reset // focus on scrollbars to update focus indicator. The article advises -// to disable/enable the scrollbar, but simply resetting the focus is -// sufficient. +// to disable/enable the scrollbar. void AwtScrollbar::UpdateFocusIndicator() { if (IsFocusable()) { - m_ignoreFocusEvents = TRUE; - ::SetFocus(NULL); - AwtSetFocus(); - m_ignoreFocusEvents = FALSE; - } -} - -MsgRouting -AwtScrollbar::WmKillFocus(HWND hWndGot) -{ - if (m_ignoreFocusEvents) { - // We are voluntary giving up focus and will get it back - // immediately. This is necessary to force windows to update - // the focus indicator. - sm_focusOwner = NULL; - return mrDoDefault; - } - else { - return AwtComponent::WmKillFocus(hWndGot); - } -} - -MsgRouting -AwtScrollbar::WmSetFocus(HWND hWndLost) -{ - if (m_ignoreFocusEvents) { - // We have voluntary gave up focus and are getting it back - // now. This is necessary to force windows to update the - // focus indicator. - sm_focusOwner = GetHWnd(); - return mrDoDefault; - } - else { - return AwtComponent::WmSetFocus(hWndLost); + // todo: doesn't work + SendMessage((WPARAM)ESB_DISABLE_BOTH); + SendMessage((WPARAM)ESB_ENABLE_BOTH); } } diff --git a/src/windows/native/sun/windows/awt_Scrollbar.h b/src/windows/native/sun/windows/awt_Scrollbar.h index 4fcac523c8115f96fb095e9697e9caab63876e86..44763cd23a4b76d087e2af5f220c8b6a3d3bd703 100644 --- a/src/windows/native/sun/windows/awt_Scrollbar.h +++ b/src/windows/native/sun/windows/awt_Scrollbar.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -69,10 +69,6 @@ public: virtual MsgRouting WmHScroll(UINT scrollCode, UINT pos, HWND hScrollBar); virtual MsgRouting WmVScroll(UINT scrollCode, UINT pos, HWND hScrollBar); - // Work around KB Q73839 bug. - virtual MsgRouting WmSetFocus(HWND hWndLost); - virtual MsgRouting WmKillFocus(HWND hWndGot); - // Prevent KB Q102552 race. virtual MsgRouting WmMouseDown(UINT flags, int x, int y, int button); virtual MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT& retVal); @@ -91,7 +87,6 @@ private: int m_pageIncr; // Work around KB Q73839 bug. - BOOL m_ignoreFocusEvents; void UpdateFocusIndicator(); // Don't do redundant callbacks. diff --git a/src/windows/native/sun/windows/awt_TextArea.cpp b/src/windows/native/sun/windows/awt_TextArea.cpp index e0d4c6158c26b7b2e3d964dff0365d00014da0cb..b99de8d230109e3cf49afca2f005e692b63e2a29 100644 --- a/src/windows/native/sun/windows/awt_TextArea.cpp +++ b/src/windows/native/sun/windows/awt_TextArea.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -26,9 +26,9 @@ #include "awt_Toolkit.h" #include "awt_TextArea.h" #include "awt_TextComponent.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" #include "awt_Window.h" +#include "awt_Frame.h" /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. */ @@ -362,13 +362,6 @@ AwtTextArea::EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { DASSERT(::IsWindow(::GetParent(hWnd))); switch (message) { - case WM_SETFOCUS: - ::SendMessage(::GetParent(hWnd), EM_HIDESELECTION, FALSE, 0); - break; - case WM_KILLFOCUS: - ::SendMessage(::GetParent(hWnd), EM_HIDESELECTION, TRUE, 0); - break; - case WM_UNDO: case WM_CUT: case WM_COPY: @@ -400,7 +393,6 @@ AwtTextArea::EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { MsgRouting AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) { - /* Use the system provided edit control class to generate context menu. */ if (m_hEditCtrl == NULL) { DWORD dwStyle = WS_CHILD; @@ -494,22 +486,11 @@ AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) { VERIFY(::ClientToScreen(GetHWnd(), &p)); } - ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl, - MAKELPARAM(p.x, p.y)); - /* - * After the context menu is dismissed focus is owned by the edit contol. - * Return focus to parent. - */ - if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd()) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, TimeHelper::getMessageTimeUTC()); - env->DeleteLocalRef(target); - AwtSetFocus(); - } + // The context menu steals focus from the proxy. + // So, set the focus-restore flag up. + SetRestoreFocus(TRUE); + ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl, MAKELPARAM(p.x, p.y)); + SetRestoreFocus(FALSE); return mrConsume; } @@ -558,20 +539,11 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) * By consuming WM_MOUSEMOVE messages we also don't give * the RichEdit control a chance to recognize a drag gesture * and initiate its own drag-n-drop operation. + * + * The workaround also allows us to implement synthetic focus mechanism. + * */ - if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) { - - if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd()) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); - AwtSetFocus(); - } - + if (IsFocusingMouseMessage(msg)) { CHARRANGE cr; LONG lCurPos = EditGetCharFromPos(msg->pt); @@ -717,6 +689,7 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) p.x = -1; p.y = -1; } + if (!::PostMessage(GetHWnd(), WM_CONTEXTMENU, (WPARAM)GetHWnd(), MAKELPARAM(p.x, p.y))) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -724,6 +697,8 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) env->ExceptionDescribe(); env->ExceptionClear(); } + delete msg; + return mrConsume; } else if (msg->message == WM_MOUSEWHEEL) { // 4417236: If there is an old version of RichEd32.dll which // does not provide the mouse wheel scrolling we have to diff --git a/src/windows/native/sun/windows/awt_TextComponent.cpp b/src/windows/native/sun/windows/awt_TextComponent.cpp index 9920b925254579f3a9c1ea17043775d039b631df..e0a7af74da1aa8858f671d73c5889f91869eb99e 100644 --- a/src/windows/native/sun/windows/awt_TextComponent.cpp +++ b/src/windows/native/sun/windows/awt_TextComponent.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -25,7 +25,6 @@ #include "awt_Toolkit.h" #include "awt_TextComponent.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" #include "jni.h" @@ -62,9 +61,9 @@ jfieldID AwtTextComponent::canAccessClipboardID; AwtTextComponent::AwtTextComponent() { m_synthetic = FALSE; - m_lStartPos = -1; - m_lEndPos = -1; - m_lLastPos = -1; + m_lStartPos = -1; + m_lEndPos = -1; + m_lLastPos = -1; m_isLFonly = FALSE; m_EOLchecked = FALSE; // javaEventsMask = 0; // accessibility support @@ -74,10 +73,6 @@ LPCTSTR AwtTextComponent::GetClassName() { return TEXT("EDIT"); /* System provided edit control class */ } -BOOL AwtTextComponent::ActMouseMessage(MSG* pMsg) { - return FALSE; -} - /* Set a suitable font to IME against the component font. */ void AwtTextComponent::SetFont(AwtFont* font) { @@ -143,23 +138,16 @@ AwtTextComponent::WmNotify(UINT notifyCode) return mrDoDefault; } +BOOL AwtTextComponent::IsFocusingMouseMessage(MSG *pMsg) +{ + return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONDBLCLK; +} + MsgRouting AwtTextComponent::HandleEvent(MSG *msg, BOOL synthetic) { MsgRouting returnVal; - if (AwtComponent::sm_focusOwner != GetHWnd() && IsFocusable() && - (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK)) - { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = GetTarget(env); - env->CallStaticVoidMethod - (AwtKeyboardFocusManager::keyboardFocusManagerCls, - AwtKeyboardFocusManager::heavyweightButtonDownMID, - target, ((jlong)msg->time) & 0xFFFFFFFF); - env->DeleteLocalRef(target); - } - /* * Store the 'synthetic' parameter so that the WM_PASTE security check * happens only for synthetic events. diff --git a/src/windows/native/sun/windows/awt_TextComponent.h b/src/windows/native/sun/windows/awt_TextComponent.h index 32a430baf381ac68f27d1f4daba2b5d8ab883dbb..c6068b5238c22f0f734c00917a5320fbbaaaf990 100644 --- a/src/windows/native/sun/windows/awt_TextComponent.h +++ b/src/windows/native/sun/windows/awt_TextComponent.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -69,8 +69,6 @@ public: // called on Toolkit thread from JNI static jstring _GetText(void *param); - BOOL ActMouseMessage(MSG* pMsg); - void SetFont(AwtFont* font); /* @@ -80,6 +78,8 @@ public: MsgRouting HandleEvent(MSG *msg, BOOL synthetic); MsgRouting WmPaste(); + virtual BOOL IsFocusingMouseMessage(MSG *pMsg); + /* To be fully implemented in a future release MsgRouting WmKeyDown(UINT wkey, UINT repCnt, @@ -125,7 +125,6 @@ private: LONG m_lEndPos; LONG m_lLastPos; - HFONT m_hFont; //im --- end diff --git a/src/windows/native/sun/windows/awt_TextField.cpp b/src/windows/native/sun/windows/awt_TextField.cpp index 975fd20bc0b23f6de377f4d9defca4c9802388ba..49095d3e3acd605af15d50a27a34b713eb1e61fa 100644 --- a/src/windows/native/sun/windows/awt_TextField.cpp +++ b/src/windows/native/sun/windows/awt_TextField.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -26,7 +26,6 @@ #include "awt_Toolkit.h" #include "awt_TextField.h" #include "awt_TextComponent.h" -#include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. @@ -150,135 +149,130 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic) * By consuming WM_MOUSEMOVE messages we also don't give * the RichEdit control a chance to recognize a drag gesture * and initiate its own drag-n-drop operation. + * + * The workaround also allows us to implement synthetic focus mechanism. */ - /** - * In non-focusable mode we don't pass mouse messages to native window thus making user unable - * to select the text. Below is the code from awt_TextArea.cpp which implements selection - * functionality. For safety this code is only being executed in non-focusable mode. - */ - if (!IsFocusable()) { - if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) { + if (IsFocusingMouseMessage(msg)) { + CHARRANGE cr; + + LONG lCurPos = EditGetCharFromPos(msg->pt); + + EditGetSel(cr); + /* + * NOTE: Plain EDIT control always clears selection on mouse + * button press. We are clearing the current selection only if + * the mouse pointer is not over the selected region. + * In this case we sacrifice backward compatibility + * to allow dnd of the current selection. + */ + if (msg->message == WM_LBUTTONDBLCLK) { + SetStartSelectionPos(static_cast<LONG>(SendMessage( + EM_FINDWORDBREAK, WB_MOVEWORDLEFT, lCurPos))); + SetEndSelectionPos(static_cast<LONG>(SendMessage( + EM_FINDWORDBREAK, WB_MOVEWORDRIGHT, lCurPos))); + } else { + SetStartSelectionPos(lCurPos); + SetEndSelectionPos(lCurPos); + } + cr.cpMin = GetStartSelectionPos(); + cr.cpMax = GetEndSelectionPos(); + EditSetSel(cr); + + delete msg; + return mrConsume; + } else if (msg->message == WM_LBUTTONUP) { + + /* + * If the left mouse button is pressed on the selected region + * we don't clear the current selection. We clear it on button + * release instead. This is to allow dnd of the current selection. + */ + if (GetStartSelectionPos() == -1 && GetEndSelectionPos() == -1) { CHARRANGE cr; LONG lCurPos = EditGetCharFromPos(msg->pt); - EditGetSel(cr); - /* - * NOTE: Plain EDIT control always clears selection on mouse - * button press. We are clearing the current selection only if - * the mouse pointer is not over the selected region. - * In this case we sacrifice backward compatibility - * to allow dnd of the current selection. - */ - if (msg->message == WM_LBUTTONDBLCLK) { - SetStartSelectionPos(static_cast<LONG>(SendMessage( - EM_FINDWORDBREAK, WB_MOVEWORDLEFT, lCurPos))); - SetEndSelectionPos(static_cast<LONG>(SendMessage( - EM_FINDWORDBREAK, WB_MOVEWORDRIGHT, lCurPos))); - } else { - SetStartSelectionPos(lCurPos); - SetEndSelectionPos(lCurPos); - } - cr.cpMin = GetStartSelectionPos(); - cr.cpMax = GetEndSelectionPos(); + cr.cpMin = lCurPos; + cr.cpMax = lCurPos; EditSetSel(cr); + } - delete msg; - return mrConsume; - } else if (msg->message == WM_LBUTTONUP) { + /* + * Cleanup the state variables when left mouse button is released. + * These state variables are designed to reflect the selection state + * while the left mouse button is pressed and be set to -1 otherwise. + */ + SetStartSelectionPos(-1); + SetEndSelectionPos(-1); + SetLastSelectionPos(-1); + + delete msg; + return mrConsume; + } else if (msg->message == WM_MOUSEMOVE && (msg->wParam & MK_LBUTTON)) { + + /* + * We consume WM_MOUSEMOVE while the left mouse button is pressed, + * so we have to simulate autoscrolling when mouse is moved outside + * of the client area. + */ + POINT p; + RECT r; + BOOL bScrollLeft = FALSE; + BOOL bScrollRight = FALSE; + BOOL bScrollUp = FALSE; + BOOL bScrollDown = FALSE; + + p.x = msg->pt.x; + p.y = msg->pt.y; + VERIFY(::GetClientRect(GetHWnd(), &r)); + + if (p.x < 0) { + bScrollLeft = TRUE; + p.x = 0; + } else if (p.x > r.right) { + bScrollRight = TRUE; + p.x = r.right - 1; + } + LONG lCurPos = EditGetCharFromPos(p); - /* - * If the left mouse button is pressed on the selected region - * we don't clear the current selection. We clear it on button - * release instead. This is to allow dnd of the current selection. - */ - if (GetStartSelectionPos() == -1 && GetEndSelectionPos() == -1) { - CHARRANGE cr; + if (GetStartSelectionPos() != -1 && + GetEndSelectionPos() != -1 && + lCurPos != GetLastSelectionPos()) { - LONG lCurPos = EditGetCharFromPos(msg->pt); + CHARRANGE cr; - cr.cpMin = lCurPos; - cr.cpMax = lCurPos; - EditSetSel(cr); - } + SetLastSelectionPos(lCurPos); - /* - * Cleanup the state variables when left mouse button is released. - * These state variables are designed to reflect the selection state - * while the left mouse button is pressed and be set to -1 otherwise. - */ - SetStartSelectionPos(-1); - SetEndSelectionPos(-1); - SetLastSelectionPos(-1); + cr.cpMin = GetStartSelectionPos(); + cr.cpMax = GetLastSelectionPos(); - delete msg; - return mrConsume; - } else if (msg->message == WM_MOUSEMOVE && (msg->wParam & MK_LBUTTON)) { + EditSetSel(cr); + } + if (bScrollLeft == TRUE || bScrollRight == TRUE) { + SCROLLINFO si; + memset(&si, 0, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; + + VERIFY(::GetScrollInfo(GetHWnd(), SB_HORZ, &si)); + if (bScrollLeft == TRUE) { + si.nPos = si.nPos - si.nPage / 2; + si.nPos = max(si.nMin, si.nPos); + } else if (bScrollRight == TRUE) { + si.nPos = si.nPos + si.nPage / 2; + si.nPos = min(si.nPos, si.nMax); + } /* - * We consume WM_MOUSEMOVE while the left mouse button is pressed, - * so we have to simulate autoscrolling when mouse is moved outside - * of the client area. + * Okay to use 16-bit position since RichEdit control adjusts + * its scrollbars so that their range is always 16-bit. */ - POINT p; - RECT r; - BOOL bScrollLeft = FALSE; - BOOL bScrollRight = FALSE; - BOOL bScrollUp = FALSE; - BOOL bScrollDown = FALSE; - - p.x = msg->pt.x; - p.y = msg->pt.y; - VERIFY(::GetClientRect(GetHWnd(), &r)); - - if (p.x < 0) { - bScrollLeft = TRUE; - p.x = 0; - } else if (p.x > r.right) { - bScrollRight = TRUE; - p.x = r.right - 1; - } - LONG lCurPos = EditGetCharFromPos(p); - - if (GetStartSelectionPos() != -1 && - GetEndSelectionPos() != -1 && - lCurPos != GetLastSelectionPos()) { - - CHARRANGE cr; - - SetLastSelectionPos(lCurPos); - - cr.cpMin = GetStartSelectionPos(); - cr.cpMax = GetLastSelectionPos(); - - EditSetSel(cr); - } - - if (bScrollLeft == TRUE || bScrollRight == TRUE) { - SCROLLINFO si; - memset(&si, 0, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; - - VERIFY(::GetScrollInfo(GetHWnd(), SB_HORZ, &si)); - if (bScrollLeft == TRUE) { - si.nPos = si.nPos - si.nPage / 2; - si.nPos = max(si.nMin, si.nPos); - } else if (bScrollRight == TRUE) { - si.nPos = si.nPos + si.nPage / 2; - si.nPos = min(si.nPos, si.nMax); - } - /* - * Okay to use 16-bit position since RichEdit control adjusts - * its scrollbars so that their range is always 16-bit. - */ - DASSERT(abs(si.nPos) < 0x8000); - SendMessage(WM_HSCROLL, - MAKEWPARAM(SB_THUMBPOSITION, LOWORD(si.nPos))); - } - delete msg; - return mrConsume; + DASSERT(abs(si.nPos) < 0x8000); + SendMessage(WM_HSCROLL, + MAKEWPARAM(SB_THUMBPOSITION, LOWORD(si.nPos))); } + delete msg; + return mrConsume; } /* * Store the 'synthetic' parameter so that the WM_PASTE security check diff --git a/src/windows/native/sun/windows/awt_Toolkit.cpp b/src/windows/native/sun/windows/awt_Toolkit.cpp index c4292826a8ec1ad8e30badfdfc741ffb297b3925..4a7cc16c5fa6b59e0ec89178e3d54f6d45b377e2 100644 --- a/src/windows/native/sun/windows/awt_Toolkit.cpp +++ b/src/windows/native/sun/windows/awt_Toolkit.cpp @@ -56,6 +56,7 @@ #include "debug_mem.h" #include "ComCtl32Util.h" +#include "DllUtil.h" #include "D3DPipelineManager.h" @@ -334,6 +335,8 @@ AwtToolkit::AwtToolkit() { m_mouseDown = FALSE; m_hGetMessageHook = 0; + m_hMouseLLHook = 0; + m_lastWindowUnderMouse = NULL; m_timer = 0; m_cmdIDs = new AwtCmdIDList(); @@ -483,6 +486,7 @@ BOOL AwtToolkit::Dispose() { tk.UnregisterClass(); ::UnhookWindowsHookEx(tk.m_hGetMessageHook); + UninstallMouseLowLevelHook(); tk.m_mainThreadId = 0; @@ -960,6 +964,79 @@ LRESULT CALLBACK AwtToolkit::GetMessageFilter(int code, CATCH_BAD_ALLOC_RET(0); } +void AwtToolkit::InstallMouseLowLevelHook() +{ + // We need the low-level hook since we need to process mouse move + // messages outside of our windows. + m_hMouseLLHook = ::SetWindowsHookEx(WH_MOUSE_LL, + (HOOKPROC)MouseLowLevelHook, + GetModuleHandle(), NULL); + + // Reset the old value + m_lastWindowUnderMouse = NULL; +} + +void AwtToolkit::UninstallMouseLowLevelHook() +{ + if (m_hMouseLLHook != 0) { + ::UnhookWindowsHookEx(m_hMouseLLHook); + m_hMouseLLHook = 0; + } +} + +LRESULT CALLBACK AwtToolkit::MouseLowLevelHook(int code, + WPARAM wParam, LPARAM lParam) +{ + TRY; + + if (code >= 0 && wParam == WM_MOUSEMOVE) { + POINT pt = ((MSLLHOOKSTRUCT*)lParam)->pt; + + // We can't use GA_ROOTOWNER since in this case we'll go up to + // the root Java toplevel, not the actual owned toplevel. + HWND hwnd = ::GetAncestor(::WindowFromPoint(pt), GA_ROOT); + + AwtToolkit& tk = AwtToolkit::GetInstance(); + + if (tk.m_lastWindowUnderMouse != hwnd) { + AwtWindow *fw = NULL, *tw = NULL; + + if (tk.m_lastWindowUnderMouse) { + fw = (AwtWindow*) + AwtComponent::GetComponent(tk.m_lastWindowUnderMouse); + } + if (hwnd) { + tw = (AwtWindow*)AwtComponent::GetComponent(hwnd); + } + + tk.m_lastWindowUnderMouse = hwnd; + + if (fw) { + fw->UpdateSecurityWarningVisibility(); + } + // ... however, because we use GA_ROOT, we may find the warningIcon + // which is not a Java windows. + if (AwtWindow::IsWarningWindow(hwnd)) { + hwnd = ::GetParent(hwnd); + if (hwnd) { + tw = (AwtWindow*)AwtComponent::GetComponent(hwnd); + } + tk.m_lastWindowUnderMouse = hwnd; + } + if (tw) { + tw->UpdateSecurityWarningVisibility(); + } + + + } + } + + return ::CallNextHookEx(AwtToolkit::GetInstance().m_hMouseLLHook, code, + wParam, lParam); + + CATCH_BAD_ALLOC_RET(0); +} + /* * The main message loop */ @@ -1376,6 +1453,47 @@ HICON AwtToolkit::GetAwtIconSm() return defaultIconSm; } +HICON AwtToolkit::GetSecurityWarningIcon(UINT index, UINT w, UINT h) +{ + //Note: should not exceed 10 because of the current implementation. + static const int securityWarningIconCounter = 3; + + static HICON securityWarningIcon[securityWarningIconCounter] = {NULL, NULL, NULL};; + static UINT securityWarningIconWidth[securityWarningIconCounter] = {0, 0, 0}; + static UINT securityWarningIconHeight[securityWarningIconCounter] = {0, 0, 0}; + + index = AwtToolkit::CalculateWave(index, securityWarningIconCounter); + + if (securityWarningIcon[index] == NULL || + w != securityWarningIconWidth[index] || + h != securityWarningIconHeight[index]) + { + if (securityWarningIcon[index] != NULL) + { + ::DestroyIcon(securityWarningIcon[index]); + } + + static const wchar_t securityWarningIconName[] = L"SECURITY_WARNING_"; + wchar_t iconResourceName[sizeof(securityWarningIconName) + 2]; + ::ZeroMemory(iconResourceName, sizeof(iconResourceName)); + wcscpy(iconResourceName, securityWarningIconName); + + wchar_t strIndex[2]; + ::ZeroMemory(strIndex, sizeof(strIndex)); + strIndex[0] = L'0' + index; + + wcscat(iconResourceName, strIndex); + + securityWarningIcon[index] = (HICON)::LoadImage(GetModuleHandle(), + iconResourceName, + IMAGE_ICON, w, h, LR_DEFAULTCOLOR); + securityWarningIconWidth[index] = w; + securityWarningIconHeight[index] = h; + } + + return securityWarningIcon[index]; +} + void AwtToolkit::SetHeapCheck(long flag) { if (flag) { printf("heap checking not supported with this build\n"); @@ -1428,6 +1546,49 @@ JNIEnv* AwtToolkit::GetEnv() { (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2) : m_env; } +BOOL AwtToolkit::GetScreenInsets(int screenNum, RECT * rect) +{ + /* if primary display */ + if (screenNum == 0) { + RECT rRW; + if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) { + rect->top = rRW.top; + rect->left = rRW.left; + rect->bottom = ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom; + rect->right = ::GetSystemMetrics(SM_CXSCREEN) - rRW.right; + return TRUE; + } + } + /* if additional display */ + else { + MONITORINFO *miInfo; + miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screenNum); + if (miInfo) { + rect->top = miInfo->rcWork.top - miInfo->rcMonitor.top; + rect->left = miInfo->rcWork.left - miInfo->rcMonitor.left; + rect->bottom = miInfo->rcMonitor.bottom - miInfo->rcWork.bottom; + rect->right = miInfo->rcMonitor.right - miInfo->rcWork.right; + return TRUE; + } + } + return FALSE; +} + + +void AwtToolkit::GetWindowRect(HWND hWnd, LPRECT lpRect) +{ + try { + if (S_OK == DwmAPI::DwmGetWindowAttribute(hWnd, + DwmAPI::DWMWA_EXTENDED_FRAME_BOUNDS, + lpRect, sizeof(*lpRect))) + { + return; + } + } catch (const DllUtil::Exception &) {} + + ::GetWindowRect(hWnd, lpRect); +} + /************************************************************************ * Toolkit native methods */ @@ -1756,7 +1917,6 @@ Java_sun_awt_windows_WToolkit_getScreenHeight(JNIEnv *env, jobject self) CATCH_BAD_ALLOC_RET(0); } - /* * Class: sun_awt_windows_WToolkit * Method: getSreenInsets @@ -1768,34 +1928,17 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env, jint screen) { jobject insets = NULL; - RECT rRW; - LPMONITORINFO miInfo; + RECT rect; TRY; -/* if primary display */ - if (screen == 0) { - if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) { - insets = env->NewObject(env->FindClass("java/awt/Insets"), - AwtToolkit::insetsMID, - rRW.top, - rRW.left, - ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom, - ::GetSystemMetrics(SM_CXSCREEN) - rRW.right); - } - } - -/* if additional display */ - else { - miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screen); - if (miInfo) { - insets = env->NewObject(env->FindClass("java/awt/Insets"), + if (AwtToolkit::GetScreenInsets(screen, &rect)) { + insets = env->NewObject(env->FindClass("java/awt/Insets"), AwtToolkit::insetsMID, - miInfo->rcWork.top - miInfo->rcMonitor.top, - miInfo->rcWork.left - miInfo->rcMonitor.left, - miInfo->rcMonitor.bottom - miInfo->rcWork.bottom, - miInfo->rcMonitor.right - miInfo->rcWork.right); - } + rect.top, + rect.left, + rect.bottom, + rect.right); } if (safe_ExceptionOccurred(env)) { diff --git a/src/windows/native/sun/windows/awt_Toolkit.h b/src/windows/native/sun/windows/awt_Toolkit.h index d76546fa4eb5532b5c74f342db294f9b50b1703d..3bb07712a198edc33860f5cdcf9401f5b2b09233 100644 --- a/src/windows/native/sun/windows/awt_Toolkit.h +++ b/src/windows/native/sun/windows/awt_Toolkit.h @@ -210,6 +210,8 @@ public: LPARAM lParam); static LRESULT CALLBACK ForegroundIdleFilter(int code, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK MouseLowLevelHook(int code, WPARAM wParam, + LPARAM lParam); INLINE static AwtToolkit& GetInstance() { return theInstance; } INLINE void SetPeer(JNIEnv *env, jobject wToolkit) { @@ -311,6 +313,30 @@ public: HICON GetAwtIcon(); HICON GetAwtIconSm(); + // Calculate a wave-like value out of the integer 'value' and + // the specified period. + // The argument 'value' is an integer 0, 1, 2, ... *infinity*. + // + // Examples: + // Period == 3 + // Generated sequence: 0 1 2 1 0 ..... + // + // Period == 4 + // Generated sequence: 0 1 2 3 2 1 0 ..... + static inline UINT CalculateWave(UINT value, const UINT period) { + if (period < 2) { + return 0; + } + // -2 is necessary to avoid repeating extreme values (0 and period-1) + value %= period * 2 -2; + if (value >= period) { + value = period * 2 -2 - value; + } + return value; + } + + HICON GetSecurityWarningIcon(UINT index, UINT w, UINT h); + /* Turns on/off dialog modality for the system. */ INLINE AwtDialog* SetModal(AwtDialog* frame) { AwtDialog* previousDialog = m_pModalDialog; @@ -368,6 +394,7 @@ private: BOOL m_mouseDown; HHOOK m_hGetMessageHook; + HHOOK m_hMouseLLHook; UINT_PTR m_timer; class AwtCmdIDList* m_cmdIDs; @@ -411,6 +438,24 @@ public: public: static void SetEnv(JNIEnv *env); static JNIEnv* GetEnv(); + + static BOOL GetScreenInsets(int screenNum, RECT * rect); + + // If the DWM is active, this function uses + // DwmGetWindowAttribute()/DWMWA_EXTENDED_FRAME_BOUNDS. + // Otherwise, fall back to regular ::GetWindowRect(). + // See 6711576 for more details. + static void GetWindowRect(HWND hWnd, LPRECT lpRect); + + private: + // The window handle of a toplevel window last seen under the mouse cursor. + // See MouseLowLevelHook() for details. + HWND m_lastWindowUnderMouse; + public: + HWND GetWindowUnderMouse() { return m_lastWindowUnderMouse; } + + void InstallMouseLowLevelHook(); + void UninstallMouseLowLevelHook(); }; /* diff --git a/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp b/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp index 1617d54e65781441eb1bf8f809a39f14ecc55462..150ff8f075c00ddde8ae9fcaa631072afc683422 100644 --- a/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp +++ b/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp @@ -29,6 +29,7 @@ #include "awt_Win32GraphicsDevice.h" #include "Devices.h" #include "WindowsFlags.h" +#include "DllUtil.h" BOOL DWMIsCompositionEnabled(); @@ -89,13 +90,8 @@ void DWMResetCompositionEnabled() { /** * Returns true if dwm composition is enabled, false if it is not applicable * (if the OS is not Vista) or dwm composition is disabled. - * - * Note: since DWM composition state changes are very rare we load/unload the - * dll on every change. */ BOOL DWMIsCompositionEnabled() { - typedef HRESULT (WINAPI DwmIsCompositionEnabledFunc)(BOOL*); - // cheaper to check than whether it's vista or not if (dwmIsCompositionEnabled != DWM_COMP_UNDEFINED) { return (BOOL)dwmIsCompositionEnabled; @@ -107,32 +103,22 @@ BOOL DWMIsCompositionEnabled() { } BOOL bRes = FALSE; - HMODULE hDwmApiDll = ::LoadLibrary(TEXT("dwmapi.dll")); - - if (hDwmApiDll != NULL) { - DwmIsCompositionEnabledFunc *lpDwmIsCompEnabled = - (DwmIsCompositionEnabledFunc*) - GetProcAddress(hDwmApiDll, "DwmIsCompositionEnabled"); - if (lpDwmIsCompEnabled != NULL) { - BOOL bEnabled; - HRESULT res = lpDwmIsCompEnabled(&bEnabled); - if (SUCCEEDED(res)) { - bRes = bEnabled; - J2dTraceLn1(J2D_TRACE_VERBOSE, " composition enabled: %d",bRes); - } else { - J2dTraceLn1(J2D_TRACE_ERROR, - "IsDWMCompositionEnabled: error %x when detecting"\ - "if composition is enabled", res); - } + + try { + BOOL bEnabled; + HRESULT res = DwmAPI::DwmIsCompositionEnabled(&bEnabled); + if (SUCCEEDED(res)) { + bRes = bEnabled; + J2dTraceLn1(J2D_TRACE_VERBOSE, " composition enabled: %d",bRes); } else { - J2dTraceLn(J2D_TRACE_ERROR, - "IsDWMCompositionEnabled: no DwmIsCompositionEnabled() "\ - "in dwmapi.dll"); + J2dTraceLn1(J2D_TRACE_ERROR, + "IsDWMCompositionEnabled: error %x when detecting"\ + "if composition is enabled", res); } - ::FreeLibrary(hDwmApiDll); - } else { + } catch (const DllUtil::Exception &) { J2dTraceLn(J2D_TRACE_ERROR, - "IsDWMCompositionEnabled: error opening dwmapi.dll"); + "IsDWMCompositionEnabled: no DwmIsCompositionEnabled() "\ + "in dwmapi.dll or dwmapi.dll cannot be loaded"); } dwmIsCompositionEnabled = bRes; diff --git a/src/windows/native/sun/windows/awt_Window.cpp b/src/windows/native/sun/windows/awt_Window.cpp index 0c9bce1210de80b449444a5ce1fdb4fc5da0bb79..88bcd8ecc45afdd24af2e9b38530abc8e2c20b2a 100644 --- a/src/windows/native/sun/windows/awt_Window.cpp +++ b/src/windows/native/sun/windows/awt_Window.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -25,9 +25,12 @@ #include "awt.h" +#include <jlong.h> + #include "awt_Component.h" #include "awt_Container.h" #include "awt_Frame.h" +#include "awt_Dialog.h" #include "awt_Insets.h" #include "awt_Panel.h" #include "awt_Toolkit.h" @@ -35,6 +38,7 @@ #include "awt_Win32GraphicsDevice.h" #include "awt_BitmapUtil.h" #include "awt_IconCursor.h" +#include "ComCtl32Util.h" #include "java_awt_Insets.h" #include <java_awt_Container.h> @@ -88,7 +92,6 @@ struct ReshapeFrameStruct { jint x, y; jint w, h; }; - // struct for _SetIconImagesData struct SetIconImagesDataStruct { jobject window; @@ -97,7 +100,6 @@ struct SetIconImagesDataStruct { jintArray smallIconRaster; jint smw, smh; }; - // struct for _SetMinSize() method // and other methods setting sizes struct SizeStruct { @@ -114,6 +116,34 @@ struct ModalDisableStruct { jobject window; jlong blockerHWnd; }; +// struct for _SetOpacity() method +struct OpacityStruct { + jobject window; + jint iOpacity; +}; +// struct for _SetOpaque() method +struct OpaqueStruct { + jobject window; + jboolean isOpaque; +}; +// struct for _UpdateWindow() method +struct UpdateWindowStruct { + jobject window; + jintArray data; + HBITMAP hBitmap; + jint width, height; +}; +// Struct for _RequestWindowFocus() method +struct RequestWindowFocusStruct { + jobject component; + jboolean isMouseEventCause; +}; +// struct for _RepositionSecurityWarning() method +struct RepositionSecurityWarningStruct { + jobject window; +}; + + /************************************************************************ * AwtWindow fields */ @@ -121,17 +151,23 @@ struct ModalDisableStruct { jfieldID AwtWindow::warningStringID; jfieldID AwtWindow::locationByPlatformID; jfieldID AwtWindow::autoRequestFocusID; +jfieldID AwtWindow::securityWarningWidthID; +jfieldID AwtWindow::securityWarningHeightID; jfieldID AwtWindow::sysXID; jfieldID AwtWindow::sysYID; jfieldID AwtWindow::sysWID; jfieldID AwtWindow::sysHID; +jmethodID AwtWindow::getWarningStringMID; +jmethodID AwtWindow::calculateSecurityWarningPositionMID; + int AwtWindow::ms_instanceCounter = 0; HHOOK AwtWindow::ms_hCBTFilter; AwtWindow * AwtWindow::m_grabbedWindow = NULL; HWND AwtWindow::sm_retainingHierarchyZOrderInShow = NULL; BOOL AwtWindow::sm_resizing = FALSE; +UINT AwtWindow::untrustedWindowsCounter = 0; /************************************************************************ * AwtWindow class methods @@ -162,10 +198,34 @@ AwtWindow::AwtWindow() { ::SetWindowsHookEx(WH_CBT, (HOOKPROC)AwtWindow::CBTFilter, 0, AwtToolkit::MainThread()); } + + m_opaque = TRUE; + m_opacity = 0xff; + + + warningString = NULL; + warningWindow = NULL; + securityTooltipWindow = NULL; + securityWarningAnimationStage = 0; + currentWmSizeState = SIZE_RESTORED; + + hContentBitmap = NULL; + + ::InitializeCriticalSection(&contentBitmapCS); } AwtWindow::~AwtWindow() { + if (warningString != NULL) { + delete [] warningString; + } + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + hContentBitmap = NULL; + } + ::LeaveCriticalSection(&contentBitmapCS); + ::DeleteCriticalSection(&contentBitmapCS); } void AwtWindow::Dispose() @@ -204,10 +264,10 @@ AwtWindow::Grab() { } m_grabbed = TRUE; m_grabbedWindow = this; - if (sm_focusedWindow == NULL && IsFocusableWindow()) { + if (AwtComponent::GetFocusedWindow() == NULL && IsFocusableWindow()) { // we shouldn't perform grab in this case (see 4841881 & 6539458) Ungrab(); - } else if (GetHWnd() != sm_focusedWindow) { + } else if (GetHWnd() != AwtComponent::GetFocusedWindow()) { _ToFront(env->NewGlobalRef(GetPeer(env))); // Global ref was deleted in _ToFront } @@ -301,12 +361,40 @@ MsgRouting AwtWindow::WmWindowPosChanging(LPARAM windowPos) { return mrDoDefault; } +void AwtWindow::RepositionSecurityWarning(JNIEnv *env) +{ + RECT rect; + CalculateWarningWindowBounds(env, &rect); + + ::SetWindowPos(warningWindow, HWND_NOTOPMOST, + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOZORDER + ); +} + MsgRouting AwtWindow::WmWindowPosChanged(LPARAM windowPos) { - if (IsRetainingHierarchyZOrder() && ((WINDOWPOS *)windowPos)->flags & SWP_SHOWWINDOW) { + WINDOWPOS * wp = (WINDOWPOS *)windowPos; + + if (IsRetainingHierarchyZOrder() && wp->flags & SWP_SHOWWINDOW) { // By this time all the windows from the hierarchy are already notified about z-order change. // Thus we may and we should reset the trigger in order not to affect other changes. sm_retainingHierarchyZOrderInShow = NULL; } + + // Reposition the warning window + if (IsUntrusted() && warningWindow != NULL) { + if (wp->flags & SWP_HIDEWINDOW) { + UpdateSecurityWarningVisibility(); + } + + RepositionSecurityWarning((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2)); + + if (wp->flags & SWP_SHOWWINDOW) { + UpdateSecurityWarningVisibility(); + } + } + return mrDoDefault; } @@ -326,21 +414,597 @@ void AwtWindow::FillClassInfo(WNDCLASSEX *lpwc) lpwc->cbWndExtra = DLGWINDOWEXTRA; } +bool AwtWindow::IsWarningWindow(HWND hWnd) +{ + const UINT len = 128; + TCHAR windowClassName[len]; + + ::RealGetWindowClass(hWnd, windowClassName, len); + return 0 == _tcsncmp(windowClassName, + AwtWindow::GetWarningWindowClassName(), len); +} + LRESULT CALLBACK AwtWindow::CBTFilter(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HCBT_ACTIVATE || nCode == HCBT_SETFOCUS) { - AwtComponent *comp = AwtComponent::GetComponent((HWND)wParam); + HWND hWnd = (HWND)wParam; + AwtComponent *comp = AwtComponent::GetComponent(hWnd); + + if (comp == NULL) { + // Check if it's a security warning icon + // See: 5091224, 6181725, 6732583 + if (AwtWindow::IsWarningWindow(hWnd)) { + return 1; + } + } else { + if (comp->IsTopLevel()) { + AwtWindow* win = (AwtWindow*)comp; - if (comp != NULL && comp->IsTopLevel()) { - AwtWindow* win = (AwtWindow*)comp; - if (!win->IsFocusableWindow() || win->m_filterFocusAndActivation) { - return 1; // Don't change focus/activation. + if (!win->IsFocusableWindow() || + win->m_filterFocusAndActivation) + { + return 1; // Don't change focus/activation. + } } } } return ::CallNextHookEx(AwtWindow::ms_hCBTFilter, nCode, wParam, lParam); } +void AwtWindow::InitSecurityWarningSize(JNIEnv *env) +{ + warningWindowWidth = ::GetSystemMetrics(SM_CXSMICON); + warningWindowHeight = ::GetSystemMetrics(SM_CYSMICON); + + jobject target = GetTarget(env); + + env->SetIntField(target, AwtWindow::securityWarningWidthID, + warningWindowWidth); + env->SetIntField(target, AwtWindow::securityWarningHeightID, + warningWindowHeight); + + env->DeleteLocalRef(target); +} + +void AwtWindow::CreateHWnd(JNIEnv *env, LPCWSTR title, + DWORD windowStyle, + DWORD windowExStyle, + int x, int y, int w, int h, + HWND hWndParent, HMENU hMenu, + COLORREF colorForeground, + COLORREF colorBackground, + jobject peer) +{ + // Retrieve the warning string + // Note: we need to get it before CreateHWnd() happens because + // the isUntrusted() method may be invoked while the HWND + // is being created in response to some window messages. + jobject target = env->GetObjectField(peer, AwtObject::targetID); + jstring javaWarningString = + (jstring)env->CallObjectMethod(target, AwtWindow::getWarningStringMID); + + if (javaWarningString != NULL) { + size_t length = env->GetStringLength(javaWarningString) + 1; + warningString = new WCHAR[length]; + env->GetStringRegion(javaWarningString, 0, + static_cast<jsize>(length - 1), warningString); + warningString[length-1] = L'\0'; + + env->DeleteLocalRef(javaWarningString); + } + env->DeleteLocalRef(target); + + AwtCanvas::CreateHWnd(env, title, + windowStyle, + windowExStyle, + x, y, w, h, + hWndParent, hMenu, + colorForeground, + colorBackground, + peer); + + // Now we need to create the warning window. + CreateWarningWindow(env); +} + +void AwtWindow::CreateWarningWindow(JNIEnv *env) +{ + if (!IsUntrusted()) { + return; + } + + if (++AwtWindow::untrustedWindowsCounter == 1) { + AwtToolkit::GetInstance().InstallMouseLowLevelHook(); + } + + InitSecurityWarningSize(env); + + RECT rect; + CalculateWarningWindowBounds(env, &rect); + + RegisterWarningWindowClass(); + warningWindow = ::CreateWindowEx( + WS_EX_NOACTIVATE | WS_EX_LAYERED, + GetWarningWindowClassName(), + warningString, + WS_POPUP, + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + GetHWnd(), // owner + NULL, // menu + AwtToolkit::GetInstance().GetModuleHandle(), + NULL // lParam + ); + if (warningWindow == NULL) { + //XXX: actually this is bad... We didn't manage to create the widow. + return; + } + + HICON hIcon = GetSecurityWarningIcon(); + + ICONINFO ii; + ::GetIconInfo(hIcon, &ii); + + //Note: we assume that every security icon has exactly the same shape. + HRGN rgn = BitmapUtil::BitmapToRgn(ii.hbmColor); + if (rgn) { + ::SetWindowRgn(warningWindow, rgn, TRUE); + } + + // Now we need to create the tooltip control for this window. + if (!ComCtl32Util::GetInstance().IsToolTipControlInitialized()) { + return; + } + + securityTooltipWindow = ::CreateWindowEx( + WS_EX_TOPMOST, + TOOLTIPS_CLASS, + NULL, + WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + warningWindow, + NULL, + AwtToolkit::GetInstance().GetModuleHandle(), + NULL + ); + + ::SetWindowPos(securityTooltipWindow, + HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + + + // We currently don't expect changing the size of the window, + // hence we may not care of updating the TOOL position/size. + ::GetClientRect(warningWindow, &rect); + + TOOLINFO ti; + + ti.cbSize = sizeof(ti); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = warningWindow; + ti.hinst = AwtToolkit::GetInstance().GetModuleHandle(); + ti.uId = 0; + ti.lpszText = warningString; + ti.rect.left = rect.left; + ti.rect.top = rect.top; + ti.rect.right = rect.right; + ti.rect.bottom = rect.bottom; + + ::SendMessage(securityTooltipWindow, TTM_ADDTOOL, + 0, (LPARAM) (LPTOOLINFO) &ti); +} + +void AwtWindow::DestroyWarningWindow() +{ + if (!IsUntrusted()) { + return; + } + if (--AwtWindow::untrustedWindowsCounter == 0) { + AwtToolkit::GetInstance().UninstallMouseLowLevelHook(); + } + if (warningWindow != NULL) { + // Note that the warningWindow is an owned window, and hence + // it would be destroyed automatically. However, the window + // class may only be unregistered if there's no any single + // window left using this class. Thus, we're destroying the + // warning window manually. Note that the tooltip window + // will be destroyed automatically because it's an owned + // window as well. + ::DestroyWindow(warningWindow); + warningWindow = NULL; + securityTooltipWindow = NULL; + UnregisterWarningWindowClass(); + } +} + +void AwtWindow::DestroyHWnd() +{ + DestroyWarningWindow(); + AwtCanvas::DestroyHWnd(); +} + +LPCTSTR AwtWindow::GetWarningWindowClassName() +{ + return TEXT("SunAwtWarningWindow"); +} + +void AwtWindow::FillWarningWindowClassInfo(WNDCLASS *lpwc) +{ + lpwc->style = 0L; + lpwc->lpfnWndProc = (WNDPROC)WarningWindowProc; + lpwc->cbClsExtra = 0; + lpwc->cbWndExtra = 0; + lpwc->hInstance = AwtToolkit::GetInstance().GetModuleHandle(), + lpwc->hIcon = AwtToolkit::GetInstance().GetAwtIcon(); + lpwc->hCursor = ::LoadCursor(NULL, IDC_ARROW); + lpwc->hbrBackground = NULL; + lpwc->lpszMenuName = NULL; + lpwc->lpszClassName = AwtWindow::GetWarningWindowClassName(); +} + +void AwtWindow::RegisterWarningWindowClass() +{ + WNDCLASS wc; + + ::ZeroMemory(&wc, sizeof(wc)); + + if (!::GetClassInfo(AwtToolkit::GetInstance().GetModuleHandle(), + AwtWindow::GetWarningWindowClassName(), &wc)) + { + AwtWindow::FillWarningWindowClassInfo(&wc); + ATOM atom = ::RegisterClass(&wc); + DASSERT(atom != 0); + } +} + +void AwtWindow::UnregisterWarningWindowClass() +{ + ::UnregisterClass(AwtWindow::GetWarningWindowClassName(), AwtToolkit::GetInstance().GetModuleHandle()); +} + +HICON AwtWindow::GetSecurityWarningIcon() +{ + HICON ico = AwtToolkit::GetInstance().GetSecurityWarningIcon(securityWarningAnimationStage, + warningWindowWidth, warningWindowHeight); + return ico; +} + +// This function calculates the bounds of the warning window and stores them +// into the RECT structure pointed by the argument rect. +void AwtWindow::CalculateWarningWindowBounds(JNIEnv *env, LPRECT rect) +{ + RECT windowBounds; + AwtToolkit::GetWindowRect(GetHWnd(), &windowBounds); + + jobject target = GetTarget(env); + jobject point2D = env->CallObjectMethod(target, + calculateSecurityWarningPositionMID, + (jdouble)windowBounds.left, (jdouble)windowBounds.top, + (jdouble)(windowBounds.right - windowBounds.left), + (jdouble)(windowBounds.bottom - windowBounds.top)); + env->DeleteLocalRef(target); + + static jclass point2DClassID = NULL; + static jmethodID point2DGetXMID = NULL; + static jmethodID point2DGetYMID = NULL; + + if (point2DClassID == NULL) { + jclass point2DClassIDLocal = env->FindClass("java/awt/geom/Point2D"); + point2DClassID = (jclass)env->NewGlobalRef(point2DClassIDLocal); + env->DeleteLocalRef(point2DClassIDLocal); + } + + if (point2DGetXMID == NULL) { + point2DGetXMID = env->GetMethodID(point2DClassID, "getX", "()D"); + } + if (point2DGetYMID == NULL) { + point2DGetYMID = env->GetMethodID(point2DClassID, "getY", "()D"); + } + + + int x = (int)env->CallDoubleMethod(point2D, point2DGetXMID); + int y = (int)env->CallDoubleMethod(point2D, point2DGetYMID); + + env->DeleteLocalRef(point2D); + + //Make sure the warning is not far from the window bounds + x = max(x, windowBounds.left - (int)warningWindowWidth - 2); + x = min(x, windowBounds.right + (int)warningWindowWidth + 2); + + y = max(y, windowBounds.top - (int)warningWindowHeight - 2); + y = min(y, windowBounds.bottom + (int)warningWindowHeight + 2); + + // Now make sure the warning window is visible on the screen + HMONITOR hmon = MonitorFromWindow(GetHWnd(), MONITOR_DEFAULTTOPRIMARY); + DASSERT(hmon != NULL); + + RECT monitorBounds; + RECT monitorInsets; + + MonitorBounds(hmon, &monitorBounds); + if (!AwtToolkit::GetScreenInsets(m_screenNum, &monitorInsets)) { + ::ZeroMemory(&monitorInsets, sizeof(monitorInsets)); + } + + x = max(x, monitorBounds.left + monitorInsets.left); + x = min(x, monitorBounds.right - monitorInsets.right - (int)warningWindowWidth); + + y = max(y, monitorBounds.top + monitorInsets.top); + y = min(y, monitorBounds.bottom - monitorInsets.bottom - (int)warningWindowHeight); + + rect->left = x; + rect->top = y; + rect->right = rect->left + warningWindowWidth; + rect->bottom = rect->top + warningWindowHeight; +} + +LRESULT CALLBACK AwtWindow::WarningWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case WM_PAINT: + PaintWarningWindow(hwnd); + return 0; + + case WM_MOUSEACTIVATE: + { + // Retrive the owner of the warning window. + HWND javaWindow = ::GetParent(hwnd); + if (javaWindow) { + // If the window is blocked by a modal dialog, substitute + // its handle with the topmost blocker. + HWND topmostBlocker = GetTopmostModalBlocker(javaWindow); + if (::IsWindow(topmostBlocker)) { + javaWindow = topmostBlocker; + } + + ::BringWindowToTop(javaWindow); + + AwtWindow * window = + (AwtWindow*)AwtComponent::GetComponent(javaWindow); + if (window == NULL) { + // Quite unlikely to go into here, but it's way better + // than getting a crash. + ::SetForegroundWindow(javaWindow); + } else { + // Activate the window if it is focusable and inactive + if (window->IsFocusableWindow() && + javaWindow != ::GetActiveWindow()) { + ::SetForegroundWindow(javaWindow); + } else { + // ...otherwise just start the animation. + window->StartSecurityAnimation(akShow); + } + } + + // In every case if there's a top-most blocker, we need to + // enable modal animation. + if (::IsWindow(topmostBlocker)) { + AwtDialog::AnimateModalBlocker(topmostBlocker); + } + } + return MA_NOACTIVATEANDEAT; + } + } + return ::DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +void AwtWindow::PaintWarningWindow(HWND warningWindow) +{ + RECT updateRect; + + if (!::GetUpdateRect(warningWindow, &updateRect, FALSE)) { + // got nothing to update + return; + } + + PAINTSTRUCT ps; + HDC hdc = ::BeginPaint(warningWindow, &ps); + if (hdc == NULL) { + // indicates an error + return; + } + + PaintWarningWindow(warningWindow, hdc); + + ::EndPaint(warningWindow, &ps); +} + +void AwtWindow::PaintWarningWindow(HWND warningWindow, HDC hdc) +{ + HWND javaWindow = ::GetParent(warningWindow); + + AwtWindow * window = (AwtWindow*)AwtComponent::GetComponent(javaWindow); + if (window == NULL) { + return; + } + + ::DrawIconEx(hdc, 0, 0, window->GetSecurityWarningIcon(), + window->warningWindowWidth, window->warningWindowHeight, + 0, NULL, DI_NORMAL); +} + +static const UINT_PTR IDT_AWT_SECURITYANIMATION = 0x102; + +// Approximately 6 times a second. 0.75 seconds total. +static const UINT securityAnimationTimerElapse = 150; +static const UINT securityAnimationMaxIterations = 5; + +void AwtWindow::RepaintWarningWindow() +{ + HDC hdc = ::GetDC(warningWindow); + PaintWarningWindow(warningWindow, hdc); + ::ReleaseDC(warningWindow, hdc); +} + +void AwtWindow::StartSecurityAnimation(AnimationKind kind) +{ + if (!IsUntrusted()) { + return; + } + if (warningWindow == NULL) { + return; + } + + securityAnimationKind = kind; + + securityWarningAnimationStage = 1; + ::SetTimer(GetHWnd(), IDT_AWT_SECURITYANIMATION, + securityAnimationTimerElapse, NULL); + + if (securityAnimationKind == akShow) { + ::SetWindowPos(warningWindow, HWND_NOTOPMOST, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | + SWP_SHOWWINDOW); + + ::SetLayeredWindowAttributes(warningWindow, RGB(0, 0, 0), + 0xFF, LWA_ALPHA); + ::RedrawWindow(warningWindow, NULL, NULL, + RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); + } +} + +void AwtWindow::StopSecurityAnimation() +{ + if (!IsUntrusted()) { + return; + } + if (warningWindow == NULL) { + return; + } + + securityWarningAnimationStage = 0; + ::KillTimer(GetHWnd(), IDT_AWT_SECURITYANIMATION); + + switch (securityAnimationKind) { + case akHide: + case akPreHide: + ::SetWindowPos(warningWindow, HWND_NOTOPMOST, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | + SWP_HIDEWINDOW); + break; + case akShow: + RepaintWarningWindow(); + break; + } + + securityAnimationKind = akNone; +} + +MsgRouting AwtWindow::WmTimer(UINT_PTR timerID) +{ + if (timerID != IDT_AWT_SECURITYANIMATION) { + return mrPassAlong; + } + + if (securityWarningAnimationStage == 0) { + return mrConsume; + } + + securityWarningAnimationStage++; + if (securityWarningAnimationStage >= securityAnimationMaxIterations) { + if (securityAnimationKind == akPreHide) { + // chain real hiding + StartSecurityAnimation(akHide); + } else { + StopSecurityAnimation(); + } + } else { + switch (securityAnimationKind) { + case akHide: + { + BYTE opacity = ((int)0xFF * + (securityAnimationMaxIterations - + securityWarningAnimationStage)) / + securityAnimationMaxIterations; + ::SetLayeredWindowAttributes(warningWindow, + RGB(0, 0, 0), opacity, LWA_ALPHA); + } + break; + case akShow: + case akNone: // quite unlikely, but quite safe + RepaintWarningWindow(); + break; + } + } + + return mrConsume; +} + +// The security warning is visible if: +// 1. The window has the keyboard window focus, OR +// 2. The mouse pointer is located within the window bounds, +// or within the security warning icon. +void AwtWindow::UpdateSecurityWarningVisibility() +{ + if (!IsUntrusted()) { + return; + } + if (warningWindow == NULL) { + return; + } + + bool show = false; + + if (IsVisible() && currentWmSizeState != SIZE_MINIMIZED) { + if (AwtComponent::GetFocusedWindow() == GetHWnd()) { + show = true; + } + + HWND hwnd = AwtToolkit::GetInstance().GetWindowUnderMouse(); + if (hwnd == GetHWnd()) { + show = true; + } + if (hwnd == warningWindow) { + show = true; + } + } + + if (show && (!::IsWindowVisible(warningWindow) || + securityAnimationKind == akHide || + securityAnimationKind == akPreHide)) { + StartSecurityAnimation(akShow); + } + if (!show && ::IsWindowVisible(warningWindow)) { + StartSecurityAnimation(akPreHide); + } +} + +void AwtWindow::FocusedWindowChanged(HWND from, HWND to) +{ + AwtWindow * fw = (AwtWindow *)AwtComponent::GetComponent(from); + AwtWindow * tw = (AwtWindow *)AwtComponent::GetComponent(to); + + if (fw != NULL) { + fw->UpdateSecurityWarningVisibility(); + } + if (tw != NULL) { + tw->UpdateSecurityWarningVisibility(); + + // Flash on receiving the keyboard focus even if the warning + // has already been shown (e.g. by hovering with the mouse) + tw->StartSecurityAnimation(akShow); + } +} + +void AwtWindow::_RepositionSecurityWarning(void* param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + RepositionSecurityWarningStruct *rsws = + (RepositionSecurityWarningStruct *)param; + jobject self = rsws->window; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; + + window->RepositionSecurityWarning(env); + + ret: + env->DeleteGlobalRef(self); + delete rsws; +} + /* Create a new AwtWindow object and window. */ AwtWindow* AwtWindow::Create(jobject self, jobject parent) { @@ -372,7 +1036,7 @@ AwtWindow* AwtWindow::Create(jobject self, jobject parent) window->m_isRetainingHierarchyZOrder = TRUE; } DWORD style = WS_CLIPCHILDREN | WS_POPUP; - DWORD exStyle = 0; + DWORD exStyle = WS_EX_NOACTIVATE; if (GetRTL()) { exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; if (GetRTLReadingOrder()) @@ -620,23 +1284,6 @@ BOOL AwtWindow::UpdateInsets(jobject insets) ::GetClientRect(GetHWnd(), &inside); ::GetWindowRect(GetHWnd(), &outside); - jobject target = GetTarget(env); - jstring warningString = - (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID); - if (warningString != NULL) { - ::CopyRect(&inside, &outside); - DefWindowProc(WM_NCCALCSIZE, FALSE, (LPARAM)&inside); - /* - * Fix for BugTraq ID 4304024. - * Calculate client rectangle in client coordinates. - */ - VERIFY(::OffsetRect(&inside, -inside.left, -inside.top)); - extraBottomInsets = ::GetSystemMetrics(SM_CYCAPTION) + - ((GetStyle() & WS_THICKFRAME) ? 2 : -2); - } - env->DeleteLocalRef(target); - env->DeleteLocalRef(warningString); - /* Update our inset member */ if (outside.right - outside.left > 0 && outside.bottom - outside.top > 0) { ::MapWindowPoints(GetHWnd(), 0, (LPPOINT)&inside, 2); @@ -863,45 +1510,93 @@ void AwtWindow::SendWindowEvent(jint id, HWND opposite, env->DeleteLocalRef(event); } +BOOL AwtWindow::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest) +{ + // Fix for 6458497. + // Retreat if current foreground window is out of both our and embedder process. + // The exception is when activation is requested due to a mouse event. + if (!isMouseEventCause) { + HWND fgWindow = ::GetForegroundWindow(); + if (NULL != fgWindow) { + DWORD fgProcessID; + ::GetWindowThreadProcessId(fgWindow, &fgProcessID); + if (fgProcessID != ::GetCurrentProcessId() + && !AwtToolkit::GetInstance().IsEmbedderProcessId(fgProcessID)) + { + return FALSE; + } + } + } + + HWND proxyContainerHWnd = GetProxyToplevelContainer(); + HWND proxyHWnd = GetProxyFocusOwner(); + + if (proxyContainerHWnd == NULL || proxyHWnd == NULL) { + return FALSE; + } + + // Activate the proxy toplevel container + if (::GetActiveWindow() != proxyContainerHWnd) { + sm_suppressFocusAndActivation = TRUE; + ::BringWindowToTop(proxyContainerHWnd); + ::SetForegroundWindow(proxyContainerHWnd); + sm_suppressFocusAndActivation = FALSE; + + if (::GetActiveWindow() != proxyContainerHWnd) { + return FALSE; // activation has been rejected + } + } + + // Focus the proxy itself + if (::GetFocus() != proxyHWnd) { + sm_suppressFocusAndActivation = TRUE; + ::SetFocus(proxyHWnd); + sm_suppressFocusAndActivation = FALSE; + + if (::GetFocus() != proxyHWnd) { + return FALSE; // focus has been rejected (that is unlikely) + } + } + + const HWND focusedWindow = AwtComponent::GetFocusedWindow(); + if (focusedWindow != GetHWnd()) { + if (focusedWindow != NULL) { + // Deactivate the old focused window + AwtWindow::SynthesizeWmActivate(FALSE, focusedWindow, GetHWnd()); + } + // Activate the new focused window. + AwtWindow::SynthesizeWmActivate(TRUE, GetHWnd(), focusedWindow); + } + return TRUE; +} + MsgRouting AwtWindow::WmActivate(UINT nState, BOOL fMinimized, HWND opposite) { jint type; if (nState != WA_INACTIVE) { - ::SetFocus((sm_focusOwner == NULL || - AwtComponent::GetTopLevelParentForWindow(sm_focusOwner) != - GetHWnd()) ? NULL : sm_focusOwner); type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS; - AwtToolkit::GetInstance(). - InvokeFunctionLater(BounceActivation, this); - sm_focusedWindow = GetHWnd(); + AwtComponent::SetFocusedWindow(GetHWnd()); } else { + // The owner is not necassarily getting WM_ACTIVATE(WA_INACTIVE). + // So, initiate retaining the actualFocusedWindow. + AwtFrame *owner = GetOwningFrameOrDialog(); + if (owner) { + owner->CheckRetainActualFocusedWindow(opposite); + } + if (m_grabbedWindow != NULL && !m_grabbedWindow->IsOneOfOwnersOf(this)) { m_grabbedWindow->Ungrab(); } type = java_awt_event_WindowEvent_WINDOW_LOST_FOCUS; - sm_focusedWindow = NULL; + AwtComponent::SetFocusedWindow(NULL); + sm_focusOwner = NULL; } SendWindowEvent(type, opposite); return mrConsume; } -void AwtWindow::BounceActivation(void *self) { - AwtWindow *wSelf = (AwtWindow *)self; - - if (::GetActiveWindow() == wSelf->GetHWnd()) { - AwtFrame *owner = wSelf->GetOwningFrameOrDialog(); - - if (owner != NULL) { - sm_suppressFocusAndActivation = TRUE; - ::SetActiveWindow(owner->GetHWnd()); - ::SetFocus(owner->GetProxyFocusOwner()); - sm_suppressFocusAndActivation = FALSE; - } - } -} - MsgRouting AwtWindow::WmCreate() { return mrDoDefault; @@ -925,17 +1620,20 @@ MsgRouting AwtWindow::WmShowWindow(BOOL show, UINT status) { /* * Original fix for 4810575. Modified for 6386592. - * If an owned window (not frame/dialog) gets disposed we should synthesize + * If a simple window gets disposed we should synthesize * WM_ACTIVATE for its nearest owner. This is not performed by default because * the owner frame/dialog is natively active. */ HWND hwndSelf = GetHWnd(); - HWND hwndParent = ::GetParent(hwndSelf); + HWND hwndOwner = ::GetParent(hwndSelf); - if (!show && IsSimpleWindow() && hwndSelf == sm_focusedWindow && - hwndParent != NULL && ::IsWindowVisible(hwndParent)) + if (!show && IsSimpleWindow() && hwndSelf == AwtComponent::GetFocusedWindow() && + hwndOwner != NULL && ::IsWindowVisible(hwndOwner)) { - ::PostMessage(hwndParent, WM_ACTIVATE, (WPARAM)WA_ACTIVE, (LPARAM)hwndSelf); + AwtFrame *owner = (AwtFrame*)AwtComponent::GetComponent(hwndOwner); + if (owner != NULL) { + owner->AwtSetActiveWindow(); + } } //Fixed 4842599: REGRESSION: JPopupMenu not Hidden Properly After Iconified and Deiconified @@ -1034,7 +1732,10 @@ MsgRouting AwtWindow::WmSizing() */ MsgRouting AwtWindow::WmSize(UINT type, int w, int h) { + currentWmSizeState = type; + if (type == SIZE_MINIMIZED) { + UpdateSecurityWarningVisibility(); return mrDoDefault; } @@ -1098,103 +1799,18 @@ MsgRouting AwtWindow::WmNcCalcSize(BOOL fCalcValidRects, if (env->EnsureLocalCapacity(2) < 0) { return mrConsume; } - jobject target = GetTarget(env); - jstring warningString = - (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID); - if (warningString != NULL) { - RECT r; - ::CopyRect(&r, &lpncsp->rgrc[0]); - retVal = static_cast<UINT>(DefWindowProc(WM_NCCALCSIZE, fCalcValidRects, - reinterpret_cast<LPARAM>(lpncsp))); - - /* Adjust non-client area for warning banner space. */ - m_warningRect.left = lpncsp->rgrc[0].left; - m_warningRect.right = lpncsp->rgrc[0].right; - m_warningRect.bottom = lpncsp->rgrc[0].bottom; - m_warningRect.top = - m_warningRect.bottom - ::GetSystemMetrics(SM_CYCAPTION); - if (GetStyle() & WS_THICKFRAME) { - m_warningRect.top -= 2; - } else { - m_warningRect.top += 2; - } - - lpncsp->rgrc[0].bottom = (m_warningRect.top >= lpncsp->rgrc[0].top) - ? m_warningRect.top - : lpncsp->rgrc[0].top; - - /* Convert to window-relative coordinates. */ - ::OffsetRect(&m_warningRect, -r.left, -r.top); - - /* Notify target of Insets change. */ - if (HasValidRect()) { - UpdateInsets(NULL); - } - - mrRetVal = mrConsume; - } else { - // WM_NCCALCSIZE is usually in response to a resize, but - // also can be triggered by SetWindowPos(SWP_FRAMECHANGED), - // which means the insets will have changed - rnk 4/7/1998 - retVal = static_cast<UINT>(DefWindowProc( - WM_NCCALCSIZE, fCalcValidRects, reinterpret_cast<LPARAM>(lpncsp))); - if (HasValidRect()) { - UpdateInsets(NULL); - } - mrRetVal = mrConsume; + // WM_NCCALCSIZE is usually in response to a resize, but + // also can be triggered by SetWindowPos(SWP_FRAMECHANGED), + // which means the insets will have changed - rnk 4/7/1998 + retVal = static_cast<UINT>(DefWindowProc( + WM_NCCALCSIZE, fCalcValidRects, reinterpret_cast<LPARAM>(lpncsp))); + if (HasValidRect()) { + UpdateInsets(NULL); } - env->DeleteLocalRef(target); - env->DeleteLocalRef(warningString); + mrRetVal = mrConsume; return mrRetVal; } -MsgRouting AwtWindow::WmNcPaint(HRGN hrgn) -{ - DefWindowProc(WM_NCPAINT, (WPARAM)hrgn, 0); - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - if (env->EnsureLocalCapacity(2) < 0) { - return mrConsume; - } - jobject target = GetTarget(env); - jstring warningString = - (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID); - if (warningString != NULL) { - RECT r; - ::CopyRect(&r, &m_warningRect); - HDC hDC = ::GetWindowDC(GetHWnd()); - DASSERT(hDC); - int iSaveDC = ::SaveDC(hDC); - VERIFY(::SelectClipRgn(hDC, NULL) != NULL); - VERIFY(::FillRect(hDC, &m_warningRect, (HBRUSH)::GetStockObject(BLACK_BRUSH))); - - if (GetStyle() & WS_THICKFRAME) { - /* draw edge */ - VERIFY(::DrawEdge(hDC, &r, EDGE_RAISED, BF_TOP)); - r.top += 2; - VERIFY(::DrawEdge(hDC, &r, EDGE_SUNKEN, BF_RECT)); - ::InflateRect(&r, -2, -2); - } - - /* draw warning text */ - LPCWSTR text = JNU_GetStringPlatformChars(env, warningString, NULL); - VERIFY(::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE)) != CLR_INVALID); - VERIFY(::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)) != CLR_INVALID); - VERIFY(::SelectObject(hDC, ::GetStockObject(DEFAULT_GUI_FONT)) != NULL); - VERIFY(::SetTextAlign(hDC, TA_LEFT | TA_BOTTOM) != GDI_ERROR); - VERIFY(::ExtTextOut(hDC, r.left+2, r.bottom-1, - ETO_CLIPPED | ETO_OPAQUE, - &r, text, static_cast<UINT>(wcslen(text)), NULL)); - VERIFY(::RestoreDC(hDC, iSaveDC)); - ::ReleaseDC(GetHWnd(), hDC); - JNU_ReleaseStringPlatformChars(env, warningString, text); - } - - env->DeleteLocalRef(target); - env->DeleteLocalRef(warningString); - return mrConsume; -} - MsgRouting AwtWindow::WmNcHitTest(UINT x, UINT y, LRESULT& retVal) { // If this window is blocked by modal dialog, return HTCLIENT for any point of it. @@ -1420,6 +2036,19 @@ void AwtWindow::SetAndActivateModalBlocker(HWND window, HWND blocker) { } } +HWND AwtWindow::GetTopmostModalBlocker(HWND window) +{ + HWND ret, blocker = NULL; + + do { + ret = blocker; + blocker = AwtWindow::GetModalBlocker(window); + window = blocker; + } while (::IsWindow(blocker)); + + return ret; +} + void AwtWindow::FlashWindowEx(HWND hWnd, UINT count, DWORD timeout, DWORD flags) { FLASHWINFO fi; fi.cbSize = sizeof(fi); @@ -1430,6 +2059,38 @@ void AwtWindow::FlashWindowEx(HWND hWnd, UINT count, DWORD timeout, DWORD flags) ::FlashWindowEx(&fi); } +jboolean +AwtWindow::_RequestWindowFocus(void *param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + RequestWindowFocusStruct *rfs = (RequestWindowFocusStruct *)param; + jobject self = rfs->component; + jboolean isMouseEventCause = rfs->isMouseEventCause; + + jboolean result = JNI_FALSE; + AwtWindow *window = NULL; + + PDATA pData; + JNI_CHECK_NULL_GOTO(self, "peer", ret); + pData = JNI_GET_PDATA(self); + if (pData == NULL) { + // do nothing just return false + goto ret; + } + + window = (AwtWindow *)pData; + if (::IsWindow(window->GetHWnd())) { + result = (jboolean)window->SendMessage(WM_AWT_WINDOW_SETACTIVE, (WPARAM)isMouseEventCause, 0); + } +ret: + env->DeleteGlobalRef(self); + + delete rfs; + + return result; +} + void AwtWindow::_ToFront(void *param) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -1839,6 +2500,216 @@ void AwtWindow::DoUpdateIcon() //Does nothing for windows, is overriden for frames and dialogs } +void AwtWindow::RedrawWindow() +{ + if (isOpaque()) { + ::RedrawWindow(GetHWnd(), NULL, NULL, + RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); + } else { + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + UpdateWindowImpl(contentWidth, contentHeight, hContentBitmap); + } + ::LeaveCriticalSection(&contentBitmapCS); + } +} + +void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque) +{ + BYTE old_opacity = getOpacity(); + BOOL old_opaque = isOpaque(); + + if (opacity == old_opacity && opaque == old_opaque) { + return; + } + + setOpacity(opacity); + setOpaque(opaque); + + HWND hwnd = GetHWnd(); + + LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE); + + if (opaque != old_opaque) { + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + hContentBitmap = NULL; + } + ::LeaveCriticalSection(&contentBitmapCS); + } + + if (opaque && opacity == 0xff) { + // Turn off all the effects + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED); + // Ask the window to repaint itself and all the children + RedrawWindow(); + } else { + // We're going to enable some effects + if (!(ex_style & WS_EX_LAYERED)) { + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED); + } else { + if ((opaque && opacity < 0xff) ^ (old_opaque && old_opacity < 0xff)) { + // _One_ of the modes uses the SetLayeredWindowAttributes. + // Need to reset the style in this case. + // If both modes are simple (i.e. just changing the opacity level), + // no need to reset the style. + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED); + ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED); + } + } + + if (opaque) { + // Simple opacity mode + ::SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), opacity, LWA_ALPHA); + } + } +} + +static HBITMAP CreateBitmapFromRaster(JNIEnv* env, jintArray raster, jint w, jint h) +{ + HBITMAP image = NULL; + if (raster != NULL) { + int* rasterBuffer = NULL; + try { + rasterBuffer = (int *)env->GetPrimitiveArrayCritical(raster, 0); + JNI_CHECK_NULL_GOTO(rasterBuffer, "raster data", done); + image = BitmapUtil::CreateBitmapFromARGBPre(w, h, w*4, rasterBuffer); + } catch (...) { + if (rasterBuffer != NULL) { + env->ReleasePrimitiveArrayCritical(raster, rasterBuffer, 0); + } + throw; + } + if (rasterBuffer != NULL) { + env->ReleasePrimitiveArrayCritical(raster, rasterBuffer, 0); + } + } +done: + return image; +} + +void AwtWindow::UpdateWindowImpl(int width, int height, HBITMAP hBitmap) +{ + if (isOpaque()) { + return; + } + + HWND hWnd = GetHWnd(); + HDC hdcDst = ::GetDC(NULL); + HDC hdcSrc = ::CreateCompatibleDC(NULL); + HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hdcSrc, hBitmap); + + //XXX: this code doesn't paint the children (say, the java.awt.Button)! + //So, if we ever want to support HWs here, we need to repaint them + //in some other way... + //::SendMessage(hWnd, WM_PRINT, (WPARAM)hdcSrc, /*PRF_CHECKVISIBLE |*/ + // PRF_CHILDREN /*| PRF_CLIENT | PRF_NONCLIENT*/); + + POINT ptSrc; + ptSrc.x = ptSrc.y = 0; + + RECT rect; + POINT ptDst; + SIZE size; + + ::GetWindowRect(hWnd, &rect); + ptDst.x = rect.left; + ptDst.y = rect.top; + size.cx = width; + size.cy = height; + + BLENDFUNCTION bf; + + bf.SourceConstantAlpha = getOpacity(); + bf.AlphaFormat = AC_SRC_ALPHA; + bf.BlendOp = AC_SRC_OVER; + bf.BlendFlags = 0; + + ::UpdateLayeredWindow(hWnd, hdcDst, &ptDst, &size, hdcSrc, &ptSrc, + RGB(0, 0, 0), &bf, ULW_ALPHA); + + ::ReleaseDC(NULL, hdcDst); + ::SelectObject(hdcSrc, hOldBitmap); + ::DeleteDC(hdcSrc); +} + +void AwtWindow::UpdateWindow(JNIEnv* env, jintArray data, int width, int height, + HBITMAP hNewBitmap) +{ + if (isOpaque()) { + return; + } + + HBITMAP hBitmap; + if (hNewBitmap == NULL) { + if (data == NULL) { + return; + } + hBitmap = CreateBitmapFromRaster(env, data, width, height); + if (hBitmap == NULL) { + return; + } + } else { + hBitmap = hNewBitmap; + } + + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + } + hContentBitmap = hBitmap; + contentWidth = width; + contentHeight = height; + UpdateWindowImpl(width, height, hBitmap); + ::LeaveCriticalSection(&contentBitmapCS); +} + +void AwtWindow::FillBackground(HDC hMemoryDC, SIZE &size) +{ + if (isOpaque()) { + AwtCanvas::FillBackground(hMemoryDC, size); + } +} + +void AwtWindow::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha) +{ + if (isOpaque()) { + AwtCanvas::FillAlpha(bitmapBits, size, alpha); + } +} + +/* + * Fixed 6353381: it's improved fix for 4792958 + * which was backed-out to avoid 5059656 + */ +BOOL AwtWindow::HasValidRect() +{ + RECT inside; + RECT outside; + + if (::IsIconic(GetHWnd())) { + return FALSE; + } + + ::GetClientRect(GetHWnd(), &inside); + ::GetWindowRect(GetHWnd(), &outside); + + BOOL isZeroClientArea = (inside.right == 0 && inside.bottom == 0); + BOOL isInvalidLocation = ((outside.left == -32000 && outside.top == -32000) || // Win2k && WinXP + (outside.left == 32000 && outside.top == 32000) || // Win95 && Win98 + (outside.left == 3000 && outside.top == 3000)); // Win95 && Win98 + + // the bounds correspond to iconic state + if (isZeroClientArea && isInvalidLocation) + { + return FALSE; + } + + return TRUE; +} + + void AwtWindow::_SetIconImagesData(void * param) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -1940,11 +2811,14 @@ void AwtWindow::_SetFocusableWindow(void *param) window->m_isFocusableWindow = isFocusableWindow; - if (!window->m_isFocusableWindow) { - LONG isPopup = window->GetStyle() & WS_POPUP; - window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE); - } else { - window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE); + // A simple window is permanently set to WS_EX_NOACTIVATE + if (!window->IsSimpleWindow()) { + if (!window->m_isFocusableWindow) { + LONG isPopup = window->GetStyle() & WS_POPUP; + window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | WS_EX_NOACTIVATE); + } else { + window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~WS_EX_NOACTIVATE); + } } ret: @@ -2009,36 +2883,68 @@ void AwtWindow::_ModalEnable(void *param) env->DeleteGlobalRef(self); } -/* - * Fixed 6353381: it's improved fix for 4792958 - * which was backed-out to avoid 5059656 - */ -BOOL AwtWindow::HasValidRect() +void AwtWindow::_SetOpacity(void* param) { - RECT inside; - RECT outside; + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - if (::IsIconic(GetHWnd())) { - return FALSE; - } + OpacityStruct *os = (OpacityStruct *)param; + jobject self = os->window; + BYTE iOpacity = (BYTE)os->iOpacity; - ::GetClientRect(GetHWnd(), &inside); - ::GetWindowRect(GetHWnd(), &outside); + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; - BOOL isZeroClientArea = (inside.right == 0 && inside.bottom == 0); - BOOL isInvalidLocation = ((outside.left == -32000 && outside.top == -32000) || // Win2k && WinXP - (outside.left == 32000 && outside.top == 32000) || // Win95 && Win98 - (outside.left == 3000 && outside.top == 3000)); // Win95 && Win98 + window->SetTranslucency(iOpacity, window->isOpaque()); - // the bounds correspond to iconic state - if (isZeroClientArea && isInvalidLocation) - { - return FALSE; - } + ret: + env->DeleteGlobalRef(self); + delete os; +} - return TRUE; +void AwtWindow::_SetOpaque(void* param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + OpaqueStruct *os = (OpaqueStruct *)param; + jobject self = os->window; + BOOL isOpaque = (BOOL)os->isOpaque; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; + + window->SetTranslucency(window->getOpacity(), isOpaque); + + ret: + env->DeleteGlobalRef(self); + delete os; +} + +void AwtWindow::_UpdateWindow(void* param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + UpdateWindowStruct *uws = (UpdateWindowStruct *)param; + jobject self = uws->window; + jintArray data = uws->data; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + AwtWindow *window = (AwtWindow *)pData; + + window->UpdateWindow(env, data, (int)uws->width, (int)uws->height, + uws->hBitmap); + + ret: + env->DeleteGlobalRef(self); + if (data != NULL) { + env->DeleteGlobalRef(data); + } + delete uws; } + extern "C" { /* @@ -2055,8 +2961,16 @@ Java_java_awt_Window_initIDs(JNIEnv *env, jclass cls) env->GetFieldID(cls, "warningString", "Ljava/lang/String;"); AwtWindow::locationByPlatformID = env->GetFieldID(cls, "locationByPlatform", "Z"); + AwtWindow::securityWarningWidthID = + env->GetFieldID(cls, "securityWarningWidth", "I"); + AwtWindow::securityWarningHeightID = + env->GetFieldID(cls, "securityWarningHeight", "I"); + AwtWindow::getWarningStringMID = + env->GetMethodID(cls, "getWarningString", "()Ljava/lang/String;"); AwtWindow::autoRequestFocusID = env->GetFieldID(cls, "autoRequestFocus", "Z"); + AwtWindow::calculateSecurityWarningPositionMID = + env->GetMethodID(cls, "calculateSecurityWarningPosition", "(DDDD)Ljava/awt/geom/Point2D;"); CATCH_BAD_ALLOC; } @@ -2489,4 +3403,138 @@ Java_sun_awt_windows_WWindowPeer_nativeUngrab(JNIEnv *env, jobject self) CATCH_BAD_ALLOC; } +/* + * Class: sun_awt_windows_WWindowPeer + * Method: setOpacity + * Signature: (I)V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_setOpacity(JNIEnv *env, jobject self, + jint iOpacity) +{ + TRY; + + OpacityStruct *os = new OpacityStruct; + os->window = env->NewGlobalRef(self); + os->iOpacity = iOpacity; + + AwtToolkit::GetInstance().SyncCall(AwtWindow::_SetOpacity, os); + // global refs and mds are deleted in _SetMinSize + + CATCH_BAD_ALLOC; +} + +/* + * Class: sun_awt_windows_WWindowPeer + * Method: setOpaqueImpl + * Signature: (Z)V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_setOpaqueImpl(JNIEnv *env, jobject self, + jboolean isOpaque) +{ + TRY; + + OpaqueStruct *os = new OpaqueStruct; + os->window = env->NewGlobalRef(self); + os->isOpaque = isOpaque; + + AwtToolkit::GetInstance().SyncCall(AwtWindow::_SetOpaque, os); + // global refs and mds are deleted in _SetMinSize + + CATCH_BAD_ALLOC; +} + +/* + * Class: sun_awt_windows_WWindowPeer + * Method: updateWindowImpl + * Signature: ([III)V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_updateWindowImpl(JNIEnv *env, jobject self, + jintArray data, + jint width, jint height) +{ + TRY; + + UpdateWindowStruct *uws = new UpdateWindowStruct; + uws->window = env->NewGlobalRef(self); + uws->data = (jintArray)env->NewGlobalRef(data); + uws->hBitmap = NULL; + uws->width = width; + uws->height = height; + + AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws); + // global refs and mds are deleted in _UpdateWindow + + CATCH_BAD_ALLOC; +} + +/** + * This method is called from the WGL pipeline when it needs to update + * the layered window WindowPeer's C++ level object. + */ +void AwtWindow_UpdateWindow(JNIEnv *env, jobject peer, + jint width, jint height, HBITMAP hBitmap) +{ + TRY; + + UpdateWindowStruct *uws = new UpdateWindowStruct; + uws->window = env->NewGlobalRef(peer); + uws->data = NULL; + uws->hBitmap = hBitmap; + uws->width = width; + uws->height = height; + + AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws); + // global refs and mds are deleted in _UpdateWindow + + CATCH_BAD_ALLOC; +} + +/* + * Class: sun_awt_windows_WComponentPeer + * Method: requestFocus + * Signature: (Z)Z + */ +JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WWindowPeer_requestWindowFocus + (JNIEnv *env, jobject self, jboolean isMouseEventCause) +{ + TRY; + + jobject selfGlobalRef = env->NewGlobalRef(self); + + RequestWindowFocusStruct *rfs = new RequestWindowFocusStruct; + rfs->component = selfGlobalRef; + rfs->isMouseEventCause = isMouseEventCause; + + return (jboolean)AwtToolkit::GetInstance().SyncCall( + (void*(*)(void*))AwtWindow::_RequestWindowFocus, rfs); + // global refs and rfs are deleted in _RequestWindowFocus + + CATCH_BAD_ALLOC_RET(JNI_FALSE); +} + +/* + * Class: sun_awt_windows_WWindowPeer + * Method: repositionSecurityWarning + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_sun_awt_windows_WWindowPeer_repositionSecurityWarning(JNIEnv *env, + jobject self) +{ + TRY; + + RepositionSecurityWarningStruct *rsws = + new RepositionSecurityWarningStruct; + rsws->window = env->NewGlobalRef(self); + + AwtToolkit::GetInstance().InvokeFunction( + AwtWindow::_RepositionSecurityWarning, rsws); + // global refs and mds are deleted in _RepositionSecurityWarning + + CATCH_BAD_ALLOC; +} + } /* extern "C" */ diff --git a/src/windows/native/sun/windows/awt_Window.h b/src/windows/native/sun/windows/awt_Window.h index 9a252a25ce1289c0af9bb8166a01ca070dc66fee..bf43150a7e8d6dd47255325706c38ec124dca9fe 100644 --- a/src/windows/native/sun/windows/awt_Window.h +++ b/src/windows/native/sun/windows/awt_Window.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -34,14 +34,12 @@ // property name tagging windows disabled by modality static LPCTSTR ModalBlockerProp = TEXT("SunAwtModalBlockerProp"); static LPCTSTR ModalDialogPeerProp = TEXT("SunAwtModalDialogPeerProp"); +static LPCTSTR NativeDialogWndProcProp = TEXT("SunAwtNativeDialogWndProcProp"); #ifndef WH_MOUSE_LL #define WH_MOUSE_LL 14 #endif -// WS_EX_NOACTIVATE is not defined in the headers we build with -#define AWT_WS_EX_NOACTIVATE 0x08000000L - class AwtFrame; /************************************************************************ @@ -56,6 +54,8 @@ public: static jfieldID locationByPlatformID; static jfieldID screenID; /* screen number passed over from WindowPeer */ static jfieldID autoRequestFocusID; + static jfieldID securityWarningWidthID; + static jfieldID securityWarningHeightID; // The coordinates at the peer. static jfieldID sysXID; @@ -63,6 +63,9 @@ public: static jfieldID sysWID; static jfieldID sysHID; + static jmethodID getWarningStringMID; + static jmethodID calculateSecurityWarningPositionMID; + AwtWindow(); virtual ~AwtWindow(); @@ -152,11 +155,12 @@ public: static void SetModalBlocker(HWND window, HWND blocker); static void SetAndActivateModalBlocker(HWND window, HWND blocker); + static HWND GetTopmostModalBlocker(HWND window); + /* * Windows message handler functions */ virtual MsgRouting WmActivate(UINT nState, BOOL fMinimized, HWND opposite); - static void BounceActivation(void *self); // used by WmActivate virtual MsgRouting WmCreate(); virtual MsgRouting WmClose(); virtual MsgRouting WmDestroy(); @@ -169,19 +173,36 @@ public: virtual MsgRouting WmSettingChange(UINT wFlag, LPCTSTR pszSection); virtual MsgRouting WmNcCalcSize(BOOL fCalcValidRects, LPNCCALCSIZE_PARAMS lpncsp, LRESULT& retVal); - virtual MsgRouting WmNcPaint(HRGN hrgn); virtual MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT& retVal); virtual MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button); virtual MsgRouting WmGetIcon(WPARAM iconType, LRESULT& retVal); virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); virtual MsgRouting WmWindowPosChanging(LPARAM windowPos); virtual MsgRouting WmWindowPosChanged(LPARAM windowPos); + virtual MsgRouting WmTimer(UINT_PTR timerID); virtual MsgRouting HandleEvent(MSG *msg, BOOL synthetic); virtual void WindowResized(); + static jboolean _RequestWindowFocus(void *param); + + virtual BOOL AwtSetActiveWindow(BOOL isMouseEventCause = FALSE, UINT hittest = HTCLIENT); + + // Execute on Toolkit only. + INLINE static LRESULT SynthesizeWmActivate(BOOL doActivate, HWND targetHWnd, HWND oppositeHWnd) { + if (::IsWindowVisible(targetHWnd)) { + return ::SendMessage(targetHWnd, WM_ACTIVATE, + MAKEWPARAM(doActivate ? WA_ACTIVE : WA_INACTIVE, FALSE), + (LPARAM) oppositeHWnd); + } + return 1; // if not processed + } + void moveToDefaultLocation(); /* moves Window to X,Y specified by Window Manger */ + void UpdateWindow(JNIEnv* env, jintArray data, int width, int height, + HBITMAP hNewBitmap = NULL); + INLINE virtual BOOL IsTopLevel() { return TRUE; } static AwtWindow * GetGrabbedWindow() { return m_grabbedWindow; } @@ -204,11 +225,25 @@ public: static void _SetModalExcludedNativeProp(void *param); static void _ModalDisable(void *param); static void _ModalEnable(void *param); + static void _SetOpacity(void* param); + static void _SetOpaque(void* param); + static void _UpdateWindow(void* param); + static void _RepositionSecurityWarning(void* param); inline static BOOL IsResizing() { return sm_resizing; } + virtual void CreateHWnd(JNIEnv *env, LPCWSTR title, + DWORD windowStyle, DWORD windowExStyle, + int x, int y, int w, int h, + HWND hWndParent, HMENU hMenu, + COLORREF colorForeground, COLORREF colorBackground, + jobject peer); + virtual void DestroyHWnd(); + + static void FocusedWindowChanged(HWND from, HWND to); + private: static int ms_instanceCounter; static HHOOK ms_hCBTFilter; @@ -228,6 +263,79 @@ private: // from its hierarchy when shown. Currently applied to instances of // javax/swing/Popup$HeavyWeightWindow class. + BYTE m_opacity; // The opacity level. == 0xff by default (when opacity mode is disabled) + BOOL m_opaque; // Whether the window uses the perpixel translucency (false), or not (true). + + inline BYTE getOpacity() { + return m_opacity; + } + inline void setOpacity(BYTE opacity) { + m_opacity = opacity; + } + + inline BOOL isOpaque() { + return m_opaque; + } + inline void setOpaque(BOOL opaque) { + m_opaque = opaque; + } + + CRITICAL_SECTION contentBitmapCS; + HBITMAP hContentBitmap; + UINT contentWidth; + UINT contentHeight; + + void SetTranslucency(BYTE opacity, BOOL opaque); + void UpdateWindow(int width, int height, HBITMAP hBitmap); + void UpdateWindowImpl(int width, int height, HBITMAP hBitmap); + void RedrawWindow(); + + static UINT untrustedWindowsCounter; + + WCHAR * warningString; + + // The warning icon + HWND warningWindow; + // The tooltip that appears when hovering the icon + HWND securityTooltipWindow; + + UINT warningWindowWidth; + UINT warningWindowHeight; + void InitSecurityWarningSize(JNIEnv *env); + HICON GetSecurityWarningIcon(); + + void CreateWarningWindow(JNIEnv *env); + void DestroyWarningWindow(); + static LPCTSTR GetWarningWindowClassName(); + void FillWarningWindowClassInfo(WNDCLASS *lpwc); + void RegisterWarningWindowClass(); + void UnregisterWarningWindowClass(); + static LRESULT CALLBACK WarningWindowProc( + HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + + static void PaintWarningWindow(HWND warningWindow); + static void PaintWarningWindow(HWND warningWindow, HDC hdc); + void RepaintWarningWindow(); + void CalculateWarningWindowBounds(JNIEnv *env, LPRECT rect); + + void AnimateSecurityWarning(bool enable); + UINT securityWarningAnimationStage; + + enum AnimationKind { + akNone, akShow, akPreHide, akHide + }; + + AnimationKind securityAnimationKind; + + void StartSecurityAnimation(AnimationKind kind); + void StopSecurityAnimation(); + + void RepositionSecurityWarning(JNIEnv *env); + +public: + void UpdateSecurityWarningVisibility(); + static bool IsWarningWindow(HWND hWnd); + protected: BOOL m_isResizable; static AwtWindow* m_grabbedWindow; // Current grabbing window @@ -236,6 +344,16 @@ protected: BOOL m_iconInherited; /* TRUE if icon is inherited from the owner */ BOOL m_filterFocusAndActivation; /* Used in the WH_CBT hook */ + //These are used in AwtComponent::CreatePrintedPixels. They are overridden + //here to handle non-opaque windows. + virtual void FillBackground(HDC hMemoryDC, SIZE &size); + virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha); + + inline BOOL IsUntrusted() { + return warningString != NULL; + } + + UINT currentWmSizeState; private: int m_screenNum; diff --git a/src/windows/native/sun/windows/awtmsg.h b/src/windows/native/sun/windows/awtmsg.h index 35e436b53e787e708efb0a5c6eddf6ad20270801..8c08062190781feef8570d5f72aa217c3ad2e7d2 100644 --- a/src/windows/native/sun/windows/awtmsg.h +++ b/src/windows/native/sun/windows/awtmsg.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-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 @@ -194,6 +194,7 @@ enum { WM_AWT_COMPONENT_SHOW, WM_AWT_COMPONENT_HIDE, WM_AWT_COMPONENT_SETFOCUS, + WM_AWT_WINDOW_SETACTIVE, WM_AWT_LIST_SETMULTISELECT, WM_AWT_HANDLE_EVENT, WM_AWT_PRINT_COMPONENT, diff --git a/src/windows/native/sun/windows/security_warning.ico b/src/windows/native/sun/windows/security_warning.ico new file mode 100644 index 0000000000000000000000000000000000000000..67793ed82648ad9f6f9164075ecbd60e1555da51 Binary files /dev/null and b/src/windows/native/sun/windows/security_warning.ico differ diff --git a/src/windows/native/sun/windows/security_warning_bw.ico b/src/windows/native/sun/windows/security_warning_bw.ico new file mode 100644 index 0000000000000000000000000000000000000000..68a1824a2f529c830407f433863b101338c8478d Binary files /dev/null and b/src/windows/native/sun/windows/security_warning_bw.ico differ diff --git a/src/windows/native/sun/windows/security_warning_int.ico b/src/windows/native/sun/windows/security_warning_int.ico new file mode 100644 index 0000000000000000000000000000000000000000..d773dca9e643c9916849428fc601ed4f856cee6b Binary files /dev/null and b/src/windows/native/sun/windows/security_warning_int.ico differ diff --git a/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java b/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java new file mode 100644 index 0000000000000000000000000000000000000000..96f8f14ad467d8d459d39d3ca068d983732af596 --- /dev/null +++ b/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java @@ -0,0 +1,392 @@ +/* + * 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 %W% %E% + @bug 6818312 + @summary The size returned by SecurityWarning.getSize() should not be zero + @author anthony.petrov@sun.com: area=awt.toplevel + @library ../../../../java/awt/regtesthelpers + @build Util + @run main GetSizeShouldNotReturnZero +*/ + +/** + * GetSizeShouldNotReturnZero.java + * + * summary: The size returned by SecurityWarning.getSize() should not be zero + */ + +import java.awt.*; +import java.awt.event.*; +import java.security.Permission; +import test.java.awt.regtesthelpers.Util; +import com.sun.awt.SecurityWarning; + +public class GetSizeShouldNotReturnZero +{ + private static void init() + { + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + + // Install the security manager so that all subsequently created + // windows display the security warning. + System.setSecurityManager(new SecurityManager() { + + @Override + public void checkPermission(Permission perm) { + } + + @Override + public boolean checkTopLevelWindow(Object window) { + return false; + } + }); + + Frame f = new Frame(); + f.setSize(100, 100); + f.setVisible(true); + + Robot robot = Util.createRobot(); + Util.waitForIdle(robot); + + Dimension size = SecurityWarning.getSize(f); + if (size.width == 0 || size.height == 0) { + fail("Reported security warning size: " + size); + return; + } + pass(); + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class GetSizeShouldNotReturnZero + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + GetSizeShouldNotReturnZero.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + GetSizeShouldNotReturnZero.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class + + diff --git a/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java b/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java new file mode 100644 index 0000000000000000000000000000000000000000..08cbe4069a3fa3ed9d1ce8b93940a63a06dfa658 --- /dev/null +++ b/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java @@ -0,0 +1,103 @@ +/* + * Copyright 2008-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 %I% %E% + * @bug 6683728 + * @summary Tests that a JApplet in a translucent JFrame works properly + * @author Kenneth.Russell@sun.com: area=Graphics + * @compile -XDignore.symbol.file=true TranslucentJAppletTest.java + * @run main/manual/othervm TranslucentJAppletTest + */ + +import java.awt.*; +import java.awt.image.*; + +import javax.swing.*; + +public class TranslucentJAppletTest { + + private static JFrame frame; + private static volatile boolean paintComponentCalled = false; + + private static void initAndShowGUI() { + frame = new JFrame(); + JApplet applet = new JApplet(); + JPanel panel = new JPanel() { + protected void paintComponent(Graphics g) { + paintComponentCalled = true; + g.setColor(Color.RED); + g.fillOval(0, 0, getWidth(), getHeight()); + } + }; + panel.setDoubleBuffered(false); + panel.setOpaque(false); + applet.add(panel); + frame.add(applet); + frame.setBounds(100, 100, 200, 200); + frame.setUndecorated(true); + com.sun.awt.AWTUtilities.setWindowOpaque(frame, false); + frame.setVisible(true); + } + + public static void main(String[] args) + throws Exception + { + sun.awt.SunToolkit tk = (sun.awt.SunToolkit)Toolkit.getDefaultToolkit(); + + Robot r = new Robot(); + Color color1 = r.getPixelColor(100, 100); // (0, 0) in frame coordinates + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + initAndShowGUI(); + } + }); + tk.realSync(); + + if (!paintComponentCalled) { + throw new RuntimeException("Test FAILED: panel's paintComponent() method is not called"); + } + + Color newColor1 = r.getPixelColor(100, 100); + // unfortunately, robot.getPixelColor() doesn't work for some unknown reason + // Color newColor2 = r.getPixelColor(200, 200); + BufferedImage bim = r.createScreenCapture(new Rectangle(200, 200, 1, 1)); + Color newColor2 = new Color(bim.getRGB(0, 0)); + + // Frame must be transparent at (100, 100) in screen coords + if (!color1.equals(newColor1)) { + System.err.println("color1 = " + color1); + System.err.println("newColor1 = " + newColor1); + throw new RuntimeException("Test FAILED: frame pixel at (0, 0) is not transparent"); + } + + // Frame must be RED at (200, 200) in screen coords + if (!newColor2.equals(Color.RED)) { + System.err.println("newColor2 = " + newColor2); + throw new RuntimeException("Test FAILED: frame pixel at (100, 100) is not red (transparent?)"); + } + + System.out.println("Test PASSED"); + } +} diff --git a/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java b/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java new file mode 100644 index 0000000000000000000000000000000000000000..1e9cf74658e07cdd3b3f2c967d69774c40356722 --- /dev/null +++ b/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java @@ -0,0 +1,306 @@ +/* + * Copyright 2008-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 com.sun.awt.AWTUtilities; +import static com.sun.awt.AWTUtilities.Translucency.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.RenderingHints; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.Canvas; +import java.awt.Component; +import java.awt.GradientPaint; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.util.Random; +import java.awt.geom.Ellipse2D; +import javax.swing.JApplet; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class TSFrame { + + static volatile boolean done = false; + + static final boolean useSwing = System.getProperty("useswing") != null; + static final boolean useShape = System.getProperty("useshape") != null; + static final boolean useTransl = System.getProperty("usetransl") != null; + static final boolean useNonOpaque = System.getProperty("usenonop") != null; + + static final Random rnd = new Random(); + private static void render(Graphics g, int w, int h, boolean useNonOpaque) { + if (useNonOpaque) { + Graphics2D g2d = (Graphics2D)g; + GradientPaint p = + new GradientPaint(0.0f, 0.0f, + new Color(rnd.nextInt(0xffffff)), + w, h, + new Color(rnd.nextInt(0xff), + rnd.nextInt(0xff), + rnd.nextInt(0xff), 0), + true); + g2d.setPaint(p); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g2d.fillOval(0, 0, w, h); + } else { + g.setColor(new Color(rnd.nextInt(0xffffff))); + g.fillRect(0, 0, w, h); + } + } + + private static class MyCanvas extends Canvas { + @Override + public void paint(Graphics g) { + render(g, getWidth(), getHeight(), false); + } + @Override + public Dimension getPreferredSize() { + return new Dimension(200, 100); + } + } + private static class NonOpaqueJFrame extends JFrame { + NonOpaqueJFrame(GraphicsConfiguration gc) { + super("NonOpaque Swing JFrame", gc); + JPanel p = new JPanel() { + public void paintComponent(Graphics g) { + super.paintComponent(g); + render(g, getWidth(), getHeight(), true); + g.setColor(Color.red); + g.drawString("Non-Opaque Swing JFrame", 10, 15); + } + }; + p.setDoubleBuffered(false); + p.setOpaque(false); + add(p); + setUndecorated(true); + } + } + private static class NonOpaqueJAppletFrame extends JFrame { + JPanel p; + NonOpaqueJAppletFrame(GraphicsConfiguration gc) { + super("NonOpaque Swing JAppletFrame", gc); + JApplet ja = new JApplet() { + public void paint(Graphics g) { + super.paint(g); + System.err.println("JAppletFrame paint called"); + } + }; + p = new JPanel() { + public void paintComponent(Graphics g) { + super.paintComponent(g); + render(g, getWidth(), getHeight(), true); + g.setColor(Color.red); + g.drawString("Non-Opaque Swing JFrame", 10, 15); + } + }; + p.setDoubleBuffered(false); + p.setOpaque(false); + ja.add(p); + add(ja); + setUndecorated(true); + } + } + private static class NonOpaqueFrame extends Frame { + NonOpaqueFrame(GraphicsConfiguration gc) { + super("NonOpaque AWT Frame", gc); + // uncomment to test with hw child +// setLayout(null); +// Component c = new Panel() { +// public void paint(Graphics g) { +// g.setColor(new Color(1.0f, 1.0f, 1.0f, 0.5f)); +// g.fillRect(0, 0, getWidth(), getHeight()); +// } +// }; +// c.setSize(100, 100); +// c.setBackground(Color.red); +// c.setForeground(Color.red); +// add(c); +// c.setLocation(130, 130); + } + @Override + public void paint(Graphics g) { + render(g, getWidth(), getHeight(), true); + g.setColor(Color.red); + g.drawString("Non-Opaque AWT Frame", 10, 15); + } + } + + private static class MyJPanel extends JPanel { + @Override + public void paintComponent(Graphics g) { + render(g, getWidth(), getHeight(), false); + } + } + + public static Frame createGui(GraphicsConfiguration gc, + final boolean useSwing, + final boolean useShape, + final boolean useTransl, + final boolean useNonOpaque, + final float factor) + { + Frame frame; + done = false; + + if (gc == null) { + gc = GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice().getDefaultConfiguration(); + } + + if (useNonOpaque) { + if (useSwing) { + frame = new NonOpaqueJFrame(gc); +// frame = new NonOpaqueJAppletFrame(gc); + } else { + frame = new NonOpaqueFrame(gc); + } + animateComponent(frame); + } else if (useSwing) { + frame = new JFrame("Swing Frame", gc); + JComponent p = new JButton("Swing!"); + p.setPreferredSize(new Dimension(200, 100)); + frame.add("North", p); + p = new MyJPanel(); + animateComponent(p); + frame.add("Center", p); + } else { + frame = new Frame("AWT Frame", gc) { + public void paint(Graphics g) { + g.setColor(Color.red); + g.fillRect(0, 0, 100, 100); + } + }; + frame.setLayout(new BorderLayout()); + Canvas c = new MyCanvas(); + frame.add("North", c); + animateComponent(c); + c = new MyCanvas(); + frame.add("Center", c); + animateComponent(c); + c = new MyCanvas(); + frame.add("South", c); + animateComponent(c); + } + final Frame finalFrame = frame; + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + finalFrame.dispose(); + done = true; + } + }); + frame.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + finalFrame.dispose(); + done = true; + } + }); + frame.setPreferredSize(new Dimension(800, 600)); + + if (useShape) { + frame.setUndecorated(true); + } + + frame.setLocation(450, 10); + frame.pack(); + + if (useShape) { + if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSPARENT)) { + System.out.println("applying PERPIXEL_TRANSPARENT"); + AWTUtilities.setWindowShape(frame, + new Ellipse2D.Double(0, 0, frame.getWidth(), + frame.getHeight()/3)); + frame.setTitle("PERPIXEL_TRANSPARENT"); + } else { + System.out.println("Passed: PERPIXEL_TRANSPARENT unsupported"); + } + } + if (useTransl) { + if (AWTUtilities.isTranslucencySupported(TRANSLUCENT)) { + System.out.println("applying TRANSLUCENT"); + AWTUtilities.setWindowOpacity(frame, factor); + frame.setTitle("TRANSLUCENT"); + } else { + System.out.println("Passed: TRANSLUCENT unsupported"); + } + } + if (useNonOpaque) { + if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSLUCENT) && + AWTUtilities.isTranslucencyCapable(gc)) + { + System.out.println("applying PERPIXEL_TRANSLUCENT"); + AWTUtilities.setWindowOpaque(frame, false); + frame.setTitle("PERPIXEL_TRANSLUCENT"); + } else { + System.out.println("Passed: PERPIXEL_TRANSLUCENT unsupported"); + } + } + frame.setVisible(true); + return frame; + } + + public static void stopThreads() { + done = true; + } + + private static void animateComponent(final Component comp) { + Thread t = new Thread(new Runnable() { + public void run() { + do { + try { + Thread.sleep(50); + } catch (InterruptedException ex) {} + comp.repaint(); + } while (!done); + } + }); + t.start(); + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + TSFrame.createGui(null, useSwing, + useShape, + useTransl, + useNonOpaque, + 0.7f); + } + }); + } +} diff --git a/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form b/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form new file mode 100644 index 0000000000000000000000000000000000000000..4291e0eeaac0f55d3bc8da1c10531ab47e5c8c6b --- /dev/null +++ b/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.3" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> + <NonVisualComponents> + <Component class="javax.swing.ButtonGroup" name="createDisposeGrp"> + </Component> + </NonVisualComponents> + <Properties> + <Property name="defaultCloseOperation" type="int" value="3"/> + <Property name="title" type="java.lang.String" value="TranslucentShapedFrameTest"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + </AuxValues> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" attributes="0"> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <Component id="transparencySld" pref="375" max="32767" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + </Group> + <Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/> + <Group type="102" alignment="0" attributes="0"> + <Component id="shapedCb" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="nonOpaqueChb" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="useSwingCb" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="102" max="32767" attributes="0"/> + </Group> + <Group type="102" alignment="0" attributes="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <Component id="jLabel2" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="314" max="-2" attributes="0"/> + </Group> + <Group type="102" alignment="0" attributes="0"> + <Component id="passedBtn" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="failedBtn" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="241" max="-2" attributes="0"/> + </Group> + <Component id="jScrollPane1" alignment="1" pref="375" max="32767" attributes="0"/> + <Group type="102" alignment="0" attributes="0"> + <Component id="createFrameBtn" min="-2" pref="187" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="disposeFrameBtn" min="-2" pref="182" max="-2" attributes="0"/> + </Group> + </Group> + <EmptySpace max="-2" attributes="0"/> + </Group> + </Group> + </Group> + </Group> + </DimensionLayout> + <DimensionLayout dim="1"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace max="-2" attributes="0"/> + <Component id="jLabel1" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="transparencySld" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="3" attributes="0"> + <Component id="shapedCb" alignment="3" min="-2" max="-2" attributes="0"/> + <Component id="nonOpaqueChb" alignment="3" min="-2" max="-2" attributes="0"/> + <Component id="useSwingCb" alignment="3" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="3" attributes="0"> + <Component id="disposeFrameBtn" alignment="3" min="-2" max="-2" attributes="0"/> + <Component id="createFrameBtn" alignment="3" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace min="-2" pref="17" max="-2" attributes="0"/> + <Component id="jLabel2" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="jScrollPane1" min="-2" pref="148" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="3" attributes="0"> + <Component id="passedBtn" alignment="3" min="-2" max="-2" attributes="0"/> + <Component id="failedBtn" alignment="3" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="jLabel1"> + <Properties> + <Property name="text" type="java.lang.String" value="Frame Opacity:"/> + </Properties> + </Component> + <Component class="javax.swing.JSlider" name="transparencySld"> + <Properties> + <Property name="majorTickSpacing" type="int" value="10"/> + <Property name="minorTickSpacing" type="int" value="5"/> + <Property name="paintLabels" type="boolean" value="true"/> + <Property name="paintTicks" type="boolean" value="true"/> + <Property name="value" type="int" value="100"/> + </Properties> + <Events> + <EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="transparencySldStateChanged"/> + </Events> + </Component> + <Component class="javax.swing.JCheckBox" name="shapedCb"> + <Properties> + <Property name="text" type="java.lang.String" value="Shaped Frame"/> + <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> + <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo"> + <EmptyBorder bottom="0" left="0" right="0" top="0"/> + </Border> + </Property> + <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor"> + <Insets value="[0, 0, 0, 0]"/> + </Property> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="shapedCbActionPerformed"/> + </Events> + </Component> + <Component class="javax.swing.JCheckBox" name="nonOpaqueChb"> + <Properties> + <Property name="text" type="java.lang.String" value="Non Opaque Frame"/> + <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> + <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo"> + <EmptyBorder bottom="0" left="0" right="0" top="0"/> + </Border> + </Property> + <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor"> + <Insets value="[0, 0, 0, 0]"/> + </Property> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nonOpaqueChbActionPerformed"/> + </Events> + </Component> + <Container class="javax.swing.JScrollPane" name="jScrollPane1"> + <AuxValues> + <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> + <SubComponents> + <Component class="javax.swing.JTextArea" name="jTextArea1"> + <Properties> + <Property name="columns" type="int" value="20"/> + <Property name="rows" type="int" value="5"/> + <Property name="text" type="java.lang.String" value="Create translucent and/or shaped, or non-opaque frame. Make sure it behaves correctly (no artifacts left on the screen when dragging - if dragging is possible). Click "Passed" if the test behaves correctly, "Falied" otherwise."/> + </Properties> + </Component> + </SubComponents> + </Container> + <Component class="javax.swing.JLabel" name="jLabel2"> + <Properties> + <Property name="text" type="java.lang.String" value="Instructions:"/> + </Properties> + </Component> + <Component class="javax.swing.JButton" name="passedBtn"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="64" green="ff" red="81" type="rgb"/> + </Property> + <Property name="text" type="java.lang.String" value="Passed"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="passedBtnActionPerformed"/> + </Events> + </Component> + <Component class="javax.swing.JButton" name="failedBtn"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="0" green="0" id="red" palette="1" red="ff" type="palette"/> + </Property> + <Property name="text" type="java.lang.String" value="Failed"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="failedBtnActionPerformed"/> + </Events> + </Component> + <Component class="javax.swing.JToggleButton" name="createFrameBtn"> + <Properties> + <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> + <ComponentRef name="createDisposeGrp"/> + </Property> + <Property name="text" type="java.lang.String" value="Create Frame"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="createFrameBtnActionPerformed"/> + </Events> + </Component> + <Component class="javax.swing.JToggleButton" name="disposeFrameBtn"> + <Properties> + <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> + <ComponentRef name="createDisposeGrp"/> + </Property> + <Property name="selected" type="boolean" value="true"/> + <Property name="text" type="java.lang.String" value="Dispose Frame"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="disposeFrameBtnActionPerformed"/> + </Events> + </Component> + <Component class="javax.swing.JCheckBox" name="useSwingCb"> + <Properties> + <Property name="text" type="java.lang.String" value="Use JFrame"/> + <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> + <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo"> + <EmptyBorder bottom="0" left="0" right="0" top="0"/> + </Border> + </Property> + <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor"> + <Insets value="[0, 0, 0, 0]"/> + </Property> + </Properties> + </Component> + </SubComponents> +</Form> diff --git a/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java b/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java new file mode 100644 index 0000000000000000000000000000000000000000..edb58ff67b85022d95e51ad627944d951c85d75d --- /dev/null +++ b/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java @@ -0,0 +1,359 @@ +/* + * Copyright 2008-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. + */ + +/* + * @test %I% %E% + * @bug 6655001 6670649 6687141 + * @summary Tests that hw acceleration doesn't affect translucent/shaped windows + * @author Dmitri.Trembovetski@sun.com: area=Graphics + * @compile -XDignore.symbol.file=true TranslucentShapedFrameTest.java + * @compile -XDignore.symbol.file=true TSFrame.java + * @run main/manual/othervm TranslucentShapedFrameTest + * @run main/manual/othervm -Dsun.java2d.noddraw=true TranslucentShapedFrameTest + * @run main/manual/othervm -Dsun.java2d.opengl=True TranslucentShapedFrameTest + */ +import com.sun.awt.AWTUtilities; +import static com.sun.awt.AWTUtilities.Translucency.*; +import java.awt.Frame; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.util.concurrent.CountDownLatch; +import javax.swing.JSlider; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class TranslucentShapedFrameTest extends javax.swing.JFrame { + Frame testFrame; + static CountDownLatch done; + static volatile boolean failed = false; + GraphicsConfiguration gcToUse = null; + + /** + * Creates new form TranslucentShapedFrameTest + */ + public TranslucentShapedFrameTest() { + // not necessary, but we just look nicer + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ex) {} + + initComponents(); + checkEffects(); + + SwingUtilities.updateComponentTreeUI(this); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents + private void initComponents() { + createDisposeGrp = new javax.swing.ButtonGroup(); + jLabel1 = new javax.swing.JLabel(); + transparencySld = new javax.swing.JSlider(); + shapedCb = new javax.swing.JCheckBox(); + nonOpaqueChb = new javax.swing.JCheckBox(); + jScrollPane1 = new javax.swing.JScrollPane(); + jTextArea1 = new javax.swing.JTextArea(); + jLabel2 = new javax.swing.JLabel(); + passedBtn = new javax.swing.JButton(); + failedBtn = new javax.swing.JButton(); + createFrameBtn = new javax.swing.JToggleButton(); + disposeFrameBtn = new javax.swing.JToggleButton(); + useSwingCb = new javax.swing.JCheckBox(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("TranslucentShapedFrameTest"); + jLabel1.setText("Frame Opacity:"); + + transparencySld.setMajorTickSpacing(10); + transparencySld.setMinorTickSpacing(5); + transparencySld.setPaintLabels(true); + transparencySld.setPaintTicks(true); + transparencySld.setValue(100); + transparencySld.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + transparencySldStateChanged(evt); + } + }); + + shapedCb.setText("Shaped Frame"); + shapedCb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + shapedCb.setMargin(new java.awt.Insets(0, 0, 0, 0)); + shapedCb.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + shapedCbActionPerformed(evt); + } + }); + + nonOpaqueChb.setText("Non Opaque Frame"); + nonOpaqueChb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + nonOpaqueChb.setMargin(new java.awt.Insets(0, 0, 0, 0)); + nonOpaqueChb.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + nonOpaqueChbActionPerformed(evt); + } + }); + + jTextArea1.setColumns(20); + jTextArea1.setRows(5); + jTextArea1.setText("Create translucent and/or shaped, or\nnon-opaque frame. Make sure it behaves\ncorrectly (no artifacts left on the screen\nwhen dragging - if dragging is possible).\nClick \"Passed\" if the test behaves correctly,\n\"Falied\" otherwise."); + jScrollPane1.setViewportView(jTextArea1); + + jLabel2.setText("Instructions:"); + + passedBtn.setBackground(new java.awt.Color(129, 255, 100)); + passedBtn.setText("Passed"); + passedBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + passedBtnActionPerformed(evt); + } + }); + + failedBtn.setBackground(java.awt.Color.red); + failedBtn.setText("Failed"); + failedBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + failedBtnActionPerformed(evt); + } + }); + + createDisposeGrp.add(createFrameBtn); + createFrameBtn.setText("Create Frame"); + createFrameBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + createFrameBtnActionPerformed(evt); + } + }); + + createDisposeGrp.add(disposeFrameBtn); + disposeFrameBtn.setSelected(true); + disposeFrameBtn.setText("Dispose Frame"); + disposeFrameBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + disposeFrameBtnActionPerformed(evt); + } + }); + + useSwingCb.setText("Use JFrame"); + useSwingCb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + useSwingCb.setMargin(new java.awt.Insets(0, 0, 0, 0)); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(transparencySld, javax.swing.GroupLayout.DEFAULT_SIZE, 375, Short.MAX_VALUE) + .addContainerGap()) + .addComponent(jLabel1) + .addGroup(layout.createSequentialGroup() + .addComponent(shapedCb) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(nonOpaqueChb) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(useSwingCb) + .addContainerGap(102, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 314, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(passedBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(failedBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 241, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 375, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(createFrameBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(disposeFrameBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap()))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(transparencySld, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(shapedCb) + .addComponent(nonOpaqueChb) + .addComponent(useSwingCb)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(disposeFrameBtn) + .addComponent(createFrameBtn)) + .addGap(17, 17, 17) + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(passedBtn) + .addComponent(failedBtn)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + pack(); + }// </editor-fold>//GEN-END:initComponents + + private void nonOpaqueChbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nonOpaqueChbActionPerformed + if (testFrame != null) { + // REMIND: this path in the test doesn't work well (test bug) +// AWTUtilities.setWindowOpaque(testFrame, !nonOpaqueChb.isSelected()); + } + }//GEN-LAST:event_nonOpaqueChbActionPerformed + + private void shapedCbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shapedCbActionPerformed + if (testFrame != null) { + Shape s = null; + if (shapedCb.isSelected()) { + s = new Ellipse2D.Double(0, 0, + testFrame.getWidth(), + testFrame.getHeight()); + } + AWTUtilities.setWindowShape(testFrame, s); + } + }//GEN-LAST:event_shapedCbActionPerformed + + private void transparencySldStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_transparencySldStateChanged + JSlider source = (JSlider)evt.getSource(); + int transl = transparencySld.getValue(); + if (testFrame != null) { + AWTUtilities.setWindowOpacity(testFrame, (float)transl/100f); + } + }//GEN-LAST:event_transparencySldStateChanged + + private void failedBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_failedBtnActionPerformed + disposeFrameBtnActionPerformed(evt); + dispose(); + failed = true; + done.countDown(); + }//GEN-LAST:event_failedBtnActionPerformed + + private void disposeFrameBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_disposeFrameBtnActionPerformed + TSFrame.stopThreads(); + if (testFrame != null) { + testFrame.dispose(); + testFrame = null; + } + }//GEN-LAST:event_disposeFrameBtnActionPerformed + + private void createFrameBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createFrameBtnActionPerformed + disposeFrameBtnActionPerformed(evt); + int transl = transparencySld.getValue(); + testFrame = TSFrame.createGui(gcToUse, + useSwingCb.isSelected(), shapedCb.isSelected(), + (transl < 100), nonOpaqueChb.isSelected(), + (float)transl/100f); + }//GEN-LAST:event_createFrameBtnActionPerformed + + private void passedBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_passedBtnActionPerformed + disposeFrameBtnActionPerformed(evt); + dispose(); + done.countDown(); + }//GEN-LAST:event_passedBtnActionPerformed + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + done = new CountDownLatch(1); + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new TranslucentShapedFrameTest().setVisible(true); + } + }); + try { + done.await(); + } catch (InterruptedException ex) {} + if (failed) { + throw new RuntimeException("Test FAILED"); + } + System.out.println("Test PASSED"); + } + + private void checkEffects() { + if (!AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSPARENT)) { + shapedCb.setEnabled(false); + } + + if (!AWTUtilities.isTranslucencySupported(TRANSLUCENT)) { + transparencySld.setEnabled(false); + } + + GraphicsConfiguration gc = null; + if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSLUCENT)) { + gc = findGraphicsConfig(); + if (gc == null) { + nonOpaqueChb.setEnabled(false); + } + } + + gcToUse = gc; + } + + private GraphicsConfiguration findGraphicsConfig() { + GraphicsDevice gd = + GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice(); + GraphicsConfiguration gcs[] = gd.getConfigurations(); + for (GraphicsConfiguration gc : gcs) { + if (AWTUtilities.isTranslucencyCapable(gc)) { + return gc; + } + } + return null; + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.ButtonGroup createDisposeGrp; + private javax.swing.JToggleButton createFrameBtn; + private javax.swing.JToggleButton disposeFrameBtn; + private javax.swing.JButton failedBtn; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JTextArea jTextArea1; + private javax.swing.JCheckBox nonOpaqueChb; + private javax.swing.JButton passedBtn; + private javax.swing.JCheckBox shapedCb; + private javax.swing.JSlider transparencySld; + private javax.swing.JCheckBox useSwingCb; + // End of variables declaration//GEN-END:variables + +} diff --git a/test/com/sun/awt/Translucency/WindowOpacity.java b/test/com/sun/awt/Translucency/WindowOpacity.java new file mode 100644 index 0000000000000000000000000000000000000000..d5d8a11d3d9219eefd27ad8a6c8c23ff79395473 --- /dev/null +++ b/test/com/sun/awt/Translucency/WindowOpacity.java @@ -0,0 +1,461 @@ +/* + * Copyright 2008-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 %W% %E% + @bug 6594131 + @summary Tests the AWTUtilities.get/setWindowOpacity() methods + @author anthony.petrov@...: area=awt.toplevel + @run main WindowOpacity +*/ + +import java.awt.*; +import java.awt.event.*; + +import com.sun.awt.AWTUtilities; +import sun.awt.SunToolkit; + +public class WindowOpacity +{ + //*** test-writer defined static variables go here *** + + private static void realSync() { + ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); + } + + + private static void init() + { + //*** Create instructions for the user here *** + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + if (!AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT)) { + System.out.println("Either the Toolkit or the native system does not support controlling the window opacity level."); + pass(); + } + + boolean passed; + + Frame f = new Frame("Opacity test"); + + passed = false; + try { + AWTUtilities.getWindowOpacity(null); + } catch (NullPointerException e) { + passed = true; + } + if (!passed) { + fail("getWindowOpacity() allows passing null."); + } + + + passed = false; + try { + AWTUtilities.setWindowOpacity(null, 0.5f); + } catch (NullPointerException e) { + passed = true; + } + if (!passed) { + fail("setWindowOpacity() allows passing null."); + } + + + float curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 1.0f || curOpacity > 1.0f) { + fail("getWindowOpacity() reports the initial opacity level other than 1.0: " + curOpacity); + } + + + + passed = false; + try { + AWTUtilities.setWindowOpacity(f, -0.5f); + } catch (IllegalArgumentException e) { + passed = true; + } + if (!passed) { + fail("setWindowOpacity() allows passing negative opacity level."); + } + + + + passed = false; + try { + AWTUtilities.setWindowOpacity(f, 1.5f); + } catch (IllegalArgumentException e) { + passed = true; + } + if (!passed) { + fail("setWindowOpacity() allows passing opacity level greater than 1.0."); + } + + + AWTUtilities.setWindowOpacity(f, 0.5f); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.5f || curOpacity > 0.5f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity: " + curOpacity); + } + + + AWTUtilities.setWindowOpacity(f, 0.75f); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.75f || curOpacity > 0.75f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity the second time: " + curOpacity); + } + + + f.setBounds(100, 100, 300, 200); + f.setVisible(true); + + realSync(); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.75f || curOpacity > 0.75f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity before showing the frame: " + curOpacity); + } + + + + AWTUtilities.setWindowOpacity(f, 0.5f); + realSync(); + + curOpacity = AWTUtilities.getWindowOpacity(f); + if (curOpacity < 0.5f || curOpacity > 0.5f) { + fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity after showing the frame: " + curOpacity); + } + + WindowOpacity.pass(); + + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class WindowOpacity + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + WindowOpacity.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + WindowOpacity.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class diff --git a/test/com/sun/java/swing/plaf/gtk/Test6635110.java b/test/com/sun/java/swing/plaf/gtk/Test6635110.java new file mode 100644 index 0000000000000000000000000000000000000000..c82cf1268936c88c4e525b3fcc5950d4cbb49b0e --- /dev/null +++ b/test/com/sun/java/swing/plaf/gtk/Test6635110.java @@ -0,0 +1,65 @@ +/* + * 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 6635110 + @summary GTK icons should not throw NPE when called by non-GTK UI + @author Peter Zhelezniakov + @run main Test6635110 +*/ + +import com.sun.java.swing.plaf.gtk.GTKLookAndFeel; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import javax.swing.plaf.basic.*; + + +public class Test6635110 implements Runnable { + + static final int WIDTH = 160; + static final int HEIGHT = 80; + final BufferedImage IMAGE = + new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + + @Override public void run() { + JMenu menu = new JMenu("menu"); + menu.setUI(new BasicMenuUI()); + paint(menu); + + JToolBar tb = new JToolBar(); + tb.setFloatable(true); + tb.setUI(new BasicToolBarUI()); + paint(tb); + } + + void paint(Component c) { + c.setSize(WIDTH, HEIGHT); + c.paint(IMAGE.getGraphics()); + } + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(new GTKLookAndFeel()); + SwingUtilities.invokeAndWait(new Test6635110()); + } +} diff --git a/test/com/sun/nio/sctp/MessageInfoTests.java b/test/com/sun/nio/sctp/MessageInfoTests.java new file mode 100644 index 0000000000000000000000000000000000000000..1cc1e9fdc143b9216a3a22ccfe206c619d5ac900 --- /dev/null +++ b/test/com/sun/nio/sctp/MessageInfoTests.java @@ -0,0 +1,148 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.SocketAddress; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.MessageInfo; + +public class MessageInfoTests { + static final int DEFAULT_STREAM_NUMBER = 14; + static final int TEST_STREAM_NUMBER = 15; + static final int TEST_PPID = 8; + static final long TEST_TTL = 10000L; + static final SocketAddress addr = new TestSocketAddress(); + static final Association assoc = new TestAssociation(1, 1, 1); + + void test(String[] args) { + /* TEST 1 : createOutGoing(SocketAddress,int) */ + MessageInfo info = MessageInfo.createOutgoing(addr, + DEFAULT_STREAM_NUMBER); + checkDefaults(info); + checkGetterSetters(info); + + /* TEST 2 : createOutGoing(Association,SocketAddress,int) */ + info = MessageInfo.createOutgoing(assoc, addr, DEFAULT_STREAM_NUMBER); + checkDefaults(info); + check(info.association().equals(assoc), "incorrect association"); + checkGetterSetters(info); + + /* TEST 3: null values */ + info = MessageInfo.createOutgoing(null, 0); + check(info.address() == null, "address should be null"); + check(info.association() == null, "association should be null"); + info = MessageInfo.createOutgoing(assoc, null, 0); + check(info.address() == null, "address should be null"); + + /* Test 4: IllegalArgumentException */ + testIAE(new Runnable() { + public void run() { MessageInfo.createOutgoing(addr, -1); } }); + testIAE(new Runnable() { + public void run() { MessageInfo.createOutgoing(addr, 65537); } }); + testIAE(new Runnable() { + public void run() { MessageInfo.createOutgoing(null, addr, 0); } }); + testIAE(new Runnable() { + public void run() { MessageInfo.createOutgoing(assoc, addr, -1); } }); + testIAE(new Runnable() { + public void run() { MessageInfo.createOutgoing(assoc, addr, 65537);}}); + + final MessageInfo iaeInfo = MessageInfo.createOutgoing(assoc, addr, 0); + testIAE(new Runnable() { + public void run() { iaeInfo.streamNumber(-1); } }); + testIAE(new Runnable() { + public void run() { iaeInfo.streamNumber(65537); } }); + } + + /* TEST : unordered = false, timeToLive = 0, complete = true, + * payloadProtocolID = 0. */ + void checkDefaults(MessageInfo info) { + check(info.isUnordered() == false, "default unordered value not false"); + check(info.timeToLive() == 0L, "timeToLive should be 0L"); + check(info.isComplete() == true, "default complete value not true"); + check(info.payloadProtocolID() == 0, "default PPID not 0"); + check(info.bytes() == 0, "default bytes value not 0"); + check(info.streamNumber() == DEFAULT_STREAM_NUMBER, + "incorrect default stream number"); + check(info.address().equals(addr), "incorrect address"); + } + + void checkGetterSetters(MessageInfo info) { + check(info.streamNumber(TEST_STREAM_NUMBER).streamNumber() == + TEST_STREAM_NUMBER, "stream number not being set correctly"); + + check(info.complete(false).isComplete() == false, + "complete not being set correctly"); + + check(info.unordered(true).isUnordered() == true, + "unordered not being set correctly"); + + check(info.payloadProtocolID(TEST_PPID).payloadProtocolID() == + TEST_PPID, "PPID not being set correctly"); + + check(info.timeToLive(TEST_TTL).timeToLive() == TEST_TTL, + "TTL not being set correctly"); + } + + void testIAE(Runnable runnable) { + try { + runnable.run(); + fail("IllegalArgumentException should have been thrown"); + } catch(IllegalArgumentException iae) { + pass(); + } + } + + static class TestSocketAddress extends SocketAddress {} + + static class TestAssociation extends Association { + TestAssociation(int assocID, int maxInStreams, int maxOutStreams) { + super(assocID, maxInStreams, maxOutStreams); + } + } + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); + else fail(failMessage);} + void debug(String message) {if(debug) { System.out.println(message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} diff --git a/test/com/sun/nio/sctp/SctpChannel/Bind.java b/test/com/sun/nio/sctp/SctpChannel/Bind.java new file mode 100644 index 0000000000000000000000000000000000000000..5a391128e9ca1c8b3320227405b5dd6d342c5aae --- /dev/null +++ b/test/com/sun/nio/sctp/SctpChannel/Bind.java @@ -0,0 +1,350 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.*; +import java.io.*; +import java.util.List; +import java.util.Set; +import java.util.Iterator; +import java.nio.ByteBuffer; +import java.nio.channels.AlreadyBoundException; +import java.nio.channels.AlreadyConnectedException; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.UnsupportedAddressTypeException; +import com.sun.nio.sctp.AssociationChangeNotification; +import com.sun.nio.sctp.AbstractNotificationHandler; +import com.sun.nio.sctp.HandlerResult; +import com.sun.nio.sctp.IllegalUnbindException; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.PeerAddressChangeNotification; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import com.sun.nio.sctp.ShutdownNotification; +import static java.lang.System.out; + +/** + * Tests bind, bindAddress, unbindAddress, getLocalAddress, and + * getAllLocalAddresses. + */ +public class Bind { + void test(String[] args) { + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + /* Simply bind tests */ + testBind(); + + /* Test unconnected */ + testBindUnbind(false); + + /* Test connected */ + /* Adding/Removing addresses from a connected association is optional. + * This test can be run on systems that support dynamic address + * reconfiguration */ + //testBindUnbind(true); + } + + void testBind() { + SctpChannel channel = null; + try { + channel = SctpChannel.open(); + + /* TEST 1: empty set if channel is not bound */ + check(channel.getAllLocalAddresses().isEmpty(), + "getAllLocalAddresses returned non empty set for unbound channel"); + + /* TEST 2: null to bind the channel to an automatically assigned + * socket address */ + channel.bind(null); + + /* TEST 3: non empty set if the channel is bound */ + check(!channel.getAllLocalAddresses().isEmpty(), + "getAllLocalAddresses returned empty set for bound channel"); + debug("getAllLocalAddresses on channel bound to the wildcard:\n" + + channel.getAllLocalAddresses()); + + /* TEST 4: AlreadyBoundException if this channel is already bound */ + try { channel.bind(null); } + catch (AlreadyBoundException unused) { pass(); } + catch (IOException ioe) { unexpected(ioe); } + + /* TEST 5: UnsupportedAddressTypeException */ + try { + channel.close(); /* open a new unbound channel for test */ + channel = SctpChannel.open(); + channel.bind(new UnsupportedSocketAddress()); + fail("UnsupportedSocketAddress expected"); + } catch (UnsupportedAddressTypeException unused) { pass(); + } catch (IOException ioe) { unexpected(ioe); } + + /* TEST 6: AlreadyConnectedException */ + try { + channel.close(); /* open a new unbound channel for test */ + channel = SctpChannel.open(); + connectChannel(channel); + channel.bind(null); + fail("AlreadyConnectedException expected"); + } catch (AlreadyConnectedException unused) { pass(); + } catch (IOException ioe) { unexpected(ioe); } + + /* TEST 7: ClosedChannelException - If this channel is closed */ + try { + channel.close(); /* open a new unbound channel for test */ + channel = SctpChannel.open(); + channel.close(); + channel.bind(null); + fail("ClosedChannelException expected"); + } catch (ClosedChannelException unused) { pass(); + } catch (IOException ioe) { unexpected(ioe); } + + /* TEST 8: ClosedChannelException if channel is closed */ + try { + channel.getAllLocalAddresses(); + fail("should have thrown ClosedChannelException"); + } catch (ClosedChannelException cce) { + pass(); + } catch (Exception ioe) { + unexpected(ioe); + } + } catch (IOException ioe) { + unexpected(ioe); + } finally { + try { channel.close(); } + catch (IOException ioe) { unexpected(ioe); } + } + } + + void testBindUnbind(boolean connected) { + SctpChannel channel = null; + SctpChannel peerChannel = null; + + debug("testBindUnbind, connected: " + connected); + try { + channel = SctpChannel.open(); + + List<InetAddress> addresses = Util.getAddresses(true, false); + Iterator iterator = addresses.iterator(); + InetSocketAddress a = new InetSocketAddress((InetAddress)iterator.next(), 0); + debug("channel.bind( " + a + ")"); + channel.bind(a); + while (iterator.hasNext()) { + InetAddress ia = (InetAddress)iterator.next(); + debug("channel.bindAddress(" + ia + ")"); + channel.bindAddress(ia); + } + if (debug) {Util.dumpAddresses(channel, out);} + + if (connected) { + /* Test with connected channel */ + peerChannel = connectChannel(channel); + } + + /* TEST 1: bind/unbindAddresses on the system addresses */ + debug("bind/unbindAddresses on the system addresses"); + List<InetAddress> addrs = Util.getAddresses(true, false); + for (InetAddress addr : addrs) { + try { + debug("unbindAddress: " + addr); + check(boundAddress(channel, addr), "trying to remove address that is not bound"); + channel.unbindAddress(addr); + if (debug) {Util.dumpAddresses(channel, out);} + check(!boundAddress(channel, addr), "address was not removed"); + + debug("bindAddress: " + addr); + channel.bindAddress(addr); + if (debug) {Util.dumpAddresses(channel, out);} + check(boundAddress(channel, addr), "address is not bound"); + } catch (IOException ioe) { + unexpected(ioe); + } + } + + /* TEST 2: bindAddress - already bound address. */ + InetAddress againAddress = addrs.get(0); + try { + debug("bind already bound address " + againAddress); + channel.bindAddress(againAddress); + } catch (AlreadyBoundException unused) { + debug("Caught AlreadyBoundException - OK"); + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 3: bind non local address */ + try { + InetAddress nla = InetAddress.getByName("123.123.123.123"); + debug("bind non local address " + nla); + channel.bindAddress(nla); + } catch (IOException ioe) { + debug("Informative only " + ioe); + } + + /* TEST 4: unbind address that is not bound */ + try { + debug("unbind address that is not bound " + againAddress); + /* remove address first then again */ + channel.unbindAddress(againAddress); + channel.unbindAddress(againAddress); + } catch (IllegalUnbindException unused) { + debug("Caught IllegalUnbindException - OK"); + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 5: unbind address that is not bound */ + try { + InetAddress nla = InetAddress.getByName("123.123.123.123"); + debug("unbind address that is not bound " + nla); + channel.unbindAddress(nla); + + } catch (IllegalUnbindException unused) { + debug("Caught IllegalUnbindException - OK"); + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + if (connected) { + channel.shutdown(); + + BindNotificationHandler handler = new BindNotificationHandler(); + ByteBuffer buffer = ByteBuffer.allocate(10); + MessageInfo info; + while((info = peerChannel.receive(buffer, null, handler)) != null) { + if (info != null) { + if (info.bytes() == -1) { + debug("peerChannel Reached EOF"); + break; + } + } + } + + while((info = channel.receive(buffer, null, handler)) != null) { + if (info != null) { + if (info.bytes() == -1) { + debug("channel Reached EOF"); + break; + } + } + } + } + } catch (IOException ioe) { + ioe.printStackTrace(); + } finally { + try { if (channel != null) channel.close(); } + catch (IOException ioe) { unexpected(ioe); } + } + } + + boolean boundAddress(SctpChannel channel, InetAddress addr) + throws IOException { + for (SocketAddress boundAddr : channel.getAllLocalAddresses()) { + if (((InetSocketAddress) boundAddr).getAddress().equals(addr)) + return true; + } + return false; + } + + SctpChannel connectChannel(SctpChannel channel) + throws IOException { + debug("connecting channel..."); + try { + SctpServerChannel ssc = SctpServerChannel.open(); + ssc.bind(null); + Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); + Iterator<SocketAddress> iterator = addrs.iterator(); + SocketAddress addr = iterator.next(); + debug("using " + addr + "..."); + channel.connect(addr); + SctpChannel peerChannel = ssc.accept(); + ssc.close(); + debug("connected"); + return peerChannel; + } catch (IOException ioe) { + debug("Cannot connect channel"); + unexpected(ioe); + throw ioe; + } + } + + class BindNotificationHandler extends AbstractNotificationHandler<Object> + { + @Override + public HandlerResult handleNotification( + AssociationChangeNotification acn, Object unused) + { + debug("AssociationChangeNotification: " + acn); + return HandlerResult.CONTINUE; + } + + @Override + public HandlerResult handleNotification( + PeerAddressChangeNotification pacn, Object unused) + { + debug("PeerAddressChangeNotification: " + pacn); + return HandlerResult.CONTINUE; + } + + @Override + public HandlerResult handleNotification( + ShutdownNotification sn, Object unused) + { + debug("ShutdownNotification: " + sn); + return HandlerResult.CONTINUE; + } + } + + class UnsupportedSocketAddress extends SocketAddress { } + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { System.out.println(message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpChannel/Connect.java b/test/com/sun/nio/sctp/SctpChannel/Connect.java new file mode 100644 index 0000000000000000000000000000000000000000..7614cdeb7322619052bd7ce6309c889d3912fb18 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpChannel/Connect.java @@ -0,0 +1,283 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.IOException; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.nio.channels.AlreadyConnectedException; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.ConnectionPendingException; +import java.nio.channels.NoConnectionPendingException; +import java.nio.channels.UnresolvedAddressException; +import java.nio.channels.UnsupportedAddressTypeException; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import static java.lang.System.out; +import static java.lang.System.err; + +/** + * Tests connect, finishConnect, isConnectionPending, + * getRemoteAddresses and association. + */ +public class Connect { + final CountDownLatch finishedLatch = new CountDownLatch(1); + + void test(String[] args) { + SocketAddress address = null; + Server server = null; + + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + if (args.length == 2) { + /* requested to connect to a specific address */ + try { + int port = Integer.valueOf(args[1]); + address = new InetSocketAddress(args[0], port); + } catch (NumberFormatException nfe) { + err.println(nfe); + } + } else { + /* start server on local machine, default */ + try { + server = new Server(); + server.start(); + address = server.address(); + debug("Server started and listening on " + address); + } catch (IOException ioe) { + ioe.printStackTrace(); + return; + } + } + + doTest(address); + } + + void doTest(SocketAddress addr) { + SctpChannel channel = null; + final SocketAddress peerAddress = addr; + + try { + channel = SctpChannel.open(); + + /* TEST 0.5 Verify default values for new/unconnected channel */ + check(channel.getRemoteAddresses().isEmpty(), + "non empty set for unconnected channel"); + check(channel.association() == null, + "non-null association for unconnected channel"); + check(!channel.isConnectionPending(), + "should not have a connection pending"); + + /* TEST 1: non-blocking connect */ + channel.configureBlocking(false); + if (channel.connect(peerAddress) != true) { + debug("non-blocking connect did not immediately succeed"); + check(channel.isConnectionPending(), + "should return true for isConnectionPending"); + try { + channel.connect(peerAddress); + fail("should have thrown ConnectionPendingException"); + } catch (ConnectionPendingException cpe) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + channel.configureBlocking(true); + check(channel.finishConnect(), + "finishConnect should have returned true"); + } + + /* TEST 1.5 Verify after connect */ + check(!channel.getRemoteAddresses().isEmpty(), + "empty set for connected channel"); + check(channel.association() != null, + "null association for connected channel"); + check(!channel.isConnectionPending(), + "pending connection for connected channel"); + + /* TEST 2: Verify AlreadyConnectedException thrown */ + try { + channel.connect(peerAddress); + fail("should have thrown AlreadyConnectedException"); + } catch (AlreadyConnectedException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 3: UnresolvedAddressException */ + channel.close(); + channel = SctpChannel.open(); + InetSocketAddress unresolved = + InetSocketAddress.createUnresolved("xxyyzzabc", 4567); + try { + channel.connect(unresolved); + fail("should have thrown UnresolvedAddressException"); + } catch (UnresolvedAddressException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 4: UnsupportedAddressTypeException */ + SocketAddress unsupported = new UnsupportedSocketAddress(); + try { + channel.connect(unsupported); + fail("should have thrown UnsupportedAddressTypeException"); + } catch (UnsupportedAddressTypeException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 5: ClosedChannelException */ + channel.close(); + final SctpChannel closedChannel = channel; + testCCE(new Callable<Void>() { + public Void call() throws IOException { + closedChannel.connect(peerAddress); return null; } }); + + /* TEST 5.5 getRemoteAddresses */ + testCCE(new Callable<Void>() { + public Void call() throws IOException { + closedChannel.getRemoteAddresses(); return null; } }); + testCCE(new Callable<Void>() { + public Void call() throws IOException { + closedChannel.association(); return null; } }); + check(!channel.isConnectionPending(), + "pending connection for closed channel"); + + /* Run some more finishConnect tests */ + + /* TEST 6: NoConnectionPendingException */ + channel = SctpChannel.open(); + try { + channel.finishConnect(); + fail("should have thrown NoConnectionPendingException"); + } catch (NoConnectionPendingException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 7: ClosedChannelException */ + channel.close(); + final SctpChannel cceChannel = channel; + testCCE(new Callable<Void>() { + public Void call() throws IOException { + cceChannel.finishConnect(); return null; } }); + } catch (IOException ioe) { + unexpected(ioe); + } finally { + finishedLatch.countDown(); + try { if (channel != null) channel.close(); } + catch (IOException e) { unexpected(e);} + } + } + + class UnsupportedSocketAddress extends SocketAddress { } + + void testCCE(Callable callable) { + try { + callable.call(); + fail("should have thrown ClosedChannelException"); + } catch (ClosedChannelException cce) { + pass(); + } catch (Exception ioe) { + unexpected(ioe); + } + } + + class Server implements Runnable + { + final InetSocketAddress serverAddr; + private SctpServerChannel ssc; + + public Server() throws IOException { + ssc = SctpServerChannel.open().bind(null); + java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); + if (addrs.isEmpty()) + debug("addrs should not be empty"); + + serverAddr = (InetSocketAddress) addrs.iterator().next(); + } + + public void start() { + (new Thread(this, "Server-" + serverAddr.getPort())).start(); + } + + public InetSocketAddress address() { + return serverAddr; + } + + @Override + public void run() { + SctpChannel sc = null; + try { + sc = ssc.accept(); + finishedLatch.await(); + } catch (IOException ioe) { + unexpected(ioe); + } catch (InterruptedException ie) { + unexpected(ie); + } finally { + try { if (ssc != null) ssc.close(); } + catch (IOException ioe) { unexpected(ioe); } + try { if (sc != null) sc.close(); } + catch (IOException ioe) { unexpected(ioe); } + } + } + } + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { System.out.println(message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpChannel/Receive.java b/test/com/sun/nio/sctp/SctpChannel/Receive.java new file mode 100644 index 0000000000000000000000000000000000000000..6e906c4c91b074b21280bdfe259552ca7935d7a0 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpChannel/Receive.java @@ -0,0 +1,361 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.nio.ByteBuffer; +import java.nio.channels.NotYetConnectedException; +import java.nio.channels.ClosedChannelException; +import com.sun.nio.sctp.AbstractNotificationHandler; +import com.sun.nio.sctp.AssociationChangeNotification; +import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent; +import com.sun.nio.sctp.HandlerResult; +import com.sun.nio.sctp.IllegalReceiveException; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.Notification; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import com.sun.nio.sctp.ShutdownNotification; +import static java.lang.System.out; +import static java.lang.System.err; + +public class Receive { + /* Latches used to synchronize between the client and server so that + * connections without any IO may not be closed without being accepted */ + final CountDownLatch clientFinishedLatch = new CountDownLatch(1); + final CountDownLatch serverFinishedLatch = new CountDownLatch(1); + + /* Used to verify that the ppid is being sent and received correctly */ + static final int PPID = 5; + + void test(String[] args) { + SocketAddress address = null; + Server server; + + + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + if (args.length == 2) { + /* requested to connecct to a specific address */ + try { + int port = Integer.valueOf(args[1]); + address = new InetSocketAddress(args[0], port); + } catch (NumberFormatException nfe) { + err.println(nfe); + } + } else { + /* start server on local machine, default */ + try { + server = new Server(); + server.start(); + address = server.address(); + debug("Server started and listening on " + address); + } catch (IOException ioe) { + ioe.printStackTrace(); + return; + } + } + + doTest(address); + } + + void doTest(SocketAddress peerAddress) { + SctpChannel channel = null; + ByteBuffer buffer = ByteBuffer.allocate(Util.LARGE_BUFFER); + MessageInfo info; + + try { + channel = SctpChannel.open(); + ReceiveNotificationHandler handler = + new ReceiveNotificationHandler(channel); + + /* TEST 1: Verify NotYetConnectedException thrown */ + try { + channel.receive(buffer, null, handler); + fail("should have thrown NotYetConnectedException"); + } catch (NotYetConnectedException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + channel.connect(peerAddress); + + /* TEST 2: receive small message */ + do { + debug("Test 2: invoking receive"); + info = channel.receive(buffer, null, handler); + if (info == null) { + fail("unexpected null from receive"); + return; + } + } while (!info.isComplete()); + + buffer.flip(); + check(handler.receivedCommUp(), "SCTP_COMM_UP not received"); + check(info != null, "info is null"); + check(info.address() != null, "address is null"); + check(info.association() != null, "association is null"); + check(info.isComplete(), "message is not complete"); + check(info.isUnordered() != true, + "message should not be unordered"); + check(info.streamNumber() >= 0, "invalid stream number"); + check(info.payloadProtocolID() == PPID, "PPID incorrect"); + check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.SMALL_MESSAGE), + "received message not the same as sent message"); + + buffer.clear(); + + /* TEST 3: receive large message */ + do { + debug("Test 3: invoking receive"); + info = channel.receive(buffer, null, handler); + if (info == null) { + fail("unexpected null from receive"); + return; + } + } while (!info.isComplete()); + + buffer.flip(); + check(info != null, "info is null"); + check(info.address() != null, "address is null"); + check(info.association() != null, "association is null"); + check(info.isComplete(), "message is not complete"); + check(info.isUnordered() != true, + "message should not be unordered"); + check(info.streamNumber() >= 0, "invalid stream number"); + check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.LARGE_MESSAGE), + "received message not the same as sent message"); + + buffer.clear(); + + /* TEST 4: EOF */ + buffer.clear(); // buffer position 0 + info = channel.receive(buffer,null, handler); + check(info != null, "info is null"); + check(info.bytes() == -1, "should have received EOF"); + check(buffer.position() == 0, "buffer position should be unchanged"); + + /* TEST 5: ClosedChannelException */ + channel.close(); + try { + channel.receive(buffer, null, null); + fail("should have thrown ClosedChannelException"); + } catch (ClosedChannelException cce) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + handler = null; + + /* TEST 6: handler returns RETURN after handling a notification */ + ReceiveNotificationHandler handler2 = + new ReceiveNotificationHandler(null); /* HandlerResult.RETURN */ + channel = SctpChannel.open(peerAddress, 0, 0); + info = channel.receive(buffer, null, handler2); + check(info == null, "channel should return null"); + check(handler2.receivedCommUp(), "SCTP_COMM_UP not received"); + check(buffer.position() == 0, "buffer position should be unchanged"); + + /* TEST 7: Non blocking channel return null if no data */ + channel.configureBlocking(false); + info = channel.receive(buffer, null, null); + check(info == null, "non-blocking channel should return null"); + check(buffer.position() == 0, "buffer position should be unchanged"); + } catch (IOException ioe) { + unexpected(ioe); + } finally { + clientFinishedLatch.countDown(); + try { serverFinishedLatch.await(10L, TimeUnit.SECONDS); } + catch (InterruptedException ie) { unexpected(ie); } + if (channel != null) { + try { channel.close(); } + catch (IOException e) { unexpected (e);} + } + } + } + + class Server implements Runnable + { + final InetSocketAddress serverAddr; + private SctpServerChannel ssc; + + public Server() throws IOException { + ssc = SctpServerChannel.open().bind(null); + java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); + if (addrs.isEmpty()) + debug("addrs should not be empty"); + + serverAddr = (InetSocketAddress) addrs.iterator().next(); + } + + public void start() { + (new Thread(this, "Server-" + serverAddr.getPort())).start(); + } + + public InetSocketAddress address() { + return serverAddr; + } + + @Override + public void run() { + try { + SctpChannel sc = ssc.accept(); + + /* send a small message */ + MessageInfo info = MessageInfo.createOutgoing(null, 0) + .payloadProtocolID(PPID); + ByteBuffer buf = ByteBuffer.allocateDirect(Util.SMALL_BUFFER); + buf.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1")); + buf.flip(); + + debug("sending small message: " + buf); + sc.send(buf, info); + + /* send a large message */ + buf = ByteBuffer.allocateDirect(Util.LARGE_BUFFER); + buf.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1")); + buf.flip(); + + debug("sending large message: " + buf); + sc.send(buf, info); + sc.shutdown(); + debug("shutdown"); + ReceiveNotificationHandler handler = + new ReceiveNotificationHandler(sc); + sc.receive(buf, null, handler); + sc.close(); + + /* accept another socket for the TEST 6 */ + sc = ssc.accept(); + ssc.close(); + + clientFinishedLatch.await(10L, TimeUnit.SECONDS); + serverFinishedLatch.countDown(); + sc.close(); + } catch (IOException ioe) { + unexpected(ioe); + } catch (InterruptedException ie) { + unexpected(ie); + } + } + } + + class ReceiveNotificationHandler extends AbstractNotificationHandler<Object> + { + SctpChannel channel; + boolean receivedCommUp; // false + + public ReceiveNotificationHandler(SctpChannel channel) { + this.channel = channel; + } + + public boolean receivedCommUp() { + return receivedCommUp; + } + + @Override + public HandlerResult handleNotification( + Notification notification, Object attachment) { + fail("Unknown notification type"); + return HandlerResult.CONTINUE; + } + + @Override + public HandlerResult handleNotification( + AssociationChangeNotification notification, Object attachment) { + AssocChangeEvent event = notification.event(); + debug("AssociationChangeNotification"); + debug(" Association: " + notification.association()); + debug(" Event: " + event); + + if (event.equals(AssocChangeEvent.COMM_UP)) + receivedCommUp = true; + + if (channel == null) + return HandlerResult.RETURN; + + /* TEST 4: IllegalReceiveException - If the given handler invokes + * the receive method of this channel*/ + ByteBuffer buffer = ByteBuffer.allocate(10); + try { + channel.receive(buffer, null, this); + fail("IllegalReceiveException expected"); + } catch (IllegalReceiveException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + return HandlerResult.CONTINUE; + } + + @Override + public HandlerResult handleNotification( + ShutdownNotification notification, Object attachment) { + debug("ShutdownNotification"); + debug(" Association: " + notification.association()); + return HandlerResult.CONTINUE; + } + } + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { + System.out.println(Thread.currentThread() + " " + message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpChannel/Send.java b/test/com/sun/nio/sctp/SctpChannel/Send.java new file mode 100644 index 0000000000000000000000000000000000000000..3cee201d7394ccb9a2d50a92e94f27960fdfb08e --- /dev/null +++ b/test/com/sun/nio/sctp/SctpChannel/Send.java @@ -0,0 +1,419 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.nio.ByteBuffer; +import java.nio.channels.NotYetConnectedException; +import java.nio.channels.ClosedChannelException; +import com.sun.nio.sctp.AbstractNotificationHandler; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.AssociationChangeNotification; +import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent; +import com.sun.nio.sctp.HandlerResult; +import com.sun.nio.sctp.InvalidStreamException; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.Notification; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import static java.lang.System.out; +import static java.lang.System.err; + +public class Send { + /* Latches used to synchronize between the client and server so that + * connections without any IO may not be closed without being accepted */ + final CountDownLatch clientFinishedLatch = new CountDownLatch(1); + final CountDownLatch serverFinishedLatch = new CountDownLatch(1); + + SendNotificationHandler handler = new SendNotificationHandler(); + + void test(String[] args) { + SocketAddress address = null; + Server server = null; + + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + if (args.length == 2) { + /* requested to connecct to a specific address */ + try { + int port = Integer.valueOf(args[1]); + address = new InetSocketAddress(args[0], port); + } catch (NumberFormatException nfe) { + err.println(nfe); + } + } else { + /* start server on local machine, default */ + try { + server = new Server(); + server.start(); + address = server.address(); + debug("Server started and listening on " + address); + } catch (IOException ioe) { + ioe.printStackTrace(); + return; + } + } + + doTest(address); + } + + void doTest(SocketAddress peerAddress) { + SctpChannel channel = null; + ByteBuffer buffer = ByteBuffer.allocate(Util.LARGE_BUFFER); + MessageInfo info = MessageInfo.createOutgoing(null, 0); + + try { + channel = SctpChannel.open(); + + /* TEST 1: Verify NotYetConnectedException thrown */ + try { + channel.send(buffer, info); + fail("should have thrown NotYetConnectedException"); + } catch (NotYetConnectedException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + channel.connect(peerAddress); + /* Receive CommUp */ + channel.receive(buffer, null, handler); + + /* save for TEST 8 */ + Association association = channel.association(); + + /* TEST 2: send small message */ + int streamNumber = 0; + debug("sending on stream number: " + streamNumber); + info = MessageInfo.createOutgoing(null, streamNumber); + buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + int position = buffer.position(); + int remaining = buffer.remaining(); + + debug("sending small message: " + buffer); + int sent = channel.send(buffer, info); + + check(sent == remaining, "sent should be equal to remaining"); + check(buffer.position() == (position + sent), + "buffers position should have been incremented by sent"); + + buffer.clear(); + + /* TEST 3: send large message */ + streamNumber = handler.maxOutStreams() - 1; + debug("sending on stream number: " + streamNumber); + info = MessageInfo.createOutgoing(null, streamNumber); + buffer.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + position = buffer.position(); + remaining = buffer.remaining(); + + debug("sending large message: " + buffer); + sent = channel.send(buffer, info); + + check(sent == remaining, "sent should be equal to remaining"); + check(buffer.position() == (position + sent), + "buffers position should have been incremented by sent"); + + /* TEST 4: InvalidStreamExcepton */ + streamNumber = handler.maxInStreams; + info = MessageInfo.createOutgoing(null, streamNumber); + buffer.clear(); + buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + position = buffer.position(); + remaining = buffer.remaining(); + + debug("sending on stream number: " + streamNumber); + debug("sending small message: " + buffer); + try { + sent = channel.send(buffer, info); + fail("should have thrown InvalidStreamExcepton"); + } catch (InvalidStreamException ise){ + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + check(buffer.remaining() == remaining, + "remaining should not be changed"); + check(buffer.position() == position, + "buffers position should not be changed"); + + /* TEST 5: Non blocking send should return zero if there is + insufficient room in the underlying output buffer */ + buffer.clear(); + channel.configureBlocking(false); + info = MessageInfo.createOutgoing(null, 1); + buffer.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + + int count = 0; // do not loop forever + do { + position = buffer.position(); + remaining = buffer.remaining(); + debug("sending large message: " + buffer); + sent = channel.send(buffer, info); + if (sent == 0) { + check(buffer.remaining() == remaining, + "remaining should not be changed"); + check(buffer.position() == position, + "buffers position should not be changed"); + } + buffer.rewind(); + } while (sent != 0 && count++ < 100); + + /* TEST 6: ClosedChannelException */ + channel.close(); + try { + channel.send(buffer, info); + fail("should have thrown ClosedChannelException"); + } catch (ClosedChannelException cce) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 7: send without previous receive. + * Verify that send can still throw InvalidStreamExcepton */ + debug("Opening new channel."); + channel = SctpChannel.open(peerAddress, 0, 0); + streamNumber = Short.MAX_VALUE - 1; + info = MessageInfo.createOutgoing(null, streamNumber); + buffer.clear(); + buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + position = buffer.position(); + remaining = buffer.remaining(); + + debug("sending on stream number: " + streamNumber); + debug("sending small message: " + buffer); + try { + sent = channel.send(buffer, info); + fail("should have thrown InvalidStreamExcepton"); + } catch (InvalidStreamException ise){ + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + check(buffer.remaining() == remaining, + "remaining should not be changed"); + check(buffer.position() == position, + "buffers position should not be changed"); + + /* Receive CommUp */ + channel.receive(buffer, null, handler); + check(handler.receivedCommUp(), "should have received COMM_UP"); + + /* TEST 8: Send to an invalid preferred SocketAddress */ + SocketAddress addr = new InetSocketAddress("123.123.123.123", 3456); + info = MessageInfo.createOutgoing(addr, 0); + debug("sending to " + addr); + debug("sending small message: " + buffer); + try { + sent = channel.send(buffer, info); + fail("Invalid address should have thrown an Exception."); + } catch (Exception e){ + pass(); + debug("OK, caught " + e); + } + } catch (IOException ioe) { + unexpected(ioe); + } finally { + clientFinishedLatch.countDown(); + try { serverFinishedLatch.await(10L, TimeUnit.SECONDS); } + catch (InterruptedException ie) { unexpected(ie); } + if (channel != null) { + try { channel.close(); } + catch (IOException e) { unexpected (e);} + } + } + } + + class Server implements Runnable + { + final InetSocketAddress serverAddr; + private SctpServerChannel ssc; + + public Server() throws IOException { + ssc = SctpServerChannel.open().bind(null); + java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); + if (addrs.isEmpty()) + debug("addrs should not be empty"); + + serverAddr = (InetSocketAddress) addrs.iterator().next(); + } + + public void start() { + (new Thread(this, "Server-" + serverAddr.getPort())).start(); + } + + public InetSocketAddress address() { + return serverAddr; + } + + @Override + public void run() { + ByteBuffer buffer = ByteBuffer.allocateDirect(Util.LARGE_BUFFER); + SctpChannel sc1 = null, sc2 = null; + try { + sc1 = ssc.accept(); + + /* receive a small message */ + MessageInfo info; + do { + info = sc1.receive(buffer, null, null); + if (info == null) { + fail("Server: unexpected null from receive"); + return; + } + } while (!info.isComplete()); + + buffer.flip(); + check(info != null, "info is null"); + check(info.streamNumber() == 0, + "message not sent on the correct stream"); + check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.SMALL_MESSAGE), + "received message not the same as sent message"); + + /* receive a large message */ + buffer.clear(); + do { + info = sc1.receive(buffer, null, null); + if (info == null) { + fail("Server: unexpected null from receive"); + return; + } + } while (!info.isComplete()); + + buffer.flip(); + check(info != null, "info is null"); + check(info.streamNumber() == handler.maxOutStreams() - 1, + "message not sent on the correct stream"); + check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.LARGE_MESSAGE), + "received message not the same as sent message"); + + /* TEST 7 ++ */ + sc2 = ssc.accept(); + + clientFinishedLatch.await(10L, TimeUnit.SECONDS); + serverFinishedLatch.countDown(); + } catch (IOException ioe) { + unexpected(ioe); + } catch (InterruptedException ie) { + unexpected(ie); + } finally { + try { if (ssc != null) ssc.close(); } + catch (IOException unused) {} + try { if (sc1 != null) sc1.close(); } + catch (IOException unused) {} + try { if (sc2 != null) sc2.close(); } + catch (IOException unused) {} + } + } + } + + class SendNotificationHandler extends AbstractNotificationHandler<Void> + { + boolean receivedCommUp; // false + int maxInStreams; + int maxOutStreams; + + public boolean receivedCommUp() { + return receivedCommUp; + } + + public int maxInStreams() { + return maxInStreams; + } + + public int maxOutStreams(){ + return maxOutStreams; + } + + @Override + public HandlerResult handleNotification( + Notification notification, Void attachment) { + fail("Unknown notification type"); + return HandlerResult.CONTINUE; + } + + @Override + public HandlerResult handleNotification( + AssociationChangeNotification notification, Void attachment) { + AssocChangeEvent event = notification.event(); + Association association = notification.association(); + debug("AssociationChangeNotification"); + debug(" Association: " + notification.association()); + debug(" Event: " + event); + + if (event.equals(AssocChangeEvent.COMM_UP)) + receivedCommUp = true; + + this.maxInStreams = association.maxInboundStreams(); + this.maxOutStreams = association.maxOutboundStreams(); + + return HandlerResult.RETURN; + } + } + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { System.out.println(message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpChannel/Shutdown.java b/test/com/sun/nio/sctp/SctpChannel/Shutdown.java new file mode 100644 index 0000000000000000000000000000000000000000..92c51adb09c338414172e5f6d381156818fa47de --- /dev/null +++ b/test/com/sun/nio/sctp/SctpChannel/Shutdown.java @@ -0,0 +1,274 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.NotYetConnectedException; +import com.sun.nio.sctp.AbstractNotificationHandler; +import com.sun.nio.sctp.HandlerResult; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import com.sun.nio.sctp.ShutdownNotification; +import static java.lang.System.out; +import static java.lang.System.err; + +public class Shutdown { + static CountDownLatch finishedLatch = new CountDownLatch(1); + static CountDownLatch sentLatch = new CountDownLatch(1); + + void test(String[] args) { + SocketAddress address = null; + ShutdownServer server = null; + + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + if (args.length == 2) { + /* requested to connecct to a specific address */ + try { + int port = Integer.valueOf(args[1]); + address = new InetSocketAddress(args[0], port); + } catch (NumberFormatException nfe) { + err.println(nfe); + } + } else { + /* start server on local machine, default */ + try { + server = new ShutdownServer(); + server.start(); + address = server.address(); + debug("Server started and listening on " + address); + } catch (IOException ioe) { + ioe.printStackTrace(); + return; + } + } + + doTest(address); + } + + void doTest(SocketAddress peerAddress) { + SctpChannel channel = null; + ByteBuffer buffer = ByteBuffer.allocate(Util.SMALL_BUFFER); + MessageInfo info; + + try { + channel = SctpChannel.open(); + + /* TEST 1: Verify NotYetConnectedException thrown */ + debug("Test 1: NotYetConnectedException"); + try { + channel.shutdown(); + fail("shutdown not throwing expected NotYetConnectedException"); + } catch (NotYetConnectedException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + channel.connect(peerAddress); + sentLatch.await(); + channel.shutdown(); + + /* TEST 2: receive data sent before shutdown */ + do { + debug("Test 2: invoking receive"); + info = channel.receive(buffer, null, null); + if (info == null) { + fail("unexpected null from receive"); + return; + } + } while (!info.isComplete()); + + buffer.flip(); + check(info != null, "info is null"); + check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.SMALL_MESSAGE), + "received message not the same as sent message"); + + buffer.clear(); + + /* TEST 3: receive notifications on the SCTP stack */ + debug("Test 3: receive notifications"); + while ((info = channel.receive(buffer, null, null )) != null && + info.bytes() != -1 ); + + + /* TEST 4: If the channel is already shutdown then invoking this + * method has no effect. */ + debug("Test 4: no-op"); + try { + channel.shutdown(); + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + /* TEST 5: Further sends will throw ClosedChannelException */ + debug("Test 5: ClosedChannelException"); + info = MessageInfo.createOutgoing(null, 1); + try { + channel.send(buffer, info); + fail("shutdown not throwing expected ClosedChannelException"); + } catch (ClosedChannelException unused) { + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + } catch (IOException ioe) { + unexpected(ioe); + } catch (InterruptedException ie) { + unexpected(ie); + }finally { + finishedLatch.countDown(); + try { if (channel != null) channel.close(); } + catch (IOException e) { unexpected(e);} + } + } + + class ShutdownServer implements Runnable + { + final InetSocketAddress serverAddr; + private SctpServerChannel ssc; + + public ShutdownServer() throws IOException { + ssc = SctpServerChannel.open().bind(null); + //serverAddr = (InetSocketAddress)(ssc.getAllLocalAddresses().iterator().next()); + + java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); + if (addrs.isEmpty()) + debug("addrs should not be empty"); + + serverAddr = (InetSocketAddress) addrs.iterator().next(); + + } + + public void start() { + (new Thread(this, "ShutdownServer-" + serverAddr.getPort())).start(); + } + + public InetSocketAddress address() { + return serverAddr; + } + + @Override + public void run() { + SctpChannel sc = null; + try { + sc = ssc.accept(); + + /* send a message */ + MessageInfo info = MessageInfo.createOutgoing(null, 1); + ByteBuffer buf = ByteBuffer.allocateDirect(Util.SMALL_BUFFER); + buf.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1")); + buf.flip(); + sc.send(buf, info); + + /* notify client that the data has been sent */ + sentLatch.countDown(); + + /* wait until after the client has finished its tests */ + finishedLatch.await(); + + buf.clear(); + ShutdownNotificationHandler handler = + new ShutdownNotificationHandler(); + BooleanWrapper bool = new BooleanWrapper(); + sc.configureBlocking(false); + sc.receive(buf, bool, handler); + check(bool.booleanValue(), "SHUTDOWN not received on Server"); + + } catch (IOException ioe) { + ioe.printStackTrace(); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } finally { + try { if (ssc != null) ssc.close(); } + catch (IOException ioe) { unexpected(ioe); } + try { if (sc != null) sc.close(); } + catch (IOException ioe) { unexpected(ioe); } + } + } + } + + class BooleanWrapper { + boolean bool; + + boolean booleanValue() { + return bool; + } + + void booleanValue(boolean value) { + bool = value; + } + } + + class ShutdownNotificationHandler extends AbstractNotificationHandler<BooleanWrapper> + { + @Override + public HandlerResult handleNotification( + ShutdownNotification sn, BooleanWrapper bool) + { + bool.booleanValue(true); + debug(sn.toString()); + return HandlerResult.RETURN; + } + } + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { System.out.println(message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java b/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java new file mode 100644 index 0000000000000000000000000000000000000000..1e7c9cac3b214ac47f65296b59da3990252ee710 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java @@ -0,0 +1,157 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.io.IOException; +import java.util.Set; +import java.util.List; +import java.util.Arrays; +import java.nio.channels.ClosedChannelException; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpSocketOption; +import static com.sun.nio.sctp.SctpStandardSocketOption.*; +import static java.lang.System.out; + +public class SocketOptionTests { + <T> void checkOption(SctpChannel sc, SctpSocketOption<T> name, + T expectedValue) throws IOException { + T value = sc.getOption(name); + check(value.equals(expectedValue), name + ": value (" + value + + ") not as expected (" + expectedValue + ")"); + } + + <T> void optionalSupport(SctpChannel sc, SctpSocketOption<T> name, + T value) { + try { + sc.setOption(name, value); + checkOption(sc, name, value); + } catch (IOException e) { + /* Informational only, not all options have native support */ + out.println(name + " not supported. " + e); + } + } + + void test(String[] args) { + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + try { + SctpChannel sc = SctpChannel.open(); + + /* check supported options */ + Set<SctpSocketOption<?>> options = sc.supportedOptions(); + List<? extends SctpSocketOption<?>> expected = Arrays.<SctpSocketOption<?>>asList( + SCTP_DISABLE_FRAGMENTS, SCTP_EXPLICIT_COMPLETE, + SCTP_FRAGMENT_INTERLEAVE, SCTP_INIT_MAXSTREAMS, + SCTP_NODELAY, SCTP_PRIMARY_ADDR, SCTP_SET_PEER_PRIMARY_ADDR, + SO_SNDBUF, SO_RCVBUF, SO_LINGER); + + for (SctpSocketOption opt: expected) { + if (!options.contains(opt)) + fail(opt.name() + " should be supported"); + } + + InitMaxStreams streams = InitMaxStreams.create(1024, 1024); + sc.setOption(SCTP_INIT_MAXSTREAMS, streams); + checkOption(sc, SCTP_INIT_MAXSTREAMS, streams); + streams = sc.getOption(SCTP_INIT_MAXSTREAMS); + check(streams.maxInStreams() == 1024, "Max in streams: value: " + + streams.maxInStreams() + ", expected 1024 "); + check(streams.maxOutStreams() == 1024, "Max out streams: value: " + + streams.maxOutStreams() + ", expected 1024 "); + + optionalSupport(sc, SCTP_DISABLE_FRAGMENTS, true); + optionalSupport(sc, SCTP_EXPLICIT_COMPLETE, true); + optionalSupport(sc, SCTP_FRAGMENT_INTERLEAVE, 1); + + + //TODO: SCTP_PRIMARY_ADDR + //sc.bind(null); + //connect + //InetSocketAddress addr = new InetSocketAddress(0); + //sc.setOption(SCTP_PRIMARY_ADDR, addr); + + sc.setOption(SCTP_NODELAY, true); + checkOption(sc, SCTP_NODELAY, true); + sc.setOption(SO_SNDBUF, 16*1024); + sc.setOption(SO_RCVBUF, 16*1024); + checkOption(sc, SO_LINGER, -1); /* default should be negative */ + sc.setOption(SO_LINGER, 2000); + checkOption(sc, SO_LINGER, 2000); + + + /* NullPointerException */ + try { + sc.setOption(null, "value"); + fail("NullPointerException not thrown for setOption"); + } catch (NullPointerException unused) { + pass(); + } + try { + sc.getOption(null); + fail("NullPointerException not thrown for getOption"); + } catch (NullPointerException unused) { + pass(); + } + + /* ClosedChannelException */ + sc.close(); + try { + sc.setOption(SCTP_INIT_MAXSTREAMS, streams); + fail("ClosedChannelException not thrown"); + } catch (ClosedChannelException unused) { + pass(); + } + } catch (IOException ioe) { + unexpected(ioe); + } + } + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { System.out.println(message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} diff --git a/test/com/sun/nio/sctp/SctpChannel/Util.java b/test/com/sun/nio/sctp/SctpChannel/Util.java new file mode 100644 index 0000000000000000000000000000000000000000..e6be2ae97f7b75743f013eb297314db341f225d4 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpChannel/Util.java @@ -0,0 +1,138 @@ +/* + * 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. + */ + +import java.net.NetworkInterface; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.InetAddress; +import java.net.Inet4Address; +import java.net.SocketException; +import java.io.IOException; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.ArrayList; +import java.util.Set; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Iterator; +import java.nio.ByteBuffer; +import com.sun.nio.sctp.SctpChannel; +import static java.lang.System.out; + +public class Util { + static final int SMALL_BUFFER = 128; + static final String SMALL_MESSAGE = + "Under the bridge and over the dam, looking for berries, berries for jam"; + + static final int LARGE_BUFFER = 32768; + static final String LARGE_MESSAGE; + + static { + StringBuffer sb = new StringBuffer(LARGE_BUFFER); + for (int i=0; i<460; i++) + sb.append(SMALL_MESSAGE); + + LARGE_MESSAGE = sb.toString(); + } + + static boolean isSCTPSupported() { + try { + SctpChannel c = SctpChannel.open(); + c.close(); + return true; + } catch (IOException ioe) { + ioe.printStackTrace(); + } catch (UnsupportedOperationException e) { + out.println(e); + } + + return false; + } + /** + * Returns a list of all the addresses on the system. + * @param inclLoopback + * if {@code true}, include the loopback addresses + * @param ipv4Only + * it {@code true}, only IPv4 addresses will be included + */ + static List<InetAddress> getAddresses(boolean inclLoopback, + boolean ipv4Only) + throws SocketException { + ArrayList<InetAddress> list = new ArrayList<InetAddress>(); + Enumeration<NetworkInterface> nets = + NetworkInterface.getNetworkInterfaces(); + for (NetworkInterface netInf : Collections.list(nets)) { + Enumeration<InetAddress> addrs = netInf.getInetAddresses(); + for (InetAddress addr : Collections.list(addrs)) { + if (!list.contains(addr) && + (inclLoopback ? true : !addr.isLoopbackAddress()) && + (ipv4Only ? (addr instanceof Inet4Address) : true)) { + list.add(addr); + } + } + } + + return list; + } + + static void dumpAddresses(SctpChannel channel, + PrintStream printStream) + throws IOException { + Set<SocketAddress> addrs = channel.getAllLocalAddresses(); + printStream.println("Local Addresses: "); + for (Iterator<SocketAddress> it = addrs.iterator(); it.hasNext(); ) { + InetSocketAddress addr = (InetSocketAddress)it.next(); + printStream.println("\t" + addr); + } + } + + /** + * Compare the contents of the given ByteBuffer with the contens of the + * given byte array. true if, and only if, the contents are the same. + */ + static boolean compare(ByteBuffer bb, byte[] message) { + if (message.length != bb.remaining()) { + out.println("Compare failed, byte array length != to buffer remaining"); + return false; + } + + for (int i=0; i<message.length; i++) { + byte b = bb.get(); + if (message[i] != b) { + out.println("Position " + i + ": " + message[i] + " != " + b); + return false; + } + } + + return true; + } + + static boolean compare(ByteBuffer bb, String str) { + try{ + return Util.compare(bb, str.getBytes("ISO-8859-1")); + } catch (UnsupportedEncodingException unsupported) { + throw new AssertionError(unsupported); + } + } +} diff --git a/test/com/sun/nio/sctp/SctpMultiChannel/Send.java b/test/com/sun/nio/sctp/SctpMultiChannel/Send.java new file mode 100644 index 0000000000000000000000000000000000000000..b7d1379d174b96ba5223d4cd85db57938b3f31e3 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpMultiChannel/Send.java @@ -0,0 +1,320 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.IOException; +import java.util.Set; +import java.util.Iterator; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.nio.ByteBuffer; +import com.sun.nio.sctp.Association; +import com.sun.nio.sctp.InvalidStreamException; +import com.sun.nio.sctp.MessageInfo; +import com.sun.nio.sctp.SctpMultiChannel; +import static java.lang.System.out; +import static java.lang.System.err; + +public class Send { + /* Latches used to synchronize between the client and server so that + * connections without any IO may not be closed without being accepted */ + final CountDownLatch clientFinishedLatch = new CountDownLatch(1); + final CountDownLatch serverFinishedLatch = new CountDownLatch(1); + + void test(String[] args) { + SocketAddress address = null; + Server server = null; + + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + if (args.length == 2) { + /* requested to connecct to a specific address */ + try { + int port = Integer.valueOf(args[1]); + address = new InetSocketAddress(args[0], port); + } catch (NumberFormatException nfe) { + err.println(nfe); + } + } else { + /* start server on local machine, default */ + try { + server = new Server(); + server.start(); + address = server.address(); + debug("Server started and listening on " + address); + } catch (IOException ioe) { + ioe.printStackTrace(); + return; + } + } + + doTest(address); + } + + void doTest(SocketAddress peerAddress) { + SctpMultiChannel channel = null; + ByteBuffer buffer = ByteBuffer.allocate(Util.LARGE_BUFFER); + MessageInfo info = MessageInfo.createOutgoing(null, 0); + + try { + channel = SctpMultiChannel.open(); + + /* TEST 1: send small message */ + int streamNumber = 0; + debug("sending to " + peerAddress + " on stream number: " + streamNumber); + info = MessageInfo.createOutgoing(peerAddress, streamNumber); + buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + int position = buffer.position(); + int remaining = buffer.remaining(); + + debug("sending small message: " + buffer); + int sent = channel.send(buffer, info); + + check(sent == remaining, "sent should be equal to remaining"); + check(buffer.position() == (position + sent), + "buffers position should have been incremented by sent"); + + /* TEST 2: receive the echoed message */ + buffer.clear(); + info = channel.receive(buffer, null, null); + buffer.flip(); + check(info != null, "info is null"); + check(info.streamNumber() == streamNumber, + "message not sent on the correct stream"); + check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.SMALL_MESSAGE), + "received message not the same as sent message"); + + + /* TEST 3: send large message */ + Set<Association> assocs = channel.associations(); + check(assocs.size() == 1, "there should be only one association"); + Iterator<Association> it = assocs.iterator(); + check(it.hasNext()); + Association assoc = it.next(); + streamNumber = assoc.maxOutboundStreams() - 1; + + debug("sending on stream number: " + streamNumber); + info = MessageInfo.createOutgoing(assoc, null, streamNumber); + buffer.clear(); + buffer.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + position = buffer.position(); + remaining = buffer.remaining(); + + debug("sending large message: " + buffer); + sent = channel.send(buffer, info); + + check(sent == remaining, "sent should be equal to remaining"); + check(buffer.position() == (position + sent), + "buffers position should have been incremented by sent"); + + /* TEST 4: receive the echoed message */ + buffer.clear(); + info = channel.receive(buffer, null, null); + buffer.flip(); + check(info != null, "info is null"); + check(info.streamNumber() == streamNumber, + "message not sent on the correct stream"); + check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.LARGE_MESSAGE), + "received message not the same as sent message"); + + + /* TEST 5: InvalidStreamExcepton */ + streamNumber = assoc.maxOutboundStreams() + 1; + info = MessageInfo.createOutgoing(assoc, null, streamNumber); + buffer.clear(); + buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1")); + buffer.flip(); + position = buffer.position(); + remaining = buffer.remaining(); + + debug("sending on stream number: " + streamNumber); + debug("sending small message: " + buffer); + try { + sent = channel.send(buffer, info); + fail("should have thrown InvalidStreamExcepton"); + } catch (InvalidStreamException ise){ + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + check(buffer.remaining() == remaining, + "remaining should not be changed"); + check(buffer.position() == position, + "buffers position should not be changed"); + + + /* TEST 5: getRemoteAddresses(Association) */ + channel.getRemoteAddresses(assoc); + + } catch (IOException ioe) { + unexpected(ioe); + } finally { + clientFinishedLatch.countDown(); + try { serverFinishedLatch.await(10L, TimeUnit.SECONDS); } + catch (InterruptedException ie) { unexpected(ie); } + if (channel != null) { + try { channel.close(); } + catch (IOException e) { unexpected (e);} + } + } + } + + class Server implements Runnable + { + final InetSocketAddress serverAddr; + private SctpMultiChannel serverChannel; + + public Server() throws IOException { + serverChannel = SctpMultiChannel.open().bind(null); + java.util.Set<SocketAddress> addrs = serverChannel.getAllLocalAddresses(); + if (addrs.isEmpty()) + debug("addrs should not be empty"); + + serverAddr = (InetSocketAddress) addrs.iterator().next(); + } + + public void start() { + (new Thread(this, "Server-" + serverAddr.getPort())).start(); + } + + public InetSocketAddress address() { + return serverAddr; + } + + @Override + public void run() { + ByteBuffer buffer = ByteBuffer.allocateDirect(Util.LARGE_BUFFER); + try { + MessageInfo info; + + /* receive a small message */ + do { + info = serverChannel.receive(buffer, null, null); + if (info == null) { + fail("Server: unexpected null from receive"); + return; + } + } while (!info.isComplete()); + + buffer.flip(); + check(info != null, "info is null"); + check(info.streamNumber() == 0, + "message not sent on the correct stream"); + check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.SMALL_MESSAGE), + "received message not the same as sent message"); + + check(info != null, "info is null"); + Set<Association> assocs = serverChannel.associations(); + check(assocs.size() == 1, "there should be only one association"); + Iterator<Association> it = assocs.iterator(); + check(it.hasNext()); + Association assoc = it.next(); + + /* echo the message */ + debug("Server: echoing first message"); + buffer.flip(); + int bytes = serverChannel.send(buffer, info); + debug("Server: sent " + bytes + "bytes"); + + /* receive a large message */ + buffer.clear(); + do { + info = serverChannel.receive(buffer, null, null); + if (info == null) { + fail("Server: unexpected null from receive"); + return; + } + } while (!info.isComplete()); + + buffer.flip(); + + check(info.streamNumber() == assoc.maxInboundStreams() - 1, + "message not sent on the correct stream"); + check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1"). + length, "bytes received not equal to message length"); + check(info.bytes() == buffer.remaining(), "bytes != remaining"); + check(Util.compare(buffer, Util.LARGE_MESSAGE), + "received message not the same as sent message"); + + /* echo the message */ + debug("Server: echoing second message"); + buffer.flip(); + bytes = serverChannel.send(buffer, info); + debug("Server: sent " + bytes + "bytes"); + + clientFinishedLatch.await(10L, TimeUnit.SECONDS); + serverFinishedLatch.countDown(); + } catch (IOException ioe) { + unexpected(ioe); + } catch (InterruptedException ie) { + unexpected(ie); + } finally { + try { if (serverChannel != null) serverChannel.close(); } + catch (IOException unused) {} + } + } + } + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { System.out.println(message); } } + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpMultiChannel/Util.java b/test/com/sun/nio/sctp/SctpMultiChannel/Util.java new file mode 100644 index 0000000000000000000000000000000000000000..e6be2ae97f7b75743f013eb297314db341f225d4 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpMultiChannel/Util.java @@ -0,0 +1,138 @@ +/* + * 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. + */ + +import java.net.NetworkInterface; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.InetAddress; +import java.net.Inet4Address; +import java.net.SocketException; +import java.io.IOException; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.ArrayList; +import java.util.Set; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Iterator; +import java.nio.ByteBuffer; +import com.sun.nio.sctp.SctpChannel; +import static java.lang.System.out; + +public class Util { + static final int SMALL_BUFFER = 128; + static final String SMALL_MESSAGE = + "Under the bridge and over the dam, looking for berries, berries for jam"; + + static final int LARGE_BUFFER = 32768; + static final String LARGE_MESSAGE; + + static { + StringBuffer sb = new StringBuffer(LARGE_BUFFER); + for (int i=0; i<460; i++) + sb.append(SMALL_MESSAGE); + + LARGE_MESSAGE = sb.toString(); + } + + static boolean isSCTPSupported() { + try { + SctpChannel c = SctpChannel.open(); + c.close(); + return true; + } catch (IOException ioe) { + ioe.printStackTrace(); + } catch (UnsupportedOperationException e) { + out.println(e); + } + + return false; + } + /** + * Returns a list of all the addresses on the system. + * @param inclLoopback + * if {@code true}, include the loopback addresses + * @param ipv4Only + * it {@code true}, only IPv4 addresses will be included + */ + static List<InetAddress> getAddresses(boolean inclLoopback, + boolean ipv4Only) + throws SocketException { + ArrayList<InetAddress> list = new ArrayList<InetAddress>(); + Enumeration<NetworkInterface> nets = + NetworkInterface.getNetworkInterfaces(); + for (NetworkInterface netInf : Collections.list(nets)) { + Enumeration<InetAddress> addrs = netInf.getInetAddresses(); + for (InetAddress addr : Collections.list(addrs)) { + if (!list.contains(addr) && + (inclLoopback ? true : !addr.isLoopbackAddress()) && + (ipv4Only ? (addr instanceof Inet4Address) : true)) { + list.add(addr); + } + } + } + + return list; + } + + static void dumpAddresses(SctpChannel channel, + PrintStream printStream) + throws IOException { + Set<SocketAddress> addrs = channel.getAllLocalAddresses(); + printStream.println("Local Addresses: "); + for (Iterator<SocketAddress> it = addrs.iterator(); it.hasNext(); ) { + InetSocketAddress addr = (InetSocketAddress)it.next(); + printStream.println("\t" + addr); + } + } + + /** + * Compare the contents of the given ByteBuffer with the contens of the + * given byte array. true if, and only if, the contents are the same. + */ + static boolean compare(ByteBuffer bb, byte[] message) { + if (message.length != bb.remaining()) { + out.println("Compare failed, byte array length != to buffer remaining"); + return false; + } + + for (int i=0; i<message.length; i++) { + byte b = bb.get(); + if (message[i] != b) { + out.println("Position " + i + ": " + message[i] + " != " + b); + return false; + } + } + + return true; + } + + static boolean compare(ByteBuffer bb, String str) { + try{ + return Util.compare(bb, str.getBytes("ISO-8859-1")); + } catch (UnsupportedEncodingException unsupported) { + throw new AssertionError(unsupported); + } + } +} diff --git a/test/com/sun/nio/sctp/SctpServerChannel/Accept.java b/test/com/sun/nio/sctp/SctpServerChannel/Accept.java new file mode 100644 index 0000000000000000000000000000000000000000..9071555cc7dbd47385fae2d7c42541ab155838c3 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpServerChannel/Accept.java @@ -0,0 +1,274 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.nio.channels.AlreadyConnectedException; +import java.nio.channels.AsynchronousCloseException; +import java.nio.channels.NotYetBoundException; +import java.nio.channels.ClosedByInterruptException; +import java.nio.channels.ClosedChannelException; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import static java.lang.System.out; +import static java.lang.System.err; + +public class Accept { + static CountDownLatch acceptLatch = new CountDownLatch(1); + static CountDownLatch closeByIntLatch = new CountDownLatch(1); + static CountDownLatch asyncCloseLatch = new CountDownLatch(1); + AcceptServer server = null; + + void test(String[] args) { + SocketAddress address = null; + + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + if (args.length == 2) { + /* requested to connecct to a specific address */ + try { + int port = Integer.valueOf(args[1]); + address = new InetSocketAddress(args[0], port); + } catch (NumberFormatException nfe) { + err.println(nfe); + } + } else { + /* start server on local machine, default */ + try { + server = new AcceptServer(); + server.start(); + address = server.address(); + debug("Server started and listening on " + address); + } catch (IOException ioe) { + ioe.printStackTrace(); + return; + } + } + + doClient(address); + } + + void doClient(SocketAddress peerAddress) { + SctpChannel channel = null; + + try { + channel = SctpChannel.open(peerAddress, 0, 0); + acceptLatch.await(); + + /* for test 4 */ + closeByIntLatch.await(); + sleep(500); + server.thread().interrupt(); + + /* for test 5 */ + asyncCloseLatch.await(); + sleep(500); + server.channel().close(); + + /* wait for the server thread to finish */ + join(server.thread(), 10000); + } catch (IOException ioe) { + unexpected(ioe); + } catch (InterruptedException ie) { + unexpected(ie); + } finally { + try { if (channel != null) channel.close(); } + catch (IOException e) { unexpected(e);} + } + } + + class AcceptServer implements Runnable + { + final InetSocketAddress serverAddr; + private SctpServerChannel ssc; + private Thread serverThread; + + public AcceptServer() throws IOException { + ssc = SctpServerChannel.open(); + + /* TEST 1: NotYetBoundException */ + debug("TEST 1: NotYetBoundException"); + try { + ssc.accept(); + fail(); + } catch (NotYetBoundException nybe) { + debug(" caught NotYetBoundException"); + pass(); + } catch (IOException ioe) { + unexpected(ioe); + } + + ssc.bind(null); + java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); + if (addrs.isEmpty()) + debug("addrs should not be empty"); + + serverAddr = (InetSocketAddress) addrs.iterator().next(); + + /* TEST 2: null if this channel is in non-blocking mode and no + * association is available to be accepted */ + ssc.configureBlocking(false); + debug("TEST 2: non-blocking mode null"); + try { + SctpChannel sc = ssc.accept(); + check(sc == null, "non-blocking mode should return null"); + } catch (IOException ioe) { + unexpected(ioe); + } finally { + ssc.configureBlocking(true); + } + } + + void start() { + serverThread = new Thread(this, "AcceptServer-" + + serverAddr.getPort()); + serverThread.start(); + } + + InetSocketAddress address() { + return serverAddr; + } + + SctpServerChannel channel() { + return ssc; + } + + Thread thread() { + return serverThread; + } + + @Override + public void run() { + SctpChannel sc = null; + try { + /* TEST 3: accepted channel */ + debug("TEST 3: accepted channel"); + sc = ssc.accept(); + + checkAcceptedChannel(sc); + acceptLatch.countDown(); + + /* TEST 4: ClosedByInterruptException */ + debug("TEST 4: ClosedByInterruptException"); + try { + closeByIntLatch.countDown(); + ssc.accept(); + fail(); + } catch (ClosedByInterruptException unused) { + debug(" caught ClosedByInterruptException"); + pass(); + } + + /* TEST 5: AsynchronousCloseException */ + debug("TEST 5: AsynchronousCloseException"); + /* reset thread interrupt status */ + Thread.currentThread().interrupted(); + + ssc = SctpServerChannel.open().bind(null); + try { + asyncCloseLatch.countDown(); + ssc.accept(); + fail(); + } catch (AsynchronousCloseException unused) { + debug(" caught AsynchronousCloseException"); + pass(); + } + + /* TEST 6: ClosedChannelException */ + debug("TEST 6: ClosedChannelException"); + try { + ssc.accept(); + fail(); + } catch (ClosedChannelException unused) { + debug(" caught ClosedChannelException"); + pass(); + } + ssc = null; + } catch (IOException ioe) { + ioe.printStackTrace(); + } finally { + try { if (ssc != null) ssc.close(); } + catch (IOException ioe) { unexpected(ioe); } + try { if (sc != null) sc.close(); } + catch (IOException ioe) { unexpected(ioe); } + } + } + } + + void checkAcceptedChannel(SctpChannel sc) { + try { + debug("Checking accepted SctpChannel"); + check(sc.association() != null, + "accepted channel should have an association"); + check(!(sc.getRemoteAddresses().isEmpty()), + "accepted channel should be connected"); + check(!(sc.isConnectionPending()), + "accepted channel should not have a connection pending"); + check(sc.isBlocking(), + "accepted channel should be blocking"); + try { sc.connect(new TestSocketAddress()); fail(); } + catch (AlreadyConnectedException unused) { pass(); } + try { sc.bind(new TestSocketAddress()); fail(); } + catch (AlreadyConnectedException unused) { pass(); } + } catch (IOException unused) { fail(); } + } + + static class TestSocketAddress extends SocketAddress {} + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { out.println(message); } } + void sleep(long millis) { try { Thread.currentThread().sleep(millis); } + catch(InterruptedException ie) { unexpected(ie); }} + void join(Thread thread, long millis) { try { thread.join(millis); } + catch(InterruptedException ie) { unexpected(ie); }} + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpServerChannel/NonBlockingAccept.java b/test/com/sun/nio/sctp/SctpServerChannel/NonBlockingAccept.java new file mode 100644 index 0000000000000000000000000000000000000000..a63eee67b0164b232ba1b5b8883977fc1182dfa3 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpServerChannel/NonBlockingAccept.java @@ -0,0 +1,230 @@ +/* + * 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 4927640 + * @summary Tests the SCTP protocol implementation + * @author chegar + */ + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.IOException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.nio.channels.AlreadyConnectedException; +import java.nio.channels.Selector; +import java.nio.channels.SelectionKey; +import com.sun.nio.sctp.SctpChannel; +import com.sun.nio.sctp.SctpServerChannel; +import static java.lang.System.out; +import static java.lang.System.err; + +public class NonBlockingAccept { + static CountDownLatch acceptLatch = new CountDownLatch(1); + static final int SEL_TIMEOUT = 10000; + static final int NUM_TEST_CONNECTIONS = 10; + + void test(String[] args) { + SocketAddress address = null; + NonblockingServer server; + + if (!Util.isSCTPSupported()) { + out.println("SCTP protocol is not supported"); + out.println("Test cannot be run"); + return; + } + + if (args.length == 2) { + /* requested to connecct to a specific address */ + try { + int port = Integer.valueOf(args[1]); + address = new InetSocketAddress(args[0], port); + } catch (NumberFormatException nfe) { + err.println(nfe); + } + } else { + /* start server on local machine, default */ + try { + server = new NonblockingServer(); + server.start(); + address = server.address(); + debug("Server started and listening on " + address); + } catch (IOException ioe) { + ioe.printStackTrace(); + return; + } + } + + doClient(address); + } + + void doClient(SocketAddress peerAddress) { + Set<SctpChannel> channels = new HashSet<SctpChannel>(NUM_TEST_CONNECTIONS); + + try { + for (int i=0; i<NUM_TEST_CONNECTIONS;) { + debug("connecting " + ++i); + channels.add(SctpChannel.open(peerAddress, 0, 0)); + sleep(100); + } + + /* don't close the channels until they have been accepted */ + acceptLatch.await(); + + for(SctpChannel sc: channels) + sc.close(); + } catch (IOException ioe) { + unexpected(ioe); + } catch (InterruptedException ie) { + unexpected(ie); + } + } + + class NonblockingServer implements Runnable + { + final InetSocketAddress serverAddr; + private SctpServerChannel ssc; + private Thread serverThread; + + public NonblockingServer() throws IOException { + ssc = SctpServerChannel.open().bind(null); + java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); + if (addrs.isEmpty()) + debug("addrs should not be empty"); + + serverAddr = (InetSocketAddress) addrs.iterator().next(); + } + + void start() { + serverThread = new Thread(this, "NonblockingServer-" + + serverAddr.getPort()); + serverThread.start(); + } + + InetSocketAddress address () { + return serverAddr; + } + + @Override + public void run() { + Selector acceptSelector = null; + SelectionKey acceptKey = null; + + try { + acceptSelector = Selector.open(); + ssc.configureBlocking(false); + check(ssc.isBlocking() == false, "Should be in non-blocking mode"); + acceptKey = ssc.register(acceptSelector, SelectionKey.OP_ACCEPT); + + int connectionsAccepted = 0; + while (connectionsAccepted < NUM_TEST_CONNECTIONS) { + int keysAdded = acceptSelector.select(SEL_TIMEOUT); + if (keysAdded > 0) { + Set<SelectionKey> keys = acceptSelector.selectedKeys(); + Iterator<SelectionKey> i = keys.iterator(); + while(i.hasNext()) { + SelectionKey sk = i.next(); + i.remove(); + SctpServerChannel nextReady = + (SctpServerChannel)sk.channel(); + check(nextReady.equals(ssc), + "channels should be equal"); + check(sk.isAcceptable(), + "key should be acceptable"); + check(!sk.isReadable(), + "key should not be readable"); + check(!sk.isWritable(), + "key should not be writable"); + check(!sk.isConnectable(), + "key should not be connectable"); + SctpChannel acceptsc = nextReady.accept(); + connectionsAccepted++; + debug("Accepted " + connectionsAccepted + " connections"); + check(acceptsc != null, + "Accepted channel should not be null"); + if (acceptsc != null) { + checkAcceptedChannel(acceptsc); + acceptsc.close(); + } + } /* while */ + } /* if */ + } /* while */ + } catch (IOException ioe) { + ioe.printStackTrace(); + } finally { + acceptLatch.countDown(); + if (acceptKey != null) acceptKey.cancel(); + try { if (acceptSelector != null) acceptSelector.close(); } + catch (IOException ioe) { unexpected(ioe); } + try { if (ssc != null) ssc.close(); } + catch (IOException ioe) { unexpected(ioe); } + } + } + } + + void checkAcceptedChannel(SctpChannel sc) { + try { + debug("Checking accepted SctpChannel"); + check(sc.association() != null, + "accepted channel should have an association"); + check(!(sc.getRemoteAddresses().isEmpty()), + "accepted channel should be connected"); + check(!(sc.isConnectionPending()), + "accepted channel should not have a connection pending"); + check(sc.isBlocking(), + "accepted channel should be blocking"); + try { sc.connect(new TestSocketAddress()); fail(); } + catch (AlreadyConnectedException unused) { pass(); } + try { sc.bind(new TestSocketAddress()); fail(); } + catch (AlreadyConnectedException unused) { pass(); } + } catch (IOException unused) { fail(); } + } + + static class TestSocketAddress extends SocketAddress {} + + //--------------------- Infrastructure --------------------------- + boolean debug = true; + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} + void debug(String message) {if(debug) { out.println(message); } } + void sleep(long millis) { try { Thread.currentThread().sleep(millis); } + catch(InterruptedException ie) { unexpected(ie); }} + public static void main(String[] args) throws Throwable { + Class<?> k = new Object(){}.getClass().getEnclosingClass(); + try {k.getMethod("instanceMain",String[].class) + .invoke( k.newInstance(), (Object) args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} + +} diff --git a/test/com/sun/nio/sctp/SctpServerChannel/Util.java b/test/com/sun/nio/sctp/SctpServerChannel/Util.java new file mode 100644 index 0000000000000000000000000000000000000000..e6be2ae97f7b75743f013eb297314db341f225d4 --- /dev/null +++ b/test/com/sun/nio/sctp/SctpServerChannel/Util.java @@ -0,0 +1,138 @@ +/* + * 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. + */ + +import java.net.NetworkInterface; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.InetAddress; +import java.net.Inet4Address; +import java.net.SocketException; +import java.io.IOException; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.ArrayList; +import java.util.Set; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Iterator; +import java.nio.ByteBuffer; +import com.sun.nio.sctp.SctpChannel; +import static java.lang.System.out; + +public class Util { + static final int SMALL_BUFFER = 128; + static final String SMALL_MESSAGE = + "Under the bridge and over the dam, looking for berries, berries for jam"; + + static final int LARGE_BUFFER = 32768; + static final String LARGE_MESSAGE; + + static { + StringBuffer sb = new StringBuffer(LARGE_BUFFER); + for (int i=0; i<460; i++) + sb.append(SMALL_MESSAGE); + + LARGE_MESSAGE = sb.toString(); + } + + static boolean isSCTPSupported() { + try { + SctpChannel c = SctpChannel.open(); + c.close(); + return true; + } catch (IOException ioe) { + ioe.printStackTrace(); + } catch (UnsupportedOperationException e) { + out.println(e); + } + + return false; + } + /** + * Returns a list of all the addresses on the system. + * @param inclLoopback + * if {@code true}, include the loopback addresses + * @param ipv4Only + * it {@code true}, only IPv4 addresses will be included + */ + static List<InetAddress> getAddresses(boolean inclLoopback, + boolean ipv4Only) + throws SocketException { + ArrayList<InetAddress> list = new ArrayList<InetAddress>(); + Enumeration<NetworkInterface> nets = + NetworkInterface.getNetworkInterfaces(); + for (NetworkInterface netInf : Collections.list(nets)) { + Enumeration<InetAddress> addrs = netInf.getInetAddresses(); + for (InetAddress addr : Collections.list(addrs)) { + if (!list.contains(addr) && + (inclLoopback ? true : !addr.isLoopbackAddress()) && + (ipv4Only ? (addr instanceof Inet4Address) : true)) { + list.add(addr); + } + } + } + + return list; + } + + static void dumpAddresses(SctpChannel channel, + PrintStream printStream) + throws IOException { + Set<SocketAddress> addrs = channel.getAllLocalAddresses(); + printStream.println("Local Addresses: "); + for (Iterator<SocketAddress> it = addrs.iterator(); it.hasNext(); ) { + InetSocketAddress addr = (InetSocketAddress)it.next(); + printStream.println("\t" + addr); + } + } + + /** + * Compare the contents of the given ByteBuffer with the contens of the + * given byte array. true if, and only if, the contents are the same. + */ + static boolean compare(ByteBuffer bb, byte[] message) { + if (message.length != bb.remaining()) { + out.println("Compare failed, byte array length != to buffer remaining"); + return false; + } + + for (int i=0; i<message.length; i++) { + byte b = bb.get(); + if (message[i] != b) { + out.println("Position " + i + ": " + message[i] + " != " + b); + return false; + } + } + + return true; + } + + static boolean compare(ByteBuffer bb, String str) { + try{ + return Util.compare(bb, str.getBytes("ISO-8859-1")); + } catch (UnsupportedEncodingException unsupported) { + throw new AssertionError(unsupported); + } + } +} diff --git a/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java b/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java new file mode 100644 index 0000000000000000000000000000000000000000..d401f986aebc3c5664fce16f4b555da47b311b2e --- /dev/null +++ b/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java @@ -0,0 +1,381 @@ +/* + * 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 6774258 + @summary api/java_awt/Component/index.html#PaintUpdate fails randomly + @author dmitry.cherepanov@...: area=awt.painting + @run main NoUpdateUponShow +*/ + +/** + * NoUpdateUponShow.java + * + * summary: System-level painting operations shouldn't make call to update() + */ + +import java.awt.*; +import sun.awt.SunToolkit; + +public class NoUpdateUponShow +{ + + static volatile boolean wasUpdate = false; + + private static void init() + { + //*** Create instructions for the user here *** + + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + + // Create the frame and the button + Frame f = new Frame(); + f.setBounds(100, 100, 200, 200); + f.setLayout(new FlowLayout()); + f.add(new Button() { + @Override + public void update(Graphics g) { + wasUpdate = true; + super.update(g); + } + }); + f.setVisible(true); + + ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); + + if (wasUpdate) { + fail(" Unexpected update. "); + } else { + pass(); + } + }//End init() + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class ValidBounds + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + ValidBounds.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + ValidBounds.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class diff --git a/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java b/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java index 20f6145e3205fecb9fde46ad0efa0ef8ebb8c0dc..5cde4aacb904a2746c00ef67768f4c8df74dbd58 100644 --- a/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java +++ b/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java @@ -118,7 +118,7 @@ class StubComponentPeer implements ComponentPeer { public boolean handlesWheelScrolling(){return true;}; public void createBuffers(int numBuffers, BufferCapabilities caps) throws AWTException{}; public Image getBackBuffer(){return null;}; - public void flip(BufferCapabilities.FlipContents flipAction){}; + public void flip(int x1, int y1, int x2, int y2, BufferCapabilities.FlipContents flipAction){}; public void destroyBuffers(){}; /** diff --git a/test/java/awt/EventQueue/6638195/bug6638195.java b/test/java/awt/EventQueue/6638195/bug6638195.java index b1109967071a7006b118a6415507134b5f5e487e..9dc3b50b973c673d7cb8516043ffba19d4268bc0 100644 --- a/test/java/awt/EventQueue/6638195/bug6638195.java +++ b/test/java/awt/EventQueue/6638195/bug6638195.java @@ -76,8 +76,13 @@ public class bug6638195 { Callable<Void> afterDispatchCallable = new Callable<Void>() { public Void call() { - delegate.afterDispatch(afterDispatchEventArgument[0], - afterDispatchHandleArgument[0]); + try { + delegate.afterDispatch(afterDispatchEventArgument[0], + afterDispatchHandleArgument[0]); + } + catch (InterruptedException e) { + throw new RuntimeException("afterDispatch interrupted", e); + } return null; } }; @@ -91,8 +96,13 @@ public class bug6638195 { Callable<Object> beforeDispatchCallable = new Callable<Object>() { public Object call() { - return delegate.beforeDispatch( - beforeDispatchEventArgument[0]); + try { + return delegate.beforeDispatch( + beforeDispatchEventArgument[0]); + } + catch (InterruptedException e) { + throw new RuntimeException("beforeDispatch interrupted", e); + } } }; methodMap = new HashMap<String, Object>(); diff --git a/test/java/awt/Focus/ClearGlobalFocusOwnerTest/ClearGlobalFocusOwnerTest.java b/test/java/awt/Focus/ClearGlobalFocusOwnerTest/ClearGlobalFocusOwnerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1ea53f52a2f1083cb1f707752f4d61a9616cb604 --- /dev/null +++ b/test/java/awt/Focus/ClearGlobalFocusOwnerTest/ClearGlobalFocusOwnerTest.java @@ -0,0 +1,95 @@ +/* + * 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 4390555 + @summary Synopsis: clearGlobalFocusOwner() is not trigerring permanent FOCUS_LOST event + @author son@sparc.spb.su, anton.tarasov: area=awt.focus + @library ../../regtesthelpers + @build Util + @run main ClearGlobalFocusOwnerTest +*/ + +import java.awt.*; +import java.awt.event.*; +import test.java.awt.regtesthelpers.Util; + +public class ClearGlobalFocusOwnerTest { + static volatile boolean isFocusLost = false; + static Frame frame = new Frame("Test frame"); + static Button button = new Button("Test button"); + + public static void main(String[] args) { + button.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent fe) { + if (fe.isTemporary()) { + throw new TestFailedException("the FocusLost event is temporary: " + fe); + } + isFocusLost = true; + } + }); + + frame.add(button); + frame.pack(); + frame.setVisible(true); + + Util.waitForIdle(null); + + if (!button.hasFocus()) { + button.requestFocus(); + Util.waitForIdle(null); + if (!button.hasFocus()) { + throw new TestErrorException("couldn't focus " + button); + } + } + + KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner(); + + Util.waitForIdle(null); + + if (!isFocusLost) { + throw new TestFailedException("no FocusLost event happened on clearGlobalFocusOwner"); + } + + System.out.println("Test passed."); + } +} + +/** + * Thrown when the behavior being verified is found wrong. + */ +class TestFailedException extends RuntimeException { + TestFailedException(String msg) { + super("Test failed: " + msg); + } +} + +/** + * Thrown when an error not related to the behavior being verified is encountered. + */ +class TestErrorException extends RuntimeException { + TestErrorException(String msg) { + super("Unexpected error: " + msg); + } +} diff --git a/test/java/awt/Focus/CloseDialogActivateOwnerTest/CloseDialogActivateOwnerTest.java b/test/java/awt/Focus/CloseDialogActivateOwnerTest/CloseDialogActivateOwnerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..93c379f0d7ececf104475ffbe73a27de09ec08f3 --- /dev/null +++ b/test/java/awt/Focus/CloseDialogActivateOwnerTest/CloseDialogActivateOwnerTest.java @@ -0,0 +1,114 @@ +/* + * Copyright 2008-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 6785058 + @summary Tests that an owner is activated on closing its owned dialog with the warning icon. + @author Anton Tarasov: area=awt.focus + @library ../../regtesthelpers + @build Util + @run main/othervm/policy=java.policy -Djava.security.manager CloseDialogActivateOwnerTest +*/ + +import java.awt.*; +import java.awt.event.*; +import java.applet.Applet; +import java.util.concurrent.atomic.AtomicBoolean; +import java.lang.reflect.InvocationTargetException; +import test.java.awt.regtesthelpers.Util; + +public class CloseDialogActivateOwnerTest extends Applet { + Robot robot; + + public static void main(String[] args) { + CloseDialogActivateOwnerTest app = new CloseDialogActivateOwnerTest(); + app.init(); + app.start(); + } + + public void init() { + robot = Util.createRobot(); + } + + public void start() { + final Frame frame = new Frame("Owner Frame"); + final Dialog dialog = new Dialog(frame, "Owned Dialog"); + + frame.setSize(100, 100); + dialog.setSize(100, 100); + + // Show the owner. Check that it's focused. + if (!Util.trackWindowGainedFocus(frame, new Runnable() { + public void run() { + frame.setVisible(true); + } + }, 2000, false)) + { + throw new TestErrorException("the owner frame hasn't been activated on show"); + } + + // Show the owned dialog. Check that it's focused. + if (!Util.trackWindowGainedFocus(dialog, new Runnable() { + public void run() { + dialog.setVisible(true); + } + }, 2000, true)) + { + throw new TestErrorException("the owned dialog hasn't been activated on show"); + } + + robot.delay(2000); // wait for the warning icon is shown + + // Close the dialog. Check that the owner is activated. + if (!Util.trackWindowGainedFocus(frame, new Runnable() { + public void run() { + dialog.dispose(); + } + }, 2000, false)) + { + throw new TestFailedException("the owner hasn't been activated on closing the owned dialog"); + } + + System.out.println("Test passed."); + } +} + +/** + * Thrown when the behavior being verified is found wrong. + */ +class TestFailedException extends RuntimeException { + TestFailedException(String msg) { + super("Test failed: " + msg); + } +} + +/** + * Thrown when an error not related to the behavior being verified is encountered. + */ +class TestErrorException extends Error { + TestErrorException(String msg) { + super("Unexpected error: " + msg); + } +} + diff --git a/test/java/awt/Focus/CloseDialogActivateOwnerTest/java.policy b/test/java/awt/Focus/CloseDialogActivateOwnerTest/java.policy new file mode 100644 index 0000000000000000000000000000000000000000..c691dabc15d2c68e9002c1f086b8a505f1548ab9 --- /dev/null +++ b/test/java/awt/Focus/CloseDialogActivateOwnerTest/java.policy @@ -0,0 +1,3 @@ +grant { + permission java.awt.AWTPermission "createRobot"; +}; diff --git a/test/java/awt/Focus/IconifiedFrameFocusChangeTest/IconifiedFrameFocusChangeTest.java b/test/java/awt/Focus/IconifiedFrameFocusChangeTest/IconifiedFrameFocusChangeTest.java index 409ce351f34a68c6bf42ba762ced05485306cc8d..8ab82bdb68945e38d294fc5f67481c129741ad9a 100644 --- a/test/java/awt/Focus/IconifiedFrameFocusChangeTest/IconifiedFrameFocusChangeTest.java +++ b/test/java/awt/Focus/IconifiedFrameFocusChangeTest/IconifiedFrameFocusChangeTest.java @@ -71,8 +71,14 @@ public class IconifiedFrameFocusChangeTest extends Applet { testFrame.setVisible(true); Util.waitForIdle(robot); + robot.delay(1000); // additional delay is required + if (!testButton.hasFocus()) { - throw new TestErrorException("wrong initial focus"); + testButton.requestFocus(); + Util.waitForIdle(robot); + if (!testButton.hasFocus()) { + throw new TestErrorException("couldn't focus " + testButton); + } } /* diff --git a/test/java/awt/Focus/OwnedWindowFocusIMECrashTest/OwnedWindowFocusIMECrashTest.java b/test/java/awt/Focus/OwnedWindowFocusIMECrashTest/OwnedWindowFocusIMECrashTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ee73420ffb232ad2a59e590d2764604f9031bda6 --- /dev/null +++ b/test/java/awt/Focus/OwnedWindowFocusIMECrashTest/OwnedWindowFocusIMECrashTest.java @@ -0,0 +1,88 @@ +/* + * Copyright 2008-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 6542975 + @summary Tests that switching focus from an owned window doesn't crash. + @author anton.tarasov@sun.com: area=awt-focus + @library ../../regtesthelpers + @build Util + @run main OwnedWindowFocusIMECrashTest +*/ + +import java.awt.*; +import javax.swing.*; +import test.java.awt.regtesthelpers.Util; + +public class OwnedWindowFocusIMECrashTest { + Robot robot; + JFrame owner = new JFrame("Owner Frame"); + JFrame frame = new JFrame("Other Frame"); + JWindow window = new JWindow(owner); + JButton button = new JButton("Button"); + + public static void main(String[] args) { + OwnedWindowFocusIMECrashTest app = new OwnedWindowFocusIMECrashTest(); + app.init(); + app.start(); + } + + public void init() { + robot = Util.createRobot(); + } + + public void start() { + owner.setBounds(100, 100, 200, 100); + window.setBounds(100, 250, 200, 100); + frame.setBounds(350, 100, 200, 100); + window.add(button); + + owner.setVisible(true); + frame.setVisible(true); + window.setVisible(true); + + Util.waitForIdle(robot); + + test(); + + System.out.println("Test passed"); + } + + void test() { + Util.clickOnComp(button, robot); + if (!button.hasFocus()) { + throw new TestErrorException("the button couldn't be focused by click"); + } + Util.clickOnTitle(frame, robot); // here there was a crash + } +} + +/** + * Thrown when an error not related to the behavior being verified is encountered. + */ +class TestErrorException extends RuntimeException { + TestErrorException(String msg) { + super("Unexpected error: " + msg); + } +} diff --git a/test/java/awt/Focus/RemoveAfterRequest/RemoveAfterRequest.java b/test/java/awt/Focus/RemoveAfterRequest/RemoveAfterRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..728b48a0bdd2f00b905e64b924f8ae6903a8a111 --- /dev/null +++ b/test/java/awt/Focus/RemoveAfterRequest/RemoveAfterRequest.java @@ -0,0 +1,102 @@ +/* + * 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 6411406 + @summary Components automatically transfer focus on removal, even if developer requests focus elsewhere first + @author oleg.sukhodolsky, anton.tarasov: area=awt.focus + @library ../../regtesthelpers + @build Util + @run main RemoveAfterRequest +*/ + +/** + * RemoveAfterRequest.java + * + * summary: Components automatically transfer focus on removal, even if developer requests focus elsewhere first + */ + +import java.awt.*; +import java.awt.event.*; +import test.java.awt.regtesthelpers.Util; + +public class RemoveAfterRequest { + final static Frame frame = new Frame("test frame"); + final static Button btn1 = new Button("btn1"); + final static Button btn2 = new Button("btn2"); + final static Button btn3 = new Button("btn3"); + + public static void main(String[] args) { + frame.setLayout(new GridLayout(3, 1)); + frame.add(btn1); + frame.add(btn2); + frame.add(btn3); + frame.pack(); + frame.setVisible(true); + + Util.waitForIdle(null); + + if (!btn1.hasFocus()) { + btn1.requestFocus(); + Util.waitForIdle(null); + if (!btn1.hasFocus()) { + throw new TestErrorException("couldn't focus " + btn1); + } + } + + if (!Util.trackFocusGained(btn3, new Runnable() { + public void run() { + btn3.requestFocus(); + frame.remove(btn1); + frame.invalidate(); + frame.validate(); + frame.repaint(); + } + }, 2000, true)) + { + throw new TestFailedException("focus request on removal failed"); + } + + System.out.println("Test passed."); + } +} + +/** + * Thrown when the behavior being verified is found wrong. + */ +class TestFailedException extends RuntimeException { + TestFailedException(String msg) { + super("Test failed: " + msg); + } +} + +/** + * Thrown when an error not related to the behavior being verified is encountered. + */ +class TestErrorException extends RuntimeException { + TestErrorException(String msg) { + super("Unexpected error: " + msg); + } +} + diff --git a/test/java/awt/FontClass/CreateFont/A.ttf b/test/java/awt/FontClass/CreateFont/A.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f80f5c3d569c810493a9fbaf7141a63831733764 Binary files /dev/null and b/test/java/awt/FontClass/CreateFont/A.ttf differ diff --git a/test/java/awt/FontClass/CreateFont/BigFont.java b/test/java/awt/FontClass/CreateFont/BigFont.java new file mode 100644 index 0000000000000000000000000000000000000000..c14802485bcbe091473e2a5a5a81e72b10770140 --- /dev/null +++ b/test/java/awt/FontClass/CreateFont/BigFont.java @@ -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<fontCnt; i++) { + try { + URL url = new URL(getCodeBase(), fileName); + InputStream inStream = url.openStream(); + BufferedInputStream fontStream = + new BufferedInputStream(inStream); + fonts[i] = Font.createFont(Font.TRUETYPE_FONT, fontStream); + totalSize += oneFont; + fontStream.close(); + } catch (Throwable t) { + gotException = true; + System.out.println("Applet " + id + " " + t); + } + } + if (!gotException) { + throw new RuntimeException("No expected exception"); + } + } +} + diff --git a/test/java/awt/FontClass/CreateFont/DeleteFont.java b/test/java/awt/FontClass/CreateFont/DeleteFont.java new file mode 100644 index 0000000000000000000000000000000000000000..361b0b436ac2d4f4d7953a52a6ba8a836c68d34f --- /dev/null +++ b/test/java/awt/FontClass/CreateFont/DeleteFont.java @@ -0,0 +1,89 @@ +/* + * Copyright 2004-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.io.*; +import java.awt.*; + +public class DeleteFont { + + public static void main(String args[]) throws Exception { + + String font = "A.ttf"; + String sep = System.getProperty("file.separator"); + String testSrc = System.getenv("TESTSRC"); + if (testSrc != null) { + font = testSrc + sep + font; + } + System.out.println("Using font file: " + font); + FileInputStream fis = new FileInputStream(font); + Font f = Font.createFont(Font.TRUETYPE_FONT, fis); + f.toString(); + f.deriveFont(Font.BOLD); + f.canDisplay('X'); + + InputStream in = new InputStream() { + public int read() { + throw new RuntimeException(); + } + }; + boolean gotException = false; + try { + Font.createFont(java.awt.Font.TRUETYPE_FONT, in); + } catch (IOException e) { + gotException = true; + } + if (!gotException) { + throw new RuntimeException("No expected IOException"); + } + badRead(-2, Font.TRUETYPE_FONT); + badRead(8193, Font.TRUETYPE_FONT); + + badRead(-2, Font.TYPE1_FONT); + badRead(8193, Font.TYPE1_FONT); + + // Make sure GC has a chance to clean up before we exit. + System.gc(); System.gc(); + } + + static void badRead(final int retval, int fontType) { + int num = 2; + byte[] buff = new byte[16*8192]; // Multiple of 8192 is important. + for (int ct=0; ct<num; ++ct) { + try { + Font.createFont( + fontType, + new ByteArrayInputStream(buff) { + @Override + public int read(byte[] buff, int off, int len) { + int read = super.read(buff, off, len); + return read<0 ? retval : read; + } + } + ); + } catch (Throwable exc) { + //exc.printStackTrace(); + } + } + } +} + diff --git a/test/java/awt/FontClass/CreateFont/DeleteFont.sh b/test/java/awt/FontClass/CreateFont/DeleteFont.sh new file mode 100644 index 0000000000000000000000000000000000000000..ba673803bb51e47fe9b78e1f5d152cff4f9c0b4b --- /dev/null +++ b/test/java/awt/FontClass/CreateFont/DeleteFont.sh @@ -0,0 +1,66 @@ +# Copyright 2004-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 6189812 6380357 6632886 +# @summary Verify that temporary font files are deleted on exit. + +if [ -z "${TESTSRC}" ]; then + echo "TESTSRC undefined: defaulting to ." + TESTSRC=. +fi + +if [ -z "${TESTCLASSES}" ]; then + echo "TESTCLASSES undefined: defaulting to ." + TESTCLASSES=. +fi + +if [ -z "${TESTJAVA}" ]; then + echo "TESTJAVA undefined: can't continue." + exit 1 +fi + +echo "TESTJAVA=${TESTJAVA}" +echo "TESTSRC=${TESTSRC}" +echo "TESTCLASSES=${TESTCLASSES}" +cd ${TESTSRC} +${TESTJAVA}/bin/javac -d ${TESTCLASSES} DeleteFont.java + +cd ${TESTCLASSES} + +numfiles0=`ls ${TESTCLASSES} | wc -l` +${TESTJAVA}/bin/java -Djava.io.tmpdir=${TESTCLASSES} DeleteFont + +if [ $? -ne 0 ] + then + echo "Test fails: exception thrown!" + exit 1 +fi + +numfiles1=`ls ${TESTCLASSES} | wc -l` + +if [ $numfiles0 -ne $numfiles1 ] + then + echo "Test fails: tmp file exists!" + ls ${TESTCLASSES} + exit 1 +fi +exit 0 diff --git a/test/java/awt/FontClass/CreateFont/bigfont.html b/test/java/awt/FontClass/CreateFont/bigfont.html new file mode 100644 index 0000000000000000000000000000000000000000..523c61f0bde7123beadb8a1754ac899203c67bfd --- /dev/null +++ b/test/java/awt/FontClass/CreateFont/bigfont.html @@ -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 6522586 + @run applet bigfont.html + @summary Enforce limits on font creation + +--> + +<html> + <head> + <title>Test Font Creation Limits + + +
+ + + + + + + + +
+ + + diff --git a/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java b/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java new file mode 100644 index 0000000000000000000000000000000000000000..44419748903c9a6f10dad6511ed47b7dc3d089d3 --- /dev/null +++ b/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java @@ -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 --git a/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html b/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html new file mode 100644 index 0000000000000000000000000000000000000000..64ef5d13d949e64eda21a152672c0e4854ec1903 --- /dev/null +++ b/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html @@ -0,0 +1,20 @@ + + + + AcceleratorTest + + + +

AcceleratorTest
Bug ID:

+ +

See the dialog box (usually in upper left corner) for instructions

+ + + + diff --git a/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java b/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d0c71407ca51b286e216fe7e85f3ee180bc82df9 --- /dev/null +++ b/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java @@ -0,0 +1,305 @@ +/* + test + @bug 6680988 + @summary verify that various shortcuts and accelerators work + @author yuri.nesterenko : area=awt.keyboard + @run applet/manual=yesno AcceleratorTest.html +*/ + +/** + * AcceleratorTest.java + * + * summary: + */ + +//import java.applet.Applet; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.Hashtable; + + +public class AcceleratorTest extends JApplet +{ + //Declare things used in the test, like buttons and labels here + static int pressed = 0; + Hashtable cmdHash = new Hashtable(); + String[] CMD = { + "\u042E, keep me in focus", + "Item Cyrl Be", + "Item English Period", + "Item English N", + "\u0436" + }; + + JFrame jfr; + + public void init() + { + //Create instructions for the user here, as well as set up + // the environment -- set the layout manager, add buttons, + // etc. + this.setLayout (new BorderLayout ()); + + String[] instructions = + { + " Ensure you have Russian keyboard layout as a currently active.", + "(1) Press Ctrl+\u0411 (a key with \",<\" on it) ", + "(2) Find a . (period) in this layout (perhaps \"/?\" or \"7&\" key).", + "Press Ctrl+.", + "(3) Press Crtl+ regular English . (period) key (on \".>\" )", + "(4) Press Ctrl+ key with English N.", + "(5) Press Alt+\u042E (key with \".>\")", + "(6) Press Alt+\u0436 (key with \";:\")", + "If all expected commands will be fired, look for message", + "\"All tests passed\"" + }; + Sysout.createDialogWithInstructions( instructions ); + for(int i = 0; i < CMD.length; i++) { + cmdHash.put(CMD[i], 0); + } + + jfr = new JFrame(); + JButton jbu; + jfr.add((jbu = new JButton(CMD[0]))); + jbu.setMnemonic(java.awt.event.KeyEvent.getExtendedKeyCodeForChar('\u042E')); + jbu.addActionListener( new ALi(CMD[0])); + + + JMenuBar menuBar = new JMenuBar(); + jfr.setJMenuBar(menuBar); + JMenu menu = new JMenu("Menu"); + menuBar.add(menu); + + JMenuItem menuItem = new JMenuItem(CMD[1]); + menuItem.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.getExtendedKeyCodeForChar('\u0431'), + InputEvent.CTRL_DOWN_MASK)); + + JMenuItem menuItemEnglish = new JMenuItem(CMD[2]); + menuItemEnglish.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, + InputEvent.CTRL_DOWN_MASK)); + JMenuItem menuItemE1 = new JMenuItem(CMD[3]); + menuItemE1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, + InputEvent.CTRL_DOWN_MASK)); + menuItem.addActionListener( new ALi(CMD[1])); + menuItemEnglish.addActionListener( new ALi(CMD[2])); + menuItemE1.addActionListener( new ALi(CMD[3])); + menu.add(menuItem); + menu.add(menuItemEnglish); + menu.add(menuItemE1); + + KeyStroke ks; + InputMap im = new InputMap(); + ks = KeyStroke.getKeyStroke(KeyEvent.getExtendedKeyCodeForChar('\u0436'), java.awt.event.InputEvent.ALT_DOWN_MASK); + im.put(ks, "pushAction"); + im.setParent(jbu.getInputMap(JComponent.WHEN_FOCUSED)); + jbu.setInputMap(JComponent.WHEN_FOCUSED, im); + + jbu.getActionMap().put("pushAction", + new AbstractAction("pushAction") { + public void actionPerformed(ActionEvent evt) { + if( evt.getActionCommand().equals(CMD[4])) { + cmdHash.put(CMD[4], 1); + } + boolean notYet = false; + for(int i = 0; i < CMD.length; i++) { + if(cmdHash.get(CMD[i]) == 0 ) notYet = true; + } + Sysout.println("Fired"); + if( !notYet ) { + Sysout.println("All tests passed."); + } + } + } + ); + + + jfr.setBounds(650,0,200,200); + jfr.setVisible(true); + + }//End init() + + public void start () + { + //Get things going. Request focus, set size, et cetera + setSize (200,200); + setVisible(true); + validate(); + + }// start() + public class ALi implements ActionListener { + String expectedCmd; + public ALi( String eCmd ) { + expectedCmd = eCmd; + } + public void actionPerformed(ActionEvent ae) { + if( cmdHash.containsKey(ae.getActionCommand()) ) { + cmdHash.put(expectedCmd, 1); + } + boolean notYet = false; + for(int i = 0; i < CMD.length; i++) { + if(cmdHash.get(CMD[i]) == 0 ) notYet = true; + //Sysout.println(CMD[i]+":"+cmdHash.get(CMD[i])); + } + Sysout.println("FIRED"); + if( !notYet ) { + Sysout.println("All tests passed."); + } + } + } + + +}// class AcceleratorTest + +/* Place other classes related to the test after this line */ + + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + private static boolean numbering = false; + private static int messageNumber = 0; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + /* Enables message counting for the tester. */ + public static void enableNumbering(boolean enable){ + numbering = enable; + } + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + if (numbering) { + messageIn = "" + messageNumber + " " + messageIn; + messageNumber++; + } + dialog.displayMessage( messageIn ); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class diff --git a/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html b/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html new file mode 100644 index 0000000000000000000000000000000000000000..2e6132125414c437fff186de9b8c4358e9d368e0 --- /dev/null +++ b/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html @@ -0,0 +1,20 @@ + + + + AWTPanelSmoothWheel + + + +

AWTPanelSmoothWheel
Bug ID: 6730447

+ +

See the dialog box (usually in upper left corner) for instructions

+ + + + diff --git a/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java b/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java new file mode 100644 index 0000000000000000000000000000000000000000..c28682e64751efdad138be6bed148032130eff93 --- /dev/null +++ b/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java @@ -0,0 +1,251 @@ +/* + * 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 6730447 + @summary Support for high resolution mouse wheel is still incomplete. AWT panel needs to be supported + @author dmitry.cherepanov@...: area=awt.mouse + @run applet/manual=yesno AWTPanelSmoothWheel.html +*/ + +/** + * AWTPanelSmoothWheel.java + * + * summary: + */ + +import java.applet.Applet; +import java.awt.*; +import java.awt.event.*; + +//Manual tests should run as applet tests if possible because they +// get their environments cleaned up, including AWT threads, any +// test created threads, and any system resources used by the test +// such as file descriptors. (This is normally not a problem as +// main tests usually run in a separate VM, however on some platforms +// such as the Mac, separate VMs are not possible and non-applet +// tests will cause problems). Also, you don't have to worry about +// synchronisation stuff in Applet tests the way you do in main +// tests... + + +public class AWTPanelSmoothWheel extends Applet +{ + //Declare things used in the test, like buttons and labels here + + public void init() + { + //Create instructions for the user here, as well as set up + // the environment -- set the layout manager, add buttons, + // etc. + this.setLayout (new BorderLayout ()); + + String[] instructions = + { + " the test is relevant for windows platforms and ", + " mouses with high-resolution wheel, please just press pass if it's not the case ", + " place the mouse cursor above the green panel and rotate the mouse wheel " , + " the test will print all mouse wheel messages into the logging panel, ", + " please make sure that some of the messages have non-zero 'wheelRotation' value ", + " in this case the test passes, otherwise it fails, ", + " please make sure the test works OK if the mouse wheel is rotated very slow " + }; + Sysout.createDialogWithInstructions( instructions ); + + }//End init() + + public void start () + { + Panel panel = new Panel(); + panel.setBackground(Color.green); + panel.addMouseWheelListener(new MouseWheelListener() { + public void mouseWheelMoved(MouseWheelEvent e) { + Sysout.println(e.toString()); + } + }); + + //Get things going. Request focus, set size, et cetera + setSize (200,200); + setLayout(new BorderLayout()); + add(panel, BorderLayout.CENTER); + setVisible(true); + validate(); + + //What would normally go into main() will probably go here. + //Use System.out.println for diagnostic messages that you want + // to read after the test is done. + //Use Sysout.println for messages you want the tester to read. + + }// start() + + //The rest of this class is the actions which perform the test... + + //Use Sysout.println to communicate with the user NOT System.out!! + //Sysout.println ("Something Happened!"); + +}// class ManualYesNoTest + +/* Place other classes related to the test after this line */ + + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class + diff --git a/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java b/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java new file mode 100644 index 0000000000000000000000000000000000000000..5e1d2eb3f66ba2323815d38e16f170d32b330bbd --- /dev/null +++ b/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java @@ -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 --git a/test/java/beans/Beans/6669869/TestDesignTime.java b/test/java/beans/Beans/6669869/TestDesignTime.java new file mode 100644 index 0000000000000000000000000000000000000000..e78142a2b90caae0a796732356d1bd7662657789 --- /dev/null +++ b/test/java/beans/Beans/6669869/TestDesignTime.java @@ -0,0 +1,52 @@ +/* + * 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 6669869 + * @summary Tests DesignTime property in different application contexts + * @author Sergey Malenkov + */ + +import java.beans.Beans; +import sun.awt.SunToolkit; + +public class TestDesignTime implements Runnable { + public static void main(String[] args) throws InterruptedException { + if (Beans.isDesignTime()) { + throw new Error("unexpected DesignTime property"); + } + Beans.setDesignTime(!Beans.isDesignTime()); + ThreadGroup group = new ThreadGroup("$$$"); + Thread thread = new Thread(group, new TestDesignTime()); + thread.start(); + thread.join(); + } + + public void run() { + SunToolkit.createNewAppContext(); + if (Beans.isDesignTime()) { + throw new Error("shared DesignTime property"); + } + } +} diff --git a/test/java/beans/Beans/6669869/TestGuiAvailable.java b/test/java/beans/Beans/6669869/TestGuiAvailable.java new file mode 100644 index 0000000000000000000000000000000000000000..7144b6fad3bd42c5e5fc8ca53d1ff8e9f77e4d20 --- /dev/null +++ b/test/java/beans/Beans/6669869/TestGuiAvailable.java @@ -0,0 +1,53 @@ +/* + * 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 6669869 + * @summary Tests GuiAvailable property in different application contexts + * @author Sergey Malenkov + */ + +import java.awt.GraphicsEnvironment; +import java.beans.Beans; +import sun.awt.SunToolkit; + +public class TestGuiAvailable implements Runnable { + public static void main(String[] args) throws InterruptedException { + if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) { + throw new Error("unexpected GuiAvailable property"); + } + Beans.setGuiAvailable(!Beans.isGuiAvailable()); + ThreadGroup group = new ThreadGroup("$$$"); + Thread thread = new Thread(group, new TestGuiAvailable()); + thread.start(); + thread.join(); + } + + public void run() { + SunToolkit.createNewAppContext(); + if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) { + throw new Error("shared GuiAvailable property"); + } + } +} diff --git a/test/java/lang/ClassLoader/deadlock/Alice.java b/test/java/lang/ClassLoader/deadlock/Alice.java new file mode 100644 index 0000000000000000000000000000000000000000..9fae5e411a8ec8699582c0f08389bc6642030b60 --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/Alice.java @@ -0,0 +1,29 @@ +/* + * 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. + */ +package comSA; + +public class Alice extends comSB.SupAlice { + static { + System.out.println("comSA.Alice loaded"); + } +} diff --git a/test/java/lang/ClassLoader/deadlock/Bob.java b/test/java/lang/ClassLoader/deadlock/Bob.java new file mode 100644 index 0000000000000000000000000000000000000000..ca0c279ec91fd3e8c2310ca9bc7b2674b8d8f5c2 --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/Bob.java @@ -0,0 +1,29 @@ +/* + * 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. + */ +package comSB; + +public class Bob extends comSA.SupBob { + static { + System.out.println("comSB.Bob loaded"); + } +} diff --git a/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java b/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..def58c9e53c5e0945740fc3fc9ce31c42a2bd1fe --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java @@ -0,0 +1,93 @@ +/* + * 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. + */ + +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.*; +import java.lang.reflect.*; + +public class DelegatingLoader extends URLClassLoader { + + private DelegatingLoader delLoader; + private String[] delClasses; + + static { + boolean supportParallel = false; + try { + Class c = Class.forName("java.lang.ClassLoader"); + Method m = c.getDeclaredMethod("registerAsParallelCapable", + new Class[0]); + m.setAccessible(true); + Object result = (Boolean) m.invoke(null); + if (result instanceof Boolean) { + supportParallel = ((Boolean) result).booleanValue(); + } else { + // Should never happen + System.out.println("Error: ClassLoader.registerAsParallelCapable() did not return a boolean!"); + System.exit(1); + } + } catch (NoSuchMethodException nsme) { + System.out.println("No ClassLoader.registerAsParallelCapable() API"); + } catch (NoSuchMethodError nsme2) { + System.out.println("No ClassLoader.registerAsParallelCapable() API"); + } catch (Exception ex) { + ex.printStackTrace(); + // Exit immediately to indicate an error + System.exit(1); + } + System.out.println("Parallel ClassLoader registration: " + + supportParallel); + } + + public DelegatingLoader(URL urls[]) { + super(urls); + System.out.println("DelegatingLoader using URL " + urls[0]); + } + + public void setDelegate(String[] delClasses, DelegatingLoader delLoader) { + this.delClasses = delClasses; + this.delLoader = delLoader; + } + + public Class loadClass(String className, boolean resolve) + throws ClassNotFoundException { + for (int i = 0; i < delClasses.length; i++) { + if (delClasses[i].equals(className)) { + Starter.log("Delegating class loading for " + className); + try { + Thread.sleep(500); + } catch (InterruptedException ie) { + return null; + } + return delLoader.loadClass(className, resolve); + } + } + + Starter.log("Loading local class " + className); +// synchronized (getClassLoadingLock(className)) { + return super.loadClass(className, resolve); +// } + } +} diff --git a/test/java/lang/ClassLoader/deadlock/Starter.java b/test/java/lang/ClassLoader/deadlock/Starter.java new file mode 100644 index 0000000000000000000000000000000000000000..c23edb92d31786b531219123a8481091d0bf66cb --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/Starter.java @@ -0,0 +1,105 @@ +/* + * 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. + */ + +import java.net.MalformedURLException; +import java.net.URL; + +public class Starter implements Runnable { + + private String id; + private DelegatingLoader dl; + private String startClass; + + private static DelegatingLoader saLoader, sbLoader; + + public static void log(String line) { + System.out.println(line); + } + + public static void main(String[] args) { + URL[] urlsa = new URL[1]; + URL[] urlsb = new URL[1]; + try { + String testDir = System.getProperty("test.classes", "."); + String sep = System.getProperty("file.separator"); + urlsa[0] = new URL("file://" + testDir + sep + "SA" + sep); + urlsb[0] = new URL("file://" + testDir + sep + "SB" + sep); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + // Set up Classloader delegation hierarchy + saLoader = new DelegatingLoader(urlsa); + sbLoader = new DelegatingLoader(urlsb); + + String[] saClasses = { "comSA.SupBob", "comSA.Alice" }; + String[] sbClasses = { "comSB.SupAlice", "comSB.Bob" }; + + saLoader.setDelegate(sbClasses, sbLoader); + sbLoader.setDelegate(saClasses, saLoader); + + // test one-way delegate + String testType = args[0]; + if (testType.equals("one-way")) { + test("comSA.Alice", "comSA.SupBob"); + } else if (testType.equals("cross")) { + // test cross delegate + test("comSA.Alice", "comSB.Bob"); + } else { + System.out.println("ERROR: unsupported - " + testType); + } + } + + private static void test(String clsForSA, String clsForSB) { + Starter ia = new Starter("SA", saLoader, clsForSA); + Starter ib = new Starter("SB", sbLoader, clsForSB); + new Thread(ia).start(); + new Thread(ib).start(); + } + + public static void sleep() { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + log("Thread interrupted"); + } + } + + private Starter(String id, DelegatingLoader dl, String startClass) { + this.id = id; + this.dl = dl; + this.startClass = startClass; + } + + public void run() { + log("Spawned thread " + id + " running"); + try { + // To mirror the WAS deadlock, need to ensure class load + // is routed via the VM. + Class.forName(startClass, true, dl); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + log("Thread " + id + " terminating"); + } +} diff --git a/test/java/lang/ClassLoader/deadlock/SupAlice.java b/test/java/lang/ClassLoader/deadlock/SupAlice.java new file mode 100644 index 0000000000000000000000000000000000000000..4b04580e01bba85320409f2e77fe0a20030d406f --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/SupAlice.java @@ -0,0 +1,29 @@ +/* + * 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. + */ +package comSB; + +public class SupAlice { + static { + System.out.println("comSB.SupAlice loaded"); + } +} diff --git a/test/java/lang/ClassLoader/deadlock/SupBob.java b/test/java/lang/ClassLoader/deadlock/SupBob.java new file mode 100644 index 0000000000000000000000000000000000000000..05cfde319fd606d9d738446b4aa569396f61cb4e --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/SupBob.java @@ -0,0 +1,29 @@ +/* + * 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. + */ +package comSA; + +public class SupBob { + static { + System.out.println("comSA.SupBob loaded"); + } +} diff --git a/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh b/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh new file mode 100644 index 0000000000000000000000000000000000000000..5c1a1aeb65352887da5d95aa58ecc885be294aae --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh @@ -0,0 +1,105 @@ +# +# 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 4735126 +# @summary (cl) ClassLoader.loadClass locks all instances in chain +# when delegating +# +# @run shell/timeout=10 TestCrossDelegate.sh + +# if running by hand on windows, change TESTSRC and TESTCLASSES to "." +if [ "${TESTSRC}" = "" ] ; then + TESTSRC=`pwd` +fi +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES=`pwd` +fi + +# if running by hand on windows, change this to appropriate value +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi +echo TESTSRC=${TESTSRC} +echo TESTCLASSES=${TESTCLASSES} +echo TESTJAVA=${TESTJAVA} +echo "" + +# set platform-specific variables +OS=`uname -s` +case "$OS" in + SunOS ) + FS="/" + ;; + Linux ) + FS="/" + ;; + Windows* ) + FS="\\" + ;; +esac + +# compile test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES} \ + ${TESTSRC}${FS}Starter.java ${TESTSRC}${FS}DelegatingLoader.java + +STATUS=$? +if [ ${STATUS} -ne 0 ] +then + exit ${STATUS} +fi + +# set up test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES}${FS} \ + ${TESTSRC}${FS}Alice.java ${TESTSRC}${FS}SupBob.java \ + ${TESTSRC}${FS}Bob.java ${TESTSRC}${FS}SupAlice.java + +cd ${TESTCLASSES} +DIRS="SA SB" +for dir in $DIRS +do + if [ -d ${dir} ]; then + rm -rf ${dir} + fi + mkdir ${dir} + mv com${dir} ${dir} +done + +# run test +${TESTJAVA}${FS}bin${FS}java \ + -verbose:class -XX:+TraceClassLoading -cp . \ + -Dtest.classes=${TESTCLASSES} \ + Starter cross +# -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass \ + +# save error status +STATUS=$? + +# clean up +rm -rf ${TESTCLASSES}${FS}SA ${TESTCLASSES}${FS}SB + +# return +exit ${STATUS} diff --git a/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh b/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh new file mode 100644 index 0000000000000000000000000000000000000000..1f6a08ff34252113a977b07bb5d6c6ee717773f0 --- /dev/null +++ b/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh @@ -0,0 +1,105 @@ +# +# 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 4735126 +# @summary (cl) ClassLoader.loadClass locks all instances in chain +# when delegating +# +# @run shell/timeout=10 TestOneWayDelegate.sh + +# if running by hand on windows, change TESTSRC and TESTCLASSES to "." +if [ "${TESTSRC}" = "" ] ; then + TESTSRC=`pwd` +fi +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES=`pwd` +fi + +# if running by hand on windows, change this to appropriate value +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi +echo TESTSRC=${TESTSRC} +echo TESTCLASSES=${TESTCLASSES} +echo TESTJAVA=${TESTJAVA} +echo "" + +# set platform-specific variables +OS=`uname -s` +case "$OS" in + SunOS ) + FS="/" + ;; + Linux ) + FS="/" + ;; + Windows* ) + FS="\\" + ;; +esac + +# compile test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES} \ + ${TESTSRC}${FS}Starter.java ${TESTSRC}${FS}DelegatingLoader.java + +STATUS=$? +if [ ${STATUS} -ne 0 ] +then + exit ${STATUS} +fi + +# set up test +${TESTJAVA}${FS}bin${FS}javac \ + -d ${TESTCLASSES}${FS} \ + ${TESTSRC}${FS}Alice.java ${TESTSRC}${FS}SupBob.java \ + ${TESTSRC}${FS}Bob.java ${TESTSRC}${FS}SupAlice.java + +cd ${TESTCLASSES} +DIRS="SA SB" +for dir in $DIRS +do + if [ -d ${dir} ]; then + rm -rf ${dir} + fi + mkdir ${dir} + mv com${dir} ${dir} +done + +# run test +${TESTJAVA}${FS}bin${FS}java \ + -verbose:class -XX:+TraceClassLoading -cp . \ + -Dtest.classes=${TESTCLASSES} \ + Starter one-way +# -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass \ + +# save error status +STATUS=$? + +# clean up +rm -rf ${TESTCLASSES}${FS}SA ${TESTCLASSES}${FS}SB + +# return +exit ${STATUS} diff --git a/test/java/lang/Integer/ValueOf.java b/test/java/lang/Integer/ValueOf.java new file mode 100644 index 0000000000000000000000000000000000000000..c6f47f571eeef1a0b443ff19190fc5ab499384b0 --- /dev/null +++ b/test/java/lang/Integer/ValueOf.java @@ -0,0 +1,55 @@ +/* + * 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 6807702 + * @summary Basic test for Integer.valueOf + * @run main ValueOf + * @run main/othervm -esa -XX:+AggressiveOpts ValueOf + */ + +public class ValueOf { + + // test Integer.valueOf over this range (inclusive) + private static final int TEST_LOW = -1024; + private static final int TEST_HIGH = 24576; + + public static void main(String[] args) { + int i = TEST_LOW; + while (i <= TEST_HIGH) { + // check that valueOf stores i + if (Integer.valueOf(i).intValue() != i) + throw new RuntimeException(); + + // check that the same object is returned for integral values + // in the range -128 to 127 (inclusive) + if (i >= -128 && i <= 127) { + if (Integer.valueOf(i) != Integer.valueOf(i)) + throw new RuntimeException(); + } + + i++; + } + } +} diff --git a/test/java/lang/String/ToLowerCase.java b/test/java/lang/String/ToLowerCase.java index 84d5d5af208f80fb45d0c310203a13c373ffee71..5d43b45ee0628cac37a4c819ee5acf77beb8c571 100644 --- a/test/java/lang/String/ToLowerCase.java +++ b/test/java/lang/String/ToLowerCase.java @@ -72,7 +72,7 @@ public class ToLowerCase { // I-dot tests (Turkish and Azeri) test("\u0130", turkish, "i"); test("\u0130", az, "i"); - test("\u0130", Locale.US, "i"); + test("\u0130", Locale.US, "i\u0307"); // Remove dot_above in the sequence I + dot_above (Turkish and Azeri) test("I\u0307", turkish, "i"); diff --git a/test/java/nio/Buffer/Basic-X.java b/test/java/nio/Buffer/Basic-X.java index d4e1a2762f11d1a7c79ea418f2a88282cbec2d2d..6612771def4d2c49d9298d3fe7baeb79be39d0a7 100644 --- a/test/java/nio/Buffer/Basic-X.java +++ b/test/java/nio/Buffer/Basic-X.java @@ -365,8 +365,11 @@ public class Basic$Type$ 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 @@ public class Basic$Type$ 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 --git a/test/java/nio/Buffer/Basic.java b/test/java/nio/Buffer/Basic.java index c0c420f84958ff4fcfd1d4bed623ad4c053fe2ef..b8ed89bb30d5f759df3135963c00b79d5571504f 100644 --- a/test/java/nio/Buffer/Basic.java +++ b/test/java/nio/Buffer/Basic.java @@ -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 --git a/test/java/nio/Buffer/BasicByte.java b/test/java/nio/Buffer/BasicByte.java index 0f5ac6f6e0a75936596f5cfd2ff4d520c39870db..7e259a1416ded179ab076c0b7c9dab17c3718be3 100644 --- a/test/java/nio/Buffer/BasicByte.java +++ b/test/java/nio/Buffer/BasicByte.java @@ -371,6 +371,9 @@ public class BasicByte + + + @@ -783,6 +786,8 @@ public class BasicByte + + diff --git a/test/java/nio/Buffer/BasicChar.java b/test/java/nio/Buffer/BasicChar.java index 28eb49fb560c5c573b0abc843f28f24e442087c1..a0df9fcf3a92dc00751f41301af8025f4831730b 100644 --- a/test/java/nio/Buffer/BasicChar.java +++ b/test/java/nio/Buffer/BasicChar.java @@ -365,8 +365,11 @@ public class BasicChar 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 @@ public class BasicChar 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 --git a/test/java/nio/Buffer/BasicDouble.java b/test/java/nio/Buffer/BasicDouble.java index b2a1be65ad7d62aaf5a3a2a525b2a36c871d07af..a627d0e919469911e73b09a61195896b0374ae74 100644 --- a/test/java/nio/Buffer/BasicDouble.java +++ b/test/java/nio/Buffer/BasicDouble.java @@ -371,6 +371,9 @@ public class BasicDouble + + + @@ -783,6 +786,8 @@ public class BasicDouble + + diff --git a/test/java/nio/Buffer/BasicFloat.java b/test/java/nio/Buffer/BasicFloat.java index b6b5ea0dbdf528484af1952a0a50cb1e2182a0f9..730dcbeac956a4eb296dced253c73c37d2932819 100644 --- a/test/java/nio/Buffer/BasicFloat.java +++ b/test/java/nio/Buffer/BasicFloat.java @@ -371,6 +371,9 @@ public class BasicFloat + + + @@ -783,6 +786,8 @@ public class BasicFloat + + diff --git a/test/java/nio/Buffer/BasicInt.java b/test/java/nio/Buffer/BasicInt.java index 938ada2957168833a17cb77cae1ce57510775316..b20e4bb1056e0329298e6db753f50a71383d9b3c 100644 --- a/test/java/nio/Buffer/BasicInt.java +++ b/test/java/nio/Buffer/BasicInt.java @@ -371,6 +371,9 @@ public class BasicInt + + + @@ -783,6 +786,8 @@ public class BasicInt + + diff --git a/test/java/nio/Buffer/BasicLong.java b/test/java/nio/Buffer/BasicLong.java index 17537a71ffce2ce7db4c41da8082ef96418ec6da..0d4c568e1e3beeda4560291e88dbd665dd3127be 100644 --- a/test/java/nio/Buffer/BasicLong.java +++ b/test/java/nio/Buffer/BasicLong.java @@ -371,6 +371,9 @@ public class BasicLong + + + @@ -783,6 +786,8 @@ public class BasicLong + + diff --git a/test/java/nio/Buffer/BasicShort.java b/test/java/nio/Buffer/BasicShort.java index dc9c7db38039f45b99c7ad5d6a4f79ada9c01ab0..58e5a3e6d6851c3f758113cf8f3c12aea0833927 100644 --- a/test/java/nio/Buffer/BasicShort.java +++ b/test/java/nio/Buffer/BasicShort.java @@ -371,6 +371,9 @@ public class BasicShort + + + @@ -783,6 +786,8 @@ public class BasicShort + + diff --git a/test/java/nio/channels/AsyncCloseAndInterrupt.java b/test/java/nio/channels/AsyncCloseAndInterrupt.java index 834e7431eb64c5627361b0c8c33f9b94d96d5273..1755d0170dc3b42a554eb8e47ce0e5f77acb82be 100644 --- a/test/java/nio/channels/AsyncCloseAndInterrupt.java +++ b/test/java/nio/channels/AsyncCloseAndInterrupt.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4460583 4470470 4840199 6419424 6710579 6596323 + * @bug 4460583 4470470 4840199 6419424 6710579 6596323 6824135 * @summary Comprehensive test of asynchronous closing and interruption * @author Mark Reinhold */ diff --git a/test/java/nio/channels/AsynchronousFileChannel/Basic.java b/test/java/nio/channels/AsynchronousFileChannel/Basic.java index 5ffb42c0b8bb85d3b58cfcc6e8ddfa0ca6a6cd1c..1f37d4be11c0e48a421cc372f7934bab17068c97 100644 --- a/test/java/nio/channels/AsynchronousFileChannel/Basic.java +++ b/test/java/nio/channels/AsynchronousFileChannel/Basic.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4607272 + * @bug 4607272 6822643 6830721 * @summary Unit test for AsynchronousFileChannel */ @@ -51,7 +51,6 @@ public class Basic { // 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 @@ public class Basic { testClosedChannel(ch); // these tests open the file themselves + testLocking(blah.toPath()); testCustomThreadPool(blah.toPath()); testAsynchronousClose(blah.toPath()); testCancel(blah.toPath()); @@ -160,47 +160,54 @@ public class Basic { } // 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 @@ -424,10 +431,11 @@ public class Basic { throw new RuntimeException("isCancelled not consistent"); try { res.get(); - if (!cancelled) + if (cancelled) throw new RuntimeException("CancellationException expected"); } catch (CancellationException x) { - // expected + if (!cancelled) + throw new RuntimeException("CancellationException not expected"); } catch (ExecutionException x) { throw new RuntimeException(x); } catch (InterruptedException x) { @@ -435,9 +443,11 @@ public class Basic { } try { res.get(1, TimeUnit.SECONDS); - throw new RuntimeException("CancellationException expected"); + if (cancelled) + throw new RuntimeException("CancellationException expected"); } catch (CancellationException x) { - // expected + if (!cancelled) + throw new RuntimeException("CancellationException not expected"); } catch (ExecutionException x) { throw new RuntimeException(x); } catch (TimeoutException x) { diff --git a/test/java/nio/channels/AsynchronousFileChannel/Lock.java b/test/java/nio/channels/AsynchronousFileChannel/Lock.java index 38c0f7d0c6e39c735e622750f419aef110acaed6..f8b55cc44f89cb5d44d1639a2051034015a0c954 100644 --- a/test/java/nio/channels/AsynchronousFileChannel/Lock.java +++ b/test/java/nio/channels/AsynchronousFileChannel/Lock.java @@ -23,7 +23,7 @@ /* @test - * @bug 4607272 + * @bug 4607272 6814948 * @summary Unit test for AsynchronousFileChannel#lock method */ diff --git a/test/java/nio/channels/DatagramChannel/NotBound.java b/test/java/nio/channels/DatagramChannel/NotBound.java index 9a58fe64d18e96c6474f615435ffa6552c0e043c..d9fbd7b5efa66a795d8dd361db3c97746ca30c0f 100644 --- a/test/java/nio/channels/DatagramChannel/NotBound.java +++ b/test/java/nio/channels/DatagramChannel/NotBound.java @@ -22,27 +22,110 @@ */ /* @test - * @bug 4512723 - * @summary Unit test for datagram-socket-channel adaptors + * @bug 4512723 6621689 + * @summary Test that connect/send/receive with unbound DatagramChannel causes + * the channel's socket to be bound to a local address */ import java.net.*; -import java.nio.*; -import java.nio.channels.*; +import java.nio.ByteBuffer; +import java.nio.channels.DatagramChannel; +import java.io.IOException; -class NotBound { - public static void main(String[] args) throws Exception { - test1(false); - test1(true); +public class NotBound { + + static void checkBound(DatagramChannel dc) throws IOException { + if (dc.getLocalAddress() == null) + throw new RuntimeException("Not bound??"); + } + + // starts a thread to send a datagram to the given channel once the channel + // is bound to a local address + static void wakeupWhenBound(final DatagramChannel dc) { + Runnable wakeupTask = new Runnable() { + public void run() { + try { + // poll for local address + InetSocketAddress local; + do { + Thread.sleep(50); + local = (InetSocketAddress)dc.getLocalAddress(); + } while (local == null); + + // send message to channel to wakeup receiver + DatagramChannel sender = DatagramChannel.open(); + try { + ByteBuffer bb = ByteBuffer.wrap("hello".getBytes()); + InetAddress lh = InetAddress.getLocalHost(); + SocketAddress target = + new InetSocketAddress(lh, local.getPort()); + sender.send(bb, target); + } finally { + sender.close(); + } + + } catch (Exception x) { + x.printStackTrace(); + } + }}; + new Thread(wakeupTask).start(); } - static void test1(boolean blocking) throws Exception { - ByteBuffer bb = ByteBuffer.allocateDirect(256); - DatagramChannel dc1 = DatagramChannel.open(); - dc1.configureBlocking(false); - SocketAddress isa = dc1.receive(bb); - if (isa != null) - throw new Exception("Unbound dc returned non-null"); - dc1.close(); + public static void main(String[] args) throws IOException { + DatagramChannel dc; + + // connect + dc = DatagramChannel.open(); + try { + DatagramChannel peer = DatagramChannel.open() + .bind(new InetSocketAddress(0)); + int peerPort = ((InetSocketAddress)(peer.getLocalAddress())).getPort(); + try { + dc.connect(new InetSocketAddress(InetAddress.getLocalHost(), peerPort)); + checkBound(dc); + } finally { + peer.close(); + } + } finally { + dc.close(); + } + + // send + dc = DatagramChannel.open(); + try { + ByteBuffer bb = ByteBuffer.wrap("ignore this".getBytes()); + SocketAddress target = + new InetSocketAddress(InetAddress.getLocalHost(), 5000); + dc.send(bb, target); + checkBound(dc); + } finally { + dc.close(); + } + + // receive (blocking) + dc = DatagramChannel.open(); + try { + ByteBuffer bb = ByteBuffer.allocateDirect(128); + wakeupWhenBound(dc); + SocketAddress sender = dc.receive(bb); + if (sender == null) + throw new RuntimeException("Sender should not be null"); + checkBound(dc); + } finally { + dc.close(); + } + + // receive (non-blocking) + dc = DatagramChannel.open(); + try { + dc.configureBlocking(false); + ByteBuffer bb = ByteBuffer.allocateDirect(128); + SocketAddress sender = dc.receive(bb); + if (sender != null) + throw new RuntimeException("Sender should be null"); + checkBound(dc); + } finally { + dc.close(); + } } } diff --git a/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java b/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java new file mode 100644 index 0000000000000000000000000000000000000000..c7ed16a920475deb94eff42808139cdbb2f675f5 --- /dev/null +++ b/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java @@ -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 nm = (NavigableMap) m; + testNavigableMapRemovers(nm); testNavigableMap(nm); testNavigableMap(nm.headMap(6, false)); testNavigableMap(nm.headMap(5, true)); @@ -742,6 +743,97 @@ public class MOAT { equal(it.next(), expected); } + static void equalMaps(Map m1, Map m2) { + equal(m1, m2); + equal(m2, m1); + equal(m1.size(), m2.size()); + equal(m1.isEmpty(), m2.isEmpty()); + equal(m1.toString(), m2.toString()); + check(Arrays.equals(m1.entrySet().toArray(), m2.entrySet().toArray())); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + static void testNavigableMapRemovers(NavigableMap m) + { + final Map emptyMap = new HashMap(); + + final Map singletonMap = new HashMap(); + singletonMap.put(1, 2); + + abstract class NavigableMapView { + abstract NavigableMap view(NavigableMap m); + } + + NavigableMapView[] views = { + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m; }}, + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m.headMap(99, true); }}, + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m.tailMap(-99, false); }}, + new NavigableMapView() { NavigableMap view(NavigableMap m) { + return m.subMap(-99, true, 99, false); }}, + }; + + abstract class Remover { + abstract void remove(NavigableMap m, Object k, Object v); + } + + Remover[] removers = { + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.remove(k), v); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.descendingMap().remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.descendingMap().headMap(-86, false).remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.descendingMap().tailMap(86, true).remove(k), v); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.headMap(86, true).remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.tailMap(-86, true).remove(k), v); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + equal(m.subMap(-86, false, 86, true).remove(k), v); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.keySet().remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().remove(k)); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().headSet(86, true).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().tailSet(-86, false).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.navigableKeySet().subSet(-86, true, 86, false) + .remove(k)); }}, + + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.descendingKeySet().headSet(-86, false).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.descendingKeySet().tailSet(86, true).remove(k)); }}, + new Remover() { void remove(NavigableMap m, Object k, Object v) { + check(m.descendingKeySet().subSet(86, true, -86, false) + .remove(k)); }}, + }; + + for (NavigableMapView view : views) { + for (Remover remover : removers) { + try { + m.clear(); + equalMaps(m, emptyMap); + equal(m.put(1, 2), null); + equalMaps(m, singletonMap); + NavigableMap v = view.view(m); + remover.remove(v, 1, 2); + equalMaps(m, emptyMap); + } catch (Throwable t) { unexpected(t); } + } + } + } + private static void testNavigableMap(NavigableMap m) { clear(m); diff --git a/test/java/util/concurrent/Semaphore/RacingReleases.java b/test/java/util/concurrent/Semaphore/RacingReleases.java new file mode 100644 index 0000000000000000000000000000000000000000..c1c573f443fb00eab3b7f70d9bfd81c721c24354 --- /dev/null +++ b/test/java/util/concurrent/Semaphore/RacingReleases.java @@ -0,0 +1,116 @@ +/* + * 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. + */ + +/* + * This file is available under and governed by the GNU General Public + * License version 2 only, as published by the Free Software Foundation. + * However, the following notice accompanied the original version of this + * file: + * + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/licenses/publicdomain + */ + +/* + * @test + * @bug 6801020 6803402 + * @summary Try to tickle race conditions in + * AbstractQueuedSynchronizer "shared" code + */ + +import java.util.concurrent.Semaphore; + +public class RacingReleases { + + /** Increase this for better chance of tickling races */ + static final int iterations = 1000; + + public static void test(final boolean fair, + final boolean interruptibly) + throws Throwable { + for (int i = 0; i < iterations; i++) { + final Semaphore sem = new Semaphore(0, fair); + final Throwable[] badness = new Throwable[1]; + Runnable blocker = interruptibly ? + new Runnable() { + public void run() { + try { + sem.acquire(); + } catch (Throwable t) { + badness[0] = t; + throw new Error(t); + }}} + : + new Runnable() { + public void run() { + try { + sem.acquireUninterruptibly(); + } catch (Throwable t) { + badness[0] = t; + throw new Error(t); + }}}; + + Thread b1 = new Thread(blocker); + Thread b2 = new Thread(blocker); + Runnable signaller = new Runnable() { + public void run() { + try { + sem.release(); + } catch (Throwable t) { + badness[0] = t; + throw new Error(t); + }}}; + Thread s1 = new Thread(signaller); + Thread s2 = new Thread(signaller); + Thread[] threads = { b1, b2, s1, s2 }; + java.util.Collections.shuffle(java.util.Arrays.asList(threads)); + for (Thread thread : threads) + thread.start(); + for (Thread thread : threads) { + thread.join(60 * 1000); + if (thread.isAlive()) + throw new Error + (String.format + ("Semaphore stuck: permits %d, thread waiting %s%n", + sem.availablePermits(), + sem.hasQueuedThreads() ? "true" : "false")); + } + if (badness[0] != null) + throw new Error(badness[0]); + if (sem.availablePermits() != 0) + throw new Error(String.valueOf(sem.availablePermits())); + if (sem.hasQueuedThreads()) + throw new Error(String.valueOf(sem.hasQueuedThreads())); + if (sem.getQueueLength() != 0) + throw new Error(String.valueOf(sem.getQueueLength())); + if (sem.isFair() != fair) + throw new Error(String.valueOf(sem.isFair())); + } + } + + public static void main(String[] args) throws Throwable { + for (boolean fair : new boolean[] { true, false }) + for (boolean interruptibly : new boolean[] { true, false }) + test(fair, interruptibly); + } +} diff --git a/test/java/util/logging/LoggerSubclass.java b/test/java/util/logging/LoggerSubclass.java new file mode 100644 index 0000000000000000000000000000000000000000..ba18fa36b2e4dd46a272a4890f8c4214808f807f --- /dev/null +++ b/test/java/util/logging/LoggerSubclass.java @@ -0,0 +1,100 @@ +/* + * Copyright 2009 Google, 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 6830220 6278014 + * @summary Test Logger subclasses + */ + +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.LogRecord; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +public class LoggerSubclass { + void test(String[] args) { + final String name = "myLogger"; + final String message = "myMessage"; + final AtomicInteger getHandlerCount = new AtomicInteger(0); + final AtomicLong lastSequenceNumber = new AtomicLong(-1L); + final AtomicInteger lastThreadID = new AtomicInteger(-1); + final Logger logger = new Logger(name, null) { + public Handler[] getHandlers() { + getHandlerCount.getAndIncrement(); + return super.getHandlers(); + }}; + equal(logger.getName(), name); + equal(logger.getResourceBundle(), null); + equal(logger.getFilter(), null); + equal(logger.getLevel(), null); + check(logger.isLoggable(Level.WARNING)); + logger.addHandler(new Handler() { + public void close() {} + public void flush() {} + public void publish(LogRecord l) { + equal(l.getLoggerName(), name); + equal(l.getMessage(), message); + equal(l.getResourceBundle(), null); + equal(l.getSourceClassName(), "LoggerSubclass"); + equal(l.getSourceMethodName(), "test"); + equal(l.getThrown(), null); + equal(l.getLevel(), Level.WARNING); + + if (lastSequenceNumber.get() != -1) { + equal(lastSequenceNumber.get() + 1, + l.getSequenceNumber()); + equal(lastThreadID.get(), + l.getThreadID()); + equal((int) Thread.currentThread().getId(), + l.getThreadID()); + } + lastSequenceNumber.set(l.getSequenceNumber()); + lastThreadID.set(l.getThreadID()); + }}); + for (int i = 1; i < 4; i++) { + logger.warning(message); // Should invoke getHandlers() + equal(i, getHandlerCount.get()); + } + } + + //--------------------- Infrastructure --------------------------- + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + try {new LoggerSubclass().instanceMain(args);} + catch (Throwable e) {throw e.getCause();}} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} diff --git a/test/java/util/logging/LoggingDeadlock2.java b/test/java/util/logging/LoggingDeadlock2.java index 50de62abfccd1966c2532e783359da4a5c0e2e96..31bccfa5c3e1cf586a33c9da58942affc5c888be 100644 --- a/test/java/util/logging/LoggingDeadlock2.java +++ b/test/java/util/logging/LoggingDeadlock2.java @@ -23,10 +23,9 @@ /* * @test - * @bug 6467152 - * @ignore until 6716076 is fixed + * @bug 6467152 6716076 6829503 * @summary deadlock occurs in LogManager initialization and JVM termination - * @author Serguei Spitsyn / Hittachi + * @author Serguei Spitsyn / Hitachi / Martin Buchholz * * @build LoggingDeadlock2 * @run main/timeout=15 LoggingDeadlock2 @@ -47,43 +46,195 @@ * This is a regression test for this bug. */ +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.LogManager; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; -public class LoggingDeadlock2 implements Runnable { - static final java.io.PrintStream out = System.out; - static Object lock = new Object(); - static int c = 0; - public static void main(String arg[]) { - out.println("\nThis test checks that there is no deadlock."); - out.println("If not crashed or timed-out then it is passed."); +public class LoggingDeadlock2 { + + public static void realMain(String arg[]) throws Throwable { try { - new Thread(new LoggingDeadlock2()).start(); - synchronized(lock) { - c++; - if (c == 2) lock.notify(); - else lock.wait(); - } + System.out.println(javaChildArgs); + ProcessBuilder pb = new ProcessBuilder(javaChildArgs); + ProcessResults r = run(pb.start()); + equal(r.exitValue(), 99); + equal(r.out(), ""); + equal(r.err(), ""); + } catch (Throwable t) { unexpected(t); } + } + + public static class JavaChild { + public static void main(String args[]) throws Throwable { + final CyclicBarrier startingGate = new CyclicBarrier(2); + final Throwable[] thrown = new Throwable[1]; + + // Some random variation, to help tickle races. + final Random rnd = new Random(); + final boolean dojoin = rnd.nextBoolean(); + final int JITTER = 1024; + final int iters1 = rnd.nextInt(JITTER); + final int iters2 = JITTER - iters1; + final AtomicInteger counter = new AtomicInteger(0); + + Thread exiter = new Thread() { + public void run() { + try { + startingGate.await(); + for (int i = 0; i < iters1; i++) + counter.getAndIncrement(); + System.exit(99); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(86); + } + }}; + exiter.start(); + + startingGate.await(); + for (int i = 0; i < iters2; i++) + counter.getAndIncrement(); + // This may or may not result in a first call to + // Runtime.addShutdownHook after shutdown has already + // commenced. LogManager log = LogManager.getLogManager(); - out.println("Test passed"); + + if (dojoin) { + exiter.join(); + if (thrown[0] != null) + throw new Error(thrown[0]); + check(counter.get() == JITTER); + } } - catch(Exception e) { - e.printStackTrace(); - out.println("Test FAILED"); // Not expected + } + + //---------------------------------------------------------------- + // The rest of this test is copied from ProcessBuilder/Basic.java + //---------------------------------------------------------------- + private static final String javaExe = + System.getProperty("java.home") + + File.separator + "bin" + File.separator + "java"; + + private static final String classpath = + System.getProperty("java.class.path"); + + private static final List javaChildArgs = + Arrays.asList(new String[] + { javaExe, "-classpath", classpath, + "LoggingDeadlock2$JavaChild"}); + + private static class ProcessResults { + private final String out; + private final String err; + private final int exitValue; + private final Throwable throwable; + + public ProcessResults(String out, + String err, + int exitValue, + Throwable throwable) { + this.out = out; + this.err = err; + this.exitValue = exitValue; + this.throwable = throwable; + } + + public String out() { return out; } + public String err() { return err; } + public int exitValue() { return exitValue; } + public Throwable throwable() { return throwable; } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("\n" + out() + "\n") + .append("\n" + err() + "\n") + .append("exitValue = " + exitValue + "\n"); + if (throwable != null) + sb.append(throwable.getStackTrace()); + return sb.toString(); } } - public void run() { - try { - synchronized(lock) { - c++; - if (c == 2) lock.notify(); - else lock.wait(); + private static class StreamAccumulator extends Thread { + private final InputStream is; + private final StringBuilder sb = new StringBuilder(); + private Throwable throwable = null; + + public String result () throws Throwable { + if (throwable != null) + throw throwable; + return sb.toString(); + } + + StreamAccumulator (InputStream is) { + this.is = is; + } + + public void run() { + try { + Reader r = new InputStreamReader(is); + char[] buf = new char[4096]; + int n; + while ((n = r.read(buf)) > 0) { + sb.append(buf,0,n); + } + } catch (Throwable t) { + throwable = t; + } finally { + try { is.close(); } + catch (Throwable t) { throwable = t; } } - System.exit(1); } - catch(Exception e) { - e.printStackTrace(); - out.println("Test FAILED"); // Not expected + } + + private static ProcessResults run(Process p) { + Throwable throwable = null; + int exitValue = -1; + String out = ""; + String err = ""; + + StreamAccumulator outAccumulator = + new StreamAccumulator(p.getInputStream()); + StreamAccumulator errAccumulator = + new StreamAccumulator(p.getErrorStream()); + + try { + outAccumulator.start(); + errAccumulator.start(); + + exitValue = p.waitFor(); + + outAccumulator.join(); + errAccumulator.join(); + + out = outAccumulator.result(); + err = errAccumulator.result(); + } catch (Throwable t) { + throwable = t; } + + return new ProcessResults(out, err, exitValue, throwable); } + + //--------------------- Infrastructure --------------------------- + static volatile int passed = 0, failed = 0; + static void pass() {passed++;} + static void fail() {failed++; Thread.dumpStack();} + static void fail(String msg) {System.out.println(msg); fail();} + static void unexpected(Throwable t) {failed++; t.printStackTrace();} + static void check(boolean cond) {if (cond) pass(); else fail();} + static void check(boolean cond, String m) {if (cond) pass(); else fail(m);} + static void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + try {realMain(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} } diff --git a/test/java/util/zip/LargeZip.java b/test/java/util/zip/LargeZip.java new file mode 100644 index 0000000000000000000000000000000000000000..e49950261b61b727adcf7cad02d1e974b55280cb --- /dev/null +++ b/test/java/util/zip/LargeZip.java @@ -0,0 +1,193 @@ +/* + * 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.*; +import java.util.*; +import java.util.zip.*; + +public class LargeZip { + // If true, don't delete large ZIP file created for test. + static final boolean debug = System.getProperty("debug") != null; + + //static final int DATA_LEN = 1024 * 1024; + static final int DATA_LEN = 80 * 1024; + static final int DATA_SIZE = 8; + + static long fileSize = 6L * 1024L * 1024L * 1024L; // 6GB + + static boolean userFile = false; + + static byte[] data; + static File largeFile; + static String lastEntryName; + + /* args can be empty, in which case check a 3 GB file which is created for + * this test (and then deleted). Or it can be a number, in which case + * that designates the size of the file that's created for this test (and + * then deleted). Or it can be the name of a file to use for the test, in + * which case it is *not* deleted. Note that in this last case, the data + * comparison might fail. + */ + static void realMain (String[] args) throws Throwable { + if (args.length > 0) { + try { + fileSize = Long.parseLong(args[0]); + System.out.println("Testing with file of size " + fileSize); + } catch (NumberFormatException ex) { + largeFile = new File(args[0]); + if (!largeFile.exists()) { + throw new Exception("Specified file " + args[0] + " does not exist"); + } + userFile = true; + System.out.println("Testing with user-provided file " + largeFile); + } + } + File testDir = null; + if (largeFile == null) { + testDir = new File(System.getProperty("test.scratch", "."), + "LargeZip"); + if (testDir.exists()) { + if (!testDir.delete()) { + throw new Exception("Cannot delete already-existing test directory"); + } + } + check(!testDir.exists() && testDir.mkdirs()); + largeFile = new File(testDir, "largezip.zip"); + createLargeZip(); + } + + readLargeZip1(); + readLargeZip2(); + + if (!userFile && !debug) { + check(largeFile.delete()); + check(testDir.delete()); + } + } + + static void createLargeZip() throws Throwable { + int iterations = DATA_LEN / DATA_SIZE; + ByteBuffer bb = ByteBuffer.allocate(DATA_SIZE); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int i = 0; i < iterations; i++) { + bb.putDouble(0, Math.random()); + baos.write(bb.array(), 0, DATA_SIZE); + } + data = baos.toByteArray(); + + ZipOutputStream zos = new ZipOutputStream( + new BufferedOutputStream(new FileOutputStream(largeFile))); + long length = 0; + while (length < fileSize) { + ZipEntry ze = new ZipEntry("entry-" + length); + lastEntryName = ze.getName(); + zos.putNextEntry(ze); + zos.write(data, 0, data.length); + zos.closeEntry(); + length = largeFile.length(); + } + System.out.println("Last entry written is " + lastEntryName); + zos.close(); + } + + static void readLargeZip1() throws Throwable { + ZipFile zipFile = new ZipFile(largeFile); + ZipEntry entry = null; + String entryName = null; + int count = 0; + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + entry = entries.nextElement(); + entryName = entry.getName(); + count++; + } + System.out.println("Number of entries read: " + count); + System.out.println("Last entry read is " + entryName); + check(!entry.isDirectory()); + if (check(entryName.equals(lastEntryName))) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + InputStream is = zipFile.getInputStream(entry); + byte buf[] = new byte[4096]; + int len; + while ((len = is.read(buf)) >= 0) { + baos.write(buf, 0, len); + } + baos.close(); + is.close(); + check(Arrays.equals(data, baos.toByteArray())); + } + } + + + static void readLargeZip2() throws Throwable { + ZipInputStream zis = new ZipInputStream( + new BufferedInputStream(new FileInputStream(largeFile))); + ZipEntry entry = null; + String entryName = null; + int count = 0; + while ((entry = zis.getNextEntry()) != null) { + entryName = entry.getName(); + if (entryName.equals(lastEntryName)) { + break; + } + count++; + } + System.out.println("Number of entries read: " + count); + System.out.println("Last entry read is " + entryName); + check(!entry.isDirectory()); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + byte buf[] = new byte[4096]; + int len; + while ((len = zis.read(buf)) >= 0) { + baos.write(buf, 0, len); + } + baos.close(); + check(Arrays.equals(data, baos.toByteArray())); + check(zis.getNextEntry() == null); + zis.close(); + } + + + //--------------------- Infrastructure --------------------------- + static volatile int passed = 0, failed = 0; + static void pass() {passed++;} + static void pass(String msg) {System.out.println(msg); passed++;} + static void fail() {failed++; Thread.dumpStack();} + static void fail(String msg) {System.out.println(msg); fail();} + static void unexpected(Throwable t) {failed++; t.printStackTrace();} + static void unexpected(Throwable t, String msg) { + System.out.println(msg); failed++; t.printStackTrace();} + static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;} + static void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + try {realMain(args);} catch (Throwable t) {unexpected(t);} + System.out.println("\nPassed = " + passed + " failed = " + failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} diff --git a/test/java/util/zip/ZipCoding.java b/test/java/util/zip/ZipCoding.java new file mode 100644 index 0000000000000000000000000000000000000000..baedc449bfbec690bee3d24e548f94304ec681b9 --- /dev/null +++ b/test/java/util/zip/ZipCoding.java @@ -0,0 +1,133 @@ +/* + * 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 4244499 4532049 4700978 4820807 4980042 + * @summary Test ZipInputStream, ZipOutputStream and ZipFile with non-UTF8 encoding + */ + +import java.io.*; +import java.nio.charset.*; +import java.util.*; +import java.util.zip.*; + +public class ZipCoding { + + public static void main(String[] args) throws Exception { + + test("MS932", + "\u4e00\u4e01", "\uff67\uff68\uff69\uff6a\uff6b\uff6c"); + + test("ibm437", + "\u00e4\u00fc", "German Umlaut \u00fc in comment"); + + test("utf-8", + "\u4e00\u4e01", "\uff67\uff68\uff69\uff6a\uff6b\uff6c"); + + test("utf-8", + "\u00e4\u00fc", "German Umlaut \u00fc in comment"); + + test("utf-8", + "Surrogate\ud801\udc01", "Surrogates \ud800\udc00 in comment"); + + } + + static void testZipInputStream(InputStream is, Charset cs, + String name, String comment, byte[] bb) + throws Exception + { + ZipInputStream zis = new ZipInputStream(is, cs); + ZipEntry e = zis.getNextEntry(); + if (e == null || ! name.equals(e.getName())) + throw new RuntimeException("ZipIS name doesn't match!"); + byte[] bBuf = new byte[bb.length << 1]; + int n = zis.read(bBuf, 0, bBuf.length); + if (n != bb.length || + !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) { + throw new RuntimeException("ZipIS content doesn't match!"); + } + zis.close(); + } + + static void testZipFile(File f, Charset cs, + String name, String comment, byte[] bb) + throws Exception + { + ZipFile zf = new ZipFile(f, cs); + Enumeration 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 --git a/test/java/util/zip/ZipFile/LargeZipFile.java b/test/java/util/zip/ZipFile/LargeZipFile.java index 479bac48befe88b74c82c3bbaaa186e8bc876dc1..d228a5f93e334de29b952d36a8c5b9dd7e735672 100644 --- a/test/java/util/zip/ZipFile/LargeZipFile.java +++ b/test/java/util/zip/ZipFile/LargeZipFile.java @@ -158,4 +158,3 @@ public class LargeZipFile { System.out.println("\nPassed = " + passed + " failed = " + failed); if (failed > 0) throw new AssertionError("Some tests failed");} } - diff --git a/test/java/util/zip/zip.java b/test/java/util/zip/zip.java new file mode 100644 index 0000000000000000000000000000000000000000..33eccf9496d30c9392633e96c742525137a6ea76 --- /dev/null +++ b/test/java/util/zip/zip.java @@ -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 --git a/test/javax/print/attribute/MediaMappingsTest.java b/test/javax/print/attribute/MediaMappingsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..16110d8a49edf407388515f9fa72b5746a5e1745 --- /dev/null +++ b/test/javax/print/attribute/MediaMappingsTest.java @@ -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 --git a/test/javax/swing/JFileChooser/6570445/bug6570445.java b/test/javax/swing/JFileChooser/6570445/bug6570445.java new file mode 100644 index 0000000000000000000000000000000000000000..f746edaee5468688b6fcef5028555c537ae7d28d --- /dev/null +++ b/test/javax/swing/JFileChooser/6570445/bug6570445.java @@ -0,0 +1,20 @@ +/* + * @test + * @bug 6570445 + * @summary Checks if Win32ShellFolder2's COM-using methods work under a security manager + * @author Leonid Popov + */ + +import javax.swing.filechooser.FileSystemView; + +public class bug6570445 { + public static void main(String[] args) { + System.setSecurityManager(new SecurityManager()); + + // The next line of code forces FileSystemView to request data from Win32ShellFolder2, + // what causes an exception if a security manager installed (see the bug 6570445 description) + FileSystemView.getFileSystemView().getRoots(); + + System.out.println("Passed."); + } +} diff --git a/test/javax/swing/JFileChooser/6738668/bug6738668.java b/test/javax/swing/JFileChooser/6738668/bug6738668.java new file mode 100644 index 0000000000000000000000000000000000000000..f54515e7e4ee93fbf584f03129cb3d5558fdcf24 --- /dev/null +++ b/test/javax/swing/JFileChooser/6738668/bug6738668.java @@ -0,0 +1,44 @@ +/* + * 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 6738668 + @summary JFileChooser cannot be created under SecurityManager + @author Pavel Porvatov + @run main/othervm/policy=security.policy bug6738668 +*/ + +import javax.swing.*; +import java.io.File; + +public class bug6738668 { + public static void main(String[] args) throws Exception { + for (UIManager.LookAndFeelInfo lookAndFeelInfo : UIManager.getInstalledLookAndFeels()) { + UIManager.setLookAndFeel(lookAndFeelInfo.getClassName()); + + new JFileChooser(new File("c:/temp")); + + System.out.println("Test passed for LookAndFeel " + lookAndFeelInfo.getClassName()); + } + } +} diff --git a/test/javax/swing/JFileChooser/6738668/security.policy b/test/javax/swing/JFileChooser/6738668/security.policy new file mode 100644 index 0000000000000000000000000000000000000000..fd3aa757c563c174f93b047454feb446e9df360f --- /dev/null +++ b/test/javax/swing/JFileChooser/6738668/security.policy @@ -0,0 +1,5 @@ +grant { + permission java.io.FilePermission "C:\\temp\\*", "read"; + permission java.io.FilePermission "C:\\temp", "read"; + permission java.util.PropertyPermission "*", "read"; +}; diff --git a/test/javax/swing/JFileChooser/6798062/bug6798062.html b/test/javax/swing/JFileChooser/6798062/bug6798062.html new file mode 100644 index 0000000000000000000000000000000000000000..12955f6eee722d6892e1bdc337140d5c3e5746ee --- /dev/null +++ b/test/javax/swing/JFileChooser/6798062/bug6798062.html @@ -0,0 +1,11 @@ + + + +1. Create a link +2. Copy path to the link into TextField +3. Run the Windows Task Manager. Select the Processes tab and find the java process +4. Press the Start button in the test window +5. Wait several minutes and observe in the Windows Task Manager +that Memory Usage of java process is not increasing + + diff --git a/test/javax/swing/JFileChooser/6798062/bug6798062.java b/test/javax/swing/JFileChooser/6798062/bug6798062.java new file mode 100644 index 0000000000000000000000000000000000000000..ee4d333fc8508f5de5abd9128f07b354c3b87d9f --- /dev/null +++ b/test/javax/swing/JFileChooser/6798062/bug6798062.java @@ -0,0 +1,189 @@ +/* + * 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 %W% %E% + @bug 6798062 + @summary Memory Leak on using getFiles of FileSystemView + @author Pavel Porvatov + @run applet/manual=done bug6798062.html +*/ + +import sun.awt.shell.ShellFolder; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.*; +import java.io.File; +import java.io.FileNotFoundException; + +public class bug6798062 extends JApplet { + + private final JSlider slider = new JSlider(0, 100); + + private final JTextField tfLink = new JTextField(); + + private final JButton btnStart = new JButton("Start"); + + private final JButton btnStop = new JButton("Stop"); + + private final JButton btnGC = new JButton("Run System.gc()"); + + private ShellFolder folder; + + private Thread thread; + + public static void main(String[] args) { + JFrame frame = new JFrame("bug6798062"); + + frame.setSize(400, 300); + frame.setLocationRelativeTo(null); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.add(new bug6798062().initialize()); + + frame.setVisible(true); + } + + public void init() { + add(initialize()); + } + + private JPanel initialize() { + File file = new File("c:/"); + + try { + folder = ShellFolder.getShellFolder(file); + } catch (FileNotFoundException e) { + fail("Directory " + file.getPath() + " not found"); + } + + slider.setMajorTickSpacing(10); + slider.setPaintTicks(true); + slider.setPaintLabels(true); + slider.setSnapToTicks(true); + slider.setValue(10); + + btnStart.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setEnabledState(false); + + thread = new MyThread(slider.getValue(), tfLink.getText()); + thread.start(); + } + }); + + btnStop.setEnabled(false); + + btnStop.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + thread.interrupt(); + thread = null; + + setEnabledState(true); + } + }); + + btnGC.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.gc(); + } + }); + + setEnabledState(true); + + JPanel pnButtons = new JPanel(); + + pnButtons.setLayout(new BoxLayout(pnButtons, BoxLayout.X_AXIS)); + + pnButtons.add(btnStart); + pnButtons.add(btnStop); + pnButtons.add(btnGC); + + tfLink.setMaximumSize(new Dimension(300, 20)); + + JPanel pnContent = new JPanel(); + + pnContent.setLayout(new BoxLayout(pnContent, BoxLayout.Y_AXIS)); + pnContent.add(new JLabel("Delay between listFiles() invocation (ms):")); + pnContent.add(slider); + pnContent.add(new JLabel("Provide link here:")); + pnContent.add(tfLink); + pnContent.add(pnButtons); + + return pnContent; + } + + private void setEnabledState(boolean enabled) { + slider.setEnabled(enabled); + btnStart.setEnabled(enabled); + btnStop.setEnabled(!enabled); + } + + private static void fail(String msg) { + throw new RuntimeException(msg); + } + + private class MyThread extends Thread { + private final int delay; + + private final ShellFolder link; + + private MyThread(int delay, String link) { + this.delay = delay; + + ShellFolder linkFolder; + + try { + linkFolder = ShellFolder.getShellFolder(new File(link)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + + linkFolder = null; + } + + this.link = linkFolder; + } + + public void run() { + while (!isInterrupted()) { + folder.listFiles(); + if (link != null) { + try { + link.getLinkLocation(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + if (delay > 0) { + try { + Thread.sleep(delay); + } catch (InterruptedException e1) { + // The thread was interrupted + return; + } + } + } + } + } +} diff --git a/test/javax/swing/JSlider/6794831/bug6794831.java b/test/javax/swing/JSlider/6794831/bug6794831.java new file mode 100644 index 0000000000000000000000000000000000000000..a147987d417852fe8b719f612ff974b1cb0eb7f0 --- /dev/null +++ b/test/javax/swing/JSlider/6794831/bug6794831.java @@ -0,0 +1,105 @@ +/* + * 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 6794831 + * @summary Infinite loop while painting ticks on Slider with maximum=MAX_INT + * @author Pavel Porvatov + @run main bug6794831 + */ + +import javax.swing.*; +import javax.swing.plaf.basic.BasicSliderUI; +import java.awt.image.BufferedImage; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +public class bug6794831 { + private final CountDownLatch countDownLatch = new CountDownLatch(1); + + public static void main(String args[]) throws InterruptedException { + new bug6794831().run(); + } + + private void run() throws InterruptedException { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + for (UIManager.LookAndFeelInfo lookAndFeelInfo : UIManager.getInstalledLookAndFeels()) { + try { + UIManager.setLookAndFeel(lookAndFeelInfo.getClassName()); + } catch (Exception e) { + fail(e.getMessage()); + } + + BufferedImage image = new BufferedImage(300, 200, BufferedImage.TYPE_INT_ARGB); + + // Test 1 + JSlider slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setMajorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + // Test 2 + slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setMinorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + // Test 3 + slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setOrientation(JSlider.VERTICAL); + slider.setMajorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + // Test 4 + slider = new JSlider(0, Integer.MAX_VALUE - 1, 0); + + slider.setOrientation(JSlider.VERTICAL); + slider.setMinorTickSpacing((Integer.MAX_VALUE - 1) / 4); + slider.setPaintTicks(true); + + ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics()); + + countDownLatch.countDown(); + } + } + }); + + if (countDownLatch.await(3000, TimeUnit.MILLISECONDS)) { + System.out.println("bug6794831 passed"); + } else { + fail("bug6794831 failed"); + } + } + + private static void fail(String msg) { + throw new RuntimeException(msg); + } +} diff --git a/test/javax/swing/system/6799345/TestShutdown.java b/test/javax/swing/system/6799345/TestShutdown.java new file mode 100644 index 0000000000000000000000000000000000000000..694df3eac013d4065c2296553251ed218833afcb --- /dev/null +++ b/test/javax/swing/system/6799345/TestShutdown.java @@ -0,0 +1,203 @@ +/* + * 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 6799345 + @summary Tests that no exceptions are thrown from TimerQueue and +SwingWorker on AppContext shutdown + @author art + @run main TestShutdown +*/ + +import java.awt.*; +import java.awt.event.*; + +import java.util.*; + +import javax.swing.*; + +import sun.awt.*; + +public class TestShutdown +{ + private static AppContext targetAppContext; + + private static JFrame f; + private static JTextField tf; + + private static volatile boolean exceptionsOccurred = false; + private static volatile boolean appcontextInitDone = false; + + private static int timerValue = 0; + + public static void main(String[] args) + throws Exception + { + ThreadGroup tg = new TestThreadGroup("TTG"); + Thread t = new Thread(tg, new TestRunnable(), "InitThread"); + t.start(); + + while (!appcontextInitDone) + { + Thread.sleep(500); + } + + targetAppContext.dispose(); + + if (exceptionsOccurred) + { + throw new RuntimeException("Test FAILED: some exceptions occurred"); + } + } + + static void initGUI() + { + f = new JFrame("F"); + f.setBounds(100, 100, 200, 100); + tf = new JTextField("Test"); + f.add(tf); + f.setVisible(true); + } + + static void startGUI() + { + // caret blink Timer + tf.requestFocusInWindow(); + + // misc Timer + ActionListener al = new ActionListener() + { + @Override + public void actionPerformed(ActionEvent ae) + { + System.out.println("Timer tick: " + timerValue++); + } + }; + new javax.swing.Timer(30, al).start(); + } + + static class TestThreadGroup extends ThreadGroup + { + public TestThreadGroup(String name) + { + super(name); + } + + @Override + public synchronized void uncaughtException(Thread thread, Throwable t) + { + if (t instanceof ThreadDeath) + { + // this one is expected, rethrow + throw (ThreadDeath)t; + } + System.err.println("Test FAILED: an exception is caught in the " + + "target thread group on thread " + thread.getName()); + t.printStackTrace(System.err); + exceptionsOccurred = true; + } + } + + static class TestRunnable implements Runnable + { + @Override + public void run() + { + SunToolkit stk = (SunToolkit)Toolkit.getDefaultToolkit(); + targetAppContext = stk.createNewAppContext(); + + // create and show frame and text field + SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + initGUI(); + } + }); + stk.realSync(); + + // start some Timers + SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + startGUI(); + } + }); + stk.realSync(); + + // start multiple SwingWorkers + while (!Thread.interrupted()) + { + try + { + new TestSwingWorker().execute(); + Thread.sleep(40); + } + catch (Exception e) + { + // exception here is expected, skip + break; + } + } + } + } + + static class TestSwingWorker extends SwingWorker + { + @Override + public String doInBackground() + { + Random r = new Random(); + for (int i = 0; i < 10; i++) + { + try + { + int delay = r.nextInt() % 50; + Thread.sleep(delay); + publish(delay); + } + catch (Exception z) + { + break; + } + } + if (!appcontextInitDone) + { + appcontextInitDone = true; + } + return "Done"; + } + + @Override + public void process(java.util.List chunks) + { + for (Integer i : chunks) + { + System.err.println("Processed: " + i); + } + } + } +} diff --git a/test/javax/swing/text/LayoutQueue/Test6588003.java b/test/javax/swing/text/LayoutQueue/Test6588003.java new file mode 100644 index 0000000000000000000000000000000000000000..d14d6a56a95e08ddec5c7591d4a99cfb50dafc84 --- /dev/null +++ b/test/javax/swing/text/LayoutQueue/Test6588003.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 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 6588003 + @summary LayoutQueue should not share its DefaultQueue across AppContexts + @author Peter Zhelezniakov + @run main Test6588003 +*/ + +import javax.swing.text.LayoutQueue; +import sun.awt.SunToolkit; + +public class Test6588003 implements Runnable { + private static final LayoutQueue DEFAULT = new LayoutQueue(); + + public static void main(String[] args) throws InterruptedException { + LayoutQueue.setDefaultQueue(DEFAULT); + + ThreadGroup group = new ThreadGroup("Test6588003"); + Thread thread = new Thread(group, new Test6588003()); + thread.start(); + thread.join(); + + if (LayoutQueue.getDefaultQueue() != DEFAULT) { + throw new RuntimeException("Sharing detected"); + } + } + + public void run() { + SunToolkit.createNewAppContext(); + + if (LayoutQueue.getDefaultQueue() == DEFAULT) { + throw new RuntimeException("Sharing detected"); + } + + LayoutQueue.setDefaultQueue(new LayoutQueue()); + } +} diff --git a/test/javax/swing/text/html/Test4783068.java b/test/javax/swing/text/html/Test4783068.java new file mode 100644 index 0000000000000000000000000000000000000000..08859788e05596697442dc6971c83cbbae645516 --- /dev/null +++ b/test/javax/swing/text/html/Test4783068.java @@ -0,0 +1,93 @@ +/* + * Copyright 2007 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 4783068 + @summary Disabled components should render grayed-out HTML + @author Peter Zhelezniakov + @run main Test4783068 +*/ + +import java.awt.*; +import java.awt.image.BufferedImage; +import javax.swing.*; +import javax.swing.plaf.metal.MetalLookAndFeel; + +public class Test4783068 { + final static Color TEST_COLOR = Color.WHITE; + + final static String html = "" + + "This is a colored text" + + "

with a link" + + "

  • an unordered
  • list
" + + "
  1. and an ordered
  2. list
" + + ""; + + + void test() { + try { + UIManager.setLookAndFeel(new MetalLookAndFeel()); + } catch (UnsupportedLookAndFeelException e) { + throw new Error("Cannot set Metal LAF"); + } + // Render text using background color + UIManager.put("textInactiveText", TEST_COLOR); + + test(new JLabel(html)); + test(new JButton(html)); + + JEditorPane pane = new JEditorPane("text/html", html); + pane.setDisabledTextColor(TEST_COLOR); + test(pane); + } + + void test(JComponent c) { + c.setEnabled(false); + c.setOpaque(true); + c.setBackground(TEST_COLOR); + c.setBorder(null); + Dimension size = c.getPreferredSize(); + c.setBounds(0, 0, size.width, size.height); + + BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB); + c.paint(image.getGraphics()); + + int rgb = TEST_COLOR.getRGB(); + for (int i = 0; i < size.height; i++) { + for (int j = 0; j < size.width; j++) { + if (image.getRGB(j, i) != rgb) { + throw new RuntimeException( + String.format("Color mismatch at [%d, %d]", j, i)); + } + } + } + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override public void run() { + new Test4783068().test(); + } + }); + } +} diff --git a/test/sun/java2d/pipe/RegionOps.java b/test/sun/java2d/pipe/RegionOps.java new file mode 100644 index 0000000000000000000000000000000000000000..30f8c223a2526b1662d9172becf00108fa5856ba --- /dev/null +++ b/test/sun/java2d/pipe/RegionOps.java @@ -0,0 +1,510 @@ +/* + * @test %W% %E% + * @bug 6504874 + * @summary This test verifies the operation (and performance) of the + * various CAG operations on the internal Region class. + * @run main RegionOps + */ + +import java.awt.Rectangle; +import java.awt.geom.Area; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.util.Random; +import sun.java2d.pipe.Region; + +public class RegionOps { + public static final int DEFAULT_NUMREGIONS = 50; + public static final int DEFAULT_MINSUBRECTS = 1; + public static final int DEFAULT_MAXSUBRECTS = 10; + + public static final int MINCOORD = -20; + public static final int MAXCOORD = 20; + + public static boolean useArea; + + static int numops; + static int numErrors; + static Random rand = new Random(); + static boolean skipCheck; + static boolean countErrors; + + static { + // Instantiating BufferedImage initializes sun.java2d + BufferedImage bimg = + new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + } + + public static void usage(String error) { + if (error != null) { + System.err.println("Error: "+error); + } + System.err.println("Usage: java RegionOps "+ + "[-regions N] [-rects M] "+ + "[-[min|max]rects M] [-area]"); + System.err.println(" "+ + "[-add|union] [-sub|diff] "+ + "[-int[ersect]] [-xor]"); + System.err.println(" "+ + "[-seed S] [-nocheck] [-count[errors]] [-help]"); + System.exit((error != null) ? 1 : 0); + } + + public static void error(RectListImpl a, RectListImpl b, String problem) { + System.err.println("Operating on: "+a); + if (b != null) { + System.err.println("and: "+b); + } + if (countErrors) { + System.err.println(problem); + numErrors++; + } else { + throw new RuntimeException(problem); + } + } + + public static void main(String argv[]) { + int numregions = DEFAULT_NUMREGIONS; + int minsubrects = DEFAULT_MINSUBRECTS; + int maxsubrects = DEFAULT_MAXSUBRECTS; + boolean doUnion = false; + boolean doIntersect = false; + boolean doSubtract = false; + boolean doXor = false; + + for (int i = 0; i < argv.length; i++) { + String arg = argv[i]; + if (arg.equalsIgnoreCase("-regions")) { + if (i+1 >= argv.length) { + usage("missing arg for -regions"); + } + numregions = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-rects")) { + if (i+1 >= argv.length) { + usage("missing arg for -rects"); + } + minsubrects = maxsubrects = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-minrects")) { + if (i+1 >= argv.length) { + usage("missing arg for -minrects"); + } + minsubrects = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-maxrects")) { + if (i+1 >= argv.length) { + usage("missing arg for -maxrects"); + } + maxsubrects = Integer.parseInt(argv[++i]); + } else if (arg.equalsIgnoreCase("-area")) { + useArea = true; + } else if (arg.equalsIgnoreCase("-add") || + arg.equalsIgnoreCase("-union")) + { + doUnion = true; + } else if (arg.equalsIgnoreCase("-sub") || + arg.equalsIgnoreCase("-diff")) + { + doSubtract = true; + } else if (arg.equalsIgnoreCase("-int") || + arg.equalsIgnoreCase("-intersect")) + { + doIntersect = true; + } else if (arg.equalsIgnoreCase("-xor")) { + doXor = true; + } else if (arg.equalsIgnoreCase("-seed")) { + if (i+1 >= argv.length) { + usage("missing arg for -seed"); + } + rand.setSeed(Long.decode(argv[++i]).longValue()); + } else if (arg.equalsIgnoreCase("-nocheck")) { + skipCheck = true; + } else if (arg.equalsIgnoreCase("-count") || + arg.equalsIgnoreCase("-counterrors")) + { + countErrors = true; + } else if (arg.equalsIgnoreCase("-help")) { + usage(null); + } else { + usage("Unknown argument: "+arg); + } + } + + if (maxsubrects < minsubrects) { + usage("maximum number of subrectangles less than minimum"); + } + + if (minsubrects <= 0) { + usage("minimum number of subrectangles must be positive"); + } + + if (!doUnion && !doSubtract && !doIntersect && !doXor) { + doUnion = doSubtract = doIntersect = doXor = true; + } + + long start = System.currentTimeMillis(); + RectListImpl rlist[] = new RectListImpl[numregions]; + int totalrects = 0; + for (int i = 0; i < rlist.length; i++) { + RectListImpl rli = RectListImpl.getInstance(); + int numsubrects = + minsubrects + rand.nextInt(maxsubrects - minsubrects + 1); + for (int j = 0; j < numsubrects; j++) { + addRectTo(rli); + totalrects++; + } + rlist[i] = rli; + } + long end = System.currentTimeMillis(); + System.out.println((end-start)+"ms to create "+ + rlist.length+" regions containing "+ + totalrects+" subrectangles"); + + start = System.currentTimeMillis(); + for (int i = 0; i < rlist.length; i++) { + RectListImpl a = rlist[i]; + testTranslate(a); + for (int j = i; j < rlist.length; j++) { + RectListImpl b = rlist[j]; + if (doUnion) testUnion(a, b); + if (doSubtract) testDifference(a, b); + if (doIntersect) testIntersection(a, b); + if (doXor) testExclusiveOr(a, b); + } + } + end = System.currentTimeMillis(); + System.out.println(numops+" ops took "+(end-start)+"ms"); + + if (numErrors > 0) { + throw new RuntimeException(numErrors+" errors encountered"); + } + } + + public static void addRectTo(RectListImpl rli) { + int lox = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + int hix = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + int loy = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + int hiy = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1); + rli.addRect(lox, loy, hix, hiy); + } + + public static void checkEqual(RectListImpl a, RectListImpl b, + String optype) + { + if (a.hashCode() != b.hashCode()) { + error(a, b, "hashcode failed for "+optype); + } + if (!a.equals(b)) { + error(a, b, "equals failed for "+optype); + } + } + + public static void testTranslate(RectListImpl a) { + RectListImpl maxTrans = + a.getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE) + .getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE) + .getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE); + if (!maxTrans.checkTransEmpty()) { + error(maxTrans, null, "overflow translated RectList not empty"); + } + RectListImpl minTrans = + a.getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE) + .getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE) + .getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE); + if (!minTrans.checkTransEmpty()) { + error(minTrans, null, "overflow translated RectList not empty"); + } + testTranslate(a, Integer.MAX_VALUE, Integer.MAX_VALUE, false, + MINCOORD, 0, MINCOORD, 0); + testTranslate(a, Integer.MAX_VALUE, Integer.MIN_VALUE, false, + MINCOORD, 0, 0, MAXCOORD); + testTranslate(a, Integer.MIN_VALUE, Integer.MAX_VALUE, false, + 0, MAXCOORD, MINCOORD, 0); + testTranslate(a, Integer.MIN_VALUE, Integer.MIN_VALUE, false, + 0, MAXCOORD, 0, MAXCOORD); + for (int dy = -100; dy <= 100; dy += 50) { + for (int dx = -100; dx <= 100; dx += 50) { + testTranslate(a, dx, dy, true, + MINCOORD, MAXCOORD, + MINCOORD, MAXCOORD); + } + } + } + + public static void testTranslate(RectListImpl a, int dx, int dy, + boolean isNonDestructive, + int xmin, int xmax, + int ymin, int ymax) + { + RectListImpl theTrans = a.getTranslation(dx, dy); numops++; + if (skipCheck) return; + RectListImpl unTrans = theTrans.getTranslation(-dx, -dy); + if (isNonDestructive) checkEqual(a, unTrans, "Translate"); + for (int x = xmin; x < xmax; x++) { + for (int y = ymin; y < ymax; y++) { + boolean inside = a.contains(x, y); + if (theTrans.contains(x+dx, y+dy) != inside) { + error(a, null, "translation failed for "+ + dx+", "+dy+" at "+x+", "+y); + } + } + } + } + + public static void testUnion(RectListImpl a, RectListImpl b) { + RectListImpl aUb = a.getUnion(b); numops++; + RectListImpl bUa = b.getUnion(a); numops++; + if (skipCheck) return; + checkEqual(aUb, bUa, "Union"); + testUnion(a, b, aUb); + testUnion(a, b, bUa); + } + + public static void testUnion(RectListImpl a, RectListImpl b, + RectListImpl theUnion) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) || b.contains(x, y)); + if (theUnion.contains(x, y) != inside) { + error(a, b, "union failed at "+x+", "+y); + } + } + } + } + + public static void testDifference(RectListImpl a, RectListImpl b) { + RectListImpl aDb = a.getDifference(b); numops++; + RectListImpl bDa = b.getDifference(a); numops++; + if (skipCheck) return; + // Note that difference is not commutative so we cannot check equals + // checkEqual(a, b, "Difference"); + testDifference(a, b, aDb); + testDifference(b, a, bDa); + } + + public static void testDifference(RectListImpl a, RectListImpl b, + RectListImpl theDifference) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) && !b.contains(x, y)); + if (theDifference.contains(x, y) != inside) { + error(a, b, "difference failed at "+x+", "+y); + } + } + } + } + + public static void testIntersection(RectListImpl a, RectListImpl b) { + RectListImpl aIb = a.getIntersection(b); numops++; + RectListImpl bIa = b.getIntersection(a); numops++; + if (skipCheck) return; + checkEqual(aIb, bIa, "Intersection"); + testIntersection(a, b, aIb); + testIntersection(a, b, bIa); + } + + public static void testIntersection(RectListImpl a, RectListImpl b, + RectListImpl theIntersection) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) && b.contains(x, y)); + if (theIntersection.contains(x, y) != inside) { + error(a, b, "intersection failed at "+x+", "+y); + } + } + } + } + + public static void testExclusiveOr(RectListImpl a, RectListImpl b) { + RectListImpl aXb = a.getExclusiveOr(b); numops++; + RectListImpl bXa = b.getExclusiveOr(a); numops++; + if (skipCheck) return; + checkEqual(aXb, bXa, "ExclusiveOr"); + testExclusiveOr(a, b, aXb); + testExclusiveOr(a, b, bXa); + } + + public static void testExclusiveOr(RectListImpl a, RectListImpl b, + RectListImpl theExclusiveOr) + { + for (int x = MINCOORD; x < MAXCOORD; x++) { + for (int y = MINCOORD; y < MAXCOORD; y++) { + boolean inside = (a.contains(x, y) != b.contains(x, y)); + if (theExclusiveOr.contains(x, y) != inside) { + error(a, b, "xor failed at "+x+", "+y); + } + } + } + } + + public abstract static class RectListImpl { + public static RectListImpl getInstance() { + if (useArea) { + return new AreaImpl(); + } else { + return new RegionImpl(); + } + } + + public abstract void addRect(int lox, int loy, int hix, int hiy); + + public abstract RectListImpl getTranslation(int dx, int dy); + + public abstract RectListImpl getIntersection(RectListImpl rli); + public abstract RectListImpl getExclusiveOr(RectListImpl rli); + public abstract RectListImpl getDifference(RectListImpl rli); + public abstract RectListImpl getUnion(RectListImpl rli); + + // Used for making sure that 3xMAX translates yields an empty region + public abstract boolean checkTransEmpty(); + + public abstract boolean contains(int x, int y); + + public abstract int hashCode(); + public abstract boolean equals(RectListImpl other); + } + + public static class AreaImpl extends RectListImpl { + Area theArea; + + public AreaImpl() { + } + + public AreaImpl(Area a) { + theArea = a; + } + + public void addRect(int lox, int loy, int hix, int hiy) { + Area a2 = new Area(new Rectangle(lox, loy, hix-lox, hiy-loy)); + if (theArea == null) { + theArea = a2; + } else { + theArea.add(a2); + } + } + + public RectListImpl getTranslation(int dx, int dy) { + AffineTransform at = AffineTransform.getTranslateInstance(dx, dy); + return new AreaImpl(theArea.createTransformedArea(at)); + } + + public RectListImpl getIntersection(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.intersect(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + public RectListImpl getExclusiveOr(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.exclusiveOr(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + public RectListImpl getDifference(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.subtract(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + public RectListImpl getUnion(RectListImpl rli) { + Area a2 = new Area(theArea); + a2.add(((AreaImpl) rli).theArea); + return new AreaImpl(a2); + } + + // Used for making sure that 3xMAX translates yields an empty region + public boolean checkTransEmpty() { + // Area objects will actually survive 3 MAX translates so just + // pretend that it had the intended effect... + return true; + } + + public boolean contains(int x, int y) { + return theArea.contains(x, y); + } + + public int hashCode() { + // Area does not override hashCode... + return 0; + } + + public boolean equals(RectListImpl other) { + return theArea.equals(((AreaImpl) other).theArea); + } + + public String toString() { + return theArea.toString(); + } + } + + public static class RegionImpl extends RectListImpl { + Region theRegion; + + public RegionImpl() { + } + + public RegionImpl(Region r) { + theRegion = r; + } + + public void addRect(int lox, int loy, int hix, int hiy) { + Region r2 = Region.getInstanceXYXY(lox, loy, hix, hiy); + if (theRegion == null) { + theRegion = r2; + } else { + theRegion = theRegion.getUnion(r2); + } + } + + public RectListImpl getTranslation(int dx, int dy) { + return new RegionImpl(theRegion.getTranslatedRegion(dx, dy)); + } + + public RectListImpl getIntersection(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getIntersection(r2); + return new RegionImpl(r2); + } + + public RectListImpl getExclusiveOr(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getExclusiveOr(r2); + return new RegionImpl(r2); + } + + public RectListImpl getDifference(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getDifference(r2); + return new RegionImpl(r2); + } + + public RectListImpl getUnion(RectListImpl rli) { + Region r2 = ((RegionImpl) rli).theRegion; + r2 = theRegion.getUnion(r2); + return new RegionImpl(r2); + } + + // Used for making sure that 3xMAX translates yields an empty region + public boolean checkTransEmpty() { + // Region objects should be empty after 3 MAX translates... + return theRegion.isEmpty(); + } + + public boolean contains(int x, int y) { + return theRegion.contains(x, y); + } + + public int hashCode() { + return theRegion.hashCode(); + } + + public boolean equals(RectListImpl other) { + return theRegion.equals(((RegionImpl) other).theRegion); + } + + public String toString() { + return theRegion.toString(); + } + } +} diff --git a/test/sun/net/sdp/ProbeIB.java b/test/sun/net/sdp/ProbeIB.java new file mode 100644 index 0000000000000000000000000000000000000000..ac2a4b72d74436cfb81f1db6e2e25f4e4fbbf322 --- /dev/null +++ b/test/sun/net/sdp/ProbeIB.java @@ -0,0 +1,59 @@ +/* + * 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. + */ + +import java.io.File; +import java.io.IOException; +import java.net.NetworkInterface; +import java.net.InetAddress; +import java.util.Scanner; +import java.util.Enumeration; + +/** + * Probes for InfiniBand devices plumbed with IP addresses. + */ + +public class ProbeIB { + public static void main(String[] args) throws IOException { + Scanner s = new Scanner(new File("/etc/path_to_inst")); + try { + while (s.hasNextLine()) { + String line = s.nextLine(); + if (line.startsWith("#")) + continue; + String[] fields = line.split("\\s+"); + if (!fields[2].equals("\"ibd\"")) + continue; + String name = fields[2].substring(1, fields[2].length()-1) + fields[1]; + NetworkInterface ni = NetworkInterface.getByName(name); + if (ni != null) { + Enumeration addrs = ni.getInetAddresses(); + while (addrs.hasMoreElements()) { + System.out.println(addrs.nextElement().getHostAddress()); + } + } + } + } finally { + s.close(); + } + } +} diff --git a/test/sun/net/sdp/Sanity.java b/test/sun/net/sdp/Sanity.java new file mode 100644 index 0000000000000000000000000000000000000000..2c8d55e00afa3fa54a11a292f59f332ec77f1e0f --- /dev/null +++ b/test/sun/net/sdp/Sanity.java @@ -0,0 +1,168 @@ +/* + * 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. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Enumeration; + +/** + * Sanity check Socket/ServerSocket and each of the stream-oriented channels + * on each IP address plumbed to the network adapters. + */ + +public class Sanity { + public static void main(String[] args) throws Exception { + Enumeration nifs = NetworkInterface.getNetworkInterfaces(); + while (nifs.hasMoreElements()) { + NetworkInterface ni = nifs.nextElement(); + Enumeration addrs = ni.getInetAddresses(); + while (addrs.hasMoreElements()) { + InetAddress addr = addrs.nextElement(); + test(addr); + } + } + } + + static void test(InetAddress addr) throws Exception { + System.out.println(addr.getHostAddress()); + + // ServerSocketChannel.bind + ServerSocketChannel ssc = ServerSocketChannel.open(); + try { + ssc.bind(new InetSocketAddress(addr, 0)); + int port = ((InetSocketAddress)(ssc.getLocalAddress())).getPort(); + + // SocketChannel.connect (implicit bind) + SocketChannel client = SocketChannel.open(); + try { + client.connect(new InetSocketAddress(addr, port)); + SocketChannel peer = ssc.accept(); + try { + testConnection(Channels.newOutputStream(client), + Channels.newInputStream(peer)); + } finally { + peer.close(); + } + } finally { + client.close(); + } + + // SocketChannel.connect (explicit bind) + client = SocketChannel.open(); + try { + client.bind(new InetSocketAddress(addr, 0)) + .connect(new InetSocketAddress(addr, port)); + ssc.accept().close(); + } finally { + client.close(); + } + } finally { + ssc.close(); + } + + // AsynchronousServerSocketChannel.bind + AsynchronousServerSocketChannel server = + AsynchronousServerSocketChannel.open(); + try { + server.bind(new InetSocketAddress(addr, 0)); + int port = ((InetSocketAddress)(server.getLocalAddress())).getPort(); + + // AsynchronousSocketChannel.connect (implicit bind) + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + try { + client.connect(new InetSocketAddress(addr, port)).get(); + AsynchronousSocketChannel peer = server.accept().get(); + try { + testConnection(Channels.newOutputStream(client), + Channels.newInputStream(peer)); + } finally { + peer.close(); + } + } finally { + client.close(); + } + + // AsynchronousSocketChannel.connect (explicit bind) + client = AsynchronousSocketChannel.open(); + try { + client.bind(new InetSocketAddress(addr, 0)) + .connect(new InetSocketAddress(addr, port)).get(); + server.accept().get().close(); + } finally { + client.close(); + } + } finally { + server.close(); + } + + // ServerSocket.bind + ServerSocket ss = new ServerSocket(); + try { + ss.bind(new InetSocketAddress(addr, 0)); + int port = ss.getLocalPort(); + + // Socket.connect (implicit bind) + Socket s = new Socket(); + try { + s.connect(new InetSocketAddress(addr, port)); + Socket peer = ss.accept(); + try { + testConnection(s.getOutputStream(), peer.getInputStream()); + } finally { + peer.close(); + } + } finally { + s.close(); + } + + // Socket.connect (explicit bind) + s = new Socket(); + try { + s.bind(new InetSocketAddress(addr, 0)); + s.connect(new InetSocketAddress(addr, port)); + ss.accept().close(); + } finally { + s.close(); + } + } finally { + ss.close(); + } + } + + static void testConnection(OutputStream out, InputStream in) + throws IOException + { + byte[] msg = "hello".getBytes(); + out.write(msg); + + byte[] ba = new byte[100]; + int nread = 0; + while (nread < msg.length) { + int n = in.read(ba); + if (n < 0) + throw new IOException("EOF not expected!"); + nread += n; + } + } +} diff --git a/test/sun/net/sdp/sanity.sh b/test/sun/net/sdp/sanity.sh new file mode 100644 index 0000000000000000000000000000000000000000..baca9feccef476f71f2aa6fe6c59c7d72c3607ce --- /dev/null +++ b/test/sun/net/sdp/sanity.sh @@ -0,0 +1,72 @@ +# +# 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 4890703 +# @summary Unit test for Solaris SDP support +# @build ProbeIB Sanity +# @run shell sanity.sh + +# Check we are on Solaris and that SDP is enabled +OS=`uname -s` +if [ "$OS" != "SunOS" ]; then + echo "This is a Solaris-only test" + exit 0 +fi +SDPADM=/usr/sbin/sdpadm +if [ ! -f ${SDPADM} ]; then + echo "SDP not available" + exit 0 +fi +${SDPADM} status|grep Enabled +if [ $? != 0 ]; then + echo "SDP not enabled" + exit 0 +fi + +if [ -z "$TESTJAVA" ]; then + JAVA=java + TESTCLASSES=. + TESTSRC=. +else + JAVA="${TESTJAVA}/bin/java" +fi + +CLASSPATH=${TESTCLASSES}:${TESTSRC} +export CLASSPATH + +# Probe for IP addresses plumbed to IB interfaces +$JAVA -Djava.net.preferIPv4Stack=true ProbeIB > ib_addrs + +# Create sdp.conf +SDPCONF=sdp.conf +rm ${SDPCONF} +touch ${SDPCONF} +cat ib_addrs | while read ADDR +do + echo "bind ${ADDR} *" > ${SDPCONF} + echo "connect ${ADDR} *" >> ${SDPCONF} +done + +# Sanity check +$JAVA -Djava.net.preferIPv4Stack=true -Dcom.sun.sdp.conf=${SDPCONF} -Dcom.sun.sdp.debug Sanity diff --git a/test/sun/security/krb5/ConfigWithQuotations.java b/test/sun/security/krb5/ConfigWithQuotations.java new file mode 100644 index 0000000000000000000000000000000000000000..c55e3cbb8dd69d06d90fffbdb0156cff481dc560 --- /dev/null +++ b/test/sun/security/krb5/ConfigWithQuotations.java @@ -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 --git a/test/sun/security/krb5/edu.mit.Kerberos b/test/sun/security/krb5/edu.mit.Kerberos new file mode 100644 index 0000000000000000000000000000000000000000..94d76a6e58c7ed2c4cd30fd96b79fe9d81e374dd --- /dev/null +++ b/test/sun/security/krb5/edu.mit.Kerberos @@ -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 --git a/test/sun/security/tools/jarsigner/concise_jarsigner.sh b/test/sun/security/tools/jarsigner/concise_jarsigner.sh new file mode 100644 index 0000000000000000000000000000000000000000..1c9eaabe3967eb7d42d7ce6691694f4aa8c19c45 --- /dev/null +++ b/test/sun/security/tools/jarsigner/concise_jarsigner.sh @@ -0,0 +1,200 @@ +# +# 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 6802846 +# @summary jarsigner needs enhanced cert validation(options) +# +# @run shell concise_jarsigner.sh +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + ;; + * ) + FS="/" + ;; +esac + +KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore js.jks" +JAR=$TESTJAVA${FS}bin${FS}jar +JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner +JAVAC=$TESTJAVA${FS}bin${FS}javac + +rm js.jks + +echo class A1 {} > A1.java +echo class A2 {} > A2.java +echo class A3 {} > A3.java +echo class A4 {} > A4.java +echo class A5 {} > A5.java +echo class A6 {} > A6.java + +$JAVAC A1.java A2.java A3.java A4.java A5.java A6.java +YEAR=`date +%Y` + +# ========================================================== +# First part: output format +# ========================================================== + +$KT -genkeypair -alias a1 -dname CN=a1 -validity 365 +$KT -genkeypair -alias a2 -dname CN=a2 -validity 365 + +# a.jar includes 8 unsigned, 2 signed by a1 and a2, 2 signed by a3 +$JAR cvf a.jar A1.class A2.class +$JARSIGNER -keystore js.jks -storepass changeit a.jar a1 +$JAR uvf a.jar A3.class A4.class +$JARSIGNER -keystore js.jks -storepass changeit a.jar a2 +$JAR uvf a.jar A5.class A6.class + +# Verify OK +$JARSIGNER -verify a.jar +[ $? = 0 ] || exit $LINENO + +# 4(chainNotValidated)+16(hasUnsignedEntry)+32(aliasNotInStore) +$JARSIGNER -verify a.jar -strict +[ $? = 52 ] || exit $LINENO + +# 16(hasUnsignedEntry) +$JARSIGNER -verify a.jar -strict -keystore js.jks +[ $? = 16 ] || exit $LINENO + +# 16(hasUnsignedEntry)+32(notSignedByAlias) +$JARSIGNER -verify a.jar a1 -strict -keystore js.jks +[ $? = 48 ] || exit $LINENO + +# 16(hasUnsignedEntry) +$JARSIGNER -verify a.jar a1 a2 -strict -keystore js.jks +[ $? = 16 ] || exit $LINENO + +# 12 entries all together +LINES=`$JARSIGNER -verify a.jar -verbose | grep $YEAR | wc -l` +[ $LINES = 12 ] || exit $LINENO + +# 12 entries all listed +LINES=`$JARSIGNER -verify a.jar -verbose:grouped | grep $YEAR | wc -l` +[ $LINES = 12 ] || exit $LINENO + +# 3 groups: unrelated, signed, unsigned +LINES=`$JARSIGNER -verify a.jar -verbose:summary | grep $YEAR | wc -l` +[ $LINES = 3 ] || exit $LINENO + +# 4 groups: unrelated, signed by a1/a2, signed by a2, unsigned +LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep $YEAR | wc -l` +[ $LINES = 4 ] || exit $LINENO + +# 2*2 for A1/A2, 2 for A3/A4 +LINES=`$JARSIGNER -verify a.jar -verbose -certs | grep "\[certificate" | wc -l` +[ $LINES = 6 ] || exit $LINENO + +# a1,a2 for A1/A2, a2 for A3/A4 +LINES=`$JARSIGNER -verify a.jar -verbose:grouped -certs | grep "\[certificate" | wc -l` +[ $LINES = 3 ] || exit $LINENO + +# a1,a2 for A1/A2, a2 for A3/A4 +LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "\[certificate" | wc -l` +[ $LINES = 3 ] || exit $LINENO + +# 4 groups +LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "more)" | wc -l` +[ $LINES = 4 ] || exit $LINENO + +# ========================================================== +# Second part: exit code 2, 4, 8 +# 16 and 32 already covered in the first part +# ========================================================== + +$KT -genkeypair -alias expiring -dname CN=expiring -startdate -1m +$KT -genkeypair -alias expired -dname CN=expired -startdate -10m +$KT -genkeypair -alias notyetvalid -dname CN=notyetvalid -startdate +1m +$KT -genkeypair -alias badku -dname CN=badku -ext KU=cRLSign -validity 365 +$KT -genkeypair -alias badeku -dname CN=badeku -ext EKU=sa -validity 365 +$KT -genkeypair -alias goodku -dname CN=goodku -ext KU=dig -validity 365 +$KT -genkeypair -alias goodeku -dname CN=goodeku -ext EKU=codesign -validity 365 + +# badchain signed by ca, but ca is removed later +$KT -genkeypair -alias badchain -dname CN=badchain -validity 365 +$KT -genkeypair -alias ca -dname CN=ca -ext bc -validity 365 +$KT -certreq -alias badchain | $KT -gencert -alias ca -validity 365 | \ + $KT -importcert -alias badchain +$KT -delete -alias ca + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar expiring +[ $? = 2 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar expired +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar notyetvalid +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badku +[ $? = 8 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badeku +[ $? = 8 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodku +[ $? = 0 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodeku +[ $? = 0 ] || exit $LINENO + +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badchain +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -verify a.jar +[ $? = 0 ] || exit $LINENO + +# ========================================================== +# Third part: -certchain test +# ========================================================== + +# altchain signed by ca2, but ca2 is removed later +$KT -genkeypair -alias altchain -dname CN=altchain -validity 365 +$KT -genkeypair -alias ca2 -dname CN=ca2 -ext bc -validity 365 +$KT -certreq -alias altchain | $KT -gencert -alias ca2 -validity 365 -rfc > certchain +$KT -exportcert -alias ca2 -rfc >> certchain +$KT -delete -alias ca2 + +# Now altchain is still self-signed +$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar altchain +[ $? = 0 ] || exit $LINENO + +# If -certchain is used, then it's bad +$JARSIGNER -strict -keystore js.jks -storepass changeit -certchain certchain a.jar altchain +[ $? = 4 ] || exit $LINENO + +$JARSIGNER -verify a.jar +[ $? = 0 ] || exit $LINENO + +echo OK +exit 0 diff --git a/test/sun/security/tools/keytool/selfissued.sh b/test/sun/security/tools/keytool/selfissued.sh new file mode 100644 index 0000000000000000000000000000000000000000..e6e06c040b38ce3a40cacafe70be711eacab9518 --- /dev/null +++ b/test/sun/security/tools/keytool/selfissued.sh @@ -0,0 +1,69 @@ +# +# 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 6825352 +# @summary support self-issued certificate in keytool +# +# @run shell selfissued.sh +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + ;; + * ) + FS="/" + ;; +esac + +KS=selfsigned.jks +KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS" + +rm $KS + +$KT -alias ca -dname CN=CA -genkeypair +$KT -alias me -dname CN=CA -genkeypair +$KT -alias e1 -dname CN=E1 -genkeypair +$KT -alias e2 -dname CN=E2 -genkeypair + +# me signed by ca, self-issued +$KT -alias me -certreq | $KT -alias ca -gencert | $KT -alias me -importcert + +# Import e1 signed by me, should add me and ca +$KT -alias e1 -certreq | $KT -alias me -gencert | $KT -alias e1 -importcert +$KT -alias e1 -list -v | grep '\[3\]' || { echo Bad E1; exit 1; } + +# Import (e2 signed by me,ca,me), should reorder to (e2,me,ca) +( $KT -alias e2 -certreq | $KT -alias me -gencert; $KT -exportcert -alias ca; $KT -exportcert -alias me ) | $KT -alias e2 -importcert +$KT -alias e2 -list -v | grep '\[3\]' || { echo Bad E2; exit 1; } + +echo Good + diff --git a/test/sun/security/util/Oid/OidFormat.java b/test/sun/security/util/Oid/OidFormat.java index 9de4a757ea725078cd21ab9a1cd2785d0a4ff2da..10b7fdd9ee502f9c4cd6f4c55281217cbb0ead84 100644 --- a/test/sun/security/util/Oid/OidFormat.java +++ b/test/sun/security/util/Oid/OidFormat.java @@ -63,9 +63,22 @@ public class OidFormat { "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 --git a/test/sun/security/util/Oid/S11N.sh b/test/sun/security/util/Oid/S11N.sh new file mode 100644 index 0000000000000000000000000000000000000000..77341e8a91bb60fafb76f5aa4cd6c67b428a0840 --- /dev/null +++ b/test/sun/security/util/Oid/S11N.sh @@ -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 --git a/test/sun/security/util/Oid/SerialTest.java b/test/sun/security/util/Oid/SerialTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2c8516eaa6a45244c43ddd34c75ff2161662a0a5 --- /dev/null +++ b/test/sun/security/util/Oid/SerialTest.java @@ -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 --git a/test/tools/launcher/MultipleJRE.sh b/test/tools/launcher/MultipleJRE.sh index b3e1cf764edd26dfe02ca9c1da8b4800437b6d8c..a6dfaaa5253a7af16276193acf14c60503f48cac 100644 --- a/test/tools/launcher/MultipleJRE.sh +++ b/test/tools/launcher/MultipleJRE.sh @@ -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,10 +49,25 @@ then 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 @@ CreateUglyJar() { $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 @@ LaunchVM() { 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 @@ CreateJar "" "" 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 @@ if [ -x /usr/bin/zipnote ]; then 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-" # Ends with a separator 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 --git a/test/tools/launcher/ZipMeUp.java b/test/tools/launcher/ZipMeUp.java new file mode 100644 index 0000000000000000000000000000000000000000..84d3f186e7e8d047237fe07b7e2544c945ef3ddf --- /dev/null +++ b/test/tools/launcher/ZipMeUp.java @@ -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); + } +}