--- a/.hgtags-top-repo Thu Jul 03 11:01:30 2008 -0700
+++ b/.hgtags-top-repo Wed Jul 05 16:38:48 2017 +0200
@@ -4,3 +4,4 @@
11b4dc9f2be3523ef989a0db8459eb56b3045c3a jdk7-b27
56652b46f328937f6b9b5130f1e4cd80f48868ef jdk7-b28
31e08f70e88d77c2053f91c21b49a04296bdc59a jdk7-b29
+2dab2f712e1832c92acfa63ec0337048b9422c20 jdk7-b30
--- a/hotspot/.hgignore Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/.hgignore Wed Jul 05 16:38:48 2017 +0200
@@ -2,3 +2,6 @@
^dist/
^nbproject/private/
^src/share/tools/hsdis/bin/
+^src/share/tools/IdealGraphVisualizer/[a-zA-Z0-9]*/build/
+^src/share/tools/IdealGraphVisualizer/build/
+^src/share/tools/IdealGraphVisualizer/dist/
--- a/hotspot/.hgtags Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/.hgtags Wed Jul 05 16:38:48 2017 +0200
@@ -4,3 +4,4 @@
e3d2692f8442e2d951166dc9bd9a330684754438 jdk7-b27
c14dab40ed9bf45ad21150bd70c9c80cdf655415 jdk7-b28
4f91c08b3e4498213a9c5a24898f7d9c38cf86fb jdk7-b29
+d1605aabd0a15ecf93787c47de63073c33fba52d jdk7-b30
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java Wed Jul 05 16:38:48 2017 +0200
@@ -316,6 +316,14 @@
iterateLiveRegions(liveRegions, visitor, null);
}
+ public boolean isValidMethod(OopHandle handle) {
+ OopHandle klass = Oop.getKlassForOopHandle(handle);
+ if (klass != null && klass.equals(methodKlassHandle)) {
+ return true;
+ }
+ return false;
+ }
+
// Creates an instance from the Oop hierarchy based based on the handle
public Oop newOop(OopHandle handle) {
// The only known way to detect the right type of an oop is
@@ -375,8 +383,10 @@
}
}
- System.err.println("Unknown oop at " + handle);
- System.err.println("Oop's klass is " + klass);
+ if (DEBUG) {
+ System.err.println("Unknown oop at " + handle);
+ System.err.println("Oop's klass is " + klass);
+ }
throw new UnknownOopException();
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java Wed Jul 05 16:38:48 2017 +0200
@@ -215,11 +215,11 @@
if (f == null) return null;
boolean imprecise = true;
if (f.isInterpretedFrame() && !f.isInterpretedFrameValid()) {
- if (DEBUG) {
- System.out.println("Correcting for invalid interpreter frame");
- }
- f = f.sender(regMap);
- imprecise = false;
+ if (DEBUG) {
+ System.out.println("Correcting for invalid interpreter frame");
+ }
+ f = f.sender(regMap);
+ imprecise = false;
}
VFrame vf = VFrame.newVFrame(f, regMap, this, true, imprecise);
if (vf == null) {
@@ -228,10 +228,7 @@
}
return null;
}
- if (vf.isJavaFrame()) {
- return (JavaVFrame) vf;
- }
- return (JavaVFrame) vf.javaSender();
+ return vf.isJavaFrame() ? (JavaVFrame)vf : vf.javaSender();
}
/** In this system, a JavaThread is the top-level factory for a
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java Wed Jul 05 16:38:48 2017 +0200
@@ -121,6 +121,13 @@
}
public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
+
+ // If java stack is walkable then both last_Java_sp and last_Java_pc are
+ // non null and we can start stack walk from this frame.
+ if (thread.getLastJavaSP() != null && thread.getLastJavaPC() != null) {
+ return new SPARCFrame(SPARCFrame.biasSP(thread.getLastJavaSP()), thread.getLastJavaPC());
+ }
+
ThreadProxy t = getThreadProxy(addr);
SPARCThreadContext context = (SPARCThreadContext) t.getContext();
// For now, let's see what happens if we do a similar thing to
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java Wed Jul 05 16:38:48 2017 +0200
@@ -422,6 +422,13 @@
if (getFP().addOffsetTo(INTERPRETER_FRAME_VM_LOCAL_WORDS * VM.getVM().getAddressSize()).lessThan(getSP())) {
return false;
}
+
+ OopHandle methodHandle = addressOfInterpreterFrameMethod().getOopHandleAt(0);
+
+ if (VM.getVM().getObjectHeap().isValidMethod(methodHandle) == false) {
+ return false;
+ }
+
// These are hacks to keep us out of trouble.
// The problem with these is that they mask other problems
if (getFP().lessThanOrEqual(getSP())) { // this attempts to deal with unsigned comparison above
@@ -433,9 +440,18 @@
// FIXME: this is not atomic with respect to GC and is unsuitable
// for use in a non-debugging, or reflective, system. Need to
// figure out how to express this.
- if (addressOfInterpreterFrameBCX().getAddressAt(0) == null) {
- return false; // BCP not yet set up
+ Address bcx = addressOfInterpreterFrameBCX().getAddressAt(0);
+
+ Method method;
+ try {
+ method = (Method) VM.getVM().getObjectHeap().newOop(methodHandle);
+ } catch (UnknownOopException ex) {
+ return false;
}
+ int bci = bcpToBci(bcx, method);
+ //validate bci
+ if (bci < 0) return false;
+
return true;
}
@@ -471,7 +487,7 @@
// will update it accordingly
map.setIncludeArgumentOops(false);
- if (cb == null && isEntryFrame()) {
+ if (isEntryFrame()) {
return senderForEntryFrame(map);
}
@@ -539,7 +555,6 @@
int SP_OFFSET_IN_GREGSET = 17;
raw_sp = fp.getAddressAt(VM.getVM().getAddressSize() * SP_OFFSET_IN_GREGSET);
Address pc = fp.getAddressAt(VM.getVM().getAddressSize() * PC_OFFSET_IN_GREGSET);
- // System.out.println(" next frame's SP: " + sp + " PC: " + pc);
return new SPARCFrame(raw_sp, pc);
}
}
@@ -562,10 +577,8 @@
// sender's _interpreter_sp_adjustment field.
if (VM.getVM().getInterpreter().contains(pc)) {
isInterpreted = true;
- if (VM.getVM().isClientCompiler()) {
- map.makeIntegerRegsUnsaved();
- map.shiftWindow(sp, youngerSP);
- }
+ map.makeIntegerRegsUnsaved();
+ map.shiftWindow(sp, youngerSP);
} else {
// Find a CodeBlob containing this frame's pc or elide the lookup and use the
// supplied blob which is already known to be associated with this frame.
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Wed Jul 05 16:38:48 2017 +0200
@@ -87,12 +87,13 @@
while (f != null) {
ClosestSymbol sym = f.closestSymbolToPC();
Address pc = f.pc();
+ out.print(pc + "\t");
if (sym != null) {
String name = sym.getName();
if (cdbgCanDemangle) {
name = cdbg.demangle(name);
}
- out.print(pc + "\t" + name);
+ out.print(name);
long diff = sym.getOffset();
if (diff != 0L) {
out.print(" + 0x" + Long.toHexString(diff));
@@ -120,7 +121,6 @@
// look for known code blobs
CodeCache c = VM.getVM().getCodeCache();
if (c.contains(pc)) {
- out.print(pc + "\t");
CodeBlob cb = c.findBlobUnsafe(pc);
if (cb.isNMethod()) {
names = getJavaNames(th, f.localVariableBase());
@@ -144,18 +144,18 @@
out.println("<Unknown code blob>");
}
} else {
- printUnknown(out,pc);
+ printUnknown(out);
}
}
// print java frames, if any
if (names != null && names.length != 0) {
// print java frame(s)
for (int i = 0; i < names.length; i++) {
- out.println(pc + "\t" + names[i]);
+ out.println(names[i]);
}
}
} else {
- printUnknown(out,pc);
+ printUnknown(out);
}
}
f = f.sender();
@@ -220,8 +220,8 @@
}
}
- private void printUnknown(PrintStream out, Address pc) {
- out.println(pc + "\t????????");
+ private void printUnknown(PrintStream out) {
+ out.println("\t????????");
}
private String[] getJavaNames(ThreadProxy th, Address fp) {
--- a/hotspot/make/defs.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/defs.make Wed Jul 05 16:38:48 2017 +0200
@@ -228,6 +228,7 @@
# Required make macro settings for all platforms
MAKE_ARGS += JAVA_HOME=$(ABS_BOOTDIR)
+MAKE_ARGS += OUTPUTDIR=$(ABS_OUTPUTDIR)
MAKE_ARGS += GAMMADIR=$(ABS_GAMMADIR)
MAKE_ARGS += MAKE_VERBOSE=$(MAKE_VERBOSE)
MAKE_ARGS += HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION)
--- a/hotspot/make/hotspot_version Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/hotspot_version Wed Jul 05 16:38:48 2017 +0200
@@ -33,9 +33,9 @@
# Don't put quotes (fail windows build).
HOTSPOT_VM_COPYRIGHT=Copyright 2008
-HS_MAJOR_VER=13
+HS_MAJOR_VER=14
HS_MINOR_VER=0
-HS_BUILD_NUMBER=02
+HS_BUILD_NUMBER=01
JDK_MAJOR_VER=1
JDK_MINOR_VER=7
Binary file hotspot/make/linux/Queens.class has changed
--- a/hotspot/make/linux/makefiles/buildtree.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/linux/makefiles/buildtree.make Wed Jul 05 16:38:48 2017 +0200
@@ -328,18 +328,19 @@
WRONG_DATA_MODE_MSG = \
echo "JAVA_HOME must point to $(DATA_MODE)bit JDK."
-test_gamma: $(BUILDTREE_MAKE)
+test_gamma: $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java
@echo Creating $@ ...
$(QUIETLY) ( \
echo '#!/bin/sh'; \
$(BUILDTREE_COMMENT); \
echo '. ./env.sh'; \
echo "if [ -z \$$JAVA_HOME ]; then { $(NO_JAVA_HOME_MSG); exit 0; }; fi"; \
- echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>1 > /dev/null"; \
+ echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>&1 > /dev/null"; \
echo "then"; \
echo " $(WRONG_DATA_MODE_MSG); exit 0;"; \
echo "fi"; \
- echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \
+ echo "rm -f Queens.class"; \
+ echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \
echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \
echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \
) > $@
--- a/hotspot/make/linux/makefiles/gcc.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/linux/makefiles/gcc.make Wed Jul 05 16:38:48 2017 +0200
@@ -50,14 +50,7 @@
VM_PICFLAG/LIBJVM = $(PICFLAG)
VM_PICFLAG/AOUT =
-
-ifneq ($(BUILDARCH), i486)
VM_PICFLAG = $(VM_PICFLAG/$(LINK_INTO))
-else
-# PIC has significant overhead on x86, build nonpic VM for now.
-# Link JVM at a "good" base location to avoid unnecessary .text patching.
-JVM_BASE_ADDR = 0x06000000
-endif
CFLAGS += $(VM_PICFLAG)
CFLAGS += -fno-rtti
@@ -91,8 +84,17 @@
# Compiler warnings are treated as errors
WARNINGS_ARE_ERRORS = -Werror
+
# Except for a few acceptable ones
+# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
+# conversions which might affect the values. To avoid that, we need to turn
+# it off explicitly.
+ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ACCEPTABLE_WARNINGS = -Wpointer-arith -Wsign-compare
+else
ACCEPTABLE_WARNINGS = -Wpointer-arith -Wconversion -Wsign-compare
+endif
+
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(ACCEPTABLE_WARNINGS)
# Special cases
CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
--- a/hotspot/make/linux/makefiles/mapfile-vers-debug Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/linux/makefiles/mapfile-vers-debug Wed Jul 05 16:38:48 2017 +0200
@@ -89,6 +89,7 @@
JVM_FillInStackTrace;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
+ JVM_FindClassFromBootLoader;
JVM_FindLibraryEntry;
JVM_FindLoadedClass;
JVM_FindPrimitiveClass;
--- a/hotspot/make/linux/makefiles/mapfile-vers-product Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/linux/makefiles/mapfile-vers-product Wed Jul 05 16:38:48 2017 +0200
@@ -89,6 +89,7 @@
JVM_FillInStackTrace;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
+ JVM_FindClassFromBootLoader;
JVM_FindLibraryEntry;
JVM_FindLoadedClass;
JVM_FindPrimitiveClass;
--- a/hotspot/make/linux/makefiles/rules.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/linux/makefiles/rules.make Wed Jul 05 16:38:48 2017 +0200
@@ -133,10 +133,25 @@
COMPILE_DONE = && { echo Done with $<; }
endif
+# Include $(NONPIC_OBJ_FILES) definition
+ifndef LP64
+include $(GAMMADIR)/make/pic.make
+endif
+
+# The non-PIC object files are only generated for 32 bit platforms.
+ifdef LP64
%.o: %.cpp
@echo Compiling $<
$(QUIETLY) $(REMOVE_TARGET)
$(QUIETLY) $(COMPILE.CC) -o $@ $< $(COMPILE_DONE)
+else
+%.o: %.cpp
+ @echo Compiling $<
+ $(QUIETLY) $(REMOVE_TARGET)
+ $(QUIETLY) $(if $(findstring $@, $(NONPIC_OBJ_FILES)), \
+ $(subst $(VM_PICFLAG), ,$(COMPILE.CC)) -o $@ $< $(COMPILE_DONE), \
+ $(COMPILE.CC) -o $@ $< $(COMPILE_DONE))
+endif
%.o: %.s
@echo Assembling $<
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/pic.make Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,41 @@
+#
+# Copyright 2006-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.
+#
+#
+
+# A list of object files built without the platform specific PIC flags, e.g.
+# -fPIC on linux. Performance measurements show that by compiling GC related
+# code, we could significantly reduce the GC pause time on 32 bit Linux/Unix
+# platforms. See 6454213 for more details.
+include $(GAMMADIR)/make/scm.make
+
+ifneq ($(OSNAME), windows)
+ ifndef LP64
+ NONPIC_DIRS = memory oops gc_implementation gc_interface
+ NONPIC_DIRS := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
+ # Look for source files under NONPIC_DIRS
+ NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\
+ $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \
+ -name '*.cpp' -print))
+ NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES)))
+ endif
+endif
Binary file hotspot/make/solaris/Queens.class has changed
--- a/hotspot/make/solaris/makefiles/buildtree.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/buildtree.make Wed Jul 05 16:38:48 2017 +0200
@@ -340,7 +340,7 @@
WRONG_DATA_MODE_MSG = \
echo "JAVA_HOME must point to $(DATA_MODE)bit JDK."
-test_gamma: $(BUILDTREE_MAKE)
+test_gamma: $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java
@echo Creating $@ ...
$(QUIETLY) ( \
echo '#!/bin/ksh'; \
@@ -351,7 +351,8 @@
echo "then"; \
echo " $(WRONG_DATA_MODE_MSG); exit 0;"; \
echo "fi"; \
- echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \
+ echo "rm -f Queens.class"; \
+ echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \
echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \
echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \
) > $@
--- a/hotspot/make/solaris/makefiles/jvmg.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/jvmg.make Wed Jul 05 16:38:48 2017 +0200
@@ -30,7 +30,7 @@
ifeq ("${Platform_compiler}", "sparcWorks")
-ifeq ($(COMPILER_REV),5.8))
+ifeq ($(COMPILER_REV),5.8)
# SS11 SEGV when compiling with -g and -xarch=v8, using different backend
DEBUG_CFLAGS/compileBroker.o = $(DEBUG_CFLAGS) -xO0
DEBUG_CFLAGS/jvmtiTagMap.o = $(DEBUG_CFLAGS) -xO0
--- a/hotspot/make/solaris/makefiles/mapfile-vers Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/mapfile-vers Wed Jul 05 16:38:48 2017 +0200
@@ -89,6 +89,7 @@
JVM_FillInStackTrace;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
+ JVM_FindClassFromBootLoader;
JVM_FindLibraryEntry;
JVM_FindLoadedClass;
JVM_FindPrimitiveClass;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 Wed Jul 05 16:38:48 2017 +0200
@@ -2175,6 +2175,7 @@
text: .text%jni_GetStringUTFRegion: jni.o;
text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%JVM_IsInterface;
text: .text%JVM_GetClassDeclaredConstructors;
text: .text%__1cNmethodOopDescOis_initializer6kM_i_;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc Wed Jul 05 16:38:48 2017 +0200
@@ -1500,6 +1500,7 @@
text: .text%jni_GetStringUTFRegion: jni.o;
text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%JVM_IsInterface;
text: .text%JVM_GetClassDeclaredConstructors;
text: .text%__1cNmethodOopDescOis_initializer6kM_i_;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 Wed Jul 05 16:38:48 2017 +0200
@@ -4339,6 +4339,7 @@
text: .text%__1cFParseLarray_store6MnJBasicType__v_;
text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_;
text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_;
text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 Wed Jul 05 16:38:48 2017 +0200
@@ -4755,6 +4755,7 @@
text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_;
text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_;
text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o;
text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc Wed Jul 05 16:38:48 2017 +0200
@@ -3713,6 +3713,7 @@
text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_;
text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%signalHandler;
text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o;
text: .text%JVM_handle_solaris_signal;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 Wed Jul 05 16:38:48 2017 +0200
@@ -3735,6 +3735,7 @@
text: .text%__1cQjava_lang_ThreadRget_thread_status6FpnHoopDesc__n0AMThreadStatus__;
text: .text%__1cIMulINodeGadd_id6kM_pknEType__: classes.o;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%__1cHTypePtrFempty6kM_i_;
text: .text%__1cQaddP_reg_regNodeEsize6kMpnNPhaseRegAlloc__I_;
text: .text%__1cbFunnecessary_membar_volatileNodePoper_input_base6kM_I_: ad_sparc_misc.o;
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_amd64 Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_amd64 Wed Jul 05 16:38:48 2017 +0200
@@ -4339,6 +4339,7 @@
text: .text%__1cFParseLarray_store6MnJBasicType__v_;
text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_;
text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_;
text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_;
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_i486 Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_i486 Wed Jul 05 16:38:48 2017 +0200
@@ -4755,6 +4755,7 @@
text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_;
text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_;
text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o;
text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o;
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_sparc Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_sparc Wed Jul 05 16:38:48 2017 +0200
@@ -3713,6 +3713,7 @@
text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_;
text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o;
text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
text: .text%signalHandler;
text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o;
text: .text%JVM_handle_solaris_signal;
--- a/hotspot/make/solaris/makefiles/rules.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/solaris/makefiles/rules.make Wed Jul 05 16:38:48 2017 +0200
@@ -133,19 +133,10 @@
COMPILE_DONE = && { echo Done with $<; }
endif
-# A list of directories under which all source code are built without -KPIC/-Kpic
-# flag. Performance measurements show that compiling GC related code will
-# dramatically reduce the gc pause time. See bug 6454213 for more details.
-
-include $(GAMMADIR)/make/scm.make
-
-NONPIC_DIRS = memory oops gc_implementation gc_interface
-NONPIC_DIRS := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
-# Look for source code under NONPIC_DIRS
-NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\
- $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \
- -name '*.cpp' -print))
-NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES)))
+# Include NONPIC_OBJ_FILES definition
+ifndef LP64
+include $(GAMMADIR)/make/pic.make
+endif
# Sun compiler for 64 bit Solaris does not support building non-PIC object files.
ifdef LP64
--- a/hotspot/make/windows/makefiles/vm.make Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/make/windows/makefiles/vm.make Wed Jul 05 16:38:48 2017 +0200
@@ -88,13 +88,20 @@
!endif
!endif
-LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \
- /export:JNI_GetDefaultJavaVMInitArgs /export:JNI_CreateJavaVM \
- /export:JNI_GetCreatedJavaVMs /export:jio_snprintf \
- /export:jio_printf /export:jio_fprintf \
- /export:jio_vfprintf /export:jio_vsnprintf $(AGCT_EXPORT) \
- /export:JVM_GetVersionInfo \
- /export:JVM_GetThreadStateNames /export:JVM_GetThreadStateValues \
+LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \
+ /export:JNI_GetDefaultJavaVMInitArgs \
+ /export:JNI_CreateJavaVM \
+ /export:JVM_FindClassFromBootLoader \
+ /export:JNI_GetCreatedJavaVMs \
+ /export:jio_snprintf \
+ /export:jio_printf \
+ /export:jio_fprintf \
+ /export:jio_vfprintf \
+ /export:jio_vsnprintf \
+ $(AGCT_EXPORT) \
+ /export:JVM_GetVersionInfo \
+ /export:JVM_GetThreadStateNames \
+ /export:JVM_GetThreadStateValues \
/export:JVM_InitAgentProperties
CPP_INCLUDE_DIRS=\
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 16:38:48 2017 +0200
@@ -5955,7 +5955,7 @@
// Convert oop pointer into compressed form
instruct encodeHeapOop(iRegN dst, iRegP src) %{
- predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull);
+ predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
match(Set dst (EncodeP src));
format %{ "encode_heap_oop $src, $dst" %}
ins_encode %{
@@ -5965,7 +5965,7 @@
%}
instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{
- predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull);
+ predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
match(Set dst (EncodeP src));
format %{ "encode_heap_oop_not_null $src, $dst" %}
ins_encode %{
--- a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -307,6 +307,10 @@
// Use it on new AMD cpus starting from Opteron.
UseAddressNop = true;
}
+ if( supports_sse2() && FLAG_IS_DEFAULT(UseNewLongLShift) ) {
+ // Use it on new AMD cpus starting from Opteron.
+ UseNewLongLShift = true;
+ }
if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) {
if( supports_sse4a() ) {
UseXmmLoadAndClearUpper = true; // use movsd only on '10h' Opteron
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 05 16:38:48 2017 +0200
@@ -4754,6 +4754,33 @@
interface(CONST_INTER);
%}
+operand immI_1() %{
+ predicate( n->get_int() == 1 );
+ match(ConI);
+
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
+operand immI_2() %{
+ predicate( n->get_int() == 2 );
+ match(ConI);
+
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
+operand immI_3() %{
+ predicate( n->get_int() == 3 );
+ match(ConI);
+
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
// Pointer Immediate
operand immP() %{
match(ConP);
@@ -8943,6 +8970,63 @@
ins_pipe( ialu_reg_long_mem );
%}
+// Shift Left Long by 1
+instruct shlL_eReg_1(eRegL dst, immI_1 cnt, eFlagsReg cr) %{
+ predicate(UseNewLongLShift);
+ match(Set dst (LShiftL dst cnt));
+ effect(KILL cr);
+ ins_cost(100);
+ format %{ "ADD $dst.lo,$dst.lo\n\t"
+ "ADC $dst.hi,$dst.hi" %}
+ ins_encode %{
+ __ addl($dst$$Register,$dst$$Register);
+ __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+ %}
+ ins_pipe( ialu_reg_long );
+%}
+
+// Shift Left Long by 2
+instruct shlL_eReg_2(eRegL dst, immI_2 cnt, eFlagsReg cr) %{
+ predicate(UseNewLongLShift);
+ match(Set dst (LShiftL dst cnt));
+ effect(KILL cr);
+ ins_cost(100);
+ format %{ "ADD $dst.lo,$dst.lo\n\t"
+ "ADC $dst.hi,$dst.hi\n\t"
+ "ADD $dst.lo,$dst.lo\n\t"
+ "ADC $dst.hi,$dst.hi" %}
+ ins_encode %{
+ __ addl($dst$$Register,$dst$$Register);
+ __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+ __ addl($dst$$Register,$dst$$Register);
+ __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+ %}
+ ins_pipe( ialu_reg_long );
+%}
+
+// Shift Left Long by 3
+instruct shlL_eReg_3(eRegL dst, immI_3 cnt, eFlagsReg cr) %{
+ predicate(UseNewLongLShift);
+ match(Set dst (LShiftL dst cnt));
+ effect(KILL cr);
+ ins_cost(100);
+ format %{ "ADD $dst.lo,$dst.lo\n\t"
+ "ADC $dst.hi,$dst.hi\n\t"
+ "ADD $dst.lo,$dst.lo\n\t"
+ "ADC $dst.hi,$dst.hi\n\t"
+ "ADD $dst.lo,$dst.lo\n\t"
+ "ADC $dst.hi,$dst.hi" %}
+ ins_encode %{
+ __ addl($dst$$Register,$dst$$Register);
+ __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+ __ addl($dst$$Register,$dst$$Register);
+ __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+ __ addl($dst$$Register,$dst$$Register);
+ __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+ %}
+ ins_pipe( ialu_reg_long );
+%}
+
// Shift Left Long by 1-31
instruct shlL_eReg_1_31(eRegL dst, immI_1_31 cnt, eFlagsReg cr) %{
match(Set dst (LShiftL dst cnt));
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Wed Jul 05 16:38:48 2017 +0200
@@ -7060,7 +7060,7 @@
// Convert oop pointer into compressed form
instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
- predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull);
+ predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
match(Set dst (EncodeP src));
effect(KILL cr);
format %{ "encode_heap_oop $dst,$src" %}
@@ -7076,7 +7076,7 @@
%}
instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
- predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull);
+ predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
match(Set dst (EncodeP src));
effect(KILL cr);
format %{ "encode_heap_oop_not_null $dst,$src" %}
--- a/hotspot/src/os/linux/vm/hpi_linux.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/os/linux/vm/hpi_linux.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -70,6 +70,10 @@
RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, (unsigned int) flags));
}
+inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+ return send(fd, buf, nBytes, flags);
+}
+
inline int hpi::timeout(int fd, long timeout) {
julong prevtime,newtime;
struct timeval t;
--- a/hotspot/src/os/linux/vm/jvm_linux.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/os/linux/vm/jvm_linux.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -132,7 +132,7 @@
*/
struct siglabel {
- char *name;
+ const char *name;
int number;
};
--- a/hotspot/src/os/linux/vm/os_linux.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -75,8 +75,8 @@
bool os::Linux::_is_floating_stack = false;
bool os::Linux::_is_NPTL = false;
bool os::Linux::_supports_fast_thread_cpu_time = false;
-char * os::Linux::_glibc_version = NULL;
-char * os::Linux::_libpthread_version = NULL;
+const char * os::Linux::_glibc_version = NULL;
+const char * os::Linux::_libpthread_version = NULL;
static jlong initial_time_count=0;
@@ -213,9 +213,9 @@
// the system call returns 1. This causes the VM to act as if it is
// a single processor and elide locking (see is_MP() call).
static bool unsafe_chroot_detected = false;
-static char *unstable_chroot_error = "/proc file system not found.\n"
- "Java may be unstable running multithreaded in a chroot "
- "environment on Linux when /proc filesystem is not mounted.";
+static const char *unstable_chroot_error = "/proc file system not found.\n"
+ "Java may be unstable running multithreaded in a chroot "
+ "environment on Linux when /proc filesystem is not mounted.";
void os::Linux::initialize_system_info() {
_processor_count = sysconf(_SC_NPROCESSORS_CONF);
@@ -544,26 +544,23 @@
if (n > 0) {
char *str = (char *)malloc(n);
confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n);
-
// Vanilla RH-9 (glibc 2.3.2) has a bug that confstr() always tells
// us "NPTL-0.29" even we are running with LinuxThreads. Check if this
- // is the case:
+ // is the case. LinuxThreads has a hard limit on max number of threads.
+ // So sysconf(_SC_THREAD_THREADS_MAX) will return a positive value.
+ // On the other hand, NPTL does not have such a limit, sysconf()
+ // will return -1 and errno is not changed. Check if it is really NPTL.
if (strcmp(os::Linux::glibc_version(), "glibc 2.3.2") == 0 &&
- strstr(str, "NPTL")) {
- // LinuxThreads has a hard limit on max number of threads. So
- // sysconf(_SC_THREAD_THREADS_MAX) will return a positive value.
- // On the other hand, NPTL does not have such a limit, sysconf()
- // will return -1 and errno is not changed. Check if it is really
- // NPTL:
- if (sysconf(_SC_THREAD_THREADS_MAX) > 0) {
- free(str);
- str = "linuxthreads";
- }
+ strstr(str, "NPTL") &&
+ sysconf(_SC_THREAD_THREADS_MAX) > 0) {
+ free(str);
+ os::Linux::set_libpthread_version("linuxthreads");
+ } else {
+ os::Linux::set_libpthread_version(str);
}
- os::Linux::set_libpthread_version(str);
} else {
- // glibc before 2.3.2 only has LinuxThreads.
- os::Linux::set_libpthread_version("linuxthreads");
+ // glibc before 2.3.2 only has LinuxThreads.
+ os::Linux::set_libpthread_version("linuxthreads");
}
if (strstr(libpthread_version(), "NPTL")) {
@@ -4632,11 +4629,7 @@
// Unlike system(), this function can be called from signal handler. It
// doesn't block SIGINT et al.
int os::fork_and_exec(char* cmd) {
- char * argv[4];
- argv[0] = "sh";
- argv[1] = "-c";
- argv[2] = cmd;
- argv[3] = NULL;
+ const char * argv[4] = {"sh", "-c", cmd, NULL};
// fork() in LinuxThreads/NPTL is not async-safe. It needs to run
// pthread_atfork handlers and reset pthread library. All we need is a
@@ -4661,7 +4654,7 @@
// IA64 should use normal execve() from glibc to match the glibc fork()
// above.
NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);)
- IA64_ONLY(execve("/bin/sh", argv, environ);)
+ IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);)
// execve failed
_exit(-1);
--- a/hotspot/src/os/linux/vm/os_linux.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/os/linux/vm/os_linux.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -52,8 +52,8 @@
static address _initial_thread_stack_bottom;
static uintptr_t _initial_thread_stack_size;
- static char *_glibc_version;
- static char *_libpthread_version;
+ static const char *_glibc_version;
+ static const char *_libpthread_version;
static bool _is_floating_stack;
static bool _is_NPTL;
@@ -72,8 +72,8 @@
static julong physical_memory() { return _physical_memory; }
static void initialize_system_info();
- static void set_glibc_version(char *s) { _glibc_version = s; }
- static void set_libpthread_version(char *s) { _libpthread_version = s; }
+ static void set_glibc_version(const char *s) { _glibc_version = s; }
+ static void set_libpthread_version(const char *s) { _libpthread_version = s; }
static bool supports_variable_stack_size();
@@ -134,8 +134,8 @@
static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
// GNU libc and libpthread version strings
- static char *glibc_version() { return _glibc_version; }
- static char *libpthread_version() { return _libpthread_version; }
+ static const char *glibc_version() { return _glibc_version; }
+ static const char *libpthread_version() { return _libpthread_version; }
// NPTL or LinuxThreads?
static bool is_LinuxThreads() { return !_is_NPTL; }
--- a/hotspot/src/os/solaris/vm/hpi_solaris.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/os/solaris/vm/hpi_solaris.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -71,6 +71,10 @@
INTERRUPTIBLE_RETURN_INT(::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
}
+inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+ RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags));
+}
+
// As both poll and select can be interrupted by signals, we have to be
// prepared to restart the system call after updating the timeout, unless
// a poll() is done with timeout == -1, in which case we repeat with this
--- a/hotspot/src/os/windows/vm/hpi_windows.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/os/windows/vm/hpi_windows.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -102,6 +102,10 @@
fd, buf, nBytes, flags),
(fd, buf, nBytes, flags));
+inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+ return send(fd, buf, nBytes, flags);
+}
+
HPIDECL(timeout, "timeout", _socket, Timeout, int, "%d",
(int fd, long timeout),
("fd = %d, timeout = %ld", fd, timeout),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.svg" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.svg.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.svg
+OpenIDE-Module-Layer: com/sun/hotspot/igv/svg/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/svg/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.svg-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=ebcf0422
+build.xml.script.CRC32=d7a2678d
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=ebcf0422
+nbproject/build-impl.xml.script.CRC32=57997f94
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.svg</code-name-base>
+ <suite-component/>
+ <module-dependencies/>
+ <public-packages>
+ <package>com.sun.hotspot.igv.svg</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.svg;
+
+import java.awt.Graphics2D;
+import java.io.Writer;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import org.w3c.dom.DOMImplementation;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BatikSVG {
+
+ private static Constructor SVGGraphics2DConstructor;
+ private static Method Method_stream;
+ private static Method Method_createDefault;
+ private static Method Method_getDOMImplementation;
+ private static Method Method_setEmbeddedFontsOn;
+
+ public static Graphics2D createGraphicsObject() {
+ try {
+ if (SVGGraphics2DConstructor == null) {
+ ClassLoader cl = BatikSVG.class.getClassLoader();
+ Class Class_GenericDOMImplementation = cl.loadClass("org.apache.batik.dom.GenericDOMImplementation");
+ Class Class_SVGGeneratorContext = cl.loadClass("org.apache.batik.svggen.SVGGeneratorContext");
+ Class Class_SVGGraphics2D = cl.loadClass("org.apache.batik.svggen.SVGGraphics2D");
+ Method_getDOMImplementation = Class_GenericDOMImplementation.getDeclaredMethod("getDOMImplementation", new Class[0]);
+ Method_createDefault = Class_SVGGeneratorContext.getDeclaredMethod("createDefault", new Class[]{org.w3c.dom.Document.class});
+ Method_setEmbeddedFontsOn = Class_SVGGeneratorContext.getDeclaredMethod("setEmbeddedFontsOn", new Class[]{boolean.class});
+ Method_stream = Class_SVGGraphics2D.getDeclaredMethod("stream", Writer.class, boolean.class);
+ SVGGraphics2DConstructor = Class_SVGGraphics2D.getConstructor(Class_SVGGeneratorContext, boolean.class);
+ }
+ DOMImplementation dom = (DOMImplementation) Method_getDOMImplementation.invoke(null);
+ org.w3c.dom.Document document = dom.createDocument("http://www.w3.org/2000/svg", "svg", null);
+ Object ctx = Method_createDefault.invoke(null, document);
+ Method_setEmbeddedFontsOn.invoke(ctx, true);
+ Graphics2D svgGenerator = (Graphics2D) SVGGraphics2DConstructor.newInstance(ctx, true);
+ return svgGenerator;
+ } catch (ClassNotFoundException e) {
+ return null;
+ } catch (NoSuchMethodException e) {
+ return null;
+ } catch (IllegalAccessException e) {
+ return null;
+ } catch (InvocationTargetException e) {
+ return null;
+ } catch (InstantiationException e) {
+ return null;
+ }
+ }
+
+ public static void printToStream(Graphics2D svgGenerator, Writer stream, boolean useCSS) {
+ try {
+ Method_stream.invoke(svgGenerator, stream, useCSS);
+ } catch (IllegalAccessException e) {
+ assert false;
+ } catch (InvocationTargetException e) {
+ assert false;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=BatikSVGProxy
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.bytecodes" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.bytecodes.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.bytecodes
+OpenIDE-Module-Layer: com/sun/hotspot/igv/bytecodes/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/bytecodes/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.bytecodes-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=1dee290d
+build.xml.script.CRC32=d594034f
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=1dee290d
+nbproject/build-impl.xml.script.CRC32=b4dab126
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.bytecodes</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.jdesktop.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.4</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.explorer</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.11</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.nodes</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.2.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.9.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.windows</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.16</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages/>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+CTL_BytecodeViewAction=Open BytecodeView Window
+CTL_BytecodeViewTopComponent=BytecodeView Window
+CTL_SelectBytecodesAction=Select nodes
+HINT_BytecodeViewTopComponent=This is a BytecodeView window
+OpenIDE-Module-Name=Bytecodes
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.StringPropertyMatcher;
+import java.awt.Image;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.Action;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BytecodeNode extends AbstractNode {
+
+ private Set<InputNode> nodes;
+
+ public BytecodeNode(InputBytecode bytecode, InputGraph graph, String bciValue) {
+
+ super(Children.LEAF);
+ this.setDisplayName(bytecode.getBci() + " " + bytecode.getName());
+
+ bciValue = bytecode.getBci() + " " + bciValue;
+ bciValue = bciValue.trim();
+
+ Properties.PropertySelector<InputNode> selector = new Properties.PropertySelector<InputNode>(graph.getNodes());
+ StringPropertyMatcher matcher = new StringPropertyMatcher("bci", bciValue);
+ List<InputNode> nodeList = selector.selectMultiple(matcher);
+ if (nodeList.size() > 0) {
+ nodes = new HashSet<InputNode>();
+ for (InputNode n : nodeList) {
+ nodes.add(n);
+ }
+ this.setDisplayName(this.getDisplayName() + " (" + nodes.size() + " nodes)");
+ }
+ }
+
+ @Override
+ public Image getIcon(int i) {
+ if (nodes != null) {
+ return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/link.gif");
+ } else {
+ return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/bytecode.gif");
+ }
+ }
+
+ @Override
+ public Image getOpenedIcon(int i) {
+ return getIcon(i);
+ }
+
+ @Override
+ public Action[] getActions(boolean b) {
+ return new Action[]{(Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true)};
+ }
+
+ @Override
+ public Action getPreferredAction() {
+ return (Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true);
+ }
+
+ @Override
+ public <T extends Node.Cookie> T getCookie(Class<T> aClass) {
+ if (aClass == SelectBytecodesCookie.class && nodes != null) {
+ return (T) (new SelectBytecodesCookie(nodes));
+ }
+ return super.getCookie(aClass);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+public class BytecodeViewAction extends AbstractAction {
+
+ public BytecodeViewAction() {
+ super(NbBundle.getMessage(BytecodeViewAction.class, "CTL_BytecodeViewAction"));
+ }
+
+ public void actionPerformed(ActionEvent evt) {
+ TopComponent win = BytecodeViewTopComponent.findInstance();
+ win.open();
+ win.requestActive();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <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">
+ <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,172 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import java.awt.BorderLayout;
+import java.io.Serializable;
+import org.openide.ErrorManager;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.explorer.view.BeanTreeView;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+final class BytecodeViewTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener {
+
+ private static BytecodeViewTopComponent instance;
+ private static final String PREFERRED_ID = "BytecodeViewTopComponent";
+ private ExplorerManager manager;
+ private BeanTreeView treeView;
+ private Lookup.Result result = null;
+ private MethodNode rootNode;
+
+ private BytecodeViewTopComponent() {
+ initComponents();
+ setName(NbBundle.getMessage(BytecodeViewTopComponent.class, "CTL_BytecodeViewTopComponent"));
+ setToolTipText(NbBundle.getMessage(BytecodeViewTopComponent.class, "HINT_BytecodeViewTopComponent"));
+
+ manager = new ExplorerManager();
+ rootNode = new MethodNode(null, null, "");
+ manager.setRootContext(rootNode);
+
+ setLayout(new BorderLayout());
+
+ treeView = new BeanTreeView();
+ treeView.setRootVisible(false);
+ this.add(BorderLayout.CENTER, treeView);
+ associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+ }
+
+ /** 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() {
+
+ org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(0, 400, Short.MAX_VALUE)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(0, 300, Short.MAX_VALUE)
+ );
+ }// </editor-fold>//GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ // End of variables declaration//GEN-END:variables
+ /**
+ * Gets default instance. Do not use directly: reserved for *.settings files only,
+ * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+ * To obtain the singleton instance, use {@link findInstance}.
+ */
+ public static synchronized BytecodeViewTopComponent getDefault() {
+ if (instance == null) {
+ instance = new BytecodeViewTopComponent();
+ }
+ return instance;
+ }
+
+ /**
+ * Obtain the BytecodeViewTopComponent instance. Never call {@link #getDefault} directly!
+ */
+ public static synchronized BytecodeViewTopComponent findInstance() {
+ TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+ if (win == null) {
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find BytecodeView component. It will not be located properly in the window system.");
+ return getDefault();
+ }
+ if (win instanceof BytecodeViewTopComponent) {
+ return (BytecodeViewTopComponent) win;
+ }
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+ return getDefault();
+ }
+
+ @Override
+ public int getPersistenceType() {
+ return TopComponent.PERSISTENCE_ALWAYS;
+ }
+
+ @Override
+ public void componentOpened() {
+ Lookup.Template tpl = new Lookup.Template(Object.class);
+ result = Utilities.actionsGlobalContext().lookup(tpl);
+ result.addLookupListener(this);
+ }
+
+ @Override
+ public void componentClosed() {
+ result.removeLookupListener(this);
+ result = null;
+ }
+
+ @Override
+ public Object writeReplace() {
+ return new ResolvableHelper();
+ }
+
+ @Override
+ protected String preferredID() {
+ return PREFERRED_ID;
+ }
+
+ public ExplorerManager getExplorerManager() {
+ return manager;
+ }
+
+ public void resultChanged(LookupEvent lookupEvent) {
+ InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+ if (p != null) {
+ InputGraph graph = p.getGraph();
+ if (graph != null) {
+ Group g = graph.getGroup();
+ rootNode.update(graph, g.getMethod());
+ }
+ }
+ }
+
+ final static class ResolvableHelper implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object readResolve() {
+ return BytecodeViewTopComponent.getDefault();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="com.sun.hotspot.igv.bytecodes" spec="1.0"/>
+ <instanceof class="org.openide.windows.TopComponent"/>
+ <instanceof class="com.sun.hotspot.igv.bytecodes.BytecodeViewTopComponent"/>
+ <instance class="com.sun.hotspot.igv.bytecodes.BytecodeViewTopComponent" method="getDefault"/>
+</settings>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+ <module name="com.sun.hotspot.igv.bytecodes" spec="1.0"/>
+ <tc-id id="BytecodeViewTopComponent"/>
+ <state opened="true"/>
+</tc-ref>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,102 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import java.awt.Image;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MethodNode extends AbstractNode {
+
+ private static class MethodNodeChildren extends Children.Keys {
+
+ private InputMethod method;
+ private InputGraph graph;
+ private String bciString;
+
+ public MethodNodeChildren(InputMethod method, InputGraph graph, String bciString) {
+ this.method = method;
+ this.bciString = bciString;
+ this.graph = graph;
+ }
+
+ protected Node[] createNodes(Object object) {
+ assert object instanceof InputBytecode;
+ InputBytecode bc = (InputBytecode) object;
+ if (bc.getInlined() == null) {
+ return new Node[]{new BytecodeNode(bc, graph, bciString)};
+ } else {
+ return new Node[]{new BytecodeNode(bc, graph, bciString), new MethodNode(bc.getInlined(), graph, bc.getBci() + " " + bciString)};
+ }
+ }
+
+ @Override
+ public void addNotify() {
+ if (method != null) {
+ setKeys(method.getBytecodes());
+ }
+ }
+
+ public void setMethod(InputMethod method, InputGraph graph) {
+ this.method = method;
+ this.graph = graph;
+ addNotify();
+ }
+ }
+
+ /** Creates a new instance of MethodNode */
+ public MethodNode(InputMethod method, InputGraph graph, String bciString) {
+ super((method != null && method.getBytecodes().size() == 0) ? Children.LEAF : new MethodNodeChildren(method, graph, bciString));
+ if (method != null) {
+ this.setDisplayName(method.getName());
+ }
+ }
+
+ @Override
+ public Image getIcon(int i) {
+ return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/method.gif");
+ }
+
+ @Override
+ public Image getOpenedIcon(int i) {
+ return getIcon(i);
+ }
+
+ public void update(InputGraph graph, InputMethod method) {
+ ((MethodNodeChildren) this.getChildren()).setMethod(method, graph);
+ if (method != null) {
+ this.setDisplayName(method.getName());
+ }
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SelectBytecodesAction extends CookieAction {
+
+ protected void performAction(Node[] activatedNodes) {
+ SelectBytecodesCookie c = activatedNodes[0].getCookie(SelectBytecodesCookie.class);
+ InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+ if (p != null) {
+ p.setSelectedNodes(c.getNodes());
+ }
+ }
+
+ protected int mode() {
+ return CookieAction.MODE_EXACTLY_ONE;
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(SelectBytecodesAction.class, "CTL_SelectBytecodesAction");
+ }
+
+ protected Class[] cookieClasses() {
+ return new Class[]{
+ SelectBytecodesCookie.class
+ };
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ putValue("noIconInMenu", Boolean.TRUE);
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Collections;
+import java.util.Set;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SelectBytecodesCookie implements Node.Cookie {
+
+ private Set<InputNode> nodes;
+
+ /** Creates a new instance of SelectBytecodesCookie */
+ public SelectBytecodesCookie(Set<InputNode> nodes) {
+ this.nodes = nodes;
+ }
+
+ public Set<InputNode> getNodes() {
+ return Collections.unmodifiableSet(nodes);
+ }
+}
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <folder name="Actions">
+ <folder name="Edit">
+ <file name="com-sun-hotspot-igv-bytecodes-SelectBytecodesAction.instance"/>
+ </folder>
+ <folder name="Window">
+ <file name="com-sun-hotspot-igv-bytecodes-BytecodeViewAction.instance"/>
+ </folder>
+ </folder>
+ <folder name="Menu">
+ <folder name="Window">
+ <file name="BytecodeViewAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-bytecodes-BytecodeViewAction.instance"/>
+ </file>
+ </folder>
+ </folder>
+ <folder name="Windows2">
+ <folder name="Components">
+ <file name="BytecodeViewTopComponent.settings" url="BytecodeViewTopComponentSettings.xml"/>
+ </folder>
+ <folder name="Modes">
+ <folder name="customRightTopMode">
+ <file name="BytecodeViewTopComponent.wstcref" url="BytecodeViewTopComponentWstcref.xml"/>
+ </folder>
+ </folder>
+ </folder>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.controlflow" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.controlflow.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.controlflow
+OpenIDE-Module-Layer: com/sun/hotspot/igv/controlflow/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/controlflow/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.controlflow-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=b524efb3
+build.xml.script.CRC32=79a27be9
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=b524efb3
+nbproject/build-impl.xml.script.CRC32=582bdab7
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.controlflow</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.jdesktop.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.4</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.netbeans.api.visual</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>2.9</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.9.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.windows</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.16</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages/>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlockEdge;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockConnectionWidget extends ConnectionWidget implements Link {
+
+ private BlockWidget from;
+ private BlockWidget to;
+ private Port inputSlot;
+ private Port outputSlot;
+ private List<Point> points;
+ private InputBlockEdge edge;
+
+ public BlockConnectionWidget(ControlFlowScene scene, InputBlockEdge edge) {
+ super(scene);
+
+ this.edge = edge;
+ this.from = (BlockWidget) scene.findWidget(edge.getFrom());
+ this.to = (BlockWidget) scene.findWidget(edge.getTo());
+ inputSlot = to.getInputSlot();
+ outputSlot = from.getOutputSlot();
+ points = new ArrayList<Point>();
+ }
+
+ public InputBlockEdge getEdge() {
+ return edge;
+ }
+
+ public Port getTo() {
+ return inputSlot;
+ }
+
+ public Port getFrom() {
+ return outputSlot;
+ }
+
+ public void setControlPoints(List<Point> p) {
+ this.points = p;
+ }
+
+ @Override
+ public List<Point> getControlPoints() {
+ return points;
+ }
+
+ @Override
+ public String toString() {
+ return "Connection[ " + from.toString() + " - " + to.toString() + "]";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,160 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Point;
+import org.netbeans.api.visual.border.BorderFactory;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.LabelWidget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockWidget extends LabelWidget implements Vertex {
+
+ public static final Dimension SIZE = new Dimension(20, 20);
+ private InputBlock block;
+ private Port inputSlot;
+ private Port outputSlot;
+ private Cluster cluster;
+ private boolean root;
+ private static final Font font = new Font(Font.SERIF, Font.PLAIN, 12);
+ private static final Font boldFont = font.deriveFont(Font.BOLD);
+ public static final Color NORMAL_FOREGROUND_COLOR = Color.BLACK;
+ public static final Color HOVER_FOREGROUND_COLOR = Color.BLUE;
+
+ /** Creates a new instance of BlockWidget */
+ public BlockWidget(ControlFlowScene scene, InputBlock block) {
+ super(scene);
+ this.block = block;
+ this.setLabel(block.getName());
+ this.setForeground(NORMAL_FOREGROUND_COLOR);
+ this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR));
+ this.setMinimumSize(SIZE);
+ this.setMaximumSize(SIZE);
+
+ this.setFont(font);
+
+ final BlockWidget widget = this;
+ inputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2));
+ }
+
+ public Vertex getVertex() {
+ return widget;
+ }
+ };
+
+ outputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2));
+ }
+
+ public Vertex getVertex() {
+ return widget;
+ }
+ };
+ }
+
+ public Port getInputSlot() {
+ return inputSlot;
+ }
+
+ public Port getOutputSlot() {
+ return outputSlot;
+ }
+
+ public InputBlock getBlock() {
+ return block;
+ }
+
+ public Dimension getSize() {
+ return SIZE;
+ }
+
+ public void setPosition(Point p) {
+ this.setPreferredLocation(p);
+ }
+
+ @Override
+ public String toString() {
+ return block.getName();
+ }
+
+ public Point getPosition() {
+ return this.getPreferredLocation();
+ }
+
+ public Cluster getCluster() {
+ return cluster;
+ }
+
+ public boolean isRoot() {
+ return root;
+ }
+
+ public void setCluster(Cluster c) {
+ cluster = c;
+ }
+
+ public void setRoot(boolean b) {
+ root = b;
+ }
+
+ public int compareTo(Vertex o) {
+ return toString().compareTo(o.toString());
+ }
+
+ @Override
+ protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+ super.notifyStateChanged(previousState, state);
+
+ if (previousState.isHovered() != state.isHovered()) {
+ if (state.isHovered()) {
+ this.setBorder(BorderFactory.createLineBorder(1, HOVER_FOREGROUND_COLOR));
+ } else {
+ this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR));
+ }
+ }
+
+ if (previousState.isSelected() != state.isSelected()) {
+ if (state.isSelected()) {
+ this.setFont(boldFont);
+ } else {
+ this.setFont(font);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+CTL_ControlFlowAction=Open ControlFlow Window
+CTL_ControlFlowTopComponent=ControlFlow Window
+HINT_ControlFlowTopComponent=This is a ControlFlow window
+OpenIDE-Module-Name=ControlFlow
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ControlFlowAction extends AbstractAction {
+
+ public ControlFlowAction() {
+ super(NbBundle.getMessage(ControlFlowAction.class, "CTL_ControlFlowAction"));
+ }
+
+ public void actionPerformed(ActionEvent evt) {
+ TopComponent win = ControlFlowTopComponent.findInstance();
+ win.open();
+ win.requestActive();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,296 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputBlockEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.data.InputNode;
+import java.awt.Color;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import javax.swing.BorderFactory;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.MoveProvider;
+import org.netbeans.api.visual.action.RectangularSelectDecorator;
+import org.netbeans.api.visual.action.RectangularSelectProvider;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.anchor.AnchorFactory;
+import org.netbeans.api.visual.anchor.AnchorShape;
+import com.sun.hotspot.igv.controlflow.HierarchicalGraphLayout;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.router.RouterFactory;
+import org.netbeans.api.visual.widget.LayerWidget;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.graph.GraphScene;
+import org.netbeans.api.visual.graph.layout.GraphLayout;
+import org.netbeans.api.visual.layout.SceneLayout;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ControlFlowScene extends GraphScene<InputBlock, InputBlockEdge> implements SelectProvider, MoveProvider, RectangularSelectDecorator, RectangularSelectProvider {
+
+ private Set<BlockWidget> selection;
+ private Hashtable<InputBlock, BlockWidget> blockMap;
+ private InputGraph oldGraph;
+ private LayerWidget edgeLayer;
+ private LayerWidget mainLayer;
+ private LayerWidget selectLayer;
+ private WidgetAction hoverAction = this.createWidgetHoverAction();
+ private WidgetAction selectAction = ActionFactory.createSelectAction(this);
+ private WidgetAction moveAction = ActionFactory.createMoveAction(null, this);
+
+ public ControlFlowScene() {
+ selection = new HashSet<BlockWidget>();
+
+ this.getInputBindings().setZoomActionModifiers(0);
+ this.setLayout(LayoutFactory.createAbsoluteLayout());
+
+ mainLayer = new LayerWidget(this);
+ this.addChild(mainLayer);
+
+ edgeLayer = new LayerWidget(this);
+ this.addChild(edgeLayer);
+
+ selectLayer = new LayerWidget(this);
+ this.addChild(selectLayer);
+
+ this.getActions().addAction(hoverAction);
+ this.getActions().addAction(selectAction);
+ this.getActions().addAction(ActionFactory.createRectangularSelectAction(this, selectLayer, this));
+ this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1));
+ }
+
+ public void setGraph(InputGraph g) {
+ if (g == oldGraph) {
+ return;
+ }
+ oldGraph = g;
+
+ ArrayList<InputBlock> blocks = new ArrayList<InputBlock>(this.getNodes());
+ for (InputBlock b : blocks) {
+ removeNode(b);
+ }
+
+ ArrayList<InputBlockEdge> edges = new ArrayList<InputBlockEdge>(this.getEdges());
+ for (InputBlockEdge e : edges) {
+ removeEdge(e);
+ }
+
+ for (InputBlock b : g.getBlocks()) {
+ addNode(b);
+ }
+
+ for (InputBlock b : g.getBlocks()) {
+ for (InputBlockEdge e : b.getOutputs()) {
+ addEdge(e);
+ assert g.getBlocks().contains(e.getFrom());
+ assert g.getBlocks().contains(e.getTo());
+ this.setEdgeSource(e, e.getFrom());
+ this.setEdgeTarget(e, e.getTo());
+ }
+ }
+
+ GraphLayout layout = new HierarchicalGraphLayout();//GridGraphLayout();
+ SceneLayout sceneLayout = LayoutFactory.createSceneGraphLayout(this, layout);
+ sceneLayout.invokeLayout();
+
+ this.validate();
+ }
+
+ public BlockWidget getBlockWidget(InputBlock b) {
+ return blockMap.get(b);
+ }
+
+ public void clearSelection() {
+ for (BlockWidget w : selection) {
+ w.setState(w.getState().deriveSelected(false));
+ }
+ selection.clear();
+ selectionChanged();
+ }
+
+ public void selectionChanged() {
+ InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+ if (p != null) {
+ Set<InputNode> inputNodes = new HashSet<InputNode>();
+ for (BlockWidget w : selection) {
+ inputNodes.addAll(w.getBlock().getNodes());
+ }
+ p.setSelectedNodes(inputNodes);
+ }
+ }
+
+ public void addToSelection(BlockWidget widget) {
+ widget.setState(widget.getState().deriveSelected(true));
+ selection.add(widget);
+ selectionChanged();
+ }
+
+ public void removeFromSelection(BlockWidget widget) {
+ widget.setState(widget.getState().deriveSelected(false));
+ selection.remove(widget);
+ selectionChanged();
+ }
+
+ public boolean isAimingAllowed(Widget widget, Point point, boolean b) {
+ return false;
+ }
+
+ public boolean isSelectionAllowed(Widget widget, Point point, boolean b) {
+ return true;
+ }
+
+ public void select(Widget widget, Point point, boolean change) {
+ if (widget == this) {
+ clearSelection();
+ } else {
+
+ assert widget instanceof BlockWidget;
+ BlockWidget bw = (BlockWidget) widget;
+ if (change) {
+ if (selection.contains(bw)) {
+ removeFromSelection(bw);
+ } else {
+ addToSelection(bw);
+ }
+ } else {
+ if (!selection.contains(bw)) {
+ clearSelection();
+ addToSelection(bw);
+ }
+ }
+ }
+ }
+
+ public void movementStarted(Widget widget) {
+ }
+
+ public void movementFinished(Widget widget) {
+ }
+
+ public Point getOriginalLocation(Widget widget) {
+ return widget.getPreferredLocation();
+ }
+
+ public void setNewLocation(Widget widget, Point location) {
+ Point originalLocation = getOriginalLocation(widget);
+ int xOffset = location.x - originalLocation.x;
+ int yOffset = location.y - originalLocation.y;
+ for (Widget w : this.selection) {
+ Point p = new Point(w.getPreferredLocation());
+ p.translate(xOffset, yOffset);
+ w.setPreferredLocation(p);
+ }
+
+ }
+
+ public Widget createSelectionWidget() {
+ Widget widget = new Widget(this);
+ widget.setOpaque(false);
+ widget.setBorder(BorderFactory.createLineBorder(Color.black, 2));
+ widget.setForeground(Color.red);
+ return widget;
+ }
+
+ public void performSelection(Rectangle rectangle) {
+
+ if (rectangle.width < 0) {
+ rectangle.x += rectangle.width;
+ rectangle.width *= -1;
+ }
+
+ if (rectangle.height < 0) {
+ rectangle.y += rectangle.height;
+ rectangle.height *= -1;
+ }
+
+ boolean changed = false;
+ for (InputBlock b : this.getNodes()) {
+ BlockWidget w = (BlockWidget) findWidget(b);
+ Rectangle r = new Rectangle(w.getBounds());
+ r.setLocation(w.getLocation());
+ if (r.intersects(rectangle)) {
+ if (!selection.contains(w)) {
+ changed = true;
+ selection.add(w);
+ w.setState(w.getState().deriveSelected(true));
+ }
+ } else {
+ if (selection.contains(w)) {
+ changed = true;
+ selection.remove(w);
+ w.setState(w.getState().deriveSelected(false));
+ }
+ }
+ }
+
+ if (changed) {
+ selectionChanged();
+ }
+
+ }
+
+ protected Widget attachNodeWidget(InputBlock node) {
+ BlockWidget w = new BlockWidget(this, node);
+ mainLayer.addChild(w);
+ w.getActions().addAction(hoverAction);
+ w.getActions().addAction(selectAction);
+ w.getActions().addAction(moveAction);
+ return w;
+ }
+
+ protected Widget attachEdgeWidget(InputBlockEdge edge) {
+ ConnectionWidget w = new BlockConnectionWidget(this, edge);
+ w.setRouter(RouterFactory.createDirectRouter());
+ w.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED);
+ edgeLayer.addChild(w);
+ return w;
+ }
+
+ protected void attachEdgeSourceAnchor(InputBlockEdge edge, InputBlock oldSourceNode, InputBlock sourceNode) {
+ Widget w = this.findWidget(edge);
+ assert w instanceof ConnectionWidget;
+ ConnectionWidget cw = (ConnectionWidget) w;
+ cw.setSourceAnchor(AnchorFactory.createRectangularAnchor(findWidget(sourceNode)));
+
+ }
+
+ protected void attachEdgeTargetAnchor(InputBlockEdge edge, InputBlock oldTargetNode, InputBlock targetNode) {
+ Widget w = this.findWidget(edge);
+ assert w instanceof ConnectionWidget;
+ ConnectionWidget cw = (ConnectionWidget) w;
+ cw.setTargetAnchor(AnchorFactory.createRectangularAnchor(findWidget(targetNode)));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <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">
+ <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,179 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import java.awt.BorderLayout;
+import java.io.Serializable;
+import javax.swing.JScrollPane;
+import org.openide.ErrorManager;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ControlFlowTopComponent extends TopComponent implements LookupListener {
+
+ private static ControlFlowTopComponent instance;
+ private Lookup.Result result = null;
+ private static final String PREFERRED_ID = "ControlFlowTopComponent";
+ private ControlFlowScene scene;
+
+ private ControlFlowTopComponent() {
+ initComponents();
+ setName(NbBundle.getMessage(ControlFlowTopComponent.class, "CTL_ControlFlowTopComponent"));
+ setToolTipText(NbBundle.getMessage(ControlFlowTopComponent.class, "HINT_ControlFlowTopComponent"));
+
+ scene = new ControlFlowScene();
+ this.setLayout(new BorderLayout());
+ this.associateLookup(scene.getLookup());
+
+
+ JScrollPane panel = new JScrollPane(scene.createView());
+ this.add(panel, BorderLayout.CENTER);
+ }
+
+ @Override
+ public void requestFocus() {
+ super.requestFocus();
+ scene.getView().requestFocus();
+ }
+
+ @Override
+ public boolean requestFocusInWindow() {
+ super.requestFocusInWindow();
+ return scene.getView().requestFocusInWindow();
+ }
+
+ /** 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() {
+
+ org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(0, 400, Short.MAX_VALUE)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(0, 300, Short.MAX_VALUE)
+ );
+ }// </editor-fold>//GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ // End of variables declaration//GEN-END:variables
+ /**
+ * Gets default instance. Do not use directly: reserved for *.settings files only,
+ * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+ * To obtain the singleton instance, use {@link findInstance}.
+ */
+ public static synchronized ControlFlowTopComponent getDefault() {
+ if (instance == null) {
+ instance = new ControlFlowTopComponent();
+ }
+ return instance;
+ }
+
+ /**
+ * Obtain the ControlFlowTopComponent instance. Never call {@link #getDefault} directly!
+ */
+ public static synchronized ControlFlowTopComponent findInstance() {
+ TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+ if (win == null) {
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find ControlFlow component. It will not be located properly in the window system.");
+ return getDefault();
+ }
+ if (win instanceof ControlFlowTopComponent) {
+ return (ControlFlowTopComponent) win;
+ }
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+ return getDefault();
+ }
+
+ @Override
+ public int getPersistenceType() {
+ return TopComponent.PERSISTENCE_ALWAYS;
+ }
+
+ @Override
+ public void componentOpened() {
+ Lookup.Template tpl = new Lookup.Template(Object.class);
+ result = Utilities.actionsGlobalContext().lookup(tpl);
+ result.addLookupListener(this);
+ }
+
+ @Override
+ public void componentClosed() {
+ result.removeLookupListener(this);
+ result = null;
+ }
+
+ public void resultChanged(LookupEvent lookupEvent) {
+
+ InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+ if (p != null) {
+ InputGraph g = p.getGraph();
+ if (g != null) {
+ scene.setGraph(g);
+ }
+ }
+ }
+
+ @Override
+ public Object writeReplace() {
+ return new ResolvableHelper();
+ }
+
+ @Override
+ protected String preferredID() {
+ return PREFERRED_ID;
+ }
+
+ @Override
+ public void requestActive() {
+ scene.getView().requestFocusInWindow();
+ super.requestActive();
+ }
+
+ final static class ResolvableHelper implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object readResolve() {
+ return ControlFlowTopComponent.getDefault();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="com.sun.hotspot.igv.controlflow" spec="1.0"/>
+ <instanceof class="org.openide.windows.TopComponent"/>
+ <instanceof class="com.sun.hotspot.igv.controlflow.ControlFlowTopComponent"/>
+ <instance class="com.sun.hotspot.igv.controlflow.ControlFlowTopComponent" method="getDefault"/>
+</settings>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+ <module name="com.sun.hotspot.igv.controlflow" spec="1.0"/>
+ <tc-id id="ControlFlowTopComponent"/>
+ <state opened="true"/>
+</tc-ref>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,167 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.netbeans.api.visual.graph.layout.GraphLayout;
+import org.netbeans.api.visual.graph.layout.UniversalGraph;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalGraphLayout<N, E> extends GraphLayout<N, E> {
+
+ public HierarchicalGraphLayout() {
+ }
+
+ private class LinkWrapper implements Link {
+
+ private VertexWrapper from;
+ private VertexWrapper to;
+
+ public LinkWrapper(VertexWrapper from, VertexWrapper to) {
+ this.from = from;
+ this.to = to;
+ }
+
+ public Port getFrom() {
+ return from.getSlot();
+ }
+
+ public Port getTo() {
+ return to.getSlot();
+ }
+
+ public List<Point> getControlPoints() {
+ return new ArrayList<Point>();
+ }
+
+ public void setControlPoints(List<Point> list) {
+ // Do nothing for now
+ }
+ }
+
+ private class VertexWrapper implements Vertex {
+
+ private N node;
+ private UniversalGraph<N, E> graph;
+ private Port slot;
+ private Point position;
+
+ public VertexWrapper(N node, UniversalGraph<N, E> graph) {
+ this.node = node;
+ this.graph = graph;
+ final VertexWrapper vertex = this;
+ this.slot = new Port() {
+
+ public Vertex getVertex() {
+ return vertex;
+ }
+
+ public Point getRelativePosition() {
+ return new Point((int) (vertex.getSize().getWidth() / 2), (int) (vertex.getSize().getHeight() / 2));
+ }
+ };
+
+ Widget w = graph.getScene().findWidget(node);
+ this.position = w.getPreferredLocation();
+ }
+
+ public Cluster getCluster() {
+ return null;
+ }
+
+ public Dimension getSize() {
+ Widget w = graph.getScene().findWidget(node);
+ return w.getBounds().getSize();
+ }
+
+ public Point getPosition() {
+ return position;
+ }
+
+ public void setPosition(Point p) {
+ HierarchicalGraphLayout.this.setResolvedNodeLocation(graph, node, p);
+ position = p;
+ }
+
+ public boolean isRoot() {
+ return false;
+ }
+
+ public int compareTo(Vertex o) {
+ VertexWrapper vw = (VertexWrapper) o;
+ return node.toString().compareTo(vw.node.toString());
+ }
+
+ public Port getSlot() {
+ return slot;
+ }
+ }
+
+ protected void performGraphLayout(UniversalGraph<N, E> graph) {
+
+ Set<LinkWrapper> links = new HashSet<LinkWrapper>();
+ Set<VertexWrapper> vertices = new HashSet<VertexWrapper>();
+ Map<N, VertexWrapper> vertexMap = new HashMap<N, VertexWrapper>();
+
+ for (N node : graph.getNodes()) {
+ VertexWrapper v = new VertexWrapper(node, graph);
+ vertexMap.put(node, v);
+ vertices.add(v);
+ }
+
+ for (E edge : graph.getEdges()) {
+ N source = graph.getEdgeSource(edge);
+ N target = graph.getEdgeTarget(edge);
+ LinkWrapper l = new LinkWrapper(vertexMap.get(source), vertexMap.get(target));
+ links.add(l);
+ }
+
+ HierarchicalLayoutManager m = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.NONE);
+
+ LayoutGraph layoutGraph = new LayoutGraph(links, vertices);
+ m.doLayout(layoutGraph);
+ }
+
+ protected void performNodesLayout(UniversalGraph<N, E> graph, Collection<N> nodes) {
+ throw new UnsupportedOperationException();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <folder name="Actions">
+ <folder name="Window">
+ <file name="com-sun-hotspot-igv-controlflow-ControlFlowAction.instance"/>
+ </folder>
+ </folder>
+ <folder name="Menu">
+ <folder name="Window">
+ <file name="ControlFlowAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-controlflow-ControlFlowAction.instance"/>
+ </file>
+ </folder>
+ </folder>
+ <folder name="Windows2">
+ <folder name="Components">
+ <file name="ControlFlowTopComponent.settings" url="ControlFlowTopComponentSettings.xml"/>
+ </folder>
+ <folder name="Modes">
+ <folder name="customRightTopMode">
+ <file name="ControlFlowTopComponent.wstcref" url="ControlFlowTopComponentWstcref.xml"/>
+ </folder>
+ </folder>
+ </folder>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.coordinator" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.coordinator.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.coordinator
+OpenIDE-Module-Layer: com/sun/hotspot/igv/coordinator/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/coordinator/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.coordinator-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=077de97c
+build.xml.script.CRC32=d29d586c
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=077de97c
+nbproject/build-impl.xml.script.CRC32=03daa42d
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.coordinator</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.netbeans.api.progress</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.10.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.actions</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.6.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.awt</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.11.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.dialogs</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.5.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.explorer</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.11</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.filesystems</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.3</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.loaders</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.7</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.nodes</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.2.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.9.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.windows</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.16</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages/>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+com.sun.hotspot.igv.coordinator.StandardGroupOrganizer
+com.sun.hotspot.igv.coordinator.GraphCountGroupOrganizer
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+
+AdvancedOption_DisplayName_Coordinator=Settings
+AdvancedOption_Tooltip_Coordinator=Visualization Tool Settings
+CTL_OutlineTopComponent=Outline Window
+CTL_SomeAction=test
+HINT_OutlineTopComponent=This is a Outline window
+OpenIDE-Module-Name=Coordinator
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.RemoveCookie;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.Pair;
+import java.awt.Image;
+import java.util.ArrayList;
+import java.util.List;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FolderNode extends AbstractNode {
+
+ private GroupOrganizer organizer;
+ private InstanceContent content;
+ private List<Pair<String, List<Group>>> structure;
+ private List<String> subFolders;
+ private FolderChildren children;
+
+ private static class FolderChildren extends Children.Keys {
+
+ private FolderNode parent;
+
+ public void setParent(FolderNode parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ protected Node[] createNodes(Object arg0) {
+
+ Pair<String, List<Group>> p = (Pair<String, List<Group>>) arg0;
+ if (p.getLeft().length() == 0) {
+
+ List<Node> curNodes = new ArrayList<Node>();
+ for (Group g : p.getRight()) {
+ for (InputGraph graph : g.getGraphs()) {
+ curNodes.add(new GraphNode(graph));
+ }
+ }
+
+ Node[] result = new Node[curNodes.size()];
+ for (int i = 0; i < curNodes.size(); i++) {
+ result[i] = curNodes.get(i);
+ }
+ return result;
+
+ } else {
+ return new Node[]{new FolderNode(p.getLeft(), parent.organizer, parent.subFolders, p.getRight())};
+ }
+ }
+
+ @Override
+ public void addNotify() {
+ this.setKeys(parent.structure);
+
+ }
+ }
+
+ protected InstanceContent getContent() {
+ return content;
+ }
+
+ @Override
+ public Image getIcon(int i) {
+ return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/folder.gif");
+ }
+
+ protected FolderNode(String name, GroupOrganizer organizer, List<String> subFolders, List<Group> groups) {
+ this(name, organizer, subFolders, groups, new FolderChildren(), new InstanceContent());
+ }
+
+ private FolderNode(String name, GroupOrganizer organizer, List<String> oldSubFolders, final List<Group> groups, FolderChildren children, InstanceContent content) {
+ super(children, new AbstractLookup(content));
+ children.setParent(this);
+ this.content = content;
+ this.children = children;
+ content.add(new RemoveCookie() {
+
+ public void remove() {
+ for (Group g : groups) {
+ if (g.getDocument() != null) {
+ g.getDocument().removeGroup(g);
+ }
+ }
+ }
+ });
+ init(name, organizer, oldSubFolders, groups);
+ }
+
+ public void init(String name, GroupOrganizer organizer, List<String> oldSubFolders, List<Group> groups) {
+ this.setDisplayName(name);
+ this.organizer = organizer;
+ this.subFolders = new ArrayList<String>(oldSubFolders);
+ if (name.length() > 0) {
+ this.subFolders.add(name);
+ }
+ structure = organizer.organize(subFolders, groups);
+ assert structure != null;
+ children.addNotify();
+ }
+
+ @Override
+ public Image getOpenedIcon(int i) {
+ return getIcon(i);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.Pair;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphCountGroupOrganizer implements GroupOrganizer {
+
+ public String getName() {
+ return "Graph count structure";
+ }
+
+ public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+ List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+ if (subFolders.size() == 0) {
+ Map<Integer, List<Group>> map = new HashMap<Integer, List<Group>>();
+ for (Group g : groups) {
+ Integer cur = g.getGraphs().size();
+ if (!map.containsKey(cur)) {
+ map.put(cur, new ArrayList<Group>());
+ }
+ map.get(cur).add(g);
+ }
+
+ SortedSet<Integer> keys = new TreeSet<Integer>(map.keySet());
+ for (Integer i : keys) {
+ result.add(new Pair<String, List<Group>>("Graph count " + i, map.get(i)));
+ }
+
+ } else if (subFolders.size() == 1) {
+ for (Group g : groups) {
+ List<Group> children = new ArrayList<Group>();
+ children.add(g);
+ Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+ p.setLeft(g.getName());
+ p.setRight(children);
+ result.add(p);
+ }
+ } else if (subFolders.size() == 2) {
+ result.add(new Pair<String, List<Group>>("", groups));
+ }
+
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,130 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.DiffGraphAction;
+import com.sun.hotspot.igv.coordinator.actions.DiffGraphCookie;
+import com.sun.hotspot.igv.coordinator.actions.RemoveCookie;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import java.awt.Image;
+import javax.swing.Action;
+import org.openide.actions.OpenAction;
+import org.openide.cookies.OpenCookie;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+import org.openide.util.Lookup;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphNode extends AbstractNode {
+
+ private InputGraph graph;
+
+ /** Creates a new instance of GraphNode */
+ public GraphNode(InputGraph graph) {
+ this(graph, new InstanceContent());
+ }
+
+ private GraphNode(final InputGraph graph, InstanceContent content) {
+ super(Children.LEAF, new AbstractLookup(content));
+ this.graph = graph;
+ this.setDisplayName(graph.getName());
+ content.add(graph);
+
+ final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class);
+
+ if (viewer != null) {
+ // Action for opening the graph
+ content.add(new OpenCookie() {
+
+ public void open() {
+ viewer.view(graph);
+ }
+ });
+ }
+
+ // Action for removing a graph
+ content.add(new RemoveCookie() {
+
+ public void remove() {
+ graph.getGroup().removeGraph(graph);
+ }
+ });
+ }
+
+ @Override
+ protected Sheet createSheet() {
+ Sheet s = super.createSheet();
+ PropertiesSheet.initializeSheet(graph.getProperties(), s);
+ return s;
+ }
+
+ @Override
+ public Image getIcon(int i) {
+ return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/graph.gif");
+ }
+
+ @Override
+ public Image getOpenedIcon(int i) {
+ return getIcon(i);
+ }
+
+ @Override
+ public <T extends Node.Cookie> T getCookie(Class<T> aClass) {
+ if (aClass == DiffGraphCookie.class) {
+ InputGraphProvider graphProvider = Utilities.actionsGlobalContext().lookup(InputGraphProvider.class);
+
+ InputGraph graphA = null;
+ if (graphProvider != null) {
+ graphA = graphProvider.getGraph();
+ }
+
+ if (graphA != null && !graphA.isDifferenceGraph()) {
+ return (T) new DiffGraphCookie(graphA, graph);
+ }
+ }
+
+ return super.getCookie(aClass);
+ }
+
+ @Override
+ public Action[] getActions(boolean b) {
+ return new Action[]{(Action) DiffGraphAction.findObject(DiffGraphAction.class, true), (Action) OpenAction.findObject(OpenAction.class, true)};
+ }
+
+ @Override
+ public Action getPreferredAction() {
+ return (Action) OpenAction.findObject(OpenAction.class, true);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <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"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel2">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+ <AuxValues>
+ <AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new BeanTreeView();"/>
+ </AuxValues>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ </Container>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,271 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.ImportAction;
+import com.sun.hotspot.igv.coordinator.actions.RemoveAction;
+import com.sun.hotspot.igv.coordinator.actions.RemoveAllAction;
+import com.sun.hotspot.igv.coordinator.actions.SaveAllAction;
+import com.sun.hotspot.igv.coordinator.actions.SaveAsAction;
+import com.sun.hotspot.igv.coordinator.actions.StructuredViewAction;
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.services.GroupReceiver;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.ErrorManager;
+import org.openide.awt.Toolbar;
+import org.openide.awt.ToolbarPool;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.explorer.view.BeanTreeView;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.NodeAction;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class OutlineTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener {
+
+ public static OutlineTopComponent instance;
+ public static final String PREFERRED_ID = "OutlineTopComponent";
+ private ExplorerManager manager;
+ private GraphDocument document;
+ private FolderNode root;
+ private GroupOrganizer organizer;
+
+ private OutlineTopComponent() {
+ initComponents();
+
+ setName(NbBundle.getMessage(OutlineTopComponent.class, "CTL_OutlineTopComponent"));
+ setToolTipText(NbBundle.getMessage(OutlineTopComponent.class, "HINT_OutlineTopComponent"));
+
+ document = new GraphDocument();
+ initListView();
+ initToolbar();
+ initReceivers();
+ }
+
+ private void initListView() {
+ manager = new ExplorerManager();
+ organizer = new StandardGroupOrganizer();
+ root = new FolderNode("", organizer, new ArrayList<String>(), document.getGroups());
+ manager.setRootContext(root);
+ ((BeanTreeView) this.jScrollPane1).setRootVisible(false);
+
+ document.getChangedEvent().addListener(new ChangedListener<GraphDocument>() {
+
+ public void changed(GraphDocument document) {
+ updateStructure();
+ }
+ });
+
+ associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+ }
+
+ private void initToolbar() {
+
+ Toolbar toolbar = new Toolbar();
+ Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+ toolbar.setBorder(b);
+ this.add(toolbar, BorderLayout.NORTH);
+
+ toolbar.add(ImportAction.get(ImportAction.class));
+ toolbar.add(((NodeAction) RemoveAction.get(RemoveAction.class)).createContextAwareInstance(this.getLookup()));
+ toolbar.add(RemoveAllAction.get(RemoveAllAction.class));
+
+ toolbar.add(((NodeAction) SaveAsAction.get(SaveAsAction.class)).createContextAwareInstance(this.getLookup()));
+ toolbar.add(SaveAllAction.get(SaveAllAction.class));
+
+ toolbar.add(StructuredViewAction.get(StructuredViewAction.class).getToolbarPresenter());
+
+ for (Toolbar tb : ToolbarPool.getDefault().getToolbars()) {
+ tb.setVisible(false);
+ }
+
+ initOrganizers();
+ }
+
+ public void setOrganizer(GroupOrganizer organizer) {
+ this.organizer = organizer;
+ updateStructure();
+ }
+
+ private void initOrganizers() {
+
+ }
+
+ private void initReceivers() {
+
+ final GroupCallback callback = new GroupCallback() {
+
+ public void started(Group g) {
+ getDocument().addGroup(g);
+ }
+ };
+
+ Collection<? extends GroupReceiver> receivers = Lookup.getDefault().lookupAll(GroupReceiver.class);
+ if (receivers.size() > 0) {
+ JPanel panel = new JPanel();
+ panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+
+ for (GroupReceiver r : receivers) {
+ Component c = r.init(callback);
+ panel.add(c);
+ }
+
+ jPanel2.add(panel, BorderLayout.PAGE_START);
+ }
+ }
+
+ private void updateStructure() {
+ root.init("", organizer, new ArrayList<String>(), document.getGroups());
+ }
+
+ public void clear() {
+ document.clear();
+ }
+
+ public ExplorerManager getExplorerManager() {
+ return manager;
+ }
+
+ public GraphDocument getDocument() {
+ return document;
+ }
+
+ /**
+ * Gets default instance. Do not use directly: reserved for *.settings files only,
+ * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+ * To obtain the singleton instance, use {@link findInstance}.
+ */
+ public static synchronized OutlineTopComponent getDefault() {
+ if (instance == null) {
+ instance = new OutlineTopComponent();
+ }
+ return instance;
+ }
+
+ /**
+ * Obtain the OutlineTopComponent instance. Never call {@link #getDefault} directly!
+ */
+ public static synchronized OutlineTopComponent findInstance() {
+ TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+ if (win == null) {
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Outline component. It will not be located properly in the window system.");
+ return getDefault();
+ }
+ if (win instanceof OutlineTopComponent) {
+ return (OutlineTopComponent) win;
+ }
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+ return getDefault();
+ }
+
+ @Override
+ public int getPersistenceType() {
+ return TopComponent.PERSISTENCE_ALWAYS;
+ }
+
+ @Override
+ public void componentOpened() {
+ this.requestActive();
+ }
+
+ @Override
+ public void componentClosed() {
+ }
+
+ @Override
+ protected String preferredID() {
+ return PREFERRED_ID;
+ }
+
+ public void resultChanged(LookupEvent lookupEvent) {
+ }
+
+ @Override
+ public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
+ // Not called when user starts application for the first time
+ super.readExternal(objectInput);
+ ((BeanTreeView) this.jScrollPane1).setRootVisible(false);
+ }
+
+ @Override
+ public void writeExternal(ObjectOutput objectOutput) throws IOException {
+ super.writeExternal(objectOutput);
+ }
+
+ static final class ResolvableHelper implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object readResolve() {
+ return OutlineTopComponent.getDefault();
+ }
+ }
+
+ /** 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() {
+
+ jPanel2 = new javax.swing.JPanel();
+ jScrollPane1 = new BeanTreeView();
+
+ setLayout(new java.awt.BorderLayout());
+
+ jPanel2.setLayout(new java.awt.BorderLayout());
+ jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER);
+
+ add(jPanel2, java.awt.BorderLayout.CENTER);
+ }// </editor-fold>//GEN-END:initComponents
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JScrollPane jScrollPane1;
+ // End of variables declaration//GEN-END:variables
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="com.sun.hotspot.igv.coordinator" spec="1.0"/>
+ <instanceof class="at.openide.windows.TopComponent"/>
+ <instanceof class="com.sun.hotspot.igv.coordinator.OutlineTopComponent"/>
+ <instance class="com.sun.hotspot.igv.coordinator.OutlineTopComponent" method="getDefault"/>
+</settings>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+ <module name="com.sun.hotspot.igv.coordinator" spec="1.0"/>
+ <tc-id id="OutlineTopComponent"/>
+ <state opened="true"/>
+</tc-ref>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configuration PUBLIC "-//NetBeans IDE//DTD toolbar//EN" "http://www.netbeans.org/dtds/toolbar.dtd">
+<Configuration>
+ <Row>
+ <Toolbar name="Edit" position="1" visible="false"/>
+ <Toolbar name="File" position="1" visible="false" />
+ <Toolbar name="Memory" position="1" visible="false" />
+ </Row>
+ <Row>
+ <Toolbar name="WorkspaceSwitcher" />
+ <Toolbar name="StatusLine" />
+ </Row>
+</Configuration>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class StandardGroupOrganizer implements GroupOrganizer {
+
+ public String getName() {
+ return "-- None --";
+ }
+
+ public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+ List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+ if (groups.size() == 1 && subFolders.size() > 0) {
+ result.add(new Pair<String, List<Group>>("", groups));
+ } else {
+ for (Group g : groups) {
+ List<Group> children = new ArrayList<Group>();
+ children.add(g);
+ Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+ p.setLeft(g.getName());
+ p.setRight(children);
+ result.add(p);
+ }
+ }
+
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,18 @@
+CTL_EditFilterAction=Edit...
+CTL_ImportAction=Open...
+CTL_OpenGraphAction=View graph
+CTL_DiffGraphAction=Difference to current graph
+CTL_RemoveAction=Remove methods
+CTL_ApplyFilterAction=Apply
+CTL_FilterAction=Open Filter Window
+CTL_AppliedFilterAction=Open AppliedFilter Window
+CTL_OutlineAction=Open Outline Window
+CTL_MoveFilterUpAction=Move upwards
+CTL_MoveFilterDownAction=Move downwards
+CTL_RemoveFilterAction=Remove
+CTL_RemoveFilterSettingsAction=Remove filter setting
+CTL_SaveAsAction=Save selected methods...
+CTL_SaveAllAction=Save all...
+CTL_SaveFilterSettingsAction=Save filter settings...
+CTL_PropertiesAction=Open Properties Window
+CTL_NewFilterAction=New filter...
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class DiffGraphAction extends CookieAction {
+
+ protected void performAction(Node[] activatedNodes) {
+ DiffGraphCookie c = activatedNodes[0].getCookie(DiffGraphCookie.class);
+ c.openDiff();
+ }
+
+ protected int mode() {
+ return CookieAction.MODE_EXACTLY_ONE;
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(DiffGraphAction.class, "CTL_DiffGraphAction");
+ }
+
+ protected Class[] cookieClasses() {
+ return new Class[]{
+ DiffGraphCookie.class
+ };
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/coordinator/images/diff.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.difference.Difference;
+import org.openide.nodes.Node;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiffGraphCookie implements Node.Cookie {
+
+ private InputGraph a;
+ private InputGraph b;
+
+ public DiffGraphCookie(InputGraph a, InputGraph b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ public void openDiff() {
+
+ final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class);
+
+ if(viewer != null) {
+ InputGraph diffGraph = Difference.createDiffGraph(a, b);
+ viewer.view(diffGraph);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,175 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.serialization.Parser;
+import com.sun.hotspot.igv.settings.Settings;
+import com.sun.hotspot.igv.data.serialization.XMLParser;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import javax.swing.Action;
+import javax.swing.JFileChooser;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.progress.ProgressHandleFactory;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.RequestProcessor;
+import org.openide.util.actions.CallableSystemAction;
+import org.openide.xml.XMLUtil;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ImportAction extends CallableSystemAction {
+
+ public static FileFilter getFileFilter() {
+ return new FileFilter() {
+
+ public boolean accept(File f) {
+ return f.getName().toLowerCase().endsWith(".xml") || f.isDirectory();
+ }
+
+ public String getDescription() {
+ return "XML files (*.xml)";
+ }
+ };
+ }
+
+ public void performAction() {
+
+ JFileChooser fc = new JFileChooser();
+ fc.setFileFilter(ImportAction.getFileFilter());
+ fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+ if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File file = fc.getSelectedFile();
+
+ File dir = file;
+ if (!dir.isDirectory()) {
+ dir = dir.getParentFile();
+ }
+
+ Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+
+ try {
+ final XMLReader reader = XMLUtil.createXMLReader();
+ final FileInputStream inputStream = new FileInputStream(file);
+ final InputSource is = new InputSource(inputStream);
+
+ final ProgressHandle handle = ProgressHandleFactory.createHandle("Opening file " + file.getName());
+ final int basis = 1000;
+ handle.start(basis);
+ final int start = inputStream.available();
+
+ final XMLParser.ParseMonitor parseMonitor = new XMLParser.ParseMonitor() {
+
+ public void setProgress(double d) {
+ try {
+ int curAvailable = inputStream.available();
+ int prog = (int) (basis * (double) (start - curAvailable) / (double) start);
+ handle.progress(prog);
+ } catch (IOException ex) {
+ }
+ }
+
+ public void setState(String state) {
+ setProgress(0.0);
+ handle.progress(state);
+ }
+ };
+ final Parser parser = new Parser();
+ final OutlineTopComponent component = OutlineTopComponent.findInstance();
+
+ component.requestActive();
+
+ RequestProcessor.getDefault().post(new Runnable() {
+
+ public void run() {
+ GraphDocument document = null;
+ try {
+ document = parser.parse(reader, is, parseMonitor);
+ parseMonitor.setState("Finishing");
+ component.getDocument().addGraphDocument(document);
+ } catch (SAXException ex) {
+ String s = "Exception during parsing the XML file, could not load document!";
+ if (ex instanceof XMLParser.MissingAttributeException) {
+ XMLParser.MissingAttributeException e = (XMLParser.MissingAttributeException) ex;
+ s += "\nMissing attribute \"" + e.getAttributeName() + "\"";
+ }
+ ex.printStackTrace();
+ NotifyDescriptor d = new NotifyDescriptor.Message(s, NotifyDescriptor.ERROR_MESSAGE);
+ DialogDisplayer.getDefault().notify(d);
+ }
+ handle.finish();
+ }
+ });
+
+ } catch (SAXException ex) {
+ ex.printStackTrace();
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(ImportAction.class, "CTL_ImportAction");
+ }
+
+ public ImportAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Open an XML graph document");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/coordinator/images/import.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.*;
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutlineAction extends AbstractAction {
+
+ public OutlineAction() {
+ super(NbBundle.getMessage(OutlineAction.class, "CTL_OutlineAction"));
+ }
+
+ public void actionPerformed(ActionEvent evt) {
+ TopComponent win = OutlineTopComponent.findInstance();
+ win.open();
+ win.requestActive();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.NodeAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveAction extends NodeAction {
+
+ protected void performAction(Node[] activatedNodes) {
+ for (Node n : activatedNodes) {
+ RemoveCookie removeCookie = n.getCookie(RemoveCookie.class);
+ if (removeCookie != null) {
+ removeCookie.remove();
+ }
+ }
+ }
+
+ public RemoveAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Remove");
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(RemoveAction.class, "CTL_RemoveAction");
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/coordinator/images/remove.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ protected boolean enable(Node[] nodes) {
+ return nodes.length > 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveAllAction extends CallableSystemAction {
+
+
+ public String getName() {
+ return NbBundle.getMessage(RemoveAllAction.class, "CTL_ImportAction");
+ }
+
+ public RemoveAllAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Remove all methods");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT, InputEvent.CTRL_MASK));
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/coordinator/images/removeall.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ public void performAction() {
+ OutlineTopComponent.findInstance().clear();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.coordinator.actions;
+
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface RemoveCookie extends Node.Cookie {
+ void remove();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,69 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveAllAction extends CallableSystemAction {
+
+ public void performAction() {
+ final OutlineTopComponent component = OutlineTopComponent.findInstance();
+ SaveAsAction.save(component.getDocument());
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(SaveAllAction.class, "CTL_SaveAllAction");
+ }
+
+ public SaveAllAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Save all methods to XML file");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/coordinator/images/saveall.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,122 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.serialization.Printer;
+import com.sun.hotspot.igv.settings.Settings;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import javax.swing.JFileChooser;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+import org.openide.util.actions.NodeAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveAsAction extends NodeAction {
+
+ protected void performAction(Node[] activatedNodes) {
+
+ GraphDocument doc = new GraphDocument();
+ for (Node n : activatedNodes) {
+ Group group = n.getLookup().lookup(Group.class);
+ doc.addGroup(group);
+ }
+
+ save(doc);
+ }
+
+ public static void save(GraphDocument doc) {
+ JFileChooser fc = new JFileChooser();
+ fc.setFileFilter(ImportAction.getFileFilter());
+ fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+ if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File file = fc.getSelectedFile();
+ if (!file.getName().contains(".")) {
+ file = new File(file.getAbsolutePath() + ".xml");
+ }
+
+ File dir = file;
+ if (!dir.isDirectory()) {
+ dir = dir.getParentFile();
+ }
+ Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+ try {
+ Writer writer = new OutputStreamWriter(new FileOutputStream(file));
+ Printer p = new Printer();
+ p.export(writer, doc);
+ writer.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+
+ }
+ }
+ }
+
+ protected int mode() {
+ return CookieAction.MODE_SOME;
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(SaveAsAction.class, "CTL_SaveAsAction");
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/coordinator/images/save.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ protected boolean enable(Node[] nodes) {
+
+ int cnt = 0;
+ for (Node n : nodes) {
+ cnt += n.getLookup().lookupAll(Group.class).size();
+ }
+
+ return cnt > 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,180 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import java.awt.Component;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.swing.Action;
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.openide.awt.DropDownButtonFactory;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+public class StructuredViewAction extends CallableSystemAction {
+
+ private static JButton dropDownButton;
+ private static ButtonGroup buttonGroup;
+ private static JPopupMenu popup;
+ private MyMenuItemListener menuItemListener;
+ private Map<JMenuItem, GroupOrganizer> map;
+
+ public StructuredViewAction() {
+
+ putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks");
+ }
+
+ @Override
+ public Component getToolbarPresenter() {
+
+ Image iconImage = Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/structure.gif");
+ ImageIcon icon = new ImageIcon(iconImage);
+
+ popup = new JPopupMenu();
+
+ menuItemListener = new MyMenuItemListener();
+
+ buttonGroup = new ButtonGroup();
+
+ Collection<? extends GroupOrganizer> organizersCollection = Lookup.getDefault().lookupAll(GroupOrganizer.class);
+
+ List<GroupOrganizer> organizers = new ArrayList<GroupOrganizer>(organizersCollection);
+ Collections.sort(organizers, new Comparator<GroupOrganizer>() {
+ public int compare(GroupOrganizer a, GroupOrganizer b) {
+ return a.getName().compareTo(b.getName());
+ }
+ });
+
+ map = new HashMap<JMenuItem, GroupOrganizer>();
+
+ boolean first = true;
+ for(GroupOrganizer organizer : organizers) {
+ JCheckBoxMenuItem item = new JCheckBoxMenuItem(organizer.getName());
+ map.put(item, organizer);
+ item.addActionListener(menuItemListener);
+ buttonGroup.add(item);
+ popup.add(item);
+ if(first) {
+ item.setSelected(true);
+ first = false;
+ }
+ }
+
+ dropDownButton = DropDownButtonFactory.createDropDownButton(
+ new ImageIcon(
+ new BufferedImage(32, 32, BufferedImage.TYPE_BYTE_GRAY)),
+ popup);
+
+ dropDownButton.setIcon(icon);
+
+ dropDownButton.setToolTipText("Insert Layer Registration");
+
+ dropDownButton.addItemListener(new ItemListener() {
+
+ public void itemStateChanged(ItemEvent e) {
+ int state = e.getStateChange();
+ if (state == ItemEvent.SELECTED) {
+ performAction();
+ }
+ }
+ });
+
+ dropDownButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ performAction();
+ }
+ });
+
+ popup.addPopupMenuListener(new PopupMenuListener() {
+
+ public void popupMenuCanceled(PopupMenuEvent e) {
+ dropDownButton.setSelected(false);
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+ dropDownButton.setSelected(false);
+ }
+
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ dropDownButton.setSelected(true);
+ }
+ });
+
+ return dropDownButton;
+
+ }
+
+ private class MyMenuItemListener implements ActionListener {
+
+ public void actionPerformed(ActionEvent ev) {
+ JMenuItem item = (JMenuItem) ev.getSource();
+ GroupOrganizer organizer = map.get(item);
+ assert organizer != null : "Organizer must exist!";
+ OutlineTopComponent.findInstance().setOrganizer(organizer);
+ }
+ }
+
+
+ @Override
+ public void performAction() {
+ popup.show(dropDownButton, 0, dropDownButton.getHeight());
+ }
+
+ public String getName() {
+ return "Structured View";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mode version="2.1">
+ <name unique="customLeft" />
+ <kind type="view" />
+ <state type="joined" />
+ <constraints>
+ <path orientation="horizontal" number="0" weight="0.779245283018868"/>
+ <path orientation="vertical" number="0" weight="0.7511825922421949"/>
+ <path orientation="horizontal" number="0" weight="0.5"/>
+ <path orientation="vertical" number="20" weight="0.7"/>
+ <path orientation="horizontal" number="40" weight="0.55"/>
+ <path orientation="horizontal" number="0" weight="0.2711864406779661"/>
+ </constraints>
+ <bounds x="0" y="0" width="0" height="0" />
+ <frame state="0"/>
+ <active-tc id="OutlineTopComponent"/>
+ <empty-behavior permanent="false"/>
+</mode>
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <attr name="Actions\Edit\com-sun-hotspot-igv-bytecodes-SelectBytecodesAction.instance\position" intvalue="200"/>
+ <attr name="Actions\Edit\org-netbeans-core-ui-sysopen-SystemOpenAction.instance\position" intvalue="100"/>
+ <attr name="Actions\Edit\org-openide-actions-CopyAction.instance\position" intvalue="1300"/>
+ <attr name="Actions\Edit\org-openide-actions-CutAction.instance\position" intvalue="1400"/>
+ <attr name="Actions\Edit\org-openide-actions-DeleteAction.instance\position" intvalue="1500"/>
+ <attr name="Actions\Edit\org-openide-actions-FindAction.instance\position" intvalue="1600"/>
+ <attr name="Actions\Edit\org-openide-actions-GotoAction.instance\position" intvalue="1700"/>
+ <attr name="Actions\Edit\org-openide-actions-PasteAction.instance\position" intvalue="1800"/>
+ <attr name="Actions\Edit\org-openide-actions-RedoAction.instance\position" intvalue="1900"/>
+ <attr name="Actions\Edit\org-openide-actions-ReplaceAction.instance\position" intvalue="2000"/>
+ <attr name="Actions\Edit\org-openide-actions-UndoAction.instance\position" intvalue="2100"/>
+
+ <folder name="Actions">
+ <folder name="File">
+ <file name="com-sun-hotspot-igv-coordinator-actions-SaveAsAction.instance">
+ <attr name="position" intvalue="700"/>
+ </file>
+ <file name="com-sun-hotspot-igv-coordinator-actions-SaveAllAction.instance">
+ <attr name="position" intvalue="800"/>
+ </file>
+ <file name="com-sun-hotspot-igv-coordinator-actions-ImportAction.instance">
+ <attr name="position" intvalue="1000"/>
+ </file>
+ </folder>
+ <folder name="Edit">
+
+ <file name="com-sun-hotspot-igv-coordinator-actions-RemoveAction.instance">
+ <attr name="position" intvalue="1200"/>
+ </file>
+ </folder>
+ <folder name="Window">
+ <file name="com-sun-hotspot-igv-coordinator-actions-OutlineAction.instance"/>
+ </folder>
+ </folder>
+ <folder name="Menu">
+ <folder name="File">
+ <file name="com-sun-hotspot-igv-coordinator-actions-ImportAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-ImportAction.instance"/>
+ <attr name="position" intvalue="100"/>
+ </file>
+ <file name="MySeparator2.instance">
+ <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+ <attr name="position" intvalue="300"/>
+ </file>
+ <file name="com-sun-hotspot-igv-coordinator-actions-SaveAsAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-SaveAsAction.instance"/>
+ <attr name="position" intvalue="300"/>
+ </file>
+ <file name="com-sun-hotspot-igv-coordinator-actions-SaveAllAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-SaveAllAction.instance"/>
+ <attr name="position" intvalue="400"/>
+ </file>
+ <file name="MySeparator3.instance">
+ <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+ <attr name="position" intvalue="500"/>
+ </file>
+
+ <file name="org-netbeans-modules-openfile-OpenFileAction.instance_hidden"/>
+ <file name="org-openide-actions-PageSetupAction.instance_hidden"/>
+ <file name="org-openide-actions-PrintAction.instance_hidden"/>
+ <file name="org-openide-actions-SaveAction.instance_hidden"/>
+ <file name="org-openide-actions-SaveAllAction.instance_hidden"/>
+ <file name="org-openide-actions-SaveAsAction.shadow_hidden"/>
+ </folder>
+ <folder name="Edit">
+ <file name="com-sun-hotspot-igv-coordinator-actions-SaveFilterSettingsAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/Edit/com-sun-hotspot-igv-coordinator-actions-SaveFilterSettingsAction.instance"/>
+ </file>
+ <file name="com-sun-hotspot-igv-coordinator-actions-RemoveAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/Edit/com-sun-hotspot-igv-coordinator-actions-RemoveAction.instance"/>
+ </file>
+ <file name="org-netbeans-core-actions-JumpNextAction.shadow_hidden"/>
+ <file name="org-netbeans-core-actions-JumpPrevAction.shadow_hidden"/>
+ <file name="org-openide-actions-CutAction.instance_hidden"/>
+ <file name="org-openide-actions-CopyAction.instance_hidden"/>
+ <file name="org-openide-actions-PasteAction.instance_hidden"/>
+ <file name="org-openide-actions-DeleteAction.instance_hidden"/>
+ <file name="org-openide-actions-FindAction.instance_hidden"/>
+ <file name="org-openide-actions-ReplaceAction.instance_hidden"/>
+ <file name="org-openide-actions-JumpNextAction.shadow_hidden"/>
+ <file name="org-openide-actions-JumpPrevAction.shadow_hidden"/>
+ </folder>
+ <file name="GoTo_hidden"/>
+ <folder name="View">
+ <file name="Separator1.instance_hidden"/>
+ <file name="Separator2.instance_hidden"/>
+ <file name="org-netbeans-core-actions-HTMLViewAction.instance_hidden"/>
+ <file name="org-netbeans-core-actions-LogAction.instance_hidden"/>
+ <file name="org-netbeans-core-windows-actions-ToolbarsListAction.instance_hidden"/>
+ </folder>
+ <folder name="Window">
+ <file name="OutlineAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-coordinator-actions-OutlineAction.instance"/>
+ </file>
+ </folder>
+ </folder>
+ <folder name="Toolbars">
+ <file name="Standard.xml" url="StandardConfiguration.xml"/>
+ </folder>
+ <folder name="Windows2">
+ <folder name="Components">
+ <file name="OutlineTopComponent.settings" url="OutlineTopComponentSettings.xml"/>
+ </folder>
+ <folder name="Modes">
+ <file name="customLeft.wsmode" url="customLeftWsmode.xml"/>
+ <folder name="customLeft">
+ <file name="OutlineTopComponent.wstcref" url="OutlineTopComponentWstcref.xml"/>
+ </folder>
+ </folder>
+ </folder>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.data" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.data.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.data
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/data/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.data-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=a403efd8
+build.xml.script.CRC32=b87f73ba
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=a403efd8
+nbproject/build-impl.xml.script.CRC32=cc649146
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <suite-component/>
+ <module-dependencies/>
+ <public-packages>
+ <package>com.sun.hotspot.igv.data</package>
+ <package>com.sun.hotspot.igv.data.serialization</package>
+ <package>com.sun.hotspot.igv.data.services</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Data
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ChangedEvent<T> extends Event<ChangedListener<T>> {
+
+ private T object;
+
+ public ChangedEvent() {
+ }
+
+ public ChangedEvent(T object) {
+ this.object = object;
+ }
+
+ protected void fire(ChangedListener<T> l) {
+ l.changed(object);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ChangedEventProvider<T> {
+
+ public ChangedEvent<T> getChangedEvent();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ChangedListener<T> {
+
+ public void changed(T source);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class Event<L> {
+
+ private List<L> listener;
+
+ public Event() {
+ listener = new ArrayList<L>();
+ }
+
+ public void addListener(L l) {
+ listener.add(l);
+ }
+
+ public void removeListener(L l) {
+ listener.remove(l);
+ }
+
+ public void fire() {
+ List<L> tmpList = new ArrayList<L>(listener);
+ for (L l : tmpList) {
+ fire(l);
+ }
+ }
+
+ protected abstract void fire(L l);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphDocument extends Properties.Object implements ChangedEventProvider<GraphDocument> {
+
+ private List<Group> groups;
+ private ChangedEvent<GraphDocument> changedEvent;
+
+ public GraphDocument() {
+ groups = new ArrayList<Group>();
+ changedEvent = new ChangedEvent<GraphDocument>(this);
+ }
+
+ public void clear() {
+ groups.clear();
+ getChangedEvent().fire();
+ }
+
+ public ChangedEvent<GraphDocument> getChangedEvent() {
+ return changedEvent;
+ }
+
+ public List<Group> getGroups() {
+ return Collections.unmodifiableList(groups);
+ }
+
+ public void addGroup(Group group) {
+ group.setDocument(this);
+ groups.add(group);
+ getChangedEvent().fire();
+ }
+
+ public void removeGroup(Group group) {
+ if (groups.contains(group)) {
+ group.setDocument(null);
+ groups.remove(group);
+ getChangedEvent().fire();
+ }
+ }
+
+ public void addGraphDocument(GraphDocument document) {
+ for (Group g : document.groups) {
+ this.addGroup(g);
+ }
+ document.clear();
+ getChangedEvent().fire();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("GraphDocument: " + getProperties().toString() + " \n\n");
+ for (Group g : getGroups()) {
+ sb.append(g.toString());
+ sb.append("\n\n");
+ }
+
+ return sb.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,141 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.Properties;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Group extends Properties.Object implements ChangedEventProvider<Group> {
+
+ private List<InputGraph> graphs;
+ private transient ChangedEvent<Group> changedEvent;
+ private GraphDocument document;
+ private InputMethod method;
+ private String assembly;
+
+ public Group() {
+ graphs = new ArrayList<InputGraph>();
+ init();
+ }
+
+ private void init() {
+ changedEvent = new ChangedEvent<Group>(this);
+ }
+
+ public void fireChangedEvent() {
+ changedEvent.fire();
+ }
+
+ public void setAssembly(String s) {
+ this.assembly = s;
+ }
+
+ public String getAssembly() {
+ return assembly;
+ }
+
+ public void setMethod(InputMethod method) {
+ this.method = method;
+ }
+
+ public InputMethod getMethod() {
+ return method;
+ }
+
+ void setDocument(GraphDocument document) {
+ this.document = document;
+ }
+
+ public GraphDocument getDocument() {
+ return document;
+ }
+
+ public ChangedEvent<Group> getChangedEvent() {
+ return changedEvent;
+ }
+
+ public List<InputGraph> getGraphs() {
+ return Collections.unmodifiableList(graphs);
+ }
+
+ public void addGraph(InputGraph g) {
+ assert g != null;
+ assert !graphs.contains(g);
+ graphs.add(g);
+ changedEvent.fire();
+ }
+
+ public void removeGraph(InputGraph g) {
+ int index = graphs.indexOf(g);
+ if (index != -1) {
+ graphs.remove(g);
+ changedEvent.fire();
+ }
+ }
+
+ public Set<Integer> getAllNodes() {
+ Set<Integer> result = new HashSet<Integer>();
+ for (InputGraph g : graphs) {
+ Set<Integer> ids = g.getNodesAsSet();
+ result.addAll(g.getNodesAsSet());
+ for (Integer i : ids) {
+ result.add(-i);
+ }
+ }
+ return result;
+ }
+
+ public InputGraph getLastAdded() {
+ if (graphs.size() == 0) {
+ return null;
+ }
+ return graphs.get(graphs.size() - 1);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Group " + getProperties().toString() + "\n");
+ for (InputGraph g : graphs) {
+ sb.append(g.toString());
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ public String getName() {
+ return getProperties().get("name");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,140 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBlock {
+
+ private List<InputNode> nodes;
+ private List<String> successorNames;
+ private String name;
+ private InputGraph graph;
+ private Rectangle bounds;
+ private Set<InputBlock> successors;
+ private Set<InputBlock> predecessors;
+ private Set<InputBlockEdge> inputs;
+ private Set<InputBlockEdge> outputs;
+
+ public InputBlock(InputGraph graph, String name) {
+ this.graph = graph;
+ this.name = name;
+ nodes = new ArrayList<InputNode>();
+ successorNames = new ArrayList<String>();
+ successors = new HashSet<InputBlock>();
+ predecessors = new HashSet<InputBlock>();
+ inputs = new HashSet<InputBlockEdge>();
+ outputs = new HashSet<InputBlockEdge>();
+ }
+
+ public void removeSuccessor(InputBlock b) {
+ if (successors.contains(b)) {
+ successors.remove(b);
+ b.predecessors.remove(this);
+ InputBlockEdge e = new InputBlockEdge(this, b);
+ assert outputs.contains(e);
+ outputs.remove(e);
+ assert b.inputs.contains(e);
+ b.inputs.remove(e);
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String s) {
+ name = s;
+ }
+
+ public List<InputNode> getNodes() {
+ return Collections.unmodifiableList(nodes);
+ }
+
+ public void addNode(int id) {
+ InputNode n = graph.getNode(id);
+ assert n != null;
+ graph.setBlock(n, this);
+ addNode(graph.getNode(id));
+ }
+
+ public void addNode(InputNode node) {
+ assert !nodes.contains(node);
+ nodes.add(node);
+ }
+
+ public Set<InputBlock> getPredecessors() {
+ return Collections.unmodifiableSet(predecessors);
+ }
+
+ public Set<InputBlock> getSuccessors() {
+ return Collections.unmodifiableSet(successors);
+ }
+
+ public Set<InputBlockEdge> getInputs() {
+ return Collections.unmodifiableSet(inputs);
+ }
+
+ public Set<InputBlockEdge> getOutputs() {
+ return Collections.unmodifiableSet(outputs);
+ }
+
+ // resolveBlockLinks must be called afterwards
+ public void addSuccessor(String name) {
+ successorNames.add(name);
+ }
+
+ public void resolveBlockLinks() {
+ for (String s : successorNames) {
+ InputBlock b = graph.getBlock(s);
+ addSuccessor(b);
+ }
+
+ successorNames.clear();
+ }
+
+ public void addSuccessor(InputBlock b) {
+ if (!successors.contains(b)) {
+ successors.add(b);
+ b.predecessors.add(this);
+ InputBlockEdge e = new InputBlockEdge(this, b);
+ outputs.add(e);
+ b.inputs.add(e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return this.getName();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBlockEdge {
+
+ private InputBlock from;
+ private InputBlock to;
+
+ public InputBlockEdge(InputBlock from, InputBlock to) {
+ assert from != null;
+ assert to != null;
+ this.from = from;
+ this.to = to;
+ }
+
+ public InputBlock getFrom() {
+ return from;
+ }
+
+ public InputBlock getTo() {
+ return to;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof InputBlockEdge && obj != null) {
+ InputBlockEdge e = (InputBlockEdge) obj;
+ return e.from.equals(from) && e.to.equals(to);
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = from.hashCode();
+ hash = 59 * hash + to.hashCode();
+ return hash;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBytecode {
+
+ private int bci;
+ private String name;
+ private InputMethod inlined;
+
+ public InputBytecode(int bci, String name) {
+ this.bci = bci;
+ this.name = name;
+ }
+
+ public InputMethod getInlined() {
+ return inlined;
+ }
+
+ public void setInlined(InputMethod inlined) {
+ this.inlined = inlined;
+ }
+
+ public int getBci() {
+ return bci;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputEdge {
+
+ public enum State {
+
+ SAME,
+ NEW,
+ DELETED
+ }
+ private char toIndex;
+ private int from;
+ private int to;
+ private State state;
+
+ public InputEdge(char toIndex, int from, int to) {
+ this.toIndex = toIndex;
+ this.from = from;
+ this.to = to;
+ this.state = State.SAME;
+ }
+
+ public State getState() {
+ return state;
+ }
+
+ public void setState(State x) {
+ this.state = x;
+ }
+
+ public char getToIndex() {
+ return toIndex;
+ }
+
+ public String getName() {
+ return "in" + toIndex;
+ }
+
+ public int getFrom() {
+ return from;
+ }
+
+ public int getTo() {
+ return to;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null || !(o instanceof InputEdge)) {
+ return false;
+ }
+ InputEdge conn2 = (InputEdge) o;
+ return conn2.toIndex == toIndex && conn2.from == from && conn2.to == to;
+ }
+
+ @Override
+ public String toString() {
+ return "Edge from " + from + " to " + to + "(" + (int) toIndex + ") ";
+ }
+
+ @Override
+ public int hashCode() {
+ return (from << 20 | to << 8 | toIndex);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,249 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.Properties;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputGraph extends Properties.Object {
+
+ private Map<Integer, InputNode> nodes;
+ private Set<InputEdge> edges;
+ private Group parent;
+ private Map<String, InputBlock> blocks;
+ private Map<Integer, InputBlock> nodeToBlock;
+ private boolean isDifferenceGraph;
+
+ public InputGraph(Group parent) {
+ this(parent, null);
+ }
+
+ public InputGraph(Group parent, InputGraph last) {
+ this(parent, last, "");
+ }
+
+ private void clearBlocks() {
+ blocks.clear();
+ nodeToBlock.clear();
+ }
+
+ public InputGraph(Group parent, InputGraph last, String name) {
+ this.parent = parent;
+ setName(name);
+ nodes = new Hashtable<Integer, InputNode>();
+ edges = new HashSet<InputEdge>();
+ blocks = new Hashtable<String, InputBlock>();
+ nodeToBlock = new Hashtable<Integer, InputBlock>();
+ if (last != null) {
+
+ for (InputNode n : last.getNodes()) {
+ addNode(n);
+ }
+
+ for (InputEdge c : last.getEdges()) {
+ addEdge(c);
+ }
+ }
+ }
+
+ public void schedule(Collection<InputBlock> newBlocks) {
+ clearBlocks();
+ InputBlock noBlock = new InputBlock(this, "no block");
+ Set<InputNode> scheduledNodes = new HashSet<InputNode>();
+
+ for (InputBlock b : newBlocks) {
+ for (InputNode n : b.getNodes()) {
+ assert !scheduledNodes.contains(n);
+ scheduledNodes.add(n);
+ }
+ }
+
+ for (InputNode n : this.getNodes()) {
+ assert nodes.get(n.getId()) == n;
+ if (!scheduledNodes.contains(n)) {
+ noBlock.addNode(n.getId());
+ }
+ }
+
+ if (noBlock.getNodes().size() != 0) {
+ newBlocks.add(noBlock);
+ }
+ for (InputBlock b : newBlocks) {
+ addBlock(b);
+ }
+
+ for (InputNode n : this.getNodes()) {
+ assert this.getBlock(n) != null;
+ }
+ }
+
+ public void setBlock(InputNode node, InputBlock block) {
+ nodeToBlock.put(node.getId(), block);
+ }
+
+ public InputBlock getBlock(int nodeId) {
+ return nodeToBlock.get(nodeId);
+ }
+
+ public InputBlock getBlock(InputNode node) {
+ return getBlock(node.getId());
+ }
+
+ public InputGraph getNext() {
+ List<InputGraph> list = parent.getGraphs();
+ if (!list.contains(this)) {
+ return null;
+ }
+ int index = list.indexOf(this);
+ if (index == list.size() - 1) {
+ return null;
+ } else {
+ return list.get(index + 1);
+ }
+ }
+
+ public InputGraph getPrev() {
+ List<InputGraph> list = parent.getGraphs();
+ if (!list.contains(this)) {
+ return null;
+ }
+ int index = list.indexOf(this);
+ if (index == 0) {
+ return null;
+ } else {
+ return list.get(index - 1);
+ }
+ }
+
+ public String getName() {
+ return getProperties().get("name");
+ }
+
+ public String getAbsoluteName() {
+ String result = getName();
+ if (this.parent != null) {
+ result = parent.getName() + ": " + result;
+ }
+ return result;
+ }
+
+ public Collection<InputNode> getNodes() {
+ return Collections.unmodifiableCollection(nodes.values());
+ }
+
+ public Set<Integer> getNodesAsSet() {
+ return Collections.unmodifiableSet(nodes.keySet());
+ }
+
+ public Collection<InputBlock> getBlocks() {
+ return Collections.unmodifiableCollection(blocks.values());
+ }
+
+ public void addNode(InputNode node) {
+ nodes.put(node.getId(), node);
+ }
+
+ public InputNode getNode(int id) {
+ return nodes.get(id);
+ }
+
+ public InputNode removeNode(int index) {
+ return nodes.remove(index);
+ }
+
+ public Set<InputEdge> getEdges() {
+ return Collections.unmodifiableSet(edges);
+ }
+
+ public void removeEdge(InputEdge c) {
+ assert edges.contains(c);
+ edges.remove(c);
+ assert !edges.contains(c);
+ }
+
+ public void addEdge(InputEdge c) {
+ assert !edges.contains(c);
+ edges.add(c);
+ assert edges.contains(c);
+ }
+
+ public Group getGroup() {
+ return parent;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Graph " + getName() + " " + getProperties().toString() + "\n");
+ for (InputNode n : nodes.values()) {
+ sb.append(n.toString());
+ sb.append("\n");
+ }
+
+ for (InputEdge c : edges) {
+ sb.append(c.toString());
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ public void addBlock(InputBlock b) {
+ blocks.put(b.getName(), b);
+ for (InputNode n : b.getNodes()) {
+ this.nodeToBlock.put(n.getId(), b);
+ }
+ }
+
+ public void resolveBlockLinks() {
+ for (InputBlock b : blocks.values()) {
+ b.resolveBlockLinks();
+ }
+ }
+
+ public void setName(String s) {
+ getProperties().setProperty("name", s);
+ }
+
+ public InputBlock getBlock(String s) {
+ return blocks.get(s);
+ }
+
+ public boolean isDifferenceGraph() {
+ return this.isDifferenceGraph;
+ }
+
+ public void setIsDifferenceGraph(boolean b) {
+ isDifferenceGraph = b;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,127 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.Properties;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputMethod extends Properties.Object {
+
+ private String name;
+ private int bci;
+ private String shortName;
+ private List<InputMethod> inlined;
+ private InputMethod parentMethod;
+ private Group group;
+ private List<InputBytecode> bytecodes;
+
+ /** Creates a new instance of InputMethod */
+ public InputMethod(Group parent, String name, String shortName, int bci) {
+ this.group = parent;
+ this.name = name;
+ this.bci = bci;
+ this.shortName = shortName;
+ inlined = new ArrayList<InputMethod>();
+ bytecodes = new ArrayList<InputBytecode>();
+ }
+
+ public List<InputBytecode> getBytecodes() {
+ return Collections.unmodifiableList(bytecodes);
+ }
+
+ public List<InputMethod> getInlined() {
+ return Collections.unmodifiableList(inlined);
+ }
+
+ public void addInlined(InputMethod m) {
+
+ // assert bci unique
+ for (InputMethod m2 : inlined) {
+ assert m2.getBci() != m.getBci();
+ }
+
+ inlined.add(m);
+ assert m.parentMethod == null;
+ m.parentMethod = this;
+
+ for (InputBytecode bc : bytecodes) {
+ if (bc.getBci() == m.getBci()) {
+ bc.setInlined(m);
+ }
+ }
+ }
+
+ public Group getGroup() {
+ return group;
+ }
+
+ public String getShortName() {
+ return shortName;
+ }
+
+ public void setBytecodes(String text) {
+
+ String[] strings = text.split("\n");
+ int oldNumber = -1;
+ for (String s : strings) {
+
+ if (s.length() > 0 && Character.isDigit(s.charAt(0))) {
+ s = s.trim();
+ int spaceIndex = s.indexOf(' ');
+ String numberString = s.substring(0, spaceIndex);
+ String tmpName = s.substring(spaceIndex + 1, s.length());
+
+ int number = -1;
+ number = Integer.parseInt(numberString);
+
+ // assert correct order of bytecodes
+ assert number > oldNumber;
+
+ InputBytecode bc = new InputBytecode(number, tmpName);
+ bytecodes.add(bc);
+
+ for (InputMethod m : inlined) {
+ if (m.getBci() == number) {
+ bc.setInlined(m);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getBci() {
+ return bci;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputNode extends Properties.Object {
+
+ private int id;
+
+ public InputNode(InputNode n) {
+ super(n);
+ setId(n.id);
+ }
+
+ public InputNode(int id) {
+ setId(id);
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ getProperties().setProperty("id", "" + id);
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof InputNode)) {
+ return false;
+ }
+ InputNode n = (InputNode) o;
+ if (n.id != id) {
+ return false;
+ }
+ return getProperties().equals(n.getProperties());
+ }
+
+ @Override
+ public int hashCode() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "Node " + id + " " + getProperties().toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Pair<L, R> {
+
+ private L l;
+ private R r;
+
+ public Pair() {
+ }
+
+ public Pair(L l, R r) {
+ this.l = l;
+ this.r = r;
+ }
+
+ public L getLeft() {
+ return l;
+ }
+
+ public void setLeft(L l) {
+ this.l = l;
+ }
+
+ public R getRight() {
+ return r;
+ }
+
+ public void setRight(R r) {
+ this.r = r;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof Pair)) {
+ return false;
+ }
+ Pair obj = (Pair) o;
+ return l.equals(obj.l) && r.equals(obj.r);
+ }
+
+ @Override
+ public int hashCode() {
+ return l.hashCode() * 71 + r.hashCode();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,288 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Properties implements Serializable {
+
+ public static final long serialVersionUID = 1L;
+ private Map<String, Property> map;
+
+ public Properties() {
+ map = new HashMap<String, Property>(5);
+ }
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (!(o instanceof Properties)) {
+ return false;
+ }
+
+ Properties p = (Properties) o;
+
+ if (getProperties().size() != p.getProperties().size()) {
+ return false;
+ }
+ for (Property prop : getProperties()) {
+ String value = p.get(prop.getName());
+ if (value == null || !value.equals(prop.getValue())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 5;
+ hash = 83 * hash + (this.map != null ? this.map.hashCode() : 0);
+ return hash;
+ }
+
+ public Properties(String name, String value) {
+ this();
+ this.add(new Property(name, value));
+ }
+
+ public Properties(String name, String value, String name1, String value1) {
+ this(name, value);
+ this.add(new Property(name1, value1));
+ }
+
+ public Properties(String name, String value, String name1, String value1, String name2, String value2) {
+ this(name, value, name1, value1);
+ this.add(new Property(name2, value2));
+ }
+
+ public Properties(Properties p) {
+ map = new HashMap<String, Property>(p.map);
+ }
+
+ public static class Object implements Provider {
+
+ private Properties properties;
+
+ public Object() {
+ properties = new Properties();
+ }
+
+ public Object(Properties.Object object) {
+ properties = new Properties(object.getProperties());
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+ }
+
+ public interface PropertyMatcher {
+
+ String getName();
+
+ boolean match(String value);
+ }
+
+ public static class InvertPropertyMatcher implements PropertyMatcher {
+
+ private PropertyMatcher matcher;
+
+ public InvertPropertyMatcher(PropertyMatcher matcher) {
+ this.matcher = matcher;
+ }
+
+ public String getName() {
+ return matcher.getName();
+ }
+
+ public boolean match(String p) {
+ return !matcher.match(p);
+ }
+ }
+
+ public static class StringPropertyMatcher implements PropertyMatcher {
+
+ private String name;
+ private String value;
+
+ public StringPropertyMatcher(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean match(String p) {
+ return p.equals(value);
+ }
+ }
+
+ public static class RegexpPropertyMatcher implements PropertyMatcher {
+
+ private String name;
+ private Pattern valuePattern;
+
+ public RegexpPropertyMatcher(String name, String value) {
+ this.name = name;
+ valuePattern = Pattern.compile(value);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean match(String p) {
+ Matcher m = valuePattern.matcher(p);
+ return m.matches();
+ }
+ }
+
+ public Property selectSingle(PropertyMatcher matcher) {
+
+ Property p = this.map.get(matcher.getName());
+ if (p == null) {
+ return null;
+ }
+ if (matcher.match(p.getValue())) {
+ return p;
+ } else {
+ return null;
+ }
+ }
+
+ public interface Provider {
+
+ public Properties getProperties();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ for (Property p : map.values()) {
+ sb.append(p.toString());
+ }
+ return sb.append("]").toString();
+ }
+
+ public static class PropertySelector<T extends Properties.Provider> {
+
+ private Collection<T> objects;
+
+ public PropertySelector(Collection<T> objects) {
+ this.objects = objects;
+ }
+
+ public T selectSingle(final String name, final String value) {
+ return selectSingle(new StringPropertyMatcher(name, value));
+ }
+
+ public T selectSingle(PropertyMatcher matcher) {
+
+ for (T t : objects) {
+ Property p = t.getProperties().selectSingle(matcher);
+ if (p != null) {
+ return t;
+ }
+ }
+
+ return null;
+ }
+
+ public List<T> selectMultiple(final String name, final String value) {
+ return selectMultiple(new StringPropertyMatcher(name, value));
+ }
+
+ public List<T> selectMultiple(PropertyMatcher matcher) {
+ List<T> result = new ArrayList<T>();
+ for (T t : objects) {
+ Property p = t.getProperties().selectSingle(matcher);
+ if (p != null) {
+ result.add(t);
+ }
+ }
+ return result;
+ }
+ }
+
+ public String get(String key) {
+ Property p = map.get(key);
+ if (p == null) {
+ return null;
+ } else {
+ return p.getValue();
+ }
+ }
+
+ public String getProperty(String string) {
+ return get(string);
+ }
+
+ public Property setProperty(String name, String value) {
+
+ if (value == null) {
+ // remove this property
+ return map.remove(name);
+ } else {
+ Property p = map.get(name);
+ if (p == null) {
+ p = new Property(name, value);
+ map.put(name, p);
+ } else {
+ p.setValue(value);
+ }
+ return p;
+ }
+ }
+
+ public Collection<Property> getProperties() {
+ return Collections.unmodifiableCollection(map.values());
+ }
+
+ public void add(Properties properties) {
+ for (Property p : properties.getProperties()) {
+ add(p);
+ }
+ }
+
+ public void add(Property property) {
+ assert property.getName() != null;
+ assert property.getValue() != null;
+ map.put(property.getName(), property);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Property implements Serializable {
+
+ public static final long serialVersionUID = 1L;
+ private String name;
+ private String value;
+
+ public Property() {
+ this(null, null);
+ }
+
+ public Property(Property p) {
+ this(p.getName(), p.getValue());
+ }
+
+ public Property(String name) {
+ this(name, null);
+ }
+
+ public Property(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setName(String s) {
+ this.name = s;
+ }
+
+ public void setValue(String s) {
+ this.value = s;
+ }
+
+ @Override
+ public String toString() {
+ return name + " = " + value + "; ";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,422 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.serialization.XMLParser.ElementHandler;
+import com.sun.hotspot.igv.data.serialization.XMLParser.HandoverElementHandler;
+import com.sun.hotspot.igv.data.serialization.XMLParser.ParseMonitor;
+import com.sun.hotspot.igv.data.serialization.XMLParser.TopElementHandler;
+import java.io.IOException;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Parser {
+
+ public static final String INDENT = " ";
+ public static final String TOP_ELEMENT = "graphDocument";
+ public static final String GROUP_ELEMENT = "group";
+ public static final String GRAPH_ELEMENT = "graph";
+ public static final String ROOT_ELEMENT = "graphDocument";
+ public static final String PROPERTIES_ELEMENT = "properties";
+ public static final String EDGES_ELEMENT = "edges";
+ public static final String PROPERTY_ELEMENT = "p";
+ public static final String EDGE_ELEMENT = "edge";
+ public static final String NODE_ELEMENT = "node";
+ public static final String NODES_ELEMENT = "nodes";
+ public static final String REMOVE_EDGE_ELEMENT = "removeEdge";
+ public static final String REMOVE_NODE_ELEMENT = "removeNode";
+ public static final String METHOD_NAME_PROPERTY = "name";
+ public static final String METHOD_IS_PUBLIC_PROPERTY = "public";
+ public static final String METHOD_IS_STATIC_PROPERTY = "static";
+ public static final String TRUE_VALUE = "true";
+ public static final String NODE_NAME_PROPERTY = "name";
+ public static final String EDGE_NAME_PROPERTY = "name";
+ public static final String NODE_ID_PROPERTY = "id";
+ public static final String FROM_PROPERTY = "from";
+ public static final String TO_PROPERTY = "to";
+ public static final String PROPERTY_NAME_PROPERTY = "name";
+ public static final String GRAPH_NAME_PROPERTY = "name";
+ public static final String TO_INDEX_PROPERTY = "index";
+ public static final String METHOD_ELEMENT = "method";
+ public static final String INLINE_ELEMENT = "inline";
+ public static final String BYTECODES_ELEMENT = "bytecodes";
+ public static final String METHOD_BCI_PROPERTY = "bci";
+ public static final String METHOD_SHORT_NAME_PROPERTY = "shortName";
+ public static final String CONTROL_FLOW_ELEMENT = "controlFlow";
+ public static final String BLOCK_NAME_PROPERTY = "name";
+ public static final String BLOCK_ELEMENT = "block";
+ public static final String SUCCESSORS_ELEMENT = "successors";
+ public static final String SUCCESSOR_ELEMENT = "successor";
+ public static final String ASSEMBLY_ELEMENT = "assembly";
+ public static final String DIFFERENCE_PROPERTY = "difference";
+ private TopElementHandler xmlDocument = new TopElementHandler();
+ private boolean difference;
+ private GroupCallback groupCallback;
+ // <graphDocument>
+ private ElementHandler<GraphDocument, Object> topHandler = new ElementHandler<GraphDocument, Object>(TOP_ELEMENT) {
+
+ @Override
+ protected GraphDocument start() throws SAXException {
+ return new GraphDocument();
+ }
+ };
+ // <group>
+ private ElementHandler<Group, GraphDocument> groupHandler = new XMLParser.ElementHandler<Group, GraphDocument>(GROUP_ELEMENT) {
+
+ @Override
+ protected Group start() throws SAXException {
+ Group group = new Group();
+ Parser.this.difference = false;
+ String differenceProperty = this.readAttribute(DIFFERENCE_PROPERTY);
+ if (differenceProperty != null && (differenceProperty.equals("1") || differenceProperty.equals("true"))) {
+ Parser.this.difference = true;
+ }
+
+ ParseMonitor monitor = getMonitor();
+ if (monitor != null) {
+ monitor.setState(group.getName());
+ }
+
+ return group;
+ }
+
+ @Override
+ protected void end(String text) throws SAXException {
+ if (groupCallback == null) {
+ getParentObject().addGroup(getObject());
+ }
+ }
+ };
+ private HandoverElementHandler<Group> assemblyHandler = new XMLParser.HandoverElementHandler<Group>(ASSEMBLY_ELEMENT, true) {
+
+ @Override
+ protected void end(String text) throws SAXException {
+ getParentObject().setAssembly(text);
+ }
+ };
+ // <method>
+ private ElementHandler<InputMethod, Group> methodHandler = new XMLParser.ElementHandler<InputMethod, Group>(METHOD_ELEMENT) {
+
+ @Override
+ protected InputMethod start() throws SAXException {
+
+ InputMethod method = parseMethod(this, getParentObject());
+ getParentObject().setMethod(method);
+ return method;
+ }
+ };
+
+ private InputMethod parseMethod(XMLParser.ElementHandler handler, Group group) throws SAXException {
+ String s = handler.readRequiredAttribute(METHOD_BCI_PROPERTY);
+ int bci = 0;
+ try {
+ bci = Integer.parseInt(s);
+ } catch (NumberFormatException e) {
+ throw new SAXException(e);
+ }
+ InputMethod method = new InputMethod(group, handler.readRequiredAttribute(METHOD_NAME_PROPERTY), handler.readRequiredAttribute(METHOD_SHORT_NAME_PROPERTY), bci);
+ return method;
+ }
+ // <bytecodes>
+ private HandoverElementHandler<InputMethod> bytecodesHandler = new XMLParser.HandoverElementHandler<InputMethod>(BYTECODES_ELEMENT, true) {
+
+ @Override
+ protected void end(String text) throws SAXException {
+ getParentObject().setBytecodes(text);
+ }
+ };
+ // <inlined>
+ private HandoverElementHandler<InputMethod> inlinedHandler = new XMLParser.HandoverElementHandler<InputMethod>(INLINE_ELEMENT);
+ // <inlined><method>
+ private ElementHandler<InputMethod, InputMethod> inlinedMethodHandler = new XMLParser.ElementHandler<InputMethod, InputMethod>(METHOD_ELEMENT) {
+
+ @Override
+ protected InputMethod start() throws SAXException {
+ InputMethod method = parseMethod(this, getParentObject().getGroup());
+ getParentObject().addInlined(method);
+ return method;
+ }
+ };
+ // <graph>
+ private ElementHandler<InputGraph, Group> graphHandler = new XMLParser.ElementHandler<InputGraph, Group>(GRAPH_ELEMENT) {
+
+ private InputGraph graph;
+
+ @Override
+ protected InputGraph start() throws SAXException {
+
+ String name = readAttribute(GRAPH_NAME_PROPERTY);
+ InputGraph previous = getParentObject().getLastAdded();
+ if (!difference) {
+ previous = null;
+ }
+ InputGraph curGraph = new InputGraph(getParentObject(), previous, name);
+ getParentObject().addGraph(curGraph);
+ this.graph = curGraph;
+ return curGraph;
+ }
+
+ @Override
+ protected void end(String text) throws SAXException {
+ graph.resolveBlockLinks();
+ }
+ };
+ // <nodes>
+ private HandoverElementHandler<InputGraph> nodesHandler = new HandoverElementHandler<InputGraph>(NODES_ELEMENT);
+ // <controlFlow>
+ private HandoverElementHandler<InputGraph> controlFlowHandler = new HandoverElementHandler<InputGraph>(CONTROL_FLOW_ELEMENT);
+ // <block>
+ private ElementHandler<InputBlock, InputGraph> blockHandler = new ElementHandler<InputBlock, InputGraph>(BLOCK_ELEMENT) {
+
+ @Override
+ protected InputBlock start() throws SAXException {
+ InputGraph graph = getParentObject();
+ String name = readRequiredAttribute(BLOCK_NAME_PROPERTY);
+ InputBlock b = new InputBlock(getParentObject(), name);
+ graph.addBlock(b);
+ return b;
+ }
+ };
+ // <nodes>
+ private HandoverElementHandler<InputBlock> blockNodesHandler = new HandoverElementHandler<InputBlock>(NODES_ELEMENT);
+ // <node>
+ private ElementHandler<InputBlock, InputBlock> blockNodeHandler = new ElementHandler<InputBlock, InputBlock>(NODE_ELEMENT) {
+
+ @Override
+ protected InputBlock start() throws SAXException {
+ String s = readRequiredAttribute(NODE_ID_PROPERTY);
+
+ int id = 0;
+ try {
+ id = Integer.parseInt(s);
+ } catch (NumberFormatException e) {
+ throw new SAXException(e);
+ }
+ getParentObject().addNode(id);
+ return getParentObject();
+ }
+ };
+ // <successors>
+ private HandoverElementHandler<InputBlock> successorsHandler = new HandoverElementHandler<InputBlock>(SUCCESSORS_ELEMENT);
+ // <successor>
+ private ElementHandler<InputBlock, InputBlock> successorHandler = new ElementHandler<InputBlock, InputBlock>(SUCCESSOR_ELEMENT) {
+
+ @Override
+ protected InputBlock start() throws SAXException {
+ String name = readRequiredAttribute(BLOCK_NAME_PROPERTY);
+ getParentObject().addSuccessor(name);
+ return getParentObject();
+ }
+ };
+ // <node>
+ private ElementHandler<InputNode, InputGraph> nodeHandler = new ElementHandler<InputNode, InputGraph>(NODE_ELEMENT) {
+
+ @Override
+ protected InputNode start() throws SAXException {
+ String s = readRequiredAttribute(NODE_ID_PROPERTY);
+ int id = 0;
+ try {
+ id = Integer.parseInt(s);
+ } catch (NumberFormatException e) {
+ throw new SAXException(e);
+ }
+ InputNode node = new InputNode(id);
+ getParentObject().addNode(node);
+ return node;
+ }
+ };
+ // <removeNode>
+ private ElementHandler<InputNode, InputGraph> removeNodeHandler = new ElementHandler<InputNode, InputGraph>(REMOVE_NODE_ELEMENT) {
+
+ @Override
+ protected InputNode start() throws SAXException {
+ String s = readRequiredAttribute(NODE_ID_PROPERTY);
+ int id = 0;
+ try {
+ id = Integer.parseInt(s);
+ } catch (NumberFormatException e) {
+ throw new SAXException(e);
+ }
+ return getParentObject().removeNode(id);
+ }
+ };
+ // <graph>
+ private HandoverElementHandler<InputGraph> edgesHandler = new HandoverElementHandler<InputGraph>(EDGES_ELEMENT);
+
+ // Local class for edge elements
+ private static class EdgeElementHandler extends ElementHandler<InputEdge, InputGraph> {
+
+ public EdgeElementHandler(String name) {
+ super(name);
+ }
+
+ @Override
+ protected InputEdge start() throws SAXException {
+ int toIndex = 0;
+ int from = -1;
+ int to = -1;
+
+ try {
+ String toIndexString = readAttribute(TO_INDEX_PROPERTY);
+ if (toIndexString != null) {
+ toIndex = Integer.parseInt(toIndexString);
+ }
+
+ from = Integer.parseInt(readRequiredAttribute(FROM_PROPERTY));
+ to = Integer.parseInt(readRequiredAttribute(TO_PROPERTY));
+ } catch (NumberFormatException e) {
+ throw new SAXException(e);
+ }
+
+
+ InputEdge conn = new InputEdge((char) toIndex, from, to);
+ return start(conn);
+ }
+
+ protected InputEdge start(InputEdge conn) throws SAXException {
+ return conn;
+ }
+ }
+ // <edge>
+ private EdgeElementHandler edgeHandler = new EdgeElementHandler(EDGE_ELEMENT) {
+
+ @Override
+ protected InputEdge start(InputEdge conn) throws SAXException {
+ getParentObject().addEdge(conn);
+ return conn;
+ }
+ };
+ // <removeEdge>
+ private EdgeElementHandler removeEdgeHandler = new EdgeElementHandler(REMOVE_EDGE_ELEMENT) {
+
+ @Override
+ protected InputEdge start(InputEdge conn) throws SAXException {
+ getParentObject().removeEdge(conn);
+ return conn;
+ }
+ };
+ // <properties>
+ private HandoverElementHandler<Properties.Provider> propertiesHandler = new HandoverElementHandler<Properties.Provider>(PROPERTIES_ELEMENT);
+ // <properties>
+ private HandoverElementHandler<Group> groupPropertiesHandler = new HandoverElementHandler<Group>(PROPERTIES_ELEMENT) {
+
+ @Override
+ public void end(String text) throws SAXException {
+ if (groupCallback != null) {
+ groupCallback.started(getParentObject());
+ }
+ }
+ };
+ // <property>
+ private ElementHandler<Property, Properties.Provider> propertyHandler = new XMLParser.ElementHandler<Property, Properties.Provider>(PROPERTY_ELEMENT, true) {
+
+ @Override
+ public Property start() throws SAXException {
+ String value = "";
+ String name = readRequiredAttribute(PROPERTY_NAME_PROPERTY).intern();
+ return getParentObject().getProperties().setProperty(name, value);
+ }
+
+ @Override
+ public void end(String text) {
+ getObject().setValue(text.trim().intern());
+ }
+ };
+
+ public Parser() {
+ this(null);
+ }
+
+ public Parser(GroupCallback groupCallback) {
+
+ this.groupCallback = groupCallback;
+
+ // Initialize dependencies
+ xmlDocument.addChild(topHandler);
+ topHandler.addChild(groupHandler);
+
+ groupHandler.addChild(methodHandler);
+ groupHandler.addChild(assemblyHandler);
+ groupHandler.addChild(graphHandler);
+
+ methodHandler.addChild(inlinedHandler);
+ methodHandler.addChild(bytecodesHandler);
+
+ inlinedHandler.addChild(inlinedMethodHandler);
+ inlinedMethodHandler.addChild(bytecodesHandler);
+ inlinedMethodHandler.addChild(inlinedHandler);
+
+ graphHandler.addChild(nodesHandler);
+ graphHandler.addChild(edgesHandler);
+ graphHandler.addChild(controlFlowHandler);
+
+ controlFlowHandler.addChild(blockHandler);
+
+ blockHandler.addChild(successorsHandler);
+ successorsHandler.addChild(successorHandler);
+ blockHandler.addChild(blockNodesHandler);
+ blockNodesHandler.addChild(blockNodeHandler);
+
+ nodesHandler.addChild(nodeHandler);
+ nodesHandler.addChild(removeNodeHandler);
+ edgesHandler.addChild(edgeHandler);
+ edgesHandler.addChild(removeEdgeHandler);
+
+ methodHandler.addChild(propertiesHandler);
+ inlinedMethodHandler.addChild(propertiesHandler);
+ topHandler.addChild(propertiesHandler);
+ groupHandler.addChild(groupPropertiesHandler);
+ graphHandler.addChild(propertiesHandler);
+ nodeHandler.addChild(propertiesHandler);
+ propertiesHandler.addChild(propertyHandler);
+ groupPropertiesHandler.addChild(propertyHandler);
+ }
+
+ // Returns a new GraphDocument object deserialized from an XML input source.
+ public GraphDocument parse(XMLReader reader, InputSource source, XMLParser.ParseMonitor monitor) throws SAXException {
+ reader.setContentHandler(new XMLParser(xmlDocument, monitor));
+ try {
+ reader.parse(source);
+ } catch (IOException ex) {
+ throw new SAXException(ex);
+ }
+
+ return topHandler.getObject();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,217 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Printer {
+
+ public void export(Writer writer, GraphDocument document) {
+
+ XMLWriter xmlWriter = new XMLWriter(writer);
+
+ try {
+ export(xmlWriter, document);
+ } catch (IOException ex) {
+ }
+ }
+
+ private void export(XMLWriter xmlWriter, GraphDocument document) throws IOException {
+ xmlWriter.startTag(Parser.ROOT_ELEMENT);
+ xmlWriter.writeProperties(document.getProperties());
+ for (Group g : document.getGroups()) {
+ export(xmlWriter, g);
+ }
+
+ xmlWriter.endTag();
+ xmlWriter.flush();
+ }
+
+ private void export(XMLWriter writer, Group g) throws IOException {
+ Properties attributes = new Properties();
+ attributes.add(new Property("difference", Boolean.toString(true)));
+ writer.startTag(Parser.GROUP_ELEMENT, attributes);
+ writer.writeProperties(g.getProperties());
+
+ if (g.getMethod() != null) {
+ export(writer, g.getMethod());
+ }
+
+ InputGraph previous = null;
+ for (InputGraph graph : g.getGraphs()) {
+ export(writer, graph, previous, true);
+ previous = graph;
+ }
+
+ writer.endTag();
+ }
+
+ public void export(XMLWriter writer, InputGraph graph, InputGraph previous, boolean difference) throws IOException {
+
+ writer.startTag(Parser.GRAPH_ELEMENT);
+ writer.writeProperties(graph.getProperties());
+ writer.startTag(Parser.NODES_ELEMENT);
+
+ Set<InputNode> removed = new HashSet<InputNode>();
+ Set<InputNode> equal = new HashSet<InputNode>();
+
+ if (previous != null) {
+ for (InputNode n : previous.getNodes()) {
+ int id = n.getId();
+ InputNode n2 = graph.getNode(id);
+ if (n2 == null) {
+ removed.add(n);
+ } else if (n.equals(n2)) {
+ equal.add(n);
+ }
+ }
+ }
+
+ if (difference) {
+ for (InputNode n : removed) {
+ writer.simpleTag(Parser.REMOVE_NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId())));
+ }
+ }
+
+ for (InputNode n : graph.getNodes()) {
+ if (!difference || !equal.contains(n)) {
+ writer.startTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId())));
+ writer.writeProperties(n.getProperties());
+ writer.endTag();
+ }
+ }
+
+ writer.endTag();
+
+ writer.startTag(Parser.EDGES_ELEMENT);
+ Set<InputEdge> removedEdges = new HashSet<InputEdge>();
+ Set<InputEdge> equalEdges = new HashSet<InputEdge>();
+
+ if (previous != null) {
+ for (InputEdge e : previous.getEdges()) {
+ if (graph.getEdges().contains(e)) {
+ equalEdges.add(e);
+ } else {
+ removedEdges.add(e);
+ }
+ }
+ }
+
+ if (difference) {
+ for (InputEdge e : removedEdges) {
+ writer.simpleTag(Parser.REMOVE_EDGE_ELEMENT, createProperties(e));
+ }
+ }
+
+ for (InputEdge e : graph.getEdges()) {
+ if (!difference || !equalEdges.contains(e)) {
+ if (!equalEdges.contains(e)) {
+ writer.simpleTag(Parser.EDGE_ELEMENT, createProperties(e));
+ }
+ }
+ }
+
+ writer.endTag();
+
+ writer.startTag(Parser.CONTROL_FLOW_ELEMENT);
+ for (InputBlock b : graph.getBlocks()) {
+
+ writer.startTag(Parser.BLOCK_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, b.getName()));
+
+ writer.startTag(Parser.SUCCESSORS_ELEMENT);
+ for (InputBlock s : b.getSuccessors()) {
+ writer.simpleTag(Parser.SUCCESSOR_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, s.getName()));
+ }
+ writer.endTag();
+
+ writer.startTag(Parser.NODES_ELEMENT);
+ for (InputNode n : b.getNodes()) {
+ writer.simpleTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, n.getId() + ""));
+ }
+ writer.endTag();
+
+ writer.endTag();
+
+ }
+
+ writer.endTag();
+ writer.endTag();
+ }
+
+ private void export(XMLWriter w, InputMethod method) throws IOException {
+
+ w.startTag(Parser.METHOD_ELEMENT, new Properties(Parser.METHOD_BCI_PROPERTY, method.getBci() + "", Parser.METHOD_NAME_PROPERTY, method.getName(), Parser.METHOD_SHORT_NAME_PROPERTY, method.getShortName()));
+
+ w.writeProperties(method.getProperties());
+
+ if (method.getInlined().size() > 0) {
+ w.startTag(Parser.INLINE_ELEMENT);
+ for (InputMethod m : method.getInlined()) {
+ export(w, m);
+ }
+ w.endTag();
+ }
+
+ w.startTag(Parser.BYTECODES_ELEMENT);
+
+ StringBuilder b = new StringBuilder();
+ b.append("<![CDATA[\n");
+ for (InputBytecode code : method.getBytecodes()) {
+ b.append(code.getBci());
+ b.append(" ");
+ b.append(code.getName());
+ b.append("\n");
+
+ }
+ b.append("]]>");
+ w.write(b.toString());
+ w.endTag();
+ w.endTag();
+ }
+
+ private Properties createProperties(InputEdge edge) {
+ Properties p = new Properties();
+ p.setProperty(Parser.TO_INDEX_PROPERTY, Integer.toString(edge.getToIndex()));
+ p.setProperty(Parser.TO_PROPERTY, Integer.toString(edge.getTo()));
+ p.setProperty(Parser.FROM_PROPERTY, Integer.toString(edge.getFrom()));
+ return p;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,254 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.Property;
+import com.sun.hotspot.igv.data.Properties;
+import java.util.Hashtable;
+import java.util.Stack;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class XMLParser implements ContentHandler {
+
+ public static interface ParseMonitor {
+
+ public void setProgress(double d);
+
+ public void setState(String state);
+ }
+
+ public static class MissingAttributeException extends SAXException {
+
+ private String name;
+
+ public MissingAttributeException(String name) {
+ super("Missing attribute \"" + name + "\"");
+ this.name = name;
+ }
+
+ public String getAttributeName() {
+ return this.getMessage();
+ }
+ }
+
+ public static class HandoverElementHandler<P> extends ElementHandler<P, P> {
+
+ @Override
+ protected P start() throws SAXException {
+ return getParentObject();
+ }
+
+ public HandoverElementHandler(String name) {
+ super(name);
+ }
+
+ public HandoverElementHandler(String name, boolean needsText) {
+ super(name, needsText);
+ }
+ }
+
+ public static class TopElementHandler<P> extends ElementHandler<P, Object> {
+
+ public TopElementHandler() {
+ super(null);
+ }
+ }
+
+ public static class ElementHandler<T, P> {
+
+ private String name;
+ private T object;
+ private Attributes attr;
+ private StringBuilder currentText;
+ private ParseMonitor monitor;
+ private Hashtable<String, ElementHandler<?, ? super T>> hashtable;
+ private boolean needsText;
+ private ElementHandler<P, ?> parentElement;
+
+ public ElementHandler(String name) {
+ this(name, false);
+ }
+
+ public ElementHandler<P, ?> getParentElement() {
+ return parentElement;
+ }
+
+ public P getParentObject() {
+ return getParentElement().getObject();
+ }
+
+ protected boolean needsText() {
+ return needsText;
+ }
+
+ public ElementHandler(String name, boolean needsText) {
+ this.hashtable = new Hashtable<String, ElementHandler<?, ? super T>>();
+ this.name = name;
+ this.needsText = needsText;
+ }
+
+ public ParseMonitor getMonitor() {
+ return monitor;
+ }
+
+ public ElementHandler<?, ? super T> getChild(String name) {
+ return hashtable.get(name);
+ }
+
+ public void addChild(ElementHandler<?, ? super T> handler) {
+ assert handler != null;
+ hashtable.put(handler.getName(), handler);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public T getObject() {
+ return object;
+ }
+
+ public String readAttribute(String name) {
+ return attr.getValue(name);
+ }
+
+ public String readRequiredAttribute(String name) throws SAXException {
+ String s = readAttribute(name);
+ if (s == null) {
+ throw new MissingAttributeException(name);
+ }
+ return s;
+ }
+
+ public void processAttributesAsProperties(Properties p) {
+ int length = attr.getLength();
+ for (int i = 0; i < length; i++) {
+ String val = attr.getValue(i).intern();
+ String localName = attr.getLocalName(i).intern();
+ p.add(new Property(val, localName));
+ }
+ }
+
+ public void startElement(ElementHandler<P, ?> parentElement, Attributes attr, ParseMonitor monitor) throws SAXException {
+ this.currentText = new StringBuilder();
+ this.attr = attr;
+ this.monitor = monitor;
+ this.parentElement = parentElement;
+ object = start();
+ }
+
+ protected T start() throws SAXException {
+ return null;
+ }
+
+ protected void end(String text) throws SAXException {
+
+ }
+
+ public void endElement() throws SAXException {
+ end(currentText.toString());
+ }
+
+ protected void text(char[] c, int start, int length) {
+ assert currentText != null;
+ currentText.append(c, start, length);
+ }
+ }
+ private Stack<ElementHandler> stack;
+ private ParseMonitor monitor;
+
+ public XMLParser(TopElementHandler rootHandler, ParseMonitor monitor) {
+ this.stack = new Stack<ElementHandler>();
+ this.monitor = monitor;
+ this.stack.push(rootHandler);
+ }
+
+ public void setDocumentLocator(Locator locator) {
+ if (monitor != null) {
+ monitor.setState("Starting parsing");
+ }
+ }
+
+ public void startDocument() throws SAXException {
+ }
+
+ public void endDocument() throws SAXException {
+ }
+
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
+ }
+
+ public void endPrefixMapping(String prefix) throws SAXException {
+ }
+
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+
+ assert !stack.isEmpty();
+ ElementHandler parent = stack.peek();
+ if (parent != null) {
+ ElementHandler child = parent.getChild(qName);
+ if (child != null) {
+ child.startElement(parent, atts, monitor);
+ stack.push(child);
+ return;
+ }
+ }
+
+ stack.push(null);
+ }
+
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ ElementHandler handler = stack.pop();
+ if (handler != null) {
+ handler.endElement();
+ }
+ }
+
+ public void characters(char[] ch, int start, int length) throws SAXException {
+
+ assert !stack.isEmpty();
+
+
+ ElementHandler top = stack.peek();
+ if (top != null && top.needsText()) {
+ top.text(ch, start, length);
+ }
+ }
+
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+ }
+
+ public void processingInstruction(String target, String data) throws SAXException {
+ }
+
+ public void skippedEntity(String name) throws SAXException {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,128 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Stack;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class XMLWriter extends Writer {
+
+ private Writer inner;
+ private Stack<String> elementStack;
+
+ public XMLWriter(Writer inner) {
+ this.inner = inner;
+ elementStack = new Stack<String>();
+ }
+
+ @Override
+ public void write(char[] arr) throws IOException {
+ write(arr, 0, arr.length);
+ }
+
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ for (int i = off; i < off + len; i++) {
+ char c = cbuf[i];
+ if (c == '>') {
+ inner.write(">");
+ } else if (c == '<') {
+ inner.write("<");
+ } else if (c == '&') {
+ inner.write("&");
+ } else {
+ inner.write(c);
+ }
+ }
+ }
+
+ public void flush() throws IOException {
+ inner.flush();
+ }
+
+ public void close() throws IOException {
+ inner.close();
+ }
+
+ public void endTag() throws IOException {
+ inner.write("</" + elementStack.pop() + ">\n");
+ }
+
+ public void startTag(String name) throws IOException {
+ inner.write("<" + name + ">\n");
+ elementStack.push(name);
+ }
+
+ public void simpleTag(String name) throws IOException {
+ inner.write("<" + name + "/>\n");
+ }
+
+ public void startTag(String name, Properties attributes) throws IOException {
+ inner.write("<" + name);
+ elementStack.push(name);
+
+ for (Property p : attributes.getProperties()) {
+ inner.write(" " + p.getName() + "=\"");
+ write(p.getValue().toCharArray());
+ inner.write("\"");
+ }
+
+ inner.write(">\n");
+ }
+
+ public void simpleTag(String name, Properties attributes) throws IOException {
+ inner.write("<" + name);
+
+ for (Property p : attributes.getProperties()) {
+ inner.write(" " + p.getName() + "=\"");
+ write(p.getValue().toCharArray());
+ inner.write("\"");
+ }
+
+ inner.write("/>\n");
+ }
+
+ public void writeProperties(Properties props) throws IOException {
+ if (props.getProperties().size() == 0) {
+ return;
+ }
+
+ startTag(Parser.PROPERTIES_ELEMENT);
+
+ for (Property p : props.getProperties()) {
+ startTag(Parser.PROPERTY_ELEMENT, new Properties(Parser.PROPERTY_NAME_PROPERTY, p.getName()));
+ this.write(p.getValue().toCharArray());
+ endTag();
+ }
+
+ endTag();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputGraph;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GraphViewer {
+
+ public void view(InputGraph graph);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.Group;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupCallback {
+
+ public void started(Group g);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupOrganizer {
+
+ public String getName();
+
+ public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import java.awt.Component;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupReceiver {
+
+ public Component init(GroupCallback callback);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface InputGraphProvider {
+
+ InputGraph getGraph();
+
+ void setSelectedNodes(Set<InputNode> nodes);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputGraph;
+import java.util.Collection;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Scheduler {
+
+ public Collection<InputBlock> schedule(InputGraph graph);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.difference" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.difference.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.difference
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/difference/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.difference-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=1657ecfe
+build.xml.script.CRC32=03909051
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=1657ecfe
+nbproject/build-impl.xml.script.CRC32=2208e770
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.difference</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Difference
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,320 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.difference;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Property;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Difference {
+
+ public static final String PROPERTY_STATE = "state";
+ public static final String VALUE_NEW = "new";
+ public static final String VALUE_CHANGED = "changed";
+ public static final String VALUE_SAME = "same";
+ public static final String VALUE_DELETED = "deleted";
+ public static final String OLD_PREFIX = "OLD_";
+ public static final String MAIN_PROPERTY = "name";
+ public static final double LIMIT = 100.0;
+ public static final String[] IGNORE_PROPERTIES = new String[]{"idx", "debug_idx"};
+
+ public static InputGraph createDiffGraph(InputGraph a, InputGraph b) {
+ if (a.getGroup() == b.getGroup()) {
+ return createDiffSameGroup(a, b);
+ } else {
+ return createDiff(a, b);
+ }
+ }
+
+ private static InputGraph createDiffSameGroup(InputGraph a, InputGraph b) {
+ Map<Integer, InputNode> keyMapB = new HashMap<Integer, InputNode>();
+ for (InputNode n : b.getNodes()) {
+ Integer key = n.getId();
+ assert !keyMapB.containsKey(key);
+ keyMapB.put(key, n);
+ }
+
+ Set<Pair> pairs = new HashSet<Pair>();
+
+ for (InputNode n : a.getNodes()) {
+ Integer key = n.getId();
+
+
+ if (keyMapB.containsKey(key)) {
+ InputNode nB = keyMapB.get(key);
+ pairs.add(new Pair(n, nB));
+ }
+ }
+
+ return createDiff(a, b, pairs);
+ }
+
+ private static InputGraph createDiff(InputGraph a, InputGraph b, Set<Pair> pairs) {
+ Group g = new Group();
+ g.setMethod(a.getGroup().getMethod());
+ g.setAssembly(a.getGroup().getAssembly());
+ g.getProperties().setProperty("name", "Difference");
+ InputGraph graph = new InputGraph(g, null);
+ graph.setName(a.getName() + ", " + b.getName());
+ graph.setIsDifferenceGraph(true);
+
+ Set<InputNode> nodesA = new HashSet<InputNode>(a.getNodes());
+ Set<InputNode> nodesB = new HashSet<InputNode>(b.getNodes());
+
+ Map<InputNode, InputNode> inputNodeMap = new HashMap<InputNode, InputNode>();
+ for (Pair p : pairs) {
+ InputNode n = p.getN1();
+ assert nodesA.contains(n);
+ InputNode nB = p.getN2();
+ assert nodesB.contains(nB);
+
+ nodesA.remove(n);
+ nodesB.remove(nB);
+ InputNode n2 = new InputNode(n);
+ inputNodeMap.put(n, n2);
+ inputNodeMap.put(nB, n2);
+ graph.addNode(n2);
+ markAsChanged(n2, n, nB);
+ }
+
+ for (InputNode n : nodesA) {
+ InputNode n2 = new InputNode(n);
+ graph.addNode(n2);
+ markAsNew(n2);
+ inputNodeMap.put(n, n2);
+ }
+
+ for (InputNode n : nodesB) {
+ InputNode n2 = new InputNode(n);
+ n2.setId(-n2.getId());
+ graph.addNode(n2);
+ markAsDeleted(n2);
+ inputNodeMap.put(n, n2);
+ }
+
+ Set<InputEdge> edgesA = a.getEdges();
+ Set<InputEdge> edgesB = b.getEdges();
+
+ Set<InputEdge> newEdges = new HashSet<InputEdge>();
+
+ for (InputEdge e : edgesA) {
+ int from = e.getFrom();
+ int to = e.getTo();
+ InputNode nodeFrom = inputNodeMap.get(a.getNode(from));
+ InputNode nodeTo = inputNodeMap.get(a.getNode(to));
+ char index = e.getToIndex();
+
+ InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
+ if (!newEdges.contains(newEdge)) {
+ markAsNew(newEdge);
+ newEdges.add(newEdge);
+ graph.addEdge(newEdge);
+ }
+ }
+
+ for (InputEdge e : edgesB) {
+ int from = e.getFrom();
+ int to = e.getTo();
+ InputNode nodeFrom = inputNodeMap.get(b.getNode(from));
+ InputNode nodeTo = inputNodeMap.get(b.getNode(to));
+ char index = e.getToIndex();
+
+ InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
+ if (!newEdges.contains(newEdge)) {
+ markAsDeleted(newEdge);
+ newEdges.add(newEdge);
+ graph.addEdge(newEdge);
+ } else {
+ newEdges.remove(newEdge);
+ graph.removeEdge(newEdge);
+ markAsSame(newEdge);
+ newEdges.add(newEdge);
+ graph.addEdge(newEdge);
+ }
+ }
+
+ g.addGraph(graph);
+ return graph;
+ }
+
+ private static class Pair {
+
+ private InputNode n1;
+ private InputNode n2;
+
+ public Pair(InputNode n1, InputNode n2) {
+ this.n1 = n1;
+ this.n2 = n2;
+ }
+
+ public double getValue() {
+
+ double result = 0.0;
+ for (Property p : n1.getProperties().getProperties()) {
+ double faktor = 1.0;
+ for (String forbidden : IGNORE_PROPERTIES) {
+ if (p.getName().equals(forbidden)) {
+ faktor = 0.1;
+ break;
+ }
+ }
+ String p2 = n2.getProperties().get(p.getName());
+ result += evaluate(p.getValue(), p2) * faktor;
+ }
+
+ return result;
+ }
+
+ private double evaluate(String p, String p2) {
+ if (p2 == null) {
+ return 1.0;
+ }
+ if (p.equals(p2)) {
+ return 0.0;
+ } else {
+ return (double) (Math.abs(p.length() - p2.length())) / p.length() + 0.5;
+ }
+ }
+
+ public InputNode getN1() {
+ return n1;
+ }
+
+ public InputNode getN2() {
+ return n2;
+ }
+ }
+
+ private static InputGraph createDiff(InputGraph a, InputGraph b) {
+
+ Set<InputNode> matched = new HashSet<InputNode>();
+
+ Set<Pair> pairs = new HashSet<Pair>();
+ for (InputNode n : a.getNodes()) {
+ String s = n.getProperties().get(MAIN_PROPERTY);
+ if (s == null) {
+ s = "";
+ }
+ for (InputNode n2 : b.getNodes()) {
+ String s2 = n2.getProperties().get(MAIN_PROPERTY);
+ if (s2 == null) {
+ s2 = "";
+ }
+
+ if (s.equals(s2)) {
+ Pair p = new Pair(n, n2);
+ pairs.add(p);
+ }
+ }
+ }
+
+ Set<Pair> selectedPairs = new HashSet<Pair>();
+ while (pairs.size() > 0) {
+
+ double min = Double.MAX_VALUE;
+ Pair minPair = null;
+ for (Pair p : pairs) {
+ double cur = p.getValue();
+ if (cur < min) {
+ minPair = p;
+ min = cur;
+ }
+ }
+
+ if (min > LIMIT) {
+ break;
+ } else {
+ selectedPairs.add(minPair);
+
+ Set<Pair> toRemove = new HashSet<Pair>();
+ for (Pair p : pairs) {
+ if (p.getN1() == minPair.getN1() || p.getN2() == minPair.getN2()) {
+ toRemove.add(p);
+ }
+ }
+ pairs.removeAll(toRemove);
+ }
+ }
+
+ return createDiff(a, b, selectedPairs);
+ }
+
+ private static void markAsNew(InputEdge e) {
+ e.setState(InputEdge.State.NEW);
+ }
+
+ private static void markAsDeleted(InputEdge e) {
+ e.setState(InputEdge.State.DELETED);
+
+ }
+
+ private static void markAsSame(InputEdge e) {
+ e.setState(InputEdge.State.SAME);
+ }
+
+ private static void markAsChanged(InputNode n, InputNode firstNode, InputNode otherNode) {
+
+ boolean difference = false;
+ for (Property p : otherNode.getProperties().getProperties()) {
+ String s = firstNode.getProperties().getProperty(p.getName());
+ if (!p.getValue().equals(s)) {
+ difference = true;
+ n.getProperties().add(new Property(OLD_PREFIX + p.getName(), p.getValue()));
+ }
+ }
+
+ for (Property p : firstNode.getProperties().getProperties()) {
+ String s = otherNode.getProperties().getProperty(p.getName());
+ if (s == null && p.getValue().length() > 0) {
+ difference = true;
+ n.getProperties().add(new Property(OLD_PREFIX + p.getName(), ""));
+ }
+ }
+
+ if (difference) {
+ n.getProperties().add(new Property(PROPERTY_STATE, VALUE_CHANGED));
+ } else {
+ n.getProperties().add(new Property(PROPERTY_STATE, VALUE_SAME));
+ }
+ }
+
+ private static void markAsDeleted(InputNode n) {
+ n.getProperties().add(new Property(PROPERTY_STATE, VALUE_DELETED));
+ }
+
+ private static void markAsNew(InputNode n) {
+ n.getProperties().add(new Property(PROPERTY_STATE, VALUE_NEW));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.filter" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.filter.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.filter
+OpenIDE-Module-Layer: com/sun/hotspot/igv/filter/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filter/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.filter-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=7c032ebf
+build.xml.script.CRC32=3b022a25
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=7c032ebf
+nbproject/build-impl.xml.script.CRC32=26513f91
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.jdesktop.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.4.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.dialogs</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.5.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.filesystems</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.3</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.nodes</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.2.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.9.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.windows</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.16</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.filter</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.filter.JavaSE6ScriptEngine
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.Properties;
+import org.openide.cookies.OpenCookie;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class AbstractFilter implements Filter {
+
+ private ChangedEvent<Filter> changedEvent;
+ private Properties properties;
+
+ public AbstractFilter() {
+ changedEvent = new ChangedEvent<Filter>(this);
+ properties = new Properties();
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+
+ public OpenCookie getEditor() {
+ return null;
+ }
+
+ public ChangedEvent<Filter> getChangedEvent() {
+ return changedEvent;
+ }
+
+ protected void fireChangedEvent() {
+ changedEvent.fire();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,11 @@
+OpenIDE-Module-Name=Filter
+
+jLabel1.text=Name\:
+jLabel2.text=Source\:
+
+nameTextField.text=
+
+jButton1.text=OK
+jButton2.text=Cancel
+
+title=Edit Filter Dialog
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,138 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Connection.ConnectionStyle;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ColorFilter extends AbstractFilter {
+
+ private List<ColorRule> colorRules;
+ private String name;
+
+ public ColorFilter(String name) {
+ this.name = name;
+ colorRules = new ArrayList<ColorRule>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void apply(Diagram diagram) {
+
+ Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+ for (ColorRule rule : colorRules) {
+ if (rule.getSelector() != null) {
+ List<Figure> figures = rule.getSelector().selected(diagram);
+ for (Figure f : figures) {
+ applyRule(rule, f);
+ if (rule.getColor() != null) {
+ f.setColor(rule.getColor());
+ }
+ }
+ } else {
+ for (Figure f : diagram.getFigures()) {
+ applyRule(rule, f);
+ }
+ }
+ }
+ }
+
+ private void applyRule(ColorRule rule, Figure f) {
+ if (rule.getColor() != null) {
+ f.setColor(rule.getColor());
+ }
+ Color color = rule.getLineColor();
+ ConnectionStyle style = rule.getLineStyle();
+
+ for (OutputSlot s : f.getOutputSlots()) {
+ for (Connection c : s.getConnections()) {
+ if (color != null) {
+ c.setColor(color);
+ }
+
+ if (style != null) {
+ c.setStyle(style);
+ }
+ }
+ }
+ }
+
+ public void addRule(ColorRule r) {
+ colorRules.add(r);
+ }
+
+ public static class ColorRule {
+
+ private Color color;
+ private Color lineColor;
+ private Connection.ConnectionStyle lineStyle;
+ private Selector selector;
+
+ public ColorRule(Selector selector, Color c) {
+ this(selector, c, null, null);
+ }
+
+ public ColorRule(Selector selector, Color c, Color lineColor, Connection.ConnectionStyle lineStyle) {
+ this.selector = selector;
+ this.color = c;
+ this.lineColor = lineColor;
+ this.lineStyle = lineStyle;
+
+ }
+
+ public ColorRule(Color c) {
+ this(null, c);
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public Selector getSelector() {
+ return selector;
+ }
+
+ public Color getLineColor() {
+ return lineColor;
+ }
+
+ public Connection.ConnectionStyle getLineStyle() {
+ return lineStyle;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,194 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CombineFilter extends AbstractFilter {
+
+ private List<CombineRule> rules;
+ private String name;
+
+ public CombineFilter(String name) {
+ this.name = name;
+ rules = new ArrayList<CombineRule>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void apply(Diagram diagram) {
+
+ Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+ for (CombineRule r : rules) {
+
+ List<Figure> list = selector.selectMultiple(r.getFirstMatcher());
+ Set<Figure> figuresToRemove = new HashSet<Figure>();
+ for (Figure f : list) {
+
+ List<Figure> successors = new ArrayList<Figure>(f.getSuccessors());
+ if (r.isReversed()) {
+ if (successors.size() == 1) {
+ Figure succ = successors.get(0);
+ InputSlot slot = null;
+
+ for (InputSlot s : succ.getInputSlots()) {
+ for (Connection c : s.getConnections()) {
+ if (c.getOutputSlot().getFigure() == f) {
+ slot = s;
+ }
+ }
+ }
+
+ assert slot != null;
+ slot.setName(f.getProperties().get("dump_spec"));
+ if (f.getProperties().get("short_name") != null) {
+ slot.setShortName(f.getProperties().get("short_name"));
+ } else {
+ String s = f.getProperties().get("dump_spec");
+ if (s != null && s.length() <= 5) {
+ slot.setShortName(s);
+ }
+
+ }
+
+ for (InputSlot s : f.getInputSlots()) {
+ for (Connection c : s.getConnections()) {
+ Connection newConn = diagram.createConnection(slot, c.getOutputSlot());
+ newConn.setColor(c.getColor());
+ newConn.setStyle(c.getStyle());
+ }
+ }
+
+ figuresToRemove.add(f);
+ }
+ } else {
+
+ for (Figure succ : successors) {
+ if (succ.getPredecessors().size() == 1) {
+ if (succ.getProperties().selectSingle(r.getSecondMatcher()) != null && succ.getOutputSlots().size() == 1) {
+
+
+ OutputSlot oldSlot = null;
+ for (OutputSlot s : f.getOutputSlots()) {
+ for (Connection c : s.getConnections()) {
+ if (c.getInputSlot().getFigure() == succ) {
+ oldSlot = s;
+ }
+ }
+ }
+
+ assert oldSlot != null;
+
+ OutputSlot nextSlot = succ.getOutputSlots().get(0);
+ int pos = 0;
+ if (succ.getProperties().get("con") != null) {
+ pos = Integer.parseInt(succ.getProperties().get("con"));
+ }
+ OutputSlot slot = f.createOutputSlot(pos);
+ slot.setName(succ.getProperties().get("dump_spec"));
+ if (succ.getProperties().get("short_name") != null) {
+ slot.setShortName(succ.getProperties().get("short_name"));
+ } else {
+ String s = succ.getProperties().get("dump_spec");
+ if (s != null && s.length() <= 2) {
+ slot.setShortName(s);
+ } else {
+ String tmpName = succ.getProperties().get("name");
+ if (tmpName != null && tmpName.length() > 0) {
+ slot.setShortName(tmpName.substring(0, 1));
+ }
+ }
+ }
+ for (Connection c : nextSlot.getConnections()) {
+ Connection newConn = diagram.createConnection(c.getInputSlot(), slot);
+ newConn.setColor(c.getColor());
+ newConn.setStyle(c.getStyle());
+ }
+
+
+ figuresToRemove.add(succ);
+
+ if (oldSlot.getConnections().size() == 0) {
+ f.removeSlot(oldSlot);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ diagram.removeAllFigures(figuresToRemove);
+ }
+ }
+
+ public void addRule(CombineRule combineRule) {
+ rules.add(combineRule);
+ }
+
+ public static class CombineRule {
+
+ private PropertyMatcher first;
+ private PropertyMatcher second;
+ private boolean reversed;
+
+ public CombineRule(PropertyMatcher first, PropertyMatcher second) {
+ this(first, second, false);
+
+ }
+
+ public CombineRule(PropertyMatcher first, PropertyMatcher second, boolean reversed) {
+ this.first = first;
+ this.second = second;
+ this.reversed = reversed;
+ }
+
+ public boolean isReversed() {
+ return reversed;
+ }
+
+ public PropertyMatcher getFirstMatcher() {
+ return first;
+ }
+
+ public PropertyMatcher getSecondMatcher() {
+ return second;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,106 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ConnectionFilter extends AbstractFilter {
+
+ private List<ConnectionStyleRule> connectionStyleRules;
+ private String name;
+
+ public ConnectionFilter(String name) {
+ this.name = name;
+ connectionStyleRules = new ArrayList<ConnectionStyleRule>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void apply(Diagram diagram) {
+
+ Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+ for (ConnectionStyleRule rule : connectionStyleRules) {
+ List<Figure> figures = null;
+ if (rule.getSelector() != null) {
+ figures = rule.getSelector().selected(diagram);
+ } else {
+ figures = diagram.getFigures();
+ }
+
+ for (Figure f : figures) {
+ for (OutputSlot os : f.getOutputSlots()) {
+ for (Connection c : os.getConnections()) {
+ if (figures.contains(c.getInputSlot().getFigure())) {
+ c.setStyle(rule.getLineStyle());
+ c.setColor(rule.getLineColor());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void addRule(ConnectionStyleRule r) {
+ connectionStyleRules.add(r);
+ }
+
+ public static class ConnectionStyleRule {
+
+ private Color lineColor;
+ private Connection.ConnectionStyle lineStyle;
+ private Selector selector;
+
+ public ConnectionStyleRule(Selector selector, Color lineColor, Connection.ConnectionStyle lineStyle) {
+ this.selector = selector;
+ this.lineColor = lineColor;
+ this.lineStyle = lineStyle;
+ }
+
+ public Selector getSelector() {
+ return selector;
+ }
+
+ public Color getLineColor() {
+ return lineColor;
+ }
+
+ public Connection.ConnectionStyle getLineStyle() {
+ return lineStyle;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,159 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.Property;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.cookies.OpenCookie;
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.FileObject;
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CustomFilter extends AbstractFilter {
+
+ public static final String JAVASCRIPT_HELPER_ID = "JavaScriptHelper";
+ private static ScriptEngineAbstraction engine;
+ private String code;
+ private String name;
+
+ public CustomFilter(String name, String code) {
+ this.name = name;
+ this.code = code;
+ getProperties().add(new Property("name", name));
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setName(String s) {
+ name = s;
+ fireChangedEvent();
+ }
+
+ public void setCode(String s) {
+ code = s;
+ fireChangedEvent();
+ }
+
+ @Override
+ public OpenCookie getEditor() {
+ return new OpenCookie() {
+
+ public void open() {
+ openInEditor();
+ }
+ };
+ }
+
+ public boolean openInEditor() {
+ EditFilterDialog dialog = new EditFilterDialog(CustomFilter.this);
+ dialog.setVisible(true);
+ return dialog.wasAccepted();
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+
+ public static ScriptEngineAbstraction getEngine() {
+ if (engine == null) {
+
+ ScriptEngineAbstraction chosen = null;
+ try {
+ Collection<? extends ScriptEngineAbstraction> list = Lookup.getDefault().lookupAll(ScriptEngineAbstraction.class);
+ for (ScriptEngineAbstraction s : list) {
+ if (s.initialize(getJsHelperText())) {
+ if (chosen == null || !(chosen instanceof JavaSE6ScriptEngine)) {
+ chosen = s;
+ }
+ }
+ }
+ } catch (NoClassDefFoundError ncdfe) {
+ Logger.getLogger("global").log(Level.SEVERE, null, ncdfe);
+ }
+
+ if (chosen == null) {
+ NotifyDescriptor message = new NotifyDescriptor.Message("Could not find a scripting engine. Please make sure that the Rhino scripting engine is available. Otherwise filter cannot be used.", NotifyDescriptor.ERROR_MESSAGE);
+ DialogDisplayer.getDefault().notifyLater(message);
+ chosen = new NullScriptEngine();
+ }
+
+ engine = chosen;
+ }
+
+ return engine;
+ }
+
+ private static String getJsHelperText() {
+ InputStream is = null;
+ StringBuilder sb = new StringBuilder("importPackage(Packages.com.sun.hotspot.igv.filter);importPackage(Packages.com.sun.hotspot.igv.graph);importPackage(Packages.com.sun.hotspot.igv.data);importPackage(Packages.com.sun.hotspot.igv.util);importPackage(java.awt);");
+ try {
+ FileSystem fs = Repository.getDefault().getDefaultFileSystem();
+ FileObject fo = fs.getRoot().getFileObject(JAVASCRIPT_HELPER_ID);
+ is = fo.getInputStream();
+ BufferedReader r = new BufferedReader(new InputStreamReader(is));
+ String s;
+ while ((s = r.readLine()) != null) {
+ sb.append(s);
+ sb.append("\n");
+ }
+
+ } catch (IOException ex) {
+ Logger.getLogger("global").log(Level.SEVERE, null, ex);
+ } finally {
+ try {
+ is.close();
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+ return sb.toString();
+ }
+
+ public void apply(Diagram d) {
+ getEngine().execute(d, code);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.4" maxVersion="1.4" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="2"/>
+ <Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="resizable" type="boolean" value="false"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <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="1" attributes="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="sourceLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+ <Component id="nameLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="jScrollPane1" pref="695" max="32767" attributes="1"/>
+ <Component id="nameTextField" alignment="0" pref="695" max="32767" attributes="1"/>
+ </Group>
+ </Group>
+ <Group type="102" alignment="1" attributes="0">
+ <Component id="okButton" min="-2" pref="76" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="cancelButton" min="-2" max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ </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"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="nameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="nameTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace type="unrelated" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="sourceLabel" min="-2" max="-2" attributes="0"/>
+ <Component id="jScrollPane1" min="-2" pref="337" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace pref="16" max="32767" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="cancelButton" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="okButton" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <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="sourceTextArea">
+ <Properties>
+ <Property name="columns" type="int" value="20"/>
+ <Property name="rows" type="int" value="5"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Component class="javax.swing.JTextField" name="nameTextField">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="at/ssw/graphanalyzer/coordinator/Bundle.properties" key="nameTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="nameLabel">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="sourceLabel">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JButton" name="okButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonClicked,okButtonClicked"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JButton" name="cancelButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jButton2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonClicked"/>
+ </Events>
+ </Component>
+ </SubComponents>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,161 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.filter;
+
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EditFilterDialog extends javax.swing.JDialog {
+
+ private CustomFilter customFilter;
+ private boolean accepted;
+
+ /** Creates new form EditFilterDialog */
+ public EditFilterDialog(CustomFilter customFilter) {
+ super(WindowManager.getDefault().getMainWindow(), true);
+ this.customFilter = customFilter;
+ initComponents();
+
+ sourceTextArea.setText(customFilter.getCode());
+ nameTextField.setText(customFilter.getName());
+ }
+
+ public boolean wasAccepted() {
+ return accepted;
+ }
+
+ /** 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() {
+
+ jScrollPane1 = new javax.swing.JScrollPane();
+ sourceTextArea = new javax.swing.JTextArea();
+ nameTextField = new javax.swing.JTextField();
+ nameLabel = new javax.swing.JLabel();
+ sourceLabel = new javax.swing.JLabel();
+ okButton = new javax.swing.JButton();
+ cancelButton = new javax.swing.JButton();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ setTitle(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "title")); // NOI18N
+ setResizable(false);
+
+ sourceTextArea.setColumns(20);
+ sourceTextArea.setRows(5);
+ jScrollPane1.setViewportView(sourceTextArea);
+
+ nameTextField.setText("null");
+
+ nameLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel1.text")); // NOI18N
+
+ sourceLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel2.text")); // NOI18N
+
+ okButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton1.text")); // NOI18N
+ okButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cancelButtonClicked(evt);
+ okButtonClicked(evt);
+ }
+ });
+
+ cancelButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton2.text")); // NOI18N
+ cancelButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cancelButtonClicked(evt);
+ }
+ });
+
+ org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(layout.createSequentialGroup()
+ .addContainerGap()
+ .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
+ .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(sourceLabel)
+ .add(nameLabel))
+ .add(25, 25, 25)
+ .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE)
+ .add(nameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE)))
+ .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
+ .add(okButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 76, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
+ .add(cancelButton)))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(layout.createSequentialGroup()
+ .addContainerGap()
+ .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+ .add(nameLabel)
+ .add(nameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
+ .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(sourceLabel)
+ .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 337, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 16, Short.MAX_VALUE)
+ .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+ .add(cancelButton)
+ .add(okButton))
+ .addContainerGap())
+ );
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+private void okButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonClicked
+ this.customFilter.setName(this.nameTextField.getText());
+ this.customFilter.setCode(this.sourceTextArea.getText());
+ accepted = true;
+ setVisible(false);
+}//GEN-LAST:event_okButtonClicked
+
+private void cancelButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonClicked
+ setVisible(false);
+}//GEN-LAST:event_cancelButtonClicked
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton cancelButton;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JLabel nameLabel;
+ private javax.swing.JTextField nameTextField;
+ private javax.swing.JButton okButton;
+ private javax.swing.JLabel sourceLabel;
+ private javax.swing.JTextArea sourceTextArea;
+ // End of variables declaration//GEN-END:variables
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.graph.Diagram;
+import org.openide.cookies.OpenCookie;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Filter extends Properties.Provider, ChangedEventProvider<Filter> {
+
+ public String getName();
+
+ public void apply(Diagram d);
+
+ OpenCookie getEditor();
+
+ ChangedEvent<Filter> getChangedEvent();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,155 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterChain implements ChangedEventProvider<FilterChain> {
+
+ private List<Filter> filters;
+ private transient ChangedEvent<FilterChain> changedEvent;
+ private boolean fireEvents;
+
+ public FilterChain() {
+ filters = new ArrayList<Filter>();
+ changedEvent = new ChangedEvent<FilterChain>(this);
+ this.fireEvents = true;
+ }
+
+ public FilterChain(FilterChain f) {
+ this.filters = new ArrayList<Filter>(f.filters);
+ changedEvent = new ChangedEvent<FilterChain>(this);
+ this.fireEvents = true;
+ }
+
+ public ChangedEvent<FilterChain> getChangedEvent() {
+ return changedEvent;
+ }
+
+ public Filter getFilterAt(int index) {
+ assert index >= 0 && index < filters.size();
+ return filters.get(index);
+ }
+
+ public void apply(Diagram d) {
+ for (Filter f : filters) {
+ f.apply(d);
+ }
+ }
+
+ public void apply(Diagram d, FilterChain sequence) {
+ List<Filter> applied = new ArrayList<Filter>();
+ for (Filter f : sequence.getFilters()) {
+ if (filters.contains(f)) {
+ f.apply(d);
+ applied.add(f);
+ }
+ }
+
+
+ for (Filter f : filters) {
+ if (!applied.contains(f)) {
+ f.apply(d);
+ }
+ }
+ }
+
+ public void beginAtomic() {
+ this.fireEvents = false;
+ }
+
+ public void endAtomic() {
+ this.fireEvents = true;
+ changedEvent.fire();
+ }
+
+ public void addFilter(Filter filter) {
+ assert filter != null;
+ filters.add(filter);
+ if (fireEvents) {
+ changedEvent.fire();
+ }
+ }
+
+ public void addFilterSameSequence(Filter filter) {
+ assert filter != null;
+ filters.add(filter);
+ if (fireEvents) {
+ changedEvent.fire();
+ }
+ }
+
+ public boolean containsFilter(Filter filter) {
+ return filters.contains(filter);
+ }
+
+ public void removeFilter(Filter filter) {
+ assert filters.contains(filter);
+ filters.remove(filter);
+ if (fireEvents) {
+ changedEvent.fire();
+ }
+ }
+
+ public void moveFilterUp(Filter filter) {
+ assert filters.contains(filter);
+ int index = filters.indexOf(filter);
+ if (index != 0) {
+ filters.remove(index);
+ filters.add(index - 1, filter);
+ }
+ if (fireEvents) {
+ changedEvent.fire();
+ }
+ }
+
+ public void moveFilterDown(Filter filter) {
+ assert filters.contains(filter);
+ int index = filters.indexOf(filter);
+ if (index != filters.size() - 1) {
+ filters.remove(index);
+ filters.add(index + 1, filter);
+ }
+ if (fireEvents) {
+ changedEvent.fire();
+ }
+ }
+
+ public List<Filter> getFilters() {
+ return Collections.unmodifiableList(filters);
+ }
+
+ public void clear() {
+ filters.clear();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface FilterChainProvider {
+
+ public FilterChain getFilterChain();
+
+ public FilterChain getSequence();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterSetting {
+
+ private Set<Filter> filters;
+ private String name;
+
+ public FilterSetting() {
+ this(null);
+ }
+
+ public FilterSetting(String name) {
+ this.name = name;
+ filters = new HashSet<Filter>();
+ }
+
+ public Set<Filter> getFilters() {
+ return Collections.unmodifiableSet(filters);
+ }
+
+ public void addFilter(Filter f) {
+ assert !filters.contains(f);
+ filters.add(f);
+ }
+
+ public void removeFilter(Filter f) {
+ assert filters.contains(f);
+ filters.remove(f);
+ }
+
+ public boolean containsFilter(Filter f) {
+ return filters.contains(f);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getFilterCount() {
+ return filters.size();
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import org.openide.util.Exceptions;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class JavaSE6ScriptEngine implements ScriptEngineAbstraction {
+
+ private ScriptEngine engine;
+ private Bindings bindings;
+
+ public boolean initialize(String jsHelperText) {
+ try {
+ ScriptEngineManager sem = new ScriptEngineManager();
+ ScriptEngine e = sem.getEngineByName("ECMAScript");
+ engine = e;
+ e.eval(jsHelperText);
+ Bindings b = e.getContext().getBindings(ScriptContext.ENGINE_SCOPE);
+ b.put("IO", System.out);
+ bindings = b;
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ public void execute(Diagram d, String code) {
+ try {
+ Bindings b = bindings;
+ b.put("graph", d);
+ engine.eval(code, b);
+ } catch (ScriptException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class NullScriptEngine implements ScriptEngineAbstraction {
+
+ public boolean initialize(String jsHelperText) {
+ return true;
+ }
+
+ public void execute(Diagram d, String code) {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,132 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveFilter extends AbstractFilter {
+
+ private List<RemoveRule> rules;
+ private String name;
+
+ public RemoveFilter(String name) {
+ this.name = name;
+ rules = new ArrayList<RemoveRule>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void apply(Diagram diagram) {
+
+ for (RemoveRule r : rules) {
+
+ List<Figure> list = r.getSelector().selected(diagram);
+ Set<Figure> figuresToRemove = new HashSet<Figure>();
+
+ List<Figure> protectedFigures = null;
+ if (r.getRemoveAllWithoutPredecessor()) {
+ protectedFigures = diagram.getRootFigures();
+ }
+
+ for (Figure f : list) {
+ if (r.getRemoveOnlyInputs()) {
+ List<InputSlot> inputSlots = new ArrayList<InputSlot>();
+ for (InputSlot is : f.getInputSlots()) {
+ inputSlots.add(is);
+ }
+ for (InputSlot is : inputSlots) {
+ f.removeSlot(is);
+ }
+
+ f.createInputSlot();
+ } else {
+ figuresToRemove.add(f);
+ }
+ }
+
+ if (r.getRemoveAllWithoutPredecessor()) {
+ boolean progress = true;
+ while (progress) {
+ List<Figure> rootFigures = diagram.getRootFigures();
+ progress = false;
+ for (Figure f : rootFigures) {
+ if (!protectedFigures.contains(f)) {
+ figuresToRemove.add(f);
+ progress = true;
+ }
+ }
+ }
+ }
+
+ diagram.removeAllFigures(figuresToRemove);
+ }
+ }
+
+ public void addRule(RemoveRule rule) {
+ rules.add(rule);
+ }
+
+ public static class RemoveRule {
+
+ private Selector selector;
+ private boolean removeAllWithoutPredecessor;
+ private boolean removeOnlyInputs;
+
+ public RemoveRule(Selector selector, boolean b) {
+ this(selector, b, false);
+ }
+
+ public RemoveRule(Selector selector, boolean removeAllWithoutPredecessor, boolean removeOnlyInputs) {
+ this.selector = selector;
+ this.removeOnlyInputs = removeOnlyInputs;
+ this.removeAllWithoutPredecessor = removeAllWithoutPredecessor;
+ }
+
+ public Selector getSelector() {
+ return selector;
+ }
+
+ public boolean getRemoveOnlyInputs() {
+ return removeOnlyInputs;
+ }
+
+ public boolean getRemoveAllWithoutPredecessor() {
+ return removeAllWithoutPredecessor;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,143 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveInputsFilter extends AbstractFilter {
+
+ private List<RemoveInputsRule> rules;
+ private String name;
+
+ public RemoveInputsFilter(String name) {
+ this.name = name;
+ rules = new ArrayList<RemoveInputsRule>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void apply(Diagram diagram) {
+
+ for (RemoveInputsRule r : rules) {
+
+ List<Figure> list = r.getSelector().selected(diagram);
+ for (Figure f : list) {
+ int z = 0;
+ List<InputSlot> last = new ArrayList<InputSlot>();
+ for (InputSlot is : f.getInputSlots()) {
+ if (z >= r.getStartingIndex() && z <= r.getEndIndex() && is.getConnections().size() > 0) {
+ StringBuilder sb = new StringBuilder();
+ List<Connection> conns = is.getConnections();
+ for (int i = 0; i < conns.size(); i++) {
+ Connection c = conns.get(i);
+ OutputSlot os = c.getOutputSlot();
+ Figure pred = os.getFigure();
+ if (i != 0) {
+ sb.append("<BR>");
+ }
+ sb.append(pred.getLines()[0]);
+ }
+ is.removeAllConnections();
+ is.setShortName("X");
+ is.setName(sb.toString());
+ last.add(is);
+ } else {
+ last.clear();
+ }
+ z++;
+ }
+
+ if (last.size() > 3) {
+ InputSlot first = last.get(0);
+ first.setShortName("XX");
+
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < last.size(); i++) {
+ InputSlot is2 = last.get(i);
+ if (i != 0) {
+ sb.append("<BR>");
+ }
+ sb.append(is2.getName());
+ }
+
+ first.setName(sb.toString());
+
+ for (int i = 1; i < last.size(); i++) {
+ f.removeSlot(last.get(i));
+ }
+ }
+ }
+ }
+ }
+
+ public void addRule(RemoveInputsRule rule) {
+ rules.add(rule);
+ }
+
+ public static class RemoveInputsRule {
+
+ private Selector selector;
+ private int startingIndex;
+ private int endIndex;
+
+ public RemoveInputsRule(Selector selector) {
+ this(selector, 0);
+ }
+
+ public RemoveInputsRule(Selector selector, int startIndex) {
+ this(selector, startIndex, Integer.MAX_VALUE);
+ }
+
+ public RemoveInputsRule(Selector selector, int startIndex, int endIndex) {
+ this.startingIndex = startIndex;
+ this.endIndex = endIndex;
+ this.selector = selector;
+ }
+
+ public int getStartingIndex() {
+ return startingIndex;
+ }
+
+ public int getEndIndex() {
+ return endIndex;
+ }
+
+ public Selector getSelector() {
+ return selector;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveSelfLoopsFilter extends AbstractFilter {
+
+ private String name;
+
+ /** Creates a new instance of RemoveSelfLoops */
+ public RemoveSelfLoopsFilter(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void apply(Diagram d) {
+
+ for (Figure f : d.getFigures()) {
+
+ for (InputSlot is : f.getInputSlots()) {
+
+ List<Connection> toRemove = new ArrayList<Connection>();
+ for (Connection c : is.getConnections()) {
+
+ if (c.getOutputSlot().getFigure() == f) {
+ toRemove.add(c);
+ }
+ }
+
+ for (Connection c : toRemove) {
+
+ c.remove();
+
+ OutputSlot os = c.getOutputSlot();
+ if (os.getConnections().size() == 0) {
+ f.removeSlot(os);
+ }
+
+ c.getInputSlot().setShortName("O");
+ c.getInputSlot().setName("Self Loop");
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ScriptEngineAbstraction {
+
+ public boolean initialize(String jsHelperText);
+
+ public void execute(Diagram d, String code);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SplitFilter extends AbstractFilter {
+
+ private String name;
+ private Selector selector;
+
+ public SplitFilter(String name, Selector selector) {
+ this.name = name;
+ this.selector = selector;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void apply(Diagram d) {
+ List<Figure> list = selector.selected(d);
+
+ for (Figure f : list) {
+ for (OutputSlot os : f.getOutputSlots()) {
+ for (Connection c : os.getConnections()) {
+ InputSlot is = c.getInputSlot();
+ is.setName(f.getProperties().getProperty("dump_spec"));
+ String s = f.getProperties().getProperty("short_name");
+ if (s != null) {
+ is.setShortName(s);
+ }
+ }
+ }
+
+ d.removeFigure(f);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ *
+ */
+
+ /**
+ *
+ * @author Thomas Wuerthinger
+ */
+
+function colorize(property, regexp, color) {
+ var f = new ColorFilter("");
+ f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), color));
+ f.apply(graph);
+}
+
+function remove(property, regexp) {
+ var f = new RemoveFilter("");
+ f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), false, false));
+ f.apply(graph);
+}
+
+function split(property, regexp) {
+ var f = new SplitFilter("", new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)));
+ f.apply(graph);
+}
+
+function removeInputs(property, regexp, from, to) {
+ var f = new RemoveInputsFilter("");
+ if(from == undefined && to == undefined) {
+ f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp))));
+ } else if(to == undefined) {
+ f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from));
+ } else {
+ f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from, to));
+ }
+ f.apply(graph);
+}
+
+var black = Color.black;
+var blue = Color.blue;
+var cyan = Color.cyan;
+var darkGray = Color.darkGray;
+var gray = Color.gray;
+var green = Color.green;
+var lightGray = Color.lightGray;
+var magenta = Color.magenta;
+var orange = Color.orange;
+var pink = Color.pink
+var red = Color.red;
+var yellow = Color.yellow;
+var white = Color.white;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <file name="JavaScriptHelper" url="helper.js"/>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.filterwindow" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.filterwindow.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.filterwindow
+OpenIDE-Module-Layer: com/sun/hotspot/igv/filterwindow/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filterwindow/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.filterwindow-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=401b2654
+build.xml.script.CRC32=9c158403
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=401b2654
+nbproject/build-impl.xml.script.CRC32=19fb08e0
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.filterwindow</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.actions</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.6.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.dialogs</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.5.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.explorer</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.12.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.filesystems</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.3.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.loaders</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.7.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.nodes</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.2.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.10.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.windows</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.18.1</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages/>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.filterwindow.FilterChainProviderImplementation
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,3 @@
+OpenIDE-Module-Name=FilterWindow
+CTL_FilterTopComponent=Filter Window
+HINT_FilterTopComponent=This is a Filter window
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import javax.swing.JList;
+import org.openide.explorer.view.ListView;
+import org.openide.explorer.view.NodeListModel;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckListView extends ListView {
+
+ @Override
+ public void showSelection(int[] indices) {
+ super.showSelection(indices);
+ }
+
+ @Override
+ protected NodeListModel createModel() {
+ return new CheckNodeListModel();
+ }
+
+ @Override
+ protected JList createList() {
+ JList tmpList = super.createList();
+ tmpList.setCellRenderer(new CheckRenderer(tmpList));
+ return tmpList;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckNode extends AbstractNode {
+
+ private ChangedEvent<CheckNode> selectionChangedEvent;
+ public boolean selected;
+ public boolean enabled;
+
+ public CheckNode(Children c, Lookup lookup) {
+ super(c, lookup);
+ selectionChangedEvent = new ChangedEvent<CheckNode>(this);
+ selected = false;
+ enabled = true;
+ }
+
+ public ChangedEvent<CheckNode> getSelectionChangedEvent() {
+ return selectionChangedEvent;
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ public void setSelected(boolean b) {
+ if (b != selected) {
+ selected = b;
+ selectionChangedEvent.fire();
+ }
+ }
+
+ public void setEnabled(boolean b) {
+ enabled = b;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import org.openide.explorer.view.NodeListModel;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckNodeListModel extends NodeListModel {
+
+ private Node rootNode;
+
+ @Override
+ public void setNode(Node rootNode) {
+ this.rootNode = rootNode;
+ super.setNode(rootNode);
+ }
+
+ public CheckNode getCheckNodeAt(int index) {
+ return (CheckNode) rootNode.getChildren().getNodes()[index];
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import javax.swing.JCheckBox;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+public class CheckRenderer extends JCheckBox implements ListCellRenderer {
+
+ private JList list;
+ private Color startBackground;
+
+ public CheckRenderer(final JList list) {
+ this.list = list;
+ list.addMouseListener(
+ new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ int index = list.locationToIndex(e.getPoint());
+ Point p2 = list.indexToLocation(index);
+ Rectangle r = new Rectangle(p2.x, p2.y, getPreferredSize().height, getPreferredSize().height);
+ if (r.contains(e.getPoint())) {
+ CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index);
+ node.setSelected(!node.isSelected());
+ list.repaint();
+ e.consume();
+ }
+ }
+ });
+
+ this.setPreferredSize(new Dimension(getPreferredSize().width, getPreferredSize().height - 5));
+ startBackground = this.getBackground();
+ }
+
+ public Component getListCellRendererComponent(final JList list, Object value, final int index, boolean isSelected, boolean cellHasFocus) {
+ setText(value.toString());
+ CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index);
+ this.setSelected(node.isSelected());
+ this.setEnabled(list.isEnabled());
+
+ if (isSelected && list.hasFocus()) {
+ this.setBackground(list.getSelectionBackground());
+ this.setForeground(list.getSelectionForeground());
+ } else if (isSelected) {
+ assert !list.hasFocus();
+ this.setBackground(startBackground);
+ this.setForeground(list.getForeground());
+
+ } else {
+ this.setBackground(list.getBackground());
+ this.setForeground(list.getForeground());
+ }
+ return this;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.filter.FilterChainProvider;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterChainProviderImplementation implements FilterChainProvider {
+
+ public FilterChain getFilterChain() {
+ return FilterTopComponent.findInstance().getFilterChain();
+ }
+
+ public FilterChain getSequence() {
+ return FilterTopComponent.findInstance().getSequence();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction;
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction;
+import com.sun.hotspot.igv.filter.Filter;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import javax.swing.Action;
+import org.openide.actions.OpenAction;
+import org.openide.nodes.Children;
+import org.openide.nodes.Sheet;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterNode extends CheckNode implements LookupListener, ChangedListener<FilterTopComponent> {
+
+ private Filter filter;
+ private Lookup.Result result;
+
+ public FilterNode(Filter filter) {
+ this(filter, new InstanceContent());
+ }
+
+ private FilterNode(Filter filter, InstanceContent content) {
+ super(Children.LEAF, new AbstractLookup(content));
+ content.add(filter);
+
+ content.add(filter.getEditor());
+ this.filter = filter;
+ filter.getChangedEvent().addListener(new ChangedListener<Filter>() {
+
+ public void changed(Filter source) {
+ update();
+ }
+ });
+
+ update();
+
+ Lookup.Template<FilterChain> tpl = new Lookup.Template<FilterChain>(FilterChain.class);
+ result = Utilities.actionsGlobalContext().lookup(tpl);
+ result.addLookupListener(this);
+
+ FilterTopComponent.findInstance().getFilterSettingsChangedEvent().addListener(this);
+ resultChanged(null);
+ }
+
+ private void update() {
+ this.setDisplayName(filter.getName());
+ }
+
+ public Filter getFilter() {
+ return filter;
+ }
+
+ @Override
+ protected Sheet createSheet() {
+ Sheet s = super.createSheet();
+ PropertiesSheet.initializeSheet(getFilter().getProperties(), s);
+ return s;
+ }
+
+ @Override
+ public Action[] getActions(boolean b) {
+ return new Action[]{(Action) OpenAction.findObject(OpenAction.class, true), (Action) MoveFilterUpAction.findObject(MoveFilterUpAction.class, true), (Action) MoveFilterDownAction.findObject(MoveFilterDownAction.class, true), (Action) RemoveFilterAction.findObject(RemoveFilterAction.class, true)};
+ }
+
+ @Override
+ public Action getPreferredAction() {
+ return OpenAction.get(OpenAction.class).createContextAwareInstance(Utilities.actionsGlobalContext());
+ }
+
+ public void resultChanged(LookupEvent lookupEvent) {
+ changed(FilterTopComponent.findInstance());
+ }
+
+ public void changed(FilterTopComponent source) {
+ setSelected(source.getFilterChain().containsFilter(filter));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <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"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,689 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction;
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction;
+import com.sun.hotspot.igv.filterwindow.actions.NewFilterAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterSettingsAction;
+import com.sun.hotspot.igv.filterwindow.actions.SaveFilterSettingsAction;
+import com.sun.hotspot.igv.filter.CustomFilter;
+import com.sun.hotspot.igv.filter.Filter;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.filter.FilterSetting;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedListener;
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Serializable;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.JComboBox;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.DialogDisplayer;
+import org.openide.ErrorManager;
+import org.openide.NotifyDescriptor;
+import org.openide.awt.ToolbarPool;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.awt.Toolbar;
+import org.openide.filesystems.FileLock;
+import org.openide.util.actions.SystemAction;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class FilterTopComponent extends TopComponent implements LookupListener, ExplorerManager.Provider {
+
+ private static FilterTopComponent instance;
+ public static final String FOLDER_ID = "Filters";
+ public static final String AFTER_ID = "after";
+ public static final String ENABLED_ID = "enabled";
+ public static final String PREFERRED_ID = "FilterTopComponent";
+ private CheckListView view;
+ private ExplorerManager manager;
+ private FilterChain filterChain;
+ private FilterChain sequence;
+ private Lookup.Result result;
+ private JComboBox comboBox;
+ private List<FilterSetting> filterSettings;
+ private FilterSetting customFilterSetting = new FilterSetting("-- Custom --");
+ private ChangedEvent<FilterTopComponent> filterSettingsChangedEvent;
+ private ActionListener comboBoxActionListener = new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ comboBoxSelectionChanged();
+ }
+ };
+
+ public ChangedEvent<FilterTopComponent> getFilterSettingsChangedEvent() {
+ return filterSettingsChangedEvent;
+ }
+
+ public FilterChain getSequence() {
+ return sequence;
+ }
+
+ public void updateSelection() {
+ Node[] nodes = this.getExplorerManager().getSelectedNodes();
+ int[] arr = new int[nodes.length];
+ for (int i = 0; i < nodes.length; i++) {
+ int index = sequence.getFilters().indexOf(((FilterNode) nodes[i]).getFilter());
+ arr[i] = index;
+ }
+ view.showSelection(arr);
+ }
+
+ private void comboBoxSelectionChanged() {
+
+ Object o = comboBox.getSelectedItem();
+ if (o == null) {
+ return;
+ }
+ assert o instanceof FilterSetting;
+ FilterSetting s = (FilterSetting) o;
+
+ if (s != customFilterSetting) {
+ FilterChain chain = getFilterChain();
+ chain.beginAtomic();
+ List<Filter> toRemove = new ArrayList<Filter>();
+ for (Filter f : chain.getFilters()) {
+ if (!s.containsFilter(f)) {
+ toRemove.add(f);
+ }
+ }
+ for (Filter f : toRemove) {
+ chain.removeFilter(f);
+ }
+
+ for (Filter f : s.getFilters()) {
+ if (!chain.containsFilter(f)) {
+ chain.addFilter(f);
+ }
+ }
+
+ chain.endAtomic();
+ filterSettingsChangedEvent.fire();
+ } else {
+ this.updateComboBoxSelection();
+ }
+
+ SystemAction.get(RemoveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() != this.customFilterSetting);
+ SystemAction.get(SaveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() == this.customFilterSetting);
+ }
+
+ private void updateComboBox() {
+ comboBox.removeAllItems();
+ comboBox.addItem(customFilterSetting);
+ for (FilterSetting s : filterSettings) {
+ comboBox.addItem(s);
+ }
+
+ this.updateComboBoxSelection();
+ }
+
+ public void addFilterSetting() {
+ NotifyDescriptor.InputLine l = new NotifyDescriptor.InputLine("Enter a name:", "Filter");
+ if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.OK_OPTION) {
+ String name = l.getInputText();
+
+ FilterSetting toRemove = null;
+ for (FilterSetting s : filterSettings) {
+ if (s.getName().equals(name)) {
+ NotifyDescriptor.Confirmation conf = new NotifyDescriptor.Confirmation("Filter \"" + name + "\" already exists, to you want to overwrite?", "Filter");
+ if (DialogDisplayer.getDefault().notify(conf) == NotifyDescriptor.YES_OPTION) {
+ toRemove = s;
+ break;
+ } else {
+ return;
+ }
+ }
+ }
+
+ if (toRemove != null) {
+ filterSettings.remove(toRemove);
+ }
+ FilterSetting setting = createFilterSetting(name);
+ filterSettings.add(setting);
+
+ // Sort alphabetically
+ Collections.sort(filterSettings, new Comparator<FilterSetting>() {
+
+ public int compare(FilterSetting o1, FilterSetting o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+ });
+
+ updateComboBox();
+ }
+ }
+
+ public boolean canRemoveFilterSetting() {
+ return comboBox.getSelectedItem() != customFilterSetting;
+ }
+
+ public void removeFilterSetting() {
+ if (canRemoveFilterSetting()) {
+ Object o = comboBox.getSelectedItem();
+ assert o instanceof FilterSetting;
+ FilterSetting f = (FilterSetting) o;
+ assert f != customFilterSetting;
+ assert filterSettings.contains(f);
+ NotifyDescriptor.Confirmation l = new NotifyDescriptor.Confirmation("Do you really want to remove filter \"" + f + "\"?", "Filter");
+ if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.YES_OPTION) {
+ filterSettings.remove(f);
+ updateComboBox();
+ }
+ }
+ }
+
+ private FilterSetting createFilterSetting(String name) {
+ FilterSetting s = new FilterSetting(name);
+ FilterChain chain = this.getFilterChain();
+ for (Filter f : chain.getFilters()) {
+ s.addFilter(f);
+ }
+ return s;
+ }
+
+ private void updateComboBoxSelection() {
+ List<Filter> filters = this.getFilterChain().getFilters();
+ boolean found = false;
+ for (FilterSetting s : filterSettings) {
+ if (s.getFilterCount() == filters.size()) {
+ boolean ok = true;
+ for (Filter f : filters) {
+ if (!s.containsFilter(f)) {
+ ok = false;
+ }
+ }
+
+ if (ok) {
+ if (comboBox.getSelectedItem() != s) {
+ comboBox.setSelectedItem(s);
+ }
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (!found && comboBox.getSelectedItem() != customFilterSetting) {
+ comboBox.setSelectedItem(customFilterSetting);
+ }
+ }
+
+ private class FilterChildren extends Children.Keys implements ChangedListener<CheckNode> {
+
+ //private Node[] oldSelection;
+ //private ArrayList<Node> newSelection;
+ private HashMap<Object, Node> nodeHash = new HashMap<Object, Node>();
+
+ protected Node[] createNodes(Object object) {
+ if (nodeHash.containsKey(object)) {
+ return new Node[]{nodeHash.get(object)};
+ }
+
+ assert object instanceof Filter;
+ Filter filter = (Filter) object;
+ com.sun.hotspot.igv.filterwindow.FilterNode node = new com.sun.hotspot.igv.filterwindow.FilterNode(filter);
+ node.getSelectionChangedEvent().addListener(this);
+ nodeHash.put(object, node);
+ return new Node[]{node};
+ }
+
+ public FilterChildren() {
+ sequence.getChangedEvent().addListener(new ChangedListener<FilterChain>() {
+
+ public void changed(FilterChain source) {
+ addNotify();
+ }
+ });
+
+ setBefore(false);
+ }
+
+ protected void addNotify() {
+ setKeys(sequence.getFilters());
+ updateSelection();
+ }
+
+ public void changed(CheckNode source) {
+ FilterNode node = (FilterNode) source;
+ Filter f = node.getFilter();
+ FilterChain chain = getFilterChain();
+ if (node.isSelected()) {
+ if (!chain.containsFilter(f)) {
+ chain.addFilter(f);
+ }
+ } else {
+ if (chain.containsFilter(f)) {
+ chain.removeFilter(f);
+ }
+ }
+ view.revalidate();
+ view.repaint();
+ updateComboBoxSelection();
+ }
+ }
+
+ public FilterChain getFilterChain() {
+ return filterChain;/*
+ EditorTopComponent tc = EditorTopComponent.getActive();
+ if (tc == null) {
+ return filterChain;
+ }
+ return tc.getFilterChain();*/
+ }
+
+ private FilterTopComponent() {
+ filterSettingsChangedEvent = new ChangedEvent<FilterTopComponent>(this);
+ initComponents();
+ setName(NbBundle.getMessage(FilterTopComponent.class, "CTL_FilterTopComponent"));
+ setToolTipText(NbBundle.getMessage(FilterTopComponent.class, "HINT_FilterTopComponent"));
+ // setIcon(Utilities.loadImage(ICON_PATH, true));
+
+ sequence = new FilterChain();
+ filterChain = new FilterChain();
+ initFilters();
+ manager = new ExplorerManager();
+ manager.setRootContext(new AbstractNode(new FilterChildren()));
+ associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+ view = new CheckListView();
+
+ ToolbarPool.getDefault().setPreferredIconSize(16);
+ Toolbar toolBar = new Toolbar();
+ Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+ toolBar.setBorder(b);
+ comboBox = new JComboBox();
+ toolBar.add(comboBox);
+ this.add(toolBar, BorderLayout.NORTH);
+ toolBar.add(SaveFilterSettingsAction.get(SaveFilterSettingsAction.class));
+ toolBar.add(RemoveFilterSettingsAction.get(RemoveFilterSettingsAction.class));
+ toolBar.addSeparator();
+ toolBar.add(MoveFilterUpAction.get(MoveFilterUpAction.class).createContextAwareInstance(this.getLookup()));
+ toolBar.add(MoveFilterDownAction.get(MoveFilterDownAction.class).createContextAwareInstance(this.getLookup()));
+ toolBar.add(RemoveFilterAction.get(RemoveFilterAction.class).createContextAwareInstance(this.getLookup()));
+ toolBar.add(NewFilterAction.get(NewFilterAction.class));
+ this.add(view, BorderLayout.CENTER);
+
+ filterSettings = new ArrayList<FilterSetting>();
+ updateComboBox();
+
+ comboBox.addActionListener(comboBoxActionListener);
+ setChain(filterChain);
+ }
+
+ public void newFilter() {
+ CustomFilter cf = new CustomFilter("My custom filter", "");
+ if (cf.openInEditor()) {
+ sequence.addFilter(cf);
+ FileObject fo = getFileObject(cf);
+ FilterChangedListener listener = new FilterChangedListener(fo, cf);
+ listener.changed(cf);
+ cf.getChangedEvent().addListener(listener);
+ }
+ }
+
+ public void removeFilter(Filter f) {
+ com.sun.hotspot.igv.filter.CustomFilter cf = (com.sun.hotspot.igv.filter.CustomFilter) f;
+
+ sequence.removeFilter(cf);
+ try {
+ getFileObject(cf).delete();
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+
+ }
+
+ private static class FilterChangedListener implements ChangedListener<Filter> {
+
+ private FileObject fileObject;
+ private CustomFilter filter;
+
+ public FilterChangedListener(FileObject fo, CustomFilter cf) {
+ fileObject = fo;
+ filter = cf;
+ }
+
+ public void changed(Filter source) {
+ try {
+ if (!fileObject.getName().equals(filter.getName())) {
+ FileLock lock = fileObject.lock();
+ fileObject.move(lock, fileObject.getParent(), filter.getName(), "");
+ lock.releaseLock();
+ FileObject newFileObject = fileObject.getParent().getFileObject(filter.getName());
+ fileObject = newFileObject;
+
+ }
+
+ FileLock lock = fileObject.lock();
+ OutputStream os = fileObject.getOutputStream(lock);
+ Writer w = new OutputStreamWriter(os);
+ String s = filter.getCode();
+ w.write(s);
+ w.close();
+ lock.releaseLock();
+
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+ }
+
+ public void initFilters() {
+
+ FileSystem fs = Repository.getDefault().getDefaultFileSystem();
+ FileObject folder = fs.getRoot().getFileObject(FOLDER_ID);
+ FileObject[] children = folder.getChildren();
+
+ List<CustomFilter> customFilters = new ArrayList<CustomFilter>();
+ HashMap<CustomFilter, String> afterMap = new HashMap<CustomFilter, String>();
+ Set<CustomFilter> enabledSet = new HashSet<CustomFilter>();
+ HashMap<String, CustomFilter> map = new HashMap<String, CustomFilter>();
+
+ for (final FileObject fo : children) {
+ InputStream is = null;
+
+ String code = "";
+ FileLock lock = null;
+ try {
+ lock = fo.lock();
+ is = fo.getInputStream();
+ BufferedReader r = new BufferedReader(new InputStreamReader(is));
+ String s;
+ StringBuffer sb = new StringBuffer();
+ while ((s = r.readLine()) != null) {
+ sb.append(s);
+ sb.append("\n");
+ }
+ code = sb.toString();
+
+ } catch (FileNotFoundException ex) {
+ Exceptions.printStackTrace(ex);
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ } finally {
+ try {
+ is.close();
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ lock.releaseLock();
+ }
+
+ String displayName = fo.getName();
+
+
+ final CustomFilter cf = new CustomFilter(displayName, code);
+ map.put(displayName, cf);
+
+ String after = (String) fo.getAttribute(AFTER_ID);
+ afterMap.put(cf, after);
+
+ Boolean enabled = (Boolean) fo.getAttribute(ENABLED_ID);
+ if (enabled != null && (boolean) enabled) {
+ enabledSet.add(cf);
+ }
+
+ cf.getChangedEvent().addListener(new FilterChangedListener(fo, cf));
+
+ customFilters.add(cf);
+ }
+
+ for (int j = 0; j < customFilters.size(); j++) {
+ for (int i = 0; i < customFilters.size(); i++) {
+ List<CustomFilter> copiedList = new ArrayList<CustomFilter>(customFilters);
+ for (CustomFilter cf : copiedList) {
+
+ String after = afterMap.get(cf);
+
+ if (map.containsKey(after)) {
+ CustomFilter afterCf = map.get(after);
+ int index = customFilters.indexOf(afterCf);
+ int currentIndex = customFilters.indexOf(cf);
+
+ if (currentIndex < index) {
+ customFilters.remove(currentIndex);
+ customFilters.add(index, cf);
+ }
+ }
+ }
+ }
+ }
+
+ for (CustomFilter cf : customFilters) {
+ sequence.addFilter(cf);
+ if (enabledSet.contains(cf)) {
+ filterChain.addFilter(cf);
+ }
+ }
+ }
+
+ /** 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() {
+
+ setLayout(new java.awt.BorderLayout());
+
+ }// </editor-fold>//GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ // End of variables declaration//GEN-END:variables
+ /**
+ * Gets default instance. Do not use directly: reserved for *.settings files only,
+ * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+ * To obtain the singleton instance, use {@link findInstance}.
+ */
+ public static synchronized FilterTopComponent getDefault() {
+ if (instance == null) {
+ instance = new FilterTopComponent();
+ }
+ return instance;
+ }
+
+ /**
+ * Obtain the FilterTopComponent instance. Never call {@link #getDefault} directly!
+ */
+ public static synchronized FilterTopComponent findInstance() {
+ TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+ if (win == null) {
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Filter component. It will not be located properly in the window system.");
+ return getDefault();
+ }
+ if (win instanceof FilterTopComponent) {
+ return (FilterTopComponent) win;
+ }
+ ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+ return getDefault();
+ }
+
+ @Override
+ public int getPersistenceType() {
+ return TopComponent.PERSISTENCE_ALWAYS;
+ }
+
+ @Override
+ protected String preferredID() {
+ return PREFERRED_ID;
+ }
+
+ @Override
+ public ExplorerManager getExplorerManager() {
+ return manager;
+ }
+
+ @Override
+ public void componentOpened() {
+ Lookup.Template<FilterChain> tpl = new Lookup.Template<FilterChain>(FilterChain.class);
+ result = Utilities.actionsGlobalContext().lookup(tpl);
+ result.addLookupListener(this);
+ }
+
+ @Override
+ public void componentClosed() {
+ result.removeLookupListener(this);
+ result = null;
+ }
+
+ public void resultChanged(LookupEvent lookupEvent) {
+ setChain(Utilities.actionsGlobalContext().lookup(FilterChain.class));
+ /*
+ EditorTopComponent tc = EditorTopComponent.getActive();
+ if (tc != null) {
+ setChain(tc.getFilterChain());
+ }*/
+ }
+
+ public void setChain(FilterChain chain) {
+ updateComboBoxSelection();
+ }
+
+ private FileObject getFileObject(CustomFilter cf) {
+ FileObject fo = Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID + "/" + cf.getName());
+ if (fo == null) {
+ try {
+ fo = org.openide.filesystems.Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID).createData(cf.getName());
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+ return fo;
+ }
+
+ @Override
+ public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeInt(filterSettings.size());
+ for (FilterSetting f : filterSettings) {
+ out.writeUTF(f.getName());
+
+ out.writeInt(f.getFilterCount());
+ for (Filter filter : f.getFilters()) {
+ CustomFilter cf = (CustomFilter) filter;
+ out.writeUTF(cf.getName());
+ }
+ }
+
+ CustomFilter prev = null;
+ for (Filter f : this.sequence.getFilters()) {
+ CustomFilter cf = (CustomFilter) f;
+ FileObject fo = getFileObject(cf);
+ if (getFilterChain().containsFilter(cf)) {
+ fo.setAttribute(ENABLED_ID, true);
+ } else {
+ fo.setAttribute(ENABLED_ID, false);
+ }
+
+ if (prev == null) {
+ fo.setAttribute(AFTER_ID, null);
+ } else {
+ fo.setAttribute(AFTER_ID, prev.getName());
+ }
+
+ prev = cf;
+ }
+ }
+
+ public CustomFilter findFilter(String name) {
+ for (Filter f : sequence.getFilters()) {
+
+ CustomFilter cf = (CustomFilter) f;
+ if (cf.getName().equals(name)) {
+ return cf;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ int filterSettingsCount = in.readInt();
+ for (int i = 0; i < filterSettingsCount; i++) {
+ String name = in.readUTF();
+ FilterSetting s = new FilterSetting(name);
+ int filterCount = in.readInt();
+ for (int j = 0; j < filterCount; j++) {
+ String filterName = in.readUTF();
+ CustomFilter filter = findFilter(filterName);
+ if (filter != null) {
+ s.addFilter(filter);
+ }
+ }
+
+ filterSettings.add(s);
+ }
+ updateComboBox();
+ }
+
+ final static class ResolvableHelper implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public Object readResolve() {
+ return FilterTopComponent.getDefault();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="com.sun.hotspot.igv.filterwindow" spec="1.0"/>
+ <instanceof class="org.openide.windows.TopComponent"/>
+ <instanceof class="com.sun.hotspot.igv.filterwindow.FilterTopComponent"/>
+ <instance class="com.sun.hotspot.igv.filterwindow.FilterTopComponent" method="getDefault"/>
+</settings>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+ <module name="com.sun.hotspot.igv.filterwindow" spec="1.0"/>
+ <tc-id id="FilterTopComponent"/>
+ <state opened="true"/>
+</tc-ref>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,10 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+CTL_FilterAction=Open Filter Window
+CTL_MoveFilterDownAction=Move downwards
+CTL_MoveFilterUpAction=Move upwards
+CTL_NewFilterAction=New filter...
+CTL_RemoveFilterAction=Remove
+CTL_RemoveFilterSettingsAction=Remove filter setting
+CTL_SaveFilterSettingsAction=Save filter settings...
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.*;
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterAction extends AbstractAction {
+
+ public FilterAction() {
+ super(NbBundle.getMessage(FilterAction.class, "CTL_FilterAction"));
+ }
+
+ public void actionPerformed(ActionEvent evt) {
+ TopComponent win = FilterTopComponent.findInstance();
+ win.open();
+ win.requestActive();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class MoveFilterDownAction extends CookieAction {
+
+ protected void performAction(Node[] activatedNodes) {
+ for (Node n : activatedNodes) {
+ Filter c = n.getLookup().lookup(Filter.class);
+ FilterTopComponent.findInstance().getSequence().moveFilterDown(c);
+ }
+ }
+
+ protected int mode() {
+ return CookieAction.MODE_EXACTLY_ONE;
+ }
+
+ public MoveFilterDownAction() {
+
+ putValue(Action.SHORT_DESCRIPTION, "Move filter downwards");
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterDownAction");
+ }
+
+ protected Class[] cookieClasses() {
+ return new Class[]{
+ Filter.class
+ };
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/filterwindow/images/down.gif";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ putValue("noIconInMenu", Boolean.TRUE);
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class MoveFilterUpAction extends CookieAction {
+
+ protected void performAction(Node[] activatedNodes) {
+ for (Node n : activatedNodes) {
+ Filter c = n.getLookup().lookup(Filter.class);
+ FilterTopComponent.findInstance().getSequence().moveFilterUp(c);
+ }
+ }
+
+ protected int mode() {
+ return CookieAction.MODE_EXACTLY_ONE;
+ }
+
+ public MoveFilterUpAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Move filter upwards");
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterUpAction");
+ }
+
+ protected Class[] cookieClasses() {
+ return new Class[]{
+ Filter.class
+ };
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/filterwindow/images/up.gif";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ putValue("noIconInMenu", Boolean.TRUE);
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NewFilterAction extends CallableSystemAction {
+
+ public NewFilterAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Create new filter");
+ }
+
+ public void performAction() {
+ FilterTopComponent.findInstance().newFilter();
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_NewFilterAction");
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/filterwindow/images/plus.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveFilterAction extends CookieAction {
+
+ protected void performAction(Node[] activatedNodes) {
+ Object[] options = {"Yes",
+ "No",
+ "Cancel"
+ };
+ int n = JOptionPane.showOptionDialog(WindowManager.getDefault().getMainWindow(),
+ "Do you really want to delete " + activatedNodes.length + " filter/s?", "Delete?",
+ JOptionPane.YES_NO_CANCEL_OPTION,
+ JOptionPane.QUESTION_MESSAGE,
+ null,
+ options,
+ options[2]);
+
+ if (n == JOptionPane.YES_OPTION) {
+ for (int i = 0; i < activatedNodes.length; i++) {
+ FilterTopComponent.findInstance().removeFilter(activatedNodes[i].getLookup().lookup(Filter.class));
+ }
+ }
+ }
+
+ protected int mode() {
+ return CookieAction.MODE_ALL;
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(RemoveFilterAction.class, "CTL_RemoveFilterAction");
+ }
+
+ public RemoveFilterAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Remove filter");
+ }
+
+ protected Class[] cookieClasses() {
+ return new Class[]{
+ Filter.class
+ };
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ putValue("noIconInMenu", Boolean.TRUE);
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/filterwindow/images/minus.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveFilterSettingsAction extends CallableSystemAction {
+
+ public void performAction() {
+ FilterTopComponent.findInstance().removeFilterSetting();
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(RemoveFilterSettingsAction.class, "CTL_RemoveFilterSettingsAction");
+ }
+
+ public RemoveFilterSettingsAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Remove filter profile");
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/filterwindow/images/delete.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveFilterSettingsAction extends CallableSystemAction {
+
+ public void performAction() {
+ FilterTopComponent.findInstance().addFilterSetting();
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_SaveFilterSettingsAction");
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public SaveFilterSettingsAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Create new filter profile");
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/filterwindow/images/add.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mode version="2.1">
+ <name unique="customRightTopMode" />
+ <kind type="view" />
+ <state type="joined" />
+ <constraints>
+ <path orientation="horizontal" number="45" weight="0.21761006289308177"/>
+ <path orientation="vertical" number="0" weight="0.2510122989593188"/>
+ </constraints>
+ <bounds x="0" y="0" width="0" height="0" />
+ <frame state="0"/>
+ <active-tc id="FilterTopComponent"/>
+ <empty-behavior permanent="false"/>
+</mode>
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <folder name="Edit">
+ <file name="com-sun-hotspot-igv-filterwindow-actions-MoveFilterDownAction.instance">
+ <attr name="position" intvalue="300"/>
+ </file>
+ <file name="com-sun-hotspot-igv-filterwindow-actions-MoveFilterUpAction.instance">
+ <attr name="position" intvalue="400"/>
+ </file>
+ <file name="com-sun-hotspot-igv-filterwindow-actions-RemoveFilterAction.instance">
+ <attr name="position" intvalue="500"/>
+ </file>
+ <file name="com-sun-hotspot-igv-filterwindow-actions-RemoveFilterSettingsAction.instance">
+ <attr name="position" intvalue="600"/>
+ </file>
+ <file name="com-sun-hotspot-igv-filterwindow-actions-SaveFilterSettingsAction.instance">
+ <attr name="position" intvalue="900"/>
+ </file>
+ </folder>
+ <folder name="Window">
+ <file name="com-sun-hotspot-igv-coordinator-actions-FilterAction.instance"/>
+ </folder>
+ <folder name="Menu">
+ <folder name="Window">
+ <file name="FilterAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-filterwindow-actions-FilterAction.instance"/>
+ </file>
+ </folder>
+ </folder>
+ <folder name="Windows2">
+ <folder name="Components">
+ <file name="FilterTopComponent.settings" url="FilterTopComponentSettings.xml"/>
+ </folder>
+ <folder name="Modes">
+ <file name="customRightTopMode.wsmode" url="customRightTopWsmode.xml"/>
+ <folder name="customRightTopMode">
+ <file name="FilterTopComponent.wstcref" url="FilterTopComponentWstcref.xml"/>
+ </folder>
+ </folder>
+ </folder>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.graph" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.graph.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.graph
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/graph/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.graph-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=b2bc2f02
+build.xml.script.CRC32=486d5dab
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=b2bc2f02
+nbproject/build-impl.xml.script.CRC32=17fa0f49
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.graph</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ * 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.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class AndSelector implements Selector {
+
+ private Selector selector1;
+ private Selector selector2;
+
+ public AndSelector(Selector s1, Selector s2) {
+ this.selector1 = s1;
+ this.selector2 = s2;
+ }
+
+ public List<Figure> selected(Diagram d) {
+ List<Figure> l1 = selector1.selected(d);
+ List<Figure> l2 = selector2.selected(d);
+ List<Figure> result = new ArrayList<Figure>();
+ for (Figure f : l2) {
+ if (l1.contains(f)) {
+ result.add(f);
+ }
+ }
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.layout.Cluster;
+import java.awt.Rectangle;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Block implements Cluster {
+
+ private InputBlock inputBlock;
+ private Rectangle bounds;
+ private Diagram diagram;
+
+ public Block(InputBlock inputBlock, Diagram diagram) {
+ this.inputBlock = inputBlock;
+ this.diagram = diagram;
+ }
+
+ public Cluster getOuter() {
+ return null;
+ }
+
+ public InputBlock getInputBlock() {
+ return inputBlock;
+ }
+
+ public Set<? extends Cluster> getSuccessors() {
+ Set<Block> succs = new HashSet<Block>();
+ for (InputBlock b : inputBlock.getSuccessors()) {
+ succs.add(diagram.getBlock(b));
+ }
+ return succs;
+ }
+
+ public Set<? extends Cluster> getPredecessors() {
+ Set<Block> succs = new HashSet<Block>();
+ for (InputBlock b : inputBlock.getPredecessors()) {
+ succs.add(diagram.getBlock(b));
+ }
+ return succs;
+ }
+
+ public void setBounds(Rectangle r) {
+ this.bounds = r;
+ }
+
+ public Rectangle getBounds() {
+ return bounds;
+ }
+
+ public int compareTo(Cluster o) {
+ return toString().compareTo(o.toString());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Graph
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,123 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Color;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Connection implements Source.Provider, Link {
+
+ public enum ConnectionStyle {
+
+ NORMAL,
+ DASHED,
+ BOLD
+ }
+ private InputSlot inputSlot;
+ private OutputSlot outputSlot;
+ private Source source;
+ private Color color;
+ private ConnectionStyle style;
+ private List<Point> controlPoints;
+
+ protected Connection(InputSlot inputSlot, OutputSlot outputSlot) {
+ this.inputSlot = inputSlot;
+ this.outputSlot = outputSlot;
+ this.inputSlot.connections.add(this);
+ this.outputSlot.connections.add(this);
+ controlPoints = new ArrayList<Point>();
+ Figure sourceFigure = this.outputSlot.getFigure();
+ Figure destFigure = this.inputSlot.getFigure();
+ sourceFigure.addSuccessor(destFigure);
+ destFigure.addPredecessor(sourceFigure);
+ source = new Source();
+
+ this.color = Color.BLACK;
+ this.style = ConnectionStyle.NORMAL;
+ }
+
+ public InputSlot getInputSlot() {
+ return inputSlot;
+ }
+
+ public OutputSlot getOutputSlot() {
+ return outputSlot;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public ConnectionStyle getStyle() {
+ return style;
+ }
+
+ public void setColor(Color c) {
+ color = c;
+ }
+
+ public void setStyle(ConnectionStyle s) {
+ style = s;
+ }
+
+ public Source getSource() {
+ return source;
+ }
+
+ public void remove() {
+ inputSlot.getFigure().removePredecessor(outputSlot.getFigure());
+ inputSlot.connections.remove(this);
+ outputSlot.getFigure().removeSuccessor(inputSlot.getFigure());
+ outputSlot.connections.remove(this);
+ }
+
+ @Override
+ public String toString() {
+ return "Connection(" + getFrom().getVertex() + " to " + getTo().getVertex() + ")";
+ }
+
+ public Port getFrom() {
+ return outputSlot;
+ }
+
+ public Port getTo() {
+ return inputSlot;
+ }
+
+ public List<Point> getControlPoints() {
+ return controlPoints;
+ }
+
+ public void setControlPoints(List<Point> list) {
+ controlPoints = list;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,294 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Font;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Diagram {
+
+ private List<Figure> figures;
+ private Map<InputBlock, Block> blocks;
+ private InputGraph graph;
+ private int curId;
+ private String nodeText;
+ private Font font;
+
+ public Font getFont() {
+ return font;
+ }
+
+ private Diagram() {
+ figures = new ArrayList<Figure>();
+ blocks = new HashMap<InputBlock, Block>();
+ this.nodeText = "";
+ this.font = new Font("Serif", Font.PLAIN, 14);
+ }
+
+ public Block getBlock(InputBlock b) {
+ return blocks.get(b);
+ }
+
+ public String getNodeText() {
+ return nodeText;
+ }
+
+ public void schedule(Collection<InputBlock> newBlocks) {
+ graph.schedule(newBlocks);
+ updateBlocks();
+ }
+
+ private void updateBlocks() {
+ blocks.clear();
+ for (InputBlock b : graph.getBlocks()) {
+ Block curBlock = new Block(b, this);
+ blocks.put(b, curBlock);
+ }
+ }
+
+ public Diagram getNext() {
+ return Diagram.createDiagram(graph.getNext(), nodeText);
+ }
+
+ public Collection<Block> getBlocks() {
+ return Collections.unmodifiableCollection(blocks.values());
+ }
+
+ public Diagram getPrev() {
+ return Diagram.createDiagram(graph.getPrev(), nodeText);
+ }
+
+ public List<Figure> getFigures() {
+ return Collections.unmodifiableList(figures);
+ }
+
+ public Figure createFigure() {
+ Figure f = new Figure(this, curId);
+ curId++;
+ this.figures.add(f);
+ return f;
+ }
+
+ public Connection createConnection(InputSlot inputSlot, OutputSlot outputSlot) {
+ assert inputSlot.getFigure().getDiagram() == this;
+ assert outputSlot.getFigure().getDiagram() == this;
+ return new Connection(inputSlot, outputSlot);
+ }
+
+ public static Diagram createDiagram(InputGraph graph, String nodeText) {
+ if (graph == null) {
+ return null;
+ }
+
+ Diagram d = new Diagram();
+ d.graph = graph;
+ d.nodeText = nodeText;
+
+ d.updateBlocks();
+
+ Collection<InputNode> nodes = graph.getNodes();
+ Hashtable<Integer, Figure> figureHash = new Hashtable<Integer, Figure>();
+ for (InputNode n : nodes) {
+ Figure f = d.createFigure();
+ f.getSource().addSourceNode(n);
+ f.getProperties().add(n.getProperties());
+ figureHash.put(n.getId(), f);
+ }
+
+ for (InputEdge e : graph.getEdges()) {
+
+ int from = e.getFrom();
+ int to = e.getTo();
+ Figure fromFigure = figureHash.get(from);
+ Figure toFigure = figureHash.get(to);
+ assert fromFigure != null && toFigure != null;
+
+ int toIndex = e.getToIndex();
+
+ while (fromFigure.getOutputSlots().size() <= 0) {
+ fromFigure.createOutputSlot();
+ }
+
+ OutputSlot outputSlot = fromFigure.getOutputSlots().get(0);
+
+ while (toFigure.getInputSlots().size() <= toIndex) {
+ toFigure.createInputSlot();
+ }
+
+ InputSlot inputSlot = toFigure.getInputSlots().get(toIndex);
+
+ Connection c = d.createConnection(inputSlot, outputSlot);
+
+ if (e.getState() == InputEdge.State.NEW) {
+ c.setStyle(Connection.ConnectionStyle.BOLD);
+ } else if (e.getState() == InputEdge.State.DELETED) {
+ c.setStyle(Connection.ConnectionStyle.DASHED);
+ }
+ }
+
+
+ return d;
+ }
+
+ public void removeAllFigures(Set<Figure> figuresToRemove) {
+ for (Figure f : figuresToRemove) {
+ freeFigure(f);
+ }
+
+ ArrayList<Figure> newFigures = new ArrayList<Figure>();
+ for (Figure f : this.figures) {
+ if (!figuresToRemove.contains(f)) {
+ newFigures.add(f);
+ }
+ }
+ figures = newFigures;
+ }
+
+ private void freeFigure(Figure succ) {
+
+ List<InputSlot> inputSlots = new ArrayList<InputSlot>(succ.getInputSlots());
+ for (InputSlot s : inputSlots) {
+ succ.removeInputSlot(s);
+ }
+
+ List<OutputSlot> outputSlots = new ArrayList<OutputSlot>(succ.getOutputSlots());
+ for (OutputSlot s : outputSlots) {
+ succ.removeOutputSlot(s);
+ }
+
+ assert succ.getInputSlots().size() == 0;
+ assert succ.getOutputSlots().size() == 0;
+ assert succ.getPredecessors().size() == 0;
+ assert succ.getSuccessors().size() == 0;
+
+ }
+
+ public void removeFigure(Figure succ) {
+
+ assert this.figures.contains(succ);
+ freeFigure(succ);
+ this.figures.remove(succ);
+ }
+
+ public String getName() {
+ return graph.getName();
+ }
+
+ public InputGraph getGraph() {
+ return graph;
+ }
+
+ public Set<Connection> getConnections() {
+
+ Set<Connection> connections = new HashSet<Connection>();
+ for (Figure f : figures) {
+
+ for (InputSlot s : f.getInputSlots()) {
+ connections.addAll(s.getConnections());
+ }
+ }
+
+ return connections;
+ }
+
+ public Figure getRootFigure() {
+ Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(figures);
+ Figure root = selector.selectSingle("name", "Root");
+ if (root == null) {
+ root = selector.selectSingle("name", "Start");
+ }
+ if (root == null) {
+ List<Figure> rootFigures = getRootFigures();
+ if (rootFigures.size() > 0) {
+ root = rootFigures.get(0);
+ } else if (figures.size() > 0) {
+ root = figures.get(0);
+ }
+ }
+
+ return root;
+ }
+
+ public void printStatistics() {
+ System.out.println("=============================================================");
+ System.out.println("Diagram statistics");
+
+ List<Figure> tmpFigures = getFigures();
+ Set<Connection> connections = getConnections();
+
+ System.out.println("Number of figures: " + tmpFigures.size());
+ System.out.println("Number of connections: " + connections.size());
+
+ List<Figure> figuresSorted = new ArrayList<Figure>(tmpFigures);
+ Collections.sort(figuresSorted, new Comparator<Figure>() {
+
+ public int compare(Figure a, Figure b) {
+ return b.getPredecessors().size() + b.getSuccessors().size() - a.getPredecessors().size() - a.getSuccessors().size();
+ }
+ });
+
+ final int COUNT = 10;
+ int z = 0;
+ for (Figure f : figuresSorted) {
+
+ z++;
+ int sum = f.getPredecessors().size() + f.getSuccessors().size();
+ System.out.println("#" + z + ": " + f + ", predCount=" + f.getPredecessors().size() + " succCount=" + f.getSuccessors().size());
+ if (sum < COUNT) {
+ break;
+ }
+
+ }
+
+ System.out.println("=============================================================");
+ }
+
+ public List<Figure> getRootFigures() {
+ ArrayList<Figure> rootFigures = new ArrayList<Figure>();
+ for (Figure f : figures) {
+ if (f.getPredecessors().size() == 0) {
+ rootFigures.add(f);
+ }
+ }
+ return rootFigures;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,328 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Vertex;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Figure extends Properties.Object implements Source.Provider, Vertex {
+
+ public static final int INSET = 6;
+ public static final int SLOT_WIDTH = 10;
+ public static final int SLOT_START = 3;
+ public static final boolean VERTICAL_LAYOUT = true;
+ protected List<InputSlot> inputSlots;
+ protected List<OutputSlot> outputSlots;
+ private Source source;
+ private Diagram diagram;
+ private Point position;
+ private List<Figure> predecessors;
+ private List<Figure> successors;
+ private Color color;
+ private int id;
+ private String idString;
+ private String[] lines;
+ private int heightCash = -1;
+ private int widthCash = -1;
+
+ public int getHeight() {
+ if (heightCash == -1) {
+ BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+ Graphics g = image.getGraphics();
+ g.setFont(diagram.getFont());
+ FontMetrics metrics = g.getFontMetrics();
+ String nodeText = diagram.getNodeText();
+ heightCash = nodeText.split("\n").length * metrics.getHeight() + INSET;
+ }
+ return heightCash;
+ }
+
+ public int getWidth() {
+ if (widthCash == -1) {
+ int max = 0;
+ BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+ Graphics g = image.getGraphics();
+ g.setFont(diagram.getFont());
+ FontMetrics metrics = g.getFontMetrics();
+ for (String s : lines) {
+ int cur = metrics.stringWidth(s);
+ if (cur > max) {
+ max = cur;
+ }
+ }
+ widthCash = max + INSET;
+ }
+ return widthCash;
+ }
+
+ protected Figure(Diagram diagram, int id) {
+ this.diagram = diagram;
+ this.source = new Source();
+ inputSlots = new ArrayList<InputSlot>(5);
+ outputSlots = new ArrayList<OutputSlot>(1);
+ predecessors = new ArrayList<Figure>(6);
+ successors = new ArrayList<Figure>(6);
+ this.id = id;
+ idString = Integer.toString(id);
+
+ this.position = new Point(0, 0);
+ this.color = Color.WHITE;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public List<Figure> getPredecessors() {
+ return Collections.unmodifiableList(predecessors);
+ }
+
+ public Set<Figure> getPredecessorSet() {
+ Set<Figure> result = new HashSet<Figure>();
+ for (Figure f : getPredecessors()) {
+ result.add(f);
+ }
+ return Collections.unmodifiableSet(result);
+ }
+
+ public Set<Figure> getSuccessorSet() {
+ Set<Figure> result = new HashSet<Figure>();
+ for (Figure f : getSuccessors()) {
+ result.add(f);
+ }
+ return Collections.unmodifiableSet(result);
+ }
+
+ public List<Figure> getSuccessors() {
+ return Collections.unmodifiableList(successors);
+ }
+
+ protected void addPredecessor(Figure f) {
+ this.predecessors.add(f);
+ }
+
+ protected void addSuccessor(Figure f) {
+ this.successors.add(f);
+ }
+
+ protected void removePredecessor(Figure f) {
+ assert predecessors.contains(f);
+ predecessors.remove(f);
+ }
+
+ protected void removeSuccessor(Figure f) {
+ assert successors.contains(f);
+ successors.remove(f);
+ }
+
+ public void setPosition(Point p) {
+ this.position = p;
+ }
+
+ public Point getPosition() {
+ return position;
+ }
+
+ public Diagram getDiagram() {
+ return diagram;
+ }
+
+ public Source getSource() {
+ return source;
+ }
+
+ public InputSlot createInputSlot() {
+ InputSlot slot = new InputSlot(this, -1);
+ inputSlots.add(slot);
+ return slot;
+ }
+
+ public InputSlot createInputSlot(int index) {
+ InputSlot slot = new InputSlot(this, index);
+ inputSlots.add(slot);
+ Collections.sort(inputSlots, Slot.slotIndexComparator);
+ return slot;
+ }
+
+ public void removeSlot(Slot s) {
+
+ assert inputSlots.contains(s) || outputSlots.contains(s);
+
+ List<Connection> connections = new ArrayList<Connection>(s.getConnections());
+ for (Connection c : connections) {
+ c.remove();
+ }
+
+ if (inputSlots.contains(s)) {
+ inputSlots.remove(s);
+ } else if (outputSlots.contains(s)) {
+ outputSlots.remove(s);
+ }
+ }
+
+ public OutputSlot createOutputSlot() {
+ OutputSlot slot = new OutputSlot(this, -1);
+ outputSlots.add(slot);
+ return slot;
+ }
+
+ public OutputSlot createOutputSlot(int index) {
+ OutputSlot slot = new OutputSlot(this, index);
+ outputSlots.add(slot);
+ Collections.sort(outputSlots, Slot.slotIndexComparator);
+ return slot;
+ }
+
+ public List<InputSlot> getInputSlots() {
+ return Collections.unmodifiableList(inputSlots);
+ }
+
+ public List<OutputSlot> getOutputSlots() {
+ return Collections.unmodifiableList(outputSlots);
+ }
+
+ void removeInputSlot(InputSlot s) {
+ s.removeAllConnections();
+ inputSlots.remove(s);
+ }
+
+ void removeOutputSlot(OutputSlot s) {
+ s.removeAllConnections();
+ outputSlots.remove(s);
+ }
+
+ public String[] getLines() {
+ if (lines == null) {
+ updateLines();
+ }
+ return lines;
+ }
+
+ public void updateLines() {
+ String[] strings = diagram.getNodeText().split("\n");
+ String[] result = new String[strings.length];
+
+ for (int i = 0; i < strings.length; i++) {
+ result[i] = resolveString(strings[i]);
+ }
+
+ lines = result;
+ }
+
+ private String resolveString(String string) {
+
+ StringBuilder sb = new StringBuilder();
+ boolean inBrackets = false;
+ StringBuilder curIdent = new StringBuilder();
+
+ for (int i = 0; i < string.length(); i++) {
+ char c = string.charAt(i);
+ if (inBrackets) {
+ if (c == ']') {
+ String value = getProperties().get(curIdent.toString());
+ if (value == null) {
+ value = "";
+ }
+ sb.append(value);
+ inBrackets = false;
+ } else {
+ curIdent.append(c);
+ }
+ } else {
+ if (c == '[') {
+ inBrackets = true;
+ curIdent = new StringBuilder();
+ } else {
+ sb.append(c);
+ }
+ }
+ }
+
+ return sb.toString();
+ }
+
+ public Dimension getSize() {
+ if (VERTICAL_LAYOUT) {
+ int width = Math.max(getWidth(), Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1));
+ int height = getHeight() + 2 * Figure.SLOT_WIDTH;
+ return new Dimension(width, height);
+ } else {
+ int width = getWidth() + 2 * Figure.SLOT_WIDTH;
+ int height = Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1);
+ return new Dimension(width, height);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return idString;
+ }
+
+ public Cluster getCluster() {
+ if (getSource().getSourceNodes().size() == 0) {
+ assert false : "Should never reach here, every figure must have at least one source node!";
+ return null;
+ } else {
+ Cluster result = diagram.getBlock(diagram.getGraph().getBlock(getSource().getSourceNodes().get(0)));
+ assert result != null;
+ return result;
+ }
+ }
+
+ public boolean isRoot() {
+ if (source.getSourceNodes().size() > 0 && source.getSourceNodes().get(0).getProperties().get("name").equals("Root")) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public int compareTo(Vertex f) {
+ return toString().compareTo(f.toString());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputSlot extends Slot {
+
+ protected InputSlot(Figure figure, int wantedIndex) {
+ super(figure, wantedIndex);
+ }
+
+ public int getPosition() {
+ return getFigure().getInputSlots().indexOf(this);
+ }
+
+ public void setPosition(int position) {
+ List<InputSlot> inputSlots = getFigure().inputSlots;
+ InputSlot s = inputSlots.remove(position);
+ inputSlots.add(position, s);
+ }
+
+ public Point getRelativePosition() {
+ return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getInputSlots().size() + 1), Figure.SLOT_WIDTH - Figure.SLOT_START);
+ }
+
+ @Override
+ public String toString() {
+ return "InputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InvertSelector implements Selector {
+
+ private Selector selector;
+
+ public InvertSelector(Selector selector) {
+ this.selector = selector;
+ }
+
+ public List<Figure> selected(Diagram d) {
+
+ List<Figure> result = new ArrayList<Figure>();
+ List<Figure> otherResult = selector.selected(d);
+ for (Figure f : d.getFigures()) {
+ if (!otherResult.contains(f)) {
+ result.add(f);
+ }
+ }
+
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MatcherSelector implements Selector {
+
+ private PropertyMatcher matcher;
+
+ public MatcherSelector(PropertyMatcher matcher) {
+ this.matcher = matcher;
+ }
+
+ public List<Figure> selected(Diagram d) {
+ Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(d.getFigures());
+ List<Figure> list = selector.selectMultiple(matcher);
+ return list;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OrSelector implements Selector {
+
+ private Selector selector1;
+ private Selector selector2;
+
+ /** Creates a new instance of OrSelector */
+ public OrSelector(Selector s1, Selector s2) {
+ this.selector1 = s1;
+ this.selector2 = s2;
+ }
+
+ public List<Figure> selected(Diagram d) {
+
+ List<Figure> l1 = selector1.selected(d);
+ List<Figure> l2 = selector2.selected(d);
+
+ for (Figure f : l2) {
+ if (!l1.contains(f)) {
+ l1.add(f);
+ }
+ }
+
+ return l1;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutputSlot extends Slot {
+
+ protected OutputSlot(Figure figure, int wantedIndex) {
+ super(figure, wantedIndex);
+ }
+
+ public int getPosition() {
+ return getFigure().getOutputSlots().indexOf(this);
+ }
+
+ public void setPosition(int position) {
+ OutputSlot s = getFigure().outputSlots.remove(position);
+ getFigure().outputSlots.add(position, s);
+ }
+
+ public Point getRelativePosition() {
+ return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getOutputSlots().size() + 1), getFigure().getSize().height - Figure.SLOT_WIDTH + Figure.SLOT_START);
+ }
+
+ @Override
+ public String toString() {
+ return "OutputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PredecessorSelector implements Selector {
+
+ private Selector innerSelector;
+
+ public PredecessorSelector(Selector innerSelector) {
+ this.innerSelector = innerSelector;
+ }
+
+ public List<Figure> selected(Diagram d) {
+ List<Figure> inner = innerSelector.selected(d);
+ List<Figure> result = new ArrayList<Figure>();
+ for (Figure f : d.getFigures()) {
+ boolean saved = false;
+ for (Figure f2 : f.getSuccessors()) {
+ if (inner.contains(f2)) {
+ saved = true;
+ }
+ }
+
+ if (saved) {
+ result.add(f);
+ }
+ }
+
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Selector {
+
+ List<Figure> selected(Diagram d);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Comparator;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class Slot implements Port, Source.Provider {
+
+ private int wantedIndex;
+ private String name;
+ private String shortName; // 1 - 2 characters
+ private Source source;
+ protected List<Connection> connections;
+ private Figure figure;
+
+ protected Slot(Figure figure, int wantedIndex) {
+ this.figure = figure;
+ connections = new ArrayList<Connection>(2);
+ source = new Source();
+ this.wantedIndex = wantedIndex;
+ name = "";
+ shortName = "";
+ assert figure != null;
+ }
+ public static final Comparator<Slot> slotIndexComparator = new Comparator<Slot>() {
+
+ public int compare(Slot o1, Slot o2) {
+ return o1.wantedIndex - o2.wantedIndex;
+ }
+ };
+ public static final Comparator<Slot> slotFigureComparator = new Comparator<Slot>() {
+
+ public int compare(Slot o1, Slot o2) {
+ return o1.figure.getId() - o2.figure.getId();
+ }
+ };
+
+ public int getWantedIndex() {
+ return wantedIndex;
+ }
+
+ public Source getSource() {
+ return source;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setShortName(String s) {
+ assert s != null;
+ assert s.length() <= 2;
+ this.shortName = s;
+
+ }
+
+ public String getShortName() {
+ return shortName;
+ }
+
+ public boolean getShowName() {
+ return getShortName() != null && getShortName().length() > 0;
+ }
+
+ public void setName(String s) {
+ if (s == null) {
+ s = "";
+ }
+ this.name = s;
+ }
+
+ public Figure getFigure() {
+ assert figure != null;
+ return figure;
+ }
+
+ public List<Connection> getConnections() {
+ return Collections.unmodifiableList(connections);
+ }
+
+ public void removeAllConnections() {
+ List<Connection> connectionsCopy = new ArrayList<Connection>(this.connections);
+ for (Connection c : connectionsCopy) {
+ c.remove();
+ }
+ }
+
+ public Vertex getVertex() {
+ return figure;
+ }
+
+ public abstract int getPosition();
+
+ public abstract void setPosition(int position);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Source {
+
+ private List<InputNode> sourceNodes;
+ private Set<Integer> set;
+
+ public Source() {
+ sourceNodes = new ArrayList<InputNode>(1);
+ }
+
+ public List<InputNode> getSourceNodes() {
+ return Collections.unmodifiableList(sourceNodes);
+ }
+
+ public Set<Integer> getSourceNodesAsSet() {
+ if (set == null) {
+ set = new HashSet<Integer>();
+ for (InputNode n : sourceNodes) {
+ int id = n.getId();
+ //if(id < 0) id = -id;
+ set.add(id);
+ }
+ }
+ return set;
+ }
+
+ public void addSourceNode(InputNode n) {
+ sourceNodes.add(n);
+ set = null;
+ }
+
+ public void removeSourceNode(InputNode n) {
+ sourceNodes.remove(n);
+ set = null;
+ }
+
+ public interface Provider {
+
+ public Source getSource();
+ }
+
+ public void setSourceNodes(List<InputNode> sourceNodes) {
+ this.sourceNodes = sourceNodes;
+ set = null;
+ }
+
+ public void addSourceNodes(Source s) {
+ for (InputNode n : s.getSourceNodes()) {
+ sourceNodes.add(n);
+ }
+ set = null;
+ }
+
+ public boolean isInBlock(InputGraph g, InputBlock blockNode) {
+
+ for (InputNode n : this.getSourceNodes()) {
+ if (g.getBlock(n) == blockNode) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SuccessorSelector implements Selector {
+
+ private Selector innerSelector;
+
+ public SuccessorSelector(Selector innerSelector) {
+ this.innerSelector = innerSelector;
+ }
+
+ public List<Figure> selected(Diagram d) {
+ List<Figure> inner = innerSelector.selected(d);
+ List<Figure> result = new ArrayList<Figure>();
+ for (Figure f : d.getFigures()) {
+ boolean saved = false;
+ for (Figure f2 : f.getPredecessors()) {
+ if (inner.contains(f2)) {
+ saved = true;
+ }
+ }
+
+ if (saved) {
+ result.add(f);
+ }
+ }
+
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.hierarchicallayout" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.hierarchicallayout.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.hierarchicallayout
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/hierarchicallayout/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.hierarchicallayout-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=de087df9
+build.xml.script.CRC32=98977c36
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=de087df9
+nbproject/build-impl.xml.script.CRC32=0d734625
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.hierarchicallayout</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=HierarchicalLayout
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterEdge implements Link {
+
+ private ClusterNode from;
+ private ClusterNode to;
+ private List<Point> points;
+
+ public ClusterEdge(ClusterNode from, ClusterNode to) {
+ assert from != null;
+ assert to != null;
+ this.from = from;
+ this.to = to;
+ }
+
+ public Port getTo() {
+ return to.getInputSlot();
+ }
+
+ public Port getFrom() {
+ return from.getInputSlot();
+ }
+
+ public void setControlPoints(List<Point> p) {
+ this.points = p;
+ }
+
+ public List<Point> getControlPoints() {
+ return points;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterIngoingConnection implements Link {
+
+ private List<Point> controlPoints;
+ private ClusterInputSlotNode inputSlotNode;
+ private Link connection;
+ private Port inputSlot;
+ private Port outputSlot;
+
+ public ClusterIngoingConnection(ClusterInputSlotNode inputSlotNode, Link c) {
+ this.inputSlotNode = inputSlotNode;
+ this.connection = c;
+ this.controlPoints = new ArrayList<Point>();
+
+ inputSlot = c.getTo();
+ outputSlot = inputSlotNode.getOutputSlot();
+ }
+
+ public Link getConnection() {
+ return connection;
+ }
+
+ public ClusterInputSlotNode getInputSlotNode() {
+ return inputSlotNode;
+ }
+
+ public Port getTo() {
+ return inputSlot;
+ }
+
+ public Port getFrom() {
+ return outputSlot;
+ }
+
+ public void setControlPoints(List<Point> p) {
+ this.controlPoints = p;
+ }
+
+ public List<Point> getControlPoints() {
+ return controlPoints;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterInputSlotNode implements Vertex {
+
+ private final int SIZE = 0;
+ private Point position;
+ private Port inputSlot;
+ private Port outputSlot;
+ private ClusterNode blockNode;
+ private InterClusterConnection interBlockConnection;
+ private Cluster cluster;
+ private ClusterIngoingConnection conn;
+
+ public void setIngoingConnection(ClusterIngoingConnection c) {
+ conn = c;
+ }
+
+ public ClusterIngoingConnection getIngoingConnection() {
+ return conn;
+ }
+ private String id;
+
+ @Override
+ public String toString() {
+ return id;
+ }
+
+ public ClusterInputSlotNode(ClusterNode n, String id) {
+ this.blockNode = n;
+ this.id = id;
+
+ n.addSubNode(this);
+
+ final Vertex thisNode = this;
+ final ClusterNode thisBlockNode = blockNode;
+
+ outputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ return new Point(0, 0);
+ }
+
+ public Vertex getVertex() {
+ return thisNode;
+ }
+
+ @Override
+ public String toString() {
+ return "OutPort of " + thisNode.toString();
+ }
+ };
+
+ inputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ Point p = new Point(thisNode.getPosition());
+ p.x += ClusterNode.BORDER;
+ p.y = 0;
+ return p;
+ }
+
+ public Vertex getVertex() {
+ return thisBlockNode;
+ }
+
+ @Override
+ public String toString() {
+ return "InPort of " + thisNode.toString();
+ }
+ };
+ }
+
+ public Port getInputSlot() {
+ return inputSlot;
+ }
+
+ public InterClusterConnection getInterBlockConnection() {
+ return interBlockConnection;
+ }
+
+ public Port getOutputSlot() {
+ return outputSlot;
+ }
+
+ public Dimension getSize() {
+ return new Dimension(SIZE, SIZE);
+ }
+
+ public void setPosition(Point p) {
+ this.position = p;
+ }
+
+ public Point getPosition() {
+ return position;
+ }
+
+ public void setInterBlockConnection(InterClusterConnection interBlockConnection) {
+ this.interBlockConnection = interBlockConnection;
+ }
+
+ public Cluster getCluster() {
+ return cluster;
+ }
+
+ public boolean isRoot() {
+ return true;
+ }
+
+ public int compareTo(Vertex o) {
+ return toString().compareTo(o.toString());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,233 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterNode implements Vertex {
+
+ private Cluster cluster;
+ private Port inputSlot;
+ private Port outputSlot;
+ private Set<Vertex> subNodes;
+ private Dimension size;
+ private Point position;
+ private Set<Link> subEdges;
+ private boolean dirty;
+ private boolean root;
+ private String name;
+ public static final int BORDER = 20;
+
+ public ClusterNode(Cluster cluster, String name) {
+ this.subNodes = new HashSet<Vertex>();
+ this.subEdges = new HashSet<Link>();
+ this.cluster = cluster;
+ position = new Point(0, 0);
+ this.name = name;
+ }
+
+ public void addSubNode(Vertex v) {
+ subNodes.add(v);
+ }
+
+ public void addSubEdge(Link l) {
+ subEdges.add(l);
+ }
+
+ public Set<Link> getSubEdges() {
+ return Collections.unmodifiableSet(subEdges);
+ }
+
+ public void updateSize() {
+
+
+ calculateSize();
+
+ final ClusterNode widget = this;
+ inputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ return new Point(size.width / 2, 0);
+ }
+
+ public Vertex getVertex() {
+ return widget;
+ }
+ };
+
+ outputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ return new Point(size.width / 2, size.height);
+ }
+
+ public Vertex getVertex() {
+ return widget;
+ }
+ };
+ }
+
+ private void calculateSize() {
+
+ if (subNodes.size() == 0) {
+ size = new Dimension(0, 0);
+ }
+
+ int minX = Integer.MAX_VALUE;
+ int maxX = Integer.MIN_VALUE;
+ int minY = Integer.MAX_VALUE;
+ int maxY = Integer.MIN_VALUE;
+
+
+ for (Vertex n : subNodes) {
+ Point p = n.getPosition();
+ minX = Math.min(minX, p.x);
+ minY = Math.min(minY, p.y);
+ maxX = Math.max(maxX, p.x + n.getSize().width);
+ maxY = Math.max(maxY, p.y + n.getSize().height);
+ }
+
+ for (Link l : subEdges) {
+ List<Point> points = l.getControlPoints();
+ for (Point p : points) {
+ if (p != null) {
+ minX = Math.min(minX, p.x);
+ maxX = Math.max(maxX, p.x);
+ minY = Math.min(minY, p.y);
+ maxY = Math.max(maxY, p.y);
+ }
+ }
+ }
+
+ size = new Dimension(maxX - minX, maxY - minY);
+
+ // Normalize coordinates
+ for (Vertex n : subNodes) {
+ n.setPosition(new Point(n.getPosition().x - minX, n.getPosition().y - minY));
+ }
+
+ for (Link l : subEdges) {
+ List<Point> points = new ArrayList<Point>(l.getControlPoints());
+ for (Point p : points) {
+ p.x -= minX;
+ p.y -= minY;
+ }
+ l.setControlPoints(points);
+
+ }
+
+ size.width += 2 * BORDER;
+ size.height += 2 * BORDER;
+ }
+
+ public Port getInputSlot() {
+ return inputSlot;
+
+ }
+
+ public Port getOutputSlot() {
+ return outputSlot;
+ }
+
+ public Dimension getSize() {
+ return size;
+ }
+
+ public Point getPosition() {
+ return position;
+ }
+
+ public void setPosition(Point pos) {
+
+ this.position = pos;
+ for (Vertex n : subNodes) {
+ Point cur = new Point(n.getPosition());
+ cur.translate(pos.x + BORDER, pos.y + BORDER);
+ n.setPosition(cur);
+ }
+
+ for (Link e : subEdges) {
+ List<Point> arr = e.getControlPoints();
+ ArrayList<Point> newArr = new ArrayList<Point>();
+ for (Point p : arr) {
+ if (p != null) {
+ Point p2 = new Point(p);
+ p2.translate(pos.x + BORDER, pos.y + BORDER);
+ newArr.add(p2);
+ } else {
+ newArr.add(null);
+ }
+ }
+
+ e.setControlPoints(newArr);
+ }
+ }
+
+ public Cluster getCluster() {
+ return cluster;
+ }
+
+ public void setCluster(Cluster c) {
+ cluster = c;
+ }
+
+ public void setDirty(boolean b) {
+ dirty = b;
+ }
+
+ public void setRoot(boolean b) {
+ root = b;
+ }
+
+ public boolean isRoot() {
+ return root;
+ }
+
+ public int compareTo(Vertex o) {
+ return toString().compareTo(o.toString());
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public Set<? extends Vertex> getSubNodes() {
+ return subNodes;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterOutgoingConnection implements Link {
+
+ private List<Point> intermediatePoints;
+ private ClusterOutputSlotNode outputSlotNode;
+ private Link connection;
+ private Port inputSlot;
+ private Port outputSlot;
+
+ public ClusterOutgoingConnection(ClusterOutputSlotNode outputSlotNode, Link c) {
+ this.outputSlotNode = outputSlotNode;
+ this.connection = c;
+ this.intermediatePoints = new ArrayList<Point>();
+
+ outputSlot = c.getFrom();
+ inputSlot = outputSlotNode.getInputSlot();
+ }
+
+ public Port getTo() {
+ return inputSlot;
+ }
+
+ public Port getFrom() {
+ return outputSlot;
+ }
+
+ public void setControlPoints(List<Point> p) {
+ this.intermediatePoints = p;
+ }
+
+ public List<Point> getControlPoints() {
+ return intermediatePoints;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterOutputSlotNode implements Vertex {
+
+ private final int SIZE = 0;
+ private Point position;
+ private Port inputSlot;
+ private Port outputSlot;
+ private ClusterNode blockNode;
+ private boolean root;
+ private Cluster cluster;
+ private ClusterOutgoingConnection conn;
+ private String id;
+
+ public void setOutgoingConnection(ClusterOutgoingConnection c) {
+ this.conn = c;
+ }
+
+ public ClusterOutgoingConnection getOutgoingConnection() {
+ return conn;
+ }
+
+ @Override
+ public String toString() {
+ return id;
+ }
+
+ public ClusterOutputSlotNode(ClusterNode n, String id) {
+ this.blockNode = n;
+ this.id = id;
+
+ n.addSubNode(this);
+
+ final Vertex thisNode = this;
+ final ClusterNode thisBlockNode = blockNode;
+
+ inputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ return new Point(0, 0);
+ }
+
+ public Vertex getVertex() {
+ return thisNode;
+ }
+
+ @Override
+ public String toString() {
+ return "InPort of " + thisNode.toString();
+ }
+ };
+
+ outputSlot = new Port() {
+
+ public Point getRelativePosition() {
+ Point p = new Point(thisNode.getPosition());
+ p.x += ClusterNode.BORDER;
+ p.y = thisBlockNode.getSize().height;
+ return p;
+ }
+
+ public Vertex getVertex() {
+ return thisBlockNode;
+ }
+
+ @Override
+ public String toString() {
+ return "OutPort of " + thisNode.toString();
+ }
+ };
+ }
+
+ public Dimension getSize() {
+ return new Dimension(SIZE, SIZE);
+ }
+
+ public void setPosition(Point p) {
+ this.position = p;
+ }
+
+ public Point getPosition() {
+ return position;
+ }
+
+ public Port getInputSlot() {
+ return inputSlot;
+ }
+
+ public Port getOutputSlot() {
+ return outputSlot;
+ }
+
+ public void setCluster(Cluster c) {
+ cluster = c;
+ }
+
+ public void setRoot(boolean b) {
+ root = b;
+ }
+
+ public Cluster getCluster() {
+ return cluster;
+ }
+
+ public boolean isRoot() {
+ return root;
+ }
+
+ public int compareTo(Vertex o) {
+ return toString().compareTo(o.toString());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Edge<N, E> {
+
+ private E data;
+ private Node<N, E> source;
+ private Node<N, E> dest;
+
+ protected Edge(Graph<N, E> graph, Node<N, E> source, Node<N, E> dest, E data) {
+ setData(data);
+ this.source = source;
+ this.dest = dest;
+ assert source != null;
+ assert dest != null;
+ assert source.getGraph() == dest.getGraph();
+ assert source.getGraph() != null;
+ assert dest.getGraph() != null;
+ }
+
+ public Node<N, E> getSource() {
+ return source;
+ }
+
+ public Node<N, E> getDest() {
+ return dest;
+ }
+
+ public E getData() {
+ return data;
+ }
+
+ public void setData(E e) {
+ data = e;
+ }
+
+ public void remove() {
+ source.getGraph().removeEdge(this, null);
+ }
+
+ public boolean isSelfLoop() {
+ return source == dest;
+ }
+
+ public void reverse() {
+
+ // Remove from current source / dest
+ source.removeOutEdge(this);
+ dest.removeInEdge(this);
+
+ Node<N, E> tmp = source;
+ source = dest;
+ dest = tmp;
+
+ // Add to new source / dest
+ source.addOutEdge(this);
+ dest.addInEdge(this);
+ }
+
+ public String toString() {
+ return "Edge (" + source + " -- " + dest + "): " + data;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,298 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Graph<N, E> {
+
+ private Hashtable<Object, Node<N, E>> nodes;
+ private Hashtable<Object, Edge<N, E>> edges;
+ private List<Node<N, E>> nodeList;
+
+ public Graph() {
+ nodes = new Hashtable<Object, Node<N, E>>();
+ edges = new Hashtable<Object, Edge<N, E>>();
+ nodeList = new ArrayList<Node<N, E>>();
+ }
+
+ public Node<N, E> createNode(N data, Object key) {
+ Node<N, E> n = new Node<N, E>(this, data);
+ assert key == null || !nodes.containsKey(key);
+ if (key != null) {
+ nodes.put(key, n);
+ }
+ nodeList.add(n);
+ return n;
+ }
+
+ public Edge<N, E> createEdge(Node<N, E> source, Node<N, E> dest, E data, Object key) {
+ Edge<N, E> e = new Edge<N, E>(this, source, dest, data);
+ source.addOutEdge(e);
+ dest.addInEdge(e);
+ if (key != null) {
+ edges.put(key, e);
+ }
+ return e;
+ }
+
+ public Node<N, E> getNode(Object key) {
+ return nodes.get(key);
+ }
+
+ public Edge<N, E> getEdge(Object key) {
+ return edges.get(key);
+ }
+
+ public Collection<Edge<N, E>> getEdges() {
+ return Collections.unmodifiableCollection(edges.values());
+ }
+
+ public Collection<Node<N, E>> getNodes() {
+ return Collections.unmodifiableList(nodeList);
+ }
+
+ public void removeEdge(Edge<N, E> e, Object key) {
+ assert key == null || edges.containsKey(key);
+ if (key != null) {
+ edges.remove(key);
+ }
+ e.getSource().removeOutEdge(e);
+ e.getDest().removeInEdge(e);
+ }
+
+ public class DFSTraversalVisitor {
+
+ public void visitNode(Node<N, E> n) {
+ }
+
+ public boolean visitEdge(Edge<N, E> e, boolean backEdge) {
+ return true;
+ }
+ }
+
+ public class BFSTraversalVisitor {
+
+ public void visitNode(Node<N, E> n, int depth) {
+ }
+ }
+
+ public List<Node<N, E>> getNodesWithInDegree(int x) {
+ return getNodesWithInDegree(x, true);
+ }
+
+ public List<Node<N, E>> getNodesWithInDegree(int x, boolean countSelfLoops) {
+
+ List<Node<N, E>> result = new ArrayList<Node<N, E>>();
+ for (Node<N, E> n : getNodes()) {
+ if (n.getInDegree(countSelfLoops) == x) {
+ result.add(n);
+ }
+ }
+
+ return result;
+
+ }
+
+ private void markReachable(Node<N, E> startingNode) {
+ ArrayList<Node<N, E>> arr = new ArrayList<Node<N, E>>();
+ arr.add(startingNode);
+ for (Node<N, E> n : getNodes()) {
+ n.setReachable(false);
+ }
+ traverseDFS(arr, new DFSTraversalVisitor() {
+
+ @Override
+ public void visitNode(Node<N, E> n) {
+ n.setReachable(true);
+ }
+ });
+ }
+
+ public void traverseBFS(Node<N, E> startingNode, BFSTraversalVisitor tv, boolean longestPath) {
+
+ if (longestPath) {
+ markReachable(startingNode);
+ }
+
+ for (Node<N, E> n : getNodes()) {
+ n.setVisited(false);
+ n.setActive(false);
+ }
+
+ Queue<Node<N, E>> queue = new LinkedList<Node<N, E>>();
+ queue.add(startingNode);
+ startingNode.setVisited(true);
+ int layer = 0;
+ Node<N, E> lastOfLayer = startingNode;
+ Node<N, E> lastAdded = null;
+
+ while (!queue.isEmpty()) {
+
+ Node<N, E> current = queue.poll();
+ tv.visitNode(current, layer);
+ current.setActive(false);
+
+
+ for (Edge<N, E> e : current.getOutEdges()) {
+ if (!e.getDest().isVisited()) {
+
+ boolean allow = true;
+ if (longestPath) {
+ for (Node<N, E> pred : e.getDest().getPredecessors()) {
+ if ((!pred.isVisited() || pred.isActive()) && pred.isReachable()) {
+ allow = false;
+ break;
+ }
+ }
+ }
+
+ if (allow) {
+ queue.offer(e.getDest());
+ lastAdded = e.getDest();
+ e.getDest().setVisited(true);
+ e.getDest().setActive(true);
+ }
+ }
+ }
+
+ if (current == lastOfLayer && !queue.isEmpty()) {
+ lastOfLayer = lastAdded;
+ layer++;
+ }
+ }
+ }
+
+ public void traverseDFS(DFSTraversalVisitor tv) {
+ traverseDFS(getNodes(), tv);
+ }
+
+ public void traverseDFS(Collection<Node<N, E>> startingNodes, DFSTraversalVisitor tv) {
+
+ for (Node<N, E> n : getNodes()) {
+ n.setVisited(false);
+ n.setActive(false);
+ }
+
+ boolean result = false;
+ for (Node<N, E> n : startingNodes) {
+ traverse(tv, n);
+ }
+ }
+
+ private void traverse(DFSTraversalVisitor tv, Node<N, E> n) {
+
+ if (!n.isVisited()) {
+ n.setVisited(true);
+ n.setActive(true);
+ tv.visitNode(n);
+
+ for (Edge<N, E> e : n.getOutEdges()) {
+
+ Node<N, E> next = e.getDest();
+ if (next.isActive()) {
+ tv.visitEdge(e, true);
+ } else {
+ if (tv.visitEdge(e, false)) {
+ traverse(tv, next);
+ }
+ }
+ }
+
+ n.setActive(false);
+ }
+
+ }
+
+ public boolean hasCycles() {
+
+ for (Node<N, E> n : getNodes()) {
+ n.setVisited(false);
+ n.setActive(false);
+ }
+
+ boolean result = false;
+ for (Node<N, E> n : getNodes()) {
+ result |= checkCycles(n);
+ if (result) {
+ break;
+ }
+ }
+ return result;
+ }
+
+ private boolean checkCycles(Node<N, E> n) {
+
+ if (n.isActive()) {
+ return true;
+ }
+
+ if (!n.isVisited()) {
+
+ n.setVisited(true);
+ n.setActive(true);
+
+ for (Node<N, E> succ : n.getSuccessors()) {
+ if (checkCycles(succ)) {
+ return true;
+ }
+ }
+
+ n.setActive(false);
+
+ }
+
+ return false;
+ }
+
+ @Override
+ public String toString() {
+
+ StringBuilder s = new StringBuilder();
+ s.append("Nodes: ");
+ for (Node<N, E> n : getNodes()) {
+ s.append(n.toString());
+ s.append("\n");
+ }
+
+ s.append("Edges: ");
+
+ for (Edge<N, E> e : getEdges()) {
+ s.append(e.toString());
+ s.append("\n");
+ }
+
+ return s.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,247 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.TreeSet;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalClusterLayoutManager implements LayoutManager {
+
+ private OldHierarchicalLayoutManager.Combine combine;
+ private LayoutManager subManager = new OldHierarchicalLayoutManager(combine);
+ private LayoutManager manager = new OldHierarchicalLayoutManager(combine, 150);
+ private static final boolean TRACE = false;
+
+ public HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine combine) {
+ this.combine = combine;
+ }
+
+ public void doLayout(LayoutGraph graph) {
+ doLayout(graph, new HashSet<Vertex>(), new HashSet<Vertex>(), new HashSet<Link>());
+ }
+
+ public void setSubManager(LayoutManager manager) {
+ this.subManager = manager;
+ }
+
+ public void setManager(LayoutManager manager) {
+ this.manager = manager;
+ }
+
+ public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks) {
+
+ assert graph.verify();
+
+ Hashtable<Cluster, List<Vertex>> lists = new Hashtable<Cluster, List<Vertex>>();
+ Hashtable<Cluster, List<Link>> listsConnection = new Hashtable<Cluster, List<Link>>();
+ Hashtable<Cluster, Hashtable<Port, ClusterInputSlotNode>> clusterInputSlotHash = new Hashtable<Cluster, Hashtable<Port, ClusterInputSlotNode>>();
+ Hashtable<Cluster, Hashtable<Port, ClusterOutputSlotNode>> clusterOutputSlotHash = new Hashtable<Cluster, Hashtable<Port, ClusterOutputSlotNode>>();
+
+ Hashtable<Cluster, ClusterNode> clusterNodes = new Hashtable<Cluster, ClusterNode>();
+ Hashtable<Cluster, Set<ClusterInputSlotNode>> clusterInputSlotSet = new Hashtable<Cluster, Set<ClusterInputSlotNode>>();
+ Hashtable<Cluster, Set<ClusterOutputSlotNode>> clusterOutputSlotSet = new Hashtable<Cluster, Set<ClusterOutputSlotNode>>();
+ Set<Link> clusterEdges = new HashSet<Link>();
+ Set<Link> interClusterEdges = new HashSet<Link>();
+ Hashtable<Link, ClusterOutgoingConnection> linkClusterOutgoingConnection = new Hashtable<Link, ClusterOutgoingConnection>();
+ Hashtable<Link, InterClusterConnection> linkInterClusterConnection = new Hashtable<Link, InterClusterConnection>();
+ Hashtable<Link, ClusterIngoingConnection> linkClusterIngoingConnection = new Hashtable<Link, ClusterIngoingConnection>();
+ Set<ClusterNode> clusterNodeSet = new HashSet<ClusterNode>();
+
+ Set<Cluster> cluster = graph.getClusters();
+ int z = 0;
+ for (Cluster c : cluster) {
+ lists.put(c, new ArrayList<Vertex>());
+ listsConnection.put(c, new ArrayList<Link>());
+ clusterInputSlotHash.put(c, new Hashtable<Port, ClusterInputSlotNode>());
+ clusterOutputSlotHash.put(c, new Hashtable<Port, ClusterOutputSlotNode>());
+ clusterOutputSlotSet.put(c, new TreeSet<ClusterOutputSlotNode>());
+ clusterInputSlotSet.put(c, new TreeSet<ClusterInputSlotNode>());
+ ClusterNode cn = new ClusterNode(c, "" + z);
+ clusterNodes.put(c, cn);
+ clusterNodeSet.add(cn);
+ z++;
+ }
+
+ // Add cluster edges
+ for (Cluster c : cluster) {
+
+ ClusterNode start = clusterNodes.get(c);
+
+ for (Cluster succ : c.getSuccessors()) {
+ ClusterNode end = clusterNodes.get(succ);
+ if (end != null && start != end) {
+ ClusterEdge e = new ClusterEdge(start, end);
+ clusterEdges.add(e);
+ interClusterEdges.add(e);
+ }
+ }
+ }
+
+ for (Vertex v : graph.getVertices()) {
+ Cluster c = v.getCluster();
+ assert c != null;
+ clusterNodes.get(c).addSubNode(v);
+ }
+
+ for (Link l : graph.getLinks()) {
+
+ Port fromPort = l.getFrom();
+ Port toPort = l.getTo();
+ Vertex fromVertex = fromPort.getVertex();
+ Vertex toVertex = toPort.getVertex();
+ Cluster fromCluster = fromVertex.getCluster();
+ Cluster toCluster = toVertex.getCluster();
+
+ Port samePort = null;
+ if (combine == OldHierarchicalLayoutManager.Combine.SAME_INPUTS) {
+ samePort = toPort;
+ } else if (combine == OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS) {
+ samePort = fromPort;
+ }
+
+ assert listsConnection.containsKey(fromCluster);
+ assert listsConnection.containsKey(toCluster);
+
+ if (fromCluster == toCluster) {
+ listsConnection.get(fromCluster).add(l);
+ clusterNodes.get(fromCluster).addSubEdge(l);
+ } else {
+ ClusterInputSlotNode inputSlotNode = null;
+ ClusterOutputSlotNode outputSlotNode = null;
+
+ if (samePort != null) {
+ outputSlotNode = clusterOutputSlotHash.get(fromCluster).get(samePort);
+ inputSlotNode = clusterInputSlotHash.get(toCluster).get(samePort);
+ }
+
+ if (outputSlotNode == null) {
+ outputSlotNode = new ClusterOutputSlotNode(clusterNodes.get(fromCluster), "Out " + fromCluster.toString() + " " + samePort.toString());
+ clusterOutputSlotSet.get(fromCluster).add(outputSlotNode);
+ ClusterOutgoingConnection conn = new ClusterOutgoingConnection(outputSlotNode, l);
+ outputSlotNode.setOutgoingConnection(conn);
+ clusterNodes.get(fromCluster).addSubEdge(conn);
+ if (samePort != null) {
+ clusterOutputSlotHash.get(fromCluster).put(samePort, outputSlotNode);
+ }
+
+ linkClusterOutgoingConnection.put(l, conn);
+ } else {
+ linkClusterOutgoingConnection.put(l, outputSlotNode.getOutgoingConnection());
+ }
+
+ if (inputSlotNode == null) {
+ inputSlotNode = new ClusterInputSlotNode(clusterNodes.get(toCluster), "In " + toCluster.toString() + " " + samePort.toString());
+ clusterInputSlotSet.get(toCluster).add(inputSlotNode);
+ }
+
+ ClusterIngoingConnection conn = new ClusterIngoingConnection(inputSlotNode, l);
+ inputSlotNode.setIngoingConnection(conn);
+ clusterNodes.get(toCluster).addSubEdge(conn);
+ if (samePort != null) {
+ clusterInputSlotHash.get(toCluster).put(samePort, inputSlotNode);
+ }
+
+ linkClusterIngoingConnection.put(l, conn);
+
+
+ InterClusterConnection interConn = new InterClusterConnection(outputSlotNode, inputSlotNode);
+ linkInterClusterConnection.put(l, interConn);
+ clusterEdges.add(interConn);
+ }
+ }
+
+ Timing t = null;
+
+ if (TRACE) {
+ new Timing("Child timing");
+ t.start();
+ }
+
+ for (Cluster c : cluster) {
+ ClusterNode n = clusterNodes.get(c);
+ subManager.doLayout(new LayoutGraph(n.getSubEdges(), n.getSubNodes()), clusterInputSlotSet.get(c), clusterOutputSlotSet.get(c), new HashSet<Link>());
+ n.updateSize();
+ }
+
+ Set<Vertex> roots = new LayoutGraph(interClusterEdges).findRootVertices();
+ for (Vertex v : roots) {
+ assert v instanceof ClusterNode;
+ ((ClusterNode) v).setRoot(true);
+ }
+
+ manager.doLayout(new LayoutGraph(clusterEdges, clusterNodeSet), new HashSet<Vertex>(), new HashSet<Vertex>(), interClusterEdges);
+
+ for (Cluster c : cluster) {
+ ClusterNode n = clusterNodes.get(c);
+ c.setBounds(new Rectangle(n.getPosition(), n.getSize()));
+ }
+
+ // TODO: handle case where blocks are not fully connected
+
+ if (TRACE) {
+ t.stop();
+ t.print();
+ }
+
+ for (Link l : graph.getLinks()) {
+
+ if (linkInterClusterConnection.containsKey(l)) {
+ ClusterOutgoingConnection conn1 = linkClusterOutgoingConnection.get(l);
+ InterClusterConnection conn2 = linkInterClusterConnection.get(l);
+ ClusterIngoingConnection conn3 = linkClusterIngoingConnection.get(l);
+
+ assert conn1 != null;
+ assert conn2 != null;
+ assert conn3 != null;
+
+ List<Point> points = new ArrayList<Point>();
+
+ points.addAll(conn1.getControlPoints());
+ points.addAll(conn2.getControlPoints());
+ points.addAll(conn3.getControlPoints());
+
+ l.setControlPoints(points);
+ }
+ }
+ }
+
+ public void doRouting(LayoutGraph graph) {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2110 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.Stack;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalLayoutManager implements LayoutManager {
+
+ public static final boolean TRACE = false;
+ public static final boolean CHECK = false;
+ public static final int SWEEP_ITERATIONS = 1;
+ public static final int CROSSING_ITERATIONS = 2;
+ public static final int DUMMY_HEIGHT = 1;
+ public static final int DUMMY_WIDTH = 1;
+ public static final int X_OFFSET = 9;
+ public static final int LAYER_OFFSET = 30;
+ public static final int MAX_LAYER_LENGTH = -1;
+ public static final int MIN_LAYER_DIFFERENCE = 1;
+
+ public enum Combine {
+
+ NONE,
+ SAME_INPUTS,
+ SAME_OUTPUTS
+ }
+ // Options
+ private Combine combine;
+ private int dummyWidth;
+ private int dummyHeight;
+ private int xOffset;
+ private int layerOffset;
+ private int maxLayerLength;
+ private int minLayerDifference;
+ // Algorithm global datastructures
+ private Set<Link> reversedLinks;
+ private List<LayoutNode> nodes;
+ private HashMap<Vertex, LayoutNode> vertexToLayoutNode;
+ private HashMap<Link, List<Point>> reversedLinkStartPoints;
+ private HashMap<Link, List<Point>> reversedLinkEndPoints;
+ private HashMap<LayoutEdge, LayoutEdge> bottomEdgeHash;
+ private HashMap<Link, List<Point>> splitStartPoints;
+ private HashMap<Link, List<Point>> splitEndPoints;
+ private LayoutGraph graph;
+ private List<LayoutNode>[] layers;
+ private int layerCount;
+ private Set<? extends Vertex> firstLayerHint;
+ private Set<? extends Vertex> lastLayerHint;
+ private Set<? extends Link> importantLinks;
+ private Set<Link> linksToFollow;
+
+ private class LayoutNode {
+
+ public int x;
+ public int y;
+ public int width;
+ public int height;
+ public int layer = -1;
+ public int xOffset;
+ public int yOffset;
+ public int bottomYOffset;
+ public Vertex vertex; // Only used for non-dummy nodes, otherwise null
+ public List<LayoutEdge> preds = new ArrayList<LayoutEdge>();
+ public List<LayoutEdge> succs = new ArrayList<LayoutEdge>();
+ public HashMap<Integer, Integer> outOffsets = new HashMap<Integer, Integer>();
+ public HashMap<Integer, Integer> inOffsets = new HashMap<Integer, Integer>();
+ public int pos = -1; // Position within layer
+ public int crossingNumber;
+
+ @Override
+ public String toString() {
+ return "Node " + vertex;
+ }
+ }
+
+ private class LayoutEdge {
+
+ public LayoutNode from;
+ public LayoutNode to;
+ public int relativeFrom;
+ public int relativeTo;
+ public Link link;
+ }
+
+ private abstract class AlgorithmPart {
+
+ public void start() {
+ if (CHECK) {
+ preCheck();
+ }
+
+ long start = 0;
+ if (TRACE) {
+ System.out.println("##################################################");
+ System.out.println("Starting part " + this.getClass().getName());
+ start = System.currentTimeMillis();
+ }
+ run();
+ if (TRACE) {
+ System.out.println("Timing for " + this.getClass().getName() + " is " + (System.currentTimeMillis() - start));
+ printStatistics();
+ }
+
+ if (CHECK) {
+ postCheck();
+ }
+ }
+
+ protected abstract void run();
+
+ protected void printStatistics() {
+ }
+
+ protected void postCheck() {
+ }
+
+ protected void preCheck() {
+ }
+ }
+
+ public HierarchicalLayoutManager() {
+ this(Combine.NONE);
+ }
+
+ public HierarchicalLayoutManager(Combine b) {
+ this.combine = b;
+ this.dummyWidth = DUMMY_WIDTH;
+ this.dummyHeight = DUMMY_HEIGHT;
+ this.xOffset = X_OFFSET;
+ this.layerOffset = LAYER_OFFSET;
+ this.maxLayerLength = MAX_LAYER_LENGTH;
+ this.minLayerDifference = MIN_LAYER_DIFFERENCE;
+ this.linksToFollow = new HashSet<Link>();
+ }
+
+ public int getMaxLayerLength() {
+ return maxLayerLength;
+ }
+
+ public void setMaxLayerLength(int v) {
+ maxLayerLength = v;
+ }
+
+ public void setMinLayerDifference(int v) {
+ minLayerDifference = v;
+ }
+
+ public void doLayout(LayoutGraph graph) {
+ doLayout(graph, new HashSet<Vertex>(), new HashSet<Vertex>(), new HashSet<Link>());
+
+ }
+
+ public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks) {
+
+ this.importantLinks = importantLinks;
+ this.graph = graph;
+ this.firstLayerHint = firstLayerHint;
+ this.lastLayerHint = lastLayerHint;
+
+ vertexToLayoutNode = new HashMap<Vertex, LayoutNode>();
+ reversedLinks = new HashSet<Link>();
+ reversedLinkStartPoints = new HashMap<Link, List<Point>>();
+ reversedLinkEndPoints = new HashMap<Link, List<Point>>();
+ bottomEdgeHash = new HashMap<LayoutEdge, LayoutEdge>();
+ nodes = new ArrayList<LayoutNode>();
+ splitStartPoints = new HashMap<Link, List<Point>>();
+ splitEndPoints = new HashMap<Link, List<Point>>();
+
+ // #############################################################
+ // Step 1: Build up data structure
+ new BuildDatastructure().start();
+
+ // #############################################################
+ // STEP 2: Reverse edges, handle backedges
+ new ReverseEdges().start();
+
+ for (LayoutNode n : nodes) {
+ ArrayList<LayoutEdge> tmpArr = new ArrayList<LayoutEdge>();
+ for (LayoutEdge e : n.succs) {
+ if (importantLinks.contains(e.link)) {
+ tmpArr.add(e);
+ }
+ }
+
+ for (LayoutEdge e : tmpArr) {
+ //System.out.println("Removed " + e);
+ e.from.succs.remove(e);
+ e.to.preds.remove(e);
+ }
+ }
+
+ // #############################################################
+ // STEP 3: Assign layers
+ new AssignLayers().start();
+
+ // #############################################################
+ // STEP 4: Create dummy nodes
+ new CreateDummyNodes().start();
+
+ // #############################################################
+ // STEP 5: Crossing Reduction
+ new CrossingReduction().start();
+
+ // #############################################################
+ // STEP 7: Assign X coordinates
+ //new AssignXCoordinates().start();
+ new AssignXCoordinates2().start();
+
+ // #############################################################
+ // STEP 6: Assign Y coordinates
+ new AssignYCoordinates().start();
+
+ // #############################################################
+ // STEP 8: Write back to interface
+ new WriteResult().start();
+ }
+
+ private class WriteResult extends AlgorithmPart {
+
+ private int pointCount;
+
+ protected void run() {
+
+ HashMap<Vertex, Point> vertexPositions = new HashMap<Vertex, Point>();
+ HashMap<Link, List<Point>> linkPositions = new HashMap<Link, List<Point>>();
+ for (Vertex v : graph.getVertices()) {
+ LayoutNode n = vertexToLayoutNode.get(v);
+ assert !vertexPositions.containsKey(v);
+ vertexPositions.put(v, new Point(n.x + n.xOffset, n.y + n.yOffset));
+ }
+
+ for (LayoutNode n : nodes) {
+
+ for (LayoutEdge e : n.preds) {
+ if (e.link != null) {
+ ArrayList<Point> points = new ArrayList<Point>();
+
+ Point p = new Point(e.to.x + e.relativeTo, e.to.y + e.to.yOffset);
+ points.add(p);
+ if (e.to.inOffsets.containsKey(e.relativeTo)) {
+ points.add(new Point(p.x, p.y + e.to.inOffsets.get(e.relativeTo)));
+ }
+
+ LayoutNode cur = e.from;
+ LayoutNode other = e.to;
+ LayoutEdge curEdge = e;
+ while (cur.vertex == null && cur.preds.size() != 0) {
+ if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+ points.remove(points.size() - 1);
+ }
+ points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height));
+ if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+ points.remove(points.size() - 1);
+ }
+ points.add(new Point(cur.x + cur.width / 2, cur.y));
+ assert cur.preds.size() == 1;
+ curEdge = cur.preds.get(0);
+ cur = curEdge.from;
+ }
+
+ p = new Point(cur.x + curEdge.relativeFrom, cur.y + cur.height - cur.bottomYOffset);
+ if (curEdge.from.outOffsets.containsKey(curEdge.relativeFrom)) {
+ points.add(new Point(p.x, p.y + curEdge.from.outOffsets.get(curEdge.relativeFrom)));
+ }
+ points.add(p);
+
+ Collections.reverse(points);
+
+
+
+ if (cur.vertex == null && cur.preds.size() == 0) {
+
+ if (reversedLinkEndPoints.containsKey(e.link)) {
+ for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+ points.add(new Point(p1.x + e.to.x, p1.y + e.to.y));
+ }
+ }
+
+ if (splitStartPoints.containsKey(e.link)) {
+ points.add(0, null);
+ points.addAll(0, splitStartPoints.get(e.link));
+
+ //checkPoints(points);
+ if (reversedLinks.contains(e.link)) {
+ Collections.reverse(points);
+ }
+ assert !linkPositions.containsKey(e.link);
+ linkPositions.put(e.link, points);
+ } else {
+ splitEndPoints.put(e.link, points);
+ }
+
+ } else {
+ if (reversedLinks.contains(e.link)) {
+ Collections.reverse(points);
+ }
+ if (reversedLinkStartPoints.containsKey(e.link)) {
+ for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+ points.add(new Point(p1.x + cur.x, p1.y + cur.y));
+ }
+ }
+
+ if (reversedLinkEndPoints.containsKey(e.link)) {
+ for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+ points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+ }
+ }
+
+ assert !linkPositions.containsKey(e.link);
+ linkPositions.put(e.link, points);
+ }
+ pointCount += points.size();
+
+ // No longer needed!
+ e.link = null;
+ }
+ }
+
+ for (LayoutEdge e : n.succs) {
+ if (e.link != null) {
+ ArrayList<Point> points = new ArrayList<Point>();
+ Point p = new Point(e.from.x + e.relativeFrom, e.from.y + e.from.height - e.from.bottomYOffset);
+ points.add(p);
+ if (e.from.outOffsets.containsKey(e.relativeFrom)) {
+ points.add(new Point(p.x, p.y + e.from.outOffsets.get(e.relativeFrom)));
+ }
+
+ LayoutNode cur = e.to;
+ LayoutNode other = e.from;
+ LayoutEdge curEdge = e;
+ while (cur.vertex == null && cur.succs.size() != 0) {
+ if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+ points.remove(points.size() - 1);
+ }
+ points.add(new Point(cur.x + cur.width / 2, cur.y));
+ if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+ points.remove(points.size() - 1);
+ }
+ points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height));
+ if (cur.succs.size() == 0) {
+ break;
+ }
+ assert cur.succs.size() == 1;
+ curEdge = cur.succs.get(0);
+ cur = curEdge.to;
+ }
+
+
+ p = new Point(cur.x + curEdge.relativeTo, cur.y + cur.yOffset);
+ points.add(p);
+ if (curEdge.to.inOffsets.containsKey(curEdge.relativeTo)) {
+ points.add(new Point(p.x, p.y + curEdge.to.inOffsets.get(curEdge.relativeTo)));
+ }
+
+
+ if (cur.succs.size() == 0 && cur.vertex == null) {
+ if (reversedLinkStartPoints.containsKey(e.link)) {
+ for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+ points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+ }
+ }
+
+ if (splitEndPoints.containsKey(e.link)) {
+ points.add(null);
+ points.addAll(splitEndPoints.get(e.link));
+
+ //checkPoints(points);
+ if (reversedLinks.contains(e.link)) {
+ Collections.reverse(points);
+ }
+ assert !linkPositions.containsKey(e.link);
+ linkPositions.put(e.link, points);
+ } else {
+ splitStartPoints.put(e.link, points);
+ }
+ } else {
+
+ if (reversedLinkStartPoints.containsKey(e.link)) {
+ for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+ points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+ }
+ }
+ if (reversedLinkEndPoints.containsKey(e.link)) {
+ for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+ points.add(new Point(p1.x + cur.x, p1.y + cur.y));
+ }
+ }
+ if (reversedLinks.contains(e.link)) {
+ Collections.reverse(points);
+ }
+ //checkPoints(points);
+ assert !linkPositions.containsKey(e.link);
+ linkPositions.put(e.link, points);
+ }
+
+ pointCount += points.size();
+ e.link = null;
+ }
+ }
+ }
+
+ int minX = Integer.MAX_VALUE;
+ int minY = Integer.MAX_VALUE;
+ for (Vertex v : vertexPositions.keySet()) {
+ Point p = vertexPositions.get(v);
+ minX = Math.min(minX, p.x);
+ minY = Math.min(minY, p.y);
+ }
+
+ for (Link l : linkPositions.keySet()) {
+ List<Point> points = linkPositions.get(l);
+ for (Point p : points) {
+ if (p != null) {
+ minX = Math.min(minX, p.x);
+ minY = Math.min(minY, p.y);
+ }
+ }
+
+ }
+
+ for (Vertex v : vertexPositions.keySet()) {
+ Point p = vertexPositions.get(v);
+ p.x -= minX;
+ p.y -= minY;
+ v.setPosition(p);
+ }
+
+ for (Link l : linkPositions.keySet()) {
+ List<Point> points = linkPositions.get(l);
+ for (Point p : points) {
+ if (p != null) {
+ p.x -= minX;
+ p.y -= minY;
+ }
+ }
+ l.setControlPoints(points);
+
+ }
+ }
+
+ @Override
+ protected void printStatistics() {
+ System.out.println("Number of nodes: " + nodes.size());
+ int edgeCount = 0;
+ for (LayoutNode n : nodes) {
+ edgeCount += n.succs.size();
+ }
+ System.out.println("Number of edges: " + edgeCount);
+ System.out.println("Number of points: " + pointCount);
+ }
+ }
+
+ private static class Segment {
+
+ public float d;
+ public int orderNumber = -1;
+ public ArrayList<LayoutNode> nodes = new ArrayList<LayoutNode>();
+ public HashSet<Segment> succs = new HashSet<Segment>();
+ public HashSet<Segment> preds = new HashSet<Segment>();
+ public Region region;
+ }
+ private static final Comparator<Segment> segmentComparator = new Comparator<Segment>() {
+
+ public int compare(Segment s1, Segment s2) {
+ return s1.orderNumber - s2.orderNumber;
+ }
+ };
+
+ private static class Region {
+
+ public float d;
+ public int minOrderNumber;
+ public SortedSet<Segment> segments = new TreeSet<Segment>(segmentComparator);
+ public HashSet<Region> succs = new HashSet<Region>(4);
+ public HashSet<Region> preds = new HashSet<Region>(4);
+ }
+ private static final Comparator<Region> regionComparator = new Comparator<Region>() {
+
+ public int compare(Region r1, Region r2) {
+ return r1.minOrderNumber - r2.minOrderNumber;
+ }
+ };
+ private static final Comparator<LayoutNode> nodePositionComparator = new Comparator<LayoutNode>() {
+
+ public int compare(LayoutNode n1, LayoutNode n2) {
+ return n1.pos - n2.pos;
+ }
+ };
+ private static final Comparator<LayoutNode> nodeProcessingDownComparator = new Comparator<LayoutNode>() {
+
+ public int compare(LayoutNode n1, LayoutNode n2) {
+ if (n1.vertex == null) {
+ return -1;
+ }
+ if (n2.vertex == null) {
+ return 1;
+ }
+ return n1.preds.size() - n2.preds.size();
+ }
+ };
+ private static final Comparator<LayoutNode> nodeProcessingUpComparator = new Comparator<LayoutNode>() {
+
+ public int compare(LayoutNode n1, LayoutNode n2) {
+ if (n1.vertex == null) {
+ return -1;
+ }
+ if (n2.vertex == null) {
+ return 1;
+ }
+ return n1.succs.size() - n2.succs.size();
+ }
+ };
+
+ private class AssignXCoordinates2 extends AlgorithmPart {
+
+ private ArrayList<Integer>[] space;
+ private ArrayList<LayoutNode>[] downProcessingOrder;
+ private ArrayList<LayoutNode>[] upProcessingOrder;
+
+ private void initialPositions() {
+ for (LayoutNode n : nodes) {
+ n.x = space[n.layer].get(n.pos);
+ }
+ }
+
+ protected void run() {
+
+ space = new ArrayList[layers.length];
+ downProcessingOrder = new ArrayList[layers.length];
+ upProcessingOrder = new ArrayList[layers.length];
+
+ for (int i = 0; i < layers.length; i++) {
+ space[i] = new ArrayList<Integer>();
+ downProcessingOrder[i] = new ArrayList<LayoutNode>();
+ upProcessingOrder[i] = new ArrayList<LayoutNode>();
+
+ int curX = 0;
+ for (LayoutNode n : layers[i]) {
+ space[i].add(curX);
+ curX += n.width + xOffset;
+ downProcessingOrder[i].add(n);
+ upProcessingOrder[i].add(n);
+ }
+
+ Collections.sort(downProcessingOrder[i], nodeProcessingDownComparator);
+ Collections.sort(upProcessingOrder[i], nodeProcessingUpComparator);
+ }
+
+ initialPositions();
+ for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+ sweepDown();
+ sweepUp();
+ }
+
+ for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+ doubleSweep();
+ }
+ }
+
+ private int calculateOptimalDown(LayoutNode n) {
+
+ List<Integer> values = new ArrayList<Integer>();
+ if (n.preds.size() == 0) {
+ return n.x;
+ }
+ for (LayoutEdge e : n.preds) {
+ int cur = e.from.x + e.relativeFrom - e.relativeTo;
+ values.add(cur);
+ }
+ return median(values);
+ }
+
+ private int calculateOptimalBoth(LayoutNode n) {
+
+ List<Integer> values = new ArrayList<Integer>();
+ if (n.preds.size() == 0 + n.succs.size()) {
+ return n.x;
+ }
+ for (LayoutEdge e : n.preds) {
+ int cur = e.from.x + e.relativeFrom - e.relativeTo;
+ values.add(cur);
+ }
+
+ for (LayoutEdge e : n.succs) {
+ int cur = e.to.x + e.relativeTo - e.relativeFrom;
+ values.add(cur);
+ }
+
+ return median(values);
+ }
+
+ private int calculateOptimalUp(LayoutNode n) {
+
+ //List<Integer> values = new ArrayList<Integer>();
+ int size = n.succs.size();
+ if (size == 0) {
+ return n.x;
+ } else {
+ int result = 0;
+ for (LayoutEdge e : n.succs) {
+ int cur = e.to.x + e.relativeTo - e.relativeFrom;
+ result += cur;
+ }
+ return result / size; //median(values);
+ }
+ }
+
+ private int median(List<Integer> values) {
+ Collections.sort(values);
+ if (values.size() % 2 == 0) {
+ return (values.get(values.size() / 2 - 1) + values.get(values.size() / 2)) / 2;
+ } else {
+ return values.get(values.size() / 2);
+ }
+ }
+
+ private void sweepUp() {
+ for (int i = layers.length - 1; i >= 0; i--) {
+ NodeRow r = new NodeRow(space[i]);
+ for (LayoutNode n : upProcessingOrder[i]) {
+ int optimal = calculateOptimalUp(n);
+ r.insert(n, optimal);
+ }
+ }
+ /*
+ for(int i=0; i<layers.length; i++) {
+ NodeRow r = new NodeRow(space[i]);
+ for(LayoutNode n : upProcessingOrder[i]) {
+ int optimal = calculateOptimalUp(n);
+ r.insert(n, optimal);
+ }
+ }*/
+ }
+
+ private void doubleSweep() {
+ for (int i = layers.length - 2; i >= 0; i--) {
+ NodeRow r = new NodeRow(space[i]);
+ for (LayoutNode n : upProcessingOrder[i]) {
+ int optimal = calculateOptimalBoth(n);
+ r.insert(n, optimal);
+ }
+ }
+ }
+
+ private void sweepDown() {
+ for (int i = 1; i < layers.length; i++) {
+ NodeRow r = new NodeRow(space[i]);
+ for (LayoutNode n : downProcessingOrder[i]) {
+ int optimal = calculateOptimalDown(n);
+ r.insert(n, optimal);
+ }
+ }
+ }
+ }
+
+ private static class NodeRow {
+
+ private TreeSet<LayoutNode> treeSet;
+ private ArrayList<Integer> space;
+
+ public NodeRow(ArrayList<Integer> space) {
+ treeSet = new TreeSet<LayoutNode>(nodePositionComparator);
+ this.space = space;
+ }
+
+ public int offset(LayoutNode n1, LayoutNode n2) {
+ int v1 = space.get(n1.pos) + n1.width;
+ int v2 = space.get(n2.pos);
+ return v2 - v1;
+ }
+
+ public void insert(LayoutNode n, int pos) {
+
+ SortedSet<LayoutNode> headSet = treeSet.headSet(n);
+
+ LayoutNode leftNeighbor = null;
+ int minX = Integer.MIN_VALUE;
+ if (!headSet.isEmpty()) {
+ leftNeighbor = headSet.last();
+ minX = leftNeighbor.x + leftNeighbor.width + offset(leftNeighbor, n);
+ }
+
+ if (pos < minX) {
+ n.x = minX;
+ } else {
+
+ LayoutNode rightNeighbor = null;
+ SortedSet<LayoutNode> tailSet = treeSet.tailSet(n);
+ int maxX = Integer.MAX_VALUE;
+ if (!tailSet.isEmpty()) {
+ rightNeighbor = tailSet.first();
+ maxX = rightNeighbor.x - offset(n, rightNeighbor) - n.width;
+ }
+
+ if (pos > maxX) {
+ n.x = maxX;
+ } else {
+ n.x = pos;
+ }
+
+ assert minX <= maxX;
+ }
+
+ treeSet.add(n);
+ }
+ }
+
+ private class AssignXCoordinates extends AlgorithmPart {
+
+ HashMap<LayoutNode, Segment> hashMap = new HashMap<LayoutNode, Segment>();
+ ArrayList<Segment> segments = new ArrayList<Segment>();
+
+ private void generateSegments() {
+
+ for (int i = 0; i < layerCount; i++) {
+ for (LayoutNode n : layers[i]) {
+ if (!hashMap.containsKey(n)) {
+ Segment s = new Segment();
+ segments.add(s);
+ LayoutNode curNode = n;
+
+ int maxLength = 0;
+ while (curNode.succs.size() == 1 && curNode.preds.size() == 1) {
+ s.nodes.add(curNode);
+ assert !hashMap.containsKey(curNode);
+ hashMap.put(curNode, s);
+ curNode = curNode.succs.get(0).to;
+ maxLength++;
+ //if(maxLength > 10) break;
+ }
+
+ if (s.nodes.size() > 0 && curNode.preds.size() == 1 && curNode.vertex == null) {
+ s.nodes.add(curNode);
+ assert !hashMap.containsKey(curNode);
+ hashMap.put(curNode, s);
+ }
+
+ if (s.nodes.size() == 0) {
+ // Simple segment with a single node
+ s.nodes.add(n);
+ hashMap.put(n, s);
+ }
+ }
+ }
+ }
+ }
+
+ private void addEdges() {
+
+ for (int i = 0; i < layerCount; i++) {
+ LayoutNode prev = null;
+ for (LayoutNode n : layers[i]) {
+
+ if (prev != null) {
+ Segment s1 = hashMap.get(prev);
+ Segment s2 = hashMap.get(n);
+
+ if (s1 != s2) {
+ s1.succs.add(s2);
+ s2.preds.add(s1);
+ }
+ }
+ prev = n;
+
+ }
+ }
+ }
+
+ private void topologicalSorting() {
+
+ Queue<Segment> queue = new LinkedList<Segment>();
+
+ int index = 0;
+ ArrayList<Segment> newList = new ArrayList<Segment>();
+ for (Segment s : segments) {
+ if (s.preds.size() == 0) {
+ s.orderNumber = index;
+ newList.add(s);
+ index++;
+ queue.add(s);
+ }
+ }
+
+ while (!queue.isEmpty()) {
+ Segment s = queue.remove();
+
+ for (Segment succ : s.succs) {
+ succ.preds.remove(s);
+ if (succ.preds.size() == 0) {
+ queue.add(succ);
+ succ.orderNumber = index;
+ newList.add(succ);
+ index++;
+ }
+ }
+ }
+
+ segments = newList;
+ }
+
+ private void initialPositions() {
+
+ int[] minPos = new int[layers.length];
+
+ for (Segment s : segments) {
+ int max = 0;
+ for (LayoutNode n : s.nodes) {
+ int x = minPos[n.layer];
+ if (x > max) {
+ max = x;
+ }
+ }
+
+ for (LayoutNode n : s.nodes) {
+ minPos[n.layer] = max + n.width + xOffset;
+ n.x = max;
+ }
+ }
+ }
+
+ private int predSum(LayoutNode n) {
+ int sum = 0;
+ for (LayoutEdge e : n.preds) {
+ assert e.to == n;
+ //sum += (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d) - (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d);
+ sum += (e.from.x + e.relativeFrom) - (e.to.x + e.relativeTo);
+ }
+
+ return sum;
+ }
+
+ private int succSum(LayoutNode n) {
+ int sum = 0;
+ for (LayoutEdge e : n.succs) {
+
+ assert e.from == n;
+ sum += (e.to.x + e.relativeTo) - (e.from.x + e.relativeFrom);
+ //sum += (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d) - (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d);
+ }
+
+ return sum;
+
+ }
+
+ private void downValues() {
+
+ for (Segment s : segments) {
+ downValues(s);
+
+ }
+
+ }
+
+ private void downValues(Segment s) {
+ LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate
+
+ if (n.preds.size() == 0) {
+ // Value is 0.0;
+ if (n.succs.size() == 0) {
+ s.d = 0.0f;
+ } else {
+ s.d = (((float) succSum(n) / (float) n.succs.size())) / 2;
+ }
+ } else {
+ s.d = (float) predSum(n) / (float) n.preds.size();
+ }
+ }
+
+ private void upValues() {
+ for (Segment s : segments) {
+ upValues(s);
+ }
+ }
+
+ private void upValues(Segment s) {
+ LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate
+
+ if (n.succs.size() == 0) {
+ // Value is 0.0;
+ if (n.preds.size() == 0) {
+ s.d = 0.0f;
+ } else {
+ s.d = (float) predSum(n) / (float) n.preds.size();
+ }
+ } else {
+ s.d = ((float) succSum(n) / (float) n.succs.size()) / 2;
+ }
+ }
+
+ private void sweep(boolean down) {
+
+ if (down) {
+ downValues();
+ } else {
+ upValues();
+ }
+
+ SortedSet<Region> regions = new TreeSet<Region>(regionComparator);
+ for (Segment s : segments) {
+ s.region = new Region();
+ s.region.minOrderNumber = s.orderNumber;
+ s.region.segments.add(s);
+ s.region.d = s.d;
+ regions.add(s.region);
+ }
+
+ for (Segment s : segments) {
+ for (LayoutNode n : s.nodes) {
+ if (n.pos != 0) {
+ LayoutNode prevNode = layers[n.layer].get(n.pos - 1);
+ if (prevNode.x + prevNode.width + xOffset == n.x) {
+ Segment other = hashMap.get(prevNode);
+ Region r1 = s.region;
+ Region r2 = other.region;
+ // They are close together
+ if (r1 != r2 && r2.d >= r1.d) {
+
+ if (r2.segments.size() < r1.segments.size()) {
+
+ r1.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size());
+
+ for (Segment tempS : r2.segments) {
+ r1.segments.add(tempS);
+ tempS.region = r1;
+ r1.minOrderNumber = Math.min(r1.minOrderNumber, tempS.orderNumber);
+ }
+
+ regions.remove(r2);
+ } else {
+
+ r2.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size());
+
+ for (Segment tempS : r1.segments) {
+ r2.segments.add(tempS);
+ tempS.region = r2;
+ r2.minOrderNumber = Math.min(r2.minOrderNumber, tempS.orderNumber);
+ }
+
+ regions.remove(r1);
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+
+ ArrayList<Region> reversedRegions = new ArrayList<Region>();
+ for (Region r : regions) {
+ if (r.d < 0) {
+ processRegion(r, down);
+ } else {
+ reversedRegions.add(0, r);
+ }
+ }
+
+ for (Region r : reversedRegions) {
+ processRegion(r, down);
+ }
+
+ }
+
+ private void processRegion(Region r, boolean down) {
+
+ // Do not move
+ if ((int) r.d == 0) {
+ return;
+ }
+
+ ArrayList<Segment> arr = new ArrayList<Segment>();
+ for (Segment s : r.segments) {
+ arr.add(s);
+ }
+
+ if (r.d > 0) {
+ Collections.reverse(arr);
+ }
+
+ for (Segment s : arr) {
+
+
+ int min = (int) r.d;
+ if (min < 0) {
+ min = -min;
+ }
+
+ for (LayoutNode n : s.nodes) {
+
+ int layer = n.layer;
+ int pos = n.pos;
+
+
+ if (r.d > 0) {
+
+ if (pos != layers[layer].size() - 1) {
+
+ int off = layers[layer].get(pos + 1).x - n.x - xOffset - n.width;
+ assert off >= 0;
+ if (off < min) {
+ min = off;
+ }
+ }
+
+ } else {
+
+ if (pos != 0) {
+
+ int off = n.x - xOffset - layers[layer].get(pos - 1).x - layers[layer].get(pos - 1).width;
+ assert off >= 0;
+ if (off < min) {
+ min = off;
+ }
+ }
+ }
+ }
+
+ assert min >= 0;
+ if (min != 0) {
+ for (LayoutNode n : s.nodes) {
+ if (r.d > 0) {
+ n.x += min;
+ } else {
+ n.x -= min;
+ }
+
+ }
+ }
+ }
+ }
+
+ protected void run() {
+
+ generateSegments();
+ addEdges();
+ topologicalSorting();
+ initialPositions();
+ for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+
+ sweep(true);
+ sweep(true);
+ sweep(false);
+ sweep(false);
+ }
+
+ sweep(true);
+ sweep(true);
+ }
+ }
+ private static Comparator<LayoutNode> crossingNodeComparator = new Comparator<LayoutNode>() {
+
+ public int compare(LayoutNode n1, LayoutNode n2) {
+ return n1.crossingNumber - n2.crossingNumber;
+ }
+ };
+
+ private class CrossingReduction extends AlgorithmPart {
+
+ @Override
+ public void preCheck() {
+ for (LayoutNode n : nodes) {
+ assert n.layer < layerCount;
+ }
+ }
+
+ protected void run() {
+
+ layers = new List[layerCount];
+
+ for (int i = 0; i < layerCount; i++) {
+ layers[i] = new ArrayList<LayoutNode>();
+ }
+
+
+ // Generate initial ordering
+ HashSet<LayoutNode> visited = new HashSet<LayoutNode>();
+ for (LayoutNode n : nodes) {
+ if (n.layer == 0) {
+ layers[0].add(n);
+ visited.add(n);
+ } else if (n.preds.size() == 0) {
+ layers[n.layer].add(n);
+ visited.add(n);
+ }
+ }
+
+ for (int i = 0; i < layers.length - 1; i++) {
+ for (LayoutNode n : layers[i]) {
+ for (LayoutEdge e : n.succs) {
+ if (!visited.contains(e.to)) {
+ visited.add(e.to);
+ layers[i + 1].add(e.to);
+ }
+ }
+ }
+ }
+
+
+ updatePositions();
+
+ initX();
+
+ // Optimize
+ for (int i = 0; i < CROSSING_ITERATIONS; i++) {
+ downSweep();
+ upSweep();
+ }
+
+ /*for(int i=0; i<CROSSING_ITERATIONS; i++) {
+ doubleSweep();
+ }*/
+ }
+
+ private void initX() {
+
+ for (int i = 0; i < layers.length; i++) {
+ updateXOfLayer(i);
+ }
+ }
+
+ private void updateXOfLayer(int index) {
+ int x = 0;
+
+ for (LayoutNode n : layers[index]) {
+ n.x = x;
+ x += n.width + X_OFFSET;
+ }
+ }
+
+ private void updatePositions() {
+
+ for (int i = 0; i < layers.length; i++) {
+ int z = 0;
+ for (LayoutNode n : layers[i]) {
+ n.pos = z;
+ z++;
+ }
+ }
+ }
+
+ private void downSweep() {
+
+ // Downsweep
+ for (int i = 1; i < layerCount; i++) {
+
+ for (LayoutNode n : layers[i]) {
+ n.crossingNumber = 0;
+ }
+
+ for (LayoutNode n : layers[i]) {
+
+ int sum = 0;
+ for (LayoutEdge e : n.preds) {
+ int cur = e.from.x + e.relativeFrom;
+
+ /*pos;
+ if(e.from.width != 0 && e.relativeFrom != 0) {
+ cur += (float)e.relativeFrom / (float)(e.from.width);
+ }*/
+
+ sum += cur;
+ }
+
+ if (n.preds.size() > 0) {
+ sum /= n.preds.size();
+ n.crossingNumber = sum;
+ //if(n.vertex == null) n.crossingNumber += layers[i].size();
+ }
+ }
+
+
+ updateCrossingNumbers(i, true);
+ Collections.sort(layers[i], crossingNodeComparator);
+ updateXOfLayer(i);
+
+ int z = 0;
+ for (LayoutNode n : layers[i]) {
+ n.pos = z;
+ z++;
+ }
+ }
+ }
+
+ private void updateCrossingNumbers(int index, boolean down) {
+ for (int i = 0; i < layers[index].size(); i++) {
+ LayoutNode n = layers[index].get(i);
+ LayoutNode prev = null;
+ if (i > 0) {
+ prev = layers[index].get(i - 1);
+ }
+ LayoutNode next = null;
+ if (i < layers[index].size() - 1) {
+ next = layers[index].get(i + 1);
+ }
+
+ boolean cond = (n.succs.size() == 0);
+ if (down) {
+ cond = (n.preds.size() == 0);
+ }
+
+ if (cond) {
+
+ if (prev != null && next != null) {
+ n.crossingNumber = (prev.crossingNumber + next.crossingNumber) / 2;
+ } else if (prev != null) {
+ n.crossingNumber = prev.crossingNumber;
+ } else if (next != null) {
+ n.crossingNumber = next.crossingNumber;
+ }
+ }
+ }
+ }
+ /*
+ private void doubleSweep() {
+ // Downsweep
+ for(int i=0; i<layerCount*2; i++) {
+ int index = i;
+ if(index >= layerCount) {
+ index = 2*layerCount - i - 1;
+ }
+ for(LayoutNode n : layers[index]) {
+ float sum = 0.0f;
+ for(LayoutEdge e : n.preds) {
+ float cur = e.from.pos;
+ if(e.from.width != 0 && e.relativeFrom != 0) {
+ cur += (float)e.relativeFrom / (float)(e.from.width);
+ }
+ sum += cur;
+ }
+ for(LayoutEdge e : n.succs) {
+ float cur = e.to.pos;
+ if(e.to.width != 0 && e.relativeTo != 0) {
+ cur += (float)e.relativeTo / (float)(e.to.width);
+ }
+ sum += cur;
+ }
+ if(n.preds.size() + n.succs.size() > 0) {
+ sum /= n.preds.size() + n.succs.size();
+ n.crossingNumber = sum;
+ }
+ }
+ Collections.sort(layers[index], crossingNodeComparator);
+ updateXOfLayer(index);
+ int z = 0;
+ for(LayoutNode n : layers[index]) {
+ n.pos = z;
+ z++;
+ }
+ }
+ }*/
+
+ private void upSweep() {
+ // Upsweep
+ for (int i = layerCount - 2; i >= 0; i--) {
+
+ for (LayoutNode n : layers[i]) {
+ n.crossingNumber = 0;
+ }
+
+ for (LayoutNode n : layers[i]) {
+
+ int sum = 0;
+ for (LayoutEdge e : n.succs) {
+ int cur = e.to.x + e.relativeTo;//pos;
+ /*
+ if(e.to.width != 0 && e.relativeTo != 0) {
+ cur += (float)e.relativeTo / (float)(e.to.width);
+ }*/
+
+ sum += cur;
+ }
+
+ if (n.succs.size() > 0) {
+ sum /= n.succs.size();
+ n.crossingNumber = sum;
+ //if(n.vertex == null) n.crossingNumber += layers[i].size();
+ }
+
+ }
+
+ updateCrossingNumbers(i, false);
+ Collections.sort(layers[i], crossingNodeComparator);
+ updateXOfLayer(i);
+
+ int z = 0;
+ for (LayoutNode n : layers[i]) {
+ n.pos = z;
+ z++;
+ }
+ }
+ }
+
+ private int evaluate() {
+ // TODO: Implement efficient evaluate / crossing min
+ return 0;
+ }
+
+ @Override
+ public void postCheck() {
+
+ HashSet<LayoutNode> visited = new HashSet<LayoutNode>();
+ for (int i = 0; i < layers.length; i++) {
+ for (LayoutNode n : layers[i]) {
+ assert !visited.contains(n);
+ assert n.layer == i;
+ visited.add(n);
+ }
+ }
+
+ }
+ }
+
+ private class AssignYCoordinates extends AlgorithmPart {
+
+ protected void run() {
+ int curY = 0;
+ //maxLayerHeight = new int[layers.length];
+ for (int i = 0; i < layers.length; i++) {
+ int maxHeight = 0;
+ int baseLine = 0;
+ int bottomBaseLine = 0;
+ for (LayoutNode n : layers[i]) {
+ maxHeight = Math.max(maxHeight, n.height - n.yOffset - n.bottomYOffset);
+ baseLine = Math.max(baseLine, n.yOffset);
+ bottomBaseLine = Math.max(bottomBaseLine, n.bottomYOffset);
+ }
+
+ int maxXOffset = 0;
+ for (LayoutNode n : layers[i]) {
+ if (n.vertex == null) {
+ // Dummy node
+ n.y = curY;
+ n.height = maxHeight + baseLine + bottomBaseLine;
+
+ } else {
+ n.y = curY + baseLine + (maxHeight - (n.height - n.yOffset - n.bottomYOffset)) / 2 - n.yOffset;
+ }
+
+ for (LayoutEdge e : n.succs) {
+ int curXOffset = Math.abs(n.x - e.to.x);
+ maxXOffset = Math.max(curXOffset, maxXOffset);
+ }
+ }
+
+ //maxLayerHeight[i] = maxHeight + baseLine + bottomBaseLine;
+
+ curY += maxHeight + baseLine + bottomBaseLine;
+ curY += layerOffset + (int) Math.sqrt(maxXOffset);
+ }
+ }
+ }
+
+ private class CreateDummyNodes extends AlgorithmPart {
+
+ private int oldNodeCount;
+
+ @Override
+ protected void preCheck() {
+ for (LayoutNode n : nodes) {
+ for (LayoutEdge e : n.succs) {
+ assert e.from != null;
+ assert e.from == n;
+ assert e.from.layer < e.to.layer;
+ }
+
+ for (LayoutEdge e : n.preds) {
+ assert e.to != null;
+ assert e.to == n;
+ }
+ }
+ }
+
+ protected void run() {
+ oldNodeCount = nodes.size();
+
+
+ if (combine == Combine.SAME_OUTPUTS) {
+
+ Comparator<LayoutEdge> comparator = new Comparator<LayoutEdge>() {
+
+ public int compare(LayoutEdge e1, LayoutEdge e2) {
+ return e1.to.layer - e2.to.layer;
+ }
+ };
+ HashMap<Integer, List<LayoutEdge>> portHash = new HashMap<Integer, List<LayoutEdge>>();
+ ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+ for (LayoutNode n : currentNodes) {
+ portHash.clear();
+
+ ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(n.succs);
+ HashMap<Integer, LayoutNode> topNodeHash = new HashMap<Integer, LayoutNode>();
+ HashMap<Integer, HashMap<Integer, LayoutNode>> bottomNodeHash = new HashMap<Integer, HashMap<Integer, LayoutNode>>();
+ for (LayoutEdge e : succs) {
+ assert e.from.layer < e.to.layer;
+ if (e.from.layer != e.to.layer - 1) {
+ if (maxLayerLength != -1 && e.to.layer - e.from.layer > maxLayerLength/* && e.to.preds.size() > 1 && e.from.succs.size() > 1*/) {
+ assert maxLayerLength > 2;
+ e.to.preds.remove(e);
+ e.from.succs.remove(e);
+
+ LayoutEdge topEdge = null;
+
+ if (combine == Combine.SAME_OUTPUTS && topNodeHash.containsKey(e.relativeFrom)) {
+ LayoutNode topNode = topNodeHash.get(e.relativeFrom);
+ topEdge = new LayoutEdge();
+ topEdge.relativeFrom = e.relativeFrom;
+ topEdge.from = e.from;
+ topEdge.relativeTo = topNode.width / 2;
+ topEdge.to = topNode;
+ topEdge.link = e.link;
+ e.from.succs.add(topEdge);
+ topNode.preds.add(topEdge);
+ } else {
+
+ LayoutNode topNode = new LayoutNode();
+ topNode.layer = e.from.layer + 1;
+ topNode.width = DUMMY_WIDTH;
+ topNode.height = DUMMY_HEIGHT;
+ nodes.add(topNode);
+ topEdge = new LayoutEdge();
+ topEdge.relativeFrom = e.relativeFrom;
+ topEdge.from = e.from;
+ topEdge.relativeTo = topNode.width / 2;
+ topEdge.to = topNode;
+ topEdge.link = e.link;
+ e.from.succs.add(topEdge);
+ topNode.preds.add(topEdge);
+ topNodeHash.put(e.relativeFrom, topNode);
+ bottomNodeHash.put(e.relativeFrom, new HashMap<Integer, LayoutNode>());
+ }
+
+ HashMap<Integer, LayoutNode> hash = bottomNodeHash.get(e.relativeFrom);
+
+ LayoutNode bottomNode = null;
+ if (hash.containsKey(e.to.layer)) {
+ bottomNode = hash.get(e.to.layer);
+ } else {
+
+ bottomNode = new LayoutNode();
+ bottomNode.layer = e.to.layer - 1;
+ bottomNode.width = DUMMY_WIDTH;
+ bottomNode.height = DUMMY_HEIGHT;
+ nodes.add(bottomNode);
+ hash.put(e.to.layer, bottomNode);
+ }
+
+ LayoutEdge bottomEdge = new LayoutEdge();
+ bottomEdge.relativeTo = e.relativeTo;
+ bottomEdge.to = e.to;
+ bottomEdge.relativeFrom = bottomNode.width / 2;
+ bottomEdge.from = bottomNode;
+ bottomEdge.link = e.link;
+ e.to.preds.add(bottomEdge);
+ bottomEdgeHash.put(topEdge, bottomEdge);
+ bottomNode.succs.add(bottomEdge);
+
+ } else {
+ Integer i = e.relativeFrom;
+ if (!portHash.containsKey(i)) {
+ portHash.put(i, new ArrayList<LayoutEdge>());
+ }
+
+ if (n.vertex.toString().equals("1012 CastPP")) {
+ int x = 0;
+ }
+
+ portHash.get(i).add(e);
+ }
+ }
+ }
+
+ succs = new ArrayList<LayoutEdge>(n.succs);
+ for (LayoutEdge e : succs) {
+
+ Integer i = e.relativeFrom;
+ if (portHash.containsKey(i)) {
+
+ List<LayoutEdge> list = portHash.get(i);
+ Collections.sort(list, comparator);
+
+ if (list.size() == 1) {
+ processSingleEdge(list.get(0));
+ } else {
+
+ int maxLayer = list.get(0).to.layer;
+ for (LayoutEdge curEdge : list) {
+ maxLayer = Math.max(maxLayer, curEdge.to.layer);
+ }
+
+
+ int cnt = maxLayer - n.layer - 1;
+ LayoutEdge[] edges = new LayoutEdge[cnt];
+ LayoutNode[] nodes = new LayoutNode[cnt];
+ edges[0] = new LayoutEdge();
+ edges[0].from = n;
+ edges[0].relativeFrom = i;
+ n.succs.add(edges[0]);
+
+ nodes[0] = new LayoutNode();
+ nodes[0].width = dummyWidth;
+ nodes[0].height = dummyHeight;
+ nodes[0].layer = n.layer + 1;
+ nodes[0].preds.add(edges[0]);
+ edges[0].to = nodes[0];
+ edges[0].relativeTo = nodes[0].width / 2;
+ for (int j = 1; j < cnt; j++) {
+ edges[j] = new LayoutEdge();
+ edges[j].from = nodes[j - 1];
+ edges[j].relativeFrom = nodes[j - 1].width / 2;
+ nodes[j - 1].succs.add(edges[j]);
+ nodes[j] = new LayoutNode();
+ nodes[j].width = dummyWidth;
+ nodes[j].height = dummyHeight;
+ nodes[j].layer = n.layer + j + 1;
+ nodes[j].preds.add(edges[j]);
+ edges[j].to = nodes[j];
+ edges[j].relativeTo = nodes[j].width / 2;
+ }
+
+ for (LayoutEdge curEdge : list) {
+ assert curEdge.to.layer - n.layer - 2 >= 0;
+ assert curEdge.to.layer - n.layer - 2 < cnt;
+ LayoutNode anchor = nodes[curEdge.to.layer - n.layer - 2];
+ anchor.succs.add(curEdge);
+ curEdge.from = anchor;
+ curEdge.relativeFrom = anchor.width / 2;
+ n.succs.remove(curEdge);
+ }
+
+ }
+
+ portHash.remove(i);
+ }
+ }
+ }
+ } else if (combine == Combine.SAME_INPUTS) {
+ throw new UnsupportedOperationException("Currently not supported");
+ } else {
+ ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+ for (LayoutNode n : currentNodes) {
+ for (LayoutEdge e : n.succs) {
+ processSingleEdge(e);
+ }
+ }
+ }
+ }
+
+ private void processSingleEdge(LayoutEdge e) {
+ LayoutNode n = e.from;
+ if (e.to.layer > n.layer + 1) {
+ LayoutEdge last = e;
+ for (int i = n.layer + 1; i < last.to.layer; i++) {
+ last = addBetween(last, i);
+ }
+ }
+ }
+
+ private LayoutEdge addBetween(LayoutEdge e, int layer) {
+ LayoutNode n = new LayoutNode();
+ n.width = dummyWidth;
+ n.height = dummyHeight;
+ n.layer = layer;
+ n.preds.add(e);
+ nodes.add(n);
+ LayoutEdge result = new LayoutEdge();
+ n.succs.add(result);
+ result.from = n;
+ result.relativeFrom = n.width / 2;
+ result.to = e.to;
+ result.relativeTo = e.relativeTo;
+ e.relativeTo = n.width / 2;
+ e.to.preds.remove(e);
+ e.to.preds.add(result);
+ e.to = n;
+ return result;
+ }
+
+ @Override
+ public void printStatistics() {
+ System.out.println("Dummy nodes created: " + (nodes.size() - oldNodeCount));
+ }
+
+ @Override
+ public void postCheck() {
+ ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+ for (LayoutNode n : currentNodes) {
+ for (LayoutEdge e : n.succs) {
+ assert e.from.layer == e.to.layer - 1;
+ }
+ }
+
+ for (int i = 0; i < layers.length; i++) {
+ assert layers[i].size() > 0;
+ for (LayoutNode n : layers[i]) {
+ assert n.layer == i;
+ }
+ }
+ }
+ }
+
+ private class AssignLayers extends AlgorithmPart {
+
+ @Override
+ public void preCheck() {
+ for (LayoutNode n : nodes) {
+ assert n.layer == -1;
+ }
+ }
+
+ protected void run() {
+ HashSet<LayoutNode> set = new HashSet<LayoutNode>();
+ for (LayoutNode n : nodes) {
+ if (n.preds.size() == 0) {
+ set.add(n);
+ n.layer = 0;
+ }
+ }
+
+ int z = minLayerDifference;
+ HashSet<LayoutNode> newSet = new HashSet<LayoutNode>();
+ HashSet<LayoutNode> failed = new HashSet<LayoutNode>();
+ while (!set.isEmpty()) {
+
+ newSet.clear();
+ failed.clear();
+
+ for (LayoutNode n : set) {
+
+ for (LayoutEdge se : n.succs) {
+ LayoutNode s = se.to;
+ if (!newSet.contains(s) && !failed.contains(s)) {
+ boolean ok = true;
+ for (LayoutEdge pe : s.preds) {
+ LayoutNode p = pe.from;
+ if (p.layer == -1) {
+ ok = false;
+ break;
+ }
+ }
+
+ if (ok) {
+ newSet.add(s);
+ } else {
+ failed.add(s);
+ }
+ }
+ }
+
+ }
+
+ for (LayoutNode n : newSet) {
+ n.layer = z;
+ }
+
+ // Swap sets
+ HashSet<LayoutNode> tmp = set;
+ set = newSet;
+ newSet = tmp;
+ z += minLayerDifference;
+ }
+
+ optimize(set);
+
+ layerCount = z - minLayerDifference;
+
+ for (Vertex v : lastLayerHint) {
+
+ LayoutNode n = vertexToLayoutNode.get(v);
+ assert n.succs.size() == 0;
+ n.layer = layerCount - 1;
+ }
+
+ for (Vertex v : firstLayerHint) {
+ LayoutNode n = vertexToLayoutNode.get(v);
+ assert n.preds.size() == 0;
+ assert n.layer == 0;
+ }
+ }
+
+ public void optimize(HashSet<LayoutNode> set) {
+
+ for (LayoutNode n : set) {
+ if (n.preds.size() == 0 && n.succs.size() > 0) {
+ int minLayer = n.succs.get(0).to.layer;
+ for (LayoutEdge e : n.succs) {
+ minLayer = Math.min(minLayer, e.to.layer);
+ }
+
+ n.layer = minLayer - 1;
+ }
+ }
+
+ }
+
+ @Override
+ public void postCheck() {
+ for (LayoutNode n : nodes) {
+ assert n.layer >= 0;
+ assert n.layer < layerCount;
+ for (LayoutEdge e : n.succs) {
+ assert e.from.layer < e.to.layer;
+ }
+ }
+ }
+ }
+
+ private class ReverseEdges extends AlgorithmPart {
+
+ private HashSet<LayoutNode> visited;
+ private HashSet<LayoutNode> active;
+
+ protected void run() {
+
+ // Remove self-edges, TODO: Special treatment
+ for (LayoutNode node : nodes) {
+ ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(node.succs);
+ for (LayoutEdge e : succs) {
+ assert e.from == node;
+ if (e.to == node) {
+ node.succs.remove(e);
+ node.preds.remove(e);
+ }
+ }
+ }
+
+ // Reverse inputs of roots
+ for (LayoutNode node : nodes) {
+ if (node.vertex.isRoot()) {
+ boolean ok = true;
+ for (LayoutEdge e : node.preds) {
+ if (e.from.vertex.isRoot()) {
+ ok = false;
+ break;
+ }
+ }
+ if (ok) {
+ reverseAllInputs(node);
+ }
+ }
+ }
+
+
+ // Start DFS and reverse back edges
+ visited = new HashSet<LayoutNode>();
+ active = new HashSet<LayoutNode>();
+ for (LayoutNode node : nodes) {
+ DFS(node);
+ }
+
+
+ for (LayoutNode node : nodes) {
+
+ SortedSet<Integer> reversedDown = new TreeSet<Integer>();
+
+ for (LayoutEdge e : node.succs) {
+ if (reversedLinks.contains(e.link)) {
+ reversedDown.add(e.relativeFrom);
+ }
+ }
+
+
+ SortedSet<Integer> reversedUp = null;
+ if (reversedDown.size() == 0) {
+ reversedUp = new TreeSet<Integer>(Collections.reverseOrder());
+ } else {
+ reversedUp = new TreeSet<Integer>();
+ }
+
+ for (LayoutEdge e : node.preds) {
+ if (reversedLinks.contains(e.link)) {
+ reversedUp.add(e.relativeTo);
+ }
+ }
+
+ final int offset = X_OFFSET + DUMMY_WIDTH;
+
+ int curX = 0;
+ int curWidth = node.width + reversedDown.size() * offset;
+ for (int pos : reversedDown) {
+ ArrayList<LayoutEdge> reversedSuccs = new ArrayList<LayoutEdge>();
+ for (LayoutEdge e : node.succs) {
+ if (e.relativeFrom == pos && reversedLinks.contains(e.link)) {
+ reversedSuccs.add(e);
+ e.relativeFrom = curWidth;
+ }
+ }
+
+ ArrayList<Point> startPoints = new ArrayList<Point>();
+ startPoints.add(new Point(curWidth, curX));
+ startPoints.add(new Point(pos, curX));
+ startPoints.add(new Point(pos, reversedDown.size() * offset));
+ for (LayoutEdge e : reversedSuccs) {
+ reversedLinkStartPoints.put(e.link, startPoints);
+ }
+
+ node.inOffsets.put(pos, -curX);
+ curX += offset;
+ node.height += offset;
+ node.yOffset += offset;
+ curWidth -= offset;
+ }
+ node.width += reversedDown.size() * offset;
+
+ if (reversedDown.size() == 0) {
+ curX = offset;
+ } else {
+ curX = -offset;
+ }
+
+ curX = 0;
+ int minX = 0;
+ if (reversedDown.size() != 0) {
+ minX = -offset * reversedUp.size();
+ }
+
+ int oldNodeHeight = node.height;
+ for (int pos : reversedUp) {
+ ArrayList<LayoutEdge> reversedPreds = new ArrayList<LayoutEdge>();
+ for (LayoutEdge e : node.preds) {
+ if (e.relativeTo == pos && reversedLinks.contains(e.link)) {
+ if (reversedDown.size() == 0) {
+ e.relativeTo = node.width + offset;
+ } else {
+ e.relativeTo = curX - offset;
+ }
+
+ reversedPreds.add(e);
+ }
+ }
+ node.height += offset;
+ ArrayList<Point> endPoints = new ArrayList<Point>();
+
+ if (reversedDown.size() == 0) {
+
+ curX += offset;
+ node.width += offset;
+ endPoints.add(new Point(node.width, node.height));
+
+ } else {
+ curX -= offset;
+ node.width += offset;
+ endPoints.add(new Point(curX, node.height));
+ }
+
+ node.outOffsets.put(pos - minX, curX);
+ curX += offset;
+ node.bottomYOffset += offset;
+
+
+ endPoints.add(new Point(pos, node.height));
+ endPoints.add(new Point(pos, oldNodeHeight));
+ for (LayoutEdge e : reversedPreds) {
+ reversedLinkEndPoints.put(e.link, endPoints);
+ }
+ }
+
+
+ if (minX < 0) {
+ for (LayoutEdge e : node.preds) {
+ e.relativeTo -= minX;
+ }
+
+ for (LayoutEdge e : node.succs) {
+ e.relativeFrom -= minX;
+ }
+
+ node.xOffset = -minX;
+ node.width += -minX;
+ }
+ }
+
+ }
+
+ private void DFS(LayoutNode startNode) {
+ if (visited.contains(startNode)) {
+ return;
+ }
+
+ Stack<LayoutNode> stack = new Stack<LayoutNode>();
+ stack.push(startNode);
+
+ while (!stack.empty()) {
+ LayoutNode node = stack.pop();
+
+ if (visited.contains(node)) {
+ // Node no longer active
+ active.remove(node);
+ continue;
+ }
+
+ // Repush immediately to know when no longer active
+ stack.push(node);
+ visited.add(node);
+ active.add(node);
+
+ ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(node.succs);
+ for (LayoutEdge e : succs) {
+ if (active.contains(e.to)) {
+ assert visited.contains(e.to);
+ // Encountered back edge
+ reverseEdge(e);
+ } else if (!visited.contains(e.to) && (linksToFollow.size() == 0 || linksToFollow.contains(e.link))) {
+ stack.push(e.to);
+ }
+ }
+ }
+ }
+
+ private void reverseAllInputs(LayoutNode node) {
+ for (LayoutEdge e : node.preds) {
+ assert !reversedLinks.contains(e.link);
+ reversedLinks.add(e.link);
+ node.succs.add(e);
+ e.from.preds.add(e);
+ e.from.succs.remove(e);
+ int oldRelativeFrom = e.relativeFrom;
+ int oldRelativeTo = e.relativeTo;
+ e.to = e.from;
+ e.from = node;
+ e.relativeFrom = oldRelativeTo;
+ e.relativeTo = oldRelativeFrom;
+ }
+ node.preds.clear();
+ }
+
+ private void reverseEdge(LayoutEdge e) {
+ assert !reversedLinks.contains(e.link);
+ reversedLinks.add(e.link);
+
+ LayoutNode oldFrom = e.from;
+ LayoutNode oldTo = e.to;
+ int oldRelativeFrom = e.relativeFrom;
+ int oldRelativeTo = e.relativeTo;
+
+ e.from = oldTo;
+ e.to = oldFrom;
+ e.relativeFrom = oldRelativeTo;
+ e.relativeTo = oldRelativeFrom;
+
+ oldFrom.succs.remove(e);
+ oldFrom.preds.add(e);
+ oldTo.preds.remove(e);
+ oldTo.succs.add(e);
+ }
+
+ @Override
+ public void postCheck() {
+
+ for (LayoutNode n : nodes) {
+
+ HashSet<LayoutNode> curVisited = new HashSet<LayoutNode>();
+ Queue<LayoutNode> queue = new LinkedList<LayoutNode>();
+ for (LayoutEdge e : n.succs) {
+ LayoutNode s = e.to;
+ queue.add(s);
+ curVisited.add(s);
+ }
+
+ while (!queue.isEmpty()) {
+ LayoutNode curNode = queue.remove();
+
+ for (LayoutEdge e : curNode.succs) {
+ assert e.to != n;
+ if (!curVisited.contains(e.to)) {
+ queue.add(e.to);
+ curVisited.add(e.to);
+ }
+ }
+ }
+ }
+ }
+ }
+ private Comparator<Link> linkComparator = new Comparator<Link>() {
+
+ public int compare(Link l1, Link l2) {
+
+ int result = l1.getFrom().getVertex().compareTo(l2.getFrom().getVertex());
+ if (result != 0) {
+ return result;
+ }
+ result = l1.getTo().getVertex().compareTo(l2.getTo().getVertex());
+ if (result != 0) {
+ return result;
+ }
+ result = l1.getFrom().getRelativePosition().x - l2.getFrom().getRelativePosition().x;
+ if (result != 0) {
+ return result;
+ }
+ result = l1.getTo().getRelativePosition().x - l2.getTo().getRelativePosition().x;
+ return result;
+ }
+ };
+
+ private class BuildDatastructure extends AlgorithmPart {
+
+ protected void run() {
+ // Set up nodes
+ List<Vertex> vertices = new ArrayList<Vertex>(graph.getVertices());
+ Collections.sort(vertices);
+
+ for (Vertex v : vertices) {
+ LayoutNode node = new LayoutNode();
+ Dimension size = v.getSize();
+ node.width = (int) size.getWidth();
+ node.height = (int) size.getHeight();
+ node.vertex = v;
+ nodes.add(node);
+ vertexToLayoutNode.put(v, node);
+ }
+
+ // Set up edges
+ List<Link> links = new ArrayList<Link>(graph.getLinks());
+ Collections.sort(links, linkComparator);
+ for (Link l : links) {
+ LayoutEdge edge = new LayoutEdge();
+ assert vertexToLayoutNode.containsKey(l.getFrom().getVertex());
+ assert vertexToLayoutNode.containsKey(l.getTo().getVertex());
+ edge.from = vertexToLayoutNode.get(l.getFrom().getVertex());
+ edge.to = vertexToLayoutNode.get(l.getTo().getVertex());
+ edge.relativeFrom = l.getFrom().getRelativePosition().x;
+ edge.relativeTo = l.getTo().getRelativePosition().x;
+ edge.link = l;
+ edge.from.succs.add(edge);
+ edge.to.preds.add(edge);
+ //assert edge.from != edge.to; // No self-loops allowed
+ }
+
+ for (Link l : importantLinks) {
+ if (!vertexToLayoutNode.containsKey(l.getFrom().getVertex()) ||
+ vertexToLayoutNode.containsKey(l.getTo().getVertex())) {
+ continue;
+ }
+ LayoutNode from = vertexToLayoutNode.get(l.getFrom().getVertex());
+ LayoutNode to = vertexToLayoutNode.get(l.getTo().getVertex());
+ for (LayoutEdge e : from.succs) {
+ if (e.to == to) {
+ linksToFollow.add(e.link);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void postCheck() {
+
+ assert vertexToLayoutNode.keySet().size() == nodes.size();
+ assert nodes.size() == graph.getVertices().size();
+
+ for (Vertex v : graph.getVertices()) {
+
+ LayoutNode node = vertexToLayoutNode.get(v);
+ assert node != null;
+
+ for (LayoutEdge e : node.succs) {
+ assert e.from == node;
+ }
+
+ for (LayoutEdge e : node.preds) {
+ assert e.to == node;
+ }
+
+ }
+ }
+ }
+
+ public void doRouting(LayoutGraph graph) {
+ // Do nothing for now
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InterClusterConnection implements Link {
+
+ private Port inputSlot;
+ private Port outputSlot;
+ private List<Point> intermediatePoints;
+ private ClusterInputSlotNode inputSlotNode;
+ private ClusterOutputSlotNode outputSlotNode;
+
+ public InterClusterConnection(ClusterOutputSlotNode outputSlotNode, ClusterInputSlotNode inputSlotNode) {
+ this.outputSlotNode = outputSlotNode;
+ this.inputSlotNode = inputSlotNode;
+ this.inputSlot = inputSlotNode.getInputSlot();
+ this.outputSlot = outputSlotNode.getOutputSlot();
+ intermediatePoints = new ArrayList<Point>();
+ }
+
+ public ClusterOutputSlotNode getOutputSlotNode() {
+ return outputSlotNode;
+ }
+
+ public Port getTo() {
+ return inputSlot;
+ }
+
+ public Port getFrom() {
+ return outputSlot;
+ }
+
+ public void setControlPoints(List<Point> p) {
+ this.intermediatePoints = p;
+ }
+
+ public List<Point> getControlPoints() {
+ return intermediatePoints;
+ }
+
+ @Override
+ public String toString() {
+ return "InterClusterConnection[from=" + getFrom() + ", to=" + getTo() + "]";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,161 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Node<N, E> {
+
+ private N data;
+ private List<Edge<N, E>> inEdges;
+ private List<Edge<N, E>> outEdges;
+ private boolean visited;
+ private boolean active;
+ private boolean reachable;
+ private Graph<N, E> graph;
+
+ protected boolean isVisited() {
+ return visited;
+ }
+
+ protected void setVisited(boolean b) {
+ visited = b;
+ }
+
+ protected boolean isReachable() {
+ return reachable;
+ }
+
+ protected void setReachable(boolean b) {
+ reachable = b;
+ }
+
+ protected boolean isActive() {
+ return active;
+ }
+
+ protected void setActive(boolean b) {
+ active = b;
+ }
+
+ public int getInDegree() {
+ return getInDegree(true);
+ }
+
+ public int getInDegree(boolean countSelfLoops) {
+ if (countSelfLoops) {
+ return inEdges.size();
+ } else {
+ int cnt = 0;
+ for (Edge<N, E> e : inEdges) {
+ if (e.getSource() != this) {
+ cnt++;
+ }
+ }
+ return cnt;
+ }
+ }
+
+ public int getOutDegree() {
+ return outEdges.size();
+ }
+
+ protected Node(Graph<N, E> graph, N data) {
+ setData(data);
+ this.graph = graph;
+ inEdges = new ArrayList<Edge<N, E>>();
+ outEdges = new ArrayList<Edge<N, E>>();
+ }
+
+ protected void addInEdge(Edge<N, E> e) {
+ inEdges.add(e);
+ }
+
+ public Graph<N, E> getGraph() {
+ return graph;
+ }
+
+ protected void addOutEdge(Edge<N, E> e) {
+ outEdges.add(e);
+ }
+
+ protected void removeInEdge(Edge<N, E> e) {
+ //assert inEdges.contains(e);
+ inEdges.remove(e);
+ }
+
+ protected void removeOutEdge(Edge<N, E> e) {
+ //assert outEdges.contains(e);
+ outEdges.remove(e);
+ }
+
+ public List<Edge<N, E>> getInEdges() {
+ return Collections.unmodifiableList(inEdges);
+ }
+
+ public List<Edge<N, E>> getOutEdges() {
+ return Collections.unmodifiableList(outEdges);
+ }
+
+ public List<Node<N, E>> getSuccessors() {
+ ArrayList<Node<N, E>> succ = new ArrayList<Node<N, E>>();
+ for (Edge<N, E> e : getOutEdges()) {
+ Node<N, E> n = e.getDest();
+ if (!succ.contains(n)) {
+ succ.add(n);
+ }
+ }
+ return succ;
+ }
+
+ public List<Node<N, E>> getPredecessors() {
+ ArrayList<Node<N, E>> pred = new ArrayList<Node<N, E>>();
+ for (Edge<N, E> e : getInEdges()) {
+ Node<N, E> n = e.getSource();
+ if (!pred.contains(n)) {
+ pred.add(n);
+ }
+ }
+ return pred;
+ }
+
+ public N getData() {
+ return data;
+ }
+
+ public void setData(N d) {
+ data = d;
+ }
+
+ @Override
+ public String toString() {
+ return "Node: " + data;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1222 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OldHierarchicalLayoutManager implements LayoutManager {
+
+ public static final int DUMMY_WIDTH = 0;
+ public static final int DUMMY_HEIGHT = 0;
+ public static final int LAYER_OFFSET = 50;
+ public static final int OFFSET = 8;
+ public static final boolean VERTICAL_LAYOUT = true;
+ public static final boolean ASSERT = false;
+ public static final boolean TRACE = false;
+ public static final Timing initTiming = new Timing("init");
+ public static final Timing removeCyclesTiming = new Timing("removeCycles");
+ public static final Timing reversedEdgesTiming = new Timing("reversedEdges");
+ public static final Timing assignLayersTiming = new Timing("assignLayers");
+ public static final Timing dummyNodesTiming = new Timing("dummyNodes");
+ public static final Timing crossingReductionTiming = new Timing("crossingReduction");
+ public static final Timing assignCoordinatesTiming = new Timing("assignCoordinates");
+ public static final Timing assignRealTiming = new Timing("assignReal");
+ public static final Timing rootVertexTiming = new Timing("rootVertex");
+ public static final Timing createEdgesTiming = new Timing("createEdges");
+ public static final Timing optimizeMedianTiming = new Timing("optimizeMedian");
+ private Combine combine;
+
+ public enum Combine {
+
+ NONE,
+ SAME_INPUTS,
+ SAME_OUTPUTS
+ }
+
+ private class NodeData {
+
+ private Map<Port, Integer> reversePositions;
+ private Vertex node;
+ private Link edge;
+ private int layer;
+ private int x;
+ private int y;
+ private int width;
+
+ public NodeData(Vertex node) {
+ reversePositions = new HashMap<Port, Integer>();
+ layer = -1;
+ this.node = node;
+ assert node != null;
+
+ if (VERTICAL_LAYOUT) {
+ width = node.getSize().width;
+ } else {
+ width = node.getSize().height;
+ }
+ }
+
+ public NodeData(Link edge) {
+ layer = -1;
+ this.edge = edge;
+ assert edge != null;
+
+ if (VERTICAL_LAYOUT) {
+ width = DUMMY_WIDTH;
+ } else {
+ width = DUMMY_HEIGHT;
+ }
+ }
+
+ public Vertex getNode() {
+ return node;
+ }
+
+ public Link getEdge() {
+ return edge;
+ }
+
+ public int getCoordinate() {
+ return x;
+ }
+
+ public void setCoordinate(int x) {
+ this.x = x;
+ }
+
+ public int getX() {
+ if (VERTICAL_LAYOUT) {
+ return x;
+ } else {
+ return y;
+ }
+ }
+
+ public int getY() {
+ if (VERTICAL_LAYOUT) {
+ return y;
+ } else {
+ return x;
+ }
+ }
+
+ public void setLayerCoordinate(int y) {
+ this.y = y;
+ }
+
+ public void setLayer(int x) {
+ layer = x;
+ }
+
+ public int getLayer() {
+ return layer;
+ }
+
+ public boolean isDummy() {
+ return edge != null;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public void addReversedStartEdge(Edge<NodeData, EdgeData> e) {
+ assert e.getData().isReversed();
+ Port port = e.getData().getEdge().getTo();
+ int pos = addReversedPort(port);
+ Point start = e.getData().getRelativeStart();
+ e.getData().addStartPoint(start);
+ int yCoord = node.getSize().height + width - node.getSize().width;
+ e.getData().addStartPoint(new Point(start.x, yCoord));
+ e.getData().addStartPoint(new Point(pos, yCoord));
+ e.getData().setRelativeStart(new Point(pos, 0));
+ }
+
+ private int addReversedPort(Port p) {
+ if (reversePositions.containsKey(p)) {
+ return reversePositions.get(p);
+ } else {
+ width += OFFSET;
+ reversePositions.put(p, width);
+ return width;
+ }
+ }
+
+ public void addReversedEndEdge(Edge<NodeData, EdgeData> e) {
+ assert e.getData().isReversed();
+ int pos = addReversedPort(e.getData().getEdge().getFrom());
+ Point end = e.getData().getRelativeEnd();
+ e.getData().setRelativeEnd(new Point(pos, node.getSize().height));
+ int yCoord = 0 - width + node.getSize().width;
+ e.getData().addEndPoint(new Point(pos, yCoord));
+ e.getData().addEndPoint(new Point(end.x, yCoord));
+ e.getData().addEndPoint(end);
+ }
+
+ public int getHeight() {
+ if (isDummy()) {
+ if (VERTICAL_LAYOUT) {
+ return DUMMY_HEIGHT;
+ } else {
+ return DUMMY_WIDTH;
+ }
+
+ } else {
+ if (VERTICAL_LAYOUT) {
+ return node.getSize().height;
+ } else {
+ return node.getSize().width;
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ if (isDummy()) {
+ return edge.toString() + "(layer=" + layer + ")";
+ } else {
+ return node.toString() + "(layer=" + layer + ")";
+ }
+ }
+ }
+
+ private class EdgeData {
+
+ private Point relativeEnd;
+ private Point relativeStart;
+ private List<Point> startPoints;
+ private List<Point> endPoints;
+ private boolean important;
+ private boolean reversed;
+ private Link edge;
+
+ public EdgeData(Link edge) {
+ this(edge, false);
+ }
+
+ public EdgeData(Link edge, boolean rev) {
+ this.edge = edge;
+ reversed = rev;
+ relativeStart = edge.getFrom().getRelativePosition();
+ relativeEnd = edge.getTo().getRelativePosition();
+ assert relativeStart.x >= 0 && relativeStart.x <= edge.getFrom().getVertex().getSize().width;
+ assert relativeStart.y >= 0 && relativeStart.y <= edge.getFrom().getVertex().getSize().height;
+ assert relativeEnd.x >= 0 && relativeEnd.x <= edge.getTo().getVertex().getSize().width;
+ assert relativeEnd.y >= 0 && relativeEnd.y <= edge.getTo().getVertex().getSize().height;
+ startPoints = new ArrayList<Point>();
+ endPoints = new ArrayList<Point>();
+ this.important = true;
+ }
+
+ public boolean isImportant() {
+ return important;
+ }
+
+ public void setImportant(boolean b) {
+ this.important = b;
+ }
+
+ public List<Point> getStartPoints() {
+ return startPoints;
+ }
+
+ public List<Point> getEndPoints() {
+ return endPoints;
+ }
+
+ public List<Point> getAbsoluteEndPoints() {
+ if (endPoints.size() == 0) {
+ return endPoints;
+ }
+
+ List<Point> result = new ArrayList<Point>();
+ Point point = edge.getTo().getVertex().getPosition();
+ for (Point p : endPoints) {
+ Point p2 = new Point(p.x + point.x, p.y + point.y);
+ result.add(p2);
+ }
+
+ return result;
+ }
+
+ public List<Point> getAbsoluteStartPoints() {
+ if (startPoints.size() == 0) {
+ return startPoints;
+ }
+
+ List<Point> result = new ArrayList<Point>();
+ Point point = edge.getFrom().getVertex().getPosition();
+ for (Point p : startPoints) {
+ Point p2 = new Point(p.x + point.x, p.y + point.y);
+ result.add(p2);
+ }
+
+ return result;
+ }
+
+ public void addEndPoint(Point p) {
+ endPoints.add(p);
+ }
+
+ public void addStartPoint(Point p) {
+ startPoints.add(p);
+ }
+
+ public Link getEdge() {
+ return edge;
+ }
+
+ public void setRelativeEnd(Point p) {
+ relativeEnd = p;
+ }
+
+ public void setRelativeStart(Point p) {
+ relativeStart = p;
+ }
+
+ public Point getRelativeEnd() {
+ return relativeEnd;
+ }
+
+ public Point getRelativeStart() {
+ return relativeStart;
+ }
+
+ public boolean isReversed() {
+ return reversed;
+ }
+
+ public void setReversed(boolean b) {
+ reversed = b;
+ }
+
+ @Override
+ public String toString() {
+ return "EdgeData[reversed=" + reversed + "]";
+ }
+ }
+ private Graph<NodeData, EdgeData> graph;
+ private Map<Vertex, Node<NodeData, EdgeData>> nodeMap;
+ private int layerOffset;
+
+ /** Creates a new instance of HierarchicalPositionManager */
+ public OldHierarchicalLayoutManager(Combine combine) {
+ this(combine, LAYER_OFFSET);
+ }
+
+ public OldHierarchicalLayoutManager(Combine combine, int layerOffset) {
+ this.combine = combine;
+ this.layerOffset = layerOffset;
+ }
+
+ public void doRouting(LayoutGraph graph) {
+ }
+
+ //public void setPositions(PositionedNode rootNode, List<? extends PositionedNode> nodes, List<? extends PositionedEdge> edges) {
+ public void doLayout(LayoutGraph layoutGraph) {
+ doLayout(layoutGraph, new HashSet<Vertex>(), new HashSet<Vertex>());
+ }
+
+ public void doLayout(LayoutGraph layoutGraph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint) {
+ doLayout(layoutGraph, firstLayerHint, lastLayerHint, new HashSet<Link>());
+ }
+
+ public void doLayout(LayoutGraph layoutGraph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinksHint) {
+
+ if (TRACE) {
+ System.out.println("HierarchicalPositionManager.doLayout called");
+ System.out.println("Vertex count = " + layoutGraph.getVertices().size() + " Link count = " + layoutGraph.getLinks().size());
+ }
+
+ // Nothing to do => quit immediately
+ if (layoutGraph.getVertices().size() == 0) {
+ return;
+ }
+
+ initTiming.start();
+
+ // Mapping vertex to Node in graph
+ nodeMap = new HashMap<Vertex, Node<NodeData, EdgeData>>();
+
+ graph = new Graph<NodeData, EdgeData>();
+
+ Set<Node<NodeData, EdgeData>> rootNodes = new HashSet<Node<NodeData, EdgeData>>();
+ Set<Vertex> startRootVertices = new HashSet<Vertex>();
+
+ for (Vertex v : layoutGraph.getVertices()) {
+ if (v.isRoot()) {
+ startRootVertices.add(v);
+ }
+ }
+
+ rootVertexTiming.start();
+ Set<Vertex> rootVertices = layoutGraph.findRootVertices(startRootVertices);
+ rootVertexTiming.stop();
+
+
+ for (Vertex node : layoutGraph.getVertices()) {
+
+ NodeData data = new NodeData(node);
+ Node<NodeData, EdgeData> n = graph.createNode(data, node);
+ nodeMap.put(node, n);
+
+ if (rootVertices.contains(node)) {
+ rootNodes.add(n);
+ }
+ }
+
+ Set<? extends Link> links = layoutGraph.getLinks();
+ Link[] linkArr = new Link[links.size()];
+ links.toArray(linkArr);
+
+ List<Link> linkList = new ArrayList<Link>();
+ for (Link l : linkArr) {
+ linkList.add(l);
+ }
+
+ createEdgesTiming.start();
+ Collections.sort(linkList, new Comparator<Link>() {
+
+ public int compare(Link o1, Link o2) {
+ int result = o1.getFrom().getVertex().compareTo(o2.getFrom().getVertex());
+ if (result == 0) {
+ return o1.getTo().getVertex().compareTo(o2.getTo().getVertex());
+ } else {
+ return result;
+ }
+ }
+ });
+
+ for (Link edge : linkList) {
+ EdgeData data = new EdgeData(edge);
+ graph.createEdge(graph.getNode(edge.getFrom().getVertex()), graph.getNode(edge.getTo().getVertex()), data, data);
+ if (importantLinksHint.size() > 0 && !importantLinksHint.contains(edge)) {
+ data.setImportant(false);
+ }
+ }
+ createEdgesTiming.stop();
+
+ initTiming.stop();
+
+ removeCyclesTiming.start();
+
+ // STEP 1: Remove cycles!
+ removeCycles(rootNodes);
+ if (ASSERT) {
+ assert checkRemoveCycles();
+ }
+
+ removeCyclesTiming.stop();
+
+ reversedEdgesTiming.start();
+
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getOutEdges());
+ Collections.sort(edges, new Comparator<Edge<NodeData, EdgeData>>() {
+
+ public int compare(Edge<NodeData, EdgeData> o1, Edge<NodeData, EdgeData> o2) {
+ return o2.getData().getRelativeEnd().x - o1.getData().getRelativeEnd().x;
+ }
+ });
+
+
+ for (Edge<NodeData, EdgeData> e : edges) {
+
+ if (e.getData().isReversed()) {
+ e.getSource().getData().addReversedEndEdge(e);
+ }
+ }
+ }
+
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getInEdges());
+ Collections.sort(edges, new Comparator<Edge<NodeData, EdgeData>>() {
+
+ public int compare(Edge<NodeData, EdgeData> o1, Edge<NodeData, EdgeData> o2) {
+ return o2.getData().getRelativeStart().x - o1.getData().getRelativeStart().x;
+ }
+ });
+
+
+ for (Edge<NodeData, EdgeData> e : edges) {
+ if (e.getData().isReversed()) {
+ e.getDest().getData().addReversedStartEdge(e);
+ }
+ }
+ }
+
+ reversedEdgesTiming.stop();
+
+ assignLayersTiming.start();
+ // STEP 2: Assign layers!
+ int maxLayer = assignLayers(rootNodes, firstLayerHint, lastLayerHint);
+ if (ASSERT) {
+ assert checkAssignLayers();
+ }
+
+ // Put into layer array
+ //int maxLayer = 0;
+ //for(Node<NodeData, EdgeData> n : graph.getNodes()) {
+ // maxLayer = Math.max(maxLayer, n.getData().getLayer());
+ //}
+
+
+ ArrayList<Node<NodeData, EdgeData>> layers[] = new ArrayList[maxLayer + 1];
+ int layerSizes[] = new int[maxLayer + 1];
+ for (int i = 0; i < maxLayer + 1; i++) {
+ layers[i] = new ArrayList<Node<NodeData, EdgeData>>();
+ }
+
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ int curLayer = n.getData().getLayer();
+ layers[curLayer].add(n);
+ }
+
+ assignLayersTiming.stop();
+
+ // STEP 3: Insert dummy nodes!
+ dummyNodesTiming.start();
+ insertDummyNodes(layers);
+ if (ASSERT) {
+ assert checkDummyNodes();
+ }
+ dummyNodesTiming.stop();
+
+ crossingReductionTiming.start();
+ // STEP 4: Assign Y coordinates
+ assignLayerCoordinates(layers, layerSizes);
+
+ // STEP 5: Crossing reduction
+ crossingReduction(layers);
+ crossingReductionTiming.stop();
+
+ // STEP 6: Assign Y coordinates
+ assignCoordinatesTiming.start();
+ assignCoordinates(layers);
+ assignCoordinatesTiming.stop();
+
+ assignRealTiming.start();
+
+ // Assign coordinates of nodes to real objects
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ if (!n.getData().isDummy()) {
+
+ Vertex node = n.getData().getNode();
+ node.setPosition(new Point(n.getData().getX(), n.getData().getY()));
+ }
+ }
+
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ if (!n.getData().isDummy()) {
+
+ Vertex node = n.getData().getNode();
+
+ List<Edge<NodeData, EdgeData>> outEdges = n.getOutEdges();
+ for (Edge<NodeData, EdgeData> e : outEdges) {
+ Node<NodeData, EdgeData> succ = e.getDest();
+ if (succ.getData().isDummy()) {
+ //PositionedEdge edge = succ.getData().getEdge();
+ List<Point> points = new ArrayList<Point>();
+ assignToRealObjects(layerSizes, succ, points);
+ } else {
+ List<Point> points = new ArrayList<Point>();
+
+ EdgeData otherEdgeData = e.getData();
+ points.addAll(otherEdgeData.getAbsoluteStartPoints());
+ Link otherEdge = otherEdgeData.getEdge();
+ Point relFrom = new Point(otherEdgeData.getRelativeStart());
+ Point from = otherEdge.getFrom().getVertex().getPosition();
+ relFrom.move(relFrom.x + from.x, relFrom.y + from.y);
+ points.add(relFrom);
+
+ Point relTo = new Point(otherEdgeData.getRelativeEnd());
+ Point to = otherEdge.getTo().getVertex().getPosition();
+ relTo.move(relTo.x + to.x, relTo.y + to.y);
+ assert from != null;
+ assert to != null;
+ points.add(relTo);
+ points.addAll(otherEdgeData.getAbsoluteEndPoints());
+ e.getData().getEdge().setControlPoints(points);
+ }
+ }
+ }
+ }
+
+ assignRealTiming.stop();
+
+ initTiming.print();
+ removeCyclesTiming.print();
+ reversedEdgesTiming.print();
+ assignLayersTiming.print();
+ dummyNodesTiming.print();
+ crossingReductionTiming.print();
+ assignCoordinatesTiming.print();
+ assignRealTiming.print();
+ rootVertexTiming.print();
+ createEdgesTiming.print();
+ optimizeMedianTiming.print();
+ }
+
+ public boolean onOneLine(Point p1, Point p2, Point p3) {
+ int xoff1 = p1.x - p2.x;
+ int yoff1 = p1.y - p2.y;
+ int xoff2 = p3.x - p2.x;
+ int yoff2 = p3.y - p2.x;
+
+ return (xoff1 * yoff2 - yoff1 * xoff2 == 0);
+ }
+
+ private void assignToRealObjects(int layerSizes[], Node<NodeData, EdgeData> cur, List<Point> points) {
+ assert cur.getData().isDummy();
+
+ ArrayList<Point> otherPoints = new ArrayList<Point>(points);
+
+ int size = layerSizes[cur.getData().getLayer()];
+ otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() - size / 2));
+ if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) {
+ otherPoints.remove(otherPoints.size() - 2);
+ }
+ otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() + size / 2));
+ if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) {
+ otherPoints.remove(otherPoints.size() - 2);
+ }
+
+ for (int i = 0; i < cur.getOutEdges().size(); i++) {
+ Node<NodeData, EdgeData> otherSucc = cur.getOutEdges().get(i).getDest();
+
+ if (otherSucc.getData().isDummy()) {
+ assignToRealObjects(layerSizes, otherSucc, otherPoints);
+ } else {
+ EdgeData otherEdgeData = cur.getOutEdges().get(i).getData();
+ Link otherEdge = otherEdgeData.getEdge();
+
+ List<Point> middlePoints = new ArrayList<Point>(otherPoints);
+ if (cur.getOutEdges().get(i).getData().isReversed()) {
+ Collections.reverse(middlePoints);
+ }
+
+ ArrayList<Point> copy = new ArrayList<Point>();
+ Point relFrom = new Point(otherEdgeData.getRelativeStart());
+ Point from = otherEdge.getFrom().getVertex().getPosition();
+ //int moveUp = (size - otherEdge.getFrom().getVertex().getSize().height) / 2;
+ relFrom.move(relFrom.x + from.x, relFrom.y + from.y);
+ copy.addAll(otherEdgeData.getAbsoluteStartPoints());
+ copy.add(relFrom);
+ copy.addAll(middlePoints);
+
+ Point relTo = new Point(otherEdgeData.getRelativeEnd());
+ Point to = otherEdge.getTo().getVertex().getPosition();
+ relTo.move(relTo.x + to.x, relTo.y + to.y);
+ copy.add(relTo);
+
+ copy.addAll(otherEdgeData.getAbsoluteEndPoints());
+
+
+ otherEdge.setControlPoints(copy);
+ }
+ }
+ }
+
+ private boolean checkDummyNodes() {
+ for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+ if (e.getSource().getData().getLayer() != e.getDest().getData().getLayer() - 1) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private void insertDummyNodes(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+ int sum = 0;
+ List<Node<NodeData, EdgeData>> nodes = new ArrayList<Node<NodeData, EdgeData>>(graph.getNodes());
+ int edgeCount = 0;
+ int innerMostLoop = 0;
+
+ for (Node<NodeData, EdgeData> n : nodes) {
+ List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getOutEdges());
+ for (Edge<NodeData, EdgeData> e : edges) {
+
+ edgeCount++;
+ Link edge = e.getData().getEdge();
+ Node<NodeData, EdgeData> destNode = e.getDest();
+ Node<NodeData, EdgeData> lastNode = n;
+ Edge<NodeData, EdgeData> lastEdge = e;
+
+ boolean searchForNode = (combine != Combine.NONE);
+ for (int i = n.getData().getLayer() + 1; i < destNode.getData().getLayer(); i++) {
+
+ Node<NodeData, EdgeData> foundNode = null;
+ if (searchForNode) {
+ for (Node<NodeData, EdgeData> sameLayerNode : layers[i]) {
+ innerMostLoop++;
+
+ if (combine == Combine.SAME_OUTPUTS) {
+ if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getFrom() == edge.getFrom()) {
+ foundNode = sameLayerNode;
+ break;
+ }
+ } else if (combine == Combine.SAME_INPUTS) {
+ if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getTo() == edge.getTo()) {
+ foundNode = sameLayerNode;
+ break;
+ }
+ }
+ }
+ }
+
+ if (foundNode == null) {
+ searchForNode = false;
+ NodeData intermediateData = new NodeData(edge);
+ Node<NodeData, EdgeData> curNode = graph.createNode(intermediateData, null);
+ curNode.getData().setLayer(i);
+ layers[i].add(0, curNode);
+ sum++;
+ lastEdge.remove();
+ graph.createEdge(lastNode, curNode, e.getData(), null);
+ assert lastNode.getData().getLayer() == curNode.getData().getLayer() - 1;
+ lastEdge = graph.createEdge(curNode, destNode, e.getData(), null);
+ lastNode = curNode;
+ } else {
+ lastEdge.remove();
+ lastEdge = graph.createEdge(foundNode, destNode, e.getData(), null);
+ lastNode = foundNode;
+ }
+
+ }
+ }
+ }
+
+ if (TRACE) {
+ System.out.println("Number of edges: " + edgeCount);
+ }
+ if (TRACE) {
+ System.out.println("Dummy nodes inserted: " + sum);
+ }
+ }
+
+ private void assignLayerCoordinates(ArrayList<Node<NodeData, EdgeData>> layers[], int layerSizes[]) {
+ int cur = 0;
+ for (int i = 0; i < layers.length; i++) {
+ int maxHeight = 0;
+ for (Node<NodeData, EdgeData> n : layers[i]) {
+ maxHeight = Math.max(maxHeight, n.getData().getHeight());
+ }
+
+ layerSizes[i] = maxHeight;
+ for (Node<NodeData, EdgeData> n : layers[i]) {
+ int curCoordinate = cur + (maxHeight - n.getData().getHeight()) / 2;
+ n.getData().setLayerCoordinate(curCoordinate);
+ }
+ cur += maxHeight + layerOffset;
+
+ }
+ }
+
+ private void assignCoordinates(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+ // TODO: change this
+ for (int i = 0; i < layers.length; i++) {
+ ArrayList<Node<NodeData, EdgeData>> curArray = layers[i];
+ int curY = 0;
+ for (Node<NodeData, EdgeData> n : curArray) {
+
+ n.getData().setCoordinate(curY);
+ if (!n.getData().isDummy()) {
+ curY += n.getData().getWidth();
+ }
+ curY += OFFSET;
+
+ }
+ }
+
+ int curSol = evaluateSolution();
+ if (TRACE) {
+ System.out.println("First coordinate solution found: " + curSol);
+ }
+
+ // Sort to correct order
+ for (int i = 0; i < layers.length; i++) {
+ Collections.sort(layers[i], new Comparator<Node<NodeData, EdgeData>>() {
+
+ public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+ if (o2.getData().isDummy()) {
+ return 1;
+ } else if (o1.getData().isDummy()) {
+ return -1;
+ }
+ return o2.getInEdges().size() + o2.getOutEdges().size() - o1.getInEdges().size() - o1.getOutEdges().size();
+ }
+ });
+ }
+
+
+ optimizeMedianTiming.start();
+ for (int i = 0; i < 2; i++) {
+ optimizeMedian(layers);
+ curSol = evaluateSolution();
+ if (TRACE) {
+ System.out.println("Current coordinate solution found: " + curSol);
+ }
+ }
+ optimizeMedianTiming.stop();
+ normalizeCoordinate();
+
+ }
+
+ private void normalizeCoordinate() {
+
+ int min = Integer.MAX_VALUE;
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ min = Math.min(min, n.getData().getCoordinate());
+ }
+
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ n.getData().setCoordinate(n.getData().getCoordinate() - min);
+ }
+
+ }
+
+ private void optimizeMedian(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+ // Downsweep
+ for (int i = 1; i < layers.length; i++) {
+
+ ArrayList<Node<NodeData, EdgeData>> processingList = layers[i];
+ ArrayList<Node<NodeData, EdgeData>> alreadyAssigned = new ArrayList<Node<NodeData, EdgeData>>();
+ for (Node<NodeData, EdgeData> n : processingList) {
+
+
+ ArrayList<Node<NodeData, EdgeData>> preds = new ArrayList<Node<NodeData, EdgeData>>(n.getPredecessors());
+ int pos = n.getData().getCoordinate();
+ if (preds.size() > 0) {
+
+ Collections.sort(preds, new Comparator<Node<NodeData, EdgeData>>() {
+
+ public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+ return o1.getData().getCoordinate() - o2.getData().getCoordinate();
+ }
+ });
+
+ if (preds.size() % 2 == 0) {
+ assert preds.size() >= 2;
+ pos = (preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n) + preds.get(preds.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2 - 1), n)) / 2;
+ } else {
+ assert preds.size() >= 1;
+ pos = preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n);
+ }
+ }
+
+ tryAdding(alreadyAssigned, n, pos);
+ }
+ }
+ // Upsweep
+ for (int i = layers.length - 2; i >= 0; i--) {
+ ArrayList<Node<NodeData, EdgeData>> processingList = layers[i];
+ ArrayList<Node<NodeData, EdgeData>> alreadyAssigned = new ArrayList<Node<NodeData, EdgeData>>();
+ for (Node<NodeData, EdgeData> n : processingList) {
+
+ ArrayList<Node<NodeData, EdgeData>> succs = new ArrayList<Node<NodeData, EdgeData>>(n.getSuccessors());
+ int pos = n.getData().getCoordinate();
+ if (succs.size() > 0) {
+
+ Collections.sort(succs, new Comparator<Node<NodeData, EdgeData>>() {
+
+ public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+ return o1.getData().getCoordinate() - o2.getData().getCoordinate();
+ }
+ });
+
+ if (succs.size() % 2 == 0) {
+ assert succs.size() >= 2;
+ pos = (succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2)) + succs.get(succs.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2 - 1))) / 2;
+ } else {
+ assert succs.size() >= 1;
+ pos = succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2));
+ }
+ }
+
+ tryAdding(alreadyAssigned, n, pos);
+ }
+ }
+ }
+
+ private int median(ArrayList<Integer> arr) {
+ assert arr.size() > 0;
+ Collections.sort(arr);
+ if (arr.size() % 2 == 0) {
+ return (arr.get(arr.size() / 2) + arr.get(arr.size() / 2 - 1)) / 2;
+ } else {
+ return arr.get(arr.size() / 2);
+ }
+ }
+
+ private int calcRelativeCoordinate(Node<NodeData, EdgeData> n, Node<NodeData, EdgeData> succ) {
+
+ if (n.getData().isDummy() && succ.getData().isDummy()) {
+ return 0;
+ }
+
+ int pos = 0;
+ int pos2 = 0;
+ ArrayList<Integer> coords2 = new ArrayList<Integer>();
+ ArrayList<Integer> coords = new ArrayList<Integer>();
+ /*if(!n.getData().isDummy())*/ {
+ for (Edge<NodeData, EdgeData> e : n.getOutEdges()) {
+
+ //System.out.println("reversed: " + e.getData().isReversed());
+ if (e.getDest() == succ) {
+
+ if (e.getData().isReversed()) {
+ if (!n.getData().isDummy()) {
+ coords.add(e.getData().getRelativeEnd().x);
+ }
+
+ if (!succ.getData().isDummy()) {
+ coords2.add(e.getData().getRelativeStart().x);
+ }
+ } else {
+ if (!n.getData().isDummy()) {
+ coords.add(e.getData().getRelativeStart().x);
+ }
+
+ if (!succ.getData().isDummy()) {
+ coords2.add(e.getData().getRelativeEnd().x);
+ }
+ }
+ }
+ }
+
+ // assert coords.size() > 0;
+ if (!n.getData().isDummy()) {
+ pos = median(coords);
+ }
+
+ if (!succ.getData().isDummy()) {
+ pos2 = median(coords2);
+ }
+ }
+ //System.out.println("coords=" + coords);
+ //System.out.println("coords2=" + coords2);
+
+ return pos - pos2;
+ }
+
+ private boolean intersect(int v1, int w1, int v2, int w2) {
+ if (v1 >= v2 && v1 < v2 + w2) {
+ return true;
+ }
+ if (v1 + w1 > v2 && v1 + w1 < v2 + w2) {
+ return true;
+ }
+ if (v1 < v2 && v1 + w1 > v2) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean intersect(Node<NodeData, EdgeData> n1, Node<NodeData, EdgeData> n2) {
+ return intersect(n1.getData().getCoordinate(), n1.getData().getWidth() + OFFSET, n2.getData().getCoordinate(), n2.getData().getWidth() + OFFSET);
+ }
+
+ private void tryAdding(List<Node<NodeData, EdgeData>> alreadyAssigned, Node<NodeData, EdgeData> node, int pos) {
+
+ boolean doesIntersect = false;
+ node.getData().setCoordinate(pos);
+ for (Node<NodeData, EdgeData> n : alreadyAssigned) {
+ if (n.getData().getCoordinate() + n.getData().getWidth() < pos) {
+ break;
+ } else if (intersect(node, n)) {
+ doesIntersect = true;
+ break;
+ }
+
+ }
+
+ if (!doesIntersect) {
+
+ // Everything fine, just place the node
+ int z = 0;
+ for (Node<NodeData, EdgeData> n : alreadyAssigned) {
+ if (pos > n.getData().getCoordinate()) {
+ break;
+ }
+ z++;
+ }
+
+ if (z == -1) {
+ z = alreadyAssigned.size();
+ }
+
+
+ if (ASSERT) {
+ assert !findOverlap(alreadyAssigned, node);
+ }
+ alreadyAssigned.add(z, node);
+
+ } else {
+
+ assert alreadyAssigned.size() > 0;
+
+ // Search for alternative location
+ int minOffset = Integer.MAX_VALUE;
+ int minIndex = -1;
+ int minPos = 0;
+ int w = node.getData().getWidth() + OFFSET;
+
+ // Try top-most
+ minIndex = 0;
+ minPos = alreadyAssigned.get(0).getData().getCoordinate() + alreadyAssigned.get(0).getData().getWidth() + OFFSET;
+ minOffset = Math.abs(minPos - pos);
+
+ // Try bottom-most
+ Node<NodeData, EdgeData> lastNode = alreadyAssigned.get(alreadyAssigned.size() - 1);
+ int lastPos = lastNode.getData().getCoordinate() - w;
+ int lastOffset = Math.abs(lastPos - pos);
+ if (lastOffset < minOffset) {
+ minPos = lastPos;
+ minOffset = lastOffset;
+ minIndex = alreadyAssigned.size();
+ }
+
+ // Try between
+ for (int i = 0; i < alreadyAssigned.size() - 1; i++) {
+ Node<NodeData, EdgeData> curNode = alreadyAssigned.get(i);
+ Node<NodeData, EdgeData> nextNode = alreadyAssigned.get(i + 1);
+
+ int start = nextNode.getData().getCoordinate() + nextNode.getData().getWidth() + OFFSET;
+ int end = curNode.getData().getCoordinate() - OFFSET;
+
+ int bestPoss = end - node.getData().getWidth();
+ if (bestPoss < pos && pos - bestPoss > minOffset) {
+ // No better solution possible => break
+ break;
+ }
+
+ if (end - start >= node.getData().getWidth()) {
+ // Node could fit here
+ int cand1 = start;
+ int cand2 = end - node.getData().getWidth();
+ int off1 = Math.abs(cand1 - pos);
+ int off2 = Math.abs(cand2 - pos);
+ if (off1 < minOffset) {
+ minPos = cand1;
+ minOffset = off1;
+ minIndex = i + 1;
+ }
+
+ if (off2 < minOffset) {
+ minPos = cand2;
+ minOffset = off2;
+ minIndex = i + 1;
+ }
+ }
+ }
+
+ assert minIndex != -1;
+ node.getData().setCoordinate(minPos);
+ if (ASSERT) {
+ assert !findOverlap(alreadyAssigned, node);
+ }
+ alreadyAssigned.add(minIndex, node);
+ }
+
+ }
+
+ private boolean findOverlap(List<Node<NodeData, EdgeData>> nodes, Node<NodeData, EdgeData> node) {
+
+ for (Node<NodeData, EdgeData> n1 : nodes) {
+ if (intersect(n1, node)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private int evaluateSolution() {
+
+ int sum = 0;
+ for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+ Node<NodeData, EdgeData> source = e.getSource();
+ Node<NodeData, EdgeData> dest = e.getDest();
+ int offset = 0;
+ offset = Math.abs(source.getData().getCoordinate() - dest.getData().getCoordinate());
+ sum += offset;
+ }
+
+ return sum;
+ }
+
+ private void crossingReduction(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+ for (int i = 0; i < layers.length - 1; i++) {
+
+ ArrayList<Node<NodeData, EdgeData>> curNodes = layers[i];
+ ArrayList<Node<NodeData, EdgeData>> nextNodes = layers[i + 1];
+ for (Node<NodeData, EdgeData> n : curNodes) {
+ for (Node<NodeData, EdgeData> succ : n.getSuccessors()) {
+ if (ASSERT) {
+ assert nextNodes.contains(succ);
+ }
+ nextNodes.remove(succ);
+ nextNodes.add(succ);
+ }
+ }
+
+ }
+
+ }
+
+ private void removeCycles(Set<Node<NodeData, EdgeData>> rootNodes) {
+ final List<Edge<NodeData, EdgeData>> reversedEdges = new ArrayList<Edge<NodeData, EdgeData>>();
+
+
+ int removedCount = 0;
+ int reversedCount = 0;
+
+ Graph.DFSTraversalVisitor visitor = graph.new DFSTraversalVisitor() {
+
+ @Override
+ public boolean visitEdge(Edge<NodeData, EdgeData> e, boolean backEdge) {
+ if (backEdge) {
+ if (ASSERT) {
+ assert !reversedEdges.contains(e);
+ }
+ reversedEdges.add(e);
+ e.getData().setReversed(!e.getData().isReversed());
+ }
+
+ return e.getData().isImportant();
+ }
+ };
+ Set<Node<NodeData, EdgeData>> nodes = new HashSet<Node<NodeData, EdgeData>>();
+ nodes.addAll(rootNodes);
+
+ assert nodes.size() > 0;
+
+ this.graph.traverseDFS(nodes, visitor);
+
+ for (Edge<NodeData, EdgeData> e : reversedEdges) {
+ if (e.isSelfLoop()) {
+ e.remove();
+ removedCount++;
+ } else {
+ e.reverse();
+ reversedCount++;
+ }
+ }
+ }
+
+ private boolean checkRemoveCycles() {
+ return !graph.hasCycles();
+ }
+ // Only used by assignLayers
+ private int maxLayerTemp;
+
+ private int assignLayers(Set<Node<NodeData, EdgeData>> rootNodes, Set<? extends Vertex> firstLayerHints,
+ Set<? extends Vertex> lastLayerHints) {
+ this.maxLayerTemp = -1;
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ n.getData().setLayer(-1);
+ }
+
+ Graph.BFSTraversalVisitor traverser = graph.new BFSTraversalVisitor() {
+
+ @Override
+ public void visitNode(Node<NodeData, EdgeData> n, int depth) {
+ if (depth > n.getData().getLayer()) {
+ n.getData().setLayer(depth);
+ maxLayerTemp = Math.max(maxLayerTemp, depth);
+ }
+ }
+ };
+
+ for (Node<NodeData, EdgeData> n : rootNodes) {
+ if (n.getData().getLayer() == -1) {
+ this.graph.traverseBFS(n, traverser, true);
+ }
+ }
+
+ for (Vertex v : firstLayerHints) {
+ assert nodeMap.containsKey(v);
+ nodeMap.get(v).getData().setLayer(0);
+ }
+
+ for (Vertex v : lastLayerHints) {
+ assert nodeMap.containsKey(v);
+ nodeMap.get(v).getData().setLayer(maxLayerTemp);
+ }
+
+ return maxLayerTemp;
+ }
+
+ private boolean checkAssignLayers() {
+
+ for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+ Node<NodeData, EdgeData> source = e.getSource();
+ Node<NodeData, EdgeData> dest = e.getDest();
+
+
+ if (source.getData().getLayer() >= dest.getData().getLayer()) {
+ return false;
+ }
+ }
+ int maxLayer = 0;
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ assert n.getData().getLayer() >= 0;
+ if (n.getData().getLayer() > maxLayer) {
+ maxLayer = n.getData().getLayer();
+ }
+ }
+
+ int countPerLayer[] = new int[maxLayer + 1];
+ for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+ countPerLayer[n.getData().getLayer()]++;
+ }
+
+ if (TRACE) {
+ System.out.println("Number of layers: " + maxLayer);
+ }
+ return true;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Timing {
+
+ private long lastValue;
+ private long sum;
+ private String name;
+
+ public Timing(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ long val = sum;
+ if (lastValue != 0) {
+ // Timer running
+ long newValue = System.nanoTime();
+ val += (newValue - lastValue);
+ }
+ return "Timing for " + name + " is: " + val / 1000000 + " ms";
+ }
+
+ public void print() {
+ System.out.println(toString());
+ }
+
+ public void start() {
+ lastValue = System.nanoTime();
+ }
+
+ public void stop() {
+ if (lastValue == 0) {
+ throw new IllegalStateException("You must call start before stop");
+ }
+ long newValue = System.nanoTime();
+ sum += newValue - lastValue;
+ lastValue = 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.layout" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.layout.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.layout
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/layout/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.layout-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=cb0889d9
+build.xml.script.CRC32=d65fccb9
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=cb0889d9
+nbproject/build-impl.xml.script.CRC32=7f82736d
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+ <suite-component/>
+ <module-dependencies/>
+ <public-packages>
+ <package>com.sun.hotspot.igv.layout</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Layout
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Rectangle;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Cluster extends Comparable<Cluster> {
+
+ public Cluster getOuter();
+
+ public void setBounds(Rectangle r);
+
+ public Set<? extends Cluster> getSuccessors();
+
+ public Set<? extends Cluster> getPredecessors();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,202 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class LayoutGraph {
+
+ private Set<? extends Link> links;
+ private SortedSet<Vertex> vertices;
+ private Hashtable<Vertex, Set<Port>> inputPorts;
+ private Hashtable<Vertex, Set<Port>> outputPorts;
+ private Hashtable<Port, Set<Link>> portLinks;
+
+ public LayoutGraph(Set<? extends Link> links) {
+ this(links, new HashSet<Vertex>());
+ }
+
+ public LayoutGraph(Set<? extends Link> links, Set<? extends Vertex> additionalVertices) {
+ this.links = links;
+ assert verify();
+
+ vertices = new TreeSet<Vertex>();
+ portLinks = new Hashtable<Port, Set<Link>>();
+ inputPorts = new Hashtable<Vertex, Set<Port>>();
+ outputPorts = new Hashtable<Vertex, Set<Port>>();
+
+ for (Link l : links) {
+ Port p = l.getFrom();
+ Port p2 = l.getTo();
+ Vertex v1 = p.getVertex();
+ Vertex v2 = p2.getVertex();
+
+ if (!vertices.contains(v1)) {
+
+ outputPorts.put(v1, new HashSet<Port>(1));
+ inputPorts.put(v1, new HashSet<Port>(3));
+ vertices.add(v1);
+ assert vertices.contains(v1);
+ }
+
+ if (!vertices.contains(v2)) {
+ vertices.add(v2);
+ assert vertices.contains(v2);
+ outputPorts.put(v2, new HashSet<Port>(1));
+ inputPorts.put(v2, new HashSet<Port>(3));
+ }
+
+ if (!portLinks.containsKey(p)) {
+ HashSet<Link> hashSet = new HashSet<Link>(3);
+ portLinks.put(p, hashSet);
+ }
+
+ if (!portLinks.containsKey(p2)) {
+ portLinks.put(p2, new HashSet<Link>(3));
+ }
+
+ outputPorts.get(v1).add(p);
+ inputPorts.get(v2).add(p2);
+
+ portLinks.get(p).add(l);
+ portLinks.get(p2).add(l);
+ }
+
+ for (Vertex v : additionalVertices) {
+ if (!vertices.contains(v)) {
+ outputPorts.put(v, new HashSet<Port>(1));
+ inputPorts.put(v, new HashSet<Port>(3));
+ vertices.add(v);
+ vertices.contains(v);
+ }
+ }
+ }
+
+ public Set<Port> getInputPorts(Vertex v) {
+ return this.inputPorts.get(v);
+ }
+
+ public Set<Port> getOutputPorts(Vertex v) {
+ return this.outputPorts.get(v);
+ }
+
+ public Set<Link> getPortLinks(Port p) {
+ return portLinks.get(p);
+ }
+
+ public Set<? extends Link> getLinks() {
+ return links;
+ }
+
+ public boolean verify() {
+ return true;
+ }
+
+ public SortedSet<Vertex> getVertices() {
+ return vertices;
+ }
+
+ private void markNotRoot(Set<Vertex> notRootSet, Vertex v, Vertex startingVertex) {
+
+ if (notRootSet.contains(v)) {
+ return;
+ }
+ if (v != startingVertex) {
+ notRootSet.add(v);
+ }
+ Set<Port> outPorts = getOutputPorts(v);
+ for (Port p : outPorts) {
+ Set<Link> portLinks = getPortLinks(p);
+ for (Link l : portLinks) {
+ Port other = l.getTo();
+ Vertex otherVertex = other.getVertex();
+ if (otherVertex != startingVertex) {
+ markNotRoot(notRootSet, otherVertex, startingVertex);
+ }
+ }
+ }
+ }
+
+ // Returns a set of vertices with the following properties:
+ // - All Vertices in the set startingRoots are elements of the set.
+ // - When starting a DFS at every vertex in the set, every vertex of the
+ // whole graph is visited.
+ public Set<Vertex> findRootVertices(Set<Vertex> startingRoots) {
+
+ Set<Vertex> notRootSet = new HashSet<Vertex>();
+ for (Vertex v : startingRoots) {
+ if (!notRootSet.contains(v)) {
+ markNotRoot(notRootSet, v, v);
+ }
+ }
+
+ Set<Vertex> tmpVertices = getVertices();
+ for (Vertex v : tmpVertices) {
+ if (!notRootSet.contains(v)) {
+ if (this.getInputPorts(v).size() == 0) {
+ markNotRoot(notRootSet, v, v);
+ }
+ }
+ }
+
+ for (Vertex v : tmpVertices) {
+ if (!notRootSet.contains(v)) {
+ markNotRoot(notRootSet, v, v);
+ }
+ }
+
+ Set<Vertex> result = new HashSet<Vertex>();
+ for (Vertex v : tmpVertices) {
+ if (!notRootSet.contains(v)) {
+ result.add(v);
+ }
+ }
+ assert tmpVertices.size() == 0 || result.size() > 0;
+ return result;
+ }
+
+ public Set<Vertex> findRootVertices() {
+ return findRootVertices(new HashSet<Vertex>());
+ }
+
+ public SortedSet<Cluster> getClusters() {
+
+ SortedSet<Cluster> clusters = new TreeSet<Cluster>();
+ for (Vertex v : getVertices()) {
+ if (v.getCluster() != null) {
+ clusters.add(v.getCluster());
+ }
+ }
+
+ return clusters;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface LayoutManager {
+
+ public void doLayout(LayoutGraph graph);
+
+ public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks);
+
+ public void doRouting(LayoutGraph graph);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Link {
+
+ public Port getFrom();
+
+ public Port getTo();
+
+ public List<Point> getControlPoints();
+
+ public void setControlPoints(List<Point> list);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Port {
+
+ public Vertex getVertex();
+
+ public Point getRelativePosition();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Vertex extends Comparable<Vertex> {
+
+ public Cluster getCluster();
+
+ public Dimension getSize();
+
+ public Point getPosition();
+
+ public void setPosition(Point p);
+
+ public boolean isRoot();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.connection" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.connection.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.connection
+OpenIDE-Module-Layer: com/sun/hotspot/igv/connection/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/connection/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.connection-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=f8e21cb6
+build.xml.script.CRC32=a265137e
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=f8e21cb6
+nbproject/build-impl.xml.script.CRC32=36f3138c
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.connection</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.awt</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.11.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.dialogs</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.5.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.10.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.connection</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.connection.Server
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=NetworkConnection
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,96 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.connection;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.serialization.Parser;
+import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import javax.swing.JTextField;
+import org.openide.util.Exceptions;
+import org.openide.xml.XMLUtil;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Client implements Runnable, GroupCallback {
+
+ private Socket socket;
+ private JTextField networkTextField;
+ private GroupCallback callback;
+
+ public Client(Socket socket, JTextField networkTextField, GroupCallback callback) {
+ this.callback = callback;
+ this.socket = socket;
+ this.networkTextField = networkTextField;
+ }
+
+ public void run() {
+
+ try {
+ InputStream inputStream = socket.getInputStream();
+
+ if (networkTextField.isEnabled()) {
+
+ socket.getOutputStream().write('y');
+ InputSource is = new InputSource(inputStream);
+
+ try {
+ XMLReader reader = XMLUtil.createXMLReader();
+ Parser parser = new Parser(this);
+ parser.parse(reader, is, null);
+ } catch (SAXException ex) {
+ ex.printStackTrace();
+ }
+ } else {
+ socket.getOutputStream().write('n');
+ }
+
+ socket.close();
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+
+ public void started(final Group g) {
+ try {
+ RegexpPropertyMatcher matcher = new RegexpPropertyMatcher("name", ".*" + networkTextField.getText() + ".*");
+ if (g.getProperties().selectSingle(matcher) != null && networkTextField.isEnabled()) {
+ socket.getOutputStream().write('y');
+ callback.started(g);
+ } else {
+ socket.getOutputStream().write('n');
+ }
+ } catch (IOException e) {
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,145 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.connection;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.services.GroupReceiver;
+import com.sun.hotspot.igv.settings.Settings;
+import java.awt.Component;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.prefs.PreferenceChangeEvent;
+import java.util.prefs.PreferenceChangeListener;
+import javax.swing.SwingUtilities;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.util.RequestProcessor;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Server implements GroupCallback, GroupReceiver, PreferenceChangeListener {
+
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JCheckBox networkCheckBox;
+ private javax.swing.JTextField networkTextField;
+ private ServerSocket serverSocket;
+ private GroupCallback callback;
+ private int port;
+ private Runnable serverRunnable;
+
+ public Component init(GroupCallback callback) {
+
+ this.callback = callback;
+
+ jPanel1 = new javax.swing.JPanel();
+ networkTextField = new javax.swing.JTextField();
+ networkCheckBox = new javax.swing.JCheckBox();
+
+
+ jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
+ jPanel1.setLayout(new java.awt.BorderLayout(10, 10));
+ jPanel1.add(networkTextField, java.awt.BorderLayout.CENTER);
+
+ networkCheckBox.setSelected(true);
+ org.openide.awt.Mnemonics.setLocalizedText(networkCheckBox, "Receive when name contains");
+ networkCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ networkCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ networkCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
+
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ networkCheckBoxChanged(evt);
+ }
+ });
+ jPanel1.add(networkCheckBox, java.awt.BorderLayout.WEST);
+ networkCheckBox.getAccessibleContext().setAccessibleName("Read from network when name contains");
+
+ initializeNetwork();
+ Settings.get().addPreferenceChangeListener(this);
+ return jPanel1;
+ }
+
+ private void networkCheckBoxChanged(javax.swing.event.ChangeEvent evt) {
+ networkTextField.setEnabled(networkCheckBox.isSelected());
+ }
+
+ public void preferenceChange(PreferenceChangeEvent e) {
+
+ int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT));
+ if (curPort != port) {
+ initializeNetwork();
+ }
+ }
+
+ private void initializeNetwork() {
+
+ int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT));
+ this.port = curPort;
+ try {
+ serverSocket = new java.net.ServerSocket(curPort);
+ } catch (IOException ex) {
+ NotifyDescriptor message = new NotifyDescriptor.Message("Could not create server. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE);
+ DialogDisplayer.getDefault().notifyLater(message);
+ return;
+ }
+
+ Runnable runnable = new Runnable() {
+
+ public void run() {
+ while (true) {
+ try {
+ Socket clientSocket = serverSocket.accept();
+ if (serverRunnable != this) {
+ clientSocket.close();
+ return;
+ }
+ RequestProcessor.getDefault().post(new Client(clientSocket, networkTextField, Server.this), 0, Thread.MAX_PRIORITY);
+ } catch (IOException ex) {
+ serverSocket = null;
+ NotifyDescriptor message = new NotifyDescriptor.Message("Error during listening for incoming connections. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE);
+ DialogDisplayer.getDefault().notifyLater(message);
+ return;
+ }
+ }
+ }
+ };
+
+ serverRunnable = runnable;
+
+ RequestProcessor.getDefault().post(runnable, 0, Thread.MAX_PRIORITY);
+ }
+
+ public void started(final Group g) {
+ SwingUtilities.invokeLater(new Runnable() {
+
+ public void run() {
+ callback.started(g);
+ }
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/README Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,45 @@
+The Ideal Graph Visualizer is a tool developed to help examine the
+intermediate representation of C2 which is commonly referred to as the
+"ideal graph". It was developed in collaboration with the University
+of Linz in Austria and has been included as part of hotspot since that
+was the primary target of the tool. The tool itself is fairly general
+with only a few modules that contain C2 specific elements.
+
+The tool is built on top of the NetBeans 6.0 rich client
+infrastructure and so requires NetBeans to build. It currently
+requires Java 6 to run as it needs support for JavaScript for its
+filtering mechanism and assumes it's built into the platform. It
+should build out of the box whit NetBeans 6 and Java 6 or later. It's
+possible to run it on 1.5 by including Rhino on the classpath though
+that currently isn't working correctly. Support for exporting graphs
+as SVG can be enabled by adding batik to the classpath which isn't
+included by default.
+
+It can be built on top of NetBeans 6.1 if you change the required
+modules to be platform8 instead of platform7. The tool could run on
+JDK 1.5 with some reworking of the how the JavaScript support is
+enabled but currently it requires some tweaking of the setup. This
+will be fixed in a later setup.
+
+The JVM support is controlled by the flag -XX:PrintIdealGraphLevel=#
+where # is:
+
+ 0: no output, the default
+ 1: dumps graph after parsing, before matching, and final code.
+ also dumps graph for failed compiles, if available
+ 2: more detail, including after loop opts
+ 3: even more detail
+ 4: prints graph after parsing every bytecode (very slow)
+
+By default the JVM expects that it will connect to a visualizer on the
+local host on port 4444. This can be configured using the options
+-XX:PrintIdealGraphAddress= and -XX:PrintIdealGraphPort=.
+PrintIdealGraphAddress can actually be a hostname.
+
+Alternatively the output can be sent to a file using
+-XX:PrintIdealGraphFile=filename. Each compiler thread will get it's
+own file with unique names being generated by adding a number onto the
+provided file name.
+
+More information about the tool is available at
+http://wikis.sun.com/display/HotSpotInternals/IdealGraphVisualizer.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.rhino" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.rhino.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.rhino
+OpenIDE-Module-Layer: com/sun/hotspot/igv/rhino/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/rhino/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.rhino-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=0c3e7912
+build.xml.script.CRC32=44d0050c
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=0c3e7912
+nbproject/build-impl.xml.script.CRC32=7aab3f52
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.rhino</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.rhino</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.rhino.RhinoScriptEngine
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=RhinoScriptEngineProxy
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.rhino;
+
+import com.sun.hotspot.igv.filter.ScriptEngineAbstraction;
+import com.sun.hotspot.igv.graph.Diagram;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RhinoScriptEngine implements ScriptEngineAbstraction {
+
+ private String jsHelperText;
+ private Constructor importer;
+ private Method scope_put;
+ private Method cx_evaluateString;
+ private Method context_enter;
+ private Method context_exit;
+
+ public boolean initialize(String s) {
+ this.jsHelperText = s;
+ Class importerTopLevel = null;
+ try {
+ ClassLoader cl = RhinoScriptEngine.class.getClassLoader();
+ Class context = cl.loadClass("org.mozilla.javascript.Context");
+ Class scriptable = cl.loadClass("org.mozilla.javascript.Scriptable");
+ importerTopLevel = cl.loadClass("org.mozilla.javascript.ImporterTopLevel");
+ importer = importerTopLevel.getDeclaredConstructor(context);
+ scope_put = importerTopLevel.getMethod("put", new Class[]{String.class, scriptable, Object.class});
+ cx_evaluateString = context.getDeclaredMethod("evaluateString", new Class[]{scriptable, String.class, String.class, Integer.TYPE, Object.class});
+ context_enter = context.getDeclaredMethod("enter", new Class[0]);
+ context_exit = context.getDeclaredMethod("exit", new Class[0]);
+ return true;
+ } catch (NoSuchMethodException nsme) {
+ return false;
+ } catch (ClassNotFoundException cnfe) {
+ return false;
+ }
+ }
+
+ public void execute(Diagram d, String code) {
+ try {
+ Object cx = context_enter.invoke(null, (Object[]) null);
+ try {
+ Object scope = importer.newInstance(cx);
+ scope_put.invoke(scope, "IO", scope, System.out);
+ scope_put.invoke(scope, "graph", scope, d);
+ cx_evaluateString.invoke(cx, scope, jsHelperText, "jsHelper.js", 1, null);
+ cx_evaluateString.invoke(cx, scope, code, "<cmd>", 1, null);
+ } finally {
+ // Exit from the context.
+ context_exit.invoke(null, (Object[]) null);
+ }
+ } catch (InvocationTargetException iae) {
+ } catch (IllegalAccessException iae) {
+ } catch (InstantiationException iae) {
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.servercompilerscheduler" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.servercompilerscheduler.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.servercompiler
+OpenIDE-Module-Layer: com/sun/hotspot/igv/servercompiler/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/servercompiler/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.servercompilerscheduler-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=d1360a65
+build.xml.script.CRC32=a9d94ef8
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=d1360a65
+nbproject/build-impl.xml.script.CRC32=52847236
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.servercompiler</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages/>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.servercompiler.JavaGroupOrganizer
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.servercompiler.ServerCompilerScheduler
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=ServerCompiler
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,200 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.servercompiler;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class JavaGroupOrganizer implements GroupOrganizer {
+
+ public String getName() {
+ return "Java structure";
+ }
+
+ public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+ List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+ if (subFolders.size() == 0) {
+ buildResult(result, groups, packageNameProvider);
+ } else if (subFolders.size() == 1) {
+ buildResult(result, groups, classNameProvider);
+ } else if (subFolders.size() == 2) {
+ for (Group g : groups) {
+ List<Group> children = new ArrayList<Group>();
+ children.add(g);
+ Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+ p.setLeft(reducedNameProvider.getName(g));
+ p.setRight(children);
+ result.add(p);
+ }
+ } else {
+ result.add(new Pair<String, List<Group>>("", groups));
+ }
+
+ return result;
+ }
+
+ private void buildResult(List<Pair<String, List<Group>>> result, List<Group> groups, NameProvider provider) {
+ HashMap<String, List<Group>> map = new HashMap<String, List<Group>>();
+ for (Group g : groups) {
+ String s = provider.getName(g);
+
+ if (!map.containsKey(s)) {
+ List<Group> list = new ArrayList<Group>();
+ Pair<String, List<Group>> pair = new Pair<String, List<Group>>(s, list);
+ result.add(pair);
+ map.put(s, list);
+ }
+
+ List<Group> curList = map.get(s);
+ curList.add(g);
+ }
+
+ Collections.sort(result, new Comparator<Pair<String, List<Group>>>() {
+
+ public int compare(Pair<String, List<Group>> a, Pair<String, List<Group>> b) {
+ return a.getLeft().compareTo(b.getLeft());
+ }
+ });
+ }
+
+ private static interface NameProvider {
+
+ public String getName(Group g);
+ }
+ private NameProvider reducedNameProvider = new NameProvider() {
+
+ public String getName(Group g) {
+ String name = g.getName();
+ assert name != null : "name of group must be set!";
+ final String noReducedName = name;
+
+ int firstPoint = name.indexOf(".");
+ if (firstPoint == -1) {
+ return noReducedName;
+ }
+
+ int firstParenthese = name.indexOf("(");
+ if (firstParenthese == -1 || firstParenthese < firstPoint) {
+ return noReducedName;
+ }
+
+ int current = firstPoint;
+ while (current > 0 && name.charAt(current) != ' ') {
+ current--;
+ }
+
+ String tmp = name.substring(0, firstParenthese);
+ int lastPoint = tmp.lastIndexOf(".");
+ if (lastPoint == -1) {
+ return noReducedName;
+ }
+
+ name = name.substring(0, current + 1) + name.substring(lastPoint + 1);
+ return name;
+ }
+ };
+ private NameProvider packageNameProvider = new NameProvider() {
+
+ public String getName(Group g) {
+ String name = g.getName();
+ assert name != null : "name of group must be set!";
+ final String noPackage = "<default>";
+
+ int firstPoint = name.indexOf(".");
+ if (firstPoint == -1) {
+ return noPackage;
+ }
+
+ int firstParenthese = name.indexOf("(");
+ if (firstParenthese == -1 || firstParenthese < firstPoint) {
+ return noPackage;
+ }
+
+ int current = firstPoint;
+ while (current > 0 && name.charAt(current) != ' ') {
+ current--;
+ }
+
+ String fullClassName = name.substring(current + 1, firstParenthese);
+ int lastPoint = fullClassName.lastIndexOf(".");
+ if (lastPoint == -1) {
+ return noPackage;
+ }
+ lastPoint = fullClassName.lastIndexOf(".", lastPoint - 1);
+ if (lastPoint == -1) {
+ return noPackage;
+ }
+
+ String packageName = fullClassName.substring(0, lastPoint);
+ return packageName;
+ }
+ };
+ private NameProvider classNameProvider = new NameProvider() {
+
+ public String getName(Group g) {
+ String name = g.getName();
+ assert name != null : "name of group must be set!";
+
+ final String noClass = "<noclass>";
+
+ int firstPoint = name.indexOf(".");
+ if (firstPoint == -1) {
+ return noClass;
+ }
+
+ int firstParenthese = name.indexOf("(");
+ if (firstParenthese == -1 || firstParenthese < firstPoint) {
+ return noClass;
+ }
+
+ int current = firstPoint;
+ while (current > 0 && name.charAt(current) != ' ') {
+ current--;
+ }
+
+ String fullClassName = name.substring(current + 1, firstParenthese);
+ int lastPoint = fullClassName.lastIndexOf(".");
+ if (lastPoint == -1) {
+ return noClass;
+ }
+ int lastlastPoint = fullClassName.lastIndexOf(".", lastPoint - 1);
+
+ String className = fullClassName.substring(lastlastPoint + 1, lastPoint);
+ return className;
+ }
+ };
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,597 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.servercompiler;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.services.Scheduler;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.Vector;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ServerCompilerScheduler implements Scheduler {
+
+ private static class Node {
+
+ public InputNode inputNode;
+ public Set<Node> succs = new HashSet<Node>();
+ public List<Node> preds = new ArrayList<Node>();
+ public InputBlock block;
+ public boolean isBlockProjection;
+ public boolean isBlockStart;
+ }
+ private InputGraph graph;
+ private Collection<Node> nodes;
+ private Map<InputNode, Node> inputNodeToNode;
+ private Vector<InputBlock> blocks;
+ private Map<InputBlock, InputBlock> dominatorMap;
+ private Map<InputBlock, Integer> blockIndex;
+ private InputBlock[][] commonDominator;
+ private static final Comparator<InputEdge> edgeComparator = new Comparator<InputEdge>() {
+
+ public int compare(InputEdge o1, InputEdge o2) {
+ return o1.getToIndex() - o2.getToIndex();
+ }
+ };
+
+ public void buildBlocks() {
+
+ blocks = new Vector<InputBlock>();
+ Node root = findRoot();
+ if (root == null) {
+ return;
+ }
+ Stack<Node> stack = new Stack<Node>();
+ Set<Node> visited = new HashSet<Node>();
+ stack.add(root);
+ int blockCount = 0;
+ InputBlock rootBlock = null;
+
+
+ while (!stack.isEmpty()) {
+ Node proj = stack.pop();
+ Node parent = proj;
+ if (proj.isBlockProjection && proj.preds.size() > 0) {
+ parent = proj.preds.get(0);
+ }
+
+ if (!visited.contains(parent)) {
+ visited.add(parent);
+ InputBlock block = new InputBlock(graph, "" + blockCount);
+ blocks.add(block);
+ if (parent == root) {
+ rootBlock = block;
+ }
+ blockCount++;
+ parent.block = block;
+ if (proj != parent && proj.succs.size() == 1 && proj.succs.contains(root)) {
+ // Special treatment of Halt-nodes
+ proj.block = block;
+ }
+
+ Node p = proj;
+ do {
+ if (p.preds.size() == 0 || p.preds.get(0) == null) {
+ p = parent;
+ break;
+ }
+ p = p.preds.get(0);
+
+ if (p.block == null) {
+ p.block = block;
+ }
+ } while (!p.isBlockProjection && !p.isBlockStart);
+
+ if (block != rootBlock) {
+ for (Node n : p.preds) {
+ if (n != null && n != p) {
+ if (n.isBlockProjection) {
+ n = n.preds.get(0);
+ }
+ if (n.block != null) {
+ n.block.addSuccessor(block);
+ }
+ }
+ }
+ }
+
+ for (Node n : parent.succs) {
+ if (n != root && n.isBlockProjection) {
+ for (Node n2 : n.succs) {
+
+ if (n2 != parent && n2.block != null && n2.block != rootBlock) {
+ block.addSuccessor(n2.block);
+ }
+ }
+ } else {
+ if (n != parent && n.block != null && n.block != rootBlock) {
+ block.addSuccessor(n.block);
+ }
+ }
+ }
+
+ int num_preds = p.preds.size();
+ int bottom = -1;
+ if (isRegion(p) || isPhi(p)) {
+ bottom = 0;
+ }
+
+ int pushed = 0;
+ for (int i = num_preds - 1; i > bottom; i--) {
+ if (p.preds.get(i) != null && p.preds.get(i) != p) {
+ stack.push(p.preds.get(i));
+ pushed++;
+ }
+ }
+
+ if (pushed == 0 && p == root) {
+ // TODO: special handling when root backedges are not built yet
+ }
+ }
+ }
+
+ for (Node n : nodes) {
+ InputBlock block = n.block;
+ if (block != null) {
+ block.addNode(n.inputNode.getId());
+ }
+ }
+
+ int z = 0;
+ blockIndex = new HashMap<InputBlock, Integer>();
+ for (InputBlock b : blocks) {
+ blockIndex.put(b, z);
+ z++;
+ }
+ }
+
+ private String getBlockName(InputNode n) {
+ return n.getProperties().get("block");
+ }
+
+ public Collection<InputBlock> schedule(InputGraph graph) {
+ if (graph.getBlocks().size() > 0) {
+ Collection<InputNode> tmpNodes = new ArrayList<InputNode>(graph.getNodes());
+ for (InputNode n : tmpNodes) {
+ String block = getBlockName(n);
+ if (graph.getBlock(n) == null) {
+ graph.getBlock(block).addNode(n);
+ assert graph.getBlock(n) != null;
+ }
+ }
+ return graph.getBlocks();
+ } else {
+ nodes = new ArrayList<Node>();
+ inputNodeToNode = new HashMap<InputNode, Node>();
+
+ this.graph = graph;
+ buildUpGraph();
+ buildBlocks();
+ buildDominators();
+ buildCommonDominators();
+ scheduleLatest();
+
+ for (InputNode n : graph.getNodes()) {
+ assert graph.getBlock(n) != null;
+ }
+
+ return blocks;
+ }
+ }
+
+ public void scheduleLatest() {
+
+
+ Node root = findRoot();
+
+ // Mark all nodes reachable in backward traversal from root
+ Set<Node> reachable = new HashSet<Node>();
+ reachable.add(root);
+ Stack<Node> stack = new Stack<Node>();
+ stack.push(root);
+ while (!stack.isEmpty()) {
+ Node cur = stack.pop();
+ for (Node n : cur.preds) {
+ if (!reachable.contains(n)) {
+ reachable.add(n);
+ stack.push(n);
+ }
+ }
+ }
+
+ Set<Node> unscheduled = new HashSet<Node>();
+ for (Node n : this.nodes) {
+ if (n.block == null && reachable.contains(n)) {
+ unscheduled.add(n);
+ }
+ }
+
+ while (unscheduled.size() > 0) {
+ boolean progress = false;
+
+ Set<Node> newUnscheduled = new HashSet<Node>();
+ for (Node n : unscheduled) {
+
+ InputBlock block = null;
+ if (this.isPhi(n) && n.preds.get(0) != null) {
+ // Phi nodes in same block as region nodes
+ block = n.preds.get(0).block;
+ } else {
+ for (Node s : n.succs) {
+ if (reachable.contains(s)) {
+ if (s.block == null) {
+ block = null;
+ break;
+ } else {
+ if (block == null) {
+ block = s.block;
+ } else {
+ block = commonDominator[this.blockIndex.get(block)][blockIndex.get(s.block)];
+ }
+ }
+ }
+ }
+ }
+
+ if (block != null) {
+ n.block = block;
+ block.addNode(n.inputNode.getId());
+ progress = true;
+ } else {
+ newUnscheduled.add(n);
+ }
+ }
+
+ unscheduled = newUnscheduled;
+
+ if (!progress) {
+ break;
+ }
+ }
+
+ Set<Node> curReachable = new HashSet<Node>(reachable);
+ for (Node n : curReachable) {
+ if (n.block != null) {
+ for (Node s : n.succs) {
+ if (!reachable.contains(s)) {
+ markWithBlock(s, n.block, reachable);
+ }
+ }
+ }
+ }
+
+ }
+
+ private void markWithBlock(Node n, InputBlock b, Set<Node> reachable) {
+ assert !reachable.contains(n);
+ Stack<Node> stack = new Stack<Node>();
+ stack.push(n);
+ n.block = b;
+ b.addNode(n.inputNode.getId());
+ reachable.add(n);
+
+ while (!stack.isEmpty()) {
+ Node cur = stack.pop();
+ for (Node s : cur.succs) {
+ if (!reachable.contains(s)) {
+ reachable.add(s);
+ s.block = b;
+ b.addNode(s.inputNode.getId());
+ stack.push(s);
+ }
+ }
+
+ for (Node s : cur.preds) {
+ if (!reachable.contains(s)) {
+ reachable.add(s);
+ s.block = b;
+ b.addNode(s.inputNode.getId());
+ stack.push(s);
+ }
+ }
+ }
+ }
+
+ private class BlockIntermediate {
+
+ InputBlock block;
+ int index;
+ int dominator;
+ int semi;
+ int parent;
+ int label;
+ int ancestor;
+ List<Integer> pred;
+ List<Integer> bucket;
+ }
+
+ public void buildCommonDominators() {
+ commonDominator = new InputBlock[this.blocks.size()][this.blocks.size()];
+ for (int i = 0; i < blocks.size(); i++) {
+ for (int j = 0; j < blocks.size(); j++) {
+ commonDominator[i][j] = getCommonDominator(i, j);
+ }
+ }
+ }
+
+ public InputBlock getCommonDominator(int a, int b) {
+ InputBlock ba = blocks.get(a);
+ InputBlock bb = blocks.get(b);
+ if (ba == bb) {
+ return ba;
+ }
+ Set<InputBlock> visited = new HashSet<InputBlock>();
+ while (ba != null) {
+ visited.add(ba);
+ ba = dominatorMap.get(ba);
+ }
+
+ while (bb != null) {
+ if (visited.contains(bb)) {
+ return bb;
+ }
+ bb = dominatorMap.get(bb);
+ }
+
+ assert false;
+ return null;
+ }
+
+ public void buildDominators() {
+ dominatorMap = new HashMap<InputBlock, InputBlock>();
+ if (blocks.size() == 0) {
+ return;
+ }
+ Vector<BlockIntermediate> intermediate = new Vector<BlockIntermediate>();
+ Map<InputBlock, BlockIntermediate> map = new HashMap<InputBlock, BlockIntermediate>();
+ int z = 0;
+ for (InputBlock b : blocks) {
+ BlockIntermediate bi = new BlockIntermediate();
+ bi.block = b;
+ bi.index = z;
+ bi.dominator = -1;
+ bi.semi = -1;
+ bi.parent = -1;
+ bi.label = z;
+ bi.ancestor = -1;
+ bi.pred = new ArrayList<Integer>();
+ bi.bucket = new ArrayList<Integer>();
+ intermediate.add(bi);
+ map.put(b, bi);
+ z++;
+ }
+ Stack<Integer> stack = new Stack<Integer>();
+ stack.add(0);
+
+ Vector<BlockIntermediate> array = new Vector<BlockIntermediate>();
+ intermediate.get(0).dominator = 0;
+
+ int n = 0;
+ while (!stack.isEmpty()) {
+ int index = stack.pop();
+ BlockIntermediate ib = intermediate.get(index);
+ ib.semi = n;
+ array.add(ib);
+ n = n + 1;
+ for (InputBlock b : ib.block.getSuccessors()) {
+ BlockIntermediate succ = map.get(b);
+ if (succ.semi == -1) {
+ succ.parent = index;
+ stack.push(succ.index); // TODO: check if same node could be pushed twice
+ }
+ succ.pred.add(index);
+ }
+ }
+
+ for (int i = n - 1; i > 0; i--) {
+ BlockIntermediate block = array.get(i);
+ int block_index = block.index;
+ for (int predIndex : block.pred) {
+ int curIndex = eval(predIndex, intermediate);
+ BlockIntermediate curBlock = intermediate.get(curIndex);
+ if (curBlock.semi < block.semi) {
+ block.semi = curBlock.semi;
+ }
+ }
+
+
+ int semiIndex = block.semi;
+ BlockIntermediate semiBlock = array.get(semiIndex);
+ semiBlock.bucket.add(block_index);
+
+ link(block.parent, block_index, intermediate);
+ BlockIntermediate parentBlock = intermediate.get(block.parent);
+
+ for (int j = 0; j < parentBlock.bucket.size(); j++) {
+ for (int curIndex : parentBlock.bucket) {
+ int newIndex = eval(curIndex, intermediate);
+ BlockIntermediate curBlock = intermediate.get(curIndex);
+ BlockIntermediate newBlock = intermediate.get(newIndex);
+ int dom = block.parent;
+ if (newBlock.semi < curBlock.semi) {
+ dom = newIndex;
+ }
+
+ curBlock.dominator = dom;
+ }
+ }
+
+
+ parentBlock.bucket.clear();
+ }
+
+ for (int i = 1; i < n; i++) {
+
+ BlockIntermediate block = array.get(i);
+ int block_index = block.index;
+
+ int semi_index = block.semi;
+ BlockIntermediate semi_block = array.get(semi_index);
+
+ if (block.dominator != semi_block.index) {
+ int new_dom = intermediate.get(block.dominator).dominator;
+ block.dominator = new_dom;
+ }
+ }
+
+ for (BlockIntermediate ib : intermediate) {
+ if (ib.dominator == -1) {
+ ib.dominator = 0;
+ }
+ }
+
+ for (BlockIntermediate bi : intermediate) {
+ InputBlock b = bi.block;
+ int dominator = bi.dominator;
+ InputBlock dominatorBlock = null;
+ if (dominator != -1) {
+ dominatorBlock = intermediate.get(dominator).block;
+ }
+
+ if (dominatorBlock == b) {
+ dominatorBlock = null;
+ }
+ this.dominatorMap.put(b, dominatorBlock);
+ }
+ }
+
+ private void compress(int index, Vector<BlockIntermediate> blocks) {
+ BlockIntermediate block = blocks.get(index);
+
+ int ancestor = block.ancestor;
+ assert ancestor != -1;
+
+ BlockIntermediate ancestor_block = blocks.get(ancestor);
+ if (ancestor_block.ancestor != -1) {
+ compress(ancestor, blocks);
+
+ int label = block.label;
+ BlockIntermediate label_block = blocks.get(label);
+
+ int ancestor_label = ancestor_block.label;
+ BlockIntermediate ancestor_label_block = blocks.get(label);
+ if (ancestor_label_block.semi < label_block.semi) {
+ block.label = ancestor_label;
+ }
+
+ block.ancestor = ancestor_block.ancestor;
+ }
+ }
+
+ private int eval(int index, Vector<BlockIntermediate> blocks) {
+ BlockIntermediate block = blocks.get(index);
+ if (block.ancestor == -1) {
+ return index;
+ } else {
+ compress(index, blocks);
+ return block.label;
+ }
+ }
+
+ private void link(int index1, int index2, Vector<BlockIntermediate> blocks) {
+ BlockIntermediate block2 = blocks.get(index2);
+ block2.ancestor = index1;
+ }
+
+ private boolean isRegion(Node n) {
+ return n.inputNode.getProperties().get("name").equals("Region");
+ }
+
+ private boolean isPhi(Node n) {
+ return n.inputNode.getProperties().get("name").equals("Phi");
+ }
+
+ private Node findRoot() {
+
+ for (Node n : nodes) {
+ InputNode inputNode = n.inputNode;
+ if (inputNode.getProperties().get("name").equals("Root")) {
+ return n;
+ }
+ }
+
+ return null;
+ }
+
+ public void buildUpGraph() {
+
+ for (InputNode n : graph.getNodes()) {
+ Node node = new Node();
+ node.inputNode = n;
+ nodes.add(node);
+ String p = n.getProperties().get("is_block_proj");
+ node.isBlockProjection = (p != null && p.equals("true"));
+ p = n.getProperties().get("is_block_start");
+ node.isBlockStart = (p != null && p.equals("true"));
+ inputNodeToNode.put(n, node);
+ }
+
+ Map<Integer, List<InputEdge>> edgeMap = new HashMap<Integer, List<InputEdge>>();
+ for (InputEdge e : graph.getEdges()) {
+
+ int to = e.getTo();
+ if (!edgeMap.containsKey(to)) {
+ edgeMap.put(to, new ArrayList<InputEdge>());
+ }
+
+
+ List<InputEdge> list = edgeMap.get(to);
+ list.add(e);
+ }
+
+
+ for (Integer i : edgeMap.keySet()) {
+
+ List<InputEdge> list = edgeMap.get(i);
+ Collections.sort(list, edgeComparator);
+
+ int to = i;
+ InputNode toInputNode = graph.getNode(to);
+ Node toNode = inputNodeToNode.get(toInputNode);
+ for (InputEdge e : list) {
+ assert to == e.getTo();
+ int from = e.getFrom();
+ InputNode fromInputNode = graph.getNode(from);
+ Node fromNode = inputNodeToNode.get(fromInputNode);
+ fromNode.succs.add(toNode);
+ toNode.preds.add(fromNode);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+colorize("name", ".*", yellow);
+colorize("name", "Catch.*", blue);
+
+colorize("name", "Region|Loop|CountedLoop|Root", red);
+colorize("name", "CProj|IfFalse|IfTrue|JProj|CatchProj", magenta);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+var f = new CombineFilter("Combine Filter");
+f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", ".*"), new Properties.RegexpPropertyMatcher("name", "Proj|IfFalse|IfTrue|JProj|MachProj|JumpProj|CatchProj")));
+f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", "Cmp.*"), new Properties.RegexpPropertyMatcher("name", "Bool")));
+f.apply(graph);
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+colorize("state", "same", white);
+colorize("state", "changed", orange);
+colorize("state", "new", green);
+colorize("state", "deleted", red);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,3 @@
+colorize("name", "Con.*", orange);
+colorize("name", "Parm|Proj", lightGray);
+colorize("bci", "..*", magenta);
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+var f = new ColorFilter("Line Style filter");
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "int:")), null, Color.BLUE, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "control")), null, Color.RED, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory")), null, Color.GREEN, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "tuple:")), null, Color.MAGENTA, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "bottom")), null, Color.LIGHT_GRAY, null));
+f.apply(graph);
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,3 @@
+colorize("is_dontcare", "false", white);
+colorize("is_shared", "true", green);
+colorize("is_dontcare", "true", red);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,24 @@
+var f = new RemoveFilter("Show only control flow");
+f.addRule(
+ new RemoveFilter.RemoveRule(
+ new InvertSelector(
+ new OrSelector(
+ new OrSelector(
+ new SuccessorSelector(
+ new MatcherSelector(
+ new Properties.StringPropertyMatcher("type", "control")
+ )
+ ),
+ new MatcherSelector(
+ new Properties.StringPropertyMatcher("type", "control")
+ )
+ ),
+ new MatcherSelector(
+ new Properties.StringPropertyMatcher("name", "Start")
+ )
+ )
+ ), false
+ )
+);
+f.addRule( new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher("name", "Phi|Store.")), false));
+f.apply(graph);
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+colorize("reg", "EAX", green);
+colorize("reg", "EFLAGS", gray);
+colorize("reg", "EBP", orange);
+colorize("reg", "ECX", cyan);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+remove("dump_spec", "FramePtr|ReturnAdr|I_O");
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+
+//var f = new RemoveFilter("Remove Memory");
+//f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.StringPropertyMatcher("dump_spec", "Memory")), false));
+//f.addRule(new RemoveFilter.RemoveRule(new AndSelector(new MatcherSelector(new Properties.StringPropertyMatcher("name", "Proj")), new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory"))), false));
+//f.apply(graph);
+
+remove("dump_spec", "Memory");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+removeInputs("name", "Root");
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,4 @@
+removeInputs("name", "SafePoint|CallStaticJava|CallDynamicJava|CallJava|CallLeaf|CallRuntime|AbstractLock|CallLeafNoFP|Call|CallStaticJavaDirect", 5);
+removeInputs("name", "Unlock|Lock", 7);
+removeInputs("name", "Allocate", 7);
+removeInputs("name", "AllocateArray", 9);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+var f = new RemoveSelfLoopsFilter("Remove Self-Loops");
+f.apply(graph);
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+split("name", "BoxLock");
+split("name", "(Con.*)|(loadCon.*)");
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <folder name="Filters">
+ <file name="Basic Coloring" url="filters/color.filter">
+ <attr name="enabled" boolvalue="true"/>
+ </file>
+ <file name="Matcher Flags Coloring" url="filters/matchingFlags.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Basic Coloring"/>
+ </file>
+ <file name="Register Coloring" url="filters/register.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Matcher Flags Coloring"/>
+ </file>
+ <file name="Extended Coloring" url="filters/extendedColor.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Register Coloring"/>
+ </file>
+ <file name="Line Coloring" url="filters/linestyle.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Extended Coloring"/>
+ </file>
+ <file name="Difference Coloring" url="filters/difference.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Line Coloring"/>
+ </file>
+ <file name="Only Control Flow" url="filters/onlyControlFlow.filter">
+ <attr name="enabled" boolvalue="false"/>
+ <attr name="after" stringvalue="Difference Coloring"/>
+ </file>
+ <file name="Remove FramePtr, I_O and Return Address" url="filters/remove.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Only Control Flow"/>
+ </file>
+ <file name="Remove Memory" url="filters/removeMemory.filter">
+ <attr name="enabled" boolvalue="false"/>
+ <attr name="after" stringvalue="Remove FramePtr, I_O and Return Address"/>
+ </file>
+ <file name="Remove Root Inputs" url="filters/removeRootInputs.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Remove Memory"/>
+ </file>
+ <file name="Remove Safepoint Inputs" url="filters/removeSafepointInputs.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Remove Root Inputs"/>
+ </file>
+ <file name="Remove Self Loops" url="filters/removeSelfLoops.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Remove Safepoint Inputs"/>
+ </file>
+ <file name="Combine" url="filters/combine.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Remove Self Loops"/>
+ </file>
+ <file name="Split" url="filters/split.filter">
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="after" stringvalue="Combine"/>
+ </file>
+ </folder>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.settings" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.settings.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.settings
+OpenIDE-Module-Layer: com/sun/hotspot/igv/settings/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/settings/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.settings-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=8869440a
+build.xml.script.CRC32=7ef09117
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=8869440a
+nbproject/build-impl.xml.script.CRC32=1a0e7f21
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>org.jdesktop.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.4</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.netbeans.modules.options.api</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.5</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.awt</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.11.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.9.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.settings</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+AdvancedOption_DisplayName_Settings=Settings
+AdvancedOption_Tooltip_Settings=Application Settings
+OpenIDE-Module-Name=Settings
+OptionsCategory_Name_View=General
+OptionsCategory_Title_View=View Settings
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.settings;
+
+import java.util.prefs.Preferences;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Settings {
+
+ public final static String NODE_TEXT = "nodeText";
+ public final static String NODE_TEXT_DEFAULT = "[idx] [name]";
+ public final static String NODE_WIDTH = "nodeWidth";
+ public final static String NODE_WIDTH_DEFAULT = "100";
+ public final static String PORT = "port";
+ public final static String PORT_DEFAULT = "4444";
+ public final static String DIRECTORY = "directory";
+ public final static String DIRECTORY_DEFAULT = System.getProperty("user.dir");
+
+ public static Preferences get() {
+ return Preferences.userNodeForPackage(Settings.class);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import org.netbeans.spi.options.OptionsCategory;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ViewOptionsCategory extends OptionsCategory {
+
+ @Override
+ public Icon getIcon() {
+ return new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/settings/settings.gif"));
+ }
+
+ public String getCategoryName() {
+ return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Name_View");
+ }
+
+ public String getTitle() {
+ return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Title_View");
+ }
+
+ public OptionsPanelController create() {
+ return new ViewOptionsPanelController();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import javax.swing.JComponent;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ViewOptionsPanelController extends OptionsPanelController {
+
+ private ViewPanel panel;
+ private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+ private boolean changed;
+
+ public void update() {
+ getPanel().load();
+ changed = false;
+ }
+
+ public void applyChanges() {
+ getPanel().store();
+ changed = false;
+ }
+
+ public void cancel() {
+ // need not do anything special, if no changes have been persisted yet
+ }
+
+ public boolean isValid() {
+ return getPanel().valid();
+ }
+
+ public boolean isChanged() {
+ return changed;
+ }
+
+ public HelpCtx getHelpCtx() {
+ return null; // new HelpCtx("...ID") if you have a help set
+ }
+
+ public JComponent getComponent(Lookup masterLookup) {
+ return getPanel();
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ pcs.addPropertyChangeListener(l);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener l) {
+ pcs.removePropertyChangeListener(l);
+ }
+
+ private ViewPanel getPanel() {
+ if (panel == null) {
+ panel = new ViewPanel(this);
+ }
+ return panel;
+ }
+
+ void changed() {
+ if (!changed) {
+ changed = true;
+ pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
+ }
+ pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <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" alignment="0" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jPanel1" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </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="jPanel1" min="-2" max="-2" attributes="0"/>
+ <EmptySpace pref="206" max="32767" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="1" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace min="-2" pref="39" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="portSpinner" alignment="0" min="-2" pref="63" max="-2" attributes="0"/>
+ <Component id="nodeWidthSpinner" alignment="0" min="-2" pref="63" max="-2" attributes="0"/>
+ <Component id="jScrollPane1" alignment="0" min="-2" pref="365" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ </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"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jScrollPane1" min="-2" max="-2" attributes="0"/>
+ <EmptySpace type="separate" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="nodeWidthSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace type="separate" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="portSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ <Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace min="-2" pref="73" max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Node Text"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel2">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Node Width"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JSpinner" name="portSpinner">
+ </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="nodeTextArea">
+ <Properties>
+ <Property name="columns" type="int" value="20"/>
+ <Property name="rows" type="int" value="5"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Component class="javax.swing.JSpinner" name="nodeWidthSpinner">
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel3">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Network Port"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ViewPanel extends javax.swing.JPanel {
+
+ private final ViewOptionsPanelController controller;
+
+ ViewPanel(ViewOptionsPanelController controller) {
+ this.controller = controller;
+ initComponents();
+ }
+
+ /** 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() {
+
+ jPanel1 = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ jLabel2 = new javax.swing.JLabel();
+ portSpinner = new javax.swing.JSpinner();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ nodeTextArea = new javax.swing.JTextArea();
+ nodeWidthSpinner = new javax.swing.JSpinner();
+ jLabel3 = new javax.swing.JLabel();
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel1, "Node Text");
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel2, "Node Width");
+
+ nodeTextArea.setColumns(20);
+ nodeTextArea.setRows(5);
+ jScrollPane1.setViewportView(nodeTextArea);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel3, "Network Port");
+
+ org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
+ jPanel1.setLayout(jPanel1Layout);
+ jPanel1Layout.setHorizontalGroup(
+ jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
+ .addContainerGap()
+ .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(jLabel1)
+ .add(jLabel3)
+ .add(jLabel2))
+ .add(39, 39, 39)
+ .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+ .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+ .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 365, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+ .addContainerGap())
+ );
+ jPanel1Layout.setVerticalGroup(
+ jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(jPanel1Layout.createSequentialGroup()
+ .addContainerGap()
+ .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(jPanel1Layout.createSequentialGroup()
+ .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+ .add(18, 18, 18)
+ .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+ .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+ .add(jLabel2))
+ .add(18, 18, 18)
+ .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+ .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+ .add(jLabel3)))
+ .add(jLabel1))
+ .add(73, 73, 73))
+ );
+
+ org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(layout.createSequentialGroup()
+ .addContainerGap()
+ .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+ .add(layout.createSequentialGroup()
+ .addContainerGap()
+ .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 232, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(206, Short.MAX_VALUE))
+ );
+ }// </editor-fold>//GEN-END:initComponents
+ void load() {
+ nodeTextArea.setText(Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+ nodeWidthSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.NODE_WIDTH, Settings.NODE_WIDTH_DEFAULT)));
+ portSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT)));
+ }
+
+ void store() {
+ Settings.get().put(Settings.NODE_TEXT, nodeTextArea.getText());
+ Settings.get().put(Settings.NODE_WIDTH, nodeWidthSpinner.getValue().toString());
+ Settings.get().put(Settings.PORT, portSpinner.getValue().toString());
+ }
+
+ boolean valid() {
+ return true;
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JLabel jLabel3;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTextArea nodeTextArea;
+ private javax.swing.JSpinner nodeWidthSpinner;
+ private javax.swing.JSpinner portSpinner;
+ // End of variables declaration//GEN-END:variables
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <folder name="OptionsDialog">
+ <file name="Advanced.instance_hidden"/>
+ <file name="General.instance_hidden"/>
+ <file name="com-sun-hotspot-igv-settings-ViewOptionsCategory.instance"/>
+ </folder>
+</filesystem>
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.util" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.util.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.util
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/util/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.util-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=a470a16f
+build.xml.script.CRC32=466cf03b
+build.xml.stylesheet.CRC32=05353c81
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=a470a16f
+nbproject/build-impl.xml.script.CRC32=39f45e01
+nbproject/build-impl.xml.stylesheet.CRC32=3f8b4615
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.netbeans.api.visual</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>2.9</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.nodes</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.2.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.10.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.util</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,182 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BoundedZoomAction extends WidgetAction.Adapter {
+
+ private double minFactor = 0.0;
+ private double maxFactor = Double.MAX_VALUE;
+ private double zoomMultiplier;
+ private boolean useAnimator;
+
+ public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) {
+ this.zoomMultiplier = zoomMultiplier;
+ this.useAnimator = useAnimator;
+ }
+
+ public double getMinFactor() {
+ return minFactor;
+ }
+
+ public void setMinFactor(double d) {
+ minFactor = d;
+ }
+
+ public double getMaxFactor() {
+ return maxFactor;
+ }
+
+ public void setMaxFactor(double d) {
+ maxFactor = d;
+ }
+
+ private JScrollPane findScrollPane(JComponent component) {
+ for (;;) {
+ if (component == null) {
+ return null;
+ }
+ if (component instanceof JScrollPane) {
+ return ((JScrollPane) component);
+ }
+ Container parent = component.getParent();
+ if (!(parent instanceof JComponent)) {
+ return null;
+ }
+ component = (JComponent) parent;
+ }
+ }
+
+ @Override
+ public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) {
+ final Scene scene = widget.getScene();
+ int amount = event.getWheelRotation();
+ JScrollPane scrollPane = findScrollPane(scene.getView());
+ Point viewPosition = null;
+ Point mouseLocation = scene.convertSceneToView(event.getPoint());
+ int xOffset = 0;
+ int yOffset = 0;
+ Point oldViewPosition = null;
+ Rectangle bounds = new Rectangle(scene.getBounds());
+ Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
+
+ if (scrollPane != null) {
+ viewPosition = new Point(scrollPane.getViewport().getViewPosition());
+ oldViewPosition = new Point(viewPosition);
+ xOffset = (mouseLocation.x - viewPosition.x);
+ yOffset = (mouseLocation.y - viewPosition.y);
+ viewPosition.x += xOffset;
+ viewPosition.y += yOffset;
+ }
+
+ if (useAnimator) {
+ SceneAnimator sceneAnimator = scene.getSceneAnimator();
+ synchronized (sceneAnimator) {
+ double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor();
+ while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
+ zoom /= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x /= zoomMultiplier;
+ viewPosition.y /= zoomMultiplier;
+ bounds.width /= zoomMultiplier;
+ bounds.height /= zoomMultiplier;
+ componentSize.width /= zoomMultiplier;
+ componentSize.height /= zoomMultiplier;
+ }
+ amount--;
+ }
+ while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
+ zoom *= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x *= zoomMultiplier;
+ viewPosition.y *= zoomMultiplier;
+ bounds.width *= zoomMultiplier;
+ bounds.height *= zoomMultiplier;
+ componentSize.width *= zoomMultiplier;
+ componentSize.height *= zoomMultiplier;
+ }
+ amount++;
+ }
+ sceneAnimator.animateZoomFactor(zoom);
+ }
+ } else {
+ double zoom = scene.getZoomFactor();
+ while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
+ zoom /= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x /= zoomMultiplier;
+ viewPosition.y /= zoomMultiplier;
+ bounds.width /= zoomMultiplier;
+ bounds.height /= zoomMultiplier;
+ componentSize.width /= zoomMultiplier;
+ componentSize.height /= zoomMultiplier;
+ }
+ amount--;
+ }
+ while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
+ zoom *= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x *= zoomMultiplier;
+ viewPosition.y *= zoomMultiplier;
+ bounds.width *= zoomMultiplier;
+ bounds.height *= zoomMultiplier;
+ componentSize.width *= zoomMultiplier;
+ componentSize.height *= zoomMultiplier;
+ }
+ amount++;
+ }
+ scene.setZoomFactor(zoom);
+ }
+
+ if (scrollPane != null) {
+ scene.validate(); // Call validate to update size of scene
+ Dimension size = scrollPane.getViewport().getExtentSize();
+ viewPosition.x -= xOffset;
+ viewPosition.y -= yOffset;
+ scene.resolveBounds(scene.getLocation(), bounds);
+ scene.getView().setPreferredSize(componentSize);
+ scene.getView().revalidate();
+ scene.getView().addNotify();
+ scrollPane.getViewport().setViewPosition(viewPosition);
+ }
+
+ return WidgetAction.State.CONSUMED;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Util
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import javax.swing.Icon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ColorIcon implements Icon {
+
+ private Color color;
+
+ public ColorIcon(Color c) {
+ color = c;
+ }
+
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ g.setColor(color);
+ g.fillRect(x, y, 16, 16);
+ }
+
+ public int getIconWidth() {
+ return 16;
+ }
+
+ public int getIconHeight() {
+ return 16;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.util;
+
+import java.awt.EventQueue;
+import org.openide.util.ContextAwareAction;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class ContextAction<T> extends CallableSystemAction implements LookupListener, ContextAwareAction {
+
+ private Lookup context = null;
+ private Lookup.Result<T> result = null;
+
+ public ContextAction() {
+ this(Utilities.actionsGlobalContext());
+ }
+
+ public ContextAction(Lookup context) {
+ init(context);
+ }
+
+ private void init(Lookup context) {
+ this.context = context;
+ result = context.lookupResult(contextClass());
+ result.addLookupListener(this);
+ resultChanged(null);
+ }
+
+ public void resultChanged(LookupEvent e) {
+ if (result.allItems().size() != 0) {
+ update(result.allInstances().iterator().next());
+ } else {
+ update(null);
+ }
+ }
+
+ @Override
+ public void performAction() {
+ final T t = result.allInstances().iterator().next();
+
+ // Ensure it's AWT event thread
+ EventQueue.invokeLater(new Runnable() {
+
+ public void run() {
+ performAction(t);
+ }
+ });
+ }
+
+ public void update(T t) {
+ if (t == null) {
+ setEnabled(false);
+ } else {
+ setEnabled(isEnabled(t));
+ }
+ }
+
+ public boolean isEnabled(T context) {
+ return true;
+ }
+
+ public abstract Class<T> contextClass();
+
+ public abstract void performAction(T context);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DoubleClickAction extends WidgetAction.Adapter {
+
+ private DoubleClickHandler handler;
+
+ public DoubleClickAction(DoubleClickHandler handler) {
+ this.handler = handler;
+ }
+
+ @Override
+ public WidgetAction.State mouseClicked(Widget widget, WidgetAction.WidgetMouseEvent event) {
+ if (event.getClickCount() > 1) {
+ handler.handleDoubleClick(widget, event);
+ return WidgetAction.State.CONSUMED;
+ }
+ return WidgetAction.State.REJECTED;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface DoubleClickHandler {
+
+ public void handleDoubleClick(Widget w, WidgetMouseEvent e);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,195 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.widget.Scene;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener {
+
+ private Scene scene;
+ private Image image;
+ private int imageWidth;
+ private int imageHeight;
+
+ public ExtendedSatelliteComponent(Scene scene) {
+ this.scene = scene;
+ setDoubleBuffered(true);
+ setPreferredSize(new Dimension(128, 128));
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ }
+
+ @Override
+ public void addNotify() {
+ super.addNotify();
+ scene.addSceneListener(this);
+ JComponent viewComponent = scene.getView();
+ if (viewComponent == null) {
+ viewComponent = scene.createView();
+ }
+ viewComponent.addComponentListener(this);
+ repaint();
+ }
+
+ @Override
+ public void removeNotify() {
+ scene.getView().removeComponentListener(this);
+ scene.removeSceneListener(this);
+ super.removeNotify();
+ }
+
+ public void update() {
+ this.image = null;
+ repaint();
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ Graphics2D gr = (Graphics2D) g;
+ super.paint(g);
+ Rectangle bounds = scene.getBounds();
+ Dimension size = getSize();
+
+ double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+ double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+ double scale = Math.min(sx, sy);
+
+ int vw = (int) (scale * bounds.width);
+ int vh = (int) (scale * bounds.height);
+ int vx = (size.width - vw) / 2;
+ int vy = (size.height - vh) / 2;
+
+
+ if (image == null || vw != imageWidth || vh != imageHeight) {
+
+ imageWidth = vw;
+ imageHeight = vh;
+ image = this.createImage(imageWidth, imageHeight);
+ Graphics2D ig = (Graphics2D) image.getGraphics();
+ ig.scale(scale, scale);
+ scene.paint(ig);
+ }
+
+ gr.drawImage(image, vx, vy, this);
+
+ JComponent component = scene.getView();
+ double zoomFactor = scene.getZoomFactor();
+ Rectangle viewRectangle = component != null ? component.getVisibleRect() : null;
+ if (viewRectangle != null) {
+ Rectangle window = new Rectangle(
+ (int) ((double) viewRectangle.x * scale / zoomFactor),
+ (int) ((double) viewRectangle.y * scale / zoomFactor),
+ (int) ((double) viewRectangle.width * scale / zoomFactor),
+ (int) ((double) viewRectangle.height * scale / zoomFactor));
+ window.translate(vx, vy);
+ gr.setColor(new Color(200, 200, 200, 128));
+ gr.fill(window);
+ gr.setColor(Color.BLACK);
+ gr.drawRect(window.x, window.y, window.width - 1, window.height - 1);
+ }
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ moveVisibleRect(e.getPoint());
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ moveVisibleRect(e.getPoint());
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ moveVisibleRect(e.getPoint());
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ }
+
+ private void moveVisibleRect(Point center) {
+ JComponent component = scene.getView();
+ if (component == null) {
+ return;
+ }
+ double zoomFactor = scene.getZoomFactor();
+ Rectangle bounds = scene.getBounds();
+ Dimension size = getSize();
+
+ double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+ double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+ double scale = Math.min(sx, sy);
+
+ int vw = (int) (scale * bounds.width);
+ int vh = (int) (scale * bounds.height);
+ int vx = (size.width - vw) / 2;
+ int vy = (size.height - vh) / 2;
+
+ int cx = (int) ((double) (center.x - vx) / scale * zoomFactor);
+ int cy = (int) ((double) (center.y - vy) / scale * zoomFactor);
+
+ Rectangle visibleRect = component.getVisibleRect();
+ visibleRect.x = cx - visibleRect.width / 2;
+ visibleRect.y = cy - visibleRect.height / 2;
+ component.scrollRectToVisible(visibleRect);
+
+ }
+
+ public void sceneRepaint() {
+ }
+
+ public void sceneValidating() {
+ }
+
+ public void sceneValidated() {
+ }
+
+ public void componentResized(ComponentEvent e) {
+ repaint();
+ }
+
+ public void componentMoved(ComponentEvent e) {
+ repaint();
+ }
+
+ public void componentShown(ComponentEvent e) {
+ }
+
+ public void componentHidden(ComponentEvent e) {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,69 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.event.MouseEvent;
+import javax.swing.JPanel;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetKeyEvent;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSelectAction extends WidgetAction.Adapter {
+
+ private WidgetAction innerAction;
+ private JPanel panel;
+
+ public ExtendedSelectAction(SelectProvider provider) {
+ innerAction = ActionFactory.createSelectAction(provider);
+ panel = new JPanel();
+ }
+
+ @Override
+ public State mousePressed(Widget widget, WidgetMouseEvent event) {
+ // TODO: Solve this differently?
+ if (event.getButton() != MouseEvent.BUTTON2) {
+ return innerAction.mousePressed(widget, new WidgetMouseEvent(event.getEventID(), new MouseEvent(panel, (int) event.getEventID(), event.getWhen(), event.getModifiersEx(), event.getPoint().x, event.getPoint().y, event.getClickCount(), event.isPopupTrigger(), MouseEvent.BUTTON1)));
+ } else {
+ return super.mousePressed(widget, event);
+ }
+ }
+
+ @Override
+ public State mouseReleased(Widget widget, WidgetMouseEvent event) {
+ return innerAction.mouseReleased(widget, event);
+ }
+
+ @Override
+ public State keyTyped(Widget widget, WidgetKeyEvent event) {
+ return innerAction.keyTyped(widget, event);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.lang.reflect.InvocationTargetException;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PropertiesSheet {
+
+ public static void initializeSheet(Properties properties, Sheet s) {
+
+ Sheet.Set set1 = Sheet.createPropertiesSet();
+ set1.setDisplayName("Properties");
+ for (final Property p : properties.getProperties()) {
+ Node.Property<String> prop = new Node.Property<String>(String.class) {
+
+ @Override
+ public boolean canRead() {
+ return true;
+ }
+
+ @Override
+ public String getValue() throws IllegalAccessException, InvocationTargetException {
+ return p.getValue();
+ }
+
+ @Override
+ public boolean canWrite() {
+ return false;
+ }
+
+ @Override
+ public void setValue(String arg0) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+ p.setValue(arg0);
+ }
+ };
+ prop.setName(p.getName());
+ set1.put(prop);
+ }
+ s.put(set1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,360 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.ChangedListener;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.List;
+import javax.swing.JComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RangeSlider extends JComponent implements ChangedListener<RangeSliderModel>, MouseListener, MouseMotionListener {
+
+ public static final int HEIGHT = 40;
+ public static final int BAR_HEIGHT = 22;
+ public static final int BAR_SELECTION_ENDING_HEIGHT = 16;
+ public static final int BAR_SELECTION_HEIGHT = 10;
+ public static final int BAR_THICKNESS = 2;
+ public static final int BAR_CIRCLE_SIZE = 9;
+ public static final int MOUSE_ENDING_OFFSET = 3;
+ public static final Color BACKGROUND_COLOR = Color.white;
+ public static final Color BAR_COLOR = Color.black;
+ public static final Color BAR_SELECTION_COLOR = new Color(255, 0, 0, 120);
+ public static final Color BAR_SELECTION_COLOR_ROLLOVER = new Color(255, 0, 255, 120);
+ public static final Color BAR_SELECTION_COLOR_DRAG = new Color(0, 0, 255, 120);
+ private RangeSliderModel model;
+ private State state;
+ private Point startPoint;
+ private RangeSliderModel tempModel;
+ private boolean isOverBar;
+
+ private enum State {
+
+ Initial,
+ DragBar,
+ DragFirstPosition,
+ DragSecondPosition
+ }
+
+ public RangeSlider() {
+ state = State.Initial;
+ this.addMouseMotionListener(this);
+ this.addMouseListener(this);
+ }
+
+ public void setModel(RangeSliderModel newModel) {
+ if (model != null) {
+ model.getChangedEvent().removeListener(this);
+ model.getColorChangedEvent().removeListener(this);
+ }
+ if (newModel != null) {
+ newModel.getChangedEvent().addListener(this);
+ newModel.getColorChangedEvent().addListener(this);
+ }
+ this.model = newModel;
+ update();
+ }
+
+ private RangeSliderModel getPaintingModel() {
+ if (tempModel != null) {
+ return tempModel;
+ }
+ return model;
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ Dimension d = super.getPreferredSize();
+ d.height = HEIGHT;
+ return d;
+ }
+
+ public void changed(RangeSliderModel source) {
+ update();
+ }
+
+ private void update() {
+ this.repaint();
+ }
+
+ private int getXPosition(int index) {
+ assert index >= 0 && index < getPaintingModel().getPositions().size();
+ return getXOffset() * (index + 1);
+ }
+
+ private int getXOffset() {
+ int size = getPaintingModel().getPositions().size();
+ int width = getWidth();
+ return (width / (size + 1));
+ }
+
+ private int getEndXPosition(int index) {
+ return getXPosition(index) + getXOffset() / 2;
+ }
+
+ private int getStartXPosition(int index) {
+ return getXPosition(index) - getXOffset() / 2;
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ Graphics2D g2 = (Graphics2D) g;
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+ int width = getWidth();
+ int height = getHeight();
+
+ g2.setColor(BACKGROUND_COLOR);
+ g2.fillRect(0, 0, width, height);
+
+ // Nothing to paint?
+ if (getPaintingModel() == null || getPaintingModel().getPositions().size() == 0) {
+ return;
+ }
+
+ int firstPos = getPaintingModel().getFirstPosition();
+ int secondPos = getPaintingModel().getSecondPosition();
+
+ paintSelected(g2, firstPos, secondPos);
+ paintBar(g2);
+
+ }
+
+ private int getBarStartY() {
+ return getHeight() - BAR_HEIGHT;
+ }
+
+ private void paintBar(Graphics2D g) {
+ List<String> list = getPaintingModel().getPositions();
+ int barStartY = getBarStartY();
+
+ g.setColor(BAR_COLOR);
+ g.fillRect(getXPosition(0), barStartY + BAR_HEIGHT / 2 - BAR_THICKNESS / 2, getXPosition(list.size() - 1) - getXPosition(0), BAR_THICKNESS);
+
+ int circleCenterY = barStartY + BAR_HEIGHT / 2;
+ for (int i = 0; i < list.size(); i++) {
+ int curX = getXPosition(i);
+ g.setColor(getPaintingModel().getColors().get(i));
+ g.fillOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE);
+ g.setColor(Color.black);
+ g.drawOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE);
+
+
+ String curS = list.get(i);
+ if (curS != null && curS.length() > 0) {
+ int startX = getStartXPosition(i);
+ int endX = getEndXPosition(i);
+ FontMetrics metrics = g.getFontMetrics();
+ Rectangle bounds = metrics.getStringBounds(curS, g).getBounds();
+ if (bounds.width < endX - startX && bounds.height < barStartY) {
+ g.setColor(Color.black);
+ g.drawString(curS, startX + (endX - startX) / 2 - bounds.width / 2, barStartY / 2 + bounds.height / 2);
+ }
+ }
+ }
+
+ }
+
+ private void paintSelected(Graphics2D g, int start, int end) {
+
+ int startX = getStartXPosition(start);
+ int endX = getEndXPosition(end);
+ int barStartY = getBarStartY();
+ int barSelectionEndingStartY = barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_ENDING_HEIGHT / 2;
+ paintSelectedEnding(g, startX, barSelectionEndingStartY);
+ paintSelectedEnding(g, endX, barSelectionEndingStartY);
+
+ g.setColor(BAR_SELECTION_COLOR);
+ if (state == State.DragBar) {
+ g.setColor(BAR_SELECTION_COLOR_DRAG);
+ } else if (isOverBar) {
+ g.setColor(BAR_SELECTION_COLOR_ROLLOVER);
+ }
+ g.fillRect(startX, barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_HEIGHT / 2, endX - startX, BAR_SELECTION_HEIGHT);
+ }
+
+ private void paintSelectedEnding(Graphics g, int x, int y) {
+ g.setColor(BAR_COLOR);
+ g.fillRect(x - BAR_THICKNESS / 2, y, BAR_THICKNESS, BAR_SELECTION_ENDING_HEIGHT);
+ }
+
+ private boolean isOverSecondPosition(Point p) {
+ if (p.y >= getBarStartY()) {
+ int destX = getEndXPosition(getPaintingModel().getSecondPosition());
+ int off = Math.abs(destX - p.x);
+ return off <= MOUSE_ENDING_OFFSET;
+ }
+ return false;
+ }
+
+ private boolean isOverFirstPosition(Point p) {
+ if (p.y >= getBarStartY()) {
+ int destX = getStartXPosition(getPaintingModel().getFirstPosition());
+ int off = Math.abs(destX - p.x);
+ return off <= MOUSE_ENDING_OFFSET;
+ }
+ return false;
+ }
+
+ private boolean isOverSelection(Point p) {
+ if (p.y >= getBarStartY() && !isOverFirstPosition(p) && !isOverSecondPosition(p)) {
+ return p.x > getStartXPosition(getPaintingModel().getFirstPosition()) && p.x < getEndXPosition(getPaintingModel().getSecondPosition());
+ }
+ return false;
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ if (state == State.DragBar) {
+ int firstX = this.getStartXPosition(model.getFirstPosition());
+ int newFirstX = firstX + e.getPoint().x - startPoint.x;
+ int newIndex = getIndexFromPosition(newFirstX) + 1;
+ if (newIndex + model.getSecondPosition() - model.getFirstPosition() >= model.getPositions().size()) {
+ newIndex = model.getPositions().size() - (model.getSecondPosition() - model.getFirstPosition()) - 1;
+ }
+ int secondPosition = newIndex + model.getSecondPosition() - model.getFirstPosition();
+ tempModel.setPositions(newIndex, secondPosition);
+ update();
+ } else if (state == State.DragFirstPosition) {
+ int firstPosition = getIndexFromPosition(e.getPoint().x) + 1;
+ int secondPosition = model.getSecondPosition();
+ if (firstPosition > secondPosition) {
+ firstPosition--;
+ }
+ tempModel.setPositions(firstPosition, secondPosition);
+ update();
+ } else if (state == State.DragSecondPosition) {
+ int firstPosition = model.getFirstPosition();
+ int secondPosition = getIndexFromPosition(e.getPoint().x);
+ if (secondPosition < firstPosition) {
+ secondPosition++;
+ }
+ tempModel.setPositions(firstPosition, secondPosition);
+ update();
+ }
+ }
+
+ private int getIndexFromPosition(int x) {
+ if (x < getXPosition(0)) {
+ return -1;
+ }
+ for (int i = 0; i < getPaintingModel().getPositions().size() - 1; i++) {
+ int startX = getXPosition(i);
+ int endX = getXPosition(i + 1);
+ if (x >= startX && x <= endX) {
+ return i;
+ }
+ }
+ return getPaintingModel().getPositions().size() - 1;
+ }
+
+ private int getCircleIndexFromPosition(int x) {
+ int result = 0;
+ for (int i = 1; i < getPaintingModel().getPositions().size() - 1; i++) {
+ if (x > getStartXPosition(i)) {
+ result = i;
+ }
+ }
+ return result;
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ isOverBar = false;
+ if (model == null) {
+ return;
+ }
+
+
+ Point p = e.getPoint();
+ if (isOverFirstPosition(p) || isOverSecondPosition(p)) {
+ setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
+ } else if (isOverSelection(p)) {
+ isOverBar = true;
+ setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ } else {
+ this.setCursor(Cursor.getDefaultCursor());
+ }
+ repaint();
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() > 1) {
+ // Double click
+ int index = getCircleIndexFromPosition(e.getPoint().x);
+ model.setPositions(index, index);
+ }
+ }
+
+ public void mousePressed(MouseEvent e) {
+ if (model == null) {
+ return;
+ }
+
+ Point p = e.getPoint();
+ if (isOverFirstPosition(p)) {
+ state = State.DragFirstPosition;
+ } else if (isOverSecondPosition(p)) {
+ state = State.DragSecondPosition;
+ } else if (isOverSelection(p)) {
+ state = State.DragBar;
+ } else {
+ return;
+ }
+
+ startPoint = e.getPoint();
+ tempModel = model.copy();
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ if (model == null || tempModel == null) {
+ return;
+ }
+ state = State.Initial;
+ model.setPositions(tempModel.getFirstPosition(), tempModel.getSecondPosition());
+ tempModel = null;
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ isOverBar = false;
+ repaint();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,130 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RangeSliderModel implements ChangedEventProvider<RangeSliderModel> {
+
+ // Warning: Update setData method if fields are added
+ private ChangedEvent<RangeSliderModel> changedEvent;
+ private ChangedEvent<RangeSliderModel> colorChangedEvent;
+ private List<String> positions;
+ private int firstPosition;
+ private int secondPosition;
+ private List<Color> colors;
+
+ public void setData(RangeSliderModel model) {
+ boolean changed = false;
+ changed |= (positions != model.positions);
+ positions = model.positions;
+ changed |= (firstPosition != model.firstPosition);
+ firstPosition = model.firstPosition;
+ changed |= (secondPosition != model.secondPosition);
+ secondPosition = model.secondPosition;
+ boolean colorChanged = (colors != model.colors);
+ colors = model.colors;
+ if (changed) {
+ changedEvent.fire();
+ }
+ if (colorChanged) {
+ colorChangedEvent.fire();
+ }
+ }
+
+ public RangeSliderModel(List<String> positions) {
+ assert positions.size() > 0;
+ this.positions = positions;
+ this.changedEvent = new ChangedEvent<RangeSliderModel>(this);
+ this.colorChangedEvent = new ChangedEvent<RangeSliderModel>(this);
+ colors = new ArrayList<Color>();
+ for (int i = 0; i < positions.size(); i++) {
+ colors.add(Color.black);
+ }
+ }
+
+ public void setColors(List<Color> colors) {
+ this.colors = colors;
+ colorChangedEvent.fire();
+ }
+
+ public List<Color> getColors() {
+ return colors;
+ }
+
+ public RangeSliderModel copy() {
+ RangeSliderModel newModel = new RangeSliderModel(positions);
+ newModel.firstPosition = firstPosition;
+ newModel.secondPosition = secondPosition;
+ newModel.colors = colors;
+ return newModel;
+ }
+
+ public List<String> getPositions() {
+ return Collections.unmodifiableList(positions);
+ }
+
+ public int getFirstPosition() {
+ return firstPosition;
+ }
+
+ public int getSecondPosition() {
+ return secondPosition;
+ }
+
+ public void setPositions(int fp, int sp) {
+ assert fp >= 0 && fp < positions.size();
+ assert sp >= 0 && sp < positions.size();
+ firstPosition = fp;
+ secondPosition = sp;
+ ensureOrder();
+ changedEvent.fire();
+ }
+
+ private void ensureOrder() {
+ if (secondPosition < firstPosition) {
+ int tmp = secondPosition;
+ secondPosition = firstPosition;
+ firstPosition = tmp;
+ }
+ }
+
+ public ChangedEvent<RangeSliderModel> getColorChangedEvent() {
+ return colorChangedEvent;
+ }
+
+ public ChangedEvent<RangeSliderModel> getChangedEvent() {
+ return changedEvent;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.view" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project com.sun.hotspot.igv.view.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.view
+OpenIDE-Module-Layer: com/sun/hotspot/igv/view/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/view/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="com.sun.hotspot.igv.view-impl" basedir="..">
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=2de95ef6
+build.xml.script.CRC32=31afe4b1
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=2de95ef6
+nbproject/build-impl.xml.script.CRC32=fa7a4119
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>com.sun.hotspot.igv.view</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.svg</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.0</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.netbeans.api.visual</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>2.9</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.actions</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.6.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.awt</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.11.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.dialogs</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.5.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.loaders</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.7</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.nodes</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.2.1.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.9.0.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.windows</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.16</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <public-packages>
+ <package>com.sun.hotspot.igv.view</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.view.GraphViewerImplementation
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.view.EditorInputGraphProvider
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,175 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BoundedZoomAction extends WidgetAction.Adapter {
+
+ private double minFactor = 0.0;
+ private double maxFactor = Double.MAX_VALUE;
+ private double zoomMultiplier;
+ private boolean useAnimator;
+
+ public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) {
+ assert zoomMultiplier > 1.0;
+ this.zoomMultiplier = zoomMultiplier;
+ this.useAnimator = useAnimator;
+ }
+
+ public double getMinFactor() {
+ return minFactor;
+ }
+
+ public void setMinFactor(double d) {
+ minFactor = d;
+ }
+
+ public double getMaxFactor() {
+ return maxFactor;
+ }
+
+ public void setMaxFactor(double d) {
+ maxFactor = d;
+ }
+
+ private JScrollPane findScrollPane(JComponent component) {
+ for (;;) {
+ if (component == null) {
+ return null;
+ }
+ if (component instanceof JScrollPane) {
+ return ((JScrollPane) component);
+ }
+ Container parent = component.getParent();
+ if (!(parent instanceof JComponent)) {
+ return null;
+ }
+ component = (JComponent) parent;
+ }
+ }
+
+ @Override
+ public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) {
+ final Scene scene = widget.getScene();
+ int amount = event.getWheelRotation();
+ JScrollPane scrollPane = findScrollPane(scene.getView());
+ Point viewPosition = null;
+ Point mouseLocation = scene.convertSceneToView(event.getPoint());
+ int xOffset = 0;
+ int yOffset = 0;
+ Rectangle bounds = new Rectangle(scene.getBounds());
+ Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
+ if (scrollPane != null) {
+ viewPosition = new Point(scrollPane.getViewport().getViewPosition());
+ xOffset = (mouseLocation.x - viewPosition.x);
+ yOffset = (mouseLocation.y - viewPosition.y);
+ viewPosition.x += xOffset;
+ viewPosition.y += yOffset;
+ }
+
+ if (useAnimator) {
+ SceneAnimator sceneAnimator = scene.getSceneAnimator();
+ synchronized (sceneAnimator) {
+ double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor();
+ while (amount > 0 && zoom / zoomMultiplier >= minFactor) {
+ zoom /= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x /= zoomMultiplier;
+ viewPosition.y /= zoomMultiplier;
+ bounds.width /= zoomMultiplier;
+ bounds.height /= zoomMultiplier;
+ componentSize.width /= zoomMultiplier;
+ componentSize.height /= zoomMultiplier;
+ }
+ amount--;
+ }
+ while (amount < 0 && zoom * zoomMultiplier <= maxFactor) {
+ zoom *= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x *= zoomMultiplier;
+ viewPosition.y *= zoomMultiplier;
+ bounds.width *= zoomMultiplier;
+ bounds.height *= zoomMultiplier;
+ componentSize.width *= zoomMultiplier;
+ componentSize.height *= zoomMultiplier;
+ }
+ amount++;
+ }
+ sceneAnimator.animateZoomFactor(zoom);
+ }
+ } else {
+ double zoom = scene.getZoomFactor();
+ while (amount > 0 && zoom / zoomMultiplier >= minFactor) {
+ zoom /= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x /= zoomMultiplier;
+ viewPosition.y /= zoomMultiplier;
+ bounds.width /= zoomMultiplier;
+ bounds.height /= zoomMultiplier;
+ componentSize.width /= zoomMultiplier;
+ componentSize.height /= zoomMultiplier;
+ }
+ amount--;
+ }
+ while (amount < 0 && zoom * zoomMultiplier <= maxFactor) {
+ zoom *= zoomMultiplier;
+ if (viewPosition != null) {
+ viewPosition.x *= zoomMultiplier;
+ viewPosition.y *= zoomMultiplier;
+ bounds.width *= zoomMultiplier;
+ bounds.height *= zoomMultiplier;
+ componentSize.width *= zoomMultiplier;
+ componentSize.height *= zoomMultiplier;
+ }
+ amount++;
+ }
+ scene.setZoomFactor(zoom);
+ }
+
+ if (scrollPane != null) {
+ viewPosition.x -= xOffset;
+ viewPosition.y -= yOffset;
+ scrollPane.getViewport().setViewPosition(viewPosition);
+ }
+
+
+ return WidgetAction.State.CONSUMED;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,3 @@
+HINT_EditorTopComponent=This is a Editor window
+OpenIDE-Module-Name=View
+CTL_EditorTopComponent=Editor Window
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.view.widgets.SlotWidget;
+import java.awt.Point;
+import java.awt.Rectangle;
+import org.netbeans.api.visual.anchor.Anchor;
+import org.netbeans.api.visual.anchor.Anchor.Entry;
+import org.netbeans.api.visual.anchor.Anchor.Result;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ConnectionAnchor extends Anchor {
+
+ public enum HorizontalAlignment {
+
+ Left,
+ Center,
+ Right
+ }
+ private HorizontalAlignment alignment;
+
+ public ConnectionAnchor(Widget widget) {
+ this(HorizontalAlignment.Center, widget);
+ }
+
+ public ConnectionAnchor(HorizontalAlignment alignment, Widget widget) {
+ super(widget);
+ this.alignment = alignment;
+ }
+
+ public Result compute(Entry entry) {
+ return new Result(getRelatedSceneLocation(), Anchor.DIRECTION_ANY);
+ }
+
+ @Override
+ public Point getRelatedSceneLocation() {
+ Point p = null;
+ Widget w = getRelatedWidget();
+ if (w != null) {
+ if (w instanceof SlotWidget) {
+ p = ((SlotWidget) w).getAnchorPosition();
+ } else {
+ Rectangle r = w.convertLocalToScene(w.getBounds());
+ int y = r.y + r.height / 2;
+ int x = r.x;
+ if (alignment == HorizontalAlignment.Center) {
+ x = r.x + r.width / 2;
+ } else if (alignment == HorizontalAlignment.Right) {
+ x = r.x + r.width;
+ }
+
+ p = new Point(x, y);
+ }
+ }
+
+ return p;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1254 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.view.widgets.BlockWidget;
+import com.sun.hotspot.igv.view.widgets.LineWidget;
+import com.sun.hotspot.igv.util.DoubleClickAction;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalClusterLayoutManager;
+import com.sun.hotspot.igv.hierarchicallayout.OldHierarchicalLayoutManager;
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager;
+import com.sun.hotspot.igv.view.widgets.FigureWidget;
+import com.sun.hotspot.igv.view.widgets.InputSlotWidget;
+import com.sun.hotspot.igv.view.widgets.OutputSlotWidget;
+import com.sun.hotspot.igv.view.widgets.SlotWidget;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.data.services.Scheduler;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.graph.Block;
+import com.sun.hotspot.igv.util.ColorIcon;
+import com.sun.hotspot.igv.util.ExtendedSelectAction;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.UndoableEditEvent;
+import javax.swing.undo.AbstractUndoableEdit;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.action.RectangularSelectDecorator;
+import org.netbeans.api.visual.action.RectangularSelectProvider;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.netbeans.api.visual.widget.LayerWidget;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.widget.LabelWidget;
+import org.openide.awt.UndoRedo;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramScene extends Scene implements ChangedListener<DiagramViewModel> {
+
+ private Hashtable<Figure, FigureWidget> figureWidgets;
+ private Hashtable<Slot, SlotWidget> slotWidgets;
+ private Hashtable<Connection, ConnectionWidget> connectionWidgets;
+ private Hashtable<InputBlock, BlockWidget> blockWidgets;
+ private Widget hoverWidget;
+ private WidgetAction hoverAction;
+ private List<FigureWidget> selectedWidgets;
+ private Lookup lookup;
+ private InstanceContent content;
+ private Action[] actions;
+ private LayerWidget connectionLayer;
+ private JScrollPane scrollPane;
+ private UndoRedo.Manager undoRedoManager;
+ private LayerWidget mainLayer;
+ private LayerWidget slotLayer;
+ private LayerWidget blockLayer;
+ private double realZoomFactor;
+ private BoundedZoomAction zoomAction;
+ private WidgetAction panAction;
+ private Widget topLeft;
+ private Widget bottomRight;
+ private LayerWidget startLayer;
+ private LabelWidget startLabel;
+ private DiagramViewModel model;
+ private DiagramViewModel modelCopy;
+ public static final int AFTER = 1;
+ public static final int BEFORE = 1;
+ public static final float ALPHA = 0.4f;
+ public static final int GRID_SIZE = 30;
+ public static final int BORDER_SIZE = 20;
+ public static final int UNDOREDO_LIMIT = 100;
+ public static final int SCROLL_UNIT_INCREMENT = 80;
+ public static final int SCROLL_BLOCK_INCREMENT = 400;
+ public static final float ZOOM_MAX_FACTOR = 3.0f;
+ public static final float ZOOM_MIN_FACTOR = 0.0f;//0.15f;
+ public static final float ZOOM_INCREMENT = 1.5f;
+ public static final int SLOT_OFFSET = 6;
+ public static final int ANIMATION_LIMIT = 40;
+ private PopupMenuProvider popupMenuProvider = new PopupMenuProvider() {
+
+ public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+ return DiagramScene.this.createPopupMenu();
+ }
+ };
+ private RectangularSelectDecorator rectangularSelectDecorator = new RectangularSelectDecorator() {
+
+ public Widget createSelectionWidget() {
+ Widget widget = new Widget(DiagramScene.this);
+ widget.setBorder(BorderFactory.createLineBorder(Color.black, 2));
+ widget.setForeground(Color.red);
+ return widget;
+ }
+ };
+ private RectangularSelectProvider rectangularSelectProvider = new RectangularSelectProvider() {
+
+ public void performSelection(Rectangle rectangle) {
+ if (rectangle.width < 0) {
+ rectangle.x += rectangle.width;
+ rectangle.width *= -1;
+ }
+
+ if (rectangle.height < 0) {
+ rectangle.y += rectangle.height;
+ rectangle.height *= -1;
+ }
+
+ boolean updated = false;
+ for (Figure f : getModel().getDiagramToView().getFigures()) {
+ FigureWidget w = figureWidgets.get(f);
+ Rectangle r = new Rectangle(w.getBounds());
+ r.setLocation(w.getLocation());
+ if (r.intersects(rectangle)) {
+ if (!selectedWidgets.contains(w)) {
+ addToSelection(w);
+ updated = true;
+ }
+ } else {
+ if (selectedWidgets.contains(w)) {
+ selectedWidgets.remove(w);
+ content.remove(w.getNode());
+ w.setState(w.getState().deriveSelected(false));
+ updated = true;
+ }
+ }
+ }
+
+ if (updated) {
+ selectionUpdated();
+ }
+ }
+ };
+ private SelectProvider selectProvider = new SelectProvider() {
+
+ public boolean isAimingAllowed(Widget widget, Point point, boolean b) {
+ return false;
+ }
+
+ public boolean isSelectionAllowed(Widget widget, Point point, boolean b) {
+ return widget instanceof FigureWidget || widget == DiagramScene.this;
+ }
+
+ public void select(Widget w, Point point, boolean change) {
+
+ boolean updated = false;
+
+ if (w == DiagramScene.this) {
+ if (DiagramScene.this.selectedWidgets.size() != 0) {
+ clearSelection();
+ selectionUpdated();
+ }
+ return;
+ }
+
+ FigureWidget widget = (FigureWidget) w;
+
+
+ if (change) {
+ if (widget.getState().isSelected()) {
+ assert selectedWidgets.contains(widget);
+ widget.setState(widget.getState().deriveSelected(false));
+ selectedWidgets.remove(widget);
+ content.remove(widget.getNode());
+ updated = true;
+ } else {
+ assert !selectedWidgets.contains(widget);
+ addToSelection(widget);
+ updated = true;
+ assert widget.getState().isSelected();
+ }
+ } else {
+
+ if (widget.getState().isSelected()) {
+ assert selectedWidgets.contains(widget);
+ } else {
+
+ assert !selectedWidgets.contains(widget);
+ clearSelection();
+ addToSelection(widget);
+ updated = true;
+ assert widget.getState().isSelected();
+ }
+ }
+
+ if (updated) {
+ selectionUpdated();
+ }
+
+ }
+ };
+
+ private FigureWidget getFigureWidget(Figure f) {
+ return figureWidgets.get(f);
+ }
+ private FocusListener focusListener = new FocusListener() {
+
+ public void focusGained(FocusEvent e) {
+ DiagramScene.this.getView().requestFocus();
+ }
+
+ public void focusLost(FocusEvent e) {
+ }
+ };
+ private MouseWheelListener mouseWheelListener = new MouseWheelListener() {
+
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ DiagramScene.this.zoomAction.mouseWheelMoved(DiagramScene.this, new WidgetAction.WidgetMouseWheelEvent(0, e));
+ DiagramScene.this.validate();
+ }
+ };
+ private MouseListener mouseListener = new MouseListener() {
+
+ public void mouseClicked(MouseEvent e) {
+ DiagramScene.this.panAction.mouseClicked(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+ }
+
+ public void mousePressed(MouseEvent e) {
+ DiagramScene.this.panAction.mousePressed(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ DiagramScene.this.panAction.mouseReleased(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ DiagramScene.this.panAction.mouseEntered(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+ }
+
+ public void mouseExited(MouseEvent e) {
+ DiagramScene.this.panAction.mouseExited(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+ }
+ };
+ private MouseMotionListener mouseMotionListener = new MouseMotionListener() {
+
+ public void mouseDragged(MouseEvent e) {
+ DiagramScene.this.panAction.mouseDragged(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ }
+ };
+ private ScrollChangeListener scrollChangeListener = new ScrollChangeListener();
+
+ private class ScrollChangeListener implements ChangeListener {
+
+ private Map<Widget, Point> relativePositions = new HashMap<Widget, Point>();
+ private Point oldPosition;
+
+ public void register(Widget w, Point p) {
+ relativePositions.put(w, p);
+ }
+
+ public void unregister(Widget w) {
+ relativePositions.remove(w);
+ }
+
+ public void stateChanged(ChangeEvent e) {
+ Point p = DiagramScene.this.getScrollPane().getViewport().getViewPosition();
+ if (oldPosition == null || !p.equals(oldPosition)) {
+ for (Widget w : relativePositions.keySet()) {
+ Point curPoint = relativePositions.get(w);
+ Point newPoint = new Point(p.x + curPoint.x, p.y + curPoint.y);
+ w.setPreferredLocation(newPoint);
+ DiagramScene.this.validate();
+ }
+ oldPosition = p;
+ }
+ }
+ }
+
+ public Point getScrollPosition() {
+ return getScrollPane().getViewport().getViewPosition();
+ }
+
+ public void setScrollPosition(Point p) {
+ getScrollPane().getViewport().setViewPosition(p);
+ }
+
+ public DiagramScene(Action[] actions, DiagramViewModel model) {
+ this.actions = actions;
+ selectedWidgets = new ArrayList<FigureWidget>();
+ content = new InstanceContent();
+ lookup = new AbstractLookup(content);
+ this.setCheckClipping(true);
+ this.getInputBindings().setZoomActionModifiers(0);
+
+ JComponent comp = this.createView();
+ comp.setDoubleBuffered(true);
+ comp.setBackground(Color.WHITE);
+ comp.setOpaque(true);
+
+ this.setBackground(Color.WHITE);
+ this.setOpaque(true);
+ scrollPane = new JScrollPane(comp);
+ scrollPane.setBackground(Color.WHITE);
+ scrollPane.getVerticalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT);
+ scrollPane.getVerticalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT);
+ scrollPane.getHorizontalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT);
+ scrollPane.getHorizontalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT);
+ scrollPane.getViewport().addChangeListener(scrollChangeListener);
+ hoverAction = this.createWidgetHoverAction();
+
+ blockLayer = new LayerWidget(this);
+ this.addChild(blockLayer);
+
+ startLayer = new LayerWidget(this);
+ this.addChild(startLayer);
+ // TODO: String startLabelString = "Loading graph with " + originalDiagram.getFigures().size() + " figures and " + originalDiagram.getConnections().size() + " connections...";
+ String startLabelString = "";
+ LabelWidget w = new LabelWidget(this, startLabelString);
+ scrollChangeListener.register(w, new Point(10, 10));
+ w.setAlignment(LabelWidget.Alignment.CENTER);
+ startLabel = w;
+ startLayer.addChild(w);
+
+ mainLayer = new LayerWidget(this);
+ this.addChild(mainLayer);
+
+ topLeft = new Widget(this);
+ topLeft.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE));
+ this.addChild(topLeft);
+
+
+ bottomRight = new Widget(this);
+ bottomRight.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE));
+ this.addChild(bottomRight);
+
+ slotLayer = new LayerWidget(this);
+ this.addChild(slotLayer);
+
+ connectionLayer = new LayerWidget(this);
+ this.addChild(connectionLayer);
+
+ LayerWidget selectionLayer = new LayerWidget(this);
+ this.addChild(selectionLayer);
+
+ this.setLayout(LayoutFactory.createAbsoluteLayout());
+
+ this.getActions().addAction(hoverAction);
+ zoomAction = new BoundedZoomAction(1.1, false);
+ zoomAction.setMaxFactor(ZOOM_MAX_FACTOR);
+ zoomAction.setMinFactor(ZOOM_MIN_FACTOR);
+ this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1));
+ panAction = new ExtendedPanAction();
+ this.getActions().addAction(panAction);
+ this.getActions().addAction(ActionFactory.createPopupMenuAction(popupMenuProvider));
+
+ LayerWidget selectLayer = new LayerWidget(this);
+ this.addChild(selectLayer);
+ this.getActions().addAction(ActionFactory.createRectangularSelectAction(rectangularSelectDecorator, selectLayer, rectangularSelectProvider));
+
+ blockWidgets = new Hashtable<InputBlock, BlockWidget>();
+
+ boolean b = this.getUndoRedoEnabled();
+ this.setUndoRedoEnabled(false);
+ this.setNewModel(model);
+ this.setUndoRedoEnabled(b);
+ }
+
+ private void selectionUpdated() {
+ getModel().setSelectedNodes(this.getSelectedNodes());
+ addUndo();
+ }
+
+ public DiagramViewModel getModel() {
+ return model;
+ }
+
+ public void setRealZoomFactor(double d) {
+ this.realZoomFactor = d;
+ }
+
+ public double getRealZoomFactor() {
+ if (realZoomFactor == 0.0) {
+ return getZoomFactor();
+ } else {
+ return realZoomFactor;
+ }
+ }
+
+ public JScrollPane getScrollPane() {
+ return scrollPane;
+ }
+
+ public boolean isAllVisible() {
+ return getModel().getHiddenNodes().size() == 0;
+ }
+
+ public Action createGotoAction(final Figure f) {
+ final DiagramScene diagramScene = this;
+ Action a = new AbstractAction() {
+
+ public void actionPerformed(ActionEvent e) {
+ diagramScene.gotoFigure(f);
+ }
+ };
+
+ a.setEnabled(true);
+ a.putValue(Action.SMALL_ICON, new ColorIcon(f.getColor()));
+ String name = f.getLines()[0];
+
+ name += " (";
+
+ if (f.getCluster() != null) {
+ name += "B" + f.getCluster().toString();
+ }
+ if (!this.getFigureWidget(f).isVisible()) {
+ if (f.getCluster() != null) {
+ name += ", ";
+ }
+ name += "hidden";
+ }
+ name += ")";
+ a.putValue(Action.NAME, name);
+ return a;
+ }
+
+ public void setNewModel(DiagramViewModel model) {
+ if (this.model != null) {
+ this.model.getDiagramChangedEvent().removeListener(this);
+ this.model.getViewPropertiesChangedEvent().removeListener(this);
+ }
+ this.model = model;
+
+ if (this.model == null) {
+ this.modelCopy = null;
+ } else {
+ this.modelCopy = this.model.copy();
+ }
+
+ model.getDiagramChangedEvent().addListener(this);
+ model.getViewPropertiesChangedEvent().addListener(this);
+
+ update();
+ }
+
+ private void update() {
+
+ /*if (startLabel != null) {
+ // Animate fade-out
+ final LabelWidget labelWidget = this.startLabel;
+ labelWidget.setVisible(true);
+ RequestProcessor.getDefault().post(new Runnable() {
+ public void run() {
+ final int Sleep = 200;
+ final int Progress = 10;
+ for (int i = 0; i < 255 / Progress + 1; i++) {
+ try {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ Color c = labelWidget.getForeground();
+ int v = c.getRed();
+ v += Progress;
+ if (v > 255) {
+ v = 255;
+ }
+ labelWidget.setForeground(new Color(v, v, v, 255 - v));
+ labelWidget.getScene().validate();
+ }
+ });
+ } catch (InterruptedException ex) {
+ } catch (InvocationTargetException ex) {
+ }
+ try {
+ Thread.sleep(Sleep);
+ } catch (InterruptedException ex) {
+ }
+ }
+ labelWidget.setVisible(false);
+ DiagramScene.this.scrollChangeListener.unregister(labelWidget);
+ }
+ }, 1000);
+ startLabel = null;
+ }*/
+
+ slotLayer.removeChildren();
+ mainLayer.removeChildren();
+ blockLayer.removeChildren();
+
+ blockWidgets.clear();
+ figureWidgets = new Hashtable<Figure, FigureWidget>();
+ slotWidgets = new Hashtable<Slot, SlotWidget>();
+ connectionWidgets = new Hashtable<Connection, ConnectionWidget>();
+
+ WidgetAction selectAction = new ExtendedSelectAction(selectProvider);
+ Diagram d = getModel().getDiagramToView();
+
+ if (getModel().getShowBlocks()) {
+ Scheduler s = Lookup.getDefault().lookup(Scheduler.class);
+ Collection<InputBlock> newBlocks = new ArrayList<InputBlock>(s.schedule(d.getGraph()));
+ d.schedule(newBlocks);
+ }
+
+ for (Figure f : d.getFigures()) {
+ FigureWidget w = new FigureWidget(f, this, mainLayer);
+ w.getActions().addAction(selectAction);
+ w.getActions().addAction(hoverAction);
+ w.getActions().addAction(ActionFactory.createPopupMenuAction(w));
+ w.getActions().addAction(new DoubleClickAction(w));
+ w.setVisible(false);
+
+ figureWidgets.put(f, w);
+
+ for (InputSlot s : f.getInputSlots()) {
+ SlotWidget sw = new InputSlotWidget(s, this, slotLayer, w);
+ slotWidgets.put(s, sw);
+ sw.getActions().addAction(selectAction);
+ }
+
+ for (OutputSlot s : f.getOutputSlots()) {
+ SlotWidget sw = new OutputSlotWidget(s, this, slotLayer, w);
+ slotWidgets.put(s, sw);
+ sw.getActions().addAction(selectAction);
+ }
+ }
+
+ if (getModel().getShowBlocks()) {
+ for (InputBlock bn : d.getGraph().getBlocks()) {
+ BlockWidget w = new BlockWidget(this, d, bn);
+ w.setVisible(false);
+ blockWidgets.put(bn, w);
+ blockLayer.addChild(w);
+ }
+ }
+
+ this.smallUpdate(true);
+
+ }
+
+ private void smallUpdate(boolean relayout) {
+
+ this.updateHiddenNodes(model.getHiddenNodes(), relayout);
+ boolean b = this.getUndoRedoEnabled();
+ this.setUndoRedoEnabled(false);
+ this.setSelection(getModel().getSelectedNodes());
+ this.setUndoRedoEnabled(b);
+ this.validate();
+ }
+
+ private boolean isVisible(Connection c) {
+ FigureWidget w1 = figureWidgets.get(c.getInputSlot().getFigure());
+ FigureWidget w2 = figureWidgets.get(c.getOutputSlot().getFigure());
+
+ if (w1.isVisible() && w2.isVisible()) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private void relayout(Set<Widget> oldVisibleWidgets) {
+
+ Diagram diagram = getModel().getDiagramToView();
+
+ HashSet<Figure> figures = new HashSet<Figure>();
+
+ for (Figure f : diagram.getFigures()) {
+ FigureWidget w = figureWidgets.get(f);
+ if (w.isVisible()) {
+ figures.add(f);
+ }
+ }
+
+ HashSet<Connection> edges = new HashSet<Connection>();
+
+ for (Connection c : diagram.getConnections()) {
+ if (isVisible(c)) {
+ edges.add(c);
+ }
+ }
+
+ if (getModel().getShowBlocks()) {
+ HierarchicalClusterLayoutManager m = new HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+ HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+ manager.setMaxLayerLength(9);
+ manager.setMinLayerDifference(3);
+ m.setManager(manager);
+ m.setSubManager(new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS));
+ m.doLayout(new LayoutGraph(edges, figures));
+
+ } else {
+ HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+ manager.setMaxLayerLength(10);
+ manager.doLayout(new LayoutGraph(edges, figures));
+ }
+
+ int maxX = -BORDER_SIZE;
+ int maxY = -BORDER_SIZE;
+ for (Figure f : diagram.getFigures()) {
+ FigureWidget w = figureWidgets.get(f);
+ if (w.isVisible()) {
+ Point p = f.getPosition();
+ Dimension d = f.getSize();
+ maxX = Math.max(maxX, p.x + d.width);
+ maxY = Math.max(maxY, p.y + d.height);
+ }
+ }
+
+ for (Connection c : diagram.getConnections()) {
+ List<Point> points = c.getControlPoints();
+ FigureWidget w1 = figureWidgets.get((Figure) c.getTo().getVertex());
+ FigureWidget w2 = figureWidgets.get((Figure) c.getFrom().getVertex());
+ if (w1.isVisible() && w2.isVisible()) {
+ for (Point p : points) {
+ if (p != null) {
+ maxX = Math.max(maxX, p.x);
+ maxY = Math.max(maxY, p.y);
+ }
+ }
+ }
+ }
+
+ if (getModel().getShowBlocks()) {
+ for (Block b : diagram.getBlocks()) {
+ BlockWidget w = blockWidgets.get(b.getInputBlock());
+ if (w != null && w.isVisible()) {
+ Rectangle r = b.getBounds();
+ maxX = Math.max(maxX, r.x + r.width);
+ maxY = Math.max(maxY, r.y + r.height);
+ }
+ }
+ }
+
+ bottomRight.setPreferredLocation(new Point(maxX + BORDER_SIZE, maxY + BORDER_SIZE));
+ int offx = 0;
+ int offy = 0;
+ int curWidth = maxX + 2 * BORDER_SIZE;
+ int curHeight = maxY + 2 * BORDER_SIZE;
+
+ Rectangle bounds = this.getScrollPane().getBounds();
+ if (curWidth < bounds.width) {
+ offx = (bounds.width - curWidth) / 2;
+ }
+
+ if (curHeight < bounds.height) {
+ offy = (bounds.height - curHeight) / 2;
+ }
+
+ final int offx2 = offx;
+ final int offy2 = offy;
+
+ SceneAnimator animator = this.getSceneAnimator();
+ connectionLayer.removeChildren();
+ int visibleFigureCount = 0;
+ for (Figure f : diagram.getFigures()) {
+ if (figureWidgets.get(f).isVisible()) {
+ visibleFigureCount++;
+ }
+ }
+
+ for (Figure f : diagram.getFigures()) {
+ for (OutputSlot s : f.getOutputSlots()) {
+ SceneAnimator anim = animator;
+ if (visibleFigureCount > ANIMATION_LIMIT) {
+ anim = null;
+ }
+ processOutputSlot(s, s.getConnections(), 0, null, null, offx2, offy2, anim);
+ }
+ }
+
+ for (Figure f : diagram.getFigures()) {
+ FigureWidget w = figureWidgets.get(f);
+ if (w.isVisible()) {
+ Point p = f.getPosition();
+ Point p2 = new Point(p.x + offx2, p.y + offy2);
+ Rectangle r = new Rectangle(p.x + offx2, p.y + offy2, f.getSize().width, f.getSize().height);
+ if (oldVisibleWidgets.contains(w)) {
+ if (visibleFigureCount > ANIMATION_LIMIT) {
+ w.setPreferredLocation(p2);
+ } else {
+ animator.animatePreferredLocation(w, p2);
+ }
+ } else {
+ w.setPreferredLocation(p2);
+ }
+ }
+ }
+
+ if (getModel().getShowBlocks()) {
+ for (Block b : diagram.getBlocks()) {
+ BlockWidget w = blockWidgets.get(b.getInputBlock());
+ if (w != null && w.isVisible()) {
+ Point location = new Point(b.getBounds().x + offx2, b.getBounds().y + offy2);
+ Rectangle r = new Rectangle(location.x, location.y, b.getBounds().width, b.getBounds().height);
+ if (oldVisibleWidgets.contains(w)) {
+ if (visibleFigureCount > ANIMATION_LIMIT) {
+ w.setPreferredBounds(r);
+ } else {
+ animator.animatePreferredBounds(w, r);
+ }
+ } else {
+ w.setPreferredBounds(r);
+ }
+ }
+ }
+ }
+ }
+ private final Point specialNullPoint = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE);
+
+ private void processOutputSlot(OutputSlot s, List<Connection> connections, int controlPointIndex, Point lastPoint, LineWidget predecessor, int offx, int offy, SceneAnimator animator) {
+ Map<Point, List<Connection>> pointMap = new HashMap<Point, List<Connection>>();
+
+ for (Connection c : connections) {
+
+ if (!isVisible(c)) {
+ continue;
+ }
+
+ List<Point> controlPoints = c.getControlPoints();
+ if (controlPointIndex >= controlPoints.size()) {
+ continue;
+ }
+
+ Point cur = controlPoints.get(controlPointIndex);
+ if (cur == null) {
+ cur = specialNullPoint;
+ } else if (controlPointIndex == 0 && !s.getShowName()) {
+ cur = new Point(cur.x, cur.y - SLOT_OFFSET);
+ } else if (controlPointIndex == controlPoints.size() - 1 && !c.getInputSlot().getShowName()) {
+ cur = new Point(cur.x, cur.y + SLOT_OFFSET);
+ }
+
+ if (pointMap.containsKey(cur)) {
+ pointMap.get(cur).add(c);
+ } else {
+ List<Connection> newList = new ArrayList<Connection>(2);
+ newList.add(c);
+ pointMap.put(cur, newList);
+ }
+
+ }
+
+ for (Point p : pointMap.keySet()) {
+ List<Connection> connectionList = pointMap.get(p);
+
+ boolean isBold = false;
+ boolean isDashed = true;
+
+ for (Connection c : connectionList) {
+
+ if (c.getStyle() == Connection.ConnectionStyle.BOLD) {
+ isBold = true;
+ }
+
+ if (c.getStyle() != Connection.ConnectionStyle.DASHED) {
+ isDashed = false;
+ }
+ }
+
+ LineWidget newPredecessor = predecessor;
+ if (p == specialNullPoint) {
+
+ } else if (lastPoint == specialNullPoint) {
+
+ } else if (lastPoint != null) {
+ Point p1 = new Point(lastPoint.x + offx, lastPoint.y + offy);
+ Point p2 = new Point(p.x + offx, p.y + offy);
+ LineWidget w = new LineWidget(this, s, connectionList, p1, p2, predecessor, animator, isBold, isDashed);
+ newPredecessor = w;
+ connectionLayer.addChild(w);
+ w.getActions().addAction(hoverAction);
+ }
+
+ processOutputSlot(s, connectionList, controlPointIndex + 1, p, newPredecessor, offx, offy, animator);
+ }
+ }
+
+ private void clearSelection() {
+ if (selectedWidgets.size() == 0) {
+ return;
+ }
+ for (FigureWidget w : selectedWidgets) {
+ assert w.getState().isSelected();
+ w.setState(w.getState().deriveSelected(false));
+ content.remove(w.getNode());
+ }
+ selectedWidgets.clear();
+ }
+
+ public Lookup getLookup() {
+ return lookup;
+ }
+
+ public void gotoFigures(final List<Figure> figures) {
+ Rectangle overall = null;
+ showFigures(figures);
+ for (Figure f : figures) {
+
+ FigureWidget fw = getFigureWidget(f);
+ if (fw != null) {
+ Rectangle r = fw.getBounds();
+ Point p = fw.getLocation();
+ Rectangle r2 = new Rectangle(p.x, p.y, r.width, r.height);
+
+ if (overall == null) {
+ overall = r2;
+ } else {
+ overall = overall.union(r2);
+ }
+ }
+ }
+ if (overall != null) {
+ centerRectangle(overall);
+ }
+ }
+
+ private Point calcCenter(Rectangle r) {
+
+ Point center = new Point((int) r.getCenterX(), (int) r.getCenterY());
+ center.x -= getScrollPane().getViewport().getViewRect().width / 2;
+ center.y -= getScrollPane().getViewport().getViewRect().height / 2;
+
+ // Ensure to be within area
+ center.x = Math.max(0, center.x);
+ center.x = Math.min(getScrollPane().getViewport().getViewSize().width - getScrollPane().getViewport().getViewRect().width, center.x);
+ center.y = Math.max(0, center.y);
+ center.y = Math.min(getScrollPane().getViewport().getViewSize().height - getScrollPane().getViewport().getViewRect().height, center.y);
+
+ return center;
+ }
+
+ private void centerRectangle(Rectangle r) {
+
+ if (getScrollPane().getViewport().getViewRect().width == 0 || getScrollPane().getViewport().getViewRect().height == 0) {
+ return;
+ }
+
+ Rectangle r2 = new Rectangle(r.x, r.y, r.width, r.height);
+ r2 = convertSceneToView(r2);
+
+ double factorX = (double) r2.width / (double) getScrollPane().getViewport().getViewRect().width;
+ double factorY = (double) r2.height / (double) getScrollPane().getViewport().getViewRect().height;
+ double factor = Math.max(factorX, factorY);
+ if (factor >= 1.0) {
+ Point p = getScrollPane().getViewport().getViewPosition();
+ setZoomFactor(getZoomFactor() / factor);
+ r2.x /= factor;
+ r2.y /= factor;
+ r2.width /= factor;
+ r2.height /= factor;
+ getScrollPane().getViewport().setViewPosition(calcCenter(r2));
+ } else {
+ getScrollPane().getViewport().setViewPosition(calcCenter(r2));
+ }
+ }
+
+ private void addToSelection(Figure f) {
+ FigureWidget w = getFigureWidget(f);
+ addToSelection(w);
+ }
+
+ private void addToSelection(FigureWidget w) {
+ assert !selectedWidgets.contains(w);
+ selectedWidgets.add(w);
+ content.add(w.getNode());
+ w.setState(w.getState().deriveSelected(true));
+ }
+
+ private void setSelection(Set<Integer> nodes) {
+ clearSelection();
+ for (Figure f : getModel().getDiagramToView().getFigures()) {
+ if (doesIntersect(f.getSource().getSourceNodesAsSet(), nodes)) {
+ addToSelection(f);
+ }
+ }
+ selectionUpdated();
+ this.validate();
+ }
+
+ public void setSelection(Collection<Figure> list) {
+ clearSelection();
+ for (Figure f : list) {
+ addToSelection(f);
+ }
+
+ selectionUpdated();
+ this.validate();
+ }
+
+ public Set<Figure> getSelectedFigures() {
+ Set<Figure> result = new HashSet<Figure>();
+ for (Widget w : selectedWidgets) {
+ if (w instanceof FigureWidget) {
+ FigureWidget fw = (FigureWidget) w;
+ if (fw.getState().isSelected()) {
+ result.add(fw.getFigure());
+ }
+ }
+ }
+ return result;
+ }
+
+ public Set<Integer> getSelectedNodes() {
+ Set<Integer> result = new HashSet<Integer>();
+ for (Widget w : selectedWidgets) {
+ if (w instanceof FigureWidget) {
+ FigureWidget fw = (FigureWidget) w;
+ if (fw.getState().isSelected()) {
+ result.addAll(fw.getFigure().getSource().getSourceNodesAsSet());
+ }
+ }
+ }
+ return result;
+ }
+
+ private UndoRedo.Manager getUndoRedoManager() {
+ if (undoRedoManager == null) {
+ undoRedoManager = new UndoRedo.Manager();
+ undoRedoManager.setLimit(UNDOREDO_LIMIT);
+ }
+
+ return undoRedoManager;
+ }
+
+ public UndoRedo getUndoRedo() {
+ return getUndoRedoManager();
+ }
+
+ private boolean isVisible(Figure f) {
+ for (Integer n : f.getSource().getSourceNodesAsSet()) {
+ if (getModel().getHiddenNodes().contains(n)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean doesIntersect(Set s1, Set s2) {
+ if (s1.size() > s2.size()) {
+ Set tmp = s1;
+ s1 = s2;
+ s2 = tmp;
+ }
+
+ for (Object o : s1) {
+ if (s2.contains(o)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public void showNot(final Set<Integer> nodes) {
+ updateHiddenNodes(nodes, true);
+ }
+
+ public void showOnly(final Set<Integer> nodes) {
+ HashSet<Integer> allNodes = new HashSet<Integer>(getModel().getGraphToView().getGroup().getAllNodes());
+ allNodes.removeAll(nodes);
+ updateHiddenNodes(allNodes, true);
+ }
+
+ private void updateHiddenNodes(Set<Integer> newHiddenNodes, boolean doRelayout) {
+
+ Set<InputBlock> visibleBlocks = new HashSet<InputBlock>();
+
+ Diagram diagram = getModel().getDiagramToView();
+ assert diagram != null;
+
+ Set<Widget> oldVisibleWidgets = new HashSet<Widget>();
+
+ for (Figure f : diagram.getFigures()) {
+ FigureWidget w = figureWidgets.get(f);
+ if (w.isVisible()) {
+ oldVisibleWidgets.add(w);
+ }
+ }
+
+ if (getModel().getShowBlocks()) {
+ for (InputBlock b : diagram.getGraph().getBlocks()) {
+ BlockWidget w = blockWidgets.get(b);
+ if (w.isVisible()) {
+ oldVisibleWidgets.add(w);
+ }
+ }
+ }
+
+ for (Figure f : diagram.getFigures()) {
+ boolean hiddenAfter = doesIntersect(f.getSource().getSourceNodesAsSet(), newHiddenNodes);
+
+ FigureWidget w = this.figureWidgets.get(f);
+ w.setBoundary(false);
+ if (!hiddenAfter) {
+ // Figure is shown
+ w.setVisible(true);
+ for (InputNode n : f.getSource().getSourceNodes()) {
+ visibleBlocks.add(diagram.getGraph().getBlock(n));
+ }
+ } else {
+ // Figure is hidden
+ w.setVisible(false);
+ }
+ }
+
+ if (getModel().getShowNodeHull()) {
+ List<FigureWidget> boundaries = new ArrayList<FigureWidget>();
+ for (Figure f : diagram.getFigures()) {
+ FigureWidget w = this.figureWidgets.get(f);
+ if (!w.isVisible()) {
+ Set<Figure> set = new HashSet<Figure>(f.getPredecessorSet());
+ set.addAll(f.getSuccessorSet());
+
+ boolean b = false;
+ for (Figure neighbor : set) {
+ FigureWidget neighborWidget = figureWidgets.get(neighbor);
+ if (neighborWidget.isVisible()) {
+ b = true;
+ break;
+ }
+ }
+
+ if (b) {
+ w.setBoundary(true);
+ for (InputNode n : f.getSource().getSourceNodes()) {
+ visibleBlocks.add(diagram.getGraph().getBlock(n));
+ }
+ boundaries.add(w);
+ }
+ }
+ }
+
+ for (FigureWidget w : boundaries) {
+ if (w.isBoundary()) {
+ w.setVisible(true);
+ }
+ }
+ }
+
+ if (getModel().getShowBlocks()) {
+ for (InputBlock b : diagram.getGraph().getBlocks()) {
+
+ boolean visibleAfter = visibleBlocks.contains(b);
+
+ BlockWidget w = blockWidgets.get(b);
+ if (visibleAfter) {
+ // Block must be shown
+ w.setVisible(true);
+ } else {
+ // Block must be hidden
+ w.setVisible(false);
+ }
+ }
+ }
+
+ getModel().setHiddenNodes(newHiddenNodes);
+ if (doRelayout) {
+ relayout(oldVisibleWidgets);
+ }
+ this.validate();
+ addUndo();
+ }
+
+ private void showFigures(Collection<Figure> f) {
+ HashSet<Integer> newHiddenNodes = new HashSet<Integer>(getModel().getHiddenNodes());
+ for (Figure fig : f) {
+ newHiddenNodes.removeAll(fig.getSource().getSourceNodesAsSet());
+ }
+ updateHiddenNodes(newHiddenNodes, true);
+ }
+
+ private void showFigure(Figure f) {
+ HashSet<Integer> newHiddenNodes = new HashSet<Integer>(getModel().getHiddenNodes());
+ newHiddenNodes.removeAll(f.getSource().getSourceNodesAsSet());
+ updateHiddenNodes(newHiddenNodes, true);
+ }
+
+ public void showAll(final Collection<Figure> f) {
+ showFigures(f);
+
+ }
+
+ public void show(final Figure f) {
+ showFigure(f);
+ }
+
+ public void gotoFigure(final Figure f) {
+
+ if (!isVisible(f)) {
+ showFigure(f);
+ }
+
+ FigureWidget fw = getFigureWidget(f);
+ if (fw != null) {
+ Rectangle r = fw.getBounds();
+ Point p = fw.getLocation();
+ centerRectangle(new Rectangle(p.x, p.y, r.width, r.height));
+
+ // Select figure
+ clearSelection();
+ addToSelection(fw);
+ selectionUpdated();
+ }
+ }
+
+ public JPopupMenu createPopupMenu() {
+ JPopupMenu menu = new JPopupMenu();
+ for (Action a : actions) {
+ if (a == null) {
+ menu.addSeparator();
+ } else {
+ menu.add(a);
+ }
+ }
+ return menu;
+ }
+
+ private static class DiagramUndoRedo extends AbstractUndoableEdit implements ChangedListener<DiagramViewModel> {
+
+ private DiagramViewModel oldModel;
+ private DiagramViewModel newModel;
+ private Point oldScrollPosition;
+ private DiagramScene scene;
+
+ public DiagramUndoRedo(DiagramScene scene, Point oldScrollPosition, DiagramViewModel oldModel, DiagramViewModel newModel) {
+ assert oldModel != null;
+ assert newModel != null;
+ this.oldModel = oldModel;
+ this.newModel = newModel;
+ this.scene = scene;
+ this.oldScrollPosition = oldScrollPosition;
+ }
+
+ @Override
+ public void redo() throws CannotRedoException {
+ super.redo();
+ boolean b = scene.getUndoRedoEnabled();
+ scene.setUndoRedoEnabled(false);
+ scene.getModel().getViewChangedEvent().addListener(this);
+ scene.getModel().setData(newModel);
+ scene.getModel().getViewChangedEvent().removeListener(this);
+ scene.setUndoRedoEnabled(b);
+ }
+
+ @Override
+ public void undo() throws CannotUndoException {
+ super.undo();
+ boolean b = scene.getUndoRedoEnabled();
+ scene.setUndoRedoEnabled(false);
+ scene.getModel().getViewChangedEvent().addListener(this);
+ scene.getModel().setData(oldModel);
+ scene.getModel().getViewChangedEvent().removeListener(this);
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ public void run() {
+ scene.setScrollPosition(oldScrollPosition);
+ }
+ });
+
+ scene.setUndoRedoEnabled(b);
+ }
+
+ public void changed(DiagramViewModel source) {
+ scene.getModel().getViewChangedEvent().removeListener(this);
+ if (oldModel.getSelectedNodes().equals(newModel.getHiddenNodes())) {
+ scene.smallUpdate(false);
+ } else {
+ scene.smallUpdate(true);
+ }
+ }
+ }
+ private boolean undoRedoEnabled = true;
+
+ public void setUndoRedoEnabled(boolean b) {
+ this.undoRedoEnabled = b;
+ }
+
+ public boolean getUndoRedoEnabled() {
+ return undoRedoEnabled;
+ }
+
+ public void changed(DiagramViewModel source) {
+ assert source == model : "Receive only changed event from current model!";
+ assert source != null;
+ update();
+ }
+
+ private void addUndo() {
+
+ DiagramViewModel newModelCopy = model.copy();
+
+ if (undoRedoEnabled) {
+ this.getUndoRedoManager().undoableEditHappened(new UndoableEditEvent(this, new DiagramUndoRedo(this, this.getScrollPosition(), modelCopy, newModelCopy)));
+ }
+
+ this.modelCopy = newModelCopy;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,303 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.difference.Difference;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.util.RangeSliderModel;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.settings.Settings;
+import java.awt.Color;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramViewModel extends RangeSliderModel implements ChangedListener<RangeSliderModel> {
+
+ // Warning: Update setData method if fields are added
+ private Group group;
+ private Set<Integer> hiddenNodes;
+ private Set<Integer> onScreenNodes;
+ private Set<Integer> selectedNodes;
+ private FilterChain filterChain;
+ private FilterChain sequenceFilterChain;
+ private Diagram diagram;
+ private ChangedEvent<DiagramViewModel> diagramChangedEvent;
+ private ChangedEvent<DiagramViewModel> viewChangedEvent;
+ private ChangedEvent<DiagramViewModel> viewPropertiesChangedEvent;
+ private boolean showBlocks;
+ private boolean showNodeHull;
+ private ChangedListener<FilterChain> filterChainChangedListener = new ChangedListener<FilterChain>() {
+
+ public void changed(FilterChain source) {
+ diagramChanged();
+ }
+ };
+
+ public DiagramViewModel copy() {
+ DiagramViewModel result = new DiagramViewModel(group, filterChain, sequenceFilterChain);
+ result.setData(this);
+ return result;
+ }
+
+ public void setData(DiagramViewModel newModel) {
+ super.setData(newModel);
+ boolean diagramChanged = false;
+ boolean viewChanged = false;
+ boolean viewPropertiesChanged = false;
+
+ this.group = newModel.group;
+ diagramChanged |= (filterChain != newModel.filterChain);
+ this.filterChain = newModel.filterChain;
+ diagramChanged |= (sequenceFilterChain != newModel.sequenceFilterChain);
+ this.sequenceFilterChain = newModel.sequenceFilterChain;
+ diagramChanged |= (diagram != newModel.diagram);
+ this.diagram = newModel.diagram;
+ viewChanged |= (hiddenNodes != newModel.hiddenNodes);
+ this.hiddenNodes = newModel.hiddenNodes;
+ viewChanged |= (onScreenNodes != newModel.onScreenNodes);
+ this.onScreenNodes = newModel.onScreenNodes;
+ viewChanged |= (selectedNodes != newModel.selectedNodes);
+ this.selectedNodes = newModel.selectedNodes;
+ viewPropertiesChanged |= (showBlocks != newModel.showBlocks);
+ this.showBlocks = newModel.showBlocks;
+ viewPropertiesChanged |= (showNodeHull != newModel.showNodeHull);
+ this.showNodeHull = newModel.showNodeHull;
+
+ if (diagramChanged) {
+ diagramChangedEvent.fire();
+ }
+ if (viewPropertiesChanged) {
+ viewPropertiesChangedEvent.fire();
+ }
+ if (viewChanged) {
+ viewChangedEvent.fire();
+ }
+ }
+
+ public boolean getShowBlocks() {
+ return showBlocks;
+ }
+
+ public void setShowBlocks(boolean b) {
+ showBlocks = b;
+ viewPropertiesChangedEvent.fire();
+ }
+
+ public boolean getShowNodeHull() {
+ return showNodeHull;
+ }
+
+ public void setShowNodeHull(boolean b) {
+ showNodeHull = b;
+ viewPropertiesChangedEvent.fire();
+ }
+
+ public DiagramViewModel(Group g, FilterChain filterChain, FilterChain sequenceFilterChain) {
+ super(calculateStringList(g));
+
+ this.showNodeHull = true;
+ this.showBlocks = true;
+ this.group = g;
+ assert filterChain != null;
+ this.filterChain = filterChain;
+ assert sequenceFilterChain != null;
+ this.sequenceFilterChain = sequenceFilterChain;
+ hiddenNodes = new HashSet<Integer>();
+ onScreenNodes = new HashSet<Integer>();
+ selectedNodes = new HashSet<Integer>();
+ super.getChangedEvent().addListener(this);
+ diagramChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+ viewChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+ viewPropertiesChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+
+ filterChain.getChangedEvent().addListener(filterChainChangedListener);
+ sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener);
+ }
+
+ public ChangedEvent<DiagramViewModel> getDiagramChangedEvent() {
+ return diagramChangedEvent;
+ }
+
+ public ChangedEvent<DiagramViewModel> getViewChangedEvent() {
+ return viewChangedEvent;
+ }
+
+ public ChangedEvent<DiagramViewModel> getViewPropertiesChangedEvent() {
+ return viewPropertiesChangedEvent;
+ }
+
+ public Set<Integer> getSelectedNodes() {
+ return Collections.unmodifiableSet(selectedNodes);
+ }
+
+ public Set<Integer> getHiddenNodes() {
+ return Collections.unmodifiableSet(hiddenNodes);
+ }
+
+ public Set<Integer> getOnScreenNodes() {
+ return Collections.unmodifiableSet(onScreenNodes);
+ }
+
+ public void setSelectedNodes(Set<Integer> nodes) {
+ this.selectedNodes = nodes;
+ List<Color> colors = new ArrayList<Color>();
+ for (String s : getPositions()) {
+ colors.add(Color.black);
+ }
+ if (nodes.size() >= 1) {
+ for (Integer id : nodes) {
+ if (id < 0) {
+ id = -id;
+ }
+ InputNode last = null;
+ int index = 0;
+ for (InputGraph g : group.getGraphs()) {
+ Color curColor = colors.get(index);
+ InputNode cur = g.getNode(id);
+ if (cur != null) {
+ if (last == null) {
+ curColor = Color.green;
+ } else {
+ if (last.equals(cur)) {
+ if (curColor == Color.black) {
+ curColor = Color.white;
+ }
+ } else {
+ if (curColor != Color.green) {
+ curColor = Color.orange;
+ }
+ }
+ }
+ }
+ last = cur;
+ colors.set(index, curColor);
+ index++;
+ }
+ }
+ this.setColors(colors);
+ }
+ setColors(colors);
+ viewChangedEvent.fire();
+ }
+
+ public void setHiddenNodes(Set<Integer> nodes) {
+ this.hiddenNodes = nodes;
+ viewChangedEvent.fire();
+ }
+
+ public void setOnScreenNodes(Set<Integer> onScreenNodes) {
+ this.onScreenNodes = onScreenNodes;
+ viewChangedEvent.fire();
+ }
+
+ public FilterChain getSequenceFilterChain() {
+ return filterChain;
+ }
+
+ public void setSequenceFilterChain(FilterChain chain) {
+ assert chain != null : "sequenceFilterChain must never be null";
+ sequenceFilterChain.getChangedEvent().removeListener(filterChainChangedListener);
+ sequenceFilterChain = chain;
+ sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener);
+ diagramChanged();
+ }
+
+ private void diagramChanged() {
+ // clear diagram
+ diagram = null;
+ getDiagramChangedEvent().fire();
+
+ }
+
+ public FilterChain getFilterChain() {
+ return filterChain;
+ }
+
+ public void setFilterChain(FilterChain chain) {
+ assert chain != null : "filterChain must never be null";
+ filterChain.getChangedEvent().removeListener(filterChainChangedListener);
+ filterChain = chain;
+ filterChain.getChangedEvent().addListener(filterChainChangedListener);
+ diagramChanged();
+ }
+
+ private static List<String> calculateStringList(Group g) {
+ List<String> result = new ArrayList<String>();
+ for (InputGraph graph : g.getGraphs()) {
+ result.add(graph.getName());
+ }
+ return result;
+ }
+
+ public InputGraph getFirstGraph() {
+ return group.getGraphs().get(getFirstPosition());
+ }
+
+ public InputGraph getSecondGraph() {
+ return group.getGraphs().get(getSecondPosition());
+ }
+
+ public void selectGraph(InputGraph g) {
+ int index = group.getGraphs().indexOf(g);
+ assert index != -1;
+ setPositions(index, index);
+ }
+
+ public Diagram getDiagramToView() {
+
+ if (diagram == null) {
+ diagram = Diagram.createDiagram(getGraphToView(), Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+ getFilterChain().apply(diagram, getSequenceFilterChain());
+ }
+
+ return diagram;
+ }
+
+ public InputGraph getGraphToView() {
+ if (getFirstGraph() != getSecondGraph()) {
+ InputGraph inputGraph = Difference.createDiffGraph(getSecondGraph(), getFirstGraph());
+ return inputGraph;
+ } else {
+ InputGraph inputGraph = getFirstGraph();
+ return inputGraph;
+ }
+ }
+
+ public void changed(RangeSliderModel source) {
+ diagramChanged();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EditorInputGraphProvider implements InputGraphProvider {
+
+ public InputGraph getGraph() {
+ EditorTopComponent e = EditorTopComponent.getActive();
+ if (e == null) {
+ return null;
+ }
+ return e.getDiagramModel().getGraphToView();
+ }
+
+ public void setSelectedNodes(Set<InputNode> nodes) {
+ EditorTopComponent e = EditorTopComponent.getActive();
+ if (e != null) {
+ e.setSelectedNodes(nodes);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <NonVisualComponents>
+ <Component class="javax.swing.JCheckBox" name="jCheckBox1">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="jCheckBox1"/>
+ <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>
+ </NonVisualComponents>
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <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"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,577 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.actions.EnableBlockLayoutAction;
+import com.sun.hotspot.igv.view.actions.ExpandPredecessorsAction;
+import com.sun.hotspot.igv.view.actions.ExpandSuccessorsAction;
+import com.sun.hotspot.igv.view.actions.ExtractAction;
+import com.sun.hotspot.igv.view.actions.HideAction;
+import com.sun.hotspot.igv.view.actions.NextDiagramAction;
+import com.sun.hotspot.igv.view.actions.NodeFindAction;
+import com.sun.hotspot.igv.view.actions.OverviewAction;
+import com.sun.hotspot.igv.view.actions.PredSuccAction;
+import com.sun.hotspot.igv.view.actions.PrevDiagramAction;
+import com.sun.hotspot.igv.view.actions.ShowAllAction;
+import com.sun.hotspot.igv.view.actions.ZoomInAction;
+import com.sun.hotspot.igv.view.actions.ZoomOutAction;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import com.sun.hotspot.igv.filter.FilterChainProvider;
+import com.sun.hotspot.igv.util.RangeSlider;
+import com.sun.hotspot.igv.util.RangeSliderModel;
+import com.sun.hotspot.igv.svg.BatikSVG;
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.event.HierarchyBoundsListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.JPanel;
+import javax.swing.JToggleButton;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.DialogDisplayer;
+import org.openide.actions.FindAction;
+import org.openide.actions.RedoAction;
+import org.openide.actions.UndoAction;
+import org.openide.awt.Toolbar;
+import org.openide.awt.ToolbarPool;
+import org.openide.awt.UndoRedo;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallbackSystemAction;
+import org.openide.util.actions.SystemAction;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+import org.openide.util.lookup.ProxyLookup;
+import org.openide.windows.Mode;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+import org.openide.NotifyDescriptor;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class EditorTopComponent extends TopComponent implements ChangedListener<RangeSliderModel>, PropertyChangeListener {
+
+ private DiagramScene scene;
+ private InstanceContent content;
+ private FindPanel findPanel;
+ private EnableBlockLayoutAction blockLayoutAction;
+ private OverviewAction overviewAction;
+ private PredSuccAction predSuccAction;
+ private boolean notFirstTime;
+ private ExtendedSatelliteComponent satelliteComponent;
+ private JPanel centerPanel;
+ private CardLayout cardLayout;
+ private RangeSlider rangeSlider;
+ private JToggleButton overviewButton;
+ private static final String PREFERRED_ID = "EditorTopComponent";
+ private static final String SATELLITE_STRING = "satellite";
+ private static final String SCENE_STRING = "scene";
+ private DiagramViewModel rangeSliderModel;
+ private ExportCookie exportCookie = new ExportCookie() {
+
+ public void export(File f) {
+
+ Graphics2D svgGenerator = BatikSVG.createGraphicsObject();
+
+ if (svgGenerator == null) {
+ NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE);
+ DialogDisplayer.getDefault().notifyLater(message);
+ } else {
+ scene.paint(svgGenerator);
+ FileOutputStream os = null;
+ try {
+ os = new FileOutputStream(f);
+ Writer out = new OutputStreamWriter(os, "UTF-8");
+ BatikSVG.printToStream(svgGenerator, out, true);
+ } catch (FileNotFoundException e) {
+ NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE);
+ DialogDisplayer.getDefault().notifyLater(message);
+
+ } catch (UnsupportedEncodingException e) {
+ } finally {
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ }
+ }
+ };
+
+ private void updateDisplayName() {
+ setDisplayName(getDiagram().getName());
+ }
+
+ public EditorTopComponent(Diagram diagram) {
+
+ FilterChain filterChain = null;
+ FilterChain sequence = null;
+ FilterChainProvider provider = Lookup.getDefault().lookup(FilterChainProvider.class);
+ if (provider == null) {
+ filterChain = new FilterChain();
+ sequence = new FilterChain();
+ } else {
+ filterChain = provider.getFilterChain();
+ sequence = provider.getSequence();
+ }
+
+ setName(NbBundle.getMessage(EditorTopComponent.class, "CTL_EditorTopComponent"));
+ setToolTipText(NbBundle.getMessage(EditorTopComponent.class, "HINT_EditorTopComponent"));
+
+ Action[] actions = new Action[]{
+ PrevDiagramAction.get(PrevDiagramAction.class),
+ NextDiagramAction.get(NextDiagramAction.class),
+ null,
+ ExtractAction.get(ExtractAction.class),
+ ShowAllAction.get(HideAction.class),
+ ShowAllAction.get(ShowAllAction.class),
+ null,
+ ZoomInAction.get(ZoomInAction.class),
+ ZoomOutAction.get(ZoomOutAction.class),
+ null,
+ ExpandPredecessorsAction.get(ExpandPredecessorsAction.class),
+ ExpandSuccessorsAction.get(ExpandSuccessorsAction.class)
+ };
+
+
+ initComponents();
+
+ ActionMap actionMap = getActionMap();
+
+ ToolbarPool.getDefault().setPreferredIconSize(16);
+ Toolbar toolBar = new Toolbar();
+ Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+ toolBar.setBorder(b);
+ JPanel container = new JPanel();
+ this.add(container, BorderLayout.NORTH);
+ container.setLayout(new BorderLayout());
+ container.add(BorderLayout.NORTH, toolBar);
+
+ rangeSliderModel = new DiagramViewModel(diagram.getGraph().getGroup(), filterChain, sequence);
+ rangeSliderModel.selectGraph(diagram.getGraph());
+ rangeSlider = new RangeSlider();
+ rangeSlider.setModel(rangeSliderModel);
+ rangeSliderModel.getChangedEvent().addListener(this);
+ container.add(BorderLayout.CENTER, rangeSlider);
+
+ scene = new DiagramScene(actions, rangeSliderModel);
+ content = new InstanceContent();
+ this.associateLookup(new ProxyLookup(new Lookup[]{scene.getLookup(), new AbstractLookup(content)}));
+ content.add(exportCookie);
+ content.add(rangeSliderModel);
+
+
+ findPanel = new FindPanel(diagram.getFigures());
+ findPanel.setMaximumSize(new Dimension(200, 50));
+ toolBar.add(findPanel);
+ toolBar.add(NodeFindAction.get(NodeFindAction.class));
+ toolBar.addSeparator();
+ toolBar.add(NextDiagramAction.get(NextDiagramAction.class));
+ toolBar.add(PrevDiagramAction.get(PrevDiagramAction.class));
+ toolBar.addSeparator();
+ toolBar.add(ExtractAction.get(ExtractAction.class));
+ toolBar.add(ShowAllAction.get(HideAction.class));
+ toolBar.add(ShowAllAction.get(ShowAllAction.class));
+ toolBar.addSeparator();
+ toolBar.add(ShowAllAction.get(ZoomInAction.class));
+ toolBar.add(ShowAllAction.get(ZoomOutAction.class));
+
+ blockLayoutAction = new EnableBlockLayoutAction();
+ JToggleButton button = new JToggleButton(blockLayoutAction);
+ button.setSelected(true);
+ toolBar.add(button);
+ blockLayoutAction.addPropertyChangeListener(this);
+
+ overviewAction = new OverviewAction();
+ overviewButton = new JToggleButton(overviewAction);
+ overviewButton.setSelected(false);
+ toolBar.add(overviewButton);
+ overviewAction.addPropertyChangeListener(this);
+
+ predSuccAction = new PredSuccAction();
+ button = new JToggleButton(predSuccAction);
+ button.setSelected(true);
+ toolBar.add(button);
+ predSuccAction.addPropertyChangeListener(this);
+
+ toolBar.addSeparator();
+ toolBar.add(UndoAction.get(UndoAction.class));
+ toolBar.add(RedoAction.get(RedoAction.class));
+
+ centerPanel = new JPanel();
+ this.add(centerPanel, BorderLayout.CENTER);
+ cardLayout = new CardLayout();
+ centerPanel.setLayout(cardLayout);
+ centerPanel.add(SCENE_STRING, scene.getScrollPane());
+ centerPanel.setBackground(Color.WHITE);
+ satelliteComponent = new ExtendedSatelliteComponent(scene);
+ satelliteComponent.setSize(200, 200);
+ centerPanel.add(SATELLITE_STRING, satelliteComponent);
+
+ CallbackSystemAction callFindAction = (CallbackSystemAction) SystemAction.get(FindAction.class);
+ NodeFindAction findAction = NodeFindAction.get(NodeFindAction.class);
+ Object key = callFindAction.getActionMapKey();
+ actionMap.put(key, findAction);
+
+ scene.getScrollPane().addKeyListener(keyListener);
+ scene.getView().addKeyListener(keyListener);
+ satelliteComponent.addKeyListener(keyListener);
+
+ scene.getScrollPane().addHierarchyBoundsListener(new HierarchyBoundsListener() {
+
+ public void ancestorMoved(HierarchyEvent e) {
+ }
+
+ public void ancestorResized(HierarchyEvent e) {
+ if (!notFirstTime && scene.getScrollPane().getBounds().width > 0) {
+ notFirstTime = true;
+ SwingUtilities.invokeLater(new Runnable() {
+
+ public void run() {
+ Figure f = EditorTopComponent.this.scene.getModel().getDiagramToView().getRootFigure();
+ if (f != null) {
+ scene.setUndoRedoEnabled(false);
+ scene.gotoFigure(f);
+ scene.setUndoRedoEnabled(true);
+ }
+ }
+ });
+ }
+ }
+ });
+
+ updateDisplayName();
+ }
+ private KeyListener keyListener = new KeyListener() {
+
+ public void keyTyped(KeyEvent e) {
+ }
+
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_S) {
+ EditorTopComponent.this.overviewButton.setSelected(true);
+ EditorTopComponent.this.overviewAction.setState(true);
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_S) {
+ EditorTopComponent.this.overviewButton.setSelected(false);
+ EditorTopComponent.this.overviewAction.setState(false);
+ }
+ }
+ };
+
+ public DiagramViewModel getDiagramModel() {
+ return scene.getModel();
+ }
+
+ private void showSatellite() {
+ cardLayout.show(centerPanel, SATELLITE_STRING);
+ satelliteComponent.requestFocus();
+
+ }
+
+ private void showScene() {
+ cardLayout.show(centerPanel, SCENE_STRING);
+ scene.getView().requestFocus();
+ }
+
+ public void findNode() {
+ findPanel.find();
+ }
+
+ public void zoomOut() {
+ double zoom = scene.getZoomFactor();
+ Point viewPosition = scene.getScrollPane().getViewport().getViewPosition();
+ double newZoom = zoom / DiagramScene.ZOOM_INCREMENT;
+ if (newZoom > DiagramScene.ZOOM_MIN_FACTOR) {
+ scene.setZoomFactor(newZoom);
+ scene.validate();
+ scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x / DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y / DiagramScene.ZOOM_INCREMENT)));
+ this.satelliteComponent.update();
+ }
+ }
+
+ public void zoomIn() {
+ double zoom = scene.getZoomFactor();
+ Point viewPosition = scene.getScrollPane().getViewport().getViewPosition();
+ double newZoom = zoom * DiagramScene.ZOOM_INCREMENT;
+ if (newZoom < DiagramScene.ZOOM_MAX_FACTOR) {
+ scene.setZoomFactor(newZoom);
+ scene.validate();
+ scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x * DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y * DiagramScene.ZOOM_INCREMENT)));
+ this.satelliteComponent.update();
+ }
+ }
+
+ public void showPrevDiagram() {
+ int fp = getModel().getFirstPosition();
+ int sp = getModel().getSecondPosition();
+ if (fp != 0) {
+ fp--;
+ sp--;
+ getModel().setPositions(fp, sp);
+ }
+ }
+
+ public DiagramViewModel getModel() {
+ return scene.getModel();
+ }
+
+ public FilterChain getFilterChain() {
+ return this.scene.getModel().getFilterChain();
+ }
+
+ public static EditorTopComponent getActive() {
+ Set<? extends Mode> modes = WindowManager.getDefault().getModes();
+ for (Mode m : modes) {
+ TopComponent tc = m.getSelectedTopComponent();
+ if (tc instanceof EditorTopComponent) {
+ return (EditorTopComponent) tc;
+ }
+ }
+ return null;
+ }
+
+ /** 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() {
+ jCheckBox1 = new javax.swing.JCheckBox();
+
+ org.openide.awt.Mnemonics.setLocalizedText(jCheckBox1, "jCheckBox1");
+ jCheckBox1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ jCheckBox1.setMargin(new java.awt.Insets(0, 0, 0, 0));
+
+ setLayout(new java.awt.BorderLayout());
+
+ }// </editor-fold>//GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JCheckBox jCheckBox1;
+ // End of variables declaration//GEN-END:variables
+ @Override
+ public int getPersistenceType() {
+ return TopComponent.PERSISTENCE_NEVER;
+ }
+
+ @Override
+ public void componentOpened() {
+ }
+
+ @Override
+ public void componentClosed() {
+ }
+
+ @Override
+ protected String preferredID() {
+ return PREFERRED_ID;
+ }
+
+ public void changed(RangeSliderModel model) {
+ updateDisplayName();
+ }
+
+ public boolean showPredSucc() {
+ return (Boolean) predSuccAction.getValue(PredSuccAction.STATE);
+ }
+
+ public void setSelection(PropertyMatcher matcher) {
+
+ Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(scene.getModel().getDiagramToView().getFigures());
+ List<Figure> list = selector.selectMultiple(matcher);
+ boolean b = scene.getUndoRedoEnabled();
+ scene.setUndoRedoEnabled(false);
+ scene.gotoFigures(list);
+ scene.setUndoRedoEnabled(b);
+ scene.setSelection(list);
+ }
+
+ public void setSelectedNodes(Set<InputNode> nodes) {
+
+ List<Figure> list = new ArrayList<Figure>();
+ Set<Integer> ids = new HashSet<Integer>();
+ for (InputNode n : nodes) {
+ ids.add(n.getId());
+ }
+
+ for (Figure f : scene.getModel().getDiagramToView().getFigures()) {
+ for (InputNode n : f.getSource().getSourceNodes()) {
+ if (ids.contains(n.getId())) {
+ list.add(f);
+ break;
+ }
+ }
+ }
+
+ scene.gotoFigures(list);
+ scene.setSelection(list);
+ }
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (evt.getSource() == this.predSuccAction) {
+ boolean b = (Boolean) predSuccAction.getValue(PredSuccAction.STATE);
+ this.getModel().setShowNodeHull(b);
+ } else if (evt.getSource() == this.overviewAction) {
+ boolean b = (Boolean) overviewAction.getValue(OverviewAction.STATE);
+ if (b) {
+ showSatellite();
+ } else {
+ showScene();
+ }
+ } else if (evt.getSource() == this.blockLayoutAction) {
+ boolean b = (Boolean) blockLayoutAction.getValue(EnableBlockLayoutAction.STATE);
+ System.out.println("Showblocks = " + b);
+ this.getModel().setShowBlocks(b);
+ } else {
+ assert false : "Unknown event source";
+ }
+ }
+
+ public void extract() {
+ scene.showOnly(scene.getSelectedNodes());
+ }
+
+ public void hideNodes() {
+ Set<Integer> selectedNodes = this.scene.getSelectedNodes();
+ HashSet<Integer> nodes = new HashSet<Integer>(scene.getModel().getHiddenNodes());
+ nodes.addAll(selectedNodes);
+ this.scene.showNot(nodes);
+ }
+
+ public void expandPredecessors() {
+ Set<Figure> oldSelection = scene.getSelectedFigures();
+ Set<Figure> figures = new HashSet<Figure>();
+
+ for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) {
+ boolean ok = false;
+ if (oldSelection.contains(f)) {
+ ok = true;
+ } else {
+ for (Figure pred : f.getSuccessors()) {
+ if (oldSelection.contains(pred)) {
+ ok = true;
+ break;
+ }
+ }
+ }
+
+ if (ok) {
+ figures.add(f);
+ }
+ }
+
+ scene.showAll(figures);
+ }
+
+ public void expandSuccessors() {
+ Set<Figure> oldSelection = scene.getSelectedFigures();
+ Set<Figure> figures = new HashSet<Figure>();
+
+ for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) {
+ boolean ok = false;
+ if (oldSelection.contains(f)) {
+ ok = true;
+ } else {
+ for (Figure succ : f.getPredecessors()) {
+ if (oldSelection.contains(succ)) {
+ ok = true;
+ break;
+ }
+ }
+ }
+
+ if (ok) {
+ figures.add(f);
+ }
+ }
+
+ scene.showAll(figures);
+ }
+
+ public void showAll() {
+ scene.showNot(new HashSet<Integer>());
+ }
+
+ public Diagram getDiagram() {
+ return getDiagramModel().getDiagramToView();
+ }
+
+ @Override
+ protected void componentActivated() {
+ }
+
+ @Override
+ public void requestFocus() {
+ super.requestFocus();
+ scene.getView().requestFocus();
+ }
+
+ @Override
+ public boolean requestFocusInWindow() {
+ super.requestFocusInWindow();
+ return scene.getView().requestFocusInWindow();
+ }
+
+ @Override
+ public UndoRedo getUndoRedo() {
+ return scene.getUndoRedo();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-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. 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.hotspot.igv.view;
+
+import java.io.File;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ExportCookie {
+
+ void export(File f);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.action.WidgetAction;
+
+import java.awt.event.MouseEvent;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedPanAction extends WidgetAction.LockedAdapter {
+
+ private Scene scene;
+ private JScrollPane scrollPane;
+ private Point lastLocation;
+
+ protected boolean isLocked() {
+ return scrollPane != null;
+ }
+
+ @Override
+ public State mousePressed(Widget widget, WidgetMouseEvent event) {
+ if (event.getButton() == MouseEvent.BUTTON2 || event.getButton() == MouseEvent.BUTTON1 && ((event.getModifiers() & MouseEvent.CTRL_MASK) != 0)) {
+ scene = widget.getScene();
+ scrollPane = findScrollPane(scene.getView());
+ if (scrollPane != null) {
+ lastLocation = scene.convertSceneToView(widget.convertLocalToScene(event.getPoint()));
+ SwingUtilities.convertPointToScreen(lastLocation, scrollPane.getViewport().getView());
+ return State.createLocked(widget, this);
+ }
+ }
+ return State.REJECTED;
+ }
+
+ private JScrollPane findScrollPane(JComponent component) {
+ for (;;) {
+ if (component == null) {
+ return null;
+ }
+ if (component instanceof JScrollPane) {
+ return ((JScrollPane) component);
+ }
+ Container parent = component.getParent();
+ if (!(parent instanceof JComponent)) {
+ return null;
+ }
+ component = (JComponent) parent;
+ }
+ }
+
+ @Override
+ public State mouseReleased(Widget widget, WidgetMouseEvent event) {
+ boolean state = pan(widget, event.getPoint());
+ if (state) {
+ scrollPane = null;
+ }
+ return state ? State.createLocked(widget, this) : State.REJECTED;
+ }
+
+ @Override
+ public State mouseDragged(Widget widget, WidgetMouseEvent event) {
+ return pan(widget, event.getPoint()) ? State.createLocked(widget, this) : State.REJECTED;
+ }
+
+ private boolean pan(Widget widget, Point newLocation) {
+ if (scrollPane == null || scene != widget.getScene()) {
+ return false;
+ }
+ newLocation = scene.convertSceneToView(widget.convertLocalToScene(newLocation));
+ SwingUtilities.convertPointToScreen(newLocation, scrollPane.getViewport().getView());
+ Point viewPosition = scrollPane.getViewport().getViewPosition();
+ Dimension viewSize = scrollPane.getViewport().getViewSize();
+ Dimension viewPortSize = scrollPane.getViewport().getSize();
+
+ int xOffset = lastLocation.x - newLocation.x;
+ int yOffset = lastLocation.y - newLocation.y;
+
+ if (viewPortSize.height == viewSize.height) {
+ yOffset = 0;
+ }
+
+ if (viewPortSize.width == viewSize.width) {
+ xOffset = 0;
+ }
+
+ if (xOffset == 0 && yOffset == 0) {
+ return true;
+ }
+ viewPosition = new Point(viewPosition.x + xOffset, viewPosition.y + yOffset);
+ viewPosition.x = Math.max(viewPosition.x, 0);
+ viewPosition.y = Math.max(viewPosition.y, 0);
+ viewPosition.x = Math.min(viewPosition.x, scrollPane.getViewport().getView().getSize().width - scrollPane.getViewport().getSize().width);
+ viewPosition.y = Math.min(viewPosition.y, scrollPane.getViewport().getView().getSize().height - scrollPane.getViewport().getSize().height);
+
+ scrollPane.getViewport().setViewPosition(viewPosition);
+ scrollPane.getViewport().getView().repaint();
+ lastLocation = newLocation;
+ return true;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,200 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import org.netbeans.api.visual.widget.Scene;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener {
+
+ private DiagramScene scene;
+ private Image image;
+ private int imageWidth;
+ private int imageHeight;
+
+ public ExtendedSatelliteComponent(DiagramScene scene) {
+ this.scene = scene;
+ setDoubleBuffered(true);
+ setPreferredSize(new Dimension(128, 128));
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ }
+
+ public void addNotify() {
+ super.addNotify();
+ scene.addSceneListener(this);
+ JComponent viewComponent = scene.getView();
+ if (viewComponent == null) {
+ viewComponent = scene.createView();
+ }
+ viewComponent.addComponentListener(this);
+ repaint();
+ }
+
+ public void removeNotify() {
+ scene.getView().removeComponentListener(this);
+ scene.removeSceneListener(this);
+ super.removeNotify();
+ }
+
+ public void update() {
+ this.image = null;
+ if (this.isVisible()) {
+ repaint();
+ revalidate();
+ validate();
+ }
+ }
+
+ public void paint(Graphics g) {
+ Graphics2D gr = (Graphics2D) g;
+ super.paint(g);
+ Rectangle bounds = scene.getBounds();
+ Dimension size = getSize();
+
+ double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+ double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+ double scale = Math.min(sx, sy);
+
+ int vw = (int) (scale * bounds.width);
+ int vh = (int) (scale * bounds.height);
+ int vx = (size.width - vw) / 2;
+ int vy = (size.height - vh) / 2;
+
+
+ if (image == null || vw != imageWidth || vh != imageHeight) {
+
+ imageWidth = vw;
+ imageHeight = vh;
+ image = this.createImage(imageWidth, imageHeight);
+ Graphics2D ig = (Graphics2D) image.getGraphics();
+ ig.scale(scale, scale);
+ scene.setRealZoomFactor(scale);
+ scene.paint(ig);
+ scene.setRealZoomFactor(0.0);
+ }
+
+ gr.drawImage(image, vx, vy, this);
+
+ JComponent component = scene.getView();
+ double zoomFactor = scene.getZoomFactor();
+ Rectangle viewRectangle = component != null ? component.getVisibleRect() : null;
+ if (viewRectangle != null) {
+ Rectangle window = new Rectangle(
+ (int) ((double) viewRectangle.x * scale / zoomFactor),
+ (int) ((double) viewRectangle.y * scale / zoomFactor),
+ (int) ((double) viewRectangle.width * scale / zoomFactor),
+ (int) ((double) viewRectangle.height * scale / zoomFactor));
+ window.translate(vx, vy);
+ gr.setColor(new Color(200, 200, 200, 128));
+ gr.fill(window);
+ gr.setColor(Color.BLACK);
+ gr.drawRect(window.x, window.y, window.width - 1, window.height - 1);
+ }
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ moveVisibleRect(e.getPoint());
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ moveVisibleRect(e.getPoint());
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ moveVisibleRect(e.getPoint());
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ }
+
+ private void moveVisibleRect(Point center) {
+ JComponent component = scene.getView();
+ if (component == null) {
+ return;
+ }
+ double zoomFactor = scene.getZoomFactor();
+ Rectangle bounds = scene.getBounds();
+ Dimension size = getSize();
+
+ double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+ double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+ double scale = Math.min(sx, sy);
+
+ int vw = (int) (scale * bounds.width);
+ int vh = (int) (scale * bounds.height);
+ int vx = (size.width - vw) / 2;
+ int vy = (size.height - vh) / 2;
+
+ int cx = (int) ((double) (center.x - vx) / scale * zoomFactor);
+ int cy = (int) ((double) (center.y - vy) / scale * zoomFactor);
+
+ Rectangle visibleRect = component.getVisibleRect();
+ visibleRect.x = cx - visibleRect.width / 2;
+ visibleRect.y = cy - visibleRect.height / 2;
+ component.scrollRectToVisible(visibleRect);
+
+ this.repaint();
+ }
+
+ public void sceneRepaint() {
+ //repaint ();
+ }
+
+ public void sceneValidating() {
+ }
+
+ public void sceneValidated() {
+ }
+
+ public void componentResized(ComponentEvent e) {
+ repaint();
+ }
+
+ public void componentMoved(ComponentEvent e) {
+ repaint();
+ }
+
+ public void componentShown(ComponentEvent e) {
+ }
+
+ public void componentHidden(ComponentEvent e) {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,111 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher;
+import com.sun.hotspot.igv.data.Property;
+import java.awt.GridLayout;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+class FindPanel extends JPanel implements KeyListener {
+
+ private JComboBox nameComboBox;
+ private JTextField valueTextField;
+
+ public FindPanel(List<Figure> figures) {
+ createDesign();
+ updateComboBox(figures);
+ }
+
+ protected void createDesign() {
+ setLayout(new GridLayout());
+ nameComboBox = new JComboBox();
+ valueTextField = new JTextField();
+ add(nameComboBox);
+ add(valueTextField);
+ valueTextField.addKeyListener(this);
+ }
+
+ public void updateComboBox(List<Figure> figures) {
+
+ String sel = (String) nameComboBox.getSelectedItem();
+ SortedSet<String> propertyNames = new TreeSet<String>();
+
+ for (Figure f : figures) {
+ Properties prop = f.getProperties();
+ for (Property p : prop.getProperties()) {
+ if (!propertyNames.contains(p.getName())) {
+ propertyNames.add(p.getName());
+ }
+ }
+ }
+
+ for (String s : propertyNames) {
+ nameComboBox.addItem(s);
+ }
+ nameComboBox.setSelectedItem(sel);
+ }
+
+ public String getNameText() {
+ return (String) nameComboBox.getSelectedItem();
+ }
+
+ public String getValueText() {
+ return valueTextField.getText();
+ }
+
+ public void keyTyped(KeyEvent e) {
+ }
+
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+ find();
+ }
+ }
+
+ public void find() {
+ EditorTopComponent comp = EditorTopComponent.getActive();
+ if (comp != null) {
+ RegexpPropertyMatcher matcher = new RegexpPropertyMatcher(getNameText(), getValueText());
+ comp.setSelection(matcher);
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.settings.Settings;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphViewerImplementation implements GraphViewer {
+
+ public void view(InputGraph graph) {
+ Diagram diagram = Diagram.createDiagram(graph, Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+ EditorTopComponent tc = new EditorTopComponent(diagram);
+ tc.open();
+ tc.requestActive();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PreferenceConstants {
+
+ public static final String KEY_LINE_GENERATOR = "lineGenerator";
+ public static final String DEFAULT_LINE_GENERATOR = "com.sun.hotspot.igv.positioning.BasicLineGenerator";
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.Collection;
+import java.util.List;
+import org.netbeans.api.visual.layout.Layout;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SlotLayout implements Layout {
+
+ public enum HorizontalAlignment {
+
+ Left,
+ Center,
+ Right
+ }
+ private Layout baseLayout;
+ private HorizontalAlignment alignment;
+ private boolean vertical;
+
+ public SlotLayout() {
+ this(HorizontalAlignment.Center, false);
+ }
+
+ public SlotLayout(HorizontalAlignment alignment, boolean vertical) {
+ this.alignment = alignment;
+ baseLayout = LayoutFactory.createVerticalFlowLayout();
+ this.vertical = vertical;
+ }
+
+ public void layout(Widget widget) {
+ if (!vertical) {
+ Collection<Widget> children = widget.getChildren();
+ int gap = 0;
+ int max = 0;
+ for (Widget child : children) {
+ Rectangle preferredBounds = child.getPreferredBounds();
+ int i = preferredBounds.width;
+ if (i > max) {
+ max = i;
+ }
+ }
+ int pos = 0;
+ for (Widget child : children) {
+ Rectangle preferredBounds = child.getPreferredBounds();
+ int x = preferredBounds.x;
+ int y = preferredBounds.y;
+ int width = preferredBounds.width;
+ int height = preferredBounds.height;
+ if (pos == 0) {
+ pos += height / 2;
+ }
+ int lx = -x;
+ int ly = pos - y;
+ switch (alignment) {
+ case Center:
+ lx += (max - width) / 2;
+ break;
+ case Left:
+ break;
+ case Right:
+ lx += max - width;
+ break;
+ }
+ child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height));
+ pos += height + gap;
+ }
+ } else {
+
+ Collection<Widget> children = widget.getChildren();
+ int gap = 0;
+ int max = 0;
+ for (Widget child : children) {
+ Rectangle preferredBounds = child.getPreferredBounds();
+ int i = preferredBounds.height;
+ if (i > max) {
+ max = i;
+ }
+ }
+ int pos = 0;
+ for (Widget child : children) {
+ Rectangle preferredBounds = child.getPreferredBounds();
+ int x = preferredBounds.x;
+ int y = preferredBounds.y;
+ int width = preferredBounds.width;
+ int height = preferredBounds.height;
+ if (pos == 0) {
+ pos += width / 2;
+ }
+ int lx = pos - x;
+ int ly = -y;
+ switch (alignment) {
+ case Center:
+ ly += (max - height) / 2;
+ break;
+ case Left:
+ break;
+ case Right:
+ ly += max - height;
+ break;
+ }
+ child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height));
+ pos += width + gap;
+ }
+
+ }
+ }
+
+ public boolean requiresJustification(Widget widget) {
+ return true;
+ }
+
+ public void justify(Widget widget) {
+ baseLayout.justify(widget);
+
+ Rectangle client = widget.getClientArea();
+ List<Widget> children = widget.getChildren();
+
+ int count = children.size();
+ int z = 0;
+
+ int maxWidth = 0;
+ for (Widget c : children) {
+ if (c.getPreferredBounds().width > maxWidth) {
+ maxWidth = c.getPreferredBounds().width;
+ }
+ }
+
+ for (Widget c : children) {
+ z++;
+ Point curLocation = c.getLocation();
+ Rectangle curBounds = c.getBounds();
+
+
+ Point location = new Point(curLocation.x, client.y + client.height * z / (count + 1) - curBounds.height / 2);
+ if (vertical) {
+ location = new Point(client.x + client.width * z / (count + 1) - maxWidth / 2, curLocation.y);
+ }
+ c.resolveBounds(location, null);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+CTL_EditorAction=Open Editor Window
+CTL_LineGeneratorAction=Line Generator
+CTL_NextDiagramAction=Show next graph
+CTL_EnableBlockLayoutAction=Enable block layout
+CTL_NodeFindAction=Find
+CTL_PrevDiagramAction=Show previous graph
+CTL_ExportAction=Export...
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EnableBlockLayoutAction extends AbstractAction {
+
+ private boolean state;
+ public static final String STATE = "state";
+
+ public EnableBlockLayoutAction() {
+ state = true;
+ putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+ putValue(STATE, true);
+ putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks");
+ }
+
+ public void actionPerformed(ActionEvent ev) {
+ this.state = !state;
+ this.putValue(STATE, state);
+ }
+
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/blocks.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExpandPredecessorsAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent editor = EditorTopComponent.getActive();
+ if (editor != null) {
+ editor.expandPredecessors();
+ }
+ }
+
+ public String getName() {
+ return "Expand Predecessors";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExpandSuccessorsAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent editor = EditorTopComponent.getActive();
+ if (editor != null) {
+ editor.expandSuccessors();
+ }
+ }
+
+ public String getName() {
+ return "Expand Successors";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,117 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.settings.Settings;
+import com.sun.hotspot.igv.view.ExportCookie;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import javax.swing.Action;
+import javax.swing.JFileChooser;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExportAction extends CallableSystemAction implements LookupListener {
+
+ private final Lookup lookup;
+ private final Lookup.Result<ExportCookie> result;
+
+ public ExportAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Export current graph as an SVG file");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
+ lookup = Utilities.actionsGlobalContext();
+ result = lookup.lookup(new Lookup.Template<ExportCookie>(ExportCookie.class));
+ result.addLookupListener(this);
+ resultChanged(null);
+ }
+
+ public void resultChanged(LookupEvent e) {
+ super.setEnabled(result.allInstances().size() > 0);
+ }
+
+ public void performAction() {
+
+ JFileChooser fc = new JFileChooser();
+ fc.setFileFilter(new FileFilter() {
+
+ public boolean accept(File f) {
+ return true;
+ }
+
+ public String getDescription() {
+ return "SVG files (*.svg)";
+ }
+ });
+ fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+
+ if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File file = fc.getSelectedFile();
+ if (!file.getName().contains(".")) {
+ file = new File(file.getAbsolutePath() + ".svg");
+ }
+
+ File dir = file;
+ if (!dir.isDirectory()) {
+ dir = dir.getParentFile();
+ }
+
+ Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+ ExportCookie cookie = Utilities.actionsGlobalContext().lookup(ExportCookie.class);
+ if (cookie != null) {
+ cookie.export(file);
+ }
+ }
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(ExportAction.class, "CTL_ExportAction");
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/export.gif";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExtractAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent editor = EditorTopComponent.getActive();
+ if (editor != null) {
+ editor.extract();
+ }
+ }
+
+ public ExtractAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Extract current set of selected nodes");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK, false));
+ }
+
+ public String getName() {
+ return "Extract action";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/extract.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class HideAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent editor = EditorTopComponent.getActive();
+ if (editor != null) {
+ editor.hideNodes();
+ }
+ }
+
+ public HideAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Hide selected nodes");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK, false));
+ }
+
+ public String getName() {
+ return "Hide";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/hide.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import org.netbeans.api.visual.action.HoverProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MouseOverAction extends WidgetAction.Adapter {
+
+ private long eventID = Integer.MIN_VALUE;
+ private HoverProvider provider;
+
+ public MouseOverAction(HoverProvider provider) {
+ this.provider = provider;
+ }
+
+ @Override
+ public State mouseMoved(Widget widget, WidgetMouseEvent event) {
+ long id = event.getEventID();
+ if (id != eventID) {
+ eventID = id;
+ provider.widgetHovered(widget);
+ }
+ return State.REJECTED;
+ }
+
+ @Override
+ public State mouseExited(Widget widget, WidgetMouseEvent event) {
+ provider.widgetHovered(null);
+ return State.REJECTED;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.DiagramViewModel;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.util.ContextAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NextDiagramAction extends ContextAction<DiagramViewModel> implements ChangedListener<DiagramViewModel> {
+
+ private DiagramViewModel model;
+
+ public NextDiagramAction() {
+ this(Utilities.actionsGlobalContext());
+ }
+
+ public NextDiagramAction(Lookup lookup) {
+ putValue(Action.SHORT_DESCRIPTION, "Show next graph of current group");
+ putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/next_diagram.png")));
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(NextDiagramAction.class, "CTL_NextDiagramAction");
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public Class<DiagramViewModel> contextClass() {
+ return DiagramViewModel.class;
+ }
+
+ @Override
+ public void performAction(DiagramViewModel model) {
+ int fp = model.getFirstPosition();
+ int sp = model.getSecondPosition();
+ if (sp != model.getPositions().size() - 1) {
+ int nfp = fp + 1;
+ int nsp = sp + 1;
+ model.setPositions(nfp, nsp);
+ }
+ }
+
+ @Override
+ public void update(DiagramViewModel model) {
+ super.update(model);
+
+ if (this.model != model) {
+ if (this.model != null) {
+ this.model.getDiagramChangedEvent().removeListener(this);
+ }
+
+ this.model = model;
+ if (this.model != null) {
+ this.model.getDiagramChangedEvent().addListener(this);
+ }
+ }
+ }
+
+ @Override
+ public boolean isEnabled(DiagramViewModel model) {
+ return model.getSecondPosition() != model.getPositions().size() - 1;
+ }
+
+ public Action createContextAwareInstance(Lookup arg0) {
+ return new NextDiagramAction(arg0);
+ }
+
+ public void changed(DiagramViewModel source) {
+ update(source);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NodeFindAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent comp = EditorTopComponent.getActive();
+ if (comp != null) {
+ comp.findNode();
+ }
+ }
+
+ public NodeFindAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Find nodes");
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(NodeFindAction.class, "CTL_NodeFindAction");
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/search.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OverviewAction extends AbstractAction {
+
+ private boolean state;
+ public static final String STATE = "state";
+
+ public OverviewAction() {
+ putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+ putValue(Action.SHORT_DESCRIPTION, "Show satellite view of whole graph");
+ setState(false);
+ }
+
+ public void actionPerformed(ActionEvent ev) {
+ setState(!state);
+ }
+
+ public void setState(boolean b) {
+ this.putValue(STATE, b);
+ this.state = b;
+ }
+
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/overview.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PredSuccAction extends AbstractAction {
+
+ private boolean state;
+ public static final String STATE = "state";
+
+ public PredSuccAction() {
+ state = true;
+ putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+ putValue(STATE, true);
+ putValue(Action.SHORT_DESCRIPTION, "Show neighboring nodes of fully visible nodes semi-transparent");
+ }
+
+ public void actionPerformed(ActionEvent ev) {
+ this.state = !state;
+ this.putValue(STATE, state);
+ }
+
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/predsucc.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.view.DiagramViewModel;
+import com.sun.hotspot.igv.util.ContextAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class PrevDiagramAction extends ContextAction<DiagramViewModel> implements ChangedListener<DiagramViewModel> {
+
+ private DiagramViewModel model;
+
+ public PrevDiagramAction() {
+ this(Utilities.actionsGlobalContext());
+ }
+
+ public PrevDiagramAction(Lookup lookup) {
+ putValue(Action.SHORT_DESCRIPTION, "Show previous graph of current group");
+ putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/prev_diagram.png")));
+ }
+
+ public String getName() {
+ return NbBundle.getMessage(PrevDiagramAction.class, "CTL_PrevDiagramAction");
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public Class<DiagramViewModel> contextClass() {
+ return DiagramViewModel.class;
+ }
+
+ @Override
+ public void performAction(DiagramViewModel model) {
+ int fp = model.getFirstPosition();
+ int sp = model.getSecondPosition();
+ if (fp != 0) {
+ int nfp = fp - 1;
+ int nsp = sp - 1;
+ model.setPositions(nfp, nsp);
+ }
+ }
+
+ @Override
+ public void update(DiagramViewModel model) {
+ super.update(model);
+
+ if (this.model != model) {
+ if (this.model != null) {
+ this.model.getDiagramChangedEvent().removeListener(this);
+ }
+
+ this.model = model;
+ if (this.model != null) {
+ this.model.getDiagramChangedEvent().addListener(this);
+ }
+ }
+ }
+
+ @Override
+ public boolean isEnabled(DiagramViewModel model) {
+ return model.getFirstPosition() != 0;
+ }
+
+ public Action createContextAwareInstance(Lookup arg0) {
+ return new PrevDiagramAction(arg0);
+ }
+
+ public void changed(DiagramViewModel source) {
+ update(source);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.*;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ShowAllAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent editor = EditorTopComponent.getActive();
+ if (editor != null) {
+ editor.showAll();
+ }
+ }
+
+ public ShowAllAction() {
+ putValue(Action.SHORT_DESCRIPTION, "Show all nodes");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
+ }
+
+ public String getName() {
+ return "Show all";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/expand.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,69 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ZoomInAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent editor = EditorTopComponent.getActive();
+ if (editor != null) {
+ editor.zoomIn();
+ }
+ }
+
+ public String getName() {
+ return "Zoom in";
+ }
+
+ public ZoomInAction() {
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, Event.CTRL_MASK, false));
+ putValue(Action.SHORT_DESCRIPTION, "Zoom in");
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/zoomin.gif";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ZoomOutAction extends CallableSystemAction {
+
+ public void performAction() {
+ EditorTopComponent editor = EditorTopComponent.getActive();
+ if (editor != null) {
+ editor.zoomOut();
+ }
+ }
+
+ public ZoomOutAction() {
+
+ putValue(Action.SHORT_DESCRIPTION, "Zoom out");
+ putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, Event.CTRL_MASK, false));
+ }
+
+ public String getName() {
+ return "Zoom out";
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ protected boolean asynchronous() {
+ return false;
+ }
+
+ @Override
+ protected String iconResource() {
+ return "com/sun/hotspot/igv/view/images/zoomout.gif";
+ }
+}
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <folder name="Actions">
+ <folder name="File">
+ <file name="com-sun-hotspot-igv-view-actions-ExportAction.instance">
+ <attr name="position" intvalue="1100"/>
+ </file>
+ </folder>
+ <folder name="View">
+ <file name="com-sun-hotspot-igv-view-actions-NextDiagramAction.instance"><attr name="position" intvalue="2000"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-PrevDiagramAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-ShowAllAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-ExtractAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-HideAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-ZoomInAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-ZoomOutAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-OverviewAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-PredSuccAction.instance"><attr name="position" intvalue="2001"/></file>
+ <file name="com-sun-hotspot-igv-view-actions-EnableBlockLayoutAction.instance"><attr name="position" intvalue="2001"/></file>
+ </folder>
+ </folder>
+ <folder name="Menu">
+ <folder name="View">
+ <file name="com-sun-hotspot-igv-view-actions-PrevDiagramAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-PrevDiagramAction.instance"/>
+ </file>
+ <file name="com-sun-hotspot-igv-view-actions-NextDiagramAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-NextDiagramAction.instance"/>
+ </file>
+ <file name="com-sun-hotspot-igv-view-actions-ShowAllAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ShowAllAction.instance"/>
+ </file>
+ <file name="com-sun-hotspot-igv-view-actions-ExtractAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ExtractAction.instance"/>
+ </file>
+ <file name="com-sun-hotspot-igv-view-actions-HideAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-HideAction.instance"/>
+ </file>
+ <file name="com-sun-hotspot-igv-view-actions-ZoomInAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ZoomInAction.instance"/>
+ </file>
+ <file name="com-sun-hotspot-igv-view-actions-ZoomOutAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ZoomOutAction.instance"/>
+ </file>
+ </folder>
+ <folder name="File">
+ <file name="com-sun-hotspot-igv-view-actions-ExportAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-view-actions-ExportAction.instance"/>
+ <attr name="position" intvalue="600"/>
+ </file>
+ </folder>
+ </folder>
+ <folder name="Toolbars">
+ <folder name="Edit">
+ <attr name="com-sun-hotspot-igv-view-actions-LineGeneratorAction.shadow/com-sun-hotspot-igv-coordinator-actions-OpenGraphAction.shadow" boolvalue="true"/>
+ </folder>
+ </folder>
+</filesystem>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.graph.Diagram;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Rectangle2D;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockWidget extends Widget {
+
+ public static final int BORDER = 20;
+ public static final Color BACKGROUND_COLOR = new Color(235, 235, 255);
+ private static final Font titleFont = new Font("Serif", Font.PLAIN, 14).deriveFont(Font.BOLD);
+ private InputBlock blockNode;
+ private Diagram diagram;
+
+ public BlockWidget(Scene scene, Diagram d, InputBlock blockNode) {
+ super(scene);
+ this.blockNode = blockNode;
+ this.diagram = d;
+ this.setBackground(BACKGROUND_COLOR);
+ this.setOpaque(true);
+ this.setCheckClipping(true);
+ }
+
+ @Override
+ protected void paintWidget() {
+ super.paintWidget();
+ Graphics2D g = this.getGraphics();
+ Stroke old = g.getStroke();
+ g.setColor(Color.BLUE);
+ Rectangle r = new Rectangle(this.getPreferredBounds());
+ r.width--;
+ r.height--;
+ if (this.getBounds().width > 0 && this.getBounds().height > 0) {
+ g.setStroke(new BasicStroke(2));
+ g.drawRect(r.x, r.y, r.width, r.height);
+ }
+
+ Color titleColor = Color.BLACK;
+ g.setColor(titleColor);
+ g.setFont(titleFont);
+
+ String s = "B" + blockNode.toString();
+ Rectangle2D r1 = g.getFontMetrics().getStringBounds(s, g);
+ g.drawString(s, r.x + 5, r.y + (int) r1.getHeight());
+ g.setStroke(old);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,251 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.util.ArrayList;
+import java.util.List;
+import org.netbeans.api.visual.anchor.AnchorShape;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.netbeans.api.visual.widget.Scene;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramConnectionWidget extends ConnectionWidget {
+
+ private static Stroke DASHED_STROKE = new BasicStroke(
+ 1,
+ BasicStroke.CAP_BUTT,
+ BasicStroke.JOIN_ROUND,
+ 0,
+ new float[]{2},
+ 0);
+ private static Stroke NORMAL_STROKE = new BasicStroke(1);
+ private static Stroke BOLD_STROKE = new BasicStroke(3);
+ public static int WHITE_FACTOR = 5;
+ private Connection connection;
+ private Color color;
+ private Point lastSourceAnchor;
+ private Point lastTargetAnchor;
+ private List<Point> controlPoints;
+ private Rectangle clientArea;
+ private boolean split;
+ private int[] xPoints;
+ private int[] yPoints;
+ private int pointCount;
+
+ /** Creates a new instance of ConnectionWidget */
+ public DiagramConnectionWidget(Connection connection, Scene scene) {
+ super(scene);
+ this.connection = connection;
+ color = connection.getColor();
+ if (connection.getStyle() == Connection.ConnectionStyle.DASHED) {
+ this.setStroke(DASHED_STROKE);
+ } else if (connection.getStyle() == Connection.ConnectionStyle.BOLD) {
+ this.setStroke(BOLD_STROKE);
+ } else {
+ this.setStroke(NORMAL_STROKE);
+ }
+ this.setCheckClipping(true);
+ clientArea = new Rectangle();
+ updateControlPoints();
+ }
+
+ public Connection getConnection() {
+ return connection;
+ }
+
+ public void updateControlPoints() {
+ List<Point> newControlPoints = connection.getControlPoints();
+ Connection c = connection;
+ Figure f = c.getInputSlot().getFigure();
+ Point p = new Point(f.getPosition());
+ p.translate(c.getInputSlot().getRelativePosition().x, f.getSize().height / 2);
+ Point p4 = new Point(f.getPosition());
+ p4.translate(c.getInputSlot().getRelativePosition().x, c.getInputSlot().getRelativePosition().y);
+
+ Figure f2 = c.getOutputSlot().getFigure();
+ Point p2 = new Point(f2.getPosition());
+ p2.translate(c.getOutputSlot().getRelativePosition().x, f2.getSize().height / 2);
+ Point p3 = new Point(f2.getPosition());
+ p3.translate(c.getOutputSlot().getRelativePosition().x, c.getOutputSlot().getRelativePosition().y);
+
+ /*if(controlPoints.size() >= 2) {
+ String className = Preferences.userNodeForPackage(PreferenceConstants.class).get(PreferenceConstants.KEY_LINE_GENERATOR, PreferenceConstants.DEFAULT_LINE_GENERATOR);
+ try {
+ LineGenerator lg = (LineGenerator)Class.forName(className).newInstance();
+ controlPoints = lg.createLine(controlPoints, p2, p);
+ } catch (InstantiationException ex) {
+ } catch (IllegalAccessException ex) {
+ } catch (ClassNotFoundException ex) {
+ }
+ }*/
+
+ this.controlPoints = newControlPoints;
+ pointCount = newControlPoints.size();
+ xPoints = new int[pointCount];
+ yPoints = new int[pointCount];
+ int minX = Integer.MAX_VALUE;
+ int maxX = Integer.MIN_VALUE;
+ int minY = Integer.MAX_VALUE;
+ int maxY = Integer.MIN_VALUE;
+ split = false;
+ for (int i = 0; i < pointCount; i++) {
+ if (newControlPoints.get(i) == null) {
+ split = true;
+ } else {
+ int curX = newControlPoints.get(i).x;
+ int curY = newControlPoints.get(i).y;
+ this.xPoints[i] = curX;
+ this.yPoints[i] = curY;
+ minX = Math.min(minX, curX);
+ maxX = Math.max(maxX, curX);
+ minY = Math.min(minY, curY);
+ maxY = Math.max(maxY, curY);
+ }
+ }
+
+ this.clientArea = new Rectangle(minX, minY, maxX - minX, maxY - minY);
+ }
+
+ @Override
+ protected void paintWidget() {
+ Graphics2D g = this.getGraphics();
+
+ if (xPoints.length == 0 || Math.abs(xPoints[0] - xPoints[xPoints.length - 1]) > 2000) {
+ return;
+ }
+
+ //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ //g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
+ //g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+
+ DiagramScene ds = (DiagramScene) this.getScene();
+ boolean shouldHide = false;//ds.getShouldHide(this);
+
+ Composite oldComposite = null;
+ if (shouldHide) {
+ Color c = new Color(255 - (255 - color.getRed()) / WHITE_FACTOR, 255 - (255 - color.getGreen()) / WHITE_FACTOR, 255 - (255 - color.getBlue()) / WHITE_FACTOR);
+ g.setPaint(c);
+ } else {
+ g.setPaint(color);
+ }
+
+ if (split) {
+ for (int i = 1; i < controlPoints.size(); i++) {
+ Point prev = controlPoints.get(i - 1);
+ Point cur = controlPoints.get(i);
+ if (cur == null || prev == null) {
+ continue;
+ }
+
+ g.drawLine(prev.x, prev.y, cur.x, cur.y);
+ }
+ } else {
+ g.drawPolyline(xPoints, yPoints, pointCount);
+ }
+
+ /*for(int i=0; i<xPoints.length; i++) {
+ int x = xPoints[i];
+ int y = yPoints[i];
+ g.fillOval(x - 2, y - 2, 4, 4);
+ }*/
+
+ if (xPoints.length >= 2) {
+ Graphics2D g2 = (Graphics2D) g.create();
+ int xOff = xPoints[xPoints.length - 2] - xPoints[xPoints.length - 1];
+ int yOff = yPoints[yPoints.length - 2] - yPoints[yPoints.length - 1];
+ if (xOff == 0 && yOff == 0 && yPoints.length >= 3) {
+ xOff = xPoints[xPoints.length - 3] - xPoints[xPoints.length - 1];
+ yOff = yPoints[yPoints.length - 3] - yPoints[yPoints.length - 1];
+ }
+ g2.translate(xPoints[xPoints.length - 1], yPoints[yPoints.length - 1]);
+ g2.rotate(Math.atan2(yOff, xOff));
+
+ g2.scale(0.55, 0.80);
+ AnchorShape.TRIANGLE_FILLED.paint(g2, false);
+ }
+ }
+
+ @Override
+ public void notifyStateChanged(ObjectState previousState, ObjectState state) {
+
+ if (previousState.isHovered() != state.isHovered()) {
+ color = connection.getColor();
+ if (state.isHovered()) {
+ this.setStroke(BOLD_STROKE);
+ } else {
+ this.setStroke(NORMAL_STROKE);
+ }
+
+ if (state.isHovered()) {
+ this.setStroke(BOLD_STROKE);
+ } else {
+ this.setStroke(NORMAL_STROKE);
+ }
+
+ repaint();
+ }
+ super.notifyStateChanged(previousState, state);
+ }
+
+ @Override
+ public List<Point> getControlPoints() {
+ if (split) {
+ ArrayList<Point> result = new ArrayList<Point>();
+ for (Point p : controlPoints) {
+ if (p != null) {
+ result.add(p);
+ }
+ }
+ return result;
+ } else {
+ return controlPoints;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "ConnectionWidget[" + connection + "]";
+ }
+
+ @Override
+ protected Rectangle calculateClientArea() {
+ Rectangle result = new Rectangle(clientArea);
+ result.grow(10, 10);
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,358 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.DiagramScene;
+import com.sun.hotspot.igv.view.SlotLayout;
+import com.sun.hotspot.igv.util.DoubleClickHandler;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.LabelWidget;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FigureWidget extends Widget implements Properties.Provider, PopupMenuProvider, DoubleClickHandler {
+
+ public static final boolean VERTICAL_LAYOUT = true;
+ public static final int DEPTH = 5;
+ public static final int MAX_STRING_LENGTH = 20;
+ private static final double LABEL_ZOOM_FACTOR = 0.3;
+ private static final double ZOOM_FACTOR = 0.1;
+ private Font font;
+ private Font boldFont;
+ private Figure figure;
+ private Widget leftWidget;
+ private Widget rightWidget;
+ private Widget middleWidget;
+ private ArrayList<LabelWidget> labelWidgets;
+ private DiagramScene diagramScene;
+ private boolean boundary;
+ private Node node;
+
+ public void setBoundary(boolean b) {
+ boundary = b;
+ }
+
+ public boolean isBoundary() {
+ return boundary;
+ }
+
+ public Node getNode() {
+ return node;
+ }
+
+ private String shortenString(String string) {
+ if (string.length() > MAX_STRING_LENGTH) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < string.length(); i++) {
+ char c = string.charAt(i);
+ if (!Character.isLetter(c) || Character.isUpperCase(c)) {
+ sb.append(c);
+ }
+ }
+ string = sb.toString();
+ }
+ return string;
+ }
+
+ public FigureWidget(final Figure f, DiagramScene s, Widget parent) {
+
+ super(s);
+
+
+ font = f.getDiagram().getFont();
+ boldFont = f.getDiagram().getFont().deriveFont(Font.BOLD);
+ this.setCheckClipping(true);
+ this.diagramScene = s;
+
+ parent.addChild(this);
+ this.figure = f;
+ this.resolveBounds(null, calculateClientArea());
+
+ leftWidget = new Widget(s);
+ this.addChild(leftWidget);
+ leftWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Right, VERTICAL_LAYOUT));//LayoutFactory.createVerticalFlowLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0));
+
+ middleWidget = new Widget(s);
+ this.addChild(middleWidget);
+
+ if (VERTICAL_LAYOUT) {
+ this.setLayout(LayoutFactory.createVerticalFlowLayout());
+ } else {
+ this.setLayout(LayoutFactory.createHorizontalFlowLayout());
+ }
+
+ middleWidget.setLayout(LayoutFactory.createVerticalFlowLayout());
+
+ middleWidget.setBackground(f.getColor());
+ middleWidget.setOpaque(true);
+ assert this.getScene() != null;
+ assert this.getScene().getView() != null;
+ middleWidget.setBorder(BorderFactory.createLineBorder(Color.BLACK));
+
+
+ labelWidgets = new ArrayList<LabelWidget>();
+
+ String[] strings = figure.getLines();
+
+ for (String cur : strings) {
+
+ String displayString = cur;
+
+ LabelWidget lw = new LabelWidget(s);
+ labelWidgets.add(lw);
+ middleWidget.addChild(lw);
+ lw.setLabel(displayString);
+
+ lw.setFont(font);
+ lw.setForeground(Color.BLACK);
+ lw.setAlignment(LabelWidget.Alignment.CENTER);
+ lw.setVerticalAlignment(LabelWidget.VerticalAlignment.CENTER);
+ lw.setMaximumSize(new Dimension(f.getWidth(), 20000));
+ lw.setMinimumSize(new Dimension(f.getWidth(), 20));
+ }
+
+ rightWidget = new Widget(s);
+ this.addChild(rightWidget);
+ rightWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Left, VERTICAL_LAYOUT));//LayoutFactory.createVerticalLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0));
+
+ // Initialize node for property sheet
+ node = new AbstractNode(Children.LEAF) {
+
+ @Override
+ protected Sheet createSheet() {
+ Sheet s = super.createSheet();
+ PropertiesSheet.initializeSheet(f.getProperties(), s);
+ return s;
+ }
+ };
+ node.setDisplayName(getName());
+ }
+ private boolean firstTime = true;
+
+ @Override
+ protected void paintWidget() {
+ if (firstTime) {
+ firstTime = false;
+ for (LabelWidget w : labelWidgets) {
+ String cur = w.getLabel();
+ Graphics graphics = this.getGraphics();
+ if (graphics.getFontMetrics().stringWidth(cur) > figure.getWidth()) {
+ w.setLabel(shortenString(cur));
+ }
+ }
+ }
+ super.paintWidget();
+ }
+
+ public Widget getLeftWidget() {
+ return leftWidget;
+ }
+
+ public Widget getRightWidget() {
+ return rightWidget;
+ }
+
+ @Override
+ protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+ super.notifyStateChanged(previousState, state);
+
+ Color borderColor = Color.BLACK;
+ int thickness = 1;
+ boolean repaint = false;
+ Font f = font;
+ if (state.isSelected()) {
+ thickness = 1;
+ f = boldFont;
+ }
+
+ if (state.isHovered()) {
+ borderColor = Color.BLUE;
+ }
+
+ if (state.isHovered() != previousState.isHovered()) {
+ repaint = true;
+ }
+
+ if (state.isSelected() != previousState.isSelected()) {
+ repaint = true;
+ }
+
+ if (repaint) {
+ middleWidget.setBorder(BorderFactory.createLineBorder(borderColor, thickness));
+ for (LabelWidget labelWidget : labelWidgets) {
+ labelWidget.setFont(f);
+ }
+ repaint();
+ }
+ }
+
+ public String getName() {
+ return getProperties().get("name");
+ }
+
+ public Properties getProperties() {
+ return figure.getProperties();
+ }
+
+ public Figure getFigure() {
+ return figure;
+ }
+
+ @Override
+ protected void paintChildren() {
+
+ if (diagramScene.getRealZoomFactor() < ZOOM_FACTOR && diagramScene.getModel().getShowBlocks()) {
+ return;
+ }
+
+ Composite oldComposite = null;
+ if (boundary) {
+ oldComposite = getScene().getGraphics().getComposite();
+ float alpha = DiagramScene.ALPHA;
+ this.getScene().getGraphics().setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
+ }
+
+ if (diagramScene.getRealZoomFactor() < LABEL_ZOOM_FACTOR) {
+
+ for (LabelWidget labelWidget : labelWidgets) {
+ labelWidget.setVisible(false);
+ }
+ super.paintChildren();
+ for (LabelWidget labelWidget : labelWidgets) {
+ labelWidget.setVisible(true);
+ }
+
+ } else {
+ super.paintChildren();
+ }
+
+ if (boundary) {
+ getScene().getGraphics().setComposite(oldComposite);
+ }
+ }
+
+ public JPopupMenu getPopupMenu(Widget widget, Point point) {
+ JPopupMenu m = diagramScene.createPopupMenu();
+
+ JMenu predecessors = new JMenu("Predecessors");
+ addFigureToSubMenu(predecessors, getFigure(), false, DEPTH);
+
+ JMenu successors = new JMenu("Successors");
+ addFigureToSubMenu(successors, getFigure(), true, DEPTH);
+
+ m.addSeparator();
+ m.add(predecessors);
+ m.add(successors);
+ return m;
+ }
+
+ public void addFigureToSubMenu(JMenu subMenu, final Figure f, boolean successor, int depth) {
+ Set<Figure> set = f.getPredecessorSet();
+ if (successor) {
+ set = f.getSuccessorSet();
+ }
+
+ int count = set.size();
+ if (set.contains(f)) {
+ count--;
+ }
+
+ for (Figure f2 : set) {
+ if (f2 == f) {
+ continue;
+ }
+
+ count--;
+ addFigureToMenu(subMenu, f2, successor, depth - 1);
+ if (count > 0) {
+ subMenu.addSeparator();
+ }
+ }
+ }
+
+ public void addFigureToMenu(JMenu m, final Figure f, boolean successor, int depth) {
+
+ Action a = diagramScene.createGotoAction(f);
+
+
+ m.add(a);
+
+ if (depth > 0) {
+ String name = "Predecessors";
+ if (successor) {
+ name = "Successors";
+ }
+
+ JMenu subMenu = new JMenu(name);
+ addFigureToSubMenu(subMenu, f, successor, depth);
+ m.add(subMenu);
+ }
+
+ }
+
+ public void handleDoubleClick(Widget w, WidgetAction.WidgetMouseEvent e) {
+
+ if (diagramScene.isAllVisible()) {
+ Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getGraphToView().getGroup().getAllNodes());
+ hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet());
+ this.diagramScene.showNot(hiddenNodes);
+ } else if (isBoundary()) {
+
+ Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getHiddenNodes());
+ hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet());
+ this.diagramScene.showNot(hiddenNodes);
+ } else {
+ Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getHiddenNodes());
+ hiddenNodes.addAll(this.getFigure().getSource().getSourceNodesAsSet());
+ this.diagramScene.showNot(hiddenNodes);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.Point;
+import java.util.List;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputSlotWidget extends SlotWidget {
+
+ private InputSlot inputSlot;
+
+ public InputSlotWidget(InputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+ super(slot, scene, parent, fw);
+ inputSlot = slot;
+ init();
+ getFigureWidget().getLeftWidget().addChild(this);
+ }
+
+ public InputSlot getInputSlot() {
+ return inputSlot;
+ }
+
+ protected Point calculateRelativeLocation() {
+ if (getFigureWidget().getBounds() == null) {
+ return new Point(0, 0);
+ }
+
+ double x = 0;
+ List<InputSlot> slots = inputSlot.getFigure().getInputSlots();
+ assert slots.contains(inputSlot);
+ return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(inputSlot))));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,293 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class LineWidget extends Widget implements PopupMenuProvider {
+
+ public final int BORDER = 8;
+ public final int ARROW_SIZE = 6;
+ public final int BOLD_ARROW_SIZE = 7;
+ public final int HOVER_ARROW_SIZE = 8;
+ public final int BOLD_STROKE_WIDTH = 2;
+ public final int HOVER_STROKE_WIDTH = 3;
+ private static double ZOOM_FACTOR = 0.1;
+ private OutputSlot outputSlot;
+ private DiagramScene scene;
+ private List<Connection> connections;
+ private Point from;
+ private Point to;
+ private Rectangle clientArea;
+ private Color color = Color.BLACK;
+ private LineWidget predecessor;
+ private List<LineWidget> successors;
+ private boolean highlighted;
+ private boolean popupVisible;
+ private boolean isBold;
+ private boolean isDashed;
+
+ public LineWidget(DiagramScene scene, OutputSlot s, List<Connection> connections, Point from, Point to, LineWidget predecessor, SceneAnimator animator, boolean isBold, boolean isDashed) {
+ super(scene);
+ this.scene = scene;
+ this.outputSlot = s;
+ this.connections = connections;
+ this.from = from;
+ this.to = to;
+ this.predecessor = predecessor;
+ this.successors = new ArrayList<LineWidget>();
+ if (predecessor != null) {
+ predecessor.addSuccessor(this);
+ }
+
+ this.isBold = isBold;
+ this.isDashed = isDashed;
+
+ int minX = from.x;
+ int minY = from.y;
+ int maxX = to.x;
+ int maxY = to.y;
+ if (minX > maxX) {
+ int tmp = minX;
+ minX = maxX;
+ maxX = tmp;
+ }
+
+ if (minY > maxY) {
+ int tmp = minY;
+ minY = maxY;
+ maxY = tmp;
+ }
+
+ clientArea = new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1);
+ clientArea.grow(BORDER, BORDER);
+
+ if (connections.size() > 0) {
+ color = connections.get(0).getColor();
+ }
+
+ this.setCheckClipping(true);
+
+ this.getActions().addAction(ActionFactory.createPopupMenuAction(this));
+ if (animator == null) {
+ this.setBackground(color);
+ } else {
+ this.setBackground(Color.WHITE);
+ animator.animateBackgroundColor(this, color);
+ }
+ }
+
+ public Point getFrom() {
+ return from;
+ }
+
+ public Point getTo() {
+ return to;
+ }
+
+ private void addSuccessor(LineWidget widget) {
+ this.successors.add(widget);
+ }
+
+ @Override
+ protected Rectangle calculateClientArea() {
+ return clientArea;
+ }
+
+ @Override
+ protected void paintWidget() {
+ if (scene.getRealZoomFactor() < ZOOM_FACTOR) {
+ return;
+ }
+
+ Graphics2D g = getScene().getGraphics();
+ g.setPaint(this.getBackground());
+ ObjectState state = this.getState();
+ float width = 1.0f;
+
+ if (isBold) {
+ width = BOLD_STROKE_WIDTH;
+ }
+
+ if (highlighted || popupVisible) {
+ width = HOVER_STROKE_WIDTH;
+ }
+
+ Stroke oldStroke = g.getStroke();
+ if (isDashed) {
+ float[] dashPattern = {5, 5, 5, 5};
+ g.setStroke(new BasicStroke(width, BasicStroke.CAP_BUTT,
+ BasicStroke.JOIN_MITER, 10,
+ dashPattern, 0));
+ } else {
+ g.setStroke(new BasicStroke(width));
+ }
+
+ g.drawLine(from.x, from.y, to.x, to.y);
+
+ boolean sameFrom = false;
+ boolean sameTo = successors.size() == 0;
+ for (LineWidget w : successors) {
+ if (w.getFrom().equals(getTo())) {
+ sameTo = true;
+ }
+ }
+
+ if (predecessor == null || predecessor.getTo().equals(getFrom())) {
+ sameFrom = true;
+ }
+
+
+ int size = ARROW_SIZE;
+ if (isBold) {
+ size = BOLD_ARROW_SIZE;
+ }
+ if (highlighted || popupVisible) {
+ size = HOVER_ARROW_SIZE;
+ }
+ if (!sameFrom) {
+ g.fillPolygon(
+ new int[]{from.x - size / 2, from.x + size / 2, from.x},
+ new int[]{from.y - size / 2, from.y - size / 2, from.y + size / 2},
+ 3);
+ }
+ if (!sameTo) {
+ g.fillPolygon(
+ new int[]{to.x - size / 2, to.x + size / 2, to.x},
+ new int[]{to.y - size / 2, to.y - size / 2, to.y + size / 2},
+ 3);
+ }
+ g.setStroke(oldStroke);
+ }
+
+ private void setHighlighted(boolean b) {
+ this.highlighted = b;
+ this.revalidate(true);
+ }
+
+ private void setPopupVisible(boolean b) {
+ this.popupVisible = b;
+ this.revalidate(true);
+ }
+
+ @Override
+ public boolean isHitAt(Point localPoint) {
+ return Line2D.ptLineDistSq(from.x, from.y, to.x, to.y, localPoint.x, localPoint.y) <= BORDER * BORDER;
+ }
+
+ @Override
+ protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+ if (previousState.isHovered() != state.isHovered()) {
+ setRecursiveHighlighted(state.isHovered());
+ }
+ }
+
+ private void setRecursiveHighlighted(boolean b) {
+ LineWidget cur = predecessor;
+ while (cur != null) {
+ cur.setHighlighted(b);
+ cur = cur.predecessor;
+ }
+
+ highlightSuccessors(b);
+ this.setHighlighted(b);
+ }
+
+ private void highlightSuccessors(boolean b) {
+ for (LineWidget s : successors) {
+ s.setHighlighted(b);
+ s.highlightSuccessors(b);
+ }
+ }
+
+ private void setRecursivePopupVisible(boolean b) {
+ LineWidget cur = predecessor;
+ while (cur != null) {
+ cur.setPopupVisible(b);
+ cur = cur.predecessor;
+ }
+
+ popupVisibleSuccessors(b);
+ setPopupVisible(b);
+ }
+
+ private void popupVisibleSuccessors(boolean b) {
+ for (LineWidget s : successors) {
+ s.setPopupVisible(b);
+ s.popupVisibleSuccessors(b);
+ }
+ }
+
+ public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+ JPopupMenu menu = new JPopupMenu();
+ menu.add(scene.createGotoAction(outputSlot.getFigure()));
+ menu.addSeparator();
+
+ for (Connection c : connections) {
+ InputSlot s = c.getInputSlot();
+ menu.add(scene.createGotoAction(s.getFigure()));
+ }
+
+ final LineWidget w = this;
+ menu.addPopupMenuListener(new PopupMenuListener() {
+
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ w.setRecursivePopupVisible(true);
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+ w.setRecursivePopupVisible(false);
+ }
+
+ public void popupMenuCanceled(PopupMenuEvent e) {
+ }
+ });
+
+ return menu;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,281 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MultiConnectionWidget extends Widget implements PopupMenuProvider {
+
+ public final int BORDER = 4;
+ public final int HOVER_STROKE_WIDTH = 3;
+
+ private static class Route {
+
+ public Point from;
+ public Point to;
+ public SortedSet<InputSlot> inputSlots;
+ public boolean decorateStart;
+ public boolean decorateEnd;
+
+ public Route(Point from, Point to) {
+ assert from != null;
+ assert to != null;
+ this.from = from;
+ this.to = to;
+ this.inputSlots = new TreeSet<InputSlot>();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+
+ if (obj instanceof Route) {
+ Route r = (Route) obj;
+ return r.from.equals(from) && r.to.equals(to);
+ }
+
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return ((((from.x * 1711) + from.y) * 1711 + to.x) * 1711 + to.y);
+ }
+ }
+ private Rectangle clientArea;
+ private OutputSlot outputSlot;
+ private Map<Route, SortedSet<InputSlot>> routeMap;
+ private List<Route> routeList;
+ private Color color;
+ private DiagramScene diagramScene;
+ private boolean popupVisible;
+
+ /** Creates a new instance of MultiConnectionWidget */
+ public MultiConnectionWidget(OutputSlot outputSlot, DiagramScene scene) {
+ super(scene);
+
+ this.diagramScene = scene;
+ this.outputSlot = outputSlot;
+ this.setCheckClipping(true);
+
+ routeMap = new HashMap<Route, SortedSet<InputSlot>>();
+ routeList = new ArrayList<Route>();
+ color = Color.BLACK;
+
+ for (Connection c : outputSlot.getConnections()) {
+ List<Point> controlPoints = c.getControlPoints();
+ InputSlot inputSlot = (InputSlot) c.getTo();
+ color = c.getColor();
+
+ for (int i = 1; i < controlPoints.size(); i++) {
+ Point prev = controlPoints.get(i - 1);
+ Point cur = controlPoints.get(i);
+
+ if (prev != null && cur != null) {
+ Route r = new Route(prev, cur);
+ if (routeMap.containsKey(r)) {
+ SortedSet<InputSlot> set = routeMap.get(r);
+ set.add(inputSlot);
+ } else {
+ SortedSet<InputSlot> set = new TreeSet<InputSlot>(Slot.slotFigureComparator);
+ set.add(inputSlot);
+ routeMap.put(r, set);
+ routeList.add(r);
+ }
+ }
+ }
+ }
+
+ if (routeList.size() == 0) {
+ clientArea = new Rectangle();
+ } else {
+ for (Route r : routeList) {
+
+ int x = r.from.x;
+ int y = r.from.y;
+
+ int x2 = r.to.x;
+ int y2 = r.to.y;
+
+ if (x > x2) {
+ int tmp = x;
+ x = x2;
+ x2 = tmp;
+ }
+
+ if (y > y2) {
+ int tmp = y;
+ y = y2;
+ y2 = tmp;
+ }
+
+ int width = x2 - x + 1;
+ int height = y2 - y + 1;
+
+ Rectangle rect = new Rectangle(x, y, width, height);
+ if (clientArea == null) {
+ clientArea = rect;
+ } else {
+ clientArea = clientArea.union(rect);
+ }
+ }
+
+ clientArea.grow(BORDER, BORDER);
+ }
+ }
+
+ private void setHoverPosition(Point location) {
+ Route r = getNearest(location);
+ }
+
+ private Route getNearest(Point localLocation) {
+
+ double minDist = Double.MAX_VALUE;
+ Route result = null;
+ for (Route r : routeList) {
+ double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y);
+ if (dist < minDist) {
+ result = r;
+ minDist = dist;
+ }
+ }
+
+ assert result != null;
+
+ return result;
+ }
+
+ @Override
+ public boolean isHitAt(Point localLocation) {
+ if (!super.isHitAt(localLocation)) {
+ return false;
+ }
+
+ for (Route r : routeList) {
+ double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y);
+ if (dist < BORDER * BORDER) {
+ setHoverPosition(localLocation);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ protected Rectangle calculateClientArea() {
+ return clientArea;
+ }
+
+ @Override
+ protected void paintWidget() {
+ Graphics2D g = getScene().getGraphics();
+ //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ g.setColor(this.color);
+ ObjectState state = this.getState();
+ float width = 1.0f;
+ if (state.isHovered() || this.popupVisible) {
+ width = HOVER_STROKE_WIDTH;
+ }
+
+ Stroke oldStroke = g.getStroke();
+ g.setStroke(new BasicStroke(width));
+ for (Route r : routeList) {
+ g.drawLine(r.from.x, r.from.y, r.to.x, r.to.y);
+ }
+ g.setStroke(oldStroke);
+ }
+
+ @Override
+ protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+
+ boolean repaint = false;
+
+ if (state.isHovered() != previousState.isHovered()) {
+ repaint = true;
+ }
+
+ repaint();
+ }
+
+ public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+ JPopupMenu menu = new JPopupMenu();
+ Route r = getNearest(localLocation);
+ assert r != null;
+ assert routeMap.containsKey(r);
+
+ menu.add(diagramScene.createGotoAction(outputSlot.getFigure()));
+ menu.addSeparator();
+
+ SortedSet<InputSlot> set = this.routeMap.get(r);
+ for (InputSlot s : set) {
+ menu.add(diagramScene.createGotoAction(s.getFigure()));
+ }
+
+ final MultiConnectionWidget w = this;
+ menu.addPopupMenuListener(new PopupMenuListener() {
+
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ w.popupVisible = true;
+ w.repaint();
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+ w.popupVisible = false;
+ w.repaint();
+ }
+
+ public void popupMenuCanceled(PopupMenuEvent e) {
+ }
+ });
+
+ return menu;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.Point;
+import java.util.List;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutputSlotWidget extends SlotWidget {
+
+ private OutputSlot outputSlot;
+
+ public OutputSlotWidget(OutputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+ super(slot, scene, parent, fw);
+ outputSlot = slot;
+ init();
+ getFigureWidget().getRightWidget().addChild(this);
+ }
+
+ public OutputSlot getOutputSlot() {
+ return outputSlot;
+ }
+
+ protected Point calculateRelativeLocation() {
+ if (getFigureWidget().getBounds() == null) {
+ return new Point(0, 0);
+ }
+
+ double x = this.getFigureWidget().getBounds().width;
+ List<OutputSlot> slots = outputSlot.getFigure().getOutputSlots();
+ assert slots.contains(outputSlot);
+ return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(outputSlot))));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,126 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.view.*;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class SlotWidget extends Widget {
+
+ private Slot slot;
+ private FigureWidget figureWidget;
+ private Image bufferImage;
+ private static double TEXT_ZOOM_FACTOR = 0.9;
+ private static double ZOOM_FACTOR = 0.6;
+ private DiagramScene scene;
+
+ public SlotWidget(Slot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+ super(scene);
+ this.scene = scene;
+ this.slot = slot;
+ figureWidget = fw;
+ this.setToolTipText("<HTML>" + slot.getName() + "</HTML>");
+ this.setCheckClipping(true);
+ }
+
+ public Point getAnchorPosition() {
+ Point p = new Point(figureWidget.getFigure().getPosition());
+ Point p2 = slot.getRelativePosition();
+ p.translate(p2.x, p2.y);
+ return p;
+ }
+
+ protected void init() {
+
+ Point p = calculateRelativeLocation();
+ Rectangle r = calculateClientArea();
+ p = new Point(p.x, p.y - r.height / 2);
+ this.setPreferredLocation(p);
+ }
+
+ public Slot getSlot() {
+ return slot;
+ }
+
+ public FigureWidget getFigureWidget() {
+ return figureWidget;
+ }
+
+ @Override
+ protected void paintWidget() {
+
+ if (scene.getRealZoomFactor() < ZOOM_FACTOR) {
+ return;
+ }
+
+ if (bufferImage == null) {
+ Graphics2D g = this.getGraphics();
+ g.setColor(Color.DARK_GRAY);
+ int w = this.getBounds().width;
+ int h = this.getBounds().height;
+
+ if (getSlot().getShortName() != null && getSlot().getShortName().length() > 0 && scene.getRealZoomFactor() >= TEXT_ZOOM_FACTOR) {
+ Font f = new Font("Arial", Font.PLAIN, 8);
+ g.setFont(f.deriveFont(7.5f));
+ Rectangle2D r1 = g.getFontMetrics().getStringBounds(getSlot().getShortName(), g);
+ g.drawString(getSlot().getShortName(), (int) (this.getBounds().width - r1.getWidth()) / 2, (int) (this.getBounds().height + r1.getHeight()) / 2);
+ } else {
+
+ if (slot instanceof OutputSlot) {
+ g.fillArc(w / 4, -h / 4 - 1, w / 2, h / 2, 180, 180);
+ } else {
+ g.fillArc(w / 4, 3 * h / 4, w / 2, h / 2, 0, 180);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected Rectangle calculateClientArea() {
+ return new Rectangle(0, 0, Figure.SLOT_WIDTH, Figure.SLOT_WIDTH);
+ }
+
+ protected abstract Point calculateRelativeLocation();
+
+ protected double calculateRelativeY(int size, int index) {
+ assert index >= 0 && index < size;
+ assert size > 0;
+ double height = getFigureWidget().getBounds().getHeight();
+ return height * (index + 1) / (size + 1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,7 @@
+currentVersion=IdealGraphVisualizer {0}
+LBL_splash_window_title=Starting IdealGraphVisualizer
+SPLASH_WIDTH=475
+SplashProgressBarBounds=0,268,473,6
+SplashProgressBarColor=0xFFFFFF
+SplashRunningTextBounds=269,253,205,12
+SplashRunningTextColor=0xFFFFFF
Binary file hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,2 @@
+CTL_MainWindow_Title=IdealGraphVisualizer {0}
+CTL_MainWindow_Title_No_Project=IdealGraphVisualizer {0}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/build.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="IdealGraphVisualizer" basedir=".">
+ <description>Builds the module suite IdealGraphVisualizer.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="IdealGraphVisualizer-impl" basedir=".." xmlns:sproject="http://www.netbeans.org/ns/nb-module-suite-project/1">
+ <property file="nbproject/private/platform-private.properties"/>
+ <property file="nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <sproject:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir"/>
+ <sproject:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir"/>
+ <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+ <condition>
+ <not>
+ <available file="${harness.dir}" type="dir"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/suite.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=72833581
+build.xml.script.CRC32=e9c757c5
+build.xml.stylesheet.CRC32=531c622b
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=72833581
+nbproject/build-impl.xml.script.CRC32=1b6f3648
+nbproject/build-impl.xml.stylesheet.CRC32=196c7090
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+ apisupport1,\
+ harness,\
+ ide8,\
+ java1,\
+ nb6.0,\
+ profiler2
+disabled.modules=\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.core.output2,\
+ org.netbeans.modules.applemenu,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.javahelp,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.options.keymap,\
+ org.netbeans.modules.sendopts,\
+ org.netbeans.modules.templates,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.util.enumerations
+enabled.clusters=\
+ platform7
+nbjdk.active=default
+nbplatform.active=default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,40 @@
+app.icon=branding/core/core.jar/org/netbeans/core/startup/frame48.gif
+app.name=idealgraphvisualizer
+app.title=IdealGraphVisualizer
+branding.token=${app.name}
+modules=\
+ ${project.com.sun.hotspot.igv.graph}:\
+ ${project.com.sun.hotspot.igv.coordinator}:\
+ ${project.com.sun.hotspot.igv.filter}:\
+ ${project.com.sun.hotspot.igv.hierarchicallayout}:\
+ ${project.com.sun.hotspot.igv.layout}:\
+ ${project.com.sun.hotspot.igv.controlflow}:\
+ ${project.com.sun.hotspot.igv.data}:\
+ ${project.com.sun.hotspot.igv.view}:\
+ ${project.com.sun.hotspot.igv.bytecodes}:\
+ ${project.com.sun.hotspot.igv.difference}:\
+ ${project.com.sun.hotspot.igv.settings}:\
+ ${project.com.sun.hotspot.igv.util}:\
+ ${project.com.sun.hotspot.igv.rhino}:\
+ ${project.com.sun.hotspot.igv.svg}:\
+ ${project.com.sun.hotspot.connection}:\
+ ${project.com.sun.hotspot.igv.servercompilerscheduler}:\
+ ${project.com.sun.hotspot.igv.filterwindow}
+project.com.sun.hotspot.connection=NetworkConnection
+project.com.sun.hotspot.igv.bytecodes=Bytecodes
+project.com.sun.hotspot.igv.controlflow=ControlFlow
+project.com.sun.hotspot.igv.coordinator=Coordinator
+project.com.sun.hotspot.igv.data=Data
+project.com.sun.hotspot.igv.difference=Difference
+project.com.sun.hotspot.igv.filter=Filter
+project.com.sun.hotspot.igv.filterwindow=FilterWindow
+project.com.sun.hotspot.igv.graph=Graph
+project.com.sun.hotspot.igv.hierarchicallayout=HierarchicalLayout
+project.com.sun.hotspot.igv.layout=Layout
+project.com.sun.hotspot.igv.rhino=RhinoScriptEngineProxy
+project.com.sun.hotspot.igv.servercompilerscheduler=ServerCompiler
+project.com.sun.hotspot.igv.settings=Settings
+project.com.sun.hotspot.igv.svg=BatikSVGProxy
+project.com.sun.hotspot.igv.view=View
+project.com.sun.hotspot.igv.util=Util
+run.args = -server -J-Xms64m -J-Xmx512m -J-da
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project.suite</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-suite-project/1">
+ <name>IdealGraphVisualizer</name>
+ </data>
+ </configuration>
+</project>
--- a/hotspot/src/share/tools/MakeDeps/Database.java Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/tools/MakeDeps/Database.java Wed Jul 05 16:38:48 2017 +0200
@@ -36,6 +36,7 @@
private FileList outerFiles;
private FileList indivIncludes;
private FileList grandInclude; // the results for the grand include file
+ private HashMap<String,String> platformDepFiles;
private long threshold;
private int nOuterFiles;
private int nPrecompiledFiles;
@@ -57,6 +58,7 @@
outerFiles = new FileList("outerFiles", plat);
indivIncludes = new FileList("IndivIncludes", plat);
grandInclude = new FileList(plat.getGIFileTemplate().nameOfList(), plat);
+ platformDepFiles = new HashMap<String,String>();
threshold = t;
nOuterFiles = 0;
@@ -209,6 +211,10 @@
FileList p = allFiles.listForFile(includer);
p.setPlatformDependentInclude(pdName.dirPreStemSuff());
+ // Record the implicit include of this file so that the
+ // dependencies for precompiled headers can mention it.
+ platformDepFiles.put(newIncluder, includer);
+
// Add an implicit dependency on platform
// specific file for the generic file
@@ -408,6 +414,12 @@
for (Iterator iter = grandInclude.iterator(); iter.hasNext(); ) {
FileList list = (FileList) iter.next();
gd.println(list.getName() + " \\");
+ String platformDep = platformDepFiles.get(list.getName());
+ if (platformDep != null) {
+ // make sure changes to the platform dependent file will
+ // cause regeneration of the pch file.
+ gd.println(platformDep + " \\");
+ }
}
gd.println();
gd.println();
--- a/hotspot/src/share/vm/adlc/adlc.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/adlc/adlc.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -29,11 +29,7 @@
// standard library constants
#include "stdio.h"
#include "stdlib.h"
-#if _MSC_VER >= 1300 // Visual C++ 7.0 or later
#include <iostream>
-#else
-#include <iostream.h>
-#endif
#include "string.h"
#include "ctype.h"
#include "stdarg.h"
--- a/hotspot/src/share/vm/adlc/filebuff.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/adlc/filebuff.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -23,13 +23,9 @@
*/
// FILEBUFF.HPP - Definitions for parser file buffering routines
+#include <iostream>
-#if _MSC_VER >= 1300 // Visual C++ 7.0 or later
-#include <iostream>
-#else
-#include <iostream.h>
-#endif
-
+using namespace std;
// STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES
typedef struct {
const char *_name;
--- a/hotspot/src/share/vm/adlc/formssel.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/adlc/formssel.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -729,6 +729,7 @@
!strcmp(_matrule->_rChild->_opType,"DecodeN") ||
!strcmp(_matrule->_rChild->_opType,"EncodeP") ||
!strcmp(_matrule->_rChild->_opType,"LoadN") ||
+ !strcmp(_matrule->_rChild->_opType,"LoadNKlass") ||
!strcmp(_matrule->_rChild->_opType,"CreateEx") || // type of exception
!strcmp(_matrule->_rChild->_opType,"CheckCastPP")) ) return true;
else if ( is_ideal_load() == Form::idealP ) return true;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -1004,6 +1004,9 @@
DEBUG_ONLY(mark_bitmap()->verify_clear();)
DEBUG_ONLY(summary_data().verify_clear();)
+
+ // Have worker threads release resources the next time they run a task.
+ gc_task_manager()->release_all_resources();
}
void PSParallelCompact::post_compact()
@@ -1949,12 +1952,6 @@
TimeStamp compaction_start;
TimeStamp collection_exit;
- // "serial_CM" is needed until the parallel implementation
- // of the move and update is done.
- ParCompactionManager* serial_CM = new ParCompactionManager();
- // Don't initialize more than once.
- // serial_CM->initialize(&summary_data(), mark_bitmap());
-
ParallelScavengeHeap* heap = gc_heap();
GCCause::Cause gc_cause = heap->gc_cause();
PSYoungGen* young_gen = heap->young_gen();
@@ -1969,6 +1966,10 @@
PreGCValues pre_gc_values;
pre_compact(&pre_gc_values);
+ // Get the compaction manager reserved for the VM thread.
+ ParCompactionManager* const vmthread_cm =
+ ParCompactionManager::manager_array(gc_task_manager()->workers());
+
// Place after pre_compact() where the number of invocations is incremented.
AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
@@ -2008,7 +2009,7 @@
bool marked_for_unloading = false;
marking_start.update();
- marking_phase(serial_CM, maximum_heap_compaction);
+ marking_phase(vmthread_cm, maximum_heap_compaction);
#ifndef PRODUCT
if (TraceParallelOldGCMarkingPhase) {
@@ -2039,7 +2040,7 @@
#endif
bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc;
- summary_phase(serial_CM, maximum_heap_compaction || max_on_system_gc);
+ summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
#ifdef ASSERT
if (VerifyParallelOldWithMarkSweep &&
@@ -2067,13 +2068,13 @@
// code can use the the forwarding pointers to
// check the new pointer calculation. The restore_marks()
// has to be done before the real compact.
- serial_CM->set_action(ParCompactionManager::VerifyUpdate);
- compact_perm(serial_CM);
- compact_serial(serial_CM);
- serial_CM->set_action(ParCompactionManager::ResetObjects);
- compact_perm(serial_CM);
- compact_serial(serial_CM);
- serial_CM->set_action(ParCompactionManager::UpdateAndCopy);
+ vmthread_cm->set_action(ParCompactionManager::VerifyUpdate);
+ compact_perm(vmthread_cm);
+ compact_serial(vmthread_cm);
+ vmthread_cm->set_action(ParCompactionManager::ResetObjects);
+ compact_perm(vmthread_cm);
+ compact_serial(vmthread_cm);
+ vmthread_cm->set_action(ParCompactionManager::UpdateAndCopy);
// For debugging only
PSMarkSweep::restore_marks();
@@ -2084,16 +2085,14 @@
compaction_start.update();
// Does the perm gen always have to be done serially because
// klasses are used in the update of an object?
- compact_perm(serial_CM);
+ compact_perm(vmthread_cm);
if (UseParallelOldGCCompacting) {
compact();
} else {
- compact_serial(serial_CM);
+ compact_serial(vmthread_cm);
}
- delete serial_CM;
-
// Reset the mark bitmap, summary data, and do other bookkeeping. Must be
// done before resizing.
post_compact();
--- a/hotspot/src/share/vm/includeDB_compiler2 Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/includeDB_compiler2 Wed Jul 05 16:38:48 2017 +0200
@@ -1084,6 +1084,7 @@
idealGraphPrinter.hpp vectset.hpp
idealGraphPrinter.hpp growableArray.hpp
idealGraphPrinter.hpp ostream.hpp
+idealGraphPrinter.hpp xmlstream.hpp
idealGraphPrinter.cpp idealGraphPrinter.hpp
idealGraphPrinter.cpp chaitin.hpp
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -196,6 +196,8 @@
assert(_whole_heap.contains(new_region),
"attempt to cover area not in reserved area");
debug_only(verify_guard();)
+ // collided is true if the expansion would push into another committed region
+ debug_only(bool collided = false;)
int const ind = find_covering_region_by_base(new_region.start());
MemRegion const old_region = _covered[ind];
assert(old_region.start() == new_region.start(), "just checking");
@@ -211,12 +213,36 @@
}
// Align the end up to a page size (starts are already aligned).
jbyte* const new_end = byte_after(new_region.last());
- HeapWord* const new_end_aligned =
+ HeapWord* new_end_aligned =
(HeapWord*) align_size_up((uintptr_t)new_end, _page_size);
assert(new_end_aligned >= (HeapWord*) new_end,
"align up, but less");
+ int ri = 0;
+ for (ri = 0; ri < _cur_covered_regions; ri++) {
+ if (ri != ind) {
+ if (_committed[ri].contains(new_end_aligned)) {
+ assert((new_end_aligned >= _committed[ri].start()) &&
+ (_committed[ri].start() > _committed[ind].start()),
+ "New end of committed region is inconsistent");
+ new_end_aligned = _committed[ri].start();
+ assert(new_end_aligned > _committed[ind].start(),
+ "New end of committed region is before start");
+ debug_only(collided = true;)
+ // Should only collide with 1 region
+ break;
+ }
+ }
+ }
+#ifdef ASSERT
+ for (++ri; ri < _cur_covered_regions; ri++) {
+ assert(!_committed[ri].contains(new_end_aligned),
+ "New end of committed region is in a second committed region");
+ }
+#endif
// The guard page is always committed and should not be committed over.
- HeapWord* const new_end_for_commit = MIN2(new_end_aligned, _guard_region.start());
+ HeapWord* const new_end_for_commit = MIN2(new_end_aligned,
+ _guard_region.start());
+
if (new_end_for_commit > cur_committed.end()) {
// Must commit new pages.
MemRegion const new_committed =
@@ -239,9 +265,11 @@
if (!uncommit_region.is_empty()) {
if (!os::uncommit_memory((char*)uncommit_region.start(),
uncommit_region.byte_size())) {
- // Do better than this for Merlin
- vm_exit_out_of_memory(uncommit_region.byte_size(),
- "card table contraction");
+ assert(false, "Card table contraction failed");
+ // The call failed so don't change the end of the
+ // committed region. This is better than taking the
+ // VM down.
+ new_end_aligned = _committed[ind].end();
}
}
}
@@ -257,8 +285,25 @@
}
assert(index_for(new_region.last()) < (int) _guard_index,
"The guard card will be overwritten");
- jbyte* const end = byte_after(new_region.last());
+ // This line commented out cleans the newly expanded region and
+ // not the aligned up expanded region.
+ // jbyte* const end = byte_after(new_region.last());
+ jbyte* const end = (jbyte*) new_end_for_commit;
+ assert((end >= byte_after(new_region.last())) || collided,
+ "Expect to be beyond new region unless impacting another region");
// do nothing if we resized downward.
+#ifdef ASSERT
+ for (int ri = 0; ri < _cur_covered_regions; ri++) {
+ if (ri != ind) {
+ // The end of the new committed region should not
+ // be in any existing region unless it matches
+ // the start of the next region.
+ assert(!_committed[ri].contains(end) ||
+ (_committed[ri].start() == (HeapWord*) end),
+ "Overlapping committed regions");
+ }
+ }
+#endif
if (entry < end) {
memset(entry, clean_card, pointer_delta(end, entry, sizeof(jbyte)));
}
--- a/hotspot/src/share/vm/oops/symbolKlass.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/oops/symbolKlass.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -209,10 +209,7 @@
void symbolKlass::oop_print_on(oop obj, outputStream* st) {
st->print("Symbol: '");
- symbolOop sym = symbolOop(obj);
- for (int i = 0; i < sym->utf8_length(); i++) {
- st->print("%c", sym->byte_at(i));
- }
+ symbolOop(obj)->print_symbol_on(st);
st->print("'");
}
--- a/hotspot/src/share/vm/oops/symbolOop.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/oops/symbolOop.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -68,8 +68,17 @@
void symbolOopDesc::print_symbol_on(outputStream* st) {
st = st ? st : tty;
- for (int index = 0; index < utf8_length(); index++)
- st->put((char)byte_at(index));
+ int length = UTF8::unicode_length((const char*)bytes(), utf8_length());
+ const char *ptr = (const char *)bytes();
+ jchar value;
+ for (int index = 0; index < length; index++) {
+ ptr = UTF8::next(ptr, &value);
+ if (value >= 32 && value < 127 || value == '\'' || value == '\\') {
+ st->put(value);
+ } else {
+ st->print("\\u%04x", value);
+ }
+ }
}
jchar* symbolOopDesc::as_unicode(int& length) const {
--- a/hotspot/src/share/vm/opto/callnode.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/callnode.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -632,7 +632,7 @@
const TypeOopPtr *adrInst_t = addr_t->isa_oopptr();
// if not an InstPtr or not an instance type, assume the worst
- if (adrInst_t == NULL || !adrInst_t->is_instance_field()) {
+ if (adrInst_t == NULL || !adrInst_t->is_known_instance_field()) {
return true;
}
Compile *C = phase->C;
--- a/hotspot/src/share/vm/opto/cfgnode.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -708,12 +708,12 @@
// Split out an instance type from a bottom phi.
PhiNode* PhiNode::split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const {
const TypeOopPtr *t_oop = at->isa_oopptr();
- assert(t_oop != NULL && t_oop->is_instance(), "expecting instance oopptr");
+ assert(t_oop != NULL && t_oop->is_known_instance(), "expecting instance oopptr");
const TypePtr *t = adr_type();
assert(type() == Type::MEMORY &&
(t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||
- t->isa_oopptr() && !t->is_oopptr()->is_instance() &&
- t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop),
+ t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&
+ t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop),
"bottom or raw memory required");
// Check if an appropriate node already exists.
@@ -854,7 +854,8 @@
// Until we have harmony between classes and interfaces in the type
// lattice, we must tread carefully around phis which implicitly
// convert the one to the other.
- const TypeInstPtr* ttip = _type->isa_narrowoop() ? _type->isa_narrowoop()->make_oopptr()->isa_instptr() :_type->isa_instptr();
+ const TypePtr* ttp = _type->make_ptr();
+ const TypeInstPtr* ttip = (ttp != NULL) ? ttp->isa_instptr() : NULL;
bool is_intf = false;
if (ttip != NULL) {
ciKlass* k = ttip->klass();
@@ -873,7 +874,8 @@
// of all the input types. The lattice is not distributive in
// such cases. Ward off asserts in type.cpp by refusing to do
// meets between interfaces and proper classes.
- const TypeInstPtr* tiip = ti->isa_narrowoop() ? ti->is_narrowoop()->make_oopptr()->isa_instptr() : ti->isa_instptr();
+ const TypePtr* tip = ti->make_ptr();
+ const TypeInstPtr* tiip = (tip != NULL) ? tip->isa_instptr() : NULL;
if (tiip) {
bool ti_is_intf = false;
ciKlass* k = tiip->klass();
@@ -930,13 +932,14 @@
// class-typed Phi and an interface flows in, it's possible that the meet &
// join report an interface back out. This isn't possible but happens
// because the type system doesn't interact well with interfaces.
- const TypeInstPtr *jtip = jt->isa_narrowoop() ? jt->isa_narrowoop()->make_oopptr()->isa_instptr() : jt->isa_instptr();
+ const TypePtr *jtp = jt->make_ptr();
+ const TypeInstPtr *jtip = (jtp != NULL) ? jtp->isa_instptr() : NULL;
if( jtip && ttip ) {
if( jtip->is_loaded() && jtip->klass()->is_interface() &&
ttip->is_loaded() && !ttip->klass()->is_interface() ) {
// Happens in a CTW of rt.jar, 320-341, no extra flags
assert(ft == ttip->cast_to_ptr_type(jtip->ptr()) ||
- ft->isa_narrowoop() && ft->isa_narrowoop()->make_oopptr() == ttip->cast_to_ptr_type(jtip->ptr()), "");
+ ft->isa_narrowoop() && ft->make_ptr() == ttip->cast_to_ptr_type(jtip->ptr()), "");
jt = ft;
}
}
--- a/hotspot/src/share/vm/opto/cfgnode.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/cfgnode.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -129,7 +129,7 @@
};
PhiNode( Node *r, const Type *t, const TypePtr* at = NULL,
- const int iid = TypeOopPtr::UNKNOWN_INSTANCE,
+ const int iid = TypeOopPtr::InstanceTop,
const int iidx = Compile::AliasIdxTop,
const int ioffs = Type::OffsetTop )
: TypeNode(t,r->req()),
--- a/hotspot/src/share/vm/opto/compile.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -313,9 +313,6 @@
_compile->begin_method();
}
CompileWrapper::~CompileWrapper() {
- if (_compile->failing()) {
- _compile->print_method("Failed");
- }
_compile->end_method();
if (_compile->scratch_buffer_blob() != NULL)
BufferBlob::free(_compile->scratch_buffer_blob());
@@ -604,6 +601,8 @@
if (failing()) return;
NOT_PRODUCT( verify_graph_edges(); )
+ print_method("Before Matching");
+
#ifndef PRODUCT
if (PrintIdeal) {
ttyLocker ttyl; // keep the following output all in one block
@@ -1070,7 +1069,7 @@
// No constant oop pointers (such as Strings); they alias with
// unknown strings.
tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset);
- } else if( to->is_instance_field() ) {
+ } else if( to->is_known_instance_field() ) {
tj = to; // Keep NotNull and klass_is_exact for instance type
} else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) {
// During the 2nd round of IterGVN, NotNull castings are removed.
@@ -1191,8 +1190,8 @@
_field = NULL;
_is_rewritable = true; // default
const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL;
- if (atoop != NULL && atoop->is_instance()) {
- const TypeOopPtr *gt = atoop->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
+ if (atoop != NULL && atoop->is_known_instance()) {
+ const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot);
_general_index = Compile::current()->get_alias_index(gt);
} else {
_general_index = 0;
@@ -1481,7 +1480,7 @@
NOT_PRODUCT( verify_graph_edges(); )
- print_method("Start");
+ print_method("After Parsing");
{
// Iterative Global Value Numbering, including ideal transforms
@@ -1688,7 +1687,7 @@
Output();
}
- print_method("End");
+ print_method("Final Code");
// He's dead, Jim.
_cfg = (PhaseCFG*)0xdeadbeef;
@@ -2017,7 +2016,7 @@
for (uint i = 0; i < cnt; i++) {
Node* m = r->raw_out(i);
if (m!= NULL && m->Opcode() == Op_ConN &&
- m->bottom_type()->is_narrowoop()->make_oopptr() == t) {
+ m->bottom_type()->make_ptr() == t) {
nn = m;
break;
}
@@ -2070,7 +2069,7 @@
}
}
} else if (t->isa_oopptr()) {
- in2 = ConNode::make(C, t->is_oopptr()->make_narrowoop());
+ in2 = ConNode::make(C, t->make_narrowoop());
}
}
if( in2 != NULL ) {
@@ -2466,6 +2465,9 @@
// Record the first failure reason.
_failure_reason = reason;
}
+ if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) {
+ C->print_method(_failure_reason);
+ }
_root = NULL; // flush the graph, too
}
--- a/hotspot/src/share/vm/opto/connode.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/connode.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -565,26 +565,12 @@
}
const Type *DecodeNNode::Value( PhaseTransform *phase ) const {
- if (phase->type( in(1) ) == TypeNarrowOop::NULL_PTR) {
- return TypePtr::NULL_PTR;
- }
- return bottom_type();
-}
+ const Type *t = phase->type( in(1) );
+ if (t == Type::TOP) return Type::TOP;
+ if (t == TypeNarrowOop::NULL_PTR) return TypePtr::NULL_PTR;
-Node* DecodeNNode::decode(PhaseTransform* phase, Node* value) {
- if (value->is_EncodeP()) {
- // (DecodeN (EncodeP p)) -> p
- return value->in(1);
- }
- const Type* newtype = value->bottom_type();
- if (newtype == TypeNarrowOop::NULL_PTR) {
- return phase->transform(new (phase->C, 1) ConPNode(TypePtr::NULL_PTR));
- } else if (newtype->isa_narrowoop()) {
- return phase->transform(new (phase->C, 2) DecodeNNode(value, newtype->is_narrowoop()->make_oopptr()));
- } else {
- ShouldNotReachHere();
- return NULL; // to make C++ compiler happy.
- }
+ assert(t->isa_narrowoop(), "only narrowoop here");
+ return t->make_ptr();
}
Node* EncodePNode::Identity(PhaseTransform* phase) {
@@ -599,27 +585,14 @@
}
const Type *EncodePNode::Value( PhaseTransform *phase ) const {
- if (phase->type( in(1) ) == TypePtr::NULL_PTR) {
- return TypeNarrowOop::NULL_PTR;
- }
- return bottom_type();
+ const Type *t = phase->type( in(1) );
+ if (t == Type::TOP) return Type::TOP;
+ if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR;
+
+ assert(t->isa_oopptr(), "only oopptr here");
+ return t->make_narrowoop();
}
-Node* EncodePNode::encode(PhaseTransform* phase, Node* value) {
- if (value->is_DecodeN()) {
- // (EncodeP (DecodeN p)) -> p
- return value->in(1);
- }
- const Type* newtype = value->bottom_type();
- if (newtype == TypePtr::NULL_PTR) {
- return phase->transform(new (phase->C, 1) ConNNode(TypeNarrowOop::NULL_PTR));
- } else if (newtype->isa_oopptr()) {
- return phase->transform(new (phase->C, 2) EncodePNode(value, newtype->is_oopptr()->make_narrowoop()));
- } else {
- ShouldNotReachHere();
- return NULL; // to make C++ compiler happy.
- }
-}
Node *EncodePNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1));
--- a/hotspot/src/share/vm/opto/connode.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/connode.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -280,7 +280,6 @@
virtual const Type *Value( PhaseTransform *phase ) const;
virtual uint ideal_reg() const { return Op_RegN; }
- static Node* encode(PhaseTransform* phase, Node* value);
virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp );
};
@@ -300,8 +299,6 @@
virtual Node *Identity( PhaseTransform *phase );
virtual const Type *Value( PhaseTransform *phase ) const;
virtual uint ideal_reg() const { return Op_RegP; }
-
- static Node* decode(PhaseTransform* phase, Node* value);
};
//------------------------------Conv2BNode-------------------------------------
@@ -549,10 +546,18 @@
virtual uint hash() const ; // { return NO_HASH; }
virtual uint cmp( const Node &n ) const;
public:
- Opaque1Node( Node *n ) : Node(0,n) {}
+ Opaque1Node( Compile* C, Node *n ) : Node(0,n) {
+ // Put it on the Macro nodes list to removed during macro nodes expansion.
+ init_flags(Flag_is_macro);
+ C->add_macro_node(this);
+ }
// Special version for the pre-loop to hold the original loop limit
// which is consumed by range check elimination.
- Opaque1Node( Node *n, Node* orig_limit ) : Node(0,n,orig_limit) {}
+ Opaque1Node( Compile* C, Node *n, Node* orig_limit ) : Node(0,n,orig_limit) {
+ // Put it on the Macro nodes list to removed during macro nodes expansion.
+ init_flags(Flag_is_macro);
+ C->add_macro_node(this);
+ }
Node* original_loop_limit() { return req()==3 ? in(2) : NULL; }
virtual int Opcode() const;
virtual const Type *bottom_type() const { return TypeInt::INT; }
@@ -572,7 +577,11 @@
virtual uint hash() const ; // { return NO_HASH; }
virtual uint cmp( const Node &n ) const;
public:
- Opaque2Node( Node *n ) : Node(0,n) {}
+ Opaque2Node( Compile* C, Node *n ) : Node(0,n) {
+ // Put it on the Macro nodes list to removed during macro nodes expansion.
+ init_flags(Flag_is_macro);
+ C->add_macro_node(this);
+ }
virtual int Opcode() const;
virtual const Type *bottom_type() const { return TypeInt::INT; }
};
--- a/hotspot/src/share/vm/opto/escape.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/escape.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -483,7 +483,7 @@
//
void ConnectionGraph::split_AddP(Node *addp, Node *base, PhaseGVN *igvn) {
const TypeOopPtr *base_t = igvn->type(base)->isa_oopptr();
- assert(base_t != NULL && base_t->is_instance(), "expecting instance oopptr");
+ assert(base_t != NULL && base_t->is_known_instance(), "expecting instance oopptr");
const TypeOopPtr *t = igvn->type(addp)->isa_oopptr();
if (t == NULL) {
// We are computing a raw address for a store captured by an Initialize
@@ -494,8 +494,8 @@
assert(offs != Type::OffsetBot, "offset must be a constant");
t = base_t->add_offset(offs)->is_oopptr();
}
- uint inst_id = base_t->instance_id();
- assert(!t->is_instance() || t->instance_id() == inst_id,
+ int inst_id = base_t->instance_id();
+ assert(!t->is_known_instance() || t->instance_id() == inst_id,
"old type must be non-instance or match new type");
const TypeOopPtr *tinst = base_t->add_offset(t->offset())->is_oopptr();
// Do NOT remove the next call: ensure an new alias index is allocated
@@ -509,7 +509,7 @@
Node *adr = addp->in(AddPNode::Address);
const TypeOopPtr *atype = igvn->type(adr)->isa_oopptr();
if (atype != NULL && atype->instance_id() != inst_id) {
- assert(!atype->is_instance(), "no conflicting instances");
+ assert(!atype->is_known_instance(), "no conflicting instances");
const TypeOopPtr *new_atype = base_t->add_offset(atype->offset())->isa_oopptr();
Node *acast = new (_compile, 2) CastPPNode(adr, new_atype);
acast->set_req(0, adr->in(0));
@@ -663,7 +663,7 @@
return orig_mem;
Compile* C = phase->C;
const TypeOopPtr *tinst = C->get_adr_type(alias_idx)->isa_oopptr();
- bool is_instance = (tinst != NULL) && tinst->is_instance();
+ bool is_instance = (tinst != NULL) && tinst->is_known_instance();
Node *prev = NULL;
Node *result = orig_mem;
while (prev != result) {
@@ -693,7 +693,7 @@
AllocateNode* alloc = proj_in->as_Initialize()->allocation();
// Stop if this is the initialization for the object instance which
// which contains this memory slice, otherwise skip over it.
- if (alloc == NULL || alloc->_idx != tinst->instance_id()) {
+ if (alloc == NULL || alloc->_idx != (uint)tinst->instance_id()) {
result = proj_in->in(TypeFunc::Memory);
}
} else if (proj_in->is_MemBar()) {
@@ -887,7 +887,7 @@
const TypeOopPtr *t = igvn->type(n)->isa_oopptr();
if (t == NULL)
continue; // not a TypeInstPtr
- tinst = t->cast_to_instance(ni);
+ tinst = t->cast_to_instance_id(ni);
igvn->hash_delete(n);
igvn->set_type(n, tinst);
n->raise_bottom_type(tinst);
@@ -959,19 +959,19 @@
Node *val = get_map(elem); // CheckCastPP node
TypeNode *tn = n->as_Type();
tinst = igvn->type(val)->isa_oopptr();
- assert(tinst != NULL && tinst->is_instance() &&
- tinst->instance_id() == elem , "instance type expected.");
+ assert(tinst != NULL && tinst->is_known_instance() &&
+ (uint)tinst->instance_id() == elem , "instance type expected.");
- const TypeOopPtr *tn_t = NULL;
const Type *tn_type = igvn->type(tn);
+ const TypeOopPtr *tn_t;
if (tn_type->isa_narrowoop()) {
- tn_t = tn_type->is_narrowoop()->make_oopptr()->isa_oopptr();
+ tn_t = tn_type->make_ptr()->isa_oopptr();
} else {
tn_t = tn_type->isa_oopptr();
}
if (tn_t != NULL &&
- tinst->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE)->higher_equal(tn_t)) {
+ tinst->cast_to_instance_id(TypeOopPtr::InstanceBot)->higher_equal(tn_t)) {
if (tn_type->isa_narrowoop()) {
tn_type = tinst->make_narrowoop();
} else {
@@ -1921,9 +1921,7 @@
case Op_StoreN:
{
const Type *adr_type = phase->type(n->in(MemNode::Address));
- if (adr_type->isa_narrowoop()) {
- adr_type = adr_type->is_narrowoop()->make_oopptr();
- }
+ adr_type = adr_type->make_ptr();
if (adr_type->isa_oopptr()) {
add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
} else {
@@ -1948,9 +1946,7 @@
case Op_CompareAndSwapN:
{
const Type *adr_type = phase->type(n->in(MemNode::Address));
- if (adr_type->isa_narrowoop()) {
- adr_type = adr_type->is_narrowoop()->make_oopptr();
- }
+ adr_type = adr_type->make_ptr();
if (adr_type->isa_oopptr()) {
add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
} else {
@@ -2131,10 +2127,7 @@
case Op_CompareAndSwapN:
{
Node *adr = n->in(MemNode::Address);
- const Type *adr_type = phase->type(adr);
- if (adr_type->isa_narrowoop()) {
- adr_type = adr_type->is_narrowoop()->make_oopptr();
- }
+ const Type *adr_type = phase->type(adr)->make_ptr();
#ifdef ASSERT
if (!adr_type->isa_oopptr())
assert(phase->type(adr) == TypeRawPtr::NOTNULL, "Op_StoreP");
--- a/hotspot/src/share/vm/opto/gcm.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/gcm.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -307,7 +307,6 @@
// Test and set the visited bit.
if (mid->raise_LCA_visited() == mark) continue; // already visited
- mid->set_raise_LCA_visited(mark);
// Don't process the current LCA, otherwise the search may terminate early
if (mid != LCA && mid->raise_LCA_mark() == mark) {
@@ -317,6 +316,8 @@
assert(early->dominates(LCA), "early is high enough");
// Resume searching at that point, skipping intermediate levels.
worklist.push(LCA);
+ if (LCA == mid)
+ continue; // Don't mark as visited to avoid early termination.
} else {
// Keep searching through this block's predecessors.
for (uint j = 1, jmax = mid->num_preds(); j < jmax; j++) {
@@ -324,6 +325,7 @@
worklist.push(mid_parent);
}
}
+ mid->set_raise_LCA_visited(mark);
}
return LCA;
}
--- a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -100,16 +100,18 @@
// Constructor, either file or network output
IdealGraphPrinter::IdealGraphPrinter() {
- _traverse_outs = false;
+ // By default dump both ins and outs since dead or unreachable code
+ // needs to appear in the graph. There are also some special cases
+ // in the mach where kill projections have no users but should
+ // appear in the dump.
+ _traverse_outs = true;
_should_send_method = true;
_output = NULL;
buffer[0] = 0;
_depth = 0;
_current_method = NULL;
assert(!_current_method, "current method must be initialized to NULL");
- _arena = new Arena();
-
- _stream = new (ResourceObj::C_HEAP) networkStream();
+ _stream = NULL;
if (PrintIdealGraphFile != NULL) {
ThreadCritical tc;
@@ -124,12 +126,16 @@
} else {
st.print("%s%d", PrintIdealGraphFile, _file_count);
}
- _output = new (ResourceObj::C_HEAP) fileStream(st.as_string());
+ fileStream *stream = new (ResourceObj::C_HEAP) fileStream(st.as_string());
+ _output = stream;
} else {
- _output = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile);
+ fileStream *stream = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile);
+ _output = stream;
}
_file_count++;
} else {
+ _stream = new (ResourceObj::C_HEAP) networkStream();
+
// Try to connect to visualizer
if (_stream->connect(PrintIdealGraphAddress, PrintIdealGraphPort)) {
char c = 0;
@@ -149,13 +155,24 @@
}
}
- start_element(TOP_ELEMENT);
+ _xml = new (ResourceObj::C_HEAP) xmlStream(_output);
+
+ head(TOP_ELEMENT);
}
// Destructor, close file or network stream
IdealGraphPrinter::~IdealGraphPrinter() {
- end_element(TOP_ELEMENT);
+ tail(TOP_ELEMENT);
+
+ // tty->print_cr("Walk time: %d", (int)_walk_time.milliseconds());
+ // tty->print_cr("Output time: %d", (int)_output_time.milliseconds());
+ // tty->print_cr("Build blocks time: %d", (int)_build_blocks_time.milliseconds());
+
+ if(_xml) {
+ delete _xml;
+ _xml = NULL;
+ }
if (_stream) {
delete _stream;
@@ -171,94 +188,93 @@
}
}
-void IdealGraphPrinter::print_ifg(PhaseIFG* ifg) {
-
- // Code to print an interference graph to tty, currently not used
- /*
- if (!_current_method) return;
- // Remove neighbor colors
+void IdealGraphPrinter::begin_elem(const char *s) {
+ _xml->begin_elem(s);
+}
+
+void IdealGraphPrinter::end_elem() {
+ _xml->end_elem();
+}
- for (uint i = 0; i < ifg._maxlrg; i++) {
+void IdealGraphPrinter::begin_head(const char *s) {
+ _xml->begin_head(s);
+}
- IndexSet *s = ifg.neighbors(i);
- IndexSetIterator elements(s);
- uint neighbor;
- while ((neighbor = elements.next()) != 0) {
- tty->print_cr("Edge between %d and %d\n", i, neighbor);
- }
- }
+void IdealGraphPrinter::end_head() {
+ _xml->end_head();
+}
+void IdealGraphPrinter::print_attr(const char *name, intptr_t val) {
+ stringStream stream;
+ stream.print(INTX_FORMAT, val);
+ print_attr(name, stream.as_string());
+}
- for (uint i = 0; i < ifg._maxlrg; i++) {
- LRG &l = ifg.lrgs(i);
- if (l._def) {
- OptoReg::Name name = l.reg();
- tty->print("OptoReg::dump: ");
- OptoReg::dump(name);
- tty->print_cr("");
- tty->print_cr("name=%d\n", name);
- if (name) {
- if (OptoReg::is_stack(name)) {
- tty->print_cr("Stack number %d\n", OptoReg::reg2stack(name));
+void IdealGraphPrinter::print_attr(const char *name, const char *val) {
+ _xml->print(" %s='", name);
+ text(val);
+ _xml->print("'");
+}
- } else if (!OptoReg::is_valid(name)) {
- tty->print_cr("BAD!!!");
- } else {
+void IdealGraphPrinter::head(const char *name) {
+ _xml->head(name);
+}
+
+void IdealGraphPrinter::tail(const char *name) {
+ _xml->tail(name);
+}
- if (OptoReg::is_reg(name)) {
- tty->print_cr(OptoReg::regname(name));
- } else {
- int x = 0;
- }
- }
- int x = 0;
- }
+void IdealGraphPrinter::text(const char *s) {
+ _xml->text(s);
+}
+
+void IdealGraphPrinter::print_prop(const char *name, int val) {
- if (l._def == NodeSentinel) {
- tty->print("multiple mapping from %d: ", i);
- for (int j=0; j<l._defs->length(); j++) {
- tty->print("%d ", l._defs->at(j)->_idx);
- }
- tty->print_cr("");
- } else {
- tty->print_cr("mapping between %d and %d\n", i, l._def->_idx);
- }
- }
- }*/
+ stringStream stream;
+ stream.print("%d", val);
+ print_prop(name, stream.as_string());
+}
+
+void IdealGraphPrinter::print_prop(const char *name, const char *val) {
+ begin_head(PROPERTY_ELEMENT);
+ print_attr(PROPERTY_NAME_PROPERTY, name);
+ end_head();
+ text(val);
+ tail(PROPERTY_ELEMENT);
}
void IdealGraphPrinter::print_method(ciMethod *method, int bci, InlineTree *tree) {
+ begin_head(METHOD_ELEMENT);
- Properties properties;
stringStream str;
method->print_name(&str);
stringStream shortStr;
method->print_short_name(&shortStr);
+ print_attr(METHOD_NAME_PROPERTY, str.as_string());
+ print_attr(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string());
+ print_attr(METHOD_BCI_PROPERTY, bci);
- properties.add(new Property(METHOD_NAME_PROPERTY, str.as_string()));
- properties.add(new Property(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string()));
- properties.add(new Property(METHOD_BCI_PROPERTY, bci));
- start_element(METHOD_ELEMENT, &properties);
+ end_head();
- start_element(BYTECODES_ELEMENT);
+ head(BYTECODES_ELEMENT);
output()->print_cr("<![CDATA[");
method->print_codes_on(output());
output()->print_cr("]]>");
- end_element(BYTECODES_ELEMENT);
+ tail(BYTECODES_ELEMENT);
- start_element(INLINE_ELEMENT);
+ head(INLINE_ELEMENT);
if (tree != NULL) {
GrowableArray<InlineTree *> subtrees = tree->subtrees();
for (int i = 0; i < subtrees.length(); i++) {
print_inline_tree(subtrees.at(i));
}
}
- end_element(INLINE_ELEMENT);
+ tail(INLINE_ELEMENT);
- end_element(METHOD_ELEMENT);
+ tail(METHOD_ELEMENT);
output()->flush();
}
@@ -271,12 +287,6 @@
}
-void IdealGraphPrinter::clear_nodes() {
- // for (int i = 0; i < _nodes.length(); i++) {
- // _nodes.at(i)->clear_node();
- // }
-}
-
void IdealGraphPrinter::print_inlining(Compile* compile) {
// Print inline tree
@@ -298,143 +308,56 @@
assert(method, "null methods are not allowed!");
assert(!_current_method, "current method must be null!");
- _arena->destruct_contents();
+ head(GROUP_ELEMENT);
- start_element(GROUP_ELEMENT);
+ head(PROPERTIES_ELEMENT);
// Print properties
- Properties properties;
-
// Add method name
stringStream strStream;
method->print_name(&strStream);
- properties.add(new Property(METHOD_NAME_PROPERTY, strStream.as_string()));
+ print_prop(METHOD_NAME_PROPERTY, strStream.as_string());
if (method->flags().is_public()) {
- properties.add(new Property(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE));
+ print_prop(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE);
}
if (method->flags().is_static()) {
- properties.add(new Property(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE));
+ print_prop(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE);
}
- properties.print(this);
+ tail(PROPERTIES_ELEMENT);
if (_stream) {
char answer = 0;
- _stream->flush();
+ _xml->flush();
int result = _stream->read(&answer, 1);
_should_send_method = (answer == 'y');
}
- this->_nodes = GrowableArray<NodeDescription *>(_arena, 2, 0, NULL);
- this->_edges = GrowableArray< EdgeDescription * >(_arena, 2, 0, NULL);
-
-
this->_current_method = method;
-
-
- _output->flush();
+ _xml->flush();
}
// Has to be called whenever a method has finished compilation
void IdealGraphPrinter::end_method() {
-// if (finish && !in_method) return;
-
nmethod* method = (nmethod*)this->_current_method->code();
- start_element(ASSEMBLY_ELEMENT);
- // Disassembler::decode(method, _output);
- end_element(ASSEMBLY_ELEMENT);
-
-
- end_element(GROUP_ELEMENT);
+ tail(GROUP_ELEMENT);
_current_method = NULL;
- _output->flush();
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc) {
- delete desc;
- _nodes.at_put(i, NULL);
- }
- }
- this->_nodes.clear();
-
-
- for (int i = 0; i < _edges.length(); i++) {
- // for (int j=0; j<_edges.at(i)->length(); j++) {
- EdgeDescription *conn = _edges.at(i);
- conn->print(this);
- if (conn) {
- delete conn;
- _edges.at_put(i, NULL);
- }
- //}
- //_edges.at(i)->clear();
- //delete _edges.at(i);
- //_edges.at_put(i, NULL);
- }
- this->_edges.clear();
-
-// in_method = false;
-}
-
-// Outputs an XML start element
-void IdealGraphPrinter::start_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */, bool print_return /* = true */) {
-
- start_element_helper(s, properties, false, print_indent, print_return);
- _depth++;
-
-}
-
-// Outputs an XML start element without body
-void IdealGraphPrinter::simple_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */) {
- start_element_helper(s, properties, true, print_indent, true);
-}
-
-// Outputs an XML start element. If outputEnd is true, the element has no body.
-void IdealGraphPrinter::start_element_helper(const char *s, Properties *properties, bool outputEnd, bool print_indent /* = false */, bool print_return /* = true */) {
-
- assert(_output, "output stream must exist!");
-
- if (print_indent) this->print_indent();
- _output->print("<");
- _output->print(s);
- if (properties) properties->print_as_attributes(this);
-
- if (outputEnd) {
- _output->print("/");
- }
-
- _output->print(">");
- if (print_return) _output->print_cr("");
-
+ _xml->flush();
}
// Print indent
void IdealGraphPrinter::print_indent() {
+ tty->print_cr("printing ident %d", _depth);
for (int i = 0; i < _depth; i++) {
- _output->print(INDENT);
+ _xml->print(INDENT);
}
}
-// Outputs an XML end element
-void IdealGraphPrinter::end_element(const char *s, bool print_indent /* = true */, bool print_return /* = true */) {
-
- assert(_output, "output stream must exist!");
-
- _depth--;
-
- if (print_indent) this->print_indent();
- _output->print("</");
- _output->print(s);
- _output->print(">");
- if (print_return) _output->print_cr("");
-
-}
-
bool IdealGraphPrinter::traverse_outs() {
return _traverse_outs;
}
@@ -443,7 +366,255 @@
_traverse_outs = b;
}
-void IdealGraphPrinter::walk(Node *start) {
+intptr_t IdealGraphPrinter::get_node_id(Node *n) {
+ return (intptr_t)(n);
+}
+
+void IdealGraphPrinter::visit_node(Node *n, void *param) {
+
+ if(param) {
+
+ // Output edge
+ intptr_t dest_id = get_node_id(n);
+ for ( uint i = 0; i < n->len(); i++ ) {
+ if ( n->in(i) ) {
+ Node *source = n->in(i);
+ begin_elem(EDGE_ELEMENT);
+ intptr_t source_id = get_node_id(source);
+ print_attr(FROM_PROPERTY, source_id);
+ print_attr(TO_PROPERTY, dest_id);
+ print_attr(INDEX_PROPERTY, i);
+ end_elem();
+ }
+ }
+
+ } else {
+
+ // Output node
+ begin_head(NODE_ELEMENT);
+ print_attr(NODE_ID_PROPERTY, get_node_id(n));
+ end_head();
+
+ head(PROPERTIES_ELEMENT);
+
+ Node *node = n;
+#ifndef PRODUCT
+ node->_in_dump_cnt++;
+ print_prop(NODE_NAME_PROPERTY, (const char *)node->Name());
+ const Type *t = node->bottom_type();
+ print_prop("type", (const char *)Type::msg[t->base()]);
+ print_prop("idx", node->_idx);
+#ifdef ASSERT
+ print_prop("debug_idx", node->_debug_idx);
+#endif
+
+ if(C->cfg() != NULL) {
+ Block *block = C->cfg()->_bbs[node->_idx];
+ if(block == NULL) {
+ print_prop("block", C->cfg()->_blocks[0]->_pre_order);
+ } else {
+ print_prop("block", block->_pre_order);
+ }
+ }
+
+ const jushort flags = node->flags();
+ if (flags & Node::Flag_is_Copy) {
+ print_prop("is_copy", "true");
+ }
+ if (flags & Node::Flag_is_Call) {
+ print_prop("is_call", "true");
+ }
+ if (flags & Node::Flag_rematerialize) {
+ print_prop("rematerialize", "true");
+ }
+ if (flags & Node::Flag_needs_anti_dependence_check) {
+ print_prop("needs_anti_dependence_check", "true");
+ }
+ if (flags & Node::Flag_is_macro) {
+ print_prop("is_macro", "true");
+ }
+ if (flags & Node::Flag_is_Con) {
+ print_prop("is_con", "true");
+ }
+ if (flags & Node::Flag_is_cisc_alternate) {
+ print_prop("is_cisc_alternate", "true");
+ }
+ if (flags & Node::Flag_is_Branch) {
+ print_prop("is_branch", "true");
+ }
+ if (flags & Node::Flag_is_block_start) {
+ print_prop("is_block_start", "true");
+ }
+ if (flags & Node::Flag_is_Goto) {
+ print_prop("is_goto", "true");
+ }
+ if (flags & Node::Flag_is_dead_loop_safe) {
+ print_prop("is_dead_loop_safe", "true");
+ }
+ if (flags & Node::Flag_may_be_short_branch) {
+ print_prop("may_be_short_branch", "true");
+ }
+ if (flags & Node::Flag_is_safepoint_node) {
+ print_prop("is_safepoint_node", "true");
+ }
+ if (flags & Node::Flag_is_pc_relative) {
+ print_prop("is_pc_relative", "true");
+ }
+
+ if (C->matcher() != NULL) {
+ if (C->matcher()->is_shared(node)) {
+ print_prop("is_shared", "true");
+ } else {
+ print_prop("is_shared", "false");
+ }
+ if (C->matcher()->is_dontcare(node)) {
+ print_prop("is_dontcare", "true");
+ } else {
+ print_prop("is_dontcare", "false");
+ }
+
+ Node* old = C->matcher()->find_old_node(node);
+ if (old != NULL) {
+ print_prop("old_node_idx", old->_idx);
+ }
+ }
+
+ if (node->is_Proj()) {
+ print_prop("con", (int)node->as_Proj()->_con);
+ }
+
+ if (node->is_Mach()) {
+ print_prop("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()]);
+ }
+
+ buffer[0] = 0;
+ stringStream s2(buffer, sizeof(buffer) - 1);
+
+ node->dump_spec(&s2);
+ if (t != NULL && (t->isa_instptr() || t->isa_klassptr())) {
+ const TypeInstPtr *toop = t->isa_instptr();
+ const TypeKlassPtr *tkls = t->isa_klassptr();
+ ciKlass* klass = toop ? toop->klass() : (tkls ? tkls->klass() : NULL );
+ if( klass && klass->is_loaded() && klass->is_interface() ) {
+ s2.print(" Interface:");
+ } else if( toop ) {
+ s2.print(" Oop:");
+ } else if( tkls ) {
+ s2.print(" Klass:");
+ }
+ t->dump_on(&s2);
+ } else if( t == Type::MEMORY ) {
+ s2.print(" Memory:");
+ MemNode::dump_adr_type(node, node->adr_type(), &s2);
+ }
+
+ assert(s2.size() < sizeof(buffer), "size in range");
+ print_prop("dump_spec", buffer);
+
+ if (node->is_block_proj()) {
+ print_prop("is_block_proj", "true");
+ }
+
+ if (node->is_block_start()) {
+ print_prop("is_block_start", "true");
+ }
+
+ const char *short_name = "short_name";
+ if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) {
+ int index = node->as_Proj()->_con - TypeFunc::Parms;
+ if (index >= 10) {
+ print_prop(short_name, "PA");
+ } else {
+ sprintf(buffer, "P%d", index);
+ print_prop(short_name, buffer);
+ }
+ } else if (strcmp(node->Name(), "IfTrue") == 0) {
+ print_prop(short_name, "T");
+ } else if (strcmp(node->Name(), "IfFalse") == 0) {
+ print_prop(short_name, "F");
+ } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) {
+
+ if (t->base() == Type::Int && t->is_int()->is_con()) {
+ const TypeInt *typeInt = t->is_int();
+ assert(typeInt->is_con(), "must be constant");
+ jint value = typeInt->get_con();
+
+ // max. 2 chars allowed
+ if (value >= -9 && value <= 99) {
+ sprintf(buffer, "%d", value);
+ print_prop(short_name, buffer);
+ } else {
+ print_prop(short_name, "I");
+ }
+ } else if (t == Type::TOP) {
+ print_prop(short_name, "^");
+ } else if (t->base() == Type::Long && t->is_long()->is_con()) {
+ const TypeLong *typeLong = t->is_long();
+ assert(typeLong->is_con(), "must be constant");
+ jlong value = typeLong->get_con();
+
+ // max. 2 chars allowed
+ if (value >= -9 && value <= 99) {
+ sprintf(buffer, "%d", value);
+ print_prop(short_name, buffer);
+ } else {
+ print_prop(short_name, "L");
+ }
+ } else if (t->base() == Type::KlassPtr) {
+ const TypeKlassPtr *typeKlass = t->is_klassptr();
+ print_prop(short_name, "CP");
+ } else if (t->base() == Type::Control) {
+ print_prop(short_name, "C");
+ } else if (t->base() == Type::Memory) {
+ print_prop(short_name, "M");
+ } else if (t->base() == Type::Abio) {
+ print_prop(short_name, "IO");
+ } else if (t->base() == Type::Return_Address) {
+ print_prop(short_name, "RA");
+ } else if (t->base() == Type::AnyPtr) {
+ print_prop(short_name, "P");
+ } else if (t->base() == Type::RawPtr) {
+ print_prop(short_name, "RP");
+ } else if (t->base() == Type::AryPtr) {
+ print_prop(short_name, "AP");
+ }
+ }
+
+ JVMState* caller = NULL;
+ if (node->is_SafePoint()) {
+ caller = node->as_SafePoint()->jvms();
+ } else {
+ Node_Notes* notes = C->node_notes_at(node->_idx);
+ if (notes != NULL) {
+ caller = notes->jvms();
+ }
+ }
+
+ if (caller != NULL) {
+ stringStream bciStream;
+ while(caller) {
+ bciStream.print("%d ", caller->bci());
+ caller = caller->caller();
+ }
+ print_prop("bci", bciStream.as_string());
+ }
+
+ if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) {
+ buffer[0] = 0;
+ _chaitin->dump_register(node, buffer);
+ print_prop("reg", buffer);
+ print_prop("lrg", _chaitin->n2lidx(node));
+ }
+
+ node->_in_dump_cnt--;
+#endif
+
+ tail(PROPERTIES_ELEMENT);
+ tail(NODE_ELEMENT);
+ }
+}
+
+void IdealGraphPrinter::walk_nodes(Node *start, void *param) {
VectorSet visited(Thread::current()->resource_area());
@@ -453,7 +624,7 @@
while(nodeStack.length() > 0) {
Node *n = nodeStack.pop();
- IdealGraphPrinter::pre_node(n, this);
+ visit_node(n, param);
if (_traverse_outs) {
for (DUIterator i = n->outs(); n->has_out(i); i++) {
@@ -474,573 +645,6 @@
}
}
-void IdealGraphPrinter::compress(int index, GrowableArray<Block>* blocks) {
- Block *block = blocks->adr_at(index);
-
- int ancestor = block->ancestor();
- assert(ancestor != -1, "");
-
- Block *ancestor_block = blocks->adr_at(ancestor);
- if (ancestor_block->ancestor() != -1) {
- compress(ancestor, blocks);
-
- int label = block->label();
- Block *label_block = blocks->adr_at(label);
-
- int ancestor_label = ancestor_block->label();
- Block *ancestor_label_block = blocks->adr_at(label);
- if (ancestor_label_block->semi() < label_block->semi()) {
- block->set_label(ancestor_label);
- }
-
- block->set_ancestor(ancestor_block->ancestor());
- }
-}
-
-int IdealGraphPrinter::eval(int index, GrowableArray<Block>* blocks) {
- Block *block = blocks->adr_at(index);
- if (block->ancestor() == -1) {
- return index;
- } else {
- compress(index, blocks);
- return block->label();
- }
-}
-
-void IdealGraphPrinter::link(int index1, int index2, GrowableArray<Block>* blocks) {
- Block *block2 = blocks->adr_at(index2);
- block2->set_ancestor(index1);
-}
-
-void IdealGraphPrinter::build_dominators(GrowableArray<Block>* blocks) {
-
- if (blocks->length() == 0) return;
-
- GrowableArray<int> stack;
- stack.append(0);
-
- GrowableArray<Block *> array;
-
- assert(blocks->length() > 0, "");
- blocks->adr_at(0)->set_dominator(0);
-
- int n = 0;
- while(!stack.is_empty()) {
- int index = stack.pop();
- Block *block = blocks->adr_at(index);
- block->set_semi(n);
- array.append(block);
- n = n + 1;
- for (int i = 0; i < block->succs()->length(); i++) {
- int succ_index = block->succs()->at(i);
- Block *succ = blocks->adr_at(succ_index);
- if (succ->semi() == -1) {
- succ->set_parent(index);
- stack.push(succ_index);
- }
- succ->add_pred(index);
- }
- }
-
- for (int i=n-1; i>0; i--) {
- Block *block = array.at(i);
- int block_index = block->index();
- for (int j=0; j<block->pred()->length(); j++) {
- int pred_index = block->pred()->at(j);
- int cur_index = eval(pred_index, blocks);
-
- Block *cur_block = blocks->adr_at(cur_index);
- if (cur_block->semi() < block->semi()) {
- block->set_semi(cur_block->semi());
- }
- }
-
- int semi_index = block->semi();
- Block *semi_block = array.at(semi_index);
- semi_block->add_to_bucket(block_index);
-
- link(block->parent(), block_index, blocks);
- Block *parent_block = blocks->adr_at(block->parent());
-
- for (int j=0; j<parent_block->bucket()->length(); j++) {
- int cur_index = parent_block->bucket()->at(j);
- int new_index = eval(cur_index, blocks);
- Block *cur_block = blocks->adr_at(cur_index);
- Block *new_block = blocks->adr_at(new_index);
- int dom = block->parent();
-
- if (new_block->semi() < cur_block->semi()) {
- dom = new_index;
- }
-
- cur_block->set_dominator(dom);
- }
-
- parent_block->clear_bucket();
- }
-
- for (int i=1; i < n; i++) {
-
- Block *block = array.at(i);
- int block_index = block->index();
-
- int semi_index = block->semi();
- Block *semi_block = array.at(semi_index);
-
- if (block->dominator() != semi_block->index()) {
- int new_dom = blocks->adr_at(block->dominator())->dominator();
- block->set_dominator(new_dom);
- }
- }
-
- for (int i = 0; i < blocks->length(); i++) {
- if (blocks->adr_at(i)->dominator() == -1) {
- blocks->adr_at(i)->set_dominator(0);
- }
- }
-
- // Build dominates array
- for (int i=1; i < blocks->length(); i++) {
- Block *block = blocks->adr_at(i);
- int dominator = block->dominator();
- Block *dom_block = blocks->adr_at(dominator);
- dom_block->add_dominates(i);
- dom_block->add_child(i);
-
- while(dominator != 0) {
- dominator = dom_block->dominator();
- dom_block = blocks->adr_at(dominator);
- dom_block->add_child(i);
- }
- }
-}
-
-void IdealGraphPrinter::build_common_dominator(int **common_dominator, int index, GrowableArray<Block>* blocks) {
-
- common_dominator[index][index] = index;
- Block *block = blocks->adr_at(index);
- for (int i = 0; i < block->dominates()->length(); i++) {
- Block *dominated = blocks->adr_at(block->dominates()->at(i));
-
- for (int j=0; j<dominated->children()->length(); j++) {
- Block *child = blocks->adr_at(dominated->children()->at(j));
- common_dominator[index][child->index()] = common_dominator[child->index()][index] = index;
-
- for (int k=0; k<i; k++) {
- Block *other_dominated = blocks->adr_at(block->dominates()->at(k));
- common_dominator[child->index()][other_dominated->index()] = common_dominator[other_dominated->index()][child->index()] = index;
-
- for (int l=0 ; l<other_dominated->children()->length(); l++) {
- Block *other_child = blocks->adr_at(other_dominated->children()->at(l));
- common_dominator[child->index()][other_child->index()] = common_dominator[other_child->index()][child->index()] = index;
- }
- }
- }
-
- build_common_dominator(common_dominator, dominated->index(), blocks);
- }
-}
-
-void IdealGraphPrinter::schedule_latest(int **common_dominator, GrowableArray<Block>* blocks) {
-
- int queue_size = _nodes.length() + 1;
- NodeDescription **queue = NEW_RESOURCE_ARRAY(NodeDescription *, queue_size);
- int queue_start = 0;
- int queue_end = 0;
- Arena *a = new Arena();
- VectorSet on_queue(a);
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc) {
- desc->init_succs();
- }
- }
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc) {
- for (uint j=0; j<desc->node()->len(); j++) {
- Node *n = desc->node()->in(j);
- if (n) {
- NodeDescription *other_desc = _nodes.at(n->_idx);
- other_desc->add_succ(desc);
- }
- }
- }
- }
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc && desc->block_index() == -1) {
-
- // Put Phi into same block as region
- if (desc->node()->is_Phi() && desc->node()->in(0) && _nodes.at(desc->node()->in(0)->_idx)->block_index() != -1) {
- int index = _nodes.at(desc->node()->in(0)->_idx)->block_index();
- desc->set_block_index(index);
- blocks->adr_at(index)->add_node(desc);
-
- // Put Projections to same block as parent
- } else if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) {
- int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index();
- desc->set_block_index(index);
- blocks->adr_at(index)->add_node(desc);
- } else {
- queue[queue_end] = desc;
- queue_end++;
- on_queue.set(desc->node()->_idx);
- }
- }
- }
-
-
- int z = 0;
- while(queue_start != queue_end && z < 10000) {
-
- NodeDescription *desc = queue[queue_start];
- queue_start = (queue_start + 1) % queue_size;
- on_queue >>= desc->node()->_idx;
-
- Node* node = desc->node();
-
- if (desc->succs()->length() == 0) {
- int x = 0;
- }
-
- int block_index = -1;
- if (desc->succs()->length() != 0) {
- for (int i = 0; i < desc->succs()->length(); i++) {
- NodeDescription *cur_desc = desc->succs()->at(i);
- if (cur_desc != desc) {
- if (cur_desc->succs()->length() == 0) {
-
- // Ignore nodes with 0 successors
-
- } else if (cur_desc->block_index() == -1) {
-
- // Let this node schedule first
- block_index = -1;
- break;
-
- } else if (cur_desc->node()->is_Phi()){
-
- // Special treatment for Phi functions
- PhiNode *phi = cur_desc->node()->as_Phi();
- assert(phi->in(0) && phi->in(0)->is_Region(), "Must have region node in first input");
- RegionNode *region = phi->in(0)->as_Region();
-
- for (uint j=1; j<phi->len(); j++) {
- Node *cur_phi_input = phi->in(j);
- if (cur_phi_input == desc->node() && region->in(j)) {
- NodeDescription *cur_region_input = _nodes.at(region->in(j)->_idx);
- if (cur_region_input->block_index() == -1) {
-
- // Let this node schedule first
- block_index = -1;
- break;
- } else {
- if (block_index == -1) {
- block_index = cur_region_input->block_index();
- } else {
- block_index = common_dominator[block_index][cur_region_input->block_index()];
- }
- }
- }
- }
-
- } else {
- if (block_index == -1) {
- block_index = cur_desc->block_index();
- } else {
- block_index = common_dominator[block_index][cur_desc->block_index()];
- }
- }
- }
- }
- }
-
- if (block_index == -1) {
- queue[queue_end] = desc;
- queue_end = (queue_end + 1) % queue_size;
- on_queue.set(desc->node()->_idx);
- z++;
- } else {
- assert(desc->block_index() == -1, "");
- desc->set_block_index(block_index);
- blocks->adr_at(block_index)->add_node(desc);
- z = 0;
- }
- }
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc && desc->block_index() == -1) {
-
- //if (desc->node()->is_Proj() || desc->node()->is_Con()) {
- Node *parent = desc->node()->in(0);
- uint cur = 1;
- while(!parent && cur < desc->node()->len()) {
- parent = desc->node()->in(cur);
- cur++;
- }
-
- if (parent && _nodes.at(parent->_idx)->block_index() != -1) {
- int index = _nodes.at(parent->_idx)->block_index();
- desc->set_block_index(index);
- blocks->adr_at(index)->add_node(desc);
- } else {
- desc->set_block_index(0);
- blocks->adr_at(0)->add_node(desc);
- //ShouldNotReachHere();
- }
- //}
- /*
- if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) {
- int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index();
- desc->set_block_index(index);
- blocks->adr_at(index)->add_node(desc);
- } */
- }
- }
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc) {
- desc->clear_succs();
- }
- }
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc) {
- int block_index = desc->block_index();
-
- assert(block_index >= 0 && block_index < blocks->length(), "Block index must be in range");
- assert(blocks->adr_at(block_index)->nodes()->contains(desc), "Node must be child of block");
- }
- }
- a->destruct_contents();
-}
-
-void IdealGraphPrinter::build_blocks(Node *root) {
-
- Arena *a = new Arena();
- Node_Stack stack(a, 100);
-
- VectorSet visited(a);
- stack.push(root, 0);
- GrowableArray<Block> blocks(a, 2, 0, Block(0));
-
- for (int i = 0; i < _nodes.length(); i++) {
- if (_nodes.at(i)) _nodes.at(i)->set_block_index(-1);
- }
-
-
- // Order nodes such that node index is equal to idx
- for (int i = 0; i < _nodes.length(); i++) {
-
- if (_nodes.at(i)) {
- NodeDescription *node = _nodes.at(i);
- int index = node->node()->_idx;
- if (index != i) {
- _nodes.at_grow(index);
- NodeDescription *tmp = _nodes.at(index);
- *(_nodes.adr_at(index)) = node;
- *(_nodes.adr_at(i)) = tmp;
- i--;
- }
- }
- }
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *node = _nodes.at(i);
- if (node) {
- assert(node->node()->_idx == (uint)i, "");
- }
- }
-
- while(stack.is_nonempty()) {
-
- //Node *n = stack.node();
- //int index = stack.index();
- Node *proj = stack.node();//n->in(index);
- const Node *parent = proj->is_block_proj();
- if (parent == NULL) {
- parent = proj;
- }
-
- if (!visited.test_set(parent->_idx)) {
-
- NodeDescription *end_desc = _nodes.at(parent->_idx);
- int block_index = blocks.length();
- Block block(block_index);
- blocks.append(block);
- Block *b = blocks.adr_at(block_index);
- b->set_start(end_desc);
- // assert(end_desc->block_index() == -1, "");
- end_desc->set_block_index(block_index);
- b->add_node(end_desc);
-
- // Skip any control-pinned middle'in stuff
- Node *p = proj;
- NodeDescription *start_desc = NULL;
- do {
- proj = p; // Update pointer to last Control
- if (p->in(0) == NULL) {
- start_desc = end_desc;
- break;
- }
- p = p->in(0); // Move control forward
- start_desc = _nodes.at(p->_idx);
- assert(start_desc, "");
-
- if (start_desc != end_desc && start_desc->block_index() == -1) {
- assert(start_desc->block_index() == -1, "");
- assert(block_index < blocks.length(), "");
- start_desc->set_block_index(block_index);
- b->add_node(start_desc);
- }
- } while( !p->is_block_proj() &&
- !p->is_block_start() );
-
- for (uint i = 0; i < start_desc->node()->len(); i++) {
-
- Node *pred_node = start_desc->node()->in(i);
-
-
- if (pred_node && pred_node != start_desc->node()) {
- const Node *cur_parent = pred_node->is_block_proj();
- if (cur_parent != NULL) {
- pred_node = (Node *)cur_parent;
- }
-
- NodeDescription *pred_node_desc = _nodes.at(pred_node->_idx);
- if (pred_node_desc->block_index() != -1) {
- blocks.adr_at(pred_node_desc->block_index())->add_succ(block_index);
- }
- }
- }
-
- for (DUIterator_Fast dmax, i = end_desc->node()->fast_outs(dmax); i < dmax; i++) {
- Node* cur_succ = end_desc->node()->fast_out(i);
- NodeDescription *cur_succ_desc = _nodes.at(cur_succ->_idx);
-
- DUIterator_Fast dmax2, i2 = cur_succ->fast_outs(dmax2);
- if (cur_succ->is_block_proj() && i2 < dmax2 && !cur_succ->is_Root()) {
-
- for (; i2<dmax2; i2++) {
- Node *cur_succ2 = cur_succ->fast_out(i2);
- if (cur_succ2) {
- cur_succ_desc = _nodes.at(cur_succ2->_idx);
- if (cur_succ_desc == NULL) {
- // dead node so skip it
- continue;
- }
- if (cur_succ2 != end_desc->node() && cur_succ_desc->block_index() != -1) {
- b->add_succ(cur_succ_desc->block_index());
- }
- }
- }
-
- } else {
-
- if (cur_succ != end_desc->node() && cur_succ_desc && cur_succ_desc->block_index() != -1) {
- b->add_succ(cur_succ_desc->block_index());
- }
- }
- }
-
-
- int num_preds = p->len();
- int bottom = -1;
- if (p->is_Region() || p->is_Phi()) {
- bottom = 0;
- }
-
- int pushed = 0;
- for (int i=num_preds - 1; i > bottom; i--) {
- if (p->in(i) != NULL && p->in(i) != p) {
- stack.push(p->in(i), 0);
- pushed++;
- }
- }
-
- if (pushed == 0 && p->is_Root() && !_matcher) {
- // Special case when backedges to root are not yet built
- for (int i = 0; i < _nodes.length(); i++) {
- if (_nodes.at(i) && _nodes.at(i)->node()->is_SafePoint() && _nodes.at(i)->node()->outcnt() == 0) {
- stack.push(_nodes.at(i)->node(), 0);
- }
- }
- }
-
- } else {
- stack.pop();
- }
- }
-
- build_dominators(&blocks);
-
- int **common_dominator = NEW_RESOURCE_ARRAY(int *, blocks.length());
- for (int i = 0; i < blocks.length(); i++) {
- int *cur = NEW_RESOURCE_ARRAY(int, blocks.length());
- common_dominator[i] = cur;
-
- for (int j=0; j<blocks.length(); j++) {
- cur[j] = 0;
- }
- }
-
- for (int i = 0; i < blocks.length(); i++) {
- blocks.adr_at(i)->add_child(blocks.adr_at(i)->index());
- }
- build_common_dominator(common_dominator, 0, &blocks);
-
- schedule_latest(common_dominator, &blocks);
-
- start_element(CONTROL_FLOW_ELEMENT);
-
- for (int i = 0; i < blocks.length(); i++) {
- Block *block = blocks.adr_at(i);
-
- Properties props;
- props.add(new Property(BLOCK_NAME_PROPERTY, i));
- props.add(new Property(BLOCK_DOMINATOR_PROPERTY, block->dominator()));
- start_element(BLOCK_ELEMENT, &props);
-
- if (block->succs()->length() > 0) {
- start_element(SUCCESSORS_ELEMENT);
- for (int j=0; j<block->succs()->length(); j++) {
- int cur_index = block->succs()->at(j);
- if (cur_index != 0 /* start_block has must not have inputs */) {
- Properties properties;
- properties.add(new Property(BLOCK_NAME_PROPERTY, cur_index));
- simple_element(SUCCESSOR_ELEMENT, &properties);
- }
- }
- end_element(SUCCESSORS_ELEMENT);
- }
-
- start_element(NODES_ELEMENT);
-
- for (int j=0; j<block->nodes()->length(); j++) {
- NodeDescription *n = block->nodes()->at(j);
- Properties properties;
- properties.add(new Property(NODE_ID_PROPERTY, n->id()));
- simple_element(NODE_ELEMENT, &properties);
- }
-
- end_element(NODES_ELEMENT);
-
- end_element(BLOCK_ELEMENT);
- }
-
-
- end_element(CONTROL_FLOW_ELEMENT);
-
- a->destruct_contents();
-}
-
void IdealGraphPrinter::print_method(Compile* compile, const char *name, int level, bool clear_nodes) {
print(compile, name, (Node *)compile->root(), level, clear_nodes);
}
@@ -1048,872 +652,53 @@
// Print current ideal graph
void IdealGraphPrinter::print(Compile* compile, const char *name, Node *node, int level, bool clear_nodes) {
-// if (finish && !in_method) return;
if (!_current_method || !_should_send_method || level > PrintIdealGraphLevel) return;
- assert(_current_method, "newMethod has to be called first!");
-
- if (clear_nodes) {
- int x = 0;
- }
-
- _clear_nodes = clear_nodes;
+ this->C = compile;
// Warning, unsafe cast?
- _chaitin = (PhaseChaitin *)compile->regalloc();
- _matcher = compile->matcher();
-
-
- // Update nodes
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc) {
- desc->set_state(Invalid);
- }
- }
- Node *n = node;
- walk(n);
-
- // Update edges
- for (int i = 0; i < _edges.length(); i++) {
- _edges.at(i)->set_state(Invalid);
- }
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc && desc->state() != Invalid) {
-
- int to = desc->id();
- uint len = desc->node()->len();
- for (uint j=0; j<len; j++) {
- Node *n = desc->node()->in(j);
-
- if (n) {
-
-
- intptr_t from = (intptr_t)n;
+ _chaitin = (PhaseChaitin *)C->regalloc();
- // Assert from node is valid
- /*
- bool ok = false;
- for (int k=0; k<_nodes.length(); k++) {
- NodeDescription *desc = _nodes.at(k);
- if (desc && desc->id() == from) {
- assert(desc->state() != Invalid, "");
- ok = true;
- }
- }
- assert(ok, "");*/
-
- uint index = j;
- if (index >= desc->node()->req()) {
- index = desc->node()->req();
- }
+ begin_head(GRAPH_ELEMENT);
+ print_attr(GRAPH_NAME_PROPERTY, (const char *)name);
+ end_head();
- print_edge(from, to, index);
- }
- }
- }
- }
-
- bool is_different = false;
-
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc && desc->state() != Valid) {
- is_different = true;
- break;
- }
- }
-
- if (!is_different) {
- for (int i = 0; i < _edges.length(); i++) {
- EdgeDescription *conn = _edges.at(i);
- if (conn && conn->state() != Valid) {
- is_different = true;
- break;
- }
- }
- }
+ head(NODES_ELEMENT);
+ walk_nodes(node, NULL);
+ tail(NODES_ELEMENT);
- // No changes -> do not print graph
- if (!is_different) return;
-
- Properties properties;
- properties.add(new Property(GRAPH_NAME_PROPERTY, (const char *)name));
- start_element(GRAPH_ELEMENT, &properties);
-
- start_element(NODES_ELEMENT);
- for (int i = 0; i < _nodes.length(); i++) {
- NodeDescription *desc = _nodes.at(i);
- if (desc) {
- desc->print(this);
- if (desc->state() == Invalid) {
- delete desc;
- _nodes.at_put(i, NULL);
- } else {
- desc->set_state(Valid);
- }
- }
- }
- end_element(NODES_ELEMENT);
-
- build_blocks(node);
-
- start_element(EDGES_ELEMENT);
- for (int i = 0; i < _edges.length(); i++) {
- EdgeDescription *conn = _edges.at(i);
-
- // Assert from and to nodes are valid
- /*
- if (!conn->state() == Invalid) {
- bool ok1 = false;
- bool ok2 = false;
- for (int j=0; j<_nodes.length(); j++) {
- NodeDescription *desc = _nodes.at(j);
- if (desc && desc->id() == conn->from()) {
- ok1 = true;
- }
+ head(EDGES_ELEMENT);
+ walk_nodes(node, (void *)1);
+ tail(EDGES_ELEMENT);
+ if (C->cfg() != NULL) {
+ head(CONTROL_FLOW_ELEMENT);
+ for (uint i = 0; i < C->cfg()->_blocks.size(); i++) {
+ Block *b = C->cfg()->_blocks[i];
+ begin_head(BLOCK_ELEMENT);
+ print_attr(BLOCK_NAME_PROPERTY, b->_pre_order);
+ end_head();
- if (desc && desc->id() == conn->to()) {
- ok2 = true;
- }
+ head(SUCCESSORS_ELEMENT);
+ for (uint s = 0; s < C->cfg()->_blocks[i]->_num_succs; s++) {
+ begin_elem(SUCCESSOR_ELEMENT);
+ print_attr(BLOCK_NAME_PROPERTY, b->_succs[s]->_pre_order);
+ end_elem();
}
-
- assert(ok1, "from node not found!");
- assert(ok2, "to node not found!");
- }*/
-
- conn->print(this);
- if (conn->state() == Invalid) {
- _edges.remove_at(i);
- delete conn;
- i--;
- }
- }
-
- end_element(EDGES_ELEMENT);
+ tail(SUCCESSORS_ELEMENT);
- end_element(GRAPH_ELEMENT);
-
- _output->flush();
-}
-
-// Print edge
-void IdealGraphPrinter::print_edge(int from, int to, int index) {
+ tail(BLOCK_ELEMENT);
+ }
- EdgeDescription *conn = new EdgeDescription(from, to, index);
- for (int i = 0; i < _edges.length(); i++) {
- if (_edges.at(i)->equals(conn)) {
- conn->set_state(Valid);
- delete _edges.at(i);
- _edges.at_put(i, conn);
- return;
- }
+ tail(CONTROL_FLOW_ELEMENT);
}
-
- _edges.append(conn);
+ tail(GRAPH_ELEMENT);
+ output()->flush();
}
extern const char *NodeClassNames[];
-// Create node description
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::create_node_description(Node* node) {
-
-#ifndef PRODUCT
- node->_in_dump_cnt++;
- NodeDescription *desc = new NodeDescription(node);
- desc->properties()->add(new Property(NODE_NAME_PROPERTY, (const char *)node->Name()));
-
- const Type *t = node->bottom_type();
- desc->properties()->add(new Property("type", (const char *)Type::msg[t->base()]));
-
- desc->properties()->add(new Property("idx", node->_idx));
-#ifdef ASSERT
- desc->properties()->add(new Property("debug_idx", node->_debug_idx));
-#endif
-
-
- const jushort flags = node->flags();
- if (flags & Node::Flag_is_Copy) {
- desc->properties()->add(new Property("is_copy", "true"));
- }
- if (flags & Node::Flag_is_Call) {
- desc->properties()->add(new Property("is_call", "true"));
- }
- if (flags & Node::Flag_rematerialize) {
- desc->properties()->add(new Property("rematerialize", "true"));
- }
- if (flags & Node::Flag_needs_anti_dependence_check) {
- desc->properties()->add(new Property("needs_anti_dependence_check", "true"));
- }
- if (flags & Node::Flag_is_macro) {
- desc->properties()->add(new Property("is_macro", "true"));
- }
- if (flags & Node::Flag_is_Con) {
- desc->properties()->add(new Property("is_con", "true"));
- }
- if (flags & Node::Flag_is_cisc_alternate) {
- desc->properties()->add(new Property("is_cisc_alternate", "true"));
- }
- if (flags & Node::Flag_is_Branch) {
- desc->properties()->add(new Property("is_branch", "true"));
- }
- if (flags & Node::Flag_is_block_start) {
- desc->properties()->add(new Property("is_block_start", "true"));
- }
- if (flags & Node::Flag_is_Goto) {
- desc->properties()->add(new Property("is_goto", "true"));
- }
- if (flags & Node::Flag_is_dead_loop_safe) {
- desc->properties()->add(new Property("is_dead_loop_safe", "true"));
- }
- if (flags & Node::Flag_may_be_short_branch) {
- desc->properties()->add(new Property("may_be_short_branch", "true"));
- }
- if (flags & Node::Flag_is_safepoint_node) {
- desc->properties()->add(new Property("is_safepoint_node", "true"));
- }
- if (flags & Node::Flag_is_pc_relative) {
- desc->properties()->add(new Property("is_pc_relative", "true"));
- }
-
- if (_matcher) {
- if (_matcher->is_shared(desc->node())) {
- desc->properties()->add(new Property("is_shared", "true"));
- } else {
- desc->properties()->add(new Property("is_shared", "false"));
- }
-
- if (_matcher->is_dontcare(desc->node())) {
- desc->properties()->add(new Property("is_dontcare", "true"));
- } else {
- desc->properties()->add(new Property("is_dontcare", "false"));
- }
- }
-
- if (node->is_Proj()) {
- desc->properties()->add(new Property("con", (int)node->as_Proj()->_con));
- }
-
- if (node->is_Mach()) {
- desc->properties()->add(new Property("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()]));
- }
-
-
-
-
-
- outputStream *oldTty = tty;
- buffer[0] = 0;
- stringStream s2(buffer, sizeof(buffer) - 1);
-
- node->dump_spec(&s2);
- assert(s2.size() < sizeof(buffer), "size in range");
- desc->properties()->add(new Property("dump_spec", buffer));
-
- if (node->is_block_proj()) {
- desc->properties()->add(new Property("is_block_proj", "true"));
- }
-
- if (node->is_block_start()) {
- desc->properties()->add(new Property("is_block_start", "true"));
- }
-
- const char *short_name = "short_name";
- if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) {
- int index = node->as_Proj()->_con - TypeFunc::Parms;
- if (index >= 10) {
- desc->properties()->add(new Property(short_name, "PA"));
- } else {
- sprintf(buffer, "P%d", index);
- desc->properties()->add(new Property(short_name, buffer));
- }
- } else if (strcmp(node->Name(), "IfTrue") == 0) {
- desc->properties()->add(new Property(short_name, "T"));
- } else if (strcmp(node->Name(), "IfFalse") == 0) {
- desc->properties()->add(new Property(short_name, "F"));
- } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) {
-
- if (t->base() == Type::Int && t->is_int()->is_con()) {
- const TypeInt *typeInt = t->is_int();
- assert(typeInt->is_con(), "must be constant");
- jint value = typeInt->get_con();
-
- // max. 2 chars allowed
- if (value >= -9 && value <= 99) {
- sprintf(buffer, "%d", value);
- desc->properties()->add(new Property(short_name, buffer));
- }
- else
- {
- desc->properties()->add(new Property(short_name, "I"));
- }
- } else if (t == Type::TOP) {
- desc->properties()->add(new Property(short_name, "^"));
- } else if (t->base() == Type::Long && t->is_long()->is_con()) {
- const TypeLong *typeLong = t->is_long();
- assert(typeLong->is_con(), "must be constant");
- jlong value = typeLong->get_con();
-
- // max. 2 chars allowed
- if (value >= -9 && value <= 99) {
- sprintf(buffer, "%d", value);
- desc->properties()->add(new Property(short_name, buffer));
- }
- else
- {
- desc->properties()->add(new Property(short_name, "L"));
- }
- } else if (t->base() == Type::KlassPtr) {
- const TypeKlassPtr *typeKlass = t->is_klassptr();
- desc->properties()->add(new Property(short_name, "CP"));
- } else if (t->base() == Type::Control) {
- desc->properties()->add(new Property(short_name, "C"));
- } else if (t->base() == Type::Memory) {
- desc->properties()->add(new Property(short_name, "M"));
- } else if (t->base() == Type::Abio) {
- desc->properties()->add(new Property(short_name, "IO"));
- } else if (t->base() == Type::Return_Address) {
- desc->properties()->add(new Property(short_name, "RA"));
- } else if (t->base() == Type::AnyPtr) {
- desc->properties()->add(new Property(short_name, "P"));
- } else if (t->base() == Type::RawPtr) {
- desc->properties()->add(new Property(short_name, "RP"));
- } else if (t->base() == Type::AryPtr) {
- desc->properties()->add(new Property(short_name, "AP"));
- }
- }
-
- if (node->is_SafePoint()) {
- SafePointNode *safePointNode = node->as_SafePoint();
- if (safePointNode->jvms()) {
- stringStream bciStream;
- bciStream.print("%d ", safePointNode->jvms()->bci());
- JVMState *caller = safePointNode->jvms()->caller();
- while(caller) {
- bciStream.print("%d ", caller->bci());
-
- caller = caller->caller();
- }
- desc->properties()->add(new Property("bci", bciStream.as_string()));
- }
- }
-
- if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) {
- buffer[0] = 0;
- _chaitin->dump_register(node, buffer);
- desc->properties()->add(new Property("reg", buffer));
- desc->properties()->add(new Property("lrg", _chaitin->n2lidx(node)));
- }
-
-
- node->_in_dump_cnt--;
- return desc;
-#else
- return NULL;
-#endif
-}
-
-void IdealGraphPrinter::pre_node(Node* node, void *env) {
-
- IdealGraphPrinter *printer = (IdealGraphPrinter *)env;
-
- NodeDescription *newDesc = printer->create_node_description(node);
-
- if (printer->_clear_nodes) {
-
- printer->_nodes.append(newDesc);
- } else {
-
- NodeDescription *desc = printer->_nodes.at_grow(node->_idx, NULL);
-
- if (desc && desc->equals(newDesc)) {
- //desc->set_state(Valid);
- //desc->set_node(node);
- delete desc;
- printer->_nodes.at_put(node->_idx, NULL);
- newDesc->set_state(Valid);
- //printer->_nodes.at_put(node->_idx, newDesc);
- } else {
-
- if (desc && desc->id() == newDesc->id()) {
- delete desc;
- printer->_nodes.at_put(node->_idx, NULL);
- newDesc->set_state(New);
-
- }
-
- //if (desc) {
- // delete desc;
- //}
-
- //printer->_nodes.at_put(node->_idx, newDesc);
- }
-
- printer->_nodes.append(newDesc);
- }
-}
-
-void IdealGraphPrinter::post_node(Node* node, void *env) {
-}
-
outputStream *IdealGraphPrinter::output() {
- return _output;
-}
-
-IdealGraphPrinter::Description::Description() {
- _state = New;
-}
-
-void IdealGraphPrinter::Description::print(IdealGraphPrinter *printer) {
- if (_state == Invalid) {
- print_removed(printer);
- } else if (_state == New) {
- print_changed(printer);
- }
-}
-
-void IdealGraphPrinter::Description::set_state(State s) {
- _state = s;
-}
-
-IdealGraphPrinter::State IdealGraphPrinter::Description::state() {
- return _state;
-}
-
-void IdealGraphPrinter::Block::set_proj(NodeDescription *n) {
- _proj = n;
-}
-
-void IdealGraphPrinter::Block::set_start(NodeDescription *n) {
- _start = n;
-}
-
-int IdealGraphPrinter::Block::semi() {
- return _semi;
-}
-
-int IdealGraphPrinter::Block::parent() {
- return _parent;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::bucket() {
- return &_bucket;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::children() {
- return &_children;
-}
-
-void IdealGraphPrinter::Block::add_child(int i) {
- _children.append(i);
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::dominates() {
- return &_dominates;
-}
-
-void IdealGraphPrinter::Block::add_dominates(int i) {
- _dominates.append(i);
-}
-
-void IdealGraphPrinter::Block::add_to_bucket(int i) {
- _bucket.append(i);
-}
-
-void IdealGraphPrinter::Block::clear_bucket() {
- _bucket.clear();
-}
-
-void IdealGraphPrinter::Block::set_dominator(int i) {
- _dominator = i;
-}
-
-void IdealGraphPrinter::Block::set_label(int i) {
- _label = i;
-}
-
-int IdealGraphPrinter::Block::label() {
- return _label;
-}
-
-int IdealGraphPrinter::Block::ancestor() {
- return _ancestor;
-}
-
-void IdealGraphPrinter::Block::set_ancestor(int i) {
- _ancestor = i;
-}
-
-int IdealGraphPrinter::Block::dominator() {
- return _dominator;
-}
-
-int IdealGraphPrinter::Block::index() {
- return _index;
-}
-
-void IdealGraphPrinter::Block::set_parent(int i) {
- _parent = i;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::pred() {
- return &_pred;
-}
-
-void IdealGraphPrinter::Block::set_semi(int i) {
- _semi = i;
-}
-
-IdealGraphPrinter::Block::Block() {
-}
-
-IdealGraphPrinter::Block::Block(int index) {
- _index = index;
- _label = index;
- _semi = -1;
- _ancestor = -1;
- _dominator = -1;
-}
-
-void IdealGraphPrinter::Block::add_pred(int i) {
- _pred.append(i);
-}
-
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::proj() {
- return _proj;
-}
-
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::start() {
- return _start;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::succs() {
- return &_succs;
-}
-
-void IdealGraphPrinter::Block::add_succ(int index) {
-
- if (this->_index == 16 && index == 15) {
- int x = 0;
- }
-
- if (!_succs.contains(index)) {
- _succs.append(index);
- }
-}
-
-
-void IdealGraphPrinter::Block::add_node(NodeDescription *n) {
- if (!_nodes.contains(n)) {
- _nodes.append(n);
- }
-}
-
-GrowableArray<IdealGraphPrinter::NodeDescription *>* IdealGraphPrinter::Block::nodes() {
- return &_nodes;
-}
-
-int IdealGraphPrinter::NodeDescription::count = 0;
-
-IdealGraphPrinter::NodeDescription::NodeDescription(Node* node) : _node(node) {
- _id = (intptr_t)(node);
- _block_index = -1;
-}
-
-IdealGraphPrinter::NodeDescription::~NodeDescription() {
- _properties.clean();
-}
-
-// void IdealGraphPrinter::NodeDescription::set_node(Node* node) {
-// //this->_node = node;
-// }
-
-int IdealGraphPrinter::NodeDescription::block_index() {
- return _block_index;
-}
-
-
-GrowableArray<IdealGraphPrinter::NodeDescription *>* IdealGraphPrinter::NodeDescription::succs() {
- return &_succs;
-}
-
-void IdealGraphPrinter::NodeDescription::clear_succs() {
- _succs.clear();
-}
-
-void IdealGraphPrinter::NodeDescription::init_succs() {
- _succs = GrowableArray<NodeDescription *>();
-}
-
-void IdealGraphPrinter::NodeDescription::add_succ(NodeDescription *desc) {
- _succs.append(desc);
-}
-
-void IdealGraphPrinter::NodeDescription::set_block_index(int i) {
- _block_index = i;
-}
-
-bool IdealGraphPrinter::NodeDescription::equals(NodeDescription *desc) {
- if (desc == NULL) return false;
- if (desc->id() != id()) return false;
- return properties()->equals(desc->properties());
-}
-
-Node* IdealGraphPrinter::NodeDescription::node() {
- return _node;
-}
-
-IdealGraphPrinter::Properties* IdealGraphPrinter::NodeDescription::properties() {
- return &_properties;
-}
-
-uint IdealGraphPrinter::NodeDescription::id() {
- return _id;
-}
-
-void IdealGraphPrinter::NodeDescription::print_changed(IdealGraphPrinter *printer) {
-
-
- Properties properties;
- properties.add(new Property(NODE_ID_PROPERTY, id()));
- printer->start_element(NODE_ELEMENT, &properties);
-
- this->properties()->print(printer);
-
-
- printer->end_element(NODE_ELEMENT);
-}
-
-void IdealGraphPrinter::NodeDescription::print_removed(IdealGraphPrinter *printer) {
-
- Properties properties;
- properties.add(new Property(NODE_ID_PROPERTY, id()));
- printer->simple_element(REMOVE_NODE_ELEMENT, &properties);
-}
-
-IdealGraphPrinter::EdgeDescription::EdgeDescription(int from, int to, int index) {
- this->_from = from;
- this->_to = to;
- this->_index = index;
-}
-
-IdealGraphPrinter::EdgeDescription::~EdgeDescription() {
-}
-
-int IdealGraphPrinter::EdgeDescription::from() {
- return _from;
-}
-
-int IdealGraphPrinter::EdgeDescription::to() {
- return _to;
-}
-
-void IdealGraphPrinter::EdgeDescription::print_changed(IdealGraphPrinter *printer) {
-
- Properties properties;
- properties.add(new Property(INDEX_PROPERTY, _index));
- properties.add(new Property(FROM_PROPERTY, _from));
- properties.add(new Property(TO_PROPERTY, _to));
- printer->simple_element(EDGE_ELEMENT, &properties);
-}
-
-void IdealGraphPrinter::EdgeDescription::print_removed(IdealGraphPrinter *printer) {
-
- Properties properties;
- properties.add(new Property(INDEX_PROPERTY, _index));
- properties.add(new Property(FROM_PROPERTY, _from));
- properties.add(new Property(TO_PROPERTY, _to));
- printer->simple_element(REMOVE_EDGE_ELEMENT, &properties);
-}
-
-bool IdealGraphPrinter::EdgeDescription::equals(IdealGraphPrinter::EdgeDescription *desc) {
- if (desc == NULL) return false;
- return (_from == desc->_from && _to == desc->_to && _index == desc->_index);
-}
-
-IdealGraphPrinter::Properties::Properties() : list(new (ResourceObj::C_HEAP) GrowableArray<Property *>(2, 0, NULL, true)) {
-}
-
-IdealGraphPrinter::Properties::~Properties() {
- clean();
- delete list;
-}
-
-void IdealGraphPrinter::Properties::add(Property *p) {
- assert(p != NULL, "Property not NULL");
- list->append(p);
-}
-
-void IdealGraphPrinter::Properties::print(IdealGraphPrinter *printer) {
- printer->start_element(PROPERTIES_ELEMENT);
-
- for (int i = 0; i < list->length(); i++) {
- list->at(i)->print(printer);
- }
-
- printer->end_element(PROPERTIES_ELEMENT);
-}
-
-void IdealGraphPrinter::Properties::clean() {
- for (int i = 0; i < list->length(); i++) {
- delete list->at(i);
- list->at_put(i, NULL);
- }
- list->clear();
- assert(list->length() == 0, "List cleared");
-}
-
-void IdealGraphPrinter::Properties::remove(const char *name) {
- for (int i = 0; i < list->length(); i++) {
- if (strcmp(list->at(i)->name(), name) == 0) {
- delete list->at(i);
- list->remove_at(i);
- i--;
- }
- }
-}
-
-void IdealGraphPrinter::Properties::print_as_attributes(IdealGraphPrinter *printer) {
-
- for (int i = 0; i < list->length(); i++) {
- assert(list->at(i) != NULL, "Property not null!");
- printer->output()->print(" ");
- list->at(i)->print_as_attribute(printer);
- }
-}
-
-bool IdealGraphPrinter::Properties::equals(Properties* p) {
- if (p->list->length() != this->list->length()) return false;
-
- for (int i = 0; i < list->length(); i++) {
- assert(list->at(i) != NULL, "Property not null!");
- if (!list->at(i)->equals(p->list->at(i))) return false;
- }
-
- return true;
-}
-
-IdealGraphPrinter::Property::Property() {
- _name = NULL;
- _value = NULL;
-}
-
-const char *IdealGraphPrinter::Property::name() {
- return _name;
-}
-
-IdealGraphPrinter::Property::Property(const Property* p) {
-
- this->_name = NULL;
- this->_value = NULL;
-
- if (p->_name != NULL) {
- _name = dup(p->_name);
- }
-
- if (p->_value) {
- _value = dup(p->_value);
- }
-}
-
-IdealGraphPrinter::Property::~Property() {
-
- clean();
-}
-
-IdealGraphPrinter::Property::Property(const char *name, const char *value) {
-
- assert(name, "Name must not be null!");
- assert(value, "Value must not be null!");
-
- _name = dup(name);
- _value = dup(value);
-}
-
-IdealGraphPrinter::Property::Property(const char *name, int intValue) {
- _name = dup(name);
-
- stringStream stream;
- stream.print("%d", intValue);
- _value = dup(stream.as_string());
-}
-
-void IdealGraphPrinter::Property::clean() {
- if (_name) {
- delete _name;
- _name = NULL;
- }
-
- if (_value) {
- delete _value;
- _value = NULL;
- }
-}
-
-
-bool IdealGraphPrinter::Property::is_null() {
- return _name == NULL;
-}
-
-void IdealGraphPrinter::Property::print(IdealGraphPrinter *printer) {
-
- assert(!is_null(), "null properties cannot be printed!");
- Properties properties;
- properties.add(new Property(PROPERTY_NAME_PROPERTY, _name));
- printer->start_element(PROPERTY_ELEMENT, &properties, false, false);
- printer->print_xml(_value);
- printer->end_element(PROPERTY_ELEMENT, false, true);
-}
-
-void IdealGraphPrinter::Property::print_as_attribute(IdealGraphPrinter *printer) {
-
- printer->output()->print(_name);
- printer->output()->print("=\"");
- printer->print_xml(_value);
- printer->output()->print("\"");
-}
-
-
-bool IdealGraphPrinter::Property::equals(Property* p) {
-
- if (is_null() && p->is_null()) return true;
- if (is_null()) return false;
- if (p->is_null()) return false;
-
- int cmp1 = strcmp(p->_name, _name);
- if (cmp1 != 0) return false;
-
- int cmp2 = strcmp(p->_value, _value);
- if (cmp2 != 0) return false;
-
- return true;
-}
-
-void IdealGraphPrinter::print_xml(const char *value) {
- size_t len = strlen(value);
-
- char buf[2];
- buf[1] = 0;
- for (size_t i = 0; i < len; i++) {
- char c = value[i];
-
- switch(c) {
- case '<':
- output()->print("<");
- break;
-
- case '>':
- output()->print(">");
- break;
-
- default:
- buf[0] = c;
- output()->print(buf);
- break;
- }
- }
+ return _xml;
}
#endif
--- a/hotspot/src/share/vm/opto/idealGraphPrinter.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/idealGraphPrinter.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -82,222 +82,42 @@
static const char *METHOD_SHORT_NAME_PROPERTY;
static const char *ASSEMBLY_ELEMENT;
- class Property {
-
- private:
-
- const char *_name;
- const char *_value;
-
- public:
-
- Property();
- Property(const Property* p);
- ~Property();
- Property(const char *name, const char *value);
- Property(const char *name, int value);
- bool equals(Property* p);
- void print(IdealGraphPrinter *printer);
- void print_as_attribute(IdealGraphPrinter *printer);
- bool is_null();
- void clean();
- const char *name();
-
- static const char* dup(const char *str) {
- char * copy = new char[strlen(str)+1];
- strcpy(copy, str);
- return copy;
- }
-
- };
-
- class Properties {
-
- private:
-
- GrowableArray<Property *> *list;
-
- public:
-
- Properties();
- ~Properties();
- void add(Property *p);
- void remove(const char *name);
- bool equals(Properties* p);
- void print(IdealGraphPrinter *printer);
- void print_as_attributes(IdealGraphPrinter *printer);
- void clean();
-
- };
-
-
- class Description {
-
- private:
-
- State _state;
-
- public:
-
- Description();
-
- State state();
- void set_state(State s);
- void print(IdealGraphPrinter *printer);
- virtual void print_changed(IdealGraphPrinter *printer) = 0;
- virtual void print_removed(IdealGraphPrinter *printer) = 0;
-
- };
-
- class NodeDescription : public Description{
-
- public:
-
- static int count;
-
- private:
-
- GrowableArray<NodeDescription *> _succs;
- int _block_index;
- uintptr_t _id;
- Properties _properties;
- Node* _node;
-
- public:
-
- NodeDescription(Node* node);
- ~NodeDescription();
- Node* node();
-
- // void set_node(Node* node);
- GrowableArray<NodeDescription *>* succs();
- void init_succs();
- void clear_succs();
- void add_succ(NodeDescription *desc);
- int block_index();
- void set_block_index(int i);
- Properties* properties();
- virtual void print_changed(IdealGraphPrinter *printer);
- virtual void print_removed(IdealGraphPrinter *printer);
- bool equals(NodeDescription *desc);
- uint id();
-
- };
-
- class Block {
-
- private:
-
- NodeDescription *_start;
- NodeDescription *_proj;
- GrowableArray<int> _succs;
- GrowableArray<NodeDescription *> _nodes;
- GrowableArray<int> _dominates;
- GrowableArray<int> _children;
- int _semi;
- int _parent;
- GrowableArray<int> _pred;
- GrowableArray<int> _bucket;
- int _index;
- int _dominator;
- int _ancestor;
- int _label;
-
- public:
-
- Block();
- Block(int index);
-
- void add_node(NodeDescription *n);
- GrowableArray<NodeDescription *>* nodes();
- GrowableArray<int>* children();
- void add_child(int i);
- void add_succ(int index);
- GrowableArray<int>* succs();
- GrowableArray<int>* dominates();
- void add_dominates(int i);
- NodeDescription *start();
- NodeDescription *proj();
- void set_start(NodeDescription *n);
- void set_proj(NodeDescription *n);
-
- int label();
- void set_label(int i);
- int ancestor();
- void set_ancestor(int i);
- int index();
- int dominator();
- void set_dominator(int i);
- int parent();
- void set_parent(int i);
- int semi();
- GrowableArray<int>* bucket();
- void add_to_bucket(int i);
- void clear_bucket();
- GrowableArray<int>* pred();
- void set_semi(int i);
- void add_pred(int i);
-
- };
-
- class EdgeDescription : public Description {
-
- private:
-
- int _from;
- int _to;
- int _index;
- public:
-
- EdgeDescription(int from, int to, int index);
- ~EdgeDescription();
-
- virtual void print_changed(IdealGraphPrinter *printer);
- virtual void print_removed(IdealGraphPrinter *printer);
- bool equals(EdgeDescription *desc);
- int from();
- int to();
- };
-
+ elapsedTimer _walk_time;
+ elapsedTimer _output_time;
+ elapsedTimer _build_blocks_time;
static int _file_count;
networkStream *_stream;
+ xmlStream *_xml;
outputStream *_output;
ciMethod *_current_method;
- GrowableArray<NodeDescription *> _nodes;
- GrowableArray<EdgeDescription *> _edges;
int _depth;
- Arena *_arena;
char buffer[128];
bool _should_send_method;
PhaseChaitin* _chaitin;
- bool _clear_nodes;
- Matcher* _matcher;
bool _traverse_outs;
-
- void start_element_helper(const char *name, Properties *properties, bool endElement, bool print_indent = false, bool print_return = true);
- NodeDescription *create_node_description(Node* node);
+ Compile *C;
static void pre_node(Node* node, void *env);
static void post_node(Node* node, void *env);
- void schedule_latest(int **common_dominator, GrowableArray<Block>* blocks);
- void build_common_dominator(int **common_dominator, int index, GrowableArray<Block>* blocks);
- void compress(int index, GrowableArray<Block>* blocks);
- int eval(int index, GrowableArray<Block>* blocks);
- void link(int index1, int index2, GrowableArray<Block>* blocks);
- void build_dominators(GrowableArray<Block>* blocks);
- void build_blocks(Node *node);
- void walk(Node *n);
- void start_element(const char *name, Properties *properties = NULL, bool print_indent = false, bool print_return = true);
- void simple_element(const char *name, Properties *properties = NULL, bool print_indent = false);
- void end_element(const char *name, bool print_indent = false, bool print_return = true);
- void print_edge(int from, int to, int index);
void print_indent();
void print_method(ciMethod *method, int bci, InlineTree *tree);
void print_inline_tree(InlineTree *tree);
- void clear_nodes();
-
+ void visit_node(Node *n, void *param);
+ void walk_nodes(Node *start, void *param);
+ void begin_elem(const char *s);
+ void end_elem();
+ void begin_head(const char *s);
+ void end_head();
+ void print_attr(const char *name, const char *val);
+ void print_attr(const char *name, intptr_t val);
+ void print_prop(const char *name, const char *val);
+ void print_prop(const char *name, int val);
+ void tail(const char *name);
+ void head(const char *name);
+ void text(const char *s);
+ intptr_t get_node_id(Node *n);
IdealGraphPrinter();
~IdealGraphPrinter();
@@ -308,7 +128,6 @@
bool traverse_outs();
void set_traverse_outs(bool b);
- void print_ifg(PhaseIFG* ifg);
outputStream *output();
void print_inlining(Compile* compile);
void begin_method(Compile* compile);
--- a/hotspot/src/share/vm/opto/library_call.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -2194,14 +2194,15 @@
pre_barrier(control(), base, adr, alias_idx, newval, value_type, T_OBJECT);
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
+ Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
+ Node *oldval_enc = _gvn.transform(new (C, 2) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
cas = _gvn.transform(new (C, 5) CompareAndSwapNNode(control(), mem, adr,
- EncodePNode::encode(&_gvn, newval),
- EncodePNode::encode(&_gvn, oldval)));
+ newval_enc, oldval_enc));
} else
#endif
- {
- cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
- }
+ {
+ cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
+ }
post_barrier(control(), cas, base, adr, alias_idx, newval, T_OBJECT, true);
break;
default:
--- a/hotspot/src/share/vm/opto/loopTransform.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -690,7 +690,7 @@
// (the main-loop trip-counter exit value) because we will be changing
// the exit value (via unrolling) so we cannot constant-fold away the zero
// trip guard until all unrolling is done.
- Node *zer_opaq = new (C, 2) Opaque1Node(incr);
+ Node *zer_opaq = new (C, 2) Opaque1Node(C, incr);
Node *zer_cmp = new (C, 3) CmpINode( zer_opaq, limit );
Node *zer_bol = new (C, 2) BoolNode( zer_cmp, b_test );
register_new_node( zer_opaq, new_main_exit );
@@ -760,7 +760,7 @@
// pre-loop, the main-loop may not execute at all. Later in life this
// zero-trip guard will become the minimum-trip guard when we unroll
// the main-loop.
- Node *min_opaq = new (C, 2) Opaque1Node(limit);
+ Node *min_opaq = new (C, 2) Opaque1Node(C, limit);
Node *min_cmp = new (C, 3) CmpINode( pre_incr, min_opaq );
Node *min_bol = new (C, 2) BoolNode( min_cmp, b_test );
register_new_node( min_opaq, new_pre_exit );
@@ -810,7 +810,7 @@
// Save the original loop limit in this Opaque1 node for
// use by range check elimination.
- Node *pre_opaq = new (C, 3) Opaque1Node(pre_limit, limit);
+ Node *pre_opaq = new (C, 3) Opaque1Node(C, pre_limit, limit);
register_new_node( pre_limit, pre_head->in(0) );
register_new_node( pre_opaq , pre_head->in(0) );
--- a/hotspot/src/share/vm/opto/loopUnswitch.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -205,7 +205,7 @@
Node *cont = _igvn.intcon(1);
set_ctrl(cont, C->root());
- Node* opq = new (C, 2) Opaque1Node(cont);
+ Node* opq = new (C, 2) Opaque1Node(C, cont);
register_node(opq, outer_loop, entry, dom_depth(entry));
Node *bol = new (C, 2) Conv2BNode(opq);
register_node(bol, outer_loop, entry, dom_depth(entry));
--- a/hotspot/src/share/vm/opto/loopnode.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -1072,8 +1072,6 @@
phase->_igvn.add_users_to_worklist(l->fast_out(i));
}
- phase->C->print_method("After beautify loops", 3);
-
// Now recursively beautify nested loops
if( _child ) result |= _child->beautify_loops( phase );
if( _next ) result |= _next ->beautify_loops( phase );
@@ -1470,6 +1468,8 @@
}
// Reset loop nesting depth
_ltree_root->set_nest( 0 );
+
+ C->print_method("After beautify loops", 3);
}
}
--- a/hotspot/src/share/vm/opto/loopopts.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -41,7 +41,7 @@
const Type* type = n->bottom_type();
const TypeOopPtr *t_oop = _igvn.type(n)->isa_oopptr();
Node *phi;
- if( t_oop != NULL && t_oop->is_instance_field() ) {
+ if( t_oop != NULL && t_oop->is_known_instance_field() ) {
int iid = t_oop->instance_id();
int index = C->get_alias_index(t_oop);
int offset = t_oop->offset();
@@ -2685,7 +2685,7 @@
if( !cle->stride_is_con() ) continue;
// Hit! Refactor use to use the post-incremented tripcounter.
// Compute a post-increment tripcounter.
- Node *opaq = new (C, 2) Opaque2Node( cle->incr() );
+ Node *opaq = new (C, 2) Opaque2Node( C, cle->incr() );
register_new_node( opaq, u_ctrl );
Node *neg_stride = _igvn.intcon(-cle->stride_con());
set_ctrl(neg_stride, C->root());
--- a/hotspot/src/share/vm/opto/machnode.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/machnode.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -262,17 +262,19 @@
// Now we have collected every part of the ADLC MEMORY_INTER.
// See if it adds up to a base + offset.
if (index != NULL) {
- if (!index->is_Con()) {
- const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop();
- if (narrowoop != NULL) {
- // Memory references through narrow oops have a
- // funny base so grab the type from the index.
- adr_type = narrowoop->make_oopptr();
- return NULL;
- }
+ const Type* t_index = index->bottom_type();
+ if (t_index->isa_narrowoop()) { // EncodeN, LoadN, LoadConN, LoadNKlass.
+ // Memory references through narrow oops have a
+ // funny base so grab the type from the index:
+ // [R12 + narrow_oop_reg<<3 + offset]
+ assert(base == NULL, "Memory references through narrow oops have no base");
+ offset = disp;
+ adr_type = t_index->make_ptr()->add_offset(offset);
+ return NULL;
+ } else if (!index->is_Con()) {
disp = Type::OffsetBot;
} else if (disp != Type::OffsetBot) {
- const TypeX* ti = index->bottom_type()->isa_intptr_t();
+ const TypeX* ti = t_index->isa_intptr_t();
if (ti == NULL) {
disp = Type::OffsetBot; // a random constant??
} else {
--- a/hotspot/src/share/vm/opto/macro.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/macro.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -320,9 +320,9 @@
// Search the last value stored into the object's field.
Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc) {
- assert(adr_t->is_instance_field(), "instance required");
- uint instance_id = adr_t->instance_id();
- assert(instance_id == alloc->_idx, "wrong allocation");
+ assert(adr_t->is_known_instance_field(), "instance required");
+ int instance_id = adr_t->instance_id();
+ assert((uint)instance_id == alloc->_idx, "wrong allocation");
int alias_idx = C->get_alias_index(adr_t);
int offset = adr_t->offset();
@@ -354,7 +354,7 @@
const TypeOopPtr* atype = mem->as_Store()->adr_type()->isa_oopptr();
assert(atype != NULL, "address type must be oopptr");
assert(C->get_alias_index(atype) == alias_idx &&
- atype->is_instance_field() && atype->offset() == offset &&
+ atype->is_known_instance_field() && atype->offset() == offset &&
atype->instance_id() == instance_id, "store is correct memory slice");
done = true;
} else if (mem->is_Phi()) {
@@ -598,7 +598,7 @@
field_type = TypeOopPtr::make_from_klass(elem_type->as_klass());
}
if (UseCompressedOops) {
- field_type = field_type->is_oopptr()->make_narrowoop();
+ field_type = field_type->make_narrowoop();
basic_elem_type = T_NARROWOOP;
}
} else {
@@ -666,9 +666,11 @@
if (UseCompressedOops && field_type->isa_narrowoop()) {
// Enable "DecodeN(EncodeP(Allocate)) --> Allocate" transformation
// to be able scalar replace the allocation.
- _igvn.set_delay_transform(false);
- field_val = DecodeNNode::decode(&_igvn, field_val);
- _igvn.set_delay_transform(true);
+ if (field_val->is_EncodeP()) {
+ field_val = field_val->in(1);
+ } else {
+ field_val = transform_later(new (C, 2) DecodeNNode(field_val, field_val->bottom_type()->make_ptr()));
+ }
}
sfpt->add_req(field_val);
}
@@ -1674,7 +1676,14 @@
success = eliminate_locking_node(n->as_AbstractLock());
break;
default:
- assert(false, "unknown node type in macro list");
+ if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) {
+ _igvn.add_users_to_worklist(n);
+ _igvn.hash_delete(n);
+ _igvn.subsume_node(n, n->in(1));
+ success = true;
+ } else {
+ assert(false, "unknown node type in macro list");
+ }
}
assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count");
progress = progress || success;
--- a/hotspot/src/share/vm/opto/matcher.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/matcher.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -51,6 +51,7 @@
PhaseTransform( Phase::Ins_Select ),
#ifdef ASSERT
_old2new_map(C->comp_arena()),
+ _new2old_map(C->comp_arena()),
#endif
_shared_nodes(C->comp_arena()),
_reduceOp(reduceOp), _leftOp(leftOp), _rightOp(rightOp),
@@ -82,6 +83,7 @@
idealreg2debugmask[Op_RegF] = NULL;
idealreg2debugmask[Op_RegD] = NULL;
idealreg2debugmask[Op_RegP] = NULL;
+ debug_only(_mem_node = NULL;) // Ideal memory node consumed by mach node
}
//------------------------------warp_incoming_stk_arg------------------------
@@ -834,10 +836,16 @@
if( n->is_Proj() && n->in(0)->is_Multi()) { // Projections?
// Convert to machine-dependent projection
m = n->in(0)->as_Multi()->match( n->as_Proj(), this );
+#ifdef ASSERT
+ _new2old_map.map(m->_idx, n);
+#endif
if (m->in(0) != NULL) // m might be top
collect_null_checks(m);
} else { // Else just a regular 'ol guy
m = n->clone(); // So just clone into new-space
+#ifdef ASSERT
+ _new2old_map.map(m->_idx, n);
+#endif
// Def-Use edges will be added incrementally as Uses
// of this node are matched.
assert(m->outcnt() == 0, "no Uses of this clone yet");
@@ -886,6 +894,9 @@
// || op == Op_BoxLock // %%%% enable this and remove (+++) in chaitin.cpp
) {
m = m->clone();
+#ifdef ASSERT
+ _new2old_map.map(m->_idx, n);
+#endif
mstack.push(m, Post_Visit, n, i); // Don't neet to visit
mstack.push(m->in(0), Visit, m, 0);
} else {
@@ -1153,7 +1164,10 @@
// StoreNodes require their Memory input to match any LoadNodes
Node *mem = n->is_Store() ? n->in(MemNode::Memory) : (Node*)1 ;
-
+#ifdef ASSERT
+ Node* save_mem_node = _mem_node;
+ _mem_node = n->is_Store() ? (Node*)n : NULL;
+#endif
// State object for root node of match tree
// Allocate it on _states_arena - stack allocation can cause stack overflow.
State *s = new (&_states_arena) State;
@@ -1186,6 +1200,7 @@
MachNode *m = ReduceInst( s, s->_rule[mincost], mem );
#ifdef ASSERT
_old2new_map.map(n->_idx, m);
+ _new2old_map.map(m->_idx, (Node*)n);
#endif
// Add any Matcher-ignored edges
@@ -1205,6 +1220,7 @@
}
}
+ debug_only( _mem_node = save_mem_node; )
return m;
}
@@ -1445,8 +1461,30 @@
}
// If a Memory was used, insert a Memory edge
- if( mem != (Node*)1 )
+ if( mem != (Node*)1 ) {
mach->ins_req(MemNode::Memory,mem);
+#ifdef ASSERT
+ // Verify adr type after matching memory operation
+ const MachOper* oper = mach->memory_operand();
+ if (oper != NULL && oper != (MachOper*)-1 &&
+ mach->adr_type() != TypeRawPtr::BOTTOM) { // non-direct addressing mode
+ // It has a unique memory operand. Find corresponding ideal mem node.
+ Node* m = NULL;
+ if (leaf->is_Mem()) {
+ m = leaf;
+ } else {
+ m = _mem_node;
+ assert(m != NULL && m->is_Mem(), "expecting memory node");
+ }
+ if (m->adr_type() != mach->adr_type()) {
+ m->dump();
+ tty->print_cr("mach:");
+ mach->dump(1);
+ }
+ assert(m->adr_type() == mach->adr_type(), "matcher should not change adr type");
+ }
+#endif
+ }
// If the _leaf is an AddP, insert the base edge
if( leaf->is_AddP() )
@@ -1464,6 +1502,9 @@
for( uint i=0; i<mach->req(); i++ ) {
mach->set_req(i,NULL);
}
+#ifdef ASSERT
+ _new2old_map.map(ex->_idx, s->_leaf);
+#endif
}
// PhaseChaitin::fixup_spills will sometimes generate spill code
@@ -1510,7 +1551,9 @@
assert( newrule >= _LAST_MACH_OPER, "Do NOT chain from internal operand");
mach->_opnds[1] = s->MachOperGenerator( _reduceOp[catch_op], C );
Node *mem1 = (Node*)1;
+ debug_only(Node *save_mem_node = _mem_node;)
mach->add_req( ReduceInst(s, newrule, mem1) );
+ debug_only(_mem_node = save_mem_node;)
}
return;
}
@@ -1520,6 +1563,7 @@
if( s->_leaf->is_Load() ) {
Node *mem2 = s->_leaf->in(MemNode::Memory);
assert( mem == (Node*)1 || mem == mem2, "multiple Memories being matched at once?" );
+ debug_only( if( mem == (Node*)1 ) _mem_node = s->_leaf;)
mem = mem2;
}
if( s->_leaf->in(0) != NULL && s->_leaf->req() > 1) {
@@ -1563,7 +1607,9 @@
// --> ReduceInst( newrule )
mach->_opnds[num_opnds++] = s->MachOperGenerator( _reduceOp[catch_op], C );
Node *mem1 = (Node*)1;
+ debug_only(Node *save_mem_node = _mem_node;)
mach->add_req( ReduceInst( newstate, newrule, mem1 ) );
+ debug_only(_mem_node = save_mem_node;)
}
}
assert( mach->_opnds[num_opnds-1], "" );
@@ -1594,6 +1640,7 @@
if( s->_leaf->is_Load() ) {
assert( mem == (Node*)1, "multiple Memories being matched at once?" );
mem = s->_leaf->in(MemNode::Memory);
+ debug_only(_mem_node = s->_leaf;)
}
if( s->_leaf->in(0) && s->_leaf->req() > 1) {
if( !mach->in(0) )
@@ -1618,7 +1665,9 @@
// Reduce the instruction, and add a direct pointer from this
// machine instruction to the newly reduced one.
Node *mem1 = (Node*)1;
+ debug_only(Node *save_mem_node = _mem_node;)
mach->add_req( ReduceInst( kid, newrule, mem1 ) );
+ debug_only(_mem_node = save_mem_node;)
}
}
}
@@ -1731,8 +1780,8 @@
}
case Op_ConN: { // Convert narrow pointers above the centerline to NUL
TypeNode *tn = n->as_Type(); // Constants derive from type nodes
- const TypePtr* tp = tn->type()->is_narrowoop()->make_oopptr();
- if (tp->_ptr == TypePtr::AnyNull) {
+ const TypePtr* tp = tn->type()->make_ptr();
+ if (tp && tp->_ptr == TypePtr::AnyNull) {
tn->set_type(TypeNarrowOop::NULL_PTR);
}
break;
--- a/hotspot/src/share/vm/opto/matcher.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/matcher.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -84,6 +84,7 @@
Node_Array _shared_nodes;
debug_only(Node_Array _old2new_map;) // Map roots of ideal-trees to machine-roots
+ debug_only(Node_Array _new2old_map;) // Maps machine nodes back to ideal
// Accessors for the inherited field PhaseTransform::_nodes:
void grow_new_node_array(uint idx_limit) {
@@ -104,6 +105,8 @@
#ifdef ASSERT
// Make sure only new nodes are reachable from this node
void verify_new_nodes_only(Node* root);
+
+ Node* _mem_node; // Ideal memory node consumed by mach node
#endif
public:
@@ -388,5 +391,9 @@
#ifdef ASSERT
void dump_old2new_map(); // machine-independent to machine-dependent
+
+ Node* find_old_node(Node* new_node) {
+ return _new2old_map[new_node->_idx];
+ }
#endif
};
--- a/hotspot/src/share/vm/opto/memnode.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/memnode.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -91,7 +91,7 @@
Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
const TypeOopPtr *tinst = t_adr->isa_oopptr();
- if (tinst == NULL || !tinst->is_instance_field())
+ if (tinst == NULL || !tinst->is_known_instance_field())
return mchain; // don't try to optimize non-instance types
uint instance_id = tinst->instance_id();
Node *prev = NULL;
@@ -125,7 +125,7 @@
Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
const TypeOopPtr *t_oop = t_adr->isa_oopptr();
- bool is_instance = (t_oop != NULL) && t_oop->is_instance_field();
+ bool is_instance = (t_oop != NULL) && t_oop->is_known_instance_field();
PhaseIterGVN *igvn = phase->is_IterGVN();
Node *result = mchain;
result = optimize_simple_memory_chain(result, t_adr, phase);
@@ -134,8 +134,8 @@
assert(mphi->bottom_type() == Type::MEMORY, "memory phi required");
const TypePtr *t = mphi->adr_type();
if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||
- t->isa_oopptr() && !t->is_oopptr()->is_instance() &&
- t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop) {
+ t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&
+ t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop) {
// clone the Phi with our address type
result = mphi->split_out_instance(t_adr, igvn);
} else {
@@ -470,7 +470,7 @@
return mem; // let caller handle steps (c), (d)
}
- } else if (addr_t != NULL && addr_t->is_instance_field()) {
+ } else if (addr_t != NULL && addr_t->is_known_instance_field()) {
// Can't use optimize_simple_memory_chain() since it needs PhaseGVN.
if (mem->is_Proj() && mem->in(0)->is_Call()) {
CallNode *call = mem->in(0)->as_Call();
@@ -769,15 +769,8 @@
case T_OBJECT:
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- const TypeNarrowOop* narrowtype;
- if (rt->isa_narrowoop()) {
- narrowtype = rt->is_narrowoop();
- } else {
- narrowtype = rt->is_oopptr()->make_narrowoop();
- }
- Node* load = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, narrowtype));
-
- return DecodeNNode::decode(&gvn, load);
+ Node* load = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop()));
+ return new (C, 2) DecodeNNode(load, load->bottom_type()->make_ptr());
} else
#endif
{
@@ -923,7 +916,7 @@
in(MemNode::Address)->is_AddP() ) {
const TypeOopPtr* t_oop = in(MemNode::Address)->bottom_type()->isa_oopptr();
// Only instances.
- if( t_oop != NULL && t_oop->is_instance_field() &&
+ if( t_oop != NULL && t_oop->is_known_instance_field() &&
t_oop->offset() != Type::OffsetBot &&
t_oop->offset() != Type::OffsetTop) {
return true;
@@ -1146,7 +1139,7 @@
const TypeOopPtr *t_oop = addr_t->isa_oopptr();
assert(mem->is_Phi() && (t_oop != NULL) &&
- t_oop->is_instance_field(), "invalide conditions");
+ t_oop->is_known_instance_field(), "invalide conditions");
Node *region = mem->in(0);
if (region == NULL) {
@@ -1314,7 +1307,7 @@
}
const TypeOopPtr *t_oop = addr_t->isa_oopptr();
if (can_reshape && opt_mem->is_Phi() &&
- (t_oop != NULL) && t_oop->is_instance_field()) {
+ (t_oop != NULL) && t_oop->is_known_instance_field()) {
// Split instance field load through Phi.
Node* result = split_through_phi(phase);
if (result != NULL) return result;
@@ -1549,7 +1542,7 @@
}
const TypeOopPtr *tinst = tp->isa_oopptr();
- if (tinst != NULL && tinst->is_instance_field()) {
+ if (tinst != NULL && tinst->is_known_instance_field()) {
// If we have an instance type and our memory input is the
// programs's initial memory state, there is no matching store,
// so just return a zero of the appropriate type
@@ -1631,9 +1624,8 @@
assert(adr_type != NULL, "expecting TypeOopPtr");
#ifdef _LP64
if (adr_type->is_ptr_to_narrowoop()) {
- const TypeNarrowOop* narrowtype = tk->is_oopptr()->make_narrowoop();
- Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, narrowtype));
- return DecodeNNode::decode(&gvn, load_klass);
+ Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowoop()));
+ return new (C, 2) DecodeNNode(load_klass, load_klass->bottom_type()->make_ptr());
}
#endif
assert(!adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
@@ -1843,15 +1835,10 @@
//------------------------------Value------------------------------------------
const Type *LoadNKlassNode::Value( PhaseTransform *phase ) const {
const Type *t = klass_value_common(phase);
-
- if (t == TypePtr::NULL_PTR) {
- return TypeNarrowOop::NULL_PTR;
- }
- if (t != Type::TOP && !t->isa_narrowoop()) {
- assert(t->is_oopptr(), "sanity");
- t = t->is_oopptr()->make_narrowoop();
- }
- return t;
+ if (t == Type::TOP)
+ return t;
+
+ return t->make_narrowoop();
}
//------------------------------Identity---------------------------------------
@@ -1864,7 +1851,7 @@
if( t == Type::TOP ) return x;
if( t->isa_narrowoop()) return x;
- return EncodePNode::encode(phase, x);
+ return phase->transform(new (phase->C, 2) EncodePNode(x, t->make_narrowoop()));
}
//------------------------------Value-----------------------------------------
@@ -1930,14 +1917,13 @@
if (adr->bottom_type()->is_ptr_to_narrowoop() ||
(UseCompressedOops && val->bottom_type()->isa_klassptr() &&
adr->bottom_type()->isa_rawptr())) {
- const TypePtr* type = val->bottom_type()->is_ptr();
- Node* cp = EncodePNode::encode(&gvn, val);
- return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, cp);
+ val = gvn.transform(new (C, 2) EncodePNode(val, val->bottom_type()->make_narrowoop()));
+ return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, val);
} else
#endif
- {
- return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
- }
+ {
+ return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
+ }
}
ShouldNotReachHere();
return (StoreNode*)NULL;
@@ -2151,7 +2137,7 @@
const TypeOopPtr *adr_oop = phase->type(adr)->isa_oopptr();
if (adr_oop == NULL)
return false;
- if (!adr_oop->is_instance_field())
+ if (!adr_oop->is_known_instance_field())
return false; // if not a distinct instance, there may be aliases of the address
for (DUIterator_Fast imax, i = adr->fast_outs(imax); i < imax; i++) {
Node *use = adr->fast_out(i);
--- a/hotspot/src/share/vm/opto/node.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/node.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -1387,7 +1387,7 @@
}
#ifdef ASSERT
// Search along debug_orig edges last:
- for (Node* orig = n->debug_orig(); orig != NULL; orig = orig->debug_orig()) {
+ for (Node* orig = n->debug_orig(); orig != NULL && n != orig; orig = orig->debug_orig()) {
if (NotANode(orig)) break;
find_recur( result, orig, idx, only_ctrl, old_space, new_space );
}
--- a/hotspot/src/share/vm/opto/output.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/output.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -447,6 +447,7 @@
// We've got a winner. Replace this branch.
MachNode *replacement = mach->short_branch_version(this);
b->_nodes.map(j, replacement);
+ mach->subsume_by(replacement);
// Update the jmp_end size to save time in our
// next pass.
--- a/hotspot/src/share/vm/opto/parse2.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/parse2.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -67,12 +67,9 @@
const Type* elemtype = arytype->elem();
if (UseUniqueSubclasses && result2 != NULL) {
- const Type* el = elemtype;
- if (elemtype->isa_narrowoop()) {
- el = elemtype->is_narrowoop()->make_oopptr();
- }
- const TypeInstPtr* toop = el->isa_instptr();
- if (toop) {
+ const Type* el = elemtype->make_ptr();
+ if (el && el->isa_instptr()) {
+ const TypeInstPtr* toop = el->is_instptr();
if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) {
// If we load from "AbstractClass[]" we must see "ConcreteSubClass".
const Type* subklass = Type::get_const_type(toop->klass());
@@ -2223,7 +2220,7 @@
sprintf(buffer, "Bytecode %d: %s", bci(), Bytecodes::name(bc()));
bool old = printer->traverse_outs();
printer->set_traverse_outs(true);
- printer->print_method(C, buffer, 3);
+ printer->print_method(C, buffer, 4);
printer->set_traverse_outs(old);
}
#endif
--- a/hotspot/src/share/vm/opto/subnode.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/subnode.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -45,10 +45,13 @@
return in(2)->in(2);
}
- // Convert "(X+Y) - Y" into X
+ // Convert "(X+Y) - Y" into X and "(X+Y) - X" into Y
if( in(1)->Opcode() == Op_AddI ) {
if( phase->eqv(in(1)->in(2),in(2)) )
return in(1)->in(1);
+ if (phase->eqv(in(1)->in(1),in(2)))
+ return in(1)->in(2);
+
// Also catch: "(X + Opaque2(Y)) - Y". In this case, 'Y' is a loop-varying
// trip counter and X is likely to be loop-invariant (that's how O2 Nodes
// are originally used, although the optimizer sometimes jiggers things).
@@ -740,8 +743,8 @@
// Simplify an CmpN (compare 2 pointers) node, based on local information.
// If both inputs are constants, compare them.
const Type *CmpNNode::sub( const Type *t1, const Type *t2 ) const {
- const TypePtr *r0 = t1->is_narrowoop()->make_oopptr(); // Handy access
- const TypePtr *r1 = t2->is_narrowoop()->make_oopptr();
+ const TypePtr *r0 = t1->make_ptr(); // Handy access
+ const TypePtr *r1 = t2->make_ptr();
// Undefined inputs makes for an undefined result
if( TypePtr::above_centerline(r0->_ptr) ||
--- a/hotspot/src/share/vm/opto/superword.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/superword.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -1424,9 +1424,9 @@
//---------------------------container_type---------------------------
// Smallest type containing range of values
const Type* SuperWord::container_type(const Type* t) {
- if (t->isa_narrowoop()) t = t->is_narrowoop()->make_oopptr();
- if (t->isa_aryptr()) {
- t = t->is_aryptr()->elem();
+ const Type* tp = t->make_ptr();
+ if (tp && tp->isa_aryptr()) {
+ t = tp->is_aryptr()->elem();
}
if (t->basic_type() == T_INT) {
if (t->higher_equal(TypeInt::BOOL)) return TypeInt::BOOL;
--- a/hotspot/src/share/vm/opto/type.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/type.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -491,14 +491,8 @@
// commutative and the lattice is symmetric.
const Type *Type::meet( const Type *t ) const {
if (isa_narrowoop() && t->isa_narrowoop()) {
- const Type* result = is_narrowoop()->make_oopptr()->meet(t->is_narrowoop()->make_oopptr());
- if (result->isa_oopptr()) {
- return result->isa_oopptr()->make_narrowoop();
- } else if (result == TypePtr::NULL_PTR) {
- return TypeNarrowOop::NULL_PTR;
- } else {
- return result;
- }
+ const Type* result = make_ptr()->meet(t->make_ptr());
+ return result->make_narrowoop();
}
const Type *mt = xmeet(t);
@@ -520,23 +514,8 @@
bool t_interface = t_inst->klass()->is_interface();
interface_vs_oop = this_interface ^ t_interface;
}
- const Type *tdual = t->_dual;
- const Type *thisdual = _dual;
- // strip out instances
- if (t2t->isa_oopptr() != NULL) {
- t2t = t2t->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
- }
- if (t2this->isa_oopptr() != NULL) {
- t2this = t2this->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
- }
- if (tdual->isa_oopptr() != NULL) {
- tdual = tdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
- }
- if (thisdual->isa_oopptr() != NULL) {
- thisdual = thisdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
- }
-
- if( !interface_vs_oop && (t2t != tdual || t2this != thisdual) ) {
+
+ if( !interface_vs_oop && (t2t != t->_dual || t2this != _dual) ) {
tty->print_cr("=== Meet Not Symmetric ===");
tty->print("t = "); t->dump(); tty->cr();
tty->print("this= "); dump(); tty->cr();
@@ -1764,7 +1743,7 @@
//------------------------------make-------------------------------------------
const TypeAry *TypeAry::make( const Type *elem, const TypeInt *size) {
if (UseCompressedOops && elem->isa_oopptr()) {
- elem = elem->is_oopptr()->make_narrowoop();
+ elem = elem->make_narrowoop();
}
size = normalize_array_size(size);
return (TypeAry*)(new TypeAry(elem,size))->hashcons();
@@ -1849,9 +1828,8 @@
if (_elem == BOTTOM) return false; // general array not exact
if (_elem == TOP ) return false; // inverted general array not exact
const TypeOopPtr* toop = NULL;
- if (UseCompressedOops) {
- const TypeNarrowOop* noop = _elem->isa_narrowoop();
- if (noop) toop = noop->make_oopptr()->isa_oopptr();
+ if (UseCompressedOops && _elem->isa_narrowoop()) {
+ toop = _elem->make_ptr()->isa_oopptr();
} else {
toop = _elem->isa_oopptr();
}
@@ -1861,16 +1839,18 @@
if (!tklass->is_loaded()) return false; // unloaded class
const TypeInstPtr* tinst;
if (_elem->isa_narrowoop())
- tinst = _elem->is_narrowoop()->make_oopptr()->isa_instptr();
+ tinst = _elem->make_ptr()->isa_instptr();
else
tinst = _elem->isa_instptr();
- if (tinst) return tklass->as_instance_klass()->is_final();
+ if (tinst)
+ return tklass->as_instance_klass()->is_final();
const TypeAryPtr* tap;
if (_elem->isa_narrowoop())
- tap = _elem->is_narrowoop()->make_oopptr()->isa_aryptr();
+ tap = _elem->make_ptr()->isa_aryptr();
else
tap = _elem->isa_aryptr();
- if (tap) return tap->ary()->ary_must_be_exact();
+ if (tap)
+ return tap->ary()->ary_must_be_exact();
return false;
}
@@ -2227,7 +2207,7 @@
ciKlass* k = ciKlassKlass::make();
bool xk = false;
ciObject* o = NULL;
- return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, UNKNOWN_INSTANCE))->hashcons();
+ return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, InstanceBot))->hashcons();
}
@@ -2239,7 +2219,7 @@
}
//-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeOopPtr::cast_to_instance(int instance_id) const {
+const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const {
// There are no instances of a general oop.
// Return self unchanged.
return this;
@@ -2333,7 +2313,7 @@
const Type *TypeOopPtr::xdual() const {
assert(klass() == ciKlassKlass::make(), "no klasses here");
assert(const_oop() == NULL, "no constants here");
- return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance() );
+ return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id() );
}
//--------------------------make_from_klass_common-----------------------------
@@ -2547,7 +2527,9 @@
case 0: break;
default: st->print("+%d",_offset); break;
}
- if (_instance_id != UNKNOWN_INSTANCE)
+ if (_instance_id == InstanceTop)
+ st->print(",iid=top");
+ else if (_instance_id != InstanceBot)
st->print(",iid=%d",_instance_id);
}
#endif
@@ -2579,20 +2561,24 @@
return make( _ptr, xadd_offset(offset) );
}
-const TypeNarrowOop* TypeOopPtr::make_narrowoop() const {
- return TypeNarrowOop::make(this);
+//------------------------------meet_instance_id--------------------------------
+int TypeOopPtr::meet_instance_id( int instance_id ) const {
+ // Either is 'TOP' instance? Return the other instance!
+ if( _instance_id == InstanceTop ) return instance_id;
+ if( instance_id == InstanceTop ) return _instance_id;
+ // If either is different, return 'BOTTOM' instance
+ if( _instance_id != instance_id ) return InstanceBot;
+ return _instance_id;
}
-int TypeOopPtr::meet_instance(int iid) const {
- if (iid == 0) {
- return (_instance_id < 0) ? _instance_id : UNKNOWN_INSTANCE;
- } else if (_instance_id == UNKNOWN_INSTANCE) {
- return (iid < 0) ? iid : UNKNOWN_INSTANCE;
- } else {
- return (_instance_id == iid) ? iid : UNKNOWN_INSTANCE;
- }
+//------------------------------dual_instance_id--------------------------------
+int TypeOopPtr::dual_instance_id( ) const {
+ if( _instance_id == InstanceTop ) return InstanceBot; // Map TOP into BOTTOM
+ if( _instance_id == InstanceBot ) return InstanceTop; // Map BOTTOM into TOP
+ return _instance_id; // Map everything else into self
}
+
//=============================================================================
// Convenience common pre-built types.
const TypeInstPtr *TypeInstPtr::NOTNULL;
@@ -2624,7 +2610,7 @@
// Ptr is never Null
assert( ptr != Null, "NULL pointers are not typed" );
- if (instance_id != UNKNOWN_INSTANCE)
+ if ( instance_id > 0 )
xk = true; // instances are always exactly typed
if (!UseExactTypes) xk = false;
if (ptr == Constant) {
@@ -2649,7 +2635,7 @@
if( ptr == _ptr ) return this;
// Reconstruct _sig info here since not a problem with later lazy
// construction, _sig will show up on demand.
- return make(ptr, klass(), klass_is_exact(), const_oop(), _offset);
+ return make(ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id);
}
@@ -2665,13 +2651,13 @@
}
//-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeInstPtr::cast_to_instance(int instance_id) const {
- if( instance_id == _instance_id) return this;
- bool exact = true;
- PTR ptr_t = NotNull;
- if (instance_id == UNKNOWN_INSTANCE) {
- exact = _klass_is_exact;
- ptr_t = _ptr;
+const TypeOopPtr *TypeInstPtr::cast_to_instance_id(int instance_id) const {
+ if( instance_id == _instance_id ) return this;
+ bool exact = _klass_is_exact;
+ PTR ptr_t = _ptr;
+ if ( instance_id > 0 ) { // instances are always exactly typed
+ if (UseExactTypes) exact = true;
+ ptr_t = NotNull;
}
return make(ptr_t, klass(), exact, const_oop(), _offset, instance_id);
}
@@ -2754,16 +2740,17 @@
const TypeAryPtr *tp = t->is_aryptr();
int offset = meet_offset(tp->offset());
PTR ptr = meet_ptr(tp->ptr());
- int iid = meet_instance(tp->instance_id());
+ int instance_id = meet_instance_id(tp->instance_id());
switch (ptr) {
case TopPTR:
case AnyNull: // Fall 'down' to dual of object klass
if (klass()->equals(ciEnv::current()->Object_klass())) {
- return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid);
+ return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id);
} else {
// cannot subclass, so the meet has to fall badly below the centerline
ptr = NotNull;
- return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid);
+ instance_id = InstanceBot;
+ return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id);
}
case Constant:
case NotNull:
@@ -2774,14 +2761,15 @@
// then we can subclass in the Java class heirarchy.
if (klass()->equals(ciEnv::current()->Object_klass())) {
// that is, tp's array type is a subtype of my klass
- return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid);
+ return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id);
}
}
// The other case cannot happen, since I cannot be a subtype of an array.
// The meet falls down to Object class below centerline.
if( ptr == Constant )
ptr = NotNull;
- return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid );
+ instance_id = InstanceBot;
+ return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id );
default: typerr(t);
}
}
@@ -2793,9 +2781,11 @@
PTR ptr = meet_ptr(tp->ptr());
switch (tp->ptr()) {
case TopPTR:
- case AnyNull:
+ case AnyNull: {
+ int instance_id = meet_instance_id(InstanceTop);
return make(ptr, klass(), klass_is_exact(),
- (ptr == Constant ? const_oop() : NULL), offset);
+ (ptr == Constant ? const_oop() : NULL), offset, instance_id);
+ }
case NotNull:
case BotPTR:
return TypeOopPtr::make(ptr, offset);
@@ -2811,10 +2801,13 @@
switch (tp->ptr()) {
case Null:
if( ptr == Null ) return TypePtr::make( AnyPtr, ptr, offset );
+ // else fall through to AnyNull
case TopPTR:
- case AnyNull:
+ case AnyNull: {
+ int instance_id = meet_instance_id(InstanceTop);
return make( ptr, klass(), klass_is_exact(),
- (ptr == Constant ? const_oop() : NULL), offset );
+ (ptr == Constant ? const_oop() : NULL), offset, instance_id);
+ }
case NotNull:
case BotPTR:
return TypePtr::make( AnyPtr, ptr, offset );
@@ -2843,7 +2836,7 @@
const TypeInstPtr *tinst = t->is_instptr();
int off = meet_offset( tinst->offset() );
PTR ptr = meet_ptr( tinst->ptr() );
- int instance_id = meet_instance(tinst->instance_id());
+ int instance_id = meet_instance_id(tinst->instance_id());
// Check for easy case; klasses are equal (and perhaps not loaded!)
// If we have constants, then we created oops so classes are loaded
@@ -2912,7 +2905,7 @@
// Find out which constant.
o = (this_klass == klass()) ? const_oop() : tinst->const_oop();
}
- return make( ptr, k, xk, o, off );
+ return make( ptr, k, xk, o, off, instance_id );
}
// Either oop vs oop or interface vs interface or interface vs Object
@@ -2999,7 +2992,7 @@
// Now we find the LCA of Java classes
ciKlass* k = this_klass->least_common_ancestor(tinst_klass);
- return make( ptr, k, false, NULL, off );
+ return make( ptr, k, false, NULL, off, instance_id );
} // End of case InstPtr
case KlassPtr:
@@ -3026,7 +3019,7 @@
// Dual: do NOT dual on klasses. This means I do NOT understand the Java
// inheritence mechanism.
const Type *TypeInstPtr::xdual() const {
- return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance() );
+ return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id() );
}
//------------------------------eq---------------------------------------------
@@ -3078,7 +3071,9 @@
}
st->print(" *");
- if (_instance_id != UNKNOWN_INSTANCE)
+ if (_instance_id == InstanceTop)
+ st->print(",iid=top");
+ else if (_instance_id != InstanceBot)
st->print(",iid=%d",_instance_id);
}
#endif
@@ -3106,7 +3101,7 @@
assert(!(k == NULL && ary->_elem->isa_int()),
"integral arrays must be pre-equipped with a class");
if (!xk) xk = ary->ary_must_be_exact();
- if (instance_id != UNKNOWN_INSTANCE)
+ if ( instance_id > 0 )
xk = true; // instances are always exactly typed
if (!UseExactTypes) xk = (ptr == Constant);
return (TypeAryPtr*)(new TypeAryPtr(ptr, NULL, ary, k, xk, offset, instance_id))->hashcons();
@@ -3118,7 +3113,7 @@
"integral arrays must be pre-equipped with a class");
assert( (ptr==Constant && o) || (ptr!=Constant && !o), "" );
if (!xk) xk = (o != NULL) || ary->ary_must_be_exact();
- if (instance_id != UNKNOWN_INSTANCE)
+ if ( instance_id > 0 )
xk = true; // instances are always exactly typed
if (!UseExactTypes) xk = (ptr == Constant);
return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id))->hashcons();
@@ -3127,7 +3122,7 @@
//------------------------------cast_to_ptr_type-------------------------------
const Type *TypeAryPtr::cast_to_ptr_type(PTR ptr) const {
if( ptr == _ptr ) return this;
- return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset);
+ return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset, _instance_id);
}
@@ -3140,13 +3135,13 @@
}
//-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeAryPtr::cast_to_instance(int instance_id) const {
- if( instance_id == _instance_id) return this;
- bool exact = true;
- PTR ptr_t = NotNull;
- if (instance_id == UNKNOWN_INSTANCE) {
- exact = _klass_is_exact;
- ptr_t = _ptr;
+const TypeOopPtr *TypeAryPtr::cast_to_instance_id(int instance_id) const {
+ if( instance_id == _instance_id ) return this;
+ bool exact = _klass_is_exact;
+ PTR ptr_t = _ptr;
+ if ( instance_id > 0 ) { // instances are always exactly typed
+ if (UseExactTypes) exact = true;
+ ptr_t = NotNull;
}
return make(ptr_t, const_oop(), _ary, klass(), exact, _offset, instance_id);
}
@@ -3199,7 +3194,7 @@
new_size = TypeInt::ZERO; // intermediate dead fast-path goo
if (new_size == size()) return this;
const TypeAry* new_ary = TypeAry::make(elem(), new_size);
- return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset);
+ return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id);
}
@@ -3251,8 +3246,11 @@
PTR ptr = meet_ptr(tp->ptr());
switch (tp->ptr()) {
case TopPTR:
- case AnyNull:
- return make(ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset);
+ case AnyNull: {
+ int instance_id = meet_instance_id(InstanceTop);
+ return make(ptr, (ptr == Constant ? const_oop() : NULL),
+ _ary, _klass, _klass_is_exact, offset, instance_id);
+ }
case BotPTR:
case NotNull:
return TypeOopPtr::make(ptr, offset);
@@ -3273,8 +3271,12 @@
return TypePtr::make(AnyPtr, ptr, offset);
case Null:
if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset);
- case AnyNull:
- return make( ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset );
+ // else fall through to AnyNull
+ case AnyNull: {
+ int instance_id = meet_instance_id(InstanceTop);
+ return make( ptr, (ptr == Constant ? const_oop() : NULL),
+ _ary, _klass, _klass_is_exact, offset, instance_id);
+ }
default: ShouldNotReachHere();
}
}
@@ -3286,7 +3288,7 @@
int off = meet_offset(tap->offset());
const TypeAry *tary = _ary->meet(tap->_ary)->is_ary();
PTR ptr = meet_ptr(tap->ptr());
- int iid = meet_instance(tap->instance_id());
+ int instance_id = meet_instance_id(tap->instance_id());
ciKlass* lazy_klass = NULL;
if (tary->_elem->isa_int()) {
// Integral array element types have irrelevant lattice relations.
@@ -3307,7 +3309,7 @@
case TopPTR:
// Compute new klass on demand, do not use tap->_klass
xk = (tap->_klass_is_exact | this->_klass_is_exact);
- return make( ptr, const_oop(), tary, lazy_klass, xk, off, iid );
+ return make( ptr, const_oop(), tary, lazy_klass, xk, off, instance_id );
case Constant: {
ciObject* o = const_oop();
if( _ptr == Constant ) {
@@ -3319,7 +3321,7 @@
o = tap->const_oop();
}
xk = true;
- return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, iid );
+ return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, instance_id );
}
case NotNull:
case BotPTR:
@@ -3330,7 +3332,7 @@
xk = this->_klass_is_exact;
else xk = (tap->_klass_is_exact & this->_klass_is_exact) &&
(klass() == tap->klass()); // Only precise for identical arrays
- return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, iid );
+ return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, instance_id );
default: ShouldNotReachHere();
}
}
@@ -3340,16 +3342,17 @@
const TypeInstPtr *tp = t->is_instptr();
int offset = meet_offset(tp->offset());
PTR ptr = meet_ptr(tp->ptr());
- int iid = meet_instance(tp->instance_id());
+ int instance_id = meet_instance_id(tp->instance_id());
switch (ptr) {
case TopPTR:
case AnyNull: // Fall 'down' to dual of object klass
if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) {
- return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, iid );
+ return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id );
} else {
// cannot subclass, so the meet has to fall badly below the centerline
ptr = NotNull;
- return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid);
+ instance_id = InstanceBot;
+ return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id);
}
case Constant:
case NotNull:
@@ -3360,14 +3363,15 @@
// then we can subclass in the Java class heirarchy.
if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) {
// that is, my array type is a subtype of 'tp' klass
- return make( ptr, _ary, _klass, _klass_is_exact, offset, iid );
+ return make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id );
}
}
// The other case cannot happen, since t cannot be a subtype of an array.
// The meet falls down to Object class below centerline.
if( ptr == Constant )
ptr = NotNull;
- return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid);
+ instance_id = InstanceBot;
+ return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id);
default: typerr(t);
}
}
@@ -3382,7 +3386,7 @@
//------------------------------xdual------------------------------------------
// Dual: compute field-by-field dual
const Type *TypeAryPtr::xdual() const {
- return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance() );
+ return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id() );
}
//------------------------------dump2------------------------------------------
@@ -3419,7 +3423,9 @@
}
}
st->print(" *");
- if (_instance_id != UNKNOWN_INSTANCE)
+ if (_instance_id == InstanceTop)
+ st->print(",iid=top");
+ else if (_instance_id != InstanceBot)
st->print(",iid=%d",_instance_id);
}
#endif
@@ -3494,7 +3500,7 @@
return this;
case NarrowOop: {
- const Type* result = _ooptype->xmeet(t->is_narrowoop()->make_oopptr());
+ const Type* result = _ooptype->xmeet(t->make_ptr());
if (result->isa_ptr()) {
return TypeNarrowOop::make(result->is_ptr());
}
@@ -3604,7 +3610,7 @@
const TypeAryPtr *tary;
const Type* el = elem();
if (el->isa_narrowoop()) {
- el = el->is_narrowoop()->make_oopptr();
+ el = el->make_ptr();
}
// Get element klass
--- a/hotspot/src/share/vm/opto/type.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/opto/type.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -225,6 +225,12 @@
virtual bool is_finite() const; // Has a finite value
virtual bool is_nan() const; // Is not a number (NaN)
+ // Returns this ptr type or the equivalent ptr type for this compressed pointer.
+ const TypePtr* make_ptr() const;
+ // Returns this compressed pointer or the equivalent compressed version
+ // of this pointer type.
+ const TypeNarrowOop* make_narrowoop() const;
+
// Special test for register pressure heuristic
bool is_floatingpoint() const; // True if Float or Double base type
@@ -648,7 +654,8 @@
virtual int hash() const; // Type specific hashing
virtual bool singleton(void) const; // TRUE if type is a singleton
enum {
- UNKNOWN_INSTANCE = 0
+ InstanceTop = -1, // undefined instance
+ InstanceBot = 0 // any possible instance
};
protected:
@@ -661,14 +668,15 @@
bool _klass_is_exact;
bool _is_ptr_to_narrowoop;
- int _instance_id; // if not UNKNOWN_INSTANCE, indicates that this is a particular instance
- // of this type which is distinct. This is the the node index of the
- // node creating this instance
+ // If not InstanceTop or InstanceBot, indicates that this is
+ // a particular instance of this type which is distinct.
+ // This is the the node index of the allocation node creating this instance.
+ int _instance_id;
static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
- int dual_instance() const { return -_instance_id; }
- int meet_instance(int uid) const;
+ int dual_instance_id() const;
+ int meet_instance_id(int uid) const;
public:
// Creates a type given a klass. Correctly handles multi-dimensional arrays
@@ -701,9 +709,9 @@
// compressed oop references.
bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; }
- bool is_instance() const { return _instance_id != UNKNOWN_INSTANCE; }
- uint instance_id() const { return _instance_id; }
- bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; }
+ bool is_known_instance() const { return _instance_id > 0; }
+ int instance_id() const { return _instance_id; }
+ bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; }
virtual intptr_t get_con() const;
@@ -711,16 +719,13 @@
virtual const Type *cast_to_exactness(bool klass_is_exact) const;
- virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+ virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
// corresponding pointer to klass, for a given instance
const TypeKlassPtr* as_klass_type() const;
virtual const TypePtr *add_offset( int offset ) const;
- // returns the equivalent compressed version of this pointer type
- virtual const TypeNarrowOop* make_narrowoop() const;
-
virtual const Type *xmeet( const Type *t ) const;
virtual const Type *xdual() const; // Compute dual right now.
@@ -775,7 +780,7 @@
}
// Make a pointer to an oop.
- static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = 0 );
+ static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot );
// If this is a java.lang.Class constant, return the type for it or NULL.
// Pass to Type::get_const_type to turn it to a type, which will usually
@@ -786,7 +791,7 @@
virtual const Type *cast_to_exactness(bool klass_is_exact) const;
- virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+ virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
virtual const TypePtr *add_offset( int offset ) const;
@@ -820,9 +825,9 @@
const Type* elem() const { return _ary->_elem; }
const TypeInt* size() const { return _ary->_size; }
- static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0);
+ static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
// Constant pointer to array
- static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0);
+ static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
// Convenience
static const TypeAryPtr *make(ciObject* o);
@@ -832,7 +837,7 @@
virtual const Type *cast_to_exactness(bool klass_is_exact) const;
- virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+ virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const;
@@ -911,7 +916,7 @@
// between the normal and the compressed form.
class TypeNarrowOop : public Type {
protected:
- const TypePtr* _ooptype;
+ const TypePtr* _ooptype; // Could be TypePtr::NULL_PTR
TypeNarrowOop( const TypePtr* ooptype): Type(NarrowOop),
_ooptype(ooptype) {
@@ -940,8 +945,8 @@
return make(TypeOopPtr::make_from_constant(con));
}
- // returns the equivalent oopptr type for this compressed pointer
- virtual const TypePtr *make_oopptr() const {
+ // returns the equivalent ptr type for this compressed pointer
+ const TypePtr *make_oopptr() const {
return _ooptype;
}
@@ -1128,6 +1133,16 @@
return (TypeKlassPtr*)this;
}
+inline const TypePtr* Type::make_ptr() const {
+ return (_base == NarrowOop) ? is_narrowoop()->make_oopptr() :
+ (isa_ptr() ? is_ptr() : NULL);
+}
+
+inline const TypeNarrowOop* Type::make_narrowoop() const {
+ return (_base == NarrowOop) ? is_narrowoop() :
+ (isa_ptr() ? TypeNarrowOop::make(is_ptr()) : NULL);
+}
+
inline bool Type::is_floatingpoint() const {
if( (_base == FloatCon) || (_base == FloatBot) ||
(_base == DoubleCon) || (_base == DoubleBot) )
--- a/hotspot/src/share/vm/prims/jni.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -631,7 +631,7 @@
DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
tty->print_cr("FATAL ERROR in native method: %s", msg);
thread->print_stack();
- os::abort(false); // Prevent core dump, causes a jck failure.
+ os::abort(); // Dump core and abort
JNI_END
--- a/hotspot/src/share/vm/prims/jvm.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/prims/jvm.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -624,6 +624,30 @@
if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
JVM_END
+// Rationale behind JVM_FindClassFromBootLoader
+// a> JVM_FindClassFromClassLoader was never exported in the export tables.
+// b> because of (a) java.dll has a direct dependecy on the unexported
+// private symbol "_JVM_FindClassFromClassLoader@20".
+// c> the launcher cannot use the private symbol as it dynamically opens
+// the entry point, so if something changes, the launcher will fail
+// unexpectedly at runtime, it is safest for the launcher to dlopen a
+// stable exported interface.
+// d> re-exporting JVM_FindClassFromClassLoader as public, will cause its
+// signature to change from _JVM_FindClassFromClassLoader@20 to
+// JVM_FindClassFromClassLoader and will not be backward compatible
+// with older JDKs.
+// Thus a public/stable exported entry point is the right solution,
+// public here means public in linker semantics, and is exported only
+// to the JDK, and is not intended to be a public API.
+
+JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
+ const char* name,
+ jboolean throwError))
+ JVMWrapper3("JVM_FindClassFromBootLoader %s throw %s", name,
+ throwError ? "error" : "exception");
+ return JVM_FindClassFromClassLoader(env, name, JNI_FALSE,
+ (jobject)NULL, throwError);
+JVM_END
JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
jboolean init, jobject loader,
--- a/hotspot/src/share/vm/prims/jvm.h Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/prims/jvm.h Wed Jul 05 16:38:48 2017 +0200
@@ -390,6 +390,17 @@
jobject loader, jboolean throwError);
/*
+ * Find a class from a boot class loader. Throw ClassNotFoundException
+ * or NoClassDefFoundError depending on the value of the last
+ * argument. This is the same as FindClassFromClassLoader but provided
+ * as a convenience method exported correctly on all platforms for
+ * JSR 277 launcher class loading.
+ */
+JNIEXPORT jclass JNICALL
+JVM_FindClassFromBootLoader(JNIEnv *env, const char *name,
+ jboolean throwError);
+
+/*
* Find a class from a given class.
*/
JNIEXPORT jclass JNICALL
--- a/hotspot/src/share/vm/runtime/globals.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -946,6 +946,9 @@
diagnostic(bool, UseIncDec, true, \
"Use INC, DEC instructions on x86") \
\
+ product(bool, UseNewLongLShift, false, \
+ "Use optimized bitwise shift left") \
+ \
product(bool, UseStoreImmI16, true, \
"Use store immediate 16-bits value instruction on x86") \
\
--- a/hotspot/src/share/vm/runtime/hpi.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/runtime/hpi.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -66,6 +66,8 @@
static inline int socket_shutdown(int fd, int howto);
static inline int recv(int fd, char *buf, int nBytes, int flags);
static inline int send(int fd, char *buf, int nBytes, int flags);
+ // Variant of send that doesn't support interruptible I/O
+ static inline int raw_send(int fd, char *buf, int nBytes, int flags);
static inline int timeout(int fd, long timeout);
static inline int listen(int fd, int count);
static inline int connect(int fd, struct sockaddr *him, int len);
--- a/hotspot/src/share/vm/runtime/java.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/runtime/java.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -502,9 +502,9 @@
os::shutdown();
}
-void vm_abort() {
+void vm_abort(bool dump_core) {
vm_perform_shutdown_actions();
- os::abort(PRODUCT_ONLY(false));
+ os::abort(dump_core);
ShouldNotReachHere();
}
@@ -538,18 +538,24 @@
java_lang_Throwable::print_stack_trace(exception(), tty);
tty->cr();
vm_notify_during_shutdown(NULL, NULL);
- vm_abort();
+
+ // Failure during initialization, we don't want to dump core
+ vm_abort(false);
}
void vm_exit_during_initialization(symbolHandle ex, const char* message) {
ResourceMark rm;
vm_notify_during_shutdown(ex->as_C_string(), message);
- vm_abort();
+
+ // Failure during initialization, we don't want to dump core
+ vm_abort(false);
}
void vm_exit_during_initialization(const char* error, const char* message) {
vm_notify_during_shutdown(error, message);
- vm_abort();
+
+ // Failure during initialization, we don't want to dump core
+ vm_abort(false);
}
void vm_shutdown_during_initialization(const char* error, const char* message) {
--- a/hotspot/src/share/vm/runtime/java.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/runtime/java.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -37,7 +37,7 @@
// Shutdown the VM but do not exit the process
extern void vm_shutdown();
// Shutdown the VM and abort the process
-extern void vm_abort();
+extern void vm_abort(bool dump_core=true);
// Trigger any necessary notification of the VM being shutdown
extern void notify_vm_shutdown();
--- a/hotspot/src/share/vm/utilities/debug.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/utilities/debug.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -208,7 +208,9 @@
Thread* thread = ThreadLocalStorage::get_thread_slow();
VMError(thread, size, message, file_name, line_no).report_and_die();
}
- vm_abort();
+
+ // Dump core and abort
+ vm_abort(true);
}
void report_vm_out_of_memory_vararg(const char* file_name, int line_no, size_t size, const char* format, ...) {
--- a/hotspot/src/share/vm/utilities/ostream.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/utilities/ostream.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -753,21 +753,28 @@
write(str, len);
}
-bufferedStream::bufferedStream(size_t initial_size) : outputStream() {
+bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() {
buffer_length = initial_size;
buffer = NEW_C_HEAP_ARRAY(char, buffer_length);
buffer_pos = 0;
buffer_fixed = false;
+ buffer_max = bufmax;
}
-bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size) : outputStream() {
+bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax) : outputStream() {
buffer_length = fixed_buffer_size;
buffer = fixed_buffer;
buffer_pos = 0;
buffer_fixed = true;
+ buffer_max = bufmax;
}
void bufferedStream::write(const char* s, size_t len) {
+
+ if(buffer_pos + len > buffer_max) {
+ flush();
+ }
+
size_t end = buffer_pos + len;
if (end >= buffer_length) {
if (buffer_fixed) {
@@ -811,7 +818,7 @@
#endif
// Network access
-networkStream::networkStream() {
+networkStream::networkStream() : bufferedStream(1024*10, 1024*10) {
_socket = -1;
@@ -831,7 +838,9 @@
void networkStream::flush() {
if (size() != 0) {
- hpi::send(_socket, (char *)base(), (int)size(), 0);
+ int result = hpi::raw_send(_socket, (char *)base(), (int)size(), 0);
+ assert(result != -1, "connection error");
+ assert(result == (int)size(), "didn't send enough data");
}
reset();
}
--- a/hotspot/src/share/vm/utilities/ostream.hpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/utilities/ostream.hpp Wed Jul 05 16:38:48 2017 +0200
@@ -206,11 +206,12 @@
protected:
char* buffer;
size_t buffer_pos;
+ size_t buffer_max;
size_t buffer_length;
bool buffer_fixed;
public:
- bufferedStream(size_t initial_bufsize = 256);
- bufferedStream(char* fixed_buffer, size_t fixed_buffer_size);
+ bufferedStream(size_t initial_bufsize = 256, size_t bufmax = 1024*1024*10);
+ bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax = 1024*1024*10);
~bufferedStream();
virtual void write(const char* c, size_t len);
size_t size() { return buffer_pos; }
--- a/hotspot/src/share/vm/utilities/xmlstream.cpp Thu Jul 03 11:01:30 2008 -0700
+++ b/hotspot/src/share/vm/utilities/xmlstream.cpp Wed Jul 05 16:38:48 2017 +0200
@@ -59,6 +59,7 @@
if (!is_open()) return;
out()->write(s, len);
+ update_position(s, len);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6714694/Tester.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,820 @@
+/*
+ * 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 6714694
+ * @summary assertion in 64bit server vm (store->find_edge(load) != -1,"missing precedence edge") with COOPs
+ * @run main/othervm -Xcomp Tester
+ */
+
+/* Complexity upper bound: 38602 ops */
+
+interface Tester_Interface_0 {
+}
+
+
+abstract class Tester_Class_1 implements Tester_Interface_0 {
+ static int var_1 = (false ? (short)'b' : (short)-2.4256387E38F) | (byte)('g' * -7.660532860983624E307);
+ float var_2;
+ byte var_3;
+ static boolean var_4 = true;
+ double var_5 = 8.818325751338691E307;
+ Object var_6;
+ static short var_7;
+ final static char var_8 = 'x';
+ final static float var_9 = 2.2030989E38F;
+
+
+ public Tester_Class_1()
+ {
+ var_6 = (var_6 = (var_6 = "xkx"));
+ switch (var_7 = (var_3 = (byte)var_5))
+ {
+ case 113:
+
+ case 114:
+ Object var_12;
+ var_4 = 4.9121917E37F < 1957795258;
+ var_4 |= (var_4 ^= !var_4) ^ (var_4 |= var_4);
+ var_3 = (var_3 = (var_3 = (byte)+6010964363045275648L));
+ break;
+
+ case 102:
+
+ }
+ final float var_13 = 1.2443151E38F;
+ var_3 = (byte)(var_1 |= (var_7 = (var_3 = (byte)var_5)));
+ var_2 = (long)(var_7 = (var_3 = (byte)var_8)) - (var_7 = (byte)386742565);
+ var_4 &= var_4;
+ var_2 = (long)((var_3 = (var_3 = (byte)var_8)) / ((var_4 ^= (var_5 /= var_9) <= (var_1 &= var_1)) ? (var_7 = (short)6872886933545336832L) : (byte)var_8));
+ var_6 = "uqflj";
+ {
+ switch (((new String[var_3 = (byte)var_5])[var_3 = (byte)8097442298927900672L]).charAt(1540148550))
+ {
+ case 'l':
+
+ }
+ var_2 = (var_7 = (byte)2.9859440663042714E307);
+ {
+ Object var_14;
+ }
+ var_3 = (var_3 = (var_3 = (byte)3.3634427195550136E307));
+ var_5 += '_';
+ }
+ var_6 = "tempfdjen";
+ var_3 = (((var_4 ^= new String("jmwiwmk").endsWith("rtlstmnuo")) ? !true : !false) ? true : (var_4 = false)) ? (var_3 = (byte)var_5) : (var_3 = (var_3 = (byte)var_5));
+ var_4 ^= false;
+ if (1.6435436003809043E307 != var_9)
+ {
+ boolean var_15 = true;
+ }
+ else
+ {
+ var_4 = false;
+ }
+ {
+ Object var_16 = ((new Tester_Class_1[(byte)71832757][(byte)1.0694914E38F])[(byte)1315653071][(byte)(var_7 = (var_7 = (byte)var_8))]).var_6 = new int[(byte)var_8][var_3 = (byte)1933656747];
+ }
+ var_7 = (var_4 = var_4) ? (short)2.756967E37F : (short)'K';
+ byte var_17;
+ }
+
+
+
+ abstract public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1);
+
+
+ final double func_0(final float arg_0, final short arg_1, final boolean arg_2)
+ {
+ var_6 = (var_6 = "lmshbl");
+ var_3 = (var_3 = (new byte[(new byte[(byte)arg_1])[var_3 = (byte)arg_0]])[var_3 = (var_3 = (byte)(var_1 >>>= var_1))]);
+ var_5 %= (var_3 = (byte)1909375874);
+ var_1 /= (char)(short)'i';
+ {
+ "vgar".length();
+ }
+ int var_10;
+ {
+ var_3 = (var_4 &= true) ? (byte)(var_5 *= 6375499657746206720L) : (byte)+ (var_5 /= var_9);
+ var_7 = (var_4 = true) ? (byte)(false ? (short)749593632 : (byte)8.692758043260743E307) : (byte)var_1;
+ ((new Tester_Class_1[(byte)1.2890904018345944E308])[(byte)var_1]).var_3 = (var_3 = (byte)arg_0);
+ var_4 = true ^ var_4;
+ }
+ {
+ var_1 ^= (var_3 = (var_3 = (var_3 = (byte)'U')));
+ }
+ var_3 = (var_3 = (var_3 = (var_3 = (byte)arg_1)));
+ char var_11;
+ var_1 += (var_2 = (var_7 = arg_1));
+ {
+ var_7 = (var_7 = arg_1);
+ }
+ var_7 = arg_1;
+ var_6 = (new char[(byte)1985094111797788672L][var_3 = (byte)3112604683090268160L])[var_3 = (byte)~ (var_3 = (byte)(var_5 += var_1))];
+ var_3 = (var_3 = (var_3 = (var_3 = (byte)3694858000202921984L)));
+ var_1 /= ~ ((byte)1311538336);
+ (((var_4 |= arg_2 ? !true && arg_2 : false) ? arg_2 : arg_2) ? "iih".substring(~ (var_3 = (byte)3.5401308E37F), 'g' * arg_1) : "gynskmvoj").trim();
+ var_3 = (var_3 = arg_2 ? (byte)+ ~5247392660383928320L : (byte)8392160279007184896L);
+ var_3 = (var_3 = (var_3 = (byte)var_8));
+ return (var_5 += 7.157559E37F) + (var_11 = 'V');
+ }
+
+ public String toString()
+ {
+ String result = "[\n";
+ result += "Tester_Class_1.var_7 = "; result += Tester.Printer.print(var_7);
+ result += "\n";
+ result += "Tester_Class_1.var_3 = "; result += Tester.Printer.print(var_3);
+ result += "\n";
+ result += "Tester_Class_1.var_8 = "; result += Tester.Printer.print(var_8);
+ result += "\n";
+ result += "Tester_Class_1.var_1 = "; result += Tester.Printer.print(var_1);
+ result += "\n";
+ result += "Tester_Class_1.var_4 = "; result += Tester.Printer.print(var_4);
+ result += "\n";
+ result += "Tester_Class_1.var_5 = "; result += Tester.Printer.print(var_5);
+ result += "\n";
+ result += "Tester_Class_1.var_2 = "; result += Tester.Printer.print(var_2);
+ result += "\n";
+ result += "Tester_Class_1.var_9 = "; result += Tester.Printer.print(var_9);
+ result += "\n";
+ result += "Tester_Class_1.var_6 = "; result += Tester.Printer.print(var_6);
+ result += "";
+ result += "\n]";
+ return result;
+ }
+}
+
+
+class Tester_Class_2 extends Tester_Class_1 implements Tester_Interface_0 {
+ final static String var_18 = false | Tester_Class_1.var_4 | (Tester_Class_1.var_4 &= (Tester_Class_1.var_4 |= (Tester_Class_1.var_4 = var_4))) ? "tbobyhqne" : "";
+ static String var_19 = "acxfj";
+
+
+ public Tester_Class_2()
+ {
+ Tester_Class_1.var_4 = !Tester_Class_1.var_4;
+ var_1++;
+ var_2 = (byte)2.4009747E38F;
+ new String();
+ var_6 = (var_19 = "hsshyw");
+ var_19 = var_19;
+ }
+
+
+ public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1)
+ {
+ var_5 = 4.0352057E37F;
+ (((false && ! ((Tester_Class_1.var_4 |= !true) ^ (Tester_Class_1.var_4 ^ false))) ^ (var_4 &= true) ? var_4 : (var_4 ^= true)) ? "spskwj" : "xcqianm").length();
+ ((var_4 |= (Tester_Class_1.var_4 ^= Tester_Class_1.var_4) ? (Tester_Class_1.var_4 &= false) : (Tester_Class_1.var_4 |= Tester_Class_1.var_4)) ? (Tester_Class_1)(var_6 = new double[(byte)6.628342687109622E307]) : (Tester_Class_1)arg_1).var_6 = arg_0;
+ var_7 = (short)(byte)(short)8775325134193811456L;
+ var_4 ^= (var_4 &= !false);
+ ((Tester_Class_1)arg_1).var_3 = (var_3 = (byte)(var_5 %= 8.933448E37F));
+ Tester_Class_1 var_20 = Tester_Class_1.var_4 ? (Tester_Class_1)arg_1 : (Tester_Class_1)arg_1;
+ {
+ var_19.endsWith(var_19);
+ var_6 = var_20;
+ (var_20 = (var_20 = var_20)).var_2 = (short)('p' <= 1986176769 % (int)2242661265280256000L % 2664882044098145280L ? ~ (var_3 = (byte)1.1892553447967157E308) & ~1806805036550279168L : (var_7 = (byte)var_8));
+ }
+ final boolean var_21 = Tester_Class_1.var_4;
+ var_20.var_3 = (var_3 = (var_20.var_3 = (byte)'t'));
+ boolean var_22 = true;
+ Tester_Class_1.var_4 |= (var_4 = var_21);
+ var_19 = "ocn";
+ var_19 = var_19;
+ var_1 *= Tester_Class_1.var_8;
+ var_20 = var_22 ? var_20 : var_20;
+ var_7 = var_21 ? (byte)+ ((byte)var_1) : ((var_20 = (var_20 = var_20)).var_3 = (var_3 = (var_3 = (byte)'L')));
+ return true ? (var_20 = var_20) : (new Tester_Interface_0[(byte)5618282952859970560L])[var_3 = (byte)Tester_Class_1.var_8];
+ }
+
+
+ public boolean equals(Object obj)
+ {
+ Tester_Class_1.var_7 = (var_7 = (((Tester_Class_1)obj).var_3 = (byte)var_9));
+ {
+ final Tester_Class_1 var_23 = (Tester_Class_1)obj;
+ }
+ ++Tester_Class_1.var_1;
+ var_5 = (Tester_Class_1.var_7 = var_4 ? (Tester_Class_1.var_7 = (((Tester_Class_1)obj).var_3 = (byte)Tester_Class_1.var_8)) : (var_7 = (byte)var_9));
+ ((Tester_Class_1)obj).var_6 = var_18.replace(Tester_Class_1.var_8, Tester_Class_1.var_8);
+ ((new Tester_Class_1[((Tester_Class_1)(obj = new char[var_3 = (byte)Tester_Class_1.var_8])).var_3 = (((Tester_Class_1)obj).var_3 = (byte)(var_1 %= 787509251458841600L))])[(new byte[var_3 = (byte)Tester_Class_1.var_1])[((Tester_Class_1)obj).var_3 = (byte)1.2382548E38F]]).var_3 = (((Tester_Class_1)obj).var_3 = var_4 ? (byte)Tester_Class_1.var_8 : (byte)4.1085164E36F);
+ var_1 &= var_8;
+ var_7 = var_4 ? (var_3 = (byte)var_8) : (byte)var_5;
+ var_19 = var_18;
+ ("o".compareTo("kwlfk") > (var_2 = 5289241662482067456L) ? (Tester_Class_1)obj : (Tester_Class_1)obj).var_5 -= (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (byte)var_9)));
+ return true;
+ }
+
+
+ public String toString()
+ {
+ String result = "[\n";
+ result += "Tester_Class_2.var_7 = "; result += Tester.Printer.print(var_7);
+ result += "\n";
+ result += "Tester_Class_2.var_8 = "; result += Tester.Printer.print(var_8);
+ result += "\n";
+ result += "Tester_Class_2.var_3 = "; result += Tester.Printer.print(var_3);
+ result += "\n";
+ result += "Tester_Class_2.var_18 = "; result += Tester.Printer.print(var_18);
+ result += "\n";
+ result += "Tester_Class_2.var_19 = "; result += Tester.Printer.print(var_19);
+ result += "\n";
+ result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1);
+ result += "\n";
+ result += "Tester_Class_2.var_4 = "; result += Tester.Printer.print(var_4);
+ result += "\n";
+ result += "Tester_Class_2.var_5 = "; result += Tester.Printer.print(var_5);
+ result += "\n";
+ result += "Tester_Class_2.var_2 = "; result += Tester.Printer.print(var_2);
+ result += "\n";
+ result += "Tester_Class_2.var_9 = "; result += Tester.Printer.print(var_9);
+ result += "\n";
+ result += "Tester_Class_2.var_6 = "; result += Tester.Printer.print(var_6);
+ result += "";
+ result += "\n]";
+ return result;
+ }
+}
+
+
+class Tester_Class_3 extends Tester_Class_2 implements Tester_Interface_0 {
+ long var_24 = 9026266006808413184L;
+ char var_25;
+ String var_26 = ((var_4 ^= Tester_Class_1.var_4) ? (!true ? false : (var_4 |= true)) : (Tester_Class_2.var_4 ^= var_4)) ? "dkmhvhl" : (var_19 = (Tester_Class_2.var_19 = (Tester_Class_2.var_19 = var_18)));
+ static Tester_Class_2 var_27;
+ short var_28 = Tester_Class_2.var_7 = (short)(Tester_Class_2.var_1 &= (var_3 = (var_3 = (var_3 = (byte)Tester_Class_2.var_9))));
+ static boolean var_29 = false;
+ static Object[][] var_30;
+ int var_31 = 750583762;
+ Tester_Class_2 var_32;
+ final static long var_33 = 3050784555932008448L;
+
+
+ public Tester_Class_3()
+ {
+ byte[] var_34;
+ var_4 &= (Tester_Class_1.var_4 = true);
+ Tester_Class_1.var_1--;
+ switch (var_28 >>= ~ ((byte)var_28))
+ {
+ case 9:
+
+ case 26:
+ Tester_Class_1.var_4 ^= Tester_Class_1.var_4;
+ (Tester_Class_2.var_19 = "pwtic").indexOf(Tester_Class_2.var_18);
+ var_26.indexOf(var_19);
+ ((Tester_Class_1)(new Tester_Interface_0[(byte)var_5])[var_24 <= var_31 ? (byte)'^' : (byte)var_24]).var_2 = 5611775846881101824L;
+ var_29 |= (Tester_Class_2.var_4 ^= var_29);
+ Tester_Class_2 var_35;
+ var_24 <<= (var_31 >>= (var_25 = var_8));
+ break;
+
+ case 28:
+
+ }
+ new String();
+ var_5 %= (var_25 = 'n');
+ ((Tester_Class_2)(Tester_Class_1)(((Tester_Class_1)(var_6 = Tester_Class_2.var_18)).var_6 = (var_26 = ""))).var_2 = var_31;
+ --var_1;
+ }
+
+
+
+
+ public String toString()
+ {
+ String result = "[\n";
+ result += "Tester_Class_3.var_8 = "; result += Tester.Printer.print(var_8);
+ result += "\n";
+ result += "Tester_Class_3.var_25 = "; result += Tester.Printer.print(var_25);
+ result += "\n";
+ result += "Tester_Class_3.var_1 = "; result += Tester.Printer.print(var_1);
+ result += "\n";
+ result += "Tester_Class_3.var_31 = "; result += Tester.Printer.print(var_31);
+ result += "\n";
+ result += "Tester_Class_3.var_30 = "; result += Tester.Printer.print(var_30);
+ result += "\n";
+ result += "Tester_Class_3.var_24 = "; result += Tester.Printer.print(var_24);
+ result += "\n";
+ result += "Tester_Class_3.var_33 = "; result += Tester.Printer.print(var_33);
+ result += "\n";
+ result += "Tester_Class_3.var_5 = "; result += Tester.Printer.print(var_5);
+ result += "\n";
+ result += "Tester_Class_3.var_2 = "; result += Tester.Printer.print(var_2);
+ result += "\n";
+ result += "Tester_Class_3.var_9 = "; result += Tester.Printer.print(var_9);
+ result += "\n";
+ result += "Tester_Class_3.var_7 = "; result += Tester.Printer.print(var_7);
+ result += "\n";
+ result += "Tester_Class_3.var_28 = "; result += Tester.Printer.print(var_28);
+ result += "\n";
+ result += "Tester_Class_3.var_3 = "; result += Tester.Printer.print(var_3);
+ result += "\n";
+ result += "Tester_Class_3.var_18 = "; result += Tester.Printer.print(var_18);
+ result += "\n";
+ result += "Tester_Class_3.var_19 = "; result += Tester.Printer.print(var_19);
+ result += "\n";
+ result += "Tester_Class_3.var_26 = "; result += Tester.Printer.print(var_26);
+ result += "\n";
+ result += "Tester_Class_3.var_4 = "; result += Tester.Printer.print(var_4);
+ result += "\n";
+ result += "Tester_Class_3.var_29 = "; result += Tester.Printer.print(var_29);
+ result += "\n";
+ result += "Tester_Class_3.var_27 = "; result += Tester.Printer.print(var_27);
+ result += "\n";
+ result += "Tester_Class_3.var_32 = "; result += Tester.Printer.print(var_32);
+ result += "\n";
+ result += "Tester_Class_3.var_6 = "; result += Tester.Printer.print(var_6);
+ result += "";
+ result += "\n]";
+ return result;
+ }
+}
+
+public class Tester {
+ static double var_36 = 2.679028326789642E307;
+ float var_37;
+ String var_38 = Tester_Class_2.var_18;
+ static Tester_Interface_0 var_39;
+ static char var_40 = 'D';
+ Tester_Class_1 var_41;
+ static int var_42;
+ final static boolean var_43 = false;
+
+
+ final static Tester_Class_2 func_0(Tester_Class_1 arg_0, final Tester_Class_2 arg_1)
+ {
+ "ooots".replaceFirst("rdxor", ((new Tester_Class_3[arg_1.var_3 = (byte)2.7836305E38F])[arg_0.var_3 = (byte)+ + +1.4958218616334936E307]).var_26);
+ if (true)
+ {
+ arg_0 = (Tester_Class_3)arg_0;
+ ((Tester_Class_3)arg_0).var_25 = var_40;
+ final Tester_Class_2 var_44 = (Tester_Class_2)((Tester_Class_3.var_29 |= var_43) ? arg_0 : (arg_0.var_6 = Tester_Class_3.var_18));
+ }
+ else
+ {
+ var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1);
+ }
+ Tester_Class_3.var_19 = "onndgsil";
+ var_39 = arg_0;
+ return (Tester_Class_2.var_4 &= Tester_Class_2.var_4 ^ true) ? (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1) : (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1);
+ }
+
+ private final static float func_1(final short arg_0, int[][] arg_1, final long arg_2)
+ {
+ Tester_Class_2.var_1 *= arg_0;
+ double var_45 = 6.841391103184752E307;
+ long var_46;
+ Tester_Class_2.var_1--;
+ --var_40;
+ ++var_40;
+ ++Tester_Class_3.var_1;
+ Tester_Class_1.var_4 = false;
+ var_36 %= 'X';
+ ++Tester_Class_2.var_1;
+ Tester_Class_1.var_1++;
+ return 3.2422038E38F;
+ }
+
+ private final static char func_2(double arg_0, final byte arg_1, int arg_2)
+ {
+ --Tester_Class_3.var_1;
+ if (Tester_Class_1.var_4)
+ {
+ if (var_43)
+ {
+ Tester_Class_3.var_1++;
+ }
+ else
+ {
+ var_40 <<= 1329560515532651520L;
+ }
+ (false & Tester_Class_2.var_4 ? (new Tester_Class_1[arg_1])[arg_1] : (new Tester_Class_1[arg_1][arg_1])[arg_1][arg_1]).var_3 = arg_1;
+ Tester_Class_2.var_19 = Tester_Class_3.var_19;
+ --var_40;
+ final long var_47 = ~Tester_Class_3.var_33 << var_40--;
+ ((Tester_Class_3)(new Tester_Class_2[arg_1][arg_1])[arg_1][arg_1]).var_24 *= (var_36 *= (long)arg_1 * ~arg_1);
+ Tester_Class_2.var_19 = Tester_Class_2.var_19;
+ ++((new Tester_Class_3[arg_1])[arg_1]).var_24;
+ }
+ else
+ {
+ var_40++;
+ }
+ var_40 <<= var_40;
+ if (true)
+ {
+ ++arg_2;
+ }
+ else
+ {
+ Tester_Class_2.var_7 = arg_1;
+ }
+ boolean var_48 = true;
+ var_36 /= arg_1;
+ final short var_49 = 15276;
+ Tester_Interface_0 var_50;
+ ((Tester_Class_2.var_19 = (Tester_Class_2.var_19 = Tester_Class_2.var_19)) + "xhi").toString();
+ arg_2++;
+ return var_40;
+ }
+
+ public final static char func_4(final boolean arg_0)
+ {
+ float var_52 = 2.8063675E38F;
+ var_40--;
+ Object var_53;
+ Tester_Class_3.var_29 |= (Tester_Class_3.var_29 &= true);
+ if (!Tester_Class_1.var_4)
+ {
+ --var_40;
+ }
+ else
+ {
+ var_52 %= 2027756834;
+ }
+ int var_54 = Tester_Class_1.var_1++;
+ var_40--;
+ long var_55;
+ byte var_56 = 97;
+ var_36 *= 9.75628909363086E307 % + -1.9812653793936264E306;
+ int var_57;
+ boolean var_58 = Tester_Class_1.var_4 ^= var_43;
+ return 'J';
+ }
+
+ static float func_5(final Object arg_0, float arg_1, final Tester_Class_2 arg_2)
+ {
+ var_39 = arg_2;
+ Tester_Class_3.var_27 = arg_2;
+ arg_1 %= 1.7777554E38F;
+ var_39 = (Tester_Class_3.var_27 = arg_2);
+ Tester_Class_3 var_59;
+ {
+ var_40 -= arg_1 - ~ (((Tester_Class_3)arg_2).var_3 = (byte)1455854212);
+ }
+ Object var_60 = Tester_Class_1.var_4 ? arg_0 : new String[arg_2.var_3 = (byte)arg_1][(byte)((Tester_Class_3)arg_0).var_28];
+ Tester_Class_3.var_27 = (Tester_Class_2)(var_39 = arg_2);
+ ((Tester_Class_3.var_4 |= var_43) ? (var_59 = (var_59 = (var_59 = (Tester_Class_3)var_60))) : (var_59 = (Tester_Class_3)arg_2)).var_24 ^= Tester_Class_3.var_1;
+ return Tester_Class_1.var_9;
+ }
+
+ private static void func_6(char arg_0, final Tester_Class_3 arg_1, String arg_2, final double arg_3)
+ {
+ ((new Tester_Class_1[(byte)arg_1.var_28])[(arg_1.var_32 = arg_1).var_3 = (byte)var_40]).var_2 = Tester_Class_3.var_9;
+ double var_61;
+ (true ? (arg_1.var_32 = arg_1) : (arg_1.var_32 = (Tester_Class_3.var_27 = (arg_1.var_32 = arg_1)))).var_6 = var_43 | (Tester_Class_2.var_4 = !Tester_Class_3.var_4) ? (arg_1.var_26 = arg_2) : (Tester_Class_2.var_19 = Tester_Class_2.var_18);
+ }
+
+ private final char func_7(int arg_0)
+ {
+ Tester_Class_2.var_4 &= var_43;
+ float var_62 = Tester_Class_3.var_9;
+ --var_40;
+ int var_63 = Tester_Class_1.var_1++;
+ {
+ "nncjfoit".indexOf((new int[(byte)'\\'])[(byte)var_36]);
+ if (var_43)
+ {
+ ((new Tester_Class_3[(byte)var_40][(byte)Tester_Class_2.var_1])[(byte)5046997225818337280L][(byte)var_63]).var_24 >>>= var_40;
+ }
+ else
+ {
+ --var_40;
+ }
+ --Tester_Class_2.var_1;
+ --var_63;
+ }
+ {
+ final byte var_64 = Tester_Class_1.var_4 ? (byte)'M' : (byte)(var_62 -= + ((byte)Tester_Class_1.var_8));
+ float var_65;
+ var_62 *= ((Tester_Class_3)(new Tester_Interface_0[var_64])[var_64]).var_24++;
+ var_36 /= var_64;
+ {
+ double var_66;
+ }
+ var_40 += 3500240160155094016L;
+ ((new Tester_Class_1[var_64][var_64])[var_64][var_64]).var_3 = (byte)(Tester_Class_2.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = var_64))));
+ ++Tester_Class_3.var_1;
+ }
+ --arg_0;
+ {
+ arg_0++;
+ }
+ Tester_Class_2.var_1++;
+ var_40 &= (short)((byte)Tester_Class_2.var_8 >> (((new Tester_Class_3[(byte)var_36])[(byte)(var_40 = Tester_Class_3.var_8)]).var_3 = (byte)((byte)3.3531374E38F * var_40)));
+ var_36 %= (var_62 = (byte)900943133);
+ var_36 = Tester_Class_3.var_33;
+ var_62 += (var_40 /= (byte)6766658341842315264L % (byte)'p') * (short)2019461672;
+ --var_40;
+ if (true)
+ {
+ var_62 *= 365879806965555200L;
+ }
+ else
+ {
+ var_36 -= ~9163555887358003200L;
+ }
+ Tester_Class_1.var_4 = Tester_Class_1.var_4;
+ {
+ var_40 <<= var_63;
+ }
+ var_40++;
+ String var_67;
+ return Tester_Class_1.var_8;
+ }
+
+ private final static Tester_Interface_0 func_8(char arg_0, final Tester_Class_2 arg_1, final String arg_2)
+ {
+ ((new Tester[(byte)((Tester_Class_3)arg_1).var_28])[((Tester_Class_1)(var_39 = arg_1)).var_3 = ((Tester_Class_3.var_27 = (Tester_Class_3)arg_1).var_3 = (byte)+ -9.9100855E36F)]).var_38 = (var_43 ? "k" : Tester_Class_2.var_19).substring(350785312);
+ return (new Tester_Interface_0[(byte)'l'])[((Tester_Class_1)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1))).var_3 = ((Tester_Class_3.var_27 = arg_1).var_3 = (((Tester_Class_3)arg_1).var_3 = (arg_1.var_3 = (arg_1.var_3 = (byte)'['))))];
+ }
+
+ private final int func_9(Tester_Class_3 arg_0, char arg_1)
+ {
+ final float var_68 = Tester_Class_3.var_9;
+ Tester_Class_2.var_18.toLowerCase();
+ double var_69;
+ {
+ Tester_Class_3.var_29 ^= !false || Tester_Class_2.var_4;
+ }
+ Tester_Class_1 var_70;
+ (Tester_Class_3.var_27 = (Tester_Class_2)(var_70 = arg_0)).var_6 = (Tester_Class_2)((var_41 = arg_0).var_6 = (arg_0.var_6 = arg_0));
+ "hv".codePointBefore(--Tester_Class_2.var_1);
+ var_41 = arg_0;
+ return ~ (((arg_0 = arg_0).var_24 &= arg_1) == 3.0764282E38F ? (byte)457565863 : ((arg_0 = arg_0).var_3 = (byte)arg_0.var_28));
+ }
+
+ private static void func_10(double arg_0, final Tester_Class_3 arg_1, double arg_2)
+ {
+ arg_1.var_32 = 'g' != 1.520646515461986E307 ? (arg_1.var_32 = arg_1) : arg_1;
+ Tester_Class_2.var_19.startsWith(Tester_Class_2.var_19 = Tester_Class_3.var_18);
+ Tester_Class_1.var_4 ^= true & (arg_1.var_3 = (arg_1.var_3 = (byte)- ((byte)1.4509185661781193E308))) > (arg_1.var_2 = var_40);
+ var_36 += Tester_Class_3.var_9;
+ }
+
+ Tester_Interface_0 func_12(final Object arg_0, float arg_1)
+ {
+ switch (((Tester_Class_3)arg_0).var_3 = (byte)arg_1)
+ {
+ case 4:
+ var_41 = (Tester_Class_3)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_0)));
+ double var_72 = (double)3858573493713776640L;
+ byte var_73 = (var_41 = (Tester_Class_2)arg_0).var_3 = (((Tester_Class_3)arg_0).var_3 = (byte)var_72);
+ break;
+
+ case 13:
+ (Tester_Class_3.var_27 = (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)(Tester_Class_2)arg_0)).var_3 = (Tester_Class_2.var_1 *= ((Tester_Class_3)arg_0).var_24) == (byte)Tester_Class_3.var_33 ? (byte)188693954866039808L : (byte)Tester_Class_2.var_8;
+ break;
+
+ default:
+ var_40 <<= (byte)157510337;
+ break;
+
+ case 26:
+
+ case 122:
+
+ }
+ Tester_Interface_0 var_74;
+ long var_75;
+ var_41 = (var_41 = (var_41 = (Tester_Class_2)arg_0));
+ arg_1 *= 1601420762;
+ var_74 = (var_41 = Tester_Class_1.var_4 ? (Tester_Class_3)arg_0 : (Tester_Class_2)arg_0);
+ (Tester_Class_1.var_4 ? (Tester_Class_3)(var_39 = (Tester_Class_3)arg_0) : (true ? (Tester_Class_3)arg_0 : (Tester_Class_3)arg_0)).var_28 *= 1066935145;
+ var_40 >>>= (byte)6.643183E36F / - ((byte)1.277596E37F);
+ {
+ ((Tester_Class_3)(((Tester_Class_3)((Tester_Class_3.var_29 ^= (Tester_Class_3.var_29 &= var_43)) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0)).var_32 = (Tester_Class_3.var_27 = (Tester_Class_2)arg_0))).var_28--;
+ }
+ var_38 = "qad";
+ byte var_76 = ((Tester_Class_2)(var_39 = (Tester_Class_3)arg_0)).var_3 = true ? ((var_41 = (var_41 = (Tester_Class_3)arg_0)).var_3 = (byte)1.7128118638075888E308) : (byte)1.6562746603631249E308;
+ return var_39 = (Tester_Class_3)((var_41 = (Tester_Class_3)arg_0).var_6 = Tester_Class_2.var_18);
+ }
+
+ protected final String func_13()
+ {
+ float var_77;
+ var_38 = (Tester_Class_2.var_19 = var_38);
+ Tester_Class_2.var_4 ^= !var_43 | (Tester_Class_3.var_29 ^= Tester_Class_1.var_4);
+ Tester_Class_3.var_1--;
+ Tester_Class_2.var_1++;
+ return Tester_Class_2.var_18;
+ }
+
+ public static String execute()
+ {
+ try {
+ Tester t = new Tester();
+ try { t.test(); }
+ catch(Throwable e) { }
+ try { return t.toString(); }
+ catch (Throwable e) { return "Error during result conversion to String"; }
+ } catch (Throwable e) { return "Error during test execution"; }
+ }
+
+ public static void main(String[] args)
+ {
+ try {
+ Tester t = new Tester();
+ try { t.test(); }
+ catch(Throwable e) { }
+ try { System.out.println(t); }
+ catch(Throwable e) { }
+ } catch (Throwable e) { }
+ }
+
+ private void test()
+ {
+ int var_78 = 0;
+ var_39 = (new Tester_Class_1[(byte)var_40])[(byte)Tester_Class_3.var_33];
+ while (var_43 && (var_78 < 70 && true))
+ {
+ var_40 *= ~ ~Tester_Class_3.var_33 % Tester_Class_3.var_9;
+ var_78++;
+ var_39 = new Tester_Class_3();
+ var_39 = (var_41 = (Tester_Class_3.var_27 = new Tester_Class_2()));
+ }
+ final Tester_Class_3 var_79 = (Tester_Class_1.var_4 ? ~Tester_Class_3.var_33 : var_36) == 1433764895112462336L ? new Tester_Class_3() : new Tester_Class_3();
+ Tester_Class_2 var_80;
+ }
+ public String toString()
+ {
+ String result = "[\n";
+ result += "Tester.var_40 = "; result += Printer.print(var_40);
+ result += "\n";
+ result += "Tester.var_42 = "; result += Printer.print(var_42);
+ result += "\n";
+ result += "Tester.var_36 = "; result += Printer.print(var_36);
+ result += "\n";
+ result += "Tester.var_37 = "; result += Printer.print(var_37);
+ result += "\n";
+ result += "Tester.var_39 = "; result += Printer.print(var_39);
+ result += "\n";
+ result += "Tester.var_38 = "; result += Printer.print(var_38);
+ result += "\n";
+ result += "Tester.var_43 = "; result += Printer.print(var_43);
+ result += "\n";
+ result += "Tester.var_41 = "; result += Printer.print(var_41);
+ result += "";
+ result += "\n]";
+ return result;
+ }
+ static class Printer
+ {
+ public static String print(boolean arg) { return String.valueOf(arg); }
+ public static String print(byte arg) { return String.valueOf(arg); }
+ public static String print(short arg) { return String.valueOf(arg); }
+ public static String print(char arg) { return String.valueOf((int)arg); }
+ public static String print(int arg) { return String.valueOf(arg); }
+ public static String print(long arg) { return String.valueOf(arg); }
+ public static String print(float arg) { return String.valueOf(arg); }
+ public static String print(double arg) { return String.valueOf(arg); }
+
+
+ public static String print(Object arg)
+ {
+ return print_r(new java.util.Stack(), arg);
+ }
+
+ private static String print_r(java.util.Stack visitedObjects, Object arg)
+ {
+ String result = "";
+ if (arg == null)
+ result += "null";
+ else
+ if (arg.getClass().isArray())
+ {
+ for (int i = 0; i < visitedObjects.size(); i++)
+ if (visitedObjects.elementAt(i) == arg) return "<recursive>";
+
+ visitedObjects.push(arg);
+
+ final String delimiter = ", ";
+ result += "[";
+
+ if (arg instanceof Object[])
+ {
+ Object[] array = (Object[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print_r(visitedObjects, array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof boolean[])
+ {
+ boolean[] array = (boolean[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof byte[])
+ {
+ byte[] array = (byte[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof short[])
+ {
+ short[] array = (short[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof char[])
+ {
+ char[] array = (char[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof int[])
+ {
+ int[] array = (int[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof long[])
+ {
+ long[] array = (long[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof float[])
+ {
+ float[] array = (float[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof double[])
+ {
+ double[] array = (double[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+
+ result += "]";
+ visitedObjects.pop();
+
+ } else
+ {
+ result += arg.toString();
+ }
+
+ return result;
+ }
+ }
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6716441/Tester.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,940 @@
+/*
+ * 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 6716441
+ * @summary error in meet with +DoEscapeAnalysis
+ * @run main/othervm -Xcomp -XX:+AggressiveOpts Tester
+ */
+
+/* Complexity upper bound: 70070 ops */
+
+class Tester_Class_0 {
+ Object var_1;
+
+
+ public Tester_Class_0()
+ {
+ var_1 = "cmlv";
+ {
+ final Object var_7 = false ? (var_1 = "flwnujmm") : (var_1 = "");
+ }
+ float var_8 = 0F;
+ boolean var_9;
+ do
+ {
+ ((var_9 = (var_9 = (var_9 = false))) && true ? new String("yvirc") : "rmfkjbx").indexOf(99854165);
+ var_8++;
+ boolean var_10 = true;
+ var_10 |= true ? true : false;
+ var_10 |= false | var_10 ? (var_10 |= true) : true;
+ } while (var_8 < 1 && "tpb".charAt(~ ((byte)2449669946597620736L)) >>> (byte)1.704554E38F >= ('t' < var_8 ? (short)var_8 : 1237471887 / +4199632387838836736L));
+ var_1 = (var_1 = "y");
+ switch ((var_9 = "".equalsIgnoreCase("kqalxwsnu") | false) ? (new char[(byte)1.3230508534158742E308])[(byte)(short)93390917] : 'c')
+ {
+ case 'U':
+
+ case 'W':
+
+ case 'A':
+
+ case 72:
+
+ }
+ var_9 = (var_9 = false);
+ float var_11 = 0F;
+ var_9 = true;
+ for (var_1 = (var_1 = new boolean[(new byte[(byte)'O'])[(byte)'l']]); var_11 < 2; var_1 = (true ? "" : "nn").toUpperCase())
+ {
+ var_9 = true;
+ var_11++;
+ var_9 = true;
+ int var_12 = (new short[(byte)1825213428])[(byte)1.6151095881186834E308] + (byte)(short)'V';
+ }
+ var_1 = (new boolean[(byte)1546704177][(byte)6314352927310996480L][(byte)6838913812451802112L])["e".equalsIgnoreCase("d") ? (byte)3.964472879846357E307 : (byte)'L'];
+ var_9 = (var_9 = false);
+ }
+
+
+
+ protected Object clone()
+ {
+ var_1 = (var_1 = "dbogknllu");
+ var_1 = "jljax";
+ var_1 = (var_1 = false ? "s" : "upqinst");
+ if (false)
+ {
+ var_1 = (var_1 = (var_1 = "nwhu"));
+ }
+ else
+ {
+ short var_2;
+ var_2 = false ? (byte)((short)'e' - (byte)2.267975E38F) : (byte)1.28920093132789E308;
+ }
+ (((byte)2.3450009E38F >= (byte)- (+ - -1.6256751428449317E306 * 954071273906192384L) ? true : true) ? "gpv".substring(468176669, 1915798010) : "macqbvf").offsetByCodePoints("ivwivjege".charAt(1819923298) >>> (byte)((- ~653213024937366528L + 'N') * +1.0297164E38F) + (short)~ + -4535402293751053312L, (short)3837656677199316992L + (new byte[(byte)2.1586717E38F])[(byte)((short)719847962 - 8.599263E37F)]);
+ new String((char)650047353 > (short)'I' ? "maygldu".replaceAll("hpn", "bacoyows") : "nkx").endsWith(new String("h" + "vx"));
+ byte var_3;
+ return var_1 = "vbiccvdu";
+ }
+
+ public boolean equals(Object obj)
+ {
+ var_1 = "rxpocj";
+ obj = "ndogtwvuh";
+ {
+ {
+ var_1 = "vmdkvs";
+ }
+ final boolean var_4 = false;
+ long var_5;
+ var_5 = (short)'G' >> + ((byte)1.1872624048733707E308);
+ }
+ var_1 = (new byte[(byte)(short)1.7804576633213148E308][(byte)(short)8.300151422843056E307])[(byte)3110360603258978304L];
+ obj = "fudebwroh";
+ obj = new Object[(false && false) & false ? (byte)8796624364629753856L : (byte)- +1.5843542184394165E308];
+ if (true)
+ {
+ var_1 = new float[(byte)1372189277][(byte)((byte)8.352642520619892E307 == (! !false ^ true ? (short)1.3871033E37F : (byte)'f') ? 7.33899E37F - (short)2.2558552E37F : 2.6072269E38F)];
+ }
+ else
+ {
+ var_1 = obj;
+ obj = new boolean[(byte)8.623747E37F][(byte)~ ((byte)(short)(byte)2100816354)];
+ }
+ var_1 = new int[(new byte[(byte)7410132537719084032L])[(byte)1524949007]][(byte)((long)9188640 ^ 'n')];
+ if (-3.0364305E38F > 8.114229090672013E307)
+ {
+ var_1 = (var_1 = new boolean[(byte)1.0354788699727844E308][(byte)-4867581638981979136L]);
+ }
+ else
+ {
+ obj = (obj = obj);
+ obj = (new int[(byte)'f'][(byte)7563033606293564416L])[(byte)2052737645];
+ }
+ long var_6;
+ var_6 = (+ + ~3862500564271147008L != (short)8549491352795953152L || (byte)+ + (var_6 = 'D') > (var_6 = 1687952259)) && true ? (short)1756260278 : (byte)(short)3.202384E36F;
+ return false ^ ((false ? !true : true) ? false : (true ? ! !false : false));
+ }
+
+
+
+ public String toString()
+ {
+ String result = "[\n";
+ result += "Tester_Class_0.var_1 = "; result += Tester.Printer.print(var_1);
+ result += "";
+ result += "\n]";
+ return result;
+ }
+}
+
+
+interface Tester_Interface_1 {
+}
+
+
+final class Tester_Class_2 extends Tester_Class_0 {
+ static char var_13;
+ final static long var_14 = ~ ~ (((false ? !true ^ !true : !false | true) ? (byte)1.4363583E38F : (byte)(short)'X') * + + +3767002589844008960L << (var_13 = (var_13 = 'X')));
+
+
+ public Tester_Class_2()
+ {
+ ((true ? (byte)- ((byte)2.6338962E38F) : (byte)'H') <= (short)8.671266E37F || !false & true ? (Tester_Class_0)(var_1 = "tgoexsr") : (Tester_Class_0)(var_1 = "mptusv")).var_1 = "tbxbgyti";
+ var_1 = true ? (var_1 = "islgpxwa") : "rypkbu";
+ var_1 = "vngiif";
+ var_13 = (var_13 = (short)~ (-3250577075350561792L + +2983539228635145216L - '`') < 861590495 * (short)1.5299644E38F ? 'V' : 'G');
+ Object[] var_27;
+ var_1 = (var_1 = "glu");
+ }
+
+
+
+
+
+ private static int func_0(Tester_Interface_1 arg_0, Tester_Interface_1 arg_1, final int arg_2)
+ {
+ var_13 = 'i';
+ new String();
+ (true ? "pu" : "oltbcysyd").substring(1236315614);
+ byte var_15;
+ var_15 = (new byte[(byte)1582653493940204544L][(byte)(char)-1.5806537192822515E308])[(byte)1.2986292E38F][(byte)(short)arg_2];
+ if (true || true)
+ {
+ ((new Tester_Class_2[var_15 = (byte)'q'])[var_15 = 7.653082E37F < (var_13 = 'o') ? (byte)- - + +3.1640875E38F : (byte)-6820511772487837696L]).var_1 = (new Tester_Class_0[(byte)(short)(new byte[(byte)1080194717])[(byte)8297829563314362368L]])[var_15 = (var_15 = (var_15 = (var_15 = (byte)'t')))];
+ double[] var_16;
+ }
+ else
+ {
+ arg_1 = (arg_1 = arg_0);
+ }
+ var_13 = (var_13 = 'o');
+ var_13 = (false || false ^ false) ^ !true ? 'Z' : (var_13 = 'i');
+ return true ? (var_15 = (byte)'C') : 1120493294;
+ }
+
+ static double func_1(final int arg_0, long arg_1, long arg_2)
+ {
+ "ghtfhmbeg".compareToIgnoreCase("djn");
+ {
+ ((true ? true : ! !true) ? "" : "ioowivxge").substring(1844979226, "ppsk".startsWith("lllmn") | false ? arg_0 * arg_0 : (byte)663320199);
+ ((Tester_Class_0)(((new Tester_Class_2[(byte)4797509007239530496L])[(byte)(- -2.8961086E38F - arg_1)]).var_1 = new float[(byte)('m' / 6.0657416E37F)])).var_1 = new boolean[(byte)(short)(+4.515459E37F - (short)arg_0)][(byte)(-1.3002677717712297E308 + (var_13 = "bcjfdnc".charAt(arg_0)) * (arg_2 - 1.6058080036165979E308))];
+ var_13 = 'E';
+ }
+ float var_17 = 0F;
+ --arg_1;
+ do
+ {
+ final String[] var_18 = new String[(byte)(short)arg_0];
+ var_17++;
+ Object var_19 = (new Object[(byte)var_17])[(false ? "xfkx".equalsIgnoreCase("j") : !false) ^ !false ? (byte)(1.6627987E35F * 2.62825E38F) : (byte)var_17];
+ } while (var_17 < 2 && false | ((byte)1.4661115E38F | arg_0 - 'l') < ('J' & (byte)+ ((float)1200013759)));
+ long var_20 = 0L;
+ arg_2--;
+ for (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'p'))))); var_20 < 4; var_13 = 'y')
+ {
+ new String((true | true ? "oxpfy" : "gaynucv") + (true ? "cmrrk".substring(653981013, arg_0) : "ociewl" + "srhbvcgci"));
+ var_20++;
+ arg_2 >>= arg_0;
+ arg_2 = false ? (byte)'l' : (byte)(~var_20 - (byte)1.1290483681734838E308);
+ }
+ ((new Tester_Class_2[(byte)arg_1++])[(byte)685259385]).var_1 = new Tester_Interface_1[(byte)arg_0];
+ --arg_1;
+ var_13 = 483446392 - (byte)'P' < ((short)(true ? (var_13 = 't') : 'n') & (short)'l') ? (var_13 = 'q') : (var_13 = (var_13 = 'h'));
+ var_13 = 'y';
+ return 1.097000731360761E308;
+ }
+
+ private final boolean func_2(final short[][] arg_0, byte arg_1, Object arg_2)
+ {
+ var_1 = new char[arg_1];
+ arg_1 /= (var_13 = 'A') + -var_14;
+ int var_21 = 0;
+ arg_2 = (new Tester_Class_0[arg_1 += var_14][arg_1])[arg_1 >>>= 'R' + + -var_14 - 4078879817303787520L];
+ for (arg_1--; (+ +1.1473423E38F < 'w' & false | var_21 != (short)4633877342445358080L | !false ? false | !false : true) && (var_21 < 1 && (arg_0[arg_1])[arg_1 %= 7.136449148111178E307] > 7.362329280963185E307); arg_1++)
+ {
+ arg_1 = (arg_1 %= + -9.872181578576624E307);
+ var_21++;
+ arg_1 /= 7.365334241099395E307;
+ var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'A')))));
+ }
+ arg_1 >>= var_14;
+ boolean var_22 = false;
+ return ((var_22 &= true) && var_22 ? (short)1.568578228250838E308 : arg_1) >= (new float[arg_1])[arg_1 /= 1.6849858816110731E308];
+ }
+
+ public final String func_3(Tester_Interface_1 arg_0)
+ {
+ arg_0 = arg_0;
+ arg_0 = (arg_0 = arg_0);
+ var_13 = (var_13 = (var_13 = (var_13 = "rqimya".charAt(390686412))));
+ ((Tester_Class_0)(var_1 = "suxd")).var_1 = new Tester_Class_0[(byte)(float)(short)1.584667675541511E308];
+ arg_0 = ((byte)+ + - +1.3636011E38F == 'L' ^ true) & (!true | true) ? (arg_0 = arg_0) : arg_0;
+ var_1 = (((Tester_Class_0)(var_1 = (Tester_Class_0)(var_1 = "ndxcurdr"))).var_1 = (var_1 = (var_1 = "schnhe")));
+ var_1 = (new Object[(byte)(var_13 = (var_13 = 'G'))])[(byte)((byte)1.5366658198344074E308 - 1.0051541518022535E308)];
+ var_13 = (var_13 = 'x');
+ (true ? (Tester_Class_0)(var_1 = "slesdph") : (Tester_Class_0)(var_1 = "wxj")).var_1 = false ? (Tester_Class_0)(var_1 = "iddvoil") : (Tester_Class_0)(var_1 = "yjbxhuip");
+ var_13 = (var_13 = 'f');
+ var_1 = (new short[(byte)1.8902424351360974E307])[(new byte[(byte)1552392028])[(byte)'V']] >= (1.2449926736063704E308 + 'K') / (short)1.0847178E38F / ((short)'M' % (1.225890077244388E308 + + ((byte)1.5358312881295287E308))) ? (Tester_Class_0)(var_1 = "khfntg".toString()) : (Tester_Class_0)(var_1 = "jkttx");
+ {
+ arg_0 = arg_0;
+ }
+ arg_0 = arg_0;
+ var_13 = (true ? "jndbffakc" : "hhcsc").charAt((byte)7322932713210745856L >> (short)(var_13 = (var_13 = 'R')));
+ var_13 = (var_13 = (var_13 = 'U'));
+ {
+ "gepdu".trim();
+ }
+ var_13 = 'H';
+ new String();
+ {
+ (false ^ (true ^ ((!true | ! !true) ^ ! (1.7800668444792402E308 * var_14 >= (var_13 = (var_13 = (var_13 = 'g')))))) ? "dsm" : "g").toUpperCase().toString();
+ ((Tester_Class_0)(var_1 = "fcdvd")).var_1 = (Tester_Class_0)(((Tester_Class_0)(var_1 = "uwhnte")).var_1 = "vpatqpd");
+ }
+ switch (((byte)((byte)((int)'n' / var_14) >>> (short)7.786475993917233E307 - (var_13 = 'm')) <= (("".endsWith("pbypgis") ^ false) & true ? (byte)func_0(arg_0, arg_0, 723551781) : (short)140766856) ? true | (!false || false) : 'F' != (var_13 = 'V')) ? (var_13 = 'j') : 'D')
+ {
+ case 'p':
+
+ }
+ var_13 = (var_13 = (var_13 = 'y'));
+ var_13 = ("" + "wwbxwyt").charAt((short)8373354379880418304L << (short)(byte)1.557224945027141E308);
+ arg_0 = true ? (arg_0 = arg_0) : arg_0;
+ ((Tester_Class_0)(((Tester_Class_0)(var_1 = "rmkvbp")).var_1 = (var_1 = "gvb"))).var_1 = new Tester_Class_0[(byte)var_14];
+ arg_0 = arg_0;
+ return 2.5245162E38F + 3.9088502076337727E307 > 1.0883030748712796E308 ? "efttufmbg" : "xy";
+ }
+
+ protected short func_4(final double arg_0, long arg_1, final Object arg_2, final byte arg_3)
+ {
+ (((("ptnmpn".startsWith("xxgxjvsie") ? !true : ! !true) ? ! !false : false) ? (true ? true : false) : (var_13 = (var_13 = 'X')) == 1948276447) ? (Tester_Class_0)(var_1 = new float[arg_3][arg_3]) : (Tester_Class_0)arg_2).var_1 = new double[(new byte[arg_3][arg_3])[arg_3][arg_3]][arg_3];
+ boolean var_23;
+ return true ? (short)'r' : (byte)(short)('\\' >>> arg_3);
+ }
+
+ final static byte func_5(final long arg_0, float arg_1, final double arg_2)
+ {
+ arg_1 = arg_2 <= ((var_13 = 'D') <= - (3463565869695079424L << 'S') ? 'a' : (var_13 = 'o')) | (true ? !false : !false) ? (byte)(short)(var_13 = 'r') : (short)(byte)'S';
+ {
+ {
+ arg_1 %= '_';
+ }
+ char var_24 = 'G';
+ "hc".lastIndexOf("");
+ arg_1 *= (arg_1 /= (byte)-8.308933840953204E306);
+ --var_24;
+ arg_1 /= ~ ((byte)2.2736606E38F) <= (3392301601783633920L == 3.015267E38F ^ ! !true ? (byte)88382550 : (byte)1.2019729E38F) ? 1027309963 : + -4.355887546298483E307;
+ ((new Tester_Class_2[(byte)arg_2])[(byte)870592870]).var_1 = "i";
+ arg_1 /= 't';
+ }
+ var_13 = 'f';
+ Tester_Class_0 var_25 = (new Tester_Class_0[(byte)arg_1])[(true | false ^ !false) & ! !true & - +2.758844E38F >= (new short[(byte)5.9160883E37F])[(byte)'r'] ? (byte)arg_0 : (byte)((short)1802078016 & arg_0)];
+ arg_1 /= (byte)arg_2;
+ var_13 = 'R';
+ boolean var_26 = (true ? false : !false) ? false : !true == ! !false;
+ arg_1 %= (var_26 ^= (byte)1101752087 <= (short)arg_1) ? arg_1 : (float)1882235314;
+ var_25 = var_25;
+ if (var_26 &= var_26)
+ {
+ var_13 = "".startsWith("vp", - ((byte)2040501187) ^ (byte)-3921263616446438400L) ? "gam".charAt(+ ((byte)arg_1)) : (var_13 = 'H');
+ arg_1 /= var_26 | ! (var_26 ^ (byte)arg_0 <= (var_13 = 'r') | (var_26 |= var_26)) ? 'N' : ~8963227563301903360L;
+ }
+ else
+ {
+ var_13 = 'l';
+ var_25 = (var_25 = var_25);
+ }
+ arg_1 += (byte)(("m".substring(837996717, 861903057).startsWith("vwpky", (var_13 = 'Z') % (byte)arg_1) ? !false ^ !var_26 : var_26) ? (byte)arg_1 : ((var_26 | var_26) ^ !false ? (short)'U' : (short)'d'));
+ ((1.3445538E38F < (arg_1 -= 1236356135) ^ (var_26 = true)) & var_26 ? var_25 : (var_25 = var_25)).var_1 = true ? (var_25.var_1 = var_25) : (var_25.var_1 = var_25);
+ var_26 |= - ((byte)251113415) < (short)arg_1 & false & false;
+ arg_1 += (var_26 &= true) ? 7.546147305340402E307 : (true & !var_26 ? (byte)1.5107802154474685E307 : (byte)arg_1);
+ var_25.var_1 = true ? "bqsewhn" : "aojssvan";
+ return (byte)(var_13 = (char)(new short[(byte)46697464])[(byte)var_14]);
+ }
+
+ public String toString()
+ {
+ String result = "[\n";
+ result += "Tester_Class_2.var_13 = "; result += Tester.Printer.print(var_13);
+ result += "\n";
+ result += "Tester_Class_2.var_14 = "; result += Tester.Printer.print(var_14);
+ result += "\n";
+ result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1);
+ result += "";
+ result += "\n]";
+ return result;
+ }
+}
+
+public class Tester {
+ static Tester_Class_0 var_28;
+ double var_29 = 4.861846831496217E307;
+ static byte var_30 = 79;
+ static boolean var_31 = false;
+ final byte var_32 = 48;
+
+
+ public short func_0(final byte arg_0, boolean arg_1, final double arg_2)
+ {
+ --var_30;
+ new Tester_Class_2().var_1 = "xdwldeqhc";
+ char var_33 = 'd';
+ return (var_31 = var_30 < (new short[var_30])[var_30]) ? (short)(var_33 >>>= (short)2.3152642E38F) : var_30;
+ }
+
+ private final float func_1(final long arg_0, final Tester_Class_0 arg_1, Tester_Class_0 arg_2, final char arg_3)
+ {
+ {
+ new Tester_Class_0();
+ }
+ var_30 >>= (short)1.1469118780047631E308;
+ var_31 |= var_31;
+ if (true)
+ {
+ Tester_Class_2 var_34 = (var_31 ^= (var_31 ^= false)) ? (Tester_Class_2)arg_1 : (new Tester_Class_2[var_32])[var_30];
+ }
+ else
+ {
+ "shqjwg".compareToIgnoreCase(false ? "gxoyw" + "cx" : "r" + "icj");
+ }
+ ((new Tester_Class_2[var_32])[++var_30]).var_1 = (new Object[var_30][var_32][var_32])[var_30 |= var_32];
+ arg_1.var_1 = (arg_2 = arg_2);
+ arg_1.var_1 = (((new Tester_Class_2[var_30])[var_30 = var_32]).var_1 = new String[var_32]);
+ var_28 = (Tester_Class_2)((arg_2 = arg_2).var_1 = new double[var_30]);
+ arg_2 = arg_1;
+ final boolean var_35 = "qjsdfuyru".endsWith("nuw" + "bne") | arg_3 >= 1.2054153346397785E308;
+ var_31 &= (var_31 ^= var_35);
+ {
+ var_31 &= var_31 ? false : !false;
+ }
+ if (var_31)
+ {
+ var_28 = (new Tester_Class_2[var_32])[var_32];
+ }
+ else
+ {
+ arg_1.equals((new Object[var_32])[var_32]);
+ }
+ ((var_31 ^= true) ? "x" : "euc").substring(+ (var_30 ^= var_30) & (byte)(new short[var_30])[var_30 /= 4.220757896697652E307]);
+ arg_2 = var_31 ? (Tester_Class_2)arg_1 : (Tester_Class_2)arg_2;
+ arg_2 = (Tester_Class_2)(new Object[var_32][var_32])[var_30][var_32];
+ return 9.932983E36F * (Tester_Class_2.var_13 = arg_3);
+ }
+
+ public int func_2(Tester_Class_0 arg_0)
+ {
+ "ptwusxrxn".indexOf("v");
+ var_30 |= 1770666843;
+ var_29 += (short)(Tester_Class_2.var_14 / Tester_Class_2.var_14);
+ if (var_31)
+ {
+ var_30 = var_32;
+ }
+ else
+ {
+ double var_36;
+ }
+ if (true)
+ {
+ var_30 -= 2.1474216E38F;
+ }
+ else
+ {
+ var_29 += 'f';
+ }
+ var_29 -= Tester_Class_2.var_14;
+ if (false)
+ {
+ arg_0.var_1 = arg_0;
+ }
+ else
+ {
+ arg_0 = (var_28 = (var_28 = arg_0));
+ }
+ {
+ Tester_Class_2.var_13 = 'p';
+ }
+ var_29 = ~Tester_Class_2.var_14 % 'y';
+ switch (var_30 >>>= var_30)
+ {
+ case 115:
+
+ }
+ arg_0 = arg_0;
+ var_31 ^= (var_31 = true);
+ return "".charAt(~var_32) >> ((var_31 &= true) ? var_30 : var_32);
+ }
+
+ protected double func_3(boolean[] arg_0, double arg_1, long[][] arg_2)
+ {
+ switch (var_31 ? (short)(var_32 / (arg_1 /= (int)(arg_1 *= (Tester_Class_2.var_13 = ']')))) : (var_30 ^= + +Tester_Class_2.var_14 * (+ +3075166460237931520L / '[')))
+ {
+ case 31:
+
+ case 118:
+
+ }
+ Tester_Class_2.var_13 = 'm';
+ "mwkh".indexOf("hdgiquve", (new char[var_32])[var_30 &= 'S'] % var_30);
+ final boolean var_37 = false;
+ char var_38 = 'F';
+ var_28 = (new Tester_Class_2[var_30][var_30])[var_30 *= var_38][var_32];
+ new Tester_Class_0().var_1 = new char[var_32][var_30];
+ var_30 &= var_30;
+ var_31 |= (var_31 |= true);
+ int var_39 = 1769831681;
+ final Tester_Class_2 var_40 = (var_31 |= false ? var_31 : var_37) ? (Tester_Class_2)((new Object[var_30][var_30][var_32])[var_30 <<= var_30])[var_30][var_30++] : (Tester_Class_2)new Tester_Class_0();
+ var_30 -= +var_30;
+ "dvmuim".replaceFirst("clmisuxu", "".toLowerCase() + "xi");
+ var_39 = var_38 - (short)585806817;
+ arg_1 += (double)(short)(6.4329855E37F / var_32 * (var_38 += 'w'));
+ ++var_39;
+ var_40.var_1 = (var_28 = (var_28 = var_40));
+ var_29 /= 3.5705444317400964E306;
+ Tester_Interface_1 var_41;
+ return arg_1;
+ }
+
+ final char func_4(final long arg_0, int arg_1, final int arg_2)
+ {
+ {
+ Tester_Class_2.var_13 = 'D';
+ var_31 = false;
+ }
+ if (var_31)
+ {
+ var_30--;
+ Tester_Class_0 var_42 = var_28 = (new Tester_Class_0[var_32])[var_32];
+ }
+ else
+ {
+ Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'H');
+ }
+ var_28 = (Tester_Class_2)(new Tester_Class_2().var_1 = (var_28 = (new Tester_Class_0[var_30])[var_30]));
+ arg_1 &= var_32;
+ --var_30;
+ return Tester_Class_2.var_13 = 'n';
+ }
+
+ final static Object func_5()
+ {
+ var_28 = (Tester_Class_2)(! (var_31 |= true & var_31) ? (new Tester_Class_0[var_30])[var_30] : (var_28 = (new Tester_Class_0[var_30])[var_30]));
+ var_31 |= false;
+ return var_31 ? (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = (new Tester_Class_0[var_30 /= 1366944127])[var_30]) : (new Tester_Class_0[var_30][var_30])[var_30 += 1.4070924450257891E307][var_30];
+ }
+
+ static Tester_Class_2 func_6(final Object arg_0)
+ {
+ var_28 = (var_31 ^= true) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0;
+ ((new Tester[--var_30])[var_30]).var_29 -= -3.0029087E38F * (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k'));
+ var_28 = (Tester_Class_2)(var_28 = (var_28 = (var_28 = (Tester_Class_0)arg_0)));
+ return false ? new Tester_Class_2() : new Tester_Class_2();
+ }
+
+ private static Tester_Interface_1 func_7(byte arg_0, Tester_Class_2 arg_1, final int arg_2, char arg_3)
+ {
+ {
+ var_31 = var_31;
+ var_31 |= (var_31 &= (var_31 |= !true));
+ arg_0 += Tester_Class_2.var_14;
+ }
+ var_30 = (var_30 *= ((new Tester[arg_0 ^= 1039546367])[arg_0]).var_32);
+ arg_1.var_1 = (var_31 ^= (var_31 &= !var_31 && !var_31)) ? (arg_1 = (arg_1 = arg_1)) : (new Tester_Class_0[arg_0++][arg_0])[arg_0][arg_0];
+ arg_1.var_1 = var_31 ? "jpmg" : "epwvupaqp";
+ var_28 = arg_1;
+ if (false)
+ {
+ arg_1 = arg_1;
+ }
+ else
+ {
+ arg_3 += var_30 % -9.298157E37F;
+ }
+ arg_1.var_1 = ((var_28 = (var_28 = arg_1)).var_1 = ((var_28 = arg_1).var_1 = "rlmf"));
+ var_28 = (arg_1 = arg_1);
+ arg_1 = arg_1;
+ {
+ var_31 = true;
+ }
+ (arg_1 = arg_1).var_1 = (arg_1.var_1 = (arg_1 = arg_1));
+ final short[] var_43 = new short[(var_31 &= false) ? arg_0 : var_30];
+ final short var_44 = 18087;
+ return false ? (new Tester_Interface_1[var_30 %= Tester_Class_2.var_14])[arg_0 -= 8.913955E37F * +arg_0] : (new Tester_Interface_1[var_30])[var_30];
+ }
+
+ private static float func_8(final Object[] arg_0, final byte arg_1, Tester_Class_0[] arg_2)
+ {
+ ((new Tester_Class_2[var_30 /= -2.37832E38F])[((new Tester[arg_1])[(new byte[arg_1])[arg_1]]).var_32]).var_1 = new Tester_Interface_1[arg_1];
+ if (var_31)
+ {
+ var_28 = (Tester_Class_2)(var_28 = arg_2[var_30]);
+ }
+ else
+ {
+ var_30 -= Tester_Class_2.var_14;
+ final int var_45 = 1864933386;
+ final Tester_Class_0 var_46 = var_28 = (new Tester_Class_2[arg_1][var_30 |= Tester_Class_2.var_14])[((new Tester[arg_1][var_30])[var_30][var_30]).var_32][arg_1];
+ var_31 &= (var_31 ^= false);
+ var_30 += (false ? 2.7581227E37F : + +1.8832631E38F) * ('P' * -1.9479086E38F);
+ }
+ (var_28 = (Tester_Class_2)arg_2[arg_1]).var_1 = (new Tester_Class_2[var_30][arg_1][arg_1])[arg_1];
+ ++var_30;
+ (var_28 = (new Tester_Class_2[var_30])[arg_1]).var_1 = false ? (new Tester_Class_0[var_30][var_30])[var_30][arg_1] : arg_2[var_30];
+ var_31 |= false;
+ ((new Tester[arg_1][var_30 >>>= (char)1981599])[arg_1][arg_1]).var_29 = false ^ (var_31 = var_31) ? (Tester_Class_2.var_13 = "nes".charAt(1080898679)) : - (var_30 %= 'n') ^ arg_1;
+ {
+ ((new Tester[arg_1])[var_30]).var_29 = (short)(Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'h'));
+ }
+ Tester_Class_2.var_13 = 'j';
+ ((new Tester_Class_2[arg_1])[var_30]).var_1 = new byte[var_30];
+ var_31 ^= (var_31 ^= !false);
+ "wcbi".toString();
+ final byte var_47 = var_30;
+ if (true)
+ {
+ "mpbkilw".substring(199662864);
+ }
+ else
+ {
+ var_30++;
+ }
+ Tester_Class_2.var_13 = '`';
+ "yujypq".indexOf("crve" + "inmvh", false ? ~arg_1 : "vukbkc".charAt(528096652));
+ Tester_Class_2 var_48 = (Tester_Class_2)((!var_31 & (var_31 ^= false ^ !true) ? false | !true : false) ? (var_28 = (Tester_Class_2)arg_0[var_30]) : (new Tester_Class_2[arg_1])[var_30]);
+ return (float)(var_31 ^ var_31 ? (var_30 ^= (short)((new Tester[var_30])[var_30]).var_29) : (var_30 /= - -5.917837279005691E307 - - +3.2004715720509636E306));
+ }
+
+ final Tester_Class_0 func_9()
+ {
+ var_30 += -3531557622894482432L / ~var_30;
+ var_28 = (var_28 = (new Tester_Class_2[var_30 += + -7.0203367E37F])[var_30]);
+ var_31 ^= ! !false ^ false;
+ if (true)
+ {
+ byte[] var_49;
+ var_31 &= true;
+ short var_50 = 14869;
+ }
+ else
+ {
+ (((new Tester[var_32][var_30][var_32])[var_30])[var_32][var_30]).var_29 *= 'h';
+ }
+ final int var_51 = false ? +var_32 >>> ~var_30 : --var_30;
+ var_31 |= false;
+ return (new Tester_Class_0[var_32][var_32])[var_30][var_30];
+ }
+
+ public static Object func_10()
+ {
+ Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'O');
+ return ((Tester_Class_2)(new Object[--var_30])[var_30]).var_1 = (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = "iu");
+ }
+
+ protected byte func_11(final Tester_Interface_1[] arg_0)
+ {
+ {
+ --var_30;
+ var_29 *= (short)1749707986816114688L;
+ var_31 = (var_31 = (var_31 |= var_31));
+ var_30 -= 6.4575257E37F;
+ }
+ var_28 = (var_28 = func_9());
+ Tester_Class_2.var_13 = 'b';
+ var_30--;
+ var_28 = (var_28 = (var_28 = (var_28 = (Tester_Class_2)func_10())));
+ var_28 = (new Tester_Class_2[var_32])[var_30];
+ char var_52 = (var_31 = false) ? (char)+ +Tester_Class_2.var_14 : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = '_'));
+ if (false)
+ {
+ var_30 += (short)(var_32 + 840104459);
+ }
+ else
+ {
+ var_29 /= 2.5320765E38F;
+ }
+ if (true)
+ {
+ var_30 %= 379977167934025728L;
+ }
+ else
+ {
+ var_52 = var_52;
+ }
+ var_30 >>= ('A' ^ --var_30) & 'H';
+ Tester_Class_2 var_53;
+ final int var_54 = 771623383;
+ var_29 %= (+1.938582E37F - 'G') * ++var_30;
+ int var_55 = (short)6.234053079170724E306 - (int)'^' / ((var_31 &= (var_31 ^= var_31)) ? (short)var_30 : ++var_30);
+ var_55 >>>= var_55 / ~6865244393150017536L;
+ var_31 ^= !false;
+ return var_30 >>>= 4351766607072508928L >> func_0(var_32, var_31, 1.021781609675458E308);
+ }
+
+ public static String execute()
+ {
+ try {
+ Tester t = new Tester();
+ try { t.test(); }
+ catch(Throwable e) { }
+ try { return t.toString(); }
+ catch (Throwable e) { return "Error during result conversion to String"; }
+ } catch (Throwable e) { return "Error during test execution"; }
+ }
+
+ public static void main(String[] args)
+ {
+ try {
+ Tester t = new Tester();
+ try { t.test(); }
+ catch(Throwable e) { }
+ try { System.out.println(t); }
+ catch(Throwable e) { }
+ } catch (Throwable e) { }
+ }
+
+ private void test()
+ {
+ {
+ ((Tester_Class_2)(Tester_Class_0)((var_31 = true) ^ (var_31 |= false & true) ? func_10() : new Tester_Class_2[var_32])).var_1 = ((var_28 = new Tester_Class_0()).var_1 = (new Tester_Class_0().var_1 = new Tester_Class_2()));
+ }
+ new String();
+ Tester_Class_2.var_13 = '[';
+ var_28 = (Tester_Class_2)(((var_31 ^= true) ? func_9() : new Tester_Class_0()).var_1 = new Tester_Class_2());
+ var_28 = new Tester_Class_0();
+ new String();
+ {
+ if ((new boolean[var_30])[var_30] & 732877932 == 1.4654316E38F & "xpqy".replace(']', 'f').startsWith("pqrqunvfx") ? ((var_31 ^= (var_31 &= var_31)) ? !var_31 : (var_31 &= true)) : var_31)
+ {
+ var_31 &= var_31;
+ }
+ else
+ {
+ func_2(var_28 = new Tester_Class_0());
+ }
+ {
+ ((new Tester_Class_0[var_30][var_30])[var_30][var_30]).var_1 = "uwrbjvl";
+ var_28 = (Tester_Class_0)func_5();
+ }
+ Tester_Class_2.var_13 = 's';
+ Tester_Class_0 var_56 = var_28 = true ? func_6(func_5()) : (new Tester_Class_2[var_30][var_32])[var_32][var_32];
+ double var_57 = 0;
+ var_29 += 1024895641427426304L % ~ ~Tester_Class_2.var_14;
+ while ((true || (var_31 = var_31)) && var_57 < 12)
+ {
+ (false & !false ? var_56 : (var_56 = var_56)).var_1 = "vbc";
+ var_57++;
+ var_29 += func_0(var_30 /= (short)var_30 / var_32, false, var_57);
+ (var_31 ? (Tester_Class_2)var_56 : (new Tester_Class_2[var_30])[var_30]).var_1 = new double[var_31 ? (var_30 |= 177265600183083008L) : var_32];
+ }
+ switch (var_31 ^ var_31 | ! (var_31 = false) & (var_31 & false) ? (true ? (short)var_30 : func_0(var_30, true, var_57)) : func_0(var_30, var_31, var_29 /= 2.7203017E38F))
+ {
+ case 23:
+ var_31 ^= true ? var_31 : var_31;
+ break;
+
+ case 40:
+
+ default:
+
+ case 104:
+
+ }
+ Object var_58 = (var_31 ^= (var_31 ^= false) | (~3392263608888292352L < 1681682009 | var_31)) ? (((new Tester_Class_2[Tester_Class_2.func_5(Tester_Class_2.var_14, 3.3507317E38F, var_57)])[var_30 %= var_32]).var_1 = (var_56 = (Tester_Class_0)func_5())) : func_5();
+ (var_56 = (var_28 = (var_56 = func_6(var_58)))).var_1 = (((new Tester_Class_2[var_30])[var_30]).var_1 = new float[(byte)Tester_Class_2.var_14][var_32]);
+ new Tester_Class_2().var_1 = new double[var_30];
+ final Tester_Class_0 var_59 = var_28 = (!false & (false || (var_31 && !var_31) & false) ? var_31 : (var_31 |= !var_31)) ? (Tester_Class_2)(var_28 = new Tester_Class_2()) : (false ? new Tester_Class_2() : (Tester_Class_2)var_58);
+ }
+ var_30--;
+ {
+ var_29 += ~func_11(((new Tester_Interface_1[var_32][var_30][var_32])[var_30 ^= var_30])[var_32]);
+ }
+ float var_60 = 0F;
+ double var_61 = var_29;
+ do
+ {
+ long var_62;
+ var_60++;
+ "vcs".offsetByCodePoints((short)('w' | (short)var_30) & (new short[--var_30])[var_30], ((var_31 |= var_31) ^ (var_31 = var_31) ? var_32 : var_30) - (short)86413218);
+ } while (false && (var_60 < 100 && ((var_31 = false) ? var_31 : (var_31 ^= false)) & var_31));
+ long var_63 = 0L;
+ double var_64 = (var_31 ? (Tester_Class_2.var_13 = 'V') : 'e') - (var_29 = 'A') * (var_29 = var_30);
+ var_31 &= (short)+ var_30-- + var_30 <= var_60;
+ while (false && (var_63 < 23 && false))
+ {
+ var_30 >>= func_0(var_30, var_31, var_29) ^ ("".endsWith("mecvlajq" + "jhrbf") ? var_30 : (short)var_61);
+ var_63++;
+ var_28 = (Tester_Class_2)(var_28 = new Tester_Class_2());
+ new Tester_Class_0();
+ }
+ double var_65 = 0;
+ var_61 -= var_65;
+ for (((var_31 &= (var_31 ^= var_31)) | var_31 ? new Tester_Class_2() : new Tester_Class_2()).var_1 = ! (var_31 = false) && !var_31 ? func_10() : new Object[var_32][var_32]; var_31 | var_31 && (var_65 < 107 && (false ? !var_31 : (var_31 &= var_31))); var_30 *= Tester_Class_2.var_14)
+ {
+ var_28 = var_30 > (var_31 | true ? (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k')) : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'r'))) ? (Tester_Class_2)((var_28 = (Tester_Class_0)func_5()).var_1 = func_5()) : new Tester_Class_2();
+ var_65++;
+ var_29 = "efothsl".startsWith("qk") ? 3.2306712E37F : +1.1835607464479516E308;
+ new Tester_Class_2().var_1 = new Tester_Class_0();
+ }
+ double var_66 = 0;
+ func_6(((Tester_Class_2)((true ? (Tester_Class_2)func_10() : (Tester_Class_2)func_9()).var_1 = (var_28 = (Tester_Class_2)func_10()))).var_1 = "");
+ while (false | (new boolean[var_30][var_30])[var_30][var_32] && (var_66 < 104 && false))
+ {
+ ((var_31 ^= !false) ? "" : "slgr").toUpperCase();
+ var_66++;
+ var_28 = func_6(func_9().var_1 = func_10());
+ var_31 |= (var_31 |= true);
+ }
+ Tester_Class_2.var_13 = var_31 ? (Tester_Class_2.var_13 = 'Y') : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = func_4(var_63, 137999726, 1870981930))));
+ int var_67 = 0;
+ final double var_68 = 9.955130040461458E307;
+ do
+ {
+ "".lastIndexOf(var_32 != (Tester_Class_2.var_13 = 'f') ? (Tester_Class_2.var_13 = 'C') : ~var_30, (char)3.187607E38F + (var_30 /= var_30));
+ var_67++;
+ Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'B');
+ } while (var_67 < 9 && var_31 ^ var_31);
+ int var_69 = 0;
+ (true ? func_6(func_10()) : (Tester_Class_2)func_9()).var_1 = ((var_28 = (var_28 = new Tester_Class_2())).var_1 = (func_6(new Tester_Class_2().var_1 = new Tester_Class_0()).var_1 = (Tester_Class_2)func_9()));
+ do
+ {
+ var_28 = (Tester_Class_2)(var_28 = (Tester_Class_0)(new Tester_Class_2().var_1 = "qs"));
+ var_69++;
+ var_31 ^= var_31;
+ } while (var_69 < 189);
+ (! (var_31 = true) | var_31 ? new Tester_Class_2() : (new Tester_Class_0[var_30])[var_30]).var_1 = (((new Tester_Class_2[var_30 ^= (short)var_30])[var_30]).var_1 = (var_31 ? var_31 : (var_31 |= false)) ? "lfhliyphg" : "impovq");
+ ((var_31 ? var_32 == (short)8901596111720974336L : 220705842 != var_60) ? (new Tester_Class_2[var_30])[var_32] : (new Tester_Class_2[var_30][var_32])[var_30][var_30]).var_1 = (var_28 = ((char)var_30 >= "pngjthlf".lastIndexOf("jjbuojp") & var_31 ? var_31 : var_31) ? (new Tester_Class_2[var_32])[var_30] : func_6(new Tester_Class_2().var_1 = new String[var_32]));
+ Tester_Class_2.var_13 = 'c';
+ }
+ public String toString()
+ {
+ String result = "[\n";
+ result += "Tester.var_29 = "; result += Printer.print(var_29);
+ result += "\n";
+ result += "Tester.var_30 = "; result += Printer.print(var_30);
+ result += "\n";
+ result += "Tester.var_32 = "; result += Printer.print(var_32);
+ result += "\n";
+ result += "Tester.var_31 = "; result += Printer.print(var_31);
+ result += "\n";
+ result += "Tester.var_28 = "; result += Printer.print(var_28);
+ result += "";
+ result += "\n]";
+ return result;
+ }
+ static class Printer
+ {
+ public static String print(boolean arg) { return String.valueOf(arg); }
+ public static String print(byte arg) { return String.valueOf(arg); }
+ public static String print(short arg) { return String.valueOf(arg); }
+ public static String print(char arg) { return String.valueOf((int)arg); }
+ public static String print(int arg) { return String.valueOf(arg); }
+ public static String print(long arg) { return String.valueOf(arg); }
+ public static String print(float arg) { return String.valueOf(arg); }
+ public static String print(double arg) { return String.valueOf(arg); }
+
+
+ public static String print(Object arg)
+ {
+ return print_r(new java.util.Stack(), arg);
+ }
+
+ private static String print_r(java.util.Stack visitedObjects, Object arg)
+ {
+ String result = "";
+ if (arg == null)
+ result += "null";
+ else
+ if (arg.getClass().isArray())
+ {
+ for (int i = 0; i < visitedObjects.size(); i++)
+ if (visitedObjects.elementAt(i) == arg) return "<recursive>";
+
+ visitedObjects.push(arg);
+
+ final String delimiter = ", ";
+ result += "[";
+
+ if (arg instanceof Object[])
+ {
+ Object[] array = (Object[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print_r(visitedObjects, array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof boolean[])
+ {
+ boolean[] array = (boolean[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof byte[])
+ {
+ byte[] array = (byte[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof short[])
+ {
+ short[] array = (short[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof char[])
+ {
+ char[] array = (char[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof int[])
+ {
+ int[] array = (int[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof long[])
+ {
+ long[] array = (long[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof float[])
+ {
+ float[] array = (float[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+ else
+ if (arg instanceof double[])
+ {
+ double[] array = (double[]) arg;
+ for (int i = 0; i < array.length; i++)
+ {
+ result += print(array[i]);
+ if (i < array.length - 1) result += delimiter;
+ }
+ }
+
+ result += "]";
+ visitedObjects.pop();
+
+ } else
+ {
+ result += arg.toString();
+ }
+
+ return result;
+ }
+ }
+}
+
+
--- a/jdk/.hgtags Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/.hgtags Wed Jul 05 16:38:48 2017 +0200
@@ -4,3 +4,4 @@
3e599d98875ddf919c8ea11cff9b3a99ba631a9b jdk7-b27
02e4c5348592a8d7fc2cba28bc5f8e35c0e17277 jdk7-b28
e21f4266466cd1306b176aaa08b2cd8337a9be3d jdk7-b29
+b6d6877c1155621a175dccd12dc14c54f938fb8b jdk7-b30
--- a/jdk/make/common/shared/Platform.gmk Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/make/common/shared/Platform.gmk Wed Jul 05 16:38:48 2017 +0200
@@ -72,7 +72,6 @@
# ISA_DIR solaris only: /sparcv9 or /amd64
# LIBARCH32 solaris only: sparc or i386
# LIBARCH64 solaris only: sparcv9 or amd64
-# REQUIRED_WINDOWS_NAME windows only: basic name of windows
# REQUIRED_WINDOWS_VERSION windows only: specific version of windows
# USING_CYGWIN windows only: true or false
# WINDOWS_NT_VERSION_STRING windows only: long version name
@@ -311,19 +310,11 @@
endif
endif
export ARCH_DATA_MODEL
- # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel
- ARCH=i586
- LIBARCH=i386
- # Value of Java os.arch property
- ARCHPROP=x86
- REQUIRED_WINDOWS_NAME=Windows Professional 2000
- REQUIRED_WINDOWS_VERSION=5 0 Service Pack 4
ifeq ($(ARCH_DATA_MODEL), 64)
# If the user wants to perform a cross compile build then they must
# - set ARCH_DATA_MODEL=64 and either
# + set ARCH to ia64 or amd64, or
- REQUIRED_WINDOWS_NAME=Windows Server 2003
- REQUIRED_WINDOWS_VERSION=5 2 Service Pack 1
+ REQUIRED_WINDOWS_VERSION=Server 2003 Enterprise x64 Edition
ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)), AMD64)
ARCH=amd64
else
@@ -332,6 +323,14 @@
LIBARCH=$(ARCH)
# Value of Java os.arch property
ARCHPROP=$(LIBARCH)
+ else
+ REQUIRED_WINDOWS_VERSION=2000 or Unknown
+ #REQUIRED_WINDOWS_VERSION=XP Professional
+ # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel
+ ARCH=i586
+ LIBARCH=i386
+ # Value of Java os.arch property
+ ARCHPROP=x86
endif
ARCH_FAMILY = $(ARCH)
# Where is unwanted output to be delivered?
--- a/jdk/make/common/shared/Sanity.gmk Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/make/common/shared/Sanity.gmk Wed Jul 05 16:38:48 2017 +0200
@@ -82,15 +82,16 @@
endif
ifeq ($(PLATFORM), windows)
- WINVER=$(JDK_TOPDIR)/make/tools/winver/bin/winver.exe
FREE_SPACE := $(shell $(DF) -kP $(OUTPUTDIR) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
TEMP_FREE_SPACE := $(shell $(DF) -kP $(TEMP_DISK) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
- WINDOWS_VERSION := $(shell \
- if [ -x $(WINVER) ]; then \
- $(WINVER) ; \
- else \
- $(ECHO) "Unknown Windows Version"; \
- fi)
+ # Localized systeminfo has localized labels, but not localized values.
+ _WINDOWS_VERSION := \
+ $(shell systeminfo 2> $(DEV_NULL) | grep 'Microsoft' | grep 'Windows' | \
+ cut -d':' -f2)
+ ifeq ($(_WINDOWS_VERSION),)
+ _WINDOWS_VERSION := Windows 2000 or Unknown (no systeminfo utility)
+ endif
+ WINDOWS_VERSION := $(strip $(_WINDOWS_VERSION))
DXSDK_VER := $(shell $(EGREP) DIRECTDRAW_VERSION $(DXSDK_INCLUDE_PATH)/ddraw.h 2>&1 | \
$(EGREP) "\#define" | $(NAWK) '{print $$3}')
endif
@@ -264,9 +265,9 @@
"" >> $(WARNING_FILE) ; \
fi
ifeq ($(PLATFORM), windows)
- @if [ "$(WINDOWS_VERSION)" != "$(REQUIRED_WINDOWS_VERSION)" ]; then \
- $(ECHO) "WARNING: $(YOU_ARE_USING) an unsupported version of $(REQUIRED_WINDOWS_NAME). \n" \
- " The supported version is $(REQUIRED_WINDOWS_NAME) $(REQUIRED_WINDOWS_VERSION). \n" \
+ @if [ "$(findstring $(REQUIRED_WINDOWS_VERSION),$(WINDOWS_VERSION))" = "" ]; then \
+ $(ECHO) "WARNING: $(YOU_ARE_USING) an unknown version of Windows. \n" \
+ " The required version is $(REQUIRED_WINDOWS_VERSION). \n" \
" $(YOU_ARE_USING) $(WINDOWS_VERSION) \n" \
"" >> $(WARNING_FILE) ; \
fi
--- a/jdk/make/tools/Makefile Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/make/tools/Makefile Wed Jul 05 16:38:48 2017 +0200
@@ -51,7 +51,6 @@
jdwpgen \
makeclasslist \
strip_properties \
- winver \
CharsetMapping
all build clean clobber::
--- a/jdk/make/tools/winver/Makefile Thu Jul 03 11:01:30 2008 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#
-# Copyright 1998-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.
-#
-
-#
-# Makefile for building the winver tool
-#
-
-BUILDDIR = ../..
-PRODUCT = tools
-PROGRAM = winver
-include $(BUILDDIR)/common/Defs.gmk
-
-build: permissions
-
-permissions:
-ifeq ($(PLATFORM),windows)
- $(CHMOD) a+x bin/winver.exe
-endif
-
-#
-# Rules.
-#
-include $(BUILDDIR)/common/Rules.gmk
-
-.PHONY: permissions
-
Binary file jdk/make/tools/winver/bin/winver.exe has changed
--- a/jdk/make/tools/winver/src/StdAfx.cpp Thu Jul 03 11:01:30 2008 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
- * 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.
- */
-
-// stdafx.cpp : source file that includes just the standard includes
-// getver.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
-
-// TODO: reference any additional headers you need in STDAFX.H
-// and not in this file
--- a/jdk/make/tools/winver/src/StdAfx.h Thu Jul 03 11:01:30 2008 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
- * 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.
- */
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently, but
-// are changed infrequently
-//
-
-#if !defined(AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_)
-#define AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
-
-#include <stdio.h>
-
-// TODO: reference additional headers your program requires here
-
-//{{AFX_INSERT_LOCATION}}
-// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
-
-#endif // !defined(AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_)
--- a/jdk/make/tools/winver/src/winver.cpp Thu Jul 03 11:01:30 2008 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
- * 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.
- */
-
-// getver.cpp : Defines the entry point for the console application.
-//
-
-#include "stdafx.h"
-#include <windows.h>
-
-int main(int argc, char* argv[])
-{
- OSVERSIONINFO verInfo;
-
- memset(&verInfo,0,sizeof(verInfo));
- verInfo.dwOSVersionInfoSize = sizeof(verInfo);
-
- if (GetVersionEx(&verInfo))
- {
- printf("%d %d %s",verInfo.dwMajorVersion,verInfo.dwMinorVersion,verInfo.szCSDVersion);
- }
- else
- {
- printf("No version info available");
- }
-
- return 0;
-}
--- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java Wed Jul 05 16:38:48 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-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
@@ -1145,6 +1145,10 @@
sharedState.put(NAME, username);
sharedState.put(PWD, password);
}
+ } else {
+ // remove temp results for the next try
+ encKeys = null;
+ principal = null;
}
username = null;
password = null;
--- a/jdk/src/share/classes/java/nio/charset/Charset.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/share/classes/java/nio/charset/Charset.java Wed Jul 05 16:38:48 2017 +0200
@@ -188,21 +188,22 @@
* <ul>
*
* <li><p> When decoding, the <tt>UTF-16BE</tt> and <tt>UTF-16LE</tt>
- * charsets ignore byte-order marks; when encoding, they do not write
+ * charsets interpret the initial byte-order marks as a <small>ZERO-WIDTH
+ * NON-BREAKING SPACE</small>; when encoding, they do not write
* byte-order marks. </p></li>
+
*
- * <li><p> When decoding, the <tt>UTF-16</tt> charset interprets a byte-order
- * mark to indicate the byte order of the stream but defaults to big-endian
- * if there is no byte-order mark; when encoding, it uses big-endian byte
- * order and writes a big-endian byte-order mark. </p></li>
+ * <li><p> When decoding, the <tt>UTF-16</tt> charset interprets the
+ * byte-order mark at the beginning of the input stream to indicate the
+ * byte-order of the stream but defaults to big-endian if there is no
+ * byte-order mark; when encoding, it uses big-endian byte order and writes
+ * a big-endian byte-order mark. </p></li>
*
* </ul>
*
- * In any case, when a byte-order mark is read at the beginning of a decoding
- * operation it is omitted from the resulting sequence of characters. Byte
- * order marks occuring after the first element of an input sequence are not
- * omitted since the same code is used to represent <small>ZERO-WIDTH
- * NON-BREAKING SPACE</small>.
+ * In any case, byte order marks occuring after the first element of an
+ * input sequence are not omitted since the same code is used to represent
+ * <small>ZERO-WIDTH NON-BREAKING SPACE</small>.
*
* <p> Every instance of the Java virtual machine has a default charset, which
* may or may not be one of the standard charsets. The default charset is
--- a/jdk/src/share/classes/sun/nio/ch/Util.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/Util.java Wed Jul 05 16:38:48 2017 +0200
@@ -142,11 +142,10 @@
|| ((sel = selWrapper.get()) == null)
|| (sel.provider() != sc.provider())) {
sel = sc.provider().openSelector();
- localSelector.set(new SoftReference<SelectorWrapper>(
- new SelectorWrapper(sel)));
- } else {
- localSelectorWrapper.set(selWrapper);
+ selWrapper = new SelectorWrapper(sel);
+ localSelector.set(new SoftReference<SelectorWrapper>(selWrapper));
}
+ localSelectorWrapper.set(selWrapper);
return sel;
}
--- a/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java Wed Jul 05 16:38:48 2017 +0200
@@ -59,7 +59,7 @@
private int i;
private NameConstraintsExtension prevNC;
- private static Set<String> supportedExts;
+ private Set<String> supportedExts;
/**
* Creates a ConstraintsChecker.
--- a/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Wed Jul 05 16:38:48 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-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
@@ -198,6 +198,11 @@
X509CertSelector sel = null;
if (currentState.isInitial()) {
+ if (targetCertConstraints.getBasicConstraints() == -2) {
+ // no need to continue: this means we never can match a CA cert
+ return;
+ }
+
/* This means a CA is the target, so match on same stuff as
* getMatchingEECerts
*/
--- a/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java Wed Jul 05 16:38:48 2017 +0200
@@ -50,7 +50,7 @@
private CertSelector targetConstraints;
private int remainingCerts;
- private static Set<String> supportedExts;
+ private Set<String> supportedExts;
/**
* Default Constructor
--- a/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java Wed Jul 05 16:38:48 2017 +0200
@@ -68,7 +68,7 @@
private int inhibitAnyPolicy;
private int certIndex;
- private static Set<String> supportedExts;
+ private Set<String> supportedExts;
private static final Debug debug = Debug.getInstance("certpath");
static final String ANY_POLICY = "2.5.29.32.0";
--- a/jdk/src/windows/native/java/io/io_util_md.c Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/src/windows/native/java/io/io_util_md.c Wed Jul 05 16:38:48 2017 +0200
@@ -104,23 +104,56 @@
}
}
+/*
+ The "abpathlen" is the size of the buffer needed by _wfullpath. If the
+ "path" is a relative path, it is "the length of the current dir" + "the
+ length of the path", if it's "absolute" already, it's the same as
+ pathlen which is the length of "path".
+ */
+WCHAR* prefixAbpath(const WCHAR* path, int pathlen, int abpathlen) {
+ WCHAR* pathbuf = NULL;
+ WCHAR* abpath = NULL;
+
+ abpathlen += 10; //padding
+ abpath = (WCHAR*)malloc(abpathlen * sizeof(WCHAR));
+ if (abpath) {
+ /* Collapse instances of "foo\.." and ensure absoluteness before
+ going down to prefixing.
+ */
+ if (_wfullpath(abpath, path, abpathlen)) {
+ pathbuf = getPrefixed(abpath, abpathlen);
+ } else {
+ /* _wfullpath fails if the pathlength exceeds 32k wchar.
+ Instead of doing more fancy things we simply copy the
+ ps into the return buffer, the subsequent win32 API will
+ probably fail with FileNotFoundException, which is expected
+ */
+ pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
+ if (pathbuf != 0) {
+ wcscpy(pathbuf, path);
+ }
+ }
+ free(abpath);
+ }
+ return pathbuf;
+}
+
/* If this returns NULL then an exception is pending */
WCHAR*
pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE) {
int pathlen = 0;
WCHAR *pathbuf = NULL;
- int max_path = 248; /* Since CreateDirectoryW() has the limit of
- 248 instead of the normal MAX_PATH, we
- use 248 as the max_path to satisfy both
- */
+ int max_path = 248; /* CreateDirectoryW() has the limit of 248 */
+
WITH_UNICODE_STRING(env, path, ps) {
pathlen = wcslen(ps);
if (pathlen != 0) {
if (pathlen > 2 &&
(ps[0] == L'\\' && ps[1] == L'\\' || //UNC
- ps[1] == L':' && ps[2] == L'\\')) { //absolute
+ ps[1] == L':' && ps[2] == L'\\')) //absolute
+ {
if (pathlen > max_path - 1) {
- pathbuf = getPrefixed(ps, pathlen);
+ pathbuf = prefixAbpath(ps, pathlen, pathlen);
} else {
pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
if (pathbuf != 0) {
@@ -132,7 +165,7 @@
its absolute form is bigger than max_path or not, if yes
need to (1)convert it to absolute and (2)prefix. This is
obviously a burden to all relative paths (The current dir/len
- for "dirve & directory" relative path is cached, so we only
+ for "drive & directory" relative path is cached, so we only
calculate it once but for "drive-relative path we call
_wgetdcwd() and wcslen() everytime), but a hit we have
to take if we want to support relative path beyond max_path.
@@ -143,24 +176,7 @@
WCHAR *abpath = NULL;
int dirlen = currentDirLength(ps, pathlen);
if (dirlen + pathlen + 1 > max_path - 1) {
- int abpathlen = dirlen + pathlen + 10;
- abpath = (WCHAR*)malloc(abpathlen * sizeof(WCHAR));
- if (abpath) {
- if (_wfullpath(abpath, ps, abpathlen)) {
- pathbuf = getPrefixed(abpath, abpathlen);
- } else {
- /* _wfullpath fails if the pathlength exceeds 32k wchar.
- Instead of doing more fancy things we simply copy the
- ps into the return buffer, the subsequent win32 API will
- probably fail with FileNotFoundException, which is expected
- */
- pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
- if (pathbuf != 0) {
- wcscpy(pathbuf, ps);
- }
- }
- free(abpath);
- }
+ pathbuf = prefixAbpath(ps, pathlen, dirlen + pathlen);
} else {
pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
if (pathbuf != 0) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/io/File/MaxPath.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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 6481955
+ @summary Path length less than MAX_PATH (260) works on Windows
+ */
+
+import java.io.*;
+
+public class MaxPath {
+ public static void main(String[] args) throws Exception {
+ String osName = System.getProperty("os.name");
+ if (!osName.startsWith("Windows")) {
+ return;
+ }
+ int MAX_PATH = 260;
+ String dir = new File(".").getAbsolutePath() + "\\";
+ String padding = "1234567890123456789012345678901234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890";
+ for (int i = 240 - dir.length(); i < MAX_PATH - dir.length(); i++) {
+ String longname = dir + padding.substring(0, i);
+ try {
+ File f = new File(longname);
+ if (f.createNewFile()) {
+ if (!f.exists() || !f.canRead()) {
+ throw new RuntimeException("Failed at length: " + longname.length());
+ }
+ f.delete();
+ }
+ } catch (IOException e) {
+ System.out.println("Failed at length: " + longname.length());
+ throw e;
+ }
+ }
+ }
+}
--- a/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java Thu Jul 03 11:01:30 2008 -0700
+++ b/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -22,7 +22,7 @@
*/
/* @test
- @bug 5105464 6269047
+ @bug 5105464 6269047 6541631
* @summary Test to transfer bytes with a size bigger than Integer.MAX_VALUE
*/
@@ -81,8 +81,10 @@
System.out.println("LongTransferTest-main: OK!");
socket.close();
+ server.close();
- server.close();
+ inChannel.close();
+ outChannel.close();
inFile.delete();
outFile.delete();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,79 @@
+/*
+ * 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 6714842
+ * @library ../../../testlibrary
+ * @build CertUtils
+ * @run main BuildEEBasicConstraints
+ * @summary make sure a PKIX CertPathBuilder builds a path to an
+ * end entity certificate when the setBasicConstraints method of the
+ * X509CertSelector of the targetConstraints PKIXBuilderParameters
+ * parameter is set to -2.
+ */
+
+import java.security.cert.Certificate;
+import java.security.cert.CertPath;
+import java.security.cert.CertStore;
+import java.security.cert.CollectionCertStoreParameters;
+import java.security.cert.PKIXBuilderParameters;
+import java.security.cert.PKIXCertPathBuilderResult;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.security.cert.X509CertSelector;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class BuildEEBasicConstraints {
+
+ public static void main(String[] args) throws Exception {
+
+ X509Certificate rootCert = CertUtils.getCertFromFile("anchor.cer");
+ TrustAnchor anchor = new TrustAnchor
+ (rootCert.getSubjectX500Principal(), rootCert.getPublicKey(), null);
+ X509CertSelector sel = new X509CertSelector();
+ sel.setBasicConstraints(-2);
+ PKIXBuilderParameters params = new PKIXBuilderParameters
+ (Collections.singleton(anchor), sel);
+ params.setRevocationEnabled(false);
+ X509Certificate eeCert = CertUtils.getCertFromFile("ee.cer");
+ X509Certificate caCert = CertUtils.getCertFromFile("ca.cer");
+ ArrayList<X509Certificate> certs = new ArrayList<X509Certificate>();
+ certs.add(caCert);
+ certs.add(eeCert);
+ CollectionCertStoreParameters ccsp =
+ new CollectionCertStoreParameters(certs);
+ CertStore cs = CertStore.getInstance("Collection", ccsp);
+ params.addCertStore(cs);
+ PKIXCertPathBuilderResult res = CertUtils.build(params);
+ CertPath cp = res.getCertPath();
+ // check that first certificate is an EE cert
+ List<? extends Certificate> certList = cp.getCertificates();
+ X509Certificate cert = (X509Certificate) certList.get(0);
+ if (cert.getBasicConstraints() != -1) {
+ throw new Exception("Target certificate is not an EE certificate");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/anchor.cer Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8 @@
+-----BEGIN CERTIFICATE-----
+MIIBFzCBwgIBATANBgkqhkiG9w0BAQQFADAXMRUwEwYDVQQDEwxUcnVzdCBBbmNo
+b3IwHhcNMDIxMTA3MTE1NzAzWhcNMjIxMTA3MTE1NzAzWjAXMRUwEwYDVQQDEwxU
+cnVzdCBBbmNob3IwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA9uCj12hwDgC1n9go
+0ozQAVMM+DfX0vpKOemyGNp+ycSLfAq3pxBcUKbQhjSRL7YjPkEL8XC6pRLwyEoF
+osWweQIDAQABMA0GCSqGSIb3DQEBBAUAA0EAzZta5M1qbbozj7jWnNyTgB4HUpzv
+4eP0VYQb1pQY1/xEMczaRt+RuoIDnHCq5a1vOiwk6ZbdG6GlJKx9lj0oMQ==
+-----END CERTIFICATE-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ca.cer Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,9 @@
+-----BEGIN CERTIFICATE-----
+MIIBSjCB9aADAgECAgECMA0GCSqGSIb3DQEBBAUAMBcxFTATBgNVBAMTDFRydXN0
+IEFuY2hvcjAeFw0wMjExMDcxMTU3MDNaFw0yMjExMDcxMTU3MDNaMA0xCzAJBgNV
+BAMTAkNBMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ8mP3x37PablDfwldGL5G0+
+l9NgMJSdxVNWBg+ySzQNsZklEFCxGfxPQW+EFYfafHbTbmnni2gsgU1mgPBTQDsC
+AwEAAaM2MDQwCwYDVR0PBAQDAgIEMBcGA1UdIAQQMA4wBgYEVR0gADAEBgIqADAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EA9oCyzh0UKmNsKb+KpppbKYs8
+iA8sDm9oDCwyVSXBM46zrP38nRcx3EdKFvGTwbb/Np+lcZALUsKVYQy3rlU+cQ==
+-----END CERTIFICATE-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ee.cer Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,9 @@
+-----BEGIN CERTIFICATE-----
+MIIBLTCB2KADAgECAgEDMA0GCSqGSIb3DQEBBAUAMA0xCzAJBgNVBAMTAkNBMB4X
+DTAyMTEwNzExNTcwM1oXDTIyMTEwNzExNTcwM1owFTETMBEGA1UEAxMKRW5kIEVu
+dGl0eTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDVBDfF+uBr5s5jzzDs1njKlZNt
+h8hHzEt3ASh67Peos+QrDzgpUyFXT6fdW2h7iPf0ifjM8eW2xa+3EnPjjU5jAgMB
+AAGjGzAZMBcGA1UdIAQQMA4wBgYEVR0gADAEBgIqADANBgkqhkiG9w0BAQQFAANB
+AFo//WOboCNOCcA1fvcWW9oc4MvV8ZPvFIAbyEbgyFd4id5lGDTRbRPvvNZRvdsN
+NM2gXYr+f87NHIXc9EF3pzw=
+-----END CERTIFICATE-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/BufferUnderflowEUCTWTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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 4834154
+ @summary Decode a file using EUC-TW, test for decode errors
+ */
+
+/*
+ * Tests for decode errors in NIO EUC-TW decoder. 4734607 details
+ * decoding errors which occur when the input file > 8k in size
+ * and contains numerous US-ASCII range chars
+ */
+
+import java.io.*;
+
+public class BufferUnderflowEUCTWTest {
+ private static int BUFFERSIZE = 8194;
+
+ public static void main (String[] args) throws Exception {
+ int i = 0;
+ byte[] b = new byte[BUFFERSIZE];
+
+ for (; i < BUFFERSIZE - 4; i++) // pad with zeroes
+ b[i] = 0;
+
+ // Overspill a valid EUC-TW 4 byte sequence between 2
+ // successive input buffers.
+ b[i++] = (byte)0x8E;
+ b[i++] = (byte)0xA2;
+ b[i++] = (byte)0xA1;
+ b[i++] = (byte)0xA6;
+
+ ByteArrayInputStream r = new ByteArrayInputStream(b);
+
+ try {
+ InputStreamReader isr=new InputStreamReader(r, "EUC-TW");
+ char[] cc = new char[BUFFERSIZE];
+ int cx = isr.read(cc);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ throw new Exception("Array Index error: bug 4834154");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/CheckCaseInsensitiveEncAliases.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,99 @@
+/*
+ * 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 4216191 4721369 4807283
+ @summary Test to validate case insensitivity of encoding alias names
+ */
+
+// Fixed since 1.4.0 by virtue of NIO charset lookup mechanism
+// which is by design case insensitive
+
+import java.lang.*;
+import java.io.*;
+
+public class CheckCaseInsensitiveEncAliases
+{
+ public static void main(String args[]) throws Exception
+ {
+ // Try various encoding names in mixed cases
+ // Tests subset of encoding names provided within bugID 4216191
+
+ // Various forms of US-ASCII
+ tryToEncode( "ANSI_X3.4-1968" );
+ tryToEncode( "iso-ir-6" );
+ tryToEncode( "ANSI_X3.4-1986" );
+ tryToEncode( "ISO_646.irv:1991" );
+ tryToEncode( "ASCII" );
+ tryToEncode( "ascii" );
+ tryToEncode( "Ascii" );
+ tryToEncode( "Ascii7" );
+ tryToEncode( "ascii7" );
+ tryToEncode( "ISO646-US" );
+ tryToEncode( "US-ASCII" );
+ tryToEncode( "us-ascii" );
+ tryToEncode( "US-Ascii" );
+ tryToEncode( "us" );
+ tryToEncode( "IBM367" );
+ tryToEncode( "cp367" );
+ tryToEncode( "csASCII" );
+
+ // Variants on Unicode
+ tryToEncode( "Unicode" );
+ tryToEncode( "UNICODE" );
+ tryToEncode( "unicode" );
+
+ // Variants on Big5
+ tryToEncode( "Big5" );
+ tryToEncode( "big5" );
+ tryToEncode( "bIg5" );
+ tryToEncode( "biG5" );
+ tryToEncode( "bIG5" );
+
+ // Variants of Cp1252
+ tryToEncode( "Cp1252" );
+ tryToEncode( "cp1252" );
+ tryToEncode( "CP1252" );
+
+ // Variants of PCK
+ tryToEncode( "pck" );
+ tryToEncode( "Pck" );
+
+ }
+
+
+ public static final String ENCODE_STRING = "Encode me";
+
+ public static void tryToEncode( String encoding) throws Exception
+ {
+ try
+ {
+ byte[] bytes = ENCODE_STRING.getBytes( encoding );
+ System.out.println( "Encoding \"" + encoding + "\" recognized" );
+ }
+ catch( UnsupportedEncodingException e )
+ {
+ throw new Exception("Encoding \"" + encoding + "\" NOT recognized");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/CheckHistoricalNames.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,313 @@
+/*
+ * 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 4513767 4961027
+ @summary Checks canonical names match between old and (NIO) core charsets
+ */
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+public class CheckHistoricalNames {
+ static int failed = 0;
+ public static void main (String[] args) throws Exception {
+ checkHistoricalName("ASCII");
+ checkHistoricalName("Cp1252");
+ checkHistoricalName("ISO8859_1");
+ checkHistoricalName("UnicodeBigUnmarked");
+ checkHistoricalName("UnicodeLittle");
+ checkHistoricalName("UnicodeLittleUnmarked");
+ checkHistoricalName("UTF8");
+ checkHistoricalName("UTF-16");
+
+ checkMappedName("UnicodeBig", "UTF-16");
+ checkMappedName("US-ASCII", "ASCII");
+ checkMappedName("ISO-8859-1", "ISO8859_1");
+ checkMappedName("UTF-8", "UTF8");
+ checkMappedName("UTF-16BE", "UnicodeBigUnmarked");
+ checkMappedName("UTF-16LE", "UnicodeLittleUnmarked");
+
+ checkHistoricalName("ISO8859_2");
+ checkHistoricalName("ISO8859_4");
+ checkHistoricalName("ISO8859_5");
+ checkHistoricalName("ISO8859_7");
+ checkHistoricalName("ISO8859_9");
+ checkHistoricalName("ISO8859_13");
+ checkHistoricalName("KOI8_R");
+ checkHistoricalName("Cp1250");
+ checkHistoricalName("Cp1251");
+ checkHistoricalName("Cp1253");
+ checkHistoricalName("Cp1254");
+ checkHistoricalName("Cp1257");
+
+ checkMappedName("ISO-8859-2", "ISO8859_2");
+ checkMappedName("ISO-8859-4", "ISO8859_4");
+ checkMappedName("ISO-8859-5", "ISO8859_5");
+ checkMappedName("ISO-8859-7", "ISO8859_7");
+ checkMappedName("ISO-8859-9", "ISO8859_9");
+ checkMappedName("ISO-8859-13", "ISO8859_13");
+ checkMappedName("KOI8-R", "KOI8_R");
+ checkMappedName("windows-1250", "Cp1250");
+ checkMappedName("windows-1251","Cp1251");
+ checkMappedName("windows-1253", "Cp1253");
+ checkMappedName("windows-1254", "Cp1254");
+ checkMappedName("windows-1257", "Cp1257");
+
+ checkHistoricalName("EUC_CN");
+ checkHistoricalName("EUC_JP");
+ checkHistoricalName("EUC_JP_LINUX");
+ checkHistoricalName("EUC_KR");
+ checkHistoricalName("EUC_TW");
+ checkHistoricalName("ISO2022CN");
+ checkHistoricalName("ISO2022JP");
+ checkHistoricalName("ISO2022KR");
+ checkHistoricalName("ISO8859_3");
+ checkHistoricalName("ISO8859_6");
+ checkHistoricalName("ISO8859_8");
+ checkHistoricalName("Cp1255");
+ checkHistoricalName("Cp1256");
+ checkHistoricalName("Cp1258");
+ checkHistoricalName("MS936");
+ checkHistoricalName("MS949");
+ checkHistoricalName("MS950");
+ checkHistoricalName("TIS620");
+
+ checkMappedName("EUC-CN", "EUC_CN");
+ checkMappedName("EUC-JP", "EUC_JP");
+ checkMappedName("EUC-JP-LINUX", "EUC_JP_LINUX");
+ checkMappedName("EUC-TW", "EUC_TW");
+ checkMappedName("EUC-KR", "EUC_KR");
+ checkMappedName("ISO-2022-CN", "ISO2022CN");
+ checkMappedName("ISO-2022-JP", "ISO2022JP");
+ checkMappedName("ISO-2022-KR", "ISO2022KR");
+ checkMappedName("ISO-8859-3", "ISO8859_3");
+ checkMappedName("ISO-8859-6", "ISO8859_6");
+ checkMappedName("ISO-8859-8", "ISO8859_8");
+ checkMappedName("windows-1255", "Cp1255");
+ checkMappedName("windows-1256", "Cp1256");
+ checkMappedName("windows-1258", "Cp1258");
+ checkMappedName("windows-936", "GBK");
+ checkMappedName("windows-949", "MS949");
+ checkMappedName("windows-950", "MS950");
+ checkMappedName("x-MS950-HKSCS", "MS950_HKSCS");
+ checkMappedName("x-PCK", "PCK");
+ checkMappedName("Shift_JIS", "SJIS");
+ checkMappedName("x-JISAutoDetect", "JISAutoDetect");
+ checkMappedName("TIS-620", "TIS620");
+ checkMappedName("x-Big5-Solaris", "Big5_Solaris");
+
+ checkHistoricalName("Cp037");
+ checkHistoricalName("Cp1006");
+ checkHistoricalName("Cp1025");
+ checkHistoricalName("Cp1026");
+ checkHistoricalName("Cp1046");
+ checkHistoricalName("Cp1047");
+ checkHistoricalName("Cp1097");
+ checkHistoricalName("Cp1098");
+ checkHistoricalName("Cp1112");
+ checkHistoricalName("Cp1122");
+ checkHistoricalName("Cp1123");
+ checkHistoricalName("Cp1124");
+ checkHistoricalName("Cp1140");
+ checkHistoricalName("Cp1141");
+ checkHistoricalName("Cp1142");
+ checkHistoricalName("Cp1143");
+ checkHistoricalName("Cp1144");
+ checkHistoricalName("Cp1145");
+ checkHistoricalName("Cp1146");
+ checkHistoricalName("Cp1147");
+ checkHistoricalName("Cp1148");
+ checkHistoricalName("Cp1149");
+ checkHistoricalName("Cp1381");
+ checkHistoricalName("Cp1383");
+ checkHistoricalName("Cp273");
+ checkHistoricalName("Cp277");
+ checkHistoricalName("Cp278");
+ checkHistoricalName("Cp280");
+ checkHistoricalName("Cp284");
+ checkHistoricalName("Cp285");
+ checkHistoricalName("Cp297");
+ checkHistoricalName("Cp33722");
+ checkHistoricalName("Cp420");
+ checkHistoricalName("Cp424");
+ checkHistoricalName("Cp437");
+ checkHistoricalName("Cp500");
+ checkHistoricalName("Cp737");
+ checkHistoricalName("Cp775");
+ checkHistoricalName("Cp838");
+ checkHistoricalName("Cp850");
+ checkHistoricalName("Cp852");
+ checkHistoricalName("Cp855");
+ checkHistoricalName("Cp856");
+ checkHistoricalName("Cp857");
+ checkHistoricalName("Cp858");
+ checkHistoricalName("Cp860");
+ checkHistoricalName("Cp861");
+ checkHistoricalName("Cp862");
+ checkHistoricalName("Cp863");
+ checkHistoricalName("Cp864");
+ checkHistoricalName("Cp865");
+ checkHistoricalName("Cp866");
+ checkHistoricalName("Cp868");
+ checkHistoricalName("Cp869");
+ checkHistoricalName("Cp870");
+ checkHistoricalName("Cp871");
+ checkHistoricalName("Cp874");
+ checkHistoricalName("Cp875");
+ checkHistoricalName("Cp918");
+ checkHistoricalName("Cp921");
+ checkHistoricalName("Cp922");
+ checkHistoricalName("Cp933");
+ checkHistoricalName("Cp939");
+ checkHistoricalName("Cp949");
+ checkHistoricalName("Cp964");
+ checkHistoricalName("Cp970");
+
+ checkMappedName("IBM037", "Cp037");
+ checkMappedName("IBM1006", "Cp1006");
+ checkMappedName("IBM1025", "Cp1025");
+ checkMappedName("IBM1026", "Cp1026");
+ checkMappedName("x-IBM1046", "Cp1046");
+ checkMappedName("IBM1047", "Cp1047");
+ checkMappedName("IBM1097", "Cp1097");
+ checkMappedName("IBM1098", "Cp1098");
+ checkMappedName("IBM1112", "Cp1112");
+ checkMappedName("IBM1122", "Cp1122");
+ checkMappedName("IBM1123", "Cp1123");
+ checkMappedName("IBM1124", "Cp1124");
+ checkMappedName("IBM01140", "Cp1140");
+ checkMappedName("IBM01141", "Cp1141");
+ checkMappedName("IBM01142", "Cp1142");
+ checkMappedName("IBM01143", "Cp1143");
+ checkMappedName("IBM01144", "Cp1144");
+ checkMappedName("IBM01145", "Cp1145");
+ checkMappedName("IBM01146", "Cp1146");
+ checkMappedName("IBM01147", "Cp1147");
+ checkMappedName("IBM01148", "Cp1148");
+ checkMappedName("IBM01149", "Cp1149");
+ checkMappedName("IBM1381", "Cp1381");
+ checkMappedName("IBM1383", "Cp1383");
+ checkMappedName("IBM273", "Cp273");
+ checkMappedName("IBM277", "Cp277");
+ checkMappedName("IBM278", "Cp278");
+ checkMappedName("IBM280", "Cp280");
+ checkMappedName("IBM284", "Cp284");
+ checkMappedName("IBM285", "Cp285");
+ checkMappedName("IBM297", "Cp297");
+ checkMappedName("IBM33722", "Cp33722");
+ checkMappedName("IBM420", "Cp420");
+ checkMappedName("IBM424", "Cp424");
+ checkMappedName("IBM437", "Cp437");
+ checkMappedName("IBM500", "Cp500");
+ checkMappedName("IBM737", "Cp737");
+ checkMappedName("IBM775", "Cp775");
+ checkMappedName("IBM838", "Cp838");
+ checkMappedName("IBM850", "Cp850");
+ checkMappedName("IBM852", "Cp852");
+ checkMappedName("IBM855", "Cp855");
+ checkMappedName("IBM856", "Cp856");
+ checkMappedName("IBM857", "Cp857");
+ checkMappedName("IBM00858", "Cp858");
+ checkMappedName("IBM860", "Cp860");
+ checkMappedName("IBM861", "Cp861");
+ checkMappedName("IBM862", "Cp862");
+ checkMappedName("IBM863", "Cp863");
+ checkMappedName("IBM864", "Cp864");
+ checkMappedName("IBM865", "Cp865");
+ checkMappedName("IBM866", "Cp866");
+ checkMappedName("IBM868", "Cp868");
+ checkMappedName("IBM869", "Cp869");
+ checkMappedName("IBM870", "Cp870");
+ checkMappedName("IBM871", "Cp871");
+ checkMappedName("IBM874", "Cp874");
+ checkMappedName("IBM875", "Cp875");
+ checkMappedName("IBM918", "Cp918");
+ checkMappedName("IBM921", "Cp921");
+ checkMappedName("IBM922", "Cp922");
+ checkMappedName("x-IBM930", "Cp930");
+ checkMappedName("IBM933", "Cp933");
+ checkMappedName("x-IBM935", "Cp935");
+ checkMappedName("x-IBM937", "Cp937");
+ checkMappedName("IBM939", "Cp939");
+ checkMappedName("x-IBM942", "Cp942");
+ checkMappedName("x-IBM942C", "Cp942C");
+ checkMappedName("x-IBM943", "Cp943");
+ checkMappedName("x-IBM943C", "Cp943C");
+ checkMappedName("x-IBM948", "Cp948");
+ checkMappedName("IBM949", "Cp949");
+ checkMappedName("x-IBM949C", "Cp949C");
+ checkMappedName("x-IBM950", "Cp950");
+ checkMappedName("IBM964", "Cp964");
+ checkMappedName("IBM970", "Cp970");
+
+ checkHistoricalName("MacArabic");
+ checkHistoricalName("MacCentralEurope");
+ checkHistoricalName("MacCroatian");
+ checkHistoricalName("MacCyrillic");
+ checkHistoricalName("MacDingbat");
+ checkHistoricalName("MacGreek");
+ checkHistoricalName("MacHebrew");
+ checkHistoricalName("MacIceland");
+ checkHistoricalName("MacRoman");
+ checkHistoricalName("MacRomania");
+ checkHistoricalName("MacSymbol");
+ checkHistoricalName("MacThai");
+ checkHistoricalName("MacTurkish");
+ checkHistoricalName("MacUkraine");
+
+ checkMappedName("x-MacArabic", "MacArabic");
+ checkMappedName("x-MacCentralEurope", "MacCentralEurope");
+ checkMappedName("x-MacCroatian", "MacCroatian");
+ checkMappedName("x-MacCyrillic", "MacCyrillic");
+ checkMappedName("x-MacDingbat", "MacDingbat");
+ checkMappedName("x-MacGreek", "MacGreek");
+ checkMappedName("x-MacHebrew", "MacHebrew");
+ checkMappedName("x-MacIceland", "MacIceland");
+ checkMappedName("x-MacRoman", "MacRoman");
+ checkMappedName("x-MacRomania", "MacRomania");
+ checkMappedName("x-MacSymbol", "MacSymbol");
+ checkMappedName("x-MacThai", "MacThai");
+ checkMappedName("x-MacTurkish", "MacTurkish");
+ checkMappedName("x-MacUkraine", "MacUkraine");
+
+ if (failed != 0)
+ throw new Exception("Test Failed: " + failed);
+ else
+ System.out.println("Test Passed!");
+ }
+
+ private static void checkHistoricalName(String name) throws Exception {
+ checkMappedName(name, name);
+ }
+
+ private static void checkMappedName(String alias, String canonical)
+ throws Exception {
+ InputStreamReader reader = new InputStreamReader(System.in, alias);
+ if (!reader.getEncoding().equals(canonical)) {
+ System.out.println("Failed canonical names : mismatch for " + alias
+ + " - expected " + canonical
+ + ", got " + reader.getEncoding());
+ failed++;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ConvertSingle.java Wed Jul 05 16:38:48 2017 +0200
@@ -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 4094987
+ @summary Verify that malformed expression exceptions are thrown
+ but no internal errors in certain pathologial cases.
+
+ */
+
+
+import java.io.*;
+import java.nio.charset.*;
+
+public class ConvertSingle {
+
+ public static void main(String args[]) throws Exception {
+ // This conversion is pathologically bad - it is attempting to
+ // read unicode from an ascii encoded string.
+ // The orignal bug: A internal error in ISR results if the
+ // byte counter in ByteToCharUnicode
+ // is not advanced as the input is consumed.
+
+ try{
+ String s = "\n";
+ byte ss[] = null;
+ String sstring = "x";
+ ss = s.getBytes();
+ ByteArrayInputStream BAIS = new ByteArrayInputStream(ss);
+ InputStreamReader ISR = new InputStreamReader(BAIS, "Unicode");
+ BufferedReader BR = new BufferedReader(ISR);
+ sstring = BR.readLine();
+ BR.close();
+ System.out.println(sstring);
+ } catch (MalformedInputException e){
+ // Right error
+ return;
+ } catch (java.lang.InternalError e) {
+ throw new Exception("ByteToCharUnicode is failing incorrectly for "
+ + " single byte input");
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Decode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+
+/**/
+
+public class Decode {
+ private static boolean isAscii(char c) {
+ return c < '\u0080';
+ }
+
+ private static boolean isPrintable(char c) {
+ return ('\u0020' < c) && (c < '\u007f');
+ }
+
+ public static void main(String[] args) throws Throwable {
+ if (args.length < 2)
+ throw new Exception("Usage: java Decode CHARSET BYTE [BYTE ...]");
+ String cs = args[0];
+ byte[] bytes = new byte[args.length-1];
+ for (int i = 1; i < args.length; i++) {
+ String arg = args[i];
+ bytes[i-1] =
+ (arg.length() == 1 && isAscii(arg.charAt(0))) ?
+ (byte) arg.charAt(0) :
+ arg.equals("ESC") ? 0x1b :
+ arg.equals("SO") ? 0x0e :
+ arg.equals("SI") ? 0x0f :
+ arg.equals("SS2") ? (byte) 0x8e :
+ arg.equals("SS3") ? (byte) 0x8f :
+ arg.matches("0x.*") ? Integer.decode(arg).byteValue() :
+ Integer.decode("0x"+arg).byteValue();
+ }
+ String s = new String(bytes, cs);
+
+ for (int j = 0; j < s.length(); j++) {
+ if (j > 0)
+ System.out.print(' ');
+ char c = s.charAt(j);
+ if (isPrintable(c))
+ System.out.print(c);
+ else if (c == '\u001b') System.out.print("ESC");
+ else
+ System.out.printf("\\u%04x", (int) c);
+ }
+ System.out.print("\n");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/DecoderOverflow.java Wed Jul 05 16:38:48 2017 +0200
@@ -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 5101128
+ @summary Check behavior of CharsetDecoder.decode when overflow occurs
+ @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class DecoderOverflow {
+ static int failures = 0;
+
+ public static void main(String[] args) throws Exception {
+ for (String csn : Charset.availableCharsets().keySet()) {
+ try {
+ test(csn);
+ } catch (Throwable t) {
+ System.out.println(csn);
+ t.printStackTrace();
+ failures++;
+ }
+ }
+ if (failures > 0)
+ throw new Exception(failures + " charsets failed");
+ }
+
+ static void test(String encoding) throws Exception {
+ String text = "Vote for Duke!";
+ Charset cs = Charset.forName(encoding);
+ if (! cs.canEncode() || ! cs.newEncoder().canEncode('.')) return;
+ ByteBuffer in = ByteBuffer.wrap(text.getBytes(encoding));
+ CharBuffer out = CharBuffer.allocate(text.length()/2);
+ CoderResult result = cs.newDecoder().decode(in, out, true);
+ if (out.hasRemaining() || ! result.isOverflow())
+ throw new Exception
+ ("out.hasRemaining()=" + out.hasRemaining() +
+ " result.isOverflow()=" + result.isOverflow() +
+ " in.capacity()=" + in.capacity() +
+ " encoding=" + encoding);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EUCJPUnderflowDecodeTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,104 @@
+/*
+ * 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 4867457
+ @summary Check for correct byte buffer underflow handling in EUC-JP
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class EUCJPUnderflowDecodeTest {
+ public static void main(String[] args) throws Exception{
+
+ ByteBuffer bb = ByteBuffer.allocateDirect(255);
+ CharBuffer cc = CharBuffer.allocate(255);
+
+
+ // Test both regular EUC-JP and Linux variant
+
+ String[] charsetNames = { "EUC_JP", "EUC-JP-LINUX" };
+
+ for (int i = 0 ; i < charsetNames.length; i++) {
+ Charset cs = Charset.forName(charsetNames[i]);
+ CharsetDecoder decoder = cs.newDecoder();
+ bb.clear();
+ cc.clear();
+
+ // Fakes a partial 3 byte EUC_JP (JIS-X-0212 range)
+ // encoded character/byte sequence
+ bb.put((byte)0x8f);
+ bb.put((byte)0xa2);
+ bb.flip();
+ // Now decode with endOfInput method param set to
+ // indicate to decoder that there is more encoded
+ // data to follow in a subsequent invocation
+
+ CoderResult result = decoder.decode(bb, cc, false);
+
+ // java.nio.charset.CharsetDecoder spec specifies
+ // that the coder ought to return CoderResult.UNDERFLOW
+ // when insufficient bytes have been supplied to complete
+ // the decoding operation
+
+ if (result != CoderResult.UNDERFLOW) {
+ throw new Exception("test failed - UNDERFLOW not returned");
+ }
+
+ // Repeat the test with the lead byte (minus its pursuing
+ // trail byte) for the EUC-JP 2 byte (JIS208) range
+ decoder.reset();
+ bb.clear();
+ cc.clear();
+ bb.put((byte)0xa1);
+ bb.flip();
+ result = decoder.decode(bb, cc, false);
+ if (result != CoderResult.UNDERFLOW) {
+ throw new Exception("test failed");
+ }
+
+ // finally ensure that a valid JIS208 range EUC-JP
+ // 2 byte value is correctly decoded when it is presented
+ // at the trailing bounds of a ByteBuffer in the case where
+ // charset decoder expects (endOfInput ==false) more
+ //input to follow
+
+ decoder.reset();
+ bb.clear();
+ cc.clear();
+ bb.put((byte)0xa1);
+ bb.put((byte)0xc0);
+ bb.flip();
+
+ result = decoder.decode(bb, cc, false);
+
+ cc.flip();
+
+ if (result != CoderResult.UNDERFLOW && cc.get() != '\uFF3c') {
+ throw new Exception("test failed to decode EUC-JP (0xA1C0)");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EucJpLinux0212.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,79 @@
+/*
+ * 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 6350021
+ * @summary Consistency checks when input buffer contains JISX0212 characters
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class EucJpLinux0212 {
+ private static void equal(CharBuffer b1, CharBuffer b2) {
+ equal(b1.position(), b2.position());
+ equal(b1.limit(), b2.limit());
+ System.out.printf("positions=%d %d%n", b1.position(), b2.position());
+ System.out.printf("limits=%d %d%n", b1.limit(), b2.limit());
+ for (int i = b1.position(); i < b1.limit(); i++)
+ equal((int)b1.get(i), (int)b2.get(i));
+ }
+
+ private static void realMain(String[] args) throws Throwable {
+ List<ByteBuffer> bbs = Arrays.asList(
+ ByteBuffer.allocate(10),
+ ByteBuffer.allocateDirect(10));
+ List<CharBuffer> cbs = new ArrayList<CharBuffer>();
+
+ for (ByteBuffer bb : bbs) {
+ bb.put(new byte[]{ (byte)0x8f, 0x01, 0x02,
+ (byte)0xa1, (byte)0xc0,
+ 0x02, 0x03});
+ bb.flip();
+ CharsetDecoder decoder = Charset.forName("EUC_JP_LINUX").newDecoder();
+ decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
+ CharBuffer cb = decoder.decode(bb);
+ cbs.add(cb);
+ }
+ equal(cbs.get(0), cbs.get(1));
+ }
+
+ //--------------------- 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 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");}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EucJpLinuxDecoderRecoveryTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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 5016049
+ @summary ensure euc-jp-linux charset decoder recovery for unmappable input
+ */
+
+import java.io.*;
+
+public class EucJpLinuxDecoderRecoveryTest {
+ public static void main(String[] args) throws Exception {
+ byte[] encoded = {
+ // EUC_JP_LINUX mappable JIS X 0208 range
+ (byte)0xa6, (byte)0xc5,
+ // EUC_JP_LINUX Unmappable (JIS X 0212 range)
+ (byte)0x8f, (byte)0xa2, (byte)0xb7,
+ // EUC_JP_LINUX mappable JIS X 0208 range
+ (byte)0xa6, (byte)0xc7 };
+
+ char[] decodedChars = new char[3];
+ char[] expectedChars =
+ {
+ '\u03B5', // mapped
+ '\ufffd', // unmapped
+ '\u03B7' // mapped
+ };
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(encoded);
+ InputStreamReader isr = new InputStreamReader(bais, "EUC_JP_LINUX");
+ int n = 0; // number of chars decoded
+
+ try {
+ n = isr.read(decodedChars);
+ } catch (Exception ex) {
+ throw new Error("euc-jp-linux decoding broken");
+ }
+
+ // check number of decoded chars is what is expected
+ if (n != expectedChars.length)
+ throw new Error("Unexpected number of chars decoded");
+
+ // Compare actual decoded with expected
+
+ for (int i = 0; i < n; i++) {
+ if (expectedChars[i] != decodedChars[i])
+ throw new Error("euc-jp-linux decoding incorrect");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EuroConverter.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,158 @@
+/*
+ * 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 4114080
+ * @summary Make sure the euro converters, which are derived from
+ * existing converters, only differ from their parents at the expected
+ * code point.
+ */
+
+import java.text.*;
+import java.util.*;
+import java.io.*;
+
+/* Author: Alan Liu
+ * 7/14/98
+ */
+public class EuroConverter {
+ public static void main(String args[]) throws Exception {
+ boolean pass = true;
+ char[] map = new char[256]; // map for the encoding
+ byte[] bytes = new byte[1]; // scratch
+ char[] chars = new char[1]; // scratch
+ for (int i=0; i<DATA.length; ) {
+ String euroEnc = DATA[i++];
+ String parentEnc = DATA[i++];
+ System.out.println("Checking encoder " + euroEnc + " against " + parentEnc);
+ String currentEnc = parentEnc;
+
+ try {
+ // Fill map with parent values
+ for (int j=-128; j<128; ++j) {
+ bytes[0] = (byte)j;
+ char parentValue = new String(bytes, parentEnc).charAt(0);
+ // NOTE: 0x25 doesn't round trip on the EBCDIC code pages,
+ // so we don't check that code point in the sanity check.
+ if (j != 0x0025) {
+ chars[0] = parentValue;
+ int parentRoundTrip = new String(chars).getBytes(parentEnc)[0];
+ // This is a sanity check -- we aren't really testing the parent
+ // encoder here.
+ if (parentRoundTrip != j) {
+ pass = false;
+ System.out.println("Error: Encoder " + parentEnc +
+ " fails round-trip: " + j +
+ " -> \\u" + Integer.toHexString(parentValue) +
+ " -> " + parentRoundTrip);
+ }
+ }
+ map[(j+0x100)&0xFF] = parentValue;
+ }
+
+ // Modify map with new expected values. Each pair has code point, parent value, euro value.
+ // Terminated by null.
+ while (DATA[i] != null) {
+ int codePoint = Integer.valueOf(DATA[i++], 16).intValue();
+ char expectedParentValue = DATA[i++].charAt(0);
+ char expectedEuroValue = DATA[i++].charAt(0);
+ // This is a sanity check -- we aren't really testing the parent
+ // encoder here.
+ if (map[codePoint] != expectedParentValue) {
+ pass = false;
+ System.out.println("Error: Encoder " + parentEnc +
+ " " + Integer.toHexString(codePoint) + " -> \\u" +
+ Integer.toHexString(map[codePoint]) + ", expected \\u" +
+ Integer.toHexString(expectedParentValue));
+ }
+ // Fill in new expected value
+ map[codePoint] = expectedEuroValue;
+ }
+ ++i; // Skip over null at end of set
+
+ // Now verify the euro encoder
+ currentEnc = euroEnc;
+ for (int j=-128; j<128; ++j) {
+ bytes[0] = (byte)j;
+ char euroValue = new String(bytes, euroEnc).charAt(0);
+ chars[0] = euroValue;
+ // NOTE: 0x15 doesn't round trip on the EBCDIC code pages,
+ // so we don't check that code point in the sanity check.
+ if (j != 0x0015) {
+ int euroRoundTrip = new String(chars).getBytes(euroEnc)[0];
+ if (euroRoundTrip != j) {
+ pass = false;
+ System.out.println("Error: Encoder " + euroEnc +
+ " fails round-trip at " + j);
+ }
+ }
+ // Compare against the map
+ if (euroValue != map[(j+0x100)&0xFF]) {
+ pass = false;
+ System.out.println("Error: Encoder " + euroEnc +
+ " " + Integer.toHexString((j+0x100)&0xFF) + " -> \\u" +
+ Integer.toHexString(euroValue) + ", expected \\u" +
+ Integer.toHexString(map[(j+0x100)&0xFF]));
+ }
+ }
+ } catch (UnsupportedEncodingException e) {
+ System.out.println("Unsupported encoding " + currentEnc);
+ pass = false;
+ while (i < DATA.length && DATA[i] != null) ++i;
+ ++i; // Skip over null
+ }
+ }
+ if (!pass) {
+ throw new RuntimeException("Bug 4114080 - Euro encoder test failed");
+ }
+ }
+ static String[] DATA = {
+ // New converter, parent converter, [ code point that changed, parent code point value,
+ // euro code point value ], null
+ // Any number of changed code points may be specified, including zero.
+ "ISO8859_15_FDIS", "ISO8859_1",
+ "A4", "\u00A4", "\u20AC",
+ "A6", "\u00A6", "\u0160",
+ "A8", "\u00A8", "\u0161",
+ "B4", "\u00B4", "\u017D",
+ "B8", "\u00B8", "\u017E",
+ "BC", "\u00BC", "\u0152",
+ "BD", "\u00BD", "\u0153",
+ "BE", "\u00BE", "\u0178",
+ null,
+ // 923 is IBM's name for ISO 8859-15; make sure they're identical
+ "Cp923", "ISO8859_15_FDIS", null,
+ "Cp858", "Cp850", "D5", "\u0131", "\u20AC", null,
+ "Cp1140", "Cp037", "9F", "\u00A4", "\u20AC", null,
+ "Cp1141", "Cp273", "9F", "\u00A4", "\u20AC", null,
+ "Cp1142", "Cp277", "5A", "\u00A4", "\u20AC", null,
+ "Cp1143", "Cp278", "5A", "\u00A4", "\u20AC", null,
+ "Cp1144", "Cp280", "9F", "\u00A4", "\u20AC", null,
+ "Cp1145", "Cp284", "9F", "\u00A4", "\u20AC", null,
+ "Cp1146", "Cp285", "9F", "\u00A4", "\u20AC", null,
+ "Cp1147", "Cp297", "9F", "\u00A4", "\u20AC", null,
+ "Cp1148", "Cp500", "9F", "\u00A4", "\u20AC", null,
+ "Cp1149", "Cp871", "9F", "\u00A4", "\u20AC", null,
+ };
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindASCIICodingBugs.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,90 @@
+/*
+ * 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 6196991
+ * @summary Roundtrip Encoding/Decoding of just one ASCII char
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindASCIICodingBugs {
+ private static int failures = 0;
+
+ private static void check(boolean condition) {
+ if (! condition) {
+ new Error("test failed").printStackTrace();
+ failures++;
+ }
+ }
+
+ private static boolean equals(byte[] ba, ByteBuffer bb) {
+ if (ba.length != bb.limit())
+ return false;
+ for (int i = 0; i < ba.length; i++)
+ if (ba[i] != bb.get(i))
+ return false;
+ return true;
+ }
+
+ public static void main(String[] args) throws Exception {
+ for (Map.Entry<String,Charset> e
+ : Charset.availableCharsets().entrySet()) {
+ String csn = e.getKey();
+ Charset cs = e.getValue();
+
+ // Delete the following lines when these charsets are fixed!
+ if (csn.equals("x-JIS0208")) continue; // MalformedInput
+ if (csn.equals("JIS_X0212-1990")) continue; // MalformedInput
+
+ if (! cs.canEncode()) continue;
+
+ CharsetEncoder enc = cs.newEncoder();
+ CharsetDecoder dec = cs.newDecoder();
+
+ if (! enc.canEncode('A')) continue;
+
+ System.out.println(csn);
+
+ try {
+ byte[] bytes1 = "A".getBytes(csn);
+ ByteBuffer bb = enc.encode(CharBuffer.wrap(new char[]{'A'}));
+
+ check(equals(bytes1, bb));
+ check(new String(bytes1, csn).equals("A"));
+
+ CharBuffer cb = dec.decode(bb);
+ check(cb.toString().equals("A"));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ failures++;
+ }
+ }
+
+ if (failures > 0)
+ throw new Exception(failures + "tests failed");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindASCIIRangeCodingBugs.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,78 @@
+/*
+ * 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 6378295
+ * @summary Roundtrip Encoding/Decoding of ASCII chars from 0x00-0x7f
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindASCIIRangeCodingBugs {
+ private static int failures = 0;
+ private static byte[] asciiBytes = new byte[0x80];
+ private static char[] asciiChars = new char[0x80];
+ private static String asciiString;
+
+ private static void check(String csn) throws Exception {
+ System.out.println(csn);
+ if (! Arrays.equals(asciiString.getBytes(csn), asciiBytes)) {
+ System.out.printf("%s -> bytes%n", csn);
+ failures++;
+ }
+ if (! new String(asciiBytes, csn).equals(asciiString)) {
+ System.out.printf("%s -> chars%n", csn);
+ failures++;
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ for (int i = 0; i < 0x80; i++) {
+ asciiBytes[i] = (byte) i;
+ asciiChars[i] = (char) i;
+ }
+ asciiString = new String(asciiChars);
+ Charset ascii = Charset.forName("ASCII");
+ for (Map.Entry<String,Charset> e
+ : Charset.availableCharsets().entrySet()) {
+ String csn = e.getKey();
+ Charset cs = e.getValue();
+ if (!cs.contains(ascii) ||
+ csn.matches(".*2022.*") || //iso2022 family
+ csn.matches("x-windows-5022[0|1]") || //windows 2022jp
+ csn.matches(".*UTF-[16|32].*")) //multi-bytes
+ continue;
+ if (! cs.canEncode()) continue;
+ try {
+ check(csn);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ failures++;
+ }
+ }
+ if (failures > 0)
+ throw new Exception(failures + "tests failed");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindCanEncodeBugs.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,93 @@
+/*
+ * 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 5066863 5066867 5066874 5066879 5066884 5066887
+ @summary canEncode() false iff encode() throws CharacterCodingException
+ @run main/timeout=1200 FindCanEncodeBugs
+ @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.charset.*;
+import java.nio.*;
+
+public class FindCanEncodeBugs {
+ static boolean encodable1(CharsetEncoder enc, char c) {
+ enc.reset();
+ return enc.canEncode(c);
+ }
+
+ static boolean encodable2(CharsetEncoder enc, char c) {
+ enc.reset();
+ try { enc.encode(CharBuffer.wrap(new char[]{c})); return true; }
+ catch (CharacterCodingException e) { return false; }
+ }
+
+ public static void main(String[] args) throws Exception {
+ int failures = 0;
+
+ for (Map.Entry<String,Charset> e
+ : Charset.availableCharsets().entrySet()) {
+ String csn = e.getKey();
+ Charset cs = e.getValue();
+
+ if (! cs.canEncode() ||
+ csn.matches("x-COMPOUND_TEXT") ||
+ csn.matches("x-ISO-2022-CN-CNS") || // ISO2022_CN_CNS supports less
+ csn.matches("(x-)?IBM(970).*")) // Broken as of 2004-07
+ continue;
+
+ //System.out.println(csn);
+
+ CharsetEncoder enc = cs.newEncoder();
+
+ for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; i++) {
+ boolean encodable1 = encodable1(enc, (char)i);
+ boolean encodable2 = encodable2(enc, (char)i);
+ if (encodable1 != encodable2) {
+ int start = i;
+ int end = i;
+ for (int j = i;
+ j <= '\uffff' &&
+ encodable1(enc, (char)j) == encodable1 &&
+ encodable2(enc, (char)j) == encodable2;
+ j++)
+ end = j;
+ System.out.printf("charset=%-18s canEncode=%-5b ",
+ csn, encodable1);
+ if (start == end)
+ System.out.printf("\'\\u%04x\'%n", start);
+ else
+ System.out.printf("\'\\u%04x\' - \'\\u%04x\'%n",
+ start, end);
+ i = end;
+ failures++;
+ }
+ }
+ }
+
+ if (failures > 0)
+ throw new Exception(failures + " failures");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindDecoderBugs.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,442 @@
+/*
+ * 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 6380723
+ * @summary Decode many byte sequences in many ways
+ * @run main/timeout=1800 FindDecoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.util.regex.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindDecoderBugs {
+
+ static boolean isBroken(String csn) {
+ if (csn.equals("x-COMPOUND_TEXT")) return true;
+ return false;
+ }
+
+ static <T extends Comparable<? super T>> List<T> sort(Collection<T> c) {
+ List<T> list = new ArrayList<T>(c);
+ Collections.sort(list);
+ return list;
+ }
+
+ static class TooManyFailures extends RuntimeException {
+ private static final long serialVersionUID = 0L;
+ }
+
+ static String string(byte[] a) {
+ final StringBuilder sb = new StringBuilder();
+ for (byte b : a) {
+ if (sb.length() != 0) sb.append(' ');
+ sb.append(String.format("%02x", b & 0xff));
+ }
+ return sb.toString();
+ }
+
+ static String string(char[] a) {
+ final StringBuilder sb = new StringBuilder();
+ for (char c : a) {
+ if (sb.length() != 0) sb.append(' ');
+ sb.append(String.format("\\u%04x", (int) c));
+ }
+ return sb.toString();
+ }
+
+ static class Reporter {
+ // Some machinery to make sure only a small number of errors
+ // that are "too similar" are reported.
+ static class Counts extends HashMap<String, Long> {
+ private static final long serialVersionUID = -1;
+ long inc(String signature) {
+ Long count = get(signature);
+ if (count == null) count = 0L;
+ put(signature, count+1);
+ return count+1;
+ }
+ }
+
+ final Counts failureCounts = new Counts();
+ final static long maxFailures = 2;
+
+ final static Pattern hideBytes = Pattern.compile("\"[0-9a-f ]+\"");
+ final static Pattern hideChars = Pattern.compile("\\\\u[0-9a-f]{4}");
+
+ boolean bug(String format, Object... args) {
+ String signature = String.format(format, args);
+ signature = hideBytes.matcher(signature).replaceAll("\"??\"");
+ signature = hideChars.matcher(signature).replaceAll("\\u????");
+ failed++;
+ if (failureCounts.inc(signature) <= maxFailures) {
+ System.out.printf(format, args);
+ System.out.println();
+ return true;
+ }
+ return false;
+ }
+
+ void summarize() {
+ for (String key : sort(failureCounts.keySet()))
+ System.out.printf("-----%n%s%nfailures=%d%n",
+ key, failureCounts.get(key));
+ }
+ }
+
+ static final Reporter reporter = new Reporter();
+
+ static class Result {
+ final int limit;
+ final int ipos;
+ final boolean direct;
+ final byte[] ia;
+ final char[] oa;
+ final CoderResult cr;
+
+ Result(ByteBuffer ib, CharBuffer ob, CoderResult cr) {
+ ipos = ib.position();
+ ia = toArray(ib);
+ oa = toArray(ob);
+ direct = ib.isDirect();
+ limit = ob.limit();
+ this.cr = cr;
+ }
+
+ static byte[] toArray(ByteBuffer b) {
+ int pos = b.position();
+ byte[] a = new byte[b.limit()];
+ b.position(0);
+ b.get(a);
+ b.position(pos);
+ return a;
+ }
+
+ static char[] toArray(CharBuffer b) {
+ char[] a = new char[b.position()];
+ b.position(0);
+ b.get(a);
+ return a;
+ }
+
+ static boolean eq(Result x, Result y) {
+ return x == y ||
+ (x != null && y != null &&
+ (Arrays.equals(x.oa, y.oa) &&
+ x.ipos == y.ipos &&
+ x.cr == y.cr));
+ }
+
+ public String toString() {
+ return String.format("\"%s\"[%d/%d] => %s \"%s\"[%d/%d]%s",
+ string(ia), ipos, ia.length,
+ cr, string(oa), oa.length, limit,
+ (direct ? " (direct)" : ""));
+ }
+ }
+
+ // legend: r=regular d=direct In=Input Ou=Output
+ static final int maxBufSize = 20;
+ static final ByteBuffer[] ribs = new ByteBuffer[maxBufSize];
+ static final ByteBuffer[] dibs = new ByteBuffer[maxBufSize];
+
+ static final CharBuffer[] robs = new CharBuffer[maxBufSize];
+ static final CharBuffer[] dobs = new CharBuffer[maxBufSize];
+ static {
+ for (int i = 0; i < maxBufSize; i++) {
+ ribs[i] = ByteBuffer.allocate(i);
+ dibs[i] = ByteBuffer.allocateDirect(i);
+ robs[i] = CharBuffer.allocate(i);
+ dobs[i] = ByteBuffer.allocateDirect(i*2).asCharBuffer();
+ }
+ }
+
+ static class CharsetTester {
+ private final Charset cs;
+ private static final long maxFailures = 5;
+ private long failures = 0;
+ // private static final long maxCharsetFailures = Long.MAX_VALUE;
+ private static final long maxCharsetFailures = 10000L;
+ private final long failed0 = failed;
+
+ CharsetTester(Charset cs) {
+ this.cs = cs;
+ }
+
+ static boolean bug(String format, Object... args) {
+ return reporter.bug(format, args);
+ }
+
+ Result recode(ByteBuffer ib, CharBuffer ob) {
+ try {
+ char canary = '\u4242';
+ ib.clear(); // Prepare to read
+ ob.clear(); // Prepare to write
+ for (int i = 0; i < ob.limit(); i++)
+ ob.put(i, canary);
+ CharsetDecoder coder = cs.newDecoder();
+ CoderResult cr = coder.decode(ib, ob, false);
+ equal(ib.limit(), ib.capacity());
+ equal(ob.limit(), ob.capacity());
+ Result r = new Result(ib, ob, cr);
+ if (cr.isError())
+ check(cr.length() > 0);
+ if (cr.isOverflow() && ob.remaining() > 10)
+ bug("OVERFLOW, but there's lots of room: %s %s",
+ cs, r);
+// if (cr.isOverflow() && ib.remaining() == 0)
+// bug("OVERFLOW, yet remaining() == 0: %s %s",
+// cs, r);
+ if (cr.isError() && ib.remaining() < cr.length())
+ bug("remaining() < CoderResult.length(): %s %s",
+ cs, r);
+// if (ib.position() == 0 && ob.position() > 0)
+// reporter. bug("output only if input consumed: %s %s",
+// cs, r);
+ // Should we warn if cr.isUnmappable() ??
+ CoderResult cr2 = coder.decode(ib, ob, false);
+ if (ib.position() != r.ipos ||
+ ob.position() != r.oa.length ||
+ cr != cr2)
+ bug("Coding operation not idempotent: %s%n %s%n %s",
+ cs, r, new Result(ib, ob, cr2));
+ if (ob.position() < ob.limit() &&
+ ob.get(ob.position()) != canary)
+ bug("Buffer overrun: %s %s %s",
+ cs, r, ob.get(ob.position()));
+ return r;
+ } catch (Throwable t) {
+ if (bug("Unexpected exception: %s %s %s",
+ cs, t.getClass().getSimpleName(),
+ new Result(ib, ob, null)))
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ Result recode2(byte[] ia, int n) {
+ int len = ia.length;
+ ByteBuffer rib = ByteBuffer.wrap(ia);
+ ByteBuffer dib = dibs[len];
+ dib.clear(); dib.put(ia); dib.clear();
+ CharBuffer rob = robs[n];
+ CharBuffer dob = dobs[n];
+ equal(rob.limit(), n);
+ equal(dob.limit(), n);
+ check(dib.isDirect());
+ check(dob.isDirect());
+ Result r1 = recode(rib, rob);
+ Result r2 = recode(dib, dob);
+ if (r1 != null && r2 != null && ! Result.eq(r1, r2))
+ bug("Results differ for direct buffers: %s%n %s%n %s",
+ cs, r1, r2);
+ return r1;
+ }
+
+ Result test(byte[] ia) {
+ if (failed - failed0 >= maxCharsetFailures)
+ throw new TooManyFailures();
+
+ Result roomy = recode2(ia, maxBufSize - 1);
+ if (roomy == null) return roomy;
+ int olen = roomy.oa.length;
+ if (olen > 0) {
+ if (roomy.ipos == roomy.ia.length) {
+ Result perfectFit = recode2(ia, olen);
+ if (! Result.eq(roomy, perfectFit))
+ bug("Results differ: %s%n %s%n %s",
+ cs, roomy, perfectFit);
+ }
+ for (int i = 0; i < olen; i++) {
+ Result claustrophobic = recode2(ia, i);
+ if (claustrophobic == null) return roomy;
+ if (roomy.cr.isUnderflow() &&
+ ! claustrophobic.cr.isOverflow())
+ bug("Expected OVERFLOW: %s%n %s%n %s",
+ cs, roomy, claustrophobic);
+ }
+ }
+ return roomy;
+ }
+
+ void testExhaustively(byte[] prefix, int n) {
+ int len = prefix.length;
+ byte[] ia = Arrays.copyOf(prefix, len + 1);
+ for (int i = 0; i < 0x100; i++) {
+ ia[len] = (byte) i;
+ if (n == 1)
+ test(ia);
+ else
+ testExhaustively(ia, n - 1);
+ }
+ }
+
+ void testRandomly(byte[] prefix, int n) {
+ int len = prefix.length;
+ byte[] ia = Arrays.copyOf(prefix, len + n);
+ for (int i = 0; i < 10000; i++) {
+ for (int j = 0; j < n; j++)
+ ia[len + j] = randomByte();
+ test(ia);
+ }
+ }
+
+ void testPrefix(byte[] prefix) {
+ if (prefix.length > 0)
+ System.out.printf("Testing prefix %s%n", string(prefix));
+
+ test(prefix);
+
+ testExhaustively(prefix, 1);
+ testExhaustively(prefix, 2);
+ // Can you spare a week of CPU time?
+ // testExhaustively(cs, tester, prefix, 3);
+
+ testRandomly(prefix, 3);
+ testRandomly(prefix, 4);
+ }
+ }
+
+ private final static Random rnd = new Random();
+ private static byte randomByte() {
+ return (byte) rnd.nextInt(0x100);
+ }
+ private static byte[] randomBytes(int len) {
+ byte[] a = new byte[len];
+ for (int i = 0; i < len; i++)
+ a[i] = randomByte();
+ return a;
+ }
+
+ private static final byte SS2 = (byte) 0x8e;
+ private static final byte SS3 = (byte) 0x8f;
+ private static final byte ESC = (byte) 0x1b;
+ private static final byte SO = (byte) 0x0e;
+ private static final byte SI = (byte) 0x0f;
+
+ private final static byte[][] stateChangers = {
+ {SS2}, {SS3}, {SO}, {SI}
+ };
+
+ private final static byte[][]escapeSequences = {
+ {ESC, '(', 'B'},
+ {ESC, '(', 'I'},
+ {ESC, '(', 'J'},
+ {ESC, '$', '@'},
+ {ESC, '$', 'A'},
+ {ESC, '$', ')', 'A'},
+ {ESC, '$', ')', 'C'},
+ {ESC, '$', ')', 'G'},
+ {ESC, '$', '*', 'H'},
+ {ESC, '$', '+', 'I'},
+ {ESC, '$', 'B'},
+ {ESC, 'N'},
+ {ESC, 'O'},
+ {ESC, '$', '(', 'D'},
+ };
+
+ private static boolean isStateChanger(Charset cs, byte[] ia) {
+ Result r = new CharsetTester(cs).recode2(ia, 9);
+ return r == null ? false :
+ (r.cr.isUnderflow() &&
+ r.ipos == ia.length &&
+ r.oa.length == 0);
+ }
+
+ private final static byte[][] incompletePrefixes = {
+ {ESC},
+ {ESC, '('},
+ {ESC, '$'},
+ {ESC, '$', '(',},
+ };
+
+ private static boolean isIncompletePrefix(Charset cs, byte[] ia) {
+ Result r = new CharsetTester(cs).recode2(ia, 9);
+ return r == null ? false :
+ (r.cr.isUnderflow() &&
+ r.ipos == 0 &&
+ r.oa.length == 0);
+ }
+
+ private static void testCharset(Charset cs) throws Throwable {
+ final String csn = cs.name();
+
+ if (isBroken(csn)) {
+ System.out.printf("Skipping possibly broken charset %s%n", csn);
+ return;
+ }
+ System.out.println(csn);
+ CharsetTester tester = new CharsetTester(cs);
+
+ tester.testPrefix(new byte[0]);
+
+ if (! csn.matches("(?:x-)?(?:UTF|JIS(?:_X)?0).*")) {
+ for (byte[] prefix : stateChangers)
+ if (isStateChanger(cs, prefix))
+ tester.testPrefix(prefix);
+
+ for (byte[] prefix : incompletePrefixes)
+ if (isIncompletePrefix(cs, prefix))
+ tester.testPrefix(prefix);
+
+ if (isIncompletePrefix(cs, new byte[] {ESC}))
+ for (byte[] prefix : escapeSequences)
+ if (isStateChanger(cs, prefix))
+ tester.testPrefix(prefix);
+ }
+ }
+
+ private static void realMain(String[] args) {
+ for (Charset cs : sort(Charset.availableCharsets().values())) {
+ try {
+ testCharset(cs);
+ } catch (TooManyFailures e) {
+ System.out.printf("Too many failures for %s%n", cs);
+ } catch (Throwable t) {
+ unexpected(t);
+ }
+ }
+ reporter.summarize();
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ static volatile long passed = 0, failed = 0;
+ static void pass() {passed++;}
+ static void fail() {failed++; Thread.dumpStack();}
+ static void fail(String format, Object... args) {
+ System.out.println(String.format(format, args)); failed++;}
+ 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 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");}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindEncoderBugs.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,529 @@
+/*
+ * 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 6233345 6381699 6381702 6381705 6381706
+ * @summary Encode many char sequences in many ways
+ * @run main/timeout=1200 FindEncoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.util.regex.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindEncoderBugs {
+
+ static boolean isBroken(String csn) {
+ if (csn.equals("x-COMPOUND_TEXT")) return true;
+ if (csn.equals("x-IBM834")) return true; // stateful korean
+ if (csn.equals("x-IBM933")) return true; // stateful korean
+ if (csn.equals("x-IBM970")) return true; // stateful korean
+ if (csn.equals("x-IBM949")) return true; // stateful korean
+ if (csn.equals("x-IBM949C")) return true; // stateful korean
+ return false;
+ }
+
+ static <T extends Comparable<? super T>> List<T> sort(Collection<T> c) {
+ List<T> list = new ArrayList<T>(c);
+ Collections.sort(list);
+ return list;
+ }
+
+ static class TooManyFailures extends RuntimeException {
+ private static final long serialVersionUID = 0L;
+ }
+
+ static String string(byte[] a) {
+ final StringBuilder sb = new StringBuilder();
+ for (byte b : a) {
+ if (sb.length() != 0) sb.append(' ');
+ sb.append(String.format("%02x", b & 0xff));
+ }
+ return sb.toString();
+ }
+
+ static String string(char[] a) {
+ final StringBuilder sb = new StringBuilder();
+ for (char c : a) {
+ if (sb.length() != 0) sb.append(' ');
+ sb.append(String.format("\\u%04x", (int) c));
+ }
+ return sb.toString();
+ }
+
+ static class Reporter {
+ // Some machinery to make sure only a small number of errors
+ // that are "too similar" are reported.
+ static class Counts extends HashMap<String, Long> {
+ private static final long serialVersionUID = -1;
+ long inc(String signature) {
+ Long count = get(signature);
+ if (count == null) count = 0L;
+ put(signature, count+1);
+ return count+1;
+ }
+ }
+
+ final Counts failureCounts = new Counts();
+ final static long maxFailures = 2;
+
+ final static Pattern hideBytes = Pattern.compile("\"[0-9a-f ]+\"");
+ final static Pattern hideChars = Pattern.compile("\\\\u[0-9a-f]{4}");
+
+ boolean bug(String format, Object... args) {
+ String signature = String.format(format, args);
+ // signature = hideBytes.matcher(signature).replaceAll("\"??\"");
+ // signature = hideChars.matcher(signature).replaceAll("\\u????");
+ failed++;
+ if (failureCounts.inc(signature) <= maxFailures) {
+ System.out.printf(format, args);
+ System.out.println();
+ return true;
+ }
+ return false;
+ }
+
+ void summarize() {
+ for (String key : sort(failureCounts.keySet()))
+ System.out.printf("-----%n%s%nfailures=%d%n",
+ key, failureCounts.get(key));
+ }
+ }
+
+ static final Reporter reporter = new Reporter();
+
+ static class Result {
+ final int limit;
+ final int ipos;
+ final boolean direct;
+ final char[] ia;
+ final byte[] oa;
+ final CoderResult cr;
+
+ private static byte[] toByteArray(ByteBuffer bb) {
+ byte[] bytes = new byte[bb.position()];
+ for (int i = 0; i < bytes.length; i++)
+ bytes[i] = bb.get(i);
+ return bytes;
+ }
+
+ Result(CharBuffer ib, ByteBuffer ob, CoderResult cr) {
+ ipos = ib.position();
+ ia = toArray(ib);
+ oa = toArray(ob);
+ direct = ib.isDirect();
+ limit = ob.limit();
+ this.cr = cr;
+ }
+
+ static char[] toArray(CharBuffer b) {
+ int pos = b.position();
+ char[] a = new char[b.limit()];
+ b.position(0);
+ b.get(a);
+ b.position(pos);
+ return a;
+ }
+
+ static byte[] toArray(ByteBuffer b) {
+ byte[] a = new byte[b.position()];
+ b.position(0);
+ b.get(a);
+ return a;
+ }
+
+ static boolean eq(Result x, Result y) {
+ return x == y ||
+ (x != null && y != null &&
+ (Arrays.equals(x.oa, y.oa) &&
+ x.ipos == y.ipos &&
+ x.cr == y.cr));
+ }
+
+ public String toString() {
+ return String.format("\"%s\"[%d/%d] => %s \"%s\"[%d/%d]%s",
+ string(ia), ipos, ia.length,
+ cr, string(oa), oa.length, limit,
+ (direct ? " (direct)" : ""));
+ }
+ }
+
+ static class CharsetTester {
+ private final Charset cs;
+ private final boolean hasBom;
+ private static final int maxFailures = 5;
+ private int failures = 0;
+ // private static final long maxCharsetFailures = Long.MAX_VALUE;
+ private static final long maxCharsetFailures = 10000L;
+ private final long failed0 = failed;
+
+ // legend: r=regular d=direct In=Input Ou=Output
+ static final int maxBufSize = 20;
+ static final CharBuffer[] rInBuffers = new CharBuffer[maxBufSize];
+ static final CharBuffer[] dInBuffers = new CharBuffer[maxBufSize];
+
+ static final ByteBuffer[] rOuBuffers = new ByteBuffer[maxBufSize];
+ static final ByteBuffer[] dOuBuffers = new ByteBuffer[maxBufSize];
+ static {
+ for (int i = 0; i < maxBufSize; i++) {
+ rInBuffers[i] = CharBuffer.allocate(i);
+ dInBuffers[i] = ByteBuffer.allocateDirect(i*2).asCharBuffer();
+ rOuBuffers[i] = ByteBuffer.allocate(i);
+ dOuBuffers[i] = ByteBuffer.allocateDirect(i);
+ }
+ }
+
+ CharsetTester(Charset cs) {
+ this.cs = cs;
+ this.hasBom =
+ cs.name().matches(".*BOM.*") ||
+ cs.name().equals("UTF-16");
+ }
+
+ static boolean bug(String format, Object... args) {
+ return reporter.bug(format, args);
+ }
+
+ static boolean hasBom(byte[] a) {
+ switch (a.length) {
+ case 2: case 4:
+ int sum = 0;
+ for (byte x : a)
+ sum += x;
+ return sum == (byte) 0xfe + (byte) 0xff;
+ default: return false;
+ }
+ }
+
+ void testSurrogates() {
+ int failures = 0;
+ for (int i = 0; i < 10; i++) {
+ Result r = test(new char[] { randomHighSurrogate() });
+ if (r == null) break;
+ if (! (r.cr.isUnderflow() &&
+ r.ipos == 0))
+ bug("Lone high surrogate not UNDERFLOW: %s %s",
+ cs, r);
+ }
+ for (int i = 0; i < 10; i++) {
+ Result r = test(new char[] { randomLowSurrogate() });
+ if (r == null) break;
+ if (! (r.cr.isMalformed() && r.cr.length() == 1))
+ bug("Lone low surrogate not MALFORMED[1]: %s %s",
+ cs, r);
+ }
+ char[] chars = new char[2];
+ for (int i = 0; i < 10; i++) {
+ chars[0] = randomLowSurrogate(); // Always illegal
+ chars[1] = randomChar();
+ Result r = test(chars);
+ if (r == null) break;
+ if (! (r.cr.isMalformed() &&
+ r.cr.length() == 1 &&
+ (r.ipos == 0 || (hasBom && hasBom(r.oa))))) {
+ if (failures++ > 5) return;
+ bug("Unpaired low surrogate not MALFORMED[1]: %s %s",
+ cs, r);
+ }
+ }
+ for (int i = 0; i < 10; i++) {
+ chars[0] = randomHighSurrogate();
+ do {
+ chars[1] = randomChar();
+ } while (Character.isLowSurrogate(chars[1]));
+ Result r = test(chars);
+ if (r == null) break;
+ if (! (r.cr.isMalformed() &&
+ r.cr.length() == 1 &&
+ (r.ipos == 0 || (hasBom && hasBom(r.oa))))) {
+ if (failures++ > 5) return;
+ bug("Unpaired high surrogate not MALFORMED[1]: %s %s",
+ cs, r);
+ }
+ }
+ for (int i = 0; i < 1000; i++) {
+ chars[0] = randomHighSurrogate();
+ chars[1] = randomLowSurrogate();
+ Result r = test(chars);
+ if (r == null) break;
+ if (! ((r.cr.isUnmappable() &&
+ r.cr.length() == 2 &&
+ r.oa.length == 0)
+ ||
+ (r.cr.isUnderflow() &&
+ r.oa.length > 0 &&
+ r.ipos == 2))) {
+ if (failures++ > 5) return;
+ bug("Legal supplementary character bug: %s %s",
+ cs, r);
+ }
+ }
+ }
+
+// if (! (r.cr.isMalformed() &&
+// r.cr.length() == 1 &&
+// (rob.position() == 0 || hasBom(rob)))) {
+// if (failures++ > 5) return;
+// bug("Unpaired surrogate not malformed: %s %s",
+// cs, r);
+// }
+// }
+
+// dib.clear(); dib.put(chars); dib.flip();
+// rib.position(0);
+// rob.clear(); rob.limit(lim);
+// for (CharBuffer ib : new CharBuffer[] { rib, dib }) {
+// Result r = recode(ib, rob);
+// if (! (r.cr.isMalformed() &&
+// r.cr.length() == 1 &&
+// (rob.position() == 0 || hasBom(rob)))) {
+// if (failures++ > 5) return;
+// bug("Unpaired surrogate not malformed: %s %s",
+// cs, r);
+// }
+// }
+// //}
+// for (int i = 0; i < 10000; i++) {
+// chars[0] = randomHighSurrogate();
+// chars[1] = randomLowSurrogate();
+// dib.clear(); dib.put(chars); dib.flip();
+// rib.position(0);
+// rob.clear(); rob.limit(lim);
+// for (CharBuffer ib : new CharBuffer[] { rib, dib }) {
+// Result r = recode(ib, rob);
+// if (! ((r.cr.isUnmappable() &&
+// r.cr.length() == 2 &&
+// rob.position() == 0)
+// ||
+// (r.cr.isUnderflow() &&
+// rob.position() > 0 &&
+// ib.position() == 2))) {
+// if (failures++ > 5) return;
+// bug("Legal supplementary character bug: %s %s",
+// cs, r);
+// }
+// }
+// }
+// }
+// }
+
+ Result recode(CharBuffer ib, ByteBuffer ob) {
+ try {
+ byte canary = 22;
+ ib.clear(); // Prepare to read
+ ob.clear(); // Prepare to write
+ for (int i = 0; i < ob.limit(); i++)
+ ob.put(i, canary);
+ CharsetEncoder coder = cs.newEncoder();
+ CoderResult cr = coder.encode(ib, ob, false);
+ equal(ib.limit(), ib.capacity());
+ equal(ob.limit(), ob.capacity());
+ Result r = new Result(ib, ob, cr);
+ if (cr.isError())
+ check(cr.length() > 0);
+ if (cr.isOverflow() && ob.remaining() > 10)
+ bug("OVERFLOW, but there's lots of room: %s %s",
+ cs, r);
+// if (cr.isOverflow() && ib.remaining() == 0 && ! hasBom)
+// bug("OVERFLOW, yet remaining() == 0: %s %s",
+// cs, r);
+ if (cr.isError() && ib.remaining() < cr.length())
+ bug("remaining() < CoderResult.length(): %s %s",
+ cs, r);
+// if (ib.position() == 0
+// && ob.position() > 0
+// && ! hasBom(r.oa))
+// bug("output only if input consumed: %s %s",
+// cs, r);
+ CoderResult cr2 = coder.encode(ib, ob, false);
+ if (ib.position() != r.ipos ||
+ ob.position() != r.oa.length ||
+ cr != cr2)
+ bug("Coding operation not idempotent: %s%n %s%n %s",
+ cs, r, new Result(ib, ob, cr2));
+ if (ob.position() < ob.limit() &&
+ ob.get(ob.position()) != canary)
+ bug("Buffer overrun: %s %s %s",
+ cs, r, ob.get(ob.position()));
+ return r;
+ } catch (Throwable t) {
+ if (bug("Unexpected exception: %s %s %s",
+ cs, t.getClass().getSimpleName(),
+ new Result(ib, ob, null)))
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ Result recode2(char[] ia, int n) {
+ int len = ia.length;
+ CharBuffer rib = CharBuffer.wrap(ia);
+ CharBuffer dib = dInBuffers[len];
+ dib.clear(); dib.put(ia); dib.clear();
+ ByteBuffer rob = rOuBuffers[n];
+ ByteBuffer dob = dOuBuffers[n];
+ equal(rob.limit(), n);
+ equal(dob.limit(), n);
+ check(dib.isDirect());
+ check(dob.isDirect());
+ Result r1 = recode(rib, rob);
+ Result r2 = recode(dib, dob);
+ if (r1 != null && r2 != null && ! Result.eq(r1, r2))
+ bug("Results differ for direct buffers: %s%n %s%n %s",
+ cs, r1, r2);
+ return r1;
+ }
+
+ Result test(char[] ia) {
+ if (failed - failed0 >= maxCharsetFailures)
+ throw new TooManyFailures();
+
+ Result roomy = recode2(ia, maxBufSize - 1);
+ if (roomy == null) return roomy;
+ int olen = roomy.oa.length;
+ if (olen > 0) {
+ if (roomy.ipos == roomy.ia.length) {
+ Result perfectFit = recode2(ia, olen);
+ if (! Result.eq(roomy, perfectFit))
+ bug("Results differ: %s%n %s%n %s",
+ cs, roomy, perfectFit);
+ }
+ for (int i = 0; i < olen; i++) {
+ Result claustrophobic = recode2(ia, i);
+ if (claustrophobic == null) return roomy;
+ if (roomy.cr.isUnderflow() &&
+ ! claustrophobic.cr.isOverflow())
+ bug("Expected OVERFLOW: %s%n %s%n %s",
+ cs, roomy, claustrophobic);
+ }
+ }
+ return roomy;
+ }
+
+ void testExhaustively(char[] prefix, int n) {
+ int len = prefix.length;
+ char[] ia = Arrays.copyOf(prefix, len + 1);
+ for (int i = 0; i < 0x10000; i++) {
+ ia[len] = (char) i;
+ if (n == 1)
+ test(ia);
+ else
+ testExhaustively(ia, n - 1);
+ }
+ }
+
+ void testRandomly(char[] prefix, int n) {
+ int len = prefix.length;
+ char[] ia = Arrays.copyOf(prefix, len + n);
+ for (int i = 0; i < 10000; i++) {
+ for (int j = 0; j < n; j++)
+ ia[len + j] = randomChar();
+ test(ia);
+ }
+ }
+
+ void testPrefix(char[] prefix) {
+ if (prefix.length > 0)
+ System.out.printf("Testing prefix %s%n", string(prefix));
+
+ test(prefix);
+
+ testExhaustively(prefix, 1);
+ // Can you spare a year of CPU time?
+ //testExhaustively(prefix, 2);
+
+ testRandomly(prefix, 2);
+ testRandomly(prefix, 3);
+ }
+ }
+
+ private final static Random rnd = new Random();
+ private static char randomChar() {
+ return (char) rnd.nextInt(Character.MAX_VALUE);
+ }
+ private static char randomHighSurrogate() {
+ return (char) (Character.MIN_HIGH_SURROGATE + rnd.nextInt(1024));
+ }
+ private static char randomLowSurrogate() {
+ return (char) (Character.MIN_LOW_SURROGATE + rnd.nextInt(1024));
+ }
+
+ private static void testCharset(Charset cs) throws Throwable {
+ if (! cs.canEncode())
+ return;
+
+ final String csn = cs.name();
+
+ if (isBroken(csn)) {
+ System.out.printf("Skipping possibly broken charset %s%n", csn);
+ return;
+ }
+ System.out.println(csn);
+
+ CharsetTester tester = new CharsetTester(cs);
+
+ tester.testSurrogates();
+
+ tester.testPrefix(new char[] {});
+
+ if (csn.equals("x-ISCII91")) {
+ System.out.println("More ISCII testing...");
+ new CharsetTester(cs).testPrefix(new char[]{'\u094d'}); // Halant
+ new CharsetTester(cs).testPrefix(new char[]{'\u093c'}); // Nukta
+ }
+ }
+
+ private static void realMain(String[] args) {
+ for (Charset cs : sort(Charset.availableCharsets().values())) {
+ try {
+ testCharset(cs);
+ } catch (TooManyFailures e) {
+ System.out.printf("Too many failures for %s%n", cs);
+ } catch (Throwable t) {
+ unexpected(t);
+ }
+ }
+ reporter.summarize();
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ static volatile long passed = 0, failed = 0;
+ static void pass() {passed++;}
+ static void fail() {failed++; Thread.dumpStack();}
+ static void fail(String format, Object... args) {
+ System.out.println(String.format(format, args)); failed++;}
+ 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 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");}
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindOneCharEncoderBugs.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,169 @@
+/*
+ * 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 5058133 6233345 6381699 6381702 6381705 6381706
+ * @summary Check that all one-char sequences can be encoded by all charsets
+ * @run main/timeout=1200 FindOneCharEncoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindOneCharEncoderBugs {
+ final static String[] brokenCharsets = {
+ // Delete the following lines when these charsets are fixed!
+ "x-IBM970",
+ "x-COMPOUND_TEXT", // Direct buffers not supported
+ };
+
+ private static boolean equals(byte[] ba, ByteBuffer bb) {
+ if (ba.length != bb.limit())
+ return false;
+ for (int i = 0; i < ba.length; i++)
+ if (ba[i] != bb.get(i))
+ return false;
+ return true;
+ }
+
+ private static String toString(byte[] bytes) {
+ final StringBuilder sb = new StringBuilder();
+ for (byte b : bytes) {
+ if (sb.length() != 0) sb.append(' ');
+ sb.append(String.format("%02x", (int)b));
+ }
+ return sb.toString();
+ }
+
+ private static String toString(ByteBuffer bb) {
+ final StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < bb.limit(); i++) {
+ if (sb.length() != 0) sb.append(' ');
+ sb.append(String.format("%02x", (int)bb.get(i)));
+ }
+ return sb.toString();
+ }
+
+ private static ByteBuffer convert(Charset cs, char c, CharBuffer cb) throws Throwable {
+ cb.clear(); cb.put(c); cb.flip();
+ return cs.newEncoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE)
+ .onMalformedInput(CodingErrorAction.REPLACE)
+ .encode(cb);
+ }
+
+ /** Returns a direct CharBuffer with the same capacity as ordinary CharBuffer ocb */
+ private static CharBuffer directCharBuffer(CharBuffer ocb) {
+ final CharBuffer dcb =
+ ByteBuffer.allocateDirect(ocb.capacity() * Character.SIZE / Byte.SIZE)
+ .asCharBuffer();
+ check(! ocb.isDirect());
+ check( dcb.isDirect());
+ equal(ocb.capacity(), dcb.capacity());
+ return dcb;
+ }
+
+ private static void testChar(byte[] expected, CharBuffer cb, Charset cs, char c) {
+ try {
+ final ByteBuffer bb = convert(cs, c, cb);
+ if (! equals(expected, bb))
+ fail("bytes differ charset=%s direct=%s char=\\u%04x%n%s%n%s",
+ cs, cb.isDirect(), (int)c,
+ toString(expected), toString(bb));
+ } catch (Throwable t) {
+ System.out.printf("Unexpected exception charset=%s direct=%s char=\\u%04x%n",
+ cs, cb.isDirect(), (int)c);
+ unexpected(t);
+ failed++;
+ }
+ }
+
+ private static void testCharset(Charset cs) throws Throwable {
+ if (! cs.canEncode())
+ return;
+
+ final String csn = cs.name();
+
+ for (String n : brokenCharsets)
+ if (csn.equals(n)) {
+ System.out.printf("Skipping possibly broken charset %s%n", csn);
+ return;
+ }
+ System.out.println(csn);
+
+ final char[] theChar = new char[1];
+ final CharBuffer ocb = CharBuffer.allocate(1);
+ final CharBuffer dcb = directCharBuffer(ocb);
+ final int maxFailuresPerCharset = 5;
+ final int failed0 = failed;
+
+ for (char c = '\u0000';
+ (c+1 != 0x10000) && (failed - failed0 < maxFailuresPerCharset);
+ c++) {
+ theChar[0] = c;
+ byte[] bytes = new String(theChar).getBytes(csn);
+ if (bytes.length == 0)
+ fail("Empty output?! charset=%s char=\\u%04x", cs, (int)c);
+ testChar(bytes, ocb, cs, c);
+ testChar(bytes, dcb, cs, c);
+ }
+ }
+
+ private static void realMain(String[] args) {
+ for (Charset cs : Charset.availableCharsets().values()) {
+ try { testCharset(cs); }
+ catch (Throwable t) { unexpected(t); }
+ }
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ static volatile int passed = 0, failed = 0;
+ static void pass() {passed++;}
+ static void fail() {failed++; Thread.dumpStack();}
+ static void fail(String format, Object... args) {
+ System.out.println(String.format(format, args)); failed++;}
+ 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 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");}
+ private static abstract class Fun {abstract void f() throws Throwable;}
+ static void THROWS(Class<? extends Throwable> k, Fun... fs) {
+ for (Fun f : fs)
+ try { f.f(); fail("Expected " + k.getName() + " not thrown"); }
+ catch (Throwable t) {
+ if (k.isAssignableFrom(t.getClass())) pass();
+ else unexpected(t);}}
+ private static abstract class CheckedThread extends Thread {
+ abstract void realRun() throws Throwable;
+ public void run() {
+ try {realRun();} catch (Throwable t) {unexpected(t);}}}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/HWKatakanaMS932EncodeTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ * 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 4715330
+ @summary Check MS932/windows-31j encoding (char->byte) for halfwidth katakana chars
+ */
+
+/*
+ * Tests encodeability of the Unicode defined Halfwidth Katakana
+ * characters using the MS932/windows-31j encoder
+ */
+
+public class HWKatakanaMS932EncodeTest {
+ public static void main(String[] args) throws Exception {
+
+ char[] testChars = new char[1];
+ byte[] testBytes = new byte[1];
+ int offset = 0;
+ String encoding = "windows-31j";
+
+ // Halfwidth Katakana chars run from U+FF61 --> U+FF9F
+ // and their native equivalents in Code page 932 run
+ // sequentially from 0xa1 --> 0xdf
+
+ for (int lsByte = 0x61 ; lsByte <= 0x9F; lsByte++, offset++) {
+ testChars[0] = (char) (lsByte | 0xFF00);
+ String s = new String(testChars);
+ testBytes = s.getBytes(encoding);
+ if ( testBytes[0] != (byte)(0xa1 + offset))
+ throw new Exception("failed Test");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ISCIITest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,350 @@
+/*
+ * 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 4328178
+ @summary Performs baseline and regression test on the ISCII91 charset
+ */
+
+import java.io.*;
+
+public class ISCIITest {
+
+ private static void failureReport() {
+ System.err.println ("Failed ISCII91 Regression Test");
+ }
+
+ private static void mapEquiv(int start,
+ int end,
+ String testName)
+ throws Exception
+ {
+ byte[] singleByte = new byte[1];
+ byte[] encoded = new byte[1];
+
+ for (int i = start; i <= end; i++ ) {
+ singleByte[0] = (byte) i;
+ try {
+ String unicodeStr =
+ new String (singleByte,"ISCII91");
+
+ if (i != (int)unicodeStr.charAt(0)) {
+ System.err.println ("FAILED ISCII91 Regression test"
+ + "input byte is " + i );
+ throw new Exception("");
+ }
+ encoded = unicodeStr.getBytes("ISCII91");
+
+ if (encoded[0] != singleByte[0]) {
+ System.err.println("Encoding error " + testName);
+ throw new Exception("Failed ISCII91 Regression test");
+ }
+
+ } catch (UnsupportedEncodingException e) {
+ failureReport();
+ }
+ }
+ return;
+ }
+
+ private static void checkUnmapped(int start,
+ int end,
+ String testName)
+ throws Exception {
+
+ byte[] singleByte = new byte[1];
+
+ for (int i = start; i <= end; i++ ) {
+ singleByte[0] = (byte) i;
+ try {
+ String unicodeStr = new String (singleByte, "ISCII91");
+
+ if (unicodeStr.charAt(0) != '\uFFFD') {
+ System.err.println("FAILED " + testName +
+ "input byte is " + i );
+ throw new Exception ("Failed ISCII91 regression test");
+ }
+ } catch (UnsupportedEncodingException e) {
+ System.err.println("Unsupported character encoding");
+ }
+ }
+ return;
+ }
+
+ /*
+ *
+ */
+ private static void checkRange(int start, int end,
+ char[] expectChars,
+ String testName)
+ throws Exception {
+ byte[] singleByte = new byte[1];
+ byte[] encoded = new byte[1];
+ int lookupOffset = 0;
+
+ for (int i=start; i <= end; i++ ) {
+ singleByte[0] = (byte) i;
+ String unicodeStr = new String (singleByte, "ISCII91");
+ if (unicodeStr.charAt(0) != expectChars[lookupOffset++]) {
+ throw new Exception ("Failed ISCII91 Regression Test");
+ }
+ encoded = unicodeStr.getBytes("ISCII");
+ }
+ return;
+ }
+
+ /*
+ * Tests the ISCII91 Indic character encoding
+ * as per IS 13194:1991 Bureau of Indian Standards.
+ */
+
+ private static void test () throws Exception {
+
+ try {
+
+
+ // ISCII91 is an 8-byte encoding which retains the ASCII
+ // mappings in the lower half.
+
+ mapEquiv(0, 0x7f, "7 bit ASCII range");
+
+ // Checks a range of characters which are unmappable according
+ // to the standards.
+
+ checkUnmapped(0x81, 0x9f, "UNMAPPED");
+
+ // Vowel Modifier chars can be used to modify the vowel
+ // sound of the preceding consonant, vowel or matra character.
+
+ byte[] testByte = new byte[1];
+ char[] vowelModChars = {
+ '\u0901', // Vowel modifier Chandrabindu
+ '\u0902', // Vowel modifier Anuswar
+ '\u0903' // Vowel modifier Visarg
+ };
+
+ checkRange(0xa1, 0xa3, vowelModChars, "INDIC VOWEL MODIFIER CHARS");
+
+ char[] expectChars = {
+ '\u0905', // a4 -- Vowel A
+ '\u0906', // a5 -- Vowel AA
+ '\u0907', // a6 -- Vowel I
+ '\u0908', // a7 -- Vowel II
+ '\u0909', // a8 -- Vowel U
+ '\u090a', // a9 -- Vowel UU
+ '\u090b', // aa -- Vowel RI
+ '\u090e', // ab -- Vowel E ( Southern Scripts )
+ '\u090f', // ac -- Vowel EY
+ '\u0910', // ad -- Vowel AI
+ '\u090d', // ae -- Vowel AYE ( Devanagari Script )
+ '\u0912', // af -- Vowel O ( Southern Scripts )
+ '\u0913', // b0 -- Vowel OW
+ '\u0914', // b1 -- Vowel AU
+ '\u0911', // b2 -- Vowel AWE ( Devanagari Script )
+ };
+
+ checkRange(0xa4, 0xb2, expectChars, "INDIC VOWELS");
+
+ char[] expectConsChars =
+ {
+ '\u0915', // b3 -- Consonant KA
+ '\u0916', // b4 -- Consonant KHA
+ '\u0917', // b5 -- Consonant GA
+ '\u0918', // b6 -- Consonant GHA
+ '\u0919', // b7 -- Consonant NGA
+ '\u091a', // b8 -- Consonant CHA
+ '\u091b', // b9 -- Consonant CHHA
+ '\u091c', // ba -- Consonant JA
+ '\u091d', // bb -- Consonant JHA
+ '\u091e', // bc -- Consonant JNA
+ '\u091f', // bd -- Consonant Hard TA
+ '\u0920', // be -- Consonant Hard THA
+ '\u0921', // bf -- Consonant Hard DA
+ '\u0922', // c0 -- Consonant Hard DHA
+ '\u0923', // c1 -- Consonant Hard NA
+ '\u0924', // c2 -- Consonant Soft TA
+ '\u0925', // c3 -- Consonant Soft THA
+ '\u0926', // c4 -- Consonant Soft DA
+ '\u0927', // c5 -- Consonant Soft DHA
+ '\u0928', // c6 -- Consonant Soft NA
+ '\u0929', // c7 -- Consonant NA ( Tamil )
+ '\u092a', // c8 -- Consonant PA
+ '\u092b', // c9 -- Consonant PHA
+ '\u092c', // ca -- Consonant BA
+ '\u092d', // cb -- Consonant BHA
+ '\u092e', // cc -- Consonant MA
+ '\u092f', // cd -- Consonant YA
+ '\u095f', // ce -- Consonant JYA ( Bengali, Assamese & Oriya )
+ '\u0930', // cf -- Consonant RA
+ '\u0931', // d0 -- Consonant Hard RA ( Southern Scripts )
+ '\u0932', // d1 -- Consonant LA
+ '\u0933', // d2 -- Consonant Hard LA
+ '\u0934', // d3 -- Consonant ZHA ( Tamil & Malayalam )
+ '\u0935', // d4 -- Consonant VA
+ '\u0936', // d5 -- Consonant SHA
+ '\u0937', // d6 -- Consonant Hard SHA
+ '\u0938', // d7 -- Consonant SA
+ '\u0939', // d8 -- Consonant HA
+ };
+
+ checkRange(0xb3, 0xd8, expectConsChars, "INDIC CONSONANTS");
+
+ char[] matraChars = {
+ '\u093e', // da -- Vowel Sign AA
+ '\u093f', // db -- Vowel Sign I
+ '\u0940', // dc -- Vowel Sign II
+ '\u0941', // dd -- Vowel Sign U
+ '\u0942', // de -- Vowel Sign UU
+ '\u0943', // df -- Vowel Sign RI
+ '\u0946', // e0 -- Vowel Sign E ( Southern Scripts )
+ '\u0947', // e1 -- Vowel Sign EY
+ '\u0948', // e2 -- Vowel Sign AI
+ '\u0945', // e3 -- Vowel Sign AYE ( Devanagari Script )
+ '\u094a', // e4 -- Vowel Sign O ( Southern Scripts )
+ '\u094b', // e5 -- Vowel Sign OW
+ '\u094c', // e6 -- Vowel Sign AU
+ '\u0949' // e7 -- Vowel Sign AWE ( Devanagari Script )
+ };
+
+ // Matras or Vowel signs alter the implicit
+ // vowel sound associated with an Indic consonant.
+
+ checkRange(0xda, 0xe7, matraChars, "INDIC MATRAS");
+
+ char[] loneContextModifierChars = {
+ '\u094d', // e8 -- Vowel Omission Sign ( Halant )
+ '\u093c', // e9 -- Diacritic Sign ( Nukta )
+ '\u0964' // ea -- Full Stop ( Viram, Northern Scripts )
+ };
+
+ checkRange(0xe8, 0xea,
+ loneContextModifierChars, "LONE INDIC CONTEXT CHARS");
+
+
+ // Test Indic script numeral chars
+ // (as opposed to international numerals)
+
+ char[] expectNumeralChars =
+ {
+ '\u0966', // f1 -- Digit 0
+ '\u0967', // f2 -- Digit 1
+ '\u0968', // f3 -- Digit 2
+ '\u0969', // f4 -- Digit 3
+ '\u096a', // f5 -- Digit 4
+ '\u096b', // f6 -- Digit 5
+ '\u096c', // f7 -- Digit 6
+ '\u096d', // f8 -- Digit 7
+ '\u096e', // f9 -- Digit 8
+ '\u096f' // fa -- Digit 9
+ };
+
+ checkRange(0xf1, 0xfa,
+ expectNumeralChars, "NUMERAL/DIGIT CHARACTERS");
+ int lookupOffset = 0;
+
+ char[] expectNuktaSub = {
+ '\u0950',
+ '\u090c',
+ '\u0961',
+ '\u0960',
+ '\u0962',
+ '\u0963',
+ '\u0944',
+ '\u093d'
+ };
+
+ /*
+ * ISCII uses a number of code extension techniques
+ * to access a number of lesser used characters.
+ * The Nukta character which ordinarily signifies
+ * a diacritic is used in combination with existing
+ * characters to escape them to a different character.
+ * value.
+ */
+
+ byte[] codeExtensionBytes = {
+ (byte)0xa1 , (byte)0xe9, // Chandrabindu + Nukta
+ // =>DEVANAGARI OM SIGN
+ (byte)0xa6 , (byte)0xe9, // Vowel I + Nukta
+ // => DEVANAGARI VOCALIC L
+ (byte)0xa7 , (byte)0xe9, // Vowel II + Nukta
+ // => DEVANAGARI VOCALIC LL
+ (byte)0xaa , (byte)0xe9, // Vowel RI + Nukta
+ // => DEVANAGARI VOCALIC RR
+ (byte)0xdb , (byte)0xe9, // Vowel sign I + Nukta
+ // => DEVANAGARI VOWEL SIGN VOCALIC L
+ (byte)0xdc , (byte)0xe9, // Vowel sign II + Nukta
+ // => DEVANAGARI VOWEL SIGN VOCALIC LL
+
+ (byte)0xdf , (byte)0xe9, // Vowel sign Vocalic R + Nukta
+ // => DEVANAGARI VOWEL SIGN VOCALIC RR
+ (byte)0xea , (byte)0xe9 // Full stop/Phrase separator + Nukta
+ // => DEVANAGARI SIGN AVAGRAHA
+ };
+
+ lookupOffset = 0;
+ byte[] bytePair = new byte[2];
+
+ for (int i=0; i < (codeExtensionBytes.length)/2; i++ ) {
+ bytePair[0] = (byte) codeExtensionBytes[lookupOffset++];
+ bytePair[1] = (byte) codeExtensionBytes[lookupOffset++];
+
+ String unicodeStr = new String (bytePair,"ISCII91");
+ if (unicodeStr.charAt(0) != expectNuktaSub[i]) {
+ throw new Exception("Failed Nukta Sub");
+ }
+ }
+
+ lookupOffset = 0;
+ byte[] comboBytes = {
+ (byte)0xe8 , (byte)0xe8, //HALANT + HALANT
+ (byte)0xe8 , (byte)0xe9 //HALANT + NUKTA aka. Soft Halant
+ };
+ char[] expectCombChars = {
+ '\u094d',
+ '\u200c',
+ '\u094d',
+ '\u200d'
+ };
+
+ for (int i=0; i < (comboBytes.length)/2; i++ ) {
+ bytePair[0] = (byte) comboBytes[lookupOffset++];
+ bytePair[1] = (byte) comboBytes[lookupOffset];
+ String unicodeStr = new String (bytePair, "ISCII91");
+ if (unicodeStr.charAt(0) != expectCombChars[lookupOffset-1]
+ && unicodeStr.charAt(1) != expectCombChars[lookupOffset]) {
+ throw new Exception("Failed ISCII91 Regression Test");
+ }
+ lookupOffset++;
+ }
+
+ } catch (UnsupportedEncodingException e) {
+ System.err.println ("ISCII91 encoding not supported");
+ throw new Exception ("Failed ISCII91 Regression Test");
+ }
+ }
+
+ public static void main (String[] args) throws Exception {
+ test();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ISO2022JP.trailEsc Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,454 @@
+test0
+ $B!!(B $B!"(B $B!#(B $B!$(B $B!%(B $B!&(B $B!'(B $B!((B $B!)(B $B!*(B $B!+(B $B!,(B $B!-(B $B!.(B $B!/(B
+$B!0(B $B!1(B $B!2(B $B!3(B $B!4(B $B!5(B $B!6(B $B!7(B $B!8(B $B!9(B $B!:(B $B!;(B $B!<(B $B!=(B $B!>(B $B!?(B
+ $B!A(B $B!B(B $B!C(B $B!D(B $B!E(B $B!F(B $B!G(B $B!H(B $B!I(B $B!J(B $B!K(B $B!L(B $B!M(B $B!N(B $B!O(B
+$B!P(B $B!Q(B $B!R(B $B!S(B $B!T(B $B!U(B $B!V(B $B!W(B $B!X(B $B!Y(B $B!Z(B $B![(B $B!\(B $B!](B $B!^(B $B!_(B
+$B!`(B $B!a(B $B!b(B $B!c(B $B!d(B $B!e(B $B!f(B $B!g(B $B!h(B $B!i(B $B!j(B $B!k(B $B!l(B $B!m(B $B!n(B $B!o(B
+$B!p(B $B!q(B $B!r(B $B!s(B $B!t(B $B!u(B $B!v(B $B!w(B $B!x(B $B!y(B $B!z(B $B!{(B $B!|(B $B!}(B $B!~(B
+ $B"!(B $B""(B $B"#(B $B"$(B $B"%(B $B"&(B $B"'(B $B"((B $B")(B $B"*(B $B"+(B $B",(B $B"-(B $B".(B
+ $B":(B $B";(B $B"<(B $B"=(B $B">(B $B"?(B
+$B"@(B $B"A(B $B"J(B $B"K(B $B"L(B $B"M(B $B"N(B $B"O(B
+$B"P(B $B"\(B $B"](B $B"^(B $B"_(B
+$B"`(B $B"a(B $B"b(B $B"c(B $B"d(B $B"e(B $B"f(B $B"g(B $B"h(B $B"i(B $B"j(B
+ $B"r(B $B"s(B $B"t(B $B"u(B $B"v(B $B"w(B $B"x(B $B"y(B $B"~(B
+$B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B $B#7(B $B#8(B $B#9(B
+ $B#A(B $B#B(B $B#C(B $B#D(B $B#E(B $B#F(B $B#G(B $B#H(B $B#I(B $B#J(B $B#K(B $B#L(B $B#M(B $B#N(B $B#O(B
+$B#P(B $B#Q(B $B#R(B $B#S(B $B#T(B $B#U(B $B#V(B $B#W(B $B#X(B $B#Y(B $B#Z(B
+ $B#a(B $B#b(B $B#c(B $B#d(B $B#e(B $B#f(B $B#g(B $B#h(B $B#i(B $B#j(B $B#k(B $B#l(B $B#m(B $B#n(B $B#o(B
+$B#p(B $B#q(B $B#r(B $B#s(B $B#t(B $B#u(B $B#v(B $B#w(B $B#x(B $B#y(B $B#z(B
+ $B$!(B $B$"(B $B$#(B $B$$(B $B$%(B $B$&(B $B$'(B $B$((B $B$)(B $B$*(B $B$+(B $B$,(B $B$-(B $B$.(B $B$/(B
+$B$0(B $B$1(B $B$2(B $B$3(B $B$4(B $B$5(B $B$6(B $B$7(B $B$8(B $B$9(B $B$:(B $B$;(B $B$<(B $B$=(B $B$>(B $B$?(B
+$B$@(B $B$A(B $B$B(B $B$C(B $B$D(B $B$E(B $B$F(B $B$G(B $B$H(B $B$I(B $B$J(B $B$K(B $B$L(B $B$M(B $B$N(B $B$O(B
+$B$P(B $B$Q(B $B$R(B $B$S(B $B$T(B $B$U(B $B$V(B $B$W(B $B$X(B $B$Y(B $B$Z(B $B$[(B $B$\(B $B$](B $B$^(B $B$_(B
+$B$`(B $B$a(B $B$b(B $B$c(B $B$d(B $B$e(B $B$f(B $B$g(B $B$h(B $B$i(B $B$j(B $B$k(B $B$l(B $B$m(B $B$n(B $B$o(B
+$B$p(B $B$q(B $B$r(B $B$s(B
+ $B%!(B $B%"(B $B%#(B $B%$(B $B%%(B $B%&(B $B%'(B $B%((B $B%)(B $B%*(B $B%+(B $B%,(B $B%-(B $B%.(B $B%/(B
+$B%0(B $B%1(B $B%2(B $B%3(B $B%4(B $B%5(B $B%6(B $B%7(B $B%8(B $B%9(B $B%:(B $B%;(B $B%<(B $B%=(B $B%>(B $B%?(B
+$B%@(B $B%A(B $B%B(B $B%C(B $B%D(B $B%E(B $B%F(B $B%G(B $B%H(B $B%I(B $B%J(B $B%K(B $B%L(B $B%M(B $B%N(B $B%O(B
+$B%P(B $B%Q(B $B%R(B $B%S(B $B%T(B $B%U(B $B%V(B $B%W(B $B%X(B $B%Y(B $B%Z(B $B%[(B $B%\(B $B%](B $B%^(B $B%_(B
+$B%`(B $B%a(B $B%b(B $B%c(B $B%d(B $B%e(B $B%f(B $B%g(B $B%h(B $B%i(B $B%j(B $B%k(B $B%l(B $B%m(B $B%n(B $B%o(B
+$B%p(B $B%q(B $B%r(B $B%s(B $B%t(B $B%u(B $B%v(B
+ $B&!(B $B&"(B $B&#(B $B&$(B $B&%(B $B&&(B $B&'(B $B&((B $B&)(B $B&*(B $B&+(B $B&,(B $B&-(B $B&.(B $B&/(B
+$B&0(B $B&1(B $B&2(B $B&3(B $B&4(B $B&5(B $B&6(B $B&7(B $B&8(B
+ $B&A(B $B&B(B $B&C(B $B&D(B $B&E(B $B&F(B $B&G(B $B&H(B $B&I(B $B&J(B $B&K(B $B&L(B $B&M(B $B&N(B $B&O(B
+$B&P(B $B&Q(B $B&R(B $B&S(B $B&T(B $B&U(B $B&V(B $B&W(B $B&X(B
+ $B'!(B $B'"(B $B'#(B $B'$(B $B'%(B $B'&(B $B''(B $B'((B $B')(B $B'*(B $B'+(B $B',(B $B'-(B $B'.(B $B'/(B
+$B'0(B $B'1(B $B'2(B $B'3(B $B'4(B $B'5(B $B'6(B $B'7(B $B'8(B $B'9(B $B':(B $B';(B $B'<(B $B'=(B $B'>(B $B'?(B
+$B'@(B $B'A(B
+ $B'Q(B $B'R(B $B'S(B $B'T(B $B'U(B $B'V(B $B'W(B $B'X(B $B'Y(B $B'Z(B $B'[(B $B'\(B $B'](B $B'^(B $B'_(B
+$B'`(B $B'a(B $B'b(B $B'c(B $B'd(B $B'e(B $B'f(B $B'g(B $B'h(B $B'i(B $B'j(B $B'k(B $B'l(B $B'm(B $B'n(B $B'o(B
+$B'p(B $B'q(B
+ $B(!(B $B("(B $B(#(B $B($(B $B(%(B $B(&(B $B('(B $B(((B $B()(B $B(*(B $B(+(B $B(,(B $B(-(B $B(.(B $B(/(B
+$B(0(B $B(1(B $B(2(B $B(3(B $B(4(B $B(5(B $B(6(B $B(7(B $B(8(B $B(9(B $B(:(B $B(;(B $B(<(B $B(=(B $B(>(B $B(?(B
+$B(@(B
+ $B0!(B $B0"(B $B0#(B $B0$(B $B0%(B $B0&(B $B0'(B $B0((B $B0)(B $B0*(B $B0+(B $B0,(B $B0-(B $B0.(B $B0/(B
+$B00(B $B01(B $B02(B $B03(B $B04(B $B05(B $B06(B $B07(B $B08(B $B09(B $B0:(B $B0;(B $B0<(B $B0=(B $B0>(B $B0?(B
+$B0@(B $B0A(B $B0B(B $B0C(B $B0D(B $B0E(B $B0F(B $B0G(B $B0H(B $B0I(B $B0J(B $B0K(B $B0L(B $B0M(B $B0N(B $B0O(B
+$B0P(B $B0Q(B $B0R(B $B0S(B $B0T(B $B0U(B $B0V(B $B0W(B $B0X(B $B0Y(B $B0Z(B $B0[(B $B0\(B $B0](B $B0^(B $B0_(B
+$B0`(B $B0a(B $B0b(B $B0c(B $B0d(B $B0e(B $B0f(B $B0g(B $B0h(B $B0i(B $B0j(B $B0k(B $B0l(B $B0m(B $B0n(B $B0o(B
+$B0p(B $B0q(B $B0r(B $B0s(B $B0t(B $B0u(B $B0v(B $B0w(B $B0x(B $B0y(B $B0z(B $B0{(B $B0|(B $B0}(B $B0~(B
+ $B1!(B $B1"(B $B1#(B $B1$(B $B1%(B $B1&(B $B1'(B $B1((B $B1)(B $B1*(B $B1+(B $B1,(B $B1-(B $B1.(B $B1/(B
+$B10(B $B11(B $B12(B $B13(B $B14(B $B15(B $B16(B $B17(B $B18(B $B19(B $B1:(B $B1;(B $B1<(B $B1=(B $B1>(B $B1?(B
+$B1@(B $B1A(B $B1B(B $B1C(B $B1D(B $B1E(B $B1F(B $B1G(B $B1H(B $B1I(B $B1J(B $B1K(B $B1L(B $B1M(B $B1N(B $B1O(B
+$B1P(B $B1Q(B $B1R(B $B1S(B $B1T(B $B1U(B $B1V(B $B1W(B $B1X(B $B1Y(B $B1Z(B $B1[(B $B1\(B $B1](B $B1^(B $B1_(B
+$B1`(B $B1a(B $B1b(B $B1c(B $B1d(B $B1e(B $B1f(B $B1g(B $B1h(B $B1i(B $B1j(B $B1k(B $B1l(B $B1m(B $B1n(B $B1o(B
+$B1p(B $B1q(B $B1r(B $B1s(B $B1t(B $B1u(B $B1v(B $B1w(B $B1x(B $B1y(B $B1z(B $B1{(B $B1|(B $B1}(B $B1~(B
+ $B2!(B $B2"(B $B2#(B $B2$(B $B2%(B $B2&(B $B2'(B $B2((B $B2)(B $B2*(B $B2+(B $B2,(B $B2-(B $B2.(B $B2/(B
+$B20(B $B21(B $B22(B $B23(B $B24(B $B25(B $B26(B $B27(B $B28(B $B29(B $B2:(B $B2;(B $B2<(B $B2=(B $B2>(B $B2?(B
+$B2@(B $B2A(B $B2B(B $B2C(B $B2D(B $B2E(B $B2F(B $B2G(B $B2H(B $B2I(B $B2J(B $B2K(B $B2L(B $B2M(B $B2N(B $B2O(B
+$B2P(B $B2Q(B $B2R(B $B2S(B $B2T(B $B2U(B $B2V(B $B2W(B $B2X(B $B2Y(B $B2Z(B $B2[(B $B2\(B $B2](B $B2^(B $B2_(B
+$B2`(B $B2a(B $B2b(B $B2c(B $B2d(B $B2e(B $B2f(B $B2g(B $B2h(B $B2i(B $B2j(B $B2k(B $B2l(B $B2m(B $B2n(B $B2o(B
+$B2p(B $B2q(B $B2r(B $B2s(B $B2t(B $B2u(B $B2v(B $B2w(B $B2x(B $B2y(B $B2z(B $B2{(B $B2|(B $B2}(B $B2~(B
+ $B3!(B $B3"(B $B3#(B $B3$(B $B3%(B $B3&(B $B3'(B $B3((B $B3)(B $B3*(B $B3+(B $B3,(B $B3-(B $B3.(B $B3/(B
+$B30(B $B31(B $B32(B $B33(B $B34(B $B35(B $B36(B $B37(B $B38(B $B39(B $B3:(B $B3;(B $B3<(B $B3=(B $B3>(B $B3?(B
+$B3@(B $B3A(B $B3B(B $B3C(B $B3D(B $B3E(B $B3F(B $B3G(B $B3H(B $B3I(B $B3J(B $B3K(B $B3L(B $B3M(B $B3N(B $B3O(B
+$B3P(B $B3Q(B $B3R(B $B3S(B $B3T(B $B3U(B $B3V(B $B3W(B $B3X(B $B3Y(B $B3Z(B $B3[(B $B3\(B $B3](B $B3^(B $B3_(B
+$B3`(B $B3a(B $B3b(B $B3c(B $B3d(B $B3e(B $B3f(B $B3g(B $B3h(B $B3i(B $B3j(B $B3k(B $B3l(B $B3m(B $B3n(B $B3o(B
+$B3p(B $B3q(B $B3r(B $B3s(B $B3t(B $B3u(B $B3v(B $B3w(B $B3x(B $B3y(B $B3z(B $B3{(B $B3|(B $B3}(B $B3~(B
+ $B4!(B $B4"(B $B4#(B $B4$(B $B4%(B $B4&(B $B4'(B $B4((B $B4)(B $B4*(B $B4+(B $B4,(B $B4-(B $B4.(B $B4/(B
+$B40(B $B41(B $B42(B $B43(B $B44(B $B45(B $B46(B $B47(B $B48(B $B49(B $B4:(B $B4;(B $B4<(B $B4=(B $B4>(B $B4?(B
+$B4@(B $B4A(B $B4B(B $B4C(B $B4D(B $B4E(B $B4F(B $B4G(B $B4H(B $B4I(B $B4J(B $B4K(B $B4L(B $B4M(B $B4N(B $B4O(B
+$B4P(B $B4Q(B $B4R(B $B4S(B $B4T(B $B4U(B $B4V(B $B4W(B $B4X(B $B4Y(B $B4Z(B $B4[(B $B4\(B $B4](B $B4^(B $B4_(B
+$B4`(B $B4a(B $B4b(B $B4c(B $B4d(B $B4e(B $B4f(B $B4g(B $B4h(B $B4i(B $B4j(B $B4k(B $B4l(B $B4m(B $B4n(B $B4o(B
+$B4p(B $B4q(B $B4r(B $B4s(B $B4t(B $B4u(B $B4v(B $B4w(B $B4x(B $B4y(B $B4z(B $B4{(B $B4|(B $B4}(B $B4~(B
+ $B5!(B $B5"(B $B5#(B $B5$(B $B5%(B $B5&(B $B5'(B $B5((B $B5)(B $B5*(B $B5+(B $B5,(B $B5-(B $B5.(B $B5/(B
+$B50(B $B51(B $B52(B $B53(B $B54(B $B55(B $B56(B $B57(B $B58(B $B59(B $B5:(B $B5;(B $B5<(B $B5=(B $B5>(B $B5?(B
+$B5@(B $B5A(B $B5B(B $B5C(B $B5D(B $B5E(B $B5F(B $B5G(B $B5H(B $B5I(B $B5J(B $B5K(B $B5L(B $B5M(B $B5N(B $B5O(B
+$B5P(B $B5Q(B $B5R(B $B5S(B $B5T(B $B5U(B $B5V(B $B5W(B $B5X(B $B5Y(B $B5Z(B $B5[(B $B5\(B $B5](B $B5^(B $B5_(B
+$B5`(B $B5a(B $B5b(B $B5c(B $B5d(B $B5e(B $B5f(B $B5g(B $B5h(B $B5i(B $B5j(B $B5k(B $B5l(B $B5m(B $B5n(B $B5o(B
+$B5p(B $B5q(B $B5r(B $B5s(B $B5t(B $B5u(B $B5v(B $B5w(B $B5x(B $B5y(B $B5z(B $B5{(B $B5|(B $B5}(B $B5~(B
+ $B6!(B $B6"(B $B6#(B $B6$(B $B6%(B $B6&(B $B6'(B $B6((B $B6)(B $B6*(B $B6+(B $B6,(B $B6-(B $B6.(B $B6/(B
+$B60(B $B61(B $B62(B $B63(B $B64(B $B65(B $B66(B $B67(B $B68(B $B69(B $B6:(B $B6;(B $B6<(B $B6=(B $B6>(B $B6?(B
+$B6@(B $B6A(B $B6B(B $B6C(B $B6D(B $B6E(B $B6F(B $B6G(B $B6H(B $B6I(B $B6J(B $B6K(B $B6L(B $B6M(B $B6N(B $B6O(B
+$B6P(B $B6Q(B $B6R(B $B6S(B $B6T(B $B6U(B $B6V(B $B6W(B $B6X(B $B6Y(B $B6Z(B $B6[(B $B6\(B $B6](B $B6^(B $B6_(B
+$B6`(B $B6a(B $B6b(B $B6c(B $B6d(B $B6e(B $B6f(B $B6g(B $B6h(B $B6i(B $B6j(B $B6k(B $B6l(B $B6m(B $B6n(B $B6o(B
+$B6p(B $B6q(B $B6r(B $B6s(B $B6t(B $B6u(B $B6v(B $B6w(B $B6x(B $B6y(B $B6z(B $B6{(B $B6|(B $B6}(B $B6~(B
+ $B7!(B $B7"(B $B7#(B $B7$(B $B7%(B $B7&(B $B7'(B $B7((B $B7)(B $B7*(B $B7+(B $B7,(B $B7-(B $B7.(B $B7/(B
+$B70(B $B71(B $B72(B $B73(B $B74(B $B75(B $B76(B $B77(B $B78(B $B79(B $B7:(B $B7;(B $B7<(B $B7=(B $B7>(B $B7?(B
+$B7@(B $B7A(B $B7B(B $B7C(B $B7D(B $B7E(B $B7F(B $B7G(B $B7H(B $B7I(B $B7J(B $B7K(B $B7L(B $B7M(B $B7N(B $B7O(B
+$B7P(B $B7Q(B $B7R(B $B7S(B $B7T(B $B7U(B $B7V(B $B7W(B $B7X(B $B7Y(B $B7Z(B $B7[(B $B7\(B $B7](B $B7^(B $B7_(B
+$B7`(B $B7a(B $B7b(B $B7c(B $B7d(B $B7e(B $B7f(B $B7g(B $B7h(B $B7i(B $B7j(B $B7k(B $B7l(B $B7m(B $B7n(B $B7o(B
+$B7p(B $B7q(B $B7r(B $B7s(B $B7t(B $B7u(B $B7v(B $B7w(B $B7x(B $B7y(B $B7z(B $B7{(B $B7|(B $B7}(B $B7~(B
+ $B8!(B $B8"(B $B8#(B $B8$(B $B8%(B $B8&(B $B8'(B $B8((B $B8)(B $B8*(B $B8+(B $B8,(B $B8-(B $B8.(B $B8/(B
+$B80(B $B81(B $B82(B $B83(B $B84(B $B85(B $B86(B $B87(B $B88(B $B89(B $B8:(B $B8;(B $B8<(B $B8=(B $B8>(B $B8?(B
+$B8@(B $B8A(B $B8B(B $B8C(B $B8D(B $B8E(B $B8F(B $B8G(B $B8H(B $B8I(B $B8J(B $B8K(B $B8L(B $B8M(B $B8N(B $B8O(B
+$B8P(B $B8Q(B $B8R(B $B8S(B $B8T(B $B8U(B $B8V(B $B8W(B $B8X(B $B8Y(B $B8Z(B $B8[(B $B8\(B $B8](B $B8^(B $B8_(B
+$B8`(B $B8a(B $B8b(B $B8c(B $B8d(B $B8e(B $B8f(B $B8g(B $B8h(B $B8i(B $B8j(B $B8k(B $B8l(B $B8m(B $B8n(B $B8o(B
+$B8p(B $B8q(B $B8r(B $B8s(B $B8t(B $B8u(B $B8v(B $B8w(B $B8x(B $B8y(B $B8z(B $B8{(B $B8|(B $B8}(B $B8~(B
+ $B9!(B $B9"(B $B9#(B $B9$(B $B9%(B $B9&(B $B9'(B $B9((B $B9)(B $B9*(B $B9+(B $B9,(B $B9-(B $B9.(B $B9/(B
+$B90(B $B91(B $B92(B $B93(B $B94(B $B95(B $B96(B $B97(B $B98(B $B99(B $B9:(B $B9;(B $B9<(B $B9=(B $B9>(B $B9?(B
+$B9@(B $B9A(B $B9B(B $B9C(B $B9D(B $B9E(B $B9F(B $B9G(B $B9H(B $B9I(B $B9J(B $B9K(B $B9L(B $B9M(B $B9N(B $B9O(B
+$B9P(B $B9Q(B $B9R(B $B9S(B $B9T(B $B9U(B $B9V(B $B9W(B $B9X(B $B9Y(B $B9Z(B $B9[(B $B9\(B $B9](B $B9^(B $B9_(B
+$B9`(B $B9a(B $B9b(B $B9c(B $B9d(B $B9e(B $B9f(B $B9g(B $B9h(B $B9i(B $B9j(B $B9k(B $B9l(B $B9m(B $B9n(B $B9o(B
+$B9p(B $B9q(B $B9r(B $B9s(B $B9t(B $B9u(B $B9v(B $B9w(B $B9x(B $B9y(B $B9z(B $B9{(B $B9|(B $B9}(B $B9~(B
+ $B:!(B $B:"(B $B:#(B $B:$(B $B:%(B $B:&(B $B:'(B $B:((B $B:)(B $B:*(B $B:+(B $B:,(B $B:-(B $B:.(B $B:/(B
+$B:0(B $B:1(B $B:2(B $B:3(B $B:4(B $B:5(B $B:6(B $B:7(B $B:8(B $B:9(B $B::(B $B:;(B $B:<(B $B:=(B $B:>(B $B:?(B
+$B:@(B $B:A(B $B:B(B $B:C(B $B:D(B $B:E(B $B:F(B $B:G(B $B:H(B $B:I(B $B:J(B $B:K(B $B:L(B $B:M(B $B:N(B $B:O(B
+$B:P(B $B:Q(B $B:R(B $B:S(B $B:T(B $B:U(B $B:V(B $B:W(B $B:X(B $B:Y(B $B:Z(B $B:[(B $B:\(B $B:](B $B:^(B $B:_(B
+$B:`(B $B:a(B $B:b(B $B:c(B $B:d(B $B:e(B $B:f(B $B:g(B $B:h(B $B:i(B $B:j(B $B:k(B $B:l(B $B:m(B $B:n(B $B:o(B
+$B:p(B $B:q(B $B:r(B $B:s(B $B:t(B $B:u(B $B:v(B $B:w(B $B:x(B $B:y(B $B:z(B $B:{(B $B:|(B $B:}(B $B:~(B
+ $B;!(B $B;"(B $B;#(B $B;$(B $B;%(B $B;&(B $B;'(B $B;((B $B;)(B $B;*(B $B;+(B $B;,(B $B;-(B $B;.(B $B;/(B
+$B;0(B $B;1(B $B;2(B $B;3(B $B;4(B $B;5(B $B;6(B $B;7(B $B;8(B $B;9(B $B;:(B $B;;(B $B;<(B $B;=(B $B;>(B $B;?(B
+$B;@(B $B;A(B $B;B(B $B;C(B $B;D(B $B;E(B $B;F(B $B;G(B $B;H(B $B;I(B $B;J(B $B;K(B $B;L(B $B;M(B $B;N(B $B;O(B
+$B;P(B $B;Q(B $B;R(B $B;S(B $B;T(B $B;U(B $B;V(B $B;W(B $B;X(B $B;Y(B $B;Z(B $B;[(B $B;\(B $B;](B $B;^(B $B;_(B
+$B;`(B $B;a(B $B;b(B $B;c(B $B;d(B $B;e(B $B;f(B $B;g(B $B;h(B $B;i(B $B;j(B $B;k(B $B;l(B $B;m(B $B;n(B $B;o(B
+$B;p(B $B;q(B $B;r(B $B;s(B $B;t(B $B;u(B $B;v(B $B;w(B $B;x(B $B;y(B $B;z(B $B;{(B $B;|(B $B;}(B $B;~(B
+ $B<!(B $B<"(B $B<#(B $B<$(B $B<%(B $B<&(B $B<'(B $B<((B $B<)(B $B<*(B $B<+(B $B<,(B $B<-(B $B<.(B $B</(B
+$B<0(B $B<1(B $B<2(B $B<3(B $B<4(B $B<5(B $B<6(B $B<7(B $B<8(B $B<9(B $B<:(B $B<;(B $B<<(B $B<=(B $B<>(B $B<?(B
+$B<@(B $B<A(B $B<B(B $B<C(B $B<D(B $B<E(B $B<F(B $B<G(B $B<H(B $B<I(B $B<J(B $B<K(B $B<L(B $B<M(B $B<N(B $B<O(B
+$B<P(B $B<Q(B $B<R(B $B<S(B $B<T(B $B<U(B $B<V(B $B<W(B $B<X(B $B<Y(B $B<Z(B $B<[(B $B<\(B $B<](B $B<^(B $B<_(B
+$B<`(B $B<a(B $B<b(B $B<c(B $B<d(B $B<e(B $B<f(B $B<g(B $B<h(B $B<i(B $B<j(B $B<k(B $B<l(B $B<m(B $B<n(B $B<o(B
+$B<p(B $B<q(B $B<r(B $B<s(B $B<t(B $B<u(B $B<v(B $B<w(B $B<x(B $B<y(B $B<z(B $B<{(B $B<|(B $B<}(B $B<~(B
+ $B=!(B $B="(B $B=#(B $B=$(B $B=%(B $B=&(B $B='(B $B=((B $B=)(B $B=*(B $B=+(B $B=,(B $B=-(B $B=.(B $B=/(B
+$B=0(B $B=1(B $B=2(B $B=3(B $B=4(B $B=5(B $B=6(B $B=7(B $B=8(B $B=9(B $B=:(B $B=;(B $B=<(B $B==(B $B=>(B $B=?(B
+$B=@(B $B=A(B $B=B(B $B=C(B $B=D(B $B=E(B $B=F(B $B=G(B $B=H(B $B=I(B $B=J(B $B=K(B $B=L(B $B=M(B $B=N(B $B=O(B
+$B=P(B $B=Q(B $B=R(B $B=S(B $B=T(B $B=U(B $B=V(B $B=W(B $B=X(B $B=Y(B $B=Z(B $B=[(B $B=\(B $B=](B $B=^(B $B=_(B
+$B=`(B $B=a(B $B=b(B $B=c(B $B=d(B $B=e(B $B=f(B $B=g(B $B=h(B $B=i(B $B=j(B $B=k(B $B=l(B $B=m(B $B=n(B $B=o(B
+$B=p(B $B=q(B $B=r(B $B=s(B $B=t(B $B=u(B $B=v(B $B=w(B $B=x(B $B=y(B $B=z(B $B={(B $B=|(B $B=}(B $B=~(B
+ $B>!(B $B>"(B $B>#(B $B>$(B $B>%(B $B>&(B $B>'(B $B>((B $B>)(B $B>*(B $B>+(B $B>,(B $B>-(B $B>.(B $B>/(B
+$B>0(B $B>1(B $B>2(B $B>3(B $B>4(B $B>5(B $B>6(B $B>7(B $B>8(B $B>9(B $B>:(B $B>;(B $B><(B $B>=(B $B>>(B $B>?(B
+$B>@(B $B>A(B $B>B(B $B>C(B $B>D(B $B>E(B $B>F(B $B>G(B $B>H(B $B>I(B $B>J(B $B>K(B $B>L(B $B>M(B $B>N(B $B>O(B
+$B>P(B $B>Q(B $B>R(B $B>S(B $B>T(B $B>U(B $B>V(B $B>W(B $B>X(B $B>Y(B $B>Z(B $B>[(B $B>\(B $B>](B $B>^(B $B>_(B
+$B>`(B $B>a(B $B>b(B $B>c(B $B>d(B $B>e(B $B>f(B $B>g(B $B>h(B $B>i(B $B>j(B $B>k(B $B>l(B $B>m(B $B>n(B $B>o(B
+$B>p(B $B>q(B $B>r(B $B>s(B $B>t(B $B>u(B $B>v(B $B>w(B $B>x(B $B>y(B $B>z(B $B>{(B $B>|(B $B>}(B $B>~(B
+ $B?!(B $B?"(B $B?#(B $B?$(B $B?%(B $B?&(B $B?'(B $B?((B $B?)(B $B?*(B $B?+(B $B?,(B $B?-(B $B?.(B $B?/(B
+$B?0(B $B?1(B $B?2(B $B?3(B $B?4(B $B?5(B $B?6(B $B?7(B $B?8(B $B?9(B $B?:(B $B?;(B $B?<(B $B?=(B $B?>(B $B??(B
+$B?@(B $B?A(B $B?B(B $B?C(B $B?D(B $B?E(B $B?F(B $B?G(B $B?H(B $B?I(B $B?J(B $B?K(B $B?L(B $B?M(B $B?N(B $B?O(B
+$B?P(B $B?Q(B $B?R(B $B?S(B $B?T(B $B?U(B $B?V(B $B?W(B $B?X(B $B?Y(B $B?Z(B $B?[(B $B?\(B $B?](B $B?^(B $B?_(B
+$B?`(B $B?a(B $B?b(B $B?c(B $B?d(B $B?e(B $B?f(B $B?g(B $B?h(B $B?i(B $B?j(B $B?k(B $B?l(B $B?m(B $B?n(B $B?o(B
+$B?p(B $B?q(B $B?r(B $B?s(B $B?t(B $B?u(B $B?v(B $B?w(B $B?x(B $B?y(B $B?z(B $B?{(B $B?|(B $B?}(B $B?~(B
+ $B@!(B $B@"(B $B@#(B $B@$(B $B@%(B $B@&(B $B@'(B $B@((B $B@)(B $B@*(B $B@+(B $B@,(B $B@-(B $B@.(B $B@/(B
+$B@0(B $B@1(B $B@2(B $B@3(B $B@4(B $B@5(B $B@6(B $B@7(B $B@8(B $B@9(B $B@:(B $B@;(B $B@<(B $B@=(B $B@>(B $B@?(B
+$B@@(B $B@A(B $B@B(B $B@C(B $B@D(B $B@E(B $B@F(B $B@G(B $B@H(B $B@I(B $B@J(B $B@K(B $B@L(B $B@M(B $B@N(B $B@O(B
+$B@P(B $B@Q(B $B@R(B $B@S(B $B@T(B $B@U(B $B@V(B $B@W(B $B@X(B $B@Y(B $B@Z(B $B@[(B $B@\(B $B@](B $B@^(B $B@_(B
+$B@`(B $B@a(B $B@b(B $B@c(B $B@d(B $B@e(B $B@f(B $B@g(B $B@h(B $B@i(B $B@j(B $B@k(B $B@l(B $B@m(B $B@n(B $B@o(B
+$B@p(B $B@q(B $B@r(B $B@s(B $B@t(B $B@u(B $B@v(B $B@w(B $B@x(B $B@y(B $B@z(B $B@{(B $B@|(B $B@}(B $B@~(B
+ $BA!(B $BA"(B $BA#(B $BA$(B $BA%(B $BA&(B $BA'(B $BA((B $BA)(B $BA*(B $BA+(B $BA,(B $BA-(B $BA.(B $BA/(B
+$BA0(B $BA1(B $BA2(B $BA3(B $BA4(B $BA5(B $BA6(B $BA7(B $BA8(B $BA9(B $BA:(B $BA;(B $BA<(B $BA=(B $BA>(B $BA?(B
+$BA@(B $BAA(B $BAB(B $BAC(B $BAD(B $BAE(B $BAF(B $BAG(B $BAH(B $BAI(B $BAJ(B $BAK(B $BAL(B $BAM(B $BAN(B $BAO(B
+$BAP(B $BAQ(B $BAR(B $BAS(B $BAT(B $BAU(B $BAV(B $BAW(B $BAX(B $BAY(B $BAZ(B $BA[(B $BA\(B $BA](B $BA^(B $BA_(B
+$BA`(B $BAa(B $BAb(B $BAc(B $BAd(B $BAe(B $BAf(B $BAg(B $BAh(B $BAi(B $BAj(B $BAk(B $BAl(B $BAm(B $BAn(B $BAo(B
+$BAp(B $BAq(B $BAr(B $BAs(B $BAt(B $BAu(B $BAv(B $BAw(B $BAx(B $BAy(B $BAz(B $BA{(B $BA|(B $BA}(B $BA~(B
+ $BB!(B $BB"(B $BB#(B $BB$(B $BB%(B $BB&(B $BB'(B $BB((B $BB)(B $BB*(B $BB+(B $BB,(B $BB-(B $BB.(B $BB/(B
+$BB0(B $BB1(B $BB2(B $BB3(B $BB4(B $BB5(B $BB6(B $BB7(B $BB8(B $BB9(B $BB:(B $BB;(B $BB<(B $BB=(B $BB>(B $BB?(B
+$BB@(B $BBA(B $BBB(B $BBC(B $BBD(B $BBE(B $BBF(B $BBG(B $BBH(B $BBI(B $BBJ(B $BBK(B $BBL(B $BBM(B $BBN(B $BBO(B
+$BBP(B $BBQ(B $BBR(B $BBS(B $BBT(B $BBU(B $BBV(B $BBW(B $BBX(B $BBY(B $BBZ(B $BB[(B $BB\(B $BB](B $BB^(B $BB_(B
+$BB`(B $BBa(B $BBb(B $BBc(B $BBd(B $BBe(B $BBf(B $BBg(B $BBh(B $BBi(B $BBj(B $BBk(B $BBl(B $BBm(B $BBn(B $BBo(B
+$BBp(B $BBq(B $BBr(B $BBs(B $BBt(B $BBu(B $BBv(B $BBw(B $BBx(B $BBy(B $BBz(B $BB{(B $BB|(B $BB}(B $BB~(B
+ $BC!(B $BC"(B $BC#(B $BC$(B $BC%(B $BC&(B $BC'(B $BC((B $BC)(B $BC*(B $BC+(B $BC,(B $BC-(B $BC.(B $BC/(B
+$BC0(B $BC1(B $BC2(B $BC3(B $BC4(B $BC5(B $BC6(B $BC7(B $BC8(B $BC9(B $BC:(B $BC;(B $BC<(B $BC=(B $BC>(B $BC?(B
+$BC@(B $BCA(B $BCB(B $BCC(B $BCD(B $BCE(B $BCF(B $BCG(B $BCH(B $BCI(B $BCJ(B $BCK(B $BCL(B $BCM(B $BCN(B $BCO(B
+$BCP(B $BCQ(B $BCR(B $BCS(B $BCT(B $BCU(B $BCV(B $BCW(B $BCX(B $BCY(B $BCZ(B $BC[(B $BC\(B $BC](B $BC^(B $BC_(B
+$BC`(B $BCa(B $BCb(B $BCc(B $BCd(B $BCe(B $BCf(B $BCg(B $BCh(B $BCi(B $BCj(B $BCk(B $BCl(B $BCm(B $BCn(B $BCo(B
+$BCp(B $BCq(B $BCr(B $BCs(B $BCt(B $BCu(B $BCv(B $BCw(B $BCx(B $BCy(B $BCz(B $BC{(B $BC|(B $BC}(B $BC~(B
+ $BD!(B $BD"(B $BD#(B $BD$(B $BD%(B $BD&(B $BD'(B $BD((B $BD)(B $BD*(B $BD+(B $BD,(B $BD-(B $BD.(B $BD/(B
+$BD0(B $BD1(B $BD2(B $BD3(B $BD4(B $BD5(B $BD6(B $BD7(B $BD8(B $BD9(B $BD:(B $BD;(B $BD<(B $BD=(B $BD>(B $BD?(B
+$BD@(B $BDA(B $BDB(B $BDC(B $BDD(B $BDE(B $BDF(B $BDG(B $BDH(B $BDI(B $BDJ(B $BDK(B $BDL(B $BDM(B $BDN(B $BDO(B
+$BDP(B $BDQ(B $BDR(B $BDS(B $BDT(B $BDU(B $BDV(B $BDW(B $BDX(B $BDY(B $BDZ(B $BD[(B $BD\(B $BD](B $BD^(B $BD_(B
+$BD`(B $BDa(B $BDb(B $BDc(B $BDd(B $BDe(B $BDf(B $BDg(B $BDh(B $BDi(B $BDj(B $BDk(B $BDl(B $BDm(B $BDn(B $BDo(B
+$BDp(B $BDq(B $BDr(B $BDs(B $BDt(B $BDu(B $BDv(B $BDw(B $BDx(B $BDy(B $BDz(B $BD{(B $BD|(B $BD}(B $BD~(B
+ $BE!(B $BE"(B $BE#(B $BE$(B $BE%(B $BE&(B $BE'(B $BE((B $BE)(B $BE*(B $BE+(B $BE,(B $BE-(B $BE.(B $BE/(B
+$BE0(B $BE1(B $BE2(B $BE3(B $BE4(B $BE5(B $BE6(B $BE7(B $BE8(B $BE9(B $BE:(B $BE;(B $BE<(B $BE=(B $BE>(B $BE?(B
+$BE@(B $BEA(B $BEB(B $BEC(B $BED(B $BEE(B $BEF(B $BEG(B $BEH(B $BEI(B $BEJ(B $BEK(B $BEL(B $BEM(B $BEN(B $BEO(B
+$BEP(B $BEQ(B $BER(B $BES(B $BET(B $BEU(B $BEV(B $BEW(B $BEX(B $BEY(B $BEZ(B $BE[(B $BE\(B $BE](B $BE^(B $BE_(B
+$BE`(B $BEa(B $BEb(B $BEc(B $BEd(B $BEe(B $BEf(B $BEg(B $BEh(B $BEi(B $BEj(B $BEk(B $BEl(B $BEm(B $BEn(B $BEo(B
+$BEp(B $BEq(B $BEr(B $BEs(B $BEt(B $BEu(B $BEv(B $BEw(B $BEx(B $BEy(B $BEz(B $BE{(B $BE|(B $BE}(B $BE~(B
+ $BF!(B $BF"(B $BF#(B $BF$(B $BF%(B $BF&(B $BF'(B $BF((B $BF)(B $BF*(B $BF+(B $BF,(B $BF-(B $BF.(B $BF/(B
+$BF0(B $BF1(B $BF2(B $BF3(B $BF4(B $BF5(B $BF6(B $BF7(B $BF8(B $BF9(B $BF:(B $BF;(B $BF<(B $BF=(B $BF>(B $BF?(B
+$BF@(B $BFA(B $BFB(B $BFC(B $BFD(B $BFE(B $BFF(B $BFG(B $BFH(B $BFI(B $BFJ(B $BFK(B $BFL(B $BFM(B $BFN(B $BFO(B
+$BFP(B $BFQ(B $BFR(B $BFS(B $BFT(B $BFU(B $BFV(B $BFW(B $BFX(B $BFY(B $BFZ(B $BF[(B $BF\(B $BF](B $BF^(B $BF_(B
+$BF`(B $BFa(B $BFb(B $BFc(B $BFd(B $BFe(B $BFf(B $BFg(B $BFh(B $BFi(B $BFj(B $BFk(B $BFl(B $BFm(B $BFn(B $BFo(B
+$BFp(B $BFq(B $BFr(B $BFs(B $BFt(B $BFu(B $BFv(B $BFw(B $BFx(B $BFy(B $BFz(B $BF{(B $BF|(B $BF}(B $BF~(B
+ $BG!(B $BG"(B $BG#(B $BG$(B $BG%(B $BG&(B $BG'(B $BG((B $BG)(B $BG*(B $BG+(B $BG,(B $BG-(B $BG.(B $BG/(B
+$BG0(B $BG1(B $BG2(B $BG3(B $BG4(B $BG5(B $BG6(B $BG7(B $BG8(B $BG9(B $BG:(B $BG;(B $BG<(B $BG=(B $BG>(B $BG?(B
+$BG@(B $BGA(B $BGB(B $BGC(B $BGD(B $BGE(B $BGF(B $BGG(B $BGH(B $BGI(B $BGJ(B $BGK(B $BGL(B $BGM(B $BGN(B $BGO(B
+$BGP(B $BGQ(B $BGR(B $BGS(B $BGT(B $BGU(B $BGV(B $BGW(B $BGX(B $BGY(B $BGZ(B $BG[(B $BG\(B $BG](B $BG^(B $BG_(B
+$BG`(B $BGa(B $BGb(B $BGc(B $BGd(B $BGe(B $BGf(B $BGg(B $BGh(B $BGi(B $BGj(B $BGk(B $BGl(B $BGm(B $BGn(B $BGo(B
+$BGp(B $BGq(B $BGr(B $BGs(B $BGt(B $BGu(B $BGv(B $BGw(B $BGx(B $BGy(B $BGz(B $BG{(B $BG|(B $BG}(B $BG~(B
+ $BH!(B $BH"(B $BH#(B $BH$(B $BH%(B $BH&(B $BH'(B $BH((B $BH)(B $BH*(B $BH+(B $BH,(B $BH-(B $BH.(B $BH/(B
+$BH0(B $BH1(B $BH2(B $BH3(B $BH4(B $BH5(B $BH6(B $BH7(B $BH8(B $BH9(B $BH:(B $BH;(B $BH<(B $BH=(B $BH>(B $BH?(B
+$BH@(B $BHA(B $BHB(B $BHC(B $BHD(B $BHE(B $BHF(B $BHG(B $BHH(B $BHI(B $BHJ(B $BHK(B $BHL(B $BHM(B $BHN(B $BHO(B
+$BHP(B $BHQ(B $BHR(B $BHS(B $BHT(B $BHU(B $BHV(B $BHW(B $BHX(B $BHY(B $BHZ(B $BH[(B $BH\(B $BH](B $BH^(B $BH_(B
+$BH`(B $BHa(B $BHb(B $BHc(B $BHd(B $BHe(B $BHf(B $BHg(B $BHh(B $BHi(B $BHj(B $BHk(B $BHl(B $BHm(B $BHn(B $BHo(B
+$BHp(B $BHq(B $BHr(B $BHs(B $BHt(B $BHu(B $BHv(B $BHw(B $BHx(B $BHy(B $BHz(B $BH{(B $BH|(B $BH}(B $BH~(B
+ $BI!(B $BI"(B $BI#(B $BI$(B $BI%(B $BI&(B $BI'(B $BI((B $BI)(B $BI*(B $BI+(B $BI,(B $BI-(B $BI.(B $BI/(B
+$BI0(B $BI1(B $BI2(B $BI3(B $BI4(B $BI5(B $BI6(B $BI7(B $BI8(B $BI9(B $BI:(B $BI;(B $BI<(B $BI=(B $BI>(B $BI?(B
+$BI@(B $BIA(B $BIB(B $BIC(B $BID(B $BIE(B $BIF(B $BIG(B $BIH(B $BII(B $BIJ(B $BIK(B $BIL(B $BIM(B $BIN(B $BIO(B
+$BIP(B $BIQ(B $BIR(B $BIS(B $BIT(B $BIU(B $BIV(B $BIW(B $BIX(B $BIY(B $BIZ(B $BI[(B $BI\(B $BI](B $BI^(B $BI_(B
+$BI`(B $BIa(B $BIb(B $BIc(B $BId(B $BIe(B $BIf(B $BIg(B $BIh(B $BIi(B $BIj(B $BIk(B $BIl(B $BIm(B $BIn(B $BIo(B
+$BIp(B $BIq(B $BIr(B $BIs(B $BIt(B $BIu(B $BIv(B $BIw(B $BIx(B $BIy(B $BIz(B $BI{(B $BI|(B $BI}(B $BI~(B
+ $BJ!(B $BJ"(B $BJ#(B $BJ$(B $BJ%(B $BJ&(B $BJ'(B $BJ((B $BJ)(B $BJ*(B $BJ+(B $BJ,(B $BJ-(B $BJ.(B $BJ/(B
+$BJ0(B $BJ1(B $BJ2(B $BJ3(B $BJ4(B $BJ5(B $BJ6(B $BJ7(B $BJ8(B $BJ9(B $BJ:(B $BJ;(B $BJ<(B $BJ=(B $BJ>(B $BJ?(B
+$BJ@(B $BJA(B $BJB(B $BJC(B $BJD(B $BJE(B $BJF(B $BJG(B $BJH(B $BJI(B $BJJ(B $BJK(B $BJL(B $BJM(B $BJN(B $BJO(B
+$BJP(B $BJQ(B $BJR(B $BJS(B $BJT(B $BJU(B $BJV(B $BJW(B $BJX(B $BJY(B $BJZ(B $BJ[(B $BJ\(B $BJ](B $BJ^(B $BJ_(B
+$BJ`(B $BJa(B $BJb(B $BJc(B $BJd(B $BJe(B $BJf(B $BJg(B $BJh(B $BJi(B $BJj(B $BJk(B $BJl(B $BJm(B $BJn(B $BJo(B
+$BJp(B $BJq(B $BJr(B $BJs(B $BJt(B $BJu(B $BJv(B $BJw(B $BJx(B $BJy(B $BJz(B $BJ{(B $BJ|(B $BJ}(B $BJ~(B
+ $BK!(B $BK"(B $BK#(B $BK$(B $BK%(B $BK&(B $BK'(B $BK((B $BK)(B $BK*(B $BK+(B $BK,(B $BK-(B $BK.(B $BK/(B
+$BK0(B $BK1(B $BK2(B $BK3(B $BK4(B $BK5(B $BK6(B $BK7(B $BK8(B $BK9(B $BK:(B $BK;(B $BK<(B $BK=(B $BK>(B $BK?(B
+$BK@(B $BKA(B $BKB(B $BKC(B $BKD(B $BKE(B $BKF(B $BKG(B $BKH(B $BKI(B $BKJ(B $BKK(B $BKL(B $BKM(B $BKN(B $BKO(B
+$BKP(B $BKQ(B $BKR(B $BKS(B $BKT(B $BKU(B $BKV(B $BKW(B $BKX(B $BKY(B $BKZ(B $BK[(B $BK\(B $BK](B $BK^(B $BK_(B
+$BK`(B $BKa(B $BKb(B $BKc(B $BKd(B $BKe(B $BKf(B $BKg(B $BKh(B $BKi(B $BKj(B $BKk(B $BKl(B $BKm(B $BKn(B $BKo(B
+$BKp(B $BKq(B $BKr(B $BKs(B $BKt(B $BKu(B $BKv(B $BKw(B $BKx(B $BKy(B $BKz(B $BK{(B $BK|(B $BK}(B $BK~(B
+ $BL!(B $BL"(B $BL#(B $BL$(B $BL%(B $BL&(B $BL'(B $BL((B $BL)(B $BL*(B $BL+(B $BL,(B $BL-(B $BL.(B $BL/(B
+$BL0(B $BL1(B $BL2(B $BL3(B $BL4(B $BL5(B $BL6(B $BL7(B $BL8(B $BL9(B $BL:(B $BL;(B $BL<(B $BL=(B $BL>(B $BL?(B
+$BL@(B $BLA(B $BLB(B $BLC(B $BLD(B $BLE(B $BLF(B $BLG(B $BLH(B $BLI(B $BLJ(B $BLK(B $BLL(B $BLM(B $BLN(B $BLO(B
+$BLP(B $BLQ(B $BLR(B $BLS(B $BLT(B $BLU(B $BLV(B $BLW(B $BLX(B $BLY(B $BLZ(B $BL[(B $BL\(B $BL](B $BL^(B $BL_(B
+$BL`(B $BLa(B $BLb(B $BLc(B $BLd(B $BLe(B $BLf(B $BLg(B $BLh(B $BLi(B $BLj(B $BLk(B $BLl(B $BLm(B $BLn(B $BLo(B
+$BLp(B $BLq(B $BLr(B $BLs(B $BLt(B $BLu(B $BLv(B $BLw(B $BLx(B $BLy(B $BLz(B $BL{(B $BL|(B $BL}(B $BL~(B
+ $BM!(B $BM"(B $BM#(B $BM$(B $BM%(B $BM&(B $BM'(B $BM((B $BM)(B $BM*(B $BM+(B $BM,(B $BM-(B $BM.(B $BM/(B
+$BM0(B $BM1(B $BM2(B $BM3(B $BM4(B $BM5(B $BM6(B $BM7(B $BM8(B $BM9(B $BM:(B $BM;(B $BM<(B $BM=(B $BM>(B $BM?(B
+$BM@(B $BMA(B $BMB(B $BMC(B $BMD(B $BME(B $BMF(B $BMG(B $BMH(B $BMI(B $BMJ(B $BMK(B $BML(B $BMM(B $BMN(B $BMO(B
+$BMP(B $BMQ(B $BMR(B $BMS(B $BMT(B $BMU(B $BMV(B $BMW(B $BMX(B $BMY(B $BMZ(B $BM[(B $BM\(B $BM](B $BM^(B $BM_(B
+$BM`(B $BMa(B $BMb(B $BMc(B $BMd(B $BMe(B $BMf(B $BMg(B $BMh(B $BMi(B $BMj(B $BMk(B $BMl(B $BMm(B $BMn(B $BMo(B
+$BMp(B $BMq(B $BMr(B $BMs(B $BMt(B $BMu(B $BMv(B $BMw(B $BMx(B $BMy(B $BMz(B $BM{(B $BM|(B $BM}(B $BM~(B
+ $BN!(B $BN"(B $BN#(B $BN$(B $BN%(B $BN&(B $BN'(B $BN((B $BN)(B $BN*(B $BN+(B $BN,(B $BN-(B $BN.(B $BN/(B
+$BN0(B $BN1(B $BN2(B $BN3(B $BN4(B $BN5(B $BN6(B $BN7(B $BN8(B $BN9(B $BN:(B $BN;(B $BN<(B $BN=(B $BN>(B $BN?(B
+$BN@(B $BNA(B $BNB(B $BNC(B $BND(B $BNE(B $BNF(B $BNG(B $BNH(B $BNI(B $BNJ(B $BNK(B $BNL(B $BNM(B $BNN(B $BNO(B
+$BNP(B $BNQ(B $BNR(B $BNS(B $BNT(B $BNU(B $BNV(B $BNW(B $BNX(B $BNY(B $BNZ(B $BN[(B $BN\(B $BN](B $BN^(B $BN_(B
+$BN`(B $BNa(B $BNb(B $BNc(B $BNd(B $BNe(B $BNf(B $BNg(B $BNh(B $BNi(B $BNj(B $BNk(B $BNl(B $BNm(B $BNn(B $BNo(B
+$BNp(B $BNq(B $BNr(B $BNs(B $BNt(B $BNu(B $BNv(B $BNw(B $BNx(B $BNy(B $BNz(B $BN{(B $BN|(B $BN}(B $BN~(B
+ $BO!(B $BO"(B $BO#(B $BO$(B $BO%(B $BO&(B $BO'(B $BO((B $BO)(B $BO*(B $BO+(B $BO,(B $BO-(B $BO.(B $BO/(B
+$BO0(B $BO1(B $BO2(B $BO3(B $BO4(B $BO5(B $BO6(B $BO7(B $BO8(B $BO9(B $BO:(B $BO;(B $BO<(B $BO=(B $BO>(B $BO?(B
+$BO@(B $BOA(B $BOB(B $BOC(B $BOD(B $BOE(B $BOF(B $BOG(B $BOH(B $BOI(B $BOJ(B $BOK(B $BOL(B $BOM(B $BON(B $BOO(B
+$BOP(B $BOQ(B $BOR(B $BOS(B
+ $BP!(B $BP"(B $BP#(B $BP$(B $BP%(B $BP&(B $BP'(B $BP((B $BP)(B $BP*(B $BP+(B $BP,(B $BP-(B $BP.(B $BP/(B
+$BP0(B $BP1(B $BP2(B $BP3(B $BP4(B $BP5(B $BP6(B $BP7(B $BP8(B $BP9(B $BP:(B $BP;(B $BP<(B $BP=(B $BP>(B $BP?(B
+$BP@(B $BPA(B $BPB(B $BPC(B $BPD(B $BPE(B $BPF(B $BPG(B $BPH(B $BPI(B $BPJ(B $BPK(B $BPL(B $BPM(B $BPN(B $BPO(B
+$BPP(B $BPQ(B $BPR(B $BPS(B $BPT(B $BPU(B $BPV(B $BPW(B $BPX(B $BPY(B $BPZ(B $BP[(B $BP\(B $BP](B $BP^(B $BP_(B
+$BP`(B $BPa(B $BPb(B $BPc(B $BPd(B $BPe(B $BPf(B $BPg(B $BPh(B $BPi(B $BPj(B $BPk(B $BPl(B $BPm(B $BPn(B $BPo(B
+$BPp(B $BPq(B $BPr(B $BPs(B $BPt(B $BPu(B $BPv(B $BPw(B $BPx(B $BPy(B $BPz(B $BP{(B $BP|(B $BP}(B $BP~(B
+ $BQ!(B $BQ"(B $BQ#(B $BQ$(B $BQ%(B $BQ&(B $BQ'(B $BQ((B $BQ)(B $BQ*(B $BQ+(B $BQ,(B $BQ-(B $BQ.(B $BQ/(B
+$BQ0(B $BQ1(B $BQ2(B $BQ3(B $BQ4(B $BQ5(B $BQ6(B $BQ7(B $BQ8(B $BQ9(B $BQ:(B $BQ;(B $BQ<(B $BQ=(B $BQ>(B $BQ?(B
+$BQ@(B $BQA(B $BQB(B $BQC(B $BQD(B $BQE(B $BQF(B $BQG(B $BQH(B $BQI(B $BQJ(B $BQK(B $BQL(B $BQM(B $BQN(B $BQO(B
+$BQP(B $BQQ(B $BQR(B $BQS(B $BQT(B $BQU(B $BQV(B $BQW(B $BQX(B $BQY(B $BQZ(B $BQ[(B $BQ\(B $BQ](B $BQ^(B $BQ_(B
+$BQ`(B $BQa(B $BQb(B $BQc(B $BQd(B $BQe(B $BQf(B $BQg(B $BQh(B $BQi(B $BQj(B $BQk(B $BQl(B $BQm(B $BQn(B $BQo(B
+$BQp(B $BQq(B $BQr(B $BQs(B $BQt(B $BQu(B $BQv(B $BQw(B $BQx(B $BQy(B $BQz(B $BQ{(B $BQ|(B $BQ}(B $BQ~(B
+ $BR!(B $BR"(B $BR#(B $BR$(B $BR%(B $BR&(B $BR'(B $BR((B $BR)(B $BR*(B $BR+(B $BR,(B $BR-(B $BR.(B $BR/(B
+$BR0(B $BR1(B $BR2(B $BR3(B $BR4(B $BR5(B $BR6(B $BR7(B $BR8(B $BR9(B $BR:(B $BR;(B $BR<(B $BR=(B $BR>(B $BR?(B
+$BR@(B $BRA(B $BRB(B $BRC(B $BRD(B $BRE(B $BRF(B $BRG(B $BRH(B $BRI(B $BRJ(B $BRK(B $BRL(B $BRM(B $BRN(B $BRO(B
+$BRP(B $BRQ(B $BRR(B $BRS(B $BRT(B $BRU(B $BRV(B $BRW(B $BRX(B $BRY(B $BRZ(B $BR[(B $BR\(B $BR](B $BR^(B $BR_(B
+$BR`(B $BRa(B $BRb(B $BRc(B $BRd(B $BRe(B $BRf(B $BRg(B $BRh(B $BRi(B $BRj(B $BRk(B $BRl(B $BRm(B $BRn(B $BRo(B
+$BRp(B $BRq(B $BRr(B $BRs(B $BRt(B $BRu(B $BRv(B $BRw(B $BRx(B $BRy(B $BRz(B $BR{(B $BR|(B $BR}(B $BR~(B
+ $BS!(B $BS"(B $BS#(B $BS$(B $BS%(B $BS&(B $BS'(B $BS((B $BS)(B $BS*(B $BS+(B $BS,(B $BS-(B $BS.(B $BS/(B
+$BS0(B $BS1(B $BS2(B $BS3(B $BS4(B $BS5(B $BS6(B $BS7(B $BS8(B $BS9(B $BS:(B $BS;(B $BS<(B $BS=(B $BS>(B $BS?(B
+$BS@(B $BSA(B $BSB(B $BSC(B $BSD(B $BSE(B $BSF(B $BSG(B $BSH(B $BSI(B $BSJ(B $BSK(B $BSL(B $BSM(B $BSN(B $BSO(B
+$BSP(B $BSQ(B $BSR(B $BSS(B $BST(B $BSU(B $BSV(B $BSW(B $BSX(B $BSY(B $BSZ(B $BS[(B $BS\(B $BS](B $BS^(B $BS_(B
+$BS`(B $BSa(B $BSb(B $BSc(B $BSd(B $BSe(B $BSf(B $BSg(B $BSh(B $BSi(B $BSj(B $BSk(B $BSl(B $BSm(B $BSn(B $BSo(B
+$BSp(B $BSq(B $BSr(B $BSs(B $BSt(B $BSu(B $BSv(B $BSw(B $BSx(B $BSy(B $BSz(B $BS{(B $BS|(B $BS}(B $BS~(B
+ $BT!(B $BT"(B $BT#(B $BT$(B $BT%(B $BT&(B $BT'(B $BT((B $BT)(B $BT*(B $BT+(B $BT,(B $BT-(B $BT.(B $BT/(B
+$BT0(B $BT1(B $BT2(B $BT3(B $BT4(B $BT5(B $BT6(B $BT7(B $BT8(B $BT9(B $BT:(B $BT;(B $BT<(B $BT=(B $BT>(B $BT?(B
+$BT@(B $BTA(B $BTB(B $BTC(B $BTD(B $BTE(B $BTF(B $BTG(B $BTH(B $BTI(B $BTJ(B $BTK(B $BTL(B $BTM(B $BTN(B $BTO(B
+$BTP(B $BTQ(B $BTR(B $BTS(B $BTT(B $BTU(B $BTV(B $BTW(B $BTX(B $BTY(B $BTZ(B $BT[(B $BT\(B $BT](B $BT^(B $BT_(B
+$BT`(B $BTa(B $BTb(B $BTc(B $BTd(B $BTe(B $BTf(B $BTg(B $BTh(B $BTi(B $BTj(B $BTk(B $BTl(B $BTm(B $BTn(B $BTo(B
+$BTp(B $BTq(B $BTr(B $BTs(B $BTt(B $BTu(B $BTv(B $BTw(B $BTx(B $BTy(B $BTz(B $BT{(B $BT|(B $BT}(B $BT~(B
+ $BU!(B $BU"(B $BU#(B $BU$(B $BU%(B $BU&(B $BU'(B $BU((B $BU)(B $BU*(B $BU+(B $BU,(B $BU-(B $BU.(B $BU/(B
+$BU0(B $BU1(B $BU2(B $BU3(B $BU4(B $BU5(B $BU6(B $BU7(B $BU8(B $BU9(B $BU:(B $BU;(B $BU<(B $BU=(B $BU>(B $BU?(B
+$BU@(B $BUA(B $BUB(B $BUC(B $BUD(B $BUE(B $BUF(B $BUG(B $BUH(B $BUI(B $BUJ(B $BUK(B $BUL(B $BUM(B $BUN(B $BUO(B
+$BUP(B $BUQ(B $BUR(B $BUS(B $BUT(B $BUU(B $BUV(B $BUW(B $BUX(B $BUY(B $BUZ(B $BU[(B $BU\(B $BU](B $BU^(B $BU_(B
+$BU`(B $BUa(B $BUb(B $BUc(B $BUd(B $BUe(B $BUf(B $BUg(B $BUh(B $BUi(B $BUj(B $BUk(B $BUl(B $BUm(B $BUn(B $BUo(B
+$BUp(B $BUq(B $BUr(B $BUs(B $BUt(B $BUu(B $BUv(B $BUw(B $BUx(B $BUy(B $BUz(B $BU{(B $BU|(B $BU}(B $BU~(B
+ $BV!(B $BV"(B $BV#(B $BV$(B $BV%(B $BV&(B $BV'(B $BV((B $BV)(B $BV*(B $BV+(B $BV,(B $BV-(B $BV.(B $BV/(B
+$BV0(B $BV1(B $BV2(B $BV3(B $BV4(B $BV5(B $BV6(B $BV7(B $BV8(B $BV9(B $BV:(B $BV;(B $BV<(B $BV=(B $BV>(B $BV?(B
+$BV@(B $BVA(B $BVB(B $BVC(B $BVD(B $BVE(B $BVF(B $BVG(B $BVH(B $BVI(B $BVJ(B $BVK(B $BVL(B $BVM(B $BVN(B $BVO(B
+$BVP(B $BVQ(B $BVR(B $BVS(B $BVT(B $BVU(B $BVV(B $BVW(B $BVX(B $BVY(B $BVZ(B $BV[(B $BV\(B $BV](B $BV^(B $BV_(B
+$BV`(B $BVa(B $BVb(B $BVc(B $BVd(B $BVe(B $BVf(B $BVg(B $BVh(B $BVi(B $BVj(B $BVk(B $BVl(B $BVm(B $BVn(B $BVo(B
+$BVp(B $BVq(B $BVr(B $BVs(B $BVt(B $BVu(B $BVv(B $BVw(B $BVx(B $BVy(B $BVz(B $BV{(B $BV|(B $BV}(B $BV~(B
+ $BW!(B $BW"(B $BW#(B $BW$(B $BW%(B $BW&(B $BW'(B $BW((B $BW)(B $BW*(B $BW+(B $BW,(B $BW-(B $BW.(B $BW/(B
+$BW0(B $BW1(B $BW2(B $BW3(B $BW4(B $BW5(B $BW6(B $BW7(B $BW8(B $BW9(B $BW:(B $BW;(B $BW<(B $BW=(B $BW>(B $BW?(B
+$BW@(B $BWA(B $BWB(B $BWC(B $BWD(B $BWE(B $BWF(B $BWG(B $BWH(B $BWI(B $BWJ(B $BWK(B $BWL(B $BWM(B $BWN(B $BWO(B
+$BWP(B $BWQ(B $BWR(B $BWS(B $BWT(B $BWU(B $BWV(B $BWW(B $BWX(B $BWY(B $BWZ(B $BW[(B $BW\(B $BW](B $BW^(B $BW_(B
+$BW`(B $BWa(B $BWb(B $BWc(B $BWd(B $BWe(B $BWf(B $BWg(B $BWh(B $BWi(B $BWj(B $BWk(B $BWl(B $BWm(B $BWn(B $BWo(B
+$BWp(B $BWq(B $BWr(B $BWs(B $BWt(B $BWu(B $BWv(B $BWw(B $BWx(B $BWy(B $BWz(B $BW{(B $BW|(B $BW}(B $BW~(B
+ $BX!(B $BX"(B $BX#(B $BX$(B $BX%(B $BX&(B $BX'(B $BX((B $BX)(B $BX*(B $BX+(B $BX,(B $BX-(B $BX.(B $BX/(B
+$BX0(B $BX1(B $BX2(B $BX3(B $BX4(B $BX5(B $BX6(B $BX7(B $BX8(B $BX9(B $BX:(B $BX;(B $BX<(B $BX=(B $BX>(B $BX?(B
+$BX@(B $BXA(B $BXB(B $BXC(B $BXD(B $BXE(B $BXF(B $BXG(B $BXH(B $BXI(B $BXJ(B $BXK(B $BXL(B $BXM(B $BXN(B $BXO(B
+$BXP(B $BXQ(B $BXR(B $BXS(B $BXT(B $BXU(B $BXV(B $BXW(B $BXX(B $BXY(B $BXZ(B $BX[(B $BX\(B $BX](B $BX^(B $BX_(B
+$BX`(B $BXa(B $BXb(B $BXc(B $BXd(B $BXe(B $BXf(B $BXg(B $BXh(B $BXi(B $BXj(B $BXk(B $BXl(B $BXm(B $BXn(B $BXo(B
+$BXp(B $BXq(B $BXr(B $BXs(B $BXt(B $BXu(B $BXv(B $BXw(B $BXx(B $BXy(B $BXz(B $BX{(B $BX|(B $BX}(B $BX~(B
+ $BY!(B $BY"(B $BY#(B $BY$(B $BY%(B $BY&(B $BY'(B $BY((B $BY)(B $BY*(B $BY+(B $BY,(B $BY-(B $BY.(B $BY/(B
+$BY0(B $BY1(B $BY2(B $BY3(B $BY4(B $BY5(B $BY6(B $BY7(B $BY8(B $BY9(B $BY:(B $BY;(B $BY<(B $BY=(B $BY>(B $BY?(B
+$BY@(B $BYA(B $BYB(B $BYC(B $BYD(B $BYE(B $BYF(B $BYG(B $BYH(B $BYI(B $BYJ(B $BYK(B $BYL(B $BYM(B $BYN(B $BYO(B
+$BYP(B $BYQ(B $BYR(B $BYS(B $BYT(B $BYU(B $BYV(B $BYW(B $BYX(B $BYY(B $BYZ(B $BY[(B $BY\(B $BY](B $BY^(B $BY_(B
+$BY`(B $BYa(B $BYb(B $BYc(B $BYd(B $BYe(B $BYf(B $BYg(B $BYh(B $BYi(B $BYj(B $BYk(B $BYl(B $BYm(B $BYn(B $BYo(B
+$BYp(B $BYq(B $BYr(B $BYs(B $BYt(B $BYu(B $BYv(B $BYw(B $BYx(B $BYy(B $BYz(B $BY{(B $BY|(B $BY}(B $BY~(B
+ $BZ!(B $BZ"(B $BZ#(B $BZ$(B $BZ%(B $BZ&(B $BZ'(B $BZ((B $BZ)(B $BZ*(B $BZ+(B $BZ,(B $BZ-(B $BZ.(B $BZ/(B
+$BZ0(B $BZ1(B $BZ2(B $BZ3(B $BZ4(B $BZ5(B $BZ6(B $BZ7(B $BZ8(B $BZ9(B $BZ:(B $BZ;(B $BZ<(B $BZ=(B $BZ>(B $BZ?(B
+$BZ@(B $BZA(B $BZB(B $BZC(B $BZD(B $BZE(B $BZF(B $BZG(B $BZH(B $BZI(B $BZJ(B $BZK(B $BZL(B $BZM(B $BZN(B $BZO(B
+$BZP(B $BZQ(B $BZR(B $BZS(B $BZT(B $BZU(B $BZV(B $BZW(B $BZX(B $BZY(B $BZZ(B $BZ[(B $BZ\(B $BZ](B $BZ^(B $BZ_(B
+$BZ`(B $BZa(B $BZb(B $BZc(B $BZd(B $BZe(B $BZf(B $BZg(B $BZh(B $BZi(B $BZj(B $BZk(B $BZl(B $BZm(B $BZn(B $BZo(B
+$BZp(B $BZq(B $BZr(B $BZs(B $BZt(B $BZu(B $BZv(B $BZw(B $BZx(B $BZy(B $BZz(B $BZ{(B $BZ|(B $BZ}(B $BZ~(B
+ $B[!(B $B["(B $B[#(B $B[$(B $B[%(B $B[&(B $B['(B $B[((B $B[)(B $B[*(B $B[+(B $B[,(B $B[-(B $B[.(B $B[/(B
+$B[0(B $B[1(B $B[2(B $B[3(B $B[4(B $B[5(B $B[6(B $B[7(B $B[8(B $B[9(B $B[:(B $B[;(B $B[<(B $B[=(B $B[>(B $B[?(B
+$B[@(B $B[A(B $B[B(B $B[C(B $B[D(B $B[E(B $B[F(B $B[G(B $B[H(B $B[I(B $B[J(B $B[K(B $B[L(B $B[M(B $B[N(B $B[O(B
+$B[P(B $B[Q(B $B[R(B $B[S(B $B[T(B $B[U(B $B[V(B $B[W(B $B[X(B $B[Y(B $B[Z(B $B[[(B $B[\(B $B[](B $B[^(B $B[_(B
+$B[`(B $B[a(B $B[b(B $B[c(B $B[d(B $B[e(B $B[f(B $B[g(B $B[h(B $B[i(B $B[j(B $B[k(B $B[l(B $B[m(B $B[n(B $B[o(B
+$B[p(B $B[q(B $B[r(B $B[s(B $B[t(B $B[u(B $B[v(B $B[w(B $B[x(B $B[y(B $B[z(B $B[{(B $B[|(B $B[}(B $B[~(B
+ $B\!(B $B\"(B $B\#(B $B\$(B $B\%(B $B\&(B $B\'(B $B\((B $B\)(B $B\*(B $B\+(B $B\,(B $B\-(B $B\.(B $B\/(B
+$B\0(B $B\1(B $B\2(B $B\3(B $B\4(B $B\5(B $B\6(B $B\7(B $B\8(B $B\9(B $B\:(B $B\;(B $B\<(B $B\=(B $B\>(B $B\?(B
+$B\@(B $B\A(B $B\B(B $B\C(B $B\D(B $B\E(B $B\F(B $B\G(B $B\H(B $B\I(B $B\J(B $B\K(B $B\L(B $B\M(B $B\N(B $B\O(B
+$B\P(B $B\Q(B $B\R(B $B\S(B $B\T(B $B\U(B $B\V(B $B\W(B $B\X(B $B\Y(B $B\Z(B $B\[(B $B\\(B $B\](B $B\^(B $B\_(B
+$B\`(B $B\a(B $B\b(B $B\c(B $B\d(B $B\e(B $B\f(B $B\g(B $B\h(B $B\i(B $B\j(B $B\k(B $B\l(B $B\m(B $B\n(B $B\o(B
+$B\p(B $B\q(B $B\r(B $B\s(B $B\t(B $B\u(B $B\v(B $B\w(B $B\x(B $B\y(B $B\z(B $B\{(B $B\|(B $B\}(B $B\~(B
+ $B]!(B $B]"(B $B]#(B $B]$(B $B]%(B $B]&(B $B]'(B $B]((B $B])(B $B]*(B $B]+(B $B],(B $B]-(B $B].(B $B]/(B
+$B]0(B $B]1(B $B]2(B $B]3(B $B]4(B $B]5(B $B]6(B $B]7(B $B]8(B $B]9(B $B]:(B $B];(B $B]<(B $B]=(B $B]>(B $B]?(B
+$B]@(B $B]A(B $B]B(B $B]C(B $B]D(B $B]E(B $B]F(B $B]G(B $B]H(B $B]I(B $B]J(B $B]K(B $B]L(B $B]M(B $B]N(B $B]O(B
+$B]P(B $B]Q(B $B]R(B $B]S(B $B]T(B $B]U(B $B]V(B $B]W(B $B]X(B $B]Y(B $B]Z(B $B][(B $B]\(B $B]](B $B]^(B $B]_(B
+$B]`(B $B]a(B $B]b(B $B]c(B $B]d(B $B]e(B $B]f(B $B]g(B $B]h(B $B]i(B $B]j(B $B]k(B $B]l(B $B]m(B $B]n(B $B]o(B
+$B]p(B $B]q(B $B]r(B $B]s(B $B]t(B $B]u(B $B]v(B $B]w(B $B]x(B $B]y(B $B]z(B $B]{(B $B]|(B $B]}(B $B]~(B
+ $B^!(B $B^"(B $B^#(B $B^$(B $B^%(B $B^&(B $B^'(B $B^((B $B^)(B $B^*(B $B^+(B $B^,(B $B^-(B $B^.(B $B^/(B
+$B^0(B $B^1(B $B^2(B $B^3(B $B^4(B $B^5(B $B^6(B $B^7(B $B^8(B $B^9(B $B^:(B $B^;(B $B^<(B $B^=(B $B^>(B $B^?(B
+$B^@(B $B^A(B $B^B(B $B^C(B $B^D(B $B^E(B $B^F(B $B^G(B $B^H(B $B^I(B $B^J(B $B^K(B $B^L(B $B^M(B $B^N(B $B^O(B
+$B^P(B $B^Q(B $B^R(B $B^S(B $B^T(B $B^U(B $B^V(B $B^W(B $B^X(B $B^Y(B $B^Z(B $B^[(B $B^\(B $B^](B $B^^(B $B^_(B
+$B^`(B $B^a(B $B^b(B $B^c(B $B^d(B $B^e(B $B^f(B $B^g(B $B^h(B $B^i(B $B^j(B $B^k(B $B^l(B $B^m(B $B^n(B $B^o(B
+$B^p(B $B^q(B $B^r(B $B^s(B $B^t(B $B^u(B $B^v(B $B^w(B $B^x(B $B^y(B $B^z(B $B^{(B $B^|(B $B^}(B $B^~(B
+ $B_!(B $B_"(B $B_#(B $B_$(B $B_%(B $B_&(B $B_'(B $B_((B $B_)(B $B_*(B $B_+(B $B_,(B $B_-(B $B_.(B $B_/(B
+$B_0(B $B_1(B $B_2(B $B_3(B $B_4(B $B_5(B $B_6(B $B_7(B $B_8(B $B_9(B $B_:(B $B_;(B $B_<(B $B_=(B $B_>(B $B_?(B
+$B_@(B $B_A(B $B_B(B $B_C(B $B_D(B $B_E(B $B_F(B $B_G(B $B_H(B $B_I(B $B_J(B $B_K(B $B_L(B $B_M(B $B_N(B $B_O(B
+$B_P(B $B_Q(B $B_R(B $B_S(B $B_T(B $B_U(B $B_V(B $B_W(B $B_X(B $B_Y(B $B_Z(B $B_[(B $B_\(B $B_](B $B_^(B $B__(B
+$B_`(B $B_a(B $B_b(B $B_c(B $B_d(B $B_e(B $B_f(B $B_g(B $B_h(B $B_i(B $B_j(B $B_k(B $B_l(B $B_m(B $B_n(B $B_o(B
+$B_p(B $B_q(B $B_r(B $B_s(B $B_t(B $B_u(B $B_v(B $B_w(B $B_x(B $B_y(B $B_z(B $B_{(B $B_|(B $B_}(B $B_~(B
+ $B`!(B $B`"(B $B`#(B $B`$(B $B`%(B $B`&(B $B`'(B $B`((B $B`)(B $B`*(B $B`+(B $B`,(B $B`-(B $B`.(B $B`/(B
+$B`0(B $B`1(B $B`2(B $B`3(B $B`4(B $B`5(B $B`6(B $B`7(B $B`8(B $B`9(B $B`:(B $B`;(B $B`<(B $B`=(B $B`>(B $B`?(B
+$B`@(B $B`A(B $B`B(B $B`C(B $B`D(B $B`E(B $B`F(B $B`G(B $B`H(B $B`I(B $B`J(B $B`K(B $B`L(B $B`M(B $B`N(B $B`O(B
+$B`P(B $B`Q(B $B`R(B $B`S(B $B`T(B $B`U(B $B`V(B $B`W(B $B`X(B $B`Y(B $B`Z(B $B`[(B $B`\(B $B`](B $B`^(B $B`_(B
+$B``(B $B`a(B $B`b(B $B`c(B $B`d(B $B`e(B $B`f(B $B`g(B $B`h(B $B`i(B $B`j(B $B`k(B $B`l(B $B`m(B $B`n(B $B`o(B
+$B`p(B $B`q(B $B`r(B $B`s(B $B`t(B $B`u(B $B`v(B $B`w(B $B`x(B $B`y(B $B`z(B $B`{(B $B`|(B $B`}(B $B`~(B
+ $Ba!(B $Ba"(B $Ba#(B $Ba$(B $Ba%(B $Ba&(B $Ba'(B $Ba((B $Ba)(B $Ba*(B $Ba+(B $Ba,(B $Ba-(B $Ba.(B $Ba/(B
+$Ba0(B $Ba1(B $Ba2(B $Ba3(B $Ba4(B $Ba5(B $Ba6(B $Ba7(B $Ba8(B $Ba9(B $Ba:(B $Ba;(B $Ba<(B $Ba=(B $Ba>(B $Ba?(B
+$Ba@(B $BaA(B $BaB(B $BaC(B $BaD(B $BaE(B $BaF(B $BaG(B $BaH(B $BaI(B $BaJ(B $BaK(B $BaL(B $BaM(B $BaN(B $BaO(B
+$BaP(B $BaQ(B $BaR(B $BaS(B $BaT(B $BaU(B $BaV(B $BaW(B $BaX(B $BaY(B $BaZ(B $Ba[(B $Ba\(B $Ba](B $Ba^(B $Ba_(B
+$Ba`(B $Baa(B $Bab(B $Bac(B $Bad(B $Bae(B $Baf(B $Bag(B $Bah(B $Bai(B $Baj(B $Bak(B $Bal(B $Bam(B $Ban(B $Bao(B
+$Bap(B $Baq(B $Bar(B $Bas(B $Bat(B $Bau(B $Bav(B $Baw(B $Bax(B $Bay(B $Baz(B $Ba{(B $Ba|(B $Ba}(B $Ba~(B
+ $Bb!(B $Bb"(B $Bb#(B $Bb$(B $Bb%(B $Bb&(B $Bb'(B $Bb((B $Bb)(B $Bb*(B $Bb+(B $Bb,(B $Bb-(B $Bb.(B $Bb/(B
+$Bb0(B $Bb1(B $Bb2(B $Bb3(B $Bb4(B $Bb5(B $Bb6(B $Bb7(B $Bb8(B $Bb9(B $Bb:(B $Bb;(B $Bb<(B $Bb=(B $Bb>(B $Bb?(B
+$Bb@(B $BbA(B $BbB(B $BbC(B $BbD(B $BbE(B $BbF(B $BbG(B $BbH(B $BbI(B $BbJ(B $BbK(B $BbL(B $BbM(B $BbN(B $BbO(B
+$BbP(B $BbQ(B $BbR(B $BbS(B $BbT(B $BbU(B $BbV(B $BbW(B $BbX(B $BbY(B $BbZ(B $Bb[(B $Bb\(B $Bb](B $Bb^(B $Bb_(B
+$Bb`(B $Bba(B $Bbb(B $Bbc(B $Bbd(B $Bbe(B $Bbf(B $Bbg(B $Bbh(B $Bbi(B $Bbj(B $Bbk(B $Bbl(B $Bbm(B $Bbn(B $Bbo(B
+$Bbp(B $Bbq(B $Bbr(B $Bbs(B $Bbt(B $Bbu(B $Bbv(B $Bbw(B $Bbx(B $Bby(B $Bbz(B $Bb{(B $Bb|(B $Bb}(B $Bb~(B
+ $Bc!(B $Bc"(B $Bc#(B $Bc$(B $Bc%(B $Bc&(B $Bc'(B $Bc((B $Bc)(B $Bc*(B $Bc+(B $Bc,(B $Bc-(B $Bc.(B $Bc/(B
+$Bc0(B $Bc1(B $Bc2(B $Bc3(B $Bc4(B $Bc5(B $Bc6(B $Bc7(B $Bc8(B $Bc9(B $Bc:(B $Bc;(B $Bc<(B $Bc=(B $Bc>(B $Bc?(B
+$Bc@(B $BcA(B $BcB(B $BcC(B $BcD(B $BcE(B $BcF(B $BcG(B $BcH(B $BcI(B $BcJ(B $BcK(B $BcL(B $BcM(B $BcN(B $BcO(B
+$BcP(B $BcQ(B $BcR(B $BcS(B $BcT(B $BcU(B $BcV(B $BcW(B $BcX(B $BcY(B $BcZ(B $Bc[(B $Bc\(B $Bc](B $Bc^(B $Bc_(B
+$Bc`(B $Bca(B $Bcb(B $Bcc(B $Bcd(B $Bce(B $Bcf(B $Bcg(B $Bch(B $Bci(B $Bcj(B $Bck(B $Bcl(B $Bcm(B $Bcn(B $Bco(B
+$Bcp(B $Bcq(B $Bcr(B $Bcs(B $Bct(B $Bcu(B $Bcv(B $Bcw(B $Bcx(B $Bcy(B $Bcz(B $Bc{(B $Bc|(B $Bc}(B $Bc~(B
+ $Bd!(B $Bd"(B $Bd#(B $Bd$(B $Bd%(B $Bd&(B $Bd'(B $Bd((B $Bd)(B $Bd*(B $Bd+(B $Bd,(B $Bd-(B $Bd.(B $Bd/(B
+$Bd0(B $Bd1(B $Bd2(B $Bd3(B $Bd4(B $Bd5(B $Bd6(B $Bd7(B $Bd8(B $Bd9(B $Bd:(B $Bd;(B $Bd<(B $Bd=(B $Bd>(B $Bd?(B
+$Bd@(B $BdA(B $BdB(B $BdC(B $BdD(B $BdE(B $BdF(B $BdG(B $BdH(B $BdI(B $BdJ(B $BdK(B $BdL(B $BdM(B $BdN(B $BdO(B
+$BdP(B $BdQ(B $BdR(B $BdS(B $BdT(B $BdU(B $BdV(B $BdW(B $BdX(B $BdY(B $BdZ(B $Bd[(B $Bd\(B $Bd](B $Bd^(B $Bd_(B
+$Bd`(B $Bda(B $Bdb(B $Bdc(B $Bdd(B $Bde(B $Bdf(B $Bdg(B $Bdh(B $Bdi(B $Bdj(B $Bdk(B $Bdl(B $Bdm(B $Bdn(B $Bdo(B
+$Bdp(B $Bdq(B $Bdr(B $Bds(B $Bdt(B $Bdu(B $Bdv(B $Bdw(B $Bdx(B $Bdy(B $Bdz(B $Bd{(B $Bd|(B $Bd}(B $Bd~(B
+ $Be!(B $Be"(B $Be#(B $Be$(B $Be%(B $Be&(B $Be'(B $Be((B $Be)(B $Be*(B $Be+(B $Be,(B $Be-(B $Be.(B $Be/(B
+$Be0(B $Be1(B $Be2(B $Be3(B $Be4(B $Be5(B $Be6(B $Be7(B $Be8(B $Be9(B $Be:(B $Be;(B $Be<(B $Be=(B $Be>(B $Be?(B
+$Be@(B $BeA(B $BeB(B $BeC(B $BeD(B $BeE(B $BeF(B $BeG(B $BeH(B $BeI(B $BeJ(B $BeK(B $BeL(B $BeM(B $BeN(B $BeO(B
+$BeP(B $BeQ(B $BeR(B $BeS(B $BeT(B $BeU(B $BeV(B $BeW(B $BeX(B $BeY(B $BeZ(B $Be[(B $Be\(B $Be](B $Be^(B $Be_(B
+$Be`(B $Bea(B $Beb(B $Bec(B $Bed(B $Bee(B $Bef(B $Beg(B $Beh(B $Bei(B $Bej(B $Bek(B $Bel(B $Bem(B $Ben(B $Beo(B
+$Bep(B $Beq(B $Ber(B $Bes(B $Bet(B $Beu(B $Bev(B $Bew(B $Bex(B $Bey(B $Bez(B $Be{(B $Be|(B $Be}(B $Be~(B
+ $Bf!(B $Bf"(B $Bf#(B $Bf$(B $Bf%(B $Bf&(B $Bf'(B $Bf((B $Bf)(B $Bf*(B $Bf+(B $Bf,(B $Bf-(B $Bf.(B $Bf/(B
+$Bf0(B $Bf1(B $Bf2(B $Bf3(B $Bf4(B $Bf5(B $Bf6(B $Bf7(B $Bf8(B $Bf9(B $Bf:(B $Bf;(B $Bf<(B $Bf=(B $Bf>(B $Bf?(B
+$Bf@(B $BfA(B $BfB(B $BfC(B $BfD(B $BfE(B $BfF(B $BfG(B $BfH(B $BfI(B $BfJ(B $BfK(B $BfL(B $BfM(B $BfN(B $BfO(B
+$BfP(B $BfQ(B $BfR(B $BfS(B $BfT(B $BfU(B $BfV(B $BfW(B $BfX(B $BfY(B $BfZ(B $Bf[(B $Bf\(B $Bf](B $Bf^(B $Bf_(B
+$Bf`(B $Bfa(B $Bfb(B $Bfc(B $Bfd(B $Bfe(B $Bff(B $Bfg(B $Bfh(B $Bfi(B $Bfj(B $Bfk(B $Bfl(B $Bfm(B $Bfn(B $Bfo(B
+$Bfp(B $Bfq(B $Bfr(B $Bfs(B $Bft(B $Bfu(B $Bfv(B $Bfw(B $Bfx(B $Bfy(B $Bfz(B $Bf{(B $Bf|(B $Bf}(B $Bf~(B
+ $Bg!(B $Bg"(B $Bg#(B $Bg$(B $Bg%(B $Bg&(B $Bg'(B $Bg((B $Bg)(B $Bg*(B $Bg+(B $Bg,(B $Bg-(B $Bg.(B $Bg/(B
+$Bg0(B $Bg1(B $Bg2(B $Bg3(B $Bg4(B $Bg5(B $Bg6(B $Bg7(B $Bg8(B $Bg9(B $Bg:(B $Bg;(B $Bg<(B $Bg=(B $Bg>(B $Bg?(B
+$Bg@(B $BgA(B $BgB(B $BgC(B $BgD(B $BgE(B $BgF(B $BgG(B $BgH(B $BgI(B $BgJ(B $BgK(B $BgL(B $BgM(B $BgN(B $BgO(B
+$BgP(B $BgQ(B $BgR(B $BgS(B $BgT(B $BgU(B $BgV(B $BgW(B $BgX(B $BgY(B $BgZ(B $Bg[(B $Bg\(B $Bg](B $Bg^(B $Bg_(B
+$Bg`(B $Bga(B $Bgb(B $Bgc(B $Bgd(B $Bge(B $Bgf(B $Bgg(B $Bgh(B $Bgi(B $Bgj(B $Bgk(B $Bgl(B $Bgm(B $Bgn(B $Bgo(B
+$Bgp(B $Bgq(B $Bgr(B $Bgs(B $Bgt(B $Bgu(B $Bgv(B $Bgw(B $Bgx(B $Bgy(B $Bgz(B $Bg{(B $Bg|(B $Bg}(B $Bg~(B
+ $Bh!(B $Bh"(B $Bh#(B $Bh$(B $Bh%(B $Bh&(B $Bh'(B $Bh((B $Bh)(B $Bh*(B $Bh+(B $Bh,(B $Bh-(B $Bh.(B $Bh/(B
+$Bh0(B $Bh1(B $Bh2(B $Bh3(B $Bh4(B $Bh5(B $Bh6(B $Bh7(B $Bh8(B $Bh9(B $Bh:(B $Bh;(B $Bh<(B $Bh=(B $Bh>(B $Bh?(B
+$Bh@(B $BhA(B $BhB(B $BhC(B $BhD(B $BhE(B $BhF(B $BhG(B $BhH(B $BhI(B $BhJ(B $BhK(B $BhL(B $BhM(B $BhN(B $BhO(B
+$BhP(B $BhQ(B $BhR(B $BhS(B $BhT(B $BhU(B $BhV(B $BhW(B $BhX(B $BhY(B $BhZ(B $Bh[(B $Bh\(B $Bh](B $Bh^(B $Bh_(B
+$Bh`(B $Bha(B $Bhb(B $Bhc(B $Bhd(B $Bhe(B $Bhf(B $Bhg(B $Bhh(B $Bhi(B $Bhj(B $Bhk(B $Bhl(B $Bhm(B $Bhn(B $Bho(B
+$Bhp(B $Bhq(B $Bhr(B $Bhs(B $Bht(B $Bhu(B $Bhv(B $Bhw(B $Bhx(B $Bhy(B $Bhz(B $Bh{(B $Bh|(B $Bh}(B $Bh~(B
+ $Bi!(B $Bi"(B $Bi#(B $Bi$(B $Bi%(B $Bi&(B $Bi'(B $Bi((B $Bi)(B $Bi*(B $Bi+(B $Bi,(B $Bi-(B $Bi.(B $Bi/(B
+$Bi0(B $Bi1(B $Bi2(B $Bi3(B $Bi4(B $Bi5(B $Bi6(B $Bi7(B $Bi8(B $Bi9(B $Bi:(B $Bi;(B $Bi<(B $Bi=(B $Bi>(B $Bi?(B
+$Bi@(B $BiA(B $BiB(B $BiC(B $BiD(B $BiE(B $BiF(B $BiG(B $BiH(B $BiI(B $BiJ(B $BiK(B $BiL(B $BiM(B $BiN(B $BiO(B
+$BiP(B $BiQ(B $BiR(B $BiS(B $BiT(B $BiU(B $BiV(B $BiW(B $BiX(B $BiY(B $BiZ(B $Bi[(B $Bi\(B $Bi](B $Bi^(B $Bi_(B
+$Bi`(B $Bia(B $Bib(B $Bic(B $Bid(B $Bie(B $Bif(B $Big(B $Bih(B $Bii(B $Bij(B $Bik(B $Bil(B $Bim(B $Bin(B $Bio(B
+$Bip(B $Biq(B $Bir(B $Bis(B $Bit(B $Biu(B $Biv(B $Biw(B $Bix(B $Biy(B $Biz(B $Bi{(B $Bi|(B $Bi}(B $Bi~(B
+ $Bj!(B $Bj"(B $Bj#(B $Bj$(B $Bj%(B $Bj&(B $Bj'(B $Bj((B $Bj)(B $Bj*(B $Bj+(B $Bj,(B $Bj-(B $Bj.(B $Bj/(B
+$Bj0(B $Bj1(B $Bj2(B $Bj3(B $Bj4(B $Bj5(B $Bj6(B $Bj7(B $Bj8(B $Bj9(B $Bj:(B $Bj;(B $Bj<(B $Bj=(B $Bj>(B $Bj?(B
+$Bj@(B $BjA(B $BjB(B $BjC(B $BjD(B $BjE(B $BjF(B $BjG(B $BjH(B $BjI(B $BjJ(B $BjK(B $BjL(B $BjM(B $BjN(B $BjO(B
+$BjP(B $BjQ(B $BjR(B $BjS(B $BjT(B $BjU(B $BjV(B $BjW(B $BjX(B $BjY(B $BjZ(B $Bj[(B $Bj\(B $Bj](B $Bj^(B $Bj_(B
+$Bj`(B $Bja(B $Bjb(B $Bjc(B $Bjd(B $Bje(B $Bjf(B $Bjg(B $Bjh(B $Bji(B $Bjj(B $Bjk(B $Bjl(B $Bjm(B $Bjn(B $Bjo(B
+$Bjp(B $Bjq(B $Bjr(B $Bjs(B $Bjt(B $Bju(B $Bjv(B $Bjw(B $Bjx(B $Bjy(B $Bjz(B $Bj{(B $Bj|(B $Bj}(B $Bj~(B
+ $Bk!(B $Bk"(B $Bk#(B $Bk$(B $Bk%(B $Bk&(B $Bk'(B $Bk((B $Bk)(B $Bk*(B $Bk+(B $Bk,(B $Bk-(B $Bk.(B $Bk/(B
+$Bk0(B $Bk1(B $Bk2(B $Bk3(B $Bk4(B $Bk5(B $Bk6(B $Bk7(B $Bk8(B $Bk9(B $Bk:(B $Bk;(B $Bk<(B $Bk=(B $Bk>(B $Bk?(B
+$Bk@(B $BkA(B $BkB(B $BkC(B $BkD(B $BkE(B $BkF(B $BkG(B $BkH(B $BkI(B $BkJ(B $BkK(B $BkL(B $BkM(B $BkN(B $BkO(B
+$BkP(B $BkQ(B $BkR(B $BkS(B $BkT(B $BkU(B $BkV(B $BkW(B $BkX(B $BkY(B $BkZ(B $Bk[(B $Bk\(B $Bk](B $Bk^(B $Bk_(B
+$Bk`(B $Bka(B $Bkb(B $Bkc(B $Bkd(B $Bke(B $Bkf(B $Bkg(B $Bkh(B $Bki(B $Bkj(B $Bkk(B $Bkl(B $Bkm(B $Bkn(B $Bko(B
+$Bkp(B $Bkq(B $Bkr(B $Bks(B $Bkt(B $Bku(B $Bkv(B $Bkw(B $Bkx(B $Bky(B $Bkz(B $Bk{(B $Bk|(B $Bk}(B $Bk~(B
+ $Bl!(B $Bl"(B $Bl#(B $Bl$(B $Bl%(B $Bl&(B $Bl'(B $Bl((B $Bl)(B $Bl*(B $Bl+(B $Bl,(B $Bl-(B $Bl.(B $Bl/(B
+$Bl0(B $Bl1(B $Bl2(B $Bl3(B $Bl4(B $Bl5(B $Bl6(B $Bl7(B $Bl8(B $Bl9(B $Bl:(B $Bl;(B $Bl<(B $Bl=(B $Bl>(B $Bl?(B
+$Bl@(B $BlA(B $BlB(B $BlC(B $BlD(B $BlE(B $BlF(B $BlG(B $BlH(B $BlI(B $BlJ(B $BlK(B $BlL(B $BlM(B $BlN(B $BlO(B
+$BlP(B $BlQ(B $BlR(B $BlS(B $BlT(B $BlU(B $BlV(B $BlW(B $BlX(B $BlY(B $BlZ(B $Bl[(B $Bl\(B $Bl](B $Bl^(B $Bl_(B
+$Bl`(B $Bla(B $Blb(B $Blc(B $Bld(B $Ble(B $Blf(B $Blg(B $Blh(B $Bli(B $Blj(B $Blk(B $Bll(B $Blm(B $Bln(B $Blo(B
+$Blp(B $Blq(B $Blr(B $Bls(B $Blt(B $Blu(B $Blv(B $Blw(B $Blx(B $Bly(B $Blz(B $Bl{(B $Bl|(B $Bl}(B $Bl~(B
+ $Bm!(B $Bm"(B $Bm#(B $Bm$(B $Bm%(B $Bm&(B $Bm'(B $Bm((B $Bm)(B $Bm*(B $Bm+(B $Bm,(B $Bm-(B $Bm.(B $Bm/(B
+$Bm0(B $Bm1(B $Bm2(B $Bm3(B $Bm4(B $Bm5(B $Bm6(B $Bm7(B $Bm8(B $Bm9(B $Bm:(B $Bm;(B $Bm<(B $Bm=(B $Bm>(B $Bm?(B
+$Bm@(B $BmA(B $BmB(B $BmC(B $BmD(B $BmE(B $BmF(B $BmG(B $BmH(B $BmI(B $BmJ(B $BmK(B $BmL(B $BmM(B $BmN(B $BmO(B
+$BmP(B $BmQ(B $BmR(B $BmS(B $BmT(B $BmU(B $BmV(B $BmW(B $BmX(B $BmY(B $BmZ(B $Bm[(B $Bm\(B $Bm](B $Bm^(B $Bm_(B
+$Bm`(B $Bma(B $Bmb(B $Bmc(B $Bmd(B $Bme(B $Bmf(B $Bmg(B $Bmh(B $Bmi(B $Bmj(B $Bmk(B $Bml(B $Bmm(B $Bmn(B $Bmo(B
+$Bmp(B $Bmq(B $Bmr(B $Bms(B $Bmt(B $Bmu(B $Bmv(B $Bmw(B $Bmx(B $Bmy(B $Bmz(B $Bm{(B $Bm|(B $Bm}(B $Bm~(B
+ $Bn!(B $Bn"(B $Bn#(B $Bn$(B $Bn%(B $Bn&(B $Bn'(B $Bn((B $Bn)(B $Bn*(B $Bn+(B $Bn,(B $Bn-(B $Bn.(B $Bn/(B
+$Bn0(B $Bn1(B $Bn2(B $Bn3(B $Bn4(B $Bn5(B $Bn6(B $Bn7(B $Bn8(B $Bn9(B $Bn:(B $Bn;(B $Bn<(B $Bn=(B $Bn>(B $Bn?(B
+$Bn@(B $BnA(B $BnB(B $BnC(B $BnD(B $BnE(B $BnF(B $BnG(B $BnH(B $BnI(B $BnJ(B $BnK(B $BnL(B $BnM(B $BnN(B $BnO(B
+$BnP(B $BnQ(B $BnR(B $BnS(B $BnT(B $BnU(B $BnV(B $BnW(B $BnX(B $BnY(B $BnZ(B $Bn[(B $Bn\(B $Bn](B $Bn^(B $Bn_(B
+$Bn`(B $Bna(B $Bnb(B $Bnc(B $Bnd(B $Bne(B $Bnf(B $Bng(B $Bnh(B $Bni(B $Bnj(B $Bnk(B $Bnl(B $Bnm(B $Bnn(B $Bno(B
+$Bnp(B $Bnq(B $Bnr(B $Bns(B $Bnt(B $Bnu(B $Bnv(B $Bnw(B $Bnx(B $Bny(B $Bnz(B $Bn{(B $Bn|(B $Bn}(B $Bn~(B
+ $Bo!(B $Bo"(B $Bo#(B $Bo$(B $Bo%(B $Bo&(B $Bo'(B $Bo((B $Bo)(B $Bo*(B $Bo+(B $Bo,(B $Bo-(B $Bo.(B $Bo/(B
+$Bo0(B $Bo1(B $Bo2(B $Bo3(B $Bo4(B $Bo5(B $Bo6(B $Bo7(B $Bo8(B $Bo9(B $Bo:(B $Bo;(B $Bo<(B $Bo=(B $Bo>(B $Bo?(B
+$Bo@(B $BoA(B $BoB(B $BoC(B $BoD(B $BoE(B $BoF(B $BoG(B $BoH(B $BoI(B $BoJ(B $BoK(B $BoL(B $BoM(B $BoN(B $BoO(B
+$BoP(B $BoQ(B $BoR(B $BoS(B $BoT(B $BoU(B $BoV(B $BoW(B $BoX(B $BoY(B $BoZ(B $Bo[(B $Bo\(B $Bo](B $Bo^(B $Bo_(B
+$Bo`(B $Boa(B $Bob(B $Boc(B $Bod(B $Boe(B $Bof(B $Bog(B $Boh(B $Boi(B $Boj(B $Bok(B $Bol(B $Bom(B $Bon(B $Boo(B
+$Bop(B $Boq(B $Bor(B $Bos(B $Bot(B $Bou(B $Bov(B $Bow(B $Box(B $Boy(B $Boz(B $Bo{(B $Bo|(B $Bo}(B $Bo~(B
+ $Bp!(B $Bp"(B $Bp#(B $Bp$(B $Bp%(B $Bp&(B $Bp'(B $Bp((B $Bp)(B $Bp*(B $Bp+(B $Bp,(B $Bp-(B $Bp.(B $Bp/(B
+$Bp0(B $Bp1(B $Bp2(B $Bp3(B $Bp4(B $Bp5(B $Bp6(B $Bp7(B $Bp8(B $Bp9(B $Bp:(B $Bp;(B $Bp<(B $Bp=(B $Bp>(B $Bp?(B
+$Bp@(B $BpA(B $BpB(B $BpC(B $BpD(B $BpE(B $BpF(B $BpG(B $BpH(B $BpI(B $BpJ(B $BpK(B $BpL(B $BpM(B $BpN(B $BpO(B
+$BpP(B $BpQ(B $BpR(B $BpS(B $BpT(B $BpU(B $BpV(B $BpW(B $BpX(B $BpY(B $BpZ(B $Bp[(B $Bp\(B $Bp](B $Bp^(B $Bp_(B
+$Bp`(B $Bpa(B $Bpb(B $Bpc(B $Bpd(B $Bpe(B $Bpf(B $Bpg(B $Bph(B $Bpi(B $Bpj(B $Bpk(B $Bpl(B $Bpm(B $Bpn(B $Bpo(B
+$Bpp(B $Bpq(B $Bpr(B $Bps(B $Bpt(B $Bpu(B $Bpv(B $Bpw(B $Bpx(B $Bpy(B $Bpz(B $Bp{(B $Bp|(B $Bp}(B $Bp~(B
+ $Bq!(B $Bq"(B $Bq#(B $Bq$(B $Bq%(B $Bq&(B $Bq'(B $Bq((B $Bq)(B $Bq*(B $Bq+(B $Bq,(B $Bq-(B $Bq.(B $Bq/(B
+$Bq0(B $Bq1(B $Bq2(B $Bq3(B $Bq4(B $Bq5(B $Bq6(B $Bq7(B $Bq8(B $Bq9(B $Bq:(B $Bq;(B $Bq<(B $Bq=(B $Bq>(B $Bq?(B
+$Bq@(B $BqA(B $BqB(B $BqC(B $BqD(B $BqE(B $BqF(B $BqG(B $BqH(B $BqI(B $BqJ(B $BqK(B $BqL(B $BqM(B $BqN(B $BqO(B
+$BqP(B $BqQ(B $BqR(B $BqS(B $BqT(B $BqU(B $BqV(B $BqW(B $BqX(B $BqY(B $BqZ(B $Bq[(B $Bq\(B $Bq](B $Bq^(B $Bq_(B
+$Bq`(B $Bqa(B $Bqb(B $Bqc(B $Bqd(B $Bqe(B $Bqf(B $Bqg(B $Bqh(B $Bqi(B $Bqj(B $Bqk(B $Bql(B $Bqm(B $Bqn(B $Bqo(B
+$Bqp(B $Bqq(B $Bqr(B $Bqs(B $Bqt(B $Bqu(B $Bqv(B $Bqw(B $Bqx(B $Bqy(B $Bqz(B $Bq{(B $Bq|(B $Bq}(B $Bq~(B
+ $Br!(B $Br"(B $Br#(B $Br$(B $Br%(B $Br&(B $Br'(B $Br((B $Br)(B $Br*(B $Br+(B $Br,(B $Br-(B $Br.(B $Br/(B
+$Br0(B $Br1(B $Br2(B $Br3(B $Br4(B $Br5(B $Br6(B $Br7(B $Br8(B $Br9(B $Br:(B $Br;(B $Br<(B $Br=(B $Br>(B $Br?(B
+$Br@(B $BrA(B $BrB(B $BrC(B $BrD(B $BrE(B $BrF(B $BrG(B $BrH(B $BrI(B $BrJ(B $BrK(B $BrL(B $BrM(B $BrN(B $BrO(B
+$BrP(B $BrQ(B $BrR(B $BrS(B $BrT(B $BrU(B $BrV(B $BrW(B $BrX(B $BrY(B $BrZ(B $Br[(B $Br\(B $Br](B $Br^(B $Br_(B
+$Br`(B $Bra(B $Brb(B $Brc(B $Brd(B $Bre(B $Brf(B $Brg(B $Brh(B $Bri(B $Brj(B $Brk(B $Brl(B $Brm(B $Brn(B $Bro(B
+$Brp(B $Brq(B $Brr(B $Brs(B $Brt(B $Bru(B $Brv(B $Brw(B $Brx(B $Bry(B $Brz(B $Br{(B $Br|(B $Br}(B $Br~(B
+ $Bs!(B $Bs"(B $Bs#(B $Bs$(B $Bs%(B $Bs&(B $Bs'(B $Bs((B $Bs)(B $Bs*(B $Bs+(B $Bs,(B $Bs-(B $Bs.(B $Bs/(B
+$Bs0(B $Bs1(B $Bs2(B $Bs3(B $Bs4(B $Bs5(B $Bs6(B $Bs7(B $Bs8(B $Bs9(B $Bs:(B $Bs;(B $Bs<(B $Bs=(B $Bs>(B $Bs?(B
+$Bs@(B $BsA(B $BsB(B $BsC(B $BsD(B $BsE(B $BsF(B $BsG(B $BsH(B $BsI(B $BsJ(B $BsK(B $BsL(B $BsM(B $BsN(B $BsO(B
+$BsP(B $BsQ(B $BsR(B $BsS(B $BsT(B $BsU(B $BsV(B $BsW(B $BsX(B $BsY(B $BsZ(B $Bs[(B $Bs\(B $Bs](B $Bs^(B $Bs_(B
+$Bs`(B $Bsa(B $Bsb(B $Bsc(B $Bsd(B $Bse(B $Bsf(B $Bsg(B $Bsh(B $Bsi(B $Bsj(B $Bsk(B $Bsl(B $Bsm(B $Bsn(B $Bso(B
+$Bsp(B $Bsq(B $Bsr(B $Bss(B $Bst(B $Bsu(B $Bsv(B $Bsw(B $Bsx(B $Bsy(B $Bsz(B $Bs{(B $Bs|(B $Bs}(B $Bs~(B
+ $Bt!(B $Bt"(B $Bt#(B $Bt$(B $Bt%(B $Bt&(B
+
+JIS0123 ($BF|K\8l(B) $B$3$s$K$A$O(B
+ JIS -- $B855$(B $B3+H/(B
+ $B/export/Users/ianl/1.4.2/test/sun/nio/cs/SCCS/s.ISO2022JP.data0%G!<%?%Y!<%9$KAw$k$Y$-$G$J$$$3$H$KCmL\$7$F$/$@$5$$!#(B</p>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ISO8859x.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,105 @@
+/*
+ * 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 6419791
+ * @summary
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.util.*;
+import java.nio.charset.*;
+import java.nio.*;
+
+public class ISO8859x {
+ final static byte[] lowBytes = new byte[0xa0];
+ final static char[] lowChars = new char[0xa0];
+ final static String lowString;
+ static {
+ for (int i = 0; i < 0xa0; i++) {
+ lowBytes[i] = (byte) i;
+ lowChars[i] = (char) i;
+ }
+ lowString = new String(lowChars);
+ }
+
+ private static void testCharset(Charset cs) throws Throwable {
+ String csn = cs.name();
+ System.out.println(csn);
+
+ check(cs.canEncode());
+ check(Arrays.equals(lowString.getBytes(csn), lowBytes));
+ check(new String(lowBytes, csn).equals(lowString));
+
+ CharsetEncoder encoder = cs.newEncoder();
+ CharsetDecoder decoder = cs.newDecoder();
+ decoder.onUnmappableCharacter(CodingErrorAction.REPORT)
+ .onMalformedInput(CodingErrorAction.REPORT);
+ encoder.onUnmappableCharacter(CodingErrorAction.REPORT)
+ .onMalformedInput(CodingErrorAction.REPORT);
+
+ byte[] bytes = new byte[1];
+ for (int c = 0xa0; c < 0x100; c++) {
+ try {
+ bytes[0] = (byte) c;
+ char[] chars;
+ try { chars = decoder.decode(ByteBuffer.wrap(bytes)).array(); }
+ catch (UnmappableCharacterException x) { continue; }
+ equal(chars.length, 1);
+ byte[] bytes2 = encoder.encode(CharBuffer.wrap(chars)).array();
+ check(Arrays.equals(bytes2, bytes));
+ } catch (Throwable t) {
+ System.out.printf("cs=%s c=%02x%n", cs, c);
+ unexpected(t);
+ }
+ }
+ }
+
+ private static void realMain(String[] args) throws Throwable {
+ for (Map.Entry<String,Charset> e
+ : Charset.availableCharsets().entrySet()) {
+ String csn = e.getKey();
+ Charset cs = e.getValue();
+ if (csn.matches(".*(8859).*"))
+ try { testCharset(cs); }
+ catch (Throwable t) { unexpected(t); }
+ }
+ }
+
+ //--------------------- 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 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");}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/JISAutoDetectTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,158 @@
+/*
+ * 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 4087261 4184592
+ * @summary Make sure to determine Japanese text encoding as correctly
+ * as possible.
+ */
+
+import java.nio.charset.*;
+import java.nio.*;
+
+public class JISAutoDetectTest {
+
+ class TestData {
+ byte[] input;
+ byte[] input2; // for second call
+ String expectedCharset;
+ }
+ TestData[] data = new TestData[50];
+
+ public static void main(String[] argv) throws Exception {
+ JISAutoDetectTest test = new JISAutoDetectTest();
+ test.execute();
+ }
+
+ void execute() throws Exception {
+ CharBuffer output = CharBuffer.allocate(128);
+ CharBuffer expectedOutput = CharBuffer.allocate(128);
+
+ for (int i = 0; i < data.length; i++) {
+ if (data[i] == null)
+ break;
+
+ CharsetDecoder autoDetect = Charset.forName("JISAutoDetect").newDecoder();
+ CharsetDecoder dec = Charset.forName(data[i].expectedCharset).newDecoder();
+ CoderResult ncr, mcr;
+ output.clear();
+ expectedOutput.clear();
+ ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input),
+ output,
+ true);
+ mcr = dec.decode(ByteBuffer.wrap(data[i].input),
+ expectedOutput,
+ true);
+
+ if (data[i].input2 != null) {
+ ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input2),
+ output,
+ true);
+ mcr = dec.decode(ByteBuffer.wrap(data[i].input2),
+ expectedOutput,
+ true);
+ }
+ String testNumber = " (test#: " + i + ")";
+ if (ncr != mcr)
+ throw new Exception("JISAutoDetect returned a wrong result");
+ output.flip();
+ expectedOutput.flip();
+ if (output.limit() != expectedOutput.limit())
+ throw new Exception("JISAutoDetect returned a wrong length"+testNumber);
+
+ for (int x = 0; x < output.limit(); x++) {
+ if (expectedOutput.charAt(x) != output.charAt(x))
+ throw new Exception("JISAutoDetect returned a wrong string"+testNumber);
+ }
+ }
+ }
+
+ public JISAutoDetectTest() {
+ int i = 0;
+
+ // 0
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)'C', (byte)'o', (byte)'p', (byte)'y',
+ (byte)'r', (byte)'i', (byte)'g', (byte)'h',
+ (byte)'t', (byte)' ', (byte)0xa9, (byte)' ',
+ (byte)'1', (byte)'9', (byte)'9', (byte)'8' };
+ data[i].expectedCharset = "SJIS";
+
+ // 1
+ i++;
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+ (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 };
+ data[i].expectedCharset = "SJIS";
+
+ // 2
+ i++;
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde};
+ data[i].expectedCharset = "SJIS";
+
+ // 3
+ i++;
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd };
+ data[i].expectedCharset = "SJIS";
+
+ // 4
+ i++;
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa };
+ data[i].expectedCharset = "SJIS";
+
+ // 5
+ i++;
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9,
+ (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca };
+ data[i].expectedCharset = "EUC_JP";
+
+ // 6
+ i++;
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+ (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 };
+ data[i].expectedCharset = "EUC_JP";
+
+ // 7 (for 4184592)
+ i++;
+ data[i] = new TestData();
+ data[i].input = new byte[] { (byte)'a', (byte)'b', (byte)'c' };
+ data[i].input2 = new byte[] { (byte)0x1b, (byte)'$', (byte)'B',
+ (byte)'#', (byte)'4', (byte)'$', (byte)'5',
+ (byte)0x1b, (byte)'(', (byte)'B' };
+ data[i].expectedCharset = "ISO2022JP";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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 4658679 4879644
+ @summary Checks replacement logic within EUC-TW decoder
+*/
+
+/*
+ * Tests goodness of fix for bugID 4658679: EUC-TW decoder should
+ * perform replacement when it encounters latin chars outside the
+ * normal US-ASCII range. For example: Isolated occurrences of
+ * French accented chars. See bugID: 4658679.
+ */
+import java.io.*;
+public class LatinCharReplacementTWTest {
+ public static void main(String[] args) throws Exception {
+ final String bugID = "4658679";
+ // Attempt to decode
+ byte[] input = { (byte)0xa1,
+ (byte)0xf0,
+ (byte)'r',
+ (byte)'e',
+ (byte)'s',
+ (byte)0xe9, // illegal within EUC-TW
+ (byte)'r',
+ (byte)'v',
+ (byte)0xe9, // illegal within EUC-TW
+ (byte)'s',
+ (byte)0xa2,
+ (byte)0xf8
+ };
+
+ char[] expected = { (char) 0xa7,
+ (char) 'r',
+ (char) 'e',
+ (char) 's',
+ (char) 0xFFFD, // replacement for accented lowercase e
+ (char) 'r',
+ (char) 'v',
+ (char) 0xFFFD, // replacement for accented lowercase e
+ (char) 's',
+ (char) 0xb0 };
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(input);
+ InputStreamReader isr = new InputStreamReader(bais, "x-EUC-TW");
+
+ char[] decoded = new char[128];
+ int numChars = isr.read(decoded);
+
+ if (numChars != expected.length) {
+ throw new Exception("failure of test for bug " + bugID);
+ }
+
+ for (int i = 0 ; i < numChars; i++) {
+ if (decoded[i] != expected[i])
+ throw new Exception("failure of test for bug " + bugID);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/LeftOverSurrogate.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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 4160949
+ @summary Verify that left over high surrogate does not
+ cause an UnknownCharacterException when substitutition mode is turned on.
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class LeftOverSurrogate {
+
+ public static void main(String args[]) throws Exception {
+ String s = "abc\uD800\uDC00qrst"; // Valid surrogate
+ char[] c = s.toCharArray();
+ CharsetEncoder enc = Charset.forName("ISO8859_1").newEncoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE);
+ /* Process the first 4 characters, including the high surrogate
+ which should be stored */
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ CharBuffer cb = CharBuffer.wrap(c);
+ cb.limit(4);
+ enc.encode(cb, bb, false);
+ cb.limit(7);
+ enc.encode(cb, bb, true);
+ byte[] first = bb.array();
+ for(int i = 0; i < 7; i++)
+ System.err.printf("[%d]=%d was %d\n",
+ i,
+ (int) first[i] &0xffff,
+ (int) c[i] & 0xffff);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/MalformedSurrogates.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * 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 4153987
+ @summary Malformed surrogates should be handled by the converter in
+ substitution mode.
+ */
+
+import java.io.*;
+
+public class MalformedSurrogates {
+
+ public static void main(String[] args) throws Exception {
+
+ String fe = System.getProperty("file.encoding");
+ if ( fe.equalsIgnoreCase("UTF8")
+ || fe.equalsIgnoreCase("UTF-8")
+ || fe.equalsIgnoreCase("UTF_8"))
+ // This test is meaningless if the default charset
+ // does handle surrogates
+ return;
+
+ System.out.println("Testing string conversion...");
+ /* Example with malformed surrogate, and an offset */
+ String t = "abc\uD800\uDB00efgh";
+ String t2 = t.substring(2);
+ byte[] b = t2.getBytes();
+ System.err.println(b.length);
+ for (int i = 0; i < b.length; i++)
+ System.err.println("[" + i + "]" + "=" + (char) b[i]
+ + "=" + (int) b[i]);
+ if (b.length != 7) {
+ throw new Exception("Bad string conversion for bad surrogate");
+ }
+
+ /* Example with a proper surrogate, no offset. Always worked */
+ String t3 = "abc\uD800\uDC00efgh";
+ byte[] b2 = t3.getBytes();
+ System.out.println(b2.length);
+ for(int i = 0; i < b2.length; i++)
+ System.err.println("[" + i + "]" + "=" + (char) b2[i]);
+ if (b2.length != 8) {
+ throw new Exception("Bad string conversion for good surrogate");
+ }
+
+ OutputStream os = new ByteArrayOutputStream();
+ OutputStreamWriter osw = new OutputStreamWriter(os);
+ System.out.println("Testing flush....");
+ /* Check for the case where the converter has a left over
+ high surrogate when flush is called on the converter */
+ osw.flush();
+ String s = "abc\uD800"; // High surrogate
+ char[] c = s.toCharArray();
+ osw.write(s, 0, 4);
+ osw.flush();
+
+ System.out.println("Testing convert...");
+ /* Verify that all other characters go through */
+ for (int k = 1; k < 65535 ; k++) {
+ osw.write("Char[" + k + "]=\"" + ((char) k) + "\"");
+ }
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,282 @@
+/*
+ * 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 4831163 5053096 5056440
+ * @summary NIO charset basic verification of JISAutodetect decoder
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CoderResult;
+import static java.lang.System.*;
+
+public class NIOJISAutoDetectTest {
+ private static int failures = 0;
+
+ private static void fail(String failureMsg) {
+ System.out.println(failureMsg);
+ failures++;
+ }
+
+ private static void check(boolean cond, String msg) {
+ if (!cond) {
+ fail("test failed: " + msg);
+ new Exception().printStackTrace();
+ }
+ }
+
+ private static String SJISName() throws Exception {
+ return detectingCharset(new byte[] {(byte)0xbb, (byte)0xdd,
+ (byte)0xcf, (byte)0xb2});
+ }
+
+ private static String EUCJName() throws Exception {
+ return detectingCharset(new byte[] {(byte)0xa4, (byte)0xd2,
+ (byte)0xa4, (byte)0xe9});
+ }
+
+ private static String detectingCharset(byte[] bytes) throws Exception {
+ //----------------------------------------------------------------
+ // Test special public methods of CharsetDecoder while we're here
+ //----------------------------------------------------------------
+ CharsetDecoder cd = Charset.forName("JISAutodetect").newDecoder();
+ check(cd.isAutoDetecting(), "isAutodecting()");
+ check(! cd.isCharsetDetected(), "isCharsetDetected");
+ cd.decode(ByteBuffer.wrap(new byte[] {(byte)'A'}));
+ check(! cd.isCharsetDetected(), "isCharsetDetected");
+ try {
+ cd.detectedCharset();
+ fail("no IllegalStateException");
+ } catch (IllegalStateException e) {}
+ cd.decode(ByteBuffer.wrap(bytes));
+ check(cd.isCharsetDetected(), "isCharsetDetected");
+ Charset cs = cd.detectedCharset();
+ check(cs != null, "cs != null");
+ check(! cs.newDecoder().isAutoDetecting(), "isAutodetecting()");
+ return cs.name();
+ }
+
+ public static void main(String[] argv) throws Exception {
+ //----------------------------------------------------------------
+ // Used to throw BufferOverflowException
+ //----------------------------------------------------------------
+ out.println(new String(new byte[] {0x61}, "JISAutoDetect"));
+
+ //----------------------------------------------------------------
+ // InputStreamReader(...JISAutoDetect) used to infloop
+ //----------------------------------------------------------------
+ {
+ byte[] bytes = "ABCD\n".getBytes();
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+ InputStreamReader isr = new InputStreamReader(bais, "JISAutoDetect");
+ BufferedReader reader = new BufferedReader(isr);
+ check (reader.readLine().equals("ABCD"), "first read gets text");
+ // used to return "ABCD" on second and subsequent reads
+ check (reader.readLine() == null, "second read gets null");
+ }
+
+ //----------------------------------------------------------------
+ // Check all Japanese chars for sanity
+ //----------------------------------------------------------------
+ String SJIS = SJISName();
+ String EUCJ = EUCJName();
+ out.printf("SJIS charset is %s%n", SJIS);
+ out.printf("EUCJ charset is %s%n", EUCJ);
+
+ int cnt2022 = 0;
+ int cnteucj = 0;
+ int cntsjis = 0;
+ int cntBAD = 0;
+ for (char c = '\u0000'; c < '\uffff'; c++) {
+ if (c == '\u001b' || // ESC
+ c == '\u2014') // Em-Dash?
+ continue;
+ String s = new String (new char[] {c});
+
+ //----------------------------------------------------------------
+ // JISAutoDetect can handle all chars that EUC-JP can,
+ // unless there is an ambiguity with SJIS.
+ //----------------------------------------------------------------
+ byte[] beucj = s.getBytes(EUCJ);
+ String seucj = new String(beucj, EUCJ);
+ if (seucj.equals(s)) {
+ cnteucj++;
+ String sauto = new String(beucj, "JISAutoDetect");
+
+ if (! sauto.equals(seucj)) {
+ cntBAD++;
+ String ssjis = new String(beucj, SJIS);
+ if (! sauto.equals(ssjis)) {
+ fail("Autodetection agrees with neither EUC nor SJIS");
+ }
+ }
+ } else
+ continue; // Optimization
+
+ //----------------------------------------------------------------
+ // JISAutoDetect can handle all chars that ISO-2022-JP can.
+ //----------------------------------------------------------------
+ byte[] b2022 = s.getBytes("ISO-2022-JP");
+ if (new String(b2022, "ISO-2022-JP").equals(s)) {
+ cnt2022++;
+ check(new String(b2022,"JISAutoDetect").equals(s),
+ "ISO2022 autodetection");
+ }
+
+ //----------------------------------------------------------------
+ // JISAutoDetect can handle almost all chars that SJIS can.
+ //----------------------------------------------------------------
+ byte[] bsjis = s.getBytes(SJIS);
+ if (new String(bsjis, SJIS).equals(s)) {
+ cntsjis++;
+ check(new String(bsjis,"JISAutoDetect").equals(s),
+ "SJIS autodetection");
+ }
+ }
+ out.printf("There are %d ISO-2022-JP-encodable characters.%n", cnt2022);
+ out.printf("There are %d SJIS-encodable characters.%n", cntsjis);
+ out.printf("There are %d EUC-JP-encodable characters.%n", cnteucj);
+ out.printf("There are %d characters that are " +
+ "misdetected as SJIS after being EUC-encoded.%n", cntBAD);
+
+
+ //----------------------------------------------------------------
+ // tests for specific byte sequences
+ //----------------------------------------------------------------
+ test("ISO-2022-JP", new byte[] {'A', 'B', 'C'});
+ test("EUC-JP", new byte[] {'A', 'B', 'C'});
+ test("SJIS", new byte[] {'A', 'B', 'C'});
+
+ test("SJIS",
+ new byte[] { 'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't',
+ ' ', (byte)0xa9, ' ', '1', '9', '9', '8' });
+
+ test("SJIS",
+ new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+ (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 });
+
+ test("EUC-JP",
+ new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9,
+ (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca });
+
+ test("SJIS",
+ new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde});
+
+ test("SJIS",
+ new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd });
+
+ test("SJIS",
+ new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa });
+
+ test("EUC-JP",
+ new byte[] { (byte)0x8f, (byte)0xc5, (byte)0xe0, (byte)0x20});
+
+ test("EUC-JP",
+ new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+ (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+ (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+ (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 });
+
+ test("ISO-2022-JP",
+ new byte[] { 0x1b, '$', 'B', '#', '4', '$', '5', 0x1b, '(', 'B' });
+
+
+ //----------------------------------------------------------------
+ // Check handling of ambiguous end-of-input in middle of first char
+ //----------------------------------------------------------------
+ {
+ CharsetDecoder dc = Charset.forName("x-JISAutoDetect").newDecoder();
+ ByteBuffer bb = ByteBuffer.allocate(128);
+ CharBuffer cb = CharBuffer.allocate(128);
+ bb.put((byte)'A').put((byte)0x8f);
+ bb.flip();
+ CoderResult res = dc.decode(bb,cb,false);
+ check(res.isUnderflow(), "isUnderflow");
+ check(bb.position() == 1, "bb.position()");
+ check(cb.position() == 1, "cb.position()");
+ res = dc.decode(bb,cb,false);
+ check(res.isUnderflow(), "isUnderflow");
+ check(bb.position() == 1, "bb.position()");
+ check(cb.position() == 1, "cb.position()");
+ bb.compact();
+ bb.put((byte)0xa1);
+ bb.flip();
+ res = dc.decode(bb,cb,true);
+ check(res.isUnderflow(), "isUnderflow");
+ check(bb.position() == 2, "bb.position()");
+ check(cb.position() == 2, "cb.position()");
+ }
+
+
+ if (failures > 0)
+ throw new RuntimeException(failures + " tests failed");
+ }
+
+ static void checkCoderResult(CoderResult result) {
+ check(result.isUnderflow(),
+ "Unexpected coder result: " + result);
+ }
+
+ static void test(String expectedCharset, byte[] input) throws Exception {
+ Charset cs = Charset.forName("x-JISAutoDetect");
+ CharsetDecoder autoDetect = cs.newDecoder();
+
+ Charset cs2 = Charset.forName(expectedCharset);
+ CharsetDecoder decoder = cs2.newDecoder();
+
+ ByteBuffer bb = ByteBuffer.allocate(128);
+ CharBuffer charOutput = CharBuffer.allocate(128);
+ CharBuffer charExpected = CharBuffer.allocate(128);
+
+ bb.put(input);
+ bb.flip();
+ bb.mark();
+
+ CoderResult result = autoDetect.decode(bb, charOutput, true);
+ checkCoderResult(result);
+ charOutput.flip();
+ String actual = charOutput.toString();
+
+ bb.reset();
+
+ result = decoder.decode(bb, charExpected, true);
+ checkCoderResult(result);
+ charExpected.flip();
+ String expected = charExpected.toString();
+
+ check(actual.equals(expected),
+ String.format("actual=%s expected=%s", actual, expected));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ReadZero.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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
+ * @summary Verify that if InputStream.read returns 0 we throw an exception.
+ * @bug 4684515
+ */
+
+import java.io.*;
+
+public class ReadZero {
+
+ public static void main(String [] args) throws IOException {
+ ReadZero r = new ReadZero();
+ r.testInputStream();
+ }
+
+ private void testInputStream() throws IOException {
+ File f = new File(System.getProperty("test.src", "."), "ReadZero.java");
+ InputStream is = new FileInputStream(f) {
+ public int read(byte [] b, int off, int len) {
+ System.out.println("FileInputStream.read");
+ return 0;
+ }
+ };
+
+ is.read(new byte[1], 0, 1); // ok
+ InputStreamReader isr = new InputStreamReader(is);
+
+ try {
+ int res = isr.read(new char[1], 0, 1);
+ } catch (IOException x) {
+ System.out.println("IOException caught");
+ return;
+ }
+ throw new RuntimeException("IOException not thrown");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SJISCanEncode.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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 4913702
+ @summary validates canEncode(char c) method for sun.nio.cs.Shift_JIS
+ */
+
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class SJISCanEncode {
+ private Charset cs;
+ private CharsetEncoder encoder;
+
+ private void canEncodeTest(char inputChar,
+ boolean expectedResult)
+ throws Exception {
+ String msg = "err: Shift_JIS canEncode() return value ";
+
+ if (encoder.canEncode(inputChar) != expectedResult) {
+ throw new Exception(msg + !(expectedResult) +
+ ": " + Integer.toHexString((int)inputChar));
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ SJISCanEncode test = new SJISCanEncode();
+ test.cs = Charset.forName("SJIS");
+ test.encoder = test.cs.newEncoder();
+
+ // us-ascii (mappable by Shift_JIS)
+ test.canEncodeTest('\u0001', true);
+
+ // Halfwidth Katakana
+ test.canEncodeTest('\uFF01', true);
+
+ // CJK ideograph
+ test.canEncodeTest('\u4E9C', true);
+
+ //Hiragana
+ test.canEncodeTest('\u3041', true);
+ // fullwidth Katakana
+ test.canEncodeTest('\u30A1', true);
+
+ // U+0080 should be unmappable
+ // U+4000 is a BMP character not covered by Shift_JISe
+
+ test.canEncodeTest('\u0080', false);
+ test.canEncodeTest('\u4000', false);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/StreamEncoderClose.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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 5005426
+ @summary Check if StreamEncoder close() method works correctly from
+ error recovery after the underneath OutputStream failed to
+ close the first time.
+ */
+
+import java.io.*;
+public class StreamEncoderClose {
+ public static void main( String arg[] ) throws Exception {
+ byte[] expected = {(byte)0x1b,(byte)0x24,(byte)0x42,
+ (byte)0x30,(byte)0x6c,
+ (byte)0x1b,(byte)0x28,(byte)0x42};
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ MyBufferedOutputStream mbos = new MyBufferedOutputStream(baos);
+ PrintWriter pw = new PrintWriter(new OutputStreamWriter(mbos, "ISO-2022-JP"));
+ mbos.dontClose();
+ pw.write("\u4e00");
+ pw.close(); // 1st PrintWriter Close
+ mbos.canClose();
+ pw.close(); // 2nd PrintWriter Close
+
+ //double check, probably not necessary
+ byte[] out = baos.toByteArray();
+ if (out.length != expected.length) {
+ throw new IOException("Failed");
+ }
+ for (int i = 0; i < out.length; i++) {
+ //System.out.printf("(byte)0x%x,", out[i] & 0xff);
+ if (out[i] != expected[i])
+ throw new IOException("Failed");
+ }
+ }
+
+ static class MyBufferedOutputStream extends BufferedOutputStream {
+ MyBufferedOutputStream(OutputStream os) {
+ super(os);
+ }
+ private boolean status;
+ public void dontClose() {
+ status = false;
+ }
+ public void canClose() {
+ status = true;
+ }
+ public void close() throws IOException {
+ if ( status == false ) {
+ throw new IOException("Can't close ");
+ }
+ super.close();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateGB18030Test.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,121 @@
+/*
+ * 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 4896454
+ @summary Check GB18030 surrogate encoding/decoding handling
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class SurrogateGB18030Test {
+ public static void main(String[] args) throws Exception {
+ SurrogateGB18030Test test = new SurrogateGB18030Test();
+
+ test.roundtripTest();
+
+ /**
+ * Valid Surrogate pair and 4 byte GB18030 representation
+ */
+
+ String inputString = "\uD800\uDC00";
+
+ byte[] expectedBytes = { (byte)0x90,
+ (byte)0x30,
+ (byte)0x81,
+ (byte)0x30
+ };
+ test.encodeTest(inputString, expectedBytes);
+
+ /**
+ * Vice-versa : check that 4 byte GB18030 value encodes correctly
+ */
+
+ String expectedStr = "\uDBFF\uDFFF";
+
+ byte[] inputBytes = { (byte)0xe3,
+ (byte)0x32,
+ (byte)0x9a,
+ (byte)0x35
+ };
+
+
+ test.decodeTest(inputBytes, expectedStr);
+
+ }
+
+ private void roundtripTest() throws Exception
+ {
+ byte[] ba;
+ char[] pair = new char[2];
+ for (char high = '\ud800'; high <= '\udbff'; high++) {
+ for (char low = '\udc00'; low <= '\udfff'; low++) {
+ pair[0] = high;
+ pair[1] = low;
+ String s = new String(pair);
+ if (!s.equals(new String(s.getBytes("gb18030"), "gb18030")))
+ throw new Exception ("GB18030 roundtrip failure");
+ }
+ }
+
+ }
+
+ private void encodeTest(String inputString, byte[] expectedBytes)
+ throws Exception
+ {
+ byte[] encoded = inputString.getBytes("GB18030");
+
+ CharBuffer cb = CharBuffer.wrap(inputString.toCharArray());
+ ByteBuffer bb = ByteBuffer.allocate(4);
+
+ CharsetEncoder encoder = Charset.forName("GB18030").newEncoder();
+ encoder.encode(cb, bb, true);
+
+ bb.flip();
+ for (int i = 0 ; i < expectedBytes.length; i++) {
+ if (encoded[i] != expectedBytes[i]
+ || bb.get() != expectedBytes[i])
+ throw new Exception ("GB18030 encode failure");
+ }
+ }
+
+ private void decodeTest(byte[] inputBytes, String expectedStr)
+ throws Exception
+ {
+ String s2 = new String(inputBytes, "GB18030");
+
+ CharsetDecoder decoder = Charset.forName("GB18030").newDecoder();
+
+ ByteBuffer bb = ByteBuffer.wrap(inputBytes);
+ CharBuffer cb = CharBuffer.allocate(2);
+ decoder.decode(bb, cb, true);
+
+ cb.flip();
+ for (int i = 0 ; i < expectedStr.length(); i++) {
+ if (expectedStr.charAt(i) != cb.get()
+ || s2.charAt(i) != expectedStr.charAt(i))
+ throw new Exception ("GB18030 encode failure");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java Wed Jul 05 16:38:48 2017 +0200
@@ -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 4847097
+ @summary Check surrogate coverage of EUC_TW
+ */
+
+/*
+ * Tests the full surrogate mapping roundtrip fidelity of the
+ * EUC-TW charset coder updated to support the additional
+ * planes 4,5,6,7,15
+ *
+ * byte->char mappings are contained in external files
+ * using plane{x}.surrogate as the convention for the input filenames
+ *
+ */
+
+import java.io.*;
+public class SurrogateTestEUCTW {
+
+ private static final String testRootDir
+ = System.getProperty("test.src", ".");
+
+ public static void main(String[] args) throws Exception {
+ char[] surrogatePair = new char[2];
+ int[] expectBytes = new int[4];
+
+ // Iterate test over each supported CNS-11643 plane
+ // containing supplementary character mappings
+
+ String[] testPlane = { "3", "4", "5", "6" ,"7", "15" };
+
+ for (int i = 0 ; i < testPlane.length; i++) {
+ FileReader f = new FileReader(testRootDir +
+ System.getProperty("file.separator")
+ + "SurrogateTestEUCTW.plane"
+ + testPlane[i]
+ + ".surrogates");
+ BufferedReader r = new BufferedReader(f);
+ String line;
+
+ while ((line = r.readLine()) != null) {
+ int charValue = Integer.parseInt(line.substring(9,14), 16);
+ surrogatePair[0] = (char) ((charValue - 0x10000) / 0x400
+ + 0xd800);
+ surrogatePair[1] = (char) ((charValue - 0x10000) % 0x400
+ + 0xdc00);
+ // Synthesize 4 byte expected byte values from CNS input values
+ expectBytes[0] = 0x8E;
+ expectBytes[1] = 0xA0 + Integer.parseInt(testPlane[i]);
+ expectBytes[2] = 0x80 | Integer.parseInt(line.substring(2,4), 16);
+ expectBytes[3] = 0x80 | Integer.parseInt(line.substring(4,6), 16);
+
+ String testStr = new String(surrogatePair);
+ byte[] encodedBytes = testStr.getBytes("EUC-TW");
+
+ for (int x = 0 ; x < 4 ; x++) {
+ if (encodedBytes[x] != (byte)(expectBytes[x] & 0xff)) {
+ throw new Exception("EUC_TW Surrogate Encoder error");
+ }
+ }
+
+ // Next: test round-trip fidelity
+ String decoded = new String(encodedBytes, "EUC-TW");
+
+ if (!decoded.equals(testStr)) {
+ throw new Exception("EUCTW Decoder error");
+ }
+ }
+ r.close();
+ f.close();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6476 @@
+0x2121 0x20002
+0x2122 0x2008C
+0x2123 0x200D4
+0x2124 0x201A5
+0x2125 0x20092
+0x2126 0x20093
+0x2127 0x200D8
+0x2128 0x200D9
+0x2129 0x201A7
+0x212A 0x2062B
+0x212B 0x2062C
+0x212C 0x2062D
+0x212D 0x20630
+0x212E 0x2062E
+0x212F 0x206AB
+0x2131 0x2092D
+0x2132 0x2096D
+0x2133 0x2F834
+0x2134 0x20A0F
+0x2136 0x20B9D
+0x2137 0x211A2
+0x2138 0x215D4
+0x2139 0x21B56
+0x213A 0x21BC3
+0x213B 0x22014
+0x213D 0x2471A
+0x213E 0x2000F
+0x213F 0x20010
+0x2140 0x2009A
+0x2141 0x2009B
+0x2143 0x201AC
+0x2145 0x20097
+0x2146 0x20546
+0x2148 0x20576
+0x2149 0x20577
+0x214A 0x205AE
+0x214B 0x2063A
+0x214C 0x2067D
+0x214D 0x21BC5
+0x214E 0x20BA8
+0x2151 0x21241
+0x2152 0x21242
+0x2153 0x215D8
+0x2154 0x215D9
+0x2155 0x216AA
+0x2156 0x216AB
+0x2157 0x21942
+0x2158 0x21941
+0x215A 0x21BC6
+0x215C 0x21D35
+0x215D 0x21D36
+0x215E 0x21D37
+0x215F 0x2F883
+0x2160 0x2634D
+0x2162 0x221B5
+0x2163 0x22317
+0x2164 0x22482
+0x2165 0x233B6
+0x2167 0x23C72
+0x2168 0x2455C
+0x2169 0x245A8
+0x216B 0x215E3
+0x216E 0x200E6
+0x216F 0x20144
+0x2170 0x20145
+0x2173 0x201C4
+0x2174 0x201C5
+0x2175 0x201C6
+0x2176 0x201C7
+0x2177 0x201C8
+0x2178 0x201C9
+0x2179 0x201CA
+0x217A 0x201D4
+0x217B 0x2057D
+0x217C 0x26272
+0x217D 0x205B2
+0x217E 0x205B4
+0x2221 0x20682
+0x2222 0x206C7
+0x2223 0x206C8
+0x2225 0x2083C
+0x2226 0x2083D
+0x2227 0x2083E
+0x2228 0x2083F
+0x2229 0x2F824
+0x222A 0x208D3
+0x222B 0x20147
+0x222D 0x20A3D
+0x222E 0x20AE2
+0x222F 0x20BB8
+0x2230 0x20BB9
+0x2231 0x20BC2
+0x2232 0x20BBA
+0x2233 0x20BC6
+0x2234 0x20BBB
+0x2235 0x211AD
+0x2236 0x2124C
+0x2237 0x2124D
+0x2239 0x216B2
+0x223A 0x216B3
+0x223B 0x216B4
+0x223C 0x216B5
+0x223D 0x219C3
+0x223E 0x219C4
+0x223F 0x219C5
+0x2240 0x219C6
+0x2241 0x219C7
+0x2243 0x21BCE
+0x2244 0x21C30
+0x2245 0x21D47
+0x2246 0x21D48
+0x2248 0x2205C
+0x224A 0x2205F
+0x224B 0x22318
+0x224C 0x22319
+0x224D 0x2237E
+0x224F 0x225B0
+0x2250 0x22A75
+0x2252 0x22A76
+0x2253 0x23041
+0x2254 0x23142
+0x2256 0x233BD
+0x225A 0x23B1E
+0x225B 0x23B1F
+0x225C 0x23C87
+0x225E 0x23C78
+0x225F 0x24188
+0x2260 0x24189
+0x2261 0x2418A
+0x2262 0x24617
+0x2263 0x24615
+0x2267 0x250E5
+0x2268 0x25609
+0x2269 0x2573B
+0x226A 0x2574F
+0x226C 0x2662E
+0x226D 0x2662F
+0x226E 0x26AFF
+0x226F 0x26AFD
+0x2270 0x26AFE
+0x2274 0x20023
+0x2275 0x200EA
+0x2276 0x2012A
+0x2277 0x20149
+0x2278 0x2014A
+0x2279 0x2014B
+0x227A 0x201DF
+0x227B 0x201E0
+0x227C 0x201E1
+0x227D 0x201E2
+0x227E 0x205C1
+0x2321 0x201E3
+0x2322 0x201E4
+0x2323 0x201E5
+0x2324 0x205C0
+0x2325 0x201E6
+0x2326 0x201F7
+0x2328 0x201E7
+0x2329 0x201E8
+0x232A 0x201E9
+0x232B 0x201EA
+0x232C 0x201EB
+0x232D 0x2050E
+0x232E 0x20580
+0x232F 0x20581
+0x2330 0x205BA
+0x2331 0x205BB
+0x2332 0x205BC
+0x2333 0x205BD
+0x2334 0x2063F
+0x2335 0x20640
+0x2336 0x20688
+0x2337 0x2F81F
+0x2338 0x20846
+0x233A 0x20847
+0x233B 0x20848
+0x233C 0x20936
+0x233D 0x20972
+0x233E 0x20996
+0x233F 0x20A47
+0x2340 0x20AE7
+0x2341 0x20B34
+0x2342 0x20B35
+0x2343 0x20B36
+0x2344 0x20B37
+0x2345 0x20BE3
+0x2346 0x20BE4
+0x2347 0x20BE5
+0x2348 0x20BEB
+0x234A 0x20BE6
+0x234B 0x20BE7
+0x234C 0x20BE8
+0x234F 0x211B9
+0x2351 0x211BA
+0x2353 0x21263
+0x2354 0x21264
+0x2356 0x21265
+0x2358 0x21266
+0x2359 0x2127C
+0x235A 0x21267
+0x235B 0x2F85A
+0x235C 0x21559
+0x235D 0x215E9
+0x235E 0x215EA
+0x235F 0x215EB
+0x2360 0x215EC
+0x2361 0x215ED
+0x2362 0x215EE
+0x2363 0x215EF
+0x2364 0x216BF
+0x2365 0x216CB
+0x2366 0x216C3
+0x2367 0x216D5
+0x2368 0x216C4
+0x2369 0x216C5
+0x236A 0x216D3
+0x236B 0x216C6
+0x236C 0x216C7
+0x236D 0x216C8
+0x236E 0x216C9
+0x236F 0x216CA
+0x2370 0x2194A
+0x2372 0x219D1
+0x2373 0x21B61
+0x2374 0x21C37
+0x2376 0x21D64
+0x2377 0x21D66
+0x2379 0x21D67
+0x237A 0x21D68
+0x237B 0x21D69
+0x237D 0x21D73
+0x237E 0x21D6A
+0x2421 0x21D6B
+0x2424 0x22072
+0x2426 0x221B9
+0x2427 0x2231C
+0x2428 0x22336
+0x2429 0x223BC
+0x242A 0x223BE
+0x242B 0x223BF
+0x242C 0x223C0
+0x242D 0x22487
+0x242E 0x225DC
+0x242F 0x225DD
+0x2430 0x225F5
+0x2431 0x225DE
+0x2432 0x225DF
+0x2433 0x2F89E
+0x2434 0x225E0
+0x2435 0x225E1
+0x2436 0x225E2
+0x2437 0x22A2C
+0x2438 0x22A2D
+0x243A 0x22AA9
+0x243B 0x22A9C
+0x243C 0x22A9D
+0x243D 0x22A9E
+0x243E 0x22A9F
+0x243F 0x22AA0
+0x2440 0x22AA1
+0x2441 0x22AA2
+0x2443 0x22AA3
+0x2444 0x22AA4
+0x2445 0x22AA7
+0x2446 0x23042
+0x2447 0x23093
+0x2448 0x23151
+0x244A 0x23152
+0x244B 0x23144
+0x244C 0x23153
+0x244D 0x23322
+0x244E 0x233C6
+0x244F 0x233C7
+0x2450 0x233C9
+0x2451 0x2F8DD
+0x2452 0x233CA
+0x2454 0x233C8
+0x2455 0x23B24
+0x2456 0x23B25
+0x2457 0x23B26
+0x2459 0x23B27
+0x245A 0x23B28
+0x245C 0x23C58
+0x245D 0x2F8FB
+0x245E 0x23CA7
+0x245F 0x23C88
+0x2460 0x23C89
+0x2461 0x23CA5
+0x2462 0x23CA8
+0x2463 0x23CA9
+0x2464 0x23CAA
+0x2465 0x23CAB
+0x2466 0x23CAC
+0x2467 0x23CAD
+0x2469 0x23C79
+0x246B 0x24194
+0x246C 0x24195
+0x246D 0x24196
+0x2470 0x24197
+0x2472 0x24198
+0x2473 0x2454E
+0x2474 0x2454F
+0x2475 0x24619
+0x2477 0x24741
+0x2478 0x2F92A
+0x2479 0x248F7
+0x247A 0x24C04
+0x247B 0x24C19
+0x247C 0x24C17
+0x247D 0x25040
+0x247E 0x250EC
+0x2521 0x2541B
+0x2522 0x2541C
+0x2524 0x2560E
+0x2525 0x25752
+0x2526 0x25AD8
+0x2527 0x25E26
+0x2528 0x26274
+0x252A 0x26275
+0x252B 0x269C6
+0x252C 0x26B0B
+0x252D 0x26B0C
+0x252E 0x26B0D
+0x252F 0x26B0E
+0x2530 0x26B0F
+0x2531 0x26B10
+0x2533 0x28459
+0x2534 0x2845A
+0x2535 0x28683
+0x2536 0x28684
+0x2537 0x28685
+0x253A 0x28E20
+0x253B 0x28E21
+0x253C 0x28E22
+0x253D 0x28E23
+0x253E 0x28E24
+0x253F 0x28E29
+0x2540 0x200F4
+0x2542 0x2158F
+0x2543 0x20151
+0x2545 0x20217
+0x2546 0x20218
+0x2547 0x2025B
+0x2548 0x20219
+0x2549 0x2021A
+0x254B 0x2021B
+0x254C 0x2021C
+0x254D 0x2021D
+0x254E 0x2021E
+0x254F 0x2021F
+0x2550 0x20220
+0x2551 0x20221
+0x2552 0x2048B
+0x2553 0x20488
+0x2555 0x20585
+0x2556 0x26287
+0x2557 0x205C7
+0x2558 0x2064C
+0x2559 0x2064D
+0x255A 0x206FC
+0x255B 0x206FD
+0x255C 0x206FE
+0x255D 0x206FF
+0x2560 0x20856
+0x2561 0x20857
+0x2562 0x20858
+0x2563 0x20859
+0x2564 0x208DC
+0x2565 0x208DD
+0x2566 0x20973
+0x2567 0x2099D
+0x2568 0x209A1
+0x2569 0x2099E
+0x256A 0x2099F
+0x256B 0x209A0
+0x256C 0x209E6
+0x256D 0x20A51
+0x256E 0x20A52
+0x256F 0x20B3D
+0x2570 0x20C22
+0x2572 0x20C23
+0x2573 0x20C24
+0x2574 0x20C25
+0x2575 0x20C26
+0x2576 0x20C27
+0x2577 0x20C28
+0x2578 0x20C29
+0x2579 0x20C2A
+0x257A 0x20C2B
+0x257C 0x20C40
+0x257D 0x20C2C
+0x257E 0x20C2D
+0x2621 0x20C2E
+0x2622 0x20C2F
+0x2623 0x20C30
+0x2624 0x211D0
+0x2625 0x212A8
+0x2626 0x21294
+0x2627 0x21295
+0x2628 0x21296
+0x2629 0x21297
+0x262A 0x21298
+0x262B 0x2129C
+0x262C 0x2129B
+0x262E 0x212A1
+0x262F 0x212A0
+0x2630 0x21299
+0x2631 0x2129A
+0x2632 0x212A7
+0x2634 0x21564
+0x2636 0x21600
+0x2637 0x21601
+0x263A 0x216E5
+0x263B 0x216E9
+0x263C 0x216FB
+0x263D 0x216FC
+0x263E 0x216EA
+0x263F 0x216EB
+0x2640 0x216EC
+0x2641 0x216ED
+0x2642 0x216EE
+0x2643 0x216EF
+0x2644 0x216FA
+0x2645 0x216F0
+0x2646 0x216F1
+0x2647 0x216F2
+0x2648 0x216F3
+0x2649 0x216F4
+0x264A 0x21952
+0x264B 0x21953
+0x264C 0x21954
+0x264D 0x21955
+0x264E 0x21958
+0x264F 0x21956
+0x2651 0x219DD
+0x2652 0x219DE
+0x2653 0x219E3
+0x2654 0x219DF
+0x2655 0x219E0
+0x2656 0x21B22
+0x2657 0x21B23
+0x2658 0x21B68
+0x2659 0x21BDF
+0x265B 0x21C44
+0x265C 0x21D94
+0x265D 0x21D95
+0x265E 0x21D96
+0x265F 0x21D97
+0x2660 0x21D98
+0x2661 0x21D99
+0x2662 0x2F879
+0x2663 0x21D9A
+0x2664 0x21D9B
+0x2665 0x21D9D
+0x2666 0x21D9E
+0x2667 0x21D9F
+0x2668 0x21DA0
+0x2669 0x21FF3
+0x266A 0x21FF2
+0x266B 0x2201F
+0x266C 0x22088
+0x266D 0x2218F
+0x266E 0x22190
+0x2670 0x221FD
+0x2671 0x221FE
+0x2672 0x221FF
+0x2673 0x22200
+0x2674 0x22201
+0x2675 0x2261A
+0x2677 0x225E3
+0x2678 0x225E4
+0x2679 0x225E5
+0x267A 0x225E6
+0x267B 0x225E7
+0x267C 0x225EB
+0x267D 0x225E8
+0x267E 0x225E9
+0x2721 0x225EA
+0x2722 0x2261D
+0x2723 0x229A4
+0x2724 0x229A3
+0x2725 0x22AD4
+0x2726 0x22AC6
+0x2727 0x22AC7
+0x2728 0x22AC8
+0x2729 0x22AC9
+0x272A 0x22ACA
+0x272B 0x22ACB
+0x272C 0x22ACC
+0x272D 0x22ACD
+0x272F 0x22ACE
+0x2731 0x22EB8
+0x2732 0x22EB9
+0x2733 0x22EBA
+0x2734 0x2306E
+0x2735 0x230DB
+0x2736 0x230DC
+0x2737 0x23168
+0x2738 0x23169
+0x2739 0x2316A
+0x273A 0x2316B
+0x273B 0x2316C
+0x273C 0x2316D
+0x273D 0x2316E
+0x273F 0x23324
+0x2740 0x23325
+0x2742 0x23400
+0x2743 0x233E5
+0x2744 0x233F9
+0x2745 0x233E7
+0x2746 0x233E8
+0x2747 0x233E9
+0x2748 0x233FE
+0x2749 0x233EA
+0x274A 0x233EB
+0x274B 0x233EC
+0x274D 0x233ED
+0x274F 0x233EE
+0x2751 0x233EF
+0x2753 0x23417
+0x2754 0x233F0
+0x2755 0x233F1
+0x2756 0x23894
+0x2757 0x2395B
+0x2758 0x2395C
+0x2759 0x2395D
+0x275A 0x23B2F
+0x275C 0x23B30
+0x275D 0x23B31
+0x275E 0x23B32
+0x275F 0x23B33
+0x2760 0x23CCC
+0x2761 0x23CCD
+0x2762 0x23CCE
+0x2763 0x23CAE
+0x2764 0x23CAF
+0x2765 0x23CB0
+0x2767 0x23CCF
+0x2768 0x23CD0
+0x2769 0x23CD1
+0x276A 0x23CD2
+0x276B 0x23CD3
+0x276D 0x23CD4
+0x276F 0x241A6
+0x2770 0x241A7
+0x2771 0x241A8
+0x2772 0x241B0
+0x2773 0x241A9
+0x2774 0x241AA
+0x2775 0x241AB
+0x2776 0x241AC
+0x2777 0x241AD
+0x2778 0x244FB
+0x2779 0x244FC
+0x277B 0x2462D
+0x277C 0x2462E
+0x277D 0x24650
+0x277E 0x2462F
+0x2821 0x24630
+0x2822 0x24765
+0x2823 0x248E6
+0x2824 0x2490C
+0x2825 0x24902
+0x2826 0x24903
+0x2827 0x24904
+0x2828 0x24905
+0x2829 0x24906
+0x282B 0x24BC0
+0x282C 0x24C24
+0x282D 0x24C25
+0x282E 0x24D16
+0x282F 0x24D32
+0x2830 0x25420
+0x2831 0x25421
+0x2832 0x25422
+0x2833 0x25423
+0x2835 0x25425
+0x2836 0x25619
+0x2837 0x25624
+0x2838 0x2561A
+0x2839 0x2561B
+0x283A 0x2561C
+0x283B 0x2561D
+0x283C 0x2F952
+0x283D 0x2561E
+0x283E 0x2575A
+0x283F 0x2575B
+0x2840 0x2575C
+0x2841 0x2575D
+0x2842 0x2575E
+0x2843 0x25931
+0x2845 0x25E29
+0x2847 0x25F88
+0x2848 0x25F89
+0x2849 0x26289
+0x284B 0x26356
+0x284C 0x264D1
+0x284D 0x264E6
+0x284E 0x26532
+0x284F 0x26533
+0x2850 0x26652
+0x2851 0x26653
+0x2853 0x26654
+0x2854 0x26655
+0x2857 0x26B29
+0x2858 0x26B2A
+0x2859 0x26B2B
+0x285A 0x26B2C
+0x285B 0x26B2D
+0x285C 0x2F992
+0x285D 0x26B2E
+0x285E 0x26B2F
+0x285F 0x26B30
+0x2860 0x26B31
+0x2861 0x26B32
+0x2862 0x26B33
+0x2864 0x26B34
+0x2865 0x2719B
+0x2866 0x27223
+0x2867 0x27224
+0x2869 0x27225
+0x286A 0x27227
+0x286B 0x27616
+0x286C 0x27CA0
+0x286D 0x2846F
+0x286F 0x28470
+0x2870 0x28471
+0x2873 0x28472
+0x2874 0x28473
+0x2875 0x28474
+0x2876 0x2869C
+0x2877 0x286AA
+0x2878 0x2869D
+0x2879 0x2869E
+0x287B 0x286AB
+0x287C 0x2869F
+0x287D 0x28E35
+0x287E 0x28E38
+0x2921 0x2A38D
+0x2922 0x20035
+0x2923 0x20036
+0x2924 0x25AEE
+0x2925 0x200B4
+0x2926 0x2A6C9
+0x2927 0x20132
+0x2928 0x20155
+0x2929 0x20244
+0x292A 0x20245
+0x292B 0x20246
+0x292C 0x20247
+0x292E 0x20248
+0x292F 0x20249
+0x2931 0x2024A
+0x2932 0x2024B
+0x2933 0x2024C
+0x2934 0x2024D
+0x2935 0x2024E
+0x2936 0x2024F
+0x2937 0x20250
+0x2938 0x20251
+0x2939 0x26299
+0x293A 0x205D1
+0x293C 0x205D2
+0x293D 0x205D3
+0x293E 0x205D4
+0x293F 0x205D5
+0x2940 0x20721
+0x2941 0x20722
+0x2942 0x20723
+0x2943 0x20868
+0x2944 0x20869
+0x2945 0x2086A
+0x2946 0x208E2
+0x2947 0x20945
+0x2948 0x209EC
+0x2949 0x209ED
+0x294A 0x209EE
+0x294B 0x209EF
+0x294D 0x20A62
+0x294E 0x20A63
+0x294F 0x20AF4
+0x2950 0x2006F
+0x2951 0x20B44
+0x2952 0x20B45
+0x2953 0x20C79
+0x2955 0x20C7A
+0x2956 0x20C7B
+0x2957 0x20C7C
+0x2958 0x20C7D
+0x2959 0x20C7E
+0x295A 0x20C7F
+0x295B 0x20C80
+0x295E 0x20C81
+0x295F 0x20C82
+0x2960 0x20C83
+0x2961 0x20C84
+0x2962 0x20C85
+0x2963 0x20C86
+0x2964 0x20C87
+0x2965 0x20C8F
+0x2966 0x20C88
+0x2967 0x20C89
+0x2968 0x212C5
+0x2969 0x212C6
+0x296B 0x212C7
+0x296C 0x212C8
+0x296D 0x212C9
+0x296E 0x212CA
+0x296F 0x212CB
+0x2970 0x212CC
+0x2972 0x212CD
+0x2973 0x212CE
+0x2974 0x212E3
+0x2975 0x212CF
+0x2976 0x212D0
+0x2977 0x212D1
+0x2978 0x212D2
+0x2979 0x212D3
+0x297A 0x212C4
+0x297B 0x212D4
+0x297C 0x212D5
+0x297D 0x212D6
+0x297E 0x21520
+0x2A21 0x21521
+0x2A22 0x2161A
+0x2A23 0x21612
+0x2A24 0x21614
+0x2A25 0x21615
+0x2A26 0x21616
+0x2A27 0x21619
+0x2A28 0x21617
+0x2A29 0x21618
+0x2A2B 0x2F861
+0x2A2D 0x21712
+0x2A2E 0x21713
+0x2A2F 0x21714
+0x2A30 0x21715
+0x2A31 0x21716
+0x2A32 0x21717
+0x2A33 0x21718
+0x2A34 0x21719
+0x2A35 0x21961
+0x2A36 0x21962
+0x2A37 0x21963
+0x2A38 0x219F5
+0x2A3A 0x219F6
+0x2A3B 0x219F7
+0x2A3C 0x219F8
+0x2A3D 0x21B29
+0x2A3F 0x21C5D
+0x2A40 0x21C57
+0x2A41 0x21C58
+0x2A42 0x21C59
+0x2A43 0x21C5A
+0x2A44 0x21C5B
+0x2A45 0x21DBB
+0x2A46 0x21DD1
+0x2A47 0x21DBC
+0x2A48 0x21DBD
+0x2A49 0x268DF
+0x2A4A 0x21DD0
+0x2A4B 0x21DBE
+0x2A4C 0x21DBF
+0x2A4D 0x21DC0
+0x2A4E 0x21DC1
+0x2A4F 0x21DC2
+0x2A50 0x21DC3
+0x2A51 0x21DC4
+0x2A52 0x26B6C
+0x2A53 0x220A1
+0x2A54 0x220A2
+0x2A55 0x220A3
+0x2A56 0x22193
+0x2A57 0x2220D
+0x2A58 0x2220F
+0x2A59 0x2220E
+0x2A5A 0x22210
+0x2A5B 0x22211
+0x2A5C 0x22212
+0x2A5D 0x2F895
+0x2A5E 0x224E5
+0x2A5F 0x2262F
+0x2A61 0x22657
+0x2A62 0x22630
+0x2A63 0x22668
+0x2A64 0x2262B
+0x2A65 0x22631
+0x2A66 0x22658
+0x2A67 0x2F8A2
+0x2A68 0x22632
+0x2A69 0x22659
+0x2A6B 0x2265A
+0x2A6C 0x22633
+0x2A6D 0x2265B
+0x2A6E 0x2265C
+0x2A6F 0x2265D
+0x2A70 0x2261E
+0x2A71 0x229AE
+0x2A72 0x229AF
+0x2A73 0x22A3B
+0x2A74 0x22A3C
+0x2A75 0x22A3D
+0x2A76 0x22B07
+0x2A77 0x22B08
+0x2A78 0x22B09
+0x2A79 0x22B0A
+0x2A7A 0x22B0B
+0x2A7B 0x22B0C
+0x2A7C 0x22B0D
+0x2A7D 0x22B0E
+0x2A7E 0x22B0F
+0x2B21 0x22B10
+0x2B22 0x22B22
+0x2B23 0x22B11
+0x2B24 0x22B12
+0x2B25 0x22B13
+0x2B26 0x22B14
+0x2B27 0x22B15
+0x2B28 0x22B16
+0x2B29 0x22B17
+0x2B2A 0x22B18
+0x2B2B 0x2F8B8
+0x2B2D 0x23046
+0x2B2E 0x23047
+0x2B2F 0x23048
+0x2B30 0x230E1
+0x2B31 0x23181
+0x2B32 0x23183
+0x2B33 0x20C75
+0x2B35 0x23185
+0x2B36 0x23186
+0x2B37 0x2332A
+0x2B38 0x2F8D1
+0x2B39 0x2332B
+0x2B3A 0x2336B
+0x2B3B 0x23418
+0x2B3C 0x23419
+0x2B3D 0x2341A
+0x2B3F 0x2341B
+0x2B40 0x2341C
+0x2B41 0x2341D
+0x2B42 0x2341E
+0x2B43 0x2341F
+0x2B44 0x23420
+0x2B45 0x23421
+0x2B46 0x23422
+0x2B47 0x23423
+0x2B49 0x23424
+0x2B4A 0x23425
+0x2B4B 0x23426
+0x2B4C 0x23427
+0x2B4D 0x23428
+0x2B4E 0x23429
+0x2B4F 0x2342A
+0x2B50 0x239EF
+0x2B51 0x23B49
+0x2B52 0x23B4A
+0x2B53 0x23B4B
+0x2B54 0x23B4C
+0x2B55 0x23B4D
+0x2B56 0x23B4E
+0x2B57 0x23B4F
+0x2B58 0x23B50
+0x2B59 0x23B51
+0x2B5A 0x23B52
+0x2B5B 0x23B53
+0x2B5C 0x23B54
+0x2B5D 0x23B5A
+0x2B5E 0x23B55
+0x2B5F 0x23C5F
+0x2B60 0x23D02
+0x2B61 0x23D03
+0x2B62 0x23D04
+0x2B63 0x23D05
+0x2B64 0x23CD5
+0x2B65 0x23D06
+0x2B66 0x23D07
+0x2B67 0x23CD6
+0x2B68 0x23D08
+0x2B69 0x23D09
+0x2B6A 0x23D0A
+0x2B6B 0x23D0B
+0x2B6C 0x23CD7
+0x2B6D 0x23D0C
+0x2B6E 0x23D0D
+0x2B6F 0x241C8
+0x2B70 0x241C9
+0x2B71 0x241CA
+0x2B72 0x241CB
+0x2B73 0x241CC
+0x2B74 0x241CD
+0x2B75 0x241CE
+0x2B76 0x241CF
+0x2B77 0x241D0
+0x2B78 0x241D1
+0x2B79 0x241D2
+0x2B7B 0x241D3
+0x2B7C 0x241D4
+0x2B7D 0x241D5
+0x2B7E 0x241D6
+0x2C21 0x241D7
+0x2C22 0x241E2
+0x2C23 0x241D8
+0x2C24 0x24504
+0x2C25 0x24505
+0x2C26 0x24506
+0x2C28 0x24643
+0x2C29 0x24644
+0x2C2A 0x24784
+0x2C2B 0x2478F
+0x2C2C 0x24785
+0x2C2D 0x24786
+0x2C2E 0x2492F
+0x2C2F 0x2491A
+0x2C30 0x2491B
+0x2C31 0x2491C
+0x2C33 0x2491D
+0x2C34 0x2491E
+0x2C35 0x2491F
+0x2C36 0x24920
+0x2C37 0x24921
+0x2C38 0x24922
+0x2C39 0x2F92C
+0x2C3A 0x24923
+0x2C3B 0x24924
+0x2C3C 0x2490E
+0x2C3D 0x24925
+0x2C3E 0x2492B
+0x2C3F 0x2492C
+0x2C40 0x2490B
+0x2C41 0x24AEE
+0x2C43 0x24BC3
+0x2C44 0x24BD8
+0x2C45 0x24BD9
+0x2C46 0x24C38
+0x2C47 0x24C39
+0x2C48 0x24C3A
+0x2C49 0x24C3B
+0x2C4B 0x24C3C
+0x2C4C 0x24C3D
+0x2C4D 0x24C3E
+0x2C4E 0x24C3F
+0x2C4F 0x24C40
+0x2C50 0x24D48
+0x2C51 0x24D4C
+0x2C52 0x24F28
+0x2C53 0x24F51
+0x2C54 0x24F52
+0x2C55 0x2504C
+0x2C56 0x25123
+0x2C57 0x2F945
+0x2C58 0x25124
+0x2C59 0x25431
+0x2C5A 0x25432
+0x2C5B 0x25433
+0x2C5D 0x25434
+0x2C5E 0x25435
+0x2C5F 0x25436
+0x2C60 0x25440
+0x2C61 0x25437
+0x2C63 0x25438
+0x2C64 0x2543D
+0x2C65 0x25638
+0x2C66 0x25639
+0x2C67 0x2563A
+0x2C68 0x2563B
+0x2C69 0x2563C
+0x2C6A 0x2564C
+0x2C6B 0x25773
+0x2C6C 0x25774
+0x2C6E 0x25775
+0x2C6F 0x25776
+0x2C70 0x25779
+0x2C71 0x25941
+0x2C72 0x25942
+0x2C73 0x25943
+0x2C74 0x25A5B
+0x2C77 0x238A6
+0x2C78 0x25A5C
+0x2C79 0x25AE5
+0x2C7A 0x25AE6
+0x2C7B 0x25AE7
+0x2C7C 0x25AE8
+0x2C7D 0x25AED
+0x2C7E 0x25E30
+0x2D22 0x25E31
+0x2D23 0x25F94
+0x2D24 0x26351
+0x2D25 0x263FD
+0x2D26 0x263FE
+0x2D27 0x264E9
+0x2D29 0x266B3
+0x2D2A 0x26684
+0x2D2B 0x26694
+0x2D2D 0x2669C
+0x2D2F 0x26685
+0x2D30 0x26900
+0x2D31 0x26937
+0x2D32 0x26957
+0x2D33 0x26B54
+0x2D34 0x26B68
+0x2D35 0x26B55
+0x2D36 0x26B5C
+0x2D37 0x26B56
+0x2D38 0x26B57
+0x2D39 0x26B58
+0x2D3A 0x26B59
+0x2D3B 0x26B5A
+0x2D3C 0x26B5B
+0x2D3D 0x27234
+0x2D3F 0x27235
+0x2D41 0x27239
+0x2D42 0x27236
+0x2D43 0x27237
+0x2D44 0x27238
+0x2D45 0x275E5
+0x2D46 0x27659
+0x2D48 0x2763A
+0x2D49 0x2763B
+0x2D4A 0x27D28
+0x2D4B 0x27E89
+0x2D4D 0x27E8A
+0x2D4E 0x27E8B
+0x2D4F 0x27E8C
+0x2D50 0x27E8D
+0x2D51 0x27FBC
+0x2D52 0x282A3
+0x2D54 0x282A4
+0x2D55 0x28493
+0x2D56 0x28494
+0x2D57 0x28495
+0x2D58 0x28496
+0x2D59 0x28497
+0x2D5A 0x286B9
+0x2D5B 0x28E4F
+0x2D5C 0x28E50
+0x2D5D 0x28E51
+0x2D5E 0x29076
+0x2D60 0x200FB
+0x2D61 0x20083
+0x2D62 0x20138
+0x2D63 0x2015D
+0x2D64 0x20271
+0x2D66 0x20277
+0x2D67 0x20278
+0x2D68 0x2F807
+0x2D69 0x202C3
+0x2D6A 0x20279
+0x2D6B 0x2027A
+0x2D6C 0x2027B
+0x2D6D 0x2027C
+0x2D6E 0x20272
+0x2D6F 0x2027D
+0x2D70 0x202A0
+0x2D71 0x2027E
+0x2D72 0x2027F
+0x2D73 0x20280
+0x2D74 0x20281
+0x2D75 0x20282
+0x2D76 0x20283
+0x2D77 0x2029E
+0x2D78 0x20284
+0x2D79 0x20285
+0x2D7A 0x20286
+0x2D7B 0x20287
+0x2D7C 0x20288
+0x2D7D 0x20493
+0x2D7E 0x20494
+0x2E21 0x20495
+0x2E22 0x204EF
+0x2E23 0x204F0
+0x2E25 0x2058D
+0x2E26 0x2058F
+0x2E27 0x20590
+0x2E28 0x20591
+0x2E29 0x20592
+0x2E2A 0x205DE
+0x2E2B 0x205E1
+0x2E2C 0x20653
+0x2E2E 0x2074A
+0x2E2F 0x2074B
+0x2E30 0x2074C
+0x2E31 0x20751
+0x2E32 0x2074D
+0x2E33 0x20748
+0x2E34 0x20874
+0x2E35 0x20875
+0x2E36 0x20920
+0x2E37 0x20921
+0x2E38 0x209A5
+0x2E39 0x209A6
+0x2E3A 0x20A73
+0x2E3B 0x20A74
+0x2E3C 0x20B50
+0x2E3D 0x20B51
+0x2E3E 0x20B52
+0x2E3F 0x20B53
+0x2E40 0x20CDB
+0x2E41 0x20CDC
+0x2E43 0x20CDD
+0x2E44 0x20CDE
+0x2E45 0x20CFF
+0x2E48 0x20CDF
+0x2E49 0x20CE0
+0x2E4B 0x20CE1
+0x2E4C 0x20CE2
+0x2E4D 0x20CE3
+0x2E4E 0x20CE4
+0x2E4F 0x20CE5
+0x2E50 0x20CE6
+0x2E51 0x20CE7
+0x2E52 0x20CE8
+0x2E53 0x20CE9
+0x2E54 0x20CEA
+0x2E55 0x21307
+0x2E56 0x21308
+0x2E57 0x21309
+0x2E58 0x2130A
+0x2E59 0x2130B
+0x2E5A 0x2130C
+0x2E5B 0x2130D
+0x2E5D 0x2131A
+0x2E5E 0x2130E
+0x2E5F 0x2130F
+0x2E60 0x21310
+0x2E61 0x2131C
+0x2E62 0x21527
+0x2E63 0x21566
+0x2E64 0x21598
+0x2E65 0x21599
+0x2E66 0x21633
+0x2E67 0x21624
+0x2E68 0x21625
+0x2E69 0x21626
+0x2E6C 0x2173E
+0x2E6D 0x2F864
+0x2E6E 0x2173F
+0x2E6F 0x21757
+0x2E70 0x21740
+0x2E71 0x21741
+0x2E72 0x21758
+0x2E73 0x21742
+0x2E74 0x21743
+0x2E75 0x21744
+0x2E76 0x21745
+0x2E77 0x21746
+0x2E79 0x21747
+0x2E7A 0x2196B
+0x2E7B 0x2196C
+0x2E7C 0x21A10
+0x2E7D 0x21A11
+0x2F21 0x21B75
+0x2F22 0x21BEF
+0x2F23 0x21C6A
+0x2F24 0x21C6B
+0x2F26 0x21C6C
+0x2F27 0x21C6D
+0x2F28 0x21C6E
+0x2F29 0x21DEF
+0x2F2A 0x21DF0
+0x2F2B 0x21DF1
+0x2F2C 0x21DF2
+0x2F2D 0x21DF3
+0x2F2E 0x21DF4
+0x2F2F 0x21DF5
+0x2F30 0x21DFF
+0x2F31 0x21DF6
+0x2F32 0x21E02
+0x2F33 0x21DF7
+0x2F34 0x22022
+0x2F35 0x220C4
+0x2F36 0x220C3
+0x2F37 0x22228
+0x2F39 0x22320
+0x2F3A 0x22325
+0x2F3B 0x22322
+0x2F3C 0x22323
+0x2F3D 0x223EB
+0x2F3F 0x224F9
+0x2F40 0x224FA
+0x2F41 0x22699
+0x2F42 0x2269A
+0x2F43 0x2269B
+0x2F44 0x22663
+0x2F46 0x2265E
+0x2F47 0x2265F
+0x2F48 0x22660
+0x2F49 0x2269C
+0x2F4A 0x22661
+0x2F4B 0x2269D
+0x2F4C 0x22B54
+0x2F4D 0x22B55
+0x2F4E 0x22B56
+0x2F4F 0x22B57
+0x2F50 0x22B58
+0x2F51 0x22B59
+0x2F52 0x22B5A
+0x2F53 0x22B19
+0x2F54 0x22B6A
+0x2F55 0x22B5B
+0x2F56 0x22B5C
+0x2F57 0x22B5D
+0x2F58 0x22B66
+0x2F5A 0x22B5E
+0x2F5B 0x22B5F
+0x2F5C 0x22B1A
+0x2F5D 0x22B60
+0x2F5E 0x22B61
+0x2F60 0x22B62
+0x2F61 0x22B1B
+0x2F62 0x22B63
+0x2F63 0x26410
+0x2F64 0x26411
+0x2F65 0x2304C
+0x2F66 0x2309B
+0x2F67 0x230EB
+0x2F68 0x230EC
+0x2F69 0x230ED
+0x2F6A 0x230EE
+0x2F6B 0x231A3
+0x2F6C 0x231A8
+0x2F6D 0x231A6
+0x2F6F 0x2332F
+0x2F70 0x23330
+0x2F71 0x23331
+0x2F72 0x23332
+0x2F73 0x23333
+0x2F74 0x2344F
+0x2F75 0x23451
+0x2F76 0x23452
+0x2F77 0x2347D
+0x2F78 0x23453
+0x2F79 0x23454
+0x2F7A 0x23455
+0x2F7B 0x23456
+0x2F7C 0x23457
+0x2F7D 0x23458
+0x2F7E 0x23459
+0x3021 0x2345A
+0x3022 0x2345B
+0x3023 0x2345C
+0x3025 0x2345D
+0x3026 0x2345E
+0x3027 0x2345F
+0x3028 0x2346F
+0x3029 0x23460
+0x302A 0x23461
+0x302B 0x23462
+0x302C 0x23463
+0x302D 0x23472
+0x302E 0x23464
+0x3030 0x2346E
+0x3031 0x238B5
+0x3032 0x23B65
+0x3033 0x23B66
+0x3034 0x23B67
+0x3035 0x23B68
+0x3036 0x23B69
+0x3037 0x23B6A
+0x3038 0x23B6B
+0x3039 0x23B6C
+0x303A 0x23D0E
+0x303B 0x23D43
+0x303D 0x23D0F
+0x303E 0x23D44
+0x303F 0x23D45
+0x3040 0x23D46
+0x3041 0x23D47
+0x3042 0x23D48
+0x3043 0x23D49
+0x3044 0x23D10
+0x3045 0x23D4A
+0x3046 0x23D4B
+0x3047 0x23D4C
+0x3048 0x23D4D
+0x304A 0x23D4E
+0x304B 0x23D4F
+0x304C 0x23D50
+0x304D 0x23D51
+0x304E 0x23D52
+0x304F 0x23D53
+0x3050 0x23D54
+0x3051 0x23D55
+0x3052 0x23D56
+0x3053 0x23D57
+0x3054 0x23D58
+0x3055 0x23D59
+0x3056 0x23D5A
+0x3057 0x23D1D
+0x3058 0x23D5B
+0x3059 0x23D5C
+0x305A 0x23D5D
+0x305B 0x2F906
+0x305D 0x241FE
+0x305E 0x241FF
+0x305F 0x24200
+0x3060 0x24201
+0x3061 0x24202
+0x3062 0x24203
+0x3063 0x24204
+0x3064 0x24205
+0x3065 0x24206
+0x3066 0x24207
+0x3067 0x24218
+0x3068 0x24208
+0x3069 0x24209
+0x306A 0x241F3
+0x306B 0x2420A
+0x306C 0x2420B
+0x306D 0x2421B
+0x306E 0x2420C
+0x306F 0x2420D
+0x3070 0x2420E
+0x3071 0x2420F
+0x3072 0x24210
+0x3073 0x2450F
+0x3074 0x24561
+0x3075 0x24579
+0x3076 0x247C1
+0x3077 0x247AC
+0x3078 0x247AD
+0x3079 0x24943
+0x307A 0x24944
+0x307B 0x24945
+0x307C 0x24946
+0x307D 0x24947
+0x307E 0x24948
+0x3121 0x24949
+0x3122 0x24964
+0x3123 0x2494A
+0x3124 0x2494B
+0x3125 0x2494C
+0x3126 0x2494D
+0x3128 0x2F92D
+0x3129 0x24B39
+0x312A 0x24C57
+0x312B 0x24C58
+0x312C 0x24C59
+0x312D 0x24C5F
+0x312E 0x24C5A
+0x312F 0x24D6A
+0x3130 0x24F2B
+0x3131 0x24F5D
+0x3132 0x24F5E
+0x3133 0x24F5F
+0x3135 0x24F60
+0x3136 0x24F61
+0x3137 0x25058
+0x3138 0x25059
+0x3139 0x2514A
+0x313A 0x2514B
+0x313B 0x2514C
+0x313C 0x2514D
+0x313D 0x2514E
+0x313E 0x25457
+0x313F 0x253B3
+0x3140 0x253B4
+0x3141 0x2546E
+0x3142 0x2545B
+0x3143 0x2545C
+0x3145 0x2545D
+0x3146 0x2545E
+0x3148 0x2546C
+0x3149 0x2563D
+0x314A 0x25654
+0x314B 0x2563E
+0x314C 0x25655
+0x314D 0x25656
+0x314E 0x2563F
+0x314F 0x25657
+0x3150 0x25658
+0x3151 0x25659
+0x3152 0x2565A
+0x3153 0x2565B
+0x3154 0x2565C
+0x3155 0x25788
+0x3156 0x25789
+0x3158 0x25958
+0x3159 0x25959
+0x315A 0x2595A
+0x315C 0x25A67
+0x315D 0x25A68
+0x315E 0x25A69
+0x315F 0x25A6A
+0x3161 0x25A6B
+0x3162 0x25A6C
+0x3163 0x25AFE
+0x3164 0x25AFF
+0x3165 0x25B00
+0x3166 0x25B01
+0x3167 0x25B02
+0x3168 0x25B03
+0x3169 0x25B04
+0x316A 0x25B05
+0x316B 0x25E39
+0x316C 0x25E3A
+0x316D 0x25E3B
+0x316E 0x25E3C
+0x3171 0x25FB2
+0x3172 0x25FB3
+0x3173 0x25FB4
+0x3174 0x25FB5
+0x3175 0x25FB6
+0x3176 0x25FB7
+0x3177 0x25FB8
+0x3179 0x262A2
+0x317A 0x26361
+0x317B 0x26362
+0x317C 0x26414
+0x317E 0x264EB
+0x3221 0x26542
+0x3222 0x26548
+0x3224 0x26543
+0x3225 0x2654E
+0x3226 0x26544
+0x3227 0x26545
+0x3228 0x266B4
+0x3229 0x266B5
+0x322D 0x266B6
+0x322F 0x268E1
+0x3230 0x26905
+0x3233 0x26B9A
+0x3235 0x26B9B
+0x3236 0x26B9C
+0x3237 0x26B9D
+0x3238 0x26B9E
+0x3239 0x26B9F
+0x323A 0x2F99A
+0x323B 0x26BA0
+0x323C 0x26BA1
+0x323D 0x26BA2
+0x323E 0x26BB5
+0x323F 0x26BA3
+0x3240 0x26BA4
+0x3242 0x26BA5
+0x3243 0x26BA6
+0x3244 0x26BA7
+0x3245 0x26BA8
+0x3246 0x26BAF
+0x3247 0x26BA9
+0x3248 0x26BAA
+0x3249 0x26BAB
+0x324A 0x26BAC
+0x324B 0x26BAD
+0x324C 0x26BB3
+0x324E 0x271A0
+0x324F 0x27256
+0x3250 0x27634
+0x3252 0x2763C
+0x3253 0x2780C
+0x3255 0x27C3E
+0x3256 0x27CA3
+0x3257 0x27D30
+0x3258 0x27D31
+0x3259 0x27E97
+0x325A 0x27E98
+0x325B 0x27E99
+0x325C 0x27E9A
+0x325D 0x27E9B
+0x325E 0x282B2
+0x325F 0x282AB
+0x3260 0x282AC
+0x3261 0x286FC
+0x3262 0x286E8
+0x3263 0x286E9
+0x3264 0x286EA
+0x3265 0x287F1
+0x3266 0x2893F
+0x3267 0x28CCE
+0x3268 0x28E6D
+0x3269 0x28E6E
+0x326A 0x28E6F
+0x326B 0x28E70
+0x326C 0x28E71
+0x326D 0x28E72
+0x326E 0x28E73
+0x3270 0x29078
+0x3271 0x2983A
+0x3272 0x20167
+0x3274 0x20164
+0x3275 0x20165
+0x3276 0x20307
+0x3277 0x202C4
+0x3278 0x202C5
+0x3279 0x202C6
+0x327A 0x202C7
+0x327B 0x202C8
+0x327C 0x202C9
+0x327D 0x202E5
+0x327E 0x202CA
+0x3321 0x202CB
+0x3323 0x202CC
+0x3324 0x202CD
+0x3325 0x202CE
+0x3326 0x202CF
+0x3327 0x202D0
+0x3328 0x20497
+0x3329 0x2049A
+0x332A 0x2049B
+0x332B 0x205EA
+0x332C 0x205EC
+0x332D 0x205ED
+0x332E 0x205F7
+0x332F 0x205EE
+0x3330 0x205EF
+0x3331 0x2065B
+0x3332 0x2065C
+0x3333 0x2065D
+0x3334 0x2076D
+0x3335 0x2076E
+0x3337 0x2076F
+0x3338 0x20881
+0x3339 0x20882
+0x333A 0x2094F
+0x333B 0x209AD
+0x333C 0x2870A
+0x333D 0x20A7E
+0x333E 0x20B69
+0x333F 0x20D54
+0x3340 0x20D55
+0x3341 0x20D56
+0x3342 0x20D57
+0x3344 0x20D58
+0x3345 0x20D59
+0x3346 0x20D5A
+0x3347 0x20D5B
+0x3348 0x20D5C
+0x3349 0x20D5D
+0x334C 0x20D5E
+0x334D 0x20D5F
+0x334E 0x2133B
+0x334F 0x21336
+0x3350 0x2133C
+0x3351 0x2133D
+0x3352 0x2133E
+0x3353 0x2133F
+0x3354 0x21340
+0x3355 0x21341
+0x3356 0x21342
+0x3358 0x21343
+0x3359 0x21344
+0x335A 0x21345
+0x335B 0x21337
+0x335E 0x21346
+0x335F 0x21347
+0x3360 0x21348
+0x3361 0x21349
+0x3362 0x2152D
+0x3363 0x215A5
+0x3364 0x2163D
+0x3365 0x2163F
+0x3366 0x2196E
+0x3367 0x217E7
+0x3368 0x21775
+0x3369 0x21776
+0x336A 0x21777
+0x336B 0x21778
+0x336C 0x21779
+0x336D 0x2177A
+0x336E 0x2177B
+0x336F 0x2177C
+0x3370 0x2178E
+0x3371 0x2177D
+0x3372 0x2177E
+0x3374 0x2177F
+0x3375 0x21780
+0x3376 0x21781
+0x3377 0x21782
+0x3378 0x21783
+0x3379 0x21784
+0x337A 0x21785
+0x337B 0x21786
+0x337C 0x21787
+0x337D 0x21788
+0x337E 0x21789
+0x3421 0x2178A
+0x3422 0x2178B
+0x3423 0x2178C
+0x3424 0x2196F
+0x3425 0x21970
+0x3426 0x21971
+0x3427 0x21972
+0x3428 0x21A2A
+0x3429 0x21A2B
+0x342A 0x21A2C
+0x342B 0x21A2D
+0x342C 0x21A2E
+0x342D 0x21A2F
+0x342E 0x21A30
+0x342F 0x21A31
+0x3430 0x21B83
+0x3431 0x21C84
+0x3432 0x21C85
+0x3433 0x21C93
+0x3435 0x21C86
+0x3436 0x21C87
+0x3437 0x21C88
+0x3438 0x21C89
+0x3439 0x21C8A
+0x343A 0x21C8B
+0x343B 0x21E36
+0x343C 0x21E38
+0x343D 0x21E39
+0x343E 0x21E3A
+0x3440 0x21E3B
+0x3441 0x21E3C
+0x3442 0x21E3D
+0x3443 0x21E3E
+0x3444 0x21E3F
+0x3446 0x21E40
+0x3447 0x21E41
+0x3448 0x21E42
+0x3449 0x220DE
+0x344A 0x220DF
+0x344B 0x220E0
+0x344C 0x220E1
+0x344D 0x2224A
+0x344E 0x2224B
+0x344F 0x2224C
+0x3450 0x2224D
+0x3451 0x2224E
+0x3452 0x2224F
+0x3453 0x22250
+0x3454 0x22327
+0x3455 0x223F9
+0x3456 0x223FA
+0x3457 0x223FB
+0x3458 0x22498
+0x3459 0x22499
+0x345A 0x2249A
+0x345C 0x2251E
+0x345D 0x2269E
+0x345E 0x226F7
+0x345F 0x2269F
+0x3460 0x226A0
+0x3461 0x226F0
+0x3462 0x226F8
+0x3463 0x226F9
+0x3464 0x226A1
+0x3465 0x226A2
+0x3466 0x226A3
+0x3467 0x226A4
+0x3468 0x226A5
+0x3469 0x226FA
+0x346A 0x226FB
+0x346B 0x226FC
+0x346C 0x226FD
+0x346D 0x226FE
+0x346E 0x2271F
+0x346F 0x226FF
+0x3470 0x22700
+0x3471 0x2278C
+0x3472 0x22701
+0x3473 0x229C2
+0x3474 0x229C3
+0x3476 0x229D3
+0x3477 0x22A4E
+0x3478 0x22BAF
+0x3479 0x22BB0
+0x347A 0x22BB1
+0x347B 0x22BB2
+0x347C 0x22BB3
+0x347D 0x22BC6
+0x347E 0x22BB4
+0x3522 0x22BB5
+0x3523 0x22BB6
+0x3524 0x22BB7
+0x3525 0x22BB8
+0x3526 0x22BB9
+0x3527 0x22BBA
+0x3528 0x22BBB
+0x3529 0x22BBC
+0x352A 0x22BBD
+0x352B 0x22BBE
+0x352C 0x22BBF
+0x352D 0x22BC1
+0x352E 0x22BC0
+0x352F 0x22BC2
+0x3530 0x22BC3
+0x3531 0x22F51
+0x3532 0x22F52
+0x3533 0x22F53
+0x3534 0x22F54
+0x3535 0x22F55
+0x3536 0x2305A
+0x3537 0x23050
+0x3538 0x23051
+0x3539 0x23078
+0x353A 0x230F8
+0x353B 0x230F9
+0x353C 0x231C6
+0x353D 0x231CB
+0x353E 0x231CC
+0x353F 0x231CD
+0x3540 0x231CE
+0x3541 0x231CF
+0x3542 0x231D0
+0x3543 0x231D1
+0x3544 0x231D2
+0x3545 0x231D3
+0x3546 0x231D4
+0x3547 0x231D5
+0x3549 0x23337
+0x354A 0x23338
+0x354B 0x23373
+0x354C 0x23490
+0x354D 0x23491
+0x354E 0x234BF
+0x354F 0x23492
+0x3550 0x23493
+0x3551 0x23494
+0x3552 0x23495
+0x3553 0x23496
+0x3554 0x23497
+0x3555 0x23498
+0x3556 0x23499
+0x3558 0x2349A
+0x3559 0x2349B
+0x355A 0x2349C
+0x355B 0x2349D
+0x355C 0x2349E
+0x355D 0x2349F
+0x355E 0x234A0
+0x355F 0x234A1
+0x3560 0x234A2
+0x3561 0x234A3
+0x3562 0x234A4
+0x3563 0x234A5
+0x3565 0x234A6
+0x3566 0x234A7
+0x3567 0x238BF
+0x3568 0x238C0
+0x3569 0x238C1
+0x356A 0x238C2
+0x356B 0x238C3
+0x356C 0x238C4
+0x356D 0x238C5
+0x356E 0x238C6
+0x356F 0x23975
+0x3570 0x23A43
+0x3571 0x23A12
+0x3572 0x23A9F
+0x3573 0x23A91
+0x3574 0x2F8F6
+0x3575 0x23A92
+0x3576 0x23A93
+0x3577 0x23A94
+0x3578 0x23B7E
+0x3579 0x23B7F
+0x357A 0x23B80
+0x357B 0x23B81
+0x357C 0x23B82
+0x357D 0x23C4C
+0x357E 0x23C63
+0x3621 0x23DC0
+0x3622 0x23DC1
+0x3623 0x23DC2
+0x3624 0x2423A
+0x3625 0x23DC3
+0x3626 0x23DC4
+0x3627 0x23DC5
+0x3628 0x23DC6
+0x362A 0x23DC7
+0x362C 0x23DC8
+0x362D 0x23D73
+0x362E 0x23DC9
+0x362F 0x23DCA
+0x3630 0x23DCB
+0x3631 0x23DCC
+0x3632 0x23DCD
+0x3636 0x23DCE
+0x3637 0x23DCF
+0x3638 0x23DD0
+0x3639 0x23DD1
+0x363A 0x23DD2
+0x363B 0x23DD3
+0x363C 0x23DD4
+0x363D 0x23DD5
+0x363E 0x2423B
+0x363F 0x2423C
+0x3640 0x2423D
+0x3641 0x2423E
+0x3643 0x2423F
+0x3644 0x24240
+0x3645 0x24241
+0x3646 0x24242
+0x3647 0x24243
+0x3649 0x24244
+0x364A 0x24245
+0x364B 0x24259
+0x364C 0x24246
+0x364D 0x24247
+0x364E 0x24248
+0x3650 0x24249
+0x3651 0x24513
+0x3652 0x24582
+0x3653 0x24583
+0x3654 0x24666
+0x3655 0x24667
+0x3656 0x24965
+0x3658 0x24966
+0x365A 0x24975
+0x365B 0x24974
+0x365C 0x24967
+0x365D 0x2496D
+0x365E 0x24976
+0x365F 0x24968
+0x3660 0x24969
+0x3661 0x2496A
+0x3662 0x2496B
+0x3663 0x2494F
+0x3664 0x2496C
+0x3665 0x24AF8
+0x3666 0x24B45
+0x3668 0x24B46
+0x3669 0x24BE4
+0x366A 0x24C85
+0x366B 0x24C6F
+0x366C 0x24C70
+0x366D 0x24D82
+0x366E 0x24D83
+0x366F 0x24D84
+0x3670 0x24D8B
+0x3671 0x24F2D
+0x3672 0x24F68
+0x3673 0x24F69
+0x3674 0x24F77
+0x3675 0x24F64
+0x3676 0x24F6A
+0x3678 0x24FF2
+0x3679 0x24FE2
+0x367A 0x25063
+0x367B 0x25064
+0x367C 0x25065
+0x367D 0x25066
+0x3721 0x25067
+0x3722 0x25068
+0x3725 0x25172
+0x3726 0x2517D
+0x3727 0x25369
+0x3728 0x25484
+0x3729 0x25486
+0x372A 0x25487
+0x372B 0x25488
+0x372C 0x2549E
+0x372E 0x25489
+0x372F 0x2548A
+0x3730 0x25496
+0x3731 0x2548B
+0x3732 0x2548C
+0x3733 0x2548D
+0x3734 0x25679
+0x3735 0x25683
+0x3736 0x2567A
+0x3737 0x2565D
+0x3738 0x2567B
+0x373A 0x2579F
+0x373C 0x257A0
+0x373D 0x257A1
+0x373E 0x257A2
+0x3740 0x2596A
+0x3741 0x2596B
+0x3742 0x2596C
+0x3743 0x2596D
+0x3744 0x2596E
+0x3745 0x25A78
+0x3747 0x25A79
+0x3748 0x25A7C
+0x3749 0x25B21
+0x374A 0x25B22
+0x374B 0x25B23
+0x374C 0x25B24
+0x374E 0x25B25
+0x374F 0x25B26
+0x3750 0x25E51
+0x3751 0x25E52
+0x3752 0x25E56
+0x3755 0x25FE1
+0x3758 0x25FD6
+0x3759 0x25FD7
+0x375A 0x25FD8
+0x375B 0x25FD9
+0x375C 0x262B5
+0x375D 0x2636C
+0x375E 0x2636F
+0x375F 0x26370
+0x3760 0x264BC
+0x3761 0x264BD
+0x3762 0x264ED
+0x3763 0x2655B
+0x3764 0x2655C
+0x3765 0x2655D
+0x3766 0x2655E
+0x3767 0x26686
+0x3768 0x26687
+0x3769 0x266ED
+0x376B 0x266EE
+0x376D 0x2690E
+0x376E 0x2690F
+0x3770 0x26A2D
+0x3771 0x26A2A
+0x3772 0x26A2E
+0x3773 0x26ACC
+0x3774 0x26BF9
+0x3775 0x26BFA
+0x3776 0x26BFB
+0x3777 0x26BFC
+0x3779 0x26BFD
+0x377A 0x26C1B
+0x377B 0x26BFE
+0x377C 0x26BFF
+0x377D 0x26C00
+0x377E 0x26C01
+0x3821 0x26C02
+0x3822 0x26C03
+0x3823 0x26C21
+0x3824 0x26C04
+0x3825 0x26C05
+0x3826 0x26C06
+0x3827 0x26C07
+0x3828 0x26C08
+0x3829 0x26C09
+0x382A 0x26C0A
+0x382B 0x26C0B
+0x382C 0x26C0C
+0x382D 0x26C0D
+0x382E 0x26C0E
+0x382F 0x26C0F
+0x3830 0x26C10
+0x3831 0x26C11
+0x3832 0x26C12
+0x3833 0x26C13
+0x3834 0x26C14
+0x3835 0x26C15
+0x3836 0x2727B
+0x3837 0x2727C
+0x3838 0x2727D
+0x3839 0x2727E
+0x383B 0x2727F
+0x383C 0x27280
+0x383D 0x27266
+0x383E 0x27281
+0x383F 0x27282
+0x3840 0x27283
+0x3841 0x275B2
+0x3843 0x2767F
+0x3844 0x27672
+0x3845 0x2765A
+0x3846 0x277EB
+0x3847 0x27815
+0x3849 0x27816
+0x384A 0x2F9CA
+0x384B 0x27817
+0x384D 0x278C5
+0x384E 0x278C6
+0x384F 0x278C7
+0x3850 0x27988
+0x3851 0x27989
+0x3853 0x2798A
+0x3854 0x2798B
+0x3855 0x2798C
+0x3856 0x2798D
+0x3857 0x27BDF
+0x3859 0x27D3B
+0x385A 0x27D3C
+0x385B 0x27D3D
+0x385C 0x27D3E
+0x385D 0x27D3F
+0x385E 0x27D40
+0x385F 0x27D41
+0x3860 0x27D42
+0x3861 0x27E5C
+0x3862 0x27EAF
+0x3863 0x27EA9
+0x3864 0x27EAA
+0x3865 0x27EAB
+0x3866 0x27EAC
+0x3867 0x27EB5
+0x3868 0x27EAD
+0x3869 0x27EAE
+0x386A 0x27FE2
+0x386B 0x28224
+0x386D 0x282C4
+0x386F 0x284EA
+0x3870 0x284D3
+0x3871 0x284D4
+0x3872 0x284D5
+0x3873 0x28686
+0x3875 0x28687
+0x3876 0x286FD
+0x3877 0x28805
+0x3878 0x28949
+0x3879 0x28C5F
+0x387A 0x28CD3
+0x387B 0x28CD5
+0x387C 0x28E8A
+0x387D 0x28E8B
+0x387E 0x28E8C
+0x3921 0x28E8D
+0x3922 0x28E8E
+0x3923 0x28E8F
+0x3924 0x28E90
+0x3925 0x28E91
+0x3926 0x28E92
+0x3927 0x28E93
+0x3928 0x2907D
+0x3929 0x2907E
+0x392D 0x291EC
+0x392E 0x2925B
+0x392F 0x29C87
+0x3930 0x29C86
+0x3932 0x20046
+0x3933 0x20047
+0x3934 0x20102
+0x3935 0x2016D
+0x3936 0x2016E
+0x3937 0x2016F
+0x3938 0x2030D
+0x3939 0x2030E
+0x393A 0x2030F
+0x393B 0x20310
+0x393C 0x20311
+0x393D 0x20312
+0x393E 0x20313
+0x393F 0x20314
+0x3940 0x2049F
+0x3941 0x204A0
+0x3942 0x204A1
+0x3943 0x204A3
+0x3944 0x20521
+0x3945 0x20522
+0x3946 0x2337C
+0x3947 0x20595
+0x3948 0x20596
+0x3949 0x20661
+0x394A 0x20667
+0x394B 0x20791
+0x394C 0x20792
+0x394D 0x20793
+0x394E 0x20794
+0x394F 0x2088A
+0x3950 0x2088B
+0x3951 0x208F7
+0x3952 0x20924
+0x3953 0x209B0
+0x3954 0x209B1
+0x3955 0x20A8E
+0x3956 0x20B04
+0x3957 0x20B6A
+0x3958 0x20B6B
+0x3959 0x20B6C
+0x395A 0x20B6D
+0x395B 0x20DE8
+0x395C 0x20E0C
+0x395D 0x20DE9
+0x395E 0x20DEA
+0x395F 0x20E0D
+0x3961 0x20DEB
+0x3962 0x20DEC
+0x3963 0x20DED
+0x3964 0x20DEE
+0x3965 0x20DEF
+0x3966 0x20DF0
+0x3967 0x20DF1
+0x3968 0x20DF2
+0x3969 0x20E16
+0x396A 0x20DF3
+0x396B 0x20E04
+0x396C 0x20E1D
+0x396D 0x20DF4
+0x396E 0x20DF5
+0x396F 0x20DF6
+0x3970 0x20DF7
+0x3972 0x21202
+0x3973 0x21203
+0x3974 0x21204
+0x3975 0x2139A
+0x3976 0x2137C
+0x3977 0x213C5
+0x3978 0x2137D
+0x3979 0x2137E
+0x397A 0x2137F
+0x397B 0x21380
+0x397C 0x21381
+0x3A21 0x21382
+0x3A22 0x21383
+0x3A23 0x21384
+0x3A24 0x21385
+0x3A25 0x21386
+0x3A26 0x21387
+0x3A27 0x215AE
+0x3A28 0x2164D
+0x3A29 0x217B0
+0x3A2A 0x217DC
+0x3A2B 0x217B6
+0x3A2C 0x217B7
+0x3A2D 0x217B8
+0x3A2E 0x217B9
+0x3A2F 0x217BA
+0x3A30 0x217BB
+0x3A31 0x217DB
+0x3A32 0x217BC
+0x3A33 0x217BD
+0x3A34 0x217BE
+0x3A36 0x217BF
+0x3A37 0x217C0
+0x3A38 0x217C1
+0x3A39 0x217C2
+0x3A3A 0x217C3
+0x3A3B 0x217CE
+0x3A3D 0x217D9
+0x3A3E 0x217C4
+0x3A3F 0x217C5
+0x3A40 0x217DA
+0x3A41 0x217C6
+0x3A42 0x217C7
+0x3A43 0x217C8
+0x3A44 0x217C9
+0x3A45 0x217CA
+0x3A46 0x2197E
+0x3A47 0x2197B
+0x3A48 0x21A4E
+0x3A49 0x21A4F
+0x3A4A 0x21A50
+0x3A4B 0x21A51
+0x3A4C 0x21A52
+0x3A4D 0x21A53
+0x3A4E 0x21A54
+0x3A4F 0x21A55
+0x3A50 0x21B8F
+0x3A51 0x21BFC
+0x3A52 0x21CA6
+0x3A53 0x21CA7
+0x3A54 0x21CA8
+0x3A55 0x21D23
+0x3A56 0x21E8B
+0x3A58 0x21E8C
+0x3A59 0x21E8D
+0x3A5A 0x21E8E
+0x3A5B 0x21E8F
+0x3A5C 0x21EA4
+0x3A5D 0x20599
+0x3A5E 0x22024
+0x3A5F 0x22046
+0x3A60 0x22047
+0x3A61 0x22048
+0x3A62 0x220FD
+0x3A63 0x220FE
+0x3A65 0x2226E
+0x3A66 0x2227C
+0x3A67 0x2226F
+0x3A68 0x22270
+0x3A69 0x22271
+0x3A6A 0x22272
+0x3A6B 0x22329
+0x3A6C 0x2232A
+0x3A6D 0x2235F
+0x3A6E 0x224A2
+0x3A6F 0x22530
+0x3A70 0x2252B
+0x3A71 0x22761
+0x3A72 0x22702
+0x3A73 0x22703
+0x3A74 0x22704
+0x3A75 0x22705
+0x3A76 0x22706
+0x3A77 0x22707
+0x3A79 0x22708
+0x3A7A 0x22709
+0x3A7B 0x22762
+0x3A7C 0x2270A
+0x3A7D 0x2270B
+0x3A7E 0x2270C
+0x3B21 0x2270D
+0x3B22 0x2270E
+0x3B23 0x22763
+0x3B24 0x22727
+0x3B25 0x2270F
+0x3B27 0x2271B
+0x3B28 0x22764
+0x3B29 0x22710
+0x3B2A 0x22711
+0x3B2B 0x22781
+0x3B2C 0x22712
+0x3B2D 0x22765
+0x3B2E 0x22713
+0x3B2F 0x229CE
+0x3B30 0x22C29
+0x3B31 0x22BC4
+0x3B32 0x22C2A
+0x3B34 0x22C2B
+0x3B35 0x22C2C
+0x3B36 0x22C2D
+0x3B37 0x22C2E
+0x3B38 0x22C2F
+0x3B39 0x22C30
+0x3B3A 0x22C31
+0x3B3B 0x22C32
+0x3B3C 0x22C33
+0x3B3D 0x22C34
+0x3B3F 0x22C35
+0x3B40 0x22C36
+0x3B41 0x22BE3
+0x3B42 0x22C37
+0x3B43 0x22C38
+0x3B44 0x22C39
+0x3B45 0x22C3A
+0x3B46 0x22C3B
+0x3B47 0x22C4D
+0x3B48 0x22C3C
+0x3B49 0x22C3D
+0x3B4A 0x22C3E
+0x3B4C 0x22ED0
+0x3B4D 0x22ED1
+0x3B4E 0x23055
+0x3B4F 0x23102
+0x3B50 0x23104
+0x3B51 0x231FC
+0x3B52 0x23207
+0x3B53 0x231FD
+0x3B54 0x231FE
+0x3B56 0x231FF
+0x3B57 0x23200
+0x3B58 0x23208
+0x3B59 0x23201
+0x3B5A 0x23202
+0x3B5B 0x23235
+0x3B5C 0x23203
+0x3B5D 0x23204
+0x3B5F 0x2333B
+0x3B60 0x23389
+0x3B61 0x23381
+0x3B62 0x23382
+0x3B63 0x26733
+0x3B64 0x234EB
+0x3B65 0x234EC
+0x3B67 0x234ED
+0x3B68 0x234EE
+0x3B69 0x234EF
+0x3B6B 0x234F0
+0x3B6C 0x234F1
+0x3B6D 0x234F2
+0x3B6F 0x234F3
+0x3B71 0x234F4
+0x3B72 0x234F5
+0x3B73 0x2004B
+0x3B74 0x234F6
+0x3B75 0x234F7
+0x3B76 0x234F8
+0x3B77 0x234F9
+0x3B78 0x234FA
+0x3B79 0x234FB
+0x3B7A 0x234FC
+0x3B7B 0x234FD
+0x3B7C 0x234FE
+0x3B7D 0x234FF
+0x3B7E 0x23500
+0x3C22 0x23501
+0x3C23 0x23502
+0x3C24 0x23503
+0x3C25 0x23504
+0x3C26 0x23505
+0x3C27 0x23506
+0x3C28 0x23507
+0x3C2A 0x23508
+0x3C2B 0x23509
+0x3C2C 0x2350A
+0x3C2D 0x2350B
+0x3C2E 0x2350C
+0x3C2F 0x2350D
+0x3C30 0x238D7
+0x3C31 0x238D8
+0x3C32 0x23A29
+0x3C33 0x23A9C
+0x3C34 0x23AF8
+0x3C35 0x23B98
+0x3C36 0x23BA4
+0x3C37 0x23B99
+0x3C38 0x23B9A
+0x3C39 0x23B9B
+0x3C3A 0x23B97
+0x3C3B 0x23B9C
+0x3C3D 0x23B9D
+0x3C3F 0x23B9E
+0x3C40 0x23B9F
+0x3C41 0x23C65
+0x3C42 0x23DD6
+0x3C44 0x23E32
+0x3C45 0x23E33
+0x3C46 0x23E34
+0x3C48 0x23E35
+0x3C49 0x23E36
+0x3C4A 0x23E37
+0x3C4B 0x23DD7
+0x3C4D 0x23DD8
+0x3C4E 0x23E38
+0x3C4F 0x23E39
+0x3C50 0x23E3A
+0x3C51 0x23E3B
+0x3C52 0x23E3C
+0x3C53 0x23E3D
+0x3C54 0x23E3E
+0x3C55 0x23E3F
+0x3C56 0x23E40
+0x3C57 0x23DD9
+0x3C58 0x23E41
+0x3C59 0x23E42
+0x3C5B 0x23E43
+0x3C5C 0x23E44
+0x3C5E 0x2427C
+0x3C5F 0x2427D
+0x3C60 0x2427E
+0x3C61 0x2427F
+0x3C62 0x24280
+0x3C63 0x24281
+0x3C64 0x24282
+0x3C66 0x24283
+0x3C67 0x24284
+0x3C68 0x24285
+0x3C69 0x24286
+0x3C6A 0x242A5
+0x3C6B 0x24287
+0x3C6C 0x24288
+0x3C6D 0x24289
+0x3C6E 0x2428A
+0x3C6F 0x2428B
+0x3C70 0x2428C
+0x3C71 0x2428D
+0x3C72 0x2428E
+0x3C75 0x2428F
+0x3C77 0x24290
+0x3C78 0x24291
+0x3C79 0x24292
+0x3C7A 0x24293
+0x3C7B 0x24294
+0x3C7C 0x24295
+0x3D21 0x24296
+0x3D22 0x24556
+0x3D23 0x24557
+0x3D24 0x245E1
+0x3D25 0x2460E
+0x3D26 0x2460F
+0x3D27 0x2467A
+0x3D28 0x2467B
+0x3D29 0x2468B
+0x3D2A 0x247F2
+0x3D2B 0x247F3
+0x3D2C 0x24993
+0x3D2D 0x24994
+0x3D2E 0x24995
+0x3D2F 0x24996
+0x3D30 0x24997
+0x3D31 0x249AD
+0x3D32 0x24998
+0x3D33 0x249AB
+0x3D34 0x2497B
+0x3D35 0x24999
+0x3D36 0x2499A
+0x3D37 0x2499B
+0x3D38 0x24985
+0x3D39 0x2499C
+0x3D3A 0x2499D
+0x3D3D 0x249AC
+0x3D3E 0x24979
+0x3D3F 0x2499E
+0x3D40 0x249A4
+0x3D41 0x24AFD
+0x3D42 0x24BEB
+0x3D43 0x24BEA
+0x3D44 0x24C8F
+0x3D45 0x24C90
+0x3D46 0x24C86
+0x3D47 0x24C87
+0x3D48 0x24C88
+0x3D49 0x24DAC
+0x3D4A 0x24DAD
+0x3D4B 0x24FEC
+0x3D4C 0x25073
+0x3D4D 0x25074
+0x3D4F 0x251AA
+0x3D50 0x251AB
+0x3D51 0x251AC
+0x3D52 0x253D1
+0x3D53 0x253D7
+0x3D54 0x254B9
+0x3D55 0x254BA
+0x3D56 0x254BB
+0x3D57 0x254BC
+0x3D58 0x2568E
+0x3D59 0x2568F
+0x3D5A 0x25690
+0x3D5B 0x2567C
+0x3D5C 0x25691
+0x3D5D 0x25692
+0x3D5E 0x25693
+0x3D5F 0x25694
+0x3D60 0x2F954
+0x3D61 0x2569A
+0x3D62 0x25695
+0x3D63 0x25696
+0x3D64 0x25697
+0x3D65 0x257BD
+0x3D66 0x257C7
+0x3D67 0x257BE
+0x3D69 0x257BF
+0x3D6B 0x25993
+0x3D6C 0x21A5E
+0x3D6D 0x25A86
+0x3D6E 0x25A87
+0x3D6F 0x25A88
+0x3D70 0x25A89
+0x3D71 0x25B41
+0x3D72 0x25B42
+0x3D73 0x25B43
+0x3D74 0x25B44
+0x3D75 0x25B45
+0x3D76 0x25B46
+0x3D77 0x25B4A
+0x3D78 0x25B47
+0x3D79 0x25B48
+0x3D7A 0x25B49
+0x3D7B 0x25E6B
+0x3D7C 0x25E66
+0x3D7E 0x25E67
+0x3E22 0x25E68
+0x3E25 0x25FFD
+0x3E26 0x25FFE
+0x3E27 0x25FFF
+0x3E28 0x26000
+0x3E29 0x26001
+0x3E2A 0x26002
+0x3E2B 0x26003
+0x3E2C 0x26004
+0x3E2D 0x26005
+0x3E2E 0x26006
+0x3E2F 0x26233
+0x3E30 0x262C2
+0x3E31 0x262D0
+0x3E32 0x2F974
+0x3E33 0x26395
+0x3E34 0x26396
+0x3E35 0x26435
+0x3E36 0x26436
+0x3E37 0x26567
+0x3E38 0x26568
+0x3E39 0x26569
+0x3E3A 0x2656A
+0x3E3B 0x26572
+0x3E3C 0x2656B
+0x3E3D 0x2656C
+0x3E3E 0x2656D
+0x3E3F 0x2656E
+0x3E40 0x2656F
+0x3E41 0x26722
+0x3E44 0x26723
+0x3E45 0x26741
+0x3E46 0x26724
+0x3E47 0x26725
+0x3E48 0x26726
+0x3E49 0x26727
+0x3E4A 0x26728
+0x3E4B 0x26729
+0x3E4C 0x266B7
+0x3E50 0x269DA
+0x3E51 0x26ACF
+0x3E52 0x26ADA
+0x3E53 0x26C89
+0x3E54 0x26CB7
+0x3E55 0x26C8A
+0x3E56 0x26C8B
+0x3E57 0x26D5E
+0x3E58 0x26C8C
+0x3E5A 0x26C8D
+0x3E5B 0x26C8E
+0x3E5C 0x26C8F
+0x3E5D 0x26C90
+0x3E5E 0x26C91
+0x3E5F 0x26C92
+0x3E60 0x26C93
+0x3E61 0x26C94
+0x3E62 0x26CB6
+0x3E63 0x26C95
+0x3E64 0x26C96
+0x3E65 0x26C97
+0x3E68 0x26C98
+0x3E69 0x26C99
+0x3E6A 0x26C9A
+0x3E6D 0x26C9B
+0x3E6E 0x26CBD
+0x3E6F 0x26C9C
+0x3E70 0x26C9D
+0x3E71 0x26C9E
+0x3E72 0x26C9F
+0x3E73 0x26CC0
+0x3E74 0x26CA0
+0x3E75 0x26CA1
+0x3E76 0x26CA2
+0x3E77 0x26CA3
+0x3E78 0x26CA4
+0x3E79 0x26CA5
+0x3E7A 0x26CA6
+0x3E7B 0x26CA7
+0x3E7C 0x26CA8
+0x3E7D 0x26CA9
+0x3E7E 0x26CAA
+0x3F22 0x271B4
+0x3F23 0x271B5
+0x3F24 0x271B6
+0x3F25 0x272B9
+0x3F26 0x272BA
+0x3F27 0x272BB
+0x3F28 0x27291
+0x3F29 0x272BC
+0x3F2A 0x275EE
+0x3F2B 0x275EF
+0x3F2C 0x27696
+0x3F2D 0x27697
+0x3F2E 0x27673
+0x3F2F 0x27698
+0x3F30 0x27699
+0x3F31 0x277ED
+0x3F32 0x277EE
+0x3F33 0x278DE
+0x3F34 0x279B0
+0x3F35 0x279B1
+0x3F36 0x279B2
+0x3F37 0x279B3
+0x3F38 0x279B4
+0x3F39 0x279B5
+0x3F3A 0x279B6
+0x3F3B 0x2F9CE
+0x3F3C 0x279B7
+0x3F3D 0x27BE3
+0x3F3E 0x27CB9
+0x3F3F 0x27D55
+0x3F40 0x27D7E
+0x3F41 0x27D56
+0x3F42 0x27D57
+0x3F43 0x27D58
+0x3F44 0x27D59
+0x3F45 0x27D5A
+0x3F47 0x27EC4
+0x3F48 0x27EC5
+0x3F49 0x27EC6
+0x3F4A 0x27EC7
+0x3F4B 0x27EC8
+0x3F4C 0x27EC9
+0x3F4D 0x27EEE
+0x3F4E 0x27ECF
+0x3F4F 0x27ECA
+0x3F50 0x27ECB
+0x3F51 0x27ECC
+0x3F52 0x28009
+0x3F53 0x2F9DA
+0x3F54 0x28003
+0x3F55 0x2822F
+0x3F56 0x28230
+0x3F57 0x28231
+0x3F58 0x28232
+0x3F59 0x2850E
+0x3F5A 0x2850F
+0x3F5B 0x28510
+0x3F5C 0x28511
+0x3F5D 0x28512
+0x3F5F 0x28513
+0x3F60 0x28514
+0x3F61 0x28515
+0x3F62 0x284FF
+0x3F63 0x2871F
+0x3F64 0x28720
+0x3F65 0x28721
+0x3F66 0x2872D
+0x3F68 0x2881B
+0x3F69 0x2881C
+0x3F6A 0x2881D
+0x3F6B 0x2881E
+0x3F6C 0x28953
+0x3F6D 0x28954
+0x3F6E 0x28955
+0x3F6F 0x28956
+0x3F70 0x28964
+0x3F71 0x28959
+0x3F72 0x28957
+0x3F74 0x28958
+0x3F75 0x28C6B
+0x3F78 0x28CE7
+0x3F79 0x28CE8
+0x3F7A 0x28CE9
+0x3F7B 0x28CEA
+0x3F7C 0x28CEB
+0x3F7D 0x28CEC
+0x4021 0x28CED
+0x4022 0x28EB1
+0x4023 0x28EB4
+0x4025 0x2908A
+0x4026 0x2908D
+0x4027 0x2908C
+0x4028 0x291F2
+0x4029 0x291F3
+0x402B 0x22108
+0x402C 0x29417
+0x402E 0x2959F
+0x402F 0x296A0
+0x4031 0x2986D
+0x4032 0x2307D
+0x4033 0x29F90
+0x4034 0x2A5C4
+0x4035 0x2004C
+0x4036 0x20174
+0x4037 0x20175
+0x4038 0x20176
+0x4039 0x20349
+0x403A 0x2034A
+0x403B 0x2034B
+0x403C 0x2034C
+0x403D 0x2034D
+0x403E 0x2034E
+0x403F 0x2034F
+0x4040 0x20350
+0x4041 0x20351
+0x4042 0x20352
+0x4043 0x20353
+0x4044 0x20354
+0x4045 0x20355
+0x4046 0x20356
+0x4047 0x204A4
+0x4048 0x204A9
+0x4049 0x2052A
+0x404A 0x2052B
+0x404B 0x207B3
+0x404C 0x207C1
+0x404D 0x20898
+0x404E 0x208FB
+0x404F 0x208FC
+0x4050 0x209BC
+0x4051 0x20A96
+0x4052 0x20B0A
+0x4054 0x20EA2
+0x4056 0x20E81
+0x4057 0x20E82
+0x4058 0x20E83
+0x4059 0x20E84
+0x405A 0x20E85
+0x405B 0x20E86
+0x405C 0x20E87
+0x405D 0x20E88
+0x405E 0x20E89
+0x405F 0x20E8A
+0x4060 0x20E8B
+0x4061 0x20E8C
+0x4063 0x20E8D
+0x4064 0x20ED1
+0x4065 0x21214
+0x4066 0x213C9
+0x4067 0x213CA
+0x4068 0x213CB
+0x4069 0x29AFD
+0x406A 0x213CC
+0x406B 0x213CD
+0x406C 0x213CE
+0x406D 0x213CF
+0x406E 0x213D0
+0x406F 0x213D1
+0x4070 0x213D2
+0x4071 0x213D3
+0x4072 0x213D4
+0x4073 0x213D5
+0x4074 0x21571
+0x4075 0x2004D
+0x4076 0x21662
+0x4077 0x2180E
+0x4078 0x217FE
+0x4079 0x217FF
+0x407A 0x21800
+0x407C 0x21801
+0x407D 0x21802
+0x407E 0x21803
+0x4121 0x21815
+0x4122 0x21804
+0x4123 0x21805
+0x4125 0x21987
+0x4126 0x21989
+0x4127 0x21A6E
+0x4128 0x21A6F
+0x4129 0x21A70
+0x412A 0x21A71
+0x412B 0x2F86E
+0x412C 0x21A72
+0x412D 0x21A73
+0x412E 0x21A74
+0x412F 0x21B9D
+0x4130 0x21CB8
+0x4131 0x21CB9
+0x4132 0x21CBA
+0x4133 0x21EC2
+0x4134 0x21EC3
+0x4135 0x21ED5
+0x4136 0x21EC4
+0x4137 0x21EC0
+0x4138 0x21EC5
+0x4139 0x21EC6
+0x413A 0x2228A
+0x413B 0x2228B
+0x413C 0x2228C
+0x413D 0x22364
+0x413E 0x25B8C
+0x4140 0x2240D
+0x4141 0x224A8
+0x4142 0x2253B
+0x4143 0x2253C
+0x4144 0x2253D
+0x4145 0x2253E
+0x4146 0x2253F
+0x4147 0x22540
+0x4148 0x22766
+0x4149 0x227CB
+0x414A 0x227B7
+0x414B 0x227B8
+0x414C 0x227B9
+0x414D 0x227BA
+0x414E 0x22767
+0x414F 0x227BB
+0x4150 0x22768
+0x4151 0x22769
+0x4152 0x2276A
+0x4153 0x227BC
+0x4155 0x229DB
+0x4156 0x22C81
+0x4157 0x22C82
+0x4158 0x22C83
+0x4159 0x22C84
+0x415A 0x22C85
+0x415B 0x22C86
+0x415C 0x22C87
+0x415D 0x22C88
+0x415E 0x22C89
+0x415F 0x2F8BF
+0x4160 0x22C8A
+0x4161 0x22C8B
+0x4163 0x22C8C
+0x4164 0x22C8D
+0x4165 0x22C8E
+0x4166 0x22C8F
+0x4167 0x22C90
+0x4168 0x22CA1
+0x4169 0x22C91
+0x416A 0x22ED6
+0x416B 0x22F9F
+0x416C 0x23058
+0x416D 0x23085
+0x416E 0x2310B
+0x416F 0x2310C
+0x4170 0x23237
+0x4171 0x23238
+0x4172 0x2F8CE
+0x4173 0x23239
+0x4174 0x2323A
+0x4175 0x2323B
+0x4176 0x2323C
+0x4177 0x2323D
+0x4178 0x2323E
+0x4179 0x23240
+0x417A 0x23241
+0x417B 0x23242
+0x417D 0x23243
+0x417E 0x2338A
+0x4221 0x2338B
+0x4222 0x23590
+0x4223 0x23559
+0x4224 0x2355B
+0x4225 0x2355C
+0x4226 0x2355D
+0x4227 0x2355E
+0x4229 0x2355F
+0x422A 0x23560
+0x422B 0x23561
+0x422C 0x23562
+0x422D 0x23563
+0x422E 0x23564
+0x422F 0x23593
+0x4230 0x23565
+0x4231 0x23566
+0x4232 0x23567
+0x4233 0x23568
+0x4234 0x23569
+0x4235 0x2356A
+0x4236 0x2356B
+0x4237 0x23595
+0x4238 0x2356C
+0x4239 0x2356D
+0x423A 0x2356E
+0x423B 0x2356F
+0x423D 0x23570
+0x423E 0x23571
+0x423F 0x23572
+0x4240 0x23573
+0x4241 0x23574
+0x4242 0x23575
+0x4243 0x23576
+0x4244 0x23577
+0x4245 0x23578
+0x4246 0x23579
+0x4248 0x2357A
+0x424A 0x2357B
+0x424B 0x235A9
+0x424C 0x2357C
+0x424D 0x238F1
+0x424E 0x238EB
+0x424F 0x2398A
+0x4250 0x23A3D
+0x4251 0x23AA6
+0x4252 0x23AA7
+0x4253 0x23BBA
+0x4255 0x23BBB
+0x4256 0x23BBC
+0x4257 0x23BBD
+0x4258 0x23E91
+0x4259 0x23E92
+0x425A 0x23E93
+0x425B 0x23E94
+0x425C 0x23E95
+0x425D 0x23E96
+0x425E 0x23E97
+0x425F 0x23DDA
+0x4260 0x23E98
+0x4261 0x23E99
+0x4262 0x23E9A
+0x4265 0x23E9B
+0x4266 0x23E9C
+0x4267 0x23E9D
+0x4268 0x23E9E
+0x4269 0x23E9F
+0x426A 0x23EA0
+0x426B 0x23EBF
+0x426C 0x23EA1
+0x426D 0x23EA2
+0x426E 0x23EA3
+0x426F 0x23EA4
+0x4270 0x23EA5
+0x4271 0x23EA6
+0x4272 0x23EA7
+0x4273 0x23E5B
+0x4274 0x2F90D
+0x4275 0x23EA8
+0x4276 0x242CB
+0x4279 0x242CC
+0x427A 0x2434F
+0x427B 0x242CD
+0x427C 0x242CE
+0x427D 0x242CF
+0x427E 0x2434E
+0x4321 0x242D0
+0x4322 0x242D1
+0x4323 0x242D2
+0x4325 0x242D3
+0x4326 0x242D4
+0x4327 0x242D5
+0x4328 0x242D6
+0x4329 0x242D7
+0x432A 0x242D8
+0x432B 0x242D9
+0x432C 0x242FA
+0x432D 0x242DA
+0x432E 0x242DB
+0x432F 0x2F91C
+0x4330 0x242DC
+0x4333 0x242DD
+0x4334 0x242DE
+0x4335 0x242DF
+0x4336 0x242E0
+0x4337 0x242E1
+0x4338 0x242E2
+0x4339 0x242E3
+0x433A 0x242E4
+0x433B 0x242E5
+0x433D 0x242E6
+0x433E 0x242E7
+0x433F 0x2458E
+0x4340 0x24698
+0x4341 0x24699
+0x4343 0x2480A
+0x4345 0x24826
+0x4346 0x24827
+0x4347 0x249BD
+0x4348 0x249DF
+0x434A 0x249BE
+0x434B 0x249DE
+0x434C 0x249BF
+0x434D 0x249C0
+0x434E 0x249C1
+0x434F 0x249C2
+0x4350 0x2499F
+0x4351 0x249C3
+0x4352 0x249C4
+0x4353 0x249C5
+0x4354 0x249C6
+0x4355 0x249C7
+0x4357 0x249C8
+0x4358 0x249C9
+0x4359 0x249E3
+0x435A 0x249CA
+0x435B 0x249CB
+0x435C 0x249CC
+0x435D 0x249CD
+0x435E 0x249CE
+0x435F 0x249CF
+0x4360 0x249D0
+0x4361 0x249D1
+0x4362 0x249D2
+0x4363 0x249D3
+0x4364 0x2F92F
+0x4365 0x249D4
+0x4366 0x24B04
+0x4367 0x24B65
+0x4368 0x24BEE
+0x4369 0x24CA0
+0x436A 0x24CA1
+0x436B 0x24DDD
+0x436C 0x24DDE
+0x436D 0x24F83
+0x436E 0x24FFA
+0x436F 0x2507F
+0x4370 0x25080
+0x4371 0x251E8
+0x4372 0x251E9
+0x4373 0x251EA
+0x4374 0x235A6
+0x4375 0x253E1
+0x4377 0x254DB
+0x4378 0x254DC
+0x4379 0x254DD
+0x437A 0x254DE
+0x437B 0x254DF
+0x437C 0x254E0
+0x437D 0x254E1
+0x437E 0x254E2
+0x4421 0x254E3
+0x4422 0x254E4
+0x4423 0x254E5
+0x4424 0x254E6
+0x4426 0x254E7
+0x4427 0x256B0
+0x4428 0x25698
+0x4429 0x256B1
+0x442A 0x25699
+0x442B 0x256B2
+0x442C 0x256B3
+0x442D 0x256B4
+0x442E 0x256B5
+0x442F 0x256B6
+0x4430 0x256B7
+0x4431 0x256B8
+0x4432 0x256B9
+0x4433 0x257E2
+0x4434 0x257E3
+0x4435 0x257E4
+0x4436 0x257E5
+0x4437 0x257E6
+0x4438 0x257E7
+0x4439 0x257E8
+0x443A 0x257E9
+0x443B 0x259AD
+0x443C 0x259CF
+0x443D 0x259AE
+0x443E 0x259AF
+0x443F 0x259B0
+0x4440 0x259B1
+0x4441 0x25A92
+0x4442 0x25A93
+0x4443 0x25A94
+0x4444 0x25B79
+0x4446 0x25B7A
+0x4447 0x25B7B
+0x4448 0x25B7C
+0x4449 0x25B7D
+0x444A 0x25B7E
+0x444B 0x25B7F
+0x444C 0x25B80
+0x444D 0x25B81
+0x444E 0x25B82
+0x444F 0x25B83
+0x4450 0x25B84
+0x4451 0x25E97
+0x4452 0x25E84
+0x4453 0x25E85
+0x4454 0x25E89
+0x4455 0x25E86
+0x4456 0x25E87
+0x4457 0x2602C
+0x4458 0x2602D
+0x4459 0x2602E
+0x445A 0x2602F
+0x445B 0x26030
+0x445C 0x26031
+0x445D 0x26032
+0x445E 0x26033
+0x445F 0x26034
+0x4460 0x26035
+0x4461 0x26036
+0x4462 0x26037
+0x4463 0x262D2
+0x4464 0x26444
+0x4465 0x26500
+0x4466 0x26583
+0x4467 0x26584
+0x4468 0x2F986
+0x4469 0x2677A
+0x446A 0x2677B
+0x446B 0x2677C
+0x446C 0x2677D
+0x446D 0x2677E
+0x446F 0x2677F
+0x4470 0x26787
+0x4471 0x26780
+0x4472 0x26A43
+0x4473 0x26D34
+0x4475 0x26D35
+0x4476 0x26D36
+0x4477 0x26D37
+0x4478 0x26D38
+0x4479 0x26D39
+0x447A 0x26D3A
+0x447B 0x26D3B
+0x447C 0x26D3C
+0x447D 0x26D3D
+0x447E 0x26D3E
+0x4521 0x26D3F
+0x4522 0x26D40
+0x4523 0x26D41
+0x4524 0x26D42
+0x4525 0x26D43
+0x4526 0x26D44
+0x4527 0x26D45
+0x4528 0x26D46
+0x4529 0x26D47
+0x452A 0x26D48
+0x452B 0x26D49
+0x452C 0x26D4A
+0x452E 0x26D4B
+0x452F 0x26D4C
+0x4530 0x26D4D
+0x4531 0x26D4E
+0x4532 0x272E7
+0x4533 0x272E8
+0x4534 0x272E9
+0x4535 0x272EA
+0x4536 0x272EB
+0x4537 0x272EC
+0x4538 0x272ED
+0x4539 0x272EE
+0x453A 0x275F7
+0x453B 0x2769A
+0x453C 0x276CD
+0x453D 0x2F9C8
+0x453E 0x276A3
+0x453F 0x276CE
+0x4540 0x27831
+0x4541 0x27832
+0x4542 0x27833
+0x4543 0x279E4
+0x4545 0x279E5
+0x4546 0x279E6
+0x4547 0x27CC8
+0x4548 0x27D74
+0x4549 0x27D75
+0x454A 0x27D76
+0x454B 0x27D77
+0x454C 0x27D78
+0x454D 0x27D79
+0x454E 0x27D7A
+0x454F 0x27E61
+0x4550 0x27EDF
+0x4551 0x27EE0
+0x4552 0x27EE1
+0x4553 0x27EE2
+0x4554 0x27EE3
+0x4555 0x27EE4
+0x4556 0x27EE5
+0x4557 0x27EE6
+0x4559 0x28031
+0x455A 0x2823D
+0x455B 0x2823E
+0x455C 0x2823F
+0x455D 0x282F4
+0x455E 0x282F5
+0x455F 0x282F6
+0x4561 0x28417
+0x4562 0x28541
+0x4563 0x28542
+0x4564 0x28543
+0x4565 0x28544
+0x4566 0x28545
+0x4567 0x28546
+0x4568 0x28547
+0x4569 0x28548
+0x456A 0x28549
+0x456B 0x2854A
+0x456C 0x2854B
+0x456E 0x286BA
+0x456F 0x28744
+0x4570 0x2892A
+0x4571 0x2896D
+0x4573 0x2F9E7
+0x4574 0x2897E
+0x4575 0x2896E
+0x4576 0x2896F
+0x4577 0x28970
+0x4578 0x28971
+0x4579 0x28976
+0x457A 0x28C79
+0x457D 0x28D04
+0x457E 0x28CF8
+0x4621 0x28D05
+0x4622 0x28EDA
+0x4623 0x28EDB
+0x4624 0x28EDC
+0x4625 0x28EDD
+0x4626 0x28EDE
+0x4627 0x28EDF
+0x4628 0x28EE0
+0x4629 0x28EE1
+0x462A 0x290C5
+0x462B 0x2909A
+0x462C 0x2909B
+0x462D 0x2909C
+0x462E 0x291D8
+0x462F 0x291D9
+0x4630 0x291DA
+0x4631 0x2926E
+0x4633 0x2946B
+0x4634 0x27D83
+0x4636 0x296D6
+0x4637 0x296BD
+0x4639 0x2322E
+0x463A 0x29AFC
+0x463B 0x29D53
+0x463C 0x29DB7
+0x463D 0x2A28C
+0x463E 0x2A38E
+0x463F 0x2A2FF
+0x4640 0x20076
+0x4641 0x20106
+0x4642 0x2017E
+0x4643 0x20384
+0x4644 0x20385
+0x4645 0x20386
+0x4646 0x20387
+0x4647 0x20388
+0x4648 0x203A7
+0x4649 0x20389
+0x464A 0x2038A
+0x464B 0x2038B
+0x464C 0x2038C
+0x464D 0x2038D
+0x464E 0x2038E
+0x464F 0x2038F
+0x4650 0x203A3
+0x4651 0x20390
+0x4652 0x20391
+0x4653 0x20392
+0x4654 0x20393
+0x4655 0x203AC
+0x4656 0x20394
+0x4657 0x20395
+0x4658 0x20396
+0x4659 0x204AA
+0x465A 0x204AB
+0x465B 0x2059E
+0x465D 0x20608
+0x465E 0x20609
+0x465F 0x20668
+0x4660 0x20669
+0x4661 0x2066A
+0x4662 0x2069A
+0x4663 0x207D9
+0x4664 0x207DA
+0x4665 0x207DB
+0x4666 0x208A8
+0x4667 0x20901
+0x4668 0x20928
+0x4669 0x20977
+0x466A 0x209BD
+0x466B 0x209BE
+0x466C 0x20F60
+0x466D 0x20AA0
+0x466E 0x20AA2
+0x466F 0x20B0F
+0x4670 0x20B85
+0x4671 0x20EFE
+0x4672 0x20EFF
+0x4673 0x20F00
+0x4674 0x20F01
+0x4675 0x20F16
+0x4676 0x20F02
+0x4677 0x20F03
+0x4678 0x20F04
+0x4679 0x20F05
+0x467A 0x20F06
+0x467B 0x20F07
+0x467C 0x20F08
+0x467D 0x20F22
+0x467E 0x20F09
+0x4721 0x20F0A
+0x4722 0x20F0B
+0x4723 0x20F0C
+0x4724 0x20F14
+0x4725 0x20F29
+0x4726 0x20E6E
+0x4727 0x20F0D
+0x4728 0x20F0E
+0x4729 0x20F0F
+0x472A 0x20F10
+0x472B 0x20F11
+0x472C 0x20F12
+0x472D 0x20F13
+0x472E 0x2121B
+0x472F 0x2121C
+0x4730 0x2121D
+0x4731 0x21413
+0x4732 0x213FF
+0x4733 0x21400
+0x4734 0x21401
+0x4735 0x21402
+0x4736 0x21403
+0x4737 0x21404
+0x4738 0x2140A
+0x4739 0x21405
+0x473A 0x21406
+0x473B 0x21407
+0x473C 0x21408
+0x473D 0x2153A
+0x473E 0x21573
+0x473F 0x2166F
+0x4740 0x21670
+0x4741 0x21671
+0x4742 0x20052
+0x4744 0x21A9A
+0x4745 0x21860
+0x4746 0x2F869
+0x4747 0x2182B
+0x4748 0x21824
+0x4749 0x2182C
+0x474A 0x2182D
+0x474B 0x2182E
+0x474C 0x2182F
+0x474D 0x21830
+0x474E 0x21831
+0x474F 0x21832
+0x4750 0x21833
+0x4751 0x21834
+0x4752 0x21835
+0x4753 0x21845
+0x4754 0x21836
+0x4755 0x21992
+0x4756 0x21993
+0x4757 0x21A88
+0x4758 0x21A89
+0x4759 0x21A8A
+0x475A 0x21A8B
+0x475B 0x21B3F
+0x475D 0x21CCA
+0x475E 0x21EF6
+0x475F 0x21EF7
+0x4760 0x21EF8
+0x4761 0x21EF9
+0x4762 0x2212B
+0x4764 0x221A4
+0x4765 0x221CE
+0x4767 0x2229E
+0x4768 0x2229F
+0x4769 0x222A0
+0x476A 0x222A1
+0x476B 0x222A2
+0x476C 0x222A3
+0x476D 0x222A4
+0x476E 0x222A5
+0x476F 0x222A6
+0x4770 0x22418
+0x4771 0x22560
+0x4772 0x22561
+0x4773 0x22562
+0x4774 0x22563
+0x4775 0x22564
+0x4776 0x227BD
+0x4777 0x227BE
+0x4778 0x2280B
+0x4779 0x227BF
+0x477A 0x227C0
+0x477C 0x2280C
+0x477D 0x2278D
+0x477E 0x2280D
+0x4821 0x2280E
+0x4822 0x2285E
+0x4823 0x2280F
+0x4824 0x22810
+0x4825 0x227C1
+0x4826 0x22811
+0x4828 0x227C2
+0x4829 0x229EA
+0x482A 0x229EB
+0x482B 0x22CE3
+0x482C 0x22CE4
+0x482D 0x22CE5
+0x482E 0x22CE6
+0x482F 0x22CE7
+0x4830 0x22C92
+0x4831 0x22D4A
+0x4833 0x22CE8
+0x4834 0x22CE9
+0x4835 0x22CEA
+0x4836 0x22D01
+0x4837 0x22CEB
+0x4838 0x22CEC
+0x4839 0x22CEF
+0x483A 0x22CED
+0x483B 0x22CEE
+0x483C 0x22CF0
+0x483D 0x22CF1
+0x483E 0x22CF2
+0x483F 0x22CF3
+0x4840 0x22CF4
+0x4841 0x22CF5
+0x4842 0x22CF6
+0x4843 0x22CF7
+0x4844 0x22CF8
+0x4845 0x22CF9
+0x4846 0x22CFE
+0x4847 0x22CFA
+0x4848 0x22CFB
+0x4849 0x22CFC
+0x484A 0x23263
+0x484B 0x23264
+0x484C 0x23265
+0x484D 0x23266
+0x484E 0x23267
+0x484F 0x23268
+0x4850 0x2360B
+0x4851 0x2360D
+0x4853 0x2360E
+0x4854 0x2360F
+0x4856 0x23614
+0x4857 0x235D4
+0x4858 0x235D5
+0x4859 0x235D6
+0x485A 0x235D7
+0x485B 0x235D8
+0x485C 0x235D9
+0x485D 0x235DA
+0x485E 0x235DB
+0x485F 0x235DC
+0x4860 0x235DD
+0x4861 0x235DE
+0x4862 0x235DF
+0x4863 0x235E0
+0x4864 0x235E1
+0x4865 0x235E2
+0x4866 0x235E3
+0x4867 0x235E4
+0x4868 0x235E5
+0x4869 0x235E6
+0x486A 0x235E7
+0x486B 0x235E8
+0x486C 0x235E9
+0x486D 0x235EA
+0x486E 0x235EB
+0x486F 0x235EC
+0x4870 0x236EC
+0x4871 0x235ED
+0x4872 0x235EE
+0x4873 0x235EF
+0x4874 0x23600
+0x4875 0x235F0
+0x4876 0x23904
+0x4878 0x23905
+0x4879 0x2F8F3
+0x487A 0x23AB5
+0x487B 0x2F8F9
+0x487C 0x23BD6
+0x487D 0x23BD7
+0x487E 0x23BD8
+0x4921 0x23BD9
+0x4922 0x23EA9
+0x4923 0x23F00
+0x4924 0x23F01
+0x4925 0x23F02
+0x4926 0x23F03
+0x4927 0x23F04
+0x4928 0x23F05
+0x4929 0x23F06
+0x492A 0x23F3F
+0x492B 0x23F07
+0x492C 0x23F08
+0x492D 0x23F09
+0x492E 0x23F0A
+0x492F 0x23EB6
+0x4930 0x23F0B
+0x4931 0x23F0C
+0x4934 0x23F0D
+0x4936 0x23F0E
+0x4937 0x23F0F
+0x4938 0x23F10
+0x4939 0x23F11
+0x493A 0x23F12
+0x493B 0x23F35
+0x493C 0x23F13
+0x493D 0x23F14
+0x493E 0x23EAA
+0x4940 0x23FC1
+0x4941 0x23F15
+0x4942 0x23F16
+0x4943 0x23F17
+0x4944 0x2431E
+0x4945 0x2431F
+0x4946 0x24320
+0x4947 0x24321
+0x4949 0x24322
+0x494A 0x24323
+0x494C 0x24324
+0x494D 0x24325
+0x494E 0x24326
+0x494F 0x24327
+0x4950 0x24328
+0x4951 0x24329
+0x4952 0x2432A
+0x4953 0x2432B
+0x4954 0x24307
+0x4955 0x2432C
+0x4956 0x2432D
+0x4957 0x2432E
+0x495A 0x2432F
+0x495B 0x24330
+0x495C 0x24348
+0x495D 0x24331
+0x495E 0x24332
+0x4960 0x24333
+0x4962 0x24334
+0x4963 0x24335
+0x4964 0x24336
+0x4965 0x24559
+0x4966 0x24591
+0x4967 0x245E7
+0x4968 0x246B8
+0x4969 0x246B9
+0x496A 0x246BA
+0x496B 0x246BB
+0x496C 0x246C8
+0x496D 0x2484D
+0x496E 0x24889
+0x496F 0x24850
+0x4970 0x24828
+0x4971 0x249FB
+0x4972 0x249FC
+0x4973 0x249FD
+0x4974 0x249FE
+0x4975 0x249FF
+0x4977 0x24A00
+0x4978 0x24A01
+0x4979 0x24A02
+0x497A 0x249E4
+0x497B 0x249E5
+0x497C 0x24A03
+0x497D 0x24A04
+0x497E 0x24A05
+0x4A21 0x24A06
+0x4A22 0x24A07
+0x4A23 0x24A13
+0x4A24 0x24A08
+0x4A25 0x24A09
+0x4A26 0x249E6
+0x4A27 0x24A0A
+0x4A28 0x24A0B
+0x4A29 0x24A0C
+0x4A2A 0x24B0B
+0x4A2B 0x24BF4
+0x4A2C 0x24C0A
+0x4A2D 0x24CB1
+0x4A2E 0x24E1D
+0x4A2F 0x2F93B
+0x4A30 0x24F8B
+0x4A31 0x24F8C
+0x4A32 0x24F8F
+0x4A33 0x24F8D
+0x4A34 0x24F8E
+0x4A35 0x25006
+0x4A36 0x25086
+0x4A37 0x25222
+0x4A38 0x25223
+0x4A39 0x25224
+0x4A3A 0x25225
+0x4A3B 0x25226
+0x4A3C 0x25227
+0x4A3D 0x25228
+0x4A3E 0x253F1
+0x4A40 0x25523
+0x4A41 0x25512
+0x4A43 0x25513
+0x4A44 0x25514
+0x4A45 0x25515
+0x4A46 0x25516
+0x4A47 0x25517
+0x4A48 0x25518
+0x4A49 0x25519
+0x4A4A 0x2554B
+0x4A4B 0x2551A
+0x4A4C 0x2551B
+0x4A4D 0x2551C
+0x4A4F 0x2551D
+0x4A50 0x2551E
+0x4A51 0x2551F
+0x4A52 0x25520
+0x4A53 0x256CA
+0x4A54 0x222AC
+0x4A55 0x256CB
+0x4A56 0x256CC
+0x4A57 0x256CD
+0x4A58 0x256CE
+0x4A5A 0x256CF
+0x4A5B 0x25810
+0x4A5C 0x25811
+0x4A5D 0x25812
+0x4A5E 0x25813
+0x4A5F 0x25814
+0x4A60 0x2580F
+0x4A61 0x25815
+0x4A62 0x25816
+0x4A63 0x25817
+0x4A65 0x25818
+0x4A66 0x259C6
+0x4A67 0x25A9F
+0x4A68 0x25AA0
+0x4A69 0x25AA4
+0x4A6A 0x25AA1
+0x4A6B 0x25BB5
+0x4A6C 0x25BB6
+0x4A6D 0x25BB7
+0x4A6E 0x25BB8
+0x4A6F 0x25BB9
+0x4A70 0x25BBA
+0x4A71 0x25BD0
+0x4A72 0x25BC6
+0x4A73 0x25BBB
+0x4A74 0x25BBC
+0x4A75 0x25BBD
+0x4A76 0x25BBE
+0x4A77 0x25BBF
+0x4A78 0x25BC0
+0x4A79 0x25BC1
+0x4A7A 0x25BC2
+0x4A7B 0x2F960
+0x4A7C 0x25EA7
+0x4A7D 0x25EA8
+0x4A7E 0x25EA9
+0x4B21 0x25EAA
+0x4B22 0x25EAB
+0x4B23 0x25EAC
+0x4B24 0x25EBC
+0x4B25 0x25EAD
+0x4B26 0x25EAE
+0x4B28 0x25EAF
+0x4B29 0x25EB0
+0x4B2A 0x25EB1
+0x4B2C 0x25EB4
+0x4B2D 0x25EB2
+0x4B2E 0x26066
+0x4B2F 0x26067
+0x4B30 0x26068
+0x4B31 0x26069
+0x4B32 0x2606A
+0x4B33 0x2606B
+0x4B34 0x2606C
+0x4B35 0x2606D
+0x4B36 0x2606E
+0x4B37 0x2606F
+0x4B39 0x2623E
+0x4B3A 0x2623F
+0x4B3B 0x26240
+0x4B3C 0x262E8
+0x4B3D 0x26452
+0x4B3E 0x26453
+0x4B3F 0x26454
+0x4B40 0x26455
+0x4B41 0x26591
+0x4B42 0x26592
+0x4B43 0x26593
+0x4B44 0x26594
+0x4B45 0x26595
+0x4B46 0x26596
+0x4B47 0x26597
+0x4B48 0x26598
+0x4B4A 0x26599
+0x4B4B 0x2659A
+0x4B4C 0x2659B
+0x4B4D 0x267B7
+0x4B4E 0x267B8
+0x4B4F 0x267B9
+0x4B51 0x267BA
+0x4B52 0x267BB
+0x4B53 0x267BD
+0x4B55 0x267BC
+0x4B56 0x2F988
+0x4B57 0x2F987
+0x4B58 0x268EB
+0x4B59 0x268EC
+0x4B5A 0x26916
+0x4B5B 0x26944
+0x4B5C 0x269E3
+0x4B5D 0x26A58
+0x4B5E 0x26A53
+0x4B5F 0x26A54
+0x4B60 0x26AE0
+0x4B61 0x26DB1
+0x4B62 0x26DB2
+0x4B63 0x26DB3
+0x4B64 0x26DEA
+0x4B66 0x26DB4
+0x4B67 0x26DF0
+0x4B68 0x26DB5
+0x4B69 0x26DB6
+0x4B6A 0x26DB7
+0x4B6B 0x26DB8
+0x4B6C 0x26DB9
+0x4B6D 0x26DBA
+0x4B6E 0x26DBB
+0x4B6F 0x26DBC
+0x4B70 0x26DBD
+0x4B71 0x26DBE
+0x4B72 0x26DBF
+0x4B73 0x26DC0
+0x4B74 0x26DC1
+0x4B75 0x26DC2
+0x4B76 0x26DC3
+0x4B78 0x26DC4
+0x4B79 0x26DC5
+0x4B7A 0x26DC6
+0x4B7B 0x26DFC
+0x4B7C 0x26DC7
+0x4B7D 0x26DC8
+0x4B7E 0x26DC9
+0x4C21 0x26DCA
+0x4C22 0x26DCB
+0x4C23 0x26DCC
+0x4C24 0x26E84
+0x4C25 0x26DCD
+0x4C26 0x26DCE
+0x4C27 0x26DCF
+0x4C28 0x26DD0
+0x4C29 0x26DD1
+0x4C2A 0x26DD2
+0x4C2B 0x271CA
+0x4C2C 0x271CB
+0x4C2D 0x27336
+0x4C2E 0x27337
+0x4C2F 0x2739F
+0x4C30 0x27338
+0x4C31 0x27339
+0x4C32 0x2733A
+0x4C34 0x276BE
+0x4C35 0x276F0
+0x4C36 0x276BF
+0x4C37 0x276C0
+0x4C38 0x277F7
+0x4C39 0x277F8
+0x4C3A 0x277FA
+0x4C3B 0x27843
+0x4C3C 0x27844
+0x4C3D 0x27A0F
+0x4C3E 0x27A10
+0x4C3F 0x27A11
+0x4C40 0x27A12
+0x4C42 0x27A13
+0x4C43 0x27A14
+0x4C44 0x27A15
+0x4C45 0x27A16
+0x4C48 0x27CD3
+0x4C49 0x27CD7
+0x4C4B 0x27DB0
+0x4C4C 0x27D98
+0x4C4D 0x27D90
+0x4C4E 0x27D91
+0x4C4F 0x27D92
+0x4C50 0x27D97
+0x4C51 0x27D93
+0x4C52 0x27E64
+0x4C53 0x27F01
+0x4C54 0x27F02
+0x4C55 0x27F03
+0x4C56 0x27F04
+0x4C57 0x27F05
+0x4C58 0x27F06
+0x4C59 0x27F07
+0x4C5A 0x2805A
+0x4C5B 0x2805B
+0x4C5C 0x2824E
+0x4C5D 0x2824F
+0x4C5E 0x28250
+0x4C5F 0x28319
+0x4C60 0x2831A
+0x4C61 0x2831B
+0x4C63 0x2831C
+0x4C65 0x28419
+0x4C66 0x2841A
+0x4C68 0x2898A
+0x4C69 0x2856E
+0x4C6A 0x2856F
+0x4C6C 0x28570
+0x4C6D 0x28571
+0x4C6E 0x28572
+0x4C6F 0x28573
+0x4C70 0x28574
+0x4C71 0x28575
+0x4C72 0x28576
+0x4C73 0x2883A
+0x4C74 0x2883B
+0x4C75 0x2883C
+0x4C76 0x2885A
+0x4C77 0x2883D
+0x4C78 0x28842
+0x4C79 0x2898B
+0x4C7A 0x289A0
+0x4C7B 0x2898C
+0x4C7C 0x2898D
+0x4C7D 0x2898E
+0x4C7E 0x289AB
+0x4D21 0x2898F
+0x4D23 0x28990
+0x4D24 0x28991
+0x4D25 0x28992
+0x4D26 0x289AA
+0x4D28 0x28993
+0x4D29 0x28994
+0x4D2A 0x2899E
+0x4D2B 0x289A8
+0x4D2E 0x28F00
+0x4D2F 0x28F01
+0x4D30 0x28F02
+0x4D31 0x28F03
+0x4D32 0x28F04
+0x4D33 0x28F05
+0x4D34 0x28FC4
+0x4D35 0x28FC5
+0x4D37 0x290AE
+0x4D38 0x290B2
+0x4D3B 0x291F7
+0x4D3C 0x29213
+0x4D3D 0x2939E
+0x4D3E 0x29485
+0x4D3F 0x25380
+0x4D40 0x294C8
+0x4D41 0x29841
+0x4D42 0x29881
+0x4D43 0x29882
+0x4D44 0x29883
+0x4D45 0x29884
+0x4D46 0x29AC4
+0x4D47 0x29AC5
+0x4D48 0x29AC6
+0x4D49 0x29C95
+0x4D4A 0x29C96
+0x4D4B 0x29C97
+0x4D4C 0x29D58
+0x4D4D 0x29D59
+0x4D4F 0x29FA9
+0x4D50 0x29FAA
+0x4D51 0x29FAB
+0x4D52 0x2A28E
+0x4D53 0x2A303
+0x4D54 0x2A3B3
+0x4D55 0x20B82
+0x4D56 0x20053
+0x4D57 0x20183
+0x4D58 0x20184
+0x4D59 0x20185
+0x4D5A 0x203CC
+0x4D5B 0x203CD
+0x4D5C 0x203CE
+0x4D5D 0x203CF
+0x4D5E 0x203D0
+0x4D60 0x203D1
+0x4D61 0x203D2
+0x4D62 0x203DA
+0x4D63 0x204B3
+0x4D64 0x204B4
+0x4D66 0x20613
+0x4D67 0x2060E
+0x4D68 0x2066B
+0x4D69 0x20903
+0x4D6A 0x20961
+0x4D6B 0x209C1
+0x4D6C 0x209C2
+0x4D6D 0x20AB5
+0x4D6E 0x20140
+0x4D6F 0x20F98
+0x4D70 0x20F99
+0x4D71 0x20F9A
+0x4D72 0x20F9B
+0x4D73 0x20F9C
+0x4D74 0x20F9D
+0x4D75 0x20F9E
+0x4D76 0x20F9F
+0x4D77 0x20FEE
+0x4D78 0x20FA0
+0x4D79 0x20FA1
+0x4D7A 0x20F86
+0x4D7B 0x21225
+0x4D7C 0x21434
+0x4D7D 0x21435
+0x4D7E 0x21451
+0x4E21 0x2142D
+0x4E22 0x24362
+0x4E23 0x21454
+0x4E24 0x21452
+0x4E26 0x21436
+0x4E27 0x21437
+0x4E28 0x21438
+0x4E29 0x21439
+0x4E2A 0x2143A
+0x4E2B 0x2143B
+0x4E2C 0x21468
+0x4E2D 0x2143C
+0x4E2F 0x21577
+0x4E30 0x23296
+0x4E31 0x2167E
+0x4E32 0x2167F
+0x4E33 0x21869
+0x4E34 0x2186A
+0x4E35 0x2186B
+0x4E36 0x2186C
+0x4E37 0x2186D
+0x4E38 0x2186E
+0x4E39 0x2186F
+0x4E3A 0x2185D
+0x4E3B 0x21870
+0x4E3C 0x21885
+0x4E3D 0x21871
+0x4E3E 0x21872
+0x4E3F 0x21873
+0x4E40 0x21874
+0x4E41 0x21875
+0x4E42 0x21876
+0x4E43 0x21884
+0x4E44 0x21877
+0x4E45 0x21883
+0x4E46 0x2199A
+0x4E47 0x21AA7
+0x4E48 0x21AA8
+0x4E49 0x21AA9
+0x4E4A 0x21AAA
+0x4E4B 0x21AAB
+0x4E4C 0x21AAC
+0x4E4D 0x21AB7
+0x4E4E 0x21AAD
+0x4E4F 0x21AAE
+0x4E51 0x21B45
+0x4E52 0x21CD3
+0x4E53 0x21CD4
+0x4E54 0x21CD5
+0x4E55 0x21CD6
+0x4E56 0x21CD7
+0x4E57 0x21F26
+0x4E58 0x21F27
+0x4E59 0x21F28
+0x4E5B 0x21F29
+0x4E5C 0x21F2A
+0x4E5D 0x22005
+0x4E5F 0x221D0
+0x4E60 0x222B7
+0x4E62 0x222B8
+0x4E63 0x222B9
+0x4E64 0x22422
+0x4E65 0x22423
+0x4E66 0x22573
+0x4E67 0x22574
+0x4E68 0x2288F
+0x4E69 0x22812
+0x4E6A 0x22813
+0x4E6B 0x22814
+0x4E6C 0x22815
+0x4E6D 0x22816
+0x4E6E 0x22817
+0x4E6F 0x22818
+0x4E70 0x22861
+0x4E71 0x22866
+0x4E72 0x22867
+0x4E73 0x22819
+0x4E74 0x22868
+0x4E75 0x2281A
+0x4E76 0x22869
+0x4E77 0x22A04
+0x4E78 0x22A05
+0x4E7A 0x22A06
+0x4E7B 0x229FD
+0x4E7C 0x22D50
+0x4E7D 0x22D51
+0x4E7E 0x22D52
+0x4F21 0x22D53
+0x4F22 0x22D54
+0x4F23 0x22D55
+0x4F24 0x22D63
+0x4F25 0x2F8C4
+0x4F26 0x22D56
+0x4F27 0x22D57
+0x4F28 0x22D58
+0x4F29 0x22D59
+0x4F2A 0x22D5A
+0x4F2B 0x22D5B
+0x4F2D 0x22D5C
+0x4F2E 0x22D5D
+0x4F2F 0x22D5E
+0x4F30 0x22D5F
+0x4F31 0x22FD7
+0x4F33 0x23060
+0x4F34 0x23061
+0x4F35 0x23117
+0x4F36 0x23139
+0x4F37 0x2328F
+0x4F38 0x232C8
+0x4F39 0x23290
+0x4F3A 0x23291
+0x4F3B 0x23398
+0x4F3C 0x23399
+0x4F3D 0x23644
+0x4F3E 0x23645
+0x4F3F 0x23646
+0x4F40 0x23659
+0x4F41 0x236EE
+0x4F43 0x23647
+0x4F44 0x23648
+0x4F46 0x23649
+0x4F47 0x2364A
+0x4F48 0x2364B
+0x4F49 0x2364C
+0x4F4A 0x2364D
+0x4F4B 0x2364E
+0x4F4C 0x2364F
+0x4F4D 0x23650
+0x4F4E 0x23651
+0x4F4F 0x23652
+0x4F50 0x23653
+0x4F51 0x23654
+0x4F52 0x23655
+0x4F53 0x23656
+0x4F54 0x23915
+0x4F55 0x2399A
+0x4F56 0x23A58
+0x4F57 0x23AFC
+0x4F58 0x23AFD
+0x4F59 0x23F86
+0x4F5A 0x23F87
+0x4F5B 0x23F88
+0x4F5C 0x23F89
+0x4F5D 0x23F8A
+0x4F5E 0x23F8B
+0x4F5F 0x23F8C
+0x4F61 0x2401F
+0x4F62 0x23F8D
+0x4F63 0x23F8E
+0x4F64 0x23F8F
+0x4F65 0x23F90
+0x4F66 0x23F91
+0x4F67 0x23F92
+0x4F68 0x23F93
+0x4F69 0x2F911
+0x4F6A 0x23F94
+0x4F6B 0x23F95
+0x4F6C 0x23ECA
+0x4F6D 0x23F18
+0x4F6F 0x23F96
+0x4F70 0x23F97
+0x4F71 0x23F98
+0x4F72 0x23F99
+0x4F73 0x23F9A
+0x4F74 0x23F9B
+0x4F75 0x23F9C
+0x4F76 0x23F9D
+0x4F77 0x23F9E
+0x4F78 0x23F9F
+0x4F7B 0x23FA0
+0x4F7C 0x23FA1
+0x4F7E 0x23FB7
+0x5022 0x24396
+0x5023 0x24368
+0x5024 0x24369
+0x5025 0x2438C
+0x5026 0x2436A
+0x5027 0x2436B
+0x5028 0x2436C
+0x5029 0x2436D
+0x502A 0x2436E
+0x502B 0x2436F
+0x502C 0x2437F
+0x502D 0x24384
+0x502E 0x24370
+0x502F 0x24371
+0x5030 0x24385
+0x5031 0x24372
+0x5032 0x24373
+0x5033 0x24374
+0x5034 0x24375
+0x5035 0x24376
+0x5037 0x24377
+0x5038 0x24378
+0x5039 0x24379
+0x503A 0x2437A
+0x503B 0x2437B
+0x503C 0x2437C
+0x503D 0x2F91E
+0x503E 0x24594
+0x503F 0x246D5
+0x5040 0x24829
+0x5041 0x24A2B
+0x5042 0x24A2C
+0x5043 0x24A2D
+0x5044 0x24A2E
+0x5045 0x24A2F
+0x5046 0x24A30
+0x5047 0x24A3E
+0x5048 0x24A31
+0x5049 0x24A32
+0x504A 0x24A33
+0x504B 0x24A34
+0x504C 0x24A35
+0x504D 0x24B11
+0x504F 0x24CC0
+0x5050 0x24E42
+0x5051 0x24E43
+0x5052 0x24E44
+0x5053 0x24E45
+0x5054 0x24E46
+0x5055 0x2508C
+0x5056 0x2508D
+0x5057 0x2508E
+0x5058 0x2508F
+0x5059 0x25090
+0x505A 0x25091
+0x505B 0x25263
+0x505C 0x25264
+0x505D 0x25265
+0x505F 0x2F94A
+0x5061 0x253F6
+0x5062 0x25536
+0x5063 0x25537
+0x5064 0x2552C
+0x5065 0x25538
+0x5066 0x25539
+0x5068 0x2553A
+0x5069 0x256E3
+0x506A 0x256E2
+0x506B 0x256F5
+0x506C 0x25847
+0x506E 0x25848
+0x506F 0x25849
+0x5070 0x2584A
+0x5071 0x2584B
+0x5072 0x2584C
+0x5073 0x25AA8
+0x5074 0x25AA9
+0x5075 0x25AAA
+0x5077 0x25C0B
+0x5078 0x25C06
+0x5079 0x25C73
+0x507A 0x25C0C
+0x507B 0x25C0D
+0x507C 0x25C0E
+0x507D 0x25C0F
+0x507E 0x25C10
+0x5122 0x25C11
+0x5123 0x2F962
+0x5124 0x25C12
+0x5125 0x25C14
+0x5126 0x25C15
+0x5127 0x25C16
+0x5129 0x25C13
+0x512A 0x25C17
+0x512B 0x25ED9
+0x512C 0x25EDA
+0x512D 0x25EDB
+0x512F 0x25EDC
+0x5130 0x260A6
+0x5131 0x260A7
+0x5132 0x260A8
+0x5133 0x260A9
+0x5134 0x260AA
+0x5135 0x260AB
+0x5137 0x2F96D
+0x5138 0x260AC
+0x5139 0x260AD
+0x513A 0x260AE
+0x513D 0x260AF
+0x513E 0x260B0
+0x513F 0x260B1
+0x5140 0x26244
+0x5141 0x26245
+0x5142 0x262F7
+0x5143 0x262F8
+0x5144 0x2646B
+0x5145 0x2646C
+0x5146 0x26461
+0x5147 0x26512
+0x5148 0x265AF
+0x5149 0x265B0
+0x514A 0x265B1
+0x514B 0x265B2
+0x514C 0x265B3
+0x514D 0x265B4
+0x514E 0x265B5
+0x514F 0x265B6
+0x5150 0x26622
+0x5151 0x267EA
+0x5152 0x267EB
+0x5153 0x267EC
+0x5154 0x267ED
+0x5156 0x268ED
+0x5157 0x2691B
+0x5158 0x26947
+0x5159 0x269E8
+0x515A 0x26AD0
+0x515B 0x26AE7
+0x515C 0x26AE8
+0x515D 0x26AE9
+0x515E 0x26E4E
+0x515F 0x26E4F
+0x5160 0x26E50
+0x5161 0x26E72
+0x5162 0x26E51
+0x5163 0x26E52
+0x5164 0x2F9A7
+0x5166 0x26E53
+0x5167 0x26E54
+0x5168 0x26E55
+0x5169 0x26E56
+0x516A 0x26E57
+0x516B 0x26E77
+0x516C 0x26E58
+0x516D 0x26E59
+0x516E 0x26E5A
+0x516F 0x26E5B
+0x5170 0x26E5C
+0x5171 0x26E6E
+0x5172 0x26E5D
+0x5175 0x26E5E
+0x5177 0x26E5F
+0x5179 0x271D7
+0x517A 0x27389
+0x517B 0x2738A
+0x517D 0x2F9BE
+0x517E 0x2738B
+0x5221 0x2738C
+0x5222 0x2738D
+0x5223 0x2738E
+0x5224 0x2F9BC
+0x5225 0x2738F
+0x5227 0x2739A
+0x5228 0x27390
+0x5229 0x27391
+0x522A 0x27392
+0x522B 0x27393
+0x522C 0x27712
+0x522D 0x276F1
+0x522F 0x277FE
+0x5230 0x277FB
+0x5231 0x27857
+0x5232 0x27A49
+0x5233 0x27A4A
+0x5234 0x27A4B
+0x5235 0x27A4C
+0x5237 0x27A4D
+0x5238 0x27A59
+0x5239 0x27A4E
+0x523A 0x27A4F
+0x523B 0x27BF4
+0x523C 0x27C65
+0x523D 0x27DA6
+0x523E 0x27DA7
+0x523F 0x27DA8
+0x5240 0x27F22
+0x5241 0x27F23
+0x5242 0x2808B
+0x5243 0x2808C
+0x5244 0x2808D
+0x5245 0x2808E
+0x5246 0x28258
+0x5248 0x28259
+0x5249 0x2833B
+0x524A 0x2833C
+0x524B 0x2833D
+0x524C 0x2833E
+0x524D 0x28448
+0x524E 0x28594
+0x524F 0x28595
+0x5250 0x28596
+0x5251 0x28597
+0x5252 0x28598
+0x5253 0x2877D
+0x5254 0x286FE
+0x5255 0x2877E
+0x5256 0x2877F
+0x5258 0x2885B
+0x5259 0x2885C
+0x525A 0x289E4
+0x525B 0x289C1
+0x525C 0x289FD
+0x525D 0x289C2
+0x525E 0x289D6
+0x525F 0x289C3
+0x5260 0x289C4
+0x5262 0x289DC
+0x5263 0x289C5
+0x5264 0x289C6
+0x5265 0x289C7
+0x5266 0x289E1
+0x5267 0x289C8
+0x5268 0x289C9
+0x5269 0x289CA
+0x526A 0x289CB
+0x526C 0x289CC
+0x526D 0x289CD
+0x526E 0x28D35
+0x526F 0x28D36
+0x5270 0x28D47
+0x5271 0x28D37
+0x5272 0x28F1B
+0x5273 0x28F1C
+0x5274 0x28F1D
+0x5275 0x28F1E
+0x5276 0x28F1F
+0x5277 0x28F20
+0x5278 0x28F7B
+0x5279 0x28F7A
+0x527A 0x28FFE
+0x527B 0x290C6
+0x527C 0x290C7
+0x527D 0x290C8
+0x527E 0x290C9
+0x5321 0x290CA
+0x5323 0x294A0
+0x5324 0x294A1
+0x5325 0x295CC
+0x5326 0x295CD
+0x5327 0x296F1
+0x5328 0x296D7
+0x5329 0x29842
+0x532A 0x29846
+0x532B 0x298A3
+0x532C 0x298A5
+0x532D 0x298A6
+0x532E 0x29ACB
+0x532F 0x29ACC
+0x5330 0x29B26
+0x5331 0x29B27
+0x5332 0x29B28
+0x5333 0x29B29
+0x5334 0x29CAE
+0x5335 0x29CAF
+0x5336 0x29CB0
+0x5337 0x29D73
+0x5339 0x29D7C
+0x533A 0x29D74
+0x533C 0x29F80
+0x533D 0x29D75
+0x5340 0x29FCF
+0x5342 0x2A38F
+0x5343 0x20670
+0x5344 0x20085
+0x5345 0x20397
+0x5346 0x203F6
+0x5347 0x203F7
+0x5348 0x203F8
+0x5349 0x203FA
+0x534A 0x203FB
+0x534B 0x204BA
+0x534C 0x204BB
+0x534D 0x204BC
+0x534E 0x204BD
+0x534F 0x20534
+0x5350 0x20535
+0x5351 0x205A2
+0x5352 0x20614
+0x5353 0x20611
+0x5354 0x2066E
+0x5355 0x2066F
+0x5356 0x20808
+0x5357 0x208B8
+0x5358 0x20A09
+0x5359 0x20ABD
+0x535A 0x20ABE
+0x535B 0x20B88
+0x535C 0x20FFE
+0x535E 0x20FFF
+0x535F 0x21000
+0x5360 0x21001
+0x5361 0x21002
+0x5362 0x21003
+0x5363 0x21004
+0x5364 0x21005
+0x5365 0x21006
+0x5367 0x21007
+0x5368 0x21008
+0x5369 0x21009
+0x536A 0x2100A
+0x536B 0x2100B
+0x536C 0x2100C
+0x536D 0x2100D
+0x536E 0x2100E
+0x536F 0x2100F
+0x5373 0x2122C
+0x5374 0x2146B
+0x5376 0x2146C
+0x5377 0x21487
+0x5378 0x2146D
+0x5379 0x21578
+0x537A 0x2168B
+0x537B 0x218A4
+0x537C 0x218A5
+0x537D 0x218A6
+0x537E 0x218A7
+0x5421 0x218BE
+0x5422 0x218A8
+0x5423 0x218A9
+0x5424 0x218AA
+0x5425 0x2188D
+0x5426 0x218AB
+0x5427 0x218AC
+0x5428 0x218BF
+0x542B 0x218AD
+0x542C 0x218AE
+0x542D 0x219A4
+0x542E 0x219A5
+0x542F 0x21AC7
+0x5430 0x21AC8
+0x5431 0x21AC9
+0x5432 0x27DBC
+0x5433 0x21ACA
+0x5434 0x21ACB
+0x5435 0x21ACC
+0x5436 0x21ACD
+0x5437 0x21ACE
+0x5438 0x21C19
+0x5439 0x21CE6
+0x543A 0x21F4C
+0x543B 0x21F4D
+0x543C 0x21F4E
+0x543D 0x22006
+0x543F 0x222CD
+0x5440 0x222CE
+0x5441 0x222CF
+0x5442 0x222D0
+0x5444 0x22581
+0x5445 0x22582
+0x5446 0x20533
+0x5447 0x2286A
+0x5448 0x2286B
+0x5449 0x228B2
+0x544A 0x2286C
+0x544B 0x2286D
+0x544C 0x228CC
+0x544D 0x228AE
+0x544E 0x228B3
+0x544F 0x22891
+0x5451 0x2286E
+0x5452 0x228B4
+0x5453 0x2286F
+0x5454 0x22DC9
+0x5455 0x22DA7
+0x5456 0x22DA8
+0x5457 0x22DA9
+0x5458 0x22DAA
+0x5459 0x22DAB
+0x545A 0x22DAC
+0x545B 0x22DAD
+0x545C 0x22DAE
+0x545D 0x22DAF
+0x545E 0x22DB0
+0x545F 0x22D60
+0x5460 0x22DB1
+0x5461 0x22EE1
+0x5462 0x22FE3
+0x5463 0x22FF6
+0x5465 0x232AF
+0x5466 0x232B0
+0x5467 0x232B1
+0x5468 0x232BA
+0x5469 0x232B2
+0x546A 0x232B3
+0x546B 0x2334C
+0x546D 0x233A0
+0x546E 0x233A1
+0x546F 0x236B0
+0x5470 0x236B1
+0x5471 0x236B2
+0x5472 0x236B3
+0x5473 0x236B4
+0x5474 0x2F8EB
+0x5475 0x236B5
+0x5476 0x236B6
+0x5477 0x236B7
+0x5478 0x236B8
+0x5479 0x236B9
+0x547A 0x236BA
+0x547C 0x236BB
+0x547D 0x236BC
+0x547E 0x236BD
+0x5521 0x236BE
+0x5522 0x236BF
+0x5523 0x236DF
+0x5524 0x236C0
+0x5525 0x236C1
+0x5526 0x236C2
+0x5527 0x236C3
+0x5528 0x236C4
+0x552B 0x236C5
+0x552C 0x236C6
+0x552D 0x236C7
+0x552E 0x236C8
+0x552F 0x236C9
+0x5530 0x236CA
+0x5531 0x2373C
+0x5532 0x236CB
+0x5533 0x236CC
+0x5534 0x236CD
+0x5535 0x236CE
+0x5536 0x236CF
+0x5537 0x236D0
+0x5538 0x236D1
+0x553A 0x2391D
+0x553B 0x2391E
+0x553C 0x23A64
+0x553D 0x23A65
+0x553E 0x23AC5
+0x553F 0x23AC6
+0x5540 0x23AC7
+0x5541 0x23AFF
+0x5542 0x23BFF
+0x5543 0x23C00
+0x5544 0x23C01
+0x5545 0x23C02
+0x5546 0x23FF5
+0x5547 0x2405C
+0x5548 0x23FF6
+0x5549 0x23FF7
+0x554A 0x23FB0
+0x554B 0x23FF8
+0x554C 0x23FF9
+0x554D 0x2405D
+0x554E 0x24050
+0x554F 0x23FFA
+0x5550 0x23FFB
+0x5551 0x23FA2
+0x5552 0x23FFC
+0x5553 0x23FFD
+0x5554 0x23FFE
+0x5555 0x23FFF
+0x5556 0x2F913
+0x5557 0x24000
+0x5558 0x2F91F
+0x5559 0x243C1
+0x555A 0x243C2
+0x555B 0x243C3
+0x555C 0x243C4
+0x555D 0x243C5
+0x555E 0x243C6
+0x555F 0x243C7
+0x5560 0x243C8
+0x5561 0x243C9
+0x5562 0x243CA
+0x5563 0x243CB
+0x5564 0x290EF
+0x5565 0x243D7
+0x5566 0x243CC
+0x5567 0x243CD
+0x5568 0x243CE
+0x5569 0x24422
+0x556A 0x243CF
+0x556B 0x243D0
+0x556D 0x243D1
+0x556E 0x243D2
+0x556F 0x243E9
+0x5570 0x243D3
+0x5571 0x243D4
+0x5572 0x243D5
+0x5573 0x24538
+0x5574 0x2103B
+0x5575 0x2487D
+0x5576 0x2056F
+0x5577 0x248A1
+0x5578 0x24A53
+0x5579 0x24A54
+0x557B 0x24A55
+0x557C 0x24A3C
+0x557D 0x24A56
+0x5621 0x24A66
+0x5623 0x24A57
+0x5624 0x24A58
+0x5625 0x24A59
+0x5626 0x24A5A
+0x5627 0x24A5B
+0x5628 0x24A67
+0x5629 0x24A5C
+0x562C 0x24A6A
+0x562D 0x24A5D
+0x562E 0x24A3D
+0x562F 0x24A5E
+0x5630 0x24A65
+0x5631 0x24CE1
+0x5632 0x24CCD
+0x5633 0x2A011
+0x5634 0x24E6F
+0x5635 0x24E70
+0x5636 0x2501A
+0x5637 0x2509A
+0x5638 0x2509B
+0x5639 0x2509C
+0x563A 0x2509E
+0x563B 0x2509F
+0x563C 0x2F93F
+0x563D 0x2528E
+0x563F 0x253FD
+0x5641 0x2555E
+0x5642 0x2555F
+0x5643 0x25560
+0x5644 0x25565
+0x5645 0x25567
+0x5646 0x25568
+0x5647 0x25569
+0x5649 0x2556A
+0x564A 0x2558F
+0x564B 0x2556B
+0x564C 0x2556C
+0x564D 0x2556D
+0x564E 0x256F7
+0x564F 0x256F8
+0x5650 0x256F9
+0x5651 0x256E4
+0x5652 0x256FA
+0x5653 0x258B1
+0x5654 0x25875
+0x5655 0x25876
+0x5656 0x259FF
+0x5657 0x25A00
+0x5658 0x25A01
+0x5659 0x25A02
+0x565A 0x25A03
+0x565B 0x25AAE
+0x565C 0x25AAD
+0x565D 0x25C51
+0x565E 0x25C52
+0x5660 0x25C53
+0x5661 0x25C54
+0x5662 0x25C55
+0x5663 0x25C56
+0x5664 0x25C57
+0x5665 0x25C58
+0x5666 0x25C59
+0x5667 0x25C5A
+0x5668 0x25C5B
+0x5669 0x25C5C
+0x566A 0x25C5D
+0x566B 0x25C5E
+0x566C 0x25C5F
+0x566D 0x25C60
+0x566E 0x25C61
+0x566F 0x25C62
+0x5670 0x25C63
+0x5671 0x25C64
+0x5672 0x25C4C
+0x5673 0x25C66
+0x5674 0x25EF1
+0x5675 0x25EF2
+0x5676 0x260F2
+0x5677 0x260F3
+0x5678 0x260F4
+0x5679 0x260F5
+0x567A 0x260F6
+0x567B 0x260F7
+0x567C 0x260F8
+0x567D 0x260F9
+0x567E 0x260FA
+0x5721 0x2624C
+0x5722 0x2624B
+0x5723 0x2631B
+0x5724 0x263CE
+0x5725 0x263B3
+0x5726 0x2647F
+0x5727 0x2F979
+0x5728 0x2F97C
+0x5729 0x2651A
+0x572A 0x265C4
+0x572B 0x265C5
+0x572C 0x265C6
+0x572D 0x265C7
+0x572E 0x265C8
+0x572F 0x265C9
+0x5731 0x26819
+0x5732 0x2681C
+0x5733 0x2681A
+0x5734 0x2694C
+0x5735 0x2698E
+0x5736 0x26A7E
+0x5737 0x26EEB
+0x5738 0x26EEC
+0x5739 0x26EED
+0x573A 0x26EEE
+0x573B 0x26EEF
+0x573C 0x26EF0
+0x573D 0x26EF1
+0x573E 0x26ED8
+0x573F 0x26ED9
+0x5740 0x26EDA
+0x5741 0x26EDB
+0x5742 0x26EF2
+0x5743 0x26EF3
+0x5744 0x26EF4
+0x5745 0x26F07
+0x5747 0x2F9AC
+0x5749 0x26EF5
+0x574A 0x26F15
+0x574C 0x26EF6
+0x574D 0x26EF7
+0x574E 0x26EF8
+0x574F 0x26EF9
+0x5750 0x26EFA
+0x5751 0x26EFB
+0x5752 0x26EFC
+0x5753 0x26EFD
+0x5754 0x26EFE
+0x5755 0x26FA7
+0x5756 0x26EFF
+0x5757 0x26F00
+0x5758 0x26F01
+0x5759 0x26F02
+0x575A 0x26F03
+0x575B 0x26F04
+0x575C 0x26F05
+0x575D 0x271E9
+0x575E 0x271EA
+0x575F 0x271EB
+0x5760 0x273DE
+0x5761 0x273DF
+0x5763 0x273E0
+0x5764 0x273E1
+0x5765 0x273E2
+0x5766 0x273E3
+0x5767 0x2773E
+0x5768 0x2773F
+0x5769 0x27740
+0x576A 0x27741
+0x576B 0x27871
+0x576C 0x27872
+0x576D 0x27873
+0x576E 0x27A88
+0x576F 0x27A89
+0x5770 0x27A8A
+0x5771 0x27A8B
+0x5772 0x27A8C
+0x5773 0x27A8D
+0x5774 0x27A8E
+0x5775 0x27A8F
+0x5776 0x27A90
+0x5777 0x27A91
+0x5778 0x27A92
+0x577A 0x27CF1
+0x577B 0x27DBE
+0x577C 0x27DBF
+0x577D 0x27DC0
+0x577E 0x27DC1
+0x5821 0x27DC2
+0x5822 0x27DC3
+0x5823 0x27E6E
+0x5824 0x27F37
+0x5825 0x27F57
+0x5826 0x27F38
+0x5827 0x27F39
+0x5828 0x27F3A
+0x5829 0x27F3B
+0x582A 0x27F3C
+0x582B 0x27F3D
+0x582C 0x27F3E
+0x582D 0x27F27
+0x582E 0x27F3F
+0x5831 0x280C0
+0x5832 0x280C1
+0x5834 0x28267
+0x5836 0x28268
+0x5837 0x28358
+0x5838 0x28365
+0x5839 0x28359
+0x583A 0x2835A
+0x583B 0x28424
+0x583C 0x285CD
+0x583D 0x285CE
+0x583E 0x285CF
+0x583F 0x285D2
+0x5840 0x2879F
+0x5841 0x28722
+0x5842 0x2887D
+0x5843 0x2887E
+0x5844 0x289FF
+0x5845 0x28A25
+0x5846 0x28A00
+0x5847 0x28A01
+0x5849 0x28A02
+0x584A 0x28A03
+0x584B 0x28A04
+0x584D 0x28A05
+0x584E 0x28A06
+0x584F 0x28A07
+0x5850 0x28A16
+0x5851 0x28A08
+0x5852 0x28A17
+0x5853 0x28A09
+0x5854 0x28A0A
+0x5856 0x28A0B
+0x5857 0x28A0C
+0x5858 0x28A29
+0x585A 0x28A0D
+0x585C 0x28A0E
+0x585D 0x28A10
+0x585E 0x28A11
+0x585F 0x28A1D
+0x5860 0x28A12
+0x5861 0x28A13
+0x5863 0x28A14
+0x5864 0x28A15
+0x5865 0x28C8D
+0x5866 0x28D54
+0x5867 0x28D55
+0x5868 0x28D56
+0x5869 0x28F33
+0x586A 0x28F34
+0x586B 0x28F35
+0x586C 0x28F36
+0x586D 0x28FFA
+0x586E 0x290E3
+0x586F 0x290E6
+0x5870 0x290ED
+0x5871 0x290E7
+0x5872 0x290E8
+0x5873 0x290E9
+0x5874 0x290EA
+0x5875 0x290EB
+0x5876 0x29227
+0x5877 0x29220
+0x5878 0x2F9F8
+0x5879 0x2942A
+0x587A 0x294C9
+0x587C 0x294CA
+0x587D 0x294CB
+0x587E 0x294D9
+0x5921 0x294CC
+0x5922 0x294CD
+0x5923 0x294CE
+0x5925 0x295E1
+0x5926 0x2971B
+0x5927 0x2971C
+0x5928 0x2971D
+0x5929 0x2971E
+0x592A 0x29847
+0x592B 0x298D1
+0x592C 0x298C9
+0x592D 0x29AD0
+0x592E 0x29AD1
+0x592F 0x29B3F
+0x5930 0x29B40
+0x5931 0x29B41
+0x5932 0x2FA09
+0x5933 0x29B42
+0x5934 0x29CC4
+0x5935 0x29D9B
+0x5936 0x29D92
+0x5937 0x29D93
+0x5939 0x29D94
+0x593A 0x29D95
+0x593D 0x29FF3
+0x593E 0x29FF4
+0x593F 0x29FF5
+0x5940 0x29FF6
+0x5941 0x2A260
+0x5942 0x2A29E
+0x5943 0x2A2A0
+0x5944 0x2A2A1
+0x5945 0x2A31C
+0x5946 0x2A39F
+0x5947 0x20056
+0x5948 0x20412
+0x5949 0x2041F
+0x594A 0x20415
+0x594B 0x20416
+0x594C 0x20417
+0x594D 0x2F80C
+0x594E 0x20418
+0x594F 0x204C2
+0x5950 0x204C3
+0x5951 0x204C4
+0x5952 0x205A1
+0x5953 0x2061B
+0x5954 0x2061C
+0x5955 0x20671
+0x5956 0x20813
+0x5957 0x20B17
+0x5958 0x20B8F
+0x5959 0x2105F
+0x595A 0x21060
+0x595B 0x210AC
+0x595E 0x21061
+0x595F 0x21062
+0x5960 0x21063
+0x5961 0x21064
+0x5962 0x21065
+0x5964 0x21499
+0x5965 0x2149A
+0x5966 0x2149B
+0x5967 0x2149C
+0x5968 0x2149D
+0x5969 0x2149E
+0x596A 0x2149F
+0x596B 0x214A0
+0x596C 0x218DA
+0x596D 0x218DB
+0x596E 0x218DC
+0x596F 0x218DD
+0x5970 0x218DE
+0x5971 0x218DF
+0x5972 0x21AD5
+0x5973 0x21AD6
+0x5974 0x21AD7
+0x5975 0x21AD8
+0x5976 0x21AE0
+0x5977 0x21BB4
+0x5979 0x21F6E
+0x597A 0x21F6F
+0x597B 0x21F70
+0x597C 0x22163
+0x597E 0x222D5
+0x5A21 0x222D6
+0x5A22 0x222D7
+0x5A23 0x222D8
+0x5A24 0x22430
+0x5A25 0x228B5
+0x5A26 0x228B6
+0x5A27 0x228C1
+0x5A28 0x228F7
+0x5A2A 0x228CB
+0x5A2B 0x228E8
+0x5A2D 0x228E9
+0x5A2E 0x228B7
+0x5A2F 0x22A15
+0x5A30 0x22DE6
+0x5A31 0x22DE7
+0x5A32 0x22DE8
+0x5A33 0x22DE9
+0x5A34 0x22DEA
+0x5A35 0x22DEB
+0x5A36 0x2F8CA
+0x5A37 0x2300B
+0x5A38 0x2300C
+0x5A39 0x23064
+0x5A3A 0x232D4
+0x5A3B 0x232D5
+0x5A3C 0x232D6
+0x5A3D 0x232D8
+0x5A3E 0x233A5
+0x5A3F 0x2005B
+0x5A40 0x2370F
+0x5A41 0x23710
+0x5A43 0x23711
+0x5A44 0x23712
+0x5A45 0x23713
+0x5A46 0x23714
+0x5A47 0x23715
+0x5A48 0x23716
+0x5A49 0x23717
+0x5A4A 0x23718
+0x5A4B 0x23719
+0x5A4C 0x2371A
+0x5A4D 0x2372F
+0x5A4E 0x2371B
+0x5A4F 0x2371C
+0x5A50 0x2373F
+0x5A51 0x2371D
+0x5A52 0x2371E
+0x5A53 0x2372C
+0x5A54 0x2371F
+0x5A55 0x23924
+0x5A56 0x239A4
+0x5A57 0x239A5
+0x5A58 0x26251
+0x5A59 0x23AFE
+0x5A5A 0x23C11
+0x5A5B 0x23C12
+0x5A5C 0x23C13
+0x5A5D 0x23C54
+0x5A5E 0x2405E
+0x5A5F 0x24021
+0x5A60 0x2403F
+0x5A61 0x24040
+0x5A62 0x24041
+0x5A63 0x24042
+0x5A64 0x24043
+0x5A65 0x24044
+0x5A66 0x24020
+0x5A67 0x24045
+0x5A69 0x24046
+0x5A6A 0x240B0
+0x5A6B 0x24047
+0x5A6C 0x24057
+0x5A6D 0x24001
+0x5A6E 0x240B1
+0x5A6F 0x2405A
+0x5A70 0x24048
+0x5A71 0x24404
+0x5A72 0x24405
+0x5A74 0x2444F
+0x5A75 0x24450
+0x5A76 0x24406
+0x5A77 0x24407
+0x5A78 0x24408
+0x5A79 0x24409
+0x5A7A 0x2440A
+0x5A7B 0x2440B
+0x5A7C 0x2440C
+0x5A7D 0x2440D
+0x5A7E 0x2440E
+0x5B21 0x2440F
+0x5B22 0x24410
+0x5B23 0x24411
+0x5B24 0x24533
+0x5B25 0x24534
+0x5B26 0x24535
+0x5B27 0x245FC
+0x5B28 0x245FD
+0x5B29 0x248B0
+0x5B2A 0x248B1
+0x5B2B 0x248B2
+0x5B2C 0x248B3
+0x5B2E 0x24A7B
+0x5B2F 0x24A7C
+0x5B30 0x24A7D
+0x5B31 0x24A7E
+0x5B32 0x24A7F
+0x5B33 0x24A80
+0x5B34 0x24A81
+0x5B35 0x24A82
+0x5B36 0x24BF9
+0x5B37 0x24CDA
+0x5B38 0x24EA1
+0x5B3B 0x250AD
+0x5B3C 0x250AE
+0x5B3E 0x252C8
+0x5B3F 0x252C9
+0x5B40 0x252CA
+0x5B41 0x25582
+0x5B42 0x25583
+0x5B43 0x25584
+0x5B44 0x25585
+0x5B45 0x25586
+0x5B46 0x25587
+0x5B47 0x25588
+0x5B48 0x25589
+0x5B49 0x2558A
+0x5B4B 0x25707
+0x5B4C 0x25708
+0x5B4D 0x25701
+0x5B4E 0x25709
+0x5B4F 0x25702
+0x5B50 0x2570A
+0x5B51 0x2570B
+0x5B52 0x2570C
+0x5B53 0x258A7
+0x5B54 0x25898
+0x5B55 0x25899
+0x5B56 0x2589A
+0x5B57 0x2589B
+0x5B58 0x2589C
+0x5B5A 0x2589D
+0x5B5B 0x25A1A
+0x5B5C 0x25AB2
+0x5B5D 0x25CB0
+0x5B5E 0x25CB1
+0x5B60 0x25CB2
+0x5B61 0x25CB3
+0x5B62 0x25CB4
+0x5B63 0x25CB5
+0x5B64 0x25CB6
+0x5B65 0x25CC0
+0x5B66 0x25CB7
+0x5B67 0x25CB8
+0x5B68 0x25CB9
+0x5B69 0x25CBA
+0x5B6A 0x25D1D
+0x5B6B 0x25F0C
+0x5B6C 0x25F0D
+0x5B6D 0x25F0E
+0x5B6E 0x25F35
+0x5B6F 0x25F0F
+0x5B70 0x25F10
+0x5B71 0x25F11
+0x5B72 0x25F12
+0x5B73 0x26122
+0x5B74 0x26123
+0x5B75 0x26124
+0x5B77 0x26125
+0x5B78 0x26126
+0x5B79 0x26127
+0x5B7A 0x26128
+0x5B7B 0x26129
+0x5B7C 0x2612A
+0x5B7D 0x2612B
+0x5B7E 0x2612C
+0x5C21 0x2612D
+0x5C22 0x2612E
+0x5C23 0x26252
+0x5C24 0x26253
+0x5C25 0x26319
+0x5C26 0x263BF
+0x5C27 0x2648B
+0x5C28 0x2648C
+0x5C29 0x26523
+0x5C2A 0x26524
+0x5C2B 0x265F1
+0x5C2C 0x265D8
+0x5C2D 0x2F97F
+0x5C2E 0x2684E
+0x5C2F 0x2684F
+0x5C30 0x26855
+0x5C31 0x26850
+0x5C32 0x26851
+0x5C33 0x26852
+0x5C34 0x26853
+0x5C35 0x26802
+0x5C36 0x26854
+0x5C37 0x268F1
+0x5C38 0x26924
+0x5C39 0x26AD1
+0x5C3A 0x26F7C
+0x5C3B 0x26F7D
+0x5C3C 0x26F7E
+0x5C3D 0x26F7F
+0x5C3E 0x26F80
+0x5C3F 0x26F9F
+0x5C40 0x26F81
+0x5C41 0x26F82
+0x5C42 0x26F83
+0x5C43 0x26F84
+0x5C44 0x26F85
+0x5C45 0x26F86
+0x5C46 0x26F87
+0x5C47 0x26F88
+0x5C48 0x26F9B
+0x5C49 0x26F89
+0x5C4A 0x26F8A
+0x5C4B 0x26F8B
+0x5C4C 0x26F8C
+0x5C4E 0x26FA1
+0x5C4F 0x26F8D
+0x5C50 0x26F8E
+0x5C51 0x271F3
+0x5C52 0x271F4
+0x5C53 0x271F5
+0x5C54 0x27424
+0x5C55 0x27425
+0x5C56 0x27426
+0x5C57 0x27427
+0x5C58 0x27428
+0x5C59 0x27429
+0x5C5A 0x2742A
+0x5C5C 0x2742B
+0x5C5D 0x275CD
+0x5C5E 0x27601
+0x5C5F 0x2258D
+0x5C60 0x27770
+0x5C61 0x27880
+0x5C62 0x27881
+0x5C63 0x27AC0
+0x5C64 0x27AC1
+0x5C65 0x27AC2
+0x5C66 0x27AC3
+0x5C67 0x27AC4
+0x5C68 0x27AC5
+0x5C69 0x27AC6
+0x5C6A 0x27AC7
+0x5C6B 0x27AC8
+0x5C6C 0x27CFE
+0x5C6E 0x27DD9
+0x5C6F 0x27DDC
+0x5C70 0x27DDA
+0x5C71 0x27E75
+0x5C72 0x27F58
+0x5C73 0x27F59
+0x5C74 0x27F5A
+0x5C75 0x27F5B
+0x5C76 0x27F5C
+0x5C77 0x280EC
+0x5C79 0x280F3
+0x5C7A 0x28272
+0x5C7B 0x28273
+0x5C7C 0x28382
+0x5C7D 0x28383
+0x5C7E 0x2842A
+0x5D21 0x2842B
+0x5D22 0x2842C
+0x5D23 0x2842D
+0x5D24 0x285F6
+0x5D25 0x28600
+0x5D26 0x285F7
+0x5D27 0x285F8
+0x5D28 0x285F9
+0x5D2A 0x28894
+0x5D2B 0x28895
+0x5D2C 0x28896
+0x5D2D 0x2891B
+0x5D2E 0x28A86
+0x5D2F 0x28A4C
+0x5D30 0x28A4D
+0x5D31 0x28A83
+0x5D33 0x28A82
+0x5D34 0x28A4E
+0x5D35 0x28A4F
+0x5D36 0x28A50
+0x5D37 0x28A51
+0x5D38 0x28A81
+0x5D3A 0x28A52
+0x5D3B 0x28A53
+0x5D3C 0x28A54
+0x5D3D 0x28A55
+0x5D3F 0x28A56
+0x5D40 0x28A57
+0x5D42 0x28A58
+0x5D43 0x28A5B
+0x5D44 0x28A5C
+0x5D45 0x28A5D
+0x5D46 0x28A5E
+0x5D47 0x28A5F
+0x5D48 0x28A60
+0x5D49 0x28A61
+0x5D4A 0x28A7C
+0x5D4B 0x28A62
+0x5D4E 0x28A63
+0x5D4F 0x28A64
+0x5D50 0x28D73
+0x5D51 0x28F45
+0x5D52 0x28F46
+0x5D53 0x28F47
+0x5D54 0x28F4C
+0x5D55 0x29012
+0x5D57 0x29013
+0x5D58 0x29139
+0x5D59 0x29103
+0x5D5A 0x2910D
+0x5D5B 0x29230
+0x5D5C 0x292D5
+0x5D5D 0x293C0
+0x5D5E 0x294F2
+0x5D5F 0x294F3
+0x5D60 0x294F4
+0x5D61 0x294F5
+0x5D62 0x294F6
+0x5D63 0x294F7
+0x5D64 0x295FA
+0x5D65 0x295FB
+0x5D66 0x29745
+0x5D67 0x29746
+0x5D68 0x29849
+0x5D69 0x298E7
+0x5D6A 0x298E8
+0x5D6B 0x29AD8
+0x5D6C 0x29AD9
+0x5D6D 0x29B55
+0x5D6E 0x29B56
+0x5D6F 0x29B57
+0x5D70 0x29CDA
+0x5D71 0x29CDB
+0x5D72 0x29CDC
+0x5D73 0x29DB8
+0x5D74 0x29DB9
+0x5D75 0x29DBA
+0x5D77 0x29DBB
+0x5D78 0x29F89
+0x5D79 0x29DBC
+0x5D7A 0x2A030
+0x5D7B 0x2A031
+0x5D7C 0x2A032
+0x5D7D 0x2A033
+0x5E21 0x2A034
+0x5E22 0x2A035
+0x5E23 0x2A036
+0x5E25 0x2A037
+0x5E26 0x2A2B2
+0x5E27 0x2A390
+0x5E28 0x2A326
+0x5E29 0x2A3A2
+0x5E2A 0x2A438
+0x5E2C 0x2042E
+0x5E2E 0x2042F
+0x5E2F 0x20430
+0x5E30 0x2042A
+0x5E31 0x2042B
+0x5E32 0x204C9
+0x5E33 0x20537
+0x5E34 0x20620
+0x5E35 0x20672
+0x5E36 0x2081F
+0x5E37 0x20965
+0x5E38 0x209CA
+0x5E39 0x20AC0
+0x5E3A 0x20AC1
+0x5E3B 0x20AC2
+0x5E3C 0x210B7
+0x5E3D 0x210B8
+0x5E3E 0x210B9
+0x5E3F 0x210BA
+0x5E40 0x210BB
+0x5E43 0x210BC
+0x5E44 0x210BD
+0x5E45 0x210BE
+0x5E46 0x210F2
+0x5E47 0x214B5
+0x5E48 0x214B7
+0x5E49 0x214B8
+0x5E4A 0x210DF
+0x5E4B 0x214B9
+0x5E4C 0x214D5
+0x5E4D 0x214BA
+0x5E4E 0x214BB
+0x5E4F 0x2154A
+0x5E50 0x218F2
+0x5E51 0x218F3
+0x5E52 0x218F4
+0x5E53 0x218FA
+0x5E54 0x218F5
+0x5E55 0x21902
+0x5E56 0x21AE2
+0x5E57 0x21AE3
+0x5E58 0x21F8E
+0x5E59 0x21F8B
+0x5E5A 0x222E4
+0x5E5B 0x222EB
+0x5E5C 0x222E5
+0x5E5D 0x22435
+0x5E5E 0x22593
+0x5E5F 0x228EA
+0x5E60 0x228EB
+0x5E62 0x228EC
+0x5E63 0x228ED
+0x5E64 0x22917
+0x5E65 0x228EE
+0x5E66 0x228EF
+0x5E67 0x228F0
+0x5E68 0x22E0E
+0x5E69 0x22E0F
+0x5E6A 0x22E10
+0x5E6B 0x22E19
+0x5E6C 0x22E18
+0x5E6D 0x22E11
+0x5E6E 0x22E12
+0x5E6F 0x22E13
+0x5E70 0x2F8C7
+0x5E71 0x22E14
+0x5E72 0x22E15
+0x5E74 0x22E16
+0x5E75 0x23065
+0x5E76 0x232EA
+0x5E77 0x232EB
+0x5E78 0x232EC
+0x5E79 0x232ED
+0x5E7B 0x232EE
+0x5E7C 0x233AC
+0x5E7D 0x237C2
+0x5E7E 0x23769
+0x5F21 0x23781
+0x5F22 0x2376A
+0x5F23 0x2376B
+0x5F24 0x2376C
+0x5F25 0x2376D
+0x5F26 0x2376E
+0x5F27 0x2376F
+0x5F28 0x23770
+0x5F2A 0x23771
+0x5F2B 0x23772
+0x5F2C 0x23773
+0x5F2D 0x2378C
+0x5F2E 0x23774
+0x5F2F 0x23775
+0x5F30 0x23776
+0x5F31 0x23C24
+0x5F32 0x23C2A
+0x5F33 0x2408E
+0x5F34 0x240AF
+0x5F35 0x2408F
+0x5F36 0x24090
+0x5F37 0x24091
+0x5F39 0x24092
+0x5F3A 0x24093
+0x5F3B 0x24094
+0x5F3C 0x24095
+0x5F3D 0x24096
+0x5F3E 0x24097
+0x5F3F 0x24098
+0x5F40 0x24099
+0x5F41 0x2409A
+0x5F42 0x2409B
+0x5F43 0x2409C
+0x5F44 0x24439
+0x5F45 0x2443B
+0x5F46 0x2443A
+0x5F47 0x2443C
+0x5F48 0x2443D
+0x5F49 0x2443E
+0x5F4A 0x2443F
+0x5F4B 0x24470
+0x5F4C 0x24440
+0x5F4D 0x24441
+0x5F4E 0x248C0
+0x5F4F 0x248C1
+0x5F50 0x24AA4
+0x5F51 0x24A97
+0x5F52 0x24AA5
+0x5F53 0x24A98
+0x5F54 0x24A99
+0x5F55 0x24A9A
+0x5F57 0x24A9B
+0x5F58 0x24AA6
+0x5F59 0x24A9C
+0x5F5A 0x24A9D
+0x5F5B 0x24A9E
+0x5F5C 0x24A9F
+0x5F5D 0x28ACE
+0x5F5E 0x24AC8
+0x5F5F 0x24AA0
+0x5F60 0x24B19
+0x5F61 0x24C0D
+0x5F62 0x250BF
+0x5F63 0x252E9
+0x5F64 0x252EA
+0x5F65 0x255A2
+0x5F66 0x255A3
+0x5F67 0x255A4
+0x5F68 0x255A5
+0x5F69 0x255A6
+0x5F6A 0x25715
+0x5F6B 0x25717
+0x5F6C 0x258BF
+0x5F6D 0x258C0
+0x5F6E 0x258C1
+0x5F6F 0x258C2
+0x5F70 0x258C3
+0x5F71 0x258C4
+0x5F72 0x258C5
+0x5F73 0x2190D
+0x5F74 0x25A23
+0x5F75 0x25ABE
+0x5F76 0x25D03
+0x5F77 0x25D04
+0x5F78 0x25D05
+0x5F79 0x25D06
+0x5F7A 0x25D07
+0x5F7B 0x25D08
+0x5F7C 0x25D09
+0x5F7D 0x25D0A
+0x5F7E 0x25D0B
+0x6021 0x25D0C
+0x6022 0x25D20
+0x6023 0x25D0D
+0x6024 0x25D0E
+0x6025 0x25D0F
+0x6027 0x25F26
+0x6028 0x25F27
+0x6029 0x25F28
+0x602A 0x2615D
+0x602B 0x2615E
+0x602C 0x2615F
+0x602D 0x26160
+0x602E 0x26161
+0x602F 0x26162
+0x6030 0x26163
+0x6031 0x26164
+0x6032 0x26165
+0x6033 0x26257
+0x6034 0x263CF
+0x6035 0x263D0
+0x6036 0x26499
+0x6037 0x2649A
+0x6038 0x265EA
+0x6039 0x265EB
+0x603A 0x265EC
+0x603B 0x2687E
+0x603C 0x2687F
+0x603D 0x26880
+0x6040 0x26881
+0x6041 0x26882
+0x6042 0x268F3
+0x6043 0x26925
+0x6044 0x2699F
+0x6045 0x269A0
+0x6046 0x269F3
+0x6047 0x26A00
+0x6048 0x26FEB
+0x6049 0x26FEC
+0x604A 0x26FED
+0x604B 0x26FEE
+0x604C 0x26FEF
+0x604F 0x26FF0
+0x6050 0x26FF1
+0x6051 0x26FF2
+0x6052 0x26FF3
+0x6053 0x26FF4
+0x6054 0x26FF5
+0x6055 0x26FF9
+0x6056 0x26FFA
+0x6057 0x26FFB
+0x6058 0x26FFC
+0x6059 0x26FFD
+0x605A 0x26FFE
+0x605B 0x26FFF
+0x605C 0x27000
+0x605D 0x2F9AE
+0x605E 0x27001
+0x605F 0x27002
+0x6060 0x27203
+0x6061 0x27486
+0x6062 0x27479
+0x6064 0x2747A
+0x6065 0x2747B
+0x6066 0x2747C
+0x6067 0x27484
+0x6068 0x2747D
+0x6069 0x2747E
+0x606A 0x2747F
+0x606B 0x27786
+0x606C 0x27787
+0x606D 0x27800
+0x606E 0x27801
+0x606F 0x27888
+0x6070 0x27889
+0x6071 0x2788A
+0x6072 0x27AF5
+0x6074 0x27B25
+0x6075 0x27AF6
+0x6076 0x27DEB
+0x6077 0x27DEC
+0x6078 0x27DED
+0x6079 0x27DEE
+0x607B 0x27DEF
+0x607C 0x27DF0
+0x607D 0x27F6C
+0x607E 0x28121
+0x6121 0x28122
+0x6122 0x28123
+0x6123 0x28124
+0x6124 0x28125
+0x6125 0x28126
+0x6126 0x2827B
+0x6127 0x2827C
+0x6128 0x28391
+0x6129 0x28392
+0x612A 0x28393
+0x612B 0x2860E
+0x612C 0x2860F
+0x612D 0x28610
+0x612E 0x288B3
+0x612F 0x28936
+0x6130 0x28AC6
+0x6131 0x28AA1
+0x6132 0x28AA2
+0x6134 0x28AA3
+0x6135 0x28ACC
+0x6136 0x28AA4
+0x6137 0x28AA5
+0x6138 0x28AA6
+0x6139 0x28ACB
+0x613A 0x28AA7
+0x613C 0x28AA8
+0x613D 0x28AA9
+0x613E 0x28AAA
+0x6140 0x28AAB
+0x6141 0x28AAC
+0x6142 0x28AAD
+0x6144 0x28AAE
+0x6145 0x28AAF
+0x6146 0x28AB0
+0x6147 0x28D8C
+0x6148 0x28D8D
+0x6149 0x28D8E
+0x614A 0x2F9F1
+0x614B 0x28D92
+0x614C 0x28D8F
+0x614D 0x28F52
+0x614E 0x28F53
+0x614F 0x28F54
+0x6150 0x28F55
+0x6151 0x29129
+0x6153 0x292F3
+0x6154 0x292F4
+0x6155 0x2950D
+0x6156 0x2950E
+0x6157 0x2950F
+0x6158 0x29510
+0x6159 0x29614
+0x615A 0x29771
+0x615B 0x29772
+0x615C 0x2990F
+0x615D 0x29904
+0x615E 0x29906
+0x6160 0x29907
+0x6161 0x29ADC
+0x6162 0x29ADD
+0x6163 0x29B6D
+0x6164 0x29B79
+0x6165 0x29B6E
+0x6167 0x29CEC
+0x6168 0x29DDD
+0x6169 0x29DDE
+0x616A 0x29DDF
+0x616B 0x29DE0
+0x616C 0x29DE1
+0x616D 0x29DE2
+0x616E 0x29DE3
+0x616F 0x29DE4
+0x6170 0x29E3A
+0x6171 0x29DE5
+0x6173 0x29DE6
+0x6174 0x2A06B
+0x6175 0x2A06C
+0x6176 0x2444E
+0x6178 0x2A2BD
+0x6179 0x2A2BE
+0x617A 0x2A2BF
+0x617B 0x2A334
+0x617D 0x2A512
+0x617E 0x20440
+0x6221 0x20441
+0x6222 0x21102
+0x6223 0x21103
+0x6224 0x21104
+0x6225 0x21105
+0x6226 0x21106
+0x6227 0x214D7
+0x6228 0x214CC
+0x6229 0x21698
+0x622A 0x21906
+0x622B 0x21907
+0x622C 0x219AF
+0x622D 0x219B0
+0x622E 0x21AEA
+0x622F 0x21AF2
+0x6230 0x21FA2
+0x6231 0x21FA3
+0x6232 0x21FA4
+0x6233 0x22176
+0x6234 0x222F5
+0x6235 0x222F6
+0x6236 0x222F7
+0x6238 0x2293B
+0x6239 0x22925
+0x623A 0x2293A
+0x623B 0x2293C
+0x623C 0x2293D
+0x623D 0x2293E
+0x623E 0x22E37
+0x623F 0x22E38
+0x6240 0x22E39
+0x6241 0x22E3A
+0x6242 0x22E3B
+0x6243 0x22E3C
+0x6244 0x22E3D
+0x6245 0x22E3E
+0x6246 0x22E3F
+0x6247 0x22E4B
+0x6249 0x22E40
+0x624A 0x23022
+0x624B 0x23067
+0x624C 0x230D3
+0x624D 0x232FA
+0x624F 0x237BC
+0x6252 0x237A5
+0x6254 0x237B6
+0x6256 0x237A6
+0x6257 0x237BB
+0x6258 0x237A7
+0x6259 0x237A8
+0x625A 0x237A9
+0x625B 0x237AA
+0x625C 0x237AB
+0x625D 0x237AC
+0x625E 0x237BF
+0x625F 0x237AD
+0x6260 0x237AE
+0x6261 0x237AF
+0x6262 0x2392E
+0x6263 0x23B00
+0x6264 0x2409D
+0x6265 0x2409E
+0x6266 0x240CB
+0x6267 0x240CC
+0x6268 0x240CD
+0x6269 0x240CE
+0x626A 0x240CF
+0x626C 0x2409F
+0x626D 0x240D0
+0x626E 0x240D1
+0x626F 0x240D2
+0x6270 0x240D3
+0x6271 0x240D4
+0x6274 0x2445D
+0x6275 0x2445E
+0x6276 0x2445F
+0x6277 0x24460
+0x6279 0x24ABA
+0x627A 0x24ABC
+0x627C 0x24AB5
+0x627D 0x24ABD
+0x627E 0x24AB6
+0x6321 0x24AB7
+0x6322 0x24AB8
+0x6323 0x24AA8
+0x6324 0x2F932
+0x6325 0x24BFE
+0x6326 0x24BFC
+0x6327 0x24EE1
+0x6328 0x250C4
+0x6329 0x250C5
+0x632A 0x25314
+0x632B 0x255AE
+0x632C 0x255AF
+0x632D 0x255B0
+0x632E 0x255B1
+0x632F 0x255B9
+0x6330 0x258E7
+0x6331 0x25D46
+0x6333 0x25D47
+0x6334 0x25D48
+0x6335 0x25D49
+0x6336 0x25D1E
+0x6337 0x25D1F
+0x6338 0x25D4A
+0x6339 0x25D4B
+0x633A 0x25D4C
+0x633B 0x25D4D
+0x633C 0x25D4E
+0x633E 0x25F46
+0x633F 0x25F4B
+0x6340 0x26190
+0x6341 0x26191
+0x6343 0x26192
+0x6344 0x26193
+0x6345 0x26194
+0x6346 0x2625B
+0x6347 0x265F2
+0x6348 0x265F8
+0x6349 0x265F9
+0x634A 0x26894
+0x634B 0x268A4
+0x634C 0x26897
+0x634D 0x26898
+0x634E 0x26929
+0x634F 0x269AE
+0x6350 0x26AAF
+0x6351 0x27059
+0x6352 0x2705A
+0x6354 0x2705B
+0x6355 0x2705C
+0x6356 0x2705D
+0x6357 0x2705E
+0x6358 0x2705F
+0x6359 0x27060
+0x635A 0x27061
+0x635B 0x26FAA
+0x635C 0x27062
+0x635D 0x27063
+0x635E 0x27064
+0x635F 0x27065
+0x6360 0x27066
+0x6361 0x27067
+0x6362 0x27068
+0x6363 0x27069
+0x6364 0x2706A
+0x6365 0x2706B
+0x6366 0x2706C
+0x6367 0x2706D
+0x6368 0x2706E
+0x6369 0x2706F
+0x636B 0x274B2
+0x636C 0x274B3
+0x636D 0x274B4
+0x636F 0x274B5
+0x6370 0x274B6
+0x6371 0x274B7
+0x6372 0x274B8
+0x6373 0x274B9
+0x6374 0x274BA
+0x6375 0x274BB
+0x6376 0x27788
+0x6378 0x27B19
+0x6379 0x27B1A
+0x637A 0x27B1B
+0x637B 0x27C16
+0x637C 0x27E0C
+0x637D 0x27E0D
+0x637E 0x27E0E
+0x6421 0x27E0F
+0x6423 0x27F83
+0x6424 0x27F84
+0x6425 0x27F85
+0x6426 0x28283
+0x6427 0x28284
+0x6428 0x283B0
+0x642A 0x28626
+0x642B 0x28627
+0x642C 0x28636
+0x642D 0x28628
+0x642E 0x28629
+0x6431 0x28AE7
+0x6432 0x28AE8
+0x6433 0x28AE9
+0x6435 0x28AEA
+0x6436 0x28AEB
+0x6438 0x28AEC
+0x6439 0x28AED
+0x643A 0x28AEE
+0x643B 0x28AEF
+0x643C 0x28AF0
+0x643D 0x28AF1
+0x643E 0x28B0C
+0x643F 0x28AF2
+0x6440 0x28AF3
+0x6441 0x28AF4
+0x6442 0x28AF5
+0x6443 0x28AF6
+0x6444 0x28AF7
+0x6445 0x28AF8
+0x6446 0x28DA3
+0x6447 0x28DA4
+0x6448 0x28DA5
+0x6449 0x28DA6
+0x644A 0x28DA7
+0x644C 0x28F5C
+0x644E 0x2914B
+0x644F 0x291E1
+0x6450 0x29315
+0x6452 0x29316
+0x6453 0x29317
+0x6454 0x2952C
+0x6455 0x2952D
+0x6456 0x29622
+0x6457 0x29623
+0x6458 0x29796
+0x6459 0x29797
+0x645B 0x2992E
+0x645C 0x29930
+0x645D 0x29931
+0x645F 0x29ADF
+0x6460 0x29B8B
+0x6461 0x29B8C
+0x6463 0x29B8D
+0x6464 0x29CFC
+0x6465 0x29CFD
+0x6466 0x29CFE
+0x6467 0x29CFF
+0x6468 0x29E17
+0x6469 0x29E2D
+0x646A 0x29E18
+0x646C 0x29E19
+0x646E 0x29E12
+0x646F 0x29E1A
+0x6470 0x29E1B
+0x6471 0x29E1C
+0x6474 0x2A097
+0x6476 0x2A098
+0x6477 0x2A099
+0x6479 0x2A3C4
+0x647A 0x2044F
+0x647B 0x204CD
+0x647C 0x20AC7
+0x647D 0x2111C
+0x647E 0x2111D
+0x6521 0x2111E
+0x6522 0x214E7
+0x6523 0x214E9
+0x6524 0x214EA
+0x6525 0x214EB
+0x6526 0x21915
+0x6527 0x21CF1
+0x6528 0x21CF2
+0x6529 0x21FB6
+0x652A 0x225A0
+0x652B 0x2294A
+0x652C 0x22A20
+0x652D 0x22E60
+0x652E 0x22E61
+0x652F 0x22E41
+0x6530 0x22E62
+0x6531 0x23303
+0x6532 0x23304
+0x6533 0x237D9
+0x6534 0x237DA
+0x6535 0x237DB
+0x6536 0x237DC
+0x6537 0x237DD
+0x6539 0x237DE
+0x653A 0x237DF
+0x653B 0x237E0
+0x653C 0x237E1
+0x653D 0x237E2
+0x653F 0x237E3
+0x6541 0x23C31
+0x6542 0x24105
+0x6543 0x24106
+0x6544 0x24107
+0x6545 0x24472
+0x6546 0x2448A
+0x6547 0x2448B
+0x6548 0x24488
+0x654A 0x2448C
+0x654B 0x2448D
+0x654C 0x2448E
+0x654D 0x2448F
+0x654E 0x24490
+0x654F 0x24542
+0x6550 0x24543
+0x6552 0x24AC1
+0x6553 0x24AC2
+0x6554 0x24AC3
+0x6555 0x24AC4
+0x6556 0x250CB
+0x6557 0x25322
+0x655A 0x255C3
+0x655B 0x255C4
+0x655C 0x255C5
+0x655D 0x255C6
+0x655E 0x2571E
+0x655F 0x25725
+0x6560 0x258F3
+0x6561 0x258F4
+0x6563 0x258F5
+0x6564 0x25A38
+0x6565 0x25A48
+0x6566 0x25ACA
+0x6568 0x25D7A
+0x6569 0x25D7B
+0x656A 0x25F55
+0x656B 0x25F56
+0x656C 0x261B1
+0x656D 0x261B2
+0x656E 0x261B3
+0x6570 0x261B4
+0x6571 0x261B5
+0x6572 0x264A4
+0x6573 0x26600
+0x6574 0x26601
+0x6575 0x26602
+0x6576 0x268AC
+0x6578 0x269B3
+0x6579 0x270B6
+0x657A 0x270B7
+0x657B 0x270B8
+0x657C 0x270B9
+0x657D 0x270BA
+0x657E 0x270BB
+0x6621 0x270BC
+0x6622 0x270BD
+0x6623 0x270BE
+0x6624 0x270BF
+0x6625 0x270C0
+0x6626 0x270C1
+0x6627 0x270C2
+0x6628 0x270C3
+0x6629 0x270C4
+0x662A 0x270C5
+0x662B 0x270C6
+0x662C 0x270C7
+0x662D 0x274E3
+0x662E 0x274E4
+0x662F 0x274E5
+0x6630 0x274E6
+0x6631 0x274E7
+0x6633 0x277B5
+0x6634 0x277A1
+0x6635 0x27895
+0x6636 0x27B3B
+0x6637 0x27B3C
+0x6638 0x27B3D
+0x6639 0x27B3E
+0x663A 0x27C14
+0x663B 0x27E20
+0x663C 0x27E21
+0x663D 0x27E22
+0x663E 0x27E23
+0x663F 0x27E24
+0x6640 0x27F96
+0x6641 0x27F97
+0x6642 0x27F98
+0x6643 0x28194
+0x6644 0x28195
+0x6645 0x28196
+0x6646 0x28197
+0x6647 0x28198
+0x6648 0x2828F
+0x6649 0x28290
+0x664A 0x283BC
+0x664B 0x2843B
+0x664C 0x2863D
+0x664E 0x288DF
+0x664F 0x2891E
+0x6650 0x28B23
+0x6651 0x28B24
+0x6652 0x28B49
+0x6653 0x28B25
+0x6654 0x28B26
+0x6655 0x28B27
+0x6656 0x28B28
+0x6658 0x28B29
+0x6659 0x28B2A
+0x665A 0x28B2E
+0x665B 0x28B2F
+0x665C 0x28B4E
+0x665D 0x28B30
+0x665E 0x2F9EB
+0x665F 0x28B31
+0x6660 0x28B32
+0x6661 0x28B33
+0x6662 0x28B34
+0x6663 0x28B35
+0x6664 0x28B36
+0x6666 0x28B37
+0x6667 0x28B50
+0x6668 0x28B38
+0x666A 0x28B39
+0x666B 0x28B3A
+0x666C 0x28B3B
+0x666D 0x28B3C
+0x666E 0x28B3D
+0x666F 0x28B3E
+0x6670 0x28DB8
+0x6671 0x28DB9
+0x6672 0x28F62
+0x6673 0x28F63
+0x6674 0x29041
+0x6675 0x2916D
+0x6677 0x29352
+0x6678 0x29337
+0x6679 0x293DB
+0x667A 0x2953F
+0x667B 0x29634
+0x667C 0x2985B
+0x667D 0x29946
+0x667E 0x2995A
+0x6721 0x2995B
+0x6722 0x29AE1
+0x6723 0x29AE2
+0x6724 0x29AE3
+0x6725 0x29AE4
+0x6726 0x29BA7
+0x6727 0x29BA8
+0x6728 0x29BA9
+0x6729 0x29D0F
+0x672A 0x29D2B
+0x672B 0x29E56
+0x672C 0x29E57
+0x672D 0x29E58
+0x672E 0x29E5E
+0x672F 0x29E59
+0x6730 0x29E5A
+0x6731 0x29E5B
+0x6732 0x29E5C
+0x6734 0x29E68
+0x6736 0x2A12C
+0x6737 0x2A0E2
+0x6738 0x2A0F3
+0x6739 0x2A2D2
+0x673A 0x2A356
+0x673B 0x2A3CE
+0x673C 0x2A461
+0x673D 0x2A69B
+0x673E 0x2A6B4
+0x673F 0x2045C
+0x6740 0x2F810
+0x6741 0x204D2
+0x6742 0x20571
+0x6743 0x20673
+0x6744 0x2082C
+0x6745 0x20B94
+0x6747 0x2113F
+0x6748 0x21140
+0x6749 0x214F9
+0x674A 0x214FA
+0x674B 0x214FD
+0x674C 0x214FB
+0x674D 0x2191C
+0x674E 0x2191D
+0x674F 0x21AFF
+0x6750 0x21B00
+0x6751 0x21CF7
+0x6752 0x24CFE
+0x6754 0x224B6
+0x6755 0x22954
+0x6756 0x22E77
+0x6757 0x22E79
+0x6758 0x22E7A
+0x6759 0x22E7B
+0x675A 0x23069
+0x675B 0x23802
+0x675C 0x23803
+0x675D 0x23804
+0x675E 0x23805
+0x675F 0x23806
+0x6760 0x23807
+0x6761 0x23808
+0x6762 0x23809
+0x6763 0x2380A
+0x6764 0x2380B
+0x6765 0x23835
+0x6767 0x23C39
+0x6768 0x2411E
+0x6769 0x2411F
+0x676A 0x24120
+0x676B 0x24121
+0x676D 0x24122
+0x676E 0x24123
+0x676F 0x24124
+0x6770 0x2412C
+0x6771 0x244B3
+0x6772 0x244B5
+0x6773 0x244B6
+0x6774 0x244B7
+0x6775 0x244B8
+0x6776 0x24AD0
+0x6777 0x24CFA
+0x6778 0x24F07
+0x6779 0x24FBD
+0x677A 0x250D7
+0x677B 0x250D2
+0x677C 0x255DB
+0x677D 0x255D6
+0x677E 0x2045D
+0x6821 0x25A43
+0x6822 0x25ACF
+0x6823 0x25DA3
+0x6824 0x25DA4
+0x6825 0x25DA5
+0x6826 0x25DA6
+0x6827 0x25DA7
+0x6828 0x25DA8
+0x6829 0x25DA9
+0x682A 0x25F5D
+0x682B 0x25F5E
+0x682C 0x261C9
+0x682D 0x261CA
+0x682E 0x261CB
+0x682F 0x261CC
+0x6830 0x26606
+0x6831 0x26607
+0x6833 0x268C5
+0x6834 0x268F5
+0x6835 0x269B4
+0x6836 0x269B8
+0x6837 0x269B5
+0x6838 0x270FD
+0x683A 0x270FE
+0x683B 0x270FF
+0x683C 0x27100
+0x683D 0x27101
+0x683E 0x27102
+0x683F 0x27103
+0x6840 0x27109
+0x6841 0x27104
+0x6842 0x27105
+0x6843 0x27106
+0x6844 0x27107
+0x6845 0x27511
+0x6846 0x27512
+0x6847 0x27513
+0x6848 0x27514
+0x6849 0x27515
+0x684B 0x27898
+0x684C 0x27899
+0x684D 0x27E3C
+0x684E 0x27E2D
+0x684F 0x27E2E
+0x6851 0x281BB
+0x6852 0x281BC
+0x6854 0x2843D
+0x6855 0x28647
+0x6856 0x28648
+0x6857 0x28649
+0x6858 0x2864A
+0x6859 0x287E1
+0x685A 0x287E7
+0x685B 0x288EB
+0x685C 0x28920
+0x685D 0x28938
+0x685E 0x28B62
+0x685F 0x28B67
+0x6860 0x28B68
+0x6861 0x28B69
+0x6862 0x28B6A
+0x6863 0x28B6B
+0x6864 0x28B6D
+0x6865 0x28B6E
+0x6866 0x28B6F
+0x6867 0x28B70
+0x6868 0x28B71
+0x6869 0x28B72
+0x686A 0x28B8F
+0x686B 0x28B73
+0x686C 0x28B74
+0x686D 0x28B75
+0x686E 0x28B76
+0x686F 0x28B77
+0x6870 0x28DC9
+0x6871 0x28DCA
+0x6873 0x28DCB
+0x6874 0x28DCC
+0x6875 0x28DCD
+0x6876 0x29051
+0x6879 0x29245
+0x687A 0x29559
+0x687B 0x2955A
+0x687C 0x2955B
+0x687D 0x29640
+0x687E 0x297CF
+0x6921 0x2985E
+0x6922 0x2997B
+0x6923 0x29A93
+0x6924 0x29BBC
+0x6925 0x29D16
+0x6926 0x29D30
+0x6928 0x29E8D
+0x6929 0x29E8E
+0x692B 0x29E8F
+0x692C 0x29E90
+0x692D 0x29E91
+0x692E 0x29E92
+0x692F 0x29E93
+0x6930 0x29E94
+0x6931 0x29E95
+0x6932 0x29E96
+0x6933 0x2A123
+0x6934 0x2A114
+0x6935 0x2A2DB
+0x6936 0x2A40A
+0x6937 0x2A5CE
+0x6938 0x20466
+0x6939 0x20468
+0x693A 0x20467
+0x693B 0x204D3
+0x693C 0x21163
+0x693D 0x21504
+0x693E 0x2169E
+0x693F 0x21926
+0x6940 0x2192A
+0x6941 0x2296C
+0x6942 0x22964
+0x6943 0x22E8F
+0x6944 0x22E90
+0x6945 0x23034
+0x6946 0x2330E
+0x6947 0x23825
+0x6948 0x23826
+0x6949 0x23827
+0x694B 0x23828
+0x694E 0x23829
+0x694F 0x2382A
+0x6950 0x2382B
+0x6951 0x2382C
+0x6952 0x23C3E
+0x6953 0x24142
+0x6954 0x24143
+0x6955 0x24133
+0x6956 0x244C1
+0x6957 0x244C2
+0x6958 0x244C3
+0x6959 0x24AD6
+0x695A 0x24AD7
+0x695B 0x255E1
+0x695C 0x255E2
+0x695D 0x2572B
+0x695E 0x25AD1
+0x695F 0x25DCC
+0x6960 0x25DCD
+0x6961 0x25DCE
+0x6962 0x25DCF
+0x6963 0x261DE
+0x6964 0x261DF
+0x6965 0x261E0
+0x6966 0x261E1
+0x6967 0x268F6
+0x6968 0x2712C
+0x696A 0x27154
+0x696B 0x2712D
+0x696C 0x2712E
+0x696D 0x27541
+0x696E 0x27542
+0x696F 0x277C7
+0x6970 0x278A0
+0x6971 0x278A1
+0x6972 0x27B70
+0x6973 0x27B71
+0x6974 0x27B72
+0x6976 0x27E34
+0x6977 0x27E35
+0x6978 0x27E36
+0x6979 0x27FA6
+0x697A 0x281CC
+0x697C 0x28299
+0x697D 0x288F4
+0x697E 0x28B9B
+0x6A21 0x28B9E
+0x6A22 0x28B9F
+0x6A23 0x28BA0
+0x6A24 0x28BA1
+0x6A25 0x28BA2
+0x6A26 0x28BA3
+0x6A27 0x28BA4
+0x6A28 0x28BA5
+0x6A29 0x28BA6
+0x6A2A 0x28BA7
+0x6A2B 0x28BA8
+0x6A2C 0x28DDB
+0x6A2D 0x28DDC
+0x6A2E 0x28DDD
+0x6A2F 0x28DD7
+0x6A30 0x28DDE
+0x6A31 0x28DDF
+0x6A32 0x29059
+0x6A33 0x29446
+0x6A34 0x29565
+0x6A35 0x29649
+0x6A37 0x297DD
+0x6A38 0x29995
+0x6A39 0x29996
+0x6A3A 0x29997
+0x6A3B 0x29BD4
+0x6A3C 0x29BD6
+0x6A3D 0x29D26
+0x6A40 0x29EC8
+0x6A41 0x29EC5
+0x6A42 0x29EC6
+0x6A43 0x29EC7
+0x6A44 0x2A151
+0x6A45 0x2A152
+0x6A46 0x2A153
+0x6A47 0x2A154
+0x6A48 0x2A155
+0x6A49 0x2A2DE
+0x6A4B 0x2046D
+0x6A4C 0x204D5
+0x6A4D 0x21172
+0x6A4E 0x221AE
+0x6A4F 0x2230F
+0x6A50 0x2296B
+0x6A51 0x2296D
+0x6A52 0x2296E
+0x6A53 0x22978
+0x6A54 0x22E98
+0x6A55 0x22E99
+0x6A56 0x22E9A
+0x6A57 0x23844
+0x6A58 0x2385C
+0x6A59 0x23845
+0x6A5A 0x23B01
+0x6A5B 0x24158
+0x6A5C 0x24159
+0x6A5D 0x2415A
+0x6A5F 0x244D9
+0x6A60 0x244D6
+0x6A61 0x24ADA
+0x6A62 0x24ADF
+0x6A63 0x24ADB
+0x6A64 0x24D03
+0x6A65 0x255EF
+0x6A67 0x25733
+0x6A68 0x25AD2
+0x6A69 0x25DE1
+0x6A6A 0x25F6F
+0x6A6B 0x26264
+0x6A6C 0x2660E
+0x6A6D 0x27150
+0x6A6E 0x27151
+0x6A6F 0x27152
+0x6A70 0x27556
+0x6A71 0x27557
+0x6A72 0x27558
+0x6A74 0x27B81
+0x6A75 0x27B82
+0x6A76 0x27C1D
+0x6A77 0x27C1E
+0x6A78 0x27E43
+0x6A79 0x27FAA
+0x6A7A 0x288FD
+0x6A7C 0x28BC6
+0x6A7D 0x28BC7
+0x6A7E 0x28BD9
+0x6B21 0x28BD7
+0x6B23 0x28BC8
+0x6B24 0x28BC9
+0x6B25 0x28BCA
+0x6B26 0x28BCB
+0x6B27 0x28BDA
+0x6B29 0x28BCC
+0x6B2A 0x28BCD
+0x6B2B 0x28BCE
+0x6B2C 0x28BCF
+0x6B2D 0x28BD0
+0x6B2E 0x28BD1
+0x6B2F 0x28BBC
+0x6B30 0x28DE1
+0x6B31 0x28DE2
+0x6B32 0x28DE3
+0x6B33 0x291A9
+0x6B34 0x2924E
+0x6B35 0x29577
+0x6B38 0x299AC
+0x6B39 0x299AD
+0x6B3A 0x29AB6
+0x6B3B 0x29BE5
+0x6B3C 0x29EF8
+0x6B3D 0x29EEA
+0x6B3E 0x29F8D
+0x6B3F 0x29EEB
+0x6B40 0x2A195
+0x6B41 0x2046E
+0x6B42 0x204D8
+0x6B43 0x21183
+0x6B44 0x216A3
+0x6B45 0x21930
+0x6B46 0x21B0F
+0x6B47 0x22979
+0x6B48 0x2297A
+0x6B49 0x22EA7
+0x6B4A 0x22EA8
+0x6B4B 0x22EA9
+0x6B4C 0x22EAA
+0x6B4D 0x23319
+0x6B4E 0x23850
+0x6B4F 0x23851
+0x6B50 0x23852
+0x6B52 0x23868
+0x6B53 0x23853
+0x6B54 0x23854
+0x6B55 0x248E2
+0x6B56 0x24ADC
+0x6B57 0x25915
+0x6B58 0x25916
+0x6B59 0x25A4F
+0x6B5A 0x25DF5
+0x6B5B 0x25DF6
+0x6B5C 0x25DF7
+0x6B5D 0x261F4
+0x6B5E 0x264CC
+0x6B5F 0x2660F
+0x6B60 0x27166
+0x6B61 0x27167
+0x6B63 0x27168
+0x6B64 0x278A4
+0x6B65 0x27B8B
+0x6B66 0x27B8C
+0x6B67 0x281FA
+0x6B68 0x28BE6
+0x6B69 0x28BED
+0x6B6A 0x28BEE
+0x6B6B 0x28BEF
+0x6B6C 0x28BF0
+0x6B6D 0x28BFE
+0x6B6E 0x28DE7
+0x6B6F 0x28DE8
+0x6B70 0x291B3
+0x6B71 0x291E4
+0x6B72 0x29583
+0x6B73 0x29AEC
+0x6B75 0x29F16
+0x6B78 0x29F17
+0x6B79 0x2A1C3
+0x6B7A 0x2A1AC
+0x6B7B 0x2A2ED
+0x6B7E 0x2A5B4
+0x6C22 0x2118A
+0x6C23 0x2118B
+0x6C24 0x21934
+0x6C25 0x21B14
+0x6C26 0x21FDF
+0x6C27 0x224BB
+0x6C28 0x2297F
+0x6C29 0x22981
+0x6C2A 0x22EAD
+0x6C2B 0x22EAE
+0x6C2C 0x23862
+0x6C2D 0x2386E
+0x6C2F 0x2416E
+0x6C31 0x24717
+0x6C32 0x24AE6
+0x6C33 0x24C10
+0x6C34 0x25919
+0x6C36 0x26610
+0x6C37 0x26AF2
+0x6C38 0x27176
+0x6C39 0x27177
+0x6C3A 0x27B95
+0x6C3B 0x27B96
+0x6C3C 0x28C00
+0x6C3D 0x28C01
+0x6C3E 0x28C31
+0x6C3F 0x2F9ED
+0x6C40 0x28C1C
+0x6C41 0x2906D
+0x6C42 0x29BF4
+0x6C43 0x29BF5
+0x6C44 0x29D3D
+0x6C45 0x29F32
+0x6C46 0x29F33
+0x6C47 0x2A2F4
+0x6C49 0x20473
+0x6C4A 0x21937
+0x6C4C 0x23871
+0x6C4D 0x25E0F
+0x6C4F 0x25E0E
+0x6C50 0x26611
+0x6C51 0x27185
+0x6C52 0x28C14
+0x6C53 0x28C15
+0x6C54 0x28C16
+0x6C55 0x28C17
+0x6C56 0x28C18
+0x6C57 0x28C19
+0x6C58 0x28C1A
+0x6C59 0x291C3
+0x6C5A 0x29F42
+0x6C5B 0x29F43
+0x6C5C 0x29F44
+0x6C5D 0x29F48
+0x6C5E 0x2A1FB
+0x6C5F 0x216A5
+0x6C60 0x219B8
+0x6C61 0x22EB2
+0x6C62 0x2303D
+0x6C63 0x23872
+0x6C64 0x244E7
+0x6C65 0x244E8
+0x6C66 0x25359
+0x6C67 0x2573A
+0x6C68 0x25E14
+0x6C69 0x261FF
+0x6C6A 0x269C0
+0x6C6B 0x2718D
+0x6C6D 0x2718E
+0x6C6F 0x28C22
+0x6C72 0x29C04
+0x6C73 0x29C29
+0x6C74 0x29F51
+0x6C75 0x29F66
+0x6C76 0x2A20E
+0x6C77 0x2FA13
+0x6C79 0x2119B
+0x6C7A 0x2119C
+0x6C7B 0x22316
+0x6C7C 0x22986
+0x6C7D 0x22987
+0x6D21 0x28C2C
+0x6D22 0x28C30
+0x6D23 0x28C28
+0x6D24 0x2965F
+0x6D26 0x2417E
+0x6D27 0x25E19
+0x6D28 0x2820A
+0x6D29 0x28C36
+0x6D2A 0x28DFC
+0x6D2B 0x29F6D
+0x6D2C 0x29F6E
+0x6D2D 0x2A6C6
+0x6D2F 0x2387B
+0x6D30 0x26206
+0x6D31 0x2759F
+0x6D32 0x2A232
+0x6D33 0x2820D
+0x6D34 0x2298B
+0x6D35 0x28C3B
+0x6D37 0x2A23D
+0x6D38 0x28C3C
+0x6D39 0x28C3D
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,71 @@
+0x2144 0x2000B
+0x214F 0x2F817
+0x216F 0x201A9
+0x217C 0x2F850
+0x2225 0x2F82A
+0x227B 0x2F815
+0x2329 0x2F82C
+0x233C 0x2F83B
+0x2359 0x21D46
+0x2424 0x23C86
+0x2429 0x2F835
+0x2441 0x2F81B
+0x2452 0x2F80E
+0x257E 0x225D7
+0x2627 0x2F8B2
+0x272A 0x2F98F
+0x274E 0x20209
+0x2753 0x2F80F
+0x2754 0x2F811
+0x275C 0x206EC
+0x2A39 0x2233F
+0x2A45 0x2592E
+0x2C40 0x2F87A
+0x2C51 0x2F899
+0x2D35 0x2F8DF
+0x2D52 0x2F8FE
+0x2E56 0x2F96A
+0x2E5A 0x25133
+0x3023 0x2F841
+0x3053 0x2172E
+0x315C 0x2F8E1
+0x3350 0x2F983
+0x3460 0x20DAE
+0x3470 0x2F855
+0x347E 0x21637
+0x355F 0x2F88D
+0x3565 0x2F89C
+0x3628 0x2F8BA
+0x3640 0x2F8CB
+0x3675 0x2F907
+0x3977 0x20564
+0x3A26 0x2F833
+0x3A4F 0x21364
+0x3C3A 0x2F8E5
+0x3D3F 0x2F934
+0x3F6D 0x28CDD
+0x4043 0x2F823
+0x407E 0x2F87E
+0x416E 0x2F8E8
+0x4333 0x2F94E
+0x4425 0x2F98D
+0x446D 0x2F9DB
+0x4670 0x2F8A6
+0x4731 0x230BA
+0x474B 0x235F3
+0x4826 0x24A0F
+0x486A 0x2F96C
+0x5039 0x20B89
+0x5460 0x2F8AF
+0x553A 0x24039
+0x5545 0x2F921
+0x5678 0x2F9F5
+0x5736 0x29937
+0x584F 0x25CD1
+0x5863 0x265DF
+0x5A33 0x2F86A
+0x5A36 0x2F870
+0x5B26 0x2F9B6
+0x5B2D 0x2F9C1
+0x5C2F 0x2FA19
+0x607C 0x2F9D6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,3476 @@
+0x2121 0x20086
+0x2125 0x21FE8
+0x2128 0x2010E
+0x2129 0x20627
+0x212D 0x2053C
+0x212E 0x20675
+0x212F 0x2F828
+0x2133 0x2193C
+0x2134 0x2F875
+0x2135 0x2F878
+0x213F 0x2F819
+0x2140 0x206A5
+0x2141 0x206AA
+0x2142 0x2090F
+0x2143 0x20A0E
+0x2146 0x20B9C
+0x2147 0x20B9B
+0x2148 0x2123C
+0x214A 0x21BC2
+0x214E 0x233B4
+0x2156 0x20065
+0x2158 0x201B2
+0x215C 0x20477
+0x215D 0x20542
+0x215F 0x20633
+0x2162 0x206AF
+0x2163 0x20836
+0x2168 0x20B22
+0x216E 0x211A3
+0x2174 0x21C25
+0x2175 0x21C24
+0x2177 0x22052
+0x2178 0x22189
+0x2179 0x224BF
+0x217D 0x233B5
+0x217E 0x2574C
+0x2222 0x28E14
+0x2223 0x28E12
+0x2225 0x200A3
+0x2226 0x200A2
+0x2229 0x201B6
+0x222B 0x201B5
+0x222C 0x201B4
+0x222F 0x201C2
+0x2230 0x201B8
+0x2232 0x20479
+0x2235 0x20508
+0x2237 0x2057A
+0x2238 0x205B6
+0x2239 0x206BD
+0x223A 0x206B7
+0x223B 0x206BC
+0x223D 0x206C4
+0x223E 0x206C9
+0x2243 0x20930
+0x2244 0x20983
+0x2245 0x20985
+0x2246 0x20A12
+0x2247 0x20A34
+0x2249 0x20AE4
+0x224A 0x20ADE
+0x224B 0x20B2A
+0x224D 0x20BAF
+0x224E 0x20BB4
+0x224F 0x20BB3
+0x2250 0x20BB1
+0x2254 0x215DE
+0x2257 0x216B8
+0x2258 0x216B0
+0x225A 0x219C2
+0x225E 0x21C2A
+0x2262 0x21FE9
+0x2264 0x22057
+0x2267 0x221B6
+0x2268 0x221D7
+0x2269 0x221DE
+0x226E 0x224C2
+0x226F 0x225AB
+0x2272 0x2298F
+0x2276 0x22A6D
+0x2277 0x22EB5
+0x227A 0x233C0
+0x227B 0x233BF
+0x227D 0x239B9
+0x227E 0x23B1C
+0x2323 0x23C80
+0x2324 0x24184
+0x2325 0x24185
+0x2328 0x24724
+0x232C 0x2634C
+0x232E 0x26AF6
+0x2331 0x28670
+0x2333 0x28675
+0x2334 0x28E17
+0x2338 0x201F1
+0x233A 0x201DA
+0x233C 0x205B9
+0x2341 0x206CE
+0x2342 0x206D2
+0x2343 0x206D0
+0x2345 0x20843
+0x2349 0x2084D
+0x234A 0x20934
+0x234C 0x209D9
+0x234E 0x20A18
+0x2350 0x20B38
+0x2352 0x20BD7
+0x2355 0x20BDC
+0x2356 0x20BCB
+0x2357 0x20BD6
+0x2358 0x20BD8
+0x235A 0x20BD1
+0x235B 0x2F83E
+0x235C 0x2F83C
+0x235D 0x20BD2
+0x2360 0x21259
+0x2363 0x215E5
+0x2364 0x215E6
+0x2366 0x215E8
+0x2368 0x216BD
+0x236B 0x216BE
+0x236C 0x21949
+0x236E 0x219CD
+0x2372 0x21B5E
+0x2373 0x21BD0
+0x2375 0x21D06
+0x237C 0x21D7C
+0x237D 0x21D71
+0x237E 0x21FEF
+0x2426 0x2218D
+0x2427 0x221B7
+0x242A 0x22333
+0x242B 0x2237F
+0x242D 0x225F2
+0x2434 0x22A2A
+0x2435 0x22A8B
+0x2437 0x22A83
+0x2438 0x22A8A
+0x243B 0x22A8E
+0x243D 0x22EB6
+0x2442 0x230D8
+0x2444 0x23156
+0x2445 0x233D2
+0x2447 0x2F8DB
+0x2449 0x233C2
+0x244A 0x23887
+0x244B 0x23881
+0x244C 0x239C2
+0x244D 0x239BC
+0x244E 0x23B23
+0x2450 0x23C93
+0x2453 0x2418D
+0x2454 0x2418E
+0x2457 0x2473B
+0x2458 0x2474D
+0x245A 0x24734
+0x245B 0x24731
+0x245C 0x248F2
+0x245D 0x248F0
+0x245F 0x24C15
+0x2460 0x24D28
+0x2463 0x24F25
+0x2464 0x250E7
+0x2466 0x250E9
+0x2467 0x25417
+0x246A 0x2626C
+0x246B 0x26280
+0x246C 0x2634B
+0x2471 0x268DE
+0x2472 0x268FB
+0x2474 0x26951
+0x2477 0x26B01
+0x2478 0x26B02
+0x247A 0x26B05
+0x247C 0x26B03
+0x247E 0x28451
+0x2524 0x28453
+0x2525 0x2867A
+0x2526 0x28678
+0x2527 0x28676
+0x2528 0x28679
+0x2529 0x2868F
+0x252A 0x2867C
+0x252C 0x28E1B
+0x252D 0x28E1C
+0x252F 0x23D92
+0x2532 0x2012E
+0x2533 0x2012C
+0x2535 0x2020C
+0x2537 0x2020B
+0x253A 0x20205
+0x253D 0x2F805
+0x2541 0x205C2
+0x2542 0x205C3
+0x2544 0x20648
+0x2546 0x20646
+0x2549 0x206EA
+0x254B 0x206EB
+0x254D 0x206EE
+0x2552 0x208D8
+0x2553 0x24C1E
+0x2554 0x209DF
+0x2555 0x209DE
+0x2558 0x20A4F
+0x255B 0x20C0D
+0x255C 0x20C08
+0x255E 0x20C09
+0x2561 0x20C12
+0x2562 0x20C65
+0x2567 0x21289
+0x256A 0x21284
+0x256B 0x2129E
+0x256C 0x2128B
+0x256F 0x21562
+0x2574 0x215F9
+0x2576 0x215F7
+0x2579 0x21606
+0x257A 0x216DD
+0x257C 0x216D9
+0x257D 0x216DF
+0x257E 0x216E2
+0x2624 0x200F1
+0x262B 0x21C3F
+0x262C 0x21C3E
+0x262D 0x21D0B
+0x2630 0x21D83
+0x2633 0x21D86
+0x2635 0x2207C
+0x2639 0x221F7
+0x263E 0x221FB
+0x263F 0x2233B
+0x2644 0x225F9
+0x2645 0x225CA
+0x2647 0x225FF
+0x264A 0x22609
+0x264B 0x22603
+0x2651 0x22610
+0x2652 0x2299A
+0x2653 0x2299F
+0x2657 0x22A87
+0x265A 0x22EB7
+0x265C 0x22F08
+0x265D 0x22EF9
+0x2660 0x22EF4
+0x2664 0x26657
+0x2666 0x233D6
+0x2668 0x2F8DE
+0x266B 0x233D4
+0x266E 0x23890
+0x266F 0x2388D
+0x2672 0x23960
+0x2673 0x239CE
+0x2674 0x239CF
+0x2677 0x239D1
+0x267C 0x23CCA
+0x2721 0x23CB7
+0x2723 0x23CB2
+0x2724 0x23CBB
+0x2725 0x23CB9
+0x2728 0x2419E
+0x272A 0x241B2
+0x272D 0x2456F
+0x272E 0x245AC
+0x2730 0x24623
+0x2735 0x2476C
+0x2737 0x24732
+0x2738 0x2475E
+0x273C 0x248FB
+0x273D 0x24B29
+0x273E 0x24BBD
+0x273F 0x24C1F
+0x2741 0x22341
+0x2742 0x24C1D
+0x2744 0x24D31
+0x2745 0x24D2F
+0x2747 0x25043
+0x2749 0x25041
+0x274B 0x250F5
+0x2750 0x250F2
+0x2754 0x2541E
+0x2755 0x25754
+0x2757 0x25756
+0x2758 0x25929
+0x2759 0x25927
+0x275A 0x25928
+0x275D 0x26279
+0x275E 0x2627E
+0x275F 0x264B6
+0x2760 0x264B7
+0x2768 0x2F981
+0x276B 0x2664D
+0x2770 0x26A09
+0x2771 0x26A08
+0x2774 0x26B1E
+0x2775 0x26B1A
+0x2776 0x26B23
+0x2777 0x26B15
+0x2778 0x26B19
+0x2779 0x26B16
+0x277C 0x26B14
+0x277D 0x26B18
+0x2822 0x2721F
+0x2823 0x275DD
+0x2824 0x275DF
+0x2825 0x28469
+0x2828 0x2846C
+0x282A 0x28693
+0x282C 0x28695
+0x282D 0x28694
+0x282E 0x28691
+0x282F 0x28697
+0x2830 0x28E30
+0x2834 0x2FA18
+0x2836 0x20231
+0x283B 0x20236
+0x2841 0x205C9
+0x2842 0x205CA
+0x2844 0x20718
+0x2845 0x20712
+0x2846 0x20719
+0x2847 0x20710
+0x2848 0x20716
+0x284A 0x2085F
+0x284C 0x208DF
+0x284D 0x20917
+0x284F 0x2093C
+0x2851 0x209EA
+0x2852 0x209E9
+0x2853 0x20A1C
+0x2854 0x20A58
+0x2855 0x20A64
+0x2856 0x20AF3
+0x2858 0x20C97
+0x285A 0x20C5A
+0x285B 0x20C59
+0x285D 0x20C8E
+0x285F 0x212BC
+0x2862 0x2160D
+0x2863 0x215FC
+0x2864 0x2160C
+0x2865 0x21707
+0x2866 0x2170A
+0x2868 0x21702
+0x286A 0x21726
+0x286B 0x21708
+0x286C 0x2171D
+0x286F 0x2194E
+0x2871 0x219ED
+0x2872 0x219EE
+0x2873 0x219EF
+0x2876 0x21C50
+0x2877 0x21C4C
+0x287A 0x21C4F
+0x287C 0x21DD4
+0x287E 0x21DB0
+0x2926 0x220A5
+0x2927 0x22209
+0x292F 0x223F3
+0x2930 0x223D7
+0x2933 0x224DC
+0x2938 0x2260B
+0x2942 0x2263A
+0x2943 0x2260D
+0x2944 0x22611
+0x2946 0x22620
+0x2947 0x22601
+0x2949 0x22637
+0x294A 0x2F8A3
+0x294C 0x229AA
+0x294F 0x22AE7
+0x2950 0x22AE8
+0x2953 0x22AF5
+0x2957 0x22B35
+0x2958 0x22AE6
+0x295A 0x22AF8
+0x295C 0x22AF1
+0x295E 0x22F14
+0x295F 0x22F15
+0x2960 0x22F09
+0x2966 0x2317B
+0x2968 0x2317E
+0x2969 0x23366
+0x296A 0x23367
+0x296B 0x2340A
+0x2975 0x2389C
+0x2976 0x23962
+0x2977 0x239E1
+0x2978 0x239DE
+0x2979 0x239DF
+0x297A 0x239E9
+0x297C 0x23CE4
+0x297D 0x23CF7
+0x2A22 0x23CEA
+0x2A23 0x23CF6
+0x2A24 0x23D12
+0x2A25 0x2F901
+0x2A29 0x241D9
+0x2A2B 0x2455F
+0x2A2D 0x24573
+0x2A30 0x2463F
+0x2A31 0x24778
+0x2A33 0x2477D
+0x2A36 0x24912
+0x2A3B 0x24B2F
+0x2A3E 0x24B30
+0x2A3F 0x24BDB
+0x2A42 0x24C29
+0x2A44 0x2F936
+0x2A45 0x24D40
+0x2A47 0x24D3D
+0x2A48 0x24D3E
+0x2A4B 0x24D38
+0x2A4D 0x24F48
+0x2A4F 0x24FD0
+0x2A5B 0x2510E
+0x2A5C 0x25109
+0x2A5E 0x25107
+0x2A60 0x2535F
+0x2A61 0x25360
+0x2A63 0x2542A
+0x2A65 0x25429
+0x2A68 0x2564D
+0x2A6D 0x2576C
+0x2A70 0x25767
+0x2A73 0x25939
+0x2A74 0x25934
+0x2A75 0x25A59
+0x2A78 0x26223
+0x2A7A 0x26282
+0x2A7C 0x26283
+0x2A7D 0x262A8
+0x2A7E 0x26355
+0x2B21 0x263F9
+0x2B22 0x263F8
+0x2B23 0x263FC
+0x2B24 0x263FA
+0x2B26 0x2F97A
+0x2B2B 0x26674
+0x2B2D 0x2666B
+0x2B2E 0x26671
+0x2B30 0x26676
+0x2B31 0x26A0E
+0x2B34 0x26A10
+0x2B35 0x26A0F
+0x2B37 0x26B38
+0x2B38 0x26B39
+0x2B39 0x26B3A
+0x2B3B 0x26B37
+0x2B3C 0x26B3E
+0x2B3F 0x2719C
+0x2B40 0x2722A
+0x2B41 0x2723A
+0x2B42 0x2722B
+0x2B43 0x27228
+0x2B44 0x275AA
+0x2B45 0x2760F
+0x2B47 0x27610
+0x2B48 0x277E6
+0x2B4A 0x27D25
+0x2B4B 0x27E8E
+0x2B4F 0x2848B
+0x2B51 0x2848C
+0x2B52 0x2849A
+0x2B55 0x286B3
+0x2B57 0x286B2
+0x2B5C 0x28E44
+0x2B5F 0x20158
+0x2B60 0x202A7
+0x2B63 0x20263
+0x2B66 0x2026A
+0x2B67 0x20265
+0x2B68 0x2026B
+0x2B6A 0x204ED
+0x2B6B 0x205D9
+0x2B6C 0x2073B
+0x2B6D 0x20732
+0x2B6F 0x20735
+0x2B70 0x20731
+0x2B71 0x2073E
+0x2B72 0x20743
+0x2B73 0x20736
+0x2B74 0x2086D
+0x2B76 0x208E4
+0x2B79 0x209F4
+0x2B7B 0x20A69
+0x2B7C 0x20A6B
+0x2C22 0x20CBF
+0x2C23 0x20CC3
+0x2C24 0x20CAE
+0x2C27 0x20CB1
+0x2C2A 0x20CBB
+0x2C2B 0x20CAF
+0x2C2C 0x20CB0
+0x2C30 0x212EF
+0x2C32 0x212ED
+0x2C34 0x212F0
+0x2C35 0x21593
+0x2C36 0x21634
+0x2C37 0x2162B
+0x2C43 0x21A04
+0x2C44 0x21A03
+0x2C45 0x21A02
+0x2C47 0x21A05
+0x2C4A 0x21A00
+0x2C4B 0x21B74
+0x2C4F 0x21C65
+0x2C50 0x21C63
+0x2C52 0x21DD7
+0x2C56 0x21DE8
+0x2C58 0x21DDB
+0x2C59 0x21DD8
+0x2C5D 0x21E09
+0x2C62 0x21DE5
+0x2C63 0x21DE7
+0x2C65 0x2203F
+0x2C67 0x220C0
+0x2C69 0x220B9
+0x2C6A 0x220BA
+0x2C6E 0x22220
+0x2C6F 0x2234F
+0x2C73 0x22491
+0x2C74 0x22490
+0x2C75 0x224EE
+0x2C76 0x224F3
+0x2C77 0x224EC
+0x2C78 0x224F1
+0x2C79 0x224EB
+0x2C7A 0x224F2
+0x2C7B 0x224F4
+0x2C7C 0x224ED
+0x2C7D 0x22641
+0x2C7E 0x22648
+0x2D21 0x22645
+0x2D26 0x2267F
+0x2D27 0x2268B
+0x2D29 0x2263B
+0x2D2A 0x2264E
+0x2D2E 0x2267C
+0x2D34 0x22AF0
+0x2D35 0x22B36
+0x2D36 0x22B3F
+0x2D37 0x22B43
+0x2D38 0x22B31
+0x2D39 0x22B34
+0x2D3A 0x22B46
+0x2D3D 0x22B2F
+0x2D3E 0x22EC3
+0x2D41 0x22F36
+0x2D45 0x22F21
+0x2D46 0x2F8C8
+0x2D48 0x23073
+0x2D4A 0x230E6
+0x2D50 0x2343F
+0x2D53 0x2346B
+0x2D5A 0x23471
+0x2D5C 0x2F8E2
+0x2D5F 0x238B0
+0x2D63 0x239F3
+0x2D65 0x2F8F5
+0x2D68 0x23B61
+0x2D69 0x23B5F
+0x2D6D 0x23D28
+0x2D6E 0x23D1E
+0x2D6F 0x23D29
+0x2D70 0x2F902
+0x2D71 0x23CEB
+0x2D72 0x23D66
+0x2D74 0x241F6
+0x2D77 0x24560
+0x2D78 0x24577
+0x2D79 0x245BB
+0x2D7B 0x245BC
+0x2E23 0x247A2
+0x2E24 0x247B2
+0x2E25 0x2479E
+0x2E28 0x2493A
+0x2E29 0x24938
+0x2E2E 0x24C4D
+0x2E30 0x24C5E
+0x2E32 0x24D17
+0x2E3D 0x24D64
+0x2E3E 0x24D67
+0x2E42 0x24F59
+0x2E44 0x24FDA
+0x2E48 0x25051
+0x2E4A 0x25055
+0x2E4B 0x2513B
+0x2E4C 0x25134
+0x2E4E 0x25137
+0x2E50 0x25131
+0x2E53 0x2513F
+0x2E54 0x25159
+0x2E56 0x25361
+0x2E59 0x25458
+0x2E5A 0x25462
+0x2E5B 0x25450
+0x2E5D 0x25451
+0x2E60 0x25446
+0x2E63 0x2562D
+0x2E66 0x25948
+0x2E67 0x25951
+0x2E68 0x2594A
+0x2E69 0x2594F
+0x2E6A 0x25950
+0x2E6B 0x25949
+0x2E6C 0x25A63
+0x2E6E 0x25A66
+0x2E6F 0x25A60
+0x2E74 0x25AF1
+0x2E76 0x25B07
+0x2E79 0x25F9B
+0x2E7A 0x25FA3
+0x2E7B 0x25F9D
+0x2F22 0x25FA9
+0x2F23 0x25FA7
+0x2F24 0x25FA4
+0x2F26 0x25FBA
+0x2F27 0x221C1
+0x2F28 0x26226
+0x2F2B 0x26294
+0x2F2C 0x26293
+0x2F31 0x26407
+0x2F32 0x2640D
+0x2F33 0x26402
+0x2F34 0x2640C
+0x2F35 0x26409
+0x2F36 0x26408
+0x2F37 0x26413
+0x2F39 0x264D2
+0x2F3B 0x2653E
+0x2F3C 0x2653C
+0x2F3D 0x26667
+0x2F3E 0x2669E
+0x2F40 0x266AD
+0x2F42 0x266D9
+0x2F43 0x26642
+0x2F44 0x266A3
+0x2F45 0x266A0
+0x2F48 0x2667C
+0x2F49 0x26904
+0x2F4B 0x26958
+0x2F4C 0x26960
+0x2F4D 0x269C9
+0x2F4E 0x269C8
+0x2F51 0x26A1C
+0x2F52 0x26A1A
+0x2F54 0x26B74
+0x2F56 0x26B6E
+0x2F57 0x26B6F
+0x2F58 0x26B79
+0x2F5B 0x26B77
+0x2F60 0x26B7C
+0x2F62 0x26B70
+0x2F65 0x26B7A
+0x2F66 0x26B82
+0x2F6A 0x27244
+0x2F6C 0x27243
+0x2F6E 0x27245
+0x2F70 0x27625
+0x2F71 0x2761F
+0x2F74 0x277E8
+0x2F77 0x27809
+0x2F78 0x278B7
+0x2F79 0x278B9
+0x2F7A 0x27964
+0x2F7B 0x27963
+0x3021 0x27962
+0x3022 0x27965
+0x3024 0x27BAC
+0x3026 0x27D2A
+0x3029 0x27E96
+0x302B 0x27FC2
+0x302C 0x2F9DE
+0x3031 0x284AA
+0x3032 0x284B0
+0x3035 0x286D4
+0x3036 0x286CD
+0x3037 0x286D6
+0x3039 0x287F0
+0x3043 0x29D4B
+0x3044 0x20162
+0x3046 0x202B7
+0x3048 0x202AC
+0x3049 0x202AB
+0x304B 0x202C1
+0x304E 0x205E8
+0x304F 0x20769
+0x3050 0x2075D
+0x3051 0x2075F
+0x3055 0x20764
+0x3056 0x20762
+0x305B 0x208F9
+0x305D 0x208EE
+0x3061 0x209AB
+0x3062 0x209AC
+0x3063 0x209AA
+0x3066 0x20A86
+0x3067 0x20A7A
+0x3069 0x20D28
+0x306E 0x20D31
+0x3075 0x20D2D
+0x3076 0x2F843
+0x3078 0x20D2B
+0x3079 0x20D32
+0x307C 0x21329
+0x307D 0x21326
+0x307E 0x21353
+0x3122 0x21333
+0x3123 0x21334
+0x3124 0x2159D
+0x3127 0x21641
+0x312A 0x21791
+0x312B 0x21769
+0x312D 0x21A22
+0x312F 0x21A34
+0x3130 0x2F86D
+0x3131 0x21B2E
+0x3134 0x21BF4
+0x3136 0x21E28
+0x3138 0x21E1C
+0x313A 0x21E11
+0x313B 0x21E24
+0x313C 0x21E15
+0x313E 0x21E16
+0x313F 0x21E54
+0x3140 0x21E23
+0x3141 0x21FFF
+0x3143 0x220CF
+0x3144 0x220D0
+0x3146 0x220CE
+0x314A 0x221C7
+0x314B 0x2225C
+0x314D 0x22236
+0x3150 0x22243
+0x3155 0x2252A
+0x3156 0x22501
+0x3158 0x2250B
+0x3159 0x2250F
+0x315F 0x226DF
+0x3161 0x226D2
+0x3165 0x226CD
+0x3169 0x226DB
+0x316D 0x226CF
+0x316F 0x229C0
+0x3172 0x22B81
+0x3173 0x22B82
+0x3174 0x22B8A
+0x3175 0x22BA8
+0x3176 0x22B8C
+0x317D 0x22B8E
+0x3222 0x22B8B
+0x3224 0x22B96
+0x3226 0x22BCC
+0x3229 0x22F4F
+0x322A 0x22F4A
+0x322D 0x22F4B
+0x322E 0x22F3D
+0x3230 0x22F44
+0x3231 0x22F49
+0x3232 0x2309E
+0x3233 0x230F3
+0x3235 0x230F5
+0x3238 0x231B3
+0x323C 0x231E5
+0x323D 0x231B6
+0x323E 0x2F8D8
+0x3240 0x23486
+0x3244 0x234B6
+0x3245 0x23485
+0x3247 0x234AB
+0x324B 0x23A0D
+0x324C 0x23A8B
+0x324D 0x23A8C
+0x3256 0x23B72
+0x3259 0x23D8F
+0x325B 0x23D79
+0x325D 0x23D77
+0x325F 0x23D90
+0x3260 0x23D88
+0x3261 0x23D80
+0x3262 0x23D9E
+0x3265 0x23D82
+0x3266 0x23D34
+0x3267 0x23D89
+0x3269 0x23D85
+0x326A 0x23D7E
+0x326B 0x23D7A
+0x326C 0x23DA6
+0x326E 0x23DB5
+0x326F 0x241F4
+0x3273 0x24229
+0x3274 0x24226
+0x3275 0x2422A
+0x3278 0x2457E
+0x327B 0x2465B
+0x327C 0x24661
+0x327D 0x24660
+0x3321 0x2479B
+0x3324 0x247C3
+0x3326 0x247CD
+0x3331 0x24954
+0x3332 0x24959
+0x3336 0x24AF5
+0x333D 0x24C69
+0x333E 0x24C65
+0x3341 0x24D7C
+0x3344 0x24D80
+0x3346 0x24F65
+0x3349 0x24FDF
+0x334A 0x25060
+0x334C 0x2505E
+0x3353 0x2518F
+0x3354 0x25161
+0x3355 0x2515A
+0x3358 0x25367
+0x335C 0x253BB
+0x3368 0x2579B
+0x336C 0x257A9
+0x336E 0x25966
+0x3373 0x25A72
+0x3374 0x25A76
+0x3375 0x25B14
+0x3379 0x25B0F
+0x337E 0x25E41
+0x3421 0x25E46
+0x3423 0x25E4B
+0x3424 0x25E43
+0x3428 0x25FC6
+0x342A 0x25FC7
+0x342C 0x25FCE
+0x342F 0x25FC9
+0x3431 0x25FCB
+0x3432 0x25FC5
+0x3439 0x26369
+0x343F 0x2641E
+0x3440 0x264BA
+0x3442 0x26552
+0x3443 0x26551
+0x3444 0x26553
+0x3445 0x2669F
+0x3446 0x266DB
+0x3449 0x266E3
+0x344E 0x266D7
+0x344F 0x266E9
+0x3454 0x266DE
+0x3455 0x266DC
+0x3456 0x2693C
+0x3457 0x2F98B
+0x3459 0x26A22
+0x345A 0x26A32
+0x345B 0x26A23
+0x345F 0x26BD4
+0x3460 0x26BC8
+0x3461 0x26BBC
+0x3464 0x26BCD
+0x3468 0x26BBE
+0x346A 0x26C40
+0x346B 0x26BD6
+0x346E 0x26BBD
+0x3470 0x26BBA
+0x3472 0x26BC0
+0x3473 0x2F99B
+0x3474 0x2F99D
+0x3475 0x26BC1
+0x3476 0x271A6
+0x3477 0x271A5
+0x3478 0x271A8
+0x347D 0x2725F
+0x347E 0x27270
+0x3521 0x2726A
+0x3522 0x27265
+0x3523 0x27267
+0x3524 0x2726F
+0x3525 0x27287
+0x3528 0x2763D
+0x3529 0x27643
+0x352B 0x27640
+0x3532 0x27818
+0x3536 0x27819
+0x3537 0x278C1
+0x353B 0x278BC
+0x353C 0x278C8
+0x353E 0x27971
+0x3540 0x2796E
+0x3542 0x27978
+0x3545 0x2F9CD
+0x3546 0x2797A
+0x3547 0x27BB1
+0x3548 0x27BAF
+0x3549 0x27BB0
+0x354E 0x27CA8
+0x354F 0x27CA6
+0x3552 0x27D48
+0x3553 0x27D45
+0x3557 0x27EA0
+0x3558 0x27EA4
+0x355A 0x27FD4
+0x355F 0x27FD2
+0x3560 0x28222
+0x3564 0x282B7
+0x3565 0x282CC
+0x3567 0x284E6
+0x356A 0x284C8
+0x356D 0x286F4
+0x356F 0x286ED
+0x3571 0x2867E
+0x3572 0x2F9E3
+0x3576 0x287F9
+0x3577 0x287FD
+0x3579 0x28807
+0x357E 0x28E78
+0x3621 0x28E7A
+0x3622 0x28E79
+0x3623 0x28F8A
+0x3625 0x2907B
+0x3626 0x291D5
+0x3627 0x291E9
+0x3629 0x291EB
+0x362F 0x2016C
+0x3635 0x202FA
+0x363B 0x20318
+0x363E 0x205F6
+0x3640 0x2078A
+0x3641 0x20789
+0x3643 0x2077F
+0x3644 0x20788
+0x3646 0x20783
+0x3647 0x20784
+0x3648 0x20798
+0x3649 0x20763
+0x364A 0x20787
+0x364C 0x2F827
+0x364E 0x208F5
+0x364F 0x20950
+0x3652 0x20A87
+0x3653 0x20A8A
+0x3654 0x20B65
+0x3655 0x20DB7
+0x3656 0x20DC1
+0x3657 0x20DC7
+0x365A 0x20DC5
+0x365B 0x20DCB
+0x365D 0x20DD1
+0x3661 0x20DB8
+0x3662 0x20DCA
+0x3664 0x20DDE
+0x3666 0x20DCE
+0x366A 0x21368
+0x366C 0x2136B
+0x3670 0x2136A
+0x3672 0x21366
+0x3673 0x21377
+0x3674 0x21396
+0x3675 0x2136E
+0x3676 0x2F856
+0x3678 0x21657
+0x367A 0x21656
+0x367B 0x2179C
+0x367C 0x2179E
+0x3721 0x217A1
+0x3723 0x21A42
+0x3725 0x21A46
+0x3726 0x21A3E
+0x3727 0x21B33
+0x372A 0x21BFA
+0x372C 0x21C97
+0x372D 0x21C9B
+0x372E 0x21CAA
+0x3730 0x21E73
+0x3731 0x21E7C
+0x3733 0x21E86
+0x3737 0x220F3
+0x3738 0x220F0
+0x373E 0x220EC
+0x373F 0x222AF
+0x3742 0x22264
+0x3743 0x22268
+0x3744 0x2235A
+0x3746 0x2251F
+0x3747 0x22525
+0x374B 0x226C6
+0x374C 0x226D6
+0x374D 0x226C3
+0x374F 0x2272C
+0x3751 0x2272E
+0x3752 0x2275E
+0x3753 0x22733
+0x3757 0x2272D
+0x3758 0x22746
+0x375A 0x226C1
+0x375B 0x2273A
+0x375C 0x229CC
+0x375D 0x22B9D
+0x375E 0x22B83
+0x375F 0x22BF6
+0x3763 0x22BF8
+0x3766 0x22BFE
+0x3767 0x22BF3
+0x3769 0x22BEB
+0x376A 0x22BFA
+0x376C 0x22C07
+0x376D 0x22BFC
+0x3772 0x22F72
+0x3773 0x22F73
+0x3774 0x22F74
+0x377A 0x22F5F
+0x377B 0x22F60
+0x377C 0x230AA
+0x377D 0x23134
+0x3821 0x231B4
+0x3823 0x231F0
+0x3826 0x2320D
+0x3827 0x231F3
+0x3828 0x2320F
+0x382B 0x234C9
+0x382E 0x234C5
+0x3830 0x234D7
+0x3831 0x234CC
+0x3833 0x234E7
+0x3836 0x234C1
+0x3838 0x234E8
+0x383A 0x238CB
+0x383D 0x238C8
+0x383E 0x2397A
+0x3840 0x23979
+0x3841 0x2397E
+0x3843 0x23A1B
+0x3847 0x23A1F
+0x3848 0x23A19
+0x384D 0x23B89
+0x3850 0x23B8B
+0x3853 0x23E09
+0x3854 0x23DFE
+0x3855 0x23E00
+0x3858 0x23E0B
+0x385D 0x23E4A
+0x3863 0x24279
+0x3866 0x2426C
+0x3867 0x24299
+0x3868 0x2F91B
+0x3869 0x24262
+0x386A 0x24514
+0x386D 0x245C8
+0x386E 0x245D7
+0x386F 0x2460C
+0x3871 0x24670
+0x3874 0x24671
+0x3875 0x247DF
+0x3876 0x247E4
+0x3878 0x247E7
+0x387C 0x24990
+0x3922 0x24B4C
+0x3927 0x24B4F
+0x3929 0x24C7D
+0x392A 0x24C7E
+0x392B 0x24C7C
+0x392D 0x24C8D
+0x392E 0x24D19
+0x3931 0x24DC0
+0x3937 0x24DB6
+0x3939 0x24DA8
+0x393B 0x24FEB
+0x393C 0x24FE7
+0x393D 0x2506F
+0x393E 0x251C7
+0x3940 0x2519F
+0x3944 0x251C4
+0x394E 0x2519B
+0x394F 0x25197
+0x3950 0x251C5
+0x3951 0x2536B
+0x3952 0x253CE
+0x3955 0x254B1
+0x3956 0x254AE
+0x3957 0x254B0
+0x395B 0x2573E
+0x395C 0x257B5
+0x395D 0x257BA
+0x395F 0x257B2
+0x3960 0x257B4
+0x3966 0x25977
+0x3968 0x25986
+0x3969 0x2597B
+0x396B 0x25A7E
+0x396C 0x25B2E
+0x396E 0x25B2F
+0x3970 0x25B37
+0x3973 0x25B32
+0x3977 0x25B36
+0x3978 0x25B39
+0x3979 0x25B35
+0x397A 0x25E5C
+0x397E 0x25E7B
+0x3A21 0x25E61
+0x3A22 0x25FEE
+0x3A23 0x25FEB
+0x3A24 0x25FEF
+0x3A25 0x26020
+0x3A29 0x26230
+0x3A2C 0x262BE
+0x3A2E 0x26367
+0x3A2F 0x2637C
+0x3A32 0x26424
+0x3A36 0x26429
+0x3A37 0x264EF
+0x3A3C 0x2670D
+0x3A46 0x26764
+0x3A48 0x26715
+0x3A50 0x26A35
+0x3A51 0x26A36
+0x3A52 0x26A34
+0x3A53 0x26A37
+0x3A54 0x26C47
+0x3A55 0x26C2B
+0x3A57 0x26C41
+0x3A58 0x26C43
+0x3A5A 0x26C42
+0x3A5D 0x26C32
+0x3A62 0x26C44
+0x3A63 0x26C4A
+0x3A66 0x2F9A0
+0x3A69 0x26C54
+0x3A6A 0x26C6E
+0x3A6B 0x26C52
+0x3A73 0x27292
+0x3A75 0x2F9B8
+0x3A77 0x272BF
+0x3A7C 0x27641
+0x3A7D 0x27669
+0x3A7E 0x27665
+0x3B24 0x27822
+0x3B25 0x2781D
+0x3B26 0x278D2
+0x3B27 0x278DA
+0x3B28 0x278DB
+0x3B2D 0x279A4
+0x3B2E 0x2799E
+0x3B32 0x2799D
+0x3B37 0x279AD
+0x3B38 0x279A6
+0x3B39 0x279A7
+0x3B3A 0x27BB3
+0x3B3B 0x27BE0
+0x3B3C 0x27C35
+0x3B3D 0x27C37
+0x3B40 0x27D4A
+0x3B44 0x27E5E
+0x3B46 0x27EC0
+0x3B4E 0x27FF9
+0x3B56 0x284F0
+0x3B58 0x284F3
+0x3B59 0x2851B
+0x3B5A 0x284F2
+0x3B5B 0x284FB
+0x3B5C 0x2871C
+0x3B5D 0x28713
+0x3B5F 0x2870F
+0x3B61 0x28816
+0x3B62 0x28811
+0x3B63 0x28812
+0x3B65 0x2880E
+0x3B68 0x28C67
+0x3B69 0x28CF2
+0x3B6A 0x28CDA
+0x3B6C 0x28CDC
+0x3B6E 0x28F94
+0x3B6F 0x28F9B
+0x3B70 0x28F92
+0x3B71 0x28F9A
+0x3B72 0x29088
+0x3B73 0x29086
+0x3B75 0x291EF
+0x3B78 0x2925E
+0x3B7A 0x29458
+0x3B7C 0x29456
+0x3B7D 0x29454
+0x3C21 0x2959B
+0x3C22 0x29696
+0x3C23 0x296A4
+0x3C26 0x2969A
+0x3C27 0x29A12
+0x3C2B 0x2036B
+0x3C2E 0x20337
+0x3C2F 0x2033C
+0x3C30 0x2F80A
+0x3C31 0x204F7
+0x3C33 0x20566
+0x3C35 0x207A9
+0x3C36 0x207AE
+0x3C37 0x207AD
+0x3C38 0x207C8
+0x3C39 0x207A5
+0x3C3A 0x207B0
+0x3C3B 0x20895
+0x3C3D 0x20925
+0x3C3F 0x20A99
+0x3C41 0x20B74
+0x3C42 0x20B70
+0x3C43 0x20B6F
+0x3C44 0x20E41
+0x3C45 0x20E54
+0x3C48 0x20E40
+0x3C49 0x20E38
+0x3C4D 0x20E52
+0x3C4E 0x20E3A
+0x3C4F 0x20E57
+0x3C50 0x2F84A
+0x3C51 0x20E59
+0x3C54 0x213B4
+0x3C55 0x213C0
+0x3C5A 0x21375
+0x3C5D 0x21660
+0x3C5E 0x21647
+0x3C60 0x217F0
+0x3C62 0x217EF
+0x3C65 0x217EC
+0x3C66 0x21983
+0x3C68 0x21984
+0x3C69 0x2198F
+0x3C6B 0x21A61
+0x3C6D 0x21A69
+0x3C70 0x21A62
+0x3C7A 0x21EAE
+0x3C7D 0x21EB2
+0x3D22 0x2210B
+0x3D24 0x22110
+0x3D25 0x2210D
+0x3D2B 0x2227F
+0x3D2C 0x22281
+0x3D31 0x2240B
+0x3D32 0x2254E
+0x3D35 0x227EA
+0x3D36 0x22745
+0x3D3F 0x22728
+0x3D40 0x2275D
+0x3D41 0x229DC
+0x3D44 0x229D4
+0x3D46 0x22C64
+0x3D47 0x22C68
+0x3D49 0x22C62
+0x3D4B 0x22C61
+0x3D4D 0x22C66
+0x3D51 0x22BF2
+0x3D52 0x22C69
+0x3D53 0x22C67
+0x3D55 0x22F9A
+0x3D56 0x22F9B
+0x3D57 0x22F85
+0x3D58 0x22F9C
+0x3D5A 0x22FA4
+0x3D5E 0x22F99
+0x3D5F 0x22F86
+0x3D60 0x22F90
+0x3D61 0x23081
+0x3D62 0x230AE
+0x3D66 0x23138
+0x3D6A 0x2353B
+0x3D70 0x2354C
+0x3D73 0x23547
+0x3D74 0x23535
+0x3D77 0x23533
+0x3D79 0x23582
+0x3D7A 0x23540
+0x3E25 0x23A36
+0x3E26 0x23B0E
+0x3E2A 0x23BAD
+0x3E2B 0x23BAA
+0x3E2C 0x23E17
+0x3E2E 0x23E67
+0x3E31 0x23E72
+0x3E33 0x2F90A
+0x3E34 0x23E61
+0x3E35 0x23EB0
+0x3E3A 0x23E6E
+0x3E3B 0x23E64
+0x3E3D 0x23E8C
+0x3E3E 0x23E66
+0x3E40 0x23E6B
+0x3E41 0x23E5F
+0x3E42 0x23E74
+0x3E43 0x23E65
+0x3E44 0x242BB
+0x3E45 0x242BE
+0x3E47 0x242B9
+0x3E4A 0x242EF
+0x3E4D 0x245DA
+0x3E50 0x24690
+0x3E51 0x247E9
+0x3E55 0x24811
+0x3E56 0x2480D
+0x3E57 0x247ED
+0x3E58 0x24821
+0x3E5A 0x24981
+0x3E5B 0x249B1
+0x3E5C 0x24B01
+0x3E5E 0x24B5E
+0x3E5F 0x24B62
+0x3E64 0x24B5B
+0x3E66 0x24C96
+0x3E67 0x24C93
+0x3E6A 0x24C92
+0x3E6C 0x2F939
+0x3E70 0x24DC4
+0x3E71 0x24DC7
+0x3E72 0x24DC3
+0x3E75 0x24DC8
+0x3E79 0x24DCA
+0x3E7B 0x24DC5
+0x3E7C 0x24DCF
+0x3E7D 0x24DDC
+0x3E7E 0x24F7C
+0x3F21 0x25001
+0x3F23 0x251D3
+0x3F24 0x251DC
+0x3F28 0x251D4
+0x3F2A 0x251CC
+0x3F2E 0x251D6
+0x3F2F 0x251DB
+0x3F31 0x251D5
+0x3F32 0x253D9
+0x3F34 0x253DD
+0x3F35 0x253DC
+0x3F36 0x253E0
+0x3F37 0x254CC
+0x3F41 0x254D2
+0x3F43 0x254D3
+0x3F48 0x2568D
+0x3F4E 0x257D8
+0x3F51 0x257BC
+0x3F56 0x25A8A
+0x3F58 0x25A8B
+0x3F59 0x25A8D
+0x3F5C 0x25B53
+0x3F5F 0x25B59
+0x3F64 0x25B56
+0x3F65 0x25B57
+0x3F68 0x25E73
+0x3F69 0x2601B
+0x3F6B 0x26021
+0x3F6C 0x26016
+0x3F6D 0x26018
+0x3F70 0x26044
+0x3F72 0x26026
+0x3F74 0x26236
+0x3F79 0x2643A
+0x3F7B 0x264F4
+0x3F7E 0x26762
+0x4021 0x2675B
+0x4022 0x2676A
+0x4024 0x26768
+0x402B 0x26781
+0x4031 0x26CE7
+0x4033 0x26CE6
+0x4034 0x26CD1
+0x4035 0x26D11
+0x4037 0x26CD0
+0x4038 0x26CD9
+0x4039 0x26D0A
+0x403B 0x26CDA
+0x403C 0x26CDD
+0x403D 0x26CC8
+0x403E 0x26CE2
+0x403F 0x26CE9
+0x4040 0x26CCB
+0x4042 0x26CCC
+0x4043 0x26CC1
+0x4045 0x26CDE
+0x404A 0x26D51
+0x404B 0x26D12
+0x404D 0x26CE0
+0x404E 0x26D2B
+0x404F 0x2F9B4
+0x4050 0x272D8
+0x4051 0x272D1
+0x4053 0x272D2
+0x4054 0x272CD
+0x4058 0x2733D
+0x405A 0x272CA
+0x405C 0x272CB
+0x405E 0x272D7
+0x405F 0x275F4
+0x4063 0x27687
+0x4064 0x2768B
+0x4065 0x27683
+0x4068 0x279C5
+0x4069 0x279D2
+0x406A 0x279C6
+0x406B 0x279D3
+0x406F 0x279F0
+0x4070 0x279CD
+0x4071 0x279CC
+0x4072 0x279DC
+0x4073 0x279D6
+0x4075 0x27BE6
+0x4076 0x27C41
+0x4077 0x27C3F
+0x4079 0x27CC5
+0x407A 0x27CC0
+0x407B 0x27CC6
+0x407C 0x27CBE
+0x407D 0x27CBF
+0x4122 0x27D63
+0x4123 0x27ED3
+0x4124 0x27EDA
+0x4125 0x27ED5
+0x412B 0x282EE
+0x412D 0x282FC
+0x412E 0x28414
+0x4130 0x28523
+0x4131 0x28522
+0x4132 0x28530
+0x4133 0x286B5
+0x4135 0x28738
+0x4137 0x2873F
+0x4144 0x28968
+0x4145 0x28967
+0x4147 0x28965
+0x414A 0x28C75
+0x414B 0x28CF7
+0x414C 0x28CF3
+0x414D 0x28CF6
+0x414F 0x28D00
+0x4151 0x28CFF
+0x4152 0x28CF5
+0x4158 0x29092
+0x4159 0x29206
+0x415B 0x29207
+0x415C 0x2926B
+0x415E 0x2926C
+0x4160 0x29393
+0x4162 0x29394
+0x4166 0x29462
+0x4167 0x29463
+0x4169 0x2945F
+0x416A 0x29464
+0x416B 0x2945B
+0x416C 0x29459
+0x416F 0x295A4
+0x4170 0x295AC
+0x4173 0x296B5
+0x4176 0x296AE
+0x4178 0x296C5
+0x417C 0x2983B
+0x4223 0x29ABF
+0x4224 0x29C2B
+0x4225 0x29C84
+0x4226 0x29C80
+0x4227 0x29D4D
+0x4228 0x29D4F
+0x422A 0x29D4C
+0x422B 0x29F92
+0x4230 0x203AE
+0x4231 0x20379
+0x4234 0x20371
+0x4236 0x203B3
+0x4238 0x2032C
+0x4239 0x20377
+0x423A 0x2052F
+0x423B 0x207C3
+0x423D 0x207CD
+0x4240 0x207C9
+0x4244 0x207CE
+0x4245 0x208A5
+0x4246 0x208A0
+0x4247 0x208FE
+0x4248 0x20959
+0x4249 0x20A9A
+0x424C 0x20EE4
+0x424D 0x20ED7
+0x424E 0x20EDC
+0x4250 0x20EE7
+0x4254 0x20EE5
+0x425A 0x21414
+0x425C 0x213F1
+0x4261 0x215B6
+0x4262 0x2166E
+0x4263 0x2166C
+0x4264 0x21681
+0x4265 0x21842
+0x426A 0x2181A
+0x426E 0x21827
+0x426F 0x21825
+0x4270 0x21817
+0x4271 0x2181C
+0x4272 0x2183D
+0x4273 0x21820
+0x4276 0x21A81
+0x427A 0x21C09
+0x427B 0x21CC6
+0x427C 0x21CC4
+0x427E 0x21CC5
+0x4323 0x21EEF
+0x4325 0x21EDF
+0x4326 0x21EDE
+0x4327 0x21EEE
+0x4328 0x21EF5
+0x4329 0x21EEC
+0x432B 0x21EDD
+0x4334 0x22122
+0x4337 0x22297
+0x4338 0x22295
+0x433C 0x224A9
+0x433E 0x22553
+0x4340 0x22556
+0x4341 0x22555
+0x4344 0x227E3
+0x4345 0x227E2
+0x434F 0x227A9
+0x4351 0x2F8AB
+0x4352 0x22833
+0x4353 0x2280A
+0x4355 0x22A59
+0x4357 0x22CBC
+0x4359 0x22CC4
+0x435A 0x22CC7
+0x435B 0x22CC6
+0x435F 0x22CB8
+0x4360 0x22CDA
+0x4362 0x22CB7
+0x4363 0x22CC0
+0x4365 0x22CCD
+0x4367 0x22FBC
+0x4368 0x22FAB
+0x436A 0x23086
+0x436C 0x2325A
+0x4370 0x23343
+0x4372 0x235AC
+0x4376 0x235BE
+0x437B 0x235AB
+0x4426 0x21B3E
+0x4429 0x238F9
+0x442B 0x238F3
+0x442C 0x238F7
+0x442E 0x23A45
+0x442F 0x23A48
+0x4434 0x23A44
+0x4436 0x23AAF
+0x4437 0x23AB1
+0x443B 0x23BCF
+0x443D 0x23BCB
+0x443E 0x23BCD
+0x4440 0x23C50
+0x4441 0x23EEC
+0x4442 0x23F1A
+0x4445 0x23ED8
+0x4447 0x23ED0
+0x4448 0x23ED1
+0x444B 0x23E7B
+0x444C 0x23ED2
+0x444E 0x23ED4
+0x444F 0x23EE7
+0x4450 0x23EDF
+0x4451 0x23EDE
+0x4453 0x23ED9
+0x4454 0x23ECF
+0x4455 0x2430D
+0x445D 0x24338
+0x4461 0x246A9
+0x446B 0x2483E
+0x446C 0x24846
+0x446D 0x249ED
+0x446E 0x2F930
+0x4472 0x24B6C
+0x447A 0x24CAC
+0x447D 0x24DC9
+0x4522 0x24E12
+0x4525 0x24DFD
+0x4526 0x24E01
+0x4527 0x24E11
+0x4529 0x24E89
+0x452A 0x24E05
+0x452B 0x24DFE
+0x452C 0x24E0B
+0x452D 0x24E20
+0x452E 0x24E04
+0x452F 0x24F88
+0x4531 0x25002
+0x4533 0x25003
+0x453A 0x25229
+0x453B 0x2523B
+0x453E 0x25206
+0x4545 0x25203
+0x4547 0x25378
+0x4548 0x25379
+0x4549 0x2537D
+0x454B 0x2537F
+0x4550 0x25532
+0x4552 0x25500
+0x4554 0x25522
+0x4556 0x256A9
+0x455C 0x25804
+0x455F 0x2F959
+0x4561 0x259B8
+0x4562 0x25A9B
+0x4567 0x25B92
+0x456C 0x25B8F
+0x456F 0x25B98
+0x4571 0x25BAE
+0x4573 0x25E9D
+0x4576 0x26049
+0x4577 0x26050
+0x4578 0x26046
+0x457A 0x2604E
+0x457D 0x26055
+0x4622 0x26064
+0x4624 0x26238
+0x4631 0x264FE
+0x463A 0x267A6
+0x4643 0x2679C
+0x4644 0x26799
+0x4648 0x267B5
+0x4649 0x267A3
+0x464A 0x267A0
+0x464B 0x267A7
+0x464C 0x2679B
+0x464D 0x269DF
+0x464E 0x269E1
+0x4652 0x26A4D
+0x4654 0x26DF3
+0x4655 0x26D6F
+0x4656 0x26D69
+0x4659 0x26D6B
+0x465A 0x26D78
+0x465B 0x26D87
+0x465D 0x26D85
+0x465E 0x26D82
+0x465F 0x26D90
+0x4662 0x26D80
+0x4663 0x26D67
+0x4666 0x26D61
+0x4668 0x26D93
+0x466A 0x26DF2
+0x466B 0x26D86
+0x466E 0x271CD
+0x466F 0x271C4
+0x4674 0x2730F
+0x4677 0x2730D
+0x467A 0x27373
+0x467C 0x2F9BA
+0x467D 0x2730A
+0x4721 0x27308
+0x4722 0x27313
+0x4724 0x275F8
+0x4728 0x276AB
+0x4729 0x276A8
+0x472C 0x276A5
+0x472F 0x276C3
+0x4730 0x276A4
+0x4732 0x276D4
+0x4733 0x276BA
+0x4734 0x277F1
+0x4737 0x2783F
+0x4739 0x278EA
+0x473B 0x279F7
+0x473E 0x279FA
+0x473F 0x279F5
+0x4741 0x279FE
+0x4744 0x27A00
+0x4747 0x27A02
+0x4748 0x279FB
+0x4749 0x27A07
+0x474B 0x27A1A
+0x474D 0x27BB8
+0x4750 0x27BE9
+0x4751 0x27BEB
+0x4752 0x27C50
+0x4753 0x27C4F
+0x4755 0x27D86
+0x4757 0x27D8E
+0x475C 0x27EF0
+0x475D 0x27EFB
+0x4760 0x28042
+0x4763 0x28085
+0x4768 0x28305
+0x476F 0x2874B
+0x4772 0x28763
+0x477A 0x28999
+0x477C 0x28C81
+0x477D 0x28D17
+0x477E 0x28D10
+0x4821 0x28D12
+0x4825 0x28EFA
+0x4826 0x28EF3
+0x4827 0x28EF2
+0x4828 0x28EF5
+0x4829 0x28EF6
+0x482A 0x28FBB
+0x482B 0x28FC2
+0x482C 0x290A7
+0x482F 0x290A8
+0x4830 0x290A3
+0x4832 0x290AA
+0x4836 0x291DC
+0x4839 0x2920F
+0x483C 0x29279
+0x483E 0x2927F
+0x483F 0x29285
+0x4845 0x2941B
+0x4848 0x29477
+0x4849 0x29476
+0x484A 0x29498
+0x484F 0x2947A
+0x4852 0x295BC
+0x4853 0x295BA
+0x4855 0x295B6
+0x4858 0x295B4
+0x485A 0x296CF
+0x4861 0x2987B
+0x4863 0x29A1C
+0x4864 0x29A21
+0x4865 0x29A1D
+0x4866 0x29AC0
+0x4868 0x29AFF
+0x486C 0x29D56
+0x486E 0x29FA1
+0x486F 0x29FA2
+0x4870 0x29FA6
+0x4871 0x2A256
+0x4872 0x2A257
+0x4875 0x2A301
+0x4876 0x2A3ED
+0x4877 0x2FA1C
+0x4878 0x2A5F2
+0x487A 0x203B8
+0x487C 0x203C0
+0x487E 0x203B7
+0x4921 0x203E1
+0x4924 0x207E8
+0x4926 0x208B2
+0x4928 0x20AAE
+0x492B 0x20F7E
+0x492F 0x20F76
+0x4932 0x20F96
+0x4934 0x21420
+0x4935 0x21421
+0x4936 0x21423
+0x4937 0x21429
+0x4938 0x21677
+0x4939 0x21851
+0x493B 0x21856
+0x493D 0x21888
+0x493E 0x21859
+0x493F 0x21855
+0x4941 0x21997
+0x4942 0x21998
+0x4947 0x21AA1
+0x4948 0x21AA3
+0x494E 0x21F0A
+0x4951 0x21F3D
+0x4952 0x21F0C
+0x4956 0x2213D
+0x4957 0x22139
+0x4958 0x222B0
+0x4959 0x222B2
+0x495A 0x222AE
+0x4960 0x22420
+0x4962 0x2256E
+0x4963 0x2256D
+0x4964 0x2256A
+0x4966 0x22832
+0x496A 0x22839
+0x496E 0x227A3
+0x4970 0x2287F
+0x4971 0x22835
+0x4972 0x2283D
+0x4973 0x229F4
+0x4974 0x229F5
+0x4977 0x22D48
+0x4978 0x22D28
+0x497B 0x22D27
+0x497C 0x22D32
+0x497D 0x22D2C
+0x4A21 0x22D2E
+0x4A25 0x22D23
+0x4A26 0x22D31
+0x4A27 0x2F8C5
+0x4A2C 0x22FC9
+0x4A2D 0x23089
+0x4A2F 0x230BB
+0x4A33 0x23397
+0x4A34 0x23393
+0x4A35 0x23628
+0x4A3B 0x23618
+0x4A3C 0x2363B
+0x4A3E 0x23627
+0x4A3F 0x23624
+0x4A40 0x2361B
+0x4A41 0x23631
+0x4A43 0x23626
+0x4A44 0x236A3
+0x4A45 0x2363F
+0x4A46 0x23622
+0x4A47 0x23619
+0x4A49 0x23641
+0x4A4A 0x2362B
+0x4A4D 0x2390C
+0x4A51 0x23A4E
+0x4A52 0x23AB9
+0x4A53 0x23AFA
+0x4A54 0x23BE9
+0x4A55 0x23BE8
+0x4A56 0x23BE4
+0x4A5A 0x23F5F
+0x4A5B 0x23F5D
+0x4A5C 0x23F52
+0x4A5E 0x23F74
+0x4A60 0x23F46
+0x4A63 0x23FAA
+0x4A65 0x23F4A
+0x4A66 0x23F59
+0x4A67 0x23F4B
+0x4A6B 0x24350
+0x4A70 0x246D0
+0x4A74 0x246CC
+0x4A78 0x24864
+0x4A79 0x24865
+0x4A7D 0x2485C
+0x4A7E 0x24A15
+0x4B28 0x24B79
+0x4B2B 0x24CC5
+0x4B2C 0x24CB8
+0x4B2D 0x24E2C
+0x4B30 0x24E37
+0x4B31 0x24E35
+0x4B32 0x24E31
+0x4B34 0x24E2F
+0x4B36 0x24E2B
+0x4B39 0x24E2D
+0x4B3A 0x24E2A
+0x4B3C 0x24F95
+0x4B3E 0x2523E
+0x4B40 0x25247
+0x4B41 0x25245
+0x4B46 0x25252
+0x4B48 0x25270
+0x4B49 0x25250
+0x4B4A 0x25258
+0x4B4B 0x25251
+0x4B4C 0x2523D
+0x4B4E 0x25241
+0x4B4F 0x2520C
+0x4B50 0x2523C
+0x4B51 0x25386
+0x4B52 0x25383
+0x4B53 0x25389
+0x4B54 0x253F3
+0x4B5A 0x2552D
+0x4B5F 0x256C5
+0x4B60 0x2F955
+0x4B67 0x25843
+0x4B69 0x25837
+0x4B6A 0x25845
+0x4B6D 0x259E5
+0x4B6E 0x25AA6
+0x4B6F 0x25BDB
+0x4B71 0x25BDA
+0x4B72 0x25BE6
+0x4B7C 0x25BF8
+0x4B7D 0x25BE9
+0x4C23 0x25BE8
+0x4C24 0x25BF6
+0x4C29 0x25BE7
+0x4C2F 0x25BD5
+0x4C32 0x25ED3
+0x4C33 0x25EC7
+0x4C34 0x25ED1
+0x4C36 0x25EC3
+0x4C38 0x26080
+0x4C39 0x26098
+0x4C3B 0x26084
+0x4C41 0x26097
+0x4C42 0x26083
+0x4C43 0x26081
+0x4C46 0x2608C
+0x4C47 0x26242
+0x4C48 0x263AB
+0x4C4A 0x263A3
+0x4C4B 0x263A6
+0x4C4C 0x2645C
+0x4C4D 0x26469
+0x4C4E 0x26467
+0x4C50 0x2658B
+0x4C51 0x265A8
+0x4C53 0x267D8
+0x4C56 0x2F989
+0x4C57 0x267DC
+0x4C59 0x267E0
+0x4C5A 0x267E5
+0x4C60 0x26918
+0x4C61 0x26919
+0x4C66 0x26A5F
+0x4C67 0x26A5E
+0x4C69 0x26E02
+0x4C75 0x26E12
+0x4C76 0x26E36
+0x4C79 0x2F9A8
+0x4C7B 0x26E23
+0x4C7C 0x26E03
+0x4C7E 0x26E00
+0x4D22 0x26E46
+0x4D23 0x26E61
+0x4D27 0x27384
+0x4D29 0x2736B
+0x4D2A 0x27362
+0x4D2B 0x27356
+0x4D2C 0x2736A
+0x4D2D 0x27352
+0x4D2E 0x27355
+0x4D32 0x27361
+0x4D33 0x2F9BB
+0x4D34 0x27358
+0x4D35 0x27377
+0x4D38 0x276D7
+0x4D3B 0x276DE
+0x4D3D 0x276DF
+0x4D41 0x276D1
+0x4D43 0x276E2
+0x4D44 0x276E1
+0x4D45 0x276DD
+0x4D49 0x2784B
+0x4D4B 0x2784E
+0x4D4D 0x278FC
+0x4D50 0x278FA
+0x4D52 0x278FB
+0x4D54 0x278FE
+0x4D57 0x27A31
+0x4D5D 0x27A38
+0x4D62 0x27A3A
+0x4D63 0x27BBB
+0x4D66 0x27C59
+0x4D69 0x27CDB
+0x4D6A 0x27CDF
+0x4D6B 0x27CE2
+0x4D6F 0x27D9E
+0x4D70 0x27DA1
+0x4D72 0x27F10
+0x4D7A 0x28076
+0x4D7B 0x2807F
+0x4D7C 0x2807D
+0x4E24 0x28082
+0x4E25 0x28257
+0x4E2C 0x2832E
+0x4E2F 0x2858B
+0x4E30 0x2858D
+0x4E34 0x28590
+0x4E36 0x286EC
+0x4E37 0x2876F
+0x4E38 0x2876B
+0x4E39 0x28771
+0x4E3A 0x28778
+0x4E42 0x289AD
+0x4E49 0x28D2F
+0x4E4B 0x28F78
+0x4E4D 0x291F8
+0x4E4E 0x29219
+0x4E50 0x2929B
+0x4E51 0x29294
+0x4E52 0x29297
+0x4E53 0x29299
+0x4E54 0x293A6
+0x4E55 0x293A4
+0x4E56 0x293A7
+0x4E58 0x29495
+0x4E5B 0x29490
+0x4E5E 0x2949B
+0x4E5F 0x295C4
+0x4E62 0x295C6
+0x4E68 0x296E3
+0x4E6A 0x296DF
+0x4E6B 0x296DD
+0x4E6C 0x296E7
+0x4E71 0x29A2D
+0x4E72 0x29A2C
+0x4E77 0x29A34
+0x4E78 0x29A38
+0x4E7A 0x29B1D
+0x4E7C 0x29B1A
+0x4E7D 0x29B1B
+0x4E7E 0x29B14
+0x4F22 0x29B17
+0x4F23 0x29C21
+0x4F26 0x29CAA
+0x4F27 0x29CA1
+0x4F2D 0x29D63
+0x4F2E 0x29D79
+0x4F2F 0x29D60
+0x4F31 0x29D62
+0x4F33 0x29D61
+0x4F36 0x29D70
+0x4F38 0x29D6A
+0x4F3A 0x29FC8
+0x4F3C 0x29FC5
+0x4F3D 0x29FBE
+0x4F3E 0x29FC2
+0x4F43 0x29FC7
+0x4F45 0x29FB0
+0x4F46 0x29FCA
+0x4F4E 0x2A30D
+0x4F4F 0x2A307
+0x4F50 0x2A396
+0x4F51 0x2A3EF
+0x4F54 0x2A41E
+0x4F55 0x2A41D
+0x4F57 0x2A590
+0x4F58 0x203EB
+0x4F5C 0x203EE
+0x4F5E 0x203EF
+0x4F5F 0x203EC
+0x4F60 0x207FA
+0x4F65 0x20904
+0x4F66 0x20FD3
+0x4F68 0x20FD1
+0x4F69 0x20FFA
+0x4F6E 0x20FC8
+0x4F70 0x20FD5
+0x4F72 0x20FCD
+0x4F73 0x20FD2
+0x4F74 0x20FFB
+0x4F75 0x2122A
+0x4F76 0x21488
+0x4F77 0x21461
+0x4F79 0x21463
+0x4F7A 0x21462
+0x4F7C 0x20057
+0x4F7D 0x218C8
+0x4F7E 0x21898
+0x5022 0x21AC1
+0x5023 0x21F3F
+0x5024 0x21F41
+0x5028 0x22152
+0x502A 0x2215E
+0x502D 0x222C7
+0x502F 0x22370
+0x5030 0x22427
+0x5032 0x22471
+0x5033 0x224B0
+0x5035 0x22842
+0x5036 0x22843
+0x503C 0x22857
+0x503D 0x2289D
+0x503E 0x22D89
+0x503F 0x22D8D
+0x5040 0x22D8B
+0x5041 0x22D80
+0x5042 0x22D92
+0x5043 0x22D8A
+0x5044 0x22DC8
+0x5046 0x22D8F
+0x5047 0x22D93
+0x5048 0x22D91
+0x504A 0x22FF2
+0x504B 0x22FDE
+0x504D 0x230C8
+0x5054 0x232A7
+0x5055 0x232A1
+0x5057 0x2368C
+0x5058 0x2367F
+0x505B 0x2367B
+0x505C 0x23695
+0x505D 0x23699
+0x505F 0x2368E
+0x5061 0x236DA
+0x5062 0x2368A
+0x5063 0x2369C
+0x5065 0x2367E
+0x5068 0x2391A
+0x5069 0x23A55
+0x506C 0x23A60
+0x5070 0x23BFB
+0x5073 0x23BFD
+0x5079 0x23FD0
+0x507C 0x23FC5
+0x507E 0x23FD2
+0x5121 0x24011
+0x5126 0x243AD
+0x5127 0x243A4
+0x5128 0x243A9
+0x5129 0x243B0
+0x512A 0x2439D
+0x512C 0x24598
+0x5131 0x24892
+0x5133 0x2488A
+0x5135 0x2488D
+0x5136 0x24896
+0x513B 0x24A45
+0x513C 0x24A4B
+0x513D 0x24B0F
+0x513E 0x24B16
+0x5140 0x24B8A
+0x5143 0x24CC9
+0x5145 0x24CC8
+0x5146 0x24CCA
+0x5147 0x24E64
+0x514B 0x24E5D
+0x514C 0x24E63
+0x5151 0x24E88
+0x5152 0x24F3A
+0x5153 0x24F39
+0x5158 0x25017
+0x5159 0x25093
+0x515B 0x25095
+0x515E 0x25276
+0x5162 0x25280
+0x5163 0x2527B
+0x5165 0x25248
+0x5166 0x252A8
+0x5167 0x25288
+0x5168 0x2538B
+0x5169 0x2538A
+0x516A 0x2538C
+0x516B 0x253FC
+0x516F 0x25558
+0x5171 0x25551
+0x5172 0x25555
+0x5173 0x25553
+0x5177 0x256DC
+0x517B 0x2585C
+0x517E 0x25865
+0x5221 0x2F95A
+0x5223 0x259EE
+0x5226 0x259F0
+0x5228 0x259F2
+0x522A 0x25C35
+0x522C 0x25C22
+0x522E 0x25C20
+0x5230 0x25C2D
+0x5231 0x25C28
+0x5232 0x25C26
+0x5233 0x25C3C
+0x5235 0x25C38
+0x523C 0x25C2A
+0x523E 0x25C1A
+0x523F 0x25C30
+0x5240 0x25BE3
+0x5241 0x25C19
+0x5242 0x25EE9
+0x5243 0x25EE7
+0x5245 0x260D6
+0x5246 0x260C4
+0x5248 0x26087
+0x524A 0x260C7
+0x524B 0x260D9
+0x524D 0x260DF
+0x5250 0x2630A
+0x5251 0x26301
+0x5252 0x263B1
+0x5254 0x263C1
+0x5257 0x26476
+0x5258 0x2650D
+0x5259 0x2650E
+0x525D 0x26807
+0x525F 0x26809
+0x5260 0x26816
+0x5265 0x2680E
+0x5268 0x26806
+0x5269 0x2691E
+0x526A 0x2694A
+0x5270 0x26EA6
+0x5271 0x26E91
+0x5274 0x26EB8
+0x5275 0x26E96
+0x5278 0x26EC5
+0x527D 0x26F0A
+0x5326 0x26EB2
+0x5328 0x26EB7
+0x5329 0x26EB4
+0x532A 0x26E89
+0x532B 0x26E8D
+0x532D 0x26E87
+0x532E 0x26EC2
+0x532F 0x26E9C
+0x5330 0x26E92
+0x5332 0x26ECA
+0x5334 0x26E8A
+0x5335 0x271E0
+0x5337 0x271E6
+0x5338 0x271E5
+0x533A 0x273A5
+0x533B 0x273B3
+0x533F 0x273B5
+0x5340 0x273AF
+0x5342 0x273B0
+0x5343 0x273CC
+0x5345 0x273A2
+0x5346 0x273BE
+0x5347 0x273C6
+0x5348 0x273AC
+0x5349 0x273AE
+0x534C 0x2F9C3
+0x534D 0x27708
+0x534E 0x27705
+0x5351 0x276FE
+0x5354 0x27700
+0x5357 0x27864
+0x5358 0x27868
+0x535D 0x2786A
+0x535E 0x27869
+0x535F 0x2790D
+0x5360 0x27912
+0x5363 0x2790F
+0x5365 0x27A67
+0x5366 0x27A79
+0x5367 0x27A72
+0x5368 0x27A66
+0x5369 0x27A7C
+0x536C 0x27A68
+0x536D 0x27A85
+0x536E 0x27A76
+0x536F 0x27A74
+0x5370 0x27A71
+0x5371 0x27A64
+0x5374 0x27BF8
+0x5376 0x27C6C
+0x5378 0x27CEB
+0x537C 0x27DB8
+0x5421 0x27F2D
+0x5422 0x27F2E
+0x5423 0x27F28
+0x5424 0x27F29
+0x5425 0x27F31
+0x5427 0x27F2F
+0x5428 0x27F2A
+0x542A 0x280A4
+0x542B 0x280B7
+0x542C 0x280BF
+0x5431 0x28263
+0x5435 0x28367
+0x5436 0x285BE
+0x5437 0x2F9E0
+0x5438 0x28795
+0x5439 0x2879C
+0x543E 0x28871
+0x543F 0x28872
+0x5441 0x2886F
+0x5444 0x289F1
+0x5447 0x289E8
+0x544A 0x2F9EA
+0x544D 0x28D49
+0x544E 0x28D64
+0x5450 0x28D48
+0x5454 0x28F2C
+0x5455 0x28FE1
+0x5456 0x28FEF
+0x5457 0x290C0
+0x545A 0x290D7
+0x545B 0x290D4
+0x545E 0x292AD
+0x5465 0x292AE
+0x5466 0x292AC
+0x546B 0x29427
+0x546C 0x294AE
+0x546E 0x294B0
+0x5471 0x294C0
+0x5472 0x294C4
+0x5479 0x29707
+0x547B 0x296FD
+0x5523 0x2FA04
+0x5524 0x2981B
+0x5525 0x2981C
+0x5527 0x298B2
+0x5528 0x298B4
+0x5529 0x298B7
+0x552A 0x298B1
+0x552B 0x298B3
+0x552C 0x298AE
+0x5533 0x29A3F
+0x5534 0x29B36
+0x5537 0x29B31
+0x5538 0x29B3B
+0x5539 0x29B35
+0x553A 0x29B3A
+0x553B 0x29B37
+0x553C 0x29C22
+0x553D 0x29C36
+0x553E 0x29C32
+0x5540 0x29CC0
+0x5546 0x29D85
+0x5549 0x29D89
+0x554C 0x29FE1
+0x5551 0x2A00A
+0x5553 0x2A009
+0x5556 0x29FE8
+0x555B 0x2A318
+0x5564 0x2A5C5
+0x5566 0x2040D
+0x5567 0x2040C
+0x5568 0x20421
+0x556A 0x20616
+0x556B 0x2080E
+0x556E 0x20817
+0x5571 0x21048
+0x5575 0x21055
+0x5576 0x21049
+0x5577 0x2104C
+0x5579 0x2104F
+0x557A 0x2103D
+0x557D 0x2148A
+0x557E 0x214A8
+0x5621 0x2168A
+0x5623 0x218CB
+0x5625 0x218D5
+0x5626 0x221D4
+0x5629 0x21F5C
+0x562A 0x21F75
+0x562C 0x22161
+0x562E 0x21696
+0x5630 0x2258A
+0x5631 0x228D0
+0x5634 0x22849
+0x5635 0x228CF
+0x5637 0x22DD6
+0x5638 0x22D7F
+0x563A 0x22DD2
+0x563B 0x22DCF
+0x563C 0x23006
+0x563D 0x23009
+0x5642 0x23706
+0x5643 0x236F1
+0x5644 0x23704
+0x5646 0x236FA
+0x5647 0x236F4
+0x564A 0x236F9
+0x564C 0x2368B
+0x564D 0x23703
+0x5650 0x239A2
+0x5654 0x23C0C
+0x5655 0x23C0B
+0x565A 0x24024
+0x565D 0x2F914
+0x565F 0x24025
+0x5661 0x243F6
+0x5663 0x243FB
+0x5665 0x24532
+0x5666 0x245FB
+0x5668 0x246F2
+0x5669 0x246F3
+0x566D 0x2489C
+0x566E 0x24A72
+0x5670 0x24A74
+0x5674 0x24B86
+0x5676 0x24B8E
+0x5677 0x24B90
+0x5679 0x24BCD
+0x567A 0x24BF7
+0x567B 0x24CD6
+0x567C 0x24E84
+0x567D 0x24E95
+0x567E 0x24E8A
+0x5723 0x24E97
+0x5727 0x24FA0
+0x5728 0x24FA1
+0x5729 0x25022
+0x572A 0x250A6
+0x572B 0x250A4
+0x5735 0x252AF
+0x5736 0x252B0
+0x5737 0x252BD
+0x573A 0x25576
+0x573C 0x2557B
+0x573D 0x25579
+0x5743 0x256EE
+0x5744 0x256F1
+0x5746 0x25894
+0x574A 0x25891
+0x574E 0x25A10
+0x5751 0x25AAF
+0x575C 0x25C7B
+0x575D 0x25C77
+0x5760 0x25C80
+0x5761 0x25CC6
+0x5763 0x25C7C
+0x5764 0x25C90
+0x5766 0x25CA3
+0x5767 0x25C7D
+0x5768 0x25CBD
+0x576C 0x25F13
+0x576F 0x26111
+0x5770 0x26144
+0x5771 0x2610D
+0x5774 0x26314
+0x5776 0x263B8
+0x5778 0x263B7
+0x5779 0x26483
+0x577C 0x26514
+0x577E 0x2651C
+0x5825 0x265D4
+0x5826 0x265D5
+0x5829 0x26843
+0x582A 0x26842
+0x582D 0x2F98A
+0x582E 0x26841
+0x582F 0x2694E
+0x5831 0x26A87
+0x5837 0x26F39
+0x5839 0x26F8F
+0x583A 0x26F2A
+0x583F 0x26F2B
+0x5841 0x26F50
+0x5843 0x26F6E
+0x5845 0x26F3B
+0x5846 0x26F53
+0x5847 0x26F5F
+0x5848 0x26F2F
+0x5849 0x26F30
+0x584A 0x26F38
+0x584B 0x26F4C
+0x584C 0x271F1
+0x5850 0x27407
+0x5851 0x27416
+0x5853 0x27414
+0x5855 0x273FB
+0x5859 0x273F8
+0x585A 0x27410
+0x585B 0x2741D
+0x585C 0x273FF
+0x585D 0x2740B
+0x585E 0x27404
+0x5860 0x273FE
+0x5861 0x275FF
+0x5866 0x27723
+0x586C 0x2792A
+0x586D 0x27AA0
+0x586E 0x27A98
+0x586F 0x27A9C
+0x5871 0x27A9E
+0x5872 0x27AA6
+0x5873 0x27AB5
+0x5874 0x27AB0
+0x5878 0x27CF9
+0x5879 0x27CF5
+0x587B 0x27DD2
+0x587E 0x27F50
+0x5921 0x27F4E
+0x5922 0x27F4B
+0x5923 0x27F52
+0x5924 0x27F4D
+0x5927 0x280E4
+0x5929 0x280DA
+0x592E 0x280DF
+0x592F 0x280E8
+0x5933 0x28370
+0x5934 0x28372
+0x5936 0x28377
+0x593A 0x285E6
+0x593B 0x287AA
+0x593E 0x2888C
+0x5940 0x28889
+0x5943 0x28A32
+0x5948 0x28A7A
+0x594A 0x28C9E
+0x594B 0x28CA0
+0x594C 0x28D70
+0x5950 0x28D6E
+0x5951 0x28D66
+0x5953 0x28D65
+0x5956 0x28F7F
+0x5957 0x28FE0
+0x5959 0x28FFF
+0x595A 0x290F6
+0x595B 0x290F7
+0x595C 0x290F5
+0x595E 0x290FC
+0x5961 0x290F9
+0x5965 0x292CA
+0x5966 0x292C3
+0x5967 0x292C6
+0x5969 0x293B8
+0x596A 0x293BD
+0x596C 0x293BC
+0x596D 0x29405
+0x596E 0x294E0
+0x596F 0x294E9
+0x5971 0x294DF
+0x5972 0x294EC
+0x5974 0x294E5
+0x5975 0x294DE
+0x5976 0x2FA00
+0x5978 0x294F0
+0x5979 0x294E3
+0x597B 0x295EC
+0x5A23 0x295F2
+0x5A24 0x295EF
+0x5A25 0x295E9
+0x5A26 0x296FB
+0x5A2B 0x29737
+0x5A2C 0x298DE
+0x5A2F 0x298DA
+0x5A32 0x29A4B
+0x5A34 0x29A49
+0x5A36 0x29AD5
+0x5A39 0x29B52
+0x5A3A 0x29B47
+0x5A3C 0x29B48
+0x5A3D 0x29CCC
+0x5A3E 0x29CD0
+0x5A46 0x29D86
+0x5A47 0x29DA7
+0x5A48 0x29DA3
+0x5A4A 0x29DB6
+0x5A4B 0x29DAD
+0x5A4C 0x2A013
+0x5A53 0x2A017
+0x5A54 0x2A022
+0x5A57 0x2A049
+0x5A58 0x2A026
+0x5A59 0x2FA0C
+0x5A5A 0x2A03C
+0x5A5B 0x2A028
+0x5A5C 0x2A2A8
+0x5A5E 0x2A3FB
+0x5A60 0x2A432
+0x5A61 0x2A4D6
+0x5A62 0x2A548
+0x5A65 0x2A5C6
+0x5A69 0x20425
+0x5A6A 0x20426
+0x5A6B 0x20424
+0x5A6C 0x20433
+0x5A6D 0x20570
+0x5A6F 0x20B90
+0x5A71 0x21095
+0x5A72 0x210A1
+0x5A73 0x21092
+0x5A74 0x2108F
+0x5A75 0x2109F
+0x5A76 0x21096
+0x5A77 0x21098
+0x5A78 0x2109D
+0x5A79 0x210A0
+0x5A7B 0x21697
+0x5A7C 0x218EB
+0x5A7E 0x21F87
+0x5B22 0x22432
+0x5B26 0x228D8
+0x5B27 0x228FB
+0x5B28 0x22906
+0x5B2A 0x228D1
+0x5B2C 0x2F8B0
+0x5B33 0x22DF6
+0x5B34 0x22E04
+0x5B35 0x22DFE
+0x5B37 0x22DFF
+0x5B38 0x22DF7
+0x5B39 0x23018
+0x5B3B 0x23014
+0x5B3C 0x230CD
+0x5B3D 0x23120
+0x5B3E 0x232DE
+0x5B42 0x23745
+0x5B43 0x23753
+0x5B45 0x2374B
+0x5B46 0x23755
+0x5B47 0x23741
+0x5B4B 0x2375C
+0x5B4C 0x23754
+0x5B4D 0x23A71
+0x5B4E 0x23AD0
+0x5B51 0x23C53
+0x5B52 0x24029
+0x5B53 0x2407E
+0x5B55 0x24079
+0x5B58 0x24070
+0x5B59 0x2406A
+0x5B5C 0x24085
+0x5B5D 0x24064
+0x5B5F 0x24078
+0x5B61 0x24432
+0x5B62 0x24427
+0x5B63 0x2442F
+0x5B68 0x248BA
+0x5B6A 0x24A71
+0x5B6B 0x24A8C
+0x5B6D 0x24B1A
+0x5B70 0x24B98
+0x5B71 0x24CE4
+0x5B76 0x24EC2
+0x5B78 0x24EBA
+0x5B7A 0x24EC8
+0x5C21 0x250B9
+0x5C22 0x250B8
+0x5C23 0x250A5
+0x5C24 0x252E2
+0x5C28 0x252D9
+0x5C2B 0x252AC
+0x5C2C 0x252DD
+0x5C30 0x2559D
+0x5C33 0x25711
+0x5C34 0x25703
+0x5C38 0x258EE
+0x5C3C 0x25CA4
+0x5C3D 0x25CD8
+0x5C3E 0x25CDD
+0x5C3F 0x25CDE
+0x5C41 0x25CE7
+0x5C45 0x25CD4
+0x5C47 0x25CCE
+0x5C4D 0x25CF1
+0x5C4E 0x25CD3
+0x5C52 0x25CCA
+0x5C53 0x25CE9
+0x5C57 0x25F1A
+0x5C58 0x25F41
+0x5C59 0x2F968
+0x5C5C 0x2613D
+0x5C5D 0x26140
+0x5C61 0x26143
+0x5C63 0x2613F
+0x5C64 0x2613C
+0x5C66 0x26321
+0x5C67 0x26320
+0x5C69 0x263C6
+0x5C6C 0x263D1
+0x5C6D 0x263CA
+0x5C6E 0x2648E
+0x5C6F 0x26491
+0x5C72 0x265E3
+0x5C73 0x26888
+0x5C75 0x26870
+0x5C77 0x2699D
+0x5C78 0x26A9D
+0x5C79 0x26A91
+0x5C7A 0x26A98
+0x5C7B 0x26A99
+0x5D22 0x26FBF
+0x5D24 0x26FAE
+0x5D25 0x26FB1
+0x5D26 0x26FCC
+0x5D27 0x27004
+0x5D29 0x27016
+0x5D2A 0x26FCD
+0x5D2D 0x26FE0
+0x5D2E 0x26FCB
+0x5D2F 0x26FD4
+0x5D30 0x26FC9
+0x5D31 0x271FF
+0x5D33 0x271FD
+0x5D34 0x27457
+0x5D35 0x27452
+0x5D36 0x27450
+0x5D37 0x27445
+0x5D38 0x2744D
+0x5D3A 0x27453
+0x5D3C 0x27482
+0x5D3D 0x27444
+0x5D3E 0x275CE
+0x5D3F 0x275CF
+0x5D40 0x275D2
+0x5D41 0x27602
+0x5D42 0x2774F
+0x5D43 0x27758
+0x5D45 0x27743
+0x5D47 0x27752
+0x5D4B 0x27749
+0x5D4C 0x27753
+0x5D4D 0x2774D
+0x5D4F 0x27884
+0x5D51 0x27883
+0x5D52 0x27932
+0x5D53 0x27AE2
+0x5D55 0x27AE4
+0x5D56 0x27AD3
+0x5D58 0x27AD5
+0x5D59 0x27ADD
+0x5D5C 0x27AEC
+0x5D5D 0x27AE6
+0x5D5E 0x27AD2
+0x5D5F 0x27AFA
+0x5D60 0x27ADA
+0x5D62 0x27C06
+0x5D63 0x27C04
+0x5D65 0x27C7B
+0x5D66 0x27D04
+0x5D67 0x27D02
+0x5D6B 0x27F60
+0x5D6F 0x28107
+0x5D70 0x28105
+0x5D71 0x2810C
+0x5D73 0x2815A
+0x5D76 0x2811A
+0x5D79 0x2838A
+0x5E21 0x2838C
+0x5E22 0x28609
+0x5E23 0x288A6
+0x5E25 0x288AC
+0x5E26 0x288A9
+0x5E28 0x28A8B
+0x5E2A 0x28A8C
+0x5E2D 0x28A88
+0x5E2E 0x28A89
+0x5E30 0x28A93
+0x5E33 0x28D83
+0x5E34 0x28F4F
+0x5E37 0x29120
+0x5E39 0x29236
+0x5E3A 0x292E2
+0x5E3D 0x292EE
+0x5E3F 0x292E7
+0x5E40 0x292E9
+0x5E44 0x292DF
+0x5E46 0x293C7
+0x5E48 0x29509
+0x5E4A 0x29501
+0x5E53 0x29605
+0x5E54 0x2960C
+0x5E55 0x29778
+0x5E56 0x2975D
+0x5E5C 0x2975E
+0x5E5D 0x29760
+0x5E5E 0x29767
+0x5E60 0x2FA05
+0x5E61 0x298F4
+0x5E64 0x298F1
+0x5E66 0x298FA
+0x5E69 0x298F8
+0x5E6A 0x298F9
+0x5E6B 0x29909
+0x5E6C 0x298FD
+0x5E6D 0x298F7
+0x5E6F 0x29A59
+0x5E71 0x29B60
+0x5E72 0x29B68
+0x5E78 0x29B6A
+0x5E79 0x29C14
+0x5E7A 0x29C3E
+0x5E7B 0x29CE4
+0x5F28 0x29DD2
+0x5F2D 0x2A058
+0x5F2E 0x2A050
+0x5F30 0x2A05C
+0x5F33 0x28119
+0x5F37 0x2FA0E
+0x5F41 0x2A4DF
+0x5F47 0x2A5D9
+0x5F4B 0x20966
+0x5F4E 0x210E1
+0x5F4F 0x210EF
+0x5F50 0x210E8
+0x5F51 0x21233
+0x5F53 0x218FE
+0x5F56 0x21AEF
+0x5F57 0x21AEC
+0x5F58 0x21CEC
+0x5F59 0x21F9C
+0x5F5B 0x21F99
+0x5F5C 0x22170
+0x5F5D 0x2216E
+0x5F5F 0x22441
+0x5F62 0x22902
+0x5F63 0x22901
+0x5F65 0x22A1B
+0x5F66 0x22E23
+0x5F67 0x22E25
+0x5F68 0x22E24
+0x5F69 0x22E26
+0x5F6A 0x22E33
+0x5F6B 0x22E2F
+0x5F6C 0x2308F
+0x5F6D 0x23356
+0x5F74 0x23799
+0x5F76 0x2F8ED
+0x5F78 0x23AD9
+0x5F7A 0x240B7
+0x5F7C 0x240B6
+0x6021 0x24454
+0x6022 0x24457
+0x6023 0x2447A
+0x6026 0x24A8E
+0x6028 0x24A90
+0x6029 0x24AB9
+0x602D 0x24CEF
+0x6031 0x24EE2
+0x6033 0x24ED6
+0x6034 0x24ED8
+0x6035 0x24EDA
+0x6036 0x24EDE
+0x603A 0x25308
+0x603B 0x25304
+0x603C 0x2530A
+0x603D 0x2530B
+0x603E 0x25302
+0x6040 0x255AA
+0x6041 0x255C1
+0x6043 0x258D7
+0x6044 0x258D9
+0x6046 0x258DE
+0x6047 0x258DA
+0x604A 0x25A2A
+0x604D 0x25D31
+0x604F 0x25D2B
+0x6050 0x25D2C
+0x6051 0x25D29
+0x6052 0x25D2E
+0x6054 0x25D27
+0x6055 0x25D28
+0x6057 0x25D5F
+0x6058 0x25D30
+0x6059 0x25D24
+0x605C 0x25F3A
+0x605E 0x25F39
+0x605F 0x25F40
+0x6060 0x26180
+0x6061 0x26184
+0x6064 0x26175
+0x6065 0x26176
+0x6067 0x2617C
+0x6069 0x26178
+0x606A 0x2619B
+0x606B 0x2617E
+0x606C 0x2625A
+0x606E 0x2632C
+0x6070 0x2649C
+0x6071 0x26847
+0x6072 0x2688A
+0x6075 0x26927
+0x6076 0x2704A
+0x6079 0x27027
+0x607C 0x2702E
+0x607D 0x27026
+0x607E 0x27208
+0x6122 0x274BD
+0x6123 0x27496
+0x6127 0x274BE
+0x6128 0x2748E
+0x6129 0x27774
+0x612B 0x27780
+0x6132 0x2793C
+0x6133 0x2793D
+0x6135 0x2793A
+0x6136 0x27942
+0x6138 0x27B24
+0x6139 0x27B06
+0x613C 0x27B15
+0x613E 0x27B02
+0x613F 0x27B0C
+0x6141 0x27B08
+0x6142 0x27B0A
+0x6143 0x27B05
+0x6144 0x27B1C
+0x6147 0x27C82
+0x6149 0x27C86
+0x614B 0x27E03
+0x614C 0x27F7B
+0x614E 0x27F7A
+0x6153 0x28180
+0x6155 0x28158
+0x615A 0x283AA
+0x615B 0x283AB
+0x615C 0x28436
+0x615D 0x2844A
+0x6160 0x287D6
+0x616A 0x28B03
+0x616B 0x28ACF
+0x616D 0x28D9F
+0x616E 0x28DA2
+0x616F 0x2902A
+0x6170 0x2902F
+0x6171 0x29144
+0x6172 0x29140
+0x6175 0x29311
+0x6176 0x2930F
+0x6178 0x2930D
+0x6179 0x29307
+0x617A 0x29303
+0x6221 0x29435
+0x6224 0x29504
+0x622A 0x29526
+0x622E 0x2951E
+0x6231 0x2960E
+0x6233 0x2961D
+0x6234 0x2961E
+0x6235 0x2961F
+0x6237 0x29788
+0x6239 0x2978D
+0x623A 0x29791
+0x623B 0x29780
+0x623D 0x29854
+0x623E 0x29855
+0x6242 0x29925
+0x6243 0x2991A
+0x624B 0x29B88
+0x624D 0x29B7A
+0x6250 0x29B80
+0x6251 0x29D1E
+0x6252 0x29DFC
+0x6253 0x29E25
+0x6258 0x29E0B
+0x625A 0x29E06
+0x625B 0x29E04
+0x625E 0x29DF9
+0x625F 0x29E00
+0x6263 0x29E02
+0x6265 0x29E07
+0x6269 0x2A0B5
+0x626B 0x2A087
+0x626D 0x2A093
+0x626E 0x2FA0F
+0x6270 0x2A0BE
+0x6271 0x2A266
+0x6273 0x2A2C7
+0x6274 0x2A2CF
+0x6278 0x2A33D
+0x627A 0x2A33C
+0x627B 0x2A347
+0x6322 0x2A3C3
+0x6325 0x2A51B
+0x6328 0x2A5C9
+0x632A 0x2A5DD
+0x632C 0x2A693
+0x632E 0x2043D
+0x6333 0x214E6
+0x6336 0x21AF7
+0x6337 0x21FB0
+0x6338 0x21FAE
+0x633D 0x2259F
+0x633E 0x2259E
+0x633F 0x22930
+0x6341 0x2294F
+0x6344 0x22927
+0x6345 0x22951
+0x6348 0x22E51
+0x6349 0x22E54
+0x634A 0x22E56
+0x634B 0x23027
+0x634D 0x23024
+0x6352 0x237EC
+0x6353 0x237C4
+0x6356 0x240F8
+0x6357 0x240F6
+0x6358 0x240F7
+0x6359 0x240ED
+0x635C 0x240F4
+0x635D 0x240EF
+0x6360 0x2447F
+0x6361 0x244A2
+0x6362 0x2447E
+0x6364 0x248C5
+0x636A 0x24EF1
+0x636B 0x24EF2
+0x636D 0x2502F
+0x6372 0x25323
+0x6373 0x25329
+0x6377 0x2571B
+0x6378 0x258EB
+0x637A 0x258EA
+0x637B 0x25A33
+0x637D 0x25D63
+0x6421 0x25D92
+0x6422 0x25D65
+0x6425 0x261A0
+0x6426 0x2F970
+0x6427 0x2625E
+0x6429 0x268AA
+0x642B 0x268A9
+0x642E 0x2709C
+0x6431 0x27092
+0x6435 0x27086
+0x6439 0x27083
+0x643F 0x2F9C2
+0x6442 0x274CE
+0x6445 0x27793
+0x6449 0x27B2E
+0x644A 0x27B27
+0x644B 0x27B28
+0x6450 0x27E18
+0x6451 0x27E16
+0x6452 0x27F8D
+0x6454 0x27F8E
+0x6457 0x27F90
+0x6458 0x27F8F
+0x6459 0x28181
+0x645C 0x2818A
+0x645D 0x2818C
+0x645E 0x2828D
+0x6462 0x283B2
+0x6464 0x287D9
+0x6468 0x28B0D
+0x646A 0x28B13
+0x646E 0x28B1B
+0x6470 0x28DAC
+0x6472 0x28DB3
+0x6474 0x2915E
+0x6476 0x29160
+0x6477 0x29168
+0x6478 0x29163
+0x6479 0x29169
+0x647A 0x29167
+0x647D 0x29328
+0x6521 0x2932E
+0x6522 0x29330
+0x6524 0x29326
+0x6525 0x29331
+0x6526 0x29341
+0x6528 0x293DA
+0x652A 0x2F9FA
+0x652B 0x2940B
+0x652D 0x29534
+0x652E 0x29533
+0x6532 0x29539
+0x6533 0x2953B
+0x6534 0x29540
+0x6535 0x29630
+0x6537 0x29632
+0x6538 0x29637
+0x653D 0x29781
+0x653E 0x2979F
+0x653F 0x297A7
+0x6542 0x29944
+0x6543 0x29947
+0x6544 0x29948
+0x6545 0x2993D
+0x6548 0x29949
+0x654A 0x29A80
+0x654B 0x29BA0
+0x654C 0x29B9D
+0x6550 0x29B9C
+0x6551 0x29C47
+0x6552 0x29D07
+0x6556 0x29E49
+0x6558 0x29E44
+0x655C 0x29EDF
+0x655E 0x29E4C
+0x6560 0x29E4F
+0x6563 0x2A0C1
+0x6565 0x2A0B9
+0x6566 0x2A0CB
+0x6567 0x2A0CF
+0x6568 0x2A0C4
+0x656D 0x2A0CA
+0x656E 0x2A0C3
+0x656F 0x2A2D0
+0x6570 0x2A351
+0x6573 0x2A3A8
+0x6574 0x2A3C7
+0x6575 0x2A3C6
+0x6577 0x2A3CA
+0x6578 0x2A402
+0x657A 0x2A45D
+0x657B 0x2A45A
+0x657E 0x2A459
+0x6622 0x2A4CC
+0x6623 0x2A51C
+0x6624 0x2A5CC
+0x6628 0x2A5E8
+0x6629 0x2A5EC
+0x662A 0x2A5EA
+0x662B 0x2A6AD
+0x662C 0x2A6B0
+0x662D 0x2045F
+0x662E 0x20458
+0x662F 0x20457
+0x6631 0x20B93
+0x6633 0x2113B
+0x6635 0x21134
+0x6636 0x214F2
+0x6638 0x21AFD
+0x6639 0x21C1D
+0x663C 0x22304
+0x663D 0x22448
+0x663E 0x22958
+0x663F 0x22E4F
+0x6641 0x22E6E
+0x6642 0x22E72
+0x6644 0x2302E
+0x6645 0x237FC
+0x6646 0x237F4
+0x6647 0x23C36
+0x6648 0x2410E
+0x664B 0x24114
+0x664D 0x24119
+0x664F 0x244A6
+0x6651 0x24AC9
+0x6652 0x24AC0
+0x6653 0x24ACC
+0x6654 0x24B1B
+0x6655 0x24BAA
+0x6656 0x24BA8
+0x6657 0x24F03
+0x665C 0x25035
+0x6662 0x255D9
+0x6666 0x25A3F
+0x6667 0x25A3D
+0x666B 0x25D8B
+0x6670 0x25D68
+0x6671 0x25D8A
+0x6672 0x25F58
+0x6673 0x25F57
+0x6674 0x261CE
+0x6675 0x261BC
+0x6676 0x261C0
+0x6677 0x261C1
+0x6678 0x261BF
+0x6679 0x261AB
+0x667A 0x2625F
+0x667C 0x264A6
+0x667E 0x26529
+0x6726 0x268B8
+0x6729 0x270DD
+0x672A 0x270D6
+0x672B 0x2F9B1
+0x672C 0x270D5
+0x672D 0x270E7
+0x672E 0x270D8
+0x672F 0x274EC
+0x6731 0x27500
+0x6732 0x27507
+0x6733 0x274FD
+0x6734 0x274F1
+0x6735 0x274FF
+0x6736 0x277AA
+0x6737 0x277B0
+0x6738 0x27B48
+0x673A 0x27B53
+0x673C 0x27B4D
+0x6742 0x27B43
+0x6743 0x27B50
+0x6746 0x27C8C
+0x6747 0x27E27
+0x6749 0x27F99
+0x674B 0x281B1
+0x674D 0x281B0
+0x674E 0x281AA
+0x674F 0x281AC
+0x6753 0x283C8
+0x6754 0x283CA
+0x6755 0x28642
+0x6756 0x287E0
+0x6757 0x288E7
+0x6758 0x288E8
+0x6759 0x288E6
+0x675D 0x28B5B
+0x675E 0x28B56
+0x6760 0x28B5A
+0x6764 0x28CB8
+0x6765 0x28DC5
+0x6768 0x29048
+0x6769 0x2917D
+0x676A 0x2917C
+0x676B 0x29181
+0x676C 0x29182
+0x676D 0x29162
+0x676F 0x29345
+0x6774 0x293E3
+0x6778 0x29550
+0x677A 0x2954F
+0x677D 0x29639
+0x6821 0x2963A
+0x6825 0x297C1
+0x6826 0x2994E
+0x6827 0x2996E
+0x682C 0x29971
+0x682E 0x29A8C
+0x682F 0x29A89
+0x6831 0x29AE5
+0x6832 0x29BB3
+0x6833 0x29BB6
+0x6834 0x29BB4
+0x6835 0x29C4D
+0x6837 0x29D13
+0x6838 0x29E78
+0x683F 0x29E72
+0x6845 0x2A275
+0x6846 0x2A2DA
+0x6847 0x2A2D7
+0x684F 0x2FA16
+0x6850 0x2A469
+0x6851 0x2A467
+0x6853 0x2A466
+0x6854 0x2A46F
+0x6855 0x2A471
+0x6857 0x2A4CF
+0x6858 0x2A523
+0x685B 0x2A5A5
+0x685D 0x2A5FE
+0x685E 0x2A5FB
+0x685F 0x2A5FD
+0x6864 0x2116D
+0x6866 0x21B05
+0x6867 0x21C20
+0x6869 0x21FC8
+0x686A 0x21FC9
+0x686D 0x23127
+0x686F 0x2381E
+0x6870 0x23936
+0x6872 0x2413D
+0x6874 0x248D7
+0x6876 0x24BAD
+0x6877 0x24D00
+0x6879 0x2533A
+0x687D 0x25726
+0x6923 0x25DB7
+0x6924 0x25DB6
+0x6925 0x25DC0
+0x6927 0x25D9B
+0x6929 0x261D8
+0x692F 0x268C0
+0x6931 0x268BF
+0x6932 0x26ABF
+0x6934 0x27120
+0x6935 0x270D0
+0x6936 0x2710E
+0x6938 0x2711D
+0x6939 0x2711E
+0x693A 0x27115
+0x693B 0x27114
+0x693C 0x2751E
+0x693D 0x2752C
+0x693F 0x277B9
+0x6940 0x277B8
+0x6941 0x277B6
+0x6942 0x2789E
+0x6943 0x2789C
+0x6944 0x2794D
+0x6946 0x27B6E
+0x6947 0x27B60
+0x6949 0x27B64
+0x694A 0x27B62
+0x694B 0x261E5
+0x694D 0x27FA3
+0x6950 0x283D2
+0x6951 0x283D5
+0x6957 0x29055
+0x6959 0x29193
+0x695D 0x29356
+0x695F 0x293E9
+0x6961 0x29445
+0x6964 0x2967C
+0x6966 0x297D3
+0x696C 0x2998E
+0x696D 0x29A97
+0x696F 0x29A9B
+0x6970 0x29A99
+0x6973 0x29BCF
+0x6975 0x29C59
+0x6978 0x29D20
+0x6979 0x29D23
+0x697A 0x29D2A
+0x6A22 0x29EB0
+0x6A24 0x2A12F
+0x6A28 0x2A132
+0x6A29 0x2A143
+0x6A2A 0x2A13F
+0x6A2B 0x2A139
+0x6A2D 0x2A130
+0x6A2E 0x2A2DD
+0x6A2F 0x2A3DA
+0x6A30 0x2A3DB
+0x6A32 0x2A484
+0x6A33 0x2A47F
+0x6A34 0x2A472
+0x6A35 0x2A480
+0x6A36 0x2A4EE
+0x6A38 0x2A52A
+0x6A39 0x2A522
+0x6A3A 0x2A571
+0x6A3B 0x2A5CD
+0x6A3E 0x2A60F
+0x6A3F 0x2A618
+0x6A40 0x2046A
+0x6A45 0x21B0C
+0x6A47 0x225A6
+0x6A4A 0x23037
+0x6A4D 0x23AE2
+0x6A4F 0x244BC
+0x6A52 0x24AD5
+0x6A56 0x24F12
+0x6A58 0x2534B
+0x6A59 0x25341
+0x6A5A 0x253A1
+0x6A5B 0x255EC
+0x6A5E 0x25DD4
+0x6A5F 0x25DD8
+0x6A60 0x25DD9
+0x6A62 0x25DDA
+0x6A63 0x25F6C
+0x6A64 0x25F6D
+0x6A67 0x261E7
+0x6A68 0x261EB
+0x6A69 0x261EC
+0x6A6A 0x26262
+0x6A6C 0x2652B
+0x6A6D 0x2660D
+0x6A6E 0x268CD
+0x6A6F 0x26AC3
+0x6A70 0x2713F
+0x6A71 0x2713C
+0x6A72 0x2713E
+0x6A73 0x2713D
+0x6A74 0x2713A
+0x6A75 0x27138
+0x6A76 0x27544
+0x6A77 0x27545
+0x6A79 0x27548
+0x6A7A 0x27550
+0x6A7D 0x27B78
+0x6A7E 0x27B79
+0x6B22 0x27E3E
+0x6B25 0x28654
+0x6B28 0x28BB9
+0x6B2B 0x2905F
+0x6B2E 0x29572
+0x6B2F 0x29575
+0x6B36 0x29AA3
+0x6B37 0x29AA5
+0x6B38 0x29BDC
+0x6B39 0x29BDD
+0x6B3A 0x29C5A
+0x6B3E 0x29EDB
+0x6B3F 0x29EDC
+0x6B41 0x2A1AB
+0x6B42 0x2A184
+0x6B43 0x2A176
+0x6B49 0x2A183
+0x6B4C 0x2A27F
+0x6B4F 0x2A373
+0x6B50 0x2A3AD
+0x6B51 0x2A3B0
+0x6B53 0x2A40F
+0x6B54 0x2A40C
+0x6B57 0x2A579
+0x6B59 0x2A577
+0x6B5A 0x2A57A
+0x6B5D 0x2A632
+0x6B5E 0x2A627
+0x6B5F 0x2A62A
+0x6B60 0x2A62C
+0x6B62 0x2A628
+0x6B63 0x2A629
+0x6B64 0x2A638
+0x6B65 0x2082F
+0x6B66 0x2117B
+0x6B67 0x21B0D
+0x6B69 0x21FD6
+0x6B6A 0x21FD5
+0x6B6B 0x22EA1
+0x6B6C 0x2384C
+0x6B73 0x24FC0
+0x6B77 0x25DF4
+0x6B7A 0x261F0
+0x6B7C 0x2633F
+0x6B7E 0x2755D
+0x6C21 0x27572
+0x6C22 0x27562
+0x6C24 0x27566
+0x6C27 0x27B88
+0x6C2A 0x281E8
+0x6C2B 0x281E4
+0x6C2F 0x288FF
+0x6C31 0x291AF
+0x6C32 0x291AE
+0x6C35 0x293F2
+0x6C36 0x29448
+0x6C37 0x29581
+0x6C38 0x2957E
+0x6C3B 0x29652
+0x6C3C 0x297EF
+0x6C3F 0x29AAD
+0x6C40 0x29BE6
+0x6C42 0x29BED
+0x6C44 0x29BE9
+0x6C45 0x29C61
+0x6C46 0x29C60
+0x6C47 0x29D33
+0x6C4B 0x29F0B
+0x6C4C 0x29F08
+0x6C4F 0x29F07
+0x6C53 0x2A1CA
+0x6C55 0x2A1C6
+0x6C57 0x2A284
+0x6C58 0x2A2EB
+0x6C59 0x2A37D
+0x6C5C 0x2A49B
+0x6C5D 0x2A4A2
+0x6C5E 0x2A4A1
+0x6C5F 0x2A4A0
+0x6C60 0x2A49C
+0x6C63 0x2A580
+0x6C65 0x2A640
+0x6C67 0x2A639
+0x6C68 0x2A63C
+0x6C6B 0x208CA
+0x6C6D 0x21189
+0x6C6F 0x2303C
+0x6C70 0x23940
+0x6C71 0x24163
+0x6C72 0x24169
+0x6C74 0x25353
+0x6C77 0x25917
+0x6C78 0x2591A
+0x6C79 0x25E00
+0x6C7E 0x2756F
+0x6D21 0x278AB
+0x6D23 0x27B91
+0x6D26 0x27FB1
+0x6D28 0x281EF
+0x6D29 0x28DF1
+0x6D2A 0x28DF2
+0x6D2B 0x291B7
+0x6D2C 0x291B5
+0x6D2E 0x29586
+0x6D2F 0x2965A
+0x6D31 0x299C6
+0x6D32 0x299CB
+0x6D34 0x29AB2
+0x6D36 0x29BF3
+0x6D38 0x29F27
+0x6D3B 0x2A1D5
+0x6D3C 0x2A1D8
+0x6D3E 0x2A1EC
+0x6D3F 0x2A287
+0x6D40 0x2A2F2
+0x6D45 0x2A4AD
+0x6D46 0x2A4B0
+0x6D47 0x2A4FD
+0x6D49 0x2A587
+0x6D4A 0x2A64A
+0x6D4D 0x2A64E
+0x6D4E 0x2A649
+0x6D4F 0x2A651
+0x6D50 0x2A64D
+0x6D52 0x20472
+0x6D54 0x21B16
+0x6D55 0x2386D
+0x6D56 0x23941
+0x6D58 0x24171
+0x6D59 0x24174
+0x6D5D 0x25F7C
+0x6D5F 0x2718A
+0x6D60 0x27956
+0x6D63 0x28BFA
+0x6D66 0x2965B
+0x6D6A 0x2A1F5
+0x6D6B 0x2A1F0
+0x6D6C 0x2A2F3
+0x6D6D 0x2A37F
+0x6D6E 0x2A413
+0x6D71 0x21B19
+0x6D72 0x22985
+0x6D73 0x22EB0
+0x6D74 0x24177
+0x6D75 0x255FF
+0x6D7A 0x27187
+0x6D7C 0x2718B
+0x6D7E 0x27B9E
+0x6E23 0x2958F
+0x6E26 0x29839
+0x6E27 0x299D4
+0x6E28 0x29AF1
+0x6E29 0x29C02
+0x6E2A 0x29C6B
+0x6E2B 0x29D40
+0x6E2E 0x2A210
+0x6E2F 0x2A4BE
+0x6E30 0x2A4B9
+0x6E32 0x2A664
+0x6E34 0x24AE9
+0x6E35 0x27190
+0x6E38 0x2721C
+0x6E3A 0x27592
+0x6E3B 0x278AE
+0x6E3C 0x27BA3
+0x6E3E 0x291C9
+0x6E40 0x299D8
+0x6E41 0x29D44
+0x6E42 0x2A224
+0x6E46 0x2A670
+0x6E47 0x2A6D3
+0x6E4A 0x2A4C3
+0x6E4E 0x25E21
+0x6E4F 0x26ACA
+0x6E50 0x2759C
+0x6E51 0x29C73
+0x6E52 0x2A386
+0x6E53 0x2A5C1
+0x6E54 0x29C09
+0x6E56 0x2A6D5
+0x6E5C 0x291D4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,8143 @@
+0x2121 0x200D1
+0x2122 0x200CB
+0x2123 0x200C9
+0x2124 0x2010C
+0x2125 0x20000
+0x2126 0x20087
+0x2127 0x2010D
+0x2128 0x2010F
+0x2129 0x2F81D
+0x212A 0x22398
+0x212B 0x200D2
+0x212C 0x20111
+0x212D 0x2007E
+0x212E 0x20AD3
+0x212F 0x21552
+0x2130 0x21CFE
+0x2131 0x225A9
+0x2132 0x23942
+0x2133 0x20009
+0x2134 0x200D6
+0x2135 0x204DD
+0x2136 0x204DC
+0x2137 0x20502
+0x2138 0x20573
+0x2139 0x20676
+0x213A 0x206A7
+0x213B 0x206A8
+0x213C 0x20833
+0x213D 0x208CC
+0x213E 0x20A0D
+0x213F 0x20A2C
+0x2140 0x20B1B
+0x2142 0x20B1D
+0x2143 0x20B99
+0x2144 0x2123E
+0x2145 0x21D2D
+0x2146 0x21D2F
+0x2147 0x22399
+0x2148 0x233B3
+0x2149 0x239B6
+0x214A 0x23B1B
+0x214B 0x244EF
+0x214C 0x248E9
+0x214D 0x20014
+0x214E 0x20094
+0x214F 0x200E1
+0x2150 0x20506
+0x2151 0x2054A
+0x2152 0x20544
+0x2153 0x20631
+0x2154 0x2067A
+0x2155 0x206AD
+0x2156 0x206AE
+0x2157 0x206B1
+0x2158 0x20838
+0x2159 0x20837
+0x215A 0x2097D
+0x215B 0x2097E
+0x215C 0x20A2D
+0x215D 0x20A32
+0x215E 0x20B23
+0x215F 0x20B26
+0x2160 0x2F83A
+0x2161 0x20BA0
+0x2162 0x216A8
+0x2163 0x2193F
+0x2164 0x219BC
+0x2165 0x21BC4
+0x2166 0x21D3B
+0x2167 0x22019
+0x2168 0x22018
+0x2169 0x221B3
+0x216A 0x223AA
+0x216B 0x224BE
+0x216C 0x225AC
+0x216D 0x22A25
+0x216E 0x22A66
+0x216F 0x22A6B
+0x2170 0x23943
+0x2171 0x239B5
+0x2172 0x23AEC
+0x2173 0x23C76
+0x2175 0x24614
+0x2176 0x215DC
+0x2177 0x2471C
+0x2178 0x2471D
+0x2179 0x264D0
+0x217A 0x26612
+0x217B 0x26AF3
+0x217C 0x28669
+0x217E 0x28E11
+0x2221 0x28E15
+0x2222 0x28E10
+0x2223 0x28E13
+0x2224 0x200A4
+0x2225 0x200A5
+0x2226 0x201D0
+0x2227 0x201BA
+0x2228 0x201CB
+0x2229 0x2057B
+0x222A 0x20686
+0x222B 0x206BB
+0x222C 0x206BA
+0x222D 0x206C3
+0x222E 0x206B9
+0x222F 0x206C0
+0x2231 0x20839
+0x2232 0x2083B
+0x2233 0x20841
+0x2234 0x208D1
+0x2235 0x208CF
+0x2236 0x208D2
+0x2237 0x2092E
+0x2238 0x2096E
+0x2239 0x2098C
+0x223A 0x20988
+0x223B 0x20A35
+0x223D 0x20A3A
+0x223E 0x20A3B
+0x223F 0x20A38
+0x2240 0x20A39
+0x2241 0x20B2E
+0x2242 0x20B2C
+0x2243 0x20BC8
+0x2244 0x20BB5
+0x2245 0x20BAD
+0x2246 0x20BB0
+0x2247 0x20BAB
+0x2248 0x211B3
+0x2249 0x211A9
+0x224A 0x216BB
+0x224B 0x216B9
+0x224C 0x21B5A
+0x224D 0x21BCD
+0x224E 0x21C2B
+0x224F 0x21D05
+0x2252 0x21D51
+0x2253 0x21D4B
+0x2254 0x21FEA
+0x2255 0x21FED
+0x2256 0x22036
+0x2257 0x22062
+0x2258 0x22056
+0x2259 0x22055
+0x225A 0x22064
+0x225B 0x22058
+0x225D 0x221DA
+0x225E 0x221D8
+0x225F 0x223AD
+0x2260 0x223AB
+0x2261 0x224C0
+0x2262 0x224C3
+0x2263 0x225B3
+0x2264 0x225B7
+0x2265 0x225BA
+0x2268 0x225C7
+0x2269 0x225B5
+0x226A 0x2298E
+0x226B 0x22A73
+0x226C 0x22A6C
+0x226D 0x22A74
+0x226E 0x2F8B4
+0x226F 0x22A72
+0x2270 0x22A71
+0x2271 0x22A82
+0x2272 0x22A70
+0x2273 0x2313F
+0x2274 0x233BA
+0x2275 0x233B8
+0x2276 0x239B7
+0x2277 0x24723
+0x2278 0x24721
+0x2279 0x2472B
+0x227A 0x24726
+0x227B 0x24722
+0x227C 0x24D25
+0x227D 0x250E4
+0x227E 0x25415
+0x2321 0x264E4
+0x2322 0x26633
+0x2323 0x2662A
+0x2324 0x26632
+0x2325 0x26629
+0x2326 0x26AFB
+0x2327 0x2795B
+0x2328 0x2795C
+0x2329 0x27C28
+0x232A 0x2866F
+0x232B 0x2866D
+0x232C 0x2866B
+0x232D 0x2866E
+0x232E 0x28E16
+0x232F 0x20022
+0x2330 0x20116
+0x2331 0x20148
+0x2332 0x201D8
+0x2333 0x20200
+0x2335 0x20480
+0x2336 0x204E4
+0x2338 0x204E7
+0x2339 0x2050C
+0x233A 0x20553
+0x233B 0x205B7
+0x233C 0x20AE8
+0x233D 0x206D1
+0x233E 0x206E5
+0x233F 0x206D8
+0x2340 0x206D6
+0x2341 0x206DA
+0x2342 0x206D9
+0x2343 0x206D5
+0x2344 0x206E6
+0x2345 0x206D4
+0x2346 0x206D3
+0x2347 0x20844
+0x2348 0x208D6
+0x2349 0x208D7
+0x234A 0x20913
+0x234C 0x20970
+0x234D 0x20992
+0x234E 0x209DB
+0x234F 0x209DA
+0x2350 0x20A41
+0x2351 0x20A43
+0x2352 0x20B33
+0x2353 0x20BF6
+0x2354 0x20BD4
+0x2355 0x20BDD
+0x2356 0x20BD0
+0x2357 0x20C04
+0x2358 0x20BD9
+0x2359 0x20BDB
+0x235A 0x20C05
+0x235B 0x20BD3
+0x235C 0x20BE1
+0x235D 0x21280
+0x235E 0x21277
+0x235F 0x21281
+0x2360 0x21282
+0x2361 0x21283
+0x2362 0x2F85C
+0x2363 0x21561
+0x2364 0x21560
+0x2365 0x216D8
+0x2366 0x216D6
+0x2367 0x216D7
+0x2368 0x24605
+0x2369 0x2194D
+0x236A 0x21948
+0x236B 0x21BD6
+0x236C 0x21BCF
+0x236D 0x21BD9
+0x236E 0x21BD8
+0x236F 0x21C3D
+0x2371 0x21D54
+0x2372 0x21D5B
+0x2373 0x21D5C
+0x2375 0x21D59
+0x2376 0x21D58
+0x2377 0x21D5A
+0x2378 0x21D55
+0x2379 0x21D56
+0x237A 0x21D82
+0x237B 0x21FF0
+0x237C 0x2201C
+0x237D 0x2206A
+0x237E 0x22069
+0x2421 0x22071
+0x2422 0x22067
+0x2423 0x2206C
+0x2424 0x2206E
+0x2425 0x22079
+0x2426 0x2218B
+0x2427 0x221B8
+0x2428 0x221E7
+0x2429 0x221E8
+0x242A 0x221E4
+0x242B 0x221E6
+0x242C 0x221E5
+0x242D 0x221F0
+0x242E 0x22383
+0x242F 0x223B7
+0x2430 0x223BB
+0x2431 0x223B9
+0x2432 0x223C5
+0x2433 0x22453
+0x2434 0x224C4
+0x2435 0x224C6
+0x2436 0x224CB
+0x2437 0x225C8
+0x2438 0x2F89F
+0x2439 0x225C9
+0x243A 0x225DB
+0x243B 0x22994
+0x243C 0x22A95
+0x243D 0x22A88
+0x243E 0x22A8D
+0x243F 0x22EEC
+0x2440 0x22EEE
+0x2441 0x22EF1
+0x2442 0x2312E
+0x2443 0x23149
+0x2444 0x2335F
+0x2445 0x233D1
+0x2446 0x233CB
+0x2447 0x23885
+0x2449 0x2394A
+0x244A 0x23947
+0x244B 0x2394B
+0x244C 0x239BB
+0x244D 0x239C4
+0x244F 0x23B02
+0x2450 0x23C82
+0x2451 0x23C91
+0x2452 0x23C8F
+0x2453 0x23C92
+0x2454 0x2418F
+0x2455 0x24191
+0x2456 0x241B4
+0x2457 0x24192
+0x2458 0x244F4
+0x2459 0x245AA
+0x245A 0x24735
+0x245B 0x24737
+0x245C 0x2473D
+0x245D 0x2473C
+0x245E 0x2472F
+0x245F 0x24730
+0x2460 0x248F8
+0x2461 0x248EF
+0x2462 0x24B26
+0x2464 0x24D26
+0x2465 0x24D27
+0x2466 0x24F41
+0x2467 0x24FC6
+0x2468 0x24FC7
+0x2469 0x250EB
+0x246A 0x250E8
+0x246B 0x250EA
+0x246C 0x2541A
+0x246D 0x25419
+0x246F 0x25923
+0x2470 0x25924
+0x2471 0x25E25
+0x2472 0x26635
+0x2473 0x26634
+0x2474 0x26A07
+0x2475 0x2721D
+0x2476 0x277E1
+0x2477 0x27BAB
+0x2478 0x28460
+0x2479 0x28677
+0x247A 0x2867D
+0x247C 0x28E1E
+0x247D 0x28E1A
+0x247E 0x28E1D
+0x2521 0x2006B
+0x2522 0x2012D
+0x2523 0x2014C
+0x2524 0x2022A
+0x2526 0x20215
+0x2527 0x2022C
+0x2528 0x20206
+0x2529 0x20208
+0x252A 0x2020A
+0x252C 0x20556
+0x252D 0x20584
+0x252F 0x205C6
+0x2530 0x206F5
+0x2531 0x20709
+0x2532 0x206F8
+0x2533 0x206E8
+0x2534 0x206FB
+0x2535 0x206E9
+0x2536 0x206F6
+0x2539 0x20852
+0x253C 0x20854
+0x253D 0x20851
+0x253E 0x20939
+0x253F 0x2093A
+0x2540 0x20998
+0x2541 0x20A4E
+0x2543 0x20C36
+0x2544 0x20C0C
+0x2545 0x20C10
+0x2546 0x20C32
+0x2547 0x20C11
+0x2548 0x20C18
+0x2549 0x20C1C
+0x254A 0x20C1A
+0x254B 0x20C19
+0x254C 0x20C0B
+0x254D 0x20C0F
+0x254E 0x20C1D
+0x254F 0x20C21
+0x2550 0x20C13
+0x2551 0x20C1B
+0x2552 0x20C15
+0x2554 0x211D1
+0x2555 0x211C8
+0x2556 0x2128D
+0x2557 0x212B5
+0x255A 0x215F8
+0x255B 0x216E0
+0x255C 0x216E1
+0x255E 0x216DE
+0x255F 0x216FE
+0x2560 0x216DC
+0x2561 0x21701
+0x2562 0x216FD
+0x2563 0x21700
+0x2564 0x219D7
+0x2565 0x219D6
+0x2566 0x219D9
+0x2567 0x21B65
+0x2568 0x21BD2
+0x2569 0x21BDC
+0x256A 0x21BE1
+0x256B 0x21BDE
+0x256C 0x21C42
+0x256D 0x21C4B
+0x256F 0x21D8E
+0x2570 0x21D91
+0x2571 0x21D8B
+0x2572 0x21D90
+0x2573 0x21D88
+0x2574 0x21D89
+0x2575 0x21D84
+0x2576 0x21DAA
+0x2577 0x2208D
+0x2578 0x2208F
+0x2579 0x2207D
+0x257A 0x2207F
+0x257B 0x2207B
+0x257C 0x22080
+0x257D 0x2207E
+0x257E 0x22083
+0x2621 0x22081
+0x2622 0x22086
+0x2623 0x2208A
+0x2624 0x221BD
+0x2625 0x221BE
+0x2627 0x221F4
+0x2628 0x221F3
+0x2629 0x22202
+0x262A 0x221F6
+0x262B 0x221F5
+0x262C 0x221F2
+0x262D 0x22204
+0x262E 0x2233D
+0x262F 0x223C6
+0x2630 0x22489
+0x2631 0x224D4
+0x2632 0x224D6
+0x2633 0x224D2
+0x2634 0x225FA
+0x2635 0x22606
+0x2636 0x2260C
+0x2637 0x2260A
+0x2638 0x2260F
+0x2639 0x22A2F
+0x263B 0x22AB7
+0x263C 0x22ABE
+0x263D 0x22ABC
+0x263E 0x22AE2
+0x263F 0x22F06
+0x2640 0x22EF7
+0x2641 0x22F07
+0x2642 0x22EF6
+0x2643 0x23B35
+0x2644 0x2315F
+0x2645 0x23165
+0x2646 0x23164
+0x2647 0x23161
+0x2648 0x2315A
+0x2649 0x2315D
+0x264A 0x2F8D7
+0x264B 0x233D7
+0x264C 0x233D5
+0x264D 0x233DE
+0x264E 0x233E1
+0x264F 0x233E0
+0x2650 0x233D9
+0x2652 0x233DA
+0x2653 0x233DF
+0x2654 0x233F6
+0x2655 0x23403
+0x2657 0x23893
+0x2658 0x2388B
+0x2659 0x23891
+0x265A 0x23892
+0x265B 0x2388A
+0x265C 0x23889
+0x265D 0x2388F
+0x265E 0x23956
+0x265F 0x23959
+0x2660 0x239CA
+0x2661 0x239CC
+0x2663 0x239D0
+0x2664 0x239CD
+0x2665 0x239D6
+0x2666 0x239CB
+0x2667 0x23A83
+0x2668 0x23A82
+0x2669 0x23B06
+0x266A 0x23B2A
+0x266B 0x23B2C
+0x266C 0x23B2B
+0x266D 0x23B29
+0x266E 0x23CBD
+0x266F 0x23CB3
+0x2670 0x23CBE
+0x2671 0x23CC0
+0x2672 0x23CB5
+0x2673 0x23CB6
+0x2674 0x2419D
+0x2675 0x2419F
+0x2676 0x24620
+0x2678 0x2461E
+0x2679 0x2461C
+0x267A 0x24632
+0x267B 0x2461F
+0x267C 0x2462B
+0x267D 0x24621
+0x267E 0x24626
+0x2721 0x24624
+0x2722 0x2461D
+0x2723 0x24627
+0x2724 0x2475B
+0x2725 0x24759
+0x2726 0x24780
+0x2727 0x24755
+0x2728 0x24750
+0x2729 0x2475A
+0x272A 0x24756
+0x272B 0x24763
+0x272C 0x24752
+0x272D 0x24758
+0x272F 0x24739
+0x2730 0x248F9
+0x2731 0x24B28
+0x2733 0x24BBC
+0x2734 0x24BD6
+0x2735 0x24C05
+0x2736 0x24C20
+0x2738 0x24D33
+0x2739 0x24F46
+0x273A 0x24F42
+0x273B 0x24F43
+0x273C 0x24F47
+0x273D 0x24FCB
+0x273E 0x25042
+0x273F 0x25045
+0x2740 0x250FD
+0x2741 0x250F4
+0x2742 0x250F9
+0x2743 0x250FA
+0x2744 0x2535E
+0x2745 0x2541D
+0x2747 0x25758
+0x2748 0x25755
+0x2749 0x25A57
+0x274A 0x25A58
+0x274B 0x25AD9
+0x274C 0x25ADC
+0x274D 0x25ADB
+0x274E 0x25E27
+0x274F 0x25F85
+0x2750 0x25F87
+0x2751 0x25F8A
+0x2752 0x2628B
+0x2753 0x2634F
+0x2754 0x26530
+0x2755 0x2652F
+0x2756 0x26668
+0x2757 0x26649
+0x2759 0x26648
+0x275A 0x2663F
+0x275B 0x2664B
+0x275C 0x2665C
+0x275D 0x26646
+0x275E 0x26640
+0x275F 0x26A0D
+0x2760 0x26B1B
+0x2761 0x26B1D
+0x2762 0x26B17
+0x2764 0x26B22
+0x2765 0x275A7
+0x2766 0x27608
+0x2767 0x27806
+0x2768 0x2847D
+0x276A 0x28463
+0x276B 0x28464
+0x276C 0x2847F
+0x276D 0x2846B
+0x276E 0x2847C
+0x276F 0x28468
+0x2770 0x28465
+0x2771 0x2846A
+0x2772 0x28698
+0x2773 0x28699
+0x2774 0x286AE
+0x2775 0x28E2B
+0x2776 0x28E2D
+0x2777 0x28E31
+0x2778 0x28E2E
+0x2779 0x28E2F
+0x277A 0x2006D
+0x277B 0x20131
+0x277C 0x2022D
+0x277D 0x20239
+0x277E 0x20238
+0x2822 0x2023A
+0x2823 0x20235
+0x2824 0x20262
+0x2825 0x204EA
+0x2826 0x204EB
+0x2827 0x20515
+0x2828 0x205CC
+0x2829 0x205C8
+0x282A 0x205CD
+0x282B 0x205DB
+0x282C 0x205CB
+0x282D 0x20711
+0x282E 0x20726
+0x282F 0x20862
+0x2830 0x2085E
+0x2831 0x20861
+0x2832 0x20941
+0x2833 0x2093F
+0x2834 0x20975
+0x2835 0x23965
+0x2836 0x20B49
+0x2837 0x209EB
+0x2838 0x20A1A
+0x2839 0x20A57
+0x283A 0x20C6B
+0x283B 0x20CA9
+0x283C 0x20C54
+0x283D 0x20C62
+0x283E 0x20CAA
+0x283F 0x20C58
+0x2840 0x20C72
+0x2841 0x20C63
+0x2842 0x20C73
+0x2843 0x20C8B
+0x2844 0x20C8C
+0x2845 0x20C5C
+0x2846 0x20C51
+0x2847 0x20C16
+0x2848 0x20C60
+0x2849 0x20C61
+0x284A 0x20C5E
+0x284B 0x20C5D
+0x284C 0x20C64
+0x284D 0x20C53
+0x284E 0x20C5F
+0x284F 0x20C5B
+0x2850 0x20C6E
+0x2851 0x20C55
+0x2852 0x20C52
+0x2853 0x20C68
+0x2854 0x211D2
+0x2855 0x211D6
+0x2856 0x211D3
+0x2857 0x212B8
+0x2858 0x212BB
+0x2859 0x212EB
+0x285A 0x212E8
+0x285B 0x212B6
+0x285C 0x212EA
+0x285D 0x212E7
+0x285E 0x212E9
+0x285F 0x21591
+0x2860 0x21610
+0x2861 0x2160E
+0x2862 0x2160F
+0x2863 0x2170B
+0x2864 0x21703
+0x2865 0x2172B
+0x2866 0x21709
+0x2867 0x21728
+0x2868 0x2172C
+0x2869 0x21725
+0x286A 0x21727
+0x286B 0x2170F
+0x286C 0x219E9
+0x286D 0x219EC
+0x286F 0x21B27
+0x2870 0x21B73
+0x2871 0x21BE2
+0x2872 0x21BE6
+0x2873 0x2F876
+0x2874 0x21C61
+0x2875 0x21C51
+0x2876 0x21D12
+0x2877 0x21D0E
+0x2878 0x21DAD
+0x2879 0x21DAF
+0x287A 0x21DB1
+0x287B 0x21DD3
+0x287C 0x22094
+0x287D 0x22092
+0x287E 0x22090
+0x2921 0x2209D
+0x2922 0x22093
+0x2923 0x22095
+0x2924 0x22098
+0x2925 0x22097
+0x2927 0x2F88A
+0x2928 0x22207
+0x2929 0x2220B
+0x292A 0x22208
+0x292B 0x223D9
+0x292C 0x223D5
+0x292D 0x224D7
+0x292E 0x224DF
+0x2930 0x224DE
+0x2931 0x224E3
+0x2932 0x224E2
+0x2934 0x22647
+0x2936 0x2263D
+0x2937 0x22638
+0x2938 0x22A44
+0x2939 0x22A3A
+0x293A 0x22AB8
+0x293B 0x22B2A
+0x293C 0x22B00
+0x293D 0x22AF3
+0x293E 0x22AF2
+0x293F 0x22AEB
+0x2940 0x22AFA
+0x2941 0x22AED
+0x2942 0x22AEC
+0x2943 0x22AFF
+0x2944 0x22AFB
+0x2946 0x22B4E
+0x2947 0x22AEF
+0x2948 0x22AF7
+0x2949 0x22F10
+0x294A 0x22F11
+0x294B 0x22F0C
+0x294C 0x22F0B
+0x294D 0x230DD
+0x294E 0x23130
+0x2950 0x2317A
+0x2951 0x23177
+0x2952 0x23328
+0x2953 0x23327
+0x2954 0x23365
+0x2955 0x2340E
+0x2956 0x2340B
+0x2957 0x23441
+0x2958 0x23413
+0x2959 0x2340F
+0x295A 0x23412
+0x295B 0x23430
+0x295C 0x238A0
+0x295D 0x238A3
+0x295E 0x2389E
+0x295F 0x23897
+0x2960 0x238A1
+0x2961 0x2389D
+0x2962 0x2389B
+0x2963 0x23963
+0x2964 0x239E3
+0x2965 0x239E4
+0x2966 0x239E6
+0x2967 0x239E7
+0x2968 0x239DD
+0x296A 0x239EC
+0x296B 0x239E5
+0x296C 0x239F1
+0x296D 0x23B3B
+0x296E 0x23B39
+0x296F 0x23B3A
+0x2970 0x23B3C
+0x2971 0x23B3D
+0x2972 0x23B47
+0x2973 0x23B3F
+0x2974 0x23B44
+0x2975 0x23C48
+0x2976 0x23C49
+0x2977 0x23C60
+0x2978 0x23CE3
+0x2979 0x23CE9
+0x297A 0x23CF0
+0x297D 0x23CF2
+0x297E 0x23CED
+0x2A21 0x23CEC
+0x2A22 0x23CE6
+0x2A23 0x23D16
+0x2A25 0x241BC
+0x2A26 0x241BE
+0x2A27 0x241C0
+0x2A28 0x241E0
+0x2A29 0x24500
+0x2A2A 0x24502
+0x2A2B 0x244FE
+0x2A2C 0x2455E
+0x2A2D 0x245B3
+0x2A2E 0x245B7
+0x2A2F 0x2463A
+0x2A30 0x24639
+0x2A31 0x2463E
+0x2A32 0x24638
+0x2A33 0x2463D
+0x2A34 0x2464F
+0x2A35 0x2476E
+0x2A36 0x2475F
+0x2A37 0x24781
+0x2A38 0x24782
+0x2A39 0x24771
+0x2A3A 0x2477B
+0x2A3B 0x24779
+0x2A3C 0x24777
+0x2A3D 0x24773
+0x2A3E 0x2476F
+0x2A3F 0x24797
+0x2A40 0x2477E
+0x2A41 0x248FC
+0x2A42 0x24911
+0x2A43 0x24932
+0x2A44 0x24931
+0x2A45 0x24910
+0x2A46 0x24AEC
+0x2A47 0x24AEB
+0x2A48 0x24B2C
+0x2A49 0x24B2D
+0x2A4A 0x24BDA
+0x2A4B 0x24C2E
+0x2A4C 0x24C2C
+0x2A4D 0x24C2A
+0x2A4E 0x24C33
+0x2A4F 0x24C4B
+0x2A50 0x24D18
+0x2A51 0x24D42
+0x2A52 0x24D3B
+0x2A53 0x24D3F
+0x2A54 0x24D41
+0x2A55 0x24D43
+0x2A56 0x24D3C
+0x2A57 0x24F4C
+0x2A58 0x24F4A
+0x2A59 0x24F49
+0x2A5A 0x24F56
+0x2A5B 0x24FCF
+0x2A5C 0x25047
+0x2A5D 0x25048
+0x2A5E 0x25046
+0x2A5F 0x2511B
+0x2A60 0x25111
+0x2A61 0x25114
+0x2A62 0x2511D
+0x2A63 0x25117
+0x2A64 0x2511E
+0x2A65 0x2510B
+0x2A66 0x2511C
+0x2A67 0x25112
+0x2A68 0x25116
+0x2A69 0x2510D
+0x2A6A 0x25115
+0x2A6B 0x25113
+0x2A6C 0x25118
+0x2A6E 0x253AC
+0x2A6F 0x25444
+0x2A70 0x2542C
+0x2A71 0x25445
+0x2A72 0x25766
+0x2A73 0x2576E
+0x2A74 0x25765
+0x2A75 0x25768
+0x2A76 0x25784
+0x2A77 0x25938
+0x2A78 0x2593B
+0x2A79 0x2593A
+0x2A7A 0x2593F
+0x2A7B 0x25ADF
+0x2A7C 0x25ADD
+0x2A7D 0x25ADE
+0x2A7E 0x25AE2
+0x2B22 0x25E2C
+0x2B23 0x25E2F
+0x2B24 0x25F8F
+0x2B25 0x25F90
+0x2B26 0x25F8C
+0x2B27 0x25F93
+0x2B28 0x26225
+0x2B29 0x26288
+0x2B2A 0x262A7
+0x2B2B 0x263F7
+0x2B2C 0x264BB
+0x2B2D 0x26538
+0x2B2E 0x26539
+0x2B2F 0x26537
+0x2B30 0x26614
+0x2B31 0x2666E
+0x2B32 0x2667B
+0x2B34 0x2666C
+0x2B35 0x2667F
+0x2B36 0x26678
+0x2B37 0x2667A
+0x2B38 0x2666F
+0x2B3A 0x268FE
+0x2B3B 0x26B48
+0x2B3C 0x26B4B
+0x2B3D 0x26B41
+0x2B3E 0x26B49
+0x2B3F 0x26B3B
+0x2B40 0x2722D
+0x2B41 0x275E3
+0x2B42 0x2761A
+0x2B43 0x2760D
+0x2B44 0x27613
+0x2B45 0x27611
+0x2B46 0x2761C
+0x2B48 0x278B5
+0x2B4A 0x27C29
+0x2B4B 0x27CA1
+0x2B4C 0x27D24
+0x2B4D 0x27FBB
+0x2B4E 0x282A1
+0x2B4F 0x28483
+0x2B50 0x2848D
+0x2B51 0x28487
+0x2B52 0x28485
+0x2B53 0x2848A
+0x2B54 0x284A3
+0x2B55 0x28489
+0x2B56 0x28484
+0x2B57 0x284A2
+0x2B58 0x286B1
+0x2B59 0x286B0
+0x2B5A 0x286AF
+0x2B5B 0x286B6
+0x2B5C 0x286C9
+0x2B5D 0x286CA
+0x2B5E 0x286C8
+0x2B5F 0x286B4
+0x2B60 0x28C59
+0x2B61 0x28CC9
+0x2B62 0x28E41
+0x2B63 0x28E4C
+0x2B65 0x28E45
+0x2B66 0x28E5A
+0x2B67 0x200B9
+0x2B68 0x20294
+0x2B69 0x2026E
+0x2B6A 0x202A2
+0x2B6B 0x20267
+0x2B6D 0x202A3
+0x2B6E 0x20276
+0x2B6F 0x2026C
+0x2B70 0x20264
+0x2B71 0x202A5
+0x2B72 0x20230
+0x2B73 0x202A6
+0x2B74 0x20269
+0x2B75 0x202A4
+0x2B76 0x20490
+0x2B77 0x2055F
+0x2B78 0x20560
+0x2B79 0x205DA
+0x2B7A 0x205D8
+0x2B7B 0x205DD
+0x2B7D 0x20759
+0x2B7E 0x2075B
+0x2C21 0x2075A
+0x2C22 0x20739
+0x2C23 0x20734
+0x2C24 0x20744
+0x2C25 0x20733
+0x2C26 0x2073C
+0x2C27 0x20758
+0x2C28 0x2076A
+0x2C29 0x2086F
+0x2C2A 0x20872
+0x2C2B 0x20870
+0x2C2C 0x20871
+0x2C2D 0x2086E
+0x2C2E 0x208F0
+0x2C2F 0x208EB
+0x2C30 0x20949
+0x2C31 0x2094C
+0x2C32 0x209F5
+0x2C33 0x20A20
+0x2C34 0x20A6A
+0x2C35 0x20A72
+0x2C36 0x20B4B
+0x2C37 0x20B5D
+0x2C38 0x20C50
+0x2C39 0x20CF9
+0x2C3A 0x20CFA
+0x2C3B 0x20CFB
+0x2C3C 0x20D23
+0x2C3D 0x20CB7
+0x2C3E 0x20D22
+0x2C3F 0x20CB5
+0x2C40 0x20CC4
+0x2C41 0x20CB4
+0x2C42 0x20CEF
+0x2C44 0x20CCD
+0x2C45 0x20CF0
+0x2C46 0x20CB8
+0x2C47 0x20CCB
+0x2C48 0x20CF1
+0x2C49 0x20CBA
+0x2C4A 0x20D03
+0x2C4B 0x20CF8
+0x2C4C 0x20CB6
+0x2C4D 0x20CBC
+0x2C4E 0x20CB3
+0x2C4F 0x20D21
+0x2C50 0x20CF7
+0x2C51 0x20CC2
+0x2C52 0x20CBE
+0x2C53 0x20CC9
+0x2C54 0x20CBD
+0x2C55 0x20CCE
+0x2C56 0x20CB9
+0x2C57 0x20CC7
+0x2C58 0x20CCA
+0x2C59 0x20CCC
+0x2C5A 0x20D26
+0x2C5B 0x211E4
+0x2C5C 0x211E0
+0x2C5D 0x211F0
+0x2C5E 0x212EC
+0x2C5F 0x21324
+0x2C60 0x21318
+0x2C61 0x2132F
+0x2C62 0x21325
+0x2C63 0x21528
+0x2C64 0x21522
+0x2C65 0x2156A
+0x2C66 0x20157
+0x2C67 0x21594
+0x2C68 0x21592
+0x2C69 0x2159C
+0x2C6A 0x21622
+0x2C6B 0x21630
+0x2C6C 0x2161D
+0x2C6D 0x21623
+0x2C6E 0x21735
+0x2C6F 0x21733
+0x2C70 0x2172F
+0x2C71 0x2174D
+0x2C72 0x21731
+0x2C73 0x2175B
+0x2C74 0x2175A
+0x2C75 0x21732
+0x2C76 0x2175C
+0x2C77 0x21759
+0x2C78 0x2175D
+0x2C79 0x21969
+0x2C7A 0x2196D
+0x2C7B 0x22232
+0x2C7D 0x21A0A
+0x2C7E 0x21A20
+0x2D21 0x21A1F
+0x2D22 0x21A0D
+0x2D23 0x21BE8
+0x2D24 0x21BEC
+0x2D25 0x21C77
+0x2D26 0x21C70
+0x2D27 0x21C71
+0x2D28 0x21DF8
+0x2D29 0x21DD6
+0x2D2A 0x21DD9
+0x2D2B 0x21DDE
+0x2D2C 0x21DD5
+0x2D2D 0x21DE1
+0x2D2F 0x21DE2
+0x2D30 0x21DDD
+0x2D31 0x21DE0
+0x2D32 0x21E0E
+0x2D33 0x21E08
+0x2D34 0x21DDC
+0x2D35 0x21E0A
+0x2D36 0x21E0C
+0x2D37 0x220B4
+0x2D38 0x220B1
+0x2D39 0x220B6
+0x2D3A 0x220BC
+0x2D3B 0x2221D
+0x2D3C 0x22224
+0x2D3D 0x22219
+0x2D3E 0x2221B
+0x2D3F 0x22222
+0x2D40 0x2221A
+0x2D41 0x2221C
+0x2D42 0x22221
+0x2D43 0x223E6
+0x2D44 0x223E4
+0x2D45 0x223E7
+0x2D46 0x223EA
+0x2D48 0x2F89B
+0x2D49 0x224F0
+0x2D4A 0x224F5
+0x2D4B 0x224EF
+0x2D4C 0x22642
+0x2D4D 0x2266E
+0x2D4E 0x2263C
+0x2D4F 0x22697
+0x2D50 0x2268C
+0x2D51 0x22681
+0x2D52 0x22671
+0x2D53 0x226CE
+0x2D54 0x226BA
+0x2D55 0x2267A
+0x2D56 0x2267E
+0x2D58 0x22672
+0x2D59 0x226BB
+0x2D5B 0x22673
+0x2D5C 0x22682
+0x2D5E 0x229BA
+0x2D5F 0x229B8
+0x2D60 0x22A4B
+0x2D61 0x22A48
+0x2D62 0x22B2B
+0x2D63 0x22AF4
+0x2D64 0x22B2C
+0x2D65 0x22B42
+0x2D66 0x22B48
+0x2D67 0x22B44
+0x2D68 0x22B45
+0x2D69 0x22B3C
+0x2D6A 0x22B37
+0x2D6B 0x22B33
+0x2D6C 0x22B41
+0x2D6D 0x22B32
+0x2D6E 0x22B87
+0x2D6F 0x22F27
+0x2D70 0x22F23
+0x2D71 0x22F2D
+0x2D72 0x22F1F
+0x2D73 0x22F2C
+0x2D74 0x22F28
+0x2D75 0x23075
+0x2D76 0x23074
+0x2D77 0x230E7
+0x2D78 0x23132
+0x2D79 0x23131
+0x2D7A 0x23199
+0x2D7B 0x23196
+0x2D7C 0x23198
+0x2D7D 0x2319D
+0x2D7E 0x23192
+0x2E21 0x23194
+0x2E22 0x23195
+0x2E23 0x23197
+0x2E24 0x266B9
+0x2E26 0x23411
+0x2E27 0x2343B
+0x2E28 0x23479
+0x2E29 0x23442
+0x2E2A 0x23443
+0x2E2C 0x23478
+0x2E2D 0x238AC
+0x2E2F 0x238B1
+0x2E30 0x238B4
+0x2E31 0x238B3
+0x2E32 0x238AF
+0x2E33 0x238AA
+0x2E34 0x238B2
+0x2E35 0x23968
+0x2E36 0x239F2
+0x2E37 0x239FE
+0x2E38 0x239F8
+0x2E39 0x239F9
+0x2E3A 0x239FF
+0x2E3B 0x239F5
+0x2E3C 0x239F7
+0x2E3D 0x239FD
+0x2E3E 0x23A00
+0x2E3F 0x23A88
+0x2E40 0x23B6E
+0x2E41 0x23B5D
+0x2E42 0x23B63
+0x2E43 0x23B60
+0x2E44 0x23C61
+0x2E45 0x23D37
+0x2E46 0x23D71
+0x2E47 0x23D23
+0x2E48 0x23D22
+0x2E49 0x23D1F
+0x2E4A 0x23D25
+0x2E4B 0x241FD
+0x2E4C 0x24211
+0x2E4D 0x24223
+0x2E4E 0x241F0
+0x2E4F 0x241EF
+0x2E50 0x2450E
+0x2E51 0x2450C
+0x2E52 0x245BA
+0x2E54 0x24652
+0x2E55 0x24655
+0x2E56 0x24653
+0x2E57 0x24654
+0x2E58 0x24651
+0x2E59 0x24658
+0x2E5A 0x247B0
+0x2E5B 0x2479F
+0x2E5D 0x247A1
+0x2E5E 0x2479A
+0x2E5F 0x247BE
+0x2E60 0x247A0
+0x2E61 0x24937
+0x2E63 0x24AF1
+0x2E64 0x24AF2
+0x2E65 0x24B34
+0x2E66 0x24B37
+0x2E67 0x24B35
+0x2E68 0x2238C
+0x2E69 0x24BDF
+0x2E6A 0x24C4C
+0x2E6B 0x24C4E
+0x2E6C 0x24C64
+0x2E6D 0x24C63
+0x2E6E 0x24C36
+0x2E6F 0x24D58
+0x2E70 0x24D68
+0x2E71 0x24D5B
+0x2E72 0x24D5F
+0x2E73 0x24D59
+0x2E74 0x24D65
+0x2E75 0x24D60
+0x2E76 0x24D5E
+0x2E77 0x24FD5
+0x2E78 0x24FD6
+0x2E79 0x2504E
+0x2E7A 0x25052
+0x2E7B 0x25135
+0x2E7C 0x25139
+0x2E7D 0x25158
+0x2E7E 0x25141
+0x2F21 0x25157
+0x2F22 0x25138
+0x2F23 0x2513D
+0x2F24 0x25132
+0x2F25 0x25144
+0x2F26 0x2F944
+0x2F27 0x25363
+0x2F28 0x25362
+0x2F29 0x253B8
+0x2F2A 0x253B0
+0x2F2B 0x253B1
+0x2F2C 0x2544D
+0x2F2D 0x25463
+0x2F2E 0x25470
+0x2F2F 0x2544B
+0x2F30 0x2544F
+0x2F31 0x2544E
+0x2F32 0x25453
+0x2F33 0x25447
+0x2F35 0x25454
+0x2F36 0x25452
+0x2F37 0x25459
+0x2F38 0x2547E
+0x2F39 0x2562B
+0x2F3A 0x2562E
+0x2F3B 0x2577F
+0x2F3C 0x2577E
+0x2F3D 0x25781
+0x2F3E 0x25783
+0x2F3F 0x25947
+0x2F40 0x25954
+0x2F41 0x2594D
+0x2F42 0x2594C
+0x2F43 0x2594B
+0x2F44 0x25957
+0x2F45 0x25A65
+0x2F46 0x25A64
+0x2F47 0x25A61
+0x2F48 0x25A62
+0x2F49 0x25AF0
+0x2F4A 0x25AF3
+0x2F4B 0x25AF9
+0x2F4C 0x25AF4
+0x2F4D 0x25AF5
+0x2F4E 0x25AEF
+0x2F4F 0x25AF8
+0x2F50 0x25AFC
+0x2F51 0x25AF7
+0x2F52 0x25AFD
+0x2F53 0x25B17
+0x2F54 0x25E34
+0x2F55 0x25E36
+0x2F56 0x25E38
+0x2F57 0x25FAF
+0x2F58 0x25FAE
+0x2F59 0x25FAC
+0x2F5A 0x25FA2
+0x2F5B 0x26228
+0x2F5C 0x22EC2
+0x2F5D 0x2629C
+0x2F5E 0x262B3
+0x2F5F 0x26290
+0x2F60 0x26406
+0x2F61 0x26404
+0x2F62 0x2640B
+0x2F63 0x26405
+0x2F64 0x26540
+0x2F65 0x2654F
+0x2F66 0x266AB
+0x2F67 0x2669D
+0x2F68 0x266B8
+0x2F69 0x266B2
+0x2F6A 0x266D2
+0x2F6B 0x266CF
+0x2F6C 0x266A2
+0x2F6E 0x266A5
+0x2F6F 0x266A9
+0x2F70 0x266A7
+0x2F71 0x266D0
+0x2F72 0x26902
+0x2F73 0x269CF
+0x2F74 0x269D0
+0x2F75 0x26A16
+0x2F76 0x26A19
+0x2F77 0x26B75
+0x2F78 0x26B71
+0x2F79 0x26B91
+0x2F7A 0x26B72
+0x2F7B 0x26B8E
+0x2F7C 0x26B6D
+0x2F7D 0x26B88
+0x2F7E 0x26B73
+0x3022 0x26B81
+0x3023 0x26B76
+0x3024 0x26B7B
+0x3025 0x26B7F
+0x3026 0x26B90
+0x3027 0x26B78
+0x3028 0x2724B
+0x3029 0x27248
+0x302A 0x2725B
+0x302B 0x27251
+0x302C 0x2723D
+0x302D 0x27240
+0x302E 0x27246
+0x302F 0x2724D
+0x3030 0x2723B
+0x3031 0x2724A
+0x3032 0x27241
+0x3033 0x2723E
+0x3034 0x2724E
+0x3035 0x275AC
+0x3036 0x275E6
+0x3037 0x275E9
+0x3038 0x27629
+0x303A 0x27633
+0x303B 0x2762E
+0x303C 0x2761E
+0x303E 0x2F9C5
+0x303F 0x27622
+0x3040 0x27627
+0x3041 0x277E7
+0x3042 0x2780B
+0x3043 0x27966
+0x3044 0x27BAD
+0x3045 0x27BAE
+0x3047 0x27C2B
+0x3048 0x27C2A
+0x3049 0x27D2C
+0x304A 0x27D2D
+0x304D 0x27E8F
+0x304E 0x27E93
+0x304F 0x27FC6
+0x3050 0x27FC5
+0x3051 0x28215
+0x3052 0x28213
+0x3053 0x282B1
+0x3054 0x282A9
+0x3056 0x284A8
+0x3057 0x284AB
+0x3058 0x284BE
+0x3059 0x284AC
+0x305A 0x284A9
+0x305B 0x284A6
+0x305C 0x284C1
+0x305D 0x286CC
+0x305E 0x286D1
+0x305F 0x286D3
+0x3060 0x286E4
+0x3061 0x286CB
+0x3062 0x286E1
+0x3063 0x286D2
+0x3064 0x286E3
+0x3065 0x286CF
+0x3066 0x286D0
+0x3067 0x286E5
+0x3068 0x2870E
+0x3069 0x28CCC
+0x306A 0x28CCA
+0x306B 0x28CCB
+0x306C 0x28E5C
+0x306D 0x28E61
+0x306E 0x28E5D
+0x306F 0x28E59
+0x3070 0x29077
+0x3071 0x29684
+0x3072 0x20041
+0x3073 0x200FD
+0x3074 0x2011A
+0x3075 0x20163
+0x3076 0x202B6
+0x3077 0x202B2
+0x3078 0x202E9
+0x3079 0x202E7
+0x307A 0x202D6
+0x307B 0x20330
+0x307C 0x202EC
+0x307D 0x202DD
+0x307E 0x202E8
+0x3121 0x202B0
+0x3122 0x202B5
+0x3123 0x202E1
+0x3124 0x20498
+0x3125 0x20499
+0x3127 0x20593
+0x3128 0x205E5
+0x312A 0x20760
+0x312B 0x2075E
+0x312D 0x2087B
+0x312E 0x208F1
+0x312F 0x208F3
+0x3130 0x20A7F
+0x3131 0x2F838
+0x3132 0x20B57
+0x3133 0x20B58
+0x3134 0x20D39
+0x3135 0x20DA7
+0x3136 0x20D35
+0x3137 0x20D60
+0x3138 0x20D51
+0x3139 0x20D62
+0x313A 0x20D42
+0x313B 0x20D3C
+0x313C 0x20D43
+0x313D 0x20DAB
+0x313E 0x20DA9
+0x313F 0x20DB4
+0x3140 0x20D79
+0x3141 0x20D6A
+0x3142 0x20D3B
+0x3143 0x20DAA
+0x3144 0x20D33
+0x3145 0x20D37
+0x3146 0x20D27
+0x3147 0x20DA8
+0x3148 0x20D70
+0x3149 0x20D2F
+0x314A 0x20D36
+0x314B 0x20DB5
+0x314C 0x20D30
+0x314D 0x20D3A
+0x314E 0x20D38
+0x314F 0x20DB1
+0x3150 0x20DAC
+0x3151 0x20D2E
+0x3152 0x20D75
+0x3153 0x20DB0
+0x3154 0x211F7
+0x3155 0x21200
+0x3156 0x211F1
+0x3157 0x211F3
+0x3158 0x21360
+0x3159 0x21361
+0x315A 0x21332
+0x315B 0x2132D
+0x315C 0x2134A
+0x315D 0x2132A
+0x315E 0x21567
+0x315F 0x215A2
+0x3160 0x215A3
+0x3161 0x2159E
+0x3162 0x215A4
+0x3163 0x21644
+0x3164 0x21632
+0x3165 0x2179B
+0x3166 0x21798
+0x3167 0x21799
+0x3168 0x2179A
+0x3169 0x21766
+0x316A 0x21762
+0x316B 0x2176B
+0x316C 0x24562
+0x316D 0x21767
+0x316E 0x21A3B
+0x316F 0x21A23
+0x3170 0x21A29
+0x3171 0x21B7E
+0x3172 0x21BF3
+0x3174 0x21BF5
+0x3176 0x21C80
+0x3177 0x21C7E
+0x3178 0x21C7C
+0x3179 0x21C7F
+0x317A 0x21C7D
+0x317B 0x21C81
+0x317C 0x21E25
+0x317D 0x21E29
+0x317E 0x21E17
+0x3221 0x21E63
+0x3222 0x21E67
+0x3223 0x21E65
+0x3224 0x21E2A
+0x3225 0x21E68
+0x3226 0x21E26
+0x3227 0x21E64
+0x3228 0x21E1B
+0x3229 0x21E62
+0x322A 0x21E69
+0x322B 0x21FFE
+0x322C 0x22044
+0x322D 0x22042
+0x322E 0x220B7
+0x322F 0x220D2
+0x3230 0x220D4
+0x3231 0x220D7
+0x3232 0x220DC
+0x3233 0x220D1
+0x3234 0x220D5
+0x3235 0x220CD
+0x3236 0x220D8
+0x3237 0x2219A
+0x3238 0x22242
+0x3239 0x22235
+0x323A 0x22258
+0x323B 0x22234
+0x323C 0x2223C
+0x323D 0x2223B
+0x323E 0x2223E
+0x323F 0x2223D
+0x3240 0x2225A
+0x3241 0x22241
+0x3242 0x22238
+0x3243 0x22245
+0x3244 0x22233
+0x3245 0x22326
+0x3247 0x223F7
+0x3248 0x223EF
+0x3249 0x223F0
+0x324A 0x223EE
+0x324B 0x2249D
+0x324C 0x22506
+0x324D 0x22511
+0x324E 0x22508
+0x324F 0x22502
+0x3250 0x2250A
+0x3251 0x22507
+0x3252 0x22691
+0x3253 0x2268E
+0x3254 0x22685
+0x3255 0x226E8
+0x3256 0x22717
+0x3257 0x226D4
+0x3259 0x226C4
+0x325A 0x226D5
+0x325C 0x226D8
+0x325D 0x22680
+0x325E 0x226DE
+0x325F 0x22742
+0x3260 0x229C7
+0x3261 0x229BF
+0x3262 0x22B8D
+0x3263 0x22B89
+0x3264 0x22B90
+0x3265 0x22B9A
+0x3266 0x22BC8
+0x3267 0x22B92
+0x3268 0x22BA1
+0x3269 0x22B84
+0x326A 0x22F57
+0x326B 0x22F47
+0x326C 0x22F77
+0x326D 0x22F3A
+0x326E 0x22F50
+0x326F 0x22F42
+0x3270 0x22F43
+0x3271 0x22FA3
+0x3272 0x23077
+0x3273 0x231B2
+0x3274 0x231E2
+0x3275 0x231BD
+0x3276 0x23374
+0x3277 0x23482
+0x3278 0x234B8
+0x327A 0x234BA
+0x327B 0x234B9
+0x327C 0x234BB
+0x327D 0x23487
+0x327E 0x2F8E4
+0x3321 0x23483
+0x3322 0x234B7
+0x3323 0x20043
+0x3324 0x238CE
+0x3325 0x238BA
+0x3326 0x23973
+0x3327 0x23A09
+0x3328 0x23A0A
+0x3329 0x23A0B
+0x332A 0x23A07
+0x332B 0x23A05
+0x332C 0x23A0E
+0x332D 0x23A97
+0x332E 0x23B77
+0x332F 0x23B7B
+0x3330 0x23B7A
+0x3331 0x23B74
+0x3332 0x23B79
+0x3333 0x23D86
+0x3334 0x23DF5
+0x3335 0x23DA5
+0x3336 0x23D9D
+0x3337 0x23DBE
+0x3338 0x23D96
+0x3339 0x23DE1
+0x333A 0x23DA4
+0x333B 0x23DA1
+0x333C 0x23DF6
+0x333E 0x23D8D
+0x333F 0x23D8B
+0x3340 0x23D78
+0x3341 0x23D98
+0x3342 0x23E0A
+0x3343 0x2425D
+0x3344 0x24227
+0x3345 0x2425F
+0x3346 0x245C0
+0x3347 0x245C1
+0x3348 0x2466D
+0x3349 0x2465E
+0x334A 0x2468A
+0x334B 0x24662
+0x334C 0x24664
+0x334E 0x247C0
+0x334F 0x247CA
+0x3350 0x247D1
+0x3352 0x247C7
+0x3353 0x247CE
+0x3355 0x247C5
+0x3356 0x24936
+0x3357 0x24957
+0x3358 0x24977
+0x3359 0x24AF6
+0x335A 0x24AF7
+0x335B 0x24B55
+0x335C 0x24B44
+0x335D 0x24B3E
+0x335E 0x24B42
+0x335F 0x24B52
+0x3360 0x24BE1
+0x3361 0x24C08
+0x3362 0x24C68
+0x3363 0x24C67
+0x3365 0x2F937
+0x3366 0x24D7E
+0x3367 0x24D93
+0x3368 0x24D79
+0x3369 0x24D81
+0x336A 0x24D7D
+0x336B 0x24D7B
+0x336C 0x24D94
+0x336E 0x24F66
+0x336F 0x24FD9
+0x3370 0x24FE0
+0x3371 0x2F93E
+0x3372 0x2505F
+0x3373 0x2515F
+0x3374 0x2515E
+0x3375 0x25168
+0x3377 0x25188
+0x3378 0x2516A
+0x3379 0x2516C
+0x337A 0x25166
+0x337B 0x25167
+0x337C 0x25189
+0x337D 0x25160
+0x337E 0x25185
+0x3421 0x2032A
+0x3422 0x25368
+0x3423 0x253B9
+0x3424 0x253BA
+0x3425 0x253BE
+0x3426 0x2546F
+0x3427 0x25480
+0x3428 0x25474
+0x3429 0x25481
+0x342A 0x2547A
+0x342B 0x2549C
+0x342C 0x25473
+0x342D 0x25482
+0x342E 0x2547F
+0x342F 0x254A7
+0x3430 0x25479
+0x3431 0x25478
+0x3432 0x2547D
+0x3433 0x254A8
+0x3434 0x2547C
+0x3435 0x25668
+0x3436 0x2564E
+0x3437 0x2579E
+0x343A 0x25798
+0x343C 0x25785
+0x343D 0x2579C
+0x343E 0x257C5
+0x343F 0x2579A
+0x3440 0x25968
+0x3441 0x25965
+0x3442 0x25967
+0x3443 0x25961
+0x3444 0x25960
+0x3447 0x25A7B
+0x3449 0x25B19
+0x344A 0x25B0E
+0x344B 0x25B31
+0x344C 0x25B12
+0x344D 0x25B10
+0x344E 0x25B15
+0x344F 0x25B3F
+0x3450 0x25B1D
+0x3451 0x25B1E
+0x3452 0x25E4D
+0x3453 0x25E48
+0x3454 0x25E45
+0x3455 0x25E42
+0x3456 0x25E49
+0x3457 0x25E4A
+0x3458 0x25E47
+0x345A 0x25E4C
+0x345B 0x25FCD
+0x345C 0x25FD5
+0x345D 0x25FC4
+0x345E 0x25FCA
+0x345F 0x25FC3
+0x3461 0x26229
+0x3462 0x262B4
+0x3463 0x2636D
+0x3464 0x26366
+0x3465 0x2636A
+0x3466 0x26415
+0x3467 0x264D3
+0x3468 0x264EC
+0x3469 0x26555
+0x346B 0x266D6
+0x346C 0x266D8
+0x346D 0x26751
+0x346E 0x266E0
+0x346F 0x26703
+0x3470 0x26704
+0x3471 0x266DA
+0x3472 0x266EA
+0x3473 0x26702
+0x3474 0x266D3
+0x3475 0x266E4
+0x3476 0x266E5
+0x3477 0x2693B
+0x3478 0x26966
+0x3479 0x26A2C
+0x347A 0x26A21
+0x347B 0x26A26
+0x347C 0x26AD4
+0x347D 0x26AD5
+0x347E 0x26AD9
+0x3521 0x26BD5
+0x3522 0x26BEB
+0x3523 0x26BC5
+0x3525 0x26C27
+0x3526 0x26BF0
+0x3527 0x26BB9
+0x3528 0x26C18
+0x3529 0x26BEE
+0x352B 0x26BB7
+0x352C 0x26BBB
+0x352D 0x26BEF
+0x352E 0x26BB8
+0x352F 0x26BDF
+0x3530 0x26BDA
+0x3531 0x26BE3
+0x3532 0x26BC9
+0x3533 0x26BEC
+0x3534 0x271A4
+0x3536 0x271A3
+0x3537 0x2725E
+0x3538 0x27261
+0x3539 0x27262
+0x353A 0x27263
+0x353B 0x2728E
+0x353C 0x27269
+0x353D 0x2726B
+0x353E 0x27285
+0x353F 0x2728D
+0x3540 0x27264
+0x3541 0x2726D
+0x3542 0x2764C
+0x3543 0x27649
+0x3544 0x27647
+0x3545 0x27648
+0x3546 0x27642
+0x3547 0x27645
+0x3548 0x2765B
+0x3549 0x2765D
+0x354A 0x27646
+0x354B 0x27813
+0x354C 0x2781A
+0x354D 0x2780E
+0x354E 0x2780F
+0x354F 0x2781B
+0x3550 0x27812
+0x3551 0x278C3
+0x3552 0x278BE
+0x3553 0x278BD
+0x3554 0x27979
+0x3555 0x2797C
+0x3558 0x27980
+0x3559 0x27975
+0x355A 0x2799B
+0x355C 0x27974
+0x355F 0x22041
+0x3560 0x22494
+0x3561 0x27C30
+0x3562 0x27CA7
+0x3563 0x27CA5
+0x3564 0x27CA4
+0x3565 0x27D3A
+0x3566 0x27E5B
+0x3567 0x27E9F
+0x3568 0x27EA8
+0x3569 0x27EB3
+0x356A 0x27EA1
+0x356B 0x27EA7
+0x356C 0x27EB2
+0x356D 0x27E9D
+0x356E 0x27EA3
+0x356F 0x27EA2
+0x3570 0x27FEF
+0x3571 0x27FD9
+0x3573 0x27FD5
+0x3574 0x27FDD
+0x3575 0x27FDA
+0x3576 0x27FEE
+0x3577 0x27FD7
+0x3578 0x2821A
+0x3579 0x28219
+0x357A 0x28218
+0x357B 0x282B3
+0x357C 0x282BF
+0x357D 0x282BB
+0x357E 0x282C0
+0x3621 0x282B9
+0x3622 0x282B8
+0x3623 0x282D5
+0x3624 0x28411
+0x3625 0x28410
+0x3626 0x284C3
+0x3627 0x284C2
+0x3628 0x284E9
+0x3629 0x284CD
+0x362A 0x284E5
+0x362B 0x284CA
+0x362C 0x284C7
+0x362D 0x284E8
+0x362E 0x286F1
+0x362F 0x2870C
+0x3630 0x286EF
+0x3631 0x286EE
+0x3632 0x286F3
+0x3633 0x2870D
+0x3634 0x286F6
+0x3635 0x286F0
+0x3637 0x287F5
+0x3638 0x287F4
+0x3639 0x287F8
+0x363A 0x287FE
+0x363B 0x28911
+0x363C 0x28922
+0x363D 0x28942
+0x363E 0x28C5C
+0x363F 0x28C5A
+0x3640 0x28C5D
+0x3641 0x28CD1
+0x3642 0x28CD0
+0x3643 0x28E75
+0x3644 0x28E7B
+0x3645 0x28F89
+0x3646 0x2944D
+0x3647 0x29689
+0x3648 0x29692
+0x3649 0x2968C
+0x364A 0x29688
+0x364B 0x29867
+0x364C 0x29868
+0x364D 0x20321
+0x364E 0x202F2
+0x364F 0x20309
+0x3650 0x202F8
+0x3651 0x202F0
+0x3652 0x202F3
+0x3653 0x202F5
+0x3654 0x202FB
+0x3655 0x202F7
+0x3656 0x202EF
+0x3657 0x2030B
+0x3658 0x204A2
+0x3659 0x205F5
+0x365A 0x205F3
+0x365B 0x205F4
+0x365C 0x205F2
+0x365D 0x20698
+0x365E 0x20768
+0x365F 0x20780
+0x3660 0x20785
+0x3661 0x2078E
+0x3662 0x2078F
+0x3663 0x202F4
+0x3664 0x20786
+0x3665 0x207A4
+0x3666 0x20886
+0x3667 0x20889
+0x3668 0x20887
+0x3669 0x20885
+0x366B 0x20888
+0x366C 0x20AFF
+0x366D 0x20B66
+0x366F 0x20DC3
+0x3671 0x20DC4
+0x3672 0x20E3B
+0x3673 0x20DE7
+0x3674 0x20DF8
+0x3675 0x20DFB
+0x3677 0x20DBE
+0x3678 0x20DC6
+0x367B 0x20DFC
+0x367C 0x20DC0
+0x367D 0x20E33
+0x367E 0x20DC9
+0x3721 0x20DFE
+0x3722 0x20DDA
+0x3723 0x20DCC
+0x3724 0x20DBB
+0x3725 0x20DFD
+0x3726 0x20DDF
+0x3727 0x20DCD
+0x3728 0x20DC2
+0x3729 0x20DC8
+0x372A 0x20E32
+0x372B 0x20E2D
+0x372C 0x20DD2
+0x372D 0x20E31
+0x372E 0x20DD3
+0x372F 0x20E2E
+0x3730 0x20DCF
+0x3731 0x211FF
+0x3732 0x21209
+0x3733 0x211FC
+0x3734 0x21372
+0x3735 0x213AA
+0x3736 0x213AB
+0x3737 0x213A7
+0x3738 0x2137B
+0x3739 0x21376
+0x373A 0x213A8
+0x373B 0x213AC
+0x373E 0x215AA
+0x373F 0x20A03
+0x3740 0x215AC
+0x3741 0x215AD
+0x3742 0x215AB
+0x3743 0x21650
+0x3744 0x21658
+0x3745 0x217DD
+0x3747 0x217AE
+0x3748 0x217A2
+0x3749 0x217AB
+0x374A 0x217E3
+0x374B 0x217AF
+0x374C 0x217E0
+0x374D 0x217E4
+0x374F 0x217A7
+0x3750 0x217AA
+0x3751 0x217E2
+0x3752 0x217E1
+0x3753 0x217DF
+0x3754 0x217AD
+0x3755 0x217E5
+0x3756 0x217D1
+0x3757 0x217AC
+0x3758 0x217D5
+0x3759 0x217A3
+0x375A 0x2179F
+0x375B 0x21979
+0x375C 0x21976
+0x375D 0x21A43
+0x375E 0x21A3D
+0x375F 0x21A47
+0x3760 0x21A44
+0x3761 0x21A3F
+0x3762 0x21A5B
+0x3763 0x21B7F
+0x3764 0x21C9A
+0x3765 0x21C9C
+0x3767 0x21D1E
+0x3768 0x21E88
+0x3769 0x21E6A
+0x376A 0x21E76
+0x376B 0x21E72
+0x376C 0x21E70
+0x376D 0x21E7E
+0x376E 0x21E6C
+0x376F 0x21E6F
+0x3770 0x21E75
+0x3771 0x21E77
+0x3772 0x21E78
+0x3773 0x21E8A
+0x3774 0x21E79
+0x3775 0x21E94
+0x3776 0x22001
+0x3777 0x22105
+0x3778 0x220F1
+0x3779 0x220EE
+0x377A 0x220EF
+0x377B 0x22104
+0x377D 0x220FA
+0x377E 0x22107
+0x3821 0x220F4
+0x3822 0x220F5
+0x3823 0x2219C
+0x3824 0x2226D
+0x3825 0x22269
+0x3826 0x22266
+0x3827 0x22262
+0x3828 0x22246
+0x382A 0x22265
+0x382B 0x2225D
+0x382C 0x2225E
+0x382D 0x2225F
+0x382E 0x2238E
+0x382F 0x22402
+0x3830 0x22406
+0x3831 0x22404
+0x3832 0x22403
+0x3833 0x22462
+0x3834 0x22527
+0x3835 0x22521
+0x3836 0x22520
+0x3837 0x22524
+0x3838 0x22529
+0x3839 0x22531
+0x383A 0x22523
+0x383B 0x22522
+0x383C 0x226DC
+0x383D 0x2274D
+0x383E 0x226E5
+0x383F 0x226D3
+0x3840 0x226EE
+0x3841 0x226E6
+0x3843 0x22736
+0x3844 0x22740
+0x3845 0x2283F
+0x3846 0x2273D
+0x3847 0x22744
+0x3849 0x2275F
+0x384A 0x22729
+0x384B 0x22749
+0x384C 0x2278A
+0x384D 0x2272A
+0x384E 0x22787
+0x384F 0x2274C
+0x3850 0x22731
+0x3851 0x22748
+0x3852 0x2272B
+0x3853 0x2273B
+0x3854 0x22741
+0x3855 0x226C9
+0x3856 0x22734
+0x3857 0x22753
+0x3858 0x22735
+0x3859 0x22747
+0x385A 0x22738
+0x385B 0x229D1
+0x385C 0x229D2
+0x385D 0x22A51
+0x385E 0x22A55
+0x385F 0x22A52
+0x3860 0x22A53
+0x3861 0x22B8F
+0x3862 0x22BF4
+0x3863 0x22C47
+0x3864 0x22C0D
+0x3865 0x22C1C
+0x3866 0x22BFB
+0x3867 0x22C19
+0x3868 0x22BF7
+0x3869 0x22BF9
+0x386A 0x22BF5
+0x386B 0x22BE9
+0x386C 0x22C0A
+0x386D 0x22BEE
+0x386E 0x22C0B
+0x386F 0x22BFD
+0x3870 0x22C06
+0x3871 0x22C02
+0x3872 0x22C16
+0x3873 0x22C18
+0x3874 0x22BF0
+0x3875 0x22ED4
+0x3876 0x22F66
+0x3877 0x22F6A
+0x3878 0x22F75
+0x3879 0x22F76
+0x387A 0x22F80
+0x387B 0x22F6D
+0x387D 0x22F69
+0x387E 0x22F67
+0x3921 0x22F68
+0x3922 0x22F5D
+0x3923 0x230A4
+0x3924 0x230FE
+0x3925 0x230FD
+0x3926 0x231EC
+0x3927 0x231E9
+0x3928 0x23221
+0x3929 0x231EB
+0x392A 0x231E7
+0x392B 0x231F2
+0x392C 0x23220
+0x392D 0x2337A
+0x392E 0x2352D
+0x392F 0x2352E
+0x3930 0x234CA
+0x3931 0x2352F
+0x3932 0x234C8
+0x3934 0x234CB
+0x3935 0x234C3
+0x3936 0x23484
+0x3937 0x234D2
+0x3938 0x234C6
+0x393A 0x234CF
+0x393B 0x234D5
+0x393C 0x234D4
+0x393D 0x234DD
+0x393E 0x2352B
+0x393F 0x235A3
+0x3940 0x234DB
+0x3941 0x2352C
+0x3942 0x23513
+0x3944 0x238D1
+0x3945 0x238CC
+0x3946 0x238D5
+0x3947 0x238C9
+0x3948 0x238CF
+0x3949 0x238D2
+0x394A 0x2397B
+0x394B 0x2397C
+0x394C 0x23A23
+0x394D 0x23A1D
+0x394E 0x23A1C
+0x394F 0x23A1E
+0x3950 0x23A22
+0x3951 0x23A24
+0x3952 0x23A20
+0x3953 0x23A18
+0x3954 0x23A21
+0x3955 0x23B88
+0x3956 0x23B8A
+0x3957 0x23B94
+0x3958 0x23B8F
+0x3959 0x23B8E
+0x395A 0x23B90
+0x395C 0x23BA7
+0x395D 0x23C64
+0x395F 0x23E18
+0x3960 0x23E14
+0x3961 0x23E1D
+0x3962 0x23E05
+0x3963 0x23DFF
+0x3964 0x23E1B
+0x3965 0x23E1A
+0x3966 0x23E19
+0x3967 0x23E03
+0x3968 0x23E0E
+0x3969 0x23E47
+0x396A 0x23E04
+0x396B 0x23E5A
+0x396C 0x23E07
+0x396D 0x23E20
+0x396E 0x2426A
+0x396F 0x24266
+0x3970 0x2427A
+0x3971 0x24265
+0x3972 0x242AF
+0x3973 0x245CD
+0x3974 0x245CF
+0x3975 0x245D1
+0x3976 0x245CE
+0x3977 0x2465F
+0x3978 0x24677
+0x3979 0x24674
+0x397A 0x24688
+0x397B 0x24675
+0x397C 0x24689
+0x397D 0x24672
+0x397E 0x247C6
+0x3A21 0x247EA
+0x3A22 0x247E0
+0x3A23 0x24807
+0x3A24 0x247E6
+0x3A25 0x247E5
+0x3A26 0x247DD
+0x3A27 0x247E3
+0x3A28 0x247DA
+0x3A29 0x249AE
+0x3A2A 0x2497E
+0x3A2B 0x2497D
+0x3A2C 0x2497F
+0x3A2E 0x249D9
+0x3A2F 0x24AFA
+0x3A30 0x24AFB
+0x3A31 0x24B4D
+0x3A32 0x24B54
+0x3A33 0x24B51
+0x3A34 0x24B50
+0x3A35 0x24D98
+0x3A36 0x24D95
+0x3A37 0x24D9D
+0x3A38 0x24DC1
+0x3A39 0x24D9A
+0x3A3A 0x24D9B
+0x3A3C 0x24D9C
+0x3A3D 0x24DD7
+0x3A3E 0x24DA4
+0x3A3F 0x24D96
+0x3A40 0x24DA0
+0x3A41 0x24F31
+0x3A42 0x24FE9
+0x3A43 0x2506E
+0x3A44 0x2519A
+0x3A45 0x251A5
+0x3A46 0x25194
+0x3A47 0x251A6
+0x3A48 0x25199
+0x3A49 0x2518B
+0x3A4A 0x25198
+0x3A4B 0x25191
+0x3A4C 0x2518C
+0x3A4D 0x251A1
+0x3A4E 0x251A3
+0x3A4F 0x251C6
+0x3A50 0x2536F
+0x3A51 0x2536D
+0x3A52 0x2536A
+0x3A53 0x2536C
+0x3A54 0x25371
+0x3A55 0x2536E
+0x3A56 0x253DF
+0x3A57 0x254AC
+0x3A58 0x254AA
+0x3A5A 0x254B5
+0x3A5B 0x254AD
+0x3A5C 0x254B2
+0x3A5D 0x254B3
+0x3A5E 0x254AB
+0x3A5F 0x254B6
+0x3A60 0x254C7
+0x3A61 0x254C6
+0x3A62 0x2566C
+0x3A63 0x25670
+0x3A64 0x257B3
+0x3A66 0x2598C
+0x3A67 0x25981
+0x3A68 0x25983
+0x3A69 0x2597D
+0x3A6A 0x25985
+0x3A6B 0x25990
+0x3A6C 0x259A2
+0x3A6D 0x2598D
+0x3A6E 0x2598F
+0x3A6F 0x2597E
+0x3A70 0x2598A
+0x3A71 0x2597F
+0x3A72 0x25976
+0x3A73 0x25987
+0x3A74 0x25978
+0x3A75 0x25A80
+0x3A76 0x25A82
+0x3A77 0x25A81
+0x3A78 0x25A83
+0x3A79 0x25B5A
+0x3A7A 0x25B34
+0x3A7B 0x25B2C
+0x3A7C 0x25B2A
+0x3A7D 0x25B40
+0x3A7E 0x25B2D
+0x3B21 0x25B33
+0x3B22 0x25B2B
+0x3B23 0x25B4B
+0x3B25 0x25B3C
+0x3B26 0x25E5A
+0x3B27 0x25E77
+0x3B28 0x25E60
+0x3B29 0x25FFA
+0x3B2A 0x25FF9
+0x3B2B 0x25FFC
+0x3B2D 0x25FF5
+0x3B2E 0x25FE8
+0x3B2F 0x26009
+0x3B30 0x25FE7
+0x3B31 0x25FE6
+0x3B32 0x25FE9
+0x3B33 0x26232
+0x3B34 0x2622C
+0x3B35 0x262BD
+0x3B36 0x262BC
+0x3B37 0x2637A
+0x3B38 0x2637E
+0x3B39 0x26379
+0x3B3B 0x26423
+0x3B3C 0x26430
+0x3B3D 0x26428
+0x3B3E 0x264D4
+0x3B3F 0x26ACE
+0x3B40 0x264F1
+0x3B41 0x264F0
+0x3B42 0x26560
+0x3B43 0x26565
+0x3B44 0x266A8
+0x3B45 0x2670A
+0x3B46 0x2671B
+0x3B47 0x26712
+0x3B48 0x26707
+0x3B49 0x2674F
+0x3B4A 0x2670E
+0x3B4B 0x26752
+0x3B4C 0x26716
+0x3B4E 0x26753
+0x3B4F 0x26754
+0x3B50 0x2F984
+0x3B51 0x26756
+0x3B52 0x2696D
+0x3B53 0x26972
+0x3B54 0x26A2F
+0x3B55 0x26C2A
+0x3B57 0x26C63
+0x3B58 0x26C84
+0x3B59 0x26CAF
+0x3B5A 0x26C45
+0x3B5B 0x26C70
+0x3B5C 0x26C56
+0x3B5D 0x26C16
+0x3B5E 0x26C3D
+0x3B5F 0x26C38
+0x3B60 0x26C6F
+0x3B61 0x26C77
+0x3B62 0x26C2E
+0x3B63 0x26C31
+0x3B64 0x26C4C
+0x3B65 0x26C5F
+0x3B66 0x26C75
+0x3B67 0x26C39
+0x3B68 0x26C3A
+0x3B69 0x26C2C
+0x3B6A 0x26C2D
+0x3B6B 0x26C3F
+0x3B6C 0x26C2F
+0x3B6D 0x26C30
+0x3B6E 0x26C3E
+0x3B71 0x271B2
+0x3B72 0x272B7
+0x3B73 0x2728F
+0x3B75 0x27296
+0x3B76 0x2729E
+0x3B77 0x27297
+0x3B78 0x27295
+0x3B79 0x272A5
+0x3B7A 0x27298
+0x3B7C 0x272A3
+0x3B7D 0x2729A
+0x3B7E 0x272AD
+0x3C21 0x272A6
+0x3C22 0x272B6
+0x3C23 0x27299
+0x3C24 0x272AF
+0x3C25 0x272AC
+0x3C27 0x2729F
+0x3C28 0x27294
+0x3C29 0x275EB
+0x3C2A 0x2766F
+0x3C2B 0x2766D
+0x3C2C 0x2767E
+0x3C2D 0x2766C
+0x3C2E 0x27661
+0x3C2F 0x27663
+0x3C30 0x2766B
+0x3C31 0x2765E
+0x3C32 0x2763E
+0x3C33 0x27664
+0x3C34 0x276AD
+0x3C36 0x27820
+0x3C37 0x278D1
+0x3C38 0x278D5
+0x3C39 0x279AE
+0x3C3A 0x279AF
+0x3C3B 0x2799F
+0x3C3C 0x279A8
+0x3C3D 0x279CA
+0x3C3E 0x27BE1
+0x3C3F 0x27C39
+0x3C40 0x27C38
+0x3C41 0x27C3B
+0x3C42 0x27CAD
+0x3C43 0x27CB5
+0x3C44 0x27CAF
+0x3C45 0x27CB1
+0x3C46 0x27CAE
+0x3C47 0x27CB4
+0x3C48 0x27CB0
+0x3C49 0x27D4B
+0x3C4A 0x27D51
+0x3C4B 0x27D4C
+0x3C4D 0x27D60
+0x3C4E 0x27EBE
+0x3C4F 0x27EB9
+0x3C50 0x27EB7
+0x3C51 0x27EB6
+0x3C53 0x27EBD
+0x3C54 0x27EB8
+0x3C55 0x27EC1
+0x3C56 0x27FF7
+0x3C57 0x27FF3
+0x3C58 0x27FF4
+0x3C59 0x27FFB
+0x3C5A 0x27FFD
+0x3C5B 0x27FF5
+0x3C5D 0x27FFA
+0x3C5E 0x28014
+0x3C60 0x27FF2
+0x3C61 0x27FFC
+0x3C62 0x28000
+0x3C64 0x2822B
+0x3C65 0x28229
+0x3C66 0x2822E
+0x3C68 0x282D7
+0x3C69 0x282DB
+0x3C6A 0x282D9
+0x3C6B 0x282D8
+0x3C6C 0x282E6
+0x3C6D 0x282D6
+0x3C6E 0x282D1
+0x3C6F 0x282E7
+0x3C70 0x282D0
+0x3C71 0x282DC
+0x3C72 0x284ED
+0x3C73 0x2851A
+0x3C74 0x28519
+0x3C75 0x28516
+0x3C76 0x284EC
+0x3C77 0x284EF
+0x3C78 0x284EE
+0x3C79 0x284F4
+0x3C7A 0x2852F
+0x3C7B 0x28730
+0x3C7C 0x28719
+0x3C7D 0x28718
+0x3C7E 0x28711
+0x3D21 0x28716
+0x3D22 0x28712
+0x3D23 0x28710
+0x3D24 0x28714
+0x3D25 0x2880C
+0x3D26 0x2880D
+0x3D27 0x28910
+0x3D28 0x28929
+0x3D29 0x28928
+0x3D2A 0x28C65
+0x3D2B 0x28C66
+0x3D2C 0x28CDE
+0x3D2D 0x28CDF
+0x3D2E 0x28CE0
+0x3D2F 0x28CD9
+0x3D30 0x28CDB
+0x3D31 0x28CD8
+0x3D32 0x28CE3
+0x3D33 0x28CD7
+0x3D34 0x28EA6
+0x3D35 0x28EA7
+0x3D36 0x28EBF
+0x3D37 0x28EA8
+0x3D38 0x28E9F
+0x3D39 0x28EA1
+0x3D3A 0x28EA2
+0x3D3B 0x28EAD
+0x3D3C 0x28EA3
+0x3D3D 0x28EA0
+0x3D3E 0x29083
+0x3D3F 0x29085
+0x3D40 0x29082
+0x3D41 0x29084
+0x3D42 0x291EE
+0x3D43 0x2925D
+0x3D44 0x29392
+0x3D45 0x29455
+0x3D46 0x29453
+0x3D47 0x2F9FC
+0x3D48 0x29451
+0x3D49 0x29452
+0x3D4A 0x29450
+0x3D4B 0x2959D
+0x3D4C 0x29687
+0x3D4D 0x29697
+0x3D4E 0x2969B
+0x3D4F 0x2969D
+0x3D50 0x29869
+0x3D51 0x29A11
+0x3D53 0x29C7A
+0x3D55 0x23244
+0x3D56 0x200C6
+0x3D57 0x20340
+0x3D58 0x2032E
+0x3D59 0x20368
+0x3D5A 0x2032D
+0x3D5B 0x20334
+0x3D5C 0x20332
+0x3D5D 0x20369
+0x3D5E 0x20331
+0x3D5F 0x2036A
+0x3D60 0x2033E
+0x3D61 0x2036F
+0x3D62 0x20375
+0x3D63 0x204F6
+0x3D64 0x20520
+0x3D65 0x20528
+0x3D66 0x20567
+0x3D67 0x205FB
+0x3D68 0x205FE
+0x3D69 0x205FC
+0x3D6A 0x205FD
+0x3D6B 0x205FF
+0x3D6C 0x205FA
+0x3D6D 0x207AC
+0x3D6E 0x207AF
+0x3D6F 0x207B1
+0x3D71 0x207BF
+0x3D72 0x207BE
+0x3D73 0x207A7
+0x3D74 0x207AA
+0x3D75 0x20894
+0x3D76 0x20893
+0x3D77 0x20899
+0x3D79 0x208FA
+0x3D7A 0x20956
+0x3D7B 0x20A22
+0x3D7C 0x20A91
+0x3D7D 0x20A92
+0x3D7E 0x20B08
+0x3E21 0x20B06
+0x3E22 0x20DD6
+0x3E23 0x20E37
+0x3E24 0x20E4B
+0x3E25 0x20ECE
+0x3E26 0x20ED0
+0x3E27 0x20E39
+0x3E28 0x20E64
+0x3E29 0x20ECF
+0x3E2A 0x20E46
+0x3E2B 0x20E66
+0x3E2C 0x20E56
+0x3E2D 0x20E43
+0x3E2E 0x20E4A
+0x3E2F 0x20E58
+0x3E30 0x20E65
+0x3E31 0x20E5A
+0x3E32 0x20E5B
+0x3E33 0x20E55
+0x3E34 0x20E50
+0x3E35 0x20E4C
+0x3E36 0x20ECD
+0x3E37 0x20E51
+0x3E38 0x20E47
+0x3E3A 0x20E53
+0x3E3B 0x20E62
+0x3E3C 0x20ECC
+0x3E3E 0x20E7F
+0x3E3F 0x20E4D
+0x3E40 0x2120A
+0x3E41 0x2120C
+0x3E42 0x2120F
+0x3E43 0x213BB
+0x3E44 0x213B9
+0x3E45 0x213EB
+0x3E46 0x213AE
+0x3E47 0x213C1
+0x3E48 0x213EA
+0x3E49 0x213BE
+0x3E4A 0x213BF
+0x3E4B 0x213BA
+0x3E4C 0x213B7
+0x3E4D 0x213B3
+0x3E4E 0x213E9
+0x3E4F 0x2156E
+0x3E50 0x215AF
+0x3E51 0x215B3
+0x3E52 0x215B2
+0x3E53 0x21668
+0x3E54 0x21669
+0x3E55 0x2166A
+0x3E56 0x217DE
+0x3E57 0x217EB
+0x3E58 0x21811
+0x3E59 0x217ED
+0x3E5A 0x217E9
+0x3E5B 0x217F7
+0x3E5C 0x217F4
+0x3E5D 0x217EA
+0x3E5E 0x21812
+0x3E5F 0x217E8
+0x3E60 0x21813
+0x3E61 0x2198E
+0x3E62 0x21986
+0x3E63 0x21A63
+0x3E64 0x21A65
+0x3E65 0x21B99
+0x3E66 0x21CC2
+0x3E67 0x21CAE
+0x3E68 0x21CB0
+0x3E69 0x21CAD
+0x3E6A 0x21EB4
+0x3E6B 0x21ED1
+0x3E6C 0x21EAD
+0x3E6E 0x21EBD
+0x3E6F 0x21EB7
+0x3E70 0x21EAB
+0x3E71 0x21EAF
+0x3E72 0x21EC1
+0x3E73 0x21EB5
+0x3E74 0x2210F
+0x3E75 0x2210E
+0x3E76 0x2211C
+0x3E77 0x22113
+0x3E78 0x2210A
+0x3E79 0x2211E
+0x3E7A 0x22114
+0x3E7B 0x2211A
+0x3E7C 0x221CB
+0x3E7D 0x22287
+0x3E7E 0x22293
+0x3F22 0x22284
+0x3F23 0x22285
+0x3F24 0x22292
+0x3F25 0x22280
+0x3F26 0x2232B
+0x3F27 0x22363
+0x3F28 0x2240A
+0x3F2A 0x22466
+0x3F2B 0x22534
+0x3F2C 0x22533
+0x3F2D 0x2254D
+0x3F2E 0x22789
+0x3F2F 0x22757
+0x3F31 0x2274A
+0x3F33 0x22739
+0x3F34 0x2273F
+0x3F35 0x22790
+0x3F36 0x2278F
+0x3F37 0x227B2
+0x3F38 0x2279F
+0x3F39 0x22795
+0x3F3A 0x227A1
+0x3F3B 0x2279C
+0x3F3C 0x2278E
+0x3F3D 0x227A0
+0x3F3E 0x227AE
+0x3F3F 0x22796
+0x3F40 0x227CA
+0x3F41 0x227AC
+0x3F43 0x227A6
+0x3F44 0x22797
+0x3F45 0x22793
+0x3F46 0x203B6
+0x3F47 0x229D6
+0x3F48 0x229E0
+0x3F49 0x229D8
+0x3F4A 0x22A56
+0x3F4B 0x22C6E
+0x3F4C 0x22C7E
+0x3F4D 0x22C74
+0x3F4E 0x22C77
+0x3F4F 0x22C80
+0x3F50 0x22C7A
+0x3F51 0x22C6B
+0x3F52 0x22C5F
+0x3F53 0x22C76
+0x3F54 0x22CB0
+0x3F55 0x22C63
+0x3F56 0x22F92
+0x3F57 0x22F82
+0x3F58 0x22F9D
+0x3F59 0x22F94
+0x3F5A 0x22F83
+0x3F5B 0x22F8B
+0x3F5C 0x22F84
+0x3F5D 0x23057
+0x3F5E 0x23084
+0x3F5F 0x230B5
+0x3F60 0x23109
+0x3F61 0x231E6
+0x3F63 0x23225
+0x3F64 0x23251
+0x3F65 0x2333E
+0x3F66 0x2F8DA
+0x3F67 0x23385
+0x3F68 0x2353F
+0x3F69 0x23542
+0x3F6A 0x23538
+0x3F6B 0x2353A
+0x3F6C 0x2354E
+0x3F6D 0x23545
+0x3F6E 0x23539
+0x3F6F 0x23537
+0x3F70 0x23544
+0x3F71 0x2F8E7
+0x3F72 0x235A4
+0x3F73 0x2353D
+0x3F74 0x23541
+0x3F75 0x238DF
+0x3F76 0x238DE
+0x3F77 0x238CA
+0x3F78 0x238E9
+0x3F79 0x238E2
+0x3F7A 0x238E0
+0x3F7B 0x23989
+0x3F7C 0x23987
+0x3F7D 0x23A32
+0x3F7E 0x23A33
+0x4021 0x23AAC
+0x4022 0x23AF9
+0x4023 0x23B0D
+0x4024 0x23BB9
+0x4025 0x23E5E
+0x4026 0x23E6A
+0x4028 0x23E81
+0x4029 0x23E69
+0x402A 0x23EAC
+0x402B 0x23E80
+0x402C 0x23E75
+0x402D 0x23E71
+0x402E 0x23E76
+0x402F 0x23E6F
+0x4030 0x242B6
+0x4031 0x24303
+0x4032 0x242BF
+0x4033 0x24301
+0x4034 0x242B2
+0x4035 0x242C4
+0x4036 0x245DB
+0x4037 0x245DC
+0x4038 0x245D8
+0x4039 0x29672
+0x403A 0x246B5
+0x403B 0x246A8
+0x403C 0x2468F
+0x403D 0x2469E
+0x403E 0x2468E
+0x403F 0x247DE
+0x4040 0x247E2
+0x4041 0x24820
+0x4042 0x2481D
+0x4043 0x2481A
+0x4044 0x24819
+0x4045 0x2482B
+0x4046 0x24818
+0x4047 0x24810
+0x4048 0x2480E
+0x4049 0x24824
+0x404A 0x2481F
+0x404B 0x24813
+0x404C 0x24835
+0x404D 0x24983
+0x404F 0x249D7
+0x4050 0x24B02
+0x4051 0x24B03
+0x4052 0x24B5C
+0x4053 0x24B5F
+0x4054 0x24BC7
+0x4055 0x24C9A
+0x4056 0x24C97
+0x4057 0x24CA3
+0x4058 0x24DF7
+0x4059 0x24DC6
+0x405A 0x24DCC
+0x405B 0x24DD6
+0x405C 0x24DCD
+0x405D 0x24DF9
+0x405E 0x24DD9
+0x405F 0x24DD8
+0x4061 0x24DD1
+0x4062 0x24DCE
+0x4063 0x24DD5
+0x4065 0x24DD4
+0x4066 0x24DF8
+0x4067 0x24F7A
+0x4068 0x24F79
+0x4069 0x24F7F
+0x406A 0x24FF3
+0x406B 0x24FF5
+0x406C 0x24FF6
+0x406D 0x24FF4
+0x406E 0x24FF7
+0x4070 0x25079
+0x4071 0x2519C
+0x4072 0x251DF
+0x4073 0x251F5
+0x4074 0x251FF
+0x4075 0x251D1
+0x4076 0x251DA
+0x4077 0x251CF
+0x4078 0x251CD
+0x4079 0x251DE
+0x407A 0x251D8
+0x407B 0x23AAD
+0x407C 0x251E0
+0x407D 0x251FE
+0x407E 0x2519E
+0x4121 0x25375
+0x4122 0x25373
+0x4123 0x25372
+0x4124 0x253D8
+0x4125 0x254D0
+0x4126 0x254D6
+0x4127 0x254D7
+0x4128 0x254CA
+0x4129 0x254CD
+0x412A 0x2568A
+0x412B 0x25689
+0x412C 0x2568B
+0x412D 0x257D3
+0x412E 0x257DA
+0x412F 0x257CE
+0x4130 0x257D2
+0x4132 0x257D4
+0x4133 0x257D7
+0x4134 0x257D5
+0x4135 0x257FB
+0x4136 0x257CD
+0x4137 0x257FA
+0x4138 0x257D6
+0x413A 0x2599B
+0x413B 0x2599E
+0x413C 0x2599D
+0x413D 0x259A4
+0x413E 0x2599F
+0x413F 0x259A5
+0x4140 0x259A8
+0x4141 0x25A8F
+0x4142 0x25A8C
+0x4143 0x25A95
+0x4144 0x25B60
+0x4145 0x25B55
+0x4146 0x25B5C
+0x4147 0x25B6F
+0x4148 0x25B51
+0x4149 0x25B61
+0x414A 0x25BA7
+0x414B 0x25B5E
+0x414C 0x25B62
+0x414D 0x25B54
+0x414E 0x25B6E
+0x414F 0x25B52
+0x4150 0x25B58
+0x4151 0x25B6D
+0x4152 0x25B5F
+0x4153 0x25B6C
+0x4154 0x25B50
+0x4155 0x25B5D
+0x4156 0x25B8E
+0x4157 0x25E72
+0x4158 0x25E78
+0x4159 0x25E75
+0x415A 0x25E76
+0x415B 0x25E7C
+0x415C 0x25E7E
+0x415D 0x25E7D
+0x415E 0x26015
+0x415F 0x26014
+0x4160 0x2601D
+0x4161 0x2601C
+0x4162 0x26023
+0x4163 0x26057
+0x4164 0x262C8
+0x4166 0x262C9
+0x4167 0x262C5
+0x4168 0x26387
+0x4169 0x2638A
+0x416A 0x26394
+0x416B 0x26439
+0x416C 0x26440
+0x416D 0x2643E
+0x416E 0x26438
+0x416F 0x264D6
+0x4171 0x26577
+0x4172 0x26578
+0x4173 0x2657D
+0x4174 0x266DD
+0x4175 0x2675E
+0x4176 0x26777
+0x4177 0x267D4
+0x4178 0x26766
+0x4179 0x2675F
+0x417A 0x26773
+0x417B 0x26772
+0x417C 0x26797
+0x417D 0x2675A
+0x417E 0x26796
+0x4221 0x2675D
+0x4222 0x26765
+0x4223 0x26770
+0x4224 0x26775
+0x4225 0x26774
+0x4226 0x2675C
+0x4227 0x26760
+0x4229 0x2676D
+0x422A 0x26941
+0x422B 0x26A3C
+0x422C 0x26A3E
+0x422E 0x26A49
+0x422F 0x26BE4
+0x4230 0x26D0C
+0x4231 0x26D15
+0x4232 0x26D0E
+0x4233 0x26CD4
+0x4234 0x26CC7
+0x4235 0x26D14
+0x4236 0x26CDB
+0x4237 0x26D5F
+0x4238 0x26CED
+0x4239 0x26D09
+0x423A 0x26CCF
+0x423B 0x26CFF
+0x423C 0x26D1A
+0x423D 0x26CF5
+0x423E 0x26CEE
+0x423F 0x26CE5
+0x4240 0x26D0D
+0x4241 0x26CDF
+0x4242 0x26CEC
+0x4243 0x26CD7
+0x4244 0x26D2C
+0x4245 0x26CCD
+0x4246 0x26CE3
+0x4247 0x26D00
+0x4248 0x26CEB
+0x4249 0x26CFD
+0x424A 0x26D0F
+0x424B 0x26D2D
+0x424C 0x26D50
+0x424D 0x26CFE
+0x424E 0x26CC4
+0x424F 0x26CE1
+0x4250 0x26CF9
+0x4251 0x271BB
+0x4252 0x271BC
+0x4255 0x271BA
+0x4256 0x272D0
+0x4257 0x272D6
+0x4258 0x272CE
+0x4259 0x272E1
+0x425A 0x272D5
+0x425B 0x272CF
+0x425C 0x272D3
+0x425E 0x272D4
+0x425F 0x275B5
+0x4260 0x27690
+0x4261 0x276A1
+0x4262 0x27681
+0x4263 0x27685
+0x4264 0x2766E
+0x4265 0x27688
+0x4266 0x27682
+0x4267 0x27686
+0x4268 0x2768F
+0x4269 0x27689
+0x426A 0x27680
+0x426B 0x27684
+0x426D 0x27829
+0x426E 0x2782B
+0x426F 0x2782A
+0x4270 0x27830
+0x4271 0x278E2
+0x4272 0x278E3
+0x4273 0x278E1
+0x4274 0x279D5
+0x4275 0x279C4
+0x4276 0x279C9
+0x4277 0x279E0
+0x4278 0x279DF
+0x4279 0x279CB
+0x427A 0x279DD
+0x427B 0x279E8
+0x427C 0x279D4
+0x427D 0x27A1C
+0x427E 0x27BB5
+0x4321 0x27BB6
+0x4322 0x27BE5
+0x4323 0x27C45
+0x4324 0x27C49
+0x4325 0x27C40
+0x4326 0x27C46
+0x4327 0x27C44
+0x4328 0x27C4A
+0x4329 0x27CC9
+0x432A 0x27CC4
+0x432B 0x27CC2
+0x432C 0x27D68
+0x432E 0x27D82
+0x432F 0x27D6B
+0x4330 0x27D67
+0x4331 0x27D6C
+0x4332 0x27D6D
+0x4333 0x27D71
+0x4335 0x27ED7
+0x4336 0x27ED2
+0x4337 0x27ED9
+0x4339 0x27EBC
+0x433A 0x27EDD
+0x433B 0x27ED6
+0x433D 0x27ED8
+0x433E 0x28020
+0x433F 0x28016
+0x4340 0x28018
+0x4341 0x28015
+0x4342 0x28019
+0x4343 0x28027
+0x4344 0x28050
+0x4345 0x2801D
+0x4346 0x2802C
+0x4347 0x2801C
+0x4348 0x28029
+0x4349 0x2802B
+0x434A 0x28024
+0x434C 0x28028
+0x434D 0x28239
+0x434E 0x282F2
+0x434F 0x282F0
+0x4351 0x282ED
+0x4352 0x282EF
+0x4353 0x282EA
+0x4354 0x28301
+0x4355 0x284BC
+0x4356 0x2855C
+0x4357 0x2855B
+0x4358 0x2855A
+0x4359 0x28526
+0x435A 0x28743
+0x435B 0x28733
+0x435C 0x2873A
+0x435D 0x28737
+0x435E 0x28736
+0x435F 0x2873C
+0x4360 0x28734
+0x4361 0x2874A
+0x4362 0x2873B
+0x4363 0x28735
+0x4364 0x2873D
+0x4365 0x28740
+0x4366 0x2873E
+0x4367 0x28717
+0x4368 0x28826
+0x4369 0x28824
+0x436A 0x28810
+0x436B 0x28836
+0x436C 0x28825
+0x436E 0x28966
+0x436F 0x28C7F
+0x4370 0x28C7A
+0x4371 0x28CFB
+0x4372 0x28CFD
+0x4373 0x28CFC
+0x4374 0x28CFA
+0x4375 0x28ED6
+0x4376 0x28ED2
+0x4377 0x28EC8
+0x4378 0x28EC2
+0x4379 0x28EC7
+0x437A 0x28ECD
+0x437B 0x28EC1
+0x437C 0x28EC6
+0x437D 0x28ECC
+0x437E 0x28FA1
+0x4421 0x29095
+0x4422 0x29094
+0x4423 0x29097
+0x4424 0x29096
+0x4425 0x29093
+0x4426 0x290A1
+0x4427 0x29209
+0x4428 0x29208
+0x4429 0x29267
+0x442A 0x29265
+0x442B 0x29262
+0x442C 0x29261
+0x442D 0x29397
+0x442E 0x29401
+0x442F 0x29419
+0x4430 0x29418
+0x4431 0x2945C
+0x4432 0x29467
+0x4433 0x2946C
+0x4435 0x2F9FD
+0x4436 0x29466
+0x4437 0x29461
+0x4438 0x2946E
+0x4439 0x2945D
+0x443A 0x2945A
+0x443B 0x295A2
+0x443C 0x295A9
+0x443D 0x295A5
+0x443E 0x295A6
+0x443F 0x295B2
+0x4440 0x295A3
+0x4441 0x296AC
+0x4442 0x296AA
+0x4443 0x296AF
+0x4444 0x296AB
+0x4445 0x296B1
+0x4446 0x296C6
+0x4447 0x296AD
+0x4448 0x296B9
+0x4449 0x29870
+0x444B 0x29C0C
+0x444C 0x29C81
+0x444D 0x29C83
+0x444E 0x29C7E
+0x444F 0x29D51
+0x4450 0x29F99
+0x4451 0x29F94
+0x4452 0x29F95
+0x4453 0x2A2FE
+0x4454 0x2A418
+0x4455 0x20105
+0x4456 0x20372
+0x4458 0x20399
+0x4459 0x204AD
+0x445A 0x20606
+0x445B 0x207C2
+0x445C 0x207CB
+0x445D 0x207D5
+0x445E 0x207D2
+0x445F 0x207CC
+0x4460 0x207D7
+0x4461 0x207C5
+0x4462 0x207CA
+0x4464 0x208A2
+0x4465 0x208A3
+0x4466 0x208A1
+0x4468 0x208A6
+0x4469 0x208A4
+0x446A 0x208FF
+0x446B 0x20900
+0x446D 0x20A06
+0x446E 0x20A25
+0x446F 0x20A9F
+0x4470 0x20B7F
+0x4471 0x20EEA
+0x4472 0x20EEB
+0x4473 0x20EDE
+0x4474 0x20F18
+0x4475 0x20EE0
+0x4476 0x20EE8
+0x4477 0x20EDF
+0x4478 0x20EF1
+0x4479 0x20EEC
+0x447A 0x20F1A
+0x447B 0x20EE6
+0x447C 0x20EE1
+0x447D 0x20F5D
+0x447E 0x20077
+0x4521 0x20F1E
+0x4523 0x20F80
+0x4524 0x21217
+0x4525 0x2141D
+0x4526 0x213F7
+0x4527 0x213EF
+0x4528 0x213EE
+0x4529 0x213ED
+0x452A 0x213F5
+0x452B 0x2141E
+0x452C 0x215BD
+0x452D 0x257FF
+0x452E 0x215BE
+0x452F 0x2166D
+0x4530 0x21676
+0x4531 0x2184C
+0x4532 0x21819
+0x4533 0x21848
+0x4534 0x2181E
+0x4535 0x2184A
+0x4536 0x21849
+0x4537 0x21826
+0x4538 0x21995
+0x4539 0x21A85
+0x453A 0x21A7E
+0x453B 0x21A97
+0x453C 0x21A7D
+0x453D 0x21B42
+0x453E 0x21B9E
+0x453F 0x21C0C
+0x4540 0x21C0B
+0x4541 0x21C0E
+0x4542 0x21CCF
+0x4543 0x21ED8
+0x4544 0x21EE0
+0x4545 0x21EE8
+0x4546 0x21EE9
+0x4547 0x21EE2
+0x4548 0x21EE1
+0x4549 0x21EDA
+0x454A 0x21EE3
+0x454B 0x21ED9
+0x454C 0x21EF0
+0x454D 0x21EE7
+0x454E 0x21EE4
+0x454F 0x22123
+0x4550 0x22131
+0x4551 0x22133
+0x4552 0x2210C
+0x4553 0x269E0
+0x4554 0x22126
+0x4555 0x22124
+0x4556 0x22132
+0x4557 0x22127
+0x4558 0x22121
+0x4559 0x22130
+0x455A 0x221A2
+0x455B 0x221CC
+0x455C 0x22296
+0x455D 0x2F88F
+0x455E 0x22298
+0x455F 0x2229C
+0x4560 0x2229B
+0x4561 0x2236B
+0x4562 0x22412
+0x4563 0x22414
+0x4564 0x2255A
+0x4565 0x22554
+0x4566 0x22551
+0x4567 0x2255E
+0x4568 0x22558
+0x456A 0x22559
+0x456B 0x2279A
+0x456C 0x227F2
+0x456D 0x227AD
+0x456E 0x22820
+0x456F 0x227F1
+0x4570 0x227F0
+0x4571 0x227F3
+0x4572 0x227F4
+0x4573 0x227E9
+0x4574 0x227FE
+0x4575 0x2282E
+0x4576 0x227E8
+0x4577 0x227E7
+0x4578 0x227FF
+0x4579 0x227F5
+0x457A 0x229E5
+0x457B 0x229E7
+0x457C 0x229E6
+0x457D 0x229E9
+0x457E 0x22A58
+0x4621 0x22C6C
+0x4622 0x22CD9
+0x4624 0x22CCB
+0x4626 0x22CBE
+0x4627 0x22CB5
+0x4628 0x22CD1
+0x4629 0x22CC2
+0x462A 0x22CB6
+0x462B 0x22CD3
+0x462C 0x2F8C2
+0x462D 0x22EDA
+0x462F 0x22FAE
+0x4631 0x22FAC
+0x4632 0x22FA9
+0x4633 0x22FBA
+0x4634 0x22FA7
+0x4635 0x22FB3
+0x4636 0x22FBD
+0x4637 0x22FB1
+0x4638 0x2310E
+0x4639 0x23111
+0x463A 0x2310F
+0x463B 0x23252
+0x463C 0x2326A
+0x463D 0x23254
+0x463E 0x23255
+0x463F 0x23253
+0x4640 0x23257
+0x4641 0x2F8D0
+0x4642 0x2325B
+0x4643 0x23258
+0x4644 0x23259
+0x4646 0x235B8
+0x4647 0x235B5
+0x4648 0x235BF
+0x4649 0x235C1
+0x464A 0x235BB
+0x464C 0x235C3
+0x464D 0x235AD
+0x464E 0x235A8
+0x464F 0x235AE
+0x4650 0x235AA
+0x4651 0x235D0
+0x4652 0x235B1
+0x4653 0x235BC
+0x4654 0x235B7
+0x4655 0x235B0
+0x4656 0x235FA
+0x4657 0x235FB
+0x4658 0x235B9
+0x4659 0x23907
+0x465A 0x238FC
+0x465B 0x238FF
+0x465C 0x238F2
+0x465D 0x238F8
+0x465E 0x238F4
+0x4661 0x23AAE
+0x4662 0x23B0F
+0x4663 0x23B10
+0x4664 0x29AC1
+0x4665 0x23BC7
+0x4666 0x23BC6
+0x4667 0x23BCE
+0x4669 0x23BDC
+0x466A 0x23ED5
+0x466B 0x23ED3
+0x466C 0x23F20
+0x466D 0x23EE2
+0x466E 0x23EF1
+0x466F 0x23EDB
+0x4670 0x23EEA
+0x4671 0x23EEB
+0x4672 0x23EE1
+0x4673 0x23EFF
+0x4674 0x23ED6
+0x4675 0x23EE0
+0x4676 0x23ED7
+0x4677 0x23EE5
+0x4679 0x2431B
+0x467A 0x24310
+0x467B 0x2430F
+0x467C 0x2430E
+0x467D 0x24339
+0x467E 0x2430A
+0x4721 0x24314
+0x4722 0x2430C
+0x4723 0x24523
+0x4724 0x2455A
+0x4725 0x245E2
+0x4726 0x24693
+0x4727 0x246B0
+0x4728 0x246AB
+0x4729 0x246BD
+0x472A 0x246B1
+0x472B 0x2468D
+0x472C 0x246AD
+0x472D 0x246AA
+0x472E 0x246AC
+0x472F 0x246BC
+0x4730 0x246C9
+0x4731 0x24847
+0x4732 0x24862
+0x4733 0x24840
+0x4734 0x24844
+0x4735 0x2483F
+0x4736 0x24843
+0x4737 0x2483D
+0x4738 0x24860
+0x4739 0x2485F
+0x473A 0x2483A
+0x473B 0x24842
+0x473C 0x2485E
+0x473D 0x2485D
+0x473E 0x249BC
+0x473F 0x249E0
+0x4740 0x249EE
+0x4741 0x249EB
+0x4742 0x24A0D
+0x4743 0x24B09
+0x4744 0x24B0C
+0x4745 0x24B69
+0x4746 0x24B74
+0x4747 0x24B67
+0x474A 0x24CAD
+0x474B 0x24DFF
+0x474C 0x24E16
+0x474D 0x24E08
+0x474E 0x24E09
+0x474F 0x24E00
+0x4750 0x24DFC
+0x4751 0x24E13
+0x4752 0x24E14
+0x4753 0x24E0A
+0x4754 0x2983E
+0x4755 0x24E29
+0x4756 0x24E17
+0x4757 0x24E3B
+0x4758 0x24DFB
+0x475A 0x24E0E
+0x475C 0x25008
+0x475D 0x2521B
+0x475E 0x2521A
+0x475F 0x25219
+0x4760 0x25202
+0x4762 0x25217
+0x4763 0x25207
+0x4764 0x25213
+0x4765 0x25209
+0x4766 0x2520A
+0x4767 0x25212
+0x4768 0x252AA
+0x4769 0x25238
+0x476A 0x2537B
+0x476B 0x2537C
+0x476C 0x2537A
+0x476D 0x253EA
+0x476E 0x253EB
+0x476F 0x253EF
+0x4770 0x253F0
+0x4771 0x25509
+0x4772 0x25502
+0x4773 0x25501
+0x4774 0x2552B
+0x4775 0x25507
+0x4777 0x25528
+0x4778 0x254FB
+0x4779 0x2552A
+0x477A 0x254FE
+0x477B 0x25504
+0x477C 0x25529
+0x477D 0x2550A
+0x4821 0x256C2
+0x4823 0x256A6
+0x4825 0x22FC6
+0x4826 0x21C07
+0x4827 0x2580A
+0x4828 0x257FD
+0x4829 0x25806
+0x482A 0x2580D
+0x482B 0x25809
+0x482C 0x2580B
+0x482D 0x25800
+0x482E 0x25805
+0x482F 0x2583D
+0x4830 0x259D5
+0x4831 0x259BF
+0x4832 0x259BA
+0x4833 0x259C7
+0x4834 0x25A98
+0x4835 0x25A9A
+0x4837 0x25BA4
+0x4838 0x25B9C
+0x4839 0x25B9D
+0x483A 0x25BA2
+0x483B 0x25B96
+0x483C 0x25B95
+0x483D 0x25BA5
+0x483E 0x25BAA
+0x483F 0x25BAD
+0x4840 0x25B9A
+0x4841 0x25BA3
+0x4842 0x25B97
+0x4843 0x25B90
+0x4844 0x25BAF
+0x4845 0x25B8D
+0x4847 0x25BA8
+0x4848 0x25BEE
+0x4849 0x25EA3
+0x484A 0x25E99
+0x484B 0x25EA1
+0x484C 0x25E9C
+0x484D 0x25EA4
+0x484E 0x25ECB
+0x484F 0x26056
+0x4850 0x26048
+0x4851 0x26059
+0x4852 0x2604A
+0x4853 0x2605C
+0x4855 0x2604F
+0x4856 0x2604D
+0x4857 0x2605D
+0x4858 0x2623A
+0x4859 0x262E3
+0x485A 0x262E1
+0x485B 0x262DE
+0x485C 0x26397
+0x485D 0x2639A
+0x485E 0x26448
+0x485F 0x2644A
+0x4860 0x2644C
+0x4861 0x2644E
+0x4862 0x2644F
+0x4863 0x2644B
+0x4864 0x2644D
+0x4865 0x26447
+0x4866 0x26451
+0x4867 0x264DA
+0x4868 0x264F9
+0x4869 0x264FC
+0x486A 0x264FB
+0x486B 0x264FD
+0x486C 0x264F8
+0x486D 0x264FA
+0x486E 0x2658A
+0x486F 0x2658E
+0x4870 0x26588
+0x4871 0x26589
+0x4872 0x2658D
+0x4873 0x26590
+0x4874 0x2F97E
+0x4875 0x2671C
+0x4876 0x267AB
+0x4877 0x267A4
+0x4878 0x267A8
+0x4879 0x267AD
+0x487A 0x2679F
+0x487B 0x2679A
+0x487C 0x267B0
+0x487D 0x267A5
+0x487E 0x267D5
+0x4921 0x267A2
+0x4922 0x267B2
+0x4923 0x2679D
+0x4924 0x267A1
+0x4925 0x26915
+0x4926 0x26942
+0x4927 0x26973
+0x4928 0x26984
+0x4929 0x269DD
+0x492A 0x26A5C
+0x492B 0x26A4C
+0x492D 0x26A4B
+0x492E 0x26C67
+0x492F 0x26DA8
+0x4930 0x26D7F
+0x4931 0x26D8D
+0x4932 0x26D8B
+0x4933 0x26DF7
+0x4934 0x26DA9
+0x4935 0x26DF4
+0x4936 0x26D9A
+0x4937 0x26D8C
+0x4938 0x26D95
+0x4939 0x26D7E
+0x493A 0x26D77
+0x493D 0x26D71
+0x493E 0x26DFD
+0x493F 0x26D88
+0x4940 0x26D99
+0x4941 0x26D6D
+0x4942 0x26DD4
+0x4943 0x26D91
+0x4944 0x26D7D
+0x4945 0x26D63
+0x4946 0x26D75
+0x4947 0x26DF9
+0x4948 0x26D8E
+0x4949 0x26D74
+0x494A 0x26DD9
+0x494B 0x26D66
+0x494C 0x26DFA
+0x494D 0x26DF5
+0x494F 0x271C1
+0x4950 0x271C9
+0x4951 0x27303
+0x4952 0x2732C
+0x4953 0x27334
+0x4954 0x27317
+0x4955 0x27309
+0x4956 0x27304
+0x4957 0x27306
+0x4958 0x2731A
+0x4959 0x2730E
+0x495A 0x27327
+0x495B 0x27305
+0x495C 0x27307
+0x495D 0x27319
+0x495E 0x27314
+0x495F 0x2730C
+0x4960 0x2731D
+0x4961 0x27322
+0x4962 0x27323
+0x4963 0x275BB
+0x4964 0x275BC
+0x4965 0x275BA
+0x4966 0x276A9
+0x4967 0x276B5
+0x4968 0x276AC
+0x4969 0x276AA
+0x496A 0x276AF
+0x496B 0x276B7
+0x496E 0x2783D
+0x496F 0x27845
+0x4970 0x27848
+0x4971 0x2783C
+0x4972 0x2783E
+0x4973 0x278EC
+0x4974 0x278ED
+0x4975 0x278E9
+0x4976 0x27A0A
+0x4977 0x27A0B
+0x4978 0x279F8
+0x4979 0x27A04
+0x497A 0x279F6
+0x497B 0x279F9
+0x497C 0x27C53
+0x497D 0x27C52
+0x497E 0x27C60
+0x4A21 0x27C63
+0x4A22 0x27CCE
+0x4A23 0x27CCD
+0x4A24 0x27CD0
+0x4A25 0x27CCC
+0x4A26 0x27D87
+0x4A27 0x27D8D
+0x4A28 0x27D9D
+0x4A2A 0x27E63
+0x4A2B 0x27EF4
+0x4A2C 0x27EF1
+0x4A2D 0x27EFF
+0x4A2E 0x27EF5
+0x4A2F 0x27EFC
+0x4A30 0x27EF2
+0x4A31 0x27EF6
+0x4A33 0x27EFA
+0x4A35 0x2802E
+0x4A36 0x28045
+0x4A37 0x28043
+0x4A38 0x28051
+0x4A39 0x2804C
+0x4A3A 0x28073
+0x4A3B 0x28047
+0x4A3C 0x2804B
+0x4A3D 0x2804F
+0x4A3F 0x28044
+0x4A40 0x2804D
+0x4A41 0x2804E
+0x4A42 0x2804A
+0x4A43 0x28041
+0x4A44 0x28052
+0x4A45 0x2809F
+0x4A46 0x28054
+0x4A47 0x28059
+0x4A48 0x280A2
+0x4A49 0x2824B
+0x4A4A 0x28248
+0x4A4B 0x2830D
+0x4A4C 0x2831F
+0x4A4D 0x28308
+0x4A4E 0x2830E
+0x4A4F 0x2831D
+0x4A50 0x28304
+0x4A51 0x28418
+0x4A52 0x2841B
+0x4A53 0x28566
+0x4A54 0x28562
+0x4A55 0x28583
+0x4A56 0x28567
+0x4A57 0x28762
+0x4A58 0x2874F
+0x4A59 0x2874E
+0x4A5A 0x28767
+0x4A5B 0x28753
+0x4A5C 0x2874D
+0x4A5D 0x2874C
+0x4A5E 0x28768
+0x4A5F 0x28751
+0x4A61 0x28758
+0x4A62 0x2875B
+0x4A63 0x28750
+0x4A64 0x2876A
+0x4A65 0x28839
+0x4A66 0x28838
+0x4A67 0x28982
+0x4A68 0x28984
+0x4A69 0x28986
+0x4A6A 0x28C80
+0x4A6B 0x28C86
+0x4A6C 0x28D25
+0x4A6D 0x28D11
+0x4A6F 0x28D0E
+0x4A70 0x28D15
+0x4A71 0x28D0F
+0x4A72 0x28D18
+0x4A73 0x28D0D
+0x4A74 0x28D13
+0x4A75 0x28D16
+0x4A76 0x28D19
+0x4A77 0x28F08
+0x4A78 0x28EF7
+0x4A79 0x28EFB
+0x4A7A 0x28EFC
+0x4A7B 0x28FB4
+0x4A7C 0x28FBE
+0x4A7D 0x28FC1
+0x4A7E 0x290A6
+0x4B21 0x290A5
+0x4B22 0x290A2
+0x4B23 0x290A4
+0x4B24 0x29212
+0x4B25 0x2920E
+0x4B26 0x2927A
+0x4B27 0x29278
+0x4B28 0x2927D
+0x4B29 0x2927E
+0x4B2A 0x29281
+0x4B2B 0x29283
+0x4B2C 0x29280
+0x4B2D 0x29282
+0x4B2E 0x2939B
+0x4B2F 0x29399
+0x4B30 0x2939C
+0x4B31 0x2939A
+0x4B32 0x293A1
+0x4B33 0x2941A
+0x4B34 0x2941C
+0x4B35 0x2948A
+0x4B36 0x29479
+0x4B37 0x29473
+0x4B38 0x29475
+0x4B39 0x2947C
+0x4B3A 0x29478
+0x4B3B 0x29460
+0x4B3C 0x29483
+0x4B3D 0x29470
+0x4B40 0x29487
+0x4B41 0x29484
+0x4B42 0x2947B
+0x4B43 0x2947E
+0x4B44 0x29474
+0x4B45 0x295B9
+0x4B46 0x295B8
+0x4B47 0x295B7
+0x4B48 0x295B5
+0x4B49 0x296CC
+0x4B4A 0x296CE
+0x4B4B 0x296D1
+0x4B4D 0x296CB
+0x4B4F 0x2987E
+0x4B50 0x2987A
+0x4B51 0x29877
+0x4B52 0x2988C
+0x4B53 0x298E1
+0x4B54 0x29A20
+0x4B55 0x29A1E
+0x4B56 0x29AC2
+0x4B57 0x29B0F
+0x4B58 0x29B00
+0x4B5A 0x29B10
+0x4B5B 0x29C0D
+0x4B5C 0x29C0E
+0x4B5D 0x29C8E
+0x4B5E 0x29C8D
+0x4B5F 0x29C8A
+0x4B60 0x29C8B
+0x4B61 0x29C8C
+0x4B62 0x29C8F
+0x4B63 0x29D57
+0x4B65 0x29D55
+0x4B66 0x29D5B
+0x4B67 0x29FAC
+0x4B68 0x29FA7
+0x4B69 0x29FA0
+0x4B6A 0x29F9E
+0x4B6C 0x2A28D
+0x4B6E 0x2A393
+0x4B6F 0x2A394
+0x4B70 0x2A392
+0x4B71 0x20181
+0x4B72 0x203D6
+0x4B73 0x203C3
+0x4B74 0x203E4
+0x4B75 0x203E2
+0x4B76 0x20409
+0x4B77 0x203BF
+0x4B78 0x203C8
+0x4B79 0x203C7
+0x4B7A 0x204B5
+0x4B7B 0x204B2
+0x4B7C 0x2060C
+0x4B7D 0x2060B
+0x4B7E 0x2060A
+0x4C21 0x20605
+0x4C22 0x207D3
+0x4C23 0x207E6
+0x4C24 0x207E9
+0x4C25 0x207F0
+0x4C26 0x207EA
+0x4C27 0x207E7
+0x4C28 0x208B1
+0x4C29 0x208B3
+0x4C2A 0x208B4
+0x4C2B 0x208B0
+0x4C2C 0x2095C
+0x4C2D 0x2095D
+0x4C2E 0x2095E
+0x4C2F 0x209C0
+0x4C30 0x20AAF
+0x4C32 0x20B86
+0x4C33 0x20B83
+0x4C34 0x20B84
+0x4C35 0x20F5C
+0x4C36 0x20F70
+0x4C37 0x20F8C
+0x4C38 0x20F7B
+0x4C39 0x20F66
+0x4C3A 0x20F79
+0x4C3B 0x20F63
+0x4C3C 0x20FC5
+0x4C3D 0x20F6B
+0x4C3E 0x20F6D
+0x4C3F 0x20F72
+0x4C40 0x20F69
+0x4C41 0x20F75
+0x4C42 0x20F89
+0x4C43 0x20FC6
+0x4C44 0x20FA5
+0x4C45 0x203E7
+0x4C46 0x20F6A
+0x4C47 0x20F97
+0x4C48 0x2145A
+0x4C49 0x2145C
+0x4C4A 0x21459
+0x4C4B 0x21424
+0x4C4C 0x21425
+0x4C4D 0x21430
+0x4C4E 0x21458
+0x4C4F 0x21431
+0x4C50 0x21576
+0x4C51 0x215C1
+0x4C52 0x21685
+0x4C53 0x2167D
+0x4C54 0x21865
+0x4C55 0x21887
+0x4C56 0x21852
+0x4C57 0x21854
+0x4C58 0x2188A
+0x4C59 0x21850
+0x4C5A 0x21886
+0x4C5B 0x2184F
+0x4C5C 0x21868
+0x4C5D 0x2199D
+0x4C5E 0x21AA0
+0x4C5F 0x21ABA
+0x4C60 0x21ABD
+0x4C61 0x21AB8
+0x4C62 0x21BA6
+0x4C64 0x21CDE
+0x4C65 0x21CD8
+0x4C66 0x21CD1
+0x4C67 0x21F13
+0x4C69 0x21F0E
+0x4C6A 0x21F1B
+0x4C6B 0x21F3A
+0x4C6D 0x21F1C
+0x4C6E 0x21F12
+0x4C6F 0x21F16
+0x4C70 0x21F1A
+0x4C71 0x21448
+0x4C72 0x2214B
+0x4C73 0x22137
+0x4C74 0x22136
+0x4C75 0x22138
+0x4C76 0x2213A
+0x4C77 0x22149
+0x4C78 0x2213C
+0x4C79 0x2214A
+0x4C7A 0x222B1
+0x4C7B 0x222C2
+0x4C7C 0x222B5
+0x4C7D 0x222C4
+0x4C7E 0x222B6
+0x4D21 0x2241E
+0x4D22 0x2241F
+0x4D23 0x224AF
+0x4D24 0x2256B
+0x4D25 0x2256F
+0x4D26 0x22792
+0x4D27 0x227E4
+0x4D28 0x2282C
+0x4D29 0x227EF
+0x4D2B 0x2284F
+0x4D2C 0x22852
+0x4D2D 0x22850
+0x4D2E 0x2283A
+0x4D2F 0x22837
+0x4D30 0x22847
+0x4D31 0x22864
+0x4D32 0x22840
+0x4D33 0x2283C
+0x4D34 0x22845
+0x4D35 0x22841
+0x4D36 0x229F3
+0x4D38 0x22CC1
+0x4D39 0x22CB4
+0x4D3B 0x22D2A
+0x4D3C 0x22D22
+0x4D3D 0x22D29
+0x4D3F 0x22D3E
+0x4D40 0x22D3C
+0x4D41 0x22D30
+0x4D42 0x22FC7
+0x4D43 0x22FD5
+0x4D44 0x22FD6
+0x4D45 0x22FD3
+0x4D46 0x22FCE
+0x4D47 0x22FC8
+0x4D48 0x2305C
+0x4D49 0x2305F
+0x4D4A 0x23062
+0x4D4C 0x230BD
+0x4D4D 0x230BF
+0x4D4E 0x2325C
+0x4D4F 0x232B6
+0x4D51 0x2329D
+0x4D52 0x2327F
+0x4D54 0x23294
+0x4D55 0x23281
+0x4D56 0x23347
+0x4D57 0x23346
+0x4D59 0x23394
+0x4D5A 0x23675
+0x4D5B 0x2361A
+0x4D5C 0x2362A
+0x4D5D 0x23632
+0x4D5E 0x23617
+0x4D5F 0x23623
+0x4D60 0x23674
+0x4D62 0x23676
+0x4D63 0x2362E
+0x4D64 0x23625
+0x4D65 0x23620
+0x4D66 0x23671
+0x4D67 0x23616
+0x4D68 0x23670
+0x4D69 0x2362C
+0x4D6A 0x2362F
+0x4D6B 0x2361F
+0x4D6C 0x23664
+0x4D6E 0x23908
+0x4D6F 0x23914
+0x4D70 0x2390A
+0x4D71 0x2390B
+0x4D72 0x23A4F
+0x4D73 0x23A59
+0x4D74 0x23A54
+0x4D75 0x23A51
+0x4D76 0x23AB6
+0x4D77 0x23BEC
+0x4D78 0x23BED
+0x4D79 0x23BEA
+0x4D7A 0x23EEE
+0x4D7B 0x23F5A
+0x4D7C 0x23F73
+0x4D7D 0x23F65
+0x4D7E 0x23F61
+0x4E21 0x23F55
+0x4E22 0x23F6B
+0x4E23 0x23F64
+0x4E24 0x23F5B
+0x4E25 0x23F4C
+0x4E26 0x23F6F
+0x4E27 0x23F84
+0x4E28 0x23F70
+0x4E29 0x2435D
+0x4E2A 0x24357
+0x4E2B 0x24366
+0x4E2C 0x24353
+0x4E2D 0x24398
+0x4E2E 0x24397
+0x4E2F 0x24528
+0x4E30 0x245EB
+0x4E31 0x245EA
+0x4E32 0x245E8
+0x4E33 0x245EC
+0x4E34 0x245EF
+0x4E35 0x246D1
+0x4E36 0x246CA
+0x4E38 0x246CF
+0x4E39 0x246CD
+0x4E3A 0x246CE
+0x4E3B 0x24870
+0x4E3C 0x24867
+0x4E3D 0x24873
+0x4E3E 0x2486D
+0x4E3F 0x24876
+0x4E40 0x24879
+0x4E41 0x2486A
+0x4E42 0x2488B
+0x4E43 0x24872
+0x4E44 0x24871
+0x4E45 0x2486E
+0x4E46 0x2487A
+0x4E47 0x24A16
+0x4E48 0x24A39
+0x4E49 0x24A3B
+0x4E4A 0x24B10
+0x4E4B 0x24B96
+0x4E4C 0x24B7B
+0x4E4D 0x24B7C
+0x4E4E 0x24B7D
+0x4E4F 0x24CBE
+0x4E50 0x24E5C
+0x4E51 0x24E38
+0x4E52 0x24E39
+0x4E53 0x24E2E
+0x4E54 0x24E34
+0x4E55 0x24E32
+0x4E56 0x24E5B
+0x4E57 0x24E33
+0x4E58 0x24E3C
+0x4E5A 0x2500E
+0x4E5B 0x2500F
+0x4E5C 0x25010
+0x4E5D 0x25087
+0x4E5E 0x2525B
+0x4E5F 0x25253
+0x4E61 0x2525C
+0x4E62 0x2523F
+0x4E63 0x25259
+0x4E64 0x2524A
+0x4E65 0x25244
+0x4E66 0x2524C
+0x4E67 0x25240
+0x4E68 0x2525F
+0x4E69 0x2525E
+0x4E6A 0x2524E
+0x4E6B 0x25254
+0x4E6C 0x25243
+0x4E6D 0x25287
+0x4E6E 0x25382
+0x4E6F 0x25385
+0x4E70 0x25531
+0x4E71 0x25547
+0x4E72 0x2552E
+0x4E73 0x2552F
+0x4E74 0x25548
+0x4E75 0x25534
+0x4E77 0x2059F
+0x4E78 0x25832
+0x4E79 0x25836
+0x4E7A 0x25833
+0x4E7B 0x25831
+0x4E7C 0x25840
+0x4E7D 0x25841
+0x4E7E 0x259DD
+0x4F21 0x259D2
+0x4F22 0x259D9
+0x4F24 0x259DF
+0x4F25 0x259DB
+0x4F26 0x259D8
+0x4F27 0x259D3
+0x4F28 0x259DE
+0x4F29 0x259E0
+0x4F2A 0x259D4
+0x4F2B 0x259D7
+0x4F2C 0x259DA
+0x4F2D 0x25AA7
+0x4F2E 0x25BFE
+0x4F2F 0x25BDD
+0x4F30 0x25C40
+0x4F31 0x25BE2
+0x4F33 0x25BD6
+0x4F34 0x25BDE
+0x4F35 0x25BEF
+0x4F37 0x25BEB
+0x4F38 0x25BEA
+0x4F39 0x25BE4
+0x4F3A 0x25BD1
+0x4F3C 0x25BEC
+0x4F3D 0x25BFA
+0x4F3E 0x25BD9
+0x4F3F 0x25BF3
+0x4F40 0x25BE1
+0x4F41 0x25BDC
+0x4F42 0x25BE5
+0x4F43 0x25BDF
+0x4F44 0x25BD4
+0x4F46 0x25C05
+0x4F47 0x25ED6
+0x4F48 0x25ED5
+0x4F49 0x25ED0
+0x4F4A 0x25EC8
+0x4F4B 0x25EC4
+0x4F4C 0x25EC9
+0x4F4D 0x25ECD
+0x4F4E 0x25ED2
+0x4F4F 0x25ECC
+0x4F50 0x25ECA
+0x4F51 0x260A0
+0x4F52 0x26092
+0x4F55 0x2608B
+0x4F56 0x260A1
+0x4F57 0x26095
+0x4F58 0x26088
+0x4F59 0x26086
+0x4F5A 0x2608D
+0x4F5B 0x26085
+0x4F5C 0x26091
+0x4F5D 0x26089
+0x4F5E 0x260A2
+0x4F5F 0x262F0
+0x4F60 0x262F3
+0x4F61 0x262F4
+0x4F62 0x262EF
+0x4F63 0x26306
+0x4F64 0x263A2
+0x4F65 0x2645E
+0x4F66 0x26463
+0x4F67 0x26460
+0x4F68 0x2645B
+0x4F69 0x2647B
+0x4F6A 0x26458
+0x4F6B 0x26459
+0x4F6C 0x2645D
+0x4F6D 0x26505
+0x4F6E 0x26506
+0x4F6F 0x26502
+0x4F70 0x26503
+0x4F71 0x26504
+0x4F72 0x265A2
+0x4F73 0x265A7
+0x4F74 0x265A6
+0x4F75 0x265A4
+0x4F76 0x265AC
+0x4F77 0x265A9
+0x4F78 0x267E7
+0x4F79 0x26801
+0x4F7A 0x267DF
+0x4F7B 0x267D9
+0x4F7C 0x267E3
+0x4F7D 0x2680F
+0x4F7E 0x2691A
+0x5021 0x26945
+0x5022 0x26948
+0x5023 0x2697B
+0x5024 0x26985
+0x5025 0x26986
+0x5026 0x269FE
+0x5027 0x269FF
+0x5028 0x26A64
+0x5029 0x26A71
+0x502A 0x26A72
+0x502B 0x26A61
+0x502C 0x26A62
+0x502D 0x26A6C
+0x502E 0x26A60
+0x502F 0x26A5D
+0x5030 0x26A63
+0x5031 0x26A67
+0x5032 0x26E01
+0x5033 0x26E2A
+0x5034 0x26E30
+0x5035 0x26E06
+0x5036 0x26E7D
+0x5037 0x26E22
+0x5038 0x26EB9
+0x5039 0x26E0A
+0x503A 0x26E10
+0x503B 0x26D8F
+0x503C 0x26E80
+0x503D 0x26E13
+0x503E 0x26E2E
+0x503F 0x26E18
+0x5040 0x26E17
+0x5041 0x26E1A
+0x5042 0x26E14
+0x5043 0x26E47
+0x5044 0x26E63
+0x5045 0x26E38
+0x5047 0x26E7F
+0x5048 0x26E21
+0x5049 0x26E37
+0x504A 0x26E31
+0x504B 0x26E1B
+0x504C 0x26EA5
+0x504D 0x26F6C
+0x504E 0x271D3
+0x504F 0x27388
+0x5050 0x2736E
+0x5051 0x2735C
+0x5052 0x27374
+0x5053 0x27354
+0x5054 0x27383
+0x5056 0x27365
+0x5057 0x27360
+0x5058 0x27370
+0x5059 0x2736F
+0x505A 0x2736D
+0x505B 0x27372
+0x505C 0x2736C
+0x505D 0x27376
+0x505E 0x27375
+0x505F 0x27359
+0x5060 0x273C7
+0x5061 0x275C1
+0x5062 0x275F9
+0x5063 0x276E3
+0x5064 0x276E7
+0x5065 0x276D6
+0x5066 0x276CF
+0x5067 0x276DA
+0x5068 0x276E9
+0x5069 0x276D2
+0x506A 0x27855
+0x506B 0x2784F
+0x506C 0x2784D
+0x506D 0x27851
+0x506E 0x27856
+0x506F 0x278F9
+0x5070 0x278F8
+0x5071 0x27906
+0x5072 0x27903
+0x5073 0x27909
+0x5074 0x278F7
+0x5075 0x278F5
+0x5076 0x27A47
+0x5077 0x27A45
+0x5078 0x27A3E
+0x5079 0x27A46
+0x507A 0x27A29
+0x507B 0x27A34
+0x507C 0x27A3F
+0x507D 0x27A44
+0x507E 0x27A35
+0x5121 0x27A5A
+0x5122 0x27A2A
+0x5123 0x27A33
+0x5124 0x27A37
+0x5125 0x27A43
+0x5126 0x27A39
+0x5127 0x27A30
+0x5128 0x27A5D
+0x5129 0x27A32
+0x512A 0x27A27
+0x512B 0x27BBD
+0x512C 0x27BBA
+0x512D 0x27BBC
+0x512E 0x27BF1
+0x512F 0x27BF0
+0x5130 0x27C61
+0x5131 0x27C5C
+0x5132 0x27C58
+0x5133 0x27C5D
+0x5134 0x27CDA
+0x5135 0x27CD9
+0x5136 0x27CDD
+0x5137 0x27CDC
+0x5138 0x27CDE
+0x513A 0x27DA0
+0x513B 0x27DA2
+0x513C 0x27F0F
+0x513D 0x27F13
+0x513E 0x27F12
+0x513F 0x27F11
+0x5140 0x27F14
+0x5141 0x27F19
+0x5142 0x27F0E
+0x5143 0x27F17
+0x5144 0x27F21
+0x5145 0x27F20
+0x5146 0x27F16
+0x5147 0x28078
+0x5149 0x28087
+0x514A 0x28079
+0x514B 0x28080
+0x514C 0x28077
+0x514D 0x28081
+0x514E 0x28046
+0x514F 0x2807A
+0x5150 0x2809C
+0x5151 0x28083
+0x5152 0x28084
+0x5153 0x280AD
+0x5154 0x2809D
+0x5155 0x2809E
+0x5156 0x28255
+0x5157 0x28336
+0x5158 0x2832B
+0x5159 0x28327
+0x515A 0x28346
+0x515B 0x2832C
+0x515C 0x28345
+0x515D 0x28333
+0x515E 0x2832D
+0x515F 0x28334
+0x5160 0x28322
+0x5162 0x2841F
+0x5163 0x285B3
+0x5164 0x2858C
+0x5165 0x2858F
+0x5166 0x285AF
+0x5167 0x285AD
+0x5168 0x2858E
+0x5169 0x285AC
+0x516A 0x285B0
+0x516B 0x285B1
+0x516C 0x285AE
+0x516D 0x28599
+0x516E 0x286EB
+0x516F 0x28774
+0x5170 0x28775
+0x5171 0x2878E
+0x5172 0x2876D
+0x5173 0x28770
+0x5174 0x2878C
+0x5175 0x2884F
+0x5176 0x28851
+0x5177 0x28858
+0x5178 0x2884C
+0x5179 0x2884E
+0x517A 0x28915
+0x517B 0x289BE
+0x517C 0x289DB
+0x517D 0x289B3
+0x517E 0x289AE
+0x5221 0x28C87
+0x5222 0x28C8A
+0x5223 0x28C88
+0x5224 0x28C8B
+0x5225 0x28C8C
+0x5226 0x28D44
+0x5227 0x28D2D
+0x5228 0x28D2A
+0x5229 0x28D31
+0x522A 0x28D2C
+0x522B 0x28D45
+0x522C 0x28D30
+0x522D 0x28D29
+0x522E 0x28D46
+0x522F 0x28EF4
+0x5230 0x28F14
+0x5231 0x28F10
+0x5232 0x28F0F
+0x5233 0x28F12
+0x5234 0x28F0B
+0x5235 0x28F0C
+0x5236 0x28F0A
+0x5237 0x28F13
+0x5238 0x28F0E
+0x5239 0x28FD9
+0x523A 0x28FD0
+0x523C 0x290C1
+0x523D 0x290BF
+0x523E 0x290BD
+0x523F 0x290BC
+0x5240 0x290BA
+0x5241 0x290BB
+0x5242 0x290D1
+0x5243 0x290BE
+0x5244 0x290D0
+0x5245 0x290B9
+0x5246 0x2921A
+0x5247 0x2921C
+0x5248 0x2921B
+0x5249 0x29291
+0x524A 0x29296
+0x524B 0x2929F
+0x524C 0x2929C
+0x524D 0x2929A
+0x524E 0x2929D
+0x524F 0x293AD
+0x5250 0x293A5
+0x5251 0x293AE
+0x5252 0x29403
+0x5253 0x29426
+0x5254 0x29420
+0x5255 0x29423
+0x5256 0x29424
+0x5257 0x29421
+0x5258 0x29428
+0x5259 0x29425
+0x525A 0x2941E
+0x525B 0x29494
+0x525C 0x29493
+0x525D 0x2948F
+0x525E 0x2949A
+0x525F 0x294AD
+0x5261 0x295CA
+0x5262 0x295C5
+0x5263 0x296BB
+0x5264 0x296E1
+0x5265 0x296EA
+0x5266 0x296E4
+0x5267 0x296ED
+0x5268 0x296E6
+0x5269 0x296E0
+0x526A 0x296E8
+0x526B 0x296E5
+0x526C 0x2981A
+0x526D 0x29894
+0x526E 0x29896
+0x526F 0x2989E
+0x5270 0x29895
+0x5271 0x298A1
+0x5272 0x2988E
+0x5273 0x2989B
+0x5274 0x29892
+0x5275 0x29897
+0x5276 0x29899
+0x5277 0x29893
+0x5278 0x29A32
+0x5279 0x29A2F
+0x527A 0x29A2E
+0x527B 0x29A33
+0x527C 0x29B1C
+0x527D 0x29B1E
+0x527E 0x29B11
+0x5321 0x29B20
+0x5322 0x29B1F
+0x5323 0x29B19
+0x5324 0x29B16
+0x5325 0x29CAC
+0x5326 0x29CB9
+0x5327 0x29CB3
+0x5328 0x29CA6
+0x5329 0x29CA2
+0x532A 0x29CA9
+0x532B 0x29CA7
+0x532C 0x29D6C
+0x532D 0x29D6D
+0x532E 0x29D69
+0x532F 0x29D80
+0x5330 0x29D66
+0x5331 0x29D65
+0x5332 0x29D71
+0x5333 0x29D6B
+0x5334 0x29FBD
+0x5335 0x29FC1
+0x5336 0x29FD3
+0x5337 0x29FB6
+0x5339 0x29FB9
+0x533A 0x29FD4
+0x533B 0x29FB7
+0x533C 0x29FDB
+0x533D 0x29FB8
+0x533E 0x29FC0
+0x533F 0x29FBC
+0x5340 0x29FD5
+0x5341 0x29FBF
+0x5342 0x29FC3
+0x5343 0x29FC9
+0x5344 0x2A258
+0x5345 0x2A290
+0x5346 0x2A295
+0x5347 0x2A297
+0x5348 0x2A309
+0x5349 0x2A308
+0x534A 0x2A306
+0x534B 0x2A305
+0x534C 0x2A310
+0x534D 0x2A397
+0x534E 0x2A395
+0x534F 0x2A3EE
+0x5350 0x2A41F
+0x5351 0x2FA1A
+0x5352 0x21B4B
+0x5353 0x2018E
+0x5354 0x203E8
+0x5355 0x203F0
+0x5356 0x203F4
+0x5357 0x20406
+0x5358 0x203ED
+0x535A 0x203E9
+0x535B 0x20400
+0x535C 0x204B8
+0x535D 0x2056D
+0x535E 0x20804
+0x535F 0x20801
+0x5360 0x20803
+0x5361 0x20802
+0x5364 0x20962
+0x5365 0x20ABA
+0x5366 0x20B13
+0x5367 0x20FDE
+0x5368 0x20FD7
+0x5369 0x20FE4
+0x536A 0x20FCE
+0x536B 0x20FE3
+0x536C 0x20FDD
+0x536D 0x2103A
+0x536E 0x20FDB
+0x536F 0x20FD6
+0x5370 0x20FE0
+0x5371 0x20FD4
+0x5372 0x20FCB
+0x5373 0x20FE1
+0x5374 0x20FC9
+0x5375 0x20FDF
+0x5376 0x2103C
+0x5377 0x20FFC
+0x5378 0x20FCF
+0x5379 0x21479
+0x537A 0x21476
+0x537B 0x21478
+0x537C 0x21687
+0x537D 0x2189C
+0x537E 0x218B1
+0x5421 0x218C1
+0x5422 0x2189A
+0x5423 0x21892
+0x5425 0x218C2
+0x5426 0x21896
+0x5427 0x218C0
+0x5428 0x21891
+0x5429 0x21895
+0x542A 0x219A2
+0x542B 0x21AC3
+0x542C 0x21AC0
+0x542D 0x21AC2
+0x542E 0x20B8A
+0x542F 0x21BB0
+0x5430 0x21C16
+0x5431 0x21F46
+0x5432 0x21F4A
+0x5433 0x21F3E
+0x5434 0x21F45
+0x5435 0x21F42
+0x5437 0x21F5B
+0x5438 0x21F44
+0x5439 0x22004
+0x543A 0x24022
+0x543B 0x22155
+0x543C 0x22157
+0x543D 0x22151
+0x543E 0x2214E
+0x543F 0x2215A
+0x5440 0x222C6
+0x5441 0x222C3
+0x5443 0x222C5
+0x5444 0x222CC
+0x5445 0x22371
+0x5446 0x22426
+0x5447 0x224B2
+0x5448 0x2257A
+0x5449 0x22584
+0x544A 0x2257B
+0x544B 0x22874
+0x544C 0x2288C
+0x544D 0x22851
+0x544E 0x22848
+0x544F 0x2288D
+0x5450 0x22892
+0x5451 0x22898
+0x5452 0x22893
+0x5453 0x228B0
+0x5454 0x2284E
+0x5455 0x22896
+0x5456 0x22897
+0x5457 0x2289C
+0x5458 0x228CA
+0x5459 0x22D33
+0x545A 0x22D83
+0x545B 0x22D84
+0x545C 0x22D9A
+0x545D 0x22D8C
+0x545F 0x22D99
+0x5460 0x22EE0
+0x5461 0x22FE4
+0x5462 0x22FF8
+0x5463 0x22FED
+0x5464 0x22FF3
+0x5465 0x22FF4
+0x5466 0x22FF5
+0x5467 0x22FFD
+0x5468 0x23119
+0x5469 0x2329E
+0x546A 0x232C4
+0x546B 0x2329F
+0x546C 0x2339B
+0x546D 0x2339F
+0x546E 0x2339A
+0x546F 0x236AA
+0x5470 0x2369D
+0x5471 0x23692
+0x5472 0x236A2
+0x5473 0x236AF
+0x5474 0x236EB
+0x5475 0x236A0
+0x5476 0x236A1
+0x5477 0x23694
+0x5478 0x23698
+0x5479 0x2368F
+0x547A 0x23687
+0x547B 0x23684
+0x547C 0x236A9
+0x547D 0x2367C
+0x547E 0x23918
+0x5521 0x23A5F
+0x5522 0x23A62
+0x5523 0x23A61
+0x5524 0x23AC0
+0x5525 0x23B15
+0x5526 0x23BFC
+0x5527 0x23BF9
+0x5528 0x23FC8
+0x5529 0x23FC9
+0x552A 0x23FDE
+0x552B 0x23FCA
+0x552C 0x23FE2
+0x552F 0x24004
+0x5530 0x23FCC
+0x5531 0x23FDD
+0x5532 0x23FE4
+0x5533 0x23FD3
+0x5534 0x23FC7
+0x5535 0x23FC6
+0x5537 0x24037
+0x5538 0x243D8
+0x5539 0x243EE
+0x553A 0x243B2
+0x553B 0x243A3
+0x553C 0x243B3
+0x553D 0x243ED
+0x553E 0x243F8
+0x553F 0x24531
+0x5540 0x2455B
+0x5541 0x24566
+0x5542 0x24569
+0x5543 0x24596
+0x5544 0x2459B
+0x5545 0x245F7
+0x5546 0x245F3
+0x5547 0x245F4
+0x5548 0x245F5
+0x5549 0x246E2
+0x554A 0x246E7
+0x554B 0x246E5
+0x554C 0x246E9
+0x554D 0x246E6
+0x554E 0x246E3
+0x554F 0x24874
+0x5550 0x2487F
+0x5551 0x2488F
+0x5552 0x24890
+0x5553 0x24897
+0x5554 0x248A3
+0x5555 0x2488E
+0x5556 0x24898
+0x5557 0x2488C
+0x5558 0x24A42
+0x5559 0x24A44
+0x555A 0x24A69
+0x555B 0x24A43
+0x555C 0x24A68
+0x555E 0x24B8D
+0x555F 0x24B88
+0x5560 0x24B8B
+0x5561 0x24B89
+0x5562 0x24CCC
+0x5563 0x24D1F
+0x5564 0x24E80
+0x5565 0x24E5E
+0x5566 0x24E67
+0x5567 0x24E68
+0x5568 0x24E65
+0x556A 0x24E74
+0x556B 0x24E69
+0x556C 0x24E61
+0x556D 0x24E62
+0x556E 0x24E6C
+0x556F 0x24E93
+0x5570 0x24E86
+0x5571 0x24F9D
+0x5572 0x24F9B
+0x5573 0x2501B
+0x5574 0x25016
+0x5575 0x25019
+0x5576 0x25014
+0x5577 0x25018
+0x5578 0x25015
+0x5579 0x25099
+0x557A 0x25098
+0x557B 0x2525D
+0x557C 0x25289
+0x557D 0x2527A
+0x557E 0x2527D
+0x5621 0x2524B
+0x5623 0x25278
+0x5624 0x2527F
+0x5625 0x25277
+0x5626 0x2527E
+0x5627 0x25279
+0x5628 0x252AB
+0x5629 0x2527C
+0x562A 0x25274
+0x562B 0x25275
+0x562C 0x252A7
+0x562D 0x2538D
+0x562E 0x2554E
+0x562F 0x25566
+0x5630 0x25561
+0x5631 0x2554D
+0x5632 0x2554F
+0x5634 0x25554
+0x5635 0x2557C
+0x5636 0x256DA
+0x5637 0x256DE
+0x5638 0x256D8
+0x5639 0x256DD
+0x563A 0x256DF
+0x563B 0x25866
+0x563C 0x25862
+0x563D 0x2585F
+0x563E 0x25864
+0x563F 0x25863
+0x5640 0x25860
+0x5641 0x25888
+0x5642 0x2586A
+0x5643 0x25867
+0x5644 0x25887
+0x5645 0x2583F
+0x5646 0x2586C
+0x5647 0x2586E
+0x5648 0x258AD
+0x5649 0x259F1
+0x564A 0x259F4
+0x564B 0x259F6
+0x564C 0x259F5
+0x564D 0x259F8
+0x564E 0x259FB
+0x564F 0x259EC
+0x5650 0x259EF
+0x5651 0x259ED
+0x5653 0x259F7
+0x5654 0x259F9
+0x5655 0x259FD
+0x5656 0x25AB1
+0x5657 0x25C36
+0x5658 0x25C1B
+0x5659 0x25C32
+0x565A 0x25C42
+0x565B 0x25C4D
+0x565C 0x25C1F
+0x565D 0x25C21
+0x565E 0x25C1C
+0x565F 0x25C31
+0x5660 0x25C2E
+0x5661 0x25C47
+0x5662 0x25C3B
+0x5663 0x25C41
+0x5664 0x25C18
+0x5665 0x25C39
+0x5666 0x25C1D
+0x5667 0x25C27
+0x5668 0x25C23
+0x566A 0x25EEE
+0x566B 0x25EE8
+0x566C 0x25EE5
+0x566D 0x25EEF
+0x566E 0x25EE4
+0x566F 0x25EEC
+0x5670 0x25EF0
+0x5671 0x260D7
+0x5672 0x260D8
+0x5673 0x260D4
+0x5674 0x260CA
+0x5675 0x260D2
+0x5676 0x260CB
+0x5677 0x260D3
+0x5678 0x260E6
+0x5679 0x260E2
+0x567A 0x26249
+0x567B 0x26248
+0x567C 0x262FF
+0x567D 0x26309
+0x567E 0x263B0
+0x5721 0x263AF
+0x5722 0x2647C
+0x5723 0x26478
+0x5724 0x2647A
+0x5725 0x26472
+0x5726 0x26479
+0x5727 0x2647E
+0x5728 0x2650C
+0x5729 0x2650B
+0x572A 0x265CD
+0x572B 0x265BE
+0x572C 0x265BC
+0x572D 0x265BF
+0x572E 0x265C0
+0x572F 0x265BD
+0x5730 0x26838
+0x5731 0x26808
+0x5732 0x26805
+0x5733 0x2683B
+0x5734 0x26810
+0x5735 0x2680C
+0x5736 0x2680D
+0x5737 0x26804
+0x5738 0x2683A
+0x5739 0x26813
+0x573A 0x26837
+0x573B 0x26839
+0x573C 0x2691F
+0x573D 0x2694B
+0x573E 0x269EE
+0x573F 0x26A75
+0x5740 0x26A78
+0x5741 0x26A7C
+0x5742 0x26A74
+0x5743 0x26A76
+0x5744 0x26AEA
+0x5745 0x26AEB
+0x5746 0x26DFB
+0x5747 0x26E19
+0x5748 0x26EA7
+0x5749 0x26E8C
+0x574A 0x26EDC
+0x574B 0x26E98
+0x574C 0x26EBE
+0x574D 0x26E9E
+0x574E 0x26F0F
+0x574F 0x26E9F
+0x5750 0x26EDD
+0x5751 0x26E93
+0x5752 0x26EBB
+0x5753 0x26EB6
+0x5754 0x26E90
+0x5755 0x26EA1
+0x5756 0x26EBD
+0x5757 0x26EDE
+0x5758 0x26E3A
+0x5759 0x26F22
+0x575A 0x26E97
+0x575B 0x26E94
+0x575C 0x26EC3
+0x575D 0x26E8E
+0x575E 0x26EA8
+0x575F 0x26E99
+0x5760 0x26EAD
+0x5761 0x26E9B
+0x5762 0x26EA2
+0x5763 0x26F21
+0x5764 0x26EAC
+0x5765 0x26F0E
+0x5766 0x26F31
+0x5767 0x271E1
+0x5768 0x271DE
+0x5769 0x271DF
+0x576A 0x271DC
+0x576B 0x271DD
+0x576C 0x271EC
+0x576D 0x271E7
+0x576E 0x27369
+0x576F 0x273B8
+0x5770 0x273A1
+0x5771 0x273A8
+0x5772 0x273BA
+0x5773 0x273C2
+0x5774 0x273A6
+0x5775 0x273A4
+0x5776 0x273A3
+0x5777 0x273AB
+0x5778 0x273BC
+0x5779 0x273B7
+0x577A 0x273BF
+0x577B 0x273AD
+0x577C 0x273B1
+0x577D 0x273CA
+0x577E 0x273C4
+0x5821 0x273B9
+0x5822 0x275C8
+0x5823 0x275C6
+0x5824 0x275C7
+0x5825 0x2770A
+0x5826 0x2770D
+0x5827 0x276FB
+0x5828 0x27703
+0x5829 0x27702
+0x582A 0x276FC
+0x582B 0x276F9
+0x582C 0x276F8
+0x582D 0x2786E
+0x582E 0x27863
+0x582F 0x27862
+0x5830 0x27861
+0x5831 0x2786B
+0x5833 0x2786F
+0x5834 0x27866
+0x5835 0x2786C
+0x5836 0x2790E
+0x5837 0x27915
+0x5838 0x27916
+0x5839 0x27910
+0x583A 0x27917
+0x583B 0x27911
+0x583C 0x27A6E
+0x583D 0x27A6C
+0x583E 0x27A87
+0x583F 0x27A83
+0x5840 0x27A63
+0x5841 0x27ADC
+0x5842 0x27BC0
+0x5843 0x27BF7
+0x5844 0x27BFA
+0x5845 0x27C70
+0x5846 0x27C6A
+0x5847 0x27C68
+0x5848 0x27C69
+0x5849 0x27C84
+0x584A 0x27CEC
+0x584B 0x27CE7
+0x584C 0x27CEE
+0x584D 0x27DBA
+0x584E 0x27DB2
+0x584F 0x27DB5
+0x5850 0x27DCB
+0x5851 0x2080B
+0x5852 0x27DD0
+0x5853 0x27E6D
+0x5854 0x27E6C
+0x5856 0x27F45
+0x5857 0x27F46
+0x5858 0x27F34
+0x5859 0x27F2C
+0x585A 0x27F35
+0x585B 0x27F44
+0x585D 0x27F76
+0x585E 0x280B1
+0x585F 0x280AA
+0x5860 0x280A1
+0x5861 0x280B2
+0x5863 0x280A6
+0x5864 0x280B5
+0x5865 0x280B4
+0x5866 0x280B8
+0x5867 0x280AF
+0x5868 0x280B0
+0x5869 0x280A3
+0x586A 0x28262
+0x586B 0x28264
+0x586C 0x28356
+0x586D 0x28351
+0x586E 0x2834F
+0x586F 0x28368
+0x5870 0x2834C
+0x5871 0x28350
+0x5873 0x28348
+0x5874 0x2834A
+0x5875 0x28421
+0x5876 0x285E3
+0x5877 0x285B9
+0x5878 0x285DE
+0x5879 0x285B7
+0x587A 0x285E1
+0x587B 0x285B6
+0x587C 0x285B5
+0x587D 0x285DF
+0x5921 0x28797
+0x5922 0x2879A
+0x5923 0x2879B
+0x5924 0x28798
+0x5925 0x28792
+0x5926 0x28793
+0x5927 0x287D7
+0x5928 0x28773
+0x5929 0x2886B
+0x592A 0x28874
+0x592B 0x28878
+0x592C 0x2886D
+0x592D 0x28918
+0x592E 0x289E9
+0x592F 0x289F5
+0x5930 0x289EA
+0x5931 0x28A2E
+0x5932 0x289E7
+0x5933 0x289FE
+0x5934 0x289E5
+0x5935 0x28A36
+0x5936 0x289F0
+0x5937 0x289E6
+0x5938 0x28A2C
+0x5939 0x28C89
+0x593A 0x28C95
+0x593B 0x28C93
+0x593C 0x28D4D
+0x593D 0x28D4A
+0x593E 0x28D4F
+0x593F 0x28D50
+0x5940 0x28D4B
+0x5941 0x28F2A
+0x5942 0x28F2B
+0x5943 0x28F2F
+0x5944 0x28F2E
+0x5945 0x28F7C
+0x5946 0x28FED
+0x5947 0x28FE2
+0x5948 0x290E0
+0x5949 0x290DC
+0x594A 0x290DA
+0x594B 0x290D6
+0x594C 0x290F4
+0x594D 0x290D9
+0x594E 0x290D5
+0x594F 0x29222
+0x5950 0x29221
+0x5951 0x29224
+0x5952 0x29225
+0x5953 0x29226
+0x5954 0x29223
+0x5955 0x292AA
+0x5956 0x292AF
+0x5957 0x292B0
+0x5958 0x292AB
+0x5959 0x293AF
+0x595A 0x293B7
+0x595B 0x293B5
+0x595C 0x293B2
+0x595D 0x293B3
+0x595E 0x2942B
+0x595F 0x294D8
+0x5960 0x294C2
+0x5961 0x294AF
+0x5962 0x294BC
+0x5963 0x294B8
+0x5964 0x294BE
+0x5965 0x294B7
+0x5966 0x294B4
+0x5967 0x294BF
+0x5968 0x294B3
+0x5969 0x294B1
+0x596A 0x294BB
+0x596B 0x294BD
+0x596C 0x294D6
+0x596D 0x294DD
+0x596E 0x295D8
+0x596F 0x295D3
+0x5970 0x295D5
+0x5971 0x295E3
+0x5972 0x295E2
+0x5973 0x295D9
+0x5974 0x295DE
+0x5975 0x295DF
+0x5976 0x295DA
+0x5977 0x295D4
+0x5978 0x296F3
+0x5979 0x296E2
+0x597A 0x2970D
+0x597B 0x29701
+0x597C 0x29705
+0x597D 0x2971A
+0x597E 0x29703
+0x5A21 0x2971F
+0x5A22 0x29716
+0x5A23 0x296FA
+0x5A24 0x296FC
+0x5A25 0x2970A
+0x5A27 0x298BC
+0x5A28 0x298CA
+0x5A29 0x298B6
+0x5A2A 0x298C7
+0x5A2B 0x298BF
+0x5A2D 0x298B9
+0x5A2F 0x298B0
+0x5A30 0x298B8
+0x5A31 0x298BD
+0x5A32 0x29891
+0x5A33 0x298BB
+0x5A34 0x298BE
+0x5A35 0x29A3E
+0x5A36 0x29A3D
+0x5A37 0x29B38
+0x5A38 0x29B3D
+0x5A39 0x29B39
+0x5A3A 0x29B33
+0x5A3B 0x29C33
+0x5A3C 0x29CBB
+0x5A3D 0x29CC6
+0x5A3E 0x29CC5
+0x5A3F 0x29CC7
+0x5A40 0x29CCB
+0x5A41 0x29CA8
+0x5A42 0x29CC8
+0x5A43 0x29CBE
+0x5A44 0x29CC1
+0x5A45 0x29CBD
+0x5A46 0x29D82
+0x5A47 0x29D9E
+0x5A48 0x29D81
+0x5A49 0x29D84
+0x5A4B 0x29D96
+0x5A4C 0x29D8E
+0x5A4D 0x29D88
+0x5A4E 0x29D87
+0x5A4F 0x29FE0
+0x5A50 0x2A00D
+0x5A51 0x29FDF
+0x5A52 0x29FE4
+0x5A53 0x29FE2
+0x5A54 0x29FDD
+0x5A55 0x29FEC
+0x5A56 0x29FDE
+0x5A57 0x29FE7
+0x5A58 0x29FEA
+0x5A59 0x29FE3
+0x5A5A 0x2A25C
+0x5A5C 0x2A25D
+0x5A5D 0x2A29C
+0x5A5E 0x2A31D
+0x5A5F 0x2A39D
+0x5A60 0x2A39E
+0x5A61 0x2A39B
+0x5A62 0x2A3B5
+0x5A63 0x2A3B9
+0x5A64 0x2A3B6
+0x5A65 0x2A3F3
+0x5A66 0x2A3F2
+0x5A67 0x2A3F4
+0x5A68 0x2A426
+0x5A69 0x2A427
+0x5A6A 0x2A425
+0x5A6B 0x2A506
+0x5A6C 0x2A50B
+0x5A6D 0x2A53A
+0x5A6E 0x2A53C
+0x5A6F 0x2040A
+0x5A70 0x2040B
+0x5A71 0x204BF
+0x5A72 0x204FD
+0x5A73 0x20618
+0x5A74 0x291DF
+0x5A75 0x25390
+0x5A76 0x2069E
+0x5A77 0x207FC
+0x5A78 0x20810
+0x5A79 0x2080F
+0x5A7A 0x2080D
+0x5A7B 0x208B9
+0x5A7C 0x208B7
+0x5A7D 0x208BA
+0x5A7E 0x2090A
+0x5B21 0x21041
+0x5B22 0x2108B
+0x5B23 0x21046
+0x5B24 0x21053
+0x5B25 0x210E2
+0x5B26 0x2103F
+0x5B27 0x20F7C
+0x5B28 0x2104B
+0x5B29 0x2104E
+0x5B2A 0x2108A
+0x5B2B 0x21047
+0x5B2C 0x21493
+0x5B2D 0x27DCE
+0x5B2E 0x2148C
+0x5B2F 0x214AF
+0x5B30 0x214C9
+0x5B31 0x215C6
+0x5B32 0x215C8
+0x5B33 0x21691
+0x5B34 0x218CF
+0x5B35 0x218D4
+0x5B36 0x218CE
+0x5B37 0x21ADD
+0x5B38 0x21AD4
+0x5B39 0x21F49
+0x5B3A 0x21F63
+0x5B3B 0x21F5D
+0x5B3D 0x21F67
+0x5B3E 0x21FBB
+0x5B3F 0x21F60
+0x5B40 0x21F80
+0x5B41 0x2215F
+0x5B42 0x22160
+0x5B43 0x222DA
+0x5B44 0x222D2
+0x5B45 0x222DD
+0x5B46 0x2258E
+0x5B47 0x22588
+0x5B48 0x2256C
+0x5B49 0x2289E
+0x5B4A 0x228C9
+0x5B4B 0x228A4
+0x5B4D 0x228D9
+0x5B4E 0x228D2
+0x5B4F 0x228DA
+0x5B50 0x228DD
+0x5B51 0x228CE
+0x5B52 0x228FC
+0x5B53 0x22A14
+0x5B54 0x22A60
+0x5B55 0x22DD7
+0x5B56 0x22DCB
+0x5B57 0x22DCD
+0x5B58 0x22DD5
+0x5B59 0x22EE7
+0x5B5A 0x23000
+0x5B5B 0x2300A
+0x5B5C 0x2300F
+0x5B5D 0x23002
+0x5B5E 0x23001
+0x5B5F 0x2311D
+0x5B60 0x232CA
+0x5B61 0x232CB
+0x5B62 0x232CD
+0x5B63 0x2334F
+0x5B64 0x2339C
+0x5B65 0x23680
+0x5B66 0x2370D
+0x5B67 0x23702
+0x5B69 0x23707
+0x5B6A 0x236F7
+0x5B6B 0x236F8
+0x5B6C 0x236FD
+0x5B6D 0x23724
+0x5B6E 0x236FB
+0x5B6F 0x23739
+0x5B70 0x2373A
+0x5B71 0x23922
+0x5B73 0x23A6A
+0x5B74 0x23A6D
+0x5B75 0x23A74
+0x5B76 0x23C0E
+0x5B77 0x23FDF
+0x5B78 0x2402B
+0x5B79 0x23FE3
+0x5B7A 0x24026
+0x5B7B 0x2402A
+0x5B7C 0x24023
+0x5B7D 0x24035
+0x5B7E 0x2404A
+0x5C21 0x243FD
+0x5C22 0x24400
+0x5C23 0x2441E
+0x5C24 0x243FF
+0x5C25 0x2459E
+0x5C26 0x245FA
+0x5C27 0x246F1
+0x5C28 0x24895
+0x5C29 0x248A8
+0x5C2A 0x248A6
+0x5C2B 0x24A6E
+0x5C2C 0x24A83
+0x5C2D 0x24A6D
+0x5C2E 0x24B8F
+0x5C30 0x24CDF
+0x5C31 0x24CD5
+0x5C32 0x24CE0
+0x5C33 0x24CD3
+0x5C34 0x24CD8
+0x5C35 0x24E8C
+0x5C37 0x24E94
+0x5C38 0x24E96
+0x5C39 0x24E85
+0x5C3A 0x24E8F
+0x5C3B 0x24EA9
+0x5C3C 0x24E8E
+0x5C3D 0x24E90
+0x5C3E 0x24EB8
+0x5C3F 0x24EC3
+0x5C40 0x24EBB
+0x5C41 0x24FA5
+0x5C42 0x24FA2
+0x5C44 0x24FA3
+0x5C45 0x250B5
+0x5C46 0x250AC
+0x5C47 0x250A8
+0x5C48 0x252AD
+0x5C49 0x252B8
+0x5C4A 0x252B4
+0x5C4B 0x252AE
+0x5C4C 0x252B6
+0x5C4E 0x252C1
+0x5C4F 0x252BF
+0x5C50 0x25392
+0x5C51 0x25400
+0x5C52 0x25401
+0x5C53 0x25575
+0x5C54 0x25572
+0x5C55 0x25578
+0x5C56 0x25570
+0x5C57 0x2557E
+0x5C58 0x2557D
+0x5C59 0x2557F
+0x5C5A 0x256EF
+0x5C5B 0x2586D
+0x5C5C 0x2588E
+0x5C5D 0x2588F
+0x5C5E 0x2588A
+0x5C5F 0x2588D
+0x5C60 0x25895
+0x5C61 0x2588B
+0x5C62 0x2588C
+0x5C63 0x258B0
+0x5C64 0x25893
+0x5C65 0x259FC
+0x5C66 0x25A15
+0x5C67 0x25A0E
+0x5C68 0x25A18
+0x5C69 0x25A11
+0x5C6A 0x25A0D
+0x5C6B 0x25ABB
+0x5C6C 0x25AB3
+0x5C6E 0x25CA1
+0x5C6F 0x25C9A
+0x5C70 0x25C84
+0x5C71 0x25CA0
+0x5C72 0x25C86
+0x5C73 0x25C9D
+0x5C74 0x25CAA
+0x5C75 0x25C78
+0x5C76 0x25C8D
+0x5C77 0x25C8A
+0x5C78 0x25CA6
+0x5C79 0x25C7A
+0x5C7A 0x25C97
+0x5C7B 0x25C88
+0x5C7C 0x25C8E
+0x5D21 0x25C76
+0x5D22 0x25C81
+0x5D23 0x25C85
+0x5D24 0x25C75
+0x5D25 0x25CA8
+0x5D26 0x25C8F
+0x5D27 0x25C91
+0x5D28 0x25CA2
+0x5D29 0x25C9C
+0x5D2A 0x25C89
+0x5D2B 0x25C7F
+0x5D2C 0x25C96
+0x5D2D 0x25C79
+0x5D2E 0x25C9F
+0x5D2F 0x25CA7
+0x5D31 0x25C87
+0x5D32 0x25C9B
+0x5D33 0x25CA5
+0x5D34 0x25C8B
+0x5D35 0x25CC9
+0x5D36 0x25EFF
+0x5D37 0x25F03
+0x5D38 0x25F00
+0x5D39 0x25F02
+0x5D3A 0x25F04
+0x5D3B 0x25F05
+0x5D3C 0x25EE6
+0x5D3D 0x25F1F
+0x5D3E 0x26114
+0x5D40 0x2610C
+0x5D41 0x2610F
+0x5D42 0x26119
+0x5D43 0x2610B
+0x5D44 0x26113
+0x5D45 0x260D5
+0x5D47 0x2611C
+0x5D48 0x26250
+0x5D49 0x2624E
+0x5D4A 0x26312
+0x5D4B 0x263B9
+0x5D4C 0x26485
+0x5D4D 0x26488
+0x5D4E 0x26490
+0x5D4F 0x26513
+0x5D50 0x265D0
+0x5D51 0x265D1
+0x5D52 0x265D2
+0x5D53 0x265D7
+0x5D54 0x265D6
+0x5D55 0x265E5
+0x5D56 0x26846
+0x5D57 0x2686B
+0x5D58 0x26845
+0x5D59 0x2683F
+0x5D5A 0x2683E
+0x5D5C 0x2686A
+0x5D5D 0x26868
+0x5D5E 0x2684C
+0x5D5F 0x26923
+0x5D60 0x26922
+0x5D61 0x26997
+0x5D62 0x26991
+0x5D63 0x25AB5
+0x5D64 0x26998
+0x5D65 0x2699C
+0x5D66 0x26A89
+0x5D68 0x26A8B
+0x5D69 0x26A8A
+0x5D6A 0x26A8D
+0x5D6B 0x26A8E
+0x5D6C 0x26A88
+0x5D6D 0x26F4E
+0x5D6E 0x26F44
+0x5D6F 0x26F37
+0x5D70 0x26F75
+0x5D71 0x26F54
+0x5D72 0x26F76
+0x5D73 0x26F34
+0x5D74 0x26F6B
+0x5D75 0x26F32
+0x5D76 0x26F57
+0x5D77 0x26F52
+0x5D78 0x26F45
+0x5D7A 0x26EB1
+0x5D7B 0x26F4B
+0x5D7C 0x26F47
+0x5D7D 0x26F33
+0x5D7E 0x26F40
+0x5E21 0x26F3C
+0x5E22 0x26F43
+0x5E23 0x26F4F
+0x5E24 0x26F55
+0x5E25 0x26F41
+0x5E26 0x26FB2
+0x5E27 0x26FC0
+0x5E28 0x27434
+0x5E29 0x273F9
+0x5E2A 0x27419
+0x5E2B 0x2740D
+0x5E2C 0x273FA
+0x5E2D 0x2741E
+0x5E2E 0x2741F
+0x5E2F 0x2740E
+0x5E30 0x27440
+0x5E31 0x27408
+0x5E33 0x27413
+0x5E34 0x2744C
+0x5E36 0x275CC
+0x5E37 0x275CB
+0x5E38 0x27724
+0x5E39 0x27725
+0x5E3A 0x2773D
+0x5E3B 0x27720
+0x5E3C 0x27727
+0x5E3D 0x27726
+0x5E3E 0x2771D
+0x5E3F 0x2771E
+0x5E40 0x27732
+0x5E41 0x2776C
+0x5E42 0x27759
+0x5E44 0x2787A
+0x5E45 0x27879
+0x5E46 0x2791B
+0x5E47 0x2792E
+0x5E48 0x27923
+0x5E49 0x27920
+0x5E4A 0x2791F
+0x5E4B 0x27AB6
+0x5E4C 0x27AB9
+0x5E4D 0x27AA1
+0x5E4E 0x27AA3
+0x5E4F 0x27AA8
+0x5E50 0x27AAF
+0x5E51 0x27A9A
+0x5E52 0x27A99
+0x5E53 0x27AA2
+0x5E54 0x27A9D
+0x5E56 0x27AAB
+0x5E57 0x27BC9
+0x5E58 0x27BFE
+0x5E59 0x27C00
+0x5E5A 0x27BFC
+0x5E5B 0x27C07
+0x5E5C 0x27C75
+0x5E5D 0x27C72
+0x5E5E 0x27C73
+0x5E5F 0x27C74
+0x5E60 0x27CFA
+0x5E61 0x27CFC
+0x5E62 0x27CF8
+0x5E63 0x27CF6
+0x5E64 0x27CFB
+0x5E65 0x27DCD
+0x5E66 0x27DD1
+0x5E67 0x27DCF
+0x5E68 0x27E74
+0x5E69 0x27E72
+0x5E6A 0x27E73
+0x5E6B 0x27F54
+0x5E6C 0x27F51
+0x5E6E 0x27F53
+0x5E6F 0x27F49
+0x5E70 0x27F4C
+0x5E71 0x27F4A
+0x5E72 0x27F4F
+0x5E73 0x27F56
+0x5E74 0x28100
+0x5E75 0x280D5
+0x5E76 0x280D7
+0x5E77 0x280FF
+0x5E78 0x280D9
+0x5E79 0x280E3
+0x5E7A 0x280D3
+0x5E7C 0x280D8
+0x5E7D 0x280D4
+0x5E7E 0x280DE
+0x5F21 0x28271
+0x5F22 0x28374
+0x5F23 0x28388
+0x5F24 0x2837F
+0x5F25 0x2836B
+0x5F26 0x28387
+0x5F27 0x28379
+0x5F28 0x28378
+0x5F29 0x28389
+0x5F2A 0x28380
+0x5F2B 0x28376
+0x5F2C 0x28429
+0x5F2D 0x28428
+0x5F2E 0x2842F
+0x5F2F 0x285E5
+0x5F30 0x28604
+0x5F31 0x28603
+0x5F32 0x285F0
+0x5F33 0x285E8
+0x5F34 0x285EA
+0x5F35 0x285F1
+0x5F36 0x28601
+0x5F37 0x28602
+0x5F38 0x287A9
+0x5F39 0x287AB
+0x5F3A 0x287B7
+0x5F3B 0x287B6
+0x5F3D 0x288A0
+0x5F3E 0x2888E
+0x5F3F 0x28886
+0x5F40 0x28887
+0x5F41 0x28885
+0x5F42 0x2888B
+0x5F43 0x28888
+0x5F44 0x28890
+0x5F45 0x2891A
+0x5F46 0x28934
+0x5F47 0x28A37
+0x5F48 0x28A2F
+0x5F49 0x28A30
+0x5F4A 0x28A39
+0x5F4B 0x28A34
+0x5F4C 0x28A33
+0x5F4D 0x28A85
+0x5F4E 0x28A84
+0x5F4F 0x28A3A
+0x5F50 0x28C9F
+0x5F51 0x28D69
+0x5F52 0x28D6C
+0x5F53 0x28D6A
+0x5F54 0x28D67
+0x5F55 0x28D6B
+0x5F56 0x28F3F
+0x5F57 0x28F40
+0x5F58 0x2900B
+0x5F59 0x290D2
+0x5F5A 0x290F8
+0x5F5B 0x29101
+0x5F5C 0x290FA
+0x5F5D 0x29116
+0x5F5E 0x2F9F6
+0x5F5F 0x2922C
+0x5F60 0x2922D
+0x5F61 0x2922F
+0x5F62 0x2922E
+0x5F63 0x292C1
+0x5F64 0x292F5
+0x5F65 0x292C4
+0x5F66 0x292DE
+0x5F67 0x292CC
+0x5F68 0x292D2
+0x5F69 0x292C2
+0x5F6A 0x292CD
+0x5F6B 0x292CF
+0x5F6C 0x292DD
+0x5F6D 0x292C8
+0x5F6E 0x293BA
+0x5F6F 0x293BE
+0x5F70 0x293BF
+0x5F71 0x2942E
+0x5F72 0x29430
+0x5F73 0x294E7
+0x5F74 0x294EE
+0x5F75 0x294E8
+0x5F76 0x294E6
+0x5F77 0x294E2
+0x5F78 0x294E4
+0x5F79 0x294FB
+0x5F7A 0x294FC
+0x5F7B 0x294EA
+0x5F7C 0x295ED
+0x5F7D 0x295F6
+0x5F7E 0x295F3
+0x6021 0x295F4
+0x6022 0x295F1
+0x6023 0x295F7
+0x6024 0x295F5
+0x6025 0x295EA
+0x6026 0x295EB
+0x6027 0x29700
+0x6028 0x2972C
+0x6029 0x29712
+0x602A 0x2973D
+0x602B 0x29733
+0x602D 0x29730
+0x602E 0x29740
+0x602F 0x29731
+0x6030 0x29757
+0x6032 0x29735
+0x6033 0x29732
+0x6034 0x2972D
+0x6035 0x29736
+0x6036 0x29738
+0x6037 0x29762
+0x6038 0x2975F
+0x6039 0x2978A
+0x603A 0x298D6
+0x603B 0x298D8
+0x603C 0x298DD
+0x603D 0x298E4
+0x603E 0x298E3
+0x603F 0x29A4D
+0x6040 0x29AD7
+0x6041 0x29B4A
+0x6042 0x29B4C
+0x6043 0x29B50
+0x6044 0x29B4B
+0x6045 0x29B4E
+0x6046 0x29B4F
+0x6047 0x29C39
+0x6048 0x29CD2
+0x6049 0x29CCD
+0x604A 0x29CD3
+0x604B 0x29CE1
+0x604C 0x29CCE
+0x604D 0x29CD5
+0x604E 0x29CDD
+0x604F 0x29CD4
+0x6050 0x29CCF
+0x6051 0x29DCB
+0x6052 0x29DA6
+0x6053 0x29DC2
+0x6054 0x29DA5
+0x6055 0x29DA9
+0x6056 0x29DA2
+0x6057 0x29DA4
+0x6058 0x29DB0
+0x6059 0x29DCC
+0x605A 0x29DAF
+0x605B 0x29DBF
+0x605C 0x2A024
+0x605D 0x2A01A
+0x605E 0x2A014
+0x605F 0x2A03A
+0x6060 0x2A020
+0x6061 0x2A01B
+0x6062 0x2A021
+0x6063 0x2A025
+0x6064 0x2A01E
+0x6065 0x2A03F
+0x6066 0x2A040
+0x6067 0x2A018
+0x6068 0x2A02C
+0x6069 0x2A015
+0x606A 0x2A02D
+0x606B 0x2A01F
+0x606C 0x2A029
+0x606D 0x2A04B
+0x606E 0x2A2B3
+0x606F 0x2A2A5
+0x6070 0x2A2A7
+0x6071 0x2A2AB
+0x6072 0x2A2A6
+0x6073 0x2A2AA
+0x6074 0x2A322
+0x6075 0x2A323
+0x6076 0x2A3A1
+0x6077 0x2A3A3
+0x6078 0x2A3A0
+0x6079 0x2A3BD
+0x607A 0x2A3BA
+0x607B 0x2A3FA
+0x607C 0x2A3F8
+0x607D 0x2A3FC
+0x607E 0x2A3F6
+0x6121 0x2A434
+0x6122 0x2A443
+0x6124 0x2A4D4
+0x6125 0x2A50D
+0x6126 0x2A543
+0x6127 0x2A541
+0x6128 0x2A53D
+0x6129 0x2A540
+0x612A 0x2A53E
+0x612B 0x2A53F
+0x612C 0x2A546
+0x612E 0x2A5D4
+0x612F 0x20435
+0x6130 0x20436
+0x6131 0x20432
+0x6132 0x2043A
+0x6133 0x204C8
+0x6134 0x20536
+0x6135 0x2061E
+0x6136 0x2061D
+0x6137 0x2061F
+0x6138 0x2081C
+0x6139 0x2081D
+0x613A 0x20820
+0x613C 0x208C0
+0x613D 0x2109A
+0x613E 0x21093
+0x613F 0x210DD
+0x6141 0x210A3
+0x6142 0x210A9
+0x6143 0x2109C
+0x6144 0x2109B
+0x6146 0x21097
+0x6147 0x214B1
+0x6148 0x214CA
+0x6149 0x214B3
+0x614A 0x214CD
+0x614B 0x218EA
+0x614C 0x218EE
+0x614D 0x218EF
+0x614E 0x21ADF
+0x614F 0x21B50
+0x6150 0x21BBB
+0x6151 0x21F88
+0x6152 0x21F89
+0x6153 0x21F8C
+0x6154 0x21F85
+0x6155 0x21F5E
+0x6156 0x21F94
+0x6157 0x21F95
+0x6158 0x2216B
+0x6159 0x2216A
+0x615A 0x22169
+0x615B 0x222E3
+0x615C 0x222F1
+0x615D 0x22437
+0x615E 0x22433
+0x615F 0x22591
+0x6160 0x2258F
+0x6161 0x22597
+0x6162 0x228D4
+0x6163 0x228DE
+0x6164 0x228D3
+0x6165 0x228E0
+0x6166 0x22943
+0x6167 0x2290B
+0x6168 0x228FF
+0x6169 0x22904
+0x616A 0x22907
+0x616B 0x22DF9
+0x616C 0x22DFA
+0x616D 0x22DFB
+0x616E 0x22DF8
+0x616F 0x23012
+0x6170 0x23010
+0x6171 0x2311F
+0x6172 0x232DF
+0x6173 0x232E3
+0x6174 0x23352
+0x6175 0x233A9
+0x6176 0x23765
+0x6177 0x23787
+0x6178 0x23742
+0x6179 0x23752
+0x617A 0x2374C
+0x617B 0x2369F
+0x617C 0x23701
+0x617D 0x23748
+0x617E 0x2374F
+0x6221 0x2377E
+0x6222 0x2374D
+0x6223 0x23758
+0x6224 0x23747
+0x6225 0x2375E
+0x6226 0x23749
+0x6227 0x2374E
+0x6228 0x2375D
+0x6229 0x2375A
+0x622A 0x23786
+0x622B 0x23751
+0x622C 0x23929
+0x622D 0x239A6
+0x622E 0x239A7
+0x622F 0x23A70
+0x6230 0x23A6F
+0x6231 0x23AD3
+0x6232 0x23AD2
+0x6233 0x23C28
+0x6234 0x23C1B
+0x6235 0x23C1A
+0x6236 0x23C1C
+0x6237 0x23C21
+0x6238 0x24032
+0x6239 0x24066
+0x623A 0x2407D
+0x623B 0x24073
+0x623C 0x2407F
+0x623D 0x24065
+0x623E 0x24080
+0x623F 0x24061
+0x6240 0x24075
+0x6241 0x2406E
+0x6242 0x24067
+0x6243 0x24071
+0x6244 0x2406C
+0x6245 0x24063
+0x6246 0x24062
+0x6247 0x24083
+0x6248 0x240B2
+0x6249 0x24081
+0x624A 0x2406F
+0x624B 0x2406B
+0x624C 0x24082
+0x624D 0x2408A
+0x624E 0x24429
+0x624F 0x24430
+0x6250 0x24431
+0x6251 0x24597
+0x6252 0x24600
+0x6253 0x245FF
+0x6254 0x248B6
+0x6255 0x248B5
+0x6256 0x248C3
+0x6257 0x24A8D
+0x6258 0x24B18
+0x6259 0x24B9C
+0x625A 0x24B9A
+0x625B 0x24B99
+0x625C 0x24EB7
+0x625D 0x24EC4
+0x625E 0x24EC6
+0x625F 0x24EC7
+0x6260 0x24EBC
+0x6261 0x24EC0
+0x6262 0x24EC5
+0x6263 0x24ECD
+0x6264 0x24EC1
+0x6265 0x24EBE
+0x6266 0x24FA7
+0x6267 0x24FB8
+0x6268 0x25023
+0x626A 0x252E8
+0x626B 0x252DE
+0x626C 0x252E3
+0x626D 0x252EF
+0x626E 0x252DC
+0x626F 0x252E4
+0x6270 0x252E1
+0x6271 0x252E5
+0x6272 0x25395
+0x6273 0x25394
+0x6274 0x25393
+0x6275 0x2538E
+0x6276 0x25598
+0x6277 0x2559C
+0x6278 0x25599
+0x6279 0x255A0
+0x627A 0x2559E
+0x627B 0x25704
+0x627C 0x258D3
+0x627D 0x258B4
+0x627E 0x258BB
+0x6321 0x258B7
+0x6322 0x258B8
+0x6323 0x258BD
+0x6324 0x258B6
+0x6325 0x258B9
+0x6326 0x258B5
+0x6327 0x25A22
+0x6328 0x25A21
+0x6329 0x25AC3
+0x632A 0x25ABC
+0x632B 0x25CFF
+0x632C 0x25CE5
+0x632D 0x25CF7
+0x632E 0x25CD2
+0x632F 0x25D00
+0x6330 0x25CDB
+0x6331 0x25CF0
+0x6332 0x25CE2
+0x6333 0x25CCD
+0x6335 0x25CE1
+0x6336 0x25CF2
+0x6337 0x25CDC
+0x6338 0x25CCC
+0x6339 0x25CD6
+0x633A 0x25CF3
+0x633B 0x25CFA
+0x633C 0x25CF6
+0x633D 0x25CEC
+0x633E 0x25CEA
+0x633F 0x25CE3
+0x6340 0x25CD0
+0x6342 0x25C95
+0x6343 0x25CD5
+0x6344 0x25CF4
+0x6345 0x25CCB
+0x6346 0x25CDA
+0x6347 0x25CC8
+0x6348 0x25CDF
+0x6349 0x25CF5
+0x634A 0x25CCF
+0x634B 0x25CC7
+0x634C 0x25CD7
+0x634D 0x25F24
+0x634F 0x25F1C
+0x6350 0x25F21
+0x6351 0x25F1E
+0x6352 0x25F18
+0x6353 0x25F1B
+0x6355 0x26146
+0x6356 0x2614B
+0x6357 0x26148
+0x6358 0x26147
+0x6359 0x26167
+0x635A 0x26154
+0x635B 0x26315
+0x635C 0x26322
+0x635D 0x263C5
+0x635E 0x26329
+0x635F 0x263C7
+0x6360 0x2648D
+0x6361 0x2651B
+0x6362 0x26520
+0x6363 0x265E2
+0x6364 0x265E7
+0x6365 0x265E8
+0x6366 0x265E1
+0x6367 0x26872
+0x6368 0x2687B
+0x6369 0x26874
+0x636A 0x26871
+0x636B 0x26879
+0x636C 0x26875
+0x636D 0x26890
+0x636E 0x26877
+0x636F 0x2687D
+0x6370 0x2694F
+0x6371 0x26950
+0x6372 0x269A3
+0x6373 0x269A2
+0x6374 0x269F4
+0x6375 0x26A94
+0x6376 0x26A9A
+0x6377 0x26A9B
+0x6378 0x26AA7
+0x6379 0x26A97
+0x637A 0x26A95
+0x637B 0x26A92
+0x637C 0x26A9C
+0x637D 0x26A96
+0x637E 0x26FB6
+0x6421 0x26FB8
+0x6422 0x26FB0
+0x6423 0x27018
+0x6424 0x26FC5
+0x6425 0x26FB5
+0x6426 0x26FC2
+0x6427 0x27006
+0x6428 0x27019
+0x6429 0x26FB9
+0x642A 0x27015
+0x642B 0x26FD6
+0x642C 0x26FAC
+0x642E 0x26FC6
+0x642F 0x26FB3
+0x6430 0x26FC3
+0x6431 0x26FCA
+0x6432 0x26FCF
+0x6433 0x26FBD
+0x6434 0x26FCE
+0x6435 0x27014
+0x6436 0x26FBA
+0x6437 0x2701A
+0x6438 0x26FC1
+0x6439 0x26FBB
+0x643C 0x27201
+0x643D 0x271FC
+0x643E 0x2745A
+0x643F 0x27454
+0x6440 0x27461
+0x6441 0x2745C
+0x6442 0x27455
+0x6443 0x2744A
+0x6444 0x2744B
+0x6445 0x27451
+0x6446 0x27469
+0x6447 0x2746B
+0x6449 0x27466
+0x644A 0x27458
+0x644B 0x2745D
+0x644C 0x27467
+0x644D 0x27456
+0x644E 0x27488
+0x644F 0x27464
+0x6450 0x2744E
+0x6451 0x27757
+0x6452 0x2775A
+0x6453 0x27751
+0x6454 0x2774A
+0x6455 0x2774B
+0x6457 0x27747
+0x6458 0x2776F
+0x6459 0x2776A
+0x645A 0x2776B
+0x645B 0x27746
+0x645C 0x2776D
+0x645D 0x27754
+0x645E 0x2776E
+0x645F 0x2774C
+0x6460 0x27878
+0x6461 0x27886
+0x6462 0x27882
+0x6464 0x27AE1
+0x6465 0x27AE5
+0x6466 0x27ADB
+0x6467 0x27ADE
+0x6468 0x27AD7
+0x6469 0x27C03
+0x646A 0x27C7C
+0x646B 0x27C7E
+0x646C 0x27D05
+0x646D 0x27D07
+0x646E 0x27DE6
+0x646F 0x27DE1
+0x6470 0x27DFB
+0x6471 0x27DE5
+0x6472 0x27DE7
+0x6473 0x27DDF
+0x6474 0x27DFF
+0x6475 0x27E76
+0x6476 0x27F63
+0x6477 0x27F66
+0x6478 0x27F65
+0x6479 0x27F5E
+0x647A 0x27F64
+0x647B 0x27F6B
+0x647C 0x27F5F
+0x647D 0x27F67
+0x647E 0x27F68
+0x6521 0x28108
+0x6522 0x28109
+0x6523 0x28117
+0x6524 0x28115
+0x6525 0x2811B
+0x6526 0x2810B
+0x6527 0x28128
+0x6528 0x2810E
+0x6529 0x28118
+0x652A 0x28153
+0x652B 0x28145
+0x652C 0x2810D
+0x652D 0x2810A
+0x652E 0x28113
+0x652F 0x2814A
+0x6530 0x28279
+0x6531 0x283A1
+0x6532 0x2838D
+0x6533 0x283A2
+0x6534 0x28390
+0x6536 0x28431
+0x6537 0x28430
+0x6538 0x2861F
+0x6539 0x28619
+0x653A 0x2860C
+0x653B 0x2861E
+0x653C 0x2861D
+0x653D 0x28607
+0x653E 0x28766
+0x653F 0x287C5
+0x6540 0x287BA
+0x6541 0x287BD
+0x6542 0x287C2
+0x6543 0x287C3
+0x6544 0x287BF
+0x6546 0x288A1
+0x6547 0x288A2
+0x6548 0x288A8
+0x6549 0x288A3
+0x654A 0x288AA
+0x654B 0x288AF
+0x654C 0x288B9
+0x654D 0x28937
+0x654E 0x28A8F
+0x6550 0x28A8E
+0x6551 0x28A87
+0x6552 0x28A8A
+0x6553 0x28A92
+0x6554 0x28A97
+0x6555 0x28A9F
+0x6556 0x28B05
+0x6557 0x28CA9
+0x6558 0x28CA7
+0x6559 0x28D8A
+0x655A 0x28D82
+0x655B 0x28D85
+0x655C 0x28D8B
+0x655D 0x28D89
+0x655E 0x28D81
+0x655F 0x28D80
+0x6560 0x28D87
+0x6561 0x28D86
+0x6562 0x28F4D
+0x6563 0x2901C
+0x6564 0x2901F
+0x6565 0x29121
+0x6566 0x2911D
+0x6567 0x29122
+0x6568 0x290FE
+0x6569 0x2911B
+0x656A 0x2913A
+0x656B 0x29137
+0x656C 0x29117
+0x656D 0x29138
+0x656E 0x29126
+0x656F 0x29118
+0x6570 0x29234
+0x6571 0x29235
+0x6572 0x29232
+0x6574 0x292E1
+0x6575 0x292FD
+0x6576 0x292E3
+0x6577 0x292E8
+0x6578 0x292F9
+0x6579 0x292FF
+0x657A 0x292FE
+0x657C 0x292E0
+0x657D 0x29300
+0x6621 0x292EC
+0x6622 0x292E4
+0x6623 0x292EF
+0x6624 0x292FA
+0x6625 0x293CA
+0x6626 0x29431
+0x6627 0x29432
+0x6628 0x29434
+0x6629 0x29441
+0x662A 0x29500
+0x662B 0x29506
+0x662C 0x29508
+0x662D 0x29505
+0x662E 0x29503
+0x662F 0x2950B
+0x6630 0x29502
+0x6631 0x2950A
+0x6632 0x295F0
+0x6633 0x29613
+0x6634 0x2960A
+0x6635 0x2960F
+0x6636 0x29611
+0x6637 0x29608
+0x6638 0x2960B
+0x6639 0x29612
+0x663A 0x2960D
+0x663B 0x2975B
+0x663C 0x29763
+0x663D 0x29761
+0x663E 0x29768
+0x663F 0x2975A
+0x6640 0x2984E
+0x6641 0x2984D
+0x6642 0x29850
+0x6643 0x298FC
+0x6644 0x29912
+0x6645 0x298F5
+0x6646 0x2991E
+0x6647 0x298F0
+0x6648 0x298F3
+0x6649 0x298F2
+0x664A 0x29901
+0x664B 0x298EF
+0x664C 0x298EE
+0x664D 0x29916
+0x664E 0x298F6
+0x664F 0x298FB
+0x6650 0x2991C
+0x6652 0x29A5D
+0x6653 0x29A60
+0x6654 0x29A66
+0x6655 0x29A5F
+0x6656 0x29A61
+0x6657 0x29A5B
+0x6658 0x29A62
+0x6659 0x29A57
+0x665A 0x29B69
+0x665B 0x29B6B
+0x665C 0x29B61
+0x665D 0x29B77
+0x665E 0x29B5F
+0x665F 0x29B63
+0x6660 0x29B62
+0x6661 0x29B65
+0x6662 0x29CEF
+0x6663 0x29CE2
+0x6664 0x29D00
+0x6665 0x29CE8
+0x6666 0x29CF2
+0x6667 0x29CE7
+0x6669 0x29CE5
+0x666A 0x29DD5
+0x666B 0x29DD0
+0x666C 0x29DDA
+0x666D 0x29DD3
+0x666F 0x29DD9
+0x6670 0x29DCF
+0x6671 0x29DD6
+0x6672 0x29DD8
+0x6673 0x29DF5
+0x6674 0x29DCE
+0x6675 0x29DD7
+0x6676 0x29DF4
+0x6677 0x29DCD
+0x6678 0x29E01
+0x667A 0x2A052
+0x667B 0x2A055
+0x667C 0x2A05A
+0x667D 0x2A04D
+0x667E 0x2A054
+0x6721 0x2A053
+0x6722 0x2A05E
+0x6723 0x2A067
+0x6724 0x2A065
+0x6725 0x2A04E
+0x6727 0x2A04F
+0x6728 0x2A061
+0x6729 0x2A06E
+0x672A 0x2A051
+0x672B 0x2A05B
+0x672C 0x2A263
+0x672D 0x2A2B7
+0x672E 0x2A2B6
+0x672F 0x2A2C3
+0x6730 0x2A2BB
+0x6731 0x2A2B5
+0x6732 0x2A32E
+0x6733 0x2A330
+0x6734 0x2A333
+0x6735 0x2A331
+0x6736 0x2A3A4
+0x6737 0x2A3C1
+0x6738 0x2A3BB
+0x6739 0x2A3BE
+0x673A 0x2A400
+0x673B 0x2A3FF
+0x673C 0x2A440
+0x673E 0x2A43F
+0x673F 0x2A444
+0x6742 0x2A4DB
+0x6743 0x2A50F
+0x6744 0x2A511
+0x6745 0x2A54E
+0x6746 0x2A54D
+0x6747 0x2A54B
+0x6748 0x2A54C
+0x6749 0x2A595
+0x674A 0x2043B
+0x674B 0x20445
+0x674C 0x20444
+0x674D 0x2043E
+0x674E 0x2043C
+0x674F 0x2043F
+0x6750 0x204CC
+0x6751 0x204CE
+0x6752 0x20622
+0x6753 0x20623
+0x6754 0x2069F
+0x6755 0x208C5
+0x6756 0x208C4
+0x6757 0x210E9
+0x6758 0x21099
+0x675A 0x210E6
+0x675B 0x210E7
+0x675C 0x210F7
+0x675D 0x214D2
+0x675F 0x218FD
+0x6760 0x2190C
+0x6761 0x2190B
+0x6762 0x21CED
+0x6765 0x21F9B
+0x6766 0x2200A
+0x6767 0x2216F
+0x6768 0x22175
+0x6769 0x222F2
+0x676A 0x222F8
+0x676B 0x2243E
+0x676C 0x22924
+0x676D 0x2290E
+0x676E 0x22916
+0x676F 0x22918
+0x6770 0x22910
+0x6771 0x22931
+0x6772 0x22944
+0x6774 0x22929
+0x6775 0x2292F
+0x6776 0x2294B
+0x6777 0x22936
+0x6779 0x22E34
+0x677A 0x22E00
+0x677B 0x22E2B
+0x677C 0x23020
+0x677D 0x23021
+0x677E 0x2301E
+0x6821 0x2301D
+0x6822 0x232F5
+0x6823 0x232F2
+0x6824 0x232F6
+0x6825 0x23790
+0x6826 0x2379D
+0x6827 0x2379C
+0x6828 0x23792
+0x6829 0x23794
+0x682A 0x237D1
+0x682B 0x23793
+0x682C 0x237B7
+0x682D 0x23797
+0x682E 0x237B0
+0x682F 0x2379F
+0x6830 0x237C9
+0x6831 0x2392D
+0x6832 0x2392C
+0x6833 0x23A77
+0x6834 0x23C2C
+0x6835 0x240C0
+0x6836 0x240B9
+0x6837 0x24453
+0x6838 0x24540
+0x6839 0x24702
+0x683A 0x246FB
+0x683C 0x24A8B
+0x683D 0x24AAE
+0x683E 0x24AAB
+0x683F 0x24BA1
+0x6840 0x2A2CD
+0x6841 0x24CEA
+0x6842 0x24EDD
+0x6843 0x24EDC
+0x6844 0x24ED9
+0x6845 0x24FAB
+0x6846 0x24FAC
+0x6847 0x24FAD
+0x6848 0x24FB2
+0x6849 0x2502C
+0x684A 0x2502B
+0x684B 0x250C2
+0x684C 0x25300
+0x684D 0x2530D
+0x684E 0x25306
+0x684F 0x252FF
+0x6850 0x25303
+0x6851 0x25301
+0x6852 0x25310
+0x6853 0x2530F
+0x6854 0x25305
+0x6855 0x25398
+0x6856 0x25397
+0x6857 0x25396
+0x6858 0x25399
+0x6859 0x255AC
+0x685A 0x255AB
+0x685B 0x25712
+0x685C 0x258D8
+0x685D 0x258DF
+0x685E 0x258D6
+0x685F 0x25A2D
+0x6860 0x25A32
+0x6861 0x25D3F
+0x6862 0x25D2F
+0x6863 0x25D26
+0x6864 0x25D3A
+0x6865 0x25D39
+0x6867 0x25D3B
+0x6868 0x25D35
+0x6869 0x25D2A
+0x686A 0x25D21
+0x686B 0x25D38
+0x686C 0x25D37
+0x686D 0x25D34
+0x686F 0x25D22
+0x6870 0x25D36
+0x6871 0x25D44
+0x6872 0x25F45
+0x6873 0x25F3B
+0x6874 0x25F36
+0x6875 0x25F42
+0x6876 0x2617A
+0x6877 0x26186
+0x6878 0x2618B
+0x6879 0x2617F
+0x687A 0x26181
+0x687B 0x2632A
+0x687C 0x263D5
+0x687D 0x2649F
+0x687E 0x2649D
+0x6921 0x26526
+0x6922 0x265F4
+0x6923 0x265F5
+0x6924 0x26815
+0x6925 0x2688E
+0x6926 0x2688F
+0x6927 0x26926
+0x6928 0x269A7
+0x6929 0x269AF
+0x692A 0x26AAD
+0x692B 0x26AAC
+0x692C 0x26AAB
+0x692D 0x26AAA
+0x692E 0x2702F
+0x692F 0x27021
+0x6930 0x27023
+0x6931 0x270A3
+0x6932 0x27049
+0x6933 0x2703A
+0x6934 0x27048
+0x6935 0x2702D
+0x6936 0x27025
+0x6937 0x27029
+0x6938 0x27032
+0x6939 0x27034
+0x693A 0x27024
+0x693B 0x2702C
+0x693C 0x2704B
+0x693D 0x2703B
+0x693E 0x27020
+0x693F 0x27028
+0x6940 0x27498
+0x6942 0x27497
+0x6944 0x2749D
+0x6945 0x274A8
+0x6946 0x275D5
+0x6947 0x27777
+0x6948 0x27778
+0x6949 0x27772
+0x694A 0x27773
+0x694B 0x27802
+0x694C 0x2793B
+0x694D 0x27AFE
+0x694E 0x27B0B
+0x694F 0x27AFF
+0x6950 0x27B07
+0x6953 0x27B30
+0x6954 0x27BCD
+0x6955 0x27BCF
+0x6956 0x27C10
+0x6957 0x27C0A
+0x6958 0x27C83
+0x6959 0x27D15
+0x695A 0x27D0E
+0x695B 0x27D0C
+0x695C 0x27E02
+0x695D 0x27DFE
+0x695E 0x27E05
+0x695F 0x27E15
+0x6960 0x27E08
+0x6961 0x27F7F
+0x6962 0x27F77
+0x6963 0x27F7C
+0x6964 0x27F82
+0x6965 0x27F7E
+0x6966 0x27F78
+0x6967 0x27F7D
+0x6968 0x27F79
+0x6969 0x27F81
+0x696A 0x2814B
+0x696B 0x28163
+0x696C 0x28164
+0x696D 0x28156
+0x696E 0x28154
+0x696F 0x2814E
+0x6970 0x28110
+0x6971 0x2814F
+0x6972 0x28157
+0x6973 0x2815E
+0x6974 0x28151
+0x6975 0x2816A
+0x6976 0x28169
+0x6977 0x283AD
+0x6978 0x283A4
+0x6979 0x283AC
+0x697A 0x283A9
+0x697B 0x283AE
+0x697C 0x2044C
+0x697D 0x28650
+0x697E 0x28635
+0x6A21 0x28632
+0x6A22 0x287D8
+0x6A23 0x287D1
+0x6A24 0x287CF
+0x6A25 0x287BE
+0x6A26 0x288D5
+0x6A27 0x288C1
+0x6A28 0x288C6
+0x6A29 0x288C3
+0x6A2A 0x288C2
+0x6A2B 0x288C0
+0x6A2C 0x288C5
+0x6A2D 0x288C7
+0x6A2E 0x288BF
+0x6A2F 0x288C4
+0x6A30 0x288D4
+0x6A31 0x28A90
+0x6A32 0x28AD2
+0x6A34 0x28AD4
+0x6A35 0x28CAF
+0x6A36 0x28CAE
+0x6A37 0x28CB2
+0x6A38 0x28CAD
+0x6A39 0x28D9C
+0x6A3A 0x28DA0
+0x6A3B 0x28DB6
+0x6A3C 0x28F3D
+0x6A3D 0x28F56
+0x6A3E 0x28F82
+0x6A3F 0x29028
+0x6A40 0x2902B
+0x6A41 0x2913C
+0x6A42 0x2913E
+0x6A43 0x2913F
+0x6A44 0x29142
+0x6A45 0x2913D
+0x6A46 0x29141
+0x6A47 0x2913B
+0x6A48 0x29149
+0x6A49 0x29143
+0x6A4A 0x29239
+0x6A4B 0x29238
+0x6A4C 0x29322
+0x6A4D 0x29308
+0x6A4E 0x2930C
+0x6A4F 0x29306
+0x6A50 0x29313
+0x6A51 0x29304
+0x6A52 0x29320
+0x6A53 0x2931D
+0x6A54 0x29305
+0x6A55 0x2930A
+0x6A56 0x293D6
+0x6A57 0x293D7
+0x6A58 0x29436
+0x6A59 0x29437
+0x6A5A 0x29523
+0x6A5B 0x29522
+0x6A5C 0x29520
+0x6A5D 0x2951A
+0x6A5E 0x2951D
+0x6A5F 0x2961C
+0x6A60 0x29620
+0x6A61 0x29677
+0x6A62 0x2977F
+0x6A63 0x2978B
+0x6A64 0x2977D
+0x6A65 0x29799
+0x6A66 0x29784
+0x6A67 0x29789
+0x6A68 0x29785
+0x6A69 0x29783
+0x6A6A 0x29786
+0x6A6B 0x2979E
+0x6A6C 0x29853
+0x6A6D 0x29917
+0x6A6F 0x29919
+0x6A70 0x29920
+0x6A71 0x2991F
+0x6A72 0x29923
+0x6A73 0x29918
+0x6A74 0x29921
+0x6A75 0x29929
+0x6A76 0x29924
+0x6A77 0x29926
+0x6A78 0x29A5E
+0x6A79 0x29A6F
+0x6A7A 0x29A6E
+0x6A7B 0x29A74
+0x6A7C 0x29A72
+0x6A7D 0x29A73
+0x6A7E 0x29B7D
+0x6B21 0x29B7E
+0x6B22 0x29B85
+0x6B23 0x29B7F
+0x6B24 0x29B84
+0x6B25 0x29C44
+0x6B26 0x29CF5
+0x6B27 0x29CF8
+0x6B28 0x29D03
+0x6B29 0x29CF6
+0x6B2A 0x29E28
+0x6B2C 0x29E39
+0x6B2D 0x29DFB
+0x6B2E 0x29E0E
+0x6B2F 0x29DFD
+0x6B30 0x29E1F
+0x6B32 0x29E03
+0x6B34 0x29E10
+0x6B36 0x29E0D
+0x6B37 0x29E27
+0x6B38 0x29E41
+0x6B39 0x2A072
+0x6B3A 0x2A078
+0x6B3B 0x2A080
+0x6B3D 0x2A085
+0x6B3E 0x2A07B
+0x6B40 0x2A07D
+0x6B41 0x2A091
+0x6B42 0x2A088
+0x6B43 0x2A0AA
+0x6B44 0x2A08D
+0x6B45 0x2A089
+0x6B46 0x2A095
+0x6B47 0x2A09B
+0x6B48 0x2A08C
+0x6B49 0x2A09E
+0x6B4A 0x2A07C
+0x6B4B 0x2A086
+0x6B4C 0x2A084
+0x6B4D 0x2A268
+0x6B4E 0x2A2C5
+0x6B4F 0x2A2C4
+0x6B50 0x2A2C9
+0x6B51 0x2A2C6
+0x6B52 0x2A342
+0x6B53 0x2A345
+0x6B54 0x2A341
+0x6B55 0x2A344
+0x6B56 0x2A3A6
+0x6B57 0x2A3C2
+0x6B58 0x2A442
+0x6B59 0x2A449
+0x6B5A 0x2A448
+0x6B5B 0x2A44A
+0x6B5C 0x2A44C
+0x6B5D 0x2A44B
+0x6B5E 0x2A517
+0x6B5F 0x2A518
+0x6B60 0x2A515
+0x6B61 0x2A552
+0x6B62 0x2A554
+0x6B63 0x2A553
+0x6B64 0x2A59A
+0x6B65 0x2A59B
+0x6B66 0x2A5DC
+0x6B67 0x2A5E4
+0x6B68 0x2A691
+0x6B6A 0x2A6BA
+0x6B6B 0x20451
+0x6B6C 0x2045B
+0x6B6D 0x204CF
+0x6B6E 0x23305
+0x6B6F 0x21113
+0x6B70 0x21115
+0x6B71 0x21114
+0x6B72 0x21123
+0x6B74 0x21111
+0x6B75 0x21112
+0x6B77 0x214F0
+0x6B78 0x2169B
+0x6B79 0x21912
+0x6B7A 0x21916
+0x6B7B 0x21917
+0x6B7C 0x219B5
+0x6B7D 0x21CF4
+0x6B7E 0x21FB1
+0x6C21 0x22179
+0x6C22 0x222FF
+0x6C23 0x222FC
+0x6C24 0x222FB
+0x6C25 0x2243F
+0x6C26 0x22444
+0x6C27 0x2259D
+0x6C28 0x22932
+0x6C29 0x2294C
+0x6C2A 0x2292B
+0x6C2B 0x2295A
+0x6C2C 0x22A1F
+0x6C2D 0x22E01
+0x6C2E 0x22E2D
+0x6C2F 0x22E27
+0x6C30 0x22E59
+0x6C31 0x22E5A
+0x6C32 0x22E4D
+0x6C33 0x22E58
+0x6C34 0x23023
+0x6C35 0x23025
+0x6C36 0x2302B
+0x6C37 0x232FF
+0x6C38 0x233AE
+0x6C39 0x237CB
+0x6C3A 0x237CA
+0x6C3B 0x237D0
+0x6C3C 0x237CE
+0x6C3D 0x237CC
+0x6C3E 0x237D8
+0x6C3F 0x237C6
+0x6C40 0x237D2
+0x6C41 0x237CF
+0x6C42 0x237C8
+0x6C43 0x23B17
+0x6C45 0x240C4
+0x6C46 0x29240
+0x6C47 0x240E9
+0x6C48 0x240F2
+0x6C49 0x240FC
+0x6C4A 0x240EA
+0x6C4B 0x240EB
+0x6C4C 0x240FD
+0x6C4D 0x24478
+0x6C4E 0x24477
+0x6C4F 0x24473
+0x6C50 0x2449E
+0x6C51 0x24479
+0x6C52 0x245A2
+0x6C53 0x24603
+0x6C54 0x24704
+0x6C55 0x24705
+0x6C56 0x248CE
+0x6C57 0x24ABF
+0x6C58 0x24EF6
+0x6C59 0x24EF7
+0x6C5A 0x25031
+0x6C5B 0x25030
+0x6C5C 0x250C9
+0x6C5D 0x250C7
+0x6C5E 0x2531C
+0x6C5F 0x25328
+0x6C60 0x2531A
+0x6C61 0x2531E
+0x6C62 0x2531B
+0x6C63 0x2531F
+0x6C64 0x255BF
+0x6C65 0x255BB
+0x6C66 0x255BC
+0x6C67 0x255C0
+0x6C68 0x2571A
+0x6C69 0x258EF
+0x6C6A 0x258EC
+0x6C6B 0x258E9
+0x6C6C 0x258F0
+0x6C6D 0x258FE
+0x6C6E 0x25A34
+0x6C6F 0x25D6A
+0x6C70 0x25D95
+0x6C71 0x25D6C
+0x6C72 0x25D72
+0x6C73 0x25D67
+0x6C74 0x25D60
+0x6C75 0x25D6B
+0x6C76 0x25D5E
+0x6C77 0x25D6F
+0x6C78 0x25D66
+0x6C7A 0x25D62
+0x6C7B 0x25D5D
+0x6C7C 0x25D5C
+0x6C7D 0x2F965
+0x6C7E 0x25F50
+0x6D21 0x2619F
+0x6D23 0x2619E
+0x6D24 0x261A6
+0x6D25 0x26335
+0x6D26 0x26338
+0x6D27 0x26336
+0x6D28 0x2633A
+0x6D29 0x263DC
+0x6D2A 0x2687C
+0x6D2B 0x268AB
+0x6D2D 0x268A8
+0x6D2E 0x268A7
+0x6D2F 0x2692B
+0x6D30 0x2692C
+0x6D31 0x26928
+0x6D32 0x2092B
+0x6D33 0x269A9
+0x6D34 0x269AA
+0x6D35 0x269AB
+0x6D36 0x269F8
+0x6D37 0x26AB1
+0x6D38 0x26AF0
+0x6D39 0x26AEF
+0x6D3A 0x270A8
+0x6D3B 0x2708B
+0x6D3C 0x27094
+0x6D3D 0x2709E
+0x6D3E 0x2708F
+0x6D3F 0x27088
+0x6D40 0x2707E
+0x6D41 0x27081
+0x6D42 0x27030
+0x6D43 0x2709B
+0x6D44 0x27082
+0x6D45 0x27090
+0x6D46 0x27085
+0x6D47 0x2707F
+0x6D48 0x270A9
+0x6D49 0x270DE
+0x6D4A 0x2720D
+0x6D4C 0x274CF
+0x6D4D 0x274CB
+0x6D4E 0x274D8
+0x6D4F 0x274DD
+0x6D50 0x274D3
+0x6D51 0x274D0
+0x6D52 0x274D5
+0x6D53 0x274D6
+0x6D54 0x275D6
+0x6D55 0x27792
+0x6D56 0x27795
+0x6D57 0x2A5CB
+0x6D58 0x2778D
+0x6D59 0x2779B
+0x6D5A 0x2779D
+0x6D5B 0x2778F
+0x6D5C 0x2779E
+0x6D5D 0x277A6
+0x6D5E 0x27896
+0x6D5F 0x27892
+0x6D60 0x27B16
+0x6D61 0x27B2A
+0x6D62 0x27B29
+0x6D63 0x27B2C
+0x6D64 0x27C15
+0x6D65 0x27C12
+0x6D66 0x27C11
+0x6D67 0x27C13
+0x6D68 0x27C88
+0x6D69 0x27C8B
+0x6D6A 0x27C8A
+0x6D6B 0x27C87
+0x6D6C 0x27D17
+0x6D6D 0x27D16
+0x6D6E 0x27D1A
+0x6D6F 0x27E19
+0x6D70 0x27E17
+0x6D71 0x27F91
+0x6D72 0x27F94
+0x6D73 0x2818B
+0x6D74 0x28190
+0x6D75 0x2818F
+0x6D76 0x28186
+0x6D77 0x28183
+0x6D78 0x2818E
+0x6D79 0x28187
+0x6D7A 0x281A8
+0x6D7B 0x28185
+0x6D7C 0x281A6
+0x6D7D 0x28182
+0x6D7E 0x281A7
+0x6E21 0x283B9
+0x6E22 0x283B7
+0x6E23 0x283B4
+0x6E24 0x283B6
+0x6E25 0x283B3
+0x6E26 0x283C6
+0x6E27 0x2863C
+0x6E28 0x28640
+0x6E29 0x28638
+0x6E2A 0x28791
+0x6E2B 0x287A6
+0x6E2C 0x287DA
+0x6E2D 0x288DA
+0x6E2E 0x288D8
+0x6E2F 0x288D9
+0x6E30 0x288DB
+0x6E31 0x288D7
+0x6E32 0x28B16
+0x6E33 0x28B12
+0x6E34 0x28B1F
+0x6E36 0x28B14
+0x6E37 0x28B1A
+0x6E38 0x28B10
+0x6E39 0x28CB3
+0x6E3A 0x28DAE
+0x6E3B 0x28DC1
+0x6E3C 0x28DB0
+0x6E3D 0x28DAF
+0x6E3E 0x28DB1
+0x6E3F 0x28DAD
+0x6E40 0x28DB2
+0x6E41 0x28DC4
+0x6E42 0x2903C
+0x6E43 0x2903F
+0x6E44 0x29161
+0x6E45 0x29166
+0x6E46 0x2923C
+0x6E47 0x2923B
+0x6E48 0x2932C
+0x6E4A 0x2932A
+0x6E4B 0x2933E
+0x6E4C 0x2932F
+0x6E4D 0x29332
+0x6E4E 0x29327
+0x6E4F 0x29329
+0x6E50 0x29340
+0x6E51 0x293DF
+0x6E52 0x293DE
+0x6E53 0x2943C
+0x6E54 0x2943B
+0x6E55 0x2943E
+0x6E56 0x29521
+0x6E57 0x29546
+0x6E58 0x2953C
+0x6E59 0x29536
+0x6E5A 0x29538
+0x6E5B 0x29535
+0x6E5C 0x29631
+0x6E5D 0x29636
+0x6E5E 0x2962D
+0x6E5F 0x29633
+0x6E60 0x2962F
+0x6E61 0x2962E
+0x6E62 0x29635
+0x6E63 0x297AC
+0x6E64 0x297A9
+0x6E65 0x297A6
+0x6E67 0x2994C
+0x6E68 0x29943
+0x6E69 0x29941
+0x6E6A 0x2994F
+0x6E6B 0x29942
+0x6E6C 0x29951
+0x6E6E 0x29940
+0x6E6F 0x29950
+0x6E70 0x29945
+0x6E71 0x2994A
+0x6E72 0x2994B
+0x6E73 0x29A83
+0x6E74 0x29A82
+0x6E75 0x29A81
+0x6E76 0x29AE0
+0x6E77 0x29B98
+0x6E78 0x29B9F
+0x6E79 0x29B9B
+0x6E7A 0x29B9A
+0x6E7B 0x29B99
+0x6E7C 0x29B96
+0x6E7D 0x29BAE
+0x6E7E 0x29B9E
+0x6F21 0x29D09
+0x6F22 0x29D0D
+0x6F23 0x29E4E
+0x6F24 0x29E4A
+0x6F25 0x29E4D
+0x6F26 0x29E40
+0x6F27 0x29E3E
+0x6F28 0x29E48
+0x6F29 0x29E42
+0x6F2A 0x29E62
+0x6F2B 0x29E45
+0x6F2C 0x29E51
+0x6F2D 0x2A0C6
+0x6F2E 0x2A0D0
+0x6F2F 0x2A0C0
+0x6F30 0x2A0B7
+0x6F31 0x2A0C2
+0x6F32 0x2A0BC
+0x6F33 0x2A0C5
+0x6F34 0x2A0DC
+0x6F35 0x2A0DB
+0x6F36 0x2A0D2
+0x6F37 0x2A0C7
+0x6F38 0x2A0B6
+0x6F39 0x2A0C9
+0x6F3A 0x2A0CC
+0x6F3B 0x2A0D1
+0x6F3C 0x2A0CD
+0x6F3D 0x2A0DA
+0x6F3E 0x2A0BA
+0x6F3F 0x2A0D3
+0x6F40 0x2A0CE
+0x6F41 0x2A0F6
+0x6F42 0x2A0BD
+0x6F43 0x2A0DD
+0x6F44 0x2A0C8
+0x6F45 0x2A10D
+0x6F46 0x2A135
+0x6F47 0x2A271
+0x6F48 0x2A26E
+0x6F49 0x2A26F
+0x6F4A 0x2A2D6
+0x6F4B 0x2A34C
+0x6F4C 0x2A34F
+0x6F4D 0x2A354
+0x6F4E 0x2A353
+0x6F4F 0x2A3C9
+0x6F50 0x2A3C8
+0x6F51 0x2A403
+0x6F53 0x2A404
+0x6F55 0x2A457
+0x6F56 0x2A452
+0x6F57 0x2A453
+0x6F59 0x2A456
+0x6F5A 0x2A45C
+0x6F5B 0x2A455
+0x6F5C 0x2A564
+0x6F5D 0x2A55D
+0x6F5E 0x2A55E
+0x6F5F 0x2A5A2
+0x6F60 0x2A5A3
+0x6F62 0x2A5E7
+0x6F63 0x2A5E6
+0x6F64 0x2A698
+0x6F65 0x2A6AC
+0x6F66 0x2A6AF
+0x6F67 0x2A6AE
+0x6F68 0x20459
+0x6F69 0x205A9
+0x6F6A 0x2082A
+0x6F6B 0x208C7
+0x6F6C 0x21141
+0x6F6D 0x21137
+0x6F6E 0x21135
+0x6F6F 0x21133
+0x6F70 0x21139
+0x6F71 0x21132
+0x6F72 0x214FF
+0x6F73 0x21501
+0x6F74 0x214F8
+0x6F75 0x2191B
+0x6F76 0x21919
+0x6F77 0x21BBF
+0x6F78 0x21FBC
+0x6F79 0x21FBE
+0x6F7A 0x21FBD
+0x6F7B 0x2217D
+0x6F7C 0x22446
+0x6F7D 0x22447
+0x6F7E 0x225A4
+0x7021 0x22A21
+0x7022 0x22A62
+0x7023 0x22E86
+0x7025 0x2302F
+0x7026 0x23031
+0x7028 0x237F8
+0x7029 0x237F5
+0x702A 0x237F9
+0x702B 0x237F2
+0x702C 0x237FA
+0x702D 0x237F3
+0x702E 0x23814
+0x702F 0x237FD
+0x7030 0x2380F
+0x7031 0x2380E
+0x7032 0x23801
+0x7033 0x23937
+0x7034 0x23935
+0x7035 0x23934
+0x7036 0x23931
+0x7037 0x23A7A
+0x7038 0x23A7B
+0x7039 0x23C37
+0x703A 0x2412B
+0x703B 0x240FB
+0x703C 0x24116
+0x703D 0x24113
+0x703F 0x24111
+0x7040 0x2410F
+0x7041 0x2411B
+0x7042 0x24138
+0x7043 0x244A4
+0x7044 0x24709
+0x7045 0x24707
+0x7046 0x2470B
+0x7047 0x248D3
+0x7048 0x248D1
+0x7049 0x248D8
+0x704A 0x24B1D
+0x704B 0x24BA9
+0x704C 0x24BD0
+0x704D 0x27215
+0x704E 0x24F02
+0x704F 0x24F05
+0x7050 0x24F01
+0x7051 0x24F00
+0x7052 0x2532E
+0x7053 0x25330
+0x7054 0x2532F
+0x7055 0x25331
+0x7056 0x255D2
+0x7057 0x255D3
+0x7058 0x25902
+0x7059 0x25A40
+0x705A 0x25A42
+0x705B 0x25A3B
+0x705C 0x25ACE
+0x705D 0x25D98
+0x705E 0x25D8F
+0x705F 0x25D94
+0x7060 0x25D91
+0x7062 0x25DBA
+0x7063 0x25D90
+0x7064 0x25D86
+0x7065 0x25D9A
+0x7066 0x25D8C
+0x7067 0x25D93
+0x7068 0x25D87
+0x7069 0x25D88
+0x706A 0x25D97
+0x706B 0x25D8D
+0x706C 0x25D9C
+0x706D 0x25DBD
+0x706E 0x25F3C
+0x706F 0x25F59
+0x7071 0x261D1
+0x7072 0x261BB
+0x7073 0x261BE
+0x7074 0x2625D
+0x7075 0x263E2
+0x7076 0x26605
+0x7077 0x268BA
+0x7079 0x268F4
+0x707A 0x269B2
+0x707B 0x269F9
+0x707C 0x26AB7
+0x707D 0x26AB6
+0x707E 0x27089
+0x7121 0x270F9
+0x7122 0x270D9
+0x7123 0x270E8
+0x7124 0x270D4
+0x7125 0x270DB
+0x7126 0x270E2
+0x7127 0x270DF
+0x7128 0x270D1
+0x7129 0x270E9
+0x712A 0x270EA
+0x712B 0x27213
+0x712C 0x27211
+0x712D 0x274FA
+0x712E 0x274F8
+0x712F 0x274F4
+0x7130 0x274FB
+0x7131 0x2750E
+0x7132 0x27502
+0x7133 0x2750F
+0x7134 0x27790
+0x7135 0x277AD
+0x7136 0x277A9
+0x7137 0x27948
+0x7138 0x27B5A
+0x7139 0x27B4F
+0x713A 0x27B4E
+0x713B 0x27B55
+0x713C 0x27B54
+0x713D 0x27B4A
+0x713E 0x27BD5
+0x713F 0x27C18
+0x7140 0x27C8D
+0x7141 0x27D1D
+0x7142 0x27D19
+0x7143 0x27E26
+0x7144 0x27E28
+0x7145 0x27E2B
+0x7146 0x27E7D
+0x7147 0x27FA0
+0x7148 0x27F9A
+0x7149 0x27F9B
+0x714A 0x281B5
+0x714B 0x281AD
+0x714C 0x281B2
+0x714D 0x28294
+0x714E 0x283C9
+0x714F 0x2864E
+0x7150 0x2864F
+0x7151 0x28644
+0x7152 0x28652
+0x7153 0x288E9
+0x7154 0x28939
+0x7157 0x28DC7
+0x7158 0x28DD3
+0x7159 0x28DC6
+0x715A 0x28DC3
+0x715C 0x28DD2
+0x715D 0x28F66
+0x715E 0x2917F
+0x715F 0x29180
+0x7160 0x29184
+0x7161 0x29185
+0x7162 0x291E3
+0x7164 0x29241
+0x7165 0x29244
+0x7166 0x29243
+0x7167 0x2934E
+0x7168 0x2934F
+0x716A 0x29349
+0x716B 0x2934A
+0x716C 0x2934B
+0x716D 0x29343
+0x716E 0x293E0
+0x716F 0x293E5
+0x7170 0x293E1
+0x7171 0x293E6
+0x7172 0x293E2
+0x7173 0x2940C
+0x7174 0x29440
+0x7175 0x29549
+0x7176 0x2954A
+0x7177 0x29554
+0x7178 0x2954C
+0x7179 0x29555
+0x717A 0x29556
+0x717B 0x2963B
+0x717C 0x2963D
+0x717D 0x297A4
+0x717E 0x297A8
+0x7221 0x297C3
+0x7222 0x297BF
+0x7223 0x297C8
+0x7224 0x297C2
+0x7225 0x297CA
+0x7226 0x297CC
+0x7227 0x297C9
+0x7228 0x297BE
+0x7229 0x297CD
+0x722A 0x297C7
+0x722B 0x297C5
+0x722C 0x2985D
+0x722E 0x2996C
+0x722F 0x2996B
+0x7230 0x29970
+0x7231 0x2996D
+0x7232 0x2996F
+0x7233 0x29989
+0x7234 0x29984
+0x7235 0x29A8D
+0x7236 0x29A8A
+0x7237 0x29A8E
+0x7238 0x29A91
+0x7239 0x29BB5
+0x723A 0x29BB1
+0x723B 0x29BAF
+0x723C 0x29BB9
+0x723D 0x29BB7
+0x723E 0x29BB0
+0x7240 0x29C17
+0x7242 0x29C4F
+0x7243 0x29D19
+0x7244 0x29D10
+0x7245 0x29D18
+0x7246 0x29D11
+0x7247 0x29D1C
+0x7248 0x29D12
+0x7249 0x29E76
+0x724A 0x29E71
+0x724C 0x29E7A
+0x724D 0x29E7F
+0x724F 0x29E73
+0x7250 0x29EAB
+0x7252 0x29E77
+0x7253 0x29E74
+0x7254 0x29E7E
+0x7255 0x29E9B
+0x7256 0x29E84
+0x7257 0x29E7C
+0x7258 0x2A129
+0x7259 0x2A12B
+0x725A 0x2A10E
+0x725B 0x2A100
+0x725C 0x2A10B
+0x725D 0x2A0FE
+0x725E 0x2A0FA
+0x725F 0x2A117
+0x7260 0x2A0FF
+0x7261 0x2A10C
+0x7262 0x2A10F
+0x7264 0x2A102
+0x7265 0x2A101
+0x7266 0x2A0FC
+0x7267 0x2A149
+0x7268 0x2A106
+0x7269 0x2A112
+0x726A 0x2A113
+0x726B 0x2A278
+0x726C 0x2A35B
+0x726D 0x2A362
+0x726E 0x2A35F
+0x726F 0x2A35D
+0x7270 0x2A3AB
+0x7271 0x2A3D5
+0x7272 0x2A3D4
+0x7273 0x2A3D3
+0x7274 0x2A407
+0x7275 0x2A46C
+0x7276 0x2A470
+0x7277 0x2A46E
+0x7278 0x2A468
+0x7279 0x2A46D
+0x727A 0x2A477
+0x727B 0x2A46A
+0x727C 0x2A4CE
+0x727D 0x2A4EC
+0x727E 0x2A569
+0x7321 0x2A568
+0x7322 0x2A5A6
+0x7323 0x2A5A9
+0x7324 0x2A5AA
+0x7325 0x2A600
+0x7326 0x2A60D
+0x7327 0x2A5F8
+0x7328 0x2A5FC
+0x7329 0x2A60A
+0x732A 0x2A5F7
+0x732B 0x2A601
+0x732C 0x2A6B6
+0x732D 0x2A6BB
+0x732E 0x2A6B7
+0x732F 0x2A6B9
+0x7330 0x2A6CA
+0x7331 0x20469
+0x7332 0x20625
+0x7333 0x21159
+0x7334 0x21507
+0x7335 0x21509
+0x7336 0x21922
+0x7337 0x21B07
+0x7338 0x21B04
+0x7339 0x2330F
+0x733A 0x21CF8
+0x733B 0x21FC7
+0x733C 0x21FD1
+0x733D 0x2217E
+0x733E 0x22308
+0x733F 0x2244A
+0x7340 0x2F898
+0x7341 0x224B9
+0x7342 0x22E88
+0x7343 0x22E91
+0x7344 0x22E84
+0x7345 0x22E73
+0x7346 0x22E89
+0x7347 0x22E85
+0x7348 0x23033
+0x7349 0x23313
+0x734A 0x2381D
+0x734B 0x2381F
+0x734C 0x2381C
+0x734D 0x23820
+0x734E 0x2381A
+0x734F 0x2381B
+0x7350 0x23939
+0x7351 0x239AF
+0x7352 0x23AE5
+0x7353 0x23C3C
+0x7354 0x24137
+0x7355 0x2413A
+0x7356 0x244BB
+0x7358 0x24710
+0x7359 0x2470D
+0x735A 0x24BAF
+0x735B 0x24C11
+0x735D 0x24F0D
+0x735E 0x24F0C
+0x735F 0x24F0B
+0x7360 0x250D4
+0x7361 0x2533D
+0x7362 0x2533E
+0x7363 0x2533B
+0x7364 0x25343
+0x7365 0x25340
+0x7366 0x25346
+0x7367 0x25411
+0x7368 0x255DD
+0x7369 0x255DF
+0x736A 0x255EA
+0x736B 0x2574A
+0x736C 0x25906
+0x736D 0x25DC1
+0x736E 0x25DB9
+0x736F 0x25DC6
+0x7370 0x25DB8
+0x7371 0x25DBB
+0x7372 0x25DC8
+0x7373 0x25DC5
+0x7374 0x25DBF
+0x7375 0x25DC7
+0x7376 0x25DC4
+0x7377 0x25F65
+0x7378 0x25F67
+0x7379 0x261D7
+0x737A 0x261DB
+0x737B 0x261D4
+0x737C 0x261D6
+0x737D 0x263E8
+0x737E 0x2660A
+0x7421 0x26ABD
+0x7422 0x26ABE
+0x7423 0x2711A
+0x7424 0x2710D
+0x7425 0x2710F
+0x7426 0x2711B
+0x7427 0x27110
+0x7428 0x27111
+0x7429 0x27113
+0x742A 0x27218
+0x742B 0x27520
+0x742C 0x2751F
+0x742D 0x27523
+0x742E 0x2751D
+0x742F 0x27537
+0x7430 0x27525
+0x7431 0x27524
+0x7432 0x2752A
+0x7433 0x27527
+0x7434 0x27533
+0x7435 0x27528
+0x7436 0x27534
+0x7437 0x277BA
+0x7439 0x2789D
+0x743A 0x2794C
+0x743B 0x27B5C
+0x743C 0x27B6A
+0x743D 0x27B5D
+0x743E 0x27B65
+0x743F 0x27B63
+0x7440 0x27B5E
+0x7441 0x27C19
+0x7442 0x27C97
+0x7443 0x27E3F
+0x7444 0x27E33
+0x7445 0x27E32
+0x7446 0x27FA1
+0x7447 0x27FA5
+0x7448 0x27FA4
+0x7449 0x27FA2
+0x744A 0x281C1
+0x744C 0x281C7
+0x744D 0x281C4
+0x744E 0x281C6
+0x744F 0x281C5
+0x7450 0x281D4
+0x7451 0x281CA
+0x7452 0x28653
+0x7453 0x288F1
+0x7454 0x28921
+0x7456 0x28BB7
+0x7457 0x28B92
+0x7458 0x28DD4
+0x7459 0x28F44
+0x745A 0x29198
+0x745B 0x2919B
+0x745C 0x29191
+0x745D 0x29195
+0x745E 0x2919A
+0x745F 0x29192
+0x7460 0x29353
+0x7461 0x29357
+0x7463 0x2935C
+0x7464 0x2935D
+0x7465 0x29364
+0x7466 0x293EA
+0x7467 0x293ED
+0x7468 0x29442
+0x7469 0x29443
+0x746A 0x29564
+0x746B 0x29561
+0x746C 0x29560
+0x746D 0x2967D
+0x746E 0x297D4
+0x746F 0x297D5
+0x7470 0x297D9
+0x7471 0x29987
+0x7472 0x29999
+0x7473 0x2998C
+0x7474 0x2998A
+0x7475 0x2998F
+0x7477 0x2998B
+0x7478 0x29982
+0x7479 0x2999B
+0x747B 0x29BC8
+0x747C 0x29BC4
+0x747D 0x29BCC
+0x747E 0x29BC7
+0x7521 0x29BC3
+0x7522 0x29BC6
+0x7523 0x29BCB
+0x7524 0x29BCA
+0x7525 0x29BC9
+0x7526 0x29BCD
+0x7527 0x29C53
+0x7528 0x29D21
+0x7529 0x29D29
+0x752A 0x29D1D
+0x752B 0x29D24
+0x752C 0x29D28
+0x752E 0x29EB1
+0x752F 0x29EB2
+0x7530 0x29EB5
+0x7531 0x29ED6
+0x7532 0x29EAF
+0x7533 0x29ECA
+0x7534 0x29EB8
+0x7535 0x2FA12
+0x7536 0x2FA11
+0x7537 0x2A145
+0x7538 0x2A147
+0x7539 0x2A134
+0x753A 0x2A16E
+0x753B 0x2A142
+0x753C 0x2A131
+0x753D 0x2A12E
+0x753E 0x2A156
+0x753F 0x2A138
+0x7540 0x2A137
+0x7541 0x2A14B
+0x7542 0x2A12D
+0x7543 0x2A133
+0x7544 0x2A136
+0x7546 0x2A148
+0x7547 0x2A2DC
+0x7549 0x2A366
+0x754A 0x2A36D
+0x754B 0x2A363
+0x754C 0x2A364
+0x754E 0x2A367
+0x754F 0x2A3D9
+0x7550 0x2A40B
+0x7551 0x2A47E
+0x7552 0x2A48B
+0x7553 0x2A526
+0x7554 0x2A52C
+0x7555 0x2A529
+0x7556 0x2A56F
+0x7557 0x2A56B
+0x7558 0x2A56D
+0x7559 0x2A56E
+0x755A 0x2A61C
+0x755B 0x2A611
+0x755C 0x2A610
+0x755D 0x2A624
+0x755E 0x2A612
+0x755F 0x2A615
+0x7560 0x2A617
+0x7562 0x2046F
+0x7563 0x205AB
+0x7564 0x2082E
+0x7565 0x208C9
+0x7566 0x20B96
+0x7567 0x21185
+0x7568 0x216A0
+0x7569 0x2192B
+0x756A 0x2230D
+0x756B 0x23036
+0x756F 0x233B1
+0x7570 0x2384A
+0x7571 0x23837
+0x7572 0x2383C
+0x7573 0x23838
+0x7574 0x2383A
+0x7575 0x2383E
+0x7576 0x23849
+0x7579 0x23A80
+0x757A 0x23A7F
+0x757B 0x23AE3
+0x757C 0x23C3F
+0x757D 0x24152
+0x757E 0x2414E
+0x7621 0x2414A
+0x7622 0x2414B
+0x7623 0x244D5
+0x7624 0x24AD8
+0x7625 0x24B20
+0x7626 0x24BB3
+0x7627 0x24BB1
+0x7628 0x24BB0
+0x7629 0x24F17
+0x762A 0x250D9
+0x762B 0x25349
+0x762C 0x25413
+0x762D 0x255ED
+0x762E 0x255EB
+0x762F 0x255EE
+0x7630 0x2590A
+0x7631 0x2590B
+0x7632 0x25A4A
+0x7633 0x25DD5
+0x7634 0x25DD7
+0x7635 0x25DDE
+0x7636 0x25DDC
+0x7637 0x25DEE
+0x7638 0x25F70
+0x763A 0x261D9
+0x763B 0x263D7
+0x763C 0x268CB
+0x763D 0x268C7
+0x763E 0x269FC
+0x763F 0x2713B
+0x7640 0x27139
+0x7641 0x2714B
+0x7642 0x27143
+0x7643 0x27140
+0x7644 0x27146
+0x7645 0x2754D
+0x7646 0x27543
+0x7647 0x27547
+0x7648 0x2754B
+0x7649 0x27555
+0x764A 0x27552
+0x764B 0x27B5F
+0x764D 0x27B7C
+0x764E 0x27B7B
+0x764F 0x27FA8
+0x7650 0x27FA9
+0x7651 0x281DE
+0x7652 0x281D7
+0x7653 0x281DD
+0x7654 0x281D6
+0x7655 0x281D8
+0x7656 0x2829B
+0x7657 0x283E0
+0x7658 0x283E8
+0x7659 0x283E6
+0x765A 0x288F8
+0x765B 0x288FB
+0x765C 0x28BBB
+0x765E 0x28BB8
+0x7660 0x28CC1
+0x7661 0x28CC0
+0x7662 0x291A4
+0x7663 0x291AB
+0x7664 0x2924D
+0x7665 0x29365
+0x7666 0x29367
+0x7667 0x2936A
+0x7668 0x29366
+0x7669 0x29369
+0x766A 0x29573
+0x766B 0x29580
+0x766C 0x2956F
+0x766D 0x29571
+0x766E 0x297E4
+0x766F 0x297E6
+0x7670 0x297E7
+0x7671 0x299A0
+0x7672 0x299A4
+0x7673 0x29AA2
+0x7674 0x29AA7
+0x7675 0x29AA4
+0x7676 0x29BDE
+0x7677 0x29BDB
+0x7678 0x29C58
+0x7679 0x29C5C
+0x767A 0x29D2F
+0x767B 0x29D2E
+0x767C 0x29EDD
+0x767D 0x29EE4
+0x767E 0x29ED8
+0x7721 0x29EE7
+0x7722 0x29EDA
+0x7723 0x29E75
+0x7725 0x2A179
+0x7726 0x2A180
+0x7727 0x2A17F
+0x7728 0x2A17C
+0x7729 0x2A175
+0x772A 0x2A17B
+0x772B 0x2A182
+0x772D 0x2A189
+0x772E 0x2A174
+0x772F 0x2A17D
+0x7730 0x2A17A
+0x7731 0x2A186
+0x7732 0x2A1A8
+0x7733 0x2A172
+0x7735 0x2A18B
+0x7736 0x2A191
+0x7737 0x2A1B3
+0x7738 0x2A181
+0x7739 0x2A282
+0x773A 0x2A2E1
+0x773B 0x2A2E3
+0x773C 0x2A2E2
+0x773D 0x2A376
+0x773E 0x2A374
+0x773F 0x2A372
+0x7740 0x2A375
+0x7741 0x2A40E
+0x7742 0x2A40D
+0x7743 0x2A494
+0x7744 0x2A492
+0x7745 0x2A493
+0x7746 0x2A491
+0x7747 0x2A48F
+0x7748 0x2A495
+0x7749 0x2A4D0
+0x774A 0x2A4F7
+0x774B 0x2A576
+0x774C 0x2A5AF
+0x774E 0x2A626
+0x774F 0x2A625
+0x7750 0x2A62D
+0x7751 0x2A6A0
+0x7752 0x2A6C3
+0x7753 0x204D7
+0x7754 0x20ACC
+0x7755 0x21179
+0x7756 0x2117A
+0x7757 0x21515
+0x7758 0x21FDB
+0x7759 0x22185
+0x775A 0x22970
+0x775B 0x2297B
+0x775C 0x22EA5
+0x775D 0x22E9F
+0x775E 0x23317
+0x775F 0x233B2
+0x7760 0x23839
+0x7761 0x23840
+0x7762 0x2384E
+0x7763 0x2393E
+0x7764 0x23AE8
+0x7765 0x23AE7
+0x7766 0x24166
+0x7767 0x24161
+0x7768 0x244DA
+0x7769 0x24714
+0x776A 0x248DF
+0x776B 0x24F18
+0x776C 0x25039
+0x776D 0x2503A
+0x776E 0x25730
+0x776F 0x25732
+0x7770 0x2590E
+0x7771 0x25A4C
+0x7772 0x25DE8
+0x7773 0x25DF1
+0x7774 0x25DEB
+0x7775 0x25DEC
+0x7776 0x25F74
+0x7777 0x25F73
+0x7778 0x261F1
+0x7779 0x26342
+0x777A 0x2633E
+0x777B 0x26341
+0x777C 0x2652C
+0x777D 0x268D2
+0x777E 0x269BB
+0x7821 0x27158
+0x7822 0x27157
+0x7823 0x27156
+0x7824 0x2715A
+0x7826 0x27561
+0x7827 0x27568
+0x7828 0x27565
+0x7829 0x2755F
+0x782A 0x27564
+0x782B 0x2755E
+0x782C 0x2755B
+0x782D 0x27567
+0x782E 0x277C3
+0x782F 0x278A2
+0x7830 0x27953
+0x7831 0x27B7D
+0x7832 0x27C20
+0x7833 0x27FAE
+0x7834 0x27FAF
+0x7835 0x27FB0
+0x7836 0x281E7
+0x7837 0x281E6
+0x7838 0x281E9
+0x7839 0x283F1
+0x783A 0x283EB
+0x783B 0x283EA
+0x783C 0x283E9
+0x783D 0x28663
+0x783E 0x28902
+0x783F 0x288FE
+0x7840 0x28BDE
+0x7841 0x28CC2
+0x7842 0x28DE6
+0x7843 0x28F5D
+0x7844 0x291AD
+0x7845 0x29375
+0x7846 0x29372
+0x7847 0x29377
+0x7849 0x29651
+0x784A 0x297E8
+0x784B 0x297ED
+0x784C 0x297EE
+0x784D 0x299B9
+0x784E 0x299A1
+0x784F 0x299B6
+0x7850 0x29AAE
+0x7851 0x29BE8
+0x7853 0x29C1E
+0x7854 0x29D31
+0x7855 0x29D32
+0x7857 0x29F0E
+0x7858 0x29F12
+0x7859 0x29F09
+0x785A 0x29F05
+0x785C 0x29F03
+0x785D 0x29F1F
+0x785E 0x29F0D
+0x785F 0x29F0C
+0x7860 0x29F04
+0x7861 0x29F0A
+0x7862 0x2A1C2
+0x7863 0x2A1BF
+0x7864 0x2A1C9
+0x7865 0x2A1B2
+0x7866 0x2A1C1
+0x7867 0x2A1AF
+0x7868 0x2A1B4
+0x7869 0x2A1B0
+0x786A 0x2A1B6
+0x786B 0x2A1B7
+0x786C 0x2A1BB
+0x786D 0x2A1B1
+0x786E 0x2A2F0
+0x786F 0x2A378
+0x7870 0x2A37A
+0x7871 0x2A379
+0x7872 0x2A3E4
+0x7873 0x2A3E6
+0x7874 0x2A49F
+0x7875 0x2A49D
+0x7876 0x2A498
+0x7877 0x2A499
+0x7878 0x2A4F9
+0x7879 0x2A530
+0x787A 0x2A582
+0x787B 0x2A581
+0x787C 0x2A5B3
+0x787D 0x2A57F
+0x787E 0x2A63A
+0x7921 0x2A63E
+0x7922 0x2A648
+0x7923 0x21186
+0x7924 0x21936
+0x7925 0x21B13
+0x7926 0x21C22
+0x7927 0x21FDD
+0x7928 0x225A7
+0x7929 0x2297D
+0x792B 0x2331C
+0x792C 0x23865
+0x792D 0x23860
+0x792E 0x23867
+0x7930 0x23B1A
+0x7931 0x24AE3
+0x7932 0x25734
+0x7933 0x25918
+0x7934 0x25A52
+0x7935 0x25DFC
+0x7936 0x25F79
+0x7937 0x25F78
+0x7938 0x25F76
+0x7939 0x261FA
+0x793A 0x261F8
+0x793B 0x2652D
+0x793C 0x268D6
+0x793D 0x269BD
+0x793E 0x269BF
+0x793F 0x269BE
+0x7940 0x27144
+0x7941 0x27170
+0x7942 0x27162
+0x7943 0x2716E
+0x7944 0x2756E
+0x7945 0x2757C
+0x7946 0x27574
+0x7947 0x27578
+0x7948 0x27570
+0x7949 0x27579
+0x794A 0x27571
+0x794B 0x277CC
+0x794C 0x278A7
+0x794D 0x278A6
+0x794E 0x27B93
+0x794F 0x27C21
+0x7950 0x27C9C
+0x7951 0x2829D
+0x7952 0x283F4
+0x7953 0x283F3
+0x7954 0x28DF0
+0x7955 0x291B8
+0x7956 0x291B6
+0x7957 0x291BD
+0x7958 0x29373
+0x7959 0x29382
+0x795A 0x29587
+0x795B 0x29656
+0x795C 0x29659
+0x795D 0x297F6
+0x795E 0x299C9
+0x795F 0x299C5
+0x7960 0x299C7
+0x7961 0x299CA
+0x7962 0x299C2
+0x7963 0x299C4
+0x7964 0x29BF2
+0x7965 0x29BF0
+0x7966 0x29D3B
+0x7967 0x29D3A
+0x7968 0x29F26
+0x7969 0x29F28
+0x796A 0x29F34
+0x796B 0x29F2D
+0x796C 0x2A1D7
+0x796D 0x2A1D2
+0x796E 0x2A1D6
+0x796F 0x2A1DC
+0x7970 0x2A1D3
+0x7971 0x2A1D1
+0x7972 0x2A286
+0x7974 0x2A2EF
+0x7975 0x2A2EE
+0x7976 0x2A3E8
+0x7977 0x2A4AC
+0x7978 0x2A4A9
+0x7979 0x2A4AA
+0x797A 0x2A4AB
+0x797B 0x2A4FB
+0x797C 0x2A533
+0x797D 0x2A588
+0x797E 0x2A5B6
+0x7A21 0x2A5B7
+0x7A22 0x2A5D0
+0x7A23 0x2A5CF
+0x7A24 0x2A64F
+0x7A25 0x2A659
+0x7A26 0x2A64C
+0x7A27 0x21B18
+0x7A28 0x21FE0
+0x7A29 0x23869
+0x7A2A 0x24173
+0x7A2B 0x24172
+0x7A2C 0x24AE8
+0x7A2D 0x255FB
+0x7A2E 0x2591C
+0x7A2F 0x25E09
+0x7A30 0x25E0A
+0x7A31 0x25E08
+0x7A32 0x25F7D
+0x7A33 0x25F7F
+0x7A34 0x26267
+0x7A35 0x2717A
+0x7A36 0x2717B
+0x7A37 0x277D1
+0x7A38 0x2F9CB
+0x7A39 0x27B9D
+0x7A3A 0x27C9D
+0x7A3B 0x281FC
+0x7A3C 0x281FB
+0x7A3D 0x281FD
+0x7A3E 0x283F5
+0x7A3F 0x283F6
+0x7A40 0x28C0F
+0x7A41 0x28C1D
+0x7A42 0x291C7
+0x7A43 0x291C1
+0x7A44 0x291BF
+0x7A45 0x29254
+0x7A46 0x2937F
+0x7A47 0x293F5
+0x7A48 0x2958A
+0x7A49 0x2958C
+0x7A4A 0x2965C
+0x7A4B 0x29865
+0x7A4C 0x299CF
+0x7A4D 0x299D0
+0x7A4E 0x29AB8
+0x7A4F 0x29BFA
+0x7A50 0x29C66
+0x7A51 0x29F40
+0x7A52 0x29F41
+0x7A54 0x2A1F7
+0x7A55 0x2A1F3
+0x7A56 0x2A1EF
+0x7A57 0x2A1F4
+0x7A58 0x2A1ED
+0x7A59 0x2A1F2
+0x7A5A 0x2A1F1
+0x7A5B 0x2A1F9
+0x7A5C 0x2A4B4
+0x7A5D 0x2A4FC
+0x7A5E 0x2A5BC
+0x7A5F 0x2A65E
+0x7A60 0x2A65B
+0x7A61 0x2A65F
+0x7A62 0x2A65D
+0x7A63 0x2A6CF
+0x7A64 0x2A6CE
+0x7A65 0x2193A
+0x7A66 0x21FE1
+0x7A67 0x22315
+0x7A68 0x22314
+0x7A69 0x24178
+0x7A6A 0x24179
+0x7A6B 0x244E6
+0x7A6C 0x24BB8
+0x7A6D 0x24F22
+0x7A6E 0x255FE
+0x7A6F 0x268DB
+0x7A70 0x26A06
+0x7A71 0x26AC8
+0x7A72 0x27189
+0x7A73 0x27586
+0x7A74 0x278AD
+0x7A75 0x27B99
+0x7A76 0x27BD8
+0x7A77 0x27C23
+0x7A78 0x27D23
+0x7A79 0x27FB5
+0x7A7A 0x283F9
+0x7A7B 0x28907
+0x7A7C 0x28C1E
+0x7A7D 0x28DFB
+0x7A7E 0x28F72
+0x7B21 0x28F73
+0x7B22 0x29387
+0x7B23 0x29449
+0x7B24 0x2965D
+0x7B25 0x297F8
+0x7B26 0x29C03
+0x7B27 0x29F4E
+0x7B28 0x29F4D
+0x7B29 0x29F50
+0x7B2A 0x29F55
+0x7B2B 0x2A209
+0x7B2C 0x2A207
+0x7B2D 0x2A20C
+0x7B2E 0x2A203
+0x7B2F 0x2A206
+0x7B30 0x2A20B
+0x7B31 0x2A20A
+0x7B32 0x2A289
+0x7B33 0x2A4BB
+0x7B34 0x2A4FF
+0x7B35 0x2A536
+0x7B36 0x2A58B
+0x7B37 0x2A666
+0x7B38 0x2A669
+0x7B39 0x2A667
+0x7B3A 0x2A6C2
+0x7B3B 0x2A6D2
+0x7B3C 0x21FE2
+0x7B3E 0x22988
+0x7B3F 0x2335B
+0x7B40 0x23876
+0x7B41 0x2417D
+0x7B42 0x245A6
+0x7B43 0x2535A
+0x7B44 0x25E17
+0x7B45 0x268DC
+0x7B46 0x2718F
+0x7B47 0x27594
+0x7B48 0x27595
+0x7B49 0x27FB6
+0x7B4A 0x28204
+0x7B4B 0x287EE
+0x7B4C 0x2938A
+0x7B4D 0x293F9
+0x7B4E 0x29C07
+0x7B4F 0x29C1F
+0x7B50 0x29C2A
+0x7B51 0x29D45
+0x7B52 0x29F5C
+0x7B53 0x29F5B
+0x7B54 0x29F61
+0x7B55 0x29F5D
+0x7B56 0x2A218
+0x7B57 0x2A21F
+0x7B58 0x2A383
+0x7B59 0x2A416
+0x7B5A 0x2A414
+0x7B5B 0x2A4BF
+0x7B5C 0x2A4C0
+0x7B5D 0x2A673
+0x7B5E 0x2A6C0
+0x7B5F 0x21517
+0x7B60 0x22989
+0x7B61 0x2591E
+0x7B62 0x2591F
+0x7B63 0x25A54
+0x7B64 0x25E18
+0x7B65 0x26205
+0x7B66 0x27195
+0x7B67 0x27598
+0x7B68 0x2759B
+0x7B69 0x27959
+0x7B6A 0x28208
+0x7B6B 0x28401
+0x7B6C 0x291CE
+0x7B6D 0x293FA
+0x7B6E 0x29ABE
+0x7B6F 0x29D47
+0x7B70 0x29F6A
+0x7B71 0x29F69
+0x7B72 0x29F68
+0x7B73 0x29F67
+0x7B74 0x2A225
+0x7B75 0x2A228
+0x7B76 0x2A4C4
+0x7B77 0x2A537
+0x7B78 0x2A58D
+0x7B79 0x2A58C
+0x7B7B 0x2F920
+0x7B7C 0x25E22
+0x7B7D 0x25F82
+0x7B7E 0x277D9
+0x7C21 0x28C38
+0x7C22 0x293FB
+0x7C23 0x299E1
+0x7C24 0x29C72
+0x7C25 0x29D48
+0x7C26 0x29F6C
+0x7C27 0x29F70
+0x7C28 0x2A231
+0x7C29 0x2A230
+0x7C2A 0x2A679
+0x7C2B 0x25E23
+0x7C2C 0x268F8
+0x7C2D 0x29C74
+0x7C2E 0x29F73
+0x7C2F 0x2A234
+0x7C30 0x2A387
+0x7C31 0x2A3B2
+0x7C32 0x2A5C2
+0x7C33 0x2A67D
+0x7C34 0x21FE5
+0x7C35 0x2938C
+0x7C36 0x29F77
+0x7C37 0x29F75
+0x7C38 0x2A238
+0x7C39 0x2A23A
+0x7C3A 0x2A683
+0x7C3B 0x2A681
+0x7C3C 0x24180
+0x7C3D 0x27199
+0x7C3F 0x2944A
+0x7C40 0x29D4A
+0x7C41 0x2A23C
+0x7C42 0x2A6C8
+0x7C43 0x25604
+0x7C44 0x278AF
+0x7C45 0x2A689
+0x7C46 0x2A2FA
+0x7C47 0x29661
+0x7C48 0x2A23F
+0x7C49 0x27193
+0x7C4A 0x2A4C9
+0x7C4B 0x277DE
+0x7C4C 0x29391
+0x7C4D 0x2A68E
+0x7C4E 0x2A68D
+0x7C4F 0x27198
+0x7C50 0x269C5
+0x7C51 0x2A6A5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6158 @@
+0x2121 0x2F802
+0x2122 0x20062
+0x2124 0x20088
+0x2125 0x200D0
+0x2126 0x200CF
+0x2127 0x2011E
+0x2128 0x2011F
+0x2129 0x20120
+0x212A 0x2090E
+0x212B 0x2092C
+0x212C 0x20061
+0x212D 0x20004
+0x212E 0x20005
+0x212F 0x20003
+0x2131 0x2F801
+0x2132 0x2007D
+0x2133 0x2008D
+0x2134 0x201A3
+0x2135 0x201A4
+0x2136 0x204DB
+0x2137 0x20500
+0x2138 0x2F81E
+0x2139 0x206A3
+0x213A 0x20832
+0x213C 0x20AD4
+0x213D 0x20AD5
+0x213E 0x21C23
+0x213F 0x2232C
+0x2140 0x2237A
+0x2141 0x20503
+0x2142 0x20007
+0x2143 0x20008
+0x2144 0x2008F
+0x2145 0x2009C
+0x2146 0x200D5
+0x2147 0x20112
+0x2148 0x20113
+0x2149 0x20114
+0x214A 0x20121
+0x214B 0x201A8
+0x214C 0x201A6
+0x214D 0x20476
+0x214E 0x20501
+0x214F 0x2053D
+0x2150 0x2F814
+0x2151 0x2053E
+0x2152 0x20629
+0x2153 0x20677
+0x2154 0x20678
+0x2155 0x206A6
+0x2156 0x206A9
+0x2157 0x206AC
+0x2158 0x20834
+0x2159 0x20504
+0x215A 0x2097B
+0x215B 0x20A10
+0x215C 0x2062F
+0x215D 0x20AD7
+0x215E 0x20B1C
+0x215F 0x20B1F
+0x2160 0x20B1A
+0x2161 0x2F836
+0x2162 0x20B1E
+0x2163 0x20B9E
+0x2164 0x20B9A
+0x2165 0x211A0
+0x2166 0x211A1
+0x2167 0x215D2
+0x2168 0x215D3
+0x2169 0x219B9
+0x216A 0x21B1D
+0x216B 0x21B55
+0x216C 0x21CFF
+0x216D 0x21FE7
+0x216F 0x22011
+0x2170 0x22013
+0x2171 0x22012
+0x2172 0x221AF
+0x2173 0x221B1
+0x2174 0x2F890
+0x2175 0x2232D
+0x2176 0x2237B
+0x2177 0x2239D
+0x2178 0x2239A
+0x217A 0x2239F
+0x217B 0x223A0
+0x217C 0x2239C
+0x217D 0x224BD
+0x2221 0x225AA
+0x2222 0x2306C
+0x2223 0x23091
+0x2224 0x23C74
+0x2225 0x2456A
+0x2226 0x2F929
+0x2227 0x25605
+0x2228 0x2626B
+0x2229 0x2626A
+0x222A 0x200E0
+0x222B 0x20012
+0x222D 0x2007F
+0x222E 0x200A0
+0x222F 0x20099
+0x2230 0x20095
+0x2231 0x2009E
+0x2232 0x200DF
+0x2233 0x200DE
+0x2234 0x201AF
+0x2235 0x201AD
+0x2236 0x201B0
+0x2237 0x204DF
+0x2238 0x20543
+0x2239 0x20541
+0x223A 0x20548
+0x223B 0x20575
+0x223C 0x2F81A
+0x223D 0x20632
+0x223E 0x2067B
+0x223F 0x20679
+0x2240 0x206B3
+0x2242 0x20BA7
+0x2243 0x206B2
+0x2244 0x206B0
+0x2245 0x206B4
+0x2246 0x2F829
+0x2247 0x208CD
+0x2248 0x208CE
+0x2249 0x2F82B
+0x224A 0x20910
+0x224B 0x20980
+0x224C 0x209D3
+0x224D 0x20A30
+0x224E 0x20098
+0x224F 0x20A2F
+0x2250 0x20A31
+0x2251 0x20ADA
+0x2252 0x20AD9
+0x2253 0x20B27
+0x2254 0x20B28
+0x2255 0x20B21
+0x2256 0x20B25
+0x2257 0x20BA6
+0x2258 0x20BA2
+0x2259 0x20BA1
+0x225A 0x20BA4
+0x225B 0x2F839
+0x225C 0x20BAA
+0x225D 0x20BA5
+0x225E 0x20BA3
+0x225F 0x20064
+0x2260 0x2123F
+0x2261 0x21244
+0x2262 0x2151B
+0x2263 0x21553
+0x2264 0x21584
+0x2265 0x21586
+0x2266 0x215D5
+0x2267 0x2F860
+0x2268 0x2193E
+0x2269 0x21940
+0x226A 0x21BCA
+0x226B 0x21BC9
+0x226C 0x21C26
+0x226D 0x21D00
+0x226E 0x21D31
+0x226F 0x21D3C
+0x2270 0x21D30
+0x2271 0x21D33
+0x2272 0x21D32
+0x2273 0x21D38
+0x2274 0x22034
+0x2275 0x22053
+0x2276 0x22054
+0x2277 0x221B4
+0x2278 0x221B2
+0x2279 0x2232F
+0x227A 0x223A5
+0x227B 0x223A7
+0x227C 0x223A4
+0x227D 0x223A8
+0x227E 0x223A9
+0x2321 0x223A2
+0x2322 0x223A3
+0x2323 0x223A6
+0x2324 0x22481
+0x2325 0x22480
+0x2326 0x225AD
+0x2327 0x22A24
+0x2328 0x22A65
+0x2329 0x22A68
+0x232A 0x22A69
+0x232B 0x2313C
+0x232C 0x2313B
+0x232D 0x2335D
+0x232E 0x23944
+0x232F 0x24182
+0x2330 0x244F1
+0x2331 0x2456B
+0x2332 0x2471B
+0x2333 0x248EB
+0x2334 0x24BBA
+0x2335 0x24BD3
+0x2336 0x24D13
+0x2337 0x25922
+0x2338 0x26AF4
+0x2339 0x2820F
+0x233A 0x28210
+0x233B 0x20507
+0x233C 0x29C0B
+0x233D 0x29C0A
+0x233E 0x20019
+0x233F 0x2001A
+0x2340 0x20018
+0x2341 0x20066
+0x2342 0x20082
+0x2343 0x200A8
+0x2344 0x200E5
+0x2345 0x200E7
+0x2346 0x200E4
+0x2347 0x20115
+0x2348 0x20123
+0x2349 0x20124
+0x234A 0x20143
+0x234B 0x201C3
+0x234C 0x201BC
+0x234D 0x201BB
+0x234F 0x201B7
+0x2350 0x201B9
+0x2351 0x201CF
+0x2352 0x2F80D
+0x2353 0x2047A
+0x2354 0x2047B
+0x2355 0x204E1
+0x2356 0x204E0
+0x2357 0x20509
+0x2358 0x2054D
+0x2359 0x2F816
+0x235A 0x2054B
+0x235B 0x20579
+0x235C 0x205B1
+0x235D 0x20636
+0x235E 0x20635
+0x235F 0x20637
+0x2360 0x20638
+0x2361 0x2067F
+0x2362 0x20680
+0x2363 0x20681
+0x2364 0x26953
+0x2365 0x2067E
+0x2366 0x206CD
+0x2367 0x206BF
+0x2368 0x206BE
+0x2369 0x206C2
+0x236A 0x206B8
+0x236B 0x206C1
+0x236D 0x20931
+0x236E 0x2092F
+0x236F 0x2096F
+0x2370 0x20982
+0x2372 0x20987
+0x2373 0x20986
+0x2374 0x2098D
+0x2375 0x20994
+0x2376 0x209D7
+0x2377 0x209D4
+0x2378 0x209D8
+0x2379 0x20A16
+0x237A 0x20A14
+0x237B 0x20A2E
+0x237C 0x20A36
+0x237D 0x20A37
+0x237E 0x21FEE
+0x2421 0x20AE0
+0x2422 0x20AE5
+0x2423 0x20ADF
+0x2424 0x20B2B
+0x2425 0x20B29
+0x2426 0x20B2D
+0x2427 0x20B2F
+0x2428 0x20BB7
+0x2429 0x20BC9
+0x242A 0x20BC1
+0x242B 0x20BCA
+0x242C 0x20BB2
+0x242D 0x20BAC
+0x242E 0x20BAE
+0x242F 0x211B2
+0x2430 0x211A8
+0x2431 0x211B0
+0x2432 0x211A7
+0x2433 0x2F851
+0x2434 0x21252
+0x2435 0x2124A
+0x2436 0x21556
+0x2437 0x21555
+0x2438 0x2155F
+0x2439 0x2155E
+0x243A 0x21588
+0x243B 0x2F85D
+0x243C 0x215DD
+0x243D 0x215E2
+0x243E 0x215E1
+0x243F 0x215DF
+0x2440 0x215E0
+0x2441 0x216AF
+0x2442 0x216B1
+0x2443 0x216BA
+0x2444 0x21945
+0x2445 0x21943
+0x2446 0x219BD
+0x2447 0x219C8
+0x2448 0x2F86C
+0x2449 0x219BE
+0x244A 0x219BF
+0x244B 0x2F874
+0x244C 0x21B59
+0x244D 0x21C29
+0x244E 0x21C2C
+0x244F 0x21C2F
+0x2450 0x21C2D
+0x2451 0x21C2E
+0x2452 0x21D04
+0x2453 0x21D02
+0x2454 0x21D01
+0x2455 0x21D40
+0x2456 0x21D4A
+0x2457 0x21D3F
+0x2458 0x21D4F
+0x2459 0x21D41
+0x245A 0x21D4E
+0x245B 0x21FEB
+0x245C 0x21FEC
+0x245D 0x200AC
+0x245E 0x2205B
+0x245F 0x22063
+0x2460 0x2205A
+0x2461 0x22059
+0x2462 0x221DC
+0x2463 0x221DB
+0x2464 0x221D9
+0x2465 0x221E0
+0x2466 0x221DD
+0x2467 0x20020
+0x2468 0x223B0
+0x2469 0x223B1
+0x246A 0x223B2
+0x246B 0x223B6
+0x246C 0x22451
+0x246D 0x22452
+0x246E 0x22450
+0x246F 0x22484
+0x2471 0x22483
+0x2472 0x225C3
+0x2473 0x225B8
+0x2474 0x225B9
+0x2475 0x225B2
+0x2476 0x22990
+0x2477 0x22A26
+0x2478 0x22A29
+0x2479 0x22A6E
+0x247A 0x23140
+0x247B 0x2313E
+0x247C 0x23141
+0x247D 0x2335E
+0x247E 0x233BB
+0x2521 0x233BC
+0x2522 0x233B9
+0x2523 0x2F8EF
+0x2524 0x23880
+0x2526 0x23945
+0x2527 0x239BA
+0x2528 0x239BD
+0x2529 0x23C56
+0x252A 0x23C55
+0x252B 0x23C75
+0x252C 0x23C77
+0x252D 0x23C81
+0x252E 0x2F8FA
+0x252F 0x23C83
+0x2530 0x23C8B
+0x2531 0x23C84
+0x2532 0x24186
+0x2533 0x24183
+0x2534 0x2418B
+0x2535 0x2456D
+0x2536 0x24616
+0x2537 0x24728
+0x2538 0x248EA
+0x2539 0x24BD4
+0x253A 0x24C03
+0x253B 0x24D15
+0x253C 0x24F3D
+0x253D 0x24F3E
+0x253E 0x25416
+0x253F 0x2F94C
+0x2540 0x25606
+0x2541 0x2574D
+0x2542 0x26222
+0x2543 0x26273
+0x2544 0x2626D
+0x2545 0x2626E
+0x2546 0x264B1
+0x2547 0x2054E
+0x2548 0x2662D
+0x254A 0x268F9
+0x254B 0x26952
+0x254C 0x26B00
+0x254D 0x26AFC
+0x254E 0x26AFA
+0x2550 0x26AF7
+0x2551 0x26AF8
+0x2552 0x2F990
+0x2553 0x2F9C4
+0x2554 0x27C27
+0x2555 0x28211
+0x2556 0x200AE
+0x2557 0x28450
+0x2558 0x2844F
+0x2559 0x2844D
+0x255A 0x28671
+0x255B 0x2F9E2
+0x255C 0x28672
+0x255D 0x28E18
+0x255E 0x20A44
+0x255F 0x20021
+0x2560 0x20067
+0x2561 0x200AF
+0x2562 0x200B0
+0x2563 0x20029
+0x2564 0x20117
+0x2565 0x20122
+0x2566 0x2F803
+0x2567 0x20025
+0x2568 0x20128
+0x2569 0x201FF
+0x256A 0x201D9
+0x256B 0x201DB
+0x256C 0x201DE
+0x256D 0x201F2
+0x256E 0x201FE
+0x256F 0x201F4
+0x2570 0x201DD
+0x2572 0x2F804
+0x2573 0x20201
+0x2574 0x201DC
+0x2575 0x2047D
+0x2576 0x20481
+0x2577 0x2047E
+0x2578 0x2047F
+0x2579 0x204E5
+0x257A 0x2050F
+0x257C 0x2050A
+0x257E 0x2050B
+0x2621 0x20551
+0x2622 0x20552
+0x2623 0x20550
+0x2624 0x205B8
+0x2625 0x2063D
+0x2626 0x2063E
+0x2627 0x2063C
+0x2628 0x20687
+0x2629 0x206D7
+0x262A 0x206DB
+0x262B 0x206CF
+0x262C 0x206E0
+0x262D 0x2084C
+0x262E 0x20842
+0x262F 0x208D4
+0x2630 0x20911
+0x2631 0x20914
+0x2632 0x20915
+0x2633 0x20912
+0x2634 0x20933
+0x2635 0x20935
+0x2637 0x20971
+0x2639 0x20991
+0x263A 0x20993
+0x263B 0x20995
+0x263C 0x209DC
+0x263D 0x20A42
+0x263E 0x20A40
+0x263F 0x253A6
+0x2640 0x20AE6
+0x2641 0x2128F
+0x2642 0x20B32
+0x2643 0x2F837
+0x2644 0x20B31
+0x2645 0x20BF5
+0x2646 0x20BCD
+0x2647 0x20BDE
+0x2648 0x20BD5
+0x2649 0x20BDA
+0x264A 0x20BEE
+0x264B 0x20BEC
+0x264C 0x20BCF
+0x264D 0x20BCE
+0x264E 0x2F83D
+0x264F 0x20BCC
+0x2650 0x20BF3
+0x2651 0x211C1
+0x2652 0x211C4
+0x2653 0x211C6
+0x2654 0x211B4
+0x2655 0x211C3
+0x2656 0x211B8
+0x2657 0x211BB
+0x2658 0x211B7
+0x2659 0x211BC
+0x265A 0x211BF
+0x265B 0x211C7
+0x265C 0x211BE
+0x265D 0x21260
+0x265E 0x2125D
+0x265F 0x21276
+0x2660 0x2126C
+0x2661 0x21275
+0x2662 0x2125B
+0x2663 0x21271
+0x2664 0x21273
+0x2665 0x21261
+0x2666 0x2125A
+0x2667 0x21262
+0x2668 0x21272
+0x2669 0x2125F
+0x266A 0x21258
+0x266B 0x2151E
+0x266C 0x21558
+0x266D 0x2158B
+0x266E 0x2158A
+0x266F 0x215F4
+0x2670 0x215F0
+0x2671 0x216D2
+0x2672 0x216CD
+0x2673 0x216CE
+0x2674 0x216BC
+0x2675 0x216D0
+0x2676 0x21946
+0x2677 0x21947
+0x267B 0x219CE
+0x267C 0x219CF
+0x267D 0x219CC
+0x267E 0x219CB
+0x2721 0x2F872
+0x2722 0x21B60
+0x2723 0x21B5F
+0x2724 0x21B5D
+0x2725 0x21BD4
+0x2726 0x21C3A
+0x2727 0x21C38
+0x2728 0x21C3C
+0x2729 0x21C36
+0x272A 0x21D08
+0x272B 0x21D7E
+0x272C 0x21D5E
+0x272D 0x21D6E
+0x272E 0x21D53
+0x272F 0x21D70
+0x2730 0x21D57
+0x2731 0x21D5D
+0x2732 0x21D63
+0x2733 0x21D7A
+0x2734 0x21D79
+0x2735 0x21D93
+0x2736 0x2F881
+0x2737 0x2201D
+0x2738 0x22068
+0x2739 0x22073
+0x273A 0x22074
+0x273B 0x22066
+0x273C 0x2206F
+0x273D 0x22075
+0x273E 0x2207A
+0x273F 0x22070
+0x2740 0x2206D
+0x2741 0x22065
+0x2742 0x2218A
+0x2743 0x221ED
+0x2744 0x221E9
+0x2745 0x221E3
+0x2746 0x221EF
+0x2748 0x221EA
+0x2749 0x22331
+0x274A 0x2F891
+0x274B 0x22338
+0x274C 0x26B20
+0x274D 0x22335
+0x274E 0x2233A
+0x274F 0x22381
+0x2750 0x22380
+0x2751 0x223B8
+0x2752 0x223C1
+0x2753 0x223BA
+0x2754 0x22488
+0x2755 0x224CF
+0x2756 0x224CA
+0x2757 0x224C7
+0x2758 0x224C5
+0x2759 0x224C8
+0x275A 0x224D0
+0x275B 0x224C9
+0x275C 0x225BB
+0x275D 0x225B6
+0x275E 0x225BD
+0x275F 0x2F89D
+0x2760 0x225B4
+0x2761 0x225C1
+0x2762 0x225D1
+0x2763 0x225D2
+0x2764 0x225CC
+0x2765 0x225D4
+0x2766 0x225CB
+0x2767 0x225CE
+0x2768 0x225D5
+0x2769 0x225D8
+0x276A 0x22995
+0x276B 0x22993
+0x276C 0x22999
+0x276D 0x22996
+0x276F 0x22A89
+0x2770 0x22A94
+0x2771 0x22A91
+0x2772 0x22A8F
+0x2773 0x22A84
+0x2774 0x22A97
+0x2775 0x22A86
+0x2776 0x22A85
+0x2777 0x22A8C
+0x2778 0x22EF2
+0x2779 0x22EED
+0x277A 0x22EEF
+0x277B 0x230D9
+0x277C 0x23146
+0x277D 0x23147
+0x277E 0x2314B
+0x2821 0x23150
+0x2822 0x2314A
+0x2823 0x2314E
+0x2824 0x2314C
+0x2825 0x23148
+0x2826 0x23363
+0x2827 0x23361
+0x2828 0x23362
+0x2829 0x23360
+0x282A 0x233C3
+0x282B 0x233C5
+0x282C 0x233C1
+0x282D 0x233D0
+0x282E 0x2F8DC
+0x282F 0x23882
+0x2831 0x23886
+0x2832 0x23884
+0x2833 0x2394C
+0x2834 0x23948
+0x2835 0x239B8
+0x2836 0x239BF
+0x2837 0x239C1
+0x2838 0x239C6
+0x2839 0x239C5
+0x283A 0x239C7
+0x283B 0x239C0
+0x283C 0x239C3
+0x283D 0x23AED
+0x283E 0x23B03
+0x283F 0x23B22
+0x2840 0x23B21
+0x2841 0x23C9F
+0x2842 0x23C90
+0x2843 0x23C9E
+0x2845 0x23CA0
+0x2846 0x23C94
+0x2847 0x23C95
+0x2848 0x23CA1
+0x284B 0x2419A
+0x284C 0x24190
+0x284D 0x244F2
+0x284E 0x244F3
+0x284F 0x2456E
+0x2850 0x245AB
+0x2851 0x245A9
+0x2852 0x2461A
+0x2853 0x24618
+0x2854 0x2461B
+0x2855 0x24760
+0x2856 0x2474C
+0x2857 0x24742
+0x2858 0x24733
+0x2859 0x2473F
+0x285A 0x2473E
+0x285B 0x24738
+0x285C 0x24743
+0x285D 0x24746
+0x285E 0x24736
+0x285F 0x248EE
+0x2860 0x248F5
+0x2861 0x248F4
+0x2863 0x24C1B
+0x2865 0x24D2B
+0x2866 0x24D29
+0x2867 0x24D2A
+0x2868 0x24D2E
+0x2869 0x2503F
+0x286A 0x250E6
+0x286B 0x253A7
+0x286C 0x253A8
+0x286D 0x25418
+0x286E 0x25608
+0x286F 0x25750
+0x2870 0x25753
+0x2871 0x25A56
+0x2872 0x25A55
+0x2873 0x2626F
+0x2874 0x2627F
+0x2875 0x264B3
+0x2876 0x2663A
+0x2877 0x26638
+0x2878 0x26637
+0x2879 0x26636
+0x287A 0x20554
+0x287B 0x2F980
+0x287C 0x268DD
+0x287D 0x268FC
+0x287E 0x268FA
+0x2921 0x26933
+0x2922 0x26B04
+0x2923 0x26B07
+0x2924 0x26B08
+0x2925 0x26B06
+0x2926 0x26B09
+0x2927 0x2F991
+0x2928 0x2F993
+0x2929 0x2721E
+0x292A 0x2F9D2
+0x292B 0x2840B
+0x292C 0x28443
+0x292D 0x28452
+0x292E 0x28458
+0x292F 0x2845E
+0x2930 0x28668
+0x2931 0x2868D
+0x2932 0x28682
+0x2933 0x2867B
+0x2934 0x28C58
+0x2936 0x2F800
+0x2937 0x2002C
+0x2938 0x2002E
+0x2939 0x2160B
+0x293A 0x2002D
+0x293B 0x20069
+0x293C 0x200B2
+0x293D 0x200B6
+0x293E 0x200A9
+0x293F 0x200ED
+0x2940 0x20119
+0x2941 0x2014F
+0x2942 0x20216
+0x2943 0x20203
+0x2944 0x2020E
+0x2945 0x20204
+0x2946 0x20207
+0x2947 0x20210
+0x2948 0x20227
+0x2949 0x20228
+0x294A 0x2020D
+0x294B 0x20229
+0x294C 0x2020F
+0x294D 0x20222
+0x294E 0x20211
+0x294F 0x20485
+0x2950 0x20484
+0x2951 0x20483
+0x2952 0x2048A
+0x2953 0x20486
+0x2954 0x20510
+0x2955 0x20558
+0x2956 0x2055A
+0x2957 0x2070C
+0x2958 0x205C4
+0x2959 0x205C5
+0x295A 0x20647
+0x295B 0x20649
+0x295C 0x2064A
+0x295D 0x2064B
+0x295E 0x221BB
+0x295F 0x2068D
+0x2960 0x2068B
+0x2961 0x20707
+0x2962 0x20706
+0x2963 0x2F820
+0x2964 0x206EF
+0x2965 0x206F0
+0x2966 0x206ED
+0x2967 0x206F9
+0x2968 0x20702
+0x2969 0x206E7
+0x296A 0x206F4
+0x296B 0x206F7
+0x296C 0x206F1
+0x296D 0x20853
+0x296E 0x20855
+0x2970 0x208DA
+0x2971 0x208D9
+0x2973 0x20938
+0x2974 0x20999
+0x2975 0x209A2
+0x2976 0x2099C
+0x2977 0x2099A
+0x2978 0x2099B
+0x2979 0x209E5
+0x297A 0x209E3
+0x297B 0x209E1
+0x297C 0x209E0
+0x297D 0x209E2
+0x297E 0x209E4
+0x2A22 0x209E8
+0x2A23 0x2F82F
+0x2A24 0x20A13
+0x2A25 0x20A56
+0x2A26 0x20A4B
+0x2A27 0x20A4A
+0x2A28 0x20A4D
+0x2A29 0x20A4C
+0x2A2B 0x20AEA
+0x2A2C 0x20AE9
+0x2A2D 0x20AEB
+0x2A2E 0x20AEC
+0x2A2F 0x20B3A
+0x2A30 0x20B3C
+0x2A31 0x20B39
+0x2A32 0x20B3B
+0x2A33 0x20C14
+0x2A34 0x20C0E
+0x2A35 0x20C35
+0x2A36 0x20C0A
+0x2A37 0x20C3F
+0x2A38 0x20C38
+0x2A3A 0x20C4E
+0x2A3B 0x20C17
+0x2A3C 0x2F83F
+0x2A3D 0x20C1E
+0x2A3E 0x211B6
+0x2A3F 0x211CE
+0x2A40 0x211CA
+0x2A41 0x211CB
+0x2A42 0x211CC
+0x2A43 0x211C9
+0x2A44 0x212B4
+0x2A45 0x212AC
+0x2A46 0x21288
+0x2A47 0x21286
+0x2A48 0x2128C
+0x2A49 0x21293
+0x2A4A 0x2128A
+0x2A4B 0x212A4
+0x2A4C 0x21287
+0x2A4D 0x212A5
+0x2A4E 0x212A6
+0x2A4F 0x21285
+0x2A50 0x212A3
+0x2A51 0x2128E
+0x2A52 0x2151F
+0x2A53 0x21563
+0x2A54 0x2158D
+0x2A55 0x215FA
+0x2A56 0x215FB
+0x2A57 0x21609
+0x2A58 0x215FE
+0x2A59 0x215FF
+0x2A5A 0x21602
+0x2A5B 0x21604
+0x2A5C 0x215FD
+0x2A5D 0x21605
+0x2A5E 0x216F9
+0x2A5F 0x216F7
+0x2A60 0x216DB
+0x2A61 0x216DA
+0x2A62 0x21951
+0x2A63 0x21950
+0x2A64 0x21957
+0x2A65 0x219E2
+0x2A66 0x219D8
+0x2A67 0x219DA
+0x2A68 0x219DC
+0x2A69 0x21B20
+0x2A6A 0x21B1F
+0x2A6B 0x21B69
+0x2A6C 0x21BDD
+0x2A6D 0x21C40
+0x2A6E 0x21C41
+0x2A6F 0x21C43
+0x2A70 0x21D0D
+0x2A71 0x21D0C
+0x2A72 0x21D87
+0x2A73 0x21DA9
+0x2A74 0x21D92
+0x2A75 0x21D85
+0x2A77 0x21D8C
+0x2A78 0x21DA2
+0x2A79 0x21D8F
+0x2A7A 0x21D8A
+0x2A7C 0x21D8D
+0x2A7D 0x21FF1
+0x2A7E 0x22037
+0x2B21 0x2208B
+0x2B22 0x22087
+0x2B23 0x22082
+0x2B24 0x2218E
+0x2B25 0x221BC
+0x2B26 0x221F8
+0x2B27 0x221FA
+0x2B28 0x221EB
+0x2B29 0x221F9
+0x2B2A 0x221FC
+0x2B2B 0x22205
+0x2B2C 0x2231B
+0x2B2D 0x2231D
+0x2B2E 0x2231E
+0x2B2F 0x2F892
+0x2B30 0x2233C
+0x2B31 0x2233E
+0x2B32 0x22384
+0x2B33 0x223C8
+0x2B34 0x223C9
+0x2B35 0x223D3
+0x2B36 0x223C7
+0x2B37 0x223D2
+0x2B38 0x22455
+0x2B39 0x2F896
+0x2B3A 0x2248C
+0x2B3B 0x2248A
+0x2B3C 0x224D5
+0x2B3D 0x224D3
+0x2B3F 0x224D8
+0x2B40 0x225D0
+0x2B41 0x225EE
+0x2B42 0x225F1
+0x2B43 0x225FB
+0x2B44 0x225D3
+0x2B45 0x225EC
+0x2B46 0x225CD
+0x2B47 0x22615
+0x2B48 0x22626
+0x2B49 0x2260E
+0x2B4A 0x22627
+0x2B4B 0x2262A
+0x2B4C 0x22600
+0x2B4D 0x22604
+0x2B4E 0x22628
+0x2B4F 0x22608
+0x2B50 0x22614
+0x2B51 0x2299B
+0x2B53 0x229A1
+0x2B54 0x2299D
+0x2B55 0x229A0
+0x2B56 0x2299E
+0x2B57 0x229A2
+0x2B58 0x2299C
+0x2B59 0x22A32
+0x2B5A 0x22A34
+0x2B5B 0x22A93
+0x2B5C 0x22A96
+0x2B5D 0x22A90
+0x2B5E 0x22AB4
+0x2B5F 0x22AB5
+0x2B60 0x2F8B6
+0x2B61 0x22AB6
+0x2B62 0x22AC2
+0x2B63 0x2F8B5
+0x2B64 0x22ABA
+0x2B65 0x22A92
+0x2B66 0x22EFB
+0x2B67 0x22F05
+0x2B68 0x22EF3
+0x2B69 0x22EFE
+0x2B6A 0x22EFD
+0x2B6B 0x2455D
+0x2B6C 0x22EFA
+0x2B6D 0x23043
+0x2B6E 0x23095
+0x2B6F 0x23094
+0x2B71 0x2316F
+0x2B72 0x23173
+0x2B73 0x2315C
+0x2B74 0x2315B
+0x2B75 0x23166
+0x2B76 0x23174
+0x2B77 0x23163
+0x2B78 0x23167
+0x2B79 0x23160
+0x2B7A 0x23162
+0x2B7B 0x23171
+0x2B7C 0x23172
+0x2B7D 0x2315E
+0x2B7E 0x23323
+0x2C21 0x23326
+0x2C22 0x23364
+0x2C23 0x2F8D6
+0x2C24 0x233F2
+0x2C25 0x23401
+0x2C26 0x233DD
+0x2C27 0x233DC
+0x2C28 0x233DB
+0x2C29 0x233F3
+0x2C2A 0x233FD
+0x2C2B 0x233D8
+0x2C2C 0x233F8
+0x2C2D 0x233FB
+0x2C2E 0x23883
+0x2C2F 0x2388C
+0x2C30 0x2388E
+0x2C31 0x23949
+0x2C32 0x23954
+0x2C33 0x23952
+0x2C34 0x2394E
+0x2C35 0x23958
+0x2C36 0x23951
+0x2C37 0x23955
+0x2C38 0x23953
+0x2C39 0x23957
+0x2C3A 0x23950
+0x2C3B 0x2394F
+0x2C3C 0x2394D
+0x2C3D 0x239D2
+0x2C3E 0x239D3
+0x2C3F 0x239C9
+0x2C40 0x239D4
+0x2C41 0x23AEF
+0x2C42 0x2F8F8
+0x2C43 0x200B1
+0x2C44 0x23B05
+0x2C45 0x23B04
+0x2C46 0x23B2E
+0x2C47 0x23B2D
+0x2C48 0x23C45
+0x2C49 0x23C5B
+0x2C4A 0x23C5A
+0x2C4B 0x23C59
+0x2C4C 0x23C9D
+0x2C4D 0x23C8E
+0x2C4E 0x23CBC
+0x2C4F 0x23CDD
+0x2C50 0x23CBA
+0x2C51 0x2F8FD
+0x2C52 0x23CD8
+0x2C53 0x23CCB
+0x2C54 0x23CD9
+0x2C55 0x23CDA
+0x2C56 0x23CC4
+0x2C57 0x23CB8
+0x2C58 0x23CBF
+0x2C59 0x23CDB
+0x2C5A 0x23CC1
+0x2C5B 0x2F8FC
+0x2C5C 0x23CC5
+0x2C5D 0x2F919
+0x2C5E 0x241B1
+0x2C5F 0x241AF
+0x2C60 0x2F918
+0x2C61 0x244F7
+0x2C62 0x244F6
+0x2C63 0x244F8
+0x2C64 0x24550
+0x2C65 0x24551
+0x2C66 0x24571
+0x2C67 0x24570
+0x2C68 0x245B0
+0x2C69 0x245AF
+0x2C6A 0x245AE
+0x2C6B 0x245AD
+0x2C6C 0x24625
+0x2C6D 0x2462C
+0x2C6E 0x24622
+0x2C6F 0x24633
+0x2C70 0x24634
+0x2C72 0x2473A
+0x2C73 0x24740
+0x2C74 0x24768
+0x2C76 0x24764
+0x2C77 0x2475C
+0x2C78 0x24757
+0x2C79 0x24753
+0x2C7A 0x2474F
+0x2C7B 0x24751
+0x2C7C 0x24754
+0x2C7D 0x24766
+0x2D22 0x2490D
+0x2D23 0x24908
+0x2D24 0x2F92B
+0x2D25 0x248FA
+0x2D26 0x24AEA
+0x2D27 0x24B2A
+0x2D28 0x24BBB
+0x2D29 0x24BD5
+0x2D2A 0x24BD7
+0x2D2B 0x21DA4
+0x2D2C 0x200F0
+0x2D2D 0x200B5
+0x2D2E 0x24C06
+0x2D2F 0x24C28
+0x2D30 0x24C22
+0x2D31 0x24C21
+0x2D32 0x22456
+0x2D33 0x24C23
+0x2D34 0x211CD
+0x2D35 0x24D30
+0x2D36 0x24D34
+0x2D37 0x24FC9
+0x2D38 0x24FCA
+0x2D39 0x24FC8
+0x2D3A 0x2F93D
+0x2D3B 0x25044
+0x2D3C 0x250F3
+0x2D3D 0x2F941
+0x2D3E 0x250F8
+0x2D3F 0x250FC
+0x2D40 0x250F6
+0x2D41 0x250FB
+0x2D42 0x250F7
+0x2D43 0x25100
+0x2D44 0x25102
+0x2D45 0x2F940
+0x2D46 0x2F94D
+0x2D47 0x25424
+0x2D48 0x2560D
+0x2D4A 0x25762
+0x2D4B 0x25930
+0x2D4C 0x2592B
+0x2D4D 0x2592A
+0x2D4F 0x2592D
+0x2D50 0x25ADA
+0x2D51 0x25E28
+0x2D52 0x25F86
+0x2D53 0x26277
+0x2D54 0x2627C
+0x2D55 0x26350
+0x2D56 0x2634E
+0x2D57 0x263F2
+0x2D58 0x264B2
+0x2D59 0x264CE
+0x2D5A 0x264CF
+0x2D5B 0x264E5
+0x2D5C 0x23407
+0x2D5D 0x26535
+0x2D5E 0x26531
+0x2D5F 0x26613
+0x2D60 0x2662B
+0x2D61 0x2662C
+0x2D62 0x26645
+0x2D63 0x26660
+0x2D64 0x26641
+0x2D65 0x26658
+0x2D66 0x26647
+0x2D67 0x2665B
+0x2D68 0x26650
+0x2D69 0x2F982
+0x2D6A 0x2665F
+0x2D6B 0x2664A
+0x2D6C 0x26656
+0x2D6D 0x26643
+0x2D6E 0x26644
+0x2D6F 0x26651
+0x2D70 0x268FD
+0x2D71 0x26934
+0x2D72 0x26935
+0x2D73 0x26954
+0x2D74 0x26955
+0x2D75 0x26A0C
+0x2D76 0x26A0B
+0x2D77 0x26A0A
+0x2D78 0x26AF9
+0x2D79 0x26B35
+0x2D7A 0x26B24
+0x2D7B 0x26B13
+0x2D7C 0x26B1C
+0x2D7D 0x26B69
+0x2D7E 0x26B25
+0x2E21 0x26B21
+0x2E22 0x2F995
+0x2E23 0x2F996
+0x2E24 0x2F998
+0x2E25 0x27220
+0x2E26 0x275A9
+0x2E27 0x275A8
+0x2E28 0x275DE
+0x2E29 0x27609
+0x2E2A 0x2760A
+0x2E2B 0x2760B
+0x2E2C 0x277E3
+0x2E2D 0x27807
+0x2E2E 0x278B2
+0x2E2F 0x278B3
+0x2E30 0x2795D
+0x2E31 0x27E58
+0x2E32 0x27E86
+0x2E33 0x27E87
+0x2E34 0x27FB9
+0x2E35 0x27FB8
+0x2E36 0x2840C
+0x2E37 0x28444
+0x2E38 0x28466
+0x2E39 0x28480
+0x2E3A 0x28475
+0x2E3B 0x2846D
+0x2E3C 0x2847E
+0x2E3D 0x28467
+0x2E3E 0x28481
+0x2E3F 0x28477
+0x2E40 0x286A8
+0x2E41 0x286A2
+0x2E42 0x286A5
+0x2E43 0x2869B
+0x2E44 0x28C57
+0x2E45 0x28E0F
+0x2E46 0x28E32
+0x2E47 0x28E2C
+0x2E48 0x28E33
+0x2E49 0x291E7
+0x2E4A 0x2006E
+0x2E4B 0x200B7
+0x2E4C 0x200F6
+0x2E4D 0x200F2
+0x2E4E 0x200F3
+0x2E4F 0x20517
+0x2E50 0x20130
+0x2E51 0x20154
+0x2E52 0x20153
+0x2E53 0x20252
+0x2E54 0x2023D
+0x2E55 0x2023C
+0x2E56 0x20234
+0x2E57 0x20233
+0x2E58 0x20254
+0x2E59 0x2022F
+0x2E5B 0x20255
+0x2E5C 0x2023F
+0x2E5D 0x20237
+0x2E5E 0x20256
+0x2E5F 0x20261
+0x2E60 0x20258
+0x2E61 0x2F806
+0x2E62 0x2023B
+0x2E63 0x20232
+0x2E64 0x2022E
+0x2E65 0x2023E
+0x2E66 0x2003B
+0x2E67 0x2048C
+0x2E68 0x2048D
+0x2E69 0x20513
+0x2E6A 0x20516
+0x2E6B 0x20512
+0x2E6C 0x2055B
+0x2E6D 0x2058A
+0x2E6E 0x205D7
+0x2E6F 0x205CE
+0x2E70 0x20650
+0x2E71 0x20651
+0x2E72 0x2064F
+0x2E73 0x2068E
+0x2E74 0x2068F
+0x2E75 0x206F2
+0x2E76 0x2F821
+0x2E77 0x20728
+0x2E78 0x2071A
+0x2E79 0x20725
+0x2E7A 0x2071D
+0x2E7B 0x20714
+0x2E7C 0x20720
+0x2E7D 0x2071F
+0x2E7E 0x2071B
+0x2F21 0x20717
+0x2F22 0x20715
+0x2F23 0x2071C
+0x2F24 0x20713
+0x2F25 0x2F825
+0x2F26 0x20860
+0x2F28 0x20866
+0x2F29 0x208E3
+0x2F2A 0x208DE
+0x2F2B 0x208E0
+0x2F2C 0x208E1
+0x2F2D 0x2091A
+0x2F2E 0x2091B
+0x2F2F 0x20918
+0x2F30 0x2091C
+0x2F31 0x20919
+0x2F32 0x20942
+0x2F33 0x20940
+0x2F34 0x2093E
+0x2F35 0x20944
+0x2F36 0x20974
+0x2F37 0x20943
+0x2F38 0x2F82D
+0x2F39 0x209F2
+0x2F3A 0x20A1B
+0x2F3B 0x20A19
+0x2F3C 0x20A1E
+0x2F3D 0x2F830
+0x2F3E 0x20A5E
+0x2F3F 0x20A66
+0x2F40 0x20A5D
+0x2F41 0x20A5A
+0x2F42 0x20A5F
+0x2F43 0x20A60
+0x2F44 0x20A5B
+0x2F45 0x20A5C
+0x2F46 0x20A59
+0x2F47 0x20AF0
+0x2F48 0x20AF1
+0x2F49 0x20B43
+0x2F4A 0x20B40
+0x2F4B 0x20B42
+0x2F4C 0x20B41
+0x2F4D 0x20B3F
+0x2F4E 0x20C57
+0x2F4F 0x20C69
+0x2F50 0x20C6F
+0x2F51 0x20CAB
+0x2F52 0x20C71
+0x2F53 0x20C93
+0x2F54 0x20C56
+0x2F55 0x20C90
+0x2F56 0x20C6D
+0x2F57 0x20C6C
+0x2F58 0x20C70
+0x2F59 0x20C66
+0x2F5A 0x20C67
+0x2F5B 0x211D7
+0x2F5C 0x211B5
+0x2F5D 0x211DB
+0x2F5E 0x211D8
+0x2F5F 0x211D5
+0x2F60 0x211D4
+0x2F61 0x212BA
+0x2F62 0x212B7
+0x2F63 0x212BE
+0x2F64 0x212B9
+0x2F66 0x212E0
+0x2F67 0x212DD
+0x2F68 0x212DE
+0x2F69 0x24918
+0x2F6A 0x212D8
+0x2F6B 0x212BD
+0x2F6C 0x212DB
+0x2F6D 0x2151D
+0x2F6E 0x21525
+0x2F6F 0x21721
+0x2F70 0x2170C
+0x2F71 0x21729
+0x2F72 0x2172D
+0x2F73 0x2171B
+0x2F74 0x2170E
+0x2F75 0x2171F
+0x2F76 0x21704
+0x2F77 0x2171C
+0x2F78 0x21705
+0x2F79 0x21706
+0x2F7A 0x21720
+0x2F7B 0x2170D
+0x2F7C 0x2172A
+0x2F7D 0x21723
+0x2F7E 0x21711
+0x3021 0x2195C
+0x3022 0x21966
+0x3023 0x2195B
+0x3024 0x2194F
+0x3025 0x2195E
+0x3026 0x2195D
+0x3027 0x219F1
+0x3028 0x219EA
+0x3029 0x219F4
+0x302A 0x219EB
+0x302B 0x219F0
+0x302C 0x219FA
+0x302D 0x219FB
+0x302E 0x21B28
+0x302F 0x21B2C
+0x3030 0x21B6B
+0x3031 0x21B2A
+0x3032 0x21B6A
+0x3033 0x21B6F
+0x3034 0x21BDB
+0x3035 0x21BE0
+0x3036 0x24FD1
+0x3037 0x21BE3
+0x3038 0x21BE5
+0x3039 0x21BE7
+0x303A 0x21C4D
+0x303B 0x21C55
+0x303C 0x21C54
+0x303D 0x21C53
+0x303E 0x21C52
+0x303F 0x21C4E
+0x3040 0x21C60
+0x3041 0x221C0
+0x3042 0x21D0F
+0x3043 0x21D11
+0x3044 0x21D13
+0x3045 0x21DC6
+0x3046 0x21DB3
+0x3047 0x21DC7
+0x3048 0x21DD2
+0x3049 0x21DB8
+0x304A 0x21DAC
+0x304B 0x21DAE
+0x304C 0x21DCF
+0x304D 0x21DC5
+0x304E 0x2F87B
+0x304F 0x21DCC
+0x3050 0x21DAB
+0x3051 0x21DC9
+0x3052 0x21DB9
+0x3053 0x21FFB
+0x3054 0x21FF8
+0x3055 0x21FF7
+0x3056 0x21FF9
+0x3057 0x22020
+0x3058 0x2203B
+0x3059 0x22039
+0x305A 0x2209E
+0x305B 0x2209A
+0x305C 0x220AA
+0x305D 0x220AB
+0x305E 0x220AF
+0x305F 0x22096
+0x3060 0x220A9
+0x3061 0x220A6
+0x3062 0x22091
+0x3064 0x220AE
+0x3065 0x2209F
+0x3066 0x220AC
+0x3067 0x220A0
+0x3068 0x22192
+0x3069 0x22191
+0x306A 0x221BF
+0x306B 0x22217
+0x306C 0x2220A
+0x306D 0x2220C
+0x306E 0x2234A
+0x306F 0x22346
+0x3070 0x22334
+0x3071 0x22345
+0x3072 0x22343
+0x3073 0x22344
+0x3074 0x2F893
+0x3075 0x22387
+0x3076 0x22386
+0x3077 0x2238A
+0x3078 0x223DA
+0x3079 0x223D8
+0x307B 0x20518
+0x307C 0x20134
+0x307D 0x223D6
+0x307E 0x223D4
+0x3121 0x22454
+0x3122 0x22459
+0x3123 0x2245A
+0x3124 0x22457
+0x3126 0x224DD
+0x3127 0x224E9
+0x3128 0x224E0
+0x3129 0x22605
+0x312A 0x22612
+0x312B 0x22613
+0x312C 0x22607
+0x312D 0x22616
+0x312E 0x22623
+0x312F 0x22602
+0x3130 0x2F8A1
+0x3131 0x2264A
+0x3132 0x22636
+0x3133 0x22640
+0x3134 0x22656
+0x3135 0x22643
+0x3136 0x2F8A0
+0x3137 0x2264B
+0x3138 0x22646
+0x3139 0x2263E
+0x313A 0x22649
+0x313B 0x229A7
+0x313C 0x229B6
+0x313D 0x229A6
+0x313E 0x229A8
+0x313F 0x229AC
+0x3140 0x229A9
+0x3141 0x229AB
+0x3142 0x22A38
+0x3143 0x22A37
+0x3144 0x22A39
+0x3145 0x22A41
+0x3146 0x22A3E
+0x3147 0x22AC0
+0x3148 0x22ABB
+0x3149 0x22ABF
+0x314A 0x22ABD
+0x314B 0x22AFE
+0x314C 0x22B1E
+0x314D 0x22AEE
+0x314E 0x22AFC
+0x314F 0x2F8B7
+0x3150 0x22AF9
+0x3151 0x22B06
+0x3152 0x22AE4
+0x3153 0x22AE9
+0x3154 0x22AE5
+0x3155 0x22B03
+0x3156 0x22AFD
+0x3157 0x22B49
+0x3158 0x22EBE
+0x3159 0x22F0A
+0x315A 0x25626
+0x315B 0x22F18
+0x315C 0x22F0D
+0x315D 0x22F0F
+0x315E 0x22F0E
+0x315F 0x22F20
+0x3160 0x23071
+0x3161 0x23099
+0x3162 0x230E2
+0x3163 0x230DF
+0x3164 0x230DE
+0x3165 0x23178
+0x3166 0x23179
+0x3168 0x2317C
+0x3169 0x2317D
+0x316A 0x23184
+0x316B 0x2318B
+0x316C 0x2318A
+0x316D 0x2F8D2
+0x316E 0x23189
+0x316F 0x2332C
+0x3170 0x23329
+0x3171 0x2336C
+0x3173 0x23409
+0x3174 0x23408
+0x3175 0x2340C
+0x3176 0x2340D
+0x3177 0x23410
+0x3179 0x2389F
+0x317A 0x23898
+0x317B 0x238A2
+0x317C 0x2389A
+0x317D 0x239D5
+0x317E 0x239E2
+0x3221 0x239F0
+0x3222 0x239EA
+0x3223 0x239EB
+0x3224 0x239ED
+0x3225 0x239E8
+0x3226 0x239E0
+0x3227 0x23A85
+0x3228 0x23A86
+0x3229 0x23AF0
+0x322A 0x21E46
+0x322B 0x23B45
+0x322C 0x23B38
+0x322D 0x23B3E
+0x322E 0x23B42
+0x322F 0x23B40
+0x3230 0x23C47
+0x3231 0x23C5C
+0x3232 0x23C5E
+0x3233 0x23CB4
+0x3234 0x23CC2
+0x3235 0x23D14
+0x3236 0x23CE5
+0x3237 0x23D15
+0x3238 0x23D11
+0x3239 0x2F8FF
+0x323A 0x23CEE
+0x323B 0x23CE7
+0x323C 0x23CF5
+0x323D 0x23CF4
+0x323E 0x23CE8
+0x323F 0x23D01
+0x3240 0x23CEF
+0x3241 0x23CF1
+0x3242 0x2F900
+0x3243 0x241DB
+0x3244 0x241BF
+0x3245 0x241DA
+0x3246 0x241C7
+0x3247 0x241DD
+0x3248 0x2F91A
+0x3249 0x241EB
+0x324A 0x241E1
+0x324B 0x241C1
+0x324C 0x241BD
+0x324D 0x24507
+0x324E 0x244FD
+0x324F 0x24501
+0x3250 0x2450A
+0x3251 0x24503
+0x3252 0x24572
+0x3253 0x24574
+0x3254 0x24575
+0x3255 0x245B2
+0x3256 0x245B1
+0x3257 0x245B4
+0x3258 0x2464C
+0x3259 0x24642
+0x325A 0x24640
+0x325B 0x24649
+0x325C 0x2463C
+0x325D 0x2464D
+0x325E 0x2464A
+0x325F 0x2463B
+0x3260 0x24761
+0x3261 0x24774
+0x3262 0x2F926
+0x3263 0x2477F
+0x3264 0x2477A
+0x3265 0x24788
+0x3266 0x2477C
+0x3268 0x24770
+0x3269 0x2490F
+0x326A 0x24928
+0x326B 0x24913
+0x326C 0x2492A
+0x326D 0x24AED
+0x326E 0x24AEF
+0x326F 0x24B2E
+0x3270 0x24BC1
+0x3271 0x24BDD
+0x3272 0x20B47
+0x3273 0x24C2D
+0x3274 0x24C2B
+0x3275 0x24C35
+0x3276 0x24C2F
+0x3277 0x24C31
+0x3278 0x24C34
+0x3279 0x2F935
+0x327A 0x24C30
+0x327B 0x24D3A
+0x327C 0x24D39
+0x327D 0x24D37
+0x327E 0x24D4B
+0x3321 0x24D54
+0x3322 0x24D4D
+0x3323 0x24D51
+0x3324 0x24D47
+0x3325 0x24F27
+0x3326 0x24F50
+0x3327 0x24F4D
+0x3328 0x24F4E
+0x3329 0x24F54
+0x332A 0x24FD2
+0x332B 0x24FCE
+0x332C 0x2504B
+0x332D 0x25049
+0x332E 0x25105
+0x332F 0x2510F
+0x3330 0x25119
+0x3331 0x2F943
+0x3332 0x25106
+0x3333 0x2510C
+0x3334 0x25129
+0x3335 0x25104
+0x3336 0x25108
+0x3337 0x25125
+0x3339 0x25103
+0x333A 0x25127
+0x333B 0x25110
+0x333C 0x2510A
+0x333D 0x2F942
+0x333E 0x26B5D
+0x333F 0x253AA
+0x3340 0x253AB
+0x3341 0x253A9
+0x3342 0x25441
+0x3343 0x2543A
+0x3344 0x2543C
+0x3345 0x2542B
+0x3346 0x25449
+0x3347 0x25615
+0x3349 0x25616
+0x334A 0x2F953
+0x334B 0x25631
+0x334C 0x23C4A
+0x334D 0x2573C
+0x334E 0x2577C
+0x334F 0x2576D
+0x3350 0x2576A
+0x3351 0x25763
+0x3352 0x2576B
+0x3353 0x2577B
+0x3354 0x25764
+0x3355 0x2577A
+0x3356 0x25769
+0x3357 0x2576F
+0x3358 0x25937
+0x3359 0x25935
+0x335A 0x2593C
+0x335B 0x25936
+0x335C 0x2593D
+0x335D 0x2593E
+0x335E 0x25AE1
+0x335F 0x25AE0
+0x3360 0x25E2D
+0x3361 0x25E2B
+0x3362 0x25F8D
+0x3363 0x25F92
+0x3365 0x25F8E
+0x3366 0x2F96B
+0x3367 0x25F91
+0x3368 0x25F96
+0x3369 0x2627B
+0x336A 0x26278
+0x336B 0x26281
+0x336C 0x26296
+0x336D 0x262A3
+0x336E 0x26295
+0x336F 0x26297
+0x3370 0x26354
+0x3371 0x26352
+0x3372 0x263F5
+0x3373 0x26400
+0x3374 0x263FB
+0x3375 0x263F4
+0x3376 0x263F6
+0x3377 0x264E8
+0x3378 0x264EA
+0x3379 0x2663E
+0x337A 0x2663D
+0x337B 0x2663B
+0x337C 0x26680
+0x337E 0x26688
+0x3421 0x26681
+0x3422 0x26682
+0x3423 0x266CE
+0x3424 0x26683
+0x3425 0x26677
+0x3426 0x26679
+0x3427 0x26673
+0x3428 0x2666D
+0x3429 0x26670
+0x342A 0x2668D
+0x342B 0x26675
+0x342C 0x2668C
+0x342D 0x2666A
+0x342E 0x26691
+0x342F 0x26689
+0x3430 0x2668E
+0x3431 0x212DC
+0x3432 0x268FF
+0x3433 0x26959
+0x3434 0x269C7
+0x3435 0x26A12
+0x3436 0x26A14
+0x3437 0x26A13
+0x3438 0x26ACB
+0x3439 0x26B42
+0x343B 0x26B3D
+0x343D 0x26B40
+0x343E 0x26B44
+0x343F 0x26B62
+0x3440 0x26B43
+0x3441 0x26B3F
+0x3442 0x26B45
+0x3443 0x26B3C
+0x3444 0x2F997
+0x3445 0x26B46
+0x3446 0x26B47
+0x3447 0x2F9B3
+0x3448 0x2719E
+0x3449 0x2719D
+0x344A 0x2722C
+0x344B 0x27229
+0x344C 0x2722F
+0x344D 0x2722E
+0x344E 0x27230
+0x344F 0x275E1
+0x3450 0x275E2
+0x3451 0x2760E
+0x3452 0x27619
+0x3453 0x27612
+0x3454 0x278B4
+0x3455 0x27BDA
+0x3456 0x27D26
+0x3457 0x27E59
+0x3458 0x27E5A
+0x3459 0x27E88
+0x345A 0x27FC0
+0x345B 0x27FBA
+0x345C 0x282A0
+0x345D 0x2F9DD
+0x345E 0x282A2
+0x345F 0x28486
+0x3461 0x2849D
+0x3462 0x28488
+0x3463 0x2848F
+0x3464 0x2848E
+0x3465 0x2849B
+0x3466 0x286C1
+0x3467 0x286C3
+0x3468 0x286C4
+0x3469 0x28696
+0x346A 0x286C7
+0x346B 0x286C6
+0x346C 0x286BF
+0x346E 0x2890F
+0x346F 0x28E55
+0x3470 0x28E42
+0x3471 0x28E46
+0x3472 0x28E4B
+0x3473 0x28E43
+0x3474 0x28E53
+0x3475 0x28E48
+0x3476 0x28E49
+0x3477 0x28E4A
+0x3478 0x28E4E
+0x3479 0x24BDE
+0x347A 0x20691
+0x347B 0x2944B
+0x347C 0x29680
+0x347D 0x29681
+0x347E 0x29683
+0x3521 0x2028A
+0x3522 0x29682
+0x3523 0x22342
+0x3524 0x20922
+0x3525 0x20070
+0x3526 0x20071
+0x3527 0x200BC
+0x3528 0x21D18
+0x3529 0x200BE
+0x352A 0x200BA
+0x352B 0x200F8
+0x352C 0x20137
+0x352D 0x20135
+0x352E 0x20AFC
+0x352F 0x20156
+0x3530 0x20159
+0x3531 0x2015E
+0x3532 0x2026D
+0x3533 0x20291
+0x3534 0x20292
+0x3535 0x20268
+0x3536 0x20266
+0x3537 0x20273
+0x3539 0x20296
+0x353A 0x2028B
+0x353B 0x2028C
+0x353C 0x20496
+0x353D 0x204EE
+0x353E 0x2051C
+0x353F 0x2051A
+0x3540 0x20519
+0x3541 0x2051B
+0x3542 0x2055D
+0x3543 0x2055E
+0x3544 0x2F818
+0x3545 0x205DC
+0x3546 0x205E2
+0x3547 0x20652
+0x3548 0x20692
+0x3549 0x20730
+0x354A 0x20752
+0x354B 0x20742
+0x354C 0x20741
+0x354D 0x20745
+0x354E 0x20737
+0x354F 0x20740
+0x3550 0x2073F
+0x3551 0x2073D
+0x3552 0x20738
+0x3553 0x2073A
+0x3554 0x20749
+0x3555 0x2086B
+0x3556 0x20878
+0x3557 0x20879
+0x3558 0x2F826
+0x3559 0x2086C
+0x355A 0x208E9
+0x355B 0x208E6
+0x355C 0x208E5
+0x355D 0x208EA
+0x355E 0x208E7
+0x355F 0x208E8
+0x3560 0x2091F
+0x3561 0x2094B
+0x3562 0x2094A
+0x3563 0x20953
+0x3564 0x20976
+0x3565 0x209A3
+0x3566 0x209A4
+0x3567 0x209F6
+0x3568 0x209F3
+0x3569 0x209F9
+0x356A 0x209F7
+0x356B 0x209FC
+0x356C 0x20A1D
+0x356D 0x20A6D
+0x356E 0x20A71
+0x356F 0x20A6C
+0x3570 0x20A6E
+0x3571 0x20A70
+0x3572 0x20A6F
+0x3573 0x20A67
+0x3574 0x20A68
+0x3575 0x20AFA
+0x3576 0x20AF9
+0x3577 0x20B4E
+0x3579 0x20B4D
+0x357A 0x20B4F
+0x357B 0x20B4A
+0x357C 0x20B4C
+0x357E 0x2F842
+0x3621 0x20CEE
+0x3622 0x20CB2
+0x3623 0x20CC0
+0x3624 0x20CC1
+0x3625 0x20CF4
+0x3626 0x20CC8
+0x3627 0x20CC5
+0x3628 0x20CC6
+0x3629 0x20CAD
+0x362A 0x211E2
+0x362B 0x211EA
+0x362C 0x211E3
+0x362D 0x211E1
+0x362E 0x212F7
+0x362F 0x21301
+0x3630 0x21312
+0x3631 0x212F6
+0x3632 0x212F1
+0x3633 0x2131F
+0x3634 0x212EE
+0x3635 0x2F852
+0x3636 0x212F3
+0x3637 0x21315
+0x3638 0x21316
+0x3639 0x21317
+0x363A 0x212F8
+0x363B 0x21319
+0x363C 0x212F2
+0x363D 0x212F4
+0x363E 0x212F5
+0x363F 0x21313
+0x3640 0x21306
+0x3641 0x21526
+0x3642 0x21524
+0x3643 0x2155A
+0x3644 0x22EC8
+0x3645 0x21597
+0x3646 0x21595
+0x3647 0x2159A
+0x3648 0x2161F
+0x3649 0x20AFB
+0x364A 0x21629
+0x364B 0x21620
+0x364C 0x2F862
+0x364D 0x2F863
+0x364E 0x2174C
+0x364F 0x21730
+0x3650 0x21738
+0x3651 0x2173D
+0x3652 0x21751
+0x3653 0x2174F
+0x3654 0x2174A
+0x3655 0x21734
+0x3656 0x21736
+0x3658 0x2196A
+0x3659 0x21968
+0x365A 0x21A1C
+0x365B 0x21A0E
+0x365C 0x21A1E
+0x365E 0x21A09
+0x365F 0x21A08
+0x3660 0x21A13
+0x3661 0x21A01
+0x3662 0x21A0F
+0x3663 0x21A14
+0x3664 0x21A06
+0x3665 0x21A07
+0x3667 0x2F873
+0x3669 0x21B79
+0x366A 0x21BEA
+0x366B 0x21BED
+0x366C 0x21BE9
+0x366D 0x21BEE
+0x366E 0x21C68
+0x366F 0x21C64
+0x3670 0x21C67
+0x3671 0x21C72
+0x3672 0x21C62
+0x3673 0x21C74
+0x3674 0x21C79
+0x3675 0x21D19
+0x3676 0x21D17
+0x3677 0x21D15
+0x3678 0x21D16
+0x3679 0x21DE6
+0x367A 0x262A4
+0x367B 0x21DEE
+0x367D 0x21DDF
+0x367E 0x21DE4
+0x3721 0x21DDA
+0x3722 0x21DEA
+0x3723 0x21DED
+0x3724 0x21DE3
+0x3725 0x21DE9
+0x3726 0x21FFD
+0x3727 0x20657
+0x3728 0x22021
+0x3729 0x220C6
+0x372A 0x220B8
+0x372B 0x220CB
+0x372C 0x2F885
+0x372D 0x220BD
+0x372E 0x220B5
+0x372F 0x220BB
+0x3730 0x220BF
+0x3731 0x220BE
+0x3732 0x220B2
+0x3733 0x220C1
+0x3734 0x220C2
+0x3735 0x22199
+0x3736 0x221C6
+0x3737 0x2222C
+0x3738 0x2222D
+0x3739 0x22225
+0x373A 0x2221E
+0x373B 0x2221F
+0x373C 0x22223
+0x373D 0x22350
+0x373E 0x2234E
+0x373F 0x2234D
+0x3740 0x22352
+0x3741 0x223E9
+0x3742 0x223EC
+0x3743 0x223E8
+0x3744 0x22458
+0x3745 0x2245C
+0x3746 0x2245B
+0x3747 0x2248F
+0x3748 0x23972
+0x3749 0x224F6
+0x374A 0x22500
+0x374B 0x224FC
+0x374C 0x224F8
+0x374D 0x224EA
+0x374E 0x224FE
+0x374F 0x224F7
+0x3750 0x224FD
+0x3751 0x22670
+0x3752 0x22662
+0x3753 0x22644
+0x3755 0x2264D
+0x3756 0x2264C
+0x3757 0x2263F
+0x3758 0x22666
+0x3759 0x22635
+0x375B 0x22634
+0x375C 0x2268D
+0x375D 0x22684
+0x375F 0x22686
+0x3760 0x22689
+0x3761 0x22687
+0x3762 0x22683
+0x3763 0x22675
+0x3764 0x22679
+0x3765 0x226AF
+0x3766 0x226B0
+0x3767 0x229B7
+0x3768 0x229BB
+0x3769 0x229B9
+0x376A 0x22A46
+0x376B 0x22A47
+0x376C 0x22A45
+0x376D 0x22AEA
+0x376E 0x22AF6
+0x376F 0x22B68
+0x3770 0x22B39
+0x3771 0x2F8B9
+0x3772 0x22B3D
+0x3773 0x22B3B
+0x3774 0x22B4D
+0x3775 0x22B30
+0x3776 0x22B4A
+0x3777 0x22B3E
+0x3778 0x22B40
+0x3779 0x22B4C
+0x377A 0x22B47
+0x377B 0x22B38
+0x377C 0x22B52
+0x377D 0x22B3A
+0x377E 0x22B53
+0x3821 0x22EC4
+0x3822 0x22EC1
+0x3823 0x22F1C
+0x3824 0x22F1D
+0x3825 0x22F2A
+0x3826 0x22F1E
+0x3827 0x22F2F
+0x3828 0x22F22
+0x3829 0x22F2E
+0x382A 0x22F25
+0x382D 0x2304A
+0x382E 0x2304B
+0x382F 0x23076
+0x3831 0x230E8
+0x3832 0x230EF
+0x3833 0x230E9
+0x3835 0x230EA
+0x3836 0x2F8CC
+0x3838 0x2319B
+0x3839 0x2319E
+0x383A 0x23193
+0x383B 0x231A7
+0x383C 0x2319C
+0x383D 0x231A0
+0x383E 0x2319A
+0x383F 0x231AB
+0x3840 0x231BE
+0x3841 0x231A9
+0x3842 0x2332D
+0x3843 0x2336E
+0x3844 0x23444
+0x3845 0x2343D
+0x3846 0x2343A
+0x3847 0x23468
+0x3848 0x2343C
+0x3849 0x2346A
+0x384A 0x2F8E0
+0x384B 0x23438
+0x384C 0x23465
+0x384D 0x23439
+0x384E 0x2346D
+0x384F 0x23436
+0x3850 0x2F8E3
+0x3851 0x2343E
+0x3852 0x2347E
+0x3853 0x23437
+0x3854 0x23899
+0x3855 0x238A9
+0x3856 0x238AD
+0x3857 0x238A7
+0x3858 0x238A8
+0x3859 0x23966
+0x385A 0x23969
+0x385B 0x2396D
+0x385C 0x23967
+0x385D 0x2396B
+0x385E 0x2396A
+0x385F 0x239EE
+0x3860 0x23A01
+0x3861 0x23A03
+0x3862 0x239F4
+0x3863 0x239FB
+0x3865 0x239F6
+0x3866 0x239FC
+0x3867 0x23AF4
+0x3868 0x23B08
+0x3869 0x23B0A
+0x386A 0x23B09
+0x386B 0x23B6D
+0x386C 0x23B62
+0x386D 0x23B41
+0x386E 0x23B5E
+0x386F 0x23B5C
+0x3870 0x23CF3
+0x3871 0x23D26
+0x3873 0x23D39
+0x3874 0x2F904
+0x3875 0x23D6C
+0x3876 0x23D2B
+0x3877 0x23D2E
+0x3878 0x23D3B
+0x3879 0x23D5E
+0x387A 0x23DFB
+0x387B 0x23D27
+0x387C 0x23D24
+0x387D 0x23D69
+0x387E 0x23D30
+0x3921 0x2F905
+0x3922 0x23D62
+0x3923 0x23D38
+0x3924 0x23D35
+0x3925 0x23D2A
+0x3926 0x23D2C
+0x3927 0x23D68
+0x3928 0x23D31
+0x3929 0x23D2F
+0x392A 0x23D2D
+0x392B 0x23D3A
+0x392C 0x23D36
+0x392D 0x2F903
+0x392E 0x23D21
+0x392F 0x23D3C
+0x3930 0x23D20
+0x3931 0x23D64
+0x3932 0x23D3E
+0x3934 0x241F7
+0x3935 0x24212
+0x3936 0x241F1
+0x3937 0x241F5
+0x3938 0x24222
+0x3939 0x241F2
+0x393A 0x241DF
+0x393B 0x24215
+0x393C 0x24216
+0x393D 0x2457A
+0x393E 0x24576
+0x393F 0x245BE
+0x3941 0x245BD
+0x3942 0x24609
+0x3943 0x24608
+0x3944 0x24657
+0x3945 0x247A3
+0x3946 0x247BF
+0x3947 0x247B8
+0x3948 0x247AF
+0x3949 0x2479C
+0x394A 0x247A5
+0x394B 0x24772
+0x394C 0x24775
+0x394D 0x2479D
+0x394E 0x24799
+0x394F 0x247B9
+0x3950 0x2494E
+0x3951 0x24939
+0x3952 0x2493B
+0x3953 0x24935
+0x3954 0x2493C
+0x3955 0x24955
+0x3956 0x24AF0
+0x3957 0x24AF3
+0x3958 0x24AF4
+0x3959 0x24B3B
+0x395A 0x24B3C
+0x395B 0x24B3A
+0x395C 0x24B36
+0x395D 0x24C07
+0x395E 0x20CEB
+0x395F 0x24C55
+0x3960 0x24C50
+0x3961 0x24C4F
+0x3962 0x24C52
+0x3963 0x24C56
+0x3964 0x200BD
+0x3965 0x24C32
+0x3966 0x24D63
+0x3967 0x24D6B
+0x3968 0x24D66
+0x3969 0x24D57
+0x396A 0x24D5D
+0x396C 0x24D6D
+0x396D 0x24D61
+0x396E 0x24D69
+0x396F 0x24D5A
+0x3970 0x24D5C
+0x3971 0x24D62
+0x3972 0x24F2A
+0x3973 0x24F29
+0x3974 0x24F58
+0x3975 0x24F5A
+0x3976 0x24FD7
+0x3977 0x24FDB
+0x3978 0x24FDC
+0x3979 0x24FDD
+0x397A 0x24FD8
+0x397B 0x25054
+0x397C 0x2505B
+0x397D 0x2505C
+0x397E 0x25053
+0x3A21 0x2504F
+0x3A22 0x25056
+0x3A23 0x25050
+0x3A24 0x2505A
+0x3A25 0x2506B
+0x3A26 0x25136
+0x3A27 0x25153
+0x3A28 0x2513A
+0x3A29 0x2513C
+0x3A2A 0x2513E
+0x3A2B 0x25149
+0x3A2C 0x25140
+0x3A2D 0x2F946
+0x3A2E 0x2F947
+0x3A2F 0x25364
+0x3A30 0x25365
+0x3A31 0x253B5
+0x3A32 0x253B6
+0x3A33 0x253B2
+0x3A34 0x25448
+0x3A35 0x2544A
+0x3A36 0x25472
+0x3A37 0x25469
+0x3A38 0x2545A
+0x3A39 0x2544C
+0x3A3A 0x2562C
+0x3A3B 0x25630
+0x3A3C 0x2564B
+0x3A3D 0x25649
+0x3A3E 0x25642
+0x3A3F 0x25644
+0x3A40 0x2564A
+0x3A41 0x2564F
+0x3A42 0x25792
+0x3A43 0x2F957
+0x3A44 0x25797
+0x3A45 0x25780
+0x3A46 0x25782
+0x3A47 0x25786
+0x3A48 0x25953
+0x3A49 0x2595E
+0x3A4A 0x25952
+0x3A4B 0x2595B
+0x3A4C 0x2594E
+0x3A4D 0x25A6D
+0x3A4E 0x25A6E
+0x3A4F 0x25AFA
+0x3A50 0x25AF6
+0x3A51 0x25AFB
+0x3A52 0x25E33
+0x3A53 0x25E3D
+0x3A54 0x25E37
+0x3A55 0x25E3E
+0x3A56 0x25E35
+0x3A57 0x25F9A
+0x3A58 0x25FAB
+0x3A59 0x25FA6
+0x3A5A 0x25FB0
+0x3A5B 0x25F99
+0x3A5C 0x25FA0
+0x3A5D 0x25F9E
+0x3A5E 0x25FA8
+0x3A5F 0x25FA1
+0x3A60 0x25FAA
+0x3A61 0x25FAD
+0x3A62 0x25FBB
+0x3A63 0x25F9C
+0x3A64 0x25FA5
+0x3A65 0x200B3
+0x3A66 0x26227
+0x3A67 0x2628D
+0x3A68 0x2628E
+0x3A69 0x2628F
+0x3A6A 0x26292
+0x3A6C 0x26291
+0x3A6D 0x262AD
+0x3A6E 0x26357
+0x3A6F 0x26358
+0x3A70 0x2635E
+0x3A71 0x2635D
+0x3A72 0x2635C
+0x3A73 0x2635B
+0x3A75 0x2640A
+0x3A76 0x26403
+0x3A77 0x2640E
+0x3A78 0x264B8
+0x3A79 0x2654D
+0x3A7A 0x2653F
+0x3A7B 0x26547
+0x3A7C 0x2654B
+0x3A7D 0x2654A
+0x3A7E 0x2653D
+0x3B22 0x26541
+0x3B23 0x2654C
+0x3B25 0x26662
+0x3B26 0x26669
+0x3B27 0x26661
+0x3B29 0x266AA
+0x3B2A 0x266A6
+0x3B2B 0x266AC
+0x3B2C 0x266BD
+0x3B2D 0x266BB
+0x3B2E 0x266A4
+0x3B2F 0x266BA
+0x3B30 0x2669A
+0x3B32 0x266A1
+0x3B33 0x266C1
+0x3B34 0x268E0
+0x3B35 0x2690A
+0x3B36 0x26903
+0x3B37 0x26906
+0x3B38 0x26939
+0x3B39 0x2693A
+0x3B3A 0x26936
+0x3B3B 0x2695B
+0x3B3C 0x2695F
+0x3B3D 0x2695E
+0x3B3E 0x26967
+0x3B3F 0x26961
+0x3B40 0x26962
+0x3B41 0x2695D
+0x3B42 0x269CA
+0x3B43 0x269CC
+0x3B44 0x269CE
+0x3B45 0x26A18
+0x3B46 0x26A1D
+0x3B47 0x26A1F
+0x3B48 0x26A20
+0x3B49 0x26A17
+0x3B4A 0x26A15
+0x3B4B 0x26B1F
+0x3B4C 0x26B27
+0x3B4D 0x26B26
+0x3B4E 0x21E10
+0x3B4F 0x26B8B
+0x3B50 0x26BAE
+0x3B51 0x26B8A
+0x3B52 0x2F999
+0x3B53 0x26B92
+0x3B54 0x26B89
+0x3B55 0x26B87
+0x3B57 0x26B8F
+0x3B58 0x26B84
+0x3B59 0x26B83
+0x3B5A 0x26B8C
+0x3B5B 0x26B93
+0x3B5C 0x26B8D
+0x3B5D 0x26B98
+0x3B5E 0x26B7D
+0x3B5F 0x26B7E
+0x3B60 0x26BD2
+0x3B61 0x26B80
+0x3B62 0x26B99
+0x3B63 0x271AC
+0x3B64 0x27250
+0x3B65 0x27255
+0x3B66 0x27242
+0x3B67 0x2723F
+0x3B68 0x2723C
+0x3B6A 0x2724C
+0x3B6B 0x27249
+0x3B6C 0x27257
+0x3B6D 0x27258
+0x3B6E 0x2724F
+0x3B6F 0x2725C
+0x3B70 0x27247
+0x3B71 0x2F9B7
+0x3B72 0x275AB
+0x3B74 0x275AF
+0x3B75 0x275AD
+0x3B76 0x275E8
+0x3B77 0x275E7
+0x3B78 0x27630
+0x3B79 0x27626
+0x3B7A 0x2762F
+0x3B7B 0x27628
+0x3B7C 0x2762B
+0x3B7D 0x2761D
+0x3B7E 0x2762D
+0x3C21 0x27620
+0x3C22 0x2762A
+0x3C23 0x2762C
+0x3C24 0x27635
+0x3C25 0x27621
+0x3C26 0x27623
+0x3C27 0x27624
+0x3C28 0x27636
+0x3C29 0x27637
+0x3C2A 0x277E9
+0x3C2B 0x278BA
+0x3C2C 0x278B8
+0x3C2D 0x2F9CC
+0x3C2E 0x2796D
+0x3C2F 0x2796A
+0x3C30 0x27968
+0x3C31 0x27969
+0x3C32 0x2796B
+0x3C33 0x27961
+0x3C34 0x27BDC
+0x3C35 0x27BDB
+0x3C36 0x27C2D
+0x3C37 0x27C2C
+0x3C38 0x27CA2
+0x3C39 0x27D2B
+0x3C3A 0x27D32
+0x3C3B 0x2F9D7
+0x3C3C 0x27E94
+0x3C3D 0x27E92
+0x3C3E 0x27E90
+0x3C3F 0x27FC9
+0x3C40 0x27FC4
+0x3C41 0x27FC1
+0x3C42 0x27FC3
+0x3C43 0x27FCD
+0x3C44 0x28214
+0x3C45 0x282A7
+0x3C46 0x282AF
+0x3C47 0x282AA
+0x3C48 0x2840D
+0x3C49 0x28454
+0x3C4A 0x2845B
+0x3C4B 0x28461
+0x3C4C 0x284AE
+0x3C4D 0x284B3
+0x3C4E 0x284C0
+0x3C4F 0x284C4
+0x3C50 0x284BF
+0x3C51 0x284CB
+0x3C52 0x284AD
+0x3C53 0x284A7
+0x3C54 0x284A4
+0x3C55 0x284BD
+0x3C56 0x284AF
+0x3C57 0x284B2
+0x3C58 0x284A5
+0x3C59 0x286E7
+0x3C5A 0x286E0
+0x3C5B 0x286CE
+0x3C5C 0x286DE
+0x3C5D 0x286D5
+0x3C5E 0x286DF
+0x3C5F 0x286D9
+0x3C60 0x287F2
+0x3C61 0x28923
+0x3C62 0x28940
+0x3C64 0x2893E
+0x3C66 0x28CCF
+0x3C67 0x20B54
+0x3C68 0x28E5B
+0x3C69 0x28E58
+0x3C6A 0x28E62
+0x3C6B 0x28E5F
+0x3C6C 0x28E67
+0x3C6D 0x28E63
+0x3C6E 0x28E5E
+0x3C6F 0x28E60
+0x3C70 0x28F85
+0x3C71 0x28F86
+0x3C72 0x28F87
+0x3C73 0x291E8
+0x3C74 0x291E6
+0x3C75 0x29671
+0x3C76 0x29685
+0x3C77 0x2FA02
+0x3C78 0x29686
+0x3C79 0x29810
+0x3C7A 0x209F8
+0x3C7B 0x200BF
+0x3C7C 0x20B61
+0x3C7D 0x200FE
+0x3C7E 0x200FC
+0x3D21 0x20139
+0x3D22 0x20161
+0x3D23 0x20160
+0x3D24 0x202E2
+0x3D25 0x202EA
+0x3D26 0x202E3
+0x3D27 0x202B4
+0x3D28 0x202AE
+0x3D29 0x202BE
+0x3D2A 0x202B8
+0x3D2B 0x202A8
+0x3D2C 0x202AA
+0x3D2D 0x202A9
+0x3D2E 0x202B3
+0x3D2F 0x202D5
+0x3D30 0x202AD
+0x3D31 0x202B9
+0x3D32 0x202BB
+0x3D33 0x202B1
+0x3D34 0x202C2
+0x3D35 0x2F808
+0x3D36 0x202EB
+0x3D37 0x202BA
+0x3D38 0x202D2
+0x3D39 0x202D4
+0x3D3A 0x204F1
+0x3D3B 0x2051D
+0x3D3C 0x2F812
+0x3D3D 0x20562
+0x3D3E 0x2058C
+0x3D3F 0x205E6
+0x3D40 0x205E7
+0x3D41 0x2065A
+0x3D42 0x20658
+0x3D43 0x20659
+0x3D44 0x20696
+0x3D45 0x20697
+0x3D46 0x20761
+0x3D47 0x20767
+0x3D48 0x20771
+0x3D49 0x20765
+0x3D4A 0x2077D
+0x3D4B 0x2077E
+0x3D4C 0x2087D
+0x3D4D 0x20884
+0x3D4E 0x2087C
+0x3D4F 0x2087E
+0x3D50 0x2087F
+0x3D51 0x20880
+0x3D52 0x208EF
+0x3D53 0x208F4
+0x3D54 0x2091E
+0x3D55 0x2094E
+0x3D56 0x209FB
+0x3D57 0x209FA
+0x3D58 0x209FD
+0x3D59 0x2F831
+0x3D5A 0x2F832
+0x3D5B 0x20A79
+0x3D5C 0x20A7C
+0x3D5D 0x20A7D
+0x3D5E 0x20A84
+0x3D5F 0x20A7B
+0x3D60 0x20A78
+0x3D62 0x20B5E
+0x3D63 0x20B5A
+0x3D64 0x20B5C
+0x3D65 0x20B59
+0x3D66 0x20B55
+0x3D67 0x20B63
+0x3D68 0x20B56
+0x3D69 0x20B5F
+0x3D6A 0x20B60
+0x3D6B 0x20B5B
+0x3D6C 0x20D4A
+0x3D6D 0x20D65
+0x3D6E 0x20DB3
+0x3D6F 0x20D2C
+0x3D70 0x20D77
+0x3D71 0x20D3D
+0x3D72 0x20D52
+0x3D73 0x20D61
+0x3D74 0x20D2A
+0x3D75 0x20D3E
+0x3D76 0x20D34
+0x3D77 0x20D29
+0x3D78 0x20DB2
+0x3D79 0x20DAD
+0x3D7A 0x20D40
+0x3D7B 0x20D53
+0x3D7C 0x2F844
+0x3D7D 0x20D3F
+0x3D7E 0x20D41
+0x3E21 0x20D72
+0x3E22 0x211F6
+0x3E23 0x211F5
+0x3E24 0x211F4
+0x3E25 0x211F2
+0x3E26 0x211F9
+0x3E27 0x21327
+0x3E28 0x21354
+0x3E29 0x21355
+0x3E2A 0x2132E
+0x3E2B 0x2F854
+0x3E2C 0x2F853
+0x3E2D 0x2132C
+0x3E2E 0x21338
+0x3E2F 0x21339
+0x3E30 0x21331
+0x3E31 0x2134F
+0x3E32 0x21373
+0x3E33 0x21330
+0x3E34 0x2132B
+0x3E35 0x21351
+0x3E36 0x2152C
+0x3E37 0x2155B
+0x3E38 0x2155C
+0x3E39 0x21568
+0x3E3A 0x2156C
+0x3E3B 0x2156B
+0x3E3C 0x21569
+0x3E3D 0x2159F
+0x3E3E 0x21638
+0x3E3F 0x2163C
+0x3E40 0x2163A
+0x3E41 0x21635
+0x3E43 0x21639
+0x3E44 0x21636
+0x3E45 0x2163B
+0x3E46 0x21760
+0x3E47 0x21761
+0x3E48 0x21763
+0x3E49 0x21764
+0x3E4A 0x21794
+0x3E4B 0x21793
+0x3E4C 0x2175E
+0x3E4D 0x21768
+0x3E4E 0x2176A
+0x3E4F 0x21765
+0x3E50 0x2F866
+0x3E51 0x21790
+0x3E52 0x2175F
+0x3E53 0x21772
+0x3E54 0x2F865
+0x3E55 0x21A3C
+0x3E56 0x21A27
+0x3E57 0x21A24
+0x3E58 0x21A26
+0x3E59 0x21A25
+0x3E5B 0x21A28
+0x3E5C 0x21A36
+0x3E5D 0x21B31
+0x3E5E 0x21B30
+0x3E5F 0x21B34
+0x3E60 0x21B81
+0x3E61 0x21B7D
+0x3E62 0x21B82
+0x3E63 0x21B80
+0x3E65 0x202D3
+0x3E66 0x21BF2
+0x3E67 0x21C66
+0x3E68 0x21C8C
+0x3E69 0x21C7B
+0x3E6A 0x21C83
+0x3E6C 0x21C8E
+0x3E6D 0x21C7A
+0x3E6E 0x21C92
+0x3E6F 0x21C91
+0x3E70 0x21C82
+0x3E71 0x21D1B
+0x3E72 0x21D1C
+0x3E73 0x21E27
+0x3E74 0x21E21
+0x3E77 0x21E43
+0x3E79 0x21E18
+0x3E7A 0x21E7B
+0x3E7B 0x21E1A
+0x3E7C 0x21E4B
+0x3E7D 0x21E4A
+0x3E7E 0x21E4D
+0x3F21 0x21E4F
+0x3F22 0x21E19
+0x3F23 0x21E35
+0x3F24 0x21E13
+0x3F25 0x21E52
+0x3F26 0x21E14
+0x3F27 0x21E1E
+0x3F28 0x21E2C
+0x3F29 0x21E20
+0x3F2A 0x21E22
+0x3F2B 0x21E12
+0x3F2C 0x21E1F
+0x3F2D 0x22000
+0x3F2E 0x22023
+0x3F2F 0x22040
+0x3F30 0x22043
+0x3F31 0x220E4
+0x3F32 0x220DB
+0x3F33 0x220EA
+0x3F34 0x220DD
+0x3F35 0x220CC
+0x3F36 0x220D9
+0x3F37 0x220E8
+0x3F38 0x220F6
+0x3F39 0x220E3
+0x3F3A 0x220D3
+0x3F3B 0x220DA
+0x3F3C 0x220D6
+0x3F3D 0x220E7
+0x3F3E 0x2223A
+0x3F3F 0x2223F
+0x3F40 0x22240
+0x3F41 0x22248
+0x3F42 0x22259
+0x3F43 0x22237
+0x3F44 0x22244
+0x3F45 0x2F88C
+0x3F46 0x2F88B
+0x3F47 0x22255
+0x3F48 0x22239
+0x3F49 0x22354
+0x3F4A 0x22355
+0x3F4B 0x22356
+0x3F4C 0x22357
+0x3F4D 0x22358
+0x3F4E 0x22359
+0x3F4F 0x2238D
+0x3F50 0x223F2
+0x3F51 0x223F8
+0x3F52 0x223F5
+0x3F53 0x223F6
+0x3F54 0x223FC
+0x3F55 0x223FE
+0x3F56 0x223F1
+0x3F57 0x223FD
+0x3F58 0x2245E
+0x3F59 0x22496
+0x3F5A 0x22497
+0x3F5B 0x2249C
+0x3F5C 0x2249B
+0x3F5D 0x22495
+0x3F5E 0x2F89A
+0x3F5F 0x2251A
+0x3F60 0x22509
+0x3F61 0x22504
+0x3F62 0x2250E
+0x3F63 0x2251C
+0x3F64 0x22518
+0x3F65 0x2250D
+0x3F66 0x22510
+0x3F67 0x2250C
+0x3F68 0x22503
+0x3F69 0x2267B
+0x3F6A 0x226A6
+0x3F6B 0x22677
+0x3F6C 0x22688
+0x3F6D 0x22674
+0x3F6E 0x226DA
+0x3F6F 0x22676
+0x3F70 0x22678
+0x3F71 0x2268A
+0x3F72 0x2268F
+0x3F73 0x2267D
+0x3F74 0x22690
+0x3F75 0x226ED
+0x3F76 0x226D9
+0x3F77 0x226D0
+0x3F78 0x2271A
+0x3F79 0x226D7
+0x3F7A 0x226E2
+0x3F7B 0x226E1
+0x3F7C 0x226C5
+0x3F7D 0x226E0
+0x3F7E 0x226CA
+0x4021 0x22725
+0x4022 0x226CC
+0x4023 0x2F8B3
+0x4024 0x229C6
+0x4025 0x229C1
+0x4026 0x22A4D
+0x4027 0x22B4B
+0x4028 0x22B64
+0x4029 0x22B95
+0x402A 0x22B99
+0x402B 0x2F8BC
+0x402C 0x22B94
+0x402D 0x22BA2
+0x402E 0x22BAE
+0x402F 0x22B9E
+0x4030 0x22BA7
+0x4031 0x22B86
+0x4033 0x22BA4
+0x4034 0x22B91
+0x4035 0x22B93
+0x4036 0x2F8BB
+0x4037 0x22B88
+0x4038 0x22ECD
+0x4039 0x22ECA
+0x403A 0x22F3F
+0x403B 0x22F40
+0x403C 0x22F46
+0x403D 0x22F41
+0x403E 0x22F45
+0x403F 0x22F58
+0x4040 0x22F3B
+0x4041 0x22F48
+0x4042 0x2304E
+0x4043 0x23052
+0x4044 0x2304F
+0x4045 0x2307B
+0x4046 0x2307A
+0x4047 0x230A0
+0x4048 0x2309F
+0x4049 0x230FB
+0x404A 0x230F7
+0x404B 0x231B8
+0x404C 0x231B9
+0x404D 0x231BB
+0x404E 0x231B7
+0x4050 0x231BA
+0x4052 0x231DA
+0x4053 0x231B5
+0x4054 0x231BF
+0x4055 0x231BC
+0x4056 0x231C0
+0x4057 0x2F8D3
+0x4058 0x2F8D9
+0x4059 0x23375
+0x405A 0x23379
+0x405B 0x23376
+0x405C 0x23435
+0x405D 0x23440
+0x405E 0x234C0
+0x405F 0x23481
+0x4060 0x234AD
+0x4061 0x234AF
+0x4062 0x234AC
+0x4063 0x2348F
+0x4064 0x234A8
+0x4065 0x234AA
+0x4066 0x234A9
+0x4067 0x23488
+0x4068 0x2347F
+0x4069 0x23480
+0x406A 0x234BC
+0x406B 0x238AE
+0x406C 0x238BB
+0x406D 0x238BD
+0x406F 0x23978
+0x4070 0x23974
+0x4071 0x23A0C
+0x4072 0x23A11
+0x4073 0x23A08
+0x4074 0x23A06
+0x4075 0x23A10
+0x4076 0x23A8F
+0x4077 0x23A90
+0x4078 0x23A8D
+0x4079 0x23A8E
+0x407A 0x23A96
+0x407B 0x23A95
+0x407C 0x23B0B
+0x407D 0x23B0C
+0x407E 0x23B7C
+0x4121 0x23B73
+0x4122 0x23B75
+0x4123 0x23B76
+0x4124 0x23B7D
+0x4125 0x23B78
+0x4126 0x23B71
+0x4127 0x23C4B
+0x4128 0x23C4E
+0x4129 0x23D33
+0x412A 0x23D32
+0x412C 0x23D91
+0x412D 0x23DE7
+0x412E 0x23DE9
+0x412F 0x23DA2
+0x4130 0x23D94
+0x4131 0x23D87
+0x4132 0x23DA3
+0x4133 0x23DDD
+0x4134 0x23D7B
+0x4135 0x23D83
+0x4136 0x23D81
+0x4137 0x23DDF
+0x4138 0x23D7C
+0x4139 0x23DE4
+0x413A 0x23DE2
+0x413B 0x23D93
+0x413C 0x23D7D
+0x413D 0x23DBF
+0x413E 0x23D9B
+0x413F 0x23D8E
+0x4140 0x23D9F
+0x4142 0x23D8C
+0x4143 0x23D7F
+0x4144 0x23D9C
+0x4145 0x23D84
+0x4146 0x23D42
+0x4147 0x23DE6
+0x4148 0x24251
+0x4149 0x2424A
+0x414A 0x24264
+0x414B 0x24225
+0x414C 0x2422F
+0x414D 0x2422E
+0x414E 0x2422B
+0x414F 0x24228
+0x4150 0x24232
+0x4151 0x2422D
+0x4152 0x24231
+0x4153 0x24239
+0x4154 0x2422C
+0x4155 0x24261
+0x4156 0x24511
+0x4157 0x24510
+0x4158 0x24512
+0x4159 0x24553
+0x415A 0x24555
+0x415B 0x2457B
+0x415C 0x24581
+0x415D 0x2457D
+0x415E 0x2457C
+0x415F 0x245C2
+0x4160 0x245C5
+0x4161 0x2F922
+0x4162 0x245C4
+0x4163 0x2F923
+0x4164 0x2466B
+0x4165 0x24668
+0x4167 0x2465C
+0x4168 0x2465D
+0x4169 0x2466A
+0x416A 0x2F924
+0x416B 0x24C76
+0x416C 0x24776
+0x416E 0x247C4
+0x416F 0x247CB
+0x4170 0x247C8
+0x4171 0x247D4
+0x4172 0x247D5
+0x4173 0x247C9
+0x4174 0x247D7
+0x4176 0x24978
+0x4177 0x2495A
+0x4178 0x2495B
+0x4179 0x2495C
+0x417A 0x24956
+0x417B 0x24958
+0x417C 0x24971
+0x417D 0x269D4
+0x417E 0x24B40
+0x4221 0x2F933
+0x4222 0x24B3F
+0x4223 0x24B43
+0x4224 0x24B41
+0x4225 0x24BE2
+0x4226 0x24BE0
+0x4227 0x24BE3
+0x4228 0x24C66
+0x4229 0x24C73
+0x422A 0x24C6C
+0x422B 0x24C71
+0x422C 0x24C6A
+0x422D 0x24C6D
+0x422E 0x24C6E
+0x422F 0x24C6B
+0x4230 0x24D8C
+0x4231 0x24D77
+0x4232 0x2F93A
+0x4233 0x24D7F
+0x4234 0x24D89
+0x4235 0x24D7A
+0x4236 0x24D85
+0x4237 0x24D78
+0x4238 0x24D8A
+0x4239 0x24D86
+0x423A 0x24F2C
+0x423B 0x24F67
+0x423C 0x24F5B
+0x423D 0x24FE5
+0x423E 0x24FE1
+0x423F 0x25061
+0x4240 0x25069
+0x4241 0x2506A
+0x4242 0x25165
+0x4243 0x2516D
+0x4244 0x25163
+0x4245 0x25186
+0x4246 0x2515C
+0x4247 0x25162
+0x4248 0x2F948
+0x4249 0x25179
+0x424A 0x25169
+0x424B 0x25170
+0x424C 0x25176
+0x424D 0x2515D
+0x424E 0x25187
+0x424F 0x2516E
+0x4250 0x25171
+0x4251 0x2517C
+0x4252 0x25173
+0x4253 0x2515B
+0x4254 0x2516B
+0x4255 0x253BF
+0x4256 0x253C1
+0x4257 0x253BD
+0x4258 0x253C9
+0x4259 0x253BC
+0x425A 0x253C2
+0x425B 0x253C0
+0x425C 0x25492
+0x425D 0x254A9
+0x425E 0x2548F
+0x425F 0x25476
+0x4260 0x2547B
+0x4261 0x25475
+0x4262 0x254A4
+0x4263 0x25664
+0x4264 0x2573D
+0x4265 0x257AF
+0x4268 0x2579D
+0x4269 0x25799
+0x426A 0x257B1
+0x426B 0x25963
+0x426C 0x25962
+0x426D 0x25964
+0x426E 0x25969
+0x4270 0x25A75
+0x4271 0x25A73
+0x4272 0x25A71
+0x4273 0x25A74
+0x4274 0x25B0C
+0x4275 0x25B16
+0x4277 0x25B11
+0x4278 0x25B1F
+0x4279 0x25B1A
+0x427A 0x25B0D
+0x427B 0x25B1B
+0x427C 0x25B13
+0x427D 0x25E4E
+0x427E 0x25E55
+0x4321 0x25E50
+0x4323 0x25FD2
+0x4324 0x25FD3
+0x4325 0x25FD1
+0x4326 0x25FF1
+0x4327 0x25FDC
+0x4328 0x25FC8
+0x4329 0x25FCC
+0x432A 0x25FD0
+0x432B 0x25FCF
+0x432C 0x25FDF
+0x432D 0x2622B
+0x432E 0x2622E
+0x432F 0x2622D
+0x4330 0x2629D
+0x4331 0x2629E
+0x4332 0x2629F
+0x4333 0x262A9
+0x4334 0x262A0
+0x4335 0x26298
+0x4336 0x262A1
+0x4337 0x262AB
+0x4338 0x262AF
+0x4339 0x2636E
+0x433A 0x2635F
+0x433B 0x2635A
+0x433D 0x26365
+0x433E 0x26368
+0x433F 0x26372
+0x4340 0x26417
+0x4341 0x26416
+0x4342 0x26418
+0x4343 0x26419
+0x4344 0x2641A
+0x4345 0x26422
+0x4346 0x2641B
+0x4347 0x2641C
+0x4348 0x264BE
+0x4349 0x264EE
+0x434A 0x2655A
+0x434B 0x26550
+0x434C 0x26558
+0x434D 0x26554
+0x434E 0x26557
+0x434F 0x26556
+0x4350 0x26615
+0x4351 0x2669B
+0x4352 0x26693
+0x4353 0x26692
+0x4354 0x26672
+0x4355 0x26698
+0x4356 0x26699
+0x4357 0x266DF
+0x4359 0x266D5
+0x435B 0x266D4
+0x435C 0x266F3
+0x435D 0x266F4
+0x435E 0x266E7
+0x435F 0x266E1
+0x4360 0x266E6
+0x4361 0x266EB
+0x4362 0x266EC
+0x4363 0x202DB
+0x4365 0x2690D
+0x4366 0x2690C
+0x4367 0x21B2F
+0x4368 0x26968
+0x4369 0x26965
+0x436A 0x2696B
+0x436B 0x26969
+0x436C 0x269D1
+0x436D 0x269D3
+0x436E 0x26A27
+0x436F 0x26A28
+0x4372 0x26A24
+0x4373 0x26AD7
+0x4374 0x26BCA
+0x4375 0x26BC7
+0x4376 0x2F99E
+0x4377 0x26BD8
+0x4378 0x26BE1
+0x4379 0x26BC6
+0x437A 0x26BF8
+0x437B 0x26BC3
+0x437C 0x26BF4
+0x437D 0x26C17
+0x437E 0x26BEA
+0x4421 0x26BCB
+0x4422 0x26B86
+0x4423 0x26BC4
+0x4424 0x26BD9
+0x4425 0x26C19
+0x4426 0x26BC2
+0x4427 0x26BE2
+0x4429 0x26BDE
+0x442A 0x26BED
+0x442B 0x2F99C
+0x442D 0x26C1D
+0x442E 0x26BDD
+0x442F 0x26BDB
+0x4430 0x26BE8
+0x4431 0x26BE9
+0x4432 0x26BBF
+0x4433 0x26BE0
+0x4434 0x26BD1
+0x4435 0x26BDC
+0x4436 0x26BCE
+0x4437 0x26C1E
+0x4438 0x26BCC
+0x4439 0x26BF2
+0x443A 0x26BF3
+0x443B 0x2F99F
+0x443C 0x2F9A2
+0x443D 0x2F9A3
+0x443E 0x2F9A1
+0x443F 0x271AB
+0x4440 0x271AA
+0x4441 0x271A7
+0x4442 0x271A9
+0x4443 0x27288
+0x4444 0x27275
+0x4445 0x27260
+0x4446 0x2726C
+0x4447 0x27273
+0x4449 0x2726E
+0x444A 0x27274
+0x444B 0x27276
+0x444C 0x27268
+0x444D 0x27277
+0x444E 0x27286
+0x444F 0x275EA
+0x4450 0x27651
+0x4451 0x27650
+0x4452 0x27658
+0x4453 0x2764D
+0x4454 0x2764F
+0x4455 0x2764E
+0x4456 0x2765C
+0x4457 0x27652
+0x4458 0x27644
+0x4459 0x2764A
+0x445A 0x2764B
+0x445B 0x277EA
+0x445C 0x27810
+0x445D 0x27811
+0x445E 0x278CD
+0x445F 0x278BF
+0x4460 0x278C4
+0x4461 0x278D0
+0x4462 0x278CE
+0x4463 0x278C0
+0x4464 0x278C2
+0x4465 0x278CF
+0x4466 0x278C9
+0x4467 0x278BB
+0x4468 0x27997
+0x4469 0x27992
+0x446A 0x2796F
+0x446B 0x2797E
+0x446C 0x2799A
+0x446E 0x27986
+0x446F 0x27973
+0x4471 0x27977
+0x4472 0x2798F
+0x4473 0x27970
+0x4474 0x27981
+0x4475 0x27982
+0x4476 0x27999
+0x4477 0x2797D
+0x4478 0x2797F
+0x4479 0x2797B
+0x447A 0x27987
+0x447B 0x27BB2
+0x447C 0x27C2F
+0x447D 0x27C34
+0x447E 0x27C2E
+0x4521 0x27C32
+0x4523 0x27CAA
+0x4525 0x27CA9
+0x4526 0x27D38
+0x4527 0x27D36
+0x4528 0x27D37
+0x4529 0x27D47
+0x452A 0x27D33
+0x452B 0x27D39
+0x452C 0x27D35
+0x452D 0x27D44
+0x452E 0x27EA5
+0x452F 0x27EA6
+0x4530 0x27E9E
+0x4531 0x27FE3
+0x4532 0x27FDF
+0x4533 0x27FD3
+0x4534 0x27FF1
+0x4535 0x27FE4
+0x4536 0x27FE0
+0x4537 0x27FD6
+0x4539 0x27FE6
+0x453A 0x27FD8
+0x453B 0x27FDE
+0x453C 0x27FDB
+0x453D 0x27FDC
+0x453E 0x2821B
+0x453F 0x2821F
+0x4540 0x2821D
+0x4541 0x2821C
+0x4542 0x2821E
+0x4543 0x28220
+0x4544 0x28221
+0x4546 0x282B6
+0x4547 0x282BC
+0x4548 0x282C6
+0x4549 0x282C7
+0x454A 0x282BA
+0x454B 0x282BE
+0x454C 0x282BD
+0x454D 0x282B5
+0x454E 0x282B4
+0x454F 0x2840F
+0x4550 0x28462
+0x4551 0x284EB
+0x4552 0x284D9
+0x4553 0x284E4
+0x4554 0x284D7
+0x4555 0x284D8
+0x4556 0x284D6
+0x4557 0x284CE
+0x4558 0x284DD
+0x4559 0x284E7
+0x455A 0x284D2
+0x455B 0x284C5
+0x455C 0x284C9
+0x455D 0x284DB
+0x455E 0x28692
+0x455F 0x2868A
+0x4560 0x2868B
+0x4561 0x28689
+0x4562 0x28708
+0x4563 0x28703
+0x4564 0x28706
+0x4565 0x28705
+0x4566 0x286F5
+0x4567 0x2870B
+0x4568 0x286FB
+0x4569 0x287FC
+0x456A 0x28801
+0x456B 0x28802
+0x456C 0x287FA
+0x456D 0x28808
+0x456E 0x287F7
+0x456F 0x28800
+0x4570 0x287FF
+0x4571 0x28806
+0x4572 0x287F6
+0x4573 0x287FB
+0x4574 0x2880A
+0x4575 0x28925
+0x4576 0x28943
+0x4577 0x28944
+0x4578 0x28C64
+0x4579 0x28C62
+0x457A 0x28C5E
+0x457B 0x28C5B
+0x457C 0x28CD6
+0x457D 0x20072
+0x457E 0x200C2
+0x4621 0x28E77
+0x4622 0x28E82
+0x4623 0x28E7C
+0x4624 0x28E7D
+0x4625 0x28E86
+0x4626 0x28E81
+0x4627 0x28E84
+0x4628 0x28E76
+0x4629 0x28E83
+0x462A 0x28E7F
+0x462B 0x28E7E
+0x462C 0x28F88
+0x462D 0x28F8D
+0x462E 0x28F8B
+0x462F 0x28F91
+0x4630 0x28F8F
+0x4631 0x2907C
+0x4632 0x29079
+0x4633 0x2907A
+0x4634 0x291EA
+0x4635 0x2944C
+0x4636 0x29599
+0x4637 0x202D1
+0x4638 0x2968B
+0x4639 0x2968D
+0x463A 0x2968A
+0x463B 0x2968E
+0x463C 0x29811
+0x463D 0x22256
+0x463E 0x2FA15
+0x463F 0x20074
+0x4640 0x200C3
+0x4641 0x200C4
+0x4642 0x2011B
+0x4643 0x2015F
+0x4644 0x2016A
+0x4645 0x20169
+0x4646 0x2016B
+0x4647 0x2030C
+0x4648 0x202F6
+0x4649 0x202ED
+0x464A 0x20329
+0x464B 0x202FE
+0x464C 0x202F1
+0x464D 0x20317
+0x464E 0x202FF
+0x464F 0x202EE
+0x4650 0x202FD
+0x4651 0x2031C
+0x4652 0x202FC
+0x4653 0x20300
+0x4654 0x20320
+0x4656 0x202F9
+0x4657 0x20367
+0x4658 0x20308
+0x4659 0x2049E
+0x465A 0x204F3
+0x465B 0x20525
+0x465C 0x20527
+0x465D 0x2051F
+0x465E 0x20565
+0x465F 0x20563
+0x4660 0x20594
+0x4661 0x20597
+0x4662 0x205F1
+0x4663 0x2065F
+0x4664 0x20662
+0x4666 0x20660
+0x4667 0x2F822
+0x4668 0x2078C
+0x4669 0x20782
+0x466A 0x20790
+0x466B 0x2078B
+0x466C 0x2078D
+0x466D 0x20781
+0x466E 0x2079D
+0x466F 0x2088E
+0x4670 0x2088F
+0x4671 0x20892
+0x4672 0x20923
+0x4673 0x20952
+0x4674 0x2F82E
+0x4675 0x20A00
+0x4676 0x20A01
+0x4677 0x20A02
+0x4678 0x20A1F
+0x4679 0x20A8C
+0x467A 0x20A89
+0x467B 0x20A8B
+0x467C 0x20A88
+0x467D 0x20A8D
+0x467E 0x20A8F
+0x4721 0x26385
+0x4722 0x20B00
+0x4723 0x20B05
+0x4724 0x20B01
+0x4725 0x20B68
+0x4726 0x20B6E
+0x4727 0x20B67
+0x4728 0x20B75
+0x472A 0x2F845
+0x472B 0x20DD7
+0x472C 0x2F846
+0x472D 0x20048
+0x472E 0x20DD4
+0x472F 0x20DD8
+0x4730 0x2F847
+0x4731 0x2F848
+0x4732 0x20DBA
+0x4733 0x2F849
+0x4734 0x20DDB
+0x4735 0x20DBF
+0x4736 0x20E35
+0x4737 0x20DBC
+0x4738 0x20DD9
+0x473A 0x20DDD
+0x473B 0x20E00
+0x473C 0x20DD5
+0x473D 0x20E30
+0x473E 0x20DBD
+0x473F 0x20DDC
+0x4740 0x211FD
+0x4741 0x211FE
+0x4742 0x21207
+0x4743 0x24517
+0x4744 0x2136F
+0x4745 0x21369
+0x4746 0x21370
+0x4747 0x21367
+0x4748 0x213A9
+0x4749 0x21395
+0x474A 0x21390
+0x474B 0x2136C
+0x474C 0x21397
+0x474D 0x21371
+0x474F 0x21374
+0x4750 0x2136D
+0x4751 0x2138E
+0x4752 0x2152F
+0x4753 0x2A31B
+0x4754 0x215A9
+0x4755 0x2164E
+0x4756 0x2F85F
+0x4757 0x2165A
+0x4758 0x21648
+0x4759 0x21655
+0x475A 0x2164C
+0x475B 0x21649
+0x475C 0x2164F
+0x475D 0x2164A
+0x475E 0x217D6
+0x475F 0x217A0
+0x4760 0x217A9
+0x4761 0x2F867
+0x4762 0x2179D
+0x4763 0x217D4
+0x4764 0x217A4
+0x4765 0x217A8
+0x4766 0x217A6
+0x4767 0x217E6
+0x4768 0x2197D
+0x4769 0x21977
+0x476A 0x2197A
+0x476B 0x21A41
+0x476C 0x21A49
+0x476D 0x21A59
+0x476E 0x21A45
+0x476F 0x21A48
+0x4770 0x21A40
+0x4771 0x21B8E
+0x4772 0x21B95
+0x4773 0x21B90
+0x4774 0x21BF7
+0x4775 0x21BF8
+0x4776 0x21BF6
+0x4777 0x21BFB
+0x4778 0x21C9E
+0x4779 0x21C9D
+0x477A 0x21C99
+0x477B 0x2F877
+0x477C 0x21CA3
+0x477D 0x21CA9
+0x477E 0x21C98
+0x4821 0x21CA0
+0x4822 0x21C96
+0x4823 0x21C94
+0x4824 0x21C95
+0x4825 0x21C9F
+0x4826 0x21CA1
+0x4827 0x21D21
+0x4828 0x21D1D
+0x4829 0x21D1F
+0x482A 0x21E6D
+0x482B 0x2F87C
+0x482C 0x21E9A
+0x482D 0x21E92
+0x482E 0x21E7A
+0x482F 0x21E7D
+0x4830 0x21EA1
+0x4831 0x21E9D
+0x4832 0x21E99
+0x4833 0x21E6B
+0x4834 0x21E6E
+0x4835 0x2F87D
+0x4836 0x22045
+0x4837 0x2F884
+0x4838 0x220FB
+0x4839 0x220EB
+0x483A 0x220F2
+0x483B 0x220F9
+0x483C 0x2F886
+0x483D 0x220F8
+0x483E 0x220ED
+0x483F 0x22101
+0x4840 0x220F7
+0x4841 0x22106
+0x4842 0x2219B
+0x4843 0x221CA
+0x4846 0x2226B
+0x4847 0x2226C
+0x4848 0x22274
+0x4849 0x22267
+0x484A 0x2225B
+0x484B 0x22260
+0x484C 0x22276
+0x484D 0x22263
+0x484E 0x22261
+0x484F 0x22328
+0x4850 0x2235B
+0x4851 0x2235E
+0x4852 0x22360
+0x4853 0x2235D
+0x4854 0x2235C
+0x4855 0x223F4
+0x4856 0x22400
+0x4857 0x22408
+0x4858 0x22407
+0x4859 0x22401
+0x485A 0x22405
+0x485B 0x22464
+0x485C 0x22463
+0x485D 0x2249E
+0x485E 0x224A0
+0x485F 0x224A1
+0x4860 0x2249F
+0x4861 0x22526
+0x4862 0x2252D
+0x4863 0x22528
+0x4864 0x2251D
+0x4865 0x226EC
+0x4866 0x226E3
+0x4867 0x226EB
+0x4868 0x22716
+0x4869 0x226C8
+0x486A 0x2661B
+0x486B 0x226E9
+0x486C 0x226E4
+0x486D 0x22724
+0x486E 0x226D1
+0x4870 0x226DD
+0x4871 0x226C2
+0x4872 0x226CB
+0x4873 0x226C7
+0x4874 0x226E7
+0x4876 0x226EA
+0x4877 0x2274B
+0x4878 0x2F8A5
+0x4879 0x22760
+0x487A 0x2277D
+0x487B 0x2273E
+0x487C 0x2F8A4
+0x487D 0x22752
+0x487E 0x2274E
+0x4921 0x2273C
+0x4922 0x22732
+0x4923 0x22730
+0x4924 0x22723
+0x4925 0x229CA
+0x4926 0x229CB
+0x4927 0x229C9
+0x4928 0x229C8
+0x4929 0x229CD
+0x492A 0x22B98
+0x492B 0x22BA0
+0x492C 0x22B9F
+0x492D 0x22B9C
+0x492E 0x22BA3
+0x492F 0x22B97
+0x4930 0x2F8BE
+0x4931 0x22BF1
+0x4932 0x22C09
+0x4933 0x22C03
+0x4934 0x22BEA
+0x4935 0x22C45
+0x4936 0x22BED
+0x4937 0x22C05
+0x4938 0x22C1A
+0x4939 0x22C15
+0x493A 0x22C01
+0x493B 0x22BEC
+0x493C 0x22C0E
+0x493D 0x22C17
+0x493E 0x22C42
+0x493F 0x22C12
+0x4940 0x22C10
+0x4941 0x22BEF
+0x4942 0x22BFF
+0x4943 0x22C00
+0x4944 0x22C0C
+0x4945 0x22C0F
+0x4946 0x22C04
+0x4947 0x22C08
+0x4948 0x22C14
+0x4949 0x22C43
+0x494A 0x2F8BD
+0x494B 0x22C1B
+0x494C 0x22C11
+0x494D 0x22C13
+0x494E 0x22ECF
+0x494F 0x22ECE
+0x4950 0x22F6F
+0x4951 0x22F6E
+0x4952 0x22F7A
+0x4953 0x22F70
+0x4954 0x22F64
+0x4955 0x22F5E
+0x4956 0x22F6C
+0x4957 0x2F8C9
+0x4958 0x22F5B
+0x4959 0x22F61
+0x495A 0x22F65
+0x495B 0x2307F
+0x495C 0x23080
+0x495D 0x2307C
+0x495E 0x230A7
+0x495F 0x230A6
+0x4960 0x230A1
+0x4962 0x230A8
+0x4963 0x230A3
+0x4964 0x230A2
+0x4965 0x230AD
+0x4966 0x230A5
+0x4967 0x23101
+0x4968 0x230FF
+0x4969 0x230FC
+0x496A 0x23100
+0x496B 0x23135
+0x496C 0x231EE
+0x496D 0x231EF
+0x496E 0x231F6
+0x496F 0x231E8
+0x4970 0x231EA
+0x4971 0x231E3
+0x4972 0x2321F
+0x4974 0x231E4
+0x4975 0x231FA
+0x4976 0x231F1
+0x4977 0x231FB
+0x4978 0x2F8D4
+0x4979 0x2333D
+0x497A 0x2333C
+0x497C 0x23378
+0x497D 0x23377
+0x4A21 0x234D1
+0x4A22 0x234C7
+0x4A23 0x234DF
+0x4A24 0x234D0
+0x4A25 0x234E0
+0x4A26 0x234D6
+0x4A27 0x234D8
+0x4A28 0x23516
+0x4A29 0x2350E
+0x4A2A 0x234D9
+0x4A2B 0x2350F
+0x4A2C 0x23511
+0x4A2D 0x234CD
+0x4A2E 0x23489
+0x4A2F 0x234CE
+0x4A30 0x23514
+0x4A31 0x234DA
+0x4A32 0x23512
+0x4A33 0x234D3
+0x4A34 0x234C2
+0x4A35 0x234E1
+0x4A36 0x234E9
+0x4A37 0x234EA
+0x4A38 0x234DE
+0x4A39 0x23515
+0x4A3A 0x238D9
+0x4A3B 0x238D6
+0x4A3C 0x238CD
+0x4A3D 0x238D0
+0x4A3E 0x238D3
+0x4A3F 0x2F8F0
+0x4A40 0x23982
+0x4A41 0x23985
+0x4A42 0x2397F
+0x4A43 0x2397D
+0x4A44 0x23981
+0x4A45 0x23983
+0x4A46 0x23984
+0x4A47 0x284A0
+0x4A48 0x23A28
+0x4A49 0x23A0F
+0x4A4A 0x23A17
+0x4A4B 0x23A1A
+0x4A4C 0x23A25
+0x4A4D 0x2F8F7
+0x4A4E 0x23A9B
+0x4A4F 0x23A99
+0x4A50 0x23B92
+0x4A51 0x23B8C
+0x4A52 0x23B95
+0x4A53 0x23B8D
+0x4A54 0x23BA3
+0x4A55 0x23B93
+0x4A56 0x23B91
+0x4A57 0x23DDB
+0x4A58 0x23D99
+0x4A59 0x23D9A
+0x4A5A 0x23E08
+0x4A5B 0x23E4C
+0x4A5C 0x23E0D
+0x4A5D 0x23E01
+0x4A5E 0x23E4E
+0x4A5F 0x23E02
+0x4A60 0x23E4D
+0x4A61 0x23E21
+0x4A62 0x23DFC
+0x4A63 0x2F909
+0x4A64 0x23D8A
+0x4A65 0x2F908
+0x4A66 0x23D95
+0x4A67 0x23E11
+0x4A68 0x23E12
+0x4A69 0x23E46
+0x4A6A 0x23E1C
+0x4A6B 0x23E49
+0x4A6C 0x23E0C
+0x4A6E 0x23E13
+0x4A6F 0x23E16
+0x4A70 0x23DFD
+0x4A71 0x23E0F
+0x4A72 0x23E1F
+0x4A73 0x24230
+0x4A74 0x2426E
+0x4A75 0x2426B
+0x4A76 0x2429B
+0x4A77 0x2427B
+0x4A78 0x24263
+0x4A79 0x24297
+0x4A7A 0x2426D
+0x4A7B 0x2429C
+0x4A7C 0x24298
+0x4A7D 0x2426F
+0x4A7E 0x24267
+0x4B21 0x24269
+0x4B22 0x24515
+0x4B23 0x24563
+0x4B24 0x24586
+0x4B25 0x2458A
+0x4B26 0x24587
+0x4B27 0x24588
+0x4B28 0x24585
+0x4B29 0x24589
+0x4B2A 0x245CA
+0x4B2B 0x245C7
+0x4B2C 0x245CB
+0x4B2D 0x245CC
+0x4B2E 0x245C9
+0x4B2F 0x2460D
+0x4B30 0x24683
+0x4B31 0x24684
+0x4B32 0x24678
+0x4B33 0x24682
+0x4B34 0x24673
+0x4B35 0x24679
+0x4B36 0x2468C
+0x4B37 0x247D0
+0x4B38 0x247CF
+0x4B39 0x247D2
+0x4B3A 0x247D9
+0x4B3B 0x247CC
+0x4B3C 0x247EB
+0x4B3D 0x247FD
+0x4B3E 0x247EC
+0x4B3F 0x247E8
+0x4B40 0x247F8
+0x4B41 0x247FA
+0x4B42 0x2F927
+0x4B44 0x247E1
+0x4B45 0x247FB
+0x4B46 0x248E7
+0x4B47 0x2F92E
+0x4B48 0x249A5
+0x4B49 0x24991
+0x4B4A 0x249A6
+0x4B4B 0x2497C
+0x4B4C 0x24992
+0x4B4D 0x249A2
+0x4B4E 0x249A0
+0x4B4F 0x24AFC
+0x4B50 0x24AFE
+0x4B51 0x24B57
+0x4B52 0x24B53
+0x4B53 0x24B58
+0x4B54 0x24BE7
+0x4B55 0x24C8E
+0x4B56 0x2F938
+0x4B57 0x24C83
+0x4B58 0x24C8B
+0x4B59 0x24C84
+0x4B5B 0x24DA2
+0x4B5C 0x24DB7
+0x4B5D 0x24DA9
+0x4B5E 0x24DA5
+0x4B5F 0x24D9F
+0x4B60 0x24DAA
+0x4B61 0x24D97
+0x4B62 0x24DA1
+0x4B63 0x24D9E
+0x4B64 0x24DAB
+0x4B65 0x24D99
+0x4B66 0x24DA3
+0x4B67 0x24F30
+0x4B68 0x24F32
+0x4B69 0x24F2F
+0x4B6A 0x24F70
+0x4B6B 0x24F6C
+0x4B6C 0x24F6F
+0x4B6D 0x24FE8
+0x4B6E 0x24FEE
+0x4B6F 0x24FEA
+0x4B70 0x2506D
+0x4B71 0x25076
+0x4B72 0x25070
+0x4B73 0x25071
+0x4B74 0x2506C
+0x4B75 0x251EB
+0x4B76 0x251B5
+0x4B77 0x25196
+0x4B78 0x25190
+0x4B79 0x2518D
+0x4B7A 0x2F949
+0x4B7B 0x251A2
+0x4B7C 0x251B0
+0x4B7D 0x25192
+0x4B7E 0x251A0
+0x4C21 0x25193
+0x4C22 0x251C3
+0x4C23 0x2518E
+0x4C24 0x251B6
+0x4C25 0x2519D
+0x4C26 0x25195
+0x4C27 0x251B3
+0x4C28 0x251A4
+0x4C29 0x25370
+0x4C2A 0x253D4
+0x4C2C 0x253CF
+0x4C2D 0x20170
+0x4C2E 0x25494
+0x4C30 0x254C0
+0x4C31 0x254B4
+0x4C32 0x254C1
+0x4C34 0x254BD
+0x4C35 0x254AF
+0x4C36 0x25677
+0x4C37 0x25678
+0x4C38 0x2566B
+0x4C39 0x2566D
+0x4C3A 0x2566E
+0x4C3B 0x25672
+0x4C3C 0x2566F
+0x4C3D 0x25671
+0x4C3E 0x230AB
+0x4C3F 0x2568C
+0x4C40 0x2573F
+0x4C41 0x257B6
+0x4C42 0x257B7
+0x4C44 0x257BB
+0x4C45 0x257B8
+0x4C46 0x2079C
+0x4C47 0x257B9
+0x4C49 0x2598B
+0x4C4A 0x2597A
+0x4C4B 0x25984
+0x4C4C 0x25988
+0x4C4D 0x25991
+0x4C4E 0x25979
+0x4C4F 0x2598E
+0x4C50 0x25980
+0x4C51 0x25982
+0x4C52 0x2597C
+0x4C54 0x25A84
+0x4C55 0x25A7F
+0x4C57 0x25B3B
+0x4C58 0x25B71
+0x4C59 0x25B3D
+0x4C5A 0x25B30
+0x4C5C 0x25B3E
+0x4C5D 0x25B38
+0x4C5E 0x25E5E
+0x4C5F 0x25E64
+0x4C61 0x25E5D
+0x4C62 0x25E6D
+0x4C63 0x25E4F
+0x4C64 0x25E62
+0x4C65 0x25E5F
+0x4C66 0x25FEC
+0x4C67 0x25FF2
+0x4C68 0x25FF4
+0x4C69 0x25FF7
+0x4C6A 0x25FF6
+0x4C6B 0x26007
+0x4C6C 0x25FED
+0x4C6D 0x25FEA
+0x4C6E 0x25FF0
+0x4C6F 0x25FF8
+0x4C70 0x25FF3
+0x4C72 0x2F972
+0x4C73 0x26231
+0x4C74 0x2622F
+0x4C75 0x262B6
+0x4C76 0x262AE
+0x4C77 0x262AA
+0x4C78 0x262BF
+0x4C79 0x262CC
+0x4C7A 0x262C7
+0x4C7B 0x26C83
+0x4C7C 0x26380
+0x4C7D 0x2637B
+0x4C7E 0x2637F
+0x4D21 0x2637D
+0x4D22 0x26383
+0x4D23 0x2F978
+0x4D24 0x26446
+0x4D25 0x2642D
+0x4D26 0x26425
+0x4D27 0x26426
+0x4D28 0x2642C
+0x4D29 0x26437
+0x4D2A 0x26431
+0x4D2B 0x26433
+0x4D2C 0x26432
+0x4D2D 0x26427
+0x4D2E 0x2642A
+0x4D2F 0x2642E
+0x4D30 0x2642F
+0x4D31 0x264C0
+0x4D32 0x26571
+0x4D33 0x26561
+0x4D34 0x26562
+0x4D35 0x26566
+0x4D36 0x26618
+0x4D37 0x266C5
+0x4D38 0x266C3
+0x4D39 0x266C4
+0x4D3A 0x266C2
+0x4D3B 0x266AE
+0x4D3C 0x26710
+0x4D3D 0x26708
+0x4D3E 0x2671F
+0x4D3F 0x2673A
+0x4D40 0x2673B
+0x4D41 0x26736
+0x4D42 0x2670C
+0x4D43 0x26706
+0x4D44 0x2672A
+0x4D45 0x26757
+0x4D46 0x26750
+0x4D47 0x26720
+0x4D48 0x2F985
+0x4D49 0x2672C
+0x4D4A 0x26721
+0x4D4B 0x2670B
+0x4D4C 0x26719
+0x4D4D 0x26735
+0x4D4E 0x26718
+0x4D4F 0x2670F
+0x4D50 0x26713
+0x4D51 0x26755
+0x4D52 0x26739
+0x4D53 0x2671A
+0x4D55 0x26717
+0x4D56 0x268E4
+0x4D57 0x268E9
+0x4D58 0x2458B
+0x4D59 0x26910
+0x4D5A 0x26912
+0x4D5B 0x2693F
+0x4D5C 0x2696E
+0x4D5D 0x24518
+0x4D5E 0x2F98C
+0x4D5F 0x269D6
+0x4D60 0x269D5
+0x4D61 0x269D7
+0x4D62 0x20B02
+0x4D64 0x26A31
+0x4D65 0x26A30
+0x4D66 0x26A3A
+0x4D67 0x26B85
+0x4D68 0x26B6B
+0x4D69 0x26C48
+0x4D6A 0x26C4B
+0x4D6B 0x26C37
+0x4D6C 0x26C7B
+0x4D6D 0x26C6C
+0x4D6E 0x26C85
+0x4D6F 0x26C65
+0x4D70 0x26C36
+0x4D71 0x26C86
+0x4D72 0x26C34
+0x4D73 0x26C68
+0x4D74 0x26C5A
+0x4D75 0x26C58
+0x4D76 0x26C72
+0x4D77 0x26C6A
+0x4D78 0x26BD3
+0x4D79 0x26C3C
+0x4D7A 0x26C33
+0x4D7B 0x26C3B
+0x4D7C 0x26C4D
+0x4D7D 0x26C4F
+0x4D7E 0x26C7C
+0x4E21 0x26CB0
+0x4E22 0x26C5B
+0x4E23 0x26C55
+0x4E24 0x26C64
+0x4E25 0x26C6B
+0x4E26 0x26C53
+0x4E28 0x26C57
+0x4E29 0x26C5E
+0x4E2A 0x26C6D
+0x4E2B 0x26C35
+0x4E2C 0x26C69
+0x4E2D 0x26C59
+0x4E2E 0x26C66
+0x4E2F 0x26C50
+0x4E30 0x26C51
+0x4E31 0x26C5C
+0x4E32 0x26D5D
+0x4E33 0x26C87
+0x4E34 0x26C78
+0x4E35 0x26C49
+0x4E36 0x26C4E
+0x4E37 0x26BF1
+0x4E38 0x26C73
+0x4E39 0x26C88
+0x4E3A 0x26BCF
+0x4E3B 0x2F9A4
+0x4E3C 0x271B1
+0x4E3D 0x271B3
+0x4E3E 0x2729C
+0x4E3F 0x272A4
+0x4E40 0x27290
+0x4E41 0x272B8
+0x4E42 0x272A0
+0x4E43 0x2729D
+0x4E44 0x272A8
+0x4E45 0x272A9
+0x4E46 0x2F9B9
+0x4E47 0x272B1
+0x4E48 0x27293
+0x4E49 0x2729B
+0x4E4A 0x272A2
+0x4E4B 0x272A1
+0x4E4C 0x272B0
+0x4E4D 0x272A7
+0x4E4E 0x275B3
+0x4E50 0x275B4
+0x4E51 0x275F1
+0x4E52 0x275ED
+0x4E53 0x275EC
+0x4E54 0x27668
+0x4E55 0x27675
+0x4E56 0x2766A
+0x4E57 0x27662
+0x4E58 0x27667
+0x4E59 0x27660
+0x4E5A 0x27677
+0x4E5B 0x2765F
+0x4E5C 0x27679
+0x4E5D 0x27823
+0x4E5E 0x27821
+0x4E5F 0x2781C
+0x4E61 0x2781F
+0x4E62 0x2781E
+0x4E63 0x278D6
+0x4E64 0x278D3
+0x4E65 0x278D9
+0x4E66 0x278D7
+0x4E67 0x278D4
+0x4E68 0x278DC
+0x4E69 0x278D8
+0x4E6A 0x279A3
+0x4E6C 0x279BE
+0x4E6D 0x279A9
+0x4E6E 0x279A1
+0x4E6F 0x279A0
+0x4E70 0x279AB
+0x4E71 0x279A2
+0x4E72 0x279BA
+0x4E73 0x279C2
+0x4E74 0x2799C
+0x4E75 0x279BB
+0x4E76 0x279AA
+0x4E77 0x279AC
+0x4E78 0x279A5
+0x4E79 0x279C1
+0x4E7B 0x27BE2
+0x4E7C 0x27C36
+0x4E7D 0x27C3D
+0x4E7E 0x27C3A
+0x4F21 0x22461
+0x4F22 0x27C48
+0x4F23 0x27C3C
+0x4F24 0x27CB7
+0x4F25 0x27CAC
+0x4F26 0x27CB3
+0x4F27 0x27CB6
+0x4F28 0x27CB2
+0x4F2A 0x27D5D
+0x4F2B 0x27D49
+0x4F2C 0x27D4E
+0x4F2D 0x27D4F
+0x4F2E 0x27D4D
+0x4F2F 0x27D5C
+0x4F30 0x27E5D
+0x4F31 0x27EBB
+0x4F32 0x27ECE
+0x4F33 0x27EBF
+0x4F34 0x27EBA
+0x4F35 0x27EC3
+0x4F37 0x28006
+0x4F38 0x27FF8
+0x4F39 0x27FFE
+0x4F3A 0x28013
+0x4F3B 0x27FF6
+0x4F3D 0x28234
+0x4F3E 0x2822D
+0x4F3F 0x2822A
+0x4F40 0x28235
+0x4F41 0x2822C
+0x4F42 0x282D4
+0x4F43 0x282DA
+0x4F44 0x282D3
+0x4F45 0x282D2
+0x4F46 0x282CE
+0x4F47 0x282CF
+0x4F49 0x284FD
+0x4F4A 0x2850B
+0x4F4B 0x284FE
+0x4F4C 0x284F8
+0x4F4D 0x284F7
+0x4F4E 0x28517
+0x4F4F 0x284FA
+0x4F50 0x284F9
+0x4F51 0x28500
+0x4F52 0x284F5
+0x4F53 0x284F1
+0x4F54 0x28503
+0x4F55 0x28505
+0x4F56 0x2851C
+0x4F57 0x286AC
+0x4F58 0x2869A
+0x4F59 0x286AD
+0x4F5A 0x286A0
+0x4F5B 0x2871B
+0x4F5C 0x28725
+0x4F5D 0x28724
+0x4F5E 0x28726
+0x4F5F 0x28727
+0x4F60 0x28728
+0x4F61 0x2872A
+0x4F62 0x2871A
+0x4F63 0x2872E
+0x4F64 0x28715
+0x4F65 0x28815
+0x4F66 0x28814
+0x4F67 0x28817
+0x4F68 0x28818
+0x4F69 0x2880F
+0x4F6A 0x28813
+0x4F6B 0x2880B
+0x4F6C 0x28822
+0x4F6D 0x2137A
+0x4F6E 0x28926
+0x4F70 0x28951
+0x4F71 0x2894D
+0x4F72 0x2894E
+0x4F73 0x2894A
+0x4F74 0x2894B
+0x4F75 0x2894C
+0x4F76 0x28950
+0x4F77 0x28962
+0x4F78 0x2894F
+0x4F79 0x28952
+0x4F7A 0x28C68
+0x4F7B 0x28C69
+0x4F7C 0x28CE5
+0x4F7D 0x28CF0
+0x4F7E 0x28CE1
+0x5021 0x28CE2
+0x5022 0x2F9F2
+0x5023 0x28EA5
+0x5024 0x28EA9
+0x5025 0x28EA4
+0x5026 0x28EAF
+0x5027 0x28EAC
+0x5028 0x28EAE
+0x5029 0x28EAA
+0x502A 0x28F95
+0x502B 0x28F99
+0x502C 0x28F93
+0x502D 0x28F9D
+0x502E 0x28F98
+0x502F 0x28F9C
+0x5030 0x28F97
+0x5032 0x29089
+0x5033 0x29087
+0x5034 0x291D7
+0x5035 0x291ED
+0x5036 0x291F1
+0x5037 0x291F0
+0x5038 0x29205
+0x5039 0x29203
+0x503A 0x29204
+0x503B 0x2925F
+0x503C 0x29457
+0x503D 0x2959C
+0x503E 0x295A1
+0x503F 0x2959A
+0x5040 0x2968F
+0x5041 0x29693
+0x5042 0x2969E
+0x5043 0x296A3
+0x5044 0x29698
+0x5045 0x29699
+0x5046 0x29695
+0x5047 0x2986E
+0x5048 0x2986A
+0x5049 0x29AF4
+0x504A 0x29AF7
+0x504B 0x29C79
+0x504C 0x29F8F
+0x504D 0x29F91
+0x504E 0x2A00B
+0x504F 0x2A502
+0x5050 0x20084
+0x5051 0x20104
+0x5052 0x20180
+0x5053 0x2032F
+0x5054 0x2033F
+0x5055 0x2033B
+0x5056 0x20362
+0x5057 0x20344
+0x5058 0x20333
+0x5059 0x2035F
+0x505A 0x2032B
+0x505B 0x2F809
+0x505C 0x20339
+0x505D 0x20336
+0x505E 0x20348
+0x505F 0x20335
+0x5060 0x2036C
+0x5061 0x20358
+0x5062 0x2033A
+0x5063 0x204A8
+0x5064 0x204F4
+0x5065 0x20529
+0x5066 0x2059A
+0x5067 0x20600
+0x5068 0x207BB
+0x5069 0x207BD
+0x506A 0x207B7
+0x506B 0x207B2
+0x506D 0x207A8
+0x506E 0x207AB
+0x506F 0x207A6
+0x5070 0x207BC
+0x5071 0x20897
+0x5072 0x20896
+0x5073 0x208F8
+0x5075 0x20951
+0x5077 0x209B5
+0x5078 0x209B4
+0x5079 0x209B6
+0x507B 0x209B7
+0x507C 0x20A05
+0x507D 0x20A23
+0x507E 0x20A95
+0x5121 0x20A98
+0x5123 0x20A94
+0x5124 0x20A93
+0x5125 0x20B07
+0x5126 0x20B73
+0x5127 0x20B71
+0x5128 0x20B72
+0x5129 0x20B78
+0x512A 0x20E5F
+0x512B 0x20E6A
+0x512C 0x20E67
+0x512D 0x20E6B
+0x512E 0x20E69
+0x512F 0x20E8E
+0x5130 0x20E49
+0x5131 0x20E80
+0x5133 0x20E44
+0x5134 0x20E8F
+0x5135 0x20E45
+0x5136 0x2F84C
+0x5137 0x20E4F
+0x5138 0x20E63
+0x5139 0x20E36
+0x513A 0x20E48
+0x513B 0x20E5C
+0x513C 0x20E93
+0x513D 0x20E61
+0x513E 0x20E60
+0x513F 0x20E4E
+0x5140 0x20E5E
+0x5141 0x20E3F
+0x5142 0x20EA4
+0x5144 0x20E68
+0x5145 0x2120B
+0x5146 0x21211
+0x5147 0x2120D
+0x5148 0x2120E
+0x5149 0x213C2
+0x514A 0x2F857
+0x514B 0x213B0
+0x514C 0x213C3
+0x514D 0x213C8
+0x514E 0x21365
+0x514F 0x213D7
+0x5150 0x213BD
+0x5151 0x213B8
+0x5152 0x213B6
+0x5153 0x213C7
+0x5154 0x213BC
+0x5155 0x213B1
+0x5156 0x213AF
+0x5157 0x2F85B
+0x5158 0x21535
+0x5159 0x21530
+0x515A 0x2155D
+0x515B 0x20B76
+0x515C 0x2156F
+0x515D 0x215B0
+0x515E 0x2F85E
+0x515F 0x215B4
+0x5160 0x2165C
+0x5161 0x2165D
+0x5162 0x21808
+0x5163 0x217EE
+0x5164 0x2180B
+0x5165 0x217F2
+0x5166 0x217FD
+0x5167 0x217F1
+0x5168 0x21810
+0x5169 0x2F868
+0x516A 0x21814
+0x516B 0x2198B
+0x516C 0x2198C
+0x516D 0x21985
+0x516E 0x21A7A
+0x516F 0x21A6C
+0x5170 0x21A60
+0x5171 0x21A67
+0x5172 0x21A66
+0x5173 0x21A6A
+0x5174 0x21A5F
+0x5175 0x21A6D
+0x5176 0x21A68
+0x5177 0x21A64
+0x5178 0x21B3A
+0x5179 0x21B3B
+0x517A 0x21B39
+0x517B 0x21C02
+0x517C 0x21C04
+0x517D 0x21C03
+0x517E 0x21CB4
+0x5221 0x21CB3
+0x5222 0x21CBB
+0x5223 0x21CAC
+0x5224 0x21CB6
+0x5225 0x21CB1
+0x5226 0x21CAF
+0x5227 0x21CB5
+0x5228 0x21CBE
+0x5229 0x21CB2
+0x522A 0x21D24
+0x522B 0x21EB6
+0x522C 0x21EB9
+0x522D 0x21EAC
+0x522E 0x21EB0
+0x522F 0x21ED7
+0x5230 0x21EBB
+0x5231 0x21EFE
+0x5232 0x21ECB
+0x5233 0x2F87F
+0x5235 0x21EB3
+0x5236 0x21EBE
+0x5237 0x21ECD
+0x5238 0x21EBC
+0x5239 0x21EBA
+0x523A 0x21EC7
+0x523B 0x22116
+0x523C 0x2211B
+0x523D 0x22117
+0x523E 0x22115
+0x523F 0x2219F
+0x5240 0x2F88E
+0x5241 0x22282
+0x5242 0x22283
+0x5243 0x2228E
+0x5244 0x2226A
+0x5245 0x22289
+0x5246 0x22294
+0x5247 0x22286
+0x5248 0x22290
+0x5249 0x22362
+0x524A 0x22390
+0x524B 0x2240C
+0x524C 0x2240F
+0x524E 0x224A5
+0x524F 0x224A7
+0x5250 0x224A6
+0x5251 0x224A4
+0x5252 0x22535
+0x5253 0x22538
+0x5254 0x22536
+0x5255 0x22543
+0x5256 0x22547
+0x5257 0x22537
+0x5258 0x22743
+0x5259 0x227A2
+0x525A 0x22751
+0x525B 0x22772
+0x525C 0x2276D
+0x525D 0x2272F
+0x525E 0x22754
+0x525F 0x2276E
+0x5260 0x22755
+0x5261 0x22737
+0x5262 0x2274F
+0x5263 0x22750
+0x5265 0x2279E
+0x5266 0x2F8A8
+0x5267 0x227B3
+0x5268 0x227A7
+0x526A 0x227F9
+0x526B 0x22791
+0x526C 0x2F8A7
+0x526D 0x227B6
+0x526E 0x227DD
+0x526F 0x22799
+0x5270 0x229DF
+0x5271 0x229D5
+0x5272 0x247F5
+0x5273 0x22C28
+0x5274 0x22C40
+0x5275 0x22C71
+0x5276 0x22C98
+0x5277 0x22C95
+0x5278 0x22C65
+0x5279 0x22C78
+0x527A 0x22C7F
+0x527B 0x22C60
+0x527C 0x22C7C
+0x527D 0x22C96
+0x527E 0x22C6A
+0x5321 0x22C79
+0x5322 0x22C73
+0x5323 0x22C72
+0x5324 0x22C7B
+0x5325 0x22C70
+0x5326 0x22ED5
+0x5327 0x22ED7
+0x5328 0x22F8F
+0x5329 0x22F89
+0x532A 0x22F9E
+0x532B 0x22F87
+0x532C 0x22FA0
+0x532D 0x22F8D
+0x532E 0x22F88
+0x532F 0x22F7F
+0x5330 0x22F8C
+0x5331 0x22F93
+0x5332 0x23059
+0x5333 0x295B0
+0x5334 0x230B1
+0x5335 0x251F4
+0x5336 0x230AF
+0x5337 0x230B2
+0x5338 0x23108
+0x5339 0x2310A
+0x533A 0x23136
+0x533B 0x23137
+0x533C 0x2F8CF
+0x533E 0x23236
+0x533F 0x23229
+0x5340 0x2324A
+0x5341 0x23226
+0x5342 0x23228
+0x5343 0x23224
+0x5344 0x2322A
+0x5345 0x23248
+0x5346 0x23344
+0x5347 0x23384
+0x5348 0x2338C
+0x5349 0x234C4
+0x534A 0x234DC
+0x534B 0x23587
+0x534C 0x23553
+0x534D 0x2357F
+0x534E 0x23531
+0x534F 0x23551
+0x5350 0x2354B
+0x5351 0x23552
+0x5352 0x23580
+0x5353 0x235A5
+0x5354 0x23581
+0x5355 0x23543
+0x5356 0x23534
+0x5357 0x23536
+0x5358 0x23532
+0x5359 0x23548
+0x535A 0x23549
+0x535B 0x2353C
+0x535C 0x2354D
+0x535D 0x2354A
+0x535E 0x2F8E6
+0x535F 0x2358A
+0x5360 0x23546
+0x5361 0x2353E
+0x5362 0x23583
+0x5363 0x23550
+0x5364 0x235B4
+0x5365 0x238F0
+0x5366 0x238E4
+0x5367 0x238E3
+0x5368 0x238E5
+0x5369 0x238E6
+0x536A 0x238E7
+0x536B 0x238E1
+0x536C 0x238EF
+0x536D 0x238E8
+0x536E 0x238DD
+0x536F 0x23903
+0x5370 0x23988
+0x5371 0x23A26
+0x5372 0x23A16
+0x5373 0x23A3B
+0x5374 0x23A2F
+0x5375 0x23A39
+0x5376 0x23A34
+0x5377 0x2F8F4
+0x5378 0x23A35
+0x5379 0x23A31
+0x537A 0x23A38
+0x537B 0x20B81
+0x537C 0x23AAA
+0x537D 0x23AA3
+0x537E 0x23AA4
+0x5421 0x23AA0
+0x5422 0x23AA1
+0x5423 0x23AA9
+0x5424 0x23AA5
+0x5425 0x23BAF
+0x5426 0x23BB1
+0x5427 0x23BAB
+0x5428 0x23BAE
+0x5429 0x23BB0
+0x542A 0x23BB3
+0x542B 0x23BAC
+0x542C 0x23BA9
+0x542D 0x23BB2
+0x542E 0x23BA8
+0x542F 0x23BB4
+0x5430 0x23BC2
+0x5431 0x23C4F
+0x5432 0x23C66
+0x5433 0x23E1E
+0x5434 0x23E15
+0x5435 0x23E10
+0x5436 0x23E7F
+0x5437 0x23E7E
+0x5438 0x23E60
+0x5439 0x23ECC
+0x543A 0x23EB2
+0x543B 0x23E62
+0x543C 0x23E8D
+0x543D 0x23E8E
+0x543E 0x23E77
+0x543F 0x23E7C
+0x5440 0x23E8F
+0x5441 0x23E5D
+0x5442 0x23E6D
+0x5443 0x23E63
+0x5444 0x23EAF
+0x5445 0x23E90
+0x5446 0x23E7D
+0x5447 0x23E7A
+0x5448 0x23E06
+0x5449 0x2F90B
+0x544A 0x23E68
+0x544B 0x23EB4
+0x544C 0x23E78
+0x544D 0x23EB1
+0x544F 0x2F90C
+0x5451 0x242E8
+0x5452 0x242E9
+0x5453 0x242C0
+0x5455 0x242EA
+0x5456 0x242B7
+0x5457 0x242BA
+0x5458 0x242B5
+0x5459 0x2F91D
+0x545A 0x242B4
+0x545B 0x242BC
+0x545C 0x242C6
+0x545D 0x242B8
+0x545E 0x242BD
+0x545F 0x242C2
+0x5460 0x2434D
+0x5461 0x242F0
+0x5462 0x242C7
+0x5463 0x242C1
+0x5464 0x242C3
+0x5465 0x242F1
+0x5466 0x242EC
+0x5468 0x2451C
+0x5469 0x24520
+0x546A 0x24558
+0x546B 0x24565
+0x546C 0x24564
+0x546D 0x2458C
+0x546E 0x2458D
+0x546F 0x245D9
+0x5470 0x245E0
+0x5471 0x24610
+0x5472 0x24694
+0x5473 0x24692
+0x5474 0x24696
+0x5475 0x24695
+0x5476 0x246BF
+0x5477 0x246A0
+0x5479 0x247F4
+0x547A 0x247F6
+0x547B 0x247DC
+0x547D 0x24816
+0x547E 0x24815
+0x5521 0x2481C
+0x5522 0x2480F
+0x5523 0x2482C
+0x5524 0x24814
+0x5525 0x24825
+0x5526 0x24817
+0x5527 0x24812
+0x5528 0x2481E
+0x5529 0x24980
+0x552A 0x249A8
+0x552B 0x249AF
+0x552C 0x249D6
+0x552D 0x249E2
+0x552E 0x249B4
+0x552F 0x249B3
+0x5530 0x249B0
+0x5531 0x249B2
+0x5532 0x249A1
+0x5533 0x24B60
+0x5534 0x24B66
+0x5535 0x24B61
+0x5536 0x24B4E
+0x5537 0x24B5D
+0x5538 0x24B63
+0x5539 0x24BE6
+0x553A 0x24BEF
+0x553B 0x24BEC
+0x553C 0x24C98
+0x553D 0x24CA7
+0x553E 0x24C94
+0x553F 0x24C95
+0x5540 0x24C91
+0x5541 0x24C9D
+0x5542 0x24C99
+0x5543 0x24C9B
+0x5544 0x24C9C
+0x5545 0x24D1D
+0x5546 0x24D1C
+0x5547 0x24DD0
+0x5548 0x24DE0
+0x5549 0x24DCB
+0x554A 0x24DDB
+0x554B 0x24DDA
+0x554C 0x24DC2
+0x554D 0x24DD3
+0x554E 0x24DE5
+0x554F 0x24F7D
+0x5550 0x24F7B
+0x5551 0x24FFF
+0x5553 0x24FF9
+0x5554 0x25077
+0x5555 0x2507C
+0x5556 0x25078
+0x5557 0x2507B
+0x5558 0x2507A
+0x5559 0x251D2
+0x555A 0x251CB
+0x555B 0x251C9
+0x555C 0x251CE
+0x555D 0x251E4
+0x555E 0x251CA
+0x555F 0x251D0
+0x5560 0x22FA5
+0x5562 0x251D9
+0x5563 0x251EE
+0x5564 0x251DD
+0x5565 0x25200
+0x5566 0x251E1
+0x5567 0x253DE
+0x5568 0x253E2
+0x5569 0x253DA
+0x556A 0x254CE
+0x556B 0x2F94F
+0x556C 0x254CF
+0x556D 0x254DA
+0x556E 0x254D1
+0x556F 0x254D4
+0x5570 0x254ED
+0x5571 0x254CB
+0x5572 0x254D5
+0x5573 0x254F1
+0x5574 0x2569C
+0x5575 0x25688
+0x5576 0x25741
+0x5577 0x257D0
+0x5578 0x257F7
+0x5579 0x257CF
+0x557A 0x257D1
+0x557B 0x257DB
+0x557C 0x257DE
+0x557D 0x257F8
+0x557E 0x257DC
+0x5621 0x257D9
+0x5622 0x259A0
+0x5623 0x259B2
+0x5624 0x259A1
+0x5625 0x259AA
+0x5626 0x259A9
+0x5628 0x259A6
+0x5629 0x2599C
+0x562A 0x259B5
+0x562B 0x259A7
+0x562C 0x25A8E
+0x562D 0x25A90
+0x562E 0x25A91
+0x562F 0x25B85
+0x5630 0x25B5B
+0x5631 0x25B70
+0x5632 0x25B64
+0x5633 0x25B67
+0x5634 0x25B63
+0x5635 0x25B77
+0x5636 0x25B68
+0x5637 0x25B65
+0x5638 0x25B6A
+0x5639 0x25B78
+0x563A 0x25B66
+0x563B 0x25E88
+0x563C 0x25E9E
+0x563D 0x25E74
+0x563E 0x25E7A
+0x563F 0x25E79
+0x5640 0x25E8B
+0x5641 0x25E7F
+0x5642 0x26013
+0x5643 0x2601E
+0x5644 0x26017
+0x5645 0x2601A
+0x5646 0x26022
+0x5647 0x26043
+0x5648 0x26019
+0x5649 0x2601F
+0x564A 0x26027
+0x564B 0x26012
+0x564C 0x26024
+0x564D 0x26025
+0x564E 0x2035E
+0x564F 0x26235
+0x5650 0x26234
+0x5651 0x262D1
+0x5652 0x262C4
+0x5653 0x262CA
+0x5654 0x262C6
+0x5655 0x262CB
+0x5656 0x262CD
+0x5657 0x262E2
+0x5658 0x26389
+0x5659 0x2638B
+0x565A 0x26386
+0x565B 0x26388
+0x565C 0x2638D
+0x565D 0x2643B
+0x565E 0x2643C
+0x565F 0x2643D
+0x5660 0x264F5
+0x5661 0x26579
+0x5662 0x26575
+0x5663 0x26582
+0x5664 0x2657F
+0x5665 0x26585
+0x5666 0x26576
+0x5667 0x2657C
+0x5668 0x2657E
+0x5669 0x2657B
+0x566A 0x26580
+0x566B 0x2657A
+0x566C 0x22548
+0x566E 0x2661D
+0x566F 0x266F6
+0x5670 0x266F7
+0x5671 0x266F9
+0x5672 0x26763
+0x5673 0x2676C
+0x5674 0x2676E
+0x5675 0x26714
+0x5677 0x26767
+0x5678 0x2676F
+0x5679 0x26769
+0x567A 0x26776
+0x567B 0x26795
+0x567C 0x26771
+0x567D 0x26761
+0x567E 0x26778
+0x5721 0x2676B
+0x5722 0x26785
+0x5723 0x26784
+0x5724 0x26914
+0x5725 0x26976
+0x5726 0x259B6
+0x5727 0x26975
+0x5728 0x26974
+0x5729 0x269E2
+0x572A 0x26A3F
+0x572B 0x26A44
+0x572C 0x26A3D
+0x572D 0x26A47
+0x572E 0x26A48
+0x572F 0x26ADB
+0x5730 0x26ADC
+0x5731 0x26ADD
+0x5732 0x26BE5
+0x5733 0x26BE6
+0x5734 0x26CC2
+0x5735 0x26D2E
+0x5736 0x26D1D
+0x5737 0x26CF8
+0x5738 0x26CF0
+0x5739 0x26CF6
+0x573A 0x26CC5
+0x573B 0x26CC6
+0x573C 0x26CFC
+0x573D 0x26D52
+0x573E 0x26D2F
+0x573F 0x26D10
+0x5740 0x26CF3
+0x5741 0x26CD2
+0x5742 0x26CEA
+0x5743 0x26CDC
+0x5744 0x26D1B
+0x5745 0x26CFB
+0x5746 0x26CC3
+0x5747 0x26D16
+0x5748 0x26D07
+0x5749 0x26CC9
+0x574A 0x26CD8
+0x574B 0x26D30
+0x574C 0x26D13
+0x574D 0x26D31
+0x574E 0x26CFA
+0x574F 0x26CF2
+0x5750 0x26DE3
+0x5751 0x26CD5
+0x5752 0x26D01
+0x5753 0x26CF1
+0x5754 0x26D1C
+0x5755 0x26CD6
+0x5756 0x26D08
+0x5757 0x26D0B
+0x5758 0x26D17
+0x5759 0x26D20
+0x575A 0x26CCA
+0x575B 0x26D32
+0x575C 0x26D05
+0x575D 0x26CE4
+0x575E 0x26CCE
+0x575F 0x26D33
+0x5760 0x26D02
+0x5761 0x26D19
+0x5762 0x26D1E
+0x5763 0x26CD3
+0x5764 0x26CF7
+0x5765 0x26CE8
+0x5766 0x26D1F
+0x5767 0x26CF4
+0x5768 0x26DD8
+0x5769 0x271BF
+0x576A 0x271BE
+0x576B 0x271BD
+0x576C 0x272DC
+0x576D 0x272DD
+0x576E 0x272AB
+0x576F 0x272C9
+0x5770 0x272C8
+0x5771 0x272DF
+0x5772 0x272D9
+0x5773 0x272DB
+0x5774 0x272CC
+0x5775 0x272E0
+0x5776 0x272EF
+0x5777 0x272F3
+0x5778 0x272AE
+0x5779 0x27301
+0x577A 0x275B7
+0x577B 0x275B9
+0x577C 0x275B6
+0x577D 0x275B8
+0x577E 0x275F6
+0x5821 0x275F3
+0x5822 0x275F5
+0x5823 0x275F2
+0x5824 0x27691
+0x5825 0x2769D
+0x5826 0x2769B
+0x5827 0x27692
+0x5828 0x2768D
+0x5829 0x2769E
+0x582A 0x2768C
+0x582C 0x2F9C7
+0x582D 0x27695
+0x582E 0x2F9C6
+0x582F 0x2768A
+0x5830 0x2768E
+0x5831 0x2769C
+0x5832 0x277EF
+0x5833 0x2782D
+0x5834 0x27852
+0x5835 0x27835
+0x5836 0x27828
+0x5837 0x2782E
+0x5838 0x278E5
+0x5839 0x279EA
+0x583A 0x279F1
+0x583B 0x279EB
+0x583C 0x279D8
+0x583D 0x279D0
+0x583E 0x279F3
+0x583F 0x279DB
+0x5840 0x279CE
+0x5842 0x279DA
+0x5843 0x279D7
+0x5844 0x279E1
+0x5845 0x279F2
+0x5846 0x279C8
+0x5847 0x279D9
+0x5848 0x279DE
+0x5849 0x279D1
+0x584A 0x279E7
+0x584B 0x279CF
+0x584C 0x27BB7
+0x584D 0x27C47
+0x584E 0x27C42
+0x584F 0x27C43
+0x5850 0x2F9D3
+0x5851 0x27CC3
+0x5852 0x27CC1
+0x5853 0x27CC7
+0x5854 0x27D64
+0x5855 0x27D6A
+0x5856 0x27D66
+0x5857 0x27D50
+0x5858 0x27D6E
+0x5859 0x27D65
+0x585A 0x238EC
+0x585B 0x27D7F
+0x585C 0x2F9D5
+0x585D 0x27D9A
+0x585E 0x27D69
+0x585F 0x27D72
+0x5860 0x27D6F
+0x5861 0x27D7D
+0x5862 0x27D70
+0x5863 0x27E60
+0x5864 0x27EC2
+0x5865 0x27EE7
+0x5866 0x27ED1
+0x5867 0x27EEB
+0x5868 0x27ED4
+0x5869 0x27EDC
+0x586A 0x27EDB
+0x586B 0x28037
+0x586C 0x28025
+0x586D 0x2801F
+0x586E 0x2801E
+0x586F 0x28021
+0x5870 0x2801B
+0x5871 0x28017
+0x5872 0x28022
+0x5873 0x2802A
+0x5874 0x2801A
+0x5875 0x2802D
+0x5876 0x28023
+0x5877 0x28026
+0x5878 0x28036
+0x5879 0x27FFF
+0x587A 0x2823A
+0x587B 0x28240
+0x587C 0x28242
+0x587D 0x28238
+0x587E 0x2823B
+0x5921 0x2823C
+0x5922 0x28243
+0x5923 0x282E8
+0x5925 0x282F9
+0x5926 0x282EB
+0x5927 0x282F1
+0x5928 0x282E9
+0x5929 0x282EC
+0x592A 0x28415
+0x592B 0x28447
+0x592C 0x28446
+0x592D 0x28445
+0x592E 0x28524
+0x592F 0x28556
+0x5930 0x28521
+0x5931 0x28527
+0x5932 0x2854D
+0x5933 0x28531
+0x5934 0x2851E
+0x5935 0x2852C
+0x5936 0x2854F
+0x5937 0x2852B
+0x5938 0x28553
+0x5939 0x28551
+0x593A 0x28554
+0x593B 0x28529
+0x593C 0x28550
+0x593D 0x2851F
+0x593E 0x28532
+0x593F 0x2852A
+0x5940 0x2851D
+0x5941 0x28528
+0x5942 0x2852E
+0x5943 0x2852D
+0x5944 0x286BC
+0x5945 0x286BB
+0x5946 0x286BD
+0x5947 0x2F9E4
+0x5948 0x28747
+0x5949 0x28741
+0x594A 0x2F9E5
+0x594B 0x28749
+0x594D 0x2882E
+0x594E 0x28827
+0x594F 0x2896A
+0x5950 0x2897B
+0x5951 0x28973
+0x5952 0x28975
+0x5953 0x28969
+0x5954 0x28979
+0x5955 0x28972
+0x5956 0x28C76
+0x5957 0x28C77
+0x5958 0x28C74
+0x5959 0x28C73
+0x595A 0x28D02
+0x595B 0x28CFE
+0x595C 0x28D01
+0x595D 0x28CF9
+0x595E 0x28CF4
+0x595F 0x28ED3
+0x5960 0x28ED5
+0x5961 0x28ED8
+0x5962 0x28EC3
+0x5963 0x28ECA
+0x5964 0x28ED0
+0x5965 0x28ECB
+0x5966 0x28ECE
+0x5967 0x28EC5
+0x5968 0x28EE6
+0x5969 0x28EC4
+0x596A 0x28EC0
+0x596B 0x28ED4
+0x596C 0x28EE8
+0x596D 0x28F76
+0x596E 0x28FA2
+0x596F 0x28FAE
+0x5970 0x28FA8
+0x5971 0x28FA3
+0x5972 0x28FA7
+0x5973 0x28F96
+0x5974 0x28FA9
+0x5975 0x28FA5
+0x5976 0x28FAF
+0x5977 0x28FA4
+0x5978 0x28FAB
+0x5979 0x28FAA
+0x597A 0x28FA6
+0x597B 0x28FA0
+0x597C 0x29098
+0x597D 0x291DB
+0x597E 0x291F6
+0x5A21 0x291F5
+0x5A22 0x2920C
+0x5A23 0x2920A
+0x5A25 0x29268
+0x5A26 0x29263
+0x5A27 0x29266
+0x5A29 0x29264
+0x5A2A 0x2926A
+0x5A2B 0x29269
+0x5A2C 0x29395
+0x5A2D 0x29402
+0x5A2E 0x2946A
+0x5A2F 0x2945E
+0x5A30 0x29468
+0x5A31 0x29469
+0x5A32 0x29465
+0x5A33 0x2F9FE
+0x5A34 0x295A7
+0x5A35 0x295AE
+0x5A36 0x295A8
+0x5A37 0x295B3
+0x5A38 0x2969C
+0x5A39 0x296A9
+0x5A3A 0x296B6
+0x5A3B 0x296B3
+0x5A3C 0x296B2
+0x5A3D 0x2FA03
+0x5A3E 0x296B8
+0x5A3F 0x296C0
+0x5A40 0x296BF
+0x5A41 0x296BA
+0x5A42 0x296A8
+0x5A43 0x2983C
+0x5A44 0x29872
+0x5A45 0x29871
+0x5A46 0x29875
+0x5A47 0x29873
+0x5A48 0x29A17
+0x5A49 0x29A15
+0x5A4A 0x29A16
+0x5A4B 0x29A1B
+0x5A4C 0x29AFA
+0x5A4D 0x29AF9
+0x5A4E 0x29C2C
+0x5A4F 0x29C85
+0x5A50 0x29C82
+0x5A51 0x29C7F
+0x5A52 0x29C7D
+0x5A53 0x29C88
+0x5A54 0x242F3
+0x5A55 0x29D4E
+0x5A56 0x29D50
+0x5A57 0x29F93
+0x5A58 0x29F97
+0x5A59 0x29F98
+0x5A5A 0x29F9B
+0x5A5B 0x29F9C
+0x5A5C 0x29F96
+0x5A5D 0x2A28B
+0x5A5E 0x2A2FD
+0x5A5F 0x2A2FC
+0x5A60 0x2FA17
+0x5A61 0x2398B
+0x5A62 0x20108
+0x5A63 0x20107
+0x5A64 0x20373
+0x5A65 0x203A2
+0x5A66 0x203AF
+0x5A67 0x20382
+0x5A68 0x2037B
+0x5A69 0x20374
+0x5A6A 0x203B0
+0x5A6B 0x20376
+0x5A6C 0x203B9
+0x5A6D 0x2039E
+0x5A6E 0x203B1
+0x5A6F 0x203A1
+0x5A70 0x203B2
+0x5A71 0x2036E
+0x5A72 0x2F80B
+0x5A74 0x20378
+0x5A75 0x2037A
+0x5A76 0x20383
+0x5A77 0x2039A
+0x5A78 0x204F8
+0x5A79 0x20531
+0x5A7A 0x20569
+0x5A7B 0x20568
+0x5A7C 0x2059C
+0x5A7D 0x20604
+0x5A7E 0x20699
+0x5B21 0x207C7
+0x5B22 0x207C6
+0x5B23 0x207DC
+0x5B24 0x207C4
+0x5B25 0x207D8
+0x5B26 0x207D4
+0x5B27 0x207DF
+0x5B28 0x207D1
+0x5B29 0x207D0
+0x5B2A 0x207D6
+0x5B2B 0x207CF
+0x5B2C 0x208AD
+0x5B2D 0x208AF
+0x5B2E 0x208A7
+0x5B2F 0x208FD
+0x5B30 0x2095B
+0x5B31 0x2095A
+0x5B32 0x20A07
+0x5B33 0x20A9D
+0x5B34 0x20A9B
+0x5B35 0x20AAB
+0x5B36 0x20AA4
+0x5B37 0x20A9C
+0x5B38 0x20A9E
+0x5B39 0x20AA5
+0x5B3A 0x20AAA
+0x5B3B 0x20AA6
+0x5B3C 0x20B0E
+0x5B3D 0x20B7E
+0x5B3E 0x20B7C
+0x5B3F 0x20EEE
+0x5B40 0x20ED5
+0x5B41 0x20EE9
+0x5B42 0x20E42
+0x5B43 0x20EE2
+0x5B44 0x20F23
+0x5B45 0x20ED9
+0x5B46 0x20ED4
+0x5B47 0x20EE3
+0x5B48 0x20F15
+0x5B49 0x20EEF
+0x5B4A 0x20EF0
+0x5B4B 0x20ED6
+0x5B4C 0x20EDD
+0x5B4D 0x20EF6
+0x5B4E 0x20F1C
+0x5B4F 0x20ED8
+0x5B50 0x20EDB
+0x5B51 0x20EDA
+0x5B52 0x20EED
+0x5B53 0x21411
+0x5B54 0x21215
+0x5B55 0x21218
+0x5B56 0x2121A
+0x5B57 0x2121F
+0x5B58 0x21216
+0x5B59 0x2F84D
+0x5B5A 0x21219
+0x5B5B 0x2F84B
+0x5B5C 0x213F0
+0x5B5D 0x21409
+0x5B5E 0x2141B
+0x5B5F 0x27BE7
+0x5B60 0x213F6
+0x5B61 0x213F4
+0x5B62 0x213B5
+0x5B63 0x21410
+0x5B64 0x213F2
+0x5B65 0x21415
+0x5B66 0x213F3
+0x5B67 0x213F8
+0x5B68 0x21539
+0x5B69 0x2153B
+0x5B6A 0x21536
+0x5B6B 0x2140E
+0x5B6C 0x21572
+0x5B6D 0x21574
+0x5B6E 0x215B9
+0x5B6F 0x215B7
+0x5B70 0x215B8
+0x5B71 0x21672
+0x5B72 0x2166B
+0x5B73 0x2181D
+0x5B74 0x21837
+0x5B75 0x21822
+0x5B76 0x21843
+0x5B77 0x2184D
+0x5B78 0x21838
+0x5B79 0x2185B
+0x5B7A 0x21879
+0x5B7B 0x2181B
+0x5B7C 0x217F3
+0x5B7D 0x21991
+0x5B7E 0x21A7B
+0x5C21 0x21A94
+0x5C22 0x2F86F
+0x5C23 0x21A96
+0x5C24 0x21A7F
+0x5C25 0x21A8F
+0x5C26 0x21A84
+0x5C27 0x21A7C
+0x5C28 0x21A8E
+0x5C29 0x21A90
+0x5C2A 0x21A98
+0x5C2B 0x21A83
+0x5C2C 0x21A80
+0x5C2D 0x21A93
+0x5C2E 0x21A82
+0x5C30 0x21B3D
+0x5C31 0x21B41
+0x5C32 0x21BA1
+0x5C33 0x21B9F
+0x5C34 0x21C0A
+0x5C35 0x21C0D
+0x5C36 0x21CC8
+0x5C37 0x21CC9
+0x5C38 0x21CC7
+0x5C39 0x21CCD
+0x5C3A 0x21D25
+0x5C3B 0x21EB1
+0x5C3C 0x21EDC
+0x5C3D 0x2F880
+0x5C3E 0x21EE5
+0x5C3F 0x21EF4
+0x5C40 0x21EBF
+0x5C41 0x21EDB
+0x5C42 0x21EEA
+0x5C43 0x21EF2
+0x5C45 0x21EF1
+0x5C46 0x21EED
+0x5C47 0x21EE6
+0x5C48 0x22002
+0x5C49 0x2F882
+0x5C4A 0x22125
+0x5C4B 0x22118
+0x5C4C 0x2211F
+0x5C4D 0x22120
+0x5C4E 0x221CF
+0x5C4F 0x2229D
+0x5C50 0x22299
+0x5C51 0x222A8
+0x5C52 0x22368
+0x5C53 0x22366
+0x5C54 0x22367
+0x5C55 0x22391
+0x5C56 0x22413
+0x5C57 0x22415
+0x5C58 0x2241D
+0x5C59 0x22416
+0x5C5A 0x22419
+0x5C5B 0x2246B
+0x5C5C 0x22468
+0x5C5D 0x2246A
+0x5C5E 0x2246D
+0x5C5F 0x22469
+0x5C60 0x224AA
+0x5C61 0x22557
+0x5C62 0x22552
+0x5C63 0x22550
+0x5C64 0x2255F
+0x5C65 0x22567
+0x5C66 0x2254F
+0x5C68 0x2255B
+0x5C69 0x2255C
+0x5C6A 0x2255D
+0x5C6B 0x2281F
+0x5C6C 0x2279D
+0x5C6D 0x227B1
+0x5C6E 0x227B0
+0x5C6F 0x22794
+0x5C70 0x227C3
+0x5C71 0x227AF
+0x5C72 0x227A8
+0x5C73 0x227DC
+0x5C74 0x22798
+0x5C75 0x227C4
+0x5C76 0x227A4
+0x5C77 0x227AB
+0x5C78 0x227AA
+0x5C79 0x227A5
+0x5C7A 0x22821
+0x5C7B 0x227EB
+0x5C7C 0x227E6
+0x5C7D 0x227F7
+0x5C7E 0x227F8
+0x5D21 0x227FC
+0x5D22 0x227FA
+0x5D23 0x227E0
+0x5D24 0x2F8AA
+0x5D25 0x227F6
+0x5D26 0x2F8A9
+0x5D27 0x227E1
+0x5D28 0x229EC
+0x5D29 0x229E2
+0x5D2A 0x229E4
+0x5D2B 0x229F9
+0x5D2C 0x22C6F
+0x5D2D 0x23A4C
+0x5D2E 0x22CBB
+0x5D2F 0x22CE1
+0x5D30 0x22D00
+0x5D31 0x22CD8
+0x5D33 0x22CD6
+0x5D34 0x22CE2
+0x5D35 0x22CC3
+0x5D36 0x22CB3
+0x5D37 0x22CD2
+0x5D38 0x2F8C1
+0x5D39 0x22CCE
+0x5D3A 0x22CD0
+0x5D3B 0x22CD5
+0x5D3C 0x22CB9
+0x5D3D 0x22CBA
+0x5D3E 0x22CCF
+0x5D3F 0x22CBD
+0x5D40 0x22EDB
+0x5D41 0x22FAA
+0x5D42 0x22FAD
+0x5D43 0x22FB8
+0x5D44 0x22FB6
+0x5D45 0x22FB5
+0x5D46 0x22FAF
+0x5D47 0x22FB4
+0x5D48 0x22FB7
+0x5D49 0x22FA8
+0x5D4A 0x22FB9
+0x5D4B 0x22FBE
+0x5D4C 0x23082
+0x5D4D 0x230BC
+0x5D4E 0x230B8
+0x5D4F 0x230B6
+0x5D50 0x230B9
+0x5D52 0x23110
+0x5D53 0x23227
+0x5D54 0x23269
+0x5D55 0x23270
+0x5D56 0x23256
+0x5D57 0x2326B
+0x5D58 0x2327A
+0x5D59 0x2326C
+0x5D5A 0x2326D
+0x5D5B 0x2F8D5
+0x5D5C 0x267C1
+0x5D5D 0x2338D
+0x5D5E 0x23390
+0x5D5F 0x235B6
+0x5D60 0x23610
+0x5D61 0x23612
+0x5D62 0x235BA
+0x5D63 0x235BD
+0x5D64 0x23605
+0x5D65 0x235C2
+0x5D66 0x23607
+0x5D67 0x235F5
+0x5D68 0x2F8E9
+0x5D69 0x235AF
+0x5D6A 0x235F4
+0x5D6B 0x235F7
+0x5D6C 0x235F8
+0x5D6D 0x23611
+0x5D6E 0x238F6
+0x5D6F 0x238F5
+0x5D70 0x238FB
+0x5D71 0x23901
+0x5D72 0x23900
+0x5D73 0x23902
+0x5D74 0x238FE
+0x5D75 0x238FA
+0x5D76 0x238FD
+0x5D78 0x23A37
+0x5D79 0x23A49
+0x5D7A 0x23A4B
+0x5D7B 0x23A46
+0x5D7C 0x23A47
+0x5D7D 0x23AB3
+0x5D7E 0x23AB2
+0x5E21 0x23AB0
+0x5E22 0x23AB7
+0x5E23 0x23B11
+0x5E24 0x23BCC
+0x5E25 0x23BDF
+0x5E26 0x23BD3
+0x5E27 0x23BD5
+0x5E28 0x23BDB
+0x5E29 0x23BC5
+0x5E2A 0x23BC8
+0x5E2B 0x23BC9
+0x5E2C 0x23BE2
+0x5E2D 0x23BCA
+0x5E2E 0x23BD1
+0x5E2F 0x23BD2
+0x5E30 0x23BDD
+0x5E31 0x23E6C
+0x5E32 0x23E73
+0x5E33 0x23F21
+0x5E34 0x23EF0
+0x5E35 0x23F1F
+0x5E36 0x23F3B
+0x5E37 0x23F22
+0x5E38 0x23F23
+0x5E39 0x23EE8
+0x5E3A 0x23EDD
+0x5E3C 0x23F1B
+0x5E3D 0x23EED
+0x5E3E 0x2F90E
+0x5E3F 0x23EF2
+0x5E41 0x23EDC
+0x5E42 0x23EE9
+0x5E43 0x23F1D
+0x5E44 0x23EDA
+0x5E45 0x23EE6
+0x5E46 0x24313
+0x5E47 0x24315
+0x5E48 0x24316
+0x5E49 0x2433C
+0x5E4A 0x2430B
+0x5E4B 0x2431C
+0x5E4C 0x2433A
+0x5E4D 0x2433D
+0x5E4E 0x2439A
+0x5E4F 0x2431D
+0x5E50 0x24309
+0x5E51 0x24308
+0x5E52 0x2433B
+0x5E53 0x24522
+0x5E54 0x24526
+0x5E55 0x24525
+0x5E56 0x24524
+0x5E57 0x2039B
+0x5E58 0x2458F
+0x5E59 0x24590
+0x5E5A 0x245E6
+0x5E5B 0x245E3
+0x5E5C 0x245E5
+0x5E5D 0x24611
+0x5E5E 0x2F925
+0x5E5F 0x246AE
+0x5E60 0x246BE
+0x5E61 0x246B4
+0x5E62 0x246B3
+0x5E63 0x246AF
+0x5E64 0x24691
+0x5E65 0x246C2
+0x5E66 0x246B6
+0x5E67 0x246B2
+0x5E68 0x24857
+0x5E69 0x2483B
+0x5E6A 0x24858
+0x5E6B 0x24851
+0x5E6C 0x24841
+0x5E6D 0x24839
+0x5E6F 0x24859
+0x5E70 0x24845
+0x5E71 0x24861
+0x5E72 0x248E8
+0x5E73 0x249FA
+0x5E74 0x249EA
+0x5E75 0x249EF
+0x5E76 0x249F2
+0x5E77 0x249F0
+0x5E78 0x24B08
+0x5E79 0x24B70
+0x5E7A 0x24B6A
+0x5E7B 0x24B73
+0x5E7C 0x24B68
+0x5E7D 0x24BC8
+0x5E7E 0x24BF2
+0x5F21 0x20B7B
+0x5F22 0x24CAE
+0x5F23 0x24CAB
+0x5F24 0x24CB5
+0x5F25 0x24CAF
+0x5F26 0x24CB2
+0x5F27 0x24CB6
+0x5F28 0x24CB0
+0x5F29 0x24D1E
+0x5F2A 0x24E03
+0x5F2B 0x24E06
+0x5F2C 0x24E1F
+0x5F2E 0x24E0F
+0x5F2F 0x24E02
+0x5F30 0x24E19
+0x5F31 0x24E18
+0x5F32 0x24E22
+0x5F33 0x24E15
+0x5F34 0x24E07
+0x5F35 0x24E0D
+0x5F36 0x24E24
+0x5F37 0x24E0C
+0x5F38 0x24E1E
+0x5F39 0x24F89
+0x5F3A 0x24F8A
+0x5F3B 0x2500A
+0x5F3C 0x2500B
+0x5F3D 0x25007
+0x5F3E 0x25004
+0x5F3F 0x25009
+0x5F40 0x25084
+0x5F41 0x25083
+0x5F42 0x25218
+0x5F43 0x25214
+0x5F44 0x25205
+0x5F45 0x25216
+0x5F46 0x2520E
+0x5F47 0x25211
+0x5F48 0x25208
+0x5F49 0x2520B
+0x5F4A 0x25215
+0x5F4B 0x25085
+0x5F4C 0x25237
+0x5F4D 0x2522A
+0x5F4E 0x2520D
+0x5F4F 0x2520F
+0x5F50 0x2537E
+0x5F51 0x25376
+0x5F52 0x25377
+0x5F53 0x253EC
+0x5F54 0x254FC
+0x5F55 0x25508
+0x5F56 0x254FF
+0x5F57 0x25503
+0x5F58 0x25510
+0x5F59 0x25505
+0x5F5A 0x25506
+0x5F5B 0x254FA
+0x5F5C 0x256C7
+0x5F5D 0x256C0
+0x5F5E 0x256C3
+0x5F5F 0x256A7
+0x5F60 0x256A8
+0x5F61 0x256AB
+0x5F62 0x256C1
+0x5F63 0x256AA
+0x5F64 0x256C8
+0x5F65 0x25743
+0x5F66 0x25802
+0x5F67 0x2580E
+0x5F68 0x25801
+0x5F69 0x257FE
+0x5F6A 0x25803
+0x5F6C 0x25822
+0x5F6D 0x25821
+0x5F6E 0x25807
+0x5F6F 0x25808
+0x5F70 0x2580C
+0x5F71 0x259CA
+0x5F72 0x259BC
+0x5F73 0x259BE
+0x5F74 0x259BD
+0x5F75 0x2F95C
+0x5F76 0x259BB
+0x5F77 0x259B9
+0x5F79 0x259C5
+0x5F7A 0x25A99
+0x5F7B 0x25B6B
+0x5F7C 0x25B93
+0x5F7D 0x25B94
+0x5F7E 0x25BA9
+0x6021 0x25BA0
+0x6022 0x25BA6
+0x6023 0x2F961
+0x6024 0x25BAB
+0x6025 0x25B9E
+0x6026 0x25B9B
+0x6027 0x25B91
+0x6028 0x25B99
+0x6029 0x25EB6
+0x602A 0x25EB8
+0x602B 0x25E9A
+0x602D 0x25E98
+0x602E 0x25E9B
+0x602F 0x25EB3
+0x6030 0x25EA2
+0x6031 0x222AA
+0x6032 0x25EA0
+0x6033 0x25E9F
+0x6034 0x2605B
+0x6035 0x26070
+0x6036 0x26054
+0x6037 0x26071
+0x6038 0x26065
+0x6039 0x26051
+0x603A 0x2609D
+0x603B 0x26061
+0x603C 0x2605A
+0x603D 0x26074
+0x603E 0x2604C
+0x603F 0x2604B
+0x6040 0x2605E
+0x6041 0x26058
+0x6042 0x26053
+0x6043 0x26052
+0x6044 0x2623B
+0x6045 0x26239
+0x6046 0x262D6
+0x6047 0x262E7
+0x6048 0x262D7
+0x6049 0x262D8
+0x604A 0x262D9
+0x604B 0x262DA
+0x604C 0x262DB
+0x604D 0x262DC
+0x604E 0x262E0
+0x604F 0x262E4
+0x6050 0x262DD
+0x6051 0x262F5
+0x6052 0x262F1
+0x6053 0x26398
+0x6054 0x2639D
+0x6055 0x26399
+0x6056 0x26450
+0x6057 0x26449
+0x6059 0x26462
+0x605A 0x264D7
+0x605B 0x26501
+0x605C 0x264F7
+0x605D 0x2F97D
+0x605E 0x2658C
+0x605F 0x2659C
+0x6061 0x2661F
+0x6062 0x2661E
+0x6063 0x2673D
+0x6064 0x2673F
+0x6065 0x26711
+0x6066 0x26759
+0x6067 0x2673E
+0x6068 0x26758
+0x6069 0x26800
+0x606A 0x2679E
+0x606B 0x267B6
+0x606C 0x267AA
+0x606D 0x267AF
+0x606E 0x267AC
+0x6070 0x267C0
+0x6071 0x267A9
+0x6072 0x20B10
+0x6073 0x268EE
+0x6074 0x26977
+0x6075 0x26979
+0x6076 0x2697A
+0x6077 0x2697D
+0x6078 0x2697F
+0x6079 0x26983
+0x607A 0x26978
+0x607B 0x2697E
+0x607C 0x269E4
+0x607D 0x269E6
+0x607E 0x269E5
+0x6122 0x26A4E
+0x6123 0x26A59
+0x6125 0x2F98E
+0x6126 0x26A4F
+0x6127 0x26A4A
+0x6128 0x26AE3
+0x6129 0x26ADE
+0x612A 0x26AE2
+0x612B 0x26C74
+0x612C 0x26CAC
+0x612D 0x26C61
+0x612E 0x26C62
+0x612F 0x26C76
+0x6130 0x26C7A
+0x6131 0x26C79
+0x6132 0x26C60
+0x6133 0x26D64
+0x6134 0x26E81
+0x6135 0x26DDF
+0x6136 0x26D84
+0x6137 0x26D8A
+0x6138 0x26D92
+0x6139 0x26D79
+0x613A 0x26DDE
+0x613B 0x26D98
+0x613C 0x26D6C
+0x613D 0x26DE1
+0x613E 0x2F9A5
+0x613F 0x26D7C
+0x6140 0x26D72
+0x6141 0x26D81
+0x6142 0x26DE0
+0x6143 0x26D65
+0x6145 0x26D6A
+0x6146 0x26D97
+0x6147 0x26DAA
+0x6148 0x26DD3
+0x6149 0x26DAB
+0x614A 0x26D6E
+0x614B 0x26DAC
+0x614C 0x26D76
+0x614D 0x26D7B
+0x614E 0x26DAD
+0x614F 0x2F9A6
+0x6150 0x26D94
+0x6151 0x26DD7
+0x6152 0x26D70
+0x6153 0x26DD5
+0x6154 0x26DF1
+0x6155 0x26D7A
+0x6156 0x26D68
+0x6157 0x26D96
+0x6159 0x26D73
+0x615A 0x26DAE
+0x615B 0x26DDD
+0x615C 0x26DDA
+0x615D 0x26DAF
+0x615E 0x26DB0
+0x615F 0x26DDB
+0x6160 0x26D62
+0x6161 0x26DF8
+0x6162 0x271C2
+0x6163 0x271C7
+0x6164 0x271C8
+0x6165 0x271C5
+0x6166 0x271C3
+0x6167 0x271C6
+0x6168 0x272DE
+0x616A 0x27311
+0x616B 0x27315
+0x616C 0x27328
+0x616D 0x27321
+0x616E 0x2732D
+0x616F 0x27351
+0x6170 0x2732B
+0x6171 0x27316
+0x6172 0x27324
+0x6173 0x27335
+0x6174 0x2731F
+0x6175 0x27312
+0x6176 0x27310
+0x6177 0x27380
+0x6178 0x2733B
+0x6179 0x27329
+0x617A 0x2732A
+0x617B 0x2731B
+0x617C 0x27318
+0x617D 0x27320
+0x617E 0x2733F
+0x6221 0x2731C
+0x6222 0x27326
+0x6223 0x2730B
+0x6224 0x275BE
+0x6225 0x275C4
+0x6226 0x275BD
+0x6227 0x275FA
+0x6228 0x275FB
+0x6229 0x276B1
+0x622A 0x276B2
+0x622B 0x276B0
+0x622C 0x276B9
+0x622D 0x276A6
+0x622E 0x276BD
+0x622F 0x276B6
+0x6230 0x276B8
+0x6231 0x276B4
+0x6232 0x276B3
+0x6233 0x276A7
+0x6234 0x276AE
+0x6235 0x276BC
+0x6236 0x277F2
+0x6237 0x277F3
+0x6238 0x277F4
+0x6239 0x2783B
+0x623A 0x27840
+0x623B 0x27846
+0x623C 0x278F0
+0x623D 0x278EE
+0x623E 0x278E8
+0x623F 0x278F1
+0x6240 0x278EB
+0x6241 0x278EF
+0x6242 0x279FC
+0x6243 0x27A20
+0x6244 0x27A09
+0x6245 0x27A06
+0x6246 0x27A03
+0x6247 0x2F9CF
+0x6248 0x27A19
+0x6249 0x27A24
+0x624A 0x27A1B
+0x624B 0x27A1D
+0x624C 0x279FD
+0x624D 0x27A1E
+0x624E 0x279F4
+0x624F 0x27A01
+0x6250 0x27A08
+0x6251 0x27A05
+0x6252 0x27A23
+0x6253 0x279FF
+0x6254 0x27BEA
+0x6255 0x27C4D
+0x6256 0x27C4E
+0x6257 0x27C56
+0x6258 0x27C57
+0x6259 0x27C51
+0x625A 0x27C55
+0x625B 0x27C54
+0x625C 0x27CCB
+0x625D 0x27CD4
+0x625E 0x27CD1
+0x625F 0x27CCF
+0x6260 0x27CD2
+0x6261 0x27CCA
+0x6262 0x27CD6
+0x6263 0x27D8B
+0x6264 0x27D88
+0x6265 0x27D85
+0x6266 0x27D89
+0x6267 0x21A9B
+0x6268 0x27DBB
+0x6269 0x27D8C
+0x626B 0x27D99
+0x626C 0x27D8A
+0x626D 0x27EEC
+0x626E 0x27EEF
+0x626F 0x27EF9
+0x6270 0x27F09
+0x6271 0x27EF8
+0x6272 0x27EF3
+0x6273 0x27F00
+0x6274 0x27F1D
+0x6276 0x27EFD
+0x6277 0x28048
+0x6278 0x2805C
+0x6279 0x28055
+0x627A 0x2805E
+0x627B 0x28049
+0x627C 0x28063
+0x627D 0x28060
+0x627E 0x28053
+0x6321 0x28062
+0x6322 0x28040
+0x6323 0x28249
+0x6324 0x2824A
+0x6325 0x2824C
+0x6326 0x2824D
+0x6327 0x2830A
+0x6328 0x28306
+0x6329 0x2832F
+0x632A 0x28321
+0x632B 0x28307
+0x632C 0x28309
+0x632D 0x28302
+0x632E 0x28316
+0x632F 0x28303
+0x6330 0x2830B
+0x6331 0x2830F
+0x6332 0x28560
+0x6333 0x28568
+0x6334 0x2855E
+0x6335 0x2855D
+0x6336 0x28563
+0x6337 0x2855F
+0x6338 0x28564
+0x6339 0x28578
+0x633A 0x28561
+0x633B 0x28569
+0x633C 0x28565
+0x633D 0x286DA
+0x633E 0x286E6
+0x633F 0x286DB
+0x6340 0x286DC
+0x6341 0x28739
+0x6342 0x28757
+0x6343 0x28755
+0x6344 0x28765
+0x6345 0x28761
+0x6346 0x28754
+0x6347 0x28845
+0x6348 0x28841
+0x6349 0x2883E
+0x634A 0x28837
+0x634B 0x28912
+0x634C 0x28913
+0x634D 0x2892C
+0x634E 0x28996
+0x634F 0x2F9E9
+0x6350 0x2899C
+0x6351 0x2899D
+0x6352 0x28985
+0x6353 0x2F9E8
+0x6354 0x2899F
+0x6355 0x289A3
+0x6356 0x28C82
+0x6357 0x28C83
+0x6358 0x2F9EE
+0x6359 0x28D1D
+0x635A 0x28D14
+0x635B 0x28D1F
+0x635C 0x28D20
+0x635D 0x28E47
+0x635E 0x28E80
+0x635F 0x28EC9
+0x6360 0x28EF9
+0x6361 0x28F06
+0x6362 0x28EF0
+0x6363 0x28EF8
+0x6364 0x28EEF
+0x6365 0x28EFD
+0x6366 0x28EF1
+0x6367 0x28EFE
+0x6368 0x28FB8
+0x6369 0x28FC0
+0x636A 0x28FC3
+0x636B 0x28FB5
+0x636C 0x28FB6
+0x636D 0x28FC9
+0x636E 0x2F9F3
+0x636F 0x28FBD
+0x6370 0x28FBA
+0x6371 0x28FBF
+0x6372 0x28FB3
+0x6373 0x28FC6
+0x6374 0x28FB2
+0x6375 0x28FBC
+0x6376 0x28FB7
+0x6377 0x28FB9
+0x6378 0x28FC8
+0x6379 0x290B5
+0x637A 0x290B3
+0x637C 0x290AC
+0x637D 0x290A9
+0x637E 0x290AD
+0x6421 0x29211
+0x6422 0x2920D
+0x6423 0x29216
+0x6424 0x29289
+0x6425 0x2927C
+0x6426 0x2928B
+0x6427 0x2927B
+0x6428 0x29288
+0x6429 0x29284
+0x642A 0x2939D
+0x642B 0x29398
+0x642C 0x29488
+0x642D 0x29486
+0x642E 0x29482
+0x642F 0x2948B
+0x6430 0x2F9FF
+0x6431 0x29471
+0x6432 0x29472
+0x6433 0x29481
+0x6434 0x2948C
+0x6435 0x29480
+0x6436 0x29489
+0x6437 0x295BB
+0x6438 0x295C1
+0x6439 0x295BE
+0x643A 0x2FA01
+0x643B 0x295BD
+0x643C 0x296C1
+0x643D 0x296B4
+0x643E 0x296B7
+0x643F 0x296C8
+0x6441 0x296D3
+0x6442 0x296D0
+0x6443 0x296B0
+0x6444 0x296CA
+0x6445 0x296CD
+0x6446 0x29815
+0x6447 0x29819
+0x6448 0x29817
+0x6449 0x2983F
+0x644A 0x29840
+0x644B 0x29844
+0x644C 0x2987C
+0x644D 0x29878
+0x644E 0x29879
+0x644F 0x29888
+0x6450 0x2FA06
+0x6451 0x29889
+0x6452 0x2987D
+0x6453 0x29A23
+0x6454 0x29A24
+0x6455 0x29A26
+0x6456 0x29A22
+0x6457 0x29A27
+0x6458 0x29A1F
+0x6459 0x29AC9
+0x645A 0x29AC3
+0x645B 0x29B0A
+0x645C 0x29B0B
+0x645D 0x29B04
+0x645F 0x29B03
+0x6460 0x29B01
+0x6461 0x29B09
+0x6462 0x29C0F
+0x6463 0x29C2E
+0x6464 0x29C2D
+0x6465 0x29C91
+0x6466 0x29C99
+0x6467 0x29C9E
+0x6468 0x29C90
+0x6469 0x29C94
+0x646A 0x29C9D
+0x646B 0x29C98
+0x646C 0x29C9B
+0x646D 0x29C9C
+0x646E 0x29C9A
+0x646F 0x29D54
+0x6470 0x29F9D
+0x6471 0x29F9F
+0x6472 0x29FA3
+0x6473 0x29FA4
+0x6474 0x29FA5
+0x6475 0x2A302
+0x6476 0x2A417
+0x6477 0x2A41B
+0x6478 0x2A419
+0x6479 0x2A4D1
+0x647A 0x21537
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,6388 @@
+0x2121 0x20055
+0x2122 0x20182
+0x2123 0x20189
+0x2124 0x20187
+0x2125 0x203BE
+0x2126 0x203BD
+0x2127 0x203CA
+0x2128 0x203D4
+0x2129 0x203BC
+0x212A 0x203C4
+0x212B 0x203C1
+0x212C 0x203C2
+0x212D 0x203D7
+0x212E 0x20370
+0x212F 0x203BA
+0x2130 0x203E3
+0x2131 0x203BB
+0x2132 0x204B1
+0x2133 0x204B6
+0x2134 0x204B0
+0x2135 0x2056C
+0x2136 0x2060D
+0x2137 0x20607
+0x2138 0x207F1
+0x2139 0x207F5
+0x213A 0x207ED
+0x213B 0x207EF
+0x213C 0x207EB
+0x213D 0x207EC
+0x213E 0x207EE
+0x213F 0x20807
+0x2140 0x209C4
+0x2141 0x20A08
+0x2142 0x20AB3
+0x2143 0x20AAD
+0x2144 0x20AB0
+0x2145 0x20B11
+0x2146 0x2018A
+0x2147 0x20F83
+0x2148 0x20F7A
+0x2149 0x20F82
+0x214A 0x20F68
+0x214B 0x20F71
+0x214C 0x20FB0
+0x214D 0x20FAF
+0x214F 0x20F6C
+0x2150 0x20F6F
+0x2151 0x20F62
+0x2152 0x20F65
+0x2153 0x20F81
+0x2154 0x20F7F
+0x2155 0x20F64
+0x2156 0x20F73
+0x2157 0x20F6E
+0x2158 0x20F67
+0x2159 0x20F74
+0x215A 0x20F7D
+0x215B 0x20F78
+0x215C 0x20F85
+0x215D 0x20FAA
+0x215E 0x20F88
+0x215F 0x20FA6
+0x2160 0x2F84E
+0x2161 0x20F8A
+0x2162 0x20F84
+0x2164 0x21224
+0x2165 0x21222
+0x2166 0x21223
+0x2167 0x21432
+0x2168 0x2145B
+0x2169 0x2144F
+0x216B 0x21426
+0x216C 0x2143E
+0x216D 0x21442
+0x216E 0x21447
+0x216F 0x21422
+0x2170 0x2069B
+0x2171 0x2144A
+0x2172 0x2141F
+0x2173 0x21449
+0x2174 0x2142B
+0x2175 0x21433
+0x2176 0x2F858
+0x2177 0x2142A
+0x2178 0x21428
+0x2179 0x2153D
+0x217A 0x2153C
+0x217B 0x215BF
+0x217C 0x21679
+0x217D 0x21680
+0x217E 0x2167C
+0x2221 0x2167A
+0x2222 0x21678
+0x2223 0x21882
+0x2224 0x2185C
+0x2225 0x2185A
+0x2226 0x2184B
+0x2227 0x2187C
+0x2228 0x2187F
+0x2229 0x2181F
+0x222A 0x21889
+0x222B 0x2188B
+0x222C 0x21857
+0x222D 0x2187E
+0x222E 0x2187D
+0x222F 0x21853
+0x2230 0x21A9F
+0x2231 0x21ABC
+0x2232 0x21AA5
+0x2233 0x21A86
+0x2234 0x21ADC
+0x2235 0x21AA4
+0x2236 0x21AB6
+0x2237 0x21AA2
+0x2238 0x21AB4
+0x2239 0x21B48
+0x223A 0x21B46
+0x223B 0x21BA7
+0x223C 0x21C14
+0x223D 0x21C12
+0x223E 0x21C11
+0x223F 0x21CE1
+0x2240 0x21CD0
+0x2241 0x21D26
+0x2242 0x21D28
+0x2243 0x21D29
+0x2244 0x21F2F
+0x2245 0x21F0D
+0x2246 0x21F25
+0x2247 0x21F14
+0x2248 0x21F3C
+0x2249 0x21F0B
+0x224A 0x21F11
+0x224B 0x21F30
+0x224C 0x21F18
+0x224D 0x21F19
+0x224E 0x21F36
+0x224F 0x21F17
+0x2250 0x21F10
+0x2251 0x21F15
+0x2252 0x22003
+0x2253 0x22029
+0x2254 0x2204C
+0x2255 0x2213F
+0x2256 0x2213E
+0x2257 0x22134
+0x2258 0x22142
+0x2259 0x22135
+0x225A 0x207F3
+0x225B 0x221CD
+0x225C 0x221D1
+0x225D 0x221D2
+0x225E 0x222AD
+0x225F 0x222BA
+0x2260 0x222C1
+0x2261 0x222BB
+0x2262 0x222B4
+0x2263 0x222BC
+0x2264 0x2236C
+0x2265 0x22392
+0x2266 0x22421
+0x2267 0x22424
+0x2268 0x23F19
+0x2269 0x224AD
+0x226A 0x224AE
+0x226B 0x224AB
+0x226C 0x224AC
+0x226D 0x22570
+0x226E 0x22576
+0x226F 0x22571
+0x2270 0x22577
+0x2272 0x227EC
+0x2273 0x2281C
+0x2274 0x227FB
+0x2275 0x227EE
+0x2276 0x228E2
+0x2277 0x227FD
+0x2278 0x2281E
+0x2279 0x2283B
+0x227A 0x2284A
+0x227B 0x2F8AE
+0x227D 0x2287D
+0x227E 0x22856
+0x2321 0x22844
+0x2322 0x2284B
+0x2323 0x229FA
+0x2324 0x229E8
+0x2325 0x229F8
+0x2326 0x229FF
+0x2327 0x229F7
+0x2328 0x229F6
+0x2329 0x229FE
+0x232A 0x22A07
+0x232B 0x22A5D
+0x232C 0x22CD4
+0x232D 0x2F8C3
+0x232E 0x22CC8
+0x232F 0x22CC5
+0x2330 0x2F8C0
+0x2331 0x22CC9
+0x2332 0x22D4D
+0x2333 0x22D20
+0x2334 0x22D36
+0x2335 0x22D35
+0x2336 0x22D88
+0x2337 0x22D25
+0x2338 0x22D21
+0x2339 0x22D26
+0x233B 0x22D3F
+0x233C 0x22D3B
+0x233D 0x22D24
+0x233E 0x22D43
+0x233F 0x22D4E
+0x2340 0x22D4F
+0x2341 0x22D44
+0x2342 0x22D40
+0x2343 0x22D41
+0x2344 0x22D39
+0x2345 0x22D2B
+0x2346 0x22EDD
+0x2347 0x22EDE
+0x2348 0x22FCD
+0x2349 0x22FCB
+0x234A 0x22FDB
+0x234B 0x22FD8
+0x234C 0x22FD9
+0x234D 0x22FD2
+0x234E 0x22FCA
+0x234F 0x22FD1
+0x2350 0x22FD4
+0x2351 0x22FF9
+0x2352 0x22FD0
+0x2353 0x2305E
+0x2354 0x2305D
+0x2355 0x2308A
+0x2356 0x23114
+0x2357 0x23283
+0x2358 0x23284
+0x2359 0x2329B
+0x235A 0x23282
+0x235B 0x2327D
+0x235C 0x2327C
+0x235D 0x23299
+0x235E 0x2327E
+0x235F 0x2329A
+0x2360 0x23295
+0x2361 0x2327B
+0x2362 0x23286
+0x2363 0x23348
+0x2364 0x23392
+0x2365 0x235B2
+0x2366 0x23642
+0x2367 0x23672
+0x2368 0x23615
+0x2369 0x23630
+0x236A 0x23643
+0x236B 0x2365B
+0x236C 0x2361D
+0x236D 0x23673
+0x236E 0x2362D
+0x2370 0x23621
+0x2371 0x2361C
+0x2372 0x2F8EA
+0x2373 0x23629
+0x2374 0x2361E
+0x2375 0x23633
+0x2376 0x23910
+0x2377 0x2390E
+0x2378 0x2F8F1
+0x2379 0x2390D
+0x237A 0x23911
+0x237B 0x23912
+0x237C 0x23917
+0x237D 0x23909
+0x237E 0x2390F
+0x2421 0x23998
+0x2422 0x23994
+0x2423 0x23996
+0x2424 0x23999
+0x2425 0x23995
+0x2426 0x23997
+0x2427 0x23A50
+0x2428 0x23A52
+0x2429 0x23A4D
+0x242A 0x23A57
+0x242B 0x23A53
+0x242C 0x23A56
+0x242D 0x23AB8
+0x242E 0x23B12
+0x242F 0x23BF1
+0x2430 0x23BF0
+0x2431 0x23BEE
+0x2432 0x23BEF
+0x2433 0x23BE5
+0x2434 0x23BEB
+0x2435 0x23BE7
+0x2436 0x23BF2
+0x2437 0x23BE6
+0x2438 0x23BF7
+0x2439 0x23C09
+0x243A 0x23C6B
+0x243B 0x23C6A
+0x243C 0x23E79
+0x243D 0x23ECD
+0x243E 0x23EEF
+0x243F 0x23EE4
+0x2440 0x23EE3
+0x2441 0x23F6C
+0x2442 0x23F67
+0x2443 0x23F62
+0x2444 0x23F58
+0x2445 0x23F69
+0x2446 0x23FAB
+0x2447 0x23F57
+0x2448 0x23FAD
+0x2449 0x23F54
+0x244A 0x23FAE
+0x244B 0x23F76
+0x244C 0x23F49
+0x244D 0x23F45
+0x244E 0x23F4F
+0x244F 0x2F90F
+0x2450 0x23F50
+0x2451 0x23F7D
+0x2452 0x23F44
+0x2453 0x23F66
+0x2454 0x23F48
+0x2455 0x23FA3
+0x2456 0x23F51
+0x2457 0x23F53
+0x2458 0x2F910
+0x2459 0x23F60
+0x245A 0x23F47
+0x245B 0x23F5E
+0x245C 0x23F85
+0x245D 0x23FAC
+0x245E 0x23F6D
+0x245F 0x23F75
+0x2460 0x23FA8
+0x2462 0x23F43
+0x2463 0x23F4E
+0x2464 0x23F5C
+0x2465 0x23F56
+0x2466 0x23F6E
+0x2467 0x23F63
+0x2468 0x23F6A
+0x2469 0x24356
+0x246A 0x24312
+0x246B 0x2435C
+0x246C 0x24358
+0x246D 0x24355
+0x246E 0x2437E
+0x246F 0x243A8
+0x2470 0x24311
+0x2471 0x24359
+0x2472 0x2435A
+0x2473 0x24367
+0x2474 0x24354
+0x2475 0x2435B
+0x2476 0x243F0
+0x2477 0x24529
+0x2478 0x2452C
+0x2479 0x2452A
+0x247A 0x24527
+0x247B 0x24567
+0x247C 0x24568
+0x247D 0x24593
+0x247E 0x24595
+0x2521 0x2459A
+0x2522 0x245EE
+0x2523 0x245F1
+0x2524 0x245ED
+0x2525 0x245E9
+0x2526 0x246CB
+0x2527 0x246DF
+0x2528 0x246DB
+0x2529 0x2483C
+0x252A 0x2484E
+0x252B 0x2486C
+0x252C 0x2487B
+0x252D 0x2487C
+0x252E 0x24883
+0x252F 0x2486B
+0x2530 0x24866
+0x2531 0x24863
+0x2532 0x248A0
+0x2533 0x24885
+0x2534 0x24868
+0x2535 0x248A2
+0x2536 0x249EC
+0x2538 0x249E7
+0x2539 0x24A10
+0x253A 0x24A18
+0x253B 0x24A3A
+0x253C 0x24A1A
+0x253D 0x24A38
+0x253E 0x24A41
+0x253F 0x24A1B
+0x2540 0x24A14
+0x2541 0x24A1C
+0x2542 0x24A1D
+0x2543 0x24B12
+0x2544 0x24B0D
+0x2545 0x24B07
+0x2546 0x24B7E
+0x2547 0x24B7F
+0x2548 0x20AB9
+0x2549 0x24B80
+0x254A 0x24B7A
+0x254B 0x24BF3
+0x254C 0x24CB9
+0x254D 0x24CBB
+0x254E 0x24CBA
+0x254F 0x24CBD
+0x2550 0x24CB7
+0x2551 0x24CBF
+0x2552 0x24D21
+0x2553 0x24E3A
+0x2554 0x24E3D
+0x2555 0x24E36
+0x2556 0x24E49
+0x2557 0x24E81
+0x2559 0x24E3F
+0x255A 0x24E4D
+0x255B 0x24E3E
+0x255D 0x24E30
+0x255E 0x24E4F
+0x255F 0x24F37
+0x2560 0x24F98
+0x2561 0x24F99
+0x2562 0x25011
+0x2563 0x2500D
+0x2564 0x25088
+0x2565 0x2508A
+0x2566 0x2521C
+0x2567 0x25255
+0x2568 0x25256
+0x2569 0x25262
+0x256A 0x25257
+0x256B 0x25242
+0x256C 0x25210
+0x256D 0x2524D
+0x256E 0x2525A
+0x256F 0x25266
+0x2570 0x25246
+0x2571 0x2287E
+0x2572 0x2524F
+0x2573 0x262F9
+0x2574 0x25387
+0x2575 0x25384
+0x2576 0x253F4
+0x2577 0x253F5
+0x2578 0x253F2
+0x2579 0x253F7
+0x257A 0x25545
+0x257B 0x2F950
+0x257C 0x25549
+0x257D 0x25535
+0x257E 0x254FD
+0x2621 0x25530
+0x2622 0x25543
+0x2623 0x25546
+0x2625 0x25533
+0x2626 0x256C6
+0x2627 0x2F956
+0x2628 0x256D4
+0x2629 0x271D8
+0x262A 0x256E0
+0x262B 0x20FA7
+0x262C 0x25744
+0x262D 0x20398
+0x262E 0x25854
+0x262F 0x2583E
+0x2630 0x25835
+0x2631 0x2583A
+0x2633 0x25834
+0x2634 0x25839
+0x2635 0x25846
+0x2636 0x2585A
+0x2637 0x2585B
+0x2638 0x2583C
+0x2639 0x259DC
+0x263A 0x259D6
+0x263B 0x259D0
+0x263C 0x2F95E
+0x263D 0x25AAC
+0x263E 0x2F95D
+0x263F 0x25AA5
+0x2640 0x25BF4
+0x2641 0x25C24
+0x2642 0x25BE0
+0x2643 0x25BFD
+0x2644 0x25BF2
+0x2645 0x25BFC
+0x2646 0x25C02
+0x2647 0x25BF1
+0x2648 0x25BFF
+0x2649 0x25BD2
+0x264A 0x25BD8
+0x264B 0x25BD3
+0x264C 0x25BF9
+0x264D 0x2F963
+0x264E 0x25BED
+0x264F 0x25BF7
+0x2650 0x25BF0
+0x2651 0x25BD7
+0x2652 0x25C09
+0x2653 0x25BF5
+0x2654 0x25EC2
+0x2655 0x25EC5
+0x2656 0x25ECF
+0x2658 0x25EC1
+0x2659 0x25EC6
+0x265A 0x25ED4
+0x265B 0x25ECE
+0x265C 0x2609B
+0x265D 0x26099
+0x265E 0x2608F
+0x265F 0x260B7
+0x2660 0x26082
+0x2661 0x26093
+0x2662 0x260B4
+0x2663 0x260C1
+0x2664 0x26090
+0x2665 0x2609A
+0x2666 0x26094
+0x2667 0x2609C
+0x2668 0x260B5
+0x2669 0x2F96F
+0x266A 0x2F96E
+0x266B 0x2609F
+0x266C 0x2608E
+0x266D 0x2609E
+0x266E 0x2623C
+0x266F 0x26247
+0x2670 0x26241
+0x2671 0x262EB
+0x2672 0x262EC
+0x2673 0x262ED
+0x2674 0x262EE
+0x2675 0x262DF
+0x2676 0x262F2
+0x2677 0x2630D
+0x2678 0x2630E
+0x2679 0x20186
+0x267A 0x263A9
+0x267B 0x263A4
+0x267C 0x263A5
+0x267D 0x2645F
+0x267E 0x2645A
+0x2721 0x26466
+0x2722 0x26468
+0x2723 0x2646A
+0x2724 0x26464
+0x2725 0x26465
+0x2726 0x264C1
+0x2727 0x264D8
+0x2728 0x2F97B
+0x2729 0x264D9
+0x272A 0x26509
+0x272B 0x265AA
+0x272C 0x265A3
+0x272D 0x265B9
+0x272E 0x259E2
+0x272F 0x265A5
+0x2730 0x265AB
+0x2731 0x26620
+0x2732 0x26789
+0x2733 0x2678B
+0x2734 0x267DB
+0x2735 0x267E4
+0x2736 0x267EF
+0x2737 0x267E2
+0x2738 0x267E9
+0x2739 0x267F0
+0x273A 0x267F3
+0x273B 0x267DD
+0x273C 0x2681E
+0x273D 0x2691D
+0x273E 0x26946
+0x273F 0x2697C
+0x2740 0x26980
+0x2741 0x26981
+0x2742 0x26982
+0x2743 0x26987
+0x2744 0x26988
+0x2745 0x2698A
+0x2746 0x2698C
+0x2747 0x269E7
+0x2748 0x269EB
+0x2749 0x269EA
+0x274A 0x26A68
+0x274B 0x26A6B
+0x274C 0x26A69
+0x274D 0x26A66
+0x274E 0x26A6A
+0x274F 0x26A65
+0x2750 0x26AE5
+0x2751 0x26AE4
+0x2752 0x26AE6
+0x2753 0x26D18
+0x2754 0x26E24
+0x2755 0x26E48
+0x2756 0x26E2F
+0x2757 0x26E7E
+0x2758 0x26D89
+0x2759 0x26E1E
+0x275A 0x26E49
+0x275B 0x26E26
+0x275C 0x26E09
+0x275D 0x26E34
+0x275E 0x26E2D
+0x275F 0x26E4A
+0x2760 0x26E15
+0x2761 0x2F9A9
+0x2762 0x26E33
+0x2763 0x26E28
+0x2764 0x26E27
+0x2765 0x26E20
+0x2766 0x26E2B
+0x2767 0x26E29
+0x2768 0x26E6A
+0x2769 0x26E0B
+0x276A 0x26E0E
+0x276B 0x26E1C
+0x276C 0x26DFF
+0x276D 0x2F9AA
+0x276E 0x26E35
+0x276F 0x26E11
+0x2770 0x26E4B
+0x2771 0x26E4C
+0x2772 0x26E1F
+0x2773 0x26E0F
+0x2774 0x26E39
+0x2775 0x26E68
+0x2776 0x26E1D
+0x2777 0x26E08
+0x2778 0x26E0C
+0x2779 0x26E0D
+0x277A 0x26E62
+0x277B 0x26EAF
+0x277C 0x26E32
+0x277D 0x26E2C
+0x277E 0x26E64
+0x2821 0x26E04
+0x2822 0x26E16
+0x2823 0x26E4D
+0x2824 0x26E07
+0x2825 0x26EAE
+0x2826 0x271D4
+0x2827 0x271D1
+0x2828 0x271D5
+0x2829 0x271D0
+0x282A 0x27371
+0x282B 0x2735D
+0x282C 0x2735B
+0x282D 0x2737A
+0x282E 0x2F9BD
+0x282F 0x2737F
+0x2830 0x27379
+0x2831 0x27367
+0x2832 0x2739E
+0x2833 0x27394
+0x2834 0x27364
+0x2835 0x2735E
+0x2836 0x27381
+0x2837 0x2735A
+0x2838 0x27357
+0x2839 0x2737C
+0x283A 0x27398
+0x283B 0x27366
+0x283C 0x2737E
+0x283D 0x27382
+0x283E 0x27368
+0x283F 0x2735F
+0x2840 0x27363
+0x2841 0x27397
+0x2843 0x27353
+0x2844 0x2737B
+0x2845 0x2737D
+0x2846 0x27378
+0x2847 0x27406
+0x2848 0x275C0
+0x2849 0x275C2
+0x284A 0x275C3
+0x284B 0x276DC
+0x284C 0x276E6
+0x284D 0x276EC
+0x284E 0x276F2
+0x284F 0x276E8
+0x2850 0x276EB
+0x2851 0x276EA
+0x2852 0x276E5
+0x2853 0x276E0
+0x2854 0x276D0
+0x2855 0x276D8
+0x2856 0x276D5
+0x2857 0x276D3
+0x2858 0x276E4
+0x2859 0x276F3
+0x285A 0x276DB
+0x285B 0x2772F
+0x285C 0x277F9
+0x285D 0x2785D
+0x285E 0x2785B
+0x285F 0x2784C
+0x2860 0x27858
+0x2861 0x27860
+0x2862 0x27853
+0x2863 0x27850
+0x2864 0x27907
+0x2865 0x27908
+0x2866 0x278F4
+0x2867 0x278F6
+0x2868 0x27904
+0x2869 0x278FD
+0x286A 0x27905
+0x286B 0x27A28
+0x286C 0x27A56
+0x286D 0x27A42
+0x286E 0x27A5C
+0x286F 0x27A3D
+0x2870 0x27A2F
+0x2871 0x27A2B
+0x2872 0x27A58
+0x2873 0x27A61
+0x2874 0x27A2C
+0x2875 0x27A51
+0x2876 0x27A50
+0x2877 0x27A3C
+0x2878 0x27A36
+0x287A 0x27A60
+0x287B 0x27A5B
+0x287C 0x27A2E
+0x287D 0x27A40
+0x287E 0x27A5F
+0x2921 0x27A26
+0x2922 0x27A2D
+0x2923 0x27A5E
+0x2924 0x27A3B
+0x2925 0x27BEF
+0x2926 0x27BF3
+0x2927 0x27BEE
+0x2928 0x27BED
+0x2929 0x27C5A
+0x292A 0x27C62
+0x292B 0x27C5B
+0x292C 0x27C5F
+0x292D 0x27C5E
+0x292E 0x27C64
+0x292F 0x27CE0
+0x2930 0x27CE1
+0x2931 0x27CE5
+0x2932 0x27DA5
+0x2933 0x27D9B
+0x2934 0x27D9F
+0x2935 0x27D9C
+0x2937 0x27DAA
+0x2938 0x27DA4
+0x2939 0x27DA3
+0x293A 0x27E67
+0x293B 0x27F26
+0x293C 0x27F1A
+0x293E 0x27F1C
+0x293F 0x27F15
+0x2940 0x27F1B
+0x2941 0x27F18
+0x2942 0x27F1E
+0x2943 0x27F25
+0x2944 0x2F9DC
+0x2945 0x2807B
+0x2946 0x28075
+0x2947 0x28093
+0x2948 0x2808F
+0x2949 0x2807C
+0x294A 0x2809B
+0x294B 0x28088
+0x294C 0x28091
+0x294D 0x2807E
+0x294F 0x28086
+0x2950 0x2825B
+0x2951 0x28254
+0x2952 0x28335
+0x2953 0x28340
+0x2954 0x28337
+0x2955 0x28329
+0x2956 0x28326
+0x2957 0x28323
+0x2958 0x28330
+0x2959 0x28320
+0x295A 0x28328
+0x295B 0x28332
+0x295C 0x2832A
+0x295D 0x28331
+0x295E 0x28324
+0x295F 0x28341
+0x2960 0x28342
+0x2961 0x28343
+0x2962 0x28325
+0x2963 0x28338
+0x2964 0x2841C
+0x2965 0x2841D
+0x2966 0x2841E
+0x2967 0x284F6
+0x2968 0x285A5
+0x2969 0x28589
+0x296A 0x2859D
+0x296B 0x2858A
+0x296C 0x28587
+0x296D 0x285AB
+0x296E 0x28586
+0x296F 0x2859E
+0x2970 0x28593
+0x2971 0x285A1
+0x2972 0x28588
+0x2973 0x285A3
+0x2974 0x2859F
+0x2975 0x285A0
+0x2976 0x286FF
+0x2977 0x28700
+0x2978 0x28702
+0x2979 0x286F8
+0x297A 0x286F7
+0x297B 0x28701
+0x297C 0x28787
+0x297D 0x28789
+0x297E 0x28776
+0x2A21 0x2876E
+0x2A22 0x28777
+0x2A23 0x28782
+0x2A24 0x28785
+0x2A25 0x28783
+0x2A26 0x28784
+0x2A27 0x28857
+0x2A28 0x2884B
+0x2A29 0x28856
+0x2A2A 0x2885D
+0x2A2B 0x28860
+0x2A2C 0x2884D
+0x2A2D 0x28855
+0x2A2E 0x28854
+0x2A2F 0x28853
+0x2A30 0x28850
+0x2A31 0x28863
+0x2A32 0x28862
+0x2A33 0x28917
+0x2A34 0x28916
+0x2A35 0x2892D
+0x2A36 0x289D9
+0x2A37 0x289BF
+0x2A39 0x289B2
+0x2A3A 0x289AC
+0x2A3B 0x289B0
+0x2A3C 0x289CF
+0x2A3D 0x289B8
+0x2A3F 0x289D3
+0x2A40 0x289B1
+0x2A41 0x289AF
+0x2A42 0x289CE
+0x2A43 0x289B4
+0x2A44 0x289B7
+0x2A45 0x289D5
+0x2A47 0x28D38
+0x2A48 0x28D28
+0x2A49 0x28D3F
+0x2A4A 0x28D40
+0x2A4B 0x28D41
+0x2A4C 0x28D33
+0x2A4D 0x28D2B
+0x2A4E 0x28D2E
+0x2A4F 0x28F11
+0x2A50 0x28F18
+0x2A51 0x28F17
+0x2A52 0x28F19
+0x2A53 0x28F16
+0x2A55 0x28F0D
+0x2A56 0x28F26
+0x2A57 0x28F79
+0x2A58 0x28FD8
+0x2A59 0x28FF3
+0x2A5A 0x28FD7
+0x2A5B 0x28FCC
+0x2A5C 0x28FCF
+0x2A5D 0x28FCB
+0x2A5E 0x28FD1
+0x2A5F 0x28FCE
+0x2A60 0x28FD4
+0x2A61 0x28FD5
+0x2A62 0x28FD3
+0x2A63 0x28FD6
+0x2A64 0x28FCD
+0x2A65 0x28FDA
+0x2A66 0x28FD2
+0x2A67 0x28FDE
+0x2A68 0x290CC
+0x2A69 0x290B8
+0x2A6A 0x290B7
+0x2A6B 0x290C2
+0x2A6C 0x290C3
+0x2A6D 0x291FA
+0x2A6E 0x291F9
+0x2A6F 0x2921F
+0x2A70 0x2921D
+0x2A71 0x24382
+0x2A72 0x292A6
+0x2A73 0x29290
+0x2A74 0x2929E
+0x2A75 0x29298
+0x2A76 0x29293
+0x2A77 0x29292
+0x2A78 0x292A5
+0x2A79 0x29295
+0x2A7A 0x293A9
+0x2A7B 0x293A8
+0x2A7C 0x293AA
+0x2A7D 0x293AB
+0x2A7E 0x293AC
+0x2B21 0x2941F
+0x2B22 0x29422
+0x2B23 0x294AA
+0x2B24 0x29496
+0x2B25 0x29491
+0x2B26 0x294AB
+0x2B27 0x294A2
+0x2B28 0x294A4
+0x2B29 0x2949D
+0x2B2A 0x29497
+0x2B2B 0x2947D
+0x2B2C 0x2949F
+0x2B2D 0x2949C
+0x2B2E 0x29499
+0x2B2F 0x294A6
+0x2B30 0x29492
+0x2B31 0x294A7
+0x2B32 0x295C9
+0x2B33 0x295C8
+0x2B34 0x295C7
+0x2B35 0x295CB
+0x2B36 0x29674
+0x2B37 0x296C9
+0x2B39 0x296D2
+0x2B3A 0x296DB
+0x2B3B 0x296EB
+0x2B3C 0x296E9
+0x2B3D 0x296EF
+0x2B3E 0x296EE
+0x2B3F 0x296F9
+0x2B40 0x296DE
+0x2B41 0x29816
+0x2B42 0x29845
+0x2B43 0x2987F
+0x2B44 0x29898
+0x2B45 0x2989F
+0x2B46 0x29886
+0x2B47 0x29890
+0x2B48 0x2989A
+0x2B49 0x2989D
+0x2B4A 0x2988D
+0x2B4B 0x2989C
+0x2B4C 0x298A0
+0x2B4D 0x298A7
+0x2B4E 0x2988F
+0x2B4F 0x29A41
+0x2B50 0x29A35
+0x2B51 0x29A37
+0x2B52 0x29A30
+0x2B53 0x29A3A
+0x2B54 0x29A36
+0x2B55 0x2FA08
+0x2B56 0x29ACA
+0x2B57 0x29B12
+0x2B58 0x29B15
+0x2B59 0x29B22
+0x2B5A 0x29B13
+0x2B5B 0x29B18
+0x2B5C 0x29B21
+0x2B5D 0x29C10
+0x2B5E 0x29C20
+0x2B5F 0x29C2F
+0x2B60 0x29CA5
+0x2B61 0x29CA3
+0x2B62 0x29CB6
+0x2B63 0x29CAB
+0x2B64 0x29D68
+0x2B65 0x29D67
+0x2B66 0x29D6F
+0x2B67 0x29D77
+0x2B68 0x29D64
+0x2B69 0x29D78
+0x2B6B 0x29D76
+0x2B6C 0x29D6E
+0x2B6E 0x29FD0
+0x2B6F 0x29FB3
+0x2B70 0x29FCB
+0x2B71 0x29FD6
+0x2B72 0x29FB1
+0x2B73 0x29FB4
+0x2B74 0x29FD7
+0x2B75 0x29FC6
+0x2B76 0x29FBA
+0x2B77 0x29FD1
+0x2B78 0x29FD2
+0x2B79 0x29FB5
+0x2B7A 0x29FC4
+0x2B7B 0x29FCC
+0x2B7C 0x29FBB
+0x2B7D 0x29FB2
+0x2B7E 0x2A25B
+0x2C21 0x2A25A
+0x2C22 0x2A259
+0x2C23 0x2A299
+0x2C24 0x2A294
+0x2C25 0x2A296
+0x2C26 0x2A293
+0x2C27 0x2A291
+0x2C28 0x2A28F
+0x2C29 0x2A298
+0x2C2A 0x2A30C
+0x2C2B 0x2A30A
+0x2C2C 0x2A30E
+0x2C2D 0x2A312
+0x2C2E 0x2A311
+0x2C2F 0x2A30B
+0x2C30 0x2A39A
+0x2C32 0x2A3B4
+0x2C34 0x2A41C
+0x2C35 0x2A420
+0x2C36 0x2A421
+0x2C37 0x2A4D3
+0x2C38 0x2A4D2
+0x2C39 0x2A538
+0x2C3B 0x24CCF
+0x2C3C 0x2011D
+0x2C3D 0x20192
+0x2C3E 0x2018F
+0x2C3F 0x2018C
+0x2C40 0x203EA
+0x2C41 0x204B9
+0x2C42 0x2056E
+0x2C43 0x205A0
+0x2C44 0x291DD
+0x2C45 0x20612
+0x2C46 0x20617
+0x2C47 0x2066D
+0x2C48 0x20805
+0x2C49 0x207FB
+0x2C4A 0x207FD
+0x2C4B 0x20806
+0x2C4C 0x20800
+0x2C4D 0x207FF
+0x2C4E 0x207FE
+0x2C4F 0x208B6
+0x2C50 0x20905
+0x2C51 0x20907
+0x2C52 0x20ABC
+0x2C53 0x20ABB
+0x2C54 0x20B8B
+0x2C55 0x20B87
+0x2C56 0x27BFB
+0x2C57 0x20FE7
+0x2C58 0x20FE6
+0x2C59 0x20FE2
+0x2C5A 0x285D3
+0x2C5B 0x20FD9
+0x2C5C 0x20FCA
+0x2C5D 0x21012
+0x2C5E 0x21010
+0x2C5F 0x20FDC
+0x2C60 0x20FD0
+0x2C61 0x20F8B
+0x2C62 0x21013
+0x2C63 0x22A10
+0x2C64 0x20FDA
+0x2C65 0x2F84F
+0x2C66 0x20FFD
+0x2C67 0x20FE5
+0x2C68 0x20FCC
+0x2C69 0x21039
+0x2C6A 0x20FC7
+0x2C6B 0x20FD8
+0x2C6C 0x21460
+0x2C6D 0x21464
+0x2C6E 0x21486
+0x2C6F 0x2145E
+0x2C70 0x21466
+0x2C71 0x2145F
+0x2C72 0x21477
+0x2C73 0x21482
+0x2C74 0x21496
+0x2C75 0x2153E
+0x2C76 0x21579
+0x2C77 0x2157A
+0x2C78 0x21688
+0x2C79 0x21689
+0x2C7A 0x2168C
+0x2C7B 0x243E0
+0x2C7C 0x2167B
+0x2C7D 0x21686
+0x2C7E 0x21894
+0x2D21 0x21897
+0x2D22 0x218B7
+0x2D23 0x218B5
+0x2D24 0x218B8
+0x2D25 0x21893
+0x2D26 0x218B2
+0x2D27 0x218B4
+0x2D28 0x21899
+0x2D29 0x218C3
+0x2D2A 0x2189D
+0x2D2B 0x2189B
+0x2D2C 0x218A3
+0x2D2E 0x2199F
+0x2D2F 0x2199E
+0x2D30 0x219A3
+0x2D31 0x219A0
+0x2D32 0x219A1
+0x2D33 0x21AC5
+0x2D34 0x21AC6
+0x2D35 0x21ABE
+0x2D36 0x21AC4
+0x2D37 0x21ABF
+0x2D38 0x21B4C
+0x2D39 0x21B4A
+0x2D3A 0x21BB1
+0x2D3B 0x21C15
+0x2D3C 0x21C17
+0x2D3D 0x21C10
+0x2D3E 0x21C18
+0x2D3F 0x21CE0
+0x2D40 0x21CDF
+0x2D41 0x21D27
+0x2D42 0x21F43
+0x2D43 0x21F48
+0x2D44 0x21F1D
+0x2D45 0x21F50
+0x2D46 0x21F58
+0x2D47 0x21F47
+0x2D48 0x21F54
+0x2D49 0x21F53
+0x2D4A 0x21F40
+0x2D4B 0x21F55
+0x2D4D 0x21F5A
+0x2D4E 0x22470
+0x2D4F 0x2215B
+0x2D50 0x2214D
+0x2D51 0x22156
+0x2D52 0x2214F
+0x2D53 0x2F887
+0x2D54 0x22159
+0x2D55 0x2F888
+0x2D56 0x22154
+0x2D57 0x22153
+0x2D58 0x22150
+0x2D59 0x222B3
+0x2D5A 0x2236E
+0x2D5C 0x2236F
+0x2D5D 0x22393
+0x2D5E 0x22429
+0x2D5F 0x22425
+0x2D60 0x22428
+0x2D61 0x2246F
+0x2D62 0x232B8
+0x2D63 0x2F897
+0x2D64 0x224B3
+0x2D65 0x22579
+0x2D66 0x2257E
+0x2D67 0x2257C
+0x2D68 0x22583
+0x2D69 0x2F8AC
+0x2D6A 0x22800
+0x2D6B 0x22834
+0x2D6C 0x22865
+0x2D6D 0x22836
+0x2D6E 0x228A7
+0x2D6F 0x22859
+0x2D70 0x22858
+0x2D71 0x22831
+0x2D72 0x22862
+0x2D73 0x22838
+0x2D74 0x22873
+0x2D75 0x2283E
+0x2D76 0x22855
+0x2D77 0x22854
+0x2D78 0x22895
+0x2D79 0x2F8AD
+0x2D7A 0x228A5
+0x2D7B 0x22894
+0x2D7C 0x2289A
+0x2D7D 0x2289B
+0x2D7E 0x22899
+0x2E21 0x2289F
+0x2E22 0x22853
+0x2E23 0x22A12
+0x2E24 0x22A0A
+0x2E25 0x22A09
+0x2E26 0x22A0C
+0x2E27 0x22A0B
+0x2E28 0x22A0E
+0x2E29 0x22A0D
+0x2E2A 0x22A08
+0x2E2B 0x22D38
+0x2E2C 0x22D3A
+0x2E2D 0x22D37
+0x2E2E 0x22D3D
+0x2E2F 0x22D2D
+0x2E30 0x22D82
+0x2E31 0x22D95
+0x2E32 0x22D87
+0x2E33 0x22D9D
+0x2E34 0x22DB5
+0x2E35 0x22D81
+0x2E36 0x22DC7
+0x2E37 0x22D9B
+0x2E38 0x22D98
+0x2E39 0x22D94
+0x2E3A 0x22D86
+0x2E3B 0x22D90
+0x2E3C 0x22D34
+0x2E3D 0x22D8E
+0x2E3E 0x22D85
+0x2E3F 0x22DA6
+0x2E40 0x22D96
+0x2E41 0x22FEA
+0x2E42 0x22FDF
+0x2E43 0x232BD
+0x2E44 0x22FF7
+0x2E45 0x22FEB
+0x2E46 0x22FE0
+0x2E47 0x22FE8
+0x2E48 0x22FE1
+0x2E49 0x22FE9
+0x2E4A 0x22FEE
+0x2E4B 0x22FE5
+0x2E4C 0x22FEC
+0x2E4D 0x23063
+0x2E4E 0x230C6
+0x2E4F 0x230C2
+0x2E50 0x230C1
+0x2E51 0x230C0
+0x2E52 0x230C3
+0x2E53 0x23118
+0x2E54 0x232AE
+0x2E55 0x232A3
+0x2E56 0x232C5
+0x2E57 0x232A0
+0x2E58 0x232B4
+0x2E59 0x232A5
+0x2E5B 0x232A4
+0x2E5C 0x232A8
+0x2E5D 0x232A6
+0x2E5E 0x236A8
+0x2E5F 0x2368D
+0x2E60 0x23682
+0x2E61 0x2369E
+0x2E62 0x23689
+0x2E63 0x23683
+0x2E64 0x23691
+0x2E65 0x236A6
+0x2E66 0x2369A
+0x2E67 0x23690
+0x2E68 0x23685
+0x2E69 0x2367D
+0x2E6A 0x2F8EC
+0x2E6B 0x2369B
+0x2E6C 0x236A5
+0x2E6D 0x236F0
+0x2E6E 0x23696
+0x2E6F 0x23688
+0x2E70 0x236D6
+0x2E71 0x236D8
+0x2E72 0x23686
+0x2E73 0x236A4
+0x2E74 0x23697
+0x2E75 0x2391C
+0x2E76 0x23919
+0x2E77 0x2399E
+0x2E78 0x2399F
+0x2E79 0x2399D
+0x2E7A 0x2399C
+0x2E7B 0x23A5D
+0x2E7C 0x23A5E
+0x2E7D 0x23A73
+0x2E7E 0x23A63
+0x2F21 0x23ABE
+0x2F22 0x23AC1
+0x2F23 0x23ABC
+0x2F24 0x23ABF
+0x2F25 0x23ABB
+0x2F26 0x23ABD
+0x2F27 0x23B13
+0x2F28 0x23B14
+0x2F29 0x23BF8
+0x2F2A 0x23BFA
+0x2F2B 0x23C06
+0x2F2C 0x23BFE
+0x2F2D 0x23C51
+0x2F2E 0x2400B
+0x2F2F 0x23FF1
+0x2F30 0x23FA9
+0x2F31 0x23FD5
+0x2F32 0x23FDC
+0x2F33 0x23FCB
+0x2F34 0x23FF2
+0x2F35 0x2405F
+0x2F36 0x23FDB
+0x2F37 0x23FD6
+0x2F38 0x23FD9
+0x2F39 0x23FD1
+0x2F3A 0x23FCF
+0x2F3B 0x23FD8
+0x2F3C 0x23FE0
+0x2F3D 0x23FD4
+0x2F3E 0x23FF3
+0x2F3F 0x24005
+0x2F40 0x23FCE
+0x2F41 0x23FF4
+0x2F42 0x2F912
+0x2F43 0x23FDA
+0x2F44 0x2400E
+0x2F45 0x24006
+0x2F46 0x23FD7
+0x2F47 0x23FCD
+0x2F48 0x24007
+0x2F49 0x23FE1
+0x2F4A 0x24008
+0x2F4B 0x243BE
+0x2F4C 0x243EF
+0x2F4D 0x243D9
+0x2F4E 0x243DA
+0x2F50 0x243A0
+0x2F51 0x243DF
+0x2F52 0x2439E
+0x2F53 0x243BF
+0x2F54 0x243AF
+0x2F55 0x243A7
+0x2F56 0x243AA
+0x2F57 0x243F4
+0x2F58 0x243AE
+0x2F59 0x243B5
+0x2F5A 0x243B8
+0x2F5B 0x243DB
+0x2F5C 0x243C0
+0x2F5D 0x243B7
+0x2F5E 0x243A2
+0x2F5F 0x243DD
+0x2F60 0x243A1
+0x2F61 0x243A5
+0x2F62 0x243B4
+0x2F63 0x243A6
+0x2F64 0x243AB
+0x2F65 0x243AC
+0x2F66 0x2439F
+0x2F67 0x243B1
+0x2F68 0x243FC
+0x2F69 0x2452E
+0x2F6A 0x24530
+0x2F6B 0x24599
+0x2F6C 0x245F8
+0x2F6D 0x245F6
+0x2F6E 0x246F4
+0x2F6F 0x246EB
+0x2F70 0x246E1
+0x2F71 0x246E4
+0x2F72 0x24875
+0x2F73 0x24869
+0x2F75 0x24899
+0x2F76 0x2489E
+0x2F77 0x24894
+0x2F78 0x24893
+0x2F79 0x24891
+0x2F7A 0x24A19
+0x2F7B 0x24A17
+0x2F7C 0x24A49
+0x2F7D 0x24A47
+0x2F7E 0x24A48
+0x3021 0x24A52
+0x3022 0x24A40
+0x3023 0x24A63
+0x3024 0x24A46
+0x3025 0x24A5F
+0x3026 0x24B0E
+0x3027 0x24B85
+0x3028 0x24B87
+0x3029 0x24BCB
+0x302A 0x24BCC
+0x302B 0x24BC9
+0x302C 0x24CCB
+0x302D 0x21CE7
+0x302E 0x24D20
+0x302F 0x24E5F
+0x3030 0x24E60
+0x3031 0x24E6A
+0x3032 0x24E76
+0x3033 0x24E73
+0x3034 0x24E71
+0x3035 0x24E66
+0x3037 0x24E6B
+0x3038 0x24E79
+0x3039 0x24E7B
+0x303A 0x24F3C
+0x303B 0x24F9E
+0x303C 0x24F9C
+0x303D 0x2501C
+0x303E 0x2501E
+0x303F 0x25021
+0x3040 0x25096
+0x3041 0x250A1
+0x3042 0x250B6
+0x3043 0x250A0
+0x3044 0x25094
+0x3045 0x25097
+0x3046 0x25281
+0x3047 0x25286
+0x3048 0x252C0
+0x3049 0x2528A
+0x304A 0x2F94B
+0x304B 0x25285
+0x304C 0x25295
+0x304D 0x25249
+0x304E 0x25282
+0x304F 0x25284
+0x3050 0x22878
+0x3051 0x25290
+0x3052 0x252B1
+0x3053 0x253FE
+0x3054 0x253FB
+0x3055 0x25550
+0x3056 0x25556
+0x3057 0x2555A
+0x3058 0x2554C
+0x305A 0x25557
+0x305B 0x256E1
+0x305C 0x256D9
+0x305D 0x256DB
+0x305E 0x256F4
+0x305F 0x25745
+0x3060 0x25747
+0x3061 0x25874
+0x3062 0x2586B
+0x3063 0x25868
+0x3064 0x25869
+0x3065 0x25879
+0x3066 0x2F95B
+0x3067 0x25880
+0x3068 0x25881
+0x3069 0x25861
+0x306A 0x25870
+0x306B 0x2586F
+0x306C 0x25873
+0x306D 0x2585D
+0x306E 0x259FA
+0x3070 0x259F3
+0x3071 0x25A0A
+0x3072 0x25A17
+0x3073 0x2F95F
+0x3074 0x25AB0
+0x3075 0x25C3E
+0x3076 0x25C46
+0x3077 0x25C4F
+0x3078 0x25C44
+0x3079 0x25C69
+0x307A 0x25C33
+0x307B 0x25C2F
+0x307C 0x25C4E
+0x307D 0x25C3A
+0x307E 0x25C2B
+0x3121 0x25CA9
+0x3122 0x25C50
+0x3123 0x25C45
+0x3124 0x25C37
+0x3125 0x25C25
+0x3126 0x25C2C
+0x3127 0x25C3F
+0x3128 0x25C34
+0x3129 0x25C29
+0x312A 0x25C1E
+0x312B 0x25C3D
+0x312C 0x25EED
+0x312D 0x2F966
+0x312E 0x25EF3
+0x312F 0x25EEA
+0x3130 0x25EEB
+0x3131 0x260CC
+0x3132 0x260CE
+0x3133 0x260D0
+0x3134 0x260E3
+0x3135 0x260E0
+0x3136 0x260D1
+0x3137 0x260DC
+0x3138 0x260DD
+0x3139 0x260F0
+0x313A 0x260DB
+0x313B 0x260E5
+0x313C 0x260F1
+0x313D 0x260C9
+0x313E 0x260E8
+0x313F 0x260E7
+0x3140 0x260C8
+0x3141 0x260DE
+0x3142 0x260CD
+0x3143 0x260C5
+0x3144 0x260C6
+0x3145 0x260E4
+0x3146 0x260C3
+0x3147 0x262FB
+0x3148 0x262FC
+0x3149 0x262FE
+0x314A 0x26303
+0x314B 0x26300
+0x314C 0x262FD
+0x314D 0x26305
+0x314E 0x26313
+0x314F 0x263A7
+0x3150 0x263B4
+0x3151 0x26470
+0x3152 0x26474
+0x3153 0x26471
+0x3154 0x26475
+0x3155 0x2647D
+0x3156 0x26473
+0x3157 0x264C4
+0x3158 0x264C3
+0x3159 0x264DE
+0x315A 0x264DD
+0x315B 0x26511
+0x315C 0x2650F
+0x315D 0x26510
+0x315E 0x265C3
+0x315F 0x265C2
+0x3160 0x265CA
+0x3161 0x265C1
+0x3162 0x26623
+0x3163 0x267B1
+0x3164 0x26824
+0x3165 0x26811
+0x3166 0x26825
+0x3167 0x2680A
+0x3168 0x2681F
+0x3169 0x26820
+0x316A 0x26814
+0x316B 0x26828
+0x316C 0x26803
+0x316D 0x26812
+0x316E 0x2680B
+0x316F 0x26817
+0x3170 0x22A11
+0x3171 0x26949
+0x3172 0x26989
+0x3173 0x26990
+0x3174 0x2698F
+0x3175 0x26996
+0x3176 0x26995
+0x3177 0x26993
+0x3178 0x269ED
+0x3179 0x269F0
+0x317A 0x243DE
+0x317B 0x26A85
+0x317C 0x26A77
+0x317D 0x26A7A
+0x317E 0x26A84
+0x3221 0x26A79
+0x3222 0x26A7D
+0x3223 0x26A7B
+0x3224 0x26AED
+0x3225 0x26AEC
+0x3226 0x26DF6
+0x3227 0x26D9B
+0x3228 0x26E9D
+0x3229 0x26F11
+0x322A 0x26EC4
+0x322B 0x26EC8
+0x322C 0x26EDF
+0x322D 0x26EBF
+0x322E 0x26EB3
+0x322F 0x26EBA
+0x3230 0x26F10
+0x3231 0x26F06
+0x3232 0x26E88
+0x3233 0x26E9A
+0x3234 0x26EE0
+0x3235 0x26ECC
+0x3236 0x26EB5
+0x3237 0x26EE1
+0x3238 0x26EBC
+0x3239 0x26EC6
+0x323A 0x26F0B
+0x323B 0x26EA4
+0x323C 0x26E95
+0x323D 0x26EA3
+0x323E 0x26EE2
+0x323F 0x26ECD
+0x3240 0x26EE3
+0x3241 0x26EAB
+0x3242 0x26ECB
+0x3243 0x26E8F
+0x3244 0x2F9AB
+0x3245 0x26EA9
+0x3246 0x26F24
+0x3247 0x26EE4
+0x3248 0x26F12
+0x3249 0x26EE5
+0x324A 0x26F67
+0x324B 0x26EAA
+0x324C 0x26EA0
+0x324D 0x26EE6
+0x324E 0x26EC1
+0x324F 0x26EE7
+0x3250 0x26F0D
+0x3251 0x26E86
+0x3252 0x26EB0
+0x3253 0x26E8B
+0x3254 0x26EE8
+0x3255 0x26EC9
+0x3256 0x26F19
+0x3257 0x26EC0
+0x3258 0x26F0C
+0x3259 0x26EE9
+0x325A 0x26EEA
+0x325B 0x271ED
+0x325C 0x271E3
+0x325D 0x271E4
+0x325E 0x271E8
+0x325F 0x271D2
+0x3260 0x271E2
+0x3262 0x273CF
+0x3263 0x273D1
+0x3264 0x273C3
+0x3265 0x273C9
+0x3266 0x273EA
+0x3267 0x273B4
+0x3268 0x273DC
+0x3269 0x273BD
+0x326A 0x273E6
+0x326B 0x273C8
+0x326C 0x273EC
+0x326D 0x273B2
+0x326E 0x273A9
+0x326F 0x273D3
+0x3270 0x273C0
+0x3271 0x273E9
+0x3272 0x273D5
+0x3274 0x273C5
+0x3276 0x273CB
+0x3277 0x273D0
+0x3278 0x273D2
+0x3279 0x273E4
+0x327A 0x273E8
+0x327B 0x273CD
+0x327C 0x273B6
+0x327D 0x273AA
+0x327E 0x273D4
+0x3321 0x28449
+0x3322 0x273C1
+0x3323 0x273DD
+0x3324 0x273CE
+0x3325 0x275C9
+0x3326 0x275CA
+0x3327 0x276FD
+0x3328 0x276D9
+0x3329 0x276FF
+0x332A 0x27704
+0x332B 0x276FA
+0x332C 0x27706
+0x332D 0x27715
+0x332E 0x27711
+0x332F 0x27707
+0x3330 0x2770B
+0x3331 0x277FC
+0x3332 0x277FD
+0x3333 0x2786D
+0x3334 0x27865
+0x3335 0x27914
+0x3336 0x27913
+0x3337 0x2790C
+0x3338 0x2790B
+0x3339 0x27918
+0x333A 0x27922
+0x333B 0x27A7D
+0x333C 0x27A6F
+0x333D 0x27A75
+0x333E 0x27A7B
+0x333F 0x27A80
+0x3340 0x27A7F
+0x3341 0x27A96
+0x3342 0x27A6D
+0x3343 0x27A6B
+0x3344 0x27A86
+0x3345 0x27A73
+0x3346 0x27A62
+0x3347 0x27A77
+0x3348 0x27A81
+0x3349 0x27A69
+0x334A 0x27A82
+0x334B 0x27A97
+0x334C 0x27A84
+0x334E 0x27A78
+0x334F 0x2F9D0
+0x3350 0x27A7A
+0x3351 0x27A6A
+0x3352 0x27A65
+0x3353 0x27A7E
+0x3354 0x27A94
+0x3355 0x27BC2
+0x3356 0x27BC1
+0x3357 0x27BF9
+0x3358 0x27C71
+0x3359 0x27C6B
+0x335A 0x27C6D
+0x335B 0x27C6F
+0x335C 0x27C6E
+0x335D 0x27CF2
+0x335E 0x27CE8
+0x335F 0x27CEF
+0x3360 0x27CE9
+0x3361 0x27CEA
+0x3362 0x27CED
+0x3363 0x27CF3
+0x3364 0x27CE6
+0x3365 0x27DC9
+0x3366 0x27DB4
+0x3367 0x27DB3
+0x3368 0x27DB9
+0x3369 0x27DCA
+0x336A 0x27DB1
+0x336B 0x27DB6
+0x336C 0x27DC7
+0x336D 0x27DC4
+0x336E 0x27DB7
+0x336F 0x27E6F
+0x3370 0x27F33
+0x3371 0x27F32
+0x3372 0x27F1F
+0x3373 0x2F9D9
+0x3374 0x27F2B
+0x3375 0x27F30
+0x3376 0x27F36
+0x3377 0x27F42
+0x3378 0x27F41
+0x3379 0x2F9D8
+0x337A 0x280A5
+0x337B 0x280AB
+0x337C 0x280A9
+0x337D 0x280B3
+0x337E 0x280A7
+0x3421 0x280A0
+0x3422 0x280D2
+0x3423 0x280A8
+0x3424 0x280B6
+0x3425 0x280AC
+0x3426 0x280AE
+0x3427 0x280E6
+0x3428 0x28265
+0x3429 0x28347
+0x342A 0x28363
+0x342B 0x2834D
+0x342C 0x2835F
+0x342D 0x2834B
+0x342E 0x28360
+0x342F 0x28349
+0x3430 0x28353
+0x3431 0x2F9DF
+0x3433 0x28357
+0x3434 0x2834E
+0x3435 0x28352
+0x3436 0x28354
+0x3437 0x28420
+0x3438 0x28422
+0x3439 0x285C1
+0x343A 0x285D7
+0x343B 0x285D5
+0x343C 0x285C4
+0x343D 0x285D0
+0x343E 0x285BB
+0x343F 0x285E2
+0x3440 0x285CB
+0x3441 0x285B8
+0x3442 0x285BF
+0x3443 0x285D8
+0x3444 0x285C0
+0x3445 0x285BA
+0x3446 0x285B4
+0x3447 0x285BC
+0x3448 0x285D4
+0x3449 0x285ED
+0x344A 0x285C2
+0x344B 0x285D9
+0x344C 0x285CC
+0x344D 0x2872F
+0x344E 0x28723
+0x344F 0x28796
+0x3450 0x2878D
+0x3451 0x2879E
+0x3452 0x28799
+0x3453 0x28883
+0x3455 0x2886A
+0x3456 0x28869
+0x3457 0x28875
+0x3458 0x2886C
+0x3459 0x28880
+0x345A 0x2886E
+0x345B 0x28881
+0x345C 0x28877
+0x345D 0x28876
+0x345E 0x28873
+0x345F 0x28870
+0x3460 0x28884
+0x3461 0x28919
+0x3462 0x289F2
+0x3464 0x289EC
+0x3465 0x289EB
+0x3466 0x289F6
+0x3467 0x289EF
+0x3468 0x289F4
+0x3469 0x289EE
+0x346A 0x289F3
+0x346B 0x289ED
+0x346C 0x28C9B
+0x346D 0x28C98
+0x346E 0x28C94
+0x346F 0x2147A
+0x3470 0x28C9A
+0x3471 0x2F9F0
+0x3472 0x28D4C
+0x3474 0x28D57
+0x3475 0x28D51
+0x3476 0x28D62
+0x3477 0x28D52
+0x3478 0x28D5C
+0x3479 0x28D53
+0x347A 0x2F9EF
+0x347B 0x28E85
+0x347C 0x28F2D
+0x347D 0x28F3E
+0x347E 0x28F30
+0x3521 0x28F7D
+0x3522 0x28FE6
+0x3523 0x28FF6
+0x3524 0x28FE4
+0x3525 0x28FE9
+0x3526 0x28FEC
+0x3527 0x28FF2
+0x3528 0x28FE8
+0x3529 0x28FE3
+0x352A 0x28FEB
+0x352B 0x28FF0
+0x352C 0x28FEA
+0x352D 0x28FE7
+0x352E 0x28FFD
+0x352F 0x28FE5
+0x3530 0x28FEE
+0x3531 0x28FF5
+0x3532 0x28FF9
+0x3533 0x28FF1
+0x3534 0x28FF4
+0x3535 0x2F9F4
+0x3536 0x29011
+0x3537 0x290DE
+0x3538 0x290D8
+0x3539 0x290DD
+0x353A 0x290DB
+0x353B 0x290D3
+0x353C 0x290E1
+0x353D 0x291DE
+0x353E 0x291FC
+0x353F 0x29228
+0x3540 0x292B7
+0x3541 0x292B8
+0x3542 0x292C7
+0x3543 0x292B2
+0x3544 0x292A9
+0x3545 0x292B9
+0x3546 0x292BC
+0x3547 0x292B3
+0x3548 0x292D1
+0x3549 0x293B0
+0x354A 0x293B1
+0x354B 0x293B6
+0x354C 0x29404
+0x354D 0x2942C
+0x354E 0x294C1
+0x354F 0x2949E
+0x3550 0x294BA
+0x3552 0x294D1
+0x3553 0x294D3
+0x3554 0x294D4
+0x3555 0x294D5
+0x3556 0x294C5
+0x3557 0x294B6
+0x3558 0x294B2
+0x3559 0x294B5
+0x355A 0x294C3
+0x355B 0x294B9
+0x355C 0x294C6
+0x355D 0x295D6
+0x355E 0x295E0
+0x355F 0x295DB
+0x3560 0x295D7
+0x3561 0x295DD
+0x3562 0x29715
+0x3563 0x2970C
+0x3564 0x2970F
+0x3565 0x2970E
+0x3566 0x296FE
+0x3567 0x29704
+0x3568 0x2970B
+0x3569 0x29702
+0x356A 0x296FF
+0x356B 0x29708
+0x356C 0x29710
+0x356D 0x29717
+0x356E 0x29713
+0x356F 0x29706
+0x3570 0x29709
+0x3571 0x29824
+0x3572 0x29826
+0x3573 0x29825
+0x3574 0x29848
+0x3575 0x298B5
+0x3576 0x298D2
+0x3577 0x298D5
+0x3578 0x298C4
+0x3579 0x298AF
+0x357A 0x298AD
+0x357B 0x298C1
+0x357C 0x298C0
+0x357D 0x298CC
+0x357E 0x298CD
+0x3621 0x298C3
+0x3622 0x298C8
+0x3623 0x298C5
+0x3624 0x298BA
+0x3625 0x298D0
+0x3626 0x298C2
+0x3627 0x298CE
+0x3629 0x29A43
+0x362A 0x29A42
+0x362B 0x29A40
+0x362C 0x29A31
+0x362D 0x29ACF
+0x362E 0x29ACE
+0x362F 0x29B30
+0x3630 0x29B34
+0x3631 0x29B32
+0x3632 0x29B43
+0x3633 0x29B3C
+0x3634 0x29C11
+0x3635 0x29C35
+0x3636 0x29C34
+0x3637 0x29C37
+0x3638 0x29C31
+0x3639 0x29CBF
+0x363A 0x29CBC
+0x363B 0x29CC2
+0x363C 0x29CC9
+0x363D 0x29D83
+0x363E 0x29D8B
+0x363F 0x29DA0
+0x3640 0x29D8D
+0x3641 0x29D8C
+0x3642 0x29D9A
+0x3643 0x29D8A
+0x3644 0x29D91
+0x3645 0x29FF1
+0x3646 0x2A00F
+0x3647 0x2A001
+0x3648 0x2A007
+0x3649 0x2A00C
+0x364B 0x29FDC
+0x364C 0x29FEE
+0x364D 0x29FF7
+0x364E 0x29FF2
+0x364F 0x29FF8
+0x3650 0x29FEB
+0x3652 0x29FE6
+0x3653 0x29FED
+0x3654 0x29FE9
+0x3655 0x2A008
+0x3656 0x2A000
+0x3657 0x29FE5
+0x3658 0x29FFC
+0x3659 0x2A261
+0x365A 0x2A25E
+0x365B 0x2A25F
+0x365D 0x2A29B
+0x365E 0x2A316
+0x365F 0x2A315
+0x3660 0x2A320
+0x3661 0x2A314
+0x3662 0x2A31A
+0x3663 0x2A317
+0x3664 0x2A39C
+0x3666 0x2A3F1
+0x3668 0x2A3F0
+0x3669 0x2A428
+0x366A 0x2A424
+0x366B 0x2A42A
+0x366C 0x2A42B
+0x366D 0x2A4D5
+0x366E 0x2A504
+0x366F 0x2A505
+0x3670 0x2A591
+0x3671 0x2A592
+0x3672 0x2A6A6
+0x3673 0x20109
+0x3674 0x20422
+0x3675 0x2041A
+0x3676 0x2040E
+0x3677 0x2041B
+0x3678 0x20408
+0x3679 0x250B3
+0x367A 0x2F81C
+0x367B 0x2069D
+0x367C 0x20812
+0x367D 0x2081E
+0x367E 0x208BB
+0x3721 0x208BF
+0x3722 0x208BC
+0x3723 0x20908
+0x3724 0x20909
+0x3725 0x20963
+0x3726 0x209C8
+0x3727 0x23728
+0x3728 0x20B8E
+0x3729 0x20B8D
+0x372A 0x21043
+0x372B 0x2104D
+0x372C 0x2106D
+0x372D 0x21042
+0x372E 0x21052
+0x372F 0x21051
+0x3730 0x21069
+0x3731 0x21050
+0x3732 0x21056
+0x3733 0x2106C
+0x3734 0x21044
+0x3735 0x21045
+0x3736 0x2106B
+0x3738 0x21068
+0x3739 0x21057
+0x373A 0x2122E
+0x373B 0x21231
+0x373C 0x2122D
+0x373D 0x2148B
+0x373E 0x214B2
+0x373F 0x2148D
+0x3740 0x214A3
+0x3741 0x214A4
+0x3742 0x21490
+0x3743 0x21489
+0x3744 0x2148E
+0x3745 0x21492
+0x3746 0x2157B
+0x3747 0x21690
+0x3748 0x2168F
+0x3749 0x218E9
+0x374A 0x218CD
+0x374B 0x218C5
+0x374C 0x218D0
+0x374D 0x218C9
+0x374E 0x218D1
+0x374F 0x218C7
+0x3750 0x218D2
+0x3751 0x2185F
+0x3752 0x218E1
+0x3753 0x218CC
+0x3754 0x218C6
+0x3755 0x218E4
+0x3756 0x219A9
+0x3757 0x21AD3
+0x3758 0x21ADA
+0x3759 0x21AD2
+0x375A 0x21ADB
+0x375B 0x21B4D
+0x375C 0x21B4E
+0x375D 0x21C1C
+0x375E 0x21CE8
+0x375F 0x21F6C
+0x3760 0x21F5F
+0x3761 0x21F66
+0x3762 0x21F64
+0x3763 0x21F78
+0x3764 0x21F65
+0x3765 0x21F6D
+0x3766 0x21F61
+0x3767 0x21F7A
+0x3768 0x22007
+0x3769 0x22166
+0x376A 0x22168
+0x376B 0x22162
+0x376C 0x222D3
+0x376D 0x222D4
+0x376E 0x222D1
+0x376F 0x222DC
+0x3770 0x22373
+0x3771 0x22372
+0x3772 0x2242D
+0x3773 0x2242C
+0x3774 0x2242F
+0x3775 0x22472
+0x3776 0x224B4
+0x3777 0x22589
+0x3778 0x228CD
+0x3779 0x228A6
+0x377A 0x228A2
+0x377B 0x228A0
+0x377C 0x22846
+0x377D 0x228A1
+0x377E 0x26857
+0x3821 0x228A3
+0x3822 0x228B1
+0x3823 0x228DB
+0x3824 0x228F6
+0x3825 0x228DC
+0x3826 0x228D6
+0x3827 0x22A13
+0x3828 0x22D9C
+0x3829 0x22D97
+0x382A 0x22DD8
+0x382B 0x22DE4
+0x382C 0x22DD4
+0x382D 0x22DE5
+0x382E 0x22DDB
+0x382F 0x22DD0
+0x3830 0x22DDA
+0x3831 0x22DCC
+0x3832 0x22DDC
+0x3833 0x22DED
+0x3834 0x22DD3
+0x3835 0x22DD1
+0x3836 0x22DCE
+0x3837 0x22DD9
+0x3838 0x22DDD
+0x3839 0x2F8C6
+0x383A 0x22EE6
+0x383B 0x22EE5
+0x383C 0x22EE9
+0x383D 0x22FFF
+0x383E 0x22FFE
+0x383F 0x2300E
+0x3840 0x2308C
+0x3841 0x230CA
+0x3842 0x230CB
+0x3843 0x2311A
+0x3844 0x232D7
+0x3845 0x232CF
+0x3846 0x232D0
+0x3847 0x232C9
+0x3848 0x232CC
+0x3849 0x232D3
+0x384A 0x233A4
+0x384B 0x233A3
+0x384C 0x23681
+0x384D 0x23726
+0x384E 0x236F3
+0x384F 0x23727
+0x3850 0x236F2
+0x3851 0x236FF
+0x3852 0x236F5
+0x3853 0x236FC
+0x3854 0x2370E
+0x3856 0x236F6
+0x3857 0x23700
+0x3858 0x23723
+0x3859 0x23705
+0x385A 0x23725
+0x385B 0x23708
+0x385C 0x23750
+0x385D 0x23925
+0x385E 0x23920
+0x385F 0x23923
+0x3860 0x23921
+0x3861 0x239A1
+0x3862 0x23A69
+0x3863 0x23A6C
+0x3864 0x23A68
+0x3865 0x23A6B
+0x3866 0x23ACC
+0x3867 0x23ACD
+0x3868 0x23C10
+0x3869 0x23C0D
+0x386A 0x23C0A
+0x386B 0x23C16
+0x386C 0x23C14
+0x386D 0x23C52
+0x386E 0x24028
+0x386F 0x2402E
+0x3870 0x2402C
+0x3871 0x2404D
+0x3872 0x24049
+0x3873 0x24031
+0x3874 0x24030
+0x3875 0x24033
+0x3876 0x2402D
+0x3877 0x24036
+0x3878 0x2403E
+0x3879 0x2402F
+0x387A 0x24027
+0x387B 0x24034
+0x387C 0x2404C
+0x387D 0x243FE
+0x387E 0x24412
+0x3921 0x2441F
+0x3922 0x24417
+0x3923 0x243F5
+0x3924 0x24415
+0x3925 0x243F7
+0x3927 0x21F7D
+0x3928 0x243FA
+0x3929 0x243F9
+0x392A 0x2444B
+0x392B 0x2459C
+0x392C 0x2459D
+0x392E 0x246F0
+0x392F 0x246F6
+0x3930 0x246EF
+0x3931 0x2489D
+0x3932 0x2489A
+0x3933 0x248A7
+0x3934 0x248AF
+0x3935 0x248AA
+0x3936 0x24A64
+0x3937 0x24A86
+0x3938 0x24A75
+0x3939 0x24A70
+0x393A 0x24A84
+0x393B 0x24A6B
+0x393C 0x24A85
+0x393D 0x24A6C
+0x393E 0x24B17
+0x393F 0x24B94
+0x3940 0x24B93
+0x3941 0x24CD2
+0x3942 0x24CD7
+0x3943 0x24CD4
+0x3944 0x24EA6
+0x3945 0x24EA7
+0x3946 0x24E9C
+0x3947 0x24E8B
+0x3948 0x24E8D
+0x3949 0x24E98
+0x394A 0x24EB9
+0x394B 0x24E9B
+0x394C 0x24E9D
+0x394D 0x24E99
+0x394E 0x24EA8
+0x394F 0x24E91
+0x3950 0x24E87
+0x3951 0x24E9A
+0x3952 0x24FA6
+0x3953 0x2501F
+0x3954 0x250A7
+0x3955 0x250B1
+0x3956 0x250B2
+0x3957 0x250B7
+0x3958 0x252D0
+0x3959 0x252B3
+0x395A 0x252B5
+0x395B 0x252C4
+0x395C 0x252C3
+0x395D 0x252BC
+0x395E 0x252B2
+0x395F 0x252BA
+0x3960 0x252BB
+0x3961 0x252C2
+0x3962 0x252CD
+0x3963 0x252BE
+0x3964 0x252B7
+0x3965 0x2538F
+0x3966 0x25403
+0x3967 0x25404
+0x3968 0x25571
+0x3969 0x25577
+0x396A 0x25574
+0x396B 0x2558B
+0x396C 0x2557A
+0x396D 0x2F951
+0x396E 0x2558C
+0x396F 0x25573
+0x3970 0x256FF
+0x3971 0x256FB
+0x3972 0x256FD
+0x3973 0x256F0
+0x3974 0x256F3
+0x3975 0x256FC
+0x3976 0x256F2
+0x3977 0x25892
+0x3978 0x2589E
+0x3979 0x258AE
+0x397A 0x25896
+0x397B 0x25A14
+0x397C 0x25A12
+0x397D 0x25A13
+0x397E 0x25A16
+0x3A21 0x25A0F
+0x3A22 0x25AB6
+0x3A23 0x25ABD
+0x3A24 0x25C8C
+0x3A25 0x25CAE
+0x3A26 0x25CAC
+0x3A27 0x25CAB
+0x3A28 0x25C99
+0x3A29 0x25C92
+0x3A2A 0x25CBB
+0x3A2B 0x25C9E
+0x3A2C 0x25C7E
+0x3A2D 0x25CAF
+0x3A2E 0x25CBC
+0x3A2F 0x25C98
+0x3A30 0x25F01
+0x3A31 0x25F09
+0x3A32 0x25F06
+0x3A33 0x2F967
+0x3A34 0x25F07
+0x3A35 0x25F08
+0x3A36 0x260CF
+0x3A37 0x2610E
+0x3A38 0x26132
+0x3A3A 0x26112
+0x3A3B 0x26116
+0x3A3C 0x26117
+0x3A3D 0x2611B
+0x3A3E 0x26115
+0x3A3F 0x26131
+0x3A40 0x26118
+0x3A41 0x2611A
+0x3A42 0x26110
+0x3A43 0x2610A
+0x3A44 0x26109
+0x3A45 0x2624F
+0x3A46 0x2F973
+0x3A47 0x2630F
+0x3A48 0x26310
+0x3A49 0x2F975
+0x3A4A 0x26328
+0x3A4B 0x26311
+0x3A4C 0x26316
+0x3A4D 0x26317
+0x3A4E 0x26302
+0x3A4F 0x263BB
+0x3A50 0x263BA
+0x3A51 0x263C3
+0x3A52 0x263BC
+0x3A53 0x2648A
+0x3A54 0x26484
+0x3A55 0x26486
+0x3A56 0x264E0
+0x3A57 0x26517
+0x3A58 0x26518
+0x3A59 0x2651E
+0x3A5A 0x26515
+0x3A5B 0x265D3
+0x3A5C 0x265DA
+0x3A5D 0x265D9
+0x3A5E 0x267E6
+0x3A5F 0x267F4
+0x3A60 0x267E1
+0x3A61 0x26869
+0x3A62 0x26840
+0x3A63 0x26858
+0x3A64 0x2686C
+0x3A65 0x2684D
+0x3A66 0x26921
+0x3A67 0x26999
+0x3A68 0x269F1
+0x3A69 0x23F68
+0x3A6A 0x26A86
+0x3A6B 0x26F5B
+0x3A6C 0x26F5C
+0x3A6D 0x26F77
+0x3A6E 0x26F2C
+0x3A6F 0x2F9AD
+0x3A70 0x26F58
+0x3A71 0x26F64
+0x3A72 0x26F61
+0x3A73 0x26F48
+0x3A74 0x26F97
+0x3A75 0x26F59
+0x3A76 0x26F29
+0x3A77 0x26F62
+0x3A78 0x26F2E
+0x3A79 0x26F68
+0x3A7A 0x26F90
+0x3A7B 0x26F3A
+0x3A7C 0x26F3D
+0x3A7D 0x26F5E
+0x3A7E 0x26F46
+0x3B21 0x26F69
+0x3B22 0x26F65
+0x3B23 0x26F3E
+0x3B24 0x26F49
+0x3B25 0x26F56
+0x3B26 0x26FE1
+0x3B27 0x26F78
+0x3B28 0x26F79
+0x3B29 0x26F66
+0x3B2A 0x26F4A
+0x3B2B 0x26F35
+0x3B2C 0x26F7A
+0x3B2D 0x26F92
+0x3B2E 0x26F60
+0x3B2F 0x26F36
+0x3B30 0x26F51
+0x3B31 0x26F42
+0x3B33 0x26F3F
+0x3B34 0x26F7B
+0x3B35 0x26F5D
+0x3B36 0x26F94
+0x3B37 0x26F6A
+0x3B38 0x2F9B5
+0x3B39 0x271F2
+0x3B3A 0x273BB
+0x3B3B 0x2741B
+0x3B3C 0x2741A
+0x3B3D 0x27433
+0x3B3E 0x27417
+0x3B3F 0x2740A
+0x3B40 0x27415
+0x3B41 0x27412
+0x3B42 0x27401
+0x3B43 0x2742D
+0x3B44 0x273FD
+0x3B45 0x27423
+0x3B46 0x27405
+0x3B47 0x27411
+0x3B48 0x27400
+0x3B49 0x2741C
+0x3B4A 0x27435
+0x3B4B 0x2742E
+0x3B4C 0x27436
+0x3B4D 0x20ABF
+0x3B4E 0x2742F
+0x3B4F 0x2740C
+0x3B50 0x27409
+0x3B51 0x27431
+0x3B52 0x273FC
+0x3B53 0x2740F
+0x3B54 0x27418
+0x3B55 0x27402
+0x3B56 0x27600
+0x3B57 0x2771F
+0x3B58 0x27737
+0x3B5A 0x27738
+0x3B5B 0x2772B
+0x3B5C 0x2772E
+0x3B5D 0x27721
+0x3B5E 0x27730
+0x3B5F 0x27729
+0x3B60 0x27731
+0x3B61 0x2F9C9
+0x3B62 0x27701
+0x3B63 0x2772C
+0x3B64 0x27722
+0x3B65 0x277FF
+0x3B66 0x27877
+0x3B67 0x27867
+0x3B68 0x2787F
+0x3B69 0x2787D
+0x3B6A 0x2787B
+0x3B6B 0x2787E
+0x3B6C 0x2791E
+0x3B6D 0x2791C
+0x3B6E 0x27921
+0x3B6F 0x27926
+0x3B70 0x27927
+0x3B71 0x27929
+0x3B72 0x2792C
+0x3B73 0x2791D
+0x3B74 0x2792B
+0x3B75 0x27ABF
+0x3B76 0x27AA4
+0x3B77 0x27AAA
+0x3B78 0x27AAE
+0x3B79 0x27A9F
+0x3B7A 0x27AD0
+0x3B7B 0x27AB1
+0x3B7C 0x27AAD
+0x3B7D 0x27A9B
+0x3B7E 0x27AB2
+0x3C21 0x27AA9
+0x3C22 0x27AB3
+0x3C23 0x27AB4
+0x3C24 0x27ABA
+0x3C25 0x27AA5
+0x3C26 0x27AB7
+0x3C27 0x27AAC
+0x3C28 0x27ACB
+0x3C29 0x27ACF
+0x3C2A 0x27BC6
+0x3C2B 0x27C01
+0x3C2C 0x27BFF
+0x3C2D 0x27BFD
+0x3C2E 0x27C77
+0x3C2F 0x27C78
+0x3C30 0x27C76
+0x3C31 0x27CF7
+0x3C32 0x27DCC
+0x3C34 0x27DD4
+0x3C35 0x27DD7
+0x3C36 0x27DD5
+0x3C37 0x27DD6
+0x3C38 0x27DD3
+0x3C39 0x27F5D
+0x3C3A 0x27F55
+0x3C3B 0x280E0
+0x3C3C 0x28148
+0x3C3D 0x280EE
+0x3C3E 0x280DB
+0x3C3F 0x280E7
+0x3C40 0x280D6
+0x3C41 0x280E5
+0x3C42 0x280E1
+0x3C43 0x280DD
+0x3C44 0x280E2
+0x3C45 0x28270
+0x3C46 0x28266
+0x3C47 0x2826F
+0x3C48 0x2826E
+0x3C49 0x28381
+0x3C4A 0x28369
+0x3C4B 0x2836E
+0x3C4C 0x2836D
+0x3C4D 0x2836C
+0x3C4E 0x28384
+0x3C4F 0x28385
+0x3C50 0x28371
+0x3C51 0x28373
+0x3C52 0x2836A
+0x3C53 0x2836F
+0x3C54 0x2837B
+0x3C55 0x2856A
+0x3C56 0x2857C
+0x3C57 0x2857D
+0x3C58 0x28581
+0x3C59 0x285FA
+0x3C5A 0x28605
+0x3C5B 0x285EB
+0x3C5C 0x285FB
+0x3C5D 0x285E9
+0x3C5E 0x285EF
+0x3C5F 0x285FC
+0x3C60 0x285E7
+0x3C61 0x2F9E1
+0x3C62 0x285EE
+0x3C63 0x285FD
+0x3C64 0x28732
+0x3C65 0x287A7
+0x3C66 0x287B5
+0x3C67 0x287B1
+0x3C68 0x287B9
+0x3C69 0x287A8
+0x3C6A 0x287B3
+0x3C6B 0x2F9E6
+0x3C6C 0x2888A
+0x3C6D 0x28891
+0x3C6E 0x2888D
+0x3C6F 0x28899
+0x3C71 0x2889A
+0x3C72 0x2889B
+0x3C73 0x28892
+0x3C74 0x2888F
+0x3C75 0x288AB
+0x3C76 0x24CDB
+0x3C78 0x28A75
+0x3C79 0x28A31
+0x3C7A 0x28A38
+0x3C7C 0x28A35
+0x3C7D 0x28A69
+0x3C7E 0x28A3B
+0x3D21 0x28A3D
+0x3D22 0x28A6C
+0x3D23 0x28A79
+0x3D24 0x28A3C
+0x3D25 0x28A3E
+0x3D26 0x28C97
+0x3D27 0x28CA5
+0x3D28 0x28CA2
+0x3D29 0x28C9D
+0x3D2A 0x28CA1
+0x3D2B 0x28D68
+0x3D2C 0x28D6F
+0x3D2D 0x28D6D
+0x3D2E 0x28D72
+0x3D2F 0x28D75
+0x3D30 0x28D77
+0x3D31 0x28D79
+0x3D32 0x28EB5
+0x3D33 0x28EEA
+0x3D34 0x28EAB
+0x3D35 0x28F43
+0x3D36 0x28F41
+0x3D37 0x28F42
+0x3D38 0x29009
+0x3D39 0x29008
+0x3D3A 0x29006
+0x3D3B 0x29001
+0x3D3C 0x29003
+0x3D3D 0x29000
+0x3D3E 0x29004
+0x3D3F 0x2900A
+0x3D40 0x2900E
+0x3D41 0x2900D
+0x3D42 0x29007
+0x3D43 0x2900F
+0x3D44 0x29014
+0x3D45 0x29002
+0x3D46 0x29015
+0x3D47 0x2900C
+0x3D48 0x29010
+0x3D49 0x29005
+0x3D4A 0x290FD
+0x3D4B 0x290FF
+0x3D4C 0x29104
+0x3D4D 0x29100
+0x3D4E 0x29109
+0x3D4F 0x2922B
+0x3D50 0x2F9F7
+0x3D51 0x29231
+0x3D52 0x292DB
+0x3D53 0x292C5
+0x3D54 0x292D3
+0x3D55 0x292CE
+0x3D57 0x292C9
+0x3D58 0x292BF
+0x3D59 0x292CB
+0x3D5A 0x292C0
+0x3D5B 0x292D0
+0x3D5C 0x292D4
+0x3D5D 0x293C1
+0x3D5E 0x293B9
+0x3D5F 0x293BB
+0x3D60 0x293C3
+0x3D61 0x293C9
+0x3D62 0x29407
+0x3D63 0x2942D
+0x3D64 0x294F8
+0x3D65 0x294E1
+0x3D66 0x294FA
+0x3D67 0x294EF
+0x3D68 0x294FD
+0x3D6A 0x294EB
+0x3D6B 0x294F1
+0x3D6C 0x294ED
+0x3D6D 0x294FE
+0x3D6E 0x295F8
+0x3D6F 0x29603
+0x3D70 0x295EE
+0x3D71 0x295E8
+0x3D72 0x29601
+0x3D73 0x296EC
+0x3D74 0x29722
+0x3D75 0x29714
+0x3D76 0x29734
+0x3D77 0x2972F
+0x3D78 0x29739
+0x3D79 0x29741
+0x3D7A 0x2973C
+0x3D7B 0x29749
+0x3D7C 0x29758
+0x3D7D 0x2973A
+0x3D7E 0x29742
+0x3E21 0x2973F
+0x3E22 0x29822
+0x3E23 0x29823
+0x3E24 0x2984A
+0x3E25 0x298DC
+0x3E26 0x298D9
+0x3E27 0x298DB
+0x3E28 0x298E2
+0x3E29 0x2FA07
+0x3E2A 0x298DF
+0x3E2B 0x298E0
+0x3E2C 0x298D7
+0x3E2D 0x29A4F
+0x3E2E 0x29A46
+0x3E2F 0x29A53
+0x3E30 0x29A55
+0x3E31 0x29A4E
+0x3E32 0x29A4A
+0x3E33 0x29A4C
+0x3E34 0x29A63
+0x3E35 0x29B51
+0x3E36 0x29B53
+0x3E37 0x29B58
+0x3E38 0x29B4D
+0x3E39 0x29B5A
+0x3E3A 0x29B49
+0x3E3B 0x29B5D
+0x3E3C 0x29C12
+0x3E3D 0x29C3C
+0x3E3E 0x29CD1
+0x3E3F 0x29CDF
+0x3E40 0x29CD6
+0x3E41 0x29CD8
+0x3E42 0x29CE0
+0x3E43 0x29CD9
+0x3E44 0x29DB1
+0x3E45 0x29DAC
+0x3E46 0x29DAA
+0x3E47 0x29DEE
+0x3E48 0x29DBD
+0x3E4A 0x29DC3
+0x3E4B 0x29DA8
+0x3E4C 0x29DAE
+0x3E4D 0x29DAB
+0x3E4E 0x2A01D
+0x3E4F 0x2A027
+0x3E50 0x2A038
+0x3E51 0x2A012
+0x3E52 0x2A048
+0x3E53 0x2A02B
+0x3E54 0x2A016
+0x3E55 0x2A019
+0x3E56 0x2A03D
+0x3E57 0x2A023
+0x3E58 0x2A02A
+0x3E59 0x2A264
+0x3E5A 0x2A2AD
+0x3E5B 0x2A2AC
+0x3E5C 0x2FA14
+0x3E5D 0x2A2B1
+0x3E5E 0x2A2AF
+0x3E5F 0x2A32C
+0x3E60 0x2A324
+0x3E61 0x2A325
+0x3E62 0x2A328
+0x3E63 0x2A3F9
+0x3E64 0x2A3F7
+0x3E65 0x2A3FD
+0x3E66 0x2A3FE
+0x3E67 0x2A439
+0x3E68 0x2A433
+0x3E69 0x2A4D7
+0x3E6A 0x2A4D8
+0x3E6B 0x2A4E4
+0x3E6C 0x214A1
+0x3E6D 0x2A50E
+0x3E6E 0x2A53B
+0x3E6F 0x2A544
+0x3E70 0x2A542
+0x3E71 0x2A594
+0x3E72 0x2A593
+0x3E73 0x2A5D5
+0x3E74 0x2A6A7
+0x3E75 0x20431
+0x3E76 0x20423
+0x3E77 0x20428
+0x3E78 0x20427
+0x3E79 0x204C6
+0x3E7A 0x205A3
+0x3E7B 0x20621
+0x3E7C 0x2081B
+0x3E7E 0x208C1
+0x3F21 0x208C3
+0x3F22 0x2092A
+0x3F23 0x20969
+0x3F24 0x20A27
+0x3F25 0x210B6
+0x3F26 0x210A7
+0x3F27 0x210A4
+0x3F28 0x210A6
+0x3F29 0x21090
+0x3F2A 0x2109E
+0x3F2B 0x21094
+0x3F2C 0x210A8
+0x3F2D 0x210A5
+0x3F2E 0x210A2
+0x3F2F 0x21091
+0x3F31 0x214BC
+0x3F32 0x214BD
+0x3F33 0x214B4
+0x3F34 0x214B0
+0x3F35 0x214E4
+0x3F36 0x21545
+0x3F37 0x2154B
+0x3F38 0x2157E
+0x3F39 0x2157F
+0x3F3A 0x2157D
+0x3F3B 0x215C3
+0x3F3C 0x218FC
+0x3F3D 0x218F7
+0x3F3E 0x218F0
+0x3F3F 0x218ED
+0x3F40 0x218F1
+0x3F41 0x218F8
+0x3F42 0x21AE9
+0x3F43 0x21CEB
+0x3F45 0x21F90
+0x3F46 0x21F8D
+0x3F47 0x21F86
+0x3F48 0x21F91
+0x3F49 0x21F8A
+0x3F4A 0x22008
+0x3F4B 0x22050
+0x3F4C 0x222EA
+0x3F4D 0x222E6
+0x3F4E 0x222E2
+0x3F4F 0x222E7
+0x3F50 0x222ED
+0x3F51 0x222E1
+0x3F52 0x22434
+0x3F53 0x22476
+0x3F54 0x22475
+0x3F55 0x22473
+0x3F56 0x224B5
+0x3F57 0x22590
+0x3F58 0x22592
+0x3F59 0x228E1
+0x3F5A 0x228DF
+0x3F5B 0x228D5
+0x3F5C 0x228F2
+0x3F5D 0x228FE
+0x3F5E 0x22913
+0x3F5F 0x2292E
+0x3F60 0x22A19
+0x3F61 0x22E08
+0x3F63 0x22E05
+0x3F64 0x22E09
+0x3F65 0x22E06
+0x3F66 0x22E03
+0x3F67 0x22DFD
+0x3F68 0x22DFC
+0x3F69 0x22E02
+0x3F6A 0x22E42
+0x3F6B 0x2301A
+0x3F6C 0x23011
+0x3F6D 0x23015
+0x3F6E 0x23016
+0x3F6F 0x230CC
+0x3F70 0x230CF
+0x3F71 0x230D0
+0x3F72 0x23122
+0x3F73 0x2311E
+0x3F74 0x23121
+0x3F75 0x232E5
+0x3F77 0x23354
+0x3F78 0x232EF
+0x3F79 0x23353
+0x3F7A 0x23351
+0x3F7B 0x233AD
+0x3F7C 0x23767
+0x3F7D 0x23768
+0x3F7E 0x237A4
+0x4021 0x23777
+0x4022 0x23789
+0x4023 0x23744
+0x4024 0x2378B
+0x4025 0x23779
+0x4026 0x2375B
+0x4027 0x23743
+0x4028 0x23757
+0x4029 0x2374A
+0x402A 0x2377C
+0x402B 0x23746
+0x402C 0x2377B
+0x402D 0x23756
+0x402E 0x239A8
+0x402F 0x23A76
+0x4030 0x23A72
+0x4031 0x23AD6
+0x4032 0x23AD8
+0x4033 0x23AD1
+0x4034 0x23C22
+0x4035 0x23C20
+0x4036 0x23C23
+0x4037 0x23C1E
+0x4038 0x23C6E
+0x4039 0x240A3
+0x403A 0x24077
+0x403B 0x240A6
+0x403C 0x2406D
+0x403D 0x240A2
+0x403E 0x2407C
+0x403F 0x24084
+0x4040 0x24068
+0x4041 0x24074
+0x4042 0x24086
+0x4043 0x240A5
+0x4044 0x2407B
+0x4045 0x2407A
+0x4046 0x24069
+0x4047 0x24072
+0x4048 0x24076
+0x4049 0x2444A
+0x404A 0x24437
+0x404B 0x2442A
+0x404C 0x2442D
+0x404D 0x24446
+0x404E 0x24428
+0x404F 0x24426
+0x4050 0x24442
+0x4051 0x2442C
+0x4052 0x24438
+0x4053 0x2442B
+0x4054 0x24433
+0x4055 0x24445
+0x4056 0x24539
+0x4057 0x246F9
+0x4058 0x246FA
+0x4059 0x248B8
+0x405A 0x248B7
+0x405B 0x248BB
+0x405C 0x248B9
+0x405D 0x248B4
+0x405E 0x24A6F
+0x405F 0x24A87
+0x4060 0x24A8F
+0x4061 0x24AA2
+0x4062 0x24AA3
+0x4063 0x2F931
+0x4064 0x24B9B
+0x4065 0x24B9D
+0x4066 0x24BCE
+0x4068 0x24EBD
+0x4069 0x24EBF
+0x406A 0x24E92
+0x406C 0x24EEF
+0x406D 0x24EC9
+0x406E 0x24FA4
+0x406F 0x24FA8
+0x4070 0x24FAA
+0x4071 0x25028
+0x4072 0x25024
+0x4073 0x25025
+0x4074 0x25026
+0x4075 0x250A9
+0x4076 0x250BA
+0x4077 0x250BE
+0x4078 0x250BC
+0x4079 0x250C0
+0x407A 0x252F0
+0x407B 0x252DF
+0x407C 0x252E0
+0x407D 0x252ED
+0x407E 0x252DB
+0x4121 0x252FB
+0x4122 0x252B9
+0x4123 0x252DA
+0x4124 0x252EB
+0x4125 0x252EC
+0x4126 0x2559A
+0x4127 0x2559F
+0x4128 0x2559B
+0x4129 0x25597
+0x412A 0x255A1
+0x412B 0x2570F
+0x412C 0x25705
+0x412D 0x25748
+0x412F 0x258BC
+0x4130 0x258BA
+0x4131 0x25ABF
+0x4132 0x25D01
+0x4133 0x25CE8
+0x4134 0x25CEF
+0x4135 0x25CE4
+0x4136 0x25CE6
+0x4137 0x25D02
+0x4138 0x25CEB
+0x4139 0x25CE0
+0x413A 0x25CED
+0x413B 0x25CD9
+0x413C 0x2F964
+0x413D 0x25D14
+0x413E 0x25CEE
+0x4140 0x25D13
+0x4141 0x25CF9
+0x4142 0x25CF8
+0x4143 0x25F25
+0x4144 0x2F969
+0x4145 0x25F19
+0x4146 0x25F20
+0x4147 0x25F43
+0x4148 0x25F3F
+0x4149 0x26145
+0x414A 0x2614C
+0x414B 0x26149
+0x414C 0x2614F
+0x414D 0x26141
+0x414E 0x2613E
+0x414F 0x2614D
+0x4150 0x26152
+0x4151 0x2614A
+0x4152 0x2614E
+0x4153 0x26173
+0x4154 0x26142
+0x4155 0x26151
+0x4156 0x26155
+0x4157 0x26150
+0x4158 0x2616C
+0x415A 0x2616A
+0x415B 0x26153
+0x415C 0x26168
+0x415D 0x26255
+0x415E 0x26256
+0x415F 0x2631C
+0x4160 0x2631D
+0x4162 0x2631E
+0x4163 0x26323
+0x4164 0x2631F
+0x4165 0x263E1
+0x4166 0x263CD
+0x4167 0x263CB
+0x4168 0x263CC
+0x4169 0x263C8
+0x416A 0x263C9
+0x416B 0x2649B
+0x416C 0x26494
+0x416D 0x26492
+0x416E 0x26496
+0x416F 0x26493
+0x4170 0x26495
+0x4171 0x2648F
+0x4172 0x2651D
+0x4173 0x26522
+0x4174 0x26521
+0x4175 0x265E9
+0x4176 0x265EF
+0x4177 0x265E0
+0x4178 0x265E6
+0x4179 0x265E4
+0x417A 0x26829
+0x417B 0x2682C
+0x417C 0x26876
+0x417D 0x26883
+0x417E 0x26878
+0x4221 0x2683C
+0x4222 0x24443
+0x4223 0x2687A
+0x4225 0x268F2
+0x4226 0x2699E
+0x4227 0x2699B
+0x4228 0x2699A
+0x4229 0x269F6
+0x422A 0x269F5
+0x422B 0x26AA5
+0x422C 0x26A93
+0x422D 0x26AA4
+0x422E 0x26E82
+0x422F 0x26EC7
+0x4230 0x26FB7
+0x4231 0x2701D
+0x4232 0x26FE2
+0x4233 0x26FD7
+0x4234 0x26FE3
+0x4235 0x26FE4
+0x4236 0x26FBC
+0x4237 0x26FD3
+0x4239 0x26F5A
+0x423A 0x26FD2
+0x423B 0x26F2D
+0x423C 0x2F9AF
+0x423D 0x26FC4
+0x423E 0x26FD0
+0x423F 0x26FE5
+0x4240 0x27005
+0x4241 0x27007
+0x4242 0x26FE6
+0x4243 0x2701B
+0x4244 0x26FE7
+0x4245 0x26FD8
+0x4246 0x26FBE
+0x4247 0x27017
+0x4248 0x26FB4
+0x4249 0x26FD9
+0x424A 0x26FE8
+0x424B 0x26FAD
+0x424C 0x26FAF
+0x424D 0x26FC8
+0x424E 0x26FE9
+0x424F 0x26FEA
+0x4250 0x271FE
+0x4251 0x271FB
+0x4252 0x27200
+0x4253 0x27472
+0x4254 0x27470
+0x4255 0x27446
+0x4256 0x27459
+0x4257 0x2745E
+0x4258 0x27448
+0x4259 0x2744F
+0x425A 0x27471
+0x425B 0x27460
+0x425C 0x2745F
+0x425D 0x2746E
+0x425E 0x27473
+0x425F 0x2F9C0
+0x4260 0x2F9BF
+0x4261 0x27447
+0x4262 0x2746D
+0x4263 0x2746F
+0x4264 0x27481
+0x4265 0x2746C
+0x4266 0x27478
+0x4267 0x27483
+0x4268 0x27449
+0x4269 0x27468
+0x426A 0x27474
+0x426B 0x27463
+0x426C 0x2746A
+0x426D 0x26885
+0x426E 0x27465
+0x426F 0x27462
+0x4270 0x274C8
+0x4271 0x275D0
+0x4272 0x275D4
+0x4273 0x275D1
+0x4274 0x27603
+0x4275 0x27742
+0x4276 0x27763
+0x4277 0x27756
+0x4278 0x2775B
+0x4279 0x27755
+0x427A 0x27750
+0x427B 0x2772D
+0x427C 0x27744
+0x427D 0x27748
+0x427E 0x27745
+0x4321 0x27782
+0x4323 0x27762
+0x4324 0x27885
+0x4325 0x2788D
+0x4326 0x27936
+0x4327 0x2792F
+0x4328 0x27931
+0x4329 0x27937
+0x432A 0x27AA7
+0x432B 0x27AD9
+0x432C 0x27AF0
+0x432D 0x27AF2
+0x432E 0x27AFD
+0x432F 0x27AE8
+0x4330 0x27AEB
+0x4331 0x27AEE
+0x4332 0x27AE0
+0x4333 0x27AE9
+0x4334 0x27AED
+0x4335 0x27AD6
+0x4336 0x27AF8
+0x4337 0x27AD4
+0x4338 0x27ADF
+0x4339 0x27AE7
+0x433A 0x27AD8
+0x433B 0x27AE3
+0x433C 0x27AEF
+0x433D 0x27B0F
+0x433E 0x27BCA
+0x433F 0x21546
+0x4340 0x27C05
+0x4341 0x27C0C
+0x4342 0x27C0D
+0x4343 0x27C7F
+0x4344 0x27C80
+0x4345 0x27C81
+0x4346 0x27D01
+0x4347 0x27D03
+0x4348 0x27DF2
+0x4349 0x27DE2
+0x434A 0x27DE3
+0x434B 0x27DDE
+0x434C 0x27DE9
+0x434D 0x27DE8
+0x434E 0x27DE0
+0x434F 0x27E01
+0x4350 0x27DF5
+0x4351 0x27DE4
+0x4353 0x27E77
+0x4354 0x27F74
+0x4355 0x27F6F
+0x4356 0x27F62
+0x4357 0x27F61
+0x4358 0x27F6D
+0x4359 0x27F73
+0x435A 0x27F6A
+0x435B 0x27F69
+0x435C 0x28112
+0x435D 0x2812D
+0x435E 0x28114
+0x435F 0x2810F
+0x4360 0x28129
+0x4361 0x28116
+0x4362 0x28103
+0x4363 0x28146
+0x4364 0x2815C
+0x4365 0x28111
+0x4366 0x28106
+0x4367 0x280DC
+0x4368 0x2812B
+0x4369 0x2812A
+0x436A 0x2812C
+0x436B 0x28127
+0x436C 0x2827A
+0x436D 0x2839C
+0x436E 0x28399
+0x436F 0x28395
+0x4370 0x2838B
+0x4371 0x28398
+0x4372 0x28396
+0x4373 0x28432
+0x4374 0x285A4
+0x4375 0x285AA
+0x4376 0x2861B
+0x4378 0x2860D
+0x4379 0x2861C
+0x437A 0x2860A
+0x437B 0x28620
+0x437C 0x28608
+0x437D 0x2861A
+0x437E 0x28613
+0x4421 0x28611
+0x4422 0x2875D
+0x4423 0x2875F
+0x4424 0x2875E
+0x4425 0x28760
+0x4426 0x287BB
+0x4427 0x287BC
+0x4428 0x287C1
+0x4429 0x287C0
+0x442A 0x287C8
+0x442B 0x287CE
+0x442C 0x288A7
+0x442D 0x288B2
+0x442E 0x288B6
+0x442F 0x288A5
+0x4430 0x288BA
+0x4431 0x288B5
+0x4432 0x288AD
+0x4433 0x288A4
+0x4434 0x288D3
+0x4435 0x288B0
+0x4436 0x288B1
+0x4437 0x2891D
+0x4438 0x28A8D
+0x443A 0x28A91
+0x443B 0x28AB6
+0x443C 0x28AB7
+0x443D 0x28ABD
+0x443E 0x28ABC
+0x443F 0x28A96
+0x4440 0x28A94
+0x4441 0x28AA0
+0x4442 0x28CA8
+0x4443 0x28CA6
+0x4444 0x28D84
+0x4445 0x28D96
+0x4446 0x28D88
+0x4447 0x28D9A
+0x4448 0x28ED1
+0x4449 0x28ECF
+0x444A 0x28F50
+0x444B 0x28F51
+0x444C 0x28F4E
+0x444D 0x28F80
+0x444E 0x28F81
+0x444F 0x2901B
+0x4450 0x29017
+0x4451 0x29020
+0x4452 0x29019
+0x4453 0x2901A
+0x4454 0x29021
+0x4455 0x2901E
+0x4456 0x29018
+0x4457 0x2901D
+0x4459 0x2912D
+0x445A 0x29124
+0x445B 0x29127
+0x445C 0x2912E
+0x445D 0x29125
+0x445E 0x2911C
+0x445F 0x29119
+0x4461 0x29123
+0x4462 0x2911F
+0x4463 0x2911A
+0x4464 0x2912B
+0x4465 0x2911E
+0x4466 0x291E0
+0x4467 0x29233
+0x4468 0x292E6
+0x4469 0x292FC
+0x446A 0x292E5
+0x446B 0x292F8
+0x446C 0x292F6
+0x446D 0x292EA
+0x446E 0x292F2
+0x446F 0x292ED
+0x4470 0x292EB
+0x4471 0x292F0
+0x4472 0x292F1
+0x4473 0x293C6
+0x4474 0x293C8
+0x4475 0x293CE
+0x4476 0x293C5
+0x4478 0x293CB
+0x4479 0x29513
+0x447A 0x29514
+0x447B 0x29507
+0x447C 0x2950C
+0x447D 0x2961A
+0x4521 0x29617
+0x4522 0x29606
+0x4523 0x29616
+0x4524 0x29607
+0x4525 0x29610
+0x4526 0x29609
+0x4527 0x29619
+0x4528 0x29615
+0x4529 0x2976E
+0x452A 0x2973B
+0x452B 0x2973E
+0x452C 0x2976C
+0x452D 0x29765
+0x452E 0x29764
+0x452F 0x29759
+0x4530 0x2977C
+0x4531 0x29770
+0x4532 0x29779
+0x4533 0x2982C
+0x4534 0x29852
+0x4535 0x29851
+0x4536 0x2984C
+0x4537 0x29900
+0x4538 0x29910
+0x4539 0x29913
+0x453A 0x298FF
+0x453B 0x298FE
+0x453C 0x298ED
+0x453D 0x29A5A
+0x453E 0x29A58
+0x453F 0x29A5C
+0x4540 0x29ADA
+0x4541 0x29B78
+0x4542 0x29B5E
+0x4543 0x29B67
+0x4544 0x29B64
+0x4545 0x29C13
+0x4546 0x29C23
+0x4547 0x29C41
+0x4548 0x29C3F
+0x4549 0x29C40
+0x454A 0x29CED
+0x454B 0x29CE3
+0x454C 0x29CEA
+0x454D 0x29CF0
+0x454E 0x29CE6
+0x454F 0x29CE9
+0x4550 0x29CF1
+0x4551 0x29CEE
+0x4552 0x29DD4
+0x4553 0x29DD1
+0x4554 0x29DDC
+0x4555 0x29DEC
+0x4556 0x2A069
+0x4557 0x2A06D
+0x4558 0x2A057
+0x4559 0x2A066
+0x455A 0x2A0F9
+0x455B 0x2A04A
+0x455C 0x2A060
+0x455D 0x2A056
+0x455E 0x2A059
+0x455F 0x2A04C
+0x4560 0x2A06A
+0x4561 0x2A062
+0x4562 0x2A063
+0x4563 0x2A070
+0x4564 0x2A05F
+0x4565 0x2FA0D
+0x4566 0x2A064
+0x4567 0x2A05D
+0x4568 0x2A068
+0x4569 0x2A09F
+0x456A 0x2A2BA
+0x456B 0x2A2B8
+0x456C 0x2A2BC
+0x456D 0x2A2B9
+0x456E 0x2A2B4
+0x456F 0x2A33B
+0x4570 0x2A32D
+0x4571 0x2A338
+0x4572 0x2A32F
+0x4573 0x2A332
+0x4574 0x2A441
+0x4575 0x2A4CB
+0x4576 0x2A4DE
+0x4577 0x2A4DD
+0x4578 0x2A4DA
+0x4579 0x2A4DC
+0x457A 0x2A510
+0x457B 0x2A54F
+0x457C 0x2A549
+0x457D 0x2A598
+0x457E 0x2A596
+0x4621 0x2A597
+0x4622 0x2A5C7
+0x4623 0x2019C
+0x4624 0x2A5DA
+0x4625 0x2A5D8
+0x4626 0x2A6A8
+0x4627 0x2010A
+0x4628 0x2019D
+0x4629 0x204CB
+0x462A 0x20538
+0x462B 0x20539
+0x462C 0x205A6
+0x462D 0x20823
+0x462E 0x20822
+0x462F 0x20821
+0x4630 0x209CE
+0x4631 0x20B92
+0x4632 0x20B91
+0x4633 0x210EC
+0x4634 0x210E0
+0x4635 0x210ED
+0x4636 0x21108
+0x4637 0x210E5
+0x4638 0x210EE
+0x4639 0x210E4
+0x463A 0x210EB
+0x463B 0x210E3
+0x463C 0x210EA
+0x463D 0x2110A
+0x463E 0x2F859
+0x463F 0x214D1
+0x4640 0x214E3
+0x4641 0x214D4
+0x4642 0x214D0
+0x4643 0x214D9
+0x4646 0x214DA
+0x4647 0x214D3
+0x4648 0x2154C
+0x4649 0x2154D
+0x464A 0x2157C
+0x464B 0x21580
+0x464C 0x215CC
+0x464D 0x218FF
+0x464E 0x21908
+0x464F 0x2A508
+0x4650 0x21901
+0x4651 0x2F86B
+0x4652 0x21900
+0x4653 0x21AED
+0x4654 0x21AF3
+0x4655 0x21AEE
+0x4656 0x21AF1
+0x4657 0x21AF0
+0x4658 0x21ADE
+0x4659 0x21B51
+0x465A 0x21F82
+0x465B 0x21FA9
+0x465C 0x21F98
+0x465D 0x21F9D
+0x465E 0x21F9A
+0x465F 0x21F9E
+0x4660 0x21F9F
+0x4661 0x21FA6
+0x4662 0x21FA7
+0x4663 0x22009
+0x4664 0x2202F
+0x4665 0x22171
+0x4666 0x2216D
+0x4667 0x22172
+0x4668 0x222EF
+0x4669 0x222F0
+0x466A 0x2243B
+0x466B 0x22439
+0x466C 0x2243C
+0x466D 0x22438
+0x466E 0x24BFD
+0x466F 0x2243A
+0x4670 0x22478
+0x4671 0x22479
+0x4672 0x22477
+0x4673 0x22598
+0x4674 0x2259C
+0x4675 0x22599
+0x4676 0x2259A
+0x4677 0x22911
+0x4678 0x2290A
+0x4679 0x228FD
+0x467A 0x2290F
+0x467B 0x22919
+0x467C 0x22903
+0x467D 0x22915
+0x467E 0x2290C
+0x4721 0x22909
+0x4722 0x22912
+0x4723 0x22934
+0x4724 0x2292A
+0x4725 0x22908
+0x4726 0x2292D
+0x4727 0x22928
+0x4728 0x2F8B1
+0x4729 0x2292C
+0x472A 0x22926
+0x472B 0x22933
+0x472D 0x22A1A
+0x472E 0x22A1E
+0x472F 0x22E07
+0x4730 0x22E2C
+0x4731 0x22E32
+0x4732 0x22E28
+0x4733 0x22E31
+0x4734 0x22E29
+0x4735 0x22E30
+0x4736 0x22E2A
+0x4737 0x22E44
+0x4738 0x22E2E
+0x4739 0x230D1
+0x473A 0x23124
+0x473B 0x232F7
+0x473C 0x232F4
+0x473D 0x232F3
+0x473E 0x232F8
+0x473F 0x237B5
+0x4740 0x23796
+0x4741 0x23798
+0x4742 0x23795
+0x4743 0x23791
+0x4744 0x237B2
+0x4745 0x2379E
+0x4746 0x23759
+0x4747 0x237A3
+0x4748 0x2379A
+0x4749 0x2379B
+0x474B 0x26183
+0x474C 0x23ADA
+0x474D 0x23ADF
+0x474E 0x23B16
+0x474F 0x23C1F
+0x4750 0x23C2D
+0x4751 0x23C2E
+0x4752 0x23C2B
+0x4753 0x240B8
+0x4754 0x240BB
+0x4755 0x240BF
+0x4756 0x240BA
+0x4757 0x240D5
+0x4758 0x240E3
+0x4759 0x240C1
+0x475A 0x240BE
+0x475B 0x240BD
+0x475C 0x240B4
+0x475D 0x240C2
+0x475E 0x240A1
+0x475F 0x24087
+0x4760 0x240D7
+0x4761 0x240CA
+0x4762 0x240B5
+0x4763 0x240DA
+0x4764 0x240D9
+0x4765 0x240B3
+0x4766 0x240D8
+0x4767 0x24467
+0x4768 0x24471
+0x4769 0x24462
+0x476A 0x2445C
+0x476B 0x24468
+0x476C 0x24452
+0x476D 0x24456
+0x476E 0x21109
+0x476F 0x20442
+0x4770 0x245A0
+0x4771 0x24700
+0x4772 0x246FE
+0x4773 0x246FF
+0x4774 0x248CB
+0x4775 0x2F928
+0x4776 0x248CA
+0x4777 0x248A9
+0x4778 0x248C8
+0x4779 0x24AB4
+0x477A 0x24AAC
+0x477B 0x24AAA
+0x477C 0x24AA9
+0x477D 0x24C0E
+0x477E 0x24CE9
+0x4821 0x24CED
+0x4822 0x24CF2
+0x4823 0x24CEB
+0x4824 0x24CEE
+0x4825 0x24EE8
+0x4826 0x24EDB
+0x4827 0x24ED7
+0x4828 0x24EE3
+0x4829 0x24EE5
+0x482A 0x24EEE
+0x482B 0x24ED5
+0x482C 0x24FB3
+0x482D 0x2502D
+0x482E 0x250C1
+0x482F 0x250C3
+0x4830 0x2530C
+0x4831 0x2530E
+0x4832 0x25307
+0x4833 0x25317
+0x4834 0x25309
+0x4835 0x25316
+0x4836 0x2539A
+0x4837 0x2539C
+0x4838 0x255B4
+0x4839 0x255B7
+0x483A 0x255B3
+0x483B 0x2154E
+0x483C 0x25713
+0x483D 0x25714
+0x483E 0x258E6
+0x483F 0x258DC
+0x4840 0x258E8
+0x4841 0x258E5
+0x4842 0x25A2E
+0x4843 0x25A2C
+0x4844 0x25A2B
+0x4845 0x25ACD
+0x4846 0x25D3D
+0x4847 0x25D32
+0x4848 0x25D2D
+0x4849 0x25D45
+0x484A 0x25D3E
+0x484B 0x25D50
+0x484C 0x25D25
+0x484D 0x25D53
+0x484E 0x25D23
+0x484F 0x25F37
+0x4850 0x25F38
+0x4851 0x25F47
+0x4852 0x25F3D
+0x4853 0x25F3E
+0x4854 0x25F49
+0x4855 0x25F4A
+0x4856 0x25F1D
+0x4858 0x261A5
+0x4859 0x2618C
+0x485A 0x2618D
+0x485B 0x26189
+0x485C 0x26196
+0x485D 0x26185
+0x485E 0x2618F
+0x485F 0x26177
+0x4860 0x2618E
+0x4861 0x26182
+0x4862 0x2618A
+0x4863 0x26188
+0x4864 0x2617B
+0x4865 0x26197
+0x4866 0x2617D
+0x4867 0x26179
+0x4868 0x26259
+0x4869 0x26324
+0x486A 0x2632D
+0x486B 0x2632E
+0x486C 0x2632B
+0x486D 0x2F976
+0x486E 0x263DA
+0x486F 0x263D8
+0x4870 0x263D6
+0x4871 0x26487
+0x4872 0x264A0
+0x4873 0x26528
+0x4874 0x26525
+0x4875 0x2651F
+0x4876 0x265F3
+0x4877 0x265F7
+0x4878 0x265F6
+0x4879 0x2682B
+0x487A 0x2685B
+0x487B 0x26848
+0x487D 0x2685C
+0x487E 0x2686D
+0x4921 0x2689D
+0x4922 0x26899
+0x4923 0x2688C
+0x4924 0x26891
+0x4925 0x2689B
+0x4926 0x2689A
+0x4927 0x2689C
+0x4928 0x26895
+0x4929 0x2688D
+0x492A 0x26896
+0x492B 0x268A5
+0x492C 0x2692A
+0x492D 0x269A1
+0x492E 0x269A4
+0x492F 0x269AD
+0x4930 0x26AA9
+0x4931 0x26AAE
+0x4932 0x26AB0
+0x4933 0x2700D
+0x4934 0x26F63
+0x4935 0x26F71
+0x4936 0x27051
+0x4937 0x27054
+0x4938 0x2702A
+0x4939 0x27044
+0x493A 0x27055
+0x493B 0x27099
+0x493C 0x27039
+0x493D 0x2703F
+0x493E 0x2703E
+0x493F 0x2704F
+0x4940 0x2704D
+0x4941 0x27035
+0x4942 0x27040
+0x4943 0x27031
+0x4944 0x26FD5
+0x4945 0x2702B
+0x4946 0x27033
+0x4947 0x27041
+0x4948 0x27056
+0x4949 0x2704C
+0x494A 0x27046
+0x494B 0x2703C
+0x494C 0x27045
+0x494D 0x27043
+0x494E 0x2703D
+0x494F 0x27070
+0x4950 0x27057
+0x4951 0x27038
+0x4952 0x27058
+0x4954 0x27037
+0x4955 0x27207
+0x4956 0x27206
+0x4957 0x27209
+0x4958 0x274AB
+0x4959 0x27490
+0x495A 0x27493
+0x495B 0x274BC
+0x495C 0x274A9
+0x495D 0x2749E
+0x495E 0x274BF
+0x495F 0x274AA
+0x4960 0x27491
+0x4961 0x274A4
+0x4962 0x2749A
+0x4963 0x274A7
+0x4964 0x274A1
+0x4965 0x2749C
+0x4966 0x274A2
+0x4967 0x2749B
+0x4968 0x2749F
+0x4969 0x27494
+0x496A 0x2748F
+0x496B 0x272F0
+0x496C 0x27492
+0x496D 0x27495
+0x496E 0x274A5
+0x496F 0x274A6
+0x4970 0x27604
+0x4971 0x2779C
+0x4972 0x27779
+0x4973 0x2777A
+0x4974 0x2777E
+0x4975 0x2777B
+0x4976 0x27771
+0x4977 0x27781
+0x4978 0x2777F
+0x4979 0x2777C
+0x497A 0x2777D
+0x497B 0x27775
+0x497C 0x27776
+0x497D 0x2788E
+0x497E 0x2788F
+0x4A21 0x2793E
+0x4A22 0x2793F
+0x4A23 0x27940
+0x4A24 0x27941
+0x4A26 0x27B0D
+0x4A27 0x27B17
+0x4A28 0x27B10
+0x4A29 0x27B0E
+0x4A2A 0x27AEA
+0x4A2B 0x27B1D
+0x4A2C 0x27B03
+0x4A2D 0x27B22
+0x4A2E 0x27B04
+0x4A2F 0x27B00
+0x4A30 0x27B20
+0x4A31 0x27B21
+0x4A32 0x27B23
+0x4A33 0x27B13
+0x4A34 0x27B09
+0x4A35 0x27B11
+0x4A36 0x27BCB
+0x4A37 0x27BCE
+0x4A38 0x27BD0
+0x4A39 0x27BCC
+0x4A3A 0x27BD4
+0x4A3B 0x214DB
+0x4A3C 0x27C09
+0x4A3D 0x27C0B
+0x4A3E 0x27C85
+0x4A3F 0x27D06
+0x4A40 0x27D0D
+0x4A42 0x27D14
+0x4A43 0x27D0F
+0x4A44 0x27E09
+0x4A45 0x27E14
+0x4A46 0x27E0B
+0x4A47 0x27DFC
+0x4A48 0x27E04
+0x4A49 0x27E0A
+0x4A4A 0x27E00
+0x4A4B 0x27DFD
+0x4A4C 0x27E07
+0x4A4D 0x27E06
+0x4A4E 0x27E11
+0x4A4F 0x27E79
+0x4A50 0x27E78
+0x4A51 0x27F88
+0x4A52 0x27F80
+0x4A53 0x27F8B
+0x4A54 0x28159
+0x4A55 0x28161
+0x4A56 0x28175
+0x4A58 0x28155
+0x4A59 0x2815B
+0x4A5A 0x2815F
+0x4A5B 0x28152
+0x4A5C 0x28162
+0x4A5D 0x28172
+0x4A5E 0x2815D
+0x4A5F 0x28168
+0x4A60 0x28171
+0x4A61 0x28165
+0x4A62 0x28166
+0x4A63 0x28167
+0x4A64 0x28176
+0x4A65 0x2814C
+0x4A66 0x28160
+0x4A67 0x28174
+0x4A68 0x28150
+0x4A69 0x2828A
+0x4A6A 0x28281
+0x4A6B 0x28286
+0x4A6C 0x2827F
+0x4A6D 0x28280
+0x4A6E 0x283A5
+0x4A6F 0x283A7
+0x4A70 0x283A8
+0x4A71 0x283A6
+0x4A72 0x283AF
+0x4A73 0x26195
+0x4A74 0x283B1
+0x4A75 0x28435
+0x4A76 0x28439
+0x4A77 0x285C3
+0x4A78 0x28630
+0x4A79 0x2862A
+0x4A7A 0x2862B
+0x4A7B 0x2862D
+0x4A7C 0x2862E
+0x4A7D 0x2862C
+0x4A7E 0x28623
+0x4B21 0x28621
+0x4B22 0x28622
+0x4B23 0x2876C
+0x4B24 0x28781
+0x4B25 0x2878F
+0x4B26 0x28780
+0x4B27 0x287D0
+0x4B28 0x287CD
+0x4B29 0x287D5
+0x4B2A 0x287D4
+0x4B2B 0x288D1
+0x4B2C 0x288BE
+0x4B2D 0x288CB
+0x4B2E 0x288CE
+0x4B2F 0x288BD
+0x4B30 0x288D0
+0x4B31 0x28B04
+0x4B32 0x28AD5
+0x4B33 0x28AD0
+0x4B34 0x28AD3
+0x4B35 0x28AFB
+0x4B36 0x28AD8
+0x4B37 0x28AD1
+0x4B38 0x28AFD
+0x4B39 0x28AD9
+0x4B3A 0x28AD6
+0x4B3B 0x28AE6
+0x4B3C 0x28AF9
+0x4B3D 0x28DA1
+0x4B3E 0x28D9D
+0x4B3F 0x28D9E
+0x4B41 0x28EFF
+0x4B42 0x28F5F
+0x4B43 0x28F57
+0x4B44 0x28F60
+0x4B45 0x28F59
+0x4B46 0x2902C
+0x4B47 0x29025
+0x4B48 0x29027
+0x4B49 0x29030
+0x4B4A 0x29024
+0x4B4B 0x29026
+0x4B4C 0x2902D
+0x4B4D 0x2902E
+0x4B4E 0x29029
+0x4B4F 0x29031
+0x4B50 0x29145
+0x4B51 0x29147
+0x4B52 0x29152
+0x4B53 0x2914A
+0x4B54 0x29150
+0x4B55 0x29146
+0x4B56 0x2914F
+0x4B57 0x2914E
+0x4B58 0x29153
+0x4B59 0x29321
+0x4B5A 0x29309
+0x4B5B 0x2931A
+0x4B5C 0x2931B
+0x4B5D 0x25315
+0x4B5E 0x29310
+0x4B5F 0x2F9F9
+0x4B60 0x29314
+0x4B61 0x2930E
+0x4B62 0x29312
+0x4B63 0x2930B
+0x4B64 0x293CF
+0x4B65 0x293D2
+0x4B66 0x293D0
+0x4B67 0x293D4
+0x4B68 0x293D3
+0x4B69 0x293D1
+0x4B6A 0x20B18
+0x4B6B 0x2F9FB
+0x4B6C 0x29409
+0x4B6D 0x2951C
+0x4B6E 0x29527
+0x4B6F 0x29525
+0x4B70 0x2951B
+0x4B71 0x29529
+0x4B72 0x2951F
+0x4B73 0x29530
+0x4B74 0x29524
+0x4B75 0x29528
+0x4B76 0x29519
+0x4B77 0x2952F
+0x4B78 0x29624
+0x4B79 0x29621
+0x4B7A 0x29625
+0x4B7B 0x29626
+0x4B7C 0x29627
+0x4B7D 0x29676
+0x4B7E 0x29766
+0x4C21 0x29775
+0x4C22 0x29769
+0x4C23 0x2977E
+0x4C24 0x2978F
+0x4C25 0x29774
+0x4C26 0x27210
+0x4C27 0x297AD
+0x4C28 0x2982B
+0x4C29 0x2982A
+0x4C2A 0x29858
+0x4C2B 0x29922
+0x4C2C 0x2991D
+0x4C2D 0x2992B
+0x4C2E 0x2992C
+0x4C2F 0x2992D
+0x4C30 0x29933
+0x4C31 0x2991B
+0x4C32 0x29927
+0x4C33 0x2992A
+0x4C34 0x29928
+0x4C35 0x2993B
+0x4C36 0x29A7E
+0x4C37 0x29A71
+0x4C38 0x29A79
+0x4C39 0x29A78
+0x4C3A 0x29A70
+0x4C3B 0x29A6D
+0x4C3C 0x29A7D
+0x4C3D 0x29A75
+0x4C3E 0x29A76
+0x4C3F 0x29ADE
+0x4C40 0x29B66
+0x4C41 0x29B83
+0x4C42 0x29B87
+0x4C43 0x29B7B
+0x4C44 0x29B89
+0x4C45 0x29B86
+0x4C46 0x29B82
+0x4C47 0x29B7C
+0x4C48 0x29B81
+0x4C49 0x29C43
+0x4C4A 0x29C45
+0x4C4B 0x29CF7
+0x4C4C 0x29CF9
+0x4C4D 0x29CFA
+0x4C4E 0x29E05
+0x4C4F 0x29DFE
+0x4C50 0x29E0F
+0x4C51 0x29DFF
+0x4C52 0x29DFA
+0x4C53 0x29E09
+0x4C54 0x29E20
+0x4C55 0x29E0C
+0x4C56 0x29E3C
+0x4C57 0x29E22
+0x4C58 0x29DF8
+0x4C59 0x29E0A
+0x4C5A 0x29E08
+0x4C5B 0x29DF7
+0x4C5C 0x2A08E
+0x4C5D 0x2A077
+0x4C5E 0x2A08B
+0x4C5F 0x2A0B4
+0x4C60 0x2A08A
+0x4C61 0x2A09A
+0x4C62 0x2A079
+0x4C63 0x2A083
+0x4C64 0x2A07F
+0x4C65 0x2A0A1
+0x4C66 0x2A08F
+0x4C67 0x2A0A3
+0x4C68 0x2A081
+0x4C69 0x2A094
+0x4C6A 0x2A07E
+0x4C6B 0x2A082
+0x4C6C 0x2A090
+0x4C6D 0x2A0A5
+0x4C6E 0x2A0AD
+0x4C6F 0x2A09D
+0x4C70 0x2A267
+0x4C71 0x2A269
+0x4C72 0x2A2CB
+0x4C73 0x2A2C8
+0x4C74 0x2A2D1
+0x4C75 0x2A340
+0x4C76 0x2A34B
+0x4C77 0x2A349
+0x4C78 0x2A346
+0x4C79 0x2A33E
+0x4C7A 0x2A343
+0x4C7B 0x2A33F
+0x4C7C 0x2A3A5
+0x4C7D 0x2A3A7
+0x4C7E 0x2A44E
+0x4D21 0x2A44D
+0x4D22 0x2259B
+0x4D23 0x2A4E5
+0x4D24 0x2A4E1
+0x4D25 0x2A4E2
+0x4D26 0x2A516
+0x4D27 0x2A514
+0x4D28 0x2FA1B
+0x4D29 0x2A559
+0x4D2A 0x2A551
+0x4D2B 0x2A55F
+0x4D2C 0x2A54A
+0x4D2D 0x2A557
+0x4D2E 0x2A558
+0x4D2F 0x2A5CA
+0x4D30 0x2A5DB
+0x4D31 0x2A5DE
+0x4D32 0x2A5E0
+0x4D33 0x2A5E1
+0x4D34 0x2A5DF
+0x4D35 0x2A5E2
+0x4D36 0x2A5E3
+0x4D37 0x2A692
+0x4D38 0x2A6BF
+0x4D39 0x2A6BE
+0x4D3A 0x2010B
+0x4D3B 0x20452
+0x4D3C 0x2044E
+0x4D3E 0x2F813
+0x4D3F 0x205A7
+0x4D40 0x20826
+0x4D41 0x20827
+0x4D42 0x208C6
+0x4D43 0x2090B
+0x4D44 0x2096A
+0x4D45 0x20978
+0x4D46 0x2111A
+0x4D47 0x21116
+0x4D48 0x21119
+0x4D49 0x21117
+0x4D4A 0x2111B
+0x4D4B 0x21118
+0x4D4C 0x21120
+0x4D4D 0x21237
+0x4D4E 0x214EC
+0x4D4F 0x21581
+0x4D50 0x2923D
+0x4D51 0x2190F
+0x4D52 0x219AD
+0x4D53 0x21AFB
+0x4D54 0x21B52
+0x4D55 0x21FAF
+0x4D56 0x21FB7
+0x4D57 0x21FB2
+0x4D58 0x22178
+0x4D59 0x221AC
+0x4D5A 0x22300
+0x4D5B 0x222FE
+0x4D5C 0x22302
+0x4D5D 0x222FD
+0x4D5E 0x22303
+0x4D5F 0x22440
+0x4D60 0x22443
+0x4D61 0x22442
+0x4D62 0x224B7
+0x4D63 0x225A2
+0x4D64 0x22900
+0x4D65 0x22935
+0x4D66 0x22941
+0x4D67 0x22905
+0x4D68 0x20453
+0x4D69 0x22950
+0x4D6A 0x2294E
+0x4D6B 0x22953
+0x4D6C 0x22E53
+0x4D6D 0x22E50
+0x4D6E 0x22E57
+0x4D6F 0x22E5F
+0x4D70 0x22E55
+0x4D71 0x22EEA
+0x4D72 0x23026
+0x4D73 0x29830
+0x4D74 0x2302A
+0x4D75 0x23028
+0x4D76 0x2302C
+0x4D77 0x2302D
+0x4D78 0x230D4
+0x4D79 0x23307
+0x4D7A 0x23358
+0x4D7B 0x23359
+0x4D7C 0x237C5
+0x4D7D 0x237CD
+0x4D7E 0x237C7
+0x4E21 0x237E8
+0x4E23 0x23932
+0x4E24 0x2A697
+0x4E25 0x23ADE
+0x4E26 0x23C32
+0x4E27 0x20AC8
+0x4E28 0x2F915
+0x4E29 0x240F1
+0x4E2A 0x240F0
+0x4E2B 0x240EC
+0x4E2C 0x24109
+0x4E2D 0x240F9
+0x4E2E 0x240F5
+0x4E2F 0x240FE
+0x4E30 0x24474
+0x4E31 0x24481
+0x4E32 0x2447C
+0x4E33 0x24475
+0x4E34 0x24489
+0x4E35 0x24482
+0x4E36 0x24497
+0x4E37 0x24486
+0x4E38 0x2447D
+0x4E39 0x24493
+0x4E3A 0x2449C
+0x4E3B 0x24476
+0x4E3C 0x24480
+0x4E3D 0x24545
+0x4E3E 0x206A1
+0x4E3F 0x24703
+0x4E40 0x248C9
+0x4E41 0x248CD
+0x4E42 0x248D0
+0x4E43 0x24AAD
+0x4E44 0x24AC5
+0x4E45 0x24BA2
+0x4E46 0x24CEC
+0x4E47 0x24CF6
+0x4E48 0x24CF3
+0x4E49 0x24EF3
+0x4E4A 0x24EFA
+0x4E4B 0x24EF9
+0x4E4C 0x24EF5
+0x4E4D 0x24EF4
+0x4E4E 0x24EF8
+0x4E4F 0x24FB6
+0x4E50 0x24FB4
+0x4E51 0x25032
+0x4E52 0x250CD
+0x4E53 0x250C8
+0x4E54 0x250CE
+0x4E55 0x250CA
+0x4E56 0x2532A
+0x4E57 0x25321
+0x4E58 0x2531D
+0x4E59 0x255BD
+0x4E5A 0x255BE
+0x4E5B 0x255C2
+0x4E5D 0x255C9
+0x4E5E 0x2571F
+0x4E5F 0x258F1
+0x4E60 0x258ED
+0x4E61 0x258F2
+0x4E62 0x258E0
+0x4E63 0x258F7
+0x4E64 0x25A30
+0x4E65 0x25A37
+0x4E66 0x25A31
+0x4E67 0x25A36
+0x4E68 0x25AC8
+0x4E69 0x25D6D
+0x4E6A 0x25D69
+0x4E6B 0x25D7D
+0x4E6C 0x25D61
+0x4E6D 0x25D70
+0x4E6E 0x25D71
+0x4E6F 0x25D73
+0x4E70 0x25D76
+0x4E71 0x25D75
+0x4E72 0x25D78
+0x4E73 0x25D79
+0x4E74 0x25D64
+0x4E75 0x25D6E
+0x4E76 0x25F51
+0x4E77 0x25F4F
+0x4E78 0x25F22
+0x4E79 0x261AF
+0x4E7A 0x261AA
+0x4E7B 0x261A3
+0x4E7C 0x2619D
+0x4E7D 0x2619C
+0x4E7E 0x261A1
+0x4F21 0x261B6
+0x4F22 0x261AC
+0x4F23 0x261A2
+0x4F24 0x261A7
+0x4F25 0x261B0
+0x4F26 0x261A9
+0x4F27 0x261C3
+0x4F28 0x26331
+0x4F29 0x26332
+0x4F2A 0x26333
+0x4F2B 0x26334
+0x4F2C 0x26337
+0x4F2D 0x2633C
+0x4F2E 0x263D9
+0x4F2F 0x263DD
+0x4F30 0x263DE
+0x4F31 0x263DF
+0x4F32 0x263E0
+0x4F33 0x264A5
+0x4F34 0x264AA
+0x4F35 0x264A2
+0x4F36 0x264A3
+0x4F37 0x26604
+0x4F38 0x26603
+0x4F39 0x265FE
+0x4F3A 0x26628
+0x4F3B 0x268AF
+0x4F3C 0x268AD
+0x4F3D 0x268A6
+0x4F3E 0x269AC
+0x4F3F 0x269A5
+0x4F40 0x269B0
+0x4F41 0x269B1
+0x4F42 0x26A01
+0x4F43 0x26AB2
+0x4F44 0x26AD2
+0x4F45 0x26AF1
+0x4F46 0x26FD1
+0x4F47 0x27047
+0x4F48 0x270C9
+0x4F49 0x270A7
+0x4F4A 0x270C8
+0x4F4B 0x27095
+0x4F4C 0x2708E
+0x4F4D 0x27091
+0x4F4E 0x2707D
+0x4F4F 0x270EE
+0x4F50 0x2708D
+0x4F51 0x2708C
+0x4F52 0x270B0
+0x4F53 0x27096
+0x4F54 0x27042
+0x4F55 0x2707C
+0x4F56 0x270B1
+0x4F57 0x270B2
+0x4F58 0x27084
+0x4F59 0x2709D
+0x4F5A 0x270A1
+0x4F5B 0x27098
+0x4F5C 0x270B3
+0x4F5D 0x27022
+0x4F5E 0x2707B
+0x4F5F 0x2708A
+0x4F60 0x270CE
+0x4F61 0x27080
+0x4F62 0x27097
+0x4F63 0x270B4
+0x4F64 0x270B5
+0x4F65 0x2709A
+0x4F66 0x2709F
+0x4F67 0x27093
+0x4F68 0x27212
+0x4F69 0x2720B
+0x4F6A 0x2720E
+0x4F6B 0x274A3
+0x4F6C 0x274CC
+0x4F6D 0x274DC
+0x4F6E 0x274E1
+0x4F6F 0x274DE
+0x4F70 0x274D2
+0x4F71 0x274DB
+0x4F72 0x274D9
+0x4F73 0x274D7
+0x4F74 0x274D4
+0x4F75 0x274C9
+0x4F76 0x274EB
+0x4F77 0x274DA
+0x4F78 0x274D1
+0x4F79 0x27504
+0x4F7A 0x274CA
+0x4F7B 0x274E2
+0x4F7C 0x275D7
+0x4F7D 0x2778C
+0x4F7E 0x27799
+0x5021 0x277A2
+0x5022 0x27796
+0x5023 0x27794
+0x5024 0x2779F
+0x5026 0x2778E
+0x5027 0x27803
+0x5028 0x27894
+0x5029 0x27893
+0x502A 0x27944
+0x502B 0x27B2F
+0x502C 0x27B35
+0x502D 0x27B2B
+0x502E 0x27B32
+0x502F 0x27B2D
+0x5030 0x27B36
+0x5032 0x27B31
+0x5033 0x27B12
+0x5034 0x27B33
+0x5035 0x27B1F
+0x5036 0x27B34
+0x5037 0x27B40
+0x5038 0x27B3F
+0x5039 0x27B41
+0x503A 0x27BD3
+0x503B 0x27C89
+0x503C 0x27D18
+0x503D 0x27D10
+0x503E 0x27E1A
+0x503F 0x27E25
+0x5040 0x27E1E
+0x5041 0x27F92
+0x5042 0x27F95
+0x5043 0x27F93
+0x5044 0x28184
+0x5045 0x2819A
+0x5046 0x28189
+0x5047 0x2818D
+0x5048 0x28188
+0x5049 0x28191
+0x504A 0x2819B
+0x504B 0x2819C
+0x504C 0x29548
+0x504D 0x2828E
+0x504E 0x28292
+0x504F 0x283C5
+0x5050 0x283C1
+0x5051 0x283B8
+0x5052 0x283BE
+0x5053 0x283B5
+0x5054 0x283C7
+0x5055 0x2843C
+0x5057 0x285EC
+0x5058 0x2863F
+0x5059 0x28639
+0x505A 0x28637
+0x505B 0x287A1
+0x505C 0x28794
+0x505D 0x287A0
+0x505E 0x287DE
+0x505F 0x287DB
+0x5060 0x287DF
+0x5061 0x287DC
+0x5062 0x288D6
+0x5063 0x288DC
+0x5064 0x288DD
+0x5065 0x288E0
+0x5066 0x288E3
+0x5067 0x288E1
+0x5068 0x28B18
+0x5069 0x28B19
+0x506A 0x28B53
+0x506B 0x2F9EC
+0x506C 0x28B44
+0x506D 0x28B0E
+0x506E 0x28B0F
+0x506F 0x28B47
+0x5070 0x28B17
+0x5071 0x28B1D
+0x5072 0x28B11
+0x5073 0x28CB4
+0x5074 0x28CB6
+0x5075 0x28DB7
+0x5076 0x28DBE
+0x5077 0x28DC2
+0x5078 0x28DB4
+0x5079 0x28F31
+0x507A 0x28F15
+0x507B 0x28F83
+0x507C 0x2903B
+0x507D 0x29036
+0x507E 0x29042
+0x5121 0x29050
+0x5122 0x29040
+0x5123 0x29034
+0x5124 0x29038
+0x5125 0x2903D
+0x5126 0x2903E
+0x5127 0x29035
+0x5128 0x2903A
+0x5129 0x29046
+0x512A 0x29037
+0x512B 0x29039
+0x512C 0x29045
+0x512D 0x29177
+0x512E 0x2915D
+0x512F 0x2916A
+0x5130 0x29176
+0x5131 0x2916B
+0x5132 0x2916C
+0x5133 0x29165
+0x5134 0x29164
+0x5135 0x29171
+0x5136 0x2915F
+0x5137 0x29172
+0x5138 0x291FE
+0x5139 0x291FF
+0x513A 0x2923E
+0x513B 0x2932B
+0x513C 0x29336
+0x513D 0x2932D
+0x513E 0x29339
+0x513F 0x2933F
+0x5140 0x2933B
+0x5141 0x29333
+0x5142 0x29342
+0x5143 0x2933A
+0x5144 0x293D5
+0x5145 0x293D8
+0x5146 0x293D9
+0x5147 0x2940D
+0x5148 0x2940A
+0x5149 0x29439
+0x514A 0x2943A
+0x514B 0x2953D
+0x514C 0x29545
+0x514D 0x2953A
+0x514E 0x29537
+0x514F 0x2953E
+0x5150 0x29542
+0x5151 0x29787
+0x5152 0x2978C
+0x5153 0x29782
+0x5154 0x2976B
+0x5155 0x297A0
+0x5156 0x2979A
+0x5157 0x29790
+0x5158 0x2978E
+0x5159 0x297A1
+0x515A 0x297BD
+0x515B 0x297B2
+0x515C 0x297B5
+0x515D 0x297B7
+0x515E 0x297AA
+0x515F 0x297A2
+0x5160 0x297A5
+0x5161 0x297AE
+0x5162 0x297AB
+0x5163 0x297BC
+0x5164 0x29832
+0x5165 0x2985A
+0x5166 0x29964
+0x5167 0x2995C
+0x5168 0x2994D
+0x5169 0x2993F
+0x516A 0x2993E
+0x516B 0x29952
+0x516C 0x29958
+0x516D 0x29957
+0x516E 0x2995E
+0x516F 0x29953
+0x5170 0x29954
+0x5171 0x29956
+0x5172 0x28F65
+0x5173 0x29A84
+0x5174 0x29A85
+0x5175 0x29A86
+0x5176 0x29B97
+0x5177 0x29BA1
+0x5178 0x29BA2
+0x517A 0x2FA0A
+0x517B 0x29BA3
+0x517C 0x29BA6
+0x517E 0x29C15
+0x5221 0x29C24
+0x5222 0x29C4A
+0x5223 0x29C49
+0x5224 0x29C48
+0x5225 0x29C4B
+0x5226 0x29D0E
+0x5227 0x29962
+0x5228 0x29D0B
+0x5229 0x29D0A
+0x522A 0x29D08
+0x522B 0x29D06
+0x522C 0x29E43
+0x522D 0x29E47
+0x522E 0x29E3F
+0x522F 0x29E46
+0x5230 0x29E50
+0x5232 0x29E4B
+0x5234 0x29E52
+0x5235 0x2A0D7
+0x5236 0x2A0BF
+0x5237 0x2A0D8
+0x5238 0x2A0E0
+0x5239 0x2A0E7
+0x523A 0x2A0B8
+0x523B 0x2A0D5
+0x523C 0x2A0EF
+0x523D 0x2A0E6
+0x523E 0x2A0E4
+0x523F 0x2A0D4
+0x5240 0x2A0D6
+0x5241 0x2A0EA
+0x5243 0x2A0BB
+0x5244 0x2A0E9
+0x5245 0x2FA10
+0x5246 0x2A26D
+0x5247 0x2A270
+0x5248 0x2A273
+0x5249 0x2A272
+0x524A 0x2A2D4
+0x524B 0x2A2CE
+0x524C 0x2A2D5
+0x524D 0x2A35A
+0x524E 0x2A358
+0x524F 0x2A352
+0x5250 0x2A350
+0x5251 0x2A355
+0x5252 0x2A34E
+0x5253 0x2A34D
+0x5254 0x2A3CB
+0x5255 0x2A3CC
+0x5256 0x2A3CD
+0x5257 0x2A3D1
+0x5258 0x2A458
+0x5259 0x2A463
+0x525A 0x2A45E
+0x525B 0x2A454
+0x525C 0x2A45B
+0x525D 0x2A4E9
+0x525E 0x2A4E7
+0x525F 0x2A4E8
+0x5260 0x2A51D
+0x5261 0x2A567
+0x5262 0x2A55A
+0x5263 0x2A55C
+0x5264 0x2A55B
+0x5265 0x2A561
+0x5266 0x2A5A1
+0x5268 0x2A5A4
+0x5269 0x2A5E9
+0x526A 0x2A5EF
+0x526B 0x2A5E5
+0x526C 0x2A5F5
+0x526D 0x2A5EB
+0x526E 0x2A5ED
+0x526F 0x2A696
+0x5270 0x2A695
+0x5271 0x2A6B3
+0x5272 0x2A6B5
+0x5273 0x2A6B1
+0x5275 0x2044D
+0x5276 0x20624
+0x5277 0x2082B
+0x5278 0x209CF
+0x5279 0x20AC9
+0x527A 0x21136
+0x527B 0x21131
+0x527C 0x21154
+0x527D 0x2113A
+0x527E 0x21138
+0x5321 0x21239
+0x5322 0x21238
+0x5323 0x214F4
+0x5324 0x214F3
+0x5325 0x214F6
+0x5326 0x214FC
+0x5327 0x214F5
+0x5328 0x214F1
+0x5329 0x2169C
+0x532A 0x21918
+0x532B 0x2191A
+0x532C 0x21AFC
+0x532D 0x21AFE
+0x532E 0x21B03
+0x532F 0x21B53
+0x5330 0x21D2B
+0x5331 0x21FC6
+0x5332 0x21FC1
+0x5333 0x2217B
+0x5334 0x22306
+0x5335 0x22449
+0x5336 0x224B8
+0x5337 0x225A3
+0x5338 0x22952
+0x5339 0x2294D
+0x533A 0x2295F
+0x533B 0x2295E
+0x533C 0x22961
+0x533D 0x22A23
+0x533E 0x22E8C
+0x533F 0x22E6F
+0x5340 0x22E75
+0x5341 0x22E74
+0x5342 0x22E71
+0x5343 0x22E70
+0x5344 0x22E6C
+0x5345 0x23126
+0x5346 0x23308
+0x5348 0x237F0
+0x5349 0x237EF
+0x534A 0x237FB
+0x534B 0x23810
+0x534C 0x2380C
+0x534D 0x237F6
+0x534E 0x237FE
+0x534F 0x23A7C
+0x5350 0x23AE1
+0x5351 0x23C38
+0x5352 0x23C6F
+0x5353 0x24118
+0x5354 0x24115
+0x5355 0x2411C
+0x5356 0x24110
+0x5357 0x24135
+0x5358 0x2F917
+0x5359 0x24117
+0x535A 0x2411D
+0x535B 0x24126
+0x535C 0x24128
+0x535D 0x24129
+0x535E 0x2412A
+0x535F 0x2411A
+0x5360 0x2F916
+0x5361 0x22307
+0x5362 0x244AB
+0x5363 0x244AC
+0x5364 0x244A1
+0x5365 0x244AE
+0x5366 0x244A3
+0x5367 0x244A7
+0x5368 0x24548
+0x5369 0x24604
+0x536A 0x246FD
+0x536C 0x24708
+0x536D 0x248D2
+0x536E 0x24AC6
+0x536F 0x24ABE
+0x5370 0x24B1C
+0x5371 0x24BA6
+0x5372 0x24BA7
+0x5373 0x24BAB
+0x5374 0x24C00
+0x5375 0x24CFB
+0x5376 0x24CFC
+0x5377 0x24CF9
+0x5378 0x24D01
+0x5379 0x24F06
+0x537A 0x24F04
+0x537B 0x2F93C
+0x537C 0x25034
+0x537D 0x25336
+0x537E 0x25332
+0x5421 0x25342
+0x5422 0x2532D
+0x5423 0x25335
+0x5424 0x255D8
+0x5425 0x25723
+0x5426 0x25720
+0x5427 0x25901
+0x5428 0x25900
+0x5429 0x25903
+0x542A 0x2A6BC
+0x542B 0x25A3C
+0x542C 0x25A41
+0x542D 0x25A35
+0x542E 0x25AC9
+0x542F 0x25D8E
+0x5430 0x25D9E
+0x5431 0x25D99
+0x5432 0x25DB4
+0x5433 0x25DAA
+0x5434 0x25D9F
+0x5435 0x25D96
+0x5436 0x25D9D
+0x5437 0x25DC3
+0x5438 0x25D74
+0x5439 0x25DAB
+0x543B 0x25F63
+0x543C 0x25F5B
+0x543D 0x25F5A
+0x543E 0x261C5
+0x543F 0x261C4
+0x5440 0x261CF
+0x5441 0x261C8
+0x5442 0x261A4
+0x5443 0x261BD
+0x5444 0x261D3
+0x5445 0x26260
+0x5446 0x2633B
+0x5447 0x263E3
+0x5448 0x263E7
+0x5449 0x264A8
+0x544A 0x264AC
+0x544B 0x264A9
+0x544C 0x2652A
+0x544D 0x26608
+0x544E 0x26609
+0x544F 0x268B9
+0x5450 0x26AC1
+0x5451 0x26AC2
+0x5452 0x26AB8
+0x5453 0x270E1
+0x5454 0x270EB
+0x5455 0x270E5
+0x5456 0x270FA
+0x5457 0x270E4
+0x5458 0x2710B
+0x5459 0x270D7
+0x545A 0x270EF
+0x545B 0x270E0
+0x545C 0x270EC
+0x545D 0x270FB
+0x545E 0x2F9B0
+0x545F 0x270D3
+0x5460 0x270E6
+0x5461 0x270FC
+0x5462 0x270E3
+0x5463 0x270CF
+0x5464 0x270DA
+0x5465 0x270DC
+0x5466 0x270D2
+0x5467 0x270A4
+0x5469 0x27217
+0x546A 0x27216
+0x546B 0x274F2
+0x546C 0x274FC
+0x546D 0x27518
+0x546E 0x274F6
+0x546F 0x274FE
+0x5470 0x274F3
+0x5471 0x274F7
+0x5472 0x27501
+0x5473 0x274F9
+0x5474 0x27506
+0x5475 0x274F5
+0x5476 0x27510
+0x5477 0x274DF
+0x5478 0x27503
+0x5479 0x27508
+0x547A 0x275D8
+0x547B 0x27605
+0x547C 0x27797
+0x547D 0x277B3
+0x547E 0x277AE
+0x5521 0x277AF
+0x5522 0x277A7
+0x5523 0x277B1
+0x5524 0x277A8
+0x5525 0x277AC
+0x5526 0x277AB
+0x5527 0x27804
+0x5528 0x2789A
+0x5529 0x2794A
+0x552A 0x27B42
+0x552B 0x27B58
+0x552C 0x27B4B
+0x552D 0x27B45
+0x552E 0x27B49
+0x552F 0x27B4C
+0x5530 0x27B59
+0x5531 0x27B56
+0x5533 0x27B46
+0x5534 0x27B44
+0x5535 0x27B5B
+0x5536 0x27B69
+0x5537 0x27C8E
+0x5538 0x27C8F
+0x5539 0x27D1E
+0x553A 0x268BC
+0x553B 0x27E2F
+0x553C 0x27F9E
+0x553D 0x27F9D
+0x553E 0x27F9F
+0x553F 0x27F9C
+0x5540 0x281B4
+0x5541 0x281AE
+0x5542 0x281AB
+0x5543 0x281B3
+0x5544 0x281AF
+0x5545 0x281C2
+0x5546 0x28293
+0x5547 0x28295
+0x5548 0x28296
+0x5549 0x28297
+0x554A 0x283CF
+0x554B 0x283CE
+0x554C 0x283CB
+0x554D 0x2844B
+0x554E 0x28646
+0x554F 0x28643
+0x5550 0x28645
+0x5551 0x28651
+0x5552 0x287AE
+0x5553 0x287AF
+0x5554 0x287B0
+0x5555 0x287B8
+0x5556 0x287E2
+0x5557 0x287E3
+0x5558 0x287E6
+0x5559 0x288ED
+0x555A 0x288EA
+0x555B 0x2893A
+0x555C 0x28B59
+0x555D 0x28B84
+0x555E 0x28B5F
+0x555F 0x28B7C
+0x5560 0x28B5C
+0x5561 0x28B58
+0x5562 0x28B55
+0x5563 0x28B5D
+0x5564 0x28B7E
+0x5565 0x28B80
+0x5566 0x28B83
+0x5567 0x28B57
+0x5569 0x28B5E
+0x556A 0x28CBA
+0x556B 0x28DD5
+0x556C 0x28F58
+0x556D 0x28F68
+0x556E 0x28F67
+0x556F 0x2904A
+0x5570 0x2904C
+0x5571 0x29052
+0x5572 0x29049
+0x5573 0x2904E
+0x5574 0x29047
+0x5575 0x2904D
+0x5576 0x2904B
+0x5577 0x2904F
+0x5578 0x2917E
+0x5579 0x29187
+0x557A 0x29183
+0x557B 0x29189
+0x557C 0x24ACA
+0x557D 0x29186
+0x557E 0x29188
+0x5621 0x29247
+0x5622 0x29242
+0x5623 0x29249
+0x5624 0x29248
+0x5628 0x29344
+0x5629 0x29351
+0x562A 0x29346
+0x562B 0x29347
+0x562C 0x293E4
+0x562D 0x2940F
+0x562E 0x2943F
+0x562F 0x2954B
+0x5630 0x29557
+0x5631 0x29552
+0x5633 0x29551
+0x5634 0x29558
+0x5635 0x2955E
+0x5636 0x29553
+0x5637 0x2955D
+0x5638 0x2954D
+0x5639 0x2963C
+0x563A 0x2963F
+0x563B 0x29646
+0x563C 0x2963E
+0x563D 0x29644
+0x563E 0x29645
+0x563F 0x29641
+0x5640 0x29638
+0x5641 0x29642
+0x5642 0x29643
+0x5643 0x2967A
+0x5644 0x297A3
+0x5645 0x297BA
+0x5646 0x297C0
+0x5647 0x297C4
+0x5648 0x297C6
+0x5649 0x297CB
+0x564A 0x29861
+0x564B 0x2997A
+0x564C 0x29973
+0x564D 0x29972
+0x564E 0x29974
+0x564F 0x29980
+0x5650 0x29981
+0x5652 0x29A95
+0x5653 0x29A8F
+0x5654 0x29A90
+0x5655 0x29A92
+0x5656 0x29A94
+0x5657 0x29A8B
+0x5658 0x29AE6
+0x5659 0x29BB2
+0x565A 0x29BB8
+0x565B 0x29BBD
+0x565C 0x29BBE
+0x565D 0x29BCE
+0x565E 0x29BBA
+0x565F 0x29C16
+0x5660 0x29C26
+0x5661 0x29C25
+0x5662 0x29C4C
+0x5663 0x29C50
+0x5664 0x29C4E
+0x5665 0x29C51
+0x5666 0x29C52
+0x5667 0x29D14
+0x5668 0x29D15
+0x5669 0x29D1B
+0x566A 0x29E82
+0x566B 0x29E99
+0x566C 0x29E9A
+0x566D 0x29E7D
+0x566E 0x29E85
+0x566F 0x29E86
+0x5670 0x29E9C
+0x5671 0x29E79
+0x5672 0x29E7B
+0x5673 0x29E80
+0x5674 0x29E83
+0x5675 0x29E81
+0x5676 0x2A11E
+0x5677 0x2A11B
+0x5678 0x2A12A
+0x5679 0x2A0FB
+0x567A 0x2A105
+0x567B 0x2A120
+0x567C 0x2A111
+0x567D 0x2A104
+0x567E 0x2A0FD
+0x5721 0x2A103
+0x5722 0x2A110
+0x5723 0x2A118
+0x5724 0x2A10A
+0x5725 0x2A14E
+0x5726 0x2A109
+0x5727 0x2A107
+0x5728 0x2A11C
+0x572A 0x2A277
+0x572B 0x2A276
+0x572C 0x2A2D8
+0x572D 0x2A2D9
+0x572E 0x2A361
+0x572F 0x2A35C
+0x5730 0x2A35E
+0x5731 0x2A360
+0x5732 0x2A3AA
+0x5733 0x2A3D6
+0x5734 0x2A3D8
+0x5735 0x2A409
+0x5736 0x2A408
+0x5737 0x2A46B
+0x5738 0x2A465
+0x5739 0x2A473
+0x573A 0x2A474
+0x573B 0x2A4ED
+0x573C 0x2A524
+0x573D 0x2A525
+0x573E 0x2A56A
+0x573F 0x2A5A7
+0x5740 0x2A5A8
+0x5741 0x2A60B
+0x5742 0x2A5FA
+0x5743 0x2A5F9
+0x5744 0x2A5FF
+0x5745 0x2A604
+0x5746 0x2A5F6
+0x5747 0x2A605
+0x5748 0x2A699
+0x5749 0x2A6AB
+0x574A 0x2A6BD
+0x574B 0x2A6B8
+0x574D 0x20464
+0x574E 0x2045A
+0x574F 0x20572
+0x5750 0x2097A
+0x5751 0x20B95
+0x5752 0x2115F
+0x5753 0x21161
+0x5754 0x2115E
+0x5755 0x2115A
+0x5756 0x2115C
+0x5757 0x2115D
+0x5758 0x2116E
+0x5759 0x21157
+0x575A 0x21158
+0x575B 0x21502
+0x575C 0x2150B
+0x575D 0x21508
+0x575E 0x21551
+0x575F 0x21925
+0x5760 0x21928
+0x5761 0x21923
+0x5762 0x21921
+0x5763 0x21924
+0x5764 0x21929
+0x5765 0x21B06
+0x5766 0x21B0A
+0x5767 0x21FCA
+0x5768 0x21FCC
+0x5769 0x21FCB
+0x576A 0x21FCF
+0x576B 0x2217F
+0x576C 0x2217C
+0x576D 0x221D6
+0x576E 0x22309
+0x576F 0x2230B
+0x5770 0x22376
+0x5771 0x2247D
+0x5772 0x225A5
+0x5773 0x2295B
+0x5774 0x2295C
+0x5775 0x2295D
+0x5776 0x22965
+0x5777 0x22E6D
+0x5778 0x22E82
+0x5779 0x22E83
+0x577A 0x22E87
+0x577B 0x22E95
+0x577C 0x22E8A
+0x577D 0x230D6
+0x577E 0x23128
+0x5821 0x2330D
+0x5822 0x2382E
+0x5823 0x2F8EE
+0x5824 0x2382D
+0x5825 0x23821
+0x5826 0x23819
+0x5827 0x2393B
+0x5828 0x2393C
+0x5829 0x2393A
+0x582A 0x23A7E
+0x582B 0x23C3B
+0x582C 0x24147
+0x582D 0x24139
+0x582E 0x24134
+0x582F 0x24136
+0x5830 0x24146
+0x5831 0x2413B
+0x5832 0x24141
+0x5833 0x24145
+0x5834 0x244C0
+0x5835 0x244C4
+0x5836 0x244BA
+0x5837 0x244BD
+0x5838 0x244BE
+0x5839 0x245A3
+0x583A 0x2470C
+0x583B 0x248D9
+0x583C 0x24ACD
+0x583D 0x24BAE
+0x583E 0x24CFF
+0x583F 0x24D24
+0x5840 0x24FBB
+0x5841 0x24FBC
+0x5842 0x25036
+0x5843 0x250D5
+0x5844 0x250D3
+0x5845 0x250D6
+0x5846 0x2533C
+0x5847 0x2533F
+0x5848 0x255DE
+0x5849 0x255E3
+0x584A 0x25727
+0x584B 0x25729
+0x584D 0x25905
+0x584E 0x25907
+0x584F 0x2590C
+0x5850 0x25AD0
+0x5851 0x25DBE
+0x5852 0x25DBC
+0x5853 0x25DD0
+0x5854 0x25DC2
+0x5855 0x25DB5
+0x5856 0x25DC9
+0x5857 0x25F66
+0x5859 0x261D5
+0x585A 0x261E2
+0x585B 0x261DC
+0x585C 0x261E3
+0x585D 0x261DA
+0x585E 0x261C2
+0x585F 0x261E8
+0x5860 0x263E9
+0x5861 0x264AF
+0x5862 0x264AD
+0x5863 0x264AE
+0x5864 0x2660B
+0x5865 0x268C1
+0x5866 0x269B6
+0x5867 0x269B9
+0x5868 0x26AC0
+0x5869 0x270A5
+0x586A 0x27128
+0x586B 0x27122
+0x586C 0x27129
+0x586D 0x27118
+0x586E 0x2711F
+0x586F 0x2711C
+0x5870 0x27112
+0x5871 0x2712A
+0x5873 0x27121
+0x5874 0x2712B
+0x5875 0x27117
+0x5876 0x270F0
+0x5877 0x27116
+0x5878 0x27123
+0x5879 0x2752B
+0x587A 0x27526
+0x587B 0x2753D
+0x587C 0x27522
+0x587D 0x2753A
+0x587E 0x27531
+0x5921 0x27532
+0x5922 0x27554
+0x5923 0x27521
+0x5924 0x27535
+0x5926 0x2752E
+0x5927 0x27530
+0x5928 0x2752F
+0x5929 0x27536
+0x592A 0x275DA
+0x592B 0x275D9
+0x592C 0x277BB
+0x592D 0x277BC
+0x592E 0x277B7
+0x592F 0x277C2
+0x5930 0x277BD
+0x5931 0x277B2
+0x5933 0x25344
+0x5934 0x25DD1
+0x5935 0x27B52
+0x5936 0x27B6B
+0x5937 0x27B67
+0x5939 0x27B61
+0x593A 0x27B6C
+0x593B 0x27B51
+0x593C 0x27B74
+0x593D 0x27B77
+0x593E 0x27B6F
+0x593F 0x27B6D
+0x5940 0x27B68
+0x5941 0x2F9D1
+0x5942 0x27B84
+0x5943 0x27C90
+0x5944 0x27C92
+0x5945 0x27C93
+0x5946 0x27D1F
+0x5947 0x27E31
+0x5948 0x27E38
+0x5949 0x27E39
+0x594A 0x27E37
+0x594B 0x27FAB
+0x594C 0x281C3
+0x594D 0x281C8
+0x594E 0x281CB
+0x594F 0x281CF
+0x5950 0x28298
+0x5951 0x283D4
+0x5952 0x283D3
+0x5953 0x283D8
+0x5954 0x283D9
+0x5955 0x283DD
+0x5956 0x283D1
+0x5957 0x283D6
+0x5958 0x2843E
+0x5959 0x28658
+0x595A 0x28657
+0x595B 0x28655
+0x595C 0x287C4
+0x595D 0x287E4
+0x595E 0x288EE
+0x595F 0x288EF
+0x5960 0x288F3
+0x5961 0x288F2
+0x5962 0x288F0
+0x5963 0x28BAB
+0x5964 0x28B9A
+0x5965 0x28BAF
+0x5966 0x28B97
+0x5969 0x28BBF
+0x596A 0x28B94
+0x596B 0x28B93
+0x596C 0x28CBE
+0x596D 0x28CBB
+0x596E 0x28CBC
+0x596F 0x28DD9
+0x5970 0x28F6C
+0x5971 0x29053
+0x5972 0x29054
+0x5973 0x2905B
+0x5974 0x29058
+0x5975 0x29056
+0x5976 0x29057
+0x5977 0x2919F
+0x5978 0x29194
+0x5979 0x29196
+0x597A 0x29197
+0x597B 0x2924A
+0x597C 0x2924B
+0x597D 0x29355
+0x597E 0x2935A
+0x5A21 0x2935E
+0x5A22 0x2935F
+0x5A23 0x29359
+0x5A24 0x2935B
+0x5A25 0x29358
+0x5A26 0x29354
+0x5A27 0x293E8
+0x5A28 0x293EB
+0x5A29 0x293EC
+0x5A2A 0x29413
+0x5A2B 0x29566
+0x5A2C 0x2956B
+0x5A2D 0x29562
+0x5A2E 0x29569
+0x5A2F 0x29563
+0x5A30 0x2955F
+0x5A31 0x2954E
+0x5A32 0x29648
+0x5A33 0x2964A
+0x5A34 0x297E3
+0x5A35 0x297DB
+0x5A36 0x297D8
+0x5A37 0x297D6
+0x5A38 0x29986
+0x5A39 0x29990
+0x5A3A 0x29991
+0x5A3B 0x29988
+0x5A3C 0x29994
+0x5A3D 0x29983
+0x5A3F 0x2999C
+0x5A40 0x2998D
+0x5A41 0x29985
+0x5A42 0x29A98
+0x5A43 0x29A9A
+0x5A44 0x29A9C
+0x5A45 0x29AE7
+0x5A46 0x29BC5
+0x5A47 0x29BD0
+0x5A48 0x29BD1
+0x5A49 0x29C19
+0x5A4A 0x29C27
+0x5A4C 0x29C54
+0x5A4D 0x29D2D
+0x5A4E 0x29D22
+0x5A50 0x29D1F
+0x5A51 0x29EBD
+0x5A52 0x29EAE
+0x5A53 0x29EBB
+0x5A54 0x29EAD
+0x5A55 0x29EBC
+0x5A56 0x29EB9
+0x5A57 0x29EB4
+0x5A58 0x29ECB
+0x5A59 0x29EB7
+0x5A5A 0x29EB3
+0x5A5B 0x29EBA
+0x5A5C 0x29EB6
+0x5A5D 0x29ECD
+0x5A5E 0x29EBE
+0x5A5F 0x29EC9
+0x5A60 0x2FA0B
+0x5A61 0x2A15F
+0x5A62 0x2A13B
+0x5A63 0x2A161
+0x5A64 0x2A15C
+0x5A65 0x2A18A
+0x5A66 0x2A15A
+0x5A67 0x2A14D
+0x5A68 0x2A146
+0x5A69 0x2A144
+0x5A6A 0x2A13D
+0x5A6B 0x2A140
+0x5A6C 0x2A13C
+0x5A6D 0x2A18C
+0x5A6E 0x2A141
+0x5A6F 0x2A14C
+0x5A70 0x2A13E
+0x5A71 0x2A14A
+0x5A72 0x2A27C
+0x5A73 0x2A27A
+0x5A74 0x2A365
+0x5A75 0x2A36E
+0x5A76 0x2A369
+0x5A77 0x2A36A
+0x5A78 0x2A36F
+0x5A79 0x2A36C
+0x5A7A 0x2A370
+0x5A7B 0x2A368
+0x5A7C 0x2A36B
+0x5A7E 0x2A3AC
+0x5B21 0x2A3DE
+0x5B22 0x2A3DD
+0x5B23 0x2A3DC
+0x5B24 0x244C5
+0x5B25 0x2A48C
+0x5B26 0x2A483
+0x5B27 0x2A482
+0x5B28 0x2A488
+0x5B29 0x2A485
+0x5B2A 0x2A481
+0x5B2B 0x2A4F5
+0x5B2C 0x2A4EF
+0x5B2D 0x2A4F4
+0x5B2E 0x2A4F2
+0x5B2F 0x2A4F6
+0x5B30 0x2A4F3
+0x5B31 0x2A4F0
+0x5B32 0x2A4F1
+0x5B33 0x2A52B
+0x5B34 0x2A527
+0x5B35 0x2A528
+0x5B36 0x2A56C
+0x5B37 0x2A5AE
+0x5B38 0x2A60E
+0x5B39 0x2A61B
+0x5B3A 0x2A616
+0x5B3B 0x2A61F
+0x5B3C 0x2A622
+0x5B3D 0x2A620
+0x5B3E 0x2A621
+0x5B3F 0x2A614
+0x5B40 0x2A613
+0x5B41 0x2A69D
+0x5B42 0x2A69C
+0x5B43 0x2A69E
+0x5B44 0x2A69F
+0x5B45 0x2046B
+0x5B46 0x208C8
+0x5B47 0x21178
+0x5B48 0x21176
+0x5B49 0x21170
+0x5B4A 0x21171
+0x5B4B 0x2150A
+0x5B4C 0x2192C
+0x5B4D 0x22311
+0x5B4E 0x2247E
+0x5B4F 0x22957
+0x5B50 0x22966
+0x5B51 0x22969
+0x5B52 0x22967
+0x5B53 0x22968
+0x5B54 0x22971
+0x5B55 0x2296F
+0x5B56 0x2A3AE
+0x5B57 0x22E8B
+0x5B58 0x22E96
+0x5B59 0x23035
+0x5B5A 0x2303A
+0x5B5B 0x2306B
+0x5B5C 0x23316
+0x5B5D 0x23843
+0x5B5E 0x23846
+0x5B5F 0x2383F
+0x5B60 0x2383B
+0x5B61 0x2383D
+0x5B62 0x239B1
+0x5B63 0x239B2
+0x5B64 0x23AE4
+0x5B65 0x23C40
+0x5B66 0x2415D
+0x5B67 0x24151
+0x5B68 0x2414D
+0x5B69 0x2414C
+0x5B6A 0x2415B
+0x5B6B 0x244D4
+0x5B6C 0x244D2
+0x5B6D 0x244CA
+0x5B6E 0x244C8
+0x5B6F 0x244D0
+0x5B70 0x244C9
+0x5B71 0x24549
+0x5B72 0x245A4
+0x5B73 0x24712
+0x5B74 0x2470F
+0x5B75 0x24711
+0x5B76 0x248DB
+0x5B77 0x248DD
+0x5B78 0x248DC
+0x5B79 0x24AD4
+0x5B7A 0x24B21
+0x5B7B 0x24BB2
+0x5B7C 0x24D04
+0x5B7D 0x24D02
+0x5B7E 0x24F11
+0x5C21 0x24F16
+0x5C22 0x24F10
+0x5C23 0x24FBE
+0x5C24 0x2721A
+0x5C25 0x2534C
+0x5C26 0x2534A
+0x5C27 0x255F2
+0x5C28 0x255F1
+0x5C29 0x2572A
+0x5C2A 0x2572C
+0x5C2B 0x2572F
+0x5C2C 0x25731
+0x5C2D 0x25911
+0x5C2E 0x25912
+0x5C2F 0x25A4B
+0x5C30 0x25DDB
+0x5C31 0x25DD6
+0x5C32 0x25DDD
+0x5C33 0x25DE2
+0x5C34 0x25DE4
+0x5C35 0x25DE0
+0x5C36 0x25DDF
+0x5C37 0x25DE3
+0x5C38 0x25F6E
+0x5C39 0x25F71
+0x5C3A 0x261E9
+0x5C3B 0x261EA
+0x5C3C 0x26263
+0x5C3D 0x263EB
+0x5C3E 0x263EA
+0x5C3F 0x268BD
+0x5C40 0x268BB
+0x5C41 0x268C6
+0x5C42 0x268CC
+0x5C43 0x268C8
+0x5C44 0x244CF
+0x5C45 0x268C9
+0x5C46 0x268CA
+0x5C47 0x268CF
+0x5C48 0x268D0
+0x5C49 0x269BA
+0x5C4A 0x269FB
+0x5C4B 0x26A03
+0x5C4C 0x26AC4
+0x5C4D 0x27149
+0x5C4E 0x27153
+0x5C4F 0x27136
+0x5C50 0x2714A
+0x5C51 0x27141
+0x5C52 0x2714E
+0x5C53 0x27119
+0x5C54 0x2714D
+0x5C55 0x27145
+0x5C56 0x2714C
+0x5C57 0x27147
+0x5C58 0x27148
+0x5C59 0x2714F
+0x5C5A 0x27137
+0x5C5B 0x27142
+0x5C5C 0x2754A
+0x5C5D 0x27546
+0x5C5F 0x27549
+0x5C60 0x2754F
+0x5C61 0x27551
+0x5C62 0x2754C
+0x5C64 0x27606
+0x5C65 0x27951
+0x5C66 0x27B7A
+0x5C67 0x27B83
+0x5C68 0x27B7E
+0x5C69 0x27B7F
+0x5C6A 0x27B80
+0x5C6B 0x24BB5
+0x5C6C 0x27C91
+0x5C6D 0x27C94
+0x5C6E 0x27C95
+0x5C6F 0x27D21
+0x5C70 0x27D20
+0x5C71 0x27E3D
+0x5C72 0x27E40
+0x5C73 0x27E46
+0x5C74 0x27E84
+0x5C75 0x27FAC
+0x5C76 0x27FAD
+0x5C78 0x281DA
+0x5C79 0x281D9
+0x5C7A 0x283E2
+0x5C7B 0x283E1
+0x5C7C 0x283E3
+0x5C7D 0x283E4
+0x5C7E 0x283DE
+0x5D21 0x283DF
+0x5D22 0x28641
+0x5D23 0x28659
+0x5D24 0x2865C
+0x5D25 0x2865A
+0x5D26 0x287E8
+0x5D27 0x288F6
+0x5D28 0x288FC
+0x5D29 0x288F7
+0x5D2A 0x288FA
+0x5D2B 0x288F9
+0x5D2C 0x28BC4
+0x5D2D 0x28BBE
+0x5D2E 0x28BD2
+0x5D2F 0x28BBD
+0x5D30 0x28B95
+0x5D31 0x28BD4
+0x5D32 0x28DE4
+0x5D33 0x29061
+0x5D34 0x29062
+0x5D35 0x29063
+0x5D36 0x29064
+0x5D37 0x29060
+0x5D38 0x2905C
+0x5D39 0x2905D
+0x5D3A 0x2905E
+0x5D3B 0x291A5
+0x5D3C 0x291A6
+0x5D3D 0x2924C
+0x5D3E 0x29368
+0x5D3F 0x2936E
+0x5D40 0x29371
+0x5D41 0x2936B
+0x5D42 0x2936F
+0x5D43 0x293EE
+0x5D44 0x293F1
+0x5D45 0x293F0
+0x5D46 0x293EF
+0x5D47 0x29415
+0x5D48 0x29414
+0x5D49 0x28F6E
+0x5D4A 0x29447
+0x5D4B 0x2957C
+0x5D4C 0x2957A
+0x5D4D 0x29574
+0x5D4E 0x29576
+0x5D4F 0x2956E
+0x5D50 0x29578
+0x5D51 0x2956D
+0x5D52 0x2956C
+0x5D53 0x2964E
+0x5D54 0x297D7
+0x5D55 0x297EA
+0x5D56 0x297E5
+0x5D57 0x29864
+0x5D58 0x299B3
+0x5D59 0x299A3
+0x5D5A 0x299A5
+0x5D5B 0x299A7
+0x5D5C 0x299A2
+0x5D5D 0x2999F
+0x5D5E 0x299A6
+0x5D5F 0x2999E
+0x5D60 0x299A8
+0x5D61 0x29AA9
+0x5D62 0x29AA6
+0x5D63 0x29AAA
+0x5D64 0x29AAB
+0x5D65 0x29AA0
+0x5D66 0x29AA1
+0x5D67 0x29AA8
+0x5D68 0x29AE8
+0x5D69 0x29AE9
+0x5D6A 0x29AEA
+0x5D6B 0x29BE4
+0x5D6C 0x29BDF
+0x5D6D 0x29BE0
+0x5D6E 0x29C28
+0x5D6F 0x29C5D
+0x5D70 0x29C5B
+0x5D71 0x29C56
+0x5D72 0x29C57
+0x5D73 0x29C5F
+0x5D74 0x29C62
+0x5D75 0x29EE1
+0x5D76 0x29EE3
+0x5D77 0x29EDE
+0x5D78 0x29ED9
+0x5D79 0x29EE8
+0x5D7A 0x29EF2
+0x5D7B 0x29EF6
+0x5D7C 0x29EE6
+0x5D7D 0x29EF4
+0x5D7E 0x29EF5
+0x5E21 0x29EE5
+0x5E22 0x29EE2
+0x5E24 0x2A196
+0x5E25 0x2A1AA
+0x5E26 0x2A197
+0x5E27 0x2A170
+0x5E28 0x2A1A1
+0x5E29 0x2A19D
+0x5E2A 0x2A1A9
+0x5E2B 0x2A16F
+0x5E2C 0x2A17E
+0x5E2D 0x2A194
+0x5E2E 0x2A19A
+0x5E2F 0x2A173
+0x5E30 0x2A187
+0x5E31 0x2A171
+0x5E32 0x2A177
+0x5E33 0x2A188
+0x5E34 0x2A18D
+0x5E35 0x2A185
+0x5E36 0x2A178
+0x5E37 0x2A1AD
+0x5E38 0x2A280
+0x5E39 0x2A281
+0x5E3A 0x2A2E5
+0x5E3B 0x2A2E7
+0x5E3C 0x2A37C
+0x5E3D 0x2A3AF
+0x5E3E 0x2A3E1
+0x5E3F 0x2A496
+0x5E40 0x2A4A3
+0x5E41 0x2A490
+0x5E42 0x2A4F8
+0x5E43 0x2A52E
+0x5E44 0x2A575
+0x5E45 0x2A57E
+0x5E46 0x2A57D
+0x5E47 0x2A57B
+0x5E48 0x2A578
+0x5E49 0x2A5B0
+0x5E4A 0x2A634
+0x5E4B 0x2A636
+0x5E4C 0x2A630
+0x5E4D 0x2FA1D
+0x5E4E 0x2A62E
+0x5E4F 0x2A637
+0x5E50 0x20ACE
+0x5E51 0x20B97
+0x5E52 0x20B98
+0x5E53 0x2117C
+0x5E54 0x2117E
+0x5E55 0x2117D
+0x5E56 0x2117F
+0x5E57 0x2150F
+0x5E58 0x216A4
+0x5E59 0x21931
+0x5E5A 0x2192E
+0x5E5B 0x2192F
+0x5E5C 0x21932
+0x5E5D 0x21D2C
+0x5E5E 0x21FD4
+0x5E5F 0x21FDC
+0x5E60 0x21FD8
+0x5E61 0x2200E
+0x5E62 0x22183
+0x5E63 0x22184
+0x5E64 0x22312
+0x5E65 0x22972
+0x5E66 0x2297C
+0x5E67 0x2297E
+0x5E68 0x22EA6
+0x5E69 0x22EA0
+0x5E6A 0x22E9E
+0x5E6B 0x22EA2
+0x5E6C 0x2312A
+0x5E6D 0x23318
+0x5E6E 0x2384D
+0x5E6F 0x23858
+0x5E70 0x2385B
+0x5E71 0x25914
+0x5E72 0x2F8F2
+0x5E73 0x23AE6
+0x5E74 0x24164
+0x5E75 0x24168
+0x5E76 0x24160
+0x5E77 0x24162
+0x5E78 0x244D7
+0x5E79 0x2454B
+0x5E7A 0x248E0
+0x5E7B 0x24B22
+0x5E7C 0x24D05
+0x5E7D 0x24F19
+0x5E7E 0x24F1A
+0x5F21 0x24FC3
+0x5F22 0x250D8
+0x5F23 0x250DC
+0x5F24 0x2534F
+0x5F25 0x255F7
+0x5F26 0x255F4
+0x5F27 0x255F8
+0x5F28 0x25913
+0x5F29 0x25A50
+0x5F2A 0x25DF0
+0x5F2B 0x25DE9
+0x5F2C 0x25DEF
+0x5F2D 0x25DED
+0x5F2E 0x25DEA
+0x5F2F 0x25DF8
+0x5F30 0x25E05
+0x5F31 0x25DF2
+0x5F32 0x25F72
+0x5F34 0x261F9
+0x5F35 0x261F3
+0x5F36 0x261F6
+0x5F37 0x261F2
+0x5F38 0x261F7
+0x5F39 0x26266
+0x5F3A 0x26265
+0x5F3B 0x26340
+0x5F3C 0x2F977
+0x5F3D 0x268D1
+0x5F3E 0x268D3
+0x5F3F 0x26A04
+0x5F40 0x27159
+0x5F41 0x27160
+0x5F42 0x2715B
+0x5F43 0x2715D
+0x5F44 0x2715E
+0x5F45 0x27169
+0x5F46 0x2715C
+0x5F47 0x27161
+0x5F48 0x2716A
+0x5F49 0x2715F
+0x5F4A 0x2754E
+0x5F4B 0x2755C
+0x5F4C 0x27560
+0x5F4D 0x27563
+0x5F4E 0x275DB
+0x5F4F 0x277CA
+0x5F50 0x277C9
+0x5F51 0x277C8
+0x5F52 0x278A5
+0x5F53 0x278A3
+0x5F54 0x27B8E
+0x5F55 0x27B87
+0x5F56 0x27B89
+0x5F57 0x27B85
+0x5F58 0x27B86
+0x5F59 0x27B8F
+0x5F5A 0x27B8A
+0x5F5B 0x27B90
+0x5F5C 0x27C98
+0x5F5D 0x27C9B
+0x5F5E 0x27E47
+0x5F5F 0x27E49
+0x5F60 0x27E48
+0x5F61 0x281E5
+0x5F62 0x281EA
+0x5F63 0x281ED
+0x5F64 0x283F0
+0x5F65 0x283EF
+0x5F66 0x283F2
+0x5F67 0x283EC
+0x5F68 0x28440
+0x5F69 0x28660
+0x5F6A 0x2865F
+0x5F6B 0x287EB
+0x5F6C 0x287EC
+0x5F6D 0x28900
+0x5F6E 0x28901
+0x5F6F 0x28BE2
+0x5F70 0x28BDF
+0x5F71 0x28BE0
+0x5F72 0x28BE1
+0x5F73 0x28BE3
+0x5F74 0x28CC3
+0x5F75 0x28DEB
+0x5F76 0x28DEA
+0x5F77 0x28F61
+0x5F78 0x28F71
+0x5F79 0x2906B
+0x5F7A 0x29068
+0x5F7B 0x29069
+0x5F7C 0x29067
+0x5F7D 0x291B0
+0x5F7E 0x291B1
+0x6021 0x291B2
+0x6022 0x29251
+0x6023 0x29374
+0x6024 0x2957F
+0x6025 0x29584
+0x6026 0x29653
+0x6027 0x29654
+0x6028 0x297F0
+0x6029 0x297F4
+0x602A 0x297F1
+0x602B 0x29837
+0x602C 0x299BF
+0x602F 0x299BD
+0x6030 0x299BE
+0x6031 0x299B7
+0x6032 0x299C0
+0x6033 0x299BA
+0x6034 0x299B8
+0x6035 0x299BC
+0x6036 0x299BB
+0x6037 0x29AEB
+0x6038 0x29BE7
+0x6039 0x29C1D
+0x603A 0x29C1C
+0x603B 0x29C63
+0x603C 0x2244B
+0x603D 0x29D38
+0x603E 0x29D36
+0x603F 0x29D34
+0x6040 0x29D37
+0x6041 0x29F06
+0x6042 0x29F1C
+0x6043 0x29F02
+0x6044 0x29F1D
+0x6045 0x29F1E
+0x6046 0x29EE0
+0x6047 0x29F11
+0x6048 0x29F18
+0x6049 0x29F21
+0x604A 0x29F20
+0x604B 0x29F10
+0x604C 0x2A1BD
+0x604D 0x2A1AE
+0x604E 0x2A1B5
+0x604F 0x2A1B8
+0x6050 0x2A1B9
+0x6051 0x2A1BE
+0x6052 0x2A1C4
+0x6053 0x2A1BC
+0x6054 0x2A1BA
+0x6055 0x2A283
+0x6056 0x2A2EA
+0x6057 0x2A2EC
+0x6058 0x2A37E
+0x6059 0x2A37B
+0x605A 0x2A3E5
+0x605B 0x2A4A7
+0x605C 0x2A49E
+0x605D 0x2A49A
+0x605E 0x2A52F
+0x605F 0x2A531
+0x6060 0x2A583
+0x6061 0x2A5B5
+0x6062 0x2A646
+0x6063 0x2A641
+0x6064 0x2A643
+0x6065 0x2A63D
+0x6066 0x2A642
+0x6067 0x2A63B
+0x6068 0x2A647
+0x6069 0x2096B
+0x606A 0x209D0
+0x606B 0x2118E
+0x606C 0x21B11
+0x606D 0x2F871
+0x606E 0x2F889
+0x606F 0x2244C
+0x6070 0x2312B
+0x6071 0x2384F
+0x6072 0x2385E
+0x6073 0x23863
+0x6074 0x2386B
+0x6075 0x2393F
+0x6076 0x23AE9
+0x6077 0x2416D
+0x6078 0x2416B
+0x6079 0x2416A
+0x607A 0x29F2A
+0x607B 0x244E0
+0x607C 0x244DD
+0x607D 0x244E1
+0x607E 0x244DE
+0x6121 0x244DC
+0x6122 0x2454D
+0x6123 0x24716
+0x6124 0x248E3
+0x6125 0x24AE5
+0x6126 0x24AE4
+0x6127 0x24F1D
+0x6128 0x2574B
+0x6129 0x2A6C1
+0x612A 0x25A4E
+0x612B 0x25AD6
+0x612C 0x25DFD
+0x612D 0x25E07
+0x612E 0x25DFE
+0x612F 0x25E03
+0x6130 0x25E0B
+0x6131 0x25DFF
+0x6132 0x25F7A
+0x6133 0x25F77
+0x6134 0x261FB
+0x6135 0x26343
+0x6136 0x263ED
+0x6137 0x269BC
+0x6138 0x244DF
+0x6139 0x26A05
+0x613A 0x26AC6
+0x613B 0x26AC5
+0x613C 0x27174
+0x613D 0x27173
+0x613E 0x27172
+0x613F 0x27178
+0x6140 0x27573
+0x6141 0x2757A
+0x6142 0x24F1C
+0x6143 0x27576
+0x6144 0x27575
+0x6145 0x27577
+0x6146 0x277CF
+0x6147 0x277CE
+0x6148 0x277CD
+0x6149 0x278A8
+0x614A 0x27B98
+0x614B 0x27B92
+0x614C 0x27B94
+0x614D 0x27C9A
+0x614E 0x27FB4
+0x614F 0x281EB
+0x6150 0x281F4
+0x6151 0x281F3
+0x6152 0x281EE
+0x6153 0x281F2
+0x6154 0x281F0
+0x6155 0x28664
+0x6156 0x28C05
+0x6157 0x28BFB
+0x6158 0x28BFC
+0x6159 0x28DF3
+0x615A 0x2906C
+0x615B 0x291BA
+0x615C 0x29379
+0x615D 0x2937E
+0x615E 0x29378
+0x615F 0x293F4
+0x6160 0x29416
+0x6161 0x29657
+0x6162 0x299C8
+0x6163 0x299C3
+0x6164 0x299CE
+0x6165 0x29AB3
+0x6166 0x29AED
+0x6167 0x29AEE
+0x6168 0x29BF1
+0x6169 0x29BF8
+0x616B 0x29C64
+0x616C 0x29C65
+0x616D 0x29F35
+0x616E 0x29F29
+0x616F 0x29F2C
+0x6170 0x29F31
+0x6171 0x29F2B
+0x6172 0x29F2E
+0x6173 0x29F25
+0x6174 0x2A1DA
+0x6175 0x2A1E0
+0x6176 0x2A1D4
+0x6177 0x2A1E1
+0x6178 0x2A1DD
+0x6179 0x2A3E7
+0x617A 0x2A412
+0x617B 0x2A4AE
+0x617C 0x2A4AF
+0x617D 0x2A586
+0x617E 0x2A585
+0x6221 0x2A5D1
+0x6222 0x2A658
+0x6223 0x2A63F
+0x6224 0x2A652
+0x6225 0x2A64B
+0x6226 0x2A653
+0x6227 0x2A650
+0x6228 0x2A656
+0x6229 0x2A657
+0x622A 0x2A6CD
+0x622B 0x2A6CB
+0x622C 0x20831
+0x622D 0x20830
+0x622E 0x209D1
+0x6230 0x21192
+0x6231 0x21190
+0x6232 0x2118F
+0x6233 0x21193
+0x6234 0x21191
+0x6236 0x22313
+0x6237 0x2247F
+0x6238 0x22EAC
+0x6239 0x24170
+0x623A 0x244E5
+0x623B 0x24B23
+0x623C 0x24B24
+0x623D 0x24D08
+0x623E 0x24D07
+0x623F 0x24F1F
+0x6240 0x24F20
+0x6241 0x24F21
+0x6242 0x250E1
+0x6243 0x25354
+0x6244 0x25357
+0x6245 0x25355
+0x6246 0x255FA
+0x6247 0x25738
+0x6248 0x27186
+0x6249 0x25737
+0x624A 0x25A53
+0x624B 0x25F7E
+0x624C 0x25F7B
+0x624D 0x2F971
+0x624E 0x261FD
+0x624F 0x261FC
+0x6250 0x26346
+0x6251 0x26932
+0x6252 0x26AC7
+0x6253 0x27171
+0x6254 0x27183
+0x6255 0x2716F
+0x6256 0x2717E
+0x6257 0x2717D
+0x6258 0x27181
+0x6259 0x2717C
+0x625A 0x2758A
+0x625B 0x2757E
+0x625C 0x27580
+0x625D 0x2757D
+0x625E 0x2757F
+0x625F 0x27582
+0x6260 0x277D4
+0x6261 0x277D0
+0x6262 0x277D2
+0x6263 0x27955
+0x6264 0x27B9B
+0x6265 0x27B9A
+0x6266 0x27E4E
+0x6267 0x281F1
+0x6268 0x283F8
+0x6269 0x283FD
+0x626A 0x2865E
+0x626B 0x28666
+0x626C 0x28905
+0x626D 0x28C0A
+0x626E 0x28C0B
+0x626F 0x28C0E
+0x6270 0x28C0D
+0x6271 0x28C11
+0x6272 0x28C09
+0x6273 0x28C10
+0x6274 0x28C0C
+0x6275 0x28C12
+0x6276 0x28CC4
+0x6277 0x28DF7
+0x6278 0x28DF8
+0x6279 0x28F6A
+0x627A 0x28F6B
+0x627B 0x291C0
+0x627C 0x291C2
+0x627D 0x29385
+0x627E 0x29380
+0x6321 0x29384
+0x6322 0x29381
+0x6323 0x291C4
+0x6324 0x2958B
+0x6325 0x2958D
+0x6326 0x2958E
+0x6327 0x29AB7
+0x6328 0x29AB9
+0x6329 0x29AEF
+0x632A 0x29BFB
+0x632B 0x29BFF
+0x632C 0x29C67
+0x632D 0x29C68
+0x632E 0x29C69
+0x632F 0x29D3F
+0x6330 0x29F3C
+0x6331 0x29F4C
+0x6332 0x29F3D
+0x6333 0x29F3E
+0x6334 0x29F3F
+0x6335 0x29F3B
+0x6336 0x2A1FF
+0x6338 0x2A1F6
+0x6339 0x2A1EE
+0x633A 0x2A1FC
+0x633B 0x2A1F8
+0x633C 0x2A201
+0x633D 0x2A1FA
+0x633E 0x2A288
+0x633F 0x2A380
+0x6340 0x2A411
+0x6341 0x2A4FE
+0x6342 0x2A500
+0x6343 0x2A535
+0x6344 0x2503C
+0x6345 0x2A5BD
+0x6346 0x2A5BB
+0x6347 0x2A65C
+0x6348 0x2A65A
+0x6349 0x2A6D1
+0x634A 0x2A6D0
+0x634B 0x20A0B
+0x634C 0x23873
+0x634D 0x21939
+0x634E 0x21B1A
+0x634F 0x21FE3
+0x6350 0x22187
+0x6351 0x22377
+0x6352 0x22378
+0x6353 0x22EB1
+0x6354 0x2386A
+0x6355 0x23874
+0x6356 0x23AEB
+0x6357 0x2417B
+0x6358 0x245A5
+0x6359 0x248E4
+0x635A 0x24D0B
+0x635B 0x24D0E
+0x635C 0x24D0C
+0x635D 0x25739
+0x635E 0x25E10
+0x635F 0x25E11
+0x6360 0x25E16
+0x6361 0x25F81
+0x6362 0x25F80
+0x6363 0x261FE
+0x6364 0x26201
+0x6365 0x26200
+0x6366 0x26347
+0x6367 0x263EF
+0x6368 0x27188
+0x6369 0x2758B
+0x636A 0x2758D
+0x636B 0x27587
+0x636C 0x27585
+0x636D 0x2758F
+0x636E 0x27584
+0x636F 0x27588
+0x6370 0x2758E
+0x6371 0x2758C
+0x6372 0x277D7
+0x6373 0x277D6
+0x6374 0x27B9F
+0x6375 0x22188
+0x6376 0x28203
+0x6377 0x283FE
+0x6378 0x287EF
+0x6379 0x28909
+0x637A 0x28908
+0x637B 0x28C20
+0x637C 0x28C24
+0x637D 0x28C1F
+0x637E 0x29070
+0x6421 0x29256
+0x6422 0x293F7
+0x6423 0x293F8
+0x6424 0x293F6
+0x6425 0x29590
+0x6426 0x2965E
+0x6427 0x297F7
+0x6428 0x299D6
+0x6429 0x299D5
+0x642A 0x29ABB
+0x642B 0x29AF0
+0x642C 0x29C01
+0x642D 0x29C6C
+0x642E 0x29D41
+0x642F 0x29D42
+0x6430 0x29F4F
+0x6431 0x29F53
+0x6432 0x29F58
+0x6433 0x2A212
+0x6434 0x2A204
+0x6435 0x2A213
+0x6436 0x2A205
+0x6437 0x2A20D
+0x6438 0x2A382
+0x6439 0x2A381
+0x643A 0x2A4B5
+0x643B 0x2A4BA
+0x643C 0x2A5BE
+0x643D 0x2A665
+0x643E 0x2A663
+0x643F 0x2A66E
+0x6440 0x2A66A
+0x6441 0x2A66C
+0x6442 0x2A6C4
+0x6443 0x2096C
+0x6444 0x27BA5
+0x6445 0x21B12
+0x6446 0x2244D
+0x6447 0x2331F
+0x6448 0x23877
+0x6449 0x23878
+0x644A 0x23C44
+0x644B 0x2417C
+0x644C 0x244EB
+0x644D 0x244EA
+0x644E 0x244EC
+0x644F 0x245A7
+0x6450 0x24719
+0x6451 0x24F23
+0x6453 0x25601
+0x6454 0x25E1C
+0x6455 0x26203
+0x6456 0x26348
+0x6457 0x268DA
+0x6458 0x27191
+0x6459 0x27192
+0x645A 0x27596
+0x645B 0x27597
+0x645C 0x27591
+0x645D 0x27593
+0x645E 0x277D8
+0x645F 0x277D5
+0x6460 0x27957
+0x6461 0x27958
+0x6462 0x27BA2
+0x6463 0x28205
+0x6464 0x283FA
+0x6465 0x2890C
+0x6466 0x2890A
+0x6467 0x28C2E
+0x6468 0x28C29
+0x6469 0x28C2F
+0x646A 0x28CC5
+0x646B 0x29072
+0x646C 0x291C8
+0x646D 0x2925A
+0x646E 0x29259
+0x646F 0x29389
+0x6470 0x29388
+0x6471 0x299DB
+0x6472 0x299D9
+0x6473 0x299DA
+0x6474 0x29ABC
+0x6476 0x29C06
+0x6477 0x29C05
+0x6478 0x29C6F
+0x6479 0x29C6D
+0x647A 0x29C70
+0x647B 0x29F60
+0x647C 0x29F5E
+0x647D 0x29F63
+0x647E 0x29F5A
+0x6521 0x29F5F
+0x6522 0x2A219
+0x6523 0x2A21D
+0x6524 0x2A21B
+0x6525 0x2A222
+0x6526 0x2A21C
+0x6527 0x2A21E
+0x6528 0x2A2F7
+0x6529 0x2A384
+0x652A 0x2A415
+0x652B 0x2A4B8
+0x652C 0x2A4C1
+0x652D 0x2A501
+0x652E 0x2A50A
+0x652F 0x2A5D2
+0x6530 0x2A675
+0x6531 0x2A674
+0x6532 0x2A672
+0x6533 0x20AD0
+0x6534 0x21B1B
+0x6535 0x22010
+0x6536 0x22379
+0x6537 0x244ED
+0x6538 0x24BB9
+0x6539 0x24F24
+0x653A 0x24FC5
+0x653B 0x25603
+0x653C 0x2634A
+0x653D 0x268F7
+0x653E 0x269C1
+0x653F 0x269C2
+0x6540 0x27194
+0x6541 0x27599
+0x6542 0x2759A
+0x6543 0x2795A
+0x6544 0x27BA8
+0x6545 0x27C25
+0x6546 0x27C9E
+0x6547 0x28441
+0x6548 0x28C32
+0x6549 0x28C33
+0x654A 0x291CB
+0x654B 0x291CA
+0x654C 0x291CC
+0x654D 0x29593
+0x654E 0x299E0
+0x654F 0x29C71
+0x6550 0x29F6B
+0x6551 0x2A22B
+0x6552 0x2A229
+0x6553 0x2A21A
+0x6554 0x2A226
+0x6555 0x2A227
+0x6556 0x2A22A
+0x6557 0x2A2F8
+0x6558 0x2503D
+0x6559 0x2A676
+0x655A 0x21518
+0x655B 0x2387A
+0x655C 0x2417F
+0x655E 0x263F0
+0x655F 0x2719A
+0x6560 0x27196
+0x6561 0x2759E
+0x6562 0x2759D
+0x6563 0x275DC
+0x6564 0x277DA
+0x6565 0x2820B
+0x6566 0x28402
+0x6567 0x28442
+0x6568 0x28667
+0x6569 0x2938B
+0x656A 0x299E2
+0x656B 0x29F71
+0x656C 0x2A22F
+0x656D 0x2A22E
+0x656E 0x2A4C6
+0x656F 0x2A58E
+0x6570 0x2A67B
+0x6571 0x2A677
+0x6572 0x2A678
+0x6573 0x2A67C
+0x6574 0x2387C
+0x6575 0x26207
+0x6576 0x27197
+0x6577 0x27BD9
+0x6578 0x2890D
+0x6579 0x2890E
+0x657A 0x299E3
+0x657B 0x299E4
+0x657C 0x29AF3
+0x657D 0x29C75
+0x657E 0x2A237
+0x6621 0x2A235
+0x6622 0x2A58F
+0x6623 0x2A680
+0x6624 0x2A67F
+0x6625 0x2A6D4
+0x6626 0x22EB4
+0x6627 0x2A3EC
+0x6628 0x28F75
+0x6629 0x24D10
+0x662A 0x26269
+0x662B 0x275A4
+0x662C 0x277DB
+0x662D 0x291D1
+0x662E 0x2938D
+0x662F 0x29F76
+0x6630 0x2A239
+0x6631 0x2A684
+0x6632 0x2A682
+0x6633 0x20AD2
+0x6634 0x244EE
+0x6635 0x24D11
+0x6636 0x25F84
+0x6637 0x28F74
+0x6638 0x2938F
+0x6639 0x2938E
+0x663A 0x2A23B
+0x663B 0x208CB
+0x663C 0x2A688
+0x663D 0x2A686
+0x663E 0x2335C
+0x663F 0x253A4
+0x6640 0x29075
+0x6641 0x2A68B
+0x6642 0x21519
+0x6643 0x27C9F
+0x6644 0x299E5
+0x6645 0x2A240
+0x6646 0x24D12
+0x6647 0x2A2FB
+0x6648 0x2A68C
+0x6649 0x253A5
+0x664A 0x29C77
+0x664B 0x29C78
+0x664C 0x2A6D6
+0x664D 0x277DF
+0x664E 0x291D2
+0x664F 0x2151A
+0x6650 0x27BA9
+0x6651 0x291D3
+0x6652 0x2A4CA
+0x6653 0x269C4
+0x6654 0x278B1
+0x6655 0x29664
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,1191 @@
+/*
+ * 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 4750497
+ @summary Check surrogate coverage of Big5-HKSCS (2001)
+ */
+
+/*
+ * Tests the HKSCS converter. Supplements the test for BMP
+ * mappings (and compatibility char->byte mappings) provided
+ * via ./test/sun/io/Converter/Big5-HKSCS.b2c and
+ * ./test/sun/io/Converter/Big5-HKSCS.c2b-irreversible
+ *
+ * Mappings available at :
+ * http://www.info.gov.hk/digital21/eng/hkscs/download.html
+ *
+ */
+
+import java.io.*;
+public class SurrogateTestHKSCS {
+
+ /**
+ * int array holding the supplementary character
+ * values (encoded as ints below) for full set of 1651
+ * supplementary chars / surrogate pairs which should
+ * be round-trip mappable within Big5-HKSCS 2001
+ *
+ */
+
+ static int[] suppValues = {
+ 0x20021, 0x2003E, 0x20046, 0x2004E, 0x20068, 0x20086,
+ 0x20087, 0x2008A, 0x20094, 0x200CA, 0x200CB, 0x200CC,
+ 0x200CD, 0x200D1, 0x200EE, 0x2010C, 0x2010E, 0x20118,
+ 0x201A9, 0x201AB, 0x201C1, 0x201D4, 0x201F2, 0x20204,
+ 0x2020C, 0x20214, 0x2025B, 0x20274, 0x20275, 0x20299,
+ 0x2029E, 0x202A0, 0x202B7, 0x202BF, 0x202C0, 0x202E5,
+ 0x2030A, 0x20325, 0x20341, 0x20345, 0x20346, 0x20347,
+ 0x2037E, 0x2037F, 0x20380, 0x203A0, 0x203A7, 0x203B5,
+ 0x203C9, 0x203CB, 0x203F5, 0x203FC, 0x20413, 0x20414,
+ 0x2041F, 0x20465, 0x20487, 0x2048E, 0x20491, 0x20492,
+ 0x204A3, 0x204D7, 0x204FC, 0x204FE, 0x20547, 0x2058E,
+ 0x205A5, 0x205B3, 0x205C3, 0x205CA, 0x205D0, 0x205D5,
+ 0x205DF, 0x205E0, 0x205EB, 0x20611, 0x20615, 0x20619,
+ 0x2061A, 0x20630, 0x20656, 0x20676, 0x2070E, 0x20731,
+ 0x20779, 0x2082C, 0x20873, 0x208D5, 0x20916, 0x20923,
+ 0x20954, 0x20979, 0x209E7, 0x20A11, 0x20A50, 0x20AB4,
+ 0x20AC2, 0x20ACD, 0x20B0D, 0x20B8F, 0x20BA8, 0x20BA9,
+ 0x20BBF, 0x20BC6, 0x20BCB, 0x20BE2, 0x20BEB, 0x20BFB,
+ 0x20BFF, 0x20C0B, 0x20C0D, 0x20C20, 0x20C34, 0x20C3A,
+ 0x20C3B, 0x20C41, 0x20C42, 0x20C43, 0x20C53, 0x20C65,
+ 0x20C77, 0x20C78, 0x20C7C, 0x20C8D, 0x20C96, 0x20C9C,
+ 0x20CB5, 0x20CB8, 0x20CCF, 0x20CD3, 0x20CD4, 0x20CD5,
+ 0x20CD6, 0x20CDD, 0x20CED, 0x20CFF, 0x20D15, 0x20D28,
+ 0x20D31, 0x20D32, 0x20D46, 0x20D47, 0x20D48, 0x20D49,
+ 0x20D4C, 0x20D4D, 0x20D4E, 0x20D6F, 0x20D71, 0x20D74,
+ 0x20D7C, 0x20D7E, 0x20D7F, 0x20D96, 0x20D9C, 0x20DA7,
+ 0x20DB2, 0x20DC8, 0x20E04, 0x20E09, 0x20E0A, 0x20E0D,
+ 0x20E0E, 0x20E0F, 0x20E10, 0x20E11, 0x20E16, 0x20E1D,
+ 0x20E4C, 0x20E6D, 0x20E73, 0x20E75, 0x20E76, 0x20E77,
+ 0x20E78, 0x20E79, 0x20E7A, 0x20E7B, 0x20E8C, 0x20E96,
+ 0x20E98, 0x20E9D, 0x20EA2, 0x20EAA, 0x20EAB, 0x20EAC,
+ 0x20EB6, 0x20ED7, 0x20ED8, 0x20EDD, 0x20EF8, 0x20EF9,
+ 0x20EFA, 0x20EFB, 0x20F1D, 0x20F26, 0x20F2D, 0x20F2E,
+ 0x20F30, 0x20F31, 0x20F3B, 0x20F4C, 0x20F64, 0x20F8D,
+ 0x20F90, 0x20FAD, 0x20FB4, 0x20FB5, 0x20FB6, 0x20FBC,
+ 0x20FDF, 0x20FEA, 0x20FEB, 0x20FEC, 0x20FED, 0x21014,
+ 0x2101D, 0x2101E, 0x2104F, 0x2105C, 0x2106F, 0x21075,
+ 0x21076, 0x21077, 0x21078, 0x2107B, 0x21088, 0x21096,
+ 0x2109D, 0x210B4, 0x210BF, 0x210C0, 0x210C1, 0x210C7,
+ 0x210C8, 0x210C9, 0x210CF, 0x210D3, 0x210E4, 0x210F4,
+ 0x210F5, 0x210F6, 0x2112F, 0x2113B, 0x2113D, 0x21145,
+ 0x21148, 0x2114F, 0x21180, 0x21187, 0x211D9, 0x2123C,
+ 0x2124F, 0x2127C, 0x212A8, 0x212A9, 0x212B0, 0x212E3,
+ 0x212FE, 0x21302, 0x21303, 0x21304, 0x21305, 0x21336,
+ 0x2133A, 0x21375, 0x21376, 0x2138E, 0x21398, 0x2139C,
+ 0x213C5, 0x213C6, 0x213ED, 0x213FE, 0x21413, 0x21416,
+ 0x21424, 0x2143F, 0x21452, 0x21454, 0x21455, 0x2148A,
+ 0x21497, 0x214B6, 0x214E8, 0x214FD, 0x21577, 0x21582,
+ 0x21596, 0x2160A, 0x21613, 0x21619, 0x2163E, 0x21661,
+ 0x21692, 0x216B8, 0x216BA, 0x216C0, 0x216C1, 0x216C2,
+ 0x216D3, 0x216D5, 0x216DF, 0x216E6, 0x216E7, 0x216E8,
+ 0x216FA, 0x216FB, 0x216FC, 0x216FE, 0x2170D, 0x21710,
+ 0x21726, 0x2173A, 0x2173B, 0x2173C, 0x21757, 0x2176C,
+ 0x2176D, 0x2176E, 0x2176F, 0x21770, 0x21771, 0x21773,
+ 0x21774, 0x217AB, 0x217B0, 0x217B1, 0x217B2, 0x217B3,
+ 0x217B4, 0x217B5, 0x217C3, 0x217C7, 0x217D9, 0x217DA,
+ 0x217DB, 0x217DC, 0x217DF, 0x217EF, 0x217F5, 0x217F6,
+ 0x217F8, 0x217F9, 0x217FA, 0x217FB, 0x217FC, 0x21820,
+ 0x21828, 0x21829, 0x2182A, 0x2182D, 0x21839, 0x2183A,
+ 0x2183B, 0x21840, 0x21845, 0x21852, 0x2185E, 0x21861,
+ 0x21862, 0x21863, 0x21864, 0x21877, 0x2187B, 0x21883,
+ 0x21884, 0x21885, 0x2189E, 0x2189F, 0x218A0, 0x218A1,
+ 0x218A2, 0x218BE, 0x218BF, 0x218D1, 0x218D6, 0x218D7,
+ 0x218D8, 0x218D9, 0x218FA, 0x21903, 0x21904, 0x21905,
+ 0x21910, 0x21911, 0x21912, 0x21915, 0x2191C, 0x21922,
+ 0x21927, 0x2193B, 0x21944, 0x21958, 0x2196A, 0x2197C,
+ 0x21980, 0x21983, 0x21988, 0x21996, 0x219DB, 0x219F3,
+ 0x21A2D, 0x21A34, 0x21A45, 0x21A4B, 0x21B44, 0x21BC1,
+ 0x21BC2, 0x21C2A, 0x21C70, 0x21CA2, 0x21CA5, 0x21CAC,
+ 0x21D46, 0x21D90, 0x21DB6, 0x21DBA, 0x21DCA, 0x21DD1,
+ 0x21DEB, 0x21DF9, 0x21E1C, 0x21E37, 0x21E3D, 0x21E89,
+ 0x21EA4, 0x21EA8, 0x21EC8, 0x21ED5, 0x21F0F, 0x21F15,
+ 0x21F6A, 0x21F9E, 0x21FA1, 0x21FE8, 0x22045, 0x22049,
+ 0x2207E, 0x2209A, 0x220C7, 0x220FC, 0x2212A, 0x2215B,
+ 0x22173, 0x2217A, 0x221A1, 0x221C3, 0x22208, 0x2227C,
+ 0x22321, 0x22325, 0x223BD, 0x223D0, 0x223D7, 0x223FA,
+ 0x22465, 0x22471, 0x2248B, 0x22491, 0x224B0, 0x224ED,
+ 0x22513, 0x2251B, 0x22530, 0x22554, 0x2258D, 0x225AF,
+ 0x225BE, 0x2261B, 0x2261C, 0x2262B, 0x22668, 0x2267A,
+ 0x22696, 0x22698, 0x226F4, 0x226F5, 0x226F6, 0x22712,
+ 0x22714, 0x2271B, 0x2271F, 0x2272A, 0x22775, 0x22781,
+ 0x227B4, 0x227B5, 0x227CD, 0x22803, 0x2285F, 0x22860,
+ 0x22871, 0x228AD, 0x228C1, 0x228F7, 0x22926, 0x22939,
+ 0x2294F, 0x22967, 0x2296B, 0x22980, 0x22993, 0x22A66,
+ 0x22ACF, 0x22AD5, 0x22AE6, 0x22AE8, 0x22B0E, 0x22B22,
+ 0x22B3F, 0x22B43, 0x22B6A, 0x22BCA, 0x22BCE, 0x22C26,
+ 0x22C27, 0x22C38, 0x22C4C, 0x22C51, 0x22C55, 0x22C62,
+ 0x22C88, 0x22C9B, 0x22CA1, 0x22CA9, 0x22CB2, 0x22CB7,
+ 0x22CC2, 0x22CC6, 0x22CC9, 0x22D07, 0x22D08, 0x22D12,
+ 0x22D44, 0x22D4C, 0x22D67, 0x22D8D, 0x22D95, 0x22DA0,
+ 0x22DA3, 0x22DA4, 0x22DB7, 0x22DEE, 0x22E0D, 0x22E36,
+ 0x22E42, 0x22E78, 0x22E8B, 0x22EB3, 0x22EEF, 0x22F74,
+ 0x22FCC, 0x22FE3, 0x23033, 0x23044, 0x2304B, 0x23066,
+ 0x2307D, 0x2307E, 0x2308E, 0x230B7, 0x230BC, 0x230DA,
+ 0x23103, 0x2313D, 0x2317D, 0x23182, 0x231A4, 0x231A5,
+ 0x231B3, 0x231C8, 0x231C9, 0x231F7, 0x231F8, 0x231F9,
+ 0x2320F, 0x23225, 0x2322F, 0x23231, 0x23232, 0x23233,
+ 0x23234, 0x23262, 0x23281, 0x23289, 0x2328A, 0x232AB,
+ 0x232AC, 0x232AD, 0x232D2, 0x232E0, 0x232E1, 0x23300,
+ 0x2330A, 0x2331F, 0x233B4, 0x233CC, 0x233DE, 0x233E6,
+ 0x233F4, 0x233F5, 0x233F9, 0x233FA, 0x233FE, 0x23400,
+ 0x2343F, 0x23450, 0x2346F, 0x23472, 0x234E5, 0x23519,
+ 0x23530, 0x2355A, 0x23567, 0x23595, 0x23599, 0x2359C,
+ 0x235CD, 0x235CE, 0x235CF, 0x235F3, 0x23600, 0x2361A,
+ 0x2363C, 0x23640, 0x23659, 0x2365F, 0x23677, 0x236A6,
+ 0x236AD, 0x236BA, 0x236DF, 0x236EE, 0x23703, 0x23716,
+ 0x23720, 0x2372D, 0x2372F, 0x2373F, 0x23766, 0x23781,
+ 0x237A2, 0x237BC, 0x237C2, 0x237D5, 0x237D6, 0x237D7,
+ 0x2383A, 0x239C2, 0x23AA7, 0x23ADB, 0x23AEE, 0x23AFA,
+ 0x23B5A, 0x23C63, 0x23C99, 0x23C9A, 0x23C9B, 0x23CB5,
+ 0x23CB7, 0x23CC7, 0x23CC8, 0x23CC9, 0x23CFC, 0x23CFD,
+ 0x23CFE, 0x23CFF, 0x23D40, 0x23D5B, 0x23D7E, 0x23D8F,
+ 0x23DB6, 0x23DB7, 0x23DB8, 0x23DB9, 0x23DBA, 0x23DBB,
+ 0x23DBC, 0x23DBD, 0x23DE3, 0x23DF8, 0x23E11, 0x23E2C,
+ 0x23E2D, 0x23E2E, 0x23E2F, 0x23E30, 0x23E31, 0x23E39,
+ 0x23E88, 0x23E89, 0x23E8A, 0x23E8B, 0x23EB9, 0x23EBF,
+ 0x23ED7, 0x23EF7, 0x23EF8, 0x23EF9, 0x23EFA, 0x23EFB,
+ 0x23EFC, 0x23F35, 0x23F41, 0x23F4A, 0x23F7F, 0x23F80,
+ 0x23F81, 0x23F82, 0x23F8F, 0x23FB4, 0x23FB7, 0x23FC0,
+ 0x23FC5, 0x23FEB, 0x23FEC, 0x23FED, 0x23FEE, 0x23FEF,
+ 0x23FF0, 0x24011, 0x24039, 0x2403A, 0x2403B, 0x2403C,
+ 0x2403D, 0x24057, 0x24085, 0x2408B, 0x2408C, 0x2408D,
+ 0x24091, 0x240C9, 0x240E1, 0x24104, 0x2410F, 0x24119,
+ 0x2413F, 0x24140, 0x24144, 0x2414E, 0x24155, 0x24156,
+ 0x24157, 0x2415C, 0x2415F, 0x24177, 0x2417A, 0x241A3,
+ 0x241A4, 0x241A5, 0x241AC, 0x241B5, 0x241CD, 0x241E2,
+ 0x241FC, 0x2421B, 0x2424B, 0x24256, 0x24259, 0x24276,
+ 0x24277, 0x24278, 0x24284, 0x24293, 0x24295, 0x242A5,
+ 0x242C1, 0x242C9, 0x242CA, 0x242EE, 0x242FA, 0x2430D,
+ 0x2431A, 0x24334, 0x24348, 0x24362, 0x24363, 0x24364,
+ 0x24365, 0x2438C, 0x24396, 0x2439C, 0x243BD, 0x243C1,
+ 0x243E9, 0x243EA, 0x243F2, 0x243F8, 0x24404, 0x24435,
+ 0x24436, 0x2445A, 0x2445B, 0x24473, 0x24487, 0x24488,
+ 0x244B9, 0x244BC, 0x244CE, 0x244D3, 0x244D6, 0x24505,
+ 0x24521, 0x24578, 0x245C8, 0x24618, 0x2462A, 0x24665,
+ 0x24674, 0x24697, 0x246D4, 0x24706, 0x24725, 0x2472F,
+ 0x2478F, 0x247E0, 0x24812, 0x24823, 0x24882, 0x248E9,
+ 0x248F0, 0x248F1, 0x248F2, 0x248F3, 0x248FB, 0x248FF,
+ 0x24900, 0x24901, 0x2490C, 0x24916, 0x24917, 0x24919,
+ 0x2492F, 0x24933, 0x24934, 0x2493E, 0x2493F, 0x24940,
+ 0x24941, 0x24942, 0x24943, 0x24962, 0x24963, 0x24974,
+ 0x24975, 0x24976, 0x2497B, 0x2497F, 0x24982, 0x24988,
+ 0x24989, 0x2498A, 0x2498B, 0x2498C, 0x2498D, 0x2498E,
+ 0x2498F, 0x24994, 0x249A4, 0x249A7, 0x249A9, 0x249AB,
+ 0x249AC, 0x249AD, 0x249B7, 0x249B8, 0x249B9, 0x249BA,
+ 0x249BB, 0x249C5, 0x249D0, 0x249DA, 0x249DE, 0x249DF,
+ 0x249E3, 0x249E5, 0x249EC, 0x249ED, 0x249F6, 0x249F7,
+ 0x249F8, 0x249F9, 0x249FB, 0x24A0E, 0x24A12, 0x24A13,
+ 0x24A15, 0x24A21, 0x24A22, 0x24A23, 0x24A24, 0x24A25,
+ 0x24A26, 0x24A27, 0x24A28, 0x24A29, 0x24A2A, 0x24A3E,
+ 0x24A42, 0x24A45, 0x24A4A, 0x24A4E, 0x24A4F, 0x24A50,
+ 0x24A51, 0x24A5D, 0x24A65, 0x24A66, 0x24A67, 0x24A71,
+ 0x24A77, 0x24A78, 0x24A79, 0x24A7A, 0x24A8C, 0x24A93,
+ 0x24A94, 0x24A95, 0x24A96, 0x24AA4, 0x24AA5, 0x24AA6,
+ 0x24AA7, 0x24AB1, 0x24AB2, 0x24AB3, 0x24ABA, 0x24ABB,
+ 0x24ABC, 0x24AC0, 0x24AC7, 0x24ACA, 0x24AD1, 0x24ADF,
+ 0x24AE2, 0x24AE9, 0x24B6E, 0x24BF5, 0x24C09, 0x24C9E,
+ 0x24C9F, 0x24CC9, 0x24CD9, 0x24D06, 0x24D13, 0x24DB8,
+ 0x24DEA, 0x24DEB, 0x24E3B, 0x24E50, 0x24EA5, 0x24EA7,
+ 0x24F0E, 0x24F5C, 0x24F82, 0x24F86, 0x24F97, 0x24F9A,
+ 0x24FA9, 0x24FB8, 0x24FC2, 0x2502C, 0x25052, 0x2509D,
+ 0x2512B, 0x25148, 0x2517D, 0x2517E, 0x251CD, 0x251E3,
+ 0x251E6, 0x251E7, 0x25220, 0x25221, 0x25250, 0x25299,
+ 0x252C7, 0x252D8, 0x2530E, 0x25311, 0x25313, 0x25419,
+ 0x25425, 0x2542F, 0x25430, 0x25446, 0x2546C, 0x2546E,
+ 0x25531, 0x25535, 0x2553F, 0x2555B, 0x2555C, 0x2555D,
+ 0x2555E, 0x25562, 0x25565, 0x25566, 0x25581, 0x25584,
+ 0x2558F, 0x255B9, 0x255D5, 0x255DB, 0x255E0, 0x25605,
+ 0x25635, 0x25651, 0x25683, 0x25695, 0x256E3, 0x256F6,
+ 0x25706, 0x2571D, 0x25725, 0x2573D, 0x25772, 0x257C7,
+ 0x257DF, 0x257E0, 0x257E1, 0x25857, 0x2585D, 0x25872,
+ 0x258C8, 0x258E1, 0x25903, 0x25946, 0x25956, 0x259AC,
+ 0x259CC, 0x25A95, 0x25A9C, 0x25AAE, 0x25AAF, 0x25AE9,
+ 0x25B74, 0x25B89, 0x25BB3, 0x25BB4, 0x25BC6, 0x25BE4,
+ 0x25BE8, 0x25C01, 0x25C06, 0x25C21, 0x25C4A, 0x25C65,
+ 0x25C91, 0x25CA4, 0x25CC0, 0x25CC1, 0x25CFE, 0x25D20,
+ 0x25D30, 0x25D43, 0x25E0E, 0x25E49, 0x25E81, 0x25E82,
+ 0x25E83, 0x25EA6, 0x25EBC, 0x25ED7, 0x25ED8, 0x25F1A,
+ 0x25F4B, 0x25FE1, 0x25FE2, 0x26029, 0x26048, 0x26064,
+ 0x26083, 0x26097, 0x260A4, 0x260A5, 0x26102, 0x26121,
+ 0x26159, 0x2615A, 0x2615B, 0x2615C, 0x261AD, 0x261AE,
+ 0x261B2, 0x261DD, 0x26258, 0x26261, 0x2626A, 0x2626B,
+ 0x262D0, 0x26335, 0x2634B, 0x2634C, 0x26351, 0x263BE,
+ 0x263F5, 0x263F8, 0x26402, 0x26410, 0x26411, 0x26412,
+ 0x2644A, 0x26469, 0x26484, 0x26488, 0x26489, 0x2648D,
+ 0x26498, 0x26512, 0x26572, 0x265A0, 0x265AD, 0x265BF,
+ 0x26612, 0x26626, 0x266AF, 0x266B1, 0x266B5, 0x266DA,
+ 0x266E8, 0x266FC, 0x26716, 0x26741, 0x26799, 0x267B3,
+ 0x267B4, 0x267CC, 0x2681C, 0x26846, 0x2685E, 0x2686E,
+ 0x26888, 0x2688A, 0x26893, 0x268C7, 0x2690E, 0x26911,
+ 0x26926, 0x26939, 0x26951, 0x269A8, 0x269B5, 0x269F2,
+ 0x269FA, 0x26A2D, 0x26A2E, 0x26A34, 0x26A42, 0x26A51,
+ 0x26A52, 0x26B05, 0x26B0A, 0x26B13, 0x26B15, 0x26B28,
+ 0x26B50, 0x26B51, 0x26B52, 0x26B53, 0x26B5B, 0x26B75,
+ 0x26B82, 0x26B96, 0x26B97, 0x26B9D, 0x26BB3, 0x26BC0,
+ 0x26BF7, 0x26C21, 0x26C40, 0x26C7E, 0x26C7F, 0x26C80,
+ 0x26C81, 0x26C82, 0x26CA4, 0x26CB7, 0x26CB8, 0x26CBD,
+ 0x26CC0, 0x26CC3, 0x26CD1, 0x26D22, 0x26D23, 0x26D24,
+ 0x26D25, 0x26D26, 0x26D27, 0x26D28, 0x26D29, 0x26D2A,
+ 0x26D51, 0x26D74, 0x26DA0, 0x26DA1, 0x26DA2, 0x26DA3,
+ 0x26DA4, 0x26DA5, 0x26DA6, 0x26DA7, 0x26DAE, 0x26DDC,
+ 0x26DEA, 0x26DEB, 0x26DF0, 0x26E00, 0x26E05, 0x26E07,
+ 0x26E12, 0x26E42, 0x26E43, 0x26E44, 0x26E45, 0x26E6E,
+ 0x26E72, 0x26E77, 0x26E84, 0x26E99, 0x26ED0, 0x26ED1,
+ 0x26ED2, 0x26ED3, 0x26ED4, 0x26ED5, 0x26ED6, 0x26ED7,
+ 0x26F26, 0x26F73, 0x26F74, 0x26F9F, 0x26FA1, 0x26FBE,
+ 0x26FDE, 0x26FDF, 0x2700E, 0x2704B, 0x27052, 0x27053,
+ 0x27088, 0x270AD, 0x270AE, 0x270AF, 0x270CD, 0x270F8,
+ 0x27109, 0x2710C, 0x2710D, 0x27126, 0x27127, 0x27164,
+ 0x27165, 0x27175, 0x271CD, 0x2721B, 0x27280, 0x27285,
+ 0x2728B, 0x272B2, 0x272B6, 0x272E6, 0x2739A, 0x27422,
+ 0x27450, 0x27484, 0x27486, 0x27574, 0x275A3, 0x275E0,
+ 0x275E4, 0x275FD, 0x275FE, 0x27607, 0x2760C, 0x27632,
+ 0x27639, 0x27655, 0x27656, 0x27657, 0x27694, 0x2770F,
+ 0x27735, 0x27736, 0x27741, 0x2775E, 0x27784, 0x27785,
+ 0x277CC, 0x27858, 0x27870, 0x2789D, 0x278B2, 0x278C8,
+ 0x27924, 0x27967, 0x2797A, 0x279A0, 0x279DD, 0x279FD,
+ 0x27A0A, 0x27A0E, 0x27A3E, 0x27A53, 0x27A59, 0x27A79,
+ 0x27A84, 0x27ABD, 0x27ABE, 0x27AF4, 0x27B06, 0x27B0B,
+ 0x27B18, 0x27B38, 0x27B39, 0x27B3A, 0x27B48, 0x27BF4,
+ 0x27C12, 0x27D2F, 0x27D53, 0x27D54, 0x27D66, 0x27D73,
+ 0x27D84, 0x27D8F, 0x27D98, 0x27DBD, 0x27DDC, 0x27E4D,
+ 0x27E4F, 0x27FF9, 0x28002, 0x28009, 0x2801E, 0x28023,
+ 0x28024, 0x28048, 0x28083, 0x28090, 0x280BD, 0x280BE,
+ 0x280E8, 0x280E9, 0x280F4, 0x2812E, 0x2814F, 0x2815D,
+ 0x2816F, 0x28189, 0x281AF, 0x281BC, 0x28207, 0x28218,
+ 0x2821A, 0x28256, 0x2827C, 0x2829B, 0x282CD, 0x282E2,
+ 0x28306, 0x28318, 0x2832F, 0x2833A, 0x28365, 0x2836D,
+ 0x2837D, 0x2838A, 0x28412, 0x28468, 0x2846C, 0x28473,
+ 0x28482, 0x28501, 0x2853C, 0x2853D, 0x2856C, 0x285E8,
+ 0x285F4, 0x28600, 0x2860B, 0x28625, 0x2863B, 0x286AA,
+ 0x286AB, 0x286BC, 0x286D8, 0x286E6, 0x2870F, 0x28713,
+ 0x28804, 0x2882B, 0x28933, 0x28948, 0x28949, 0x28956,
+ 0x28964, 0x28968, 0x2896C, 0x2897E, 0x28989, 0x289A8,
+ 0x289AA, 0x289AB, 0x289B8, 0x289BC, 0x289C0, 0x289DC,
+ 0x289DE, 0x289E1, 0x289E3, 0x289E4, 0x289E7, 0x289E8,
+ 0x289F9, 0x289FA, 0x289FB, 0x289FC, 0x28A0F, 0x28A16,
+ 0x28A25, 0x28A29, 0x28A32, 0x28A36, 0x28A44, 0x28A45,
+ 0x28A46, 0x28A47, 0x28A48, 0x28A49, 0x28A4A, 0x28A4B,
+ 0x28A59, 0x28A5A, 0x28A81, 0x28A82, 0x28A83, 0x28A9A,
+ 0x28A9B, 0x28A9C, 0x28AC0, 0x28AC6, 0x28ACB, 0x28ACC,
+ 0x28ACE, 0x28ADE, 0x28ADF, 0x28AE0, 0x28AE1, 0x28AE2,
+ 0x28AE3, 0x28AE5, 0x28AEA, 0x28AFC, 0x28B0C, 0x28B13,
+ 0x28B21, 0x28B22, 0x28B2B, 0x28B2C, 0x28B2D, 0x28B2F,
+ 0x28B46, 0x28B4C, 0x28B4E, 0x28B50, 0x28B63, 0x28B64,
+ 0x28B65, 0x28B66, 0x28B6C, 0x28B8F, 0x28B99, 0x28B9C,
+ 0x28B9D, 0x28BC2, 0x28BC5, 0x28BD4, 0x28BD7, 0x28BD9,
+ 0x28BDA, 0x28BE7, 0x28BE8, 0x28BE9, 0x28BEA, 0x28BEB,
+ 0x28BEC, 0x28BF5, 0x28BFF, 0x28C03, 0x28C09, 0x28C1C,
+ 0x28C1D, 0x28C23, 0x28C26, 0x28C2B, 0x28C30, 0x28C39,
+ 0x28C3B, 0x28CCA, 0x28CCD, 0x28CD2, 0x28D34, 0x28D99,
+ 0x28DB9, 0x28E0F, 0x28E36, 0x28E39, 0x28E65, 0x28E66,
+ 0x28E97, 0x28EAC, 0x28EB2, 0x28EB3, 0x28ED9, 0x28EE7,
+ 0x28FC5, 0x29088, 0x2908B, 0x29093, 0x290AF, 0x290B0,
+ 0x290B1, 0x290C0, 0x290E4, 0x290E5, 0x290EC, 0x290ED,
+ 0x2910D, 0x29110, 0x2913C, 0x2914D, 0x2915B, 0x2915E,
+ 0x29170, 0x2919C, 0x291A8, 0x291D5, 0x291EB, 0x2941D,
+ 0x29420, 0x29433, 0x2943F, 0x29448, 0x294D0, 0x294D9,
+ 0x294DA, 0x294E5, 0x294E7, 0x2959E, 0x295B0, 0x295B8,
+ 0x295D7, 0x295E9, 0x295F4, 0x29720, 0x29732, 0x297D4,
+ 0x29810, 0x29857, 0x298A4, 0x298D1, 0x298EA, 0x298F1,
+ 0x29903, 0x29905, 0x2992F, 0x29947, 0x29948, 0x29949,
+ 0x2995D, 0x2996A, 0x2999D, 0x299C3, 0x299C9, 0x29A28,
+ 0x29A4D, 0x29B05, 0x29B0E, 0x29BD5, 0x29C73, 0x29CAD,
+ 0x29D3E, 0x29D5A, 0x29D7C, 0x29D98, 0x29D9B, 0x29DF6,
+ 0x29E06, 0x29E2D, 0x29E68, 0x29EAC, 0x29EC3, 0x29EF8,
+ 0x29F23, 0x29F30, 0x29FB7, 0x29FDE, 0x2A014, 0x2A087,
+ 0x2A0B9, 0x2A0E1, 0x2A0ED, 0x2A0F3, 0x2A0F8, 0x2A0FE,
+ 0x2A107, 0x2A123, 0x2A133, 0x2A134, 0x2A150, 0x2A192,
+ 0x2A193, 0x2A1AB, 0x2A1B4, 0x2A1DF, 0x2A1F5, 0x2A220,
+ 0x2A233, 0x2A293, 0x2A29F, 0x2A2B2, 0x2A2B4, 0x2A2B6,
+ 0x2A2BA, 0x2A2BD, 0x2A2DF, 0x2A2FF, 0x2A3A9, 0x2A434,
+ 0x2A45B, 0x2A5C6, 0x2A5CB, 0x2A601, 0x2A632, 0x2A64A,
+ 0x2A65B, 0x2A6A9, 0x2F825, 0x2F83B, 0x2F840, 0x2F878,
+ 0x2F894, 0x2F8A6, 0x2F8CD, 0x2F994, 0x2F9B2, 0x2F9BC,
+ 0x2F9D4 };
+
+ /**
+ * Big5-HKSCS native encoded equivalent for the
+ * surrogate pair input provided above within the
+ * String constant "surrogates"
+ */
+
+ final static byte[] expectBytes = {
+ (byte)0x9C, (byte)0x71, (byte)0x93, (byte)0x75,
+ (byte)0x93, (byte)0x76, (byte)0x95, (byte)0x48,
+ (byte)0x8E, (byte)0xC6, (byte)0x8B, (byte)0xC5,
+ (byte)0x8B, (byte)0xFA, (byte)0xC8, (byte)0x7C,
+ (byte)0x9A, (byte)0xB4, (byte)0x88, (byte)0x4E,
+ (byte)0x88, (byte)0x4B, (byte)0xC8, (byte)0x7A,
+ (byte)0x88, (byte)0x48, (byte)0x88, (byte)0x47,
+ (byte)0xA0, (byte)0xF6, (byte)0x88, (byte)0x45,
+ (byte)0x88, (byte)0x53, (byte)0xFC, (byte)0xAD,
+ (byte)0x8A, (byte)0xAD, (byte)0x92, (byte)0x72,
+ (byte)0xFC, (byte)0x47, (byte)0x94, (byte)0xDF,
+ (byte)0x9F, (byte)0xD1, (byte)0xFB, (byte)0xCB,
+ (byte)0x92, (byte)0x7D, (byte)0x98, (byte)0xA4,
+ (byte)0x94, (byte)0xE7, (byte)0x90, (byte)0xCB,
+ (byte)0x92, (byte)0x7B, (byte)0x94, (byte)0xD8,
+ (byte)0xFC, (byte)0x5F, (byte)0xFA, (byte)0x54,
+ (byte)0x9A, (byte)0xB5, (byte)0x96, (byte)0xDA,
+ (byte)0x92, (byte)0x79, (byte)0xFA, (byte)0x74,
+ (byte)0x92, (byte)0x75, (byte)0x8D, (byte)0xFB,
+ (byte)0x8A, (byte)0x49, (byte)0x92, (byte)0xDF,
+ (byte)0x9B, (byte)0x7C, (byte)0xFA, (byte)0x63,
+ (byte)0xFA, (byte)0x60, (byte)0x92, (byte)0x6D,
+ (byte)0xFA, (byte)0x62, (byte)0x9A, (byte)0xB6,
+ (byte)0x97, (byte)0x6B, (byte)0xFD, (byte)0x6A,
+ (byte)0xFD, (byte)0x54, (byte)0x92, (byte)0x73,
+ (byte)0x97, (byte)0xD8, (byte)0x9F, (byte)0xBB,
+ (byte)0x93, (byte)0x42, (byte)0x92, (byte)0x76,
+ (byte)0xFA, (byte)0x65, (byte)0x92, (byte)0x6C,
+ (byte)0xFA, (byte)0x6E, (byte)0x9E, (byte)0xE0,
+ (byte)0x92, (byte)0xC0, (byte)0x92, (byte)0xBF,
+ (byte)0x92, (byte)0xBE, (byte)0x9A, (byte)0xBA,
+ (byte)0x8A, (byte)0xB3, (byte)0x97, (byte)0x75,
+ (byte)0xFA, (byte)0x40, (byte)0xFA, (byte)0x76,
+ (byte)0xFB, (byte)0xD0, (byte)0xFA, (byte)0x7B,
+ (byte)0xFE, (byte)0x6D, (byte)0x9B, (byte)0xB3,
+ (byte)0x89, (byte)0xCC, (byte)0x9A, (byte)0xBE,
+ (byte)0xFA, (byte)0x42, (byte)0x92, (byte)0xBC,
+ (byte)0x94, (byte)0x5C, (byte)0x9B, (byte)0xB5,
+ (byte)0x9A, (byte)0xBF, (byte)0x98, (byte)0xA7,
+ (byte)0x97, (byte)0xA4, (byte)0x90, (byte)0xFD,
+ (byte)0xFC, (byte)0x7B, (byte)0x9A, (byte)0xC0,
+ (byte)0x92, (byte)0xC3, (byte)0x8A, (byte)0xAA,
+ (byte)0x9B, (byte)0xD0, (byte)0x95, (byte)0x50,
+ (byte)0x92, (byte)0xC6, (byte)0x98, (byte)0xA6,
+ (byte)0x95, (byte)0x46, (byte)0xFD, (byte)0x63,
+ (byte)0xFA, (byte)0xC2, (byte)0x9E, (byte)0xC3,
+ (byte)0x89, (byte)0xB2, (byte)0x9C, (byte)0x66,
+ (byte)0x90, (byte)0x53, (byte)0x97, (byte)0xC1,
+ (byte)0x9A, (byte)0xC4, (byte)0x9A, (byte)0xC5,
+ (byte)0x8E, (byte)0xEF, (byte)0xFA, (byte)0xE9,
+ (byte)0x92, (byte)0x62, (byte)0x8A, (byte)0xF7,
+ (byte)0x9A, (byte)0xC6, (byte)0x92, (byte)0xE1,
+ (byte)0x9A, (byte)0xC9, (byte)0xFA, (byte)0xC6,
+ (byte)0x97, (byte)0xA5, (byte)0x9A, (byte)0xCB,
+ (byte)0xFA, (byte)0x72, (byte)0x8A, (byte)0x5E,
+ (byte)0x94, (byte)0xE0, (byte)0x92, (byte)0xCC,
+ (byte)0x8A, (byte)0xE5, (byte)0xFE, (byte)0x5C,
+ (byte)0x9A, (byte)0xCC, (byte)0x9D, (byte)0xF9,
+ (byte)0x8A, (byte)0x43, (byte)0x8A, (byte)0xA6,
+ (byte)0x9A, (byte)0xCD, (byte)0x9A, (byte)0xCE,
+ (byte)0xFA, (byte)0xEE, (byte)0x9B, (byte)0xCC,
+ (byte)0x9A, (byte)0xCF, (byte)0x9A, (byte)0xD1,
+ (byte)0x9D, (byte)0xFA, (byte)0x9D, (byte)0x7C,
+ (byte)0x9A, (byte)0xD3, (byte)0x97, (byte)0xA6,
+ (byte)0x99, (byte)0x5F, (byte)0xFB, (byte)0xF6,
+ (byte)0x9F, (byte)0xC5, (byte)0x8A, (byte)0x59,
+ (byte)0x8B, (byte)0x6B, (byte)0x9A, (byte)0xD4,
+ (byte)0x9A, (byte)0xD5, (byte)0x97, (byte)0xA2,
+ (byte)0x8A, (byte)0x44, (byte)0x9F, (byte)0x4A,
+ (byte)0x90, (byte)0xA1, (byte)0xFD, (byte)0xA4,
+ (byte)0x8A, (byte)0x64, (byte)0x8A, (byte)0xF2,
+ (byte)0x8A, (byte)0xF8, (byte)0x9D, (byte)0xD8,
+ (byte)0x94, (byte)0xD6, (byte)0xFA, (byte)0xFE,
+ (byte)0xFB, (byte)0xA7, (byte)0x9A, (byte)0xD6,
+ (byte)0x9F, (byte)0x4D, (byte)0xFA, (byte)0xF6,
+ (byte)0x8A, (byte)0x57, (byte)0x8B, (byte)0x43,
+ (byte)0x8B, (byte)0x44, (byte)0x8A, (byte)0xB6,
+ (byte)0x8A, (byte)0xC0, (byte)0x9E, (byte)0x54,
+ (byte)0x9A, (byte)0xD7, (byte)0x9A, (byte)0xD8,
+ (byte)0x9A, (byte)0xDC, (byte)0x8A, (byte)0xCA,
+ (byte)0x9E, (byte)0xA8, (byte)0x92, (byte)0x63,
+ (byte)0x9A, (byte)0xDD, (byte)0x8B, (byte)0x65,
+ (byte)0x8B, (byte)0x6F, (byte)0x8B, (byte)0x7E,
+ (byte)0x8F, (byte)0x43, (byte)0x92, (byte)0xD0,
+ (byte)0x8A, (byte)0xF4, (byte)0x9D, (byte)0xBE,
+ (byte)0x9A, (byte)0xE1, (byte)0xFC, (byte)0xDE,
+ (byte)0x9D, (byte)0xFD, (byte)0x8B, (byte)0x66,
+ (byte)0x8B, (byte)0x70, (byte)0x8B, (byte)0x75,
+ (byte)0x8A, (byte)0xE4, (byte)0x8B, (byte)0xA4,
+ (byte)0x8A, (byte)0xED, (byte)0x8A, (byte)0x5D,
+ (byte)0x8B, (byte)0x48, (byte)0x9D, (byte)0xED,
+ (byte)0x9E, (byte)0x40, (byte)0x8A, (byte)0xEF,
+ (byte)0x8A, (byte)0xF6, (byte)0x9E, (byte)0x76,
+ (byte)0x9E, (byte)0xE3, (byte)0x9A, (byte)0xDE,
+ (byte)0x8D, (byte)0xFE, (byte)0xFA, (byte)0xFC,
+ (byte)0x9C, (byte)0xB1, (byte)0x9E, (byte)0x77,
+ (byte)0x8B, (byte)0x64, (byte)0x8B, (byte)0x67,
+ (byte)0x97, (byte)0x4B, (byte)0x96, (byte)0x53,
+ (byte)0x9A, (byte)0xE0, (byte)0x8B, (byte)0x4A,
+ (byte)0x8A, (byte)0xF1, (byte)0x8A, (byte)0xD7,
+ (byte)0xA0, (byte)0xAB, (byte)0x8A, (byte)0xB5,
+ (byte)0x8A, (byte)0x5F, (byte)0x8A, (byte)0xEE,
+ (byte)0x9A, (byte)0xDF, (byte)0x8A, (byte)0xFE,
+ (byte)0x8A, (byte)0x58, (byte)0x8B, (byte)0xA3,
+ (byte)0x8B, (byte)0xA7, (byte)0x9A, (byte)0xE3,
+ (byte)0x92, (byte)0x61, (byte)0x9D, (byte)0xD7,
+ (byte)0x9E, (byte)0x7D, (byte)0x9E, (byte)0xA7,
+ (byte)0x9E, (byte)0xAB, (byte)0x90, (byte)0x42,
+ (byte)0x8B, (byte)0x79, (byte)0x8B, (byte)0x7A,
+ (byte)0x9A, (byte)0xE6, (byte)0x9A, (byte)0xE5,
+ (byte)0x8A, (byte)0x7E, (byte)0x9E, (byte)0x44,
+ (byte)0x9A, (byte)0xE7, (byte)0x8A, (byte)0x7C,
+ (byte)0x8B, (byte)0x71, (byte)0x9A, (byte)0xE9,
+ (byte)0x9A, (byte)0xEA, (byte)0x9A, (byte)0xEB,
+ (byte)0x8A, (byte)0xBD, (byte)0xFB, (byte)0x4E,
+ (byte)0x9A, (byte)0xED, (byte)0x8A, (byte)0xF9,
+ (byte)0x9E, (byte)0x63, (byte)0x8B, (byte)0x49,
+ (byte)0x8A, (byte)0xCE, (byte)0x8B, (byte)0x6E,
+ (byte)0x8A, (byte)0xE8, (byte)0x9A, (byte)0xEE,
+ (byte)0x92, (byte)0xCE, (byte)0x8A, (byte)0x5A,
+ (byte)0x8B, (byte)0x7B, (byte)0x8B, (byte)0x7C,
+ (byte)0x9A, (byte)0xEF, (byte)0x9A, (byte)0xF0,
+ (byte)0x8A, (byte)0xFA, (byte)0x89, (byte)0x41,
+ (byte)0x8B, (byte)0x72, (byte)0x8A, (byte)0xF3,
+ (byte)0x8B, (byte)0xA8, (byte)0x9E, (byte)0xAE,
+ (byte)0x9E, (byte)0x72, (byte)0xFB, (byte)0x73,
+ (byte)0xFB, (byte)0x5F, (byte)0x90, (byte)0xBA,
+ (byte)0x91, (byte)0xFE, (byte)0x9E, (byte)0xF6,
+ (byte)0x97, (byte)0xED, (byte)0x9A, (byte)0xF3,
+ (byte)0xA0, (byte)0xEE, (byte)0x96, (byte)0x7C,
+ (byte)0x93, (byte)0x45, (byte)0x98, (byte)0x6E,
+ (byte)0xFA, (byte)0x56, (byte)0x9A, (byte)0xF5,
+ (byte)0xFC, (byte)0x4B, (byte)0x9A, (byte)0xF4,
+ (byte)0xFE, (byte)0xDE, (byte)0xFC, (byte)0xB7,
+ (byte)0x97, (byte)0xF1, (byte)0x97, (byte)0xC7,
+ (byte)0x9C, (byte)0xCB, (byte)0x92, (byte)0x40,
+ (byte)0x9C, (byte)0xE8, (byte)0x91, (byte)0xFD,
+ (byte)0x97, (byte)0x4E, (byte)0xFB, (byte)0x68,
+ (byte)0x97, (byte)0x6C, (byte)0x8C, (byte)0xC2,
+ (byte)0x97, (byte)0xE8, (byte)0xFB, (byte)0x6A,
+ (byte)0x8B, (byte)0x74, (byte)0x8E, (byte)0xE7,
+ (byte)0xFD, (byte)0xC8, (byte)0x92, (byte)0x41,
+ (byte)0x96, (byte)0xA1, (byte)0x8E, (byte)0xF3,
+ (byte)0x9A, (byte)0xF7, (byte)0x8F, (byte)0xA6,
+ (byte)0xFA, (byte)0xD6, (byte)0x9C, (byte)0xC7,
+ (byte)0xFA, (byte)0xD7, (byte)0x9A, (byte)0xF8,
+ (byte)0xFB, (byte)0xA1, (byte)0x8E, (byte)0xC5,
+ (byte)0xFB, (byte)0xA4, (byte)0xFB, (byte)0xC2,
+ (byte)0x9A, (byte)0xC1, (byte)0x91, (byte)0xFA,
+ (byte)0xFE, (byte)0xDB, (byte)0x97, (byte)0xAB,
+ (byte)0x91, (byte)0x47, (byte)0xFB, (byte)0xB1,
+ (byte)0x8F, (byte)0xEA, (byte)0x94, (byte)0xD2,
+ (byte)0xFE, (byte)0x61, (byte)0xFA, (byte)0xCE,
+ (byte)0x92, (byte)0xED, (byte)0x91, (byte)0xF3,
+ (byte)0x93, (byte)0xC6, (byte)0x93, (byte)0x5A,
+ (byte)0xFA, (byte)0xFB, (byte)0x92, (byte)0xEF,
+ (byte)0xFA, (byte)0xC8, (byte)0x98, (byte)0x47,
+ (byte)0x93, (byte)0x66, (byte)0x98, (byte)0x55,
+ (byte)0x96, (byte)0xE6, (byte)0x9F, (byte)0x43,
+ (byte)0x9F, (byte)0xAA, (byte)0x94, (byte)0xDA,
+ (byte)0x92, (byte)0xEE, (byte)0xFC, (byte)0xAF,
+ (byte)0xFB, (byte)0xFB, (byte)0x8E, (byte)0xF9,
+ (byte)0x91, (byte)0xF6, (byte)0x93, (byte)0x64,
+ (byte)0x94, (byte)0xF5, (byte)0x9C, (byte)0xB6,
+ (byte)0xFB, (byte)0xAD, (byte)0x98, (byte)0x4E,
+ (byte)0x8F, (byte)0x44, (byte)0x96, (byte)0xFD,
+ (byte)0x9A, (byte)0xF9, (byte)0x9A, (byte)0xFA,
+ (byte)0x97, (byte)0x69, (byte)0x95, (byte)0xD4,
+ (byte)0x98, (byte)0x4B, (byte)0xFB, (byte)0xAA,
+ (byte)0x98, (byte)0x7C, (byte)0x91, (byte)0xEA,
+ (byte)0x9D, (byte)0xAF, (byte)0x9D, (byte)0xC5,
+ (byte)0x91, (byte)0xF1, (byte)0x8E, (byte)0xB1,
+ (byte)0x97, (byte)0xA9, (byte)0xFB, (byte)0xAC,
+ (byte)0xFC, (byte)0xB8, (byte)0x9C, (byte)0xB9,
+ (byte)0xFB, (byte)0xB0, (byte)0xFC, (byte)0xD2,
+ (byte)0x93, (byte)0xCB, (byte)0x9A, (byte)0xFD,
+ (byte)0x91, (byte)0xF4, (byte)0x8B, (byte)0xAC,
+ (byte)0xA0, (byte)0x55, (byte)0x95, (byte)0x74,
+ (byte)0x95, (byte)0xBE, (byte)0x97, (byte)0xAD,
+ (byte)0x8E, (byte)0xE9, (byte)0x92, (byte)0xF8,
+ (byte)0x97, (byte)0xBE, (byte)0x91, (byte)0x6C,
+ (byte)0x94, (byte)0xAA, (byte)0xFC, (byte)0x63,
+ (byte)0x9D, (byte)0xC6, (byte)0x97, (byte)0xB5,
+ (byte)0x92, (byte)0xB8, (byte)0x91, (byte)0xEF,
+ (byte)0xFE, (byte)0xA6, (byte)0x97, (byte)0x60,
+ (byte)0x93, (byte)0x58, (byte)0x95, (byte)0x76,
+ (byte)0x8F, (byte)0xAC, (byte)0x91, (byte)0xEC,
+ (byte)0x97, (byte)0xB4, (byte)0x91, (byte)0xF7,
+ (byte)0x97, (byte)0x4A, (byte)0xFB, (byte)0x49,
+ (byte)0x95, (byte)0x78, (byte)0x93, (byte)0xBC,
+ (byte)0x91, (byte)0xD6, (byte)0x93, (byte)0x55,
+ (byte)0x93, (byte)0x56, (byte)0x98, (byte)0x51,
+ (byte)0x8F, (byte)0xF8, (byte)0xFB, (byte)0xC0,
+ (byte)0x93, (byte)0xF2, (byte)0x90, (byte)0xD0,
+ (byte)0x9C, (byte)0x44, (byte)0x92, (byte)0x55,
+ (byte)0x93, (byte)0x63, (byte)0x91, (byte)0xA5,
+ (byte)0xA0, (byte)0xED, (byte)0xFD, (byte)0x6B,
+ (byte)0x9A, (byte)0xFE, (byte)0x93, (byte)0x51,
+ (byte)0x8C, (byte)0x57, (byte)0xFA, (byte)0x78,
+ (byte)0xFE, (byte)0xA8, (byte)0x93, (byte)0x50,
+ (byte)0xFA, (byte)0x4C, (byte)0x92, (byte)0xF7,
+ (byte)0x9B, (byte)0x40, (byte)0xFB, (byte)0xCE,
+ (byte)0x9B, (byte)0x41, (byte)0xFE, (byte)0xAD,
+ (byte)0xFB, (byte)0xD5, (byte)0x8B, (byte)0xC2,
+ (byte)0x9A, (byte)0x7C, (byte)0x9B, (byte)0x42,
+ (byte)0x9B, (byte)0x43, (byte)0x9E, (byte)0x79,
+ (byte)0xFB, (byte)0xD9, (byte)0x9B, (byte)0x44,
+ (byte)0xA0, (byte)0xA7, (byte)0x9B, (byte)0xF3,
+ (byte)0x8C, (byte)0x79, (byte)0x93, (byte)0x5E,
+ (byte)0x89, (byte)0xCB, (byte)0x9F, (byte)0x53,
+ (byte)0x93, (byte)0xD7, (byte)0xFB, (byte)0xE1,
+ (byte)0xFE, (byte)0xD0, (byte)0xFB, (byte)0xE2,
+ (byte)0xFC, (byte)0xE3, (byte)0x90, (byte)0x74,
+ (byte)0xFB, (byte)0xE6, (byte)0x9B, (byte)0xB7,
+ (byte)0x9B, (byte)0x45, (byte)0x9B, (byte)0x47,
+ (byte)0x9F, (byte)0x50, (byte)0x9B, (byte)0x48,
+ (byte)0xFC, (byte)0x5B, (byte)0x98, (byte)0xA9,
+ (byte)0x9C, (byte)0xFD, (byte)0x88, (byte)0x4C,
+ (byte)0x9B, (byte)0x4B, (byte)0xFB, (byte)0xEC,
+ (byte)0x8C, (byte)0x69, (byte)0x9B, (byte)0xA8,
+ (byte)0x8A, (byte)0xD5, (byte)0xFA, (byte)0x73,
+ (byte)0xFD, (byte)0x59, (byte)0x91, (byte)0xA2,
+ (byte)0xFB, (byte)0xED, (byte)0x9C, (byte)0xA9,
+ (byte)0x8A, (byte)0xA8, (byte)0x9B, (byte)0xC3,
+ (byte)0x8A, (byte)0xE1, (byte)0x9B, (byte)0x4E,
+ (byte)0x95, (byte)0xD0, (byte)0x90, (byte)0x5F,
+ (byte)0x97, (byte)0xEE, (byte)0xFC, (byte)0x4E,
+ (byte)0x9B, (byte)0x4F, (byte)0x9B, (byte)0x50,
+ (byte)0x9E, (byte)0xC6, (byte)0xFC, (byte)0x50,
+ (byte)0xFD, (byte)0x73, (byte)0xFD, (byte)0xA7,
+ (byte)0x9D, (byte)0xA2, (byte)0xFA, (byte)0x58,
+ (byte)0xFA, (byte)0x5E, (byte)0xA0, (byte)0x59,
+ (byte)0xFA, (byte)0x75, (byte)0xFB, (byte)0xBE,
+ (byte)0x9C, (byte)0xA2, (byte)0x93, (byte)0x70,
+ (byte)0x93, (byte)0x71, (byte)0x93, (byte)0x77,
+ (byte)0xFE, (byte)0xEF, (byte)0x93, (byte)0x6D,
+ (byte)0xFC, (byte)0x5D, (byte)0x90, (byte)0xB8,
+ (byte)0x8A, (byte)0xFC, (byte)0xFB, (byte)0x41,
+ (byte)0x9E, (byte)0x6B, (byte)0x94, (byte)0xE3,
+ (byte)0x8E, (byte)0xE2, (byte)0x8C, (byte)0x7D,
+ (byte)0x8E, (byte)0xD7, (byte)0x9C, (byte)0x4D,
+ (byte)0x96, (byte)0xA3, (byte)0x9B, (byte)0x51,
+ (byte)0x8A, (byte)0xC3, (byte)0x96, (byte)0xAA,
+ (byte)0xFC, (byte)0x68, (byte)0x8B, (byte)0x6D,
+ (byte)0xFD, (byte)0x67, (byte)0x8A, (byte)0xE9,
+ (byte)0xFC, (byte)0xA1, (byte)0x93, (byte)0x6C,
+ (byte)0x9B, (byte)0x52, (byte)0xFE, (byte)0x70,
+ (byte)0xFC, (byte)0xA8, (byte)0xFC, (byte)0xE9,
+ (byte)0x9C, (byte)0xB4, (byte)0x8A, (byte)0xEA,
+ (byte)0x9B, (byte)0x53, (byte)0x9B, (byte)0x55,
+ (byte)0x96, (byte)0xAB, (byte)0xFC, (byte)0xA7,
+ (byte)0x9B, (byte)0x56, (byte)0x8A, (byte)0xBC,
+ (byte)0x8A, (byte)0xCB, (byte)0x9B, (byte)0x57,
+ (byte)0x89, (byte)0xCD, (byte)0x9B, (byte)0x59,
+ (byte)0x9B, (byte)0x5B, (byte)0x93, (byte)0xA5,
+ (byte)0x9B, (byte)0x5D, (byte)0x9E, (byte)0x4F,
+ (byte)0x93, (byte)0xA3, (byte)0x8A, (byte)0x7B,
+ (byte)0x8B, (byte)0x42, (byte)0x97, (byte)0x50,
+ (byte)0x8F, (byte)0xB3, (byte)0x8A, (byte)0x50,
+ (byte)0x9B, (byte)0x60, (byte)0x8B, (byte)0x45,
+ (byte)0x8B, (byte)0x46, (byte)0x9D, (byte)0xFE,
+ (byte)0x9B, (byte)0x62, (byte)0x93, (byte)0x7B,
+ (byte)0x93, (byte)0xB1, (byte)0x8A, (byte)0x60,
+ (byte)0x8A, (byte)0xD8, (byte)0x9B, (byte)0x63,
+ (byte)0x8A, (byte)0x69, (byte)0x8A, (byte)0x47,
+ (byte)0x8A, (byte)0xCC, (byte)0x93, (byte)0x7C,
+ (byte)0x9B, (byte)0x65, (byte)0x9B, (byte)0x66,
+ (byte)0x8A, (byte)0x72, (byte)0x8A, (byte)0x7A,
+ (byte)0x93, (byte)0xAF, (byte)0x8A, (byte)0xB0,
+ (byte)0x9B, (byte)0x68, (byte)0x9E, (byte)0xA3,
+ (byte)0xFA, (byte)0xEC, (byte)0x8B, (byte)0x77,
+ (byte)0x9B, (byte)0x67, (byte)0x8B, (byte)0x59,
+ (byte)0xFC, (byte)0xB1, (byte)0xFC, (byte)0xBB,
+ (byte)0x9B, (byte)0x69, (byte)0x93, (byte)0xA8,
+ (byte)0x8A, (byte)0xE0, (byte)0x9E, (byte)0x51,
+ (byte)0x8F, (byte)0x5F, (byte)0x9B, (byte)0x6A,
+ (byte)0x9B, (byte)0x6B, (byte)0x97, (byte)0xEC,
+ (byte)0x9B, (byte)0x6C, (byte)0xFE, (byte)0x4E,
+ (byte)0xFD, (byte)0xC2, (byte)0x9B, (byte)0x6D,
+ (byte)0x91, (byte)0x67, (byte)0xFC, (byte)0xCC,
+ (byte)0x93, (byte)0xB6, (byte)0x90, (byte)0xE4,
+ (byte)0x90, (byte)0xE5, (byte)0x9E, (byte)0xF2,
+ (byte)0x93, (byte)0xCA, (byte)0x8B, (byte)0xBC,
+ (byte)0x8F, (byte)0x46, (byte)0x93, (byte)0xCF,
+ (byte)0xFC, (byte)0xDB, (byte)0xFC, (byte)0xDC,
+ (byte)0x93, (byte)0xC0, (byte)0xFC, (byte)0xE6,
+ (byte)0x96, (byte)0xE7, (byte)0xFC, (byte)0xD8,
+ (byte)0xFC, (byte)0xD9, (byte)0xFD, (byte)0xA6,
+ (byte)0x93, (byte)0xCE, (byte)0x95, (byte)0xF1,
+ (byte)0x9C, (byte)0xE9, (byte)0xFC, (byte)0xE4,
+ (byte)0x94, (byte)0xAF, (byte)0xFA, (byte)0x77,
+ (byte)0x93, (byte)0xCC, (byte)0x90, (byte)0x5A,
+ (byte)0x8C, (byte)0x54, (byte)0x93, (byte)0xBF,
+ (byte)0xFB, (byte)0x51, (byte)0x93, (byte)0xB9,
+ (byte)0xFE, (byte)0xD7, (byte)0x93, (byte)0xB7,
+ (byte)0x93, (byte)0xD9, (byte)0x93, (byte)0xBB,
+ (byte)0x93, (byte)0xDA, (byte)0x98, (byte)0xA3,
+ (byte)0x90, (byte)0xD1, (byte)0x9B, (byte)0x6E,
+ (byte)0xFA, (byte)0x70, (byte)0x9B, (byte)0xEB,
+ (byte)0x9B, (byte)0x6F, (byte)0xFC, (byte)0xFC,
+ (byte)0x8B, (byte)0x40, (byte)0xA0, (byte)0x7B,
+ (byte)0x8C, (byte)0xA1, (byte)0x97, (byte)0xF7,
+ (byte)0x93, (byte)0xE2, (byte)0xFC, (byte)0xD6,
+ (byte)0x95, (byte)0x59, (byte)0x93, (byte)0xA6,
+ (byte)0xFD, (byte)0x40, (byte)0x93, (byte)0x5F,
+ (byte)0x97, (byte)0xF2, (byte)0x9C, (byte)0x76,
+ (byte)0x8E, (byte)0xF8, (byte)0x8F, (byte)0x47,
+ (byte)0x9B, (byte)0x74, (byte)0x92, (byte)0xB4,
+ (byte)0x91, (byte)0xED, (byte)0x96, (byte)0xD2,
+ (byte)0xFD, (byte)0x46, (byte)0x8F, (byte)0x4F,
+ (byte)0x95, (byte)0x49, (byte)0x9B, (byte)0x75,
+ (byte)0xFA, (byte)0x5C, (byte)0x9B, (byte)0x79,
+ (byte)0xFD, (byte)0x4B, (byte)0x96, (byte)0xD3,
+ (byte)0xFD, (byte)0x58, (byte)0x94, (byte)0x5F,
+ (byte)0xA0, (byte)0xF5, (byte)0x92, (byte)0x43,
+ (byte)0x97, (byte)0xFA, (byte)0x9D, (byte)0xD9,
+ (byte)0x97, (byte)0xF4, (byte)0x92, (byte)0x4D,
+ (byte)0xFD, (byte)0x5B, (byte)0x9B, (byte)0x7A,
+ (byte)0x9E, (byte)0xD5, (byte)0xFA, (byte)0xAE,
+ (byte)0x9C, (byte)0xC9, (byte)0x92, (byte)0x58,
+ (byte)0x8E, (byte)0xC8, (byte)0x94, (byte)0xB4,
+ (byte)0x93, (byte)0xE1, (byte)0x93, (byte)0xDF,
+ (byte)0xFC, (byte)0xF0, (byte)0x93, (byte)0xEC,
+ (byte)0x97, (byte)0xF6, (byte)0x96, (byte)0xCF,
+ (byte)0x93, (byte)0xDE, (byte)0x8A, (byte)0xCF,
+ (byte)0x9B, (byte)0xA2, (byte)0xFD, (byte)0x69,
+ (byte)0x93, (byte)0x52, (byte)0x98, (byte)0xA2,
+ (byte)0xFD, (byte)0x6E, (byte)0x8C, (byte)0xA4,
+ (byte)0xFA, (byte)0x7C, (byte)0x93, (byte)0xFA,
+ (byte)0x90, (byte)0x7C, (byte)0x8F, (byte)0x67,
+ (byte)0x9D, (byte)0xB7, (byte)0xA0, (byte)0xE9,
+ (byte)0xFA, (byte)0x4E, (byte)0xFD, (byte)0xA1,
+ (byte)0x9E, (byte)0x74, (byte)0x9F, (byte)0xBF,
+ (byte)0x9E, (byte)0xCB, (byte)0x9B, (byte)0xB9,
+ (byte)0x9D, (byte)0xD4, (byte)0x97, (byte)0xB9,
+ (byte)0x8E, (byte)0xF1, (byte)0x95, (byte)0x7B,
+ (byte)0x9E, (byte)0xD2, (byte)0x97, (byte)0x53,
+ (byte)0x96, (byte)0xA4, (byte)0x8F, (byte)0xBE,
+ (byte)0x94, (byte)0xD9, (byte)0x90, (byte)0x58,
+ (byte)0xFD, (byte)0x79, (byte)0xFD, (byte)0x7B,
+ (byte)0x8E, (byte)0xDA, (byte)0x8E, (byte)0xFA,
+ (byte)0x9B, (byte)0xA5, (byte)0x9E, (byte)0xD9,
+ (byte)0x97, (byte)0xD4, (byte)0x90, (byte)0xBB,
+ (byte)0xFD, (byte)0xBC, (byte)0xFD, (byte)0xC6,
+ (byte)0x92, (byte)0x48, (byte)0x92, (byte)0xB5,
+ (byte)0x9D, (byte)0xC1, (byte)0x92, (byte)0xB9,
+ (byte)0x92, (byte)0xA6, (byte)0x8F, (byte)0x4B,
+ (byte)0x9B, (byte)0xA6, (byte)0x92, (byte)0xB6,
+ (byte)0x8E, (byte)0x40, (byte)0x9E, (byte)0xD8,
+ (byte)0x94, (byte)0x5E, (byte)0x98, (byte)0x5F,
+ (byte)0x94, (byte)0xCE, (byte)0x92, (byte)0x4A,
+ (byte)0xFD, (byte)0x70, (byte)0x94, (byte)0x67,
+ (byte)0x8D, (byte)0xEC, (byte)0x9B, (byte)0xD8,
+ (byte)0x94, (byte)0x48, (byte)0xFA, (byte)0xC1,
+ (byte)0x9C, (byte)0xF7, (byte)0xFD, (byte)0xBE,
+ (byte)0x8F, (byte)0xDA, (byte)0xFD, (byte)0xD9,
+ (byte)0xFC, (byte)0x7E, (byte)0x93, (byte)0xF9,
+ (byte)0xFA, (byte)0x43, (byte)0xFA, (byte)0xEB,
+ (byte)0xFA, (byte)0xC3, (byte)0x97, (byte)0xD3,
+ (byte)0x95, (byte)0xF9, (byte)0x9C, (byte)0x48,
+ (byte)0xFD, (byte)0xD8, (byte)0xA0, (byte)0xD8,
+ (byte)0xFD, (byte)0xD7, (byte)0xFB, (byte)0x4A,
+ (byte)0x9B, (byte)0xAF, (byte)0x94, (byte)0x4B,
+ (byte)0xFD, (byte)0xC9, (byte)0x8E, (byte)0xAC,
+ (byte)0xFD, (byte)0xB2, (byte)0x92, (byte)0x5A,
+ (byte)0xFC, (byte)0xBD, (byte)0x92, (byte)0xD9,
+ (byte)0xFD, (byte)0xD5, (byte)0x92, (byte)0xDD,
+ (byte)0x92, (byte)0x59, (byte)0x96, (byte)0xBA,
+ (byte)0x92, (byte)0x5B, (byte)0x9B, (byte)0xAB,
+ (byte)0xFD, (byte)0xDA, (byte)0xFD, (byte)0xDE,
+ (byte)0xFD, (byte)0xD3, (byte)0x8C, (byte)0x46,
+ (byte)0xFD, (byte)0xD6, (byte)0xFD, (byte)0xDC,
+ (byte)0xFD, (byte)0xDD, (byte)0x90, (byte)0xFE,
+ (byte)0xFE, (byte)0xA1, (byte)0x8B, (byte)0xAD,
+ (byte)0x9C, (byte)0xD8, (byte)0x9E, (byte)0x6D,
+ (byte)0xFD, (byte)0x7C, (byte)0xFB, (byte)0x61,
+ (byte)0x96, (byte)0xF8, (byte)0x96, (byte)0xF0,
+ (byte)0xFC, (byte)0xF4, (byte)0xFE, (byte)0x60,
+ (byte)0x98, (byte)0x52, (byte)0x96, (byte)0x4F,
+ (byte)0x91, (byte)0x6E, (byte)0x98, (byte)0x6D,
+ (byte)0x98, (byte)0x64, (byte)0x94, (byte)0x53,
+ (byte)0xFD, (byte)0xEC, (byte)0xFB, (byte)0x78,
+ (byte)0x95, (byte)0xBA, (byte)0x98, (byte)0x5D,
+ (byte)0x92, (byte)0xF9, (byte)0x98, (byte)0x5A,
+ (byte)0xFD, (byte)0xF6, (byte)0x93, (byte)0xD0,
+ (byte)0x98, (byte)0x62, (byte)0x9B, (byte)0xAD,
+ (byte)0x97, (byte)0x4F, (byte)0x9B, (byte)0xAE,
+ (byte)0x94, (byte)0x52, (byte)0x9B, (byte)0xB0,
+ (byte)0x91, (byte)0xD2, (byte)0x97, (byte)0xEA,
+ (byte)0xFB, (byte)0x6B, (byte)0x91, (byte)0xB1,
+ (byte)0xFD, (byte)0xF3, (byte)0x92, (byte)0xCB,
+ (byte)0x9B, (byte)0xB1, (byte)0xFC, (byte)0xEC,
+ (byte)0x98, (byte)0x6B, (byte)0x97, (byte)0x51,
+ (byte)0x98, (byte)0x71, (byte)0x95, (byte)0xEF,
+ (byte)0x9E, (byte)0xF3, (byte)0x91, (byte)0xE8,
+ (byte)0x9B, (byte)0xBA, (byte)0xFB, (byte)0x4C,
+ (byte)0x92, (byte)0x6A, (byte)0xFD, (byte)0xF8,
+ (byte)0x98, (byte)0x61, (byte)0x91, (byte)0xE7,
+ (byte)0x93, (byte)0xED, (byte)0x97, (byte)0x44,
+ (byte)0x91, (byte)0xE1, (byte)0xFB, (byte)0xF5,
+ (byte)0x98, (byte)0x69, (byte)0x8A, (byte)0x62,
+ (byte)0x9B, (byte)0xBB, (byte)0x8C, (byte)0xA8,
+ (byte)0x9C, (byte)0x55, (byte)0x8E, (byte)0x77,
+ (byte)0x8A, (byte)0xB2, (byte)0x9E, (byte)0xBC,
+ (byte)0x93, (byte)0xE6, (byte)0x93, (byte)0xA2,
+ (byte)0x9B, (byte)0xBD, (byte)0x94, (byte)0xB3,
+ (byte)0x93, (byte)0x7D, (byte)0x9E, (byte)0x66,
+ (byte)0x94, (byte)0x59, (byte)0x9B, (byte)0xBF,
+ (byte)0x94, (byte)0x58, (byte)0x9E, (byte)0xA5,
+ (byte)0x9B, (byte)0xC7, (byte)0xFE, (byte)0x54,
+ (byte)0x8E, (byte)0x74, (byte)0x8B, (byte)0xD6,
+ (byte)0x94, (byte)0xB6, (byte)0xFD, (byte)0x74,
+ (byte)0x98, (byte)0xC0, (byte)0x94, (byte)0xA5,
+ (byte)0x9B, (byte)0xC8, (byte)0x95, (byte)0xED,
+ (byte)0xFD, (byte)0x7E, (byte)0xFB, (byte)0xEB,
+ (byte)0xFD, (byte)0x7D, (byte)0x97, (byte)0x6F,
+ (byte)0x94, (byte)0x61, (byte)0x9F, (byte)0xC1,
+ (byte)0x95, (byte)0xD7, (byte)0xFA, (byte)0x52,
+ (byte)0x9C, (byte)0x58, (byte)0x9F, (byte)0x68,
+ (byte)0x9B, (byte)0xE7, (byte)0xFC, (byte)0xCE,
+ (byte)0x96, (byte)0xE8, (byte)0xFA, (byte)0x49,
+ (byte)0x97, (byte)0xA1, (byte)0x95, (byte)0x4D,
+ (byte)0x9E, (byte)0xF8, (byte)0xFE, (byte)0x49,
+ (byte)0x91, (byte)0xCE, (byte)0x97, (byte)0x71,
+ (byte)0x8C, (byte)0xCF, (byte)0xFD, (byte)0xB1,
+ (byte)0xFC, (byte)0x6E, (byte)0x9C, (byte)0xF2,
+ (byte)0x93, (byte)0xB8, (byte)0x90, (byte)0x43,
+ (byte)0x97, (byte)0x59, (byte)0x94, (byte)0xD7,
+ (byte)0xFE, (byte)0x66, (byte)0x94, (byte)0x7D,
+ (byte)0xFC, (byte)0x6F, (byte)0x92, (byte)0x46,
+ (byte)0xFA, (byte)0x6D, (byte)0x8E, (byte)0xF7,
+ (byte)0xFB, (byte)0xB7, (byte)0x94, (byte)0x7C,
+ (byte)0x92, (byte)0xCD, (byte)0x97, (byte)0xB2,
+ (byte)0xFE, (byte)0x65, (byte)0x96, (byte)0x7E,
+ (byte)0x97, (byte)0x58, (byte)0x9B, (byte)0x77,
+ (byte)0x91, (byte)0xCF, (byte)0x94, (byte)0xA4,
+ (byte)0x9C, (byte)0xAD, (byte)0x8B, (byte)0xAB,
+ (byte)0x96, (byte)0xD5, (byte)0xFC, (byte)0xB3,
+ (byte)0x93, (byte)0xAE, (byte)0x97, (byte)0x6D,
+ (byte)0x94, (byte)0x46, (byte)0x95, (byte)0xF7,
+ (byte)0x9C, (byte)0x46, (byte)0x95, (byte)0x5B,
+ (byte)0x91, (byte)0xD1, (byte)0x94, (byte)0xF4,
+ (byte)0xFE, (byte)0x67, (byte)0x92, (byte)0xA5,
+ (byte)0xFE, (byte)0xDF, (byte)0x8C, (byte)0xAB,
+ (byte)0x9B, (byte)0xC9, (byte)0xFC, (byte)0xED,
+ (byte)0xFD, (byte)0xFA, (byte)0xFC, (byte)0xC8,
+ (byte)0xFE, (byte)0x62, (byte)0x91, (byte)0xFC,
+ (byte)0xFE, (byte)0x6B, (byte)0xFD, (byte)0xF9,
+ (byte)0xFC, (byte)0xC7, (byte)0x91, (byte)0x4E,
+ (byte)0x9C, (byte)0xB8, (byte)0x97, (byte)0x67,
+ (byte)0x95, (byte)0xEE, (byte)0x9B, (byte)0xB2,
+ (byte)0x94, (byte)0x60, (byte)0x94, (byte)0xA2,
+ (byte)0x98, (byte)0x75, (byte)0x97, (byte)0xAC,
+ (byte)0x91, (byte)0xD3, (byte)0x98, (byte)0x7B,
+ (byte)0x8E, (byte)0xEB, (byte)0x97, (byte)0x6A,
+ (byte)0x96, (byte)0x5E, (byte)0x97, (byte)0xEB,
+ (byte)0x9F, (byte)0xF9, (byte)0x95, (byte)0xF8,
+ (byte)0xFE, (byte)0xA2, (byte)0x8F, (byte)0xE6,
+ (byte)0xFE, (byte)0x7E, (byte)0x9D, (byte)0xA4,
+ (byte)0x97, (byte)0x68, (byte)0x8E, (byte)0xEC,
+ (byte)0x94, (byte)0xBD, (byte)0x94, (byte)0x5B,
+ (byte)0x9C, (byte)0xF6, (byte)0xFA, (byte)0xA7,
+ (byte)0x9B, (byte)0xD9, (byte)0xFA, (byte)0x5D,
+ (byte)0x96, (byte)0x56, (byte)0x97, (byte)0x62,
+ (byte)0x94, (byte)0xBA, (byte)0xA0, (byte)0x4F,
+ (byte)0x92, (byte)0xD8, (byte)0x9B, (byte)0xCB,
+ (byte)0x94, (byte)0xBB, (byte)0x9D, (byte)0x5F,
+ (byte)0x90, (byte)0xCF, (byte)0x94, (byte)0x65,
+ (byte)0x9F, (byte)0x4C, (byte)0x90, (byte)0xD8,
+ (byte)0x9E, (byte)0xBE, (byte)0xFB, (byte)0x6D,
+ (byte)0x95, (byte)0xCA, (byte)0x9D, (byte)0xC2,
+ (byte)0x97, (byte)0xF8, (byte)0x8F, (byte)0xFC,
+ (byte)0x94, (byte)0x73, (byte)0x94, (byte)0x74,
+ (byte)0xFE, (byte)0xB7, (byte)0x8A, (byte)0x4B,
+ (byte)0x8A, (byte)0x55, (byte)0x8B, (byte)0x69,
+ (byte)0x8A, (byte)0xDC, (byte)0x8B, (byte)0x76,
+ (byte)0x9B, (byte)0xCE, (byte)0x8A, (byte)0x68,
+ (byte)0xA0, (byte)0xF8, (byte)0x98, (byte)0xDF,
+ (byte)0xFE, (byte)0xB5, (byte)0x9B, (byte)0xCF,
+ (byte)0x96, (byte)0xFB, (byte)0x9B, (byte)0xFB,
+ (byte)0x9E, (byte)0xCE, (byte)0x8E, (byte)0xE5,
+ (byte)0x9E, (byte)0x7B, (byte)0x9B, (byte)0xD2,
+ (byte)0x8A, (byte)0xA5, (byte)0xFE, (byte)0xCE,
+ (byte)0x8A, (byte)0x45, (byte)0x9D, (byte)0xFC,
+ (byte)0xFE, (byte)0xCF, (byte)0x8B, (byte)0xA5,
+ (byte)0x8C, (byte)0x4A, (byte)0x8A, (byte)0xEC,
+ (byte)0xFC, (byte)0xE0, (byte)0x94, (byte)0xAD,
+ (byte)0xFE, (byte)0xD5, (byte)0x94, (byte)0xAC,
+ (byte)0xFC, (byte)0x5A, (byte)0x9B, (byte)0xD6,
+ (byte)0x8A, (byte)0x6F, (byte)0x8B, (byte)0xA9,
+ (byte)0x8E, (byte)0x5F, (byte)0x9D, (byte)0xCB,
+ (byte)0xFC, (byte)0xE7, (byte)0x9B, (byte)0xD7,
+ (byte)0x93, (byte)0xC8, (byte)0x91, (byte)0xF0,
+ (byte)0x8F, (byte)0xE0, (byte)0x9B, (byte)0xDB,
+ (byte)0x90, (byte)0xED, (byte)0x9B, (byte)0xDC,
+ (byte)0xA0, (byte)0xEC, (byte)0x98, (byte)0xFA,
+ (byte)0x9B, (byte)0xE0, (byte)0x93, (byte)0xC7,
+ (byte)0x92, (byte)0x49, (byte)0x96, (byte)0xE1,
+ (byte)0x9B, (byte)0xE2, (byte)0x9B, (byte)0xE4,
+ (byte)0x8F, (byte)0xE1, (byte)0x9B, (byte)0xE5,
+ (byte)0x94, (byte)0xC0, (byte)0x93, (byte)0xC3,
+ (byte)0x93, (byte)0xC5, (byte)0x90, (byte)0x79,
+ (byte)0x97, (byte)0x7B, (byte)0x90, (byte)0x7E,
+ (byte)0xFE, (byte)0xE6, (byte)0xFE, (byte)0x46,
+ (byte)0x9D, (byte)0xB8, (byte)0x92, (byte)0x70,
+ (byte)0x95, (byte)0xA8, (byte)0x8C, (byte)0xB0,
+ (byte)0x94, (byte)0xC8, (byte)0x98, (byte)0xB9,
+ (byte)0x91, (byte)0x40, (byte)0xFC, (byte)0xBE,
+ (byte)0x91, (byte)0x57, (byte)0x8B, (byte)0xB2,
+ (byte)0xFA, (byte)0xDF, (byte)0x9B, (byte)0xE6,
+ (byte)0x96, (byte)0x43, (byte)0x8E, (byte)0x44,
+ (byte)0x9C, (byte)0x4F, (byte)0xFE, (byte)0xF4,
+ (byte)0x9B, (byte)0xE8, (byte)0x93, (byte)0xDC,
+ (byte)0x96, (byte)0x6F, (byte)0x8E, (byte)0x4A,
+ (byte)0x9B, (byte)0xED, (byte)0x92, (byte)0xF6,
+ (byte)0x9D, (byte)0xB9, (byte)0x8E, (byte)0x4E,
+ (byte)0xFB, (byte)0xCF, (byte)0x9E, (byte)0xC2,
+ (byte)0x94, (byte)0xE5, (byte)0x9B, (byte)0xF0,
+ (byte)0x94, (byte)0xE4, (byte)0x95, (byte)0x51,
+ (byte)0x8B, (byte)0xBB, (byte)0x9B, (byte)0xF1,
+ (byte)0x94, (byte)0xF0, (byte)0x8E, (byte)0x64,
+ (byte)0x94, (byte)0xEA, (byte)0x8F, (byte)0x61,
+ (byte)0x9B, (byte)0x64, (byte)0x8E, (byte)0x5B,
+ (byte)0x9B, (byte)0xF2, (byte)0x9F, (byte)0xBE,
+ (byte)0x9D, (byte)0xC9, (byte)0x8E, (byte)0x6C,
+ (byte)0x8F, (byte)0x73, (byte)0x8C, (byte)0xAF,
+ (byte)0x8F, (byte)0x75, (byte)0x8E, (byte)0x71,
+ (byte)0x8E, (byte)0x60, (byte)0x8E, (byte)0x6A,
+ (byte)0x8C, (byte)0x4C, (byte)0x95, (byte)0x52,
+ (byte)0x95, (byte)0x54, (byte)0x8A, (byte)0xD4,
+ (byte)0x9D, (byte)0xBB, (byte)0x95, (byte)0x43,
+ (byte)0x92, (byte)0xFE, (byte)0x94, (byte)0xF2,
+ (byte)0x94, (byte)0xF1, (byte)0xA0, (byte)0xEA,
+ (byte)0x9D, (byte)0xD2, (byte)0xA0, (byte)0xB1,
+ (byte)0x91, (byte)0xF8, (byte)0x94, (byte)0x62,
+ (byte)0x9B, (byte)0xA4, (byte)0x8E, (byte)0xAD,
+ (byte)0x9E, (byte)0xAD, (byte)0x96, (byte)0xD0,
+ (byte)0xFE, (byte)0xEE, (byte)0x8A, (byte)0xB4,
+ (byte)0x97, (byte)0x57, (byte)0x8A, (byte)0x77,
+ (byte)0x9B, (byte)0xF7, (byte)0x8E, (byte)0xB5,
+ (byte)0xA0, (byte)0x6D, (byte)0x8E, (byte)0xB6,
+ (byte)0x97, (byte)0x56, (byte)0x95, (byte)0x40,
+ (byte)0xA0, (byte)0xF3, (byte)0x94, (byte)0xBE,
+ (byte)0x9B, (byte)0xFA, (byte)0xFD, (byte)0xDF,
+ (byte)0x9D, (byte)0xBC, (byte)0x94, (byte)0xFE,
+ (byte)0x8B, (byte)0xDB, (byte)0xA0, (byte)0xFE,
+ (byte)0x8E, (byte)0xC0, (byte)0x9F, (byte)0x47,
+ (byte)0x8B, (byte)0xDE, (byte)0xA0, (byte)0xFB,
+ (byte)0x8E, (byte)0xC3, (byte)0x96, (byte)0x49,
+ (byte)0xFE, (byte)0xC2, (byte)0x95, (byte)0x4C,
+ (byte)0x9B, (byte)0xFD, (byte)0x90, (byte)0xCC,
+ (byte)0x9C, (byte)0x60, (byte)0x95, (byte)0x4B,
+ (byte)0x9B, (byte)0xFE, (byte)0x9C, (byte)0x70,
+ (byte)0x9C, (byte)0x43, (byte)0x9C, (byte)0x47,
+ (byte)0x8E, (byte)0xCC, (byte)0x8E, (byte)0x54,
+ (byte)0x8E, (byte)0xE4, (byte)0x9C, (byte)0x49,
+ (byte)0x8B, (byte)0x5E, (byte)0x95, (byte)0x5E,
+ (byte)0x95, (byte)0x5C, (byte)0x9C, (byte)0x4B,
+ (byte)0x8B, (byte)0xE1, (byte)0x8E, (byte)0xD9,
+ (byte)0x9D, (byte)0xB4, (byte)0x92, (byte)0x5F,
+ (byte)0x9C, (byte)0x4C, (byte)0x8A, (byte)0xA1,
+ (byte)0x8E, (byte)0xDB, (byte)0x9C, (byte)0x56,
+ (byte)0x8A, (byte)0xA2, (byte)0x97, (byte)0x54,
+ (byte)0x9C, (byte)0x5E, (byte)0x9E, (byte)0xD4,
+ (byte)0x95, (byte)0x68, (byte)0xA0, (byte)0xC3,
+ (byte)0x8A, (byte)0xE6, (byte)0xA0, (byte)0xF7,
+ (byte)0x9C, (byte)0x61, (byte)0x9C, (byte)0x5F,
+ (byte)0xFC, (byte)0x4D, (byte)0x9E, (byte)0x5B,
+ (byte)0x9E, (byte)0x69, (byte)0x9C, (byte)0x63,
+ (byte)0xFE, (byte)0xC7, (byte)0xFE, (byte)0xC6,
+ (byte)0x9C, (byte)0x67, (byte)0x9C, (byte)0x69,
+ (byte)0x8B, (byte)0xE2, (byte)0x91, (byte)0x65,
+ (byte)0x9C, (byte)0xE7, (byte)0x8A, (byte)0x54,
+ (byte)0x9C, (byte)0x6C, (byte)0x9C, (byte)0x6E,
+ (byte)0xFE, (byte)0x5D, (byte)0x9C, (byte)0x73,
+ (byte)0x95, (byte)0x6A, (byte)0x95, (byte)0x6D,
+ (byte)0x8E, (byte)0xF0, (byte)0x8F, (byte)0x4D,
+ (byte)0x8E, (byte)0xF6, (byte)0xFA, (byte)0xBC,
+ (byte)0x8C, (byte)0xD5, (byte)0xFB, (byte)0xDA,
+ (byte)0x8B, (byte)0x4C, (byte)0xFD, (byte)0x75,
+ (byte)0x9B, (byte)0xDD, (byte)0xFA, (byte)0xF5,
+ (byte)0x9C, (byte)0x74, (byte)0x95, (byte)0x45,
+ (byte)0x96, (byte)0xC6, (byte)0x8F, (byte)0x6A,
+ (byte)0x8F, (byte)0x4E, (byte)0x9C, (byte)0x78,
+ (byte)0xFA, (byte)0x55, (byte)0x97, (byte)0xE4,
+ (byte)0x9C, (byte)0x41, (byte)0x92, (byte)0x5C,
+ (byte)0x96, (byte)0xFA, (byte)0xFB, (byte)0x66,
+ (byte)0x8E, (byte)0x65, (byte)0x98, (byte)0x49,
+ (byte)0xFB, (byte)0xA8, (byte)0x98, (byte)0x42,
+ (byte)0x9C, (byte)0x7A, (byte)0x97, (byte)0xFB,
+ (byte)0x90, (byte)0xCA, (byte)0x9C, (byte)0x5B,
+ (byte)0x97, (byte)0x4D, (byte)0x8E, (byte)0xD3,
+ (byte)0x95, (byte)0x61, (byte)0x9F, (byte)0x4B,
+ (byte)0x9F, (byte)0xB5, (byte)0x93, (byte)0xD2,
+ (byte)0xFD, (byte)0xAA, (byte)0x98, (byte)0x40,
+ (byte)0x91, (byte)0x46, (byte)0x98, (byte)0x67,
+ (byte)0xFA, (byte)0x5A, (byte)0xFB, (byte)0xA9,
+ (byte)0x98, (byte)0x41, (byte)0x8C, (byte)0xD3,
+ (byte)0xFC, (byte)0xFD, (byte)0xFD, (byte)0xAB,
+ (byte)0x91, (byte)0xBD, (byte)0x8F, (byte)0x4C,
+ (byte)0x96, (byte)0xC9, (byte)0x8F, (byte)0x55,
+ (byte)0xFB, (byte)0xAE, (byte)0x95, (byte)0x6F,
+ (byte)0x9C, (byte)0x7D, (byte)0xA0, (byte)0xF0,
+ (byte)0x94, (byte)0x6F, (byte)0xFD, (byte)0xAC,
+ (byte)0x96, (byte)0xCB, (byte)0x96, (byte)0xCE,
+ (byte)0xA0, (byte)0x56, (byte)0x9C, (byte)0xE1,
+ (byte)0x96, (byte)0xC4, (byte)0x8F, (byte)0x5E,
+ (byte)0x8F, (byte)0x6C, (byte)0x8E, (byte)0xA3,
+ (byte)0xFB, (byte)0xB3, (byte)0xFC, (byte)0x53,
+ (byte)0xFD, (byte)0xB3, (byte)0x8F, (byte)0x6B,
+ (byte)0x96, (byte)0xCA, (byte)0x8F, (byte)0x79,
+ (byte)0x9E, (byte)0x6F, (byte)0xA0, (byte)0xC5,
+ (byte)0xFC, (byte)0x78, (byte)0x8E, (byte)0x42,
+ (byte)0x8F, (byte)0x5A, (byte)0x90, (byte)0xC2,
+ (byte)0x8E, (byte)0xA5, (byte)0x90, (byte)0x61,
+ (byte)0x92, (byte)0x4F, (byte)0x93, (byte)0x73,
+ (byte)0xFD, (byte)0xB5, (byte)0xFE, (byte)0xCC,
+ (byte)0xFB, (byte)0xBD, (byte)0x8C, (byte)0xD6,
+ (byte)0x98, (byte)0x43, (byte)0x96, (byte)0xC5,
+ (byte)0x89, (byte)0xBC, (byte)0x9C, (byte)0xA3,
+ (byte)0x92, (byte)0x4B, (byte)0x98, (byte)0x4A,
+ (byte)0x8F, (byte)0xA4, (byte)0xA0, (byte)0xF1,
+ (byte)0x9E, (byte)0xFB, (byte)0x9C, (byte)0xD2,
+ (byte)0x8F, (byte)0xA7, (byte)0xFC, (byte)0x5C,
+ (byte)0x98, (byte)0x45, (byte)0x90, (byte)0x46,
+ (byte)0x8C, (byte)0xD1, (byte)0xFE, (byte)0xFA,
+ (byte)0x95, (byte)0x60, (byte)0x9F, (byte)0x48,
+ (byte)0x92, (byte)0x47, (byte)0x90, (byte)0xFB,
+ (byte)0x9C, (byte)0xA4, (byte)0x95, (byte)0x71,
+ (byte)0x9C, (byte)0xA6, (byte)0x9C, (byte)0xA7,
+ (byte)0x9C, (byte)0xAA, (byte)0x9E, (byte)0xD3,
+ (byte)0x9E, (byte)0x70, (byte)0x9C, (byte)0xAC,
+ (byte)0x8F, (byte)0xAE, (byte)0x95, (byte)0x7D,
+ (byte)0x9C, (byte)0xB0, (byte)0x97, (byte)0xB6,
+ (byte)0xA0, (byte)0xBD, (byte)0x8A, (byte)0xDF,
+ (byte)0x9E, (byte)0xAA, (byte)0x8F, (byte)0xBD,
+ (byte)0x8F, (byte)0xBF, (byte)0x93, (byte)0x69,
+ (byte)0x9B, (byte)0xA7, (byte)0xC8, (byte)0xA4,
+ (byte)0xFE, (byte)0xEA, (byte)0x9B, (byte)0xE1,
+ (byte)0x8B, (byte)0x41, (byte)0x9D, (byte)0xB6,
+ (byte)0xA0, (byte)0xEB, (byte)0x9B, (byte)0xA3,
+ (byte)0x8B, (byte)0xA1, (byte)0x8F, (byte)0xC8,
+ (byte)0x89, (byte)0x4C, (byte)0x98, (byte)0x60,
+ (byte)0x94, (byte)0xC7, (byte)0x8B, (byte)0x58,
+ (byte)0x95, (byte)0xAB, (byte)0x95, (byte)0xAA,
+ (byte)0x9C, (byte)0xC3, (byte)0x9C, (byte)0xC4,
+ (byte)0x93, (byte)0xD6, (byte)0x9D, (byte)0xAC,
+ (byte)0x8B, (byte)0xE6, (byte)0x8A, (byte)0x71,
+ (byte)0x8F, (byte)0xD1, (byte)0x99, (byte)0xD5,
+ (byte)0x90, (byte)0xF4, (byte)0x8A, (byte)0xA3,
+ (byte)0x9C, (byte)0xCE, (byte)0x9C, (byte)0xD4,
+ (byte)0x9C, (byte)0xD5, (byte)0xFB, (byte)0xC8,
+ (byte)0x9D, (byte)0xB3, (byte)0xFC, (byte)0x70,
+ (byte)0x8F, (byte)0xD7, (byte)0x9B, (byte)0x73,
+ (byte)0xFA, (byte)0x5B, (byte)0x8F, (byte)0xD2,
+ (byte)0x90, (byte)0x64, (byte)0x98, (byte)0xB6,
+ (byte)0x96, (byte)0x68, (byte)0x9C, (byte)0xD6,
+ (byte)0x98, (byte)0xBD, (byte)0x8F, (byte)0xDC,
+ (byte)0xFE, (byte)0xF6, (byte)0x8F, (byte)0xD9,
+ (byte)0x95, (byte)0x41, (byte)0x97, (byte)0xF3,
+ (byte)0x9B, (byte)0xF8, (byte)0x9E, (byte)0x6C,
+ (byte)0x8F, (byte)0xF2, (byte)0x8F, (byte)0xEE,
+ (byte)0x9C, (byte)0xD7, (byte)0x9E, (byte)0x6E,
+ (byte)0x8A, (byte)0x40, (byte)0x8F, (byte)0xEF,
+ (byte)0x8F, (byte)0xF4, (byte)0x8F, (byte)0xF5,
+ (byte)0x95, (byte)0xC2, (byte)0x98, (byte)0x6A,
+ (byte)0x97, (byte)0xCF, (byte)0x9E, (byte)0x7C,
+ (byte)0x90, (byte)0x41, (byte)0x9C, (byte)0xDB,
+ (byte)0x94, (byte)0x41, (byte)0x9C, (byte)0xE6,
+ (byte)0x9D, (byte)0xB0, (byte)0x9C, (byte)0xEA,
+ (byte)0x9C, (byte)0xED, (byte)0x9C, (byte)0xFA,
+ (byte)0x8B, (byte)0x62, (byte)0x8A, (byte)0x4E,
+ (byte)0x9C, (byte)0xCA, (byte)0x8A, (byte)0x66,
+ (byte)0x9C, (byte)0xFB, (byte)0x9C, (byte)0xFC,
+ (byte)0x9C, (byte)0xFE, (byte)0x8A, (byte)0x53,
+ (byte)0x9C, (byte)0xE5, (byte)0x9D, (byte)0x40,
+ (byte)0x9D, (byte)0x41, (byte)0x90, (byte)0x45,
+ (byte)0x8B, (byte)0x73, (byte)0x97, (byte)0xCA,
+ (byte)0x9D, (byte)0x42, (byte)0x8A, (byte)0x61,
+ (byte)0x8B, (byte)0xAE, (byte)0x8A, (byte)0xD2,
+ (byte)0x8B, (byte)0xA2, (byte)0x9D, (byte)0xF2,
+ (byte)0x9D, (byte)0x43, (byte)0x9C, (byte)0xDF,
+ (byte)0x9D, (byte)0x44, (byte)0x8E, (byte)0xCA,
+ (byte)0x90, (byte)0x4E, (byte)0x8E, (byte)0xB3,
+ (byte)0x9F, (byte)0xF5, (byte)0x9D, (byte)0x45,
+ (byte)0x90, (byte)0x4F, (byte)0x9D, (byte)0x47,
+ (byte)0x89, (byte)0xCA, (byte)0x9C, (byte)0xB5,
+ (byte)0xFB, (byte)0xFE, (byte)0x90, (byte)0x5E,
+ (byte)0x90, (byte)0x63, (byte)0x90, (byte)0x57,
+ (byte)0x90, (byte)0x66, (byte)0x9B, (byte)0xC0,
+ (byte)0xFC, (byte)0xE5, (byte)0x91, (byte)0x62,
+ (byte)0x90, (byte)0x67, (byte)0x8F, (byte)0xA1,
+ (byte)0x8F, (byte)0xA2, (byte)0x9D, (byte)0x48,
+ (byte)0xFA, (byte)0xD3, (byte)0x90, (byte)0x5D,
+ (byte)0x90, (byte)0xB9, (byte)0x90, (byte)0x6B,
+ (byte)0x8C, (byte)0x5C, (byte)0x90, (byte)0x69,
+ (byte)0xFE, (byte)0x57, (byte)0xFE, (byte)0x55,
+ (byte)0x90, (byte)0x73, (byte)0x9B, (byte)0xEF,
+ (byte)0x9C, (byte)0xF0, (byte)0x9D, (byte)0x4B,
+ (byte)0xFE, (byte)0xD9, (byte)0xFE, (byte)0xDA,
+ (byte)0x91, (byte)0xE0, (byte)0x91, (byte)0xD8,
+ (byte)0x96, (byte)0x46, (byte)0x93, (byte)0x60,
+ (byte)0xFA, (byte)0x53, (byte)0x9C, (byte)0xD3,
+ (byte)0x9D, (byte)0x4E, (byte)0xFB, (byte)0x40,
+ (byte)0x8D, (byte)0xE2, (byte)0x94, (byte)0x42,
+ (byte)0x90, (byte)0x56, (byte)0x98, (byte)0x65,
+ (byte)0x8C, (byte)0x6C, (byte)0xFA, (byte)0x4A,
+ (byte)0x9D, (byte)0x50, (byte)0x9D, (byte)0x52,
+ (byte)0x95, (byte)0xAF, (byte)0x97, (byte)0x5A,
+ (byte)0x93, (byte)0x49, (byte)0x97, (byte)0x47,
+ (byte)0xA0, (byte)0xF4, (byte)0x97, (byte)0x78,
+ (byte)0x8F, (byte)0xCF, (byte)0xFC, (byte)0x60,
+ (byte)0x8C, (byte)0x4E, (byte)0xFC, (byte)0x56,
+ (byte)0x91, (byte)0xDC, (byte)0x96, (byte)0x61,
+ (byte)0x92, (byte)0xEC, (byte)0x93, (byte)0x5D,
+ (byte)0x8E, (byte)0xDE, (byte)0x96, (byte)0xFE,
+ (byte)0xFD, (byte)0x4F, (byte)0x95, (byte)0xDE,
+ (byte)0x98, (byte)0xB0, (byte)0xA0, (byte)0x40,
+ (byte)0x97, (byte)0xBD, (byte)0x97, (byte)0x7D,
+ (byte)0x97, (byte)0xF5, (byte)0x9B, (byte)0xAC,
+ (byte)0xFA, (byte)0xDA, (byte)0x92, (byte)0xC2,
+ (byte)0x97, (byte)0xB1, (byte)0x90, (byte)0x7B,
+ (byte)0x93, (byte)0xFE, (byte)0x94, (byte)0x7B,
+ (byte)0x97, (byte)0x77, (byte)0xFA, (byte)0xBE,
+ (byte)0xFD, (byte)0x43, (byte)0x90, (byte)0xC6,
+ (byte)0x90, (byte)0xA4, (byte)0x90, (byte)0xA8,
+ (byte)0x94, (byte)0xA9, (byte)0x90, (byte)0xA9,
+ (byte)0x8C, (byte)0x65, (byte)0x95, (byte)0xE0,
+ (byte)0x90, (byte)0x7D, (byte)0x92, (byte)0x65,
+ (byte)0xFD, (byte)0xBA, (byte)0x93, (byte)0xC4,
+ (byte)0xFE, (byte)0xED, (byte)0x9D, (byte)0xAB,
+ (byte)0xA0, (byte)0xE3, (byte)0x96, (byte)0x48,
+ (byte)0x9D, (byte)0x53, (byte)0x8A, (byte)0xA9,
+ (byte)0x9B, (byte)0xC5, (byte)0x96, (byte)0x5D,
+ (byte)0x97, (byte)0x5F, (byte)0x96, (byte)0x5F,
+ (byte)0x96, (byte)0x6E, (byte)0xFB, (byte)0x5D,
+ (byte)0x9D, (byte)0xB1, (byte)0xFE, (byte)0xA3,
+ (byte)0x9D, (byte)0xB2, (byte)0x95, (byte)0xAE,
+ (byte)0xFC, (byte)0xA3, (byte)0xA0, (byte)0xA2,
+ (byte)0x96, (byte)0x55, (byte)0x9D, (byte)0x54,
+ (byte)0x93, (byte)0x41, (byte)0x95, (byte)0xAD,
+ (byte)0x91, (byte)0xD5, (byte)0x97, (byte)0x7A,
+ (byte)0xFD, (byte)0xFC, (byte)0x8E, (byte)0x47,
+ (byte)0x93, (byte)0xFD, (byte)0x90, (byte)0xA5,
+ (byte)0x90, (byte)0xAC, (byte)0x95, (byte)0xAC,
+ (byte)0x90, (byte)0xAE, (byte)0xFE, (byte)0xA5,
+ (byte)0x9D, (byte)0x56, (byte)0x97, (byte)0xE3,
+ (byte)0x95, (byte)0xE2, (byte)0x94, (byte)0x66,
+ (byte)0x96, (byte)0x47, (byte)0x91, (byte)0xB8,
+ (byte)0x9C, (byte)0xEC, (byte)0x90, (byte)0xAD,
+ (byte)0x95, (byte)0xE3, (byte)0x8B, (byte)0x4F,
+ (byte)0x8A, (byte)0xE3, (byte)0x8B, (byte)0x4D,
+ (byte)0x95, (byte)0xEA, (byte)0x8B, (byte)0x4E,
+ (byte)0x8C, (byte)0xC1, (byte)0x8B, (byte)0xED,
+ (byte)0x91, (byte)0xD9, (byte)0xA0, (byte)0xA4,
+ (byte)0x95, (byte)0xF5, (byte)0x95, (byte)0xF4,
+ (byte)0x9F, (byte)0xB3, (byte)0xFE, (byte)0xAF,
+ (byte)0xFE, (byte)0x72, (byte)0x92, (byte)0x7A,
+ (byte)0xFE, (byte)0xAC, (byte)0x95, (byte)0xF3,
+ (byte)0x9D, (byte)0x58, (byte)0x93, (byte)0x72,
+ (byte)0x91, (byte)0xC5, (byte)0x96, (byte)0x42,
+ (byte)0x90, (byte)0xCD, (byte)0x95, (byte)0xFE,
+ (byte)0x91, (byte)0x59, (byte)0x9C, (byte)0x65,
+ (byte)0x97, (byte)0xCC, (byte)0x90, (byte)0xCE,
+ (byte)0x9D, (byte)0x59, (byte)0xFC, (byte)0xF5,
+ (byte)0xFE, (byte)0xFD, (byte)0x9D, (byte)0x5B,
+ (byte)0x9D, (byte)0x5C, (byte)0x93, (byte)0x7E,
+ (byte)0x98, (byte)0xAC, (byte)0x9D, (byte)0x5E,
+ (byte)0xFD, (byte)0xD0, (byte)0xFD, (byte)0x60,
+ (byte)0x9C, (byte)0xCF, (byte)0x90, (byte)0xDD,
+ (byte)0x90, (byte)0xE0, (byte)0x90, (byte)0xF3,
+ (byte)0x98, (byte)0xB1, (byte)0x90, (byte)0xF0,
+ (byte)0x93, (byte)0xBD, (byte)0x95, (byte)0xB7,
+ (byte)0x9F, (byte)0x46, (byte)0x8E, (byte)0x4B,
+ (byte)0x96, (byte)0x58, (byte)0x8A, (byte)0x4C,
+ (byte)0x9D, (byte)0x63, (byte)0x9E, (byte)0xCF,
+ (byte)0x9D, (byte)0x65, (byte)0x9D, (byte)0x66,
+ (byte)0x96, (byte)0x5A, (byte)0x9D, (byte)0x64,
+ (byte)0x8A, (byte)0x6C, (byte)0x8A, (byte)0xD9,
+ (byte)0x9D, (byte)0x67, (byte)0x8A, (byte)0x70,
+ (byte)0x8B, (byte)0xF3, (byte)0x91, (byte)0x50,
+ (byte)0x9C, (byte)0xC1, (byte)0x9D, (byte)0x68,
+ (byte)0x93, (byte)0xA7, (byte)0x96, (byte)0x74,
+ (byte)0xA0, (byte)0xEF, (byte)0x91, (byte)0x51,
+ (byte)0x96, (byte)0xC1, (byte)0x8C, (byte)0x64,
+ (byte)0x96, (byte)0x76, (byte)0x9D, (byte)0x69,
+ (byte)0xFC, (byte)0xA4, (byte)0x9D, (byte)0x6A,
+ (byte)0x92, (byte)0x4E, (byte)0x9D, (byte)0x6B,
+ (byte)0x9B, (byte)0xC1, (byte)0x9D, (byte)0x6C,
+ (byte)0x8A, (byte)0x65, (byte)0x91, (byte)0x5D,
+ (byte)0x9D, (byte)0x6D, (byte)0x91, (byte)0x5A,
+ (byte)0x8C, (byte)0x42, (byte)0x9C, (byte)0xC0,
+ (byte)0x91, (byte)0x6A, (byte)0x9D, (byte)0x6E,
+ (byte)0x9E, (byte)0xA6, (byte)0x9D, (byte)0xCD,
+ (byte)0x9D, (byte)0x6F, (byte)0x89, (byte)0xBB,
+ (byte)0x9E, (byte)0xF9, (byte)0x96, (byte)0xB4,
+ (byte)0x91, (byte)0x72, (byte)0x9E, (byte)0xC8,
+ (byte)0x8B, (byte)0x55, (byte)0x9D, (byte)0x71,
+ (byte)0x9D, (byte)0x72, (byte)0x9E, (byte)0xCC,
+ (byte)0x91, (byte)0x74, (byte)0x9E, (byte)0xD0,
+ (byte)0x90, (byte)0x5C, (byte)0x8E, (byte)0xD2,
+ (byte)0x91, (byte)0xA8, (byte)0x91, (byte)0x77,
+ (byte)0x96, (byte)0xBF, (byte)0x96, (byte)0xC0,
+ (byte)0x8F, (byte)0xB1, (byte)0x96, (byte)0xB7,
+ (byte)0x8C, (byte)0x55, (byte)0x91, (byte)0x78,
+ (byte)0x89, (byte)0xBE, (byte)0x91, (byte)0x7C,
+ (byte)0xFB, (byte)0x77, (byte)0x91, (byte)0x75,
+ (byte)0x91, (byte)0xA3, (byte)0x91, (byte)0x76,
+ (byte)0x96, (byte)0xBE, (byte)0x91, (byte)0x79,
+ (byte)0x96, (byte)0xB6, (byte)0x91, (byte)0xA4,
+ (byte)0x91, (byte)0xA6, (byte)0x9D, (byte)0x75,
+ (byte)0x90, (byte)0x52, (byte)0xA0, (byte)0x45,
+ (byte)0x91, (byte)0xA9, (byte)0x98, (byte)0xAA,
+ (byte)0x8C, (byte)0x5F, (byte)0x8B, (byte)0xAA,
+ (byte)0x9C, (byte)0xDD, (byte)0x9D, (byte)0x77,
+ (byte)0x89, (byte)0x40, (byte)0x9E, (byte)0xEC,
+ (byte)0x93, (byte)0xAA, (byte)0x94, (byte)0x78,
+ (byte)0x9D, (byte)0x7A, (byte)0x8A, (byte)0xC9,
+ (byte)0x8B, (byte)0x4B, (byte)0x9F, (byte)0xEC,
+ (byte)0x8A, (byte)0xE2, (byte)0x9E, (byte)0x75,
+ (byte)0x98, (byte)0x74, (byte)0x9A, (byte)0xC8,
+ (byte)0xA0, (byte)0x47, (byte)0x8B, (byte)0xC3,
+ (byte)0xFC, (byte)0x48, (byte)0xFC, (byte)0x77,
+ (byte)0x9C, (byte)0x52, (byte)0x8E, (byte)0xFD,
+ (byte)0x8F, (byte)0xA8, (byte)0x95, (byte)0x7A,
+ (byte)0x8F, (byte)0xF0 };
+
+
+ /*
+ * Tests the roundtrip integrity and expected encoding
+ * correctness for a String containing the 1651 surrogate
+ * pairs equivalent to 1651 supplementary characters whose
+ * mappings are covered by HKSCS (2001)
+ */
+
+ public static void main(String[] args) throws Exception {
+ char[] surrogatePair = new char[2];
+
+ for (int i=0, j=0 ; j < expectBytes.length ; i++, j+=2) {
+ surrogatePair[0] = (char) ((suppValues[i] - 0x10000) / 0x400 + 0xd800);
+ surrogatePair[1] = (char) ((suppValues[i] - 0x10000) % 0x400 + 0xdc00);
+ String testStr = new String(surrogatePair);
+ byte[] encodedBytes = testStr.getBytes("Big5-HKSCS");
+
+ if (encodedBytes[0] != expectBytes[j]
+ && encodedBytes[1] != expectBytes[j+1])
+ throw new Exception("HKSCS Surrogate Encoder error");
+
+ String decoded = new String(encodedBytes, "Big5-HKSCS");
+
+ if (!decoded.equals(testStr)) {
+ throw new Exception("HKSCS Decoder error");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test4200310.sh Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,41 @@
+#
+# 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 4200310
+# @summary make sure class files are not duplicated between rt.jar,
+# charsets.jar, and localedata.jar
+# @author Norbert Lindenberg
+# @run shell Test4200310.sh
+
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/rt.jar" > class-list
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/charsets.jar" >> class-list
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/ext/localedata.jar" >> class-list
+duplicates=`grep '\.class$' class-list | sort | uniq -d`
+
+rm -f class-list
+if [ "$duplicates" != "" ]; then
+ echo FAILED: $duplicates are duplicated between rt.jar, charsets.jar, and localedata.jar
+ exit 1
+fi
+
+exit 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test4206507.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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 4206507
+ @summary verify that we can obtain and use a converter for encoding
+ ISO8859-9 in the Turkish locale.
+ */
+
+import java.util.Locale;
+import java.io.UnsupportedEncodingException;
+
+public class Test4206507 {
+ public static void main(String[] args) throws UnsupportedEncodingException {
+ Locale.setDefault(new Locale("tr", "TR"));
+ byte[] b = "".getBytes("ISO8859-9");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test6254467.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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 6254467
+ @summary Checks if Charset.forName() accepts legal IANA alias names
+ for charset IBM037.
+ */
+import java.nio.charset.Charset;
+
+public class Test6254467 {
+ public static void main (String[] args) throws Exception {
+ Charset ebcdic = Charset.forName("ebcdic-cp-us");
+ ebcdic = Charset.forName("ebcdic-cp-ca");
+ ebcdic = Charset.forName("ebcdic-cp-wt");
+ ebcdic = Charset.forName("ebcdic-cp-nl");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test6275027.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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 6275027
+ @summary Check if StreamEncoder works correctly when fed with unpaired
+ surrogates.
+ */
+
+import java.io.*;
+public class Test6275027 {
+ public static void main( String arg[] ) throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos);
+ ps.print("\uda00");
+ ps.print("\uda01");
+ ps.close();
+ if (!"??".equals(baos.toString()))
+ throw new Exception("failed");
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test6392804.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+
+/*
+ @bug 6392804
+ @summary Decoder fails to detect decoding error
+*/
+import java.nio.*;
+import java.nio.charset.*;
+
+public class Test6392804 {
+ public static void main(String[] args) throws Throwable {
+ test("ISO-2022-JP",
+ new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+ test("ISO-2022-JP-2",
+ new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+ test("x-windows-50220",
+ new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+ test("x-windows-50221",
+ new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+ test("x-windows-iso2022jp",
+ new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+ test("EUC_TW",
+ new byte[] {(byte)0x8e, (byte)0xa8, (byte)0xad, (byte)0xe5});
+ //out of range second byte
+ test("EUC_TW",
+ new byte[] {(byte)0x8e, (byte)0x92, (byte)0xa1, (byte)0xa1});
+ test("EUC_TW",
+ new byte[] {(byte)0x8e, (byte)0x98, (byte)0xa1, (byte)0xa1});
+ }
+
+ static void test(String csn, byte[] bytes) throws Throwable {
+ CharsetDecoder dec = Charset.forName(csn).newDecoder();
+ CharBuffer cb = CharBuffer.allocate(1024);
+ CoderResult cr = dec.decode(ByteBuffer.wrap(bytes), cb, true);
+ if (cr.isUnderflow())
+ throw new RuntimeException(csn + " failed cr=" + cr);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestCompoundTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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 6427981
+ * @summary Check the Compound_Text's canonical name and its aliases
+ */
+
+import java.nio.charset.*;
+import java.util.Set;
+
+public class TestCompoundTest {
+
+ public static void main(String args[]) throws Exception
+ {
+ if (System.getProperty("os.name").startsWith("Windows"))
+ return;
+ Charset cs = Charset.forName("COMPOUND_TEXT");
+ if (!cs.name().startsWith("x-"))
+ throw new RuntimeException("FAILED: name does not start with x-");
+ Set<String> aliases = cs.aliases();
+ if (!aliases.contains("COMPOUND_TEXT") ||
+ !aliases.contains("x-compound-text") ||
+ !aliases.contains("x11-compound_text"))
+ throw new RuntimeException("FAILED: alias name is missing");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,92 @@
+/*
+ * 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 4122961
+ @summary Verify that converters don't drop characters on buffer boundaries
+
+ This is a slightly modified version of the attachment supplied with the
+ bug report.
+ */
+import java.io.*;
+
+public class TestConverterDroppedCharacters {
+ public static void main(String args[])
+ throws java.io.IOException, java.io.UnsupportedEncodingException,
+ java.io.FileNotFoundException
+ {
+ /* Try misc. encodings, many are broken. */
+ tryEncoding("Big5");
+ tryEncoding("CNS11643");
+ tryEncoding("Cp1006");
+ tryEncoding("Cp1381");
+ tryEncoding("Cp33722");
+ tryEncoding("GB2312");
+ tryEncoding("KSC5601");
+ tryEncoding("SJIS");
+ tryEncoding("UTF8");
+ }
+
+ static void tryEncoding(String encoding)
+ throws java.io.IOException, java.io.UnsupportedEncodingException,
+ java.io.FileNotFoundException
+ {
+ String filename = "OUTPUT";
+ int goesBadAfter = 8193;
+ int i;
+ char data[] = new char[goesBadAfter+1];
+
+ System.out.println("Testing " + encoding);
+
+ /* Create some data */
+ for(i = 0; i < goesBadAfter; i++) {
+ data[i] = (char)((i % 0x7f) + 1);
+ }
+
+ /* Write the data out to a file. */
+ FileOutputStream fout = new FileOutputStream(filename);
+ OutputStreamWriter ow = new OutputStreamWriter(fout, encoding);
+ BufferedWriter fd = new BufferedWriter(ow);
+ fd.write(data,0,goesBadAfter);
+ fd.close();
+
+ /* Now read it back with the same encoding. */
+ char buf[] = new char[goesBadAfter+1];
+ FileInputStream fin = new FileInputStream("OUTPUT");
+ InputStreamReader ir = new InputStreamReader(fin, encoding);
+ ir.read(buf,0,goesBadAfter);
+ ir.close();
+
+ /* And check to see if what we wrote is what we got back. */
+ for(i = 0; i < goesBadAfter; i++) {
+ if (data[i] != buf[i]) {
+ System.out.println("ERROR with encoding " + encoding
+ + ": Data wrong at position " + i + " "
+ + "in: " + (int)data[i] + " "
+ + "out: " + (int)buf[i]);
+ throw new RuntimeException();
+ }
+ }
+ System.out.println("Successfully tested " + encoding);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestCp834_SBCS.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,101 @@
+/*
+ * 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 6379808
+ @summary Check all Cp933 SBCS characters are not supported in Cp834
+ */
+
+import sun.io.*;
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestCp834_SBCS {
+ public static void main(String args[]) throws Exception {
+ // The correctness of 1:1 mapping is Coverted by CoderTest.java
+ // and TestConv.java, we only need to verify that SBCS characters
+ // are not supported by this charset.
+ CharToByteConverter cb834 = CharToByteConverter.getConverter("Cp834");
+ ByteToCharConverter bc834 = ByteToCharConverter.getConverter("Cp834");
+ CharsetEncoder enc834 = Charset.forName("Cp834")
+ .newEncoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE)
+ .onMalformedInput(CodingErrorAction.REPLACE);
+
+ CharsetDecoder dec834 = Charset.forName("Cp834")
+ .newDecoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE)
+ .onMalformedInput(CodingErrorAction.REPLACE);
+
+ CharsetDecoder dec933 = Charset.forName("Cp933")
+ .newDecoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE)
+ .onMalformedInput(CodingErrorAction.REPLACE);
+ byte[] ba = new byte[1];
+ byte[] ba2 = new byte[2];
+ ByteBuffer dbb = ByteBuffer.allocateDirect(10);
+ char[] ca = new char[1];
+ char c;
+ for (int i = 0; i <= 0xff; i++) {
+ if (i != 0xe && i != 0xf) { // no SI/SO
+ ba[0] = (byte)i;
+ CharBuffer cb = dec933.decode(ByteBuffer.wrap(ba));
+ if ((c = cb.get()) != '\ufffd') {
+ // OK, this is a SBCS character in Cp933
+ if (dec834.decode(ByteBuffer.wrap(ba)).get() != '\ufffd')
+ throw new Exception("SBCS is supported in IBM834 decoder");
+
+ if (enc834.canEncode(c))
+ throw new Exception("SBCS can be encoded in IBM834 encoder");
+
+ ca[0] = c;
+ ByteBuffer bb = enc834.encode(CharBuffer.wrap(ca));
+ if (bb.get() != (byte)0xfe || bb.get() != (byte)0xfe)
+ throw new Exception("SBCS is supported in IBM834 encoder");
+
+ boolean isMalformed = false;
+ int ret = 0;
+ bc834.reset();
+ try {
+ ret = bc834.convert(ba, 0, 1, ca, 0, 1);
+ } catch (sun.io.MalformedInputException x) { isMalformed = true; }
+ if (!isMalformed && ret != 0 && ca[0] != '\ufffd') {
+ // three scenarios (1)malformed (2)held as an incomplete
+ // input or (3)return replacement all mean "no sbcs"
+ throw new Exception("SBCS is supported in Cp834 b2c");
+ }
+
+ if (cb834.canConvert(c))
+ throw new Exception("SBCS can be converted in Cp834 c2b ");
+
+ ca[0] = c;
+ if (cb834.convert(ca, 0, 1, ba2, 0, 2) != 2 ||
+ ba2[0] != (byte)0xfe || ba2[1] != (byte)0xfe) {
+ throw new Exception("SBCS is supported in Cp834 c2b");
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestCp93xSISO.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * 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 4429358
+ @summary Remove illegal SI/SO char to byte mappings
+ */
+
+public class TestCp93xSISO {
+ public static void main ( String[] args) throws Exception {
+ int exceptionCount = 0;
+ String[] encName = {"Cp930", "Cp933", "Cp935", "Cp937", "Cp939" };
+
+ String s = "\u000e\u000f" ;
+
+ for ( int i=0; i < encName.length; i++) { // Test 2 converters.
+ try {
+ byte[] encoded = s.getBytes(encName[i]);
+ for (int j=0 ; j<encoded.length; j++) {
+ if (encoded[j] != (byte)0x6f) // Expect to map to 0x6f
+ exceptionCount++;
+ }
+ } catch (Throwable t) {
+ System.err.println("error with converter " + encName[i]);
+ exceptionCount++;
+ }
+ }
+
+ if (exceptionCount > 0)
+ throw new Exception ("bug4429369: Cp93x SI/SO Ch->Byte mappings incorrect");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestIBMBugs.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,146 @@
+/*
+ * 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 6371437 6371422 6371416 6371619 5058184 6371431
+ @summary Check if the problems reported in above bugs have been fixed
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestIBMBugs {
+
+ private static void bug6371437() throws Exception {
+ CharsetEncoder converter = Charset.forName("Cp933").newEncoder();
+ converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+ converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+ CharBuffer in = CharBuffer.wrap(new char[] { (char)4352 });
+ try {
+ ByteBuffer out = converter.encode(in);
+ } catch (CharacterCodingException e) { }
+ }
+
+ private static void bug6371422() throws Exception {
+ String[] charsets = { "Cp949", "Cp949C" };
+ for (int n = 0; n < charsets.length; n++) {
+ String charset = charsets[n];
+ CharsetEncoder converter = Charset.forName(charset).newEncoder();
+ converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+ converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+ int errors = 0;
+ for (int i = 1; i < 0x1ffff; i++) {
+ if (i >= 0x1100 && i <= 0x11f9)
+ continue; //Dont try leading consonant, vowel and trailing
+ //consonant as a single char
+ char[] in = (i < 0x10000
+ ? new char[] { (char)i }
+ : new char[] { (char)(0xd800 + ((i - 0x10000) >> 10)),
+ (char)(0xdc00 + ((i - 0x10000) & 0x3ff)) });
+
+ try {
+ ByteBuffer out = converter.encode(CharBuffer.wrap(in));
+ if (out.remaining() == 0 ||
+ (out.remaining() == 1 && out.get(0) == 0x00)) {
+ errors++;
+ }
+ } catch (CharacterCodingException e) { }
+ }
+ if (errors > 0)
+ throw new Exception("Charset "+charset+": "+errors+" errors");
+ }
+ }
+
+ private static void bug6371416() throws Exception {
+ String[] charsets = { "Cp933", "Cp949", "Cp949C", "Cp970"};
+ for (int n = 0; n < charsets.length; n++) {
+ String charset = charsets[n];
+ CharsetEncoder converter = Charset.forName(charset).newEncoder();
+ converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+ converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+ int errors = 0;
+ for (int i = 0xd800; i < 0xe000; i++) {
+ char[] in = new char[] { (char)i };
+ try {
+ ByteBuffer out = converter.encode(CharBuffer.wrap(in));
+ if (out.remaining() == 0)
+ errors++;
+ } catch (CharacterCodingException e) { }
+ }
+ if (errors > 0)
+ throw new Exception("Charset "+charset+": "+errors+" errors");
+ }
+ }
+
+ private static void bug6371619() throws Exception {
+ String encoding = "Cp964";
+ Charset charset = Charset.forName(encoding);
+ CharsetDecoder converter = charset.newDecoder();
+ converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+ converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+ int errors = 0;
+ for (int b = 0x80; b < 0x100; b++)
+ if (!(b == 0x8e || // 0x8e is a SS2
+ (b >= 0x80 && b <= 0x8d) || (b >= 0x90 && b <= 0x9f))) {
+ ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b });
+ try {
+ CharBuffer out = converter.decode(in);
+ if (out.length() == 0) {
+ errors++;
+ }
+ } catch (CharacterCodingException e) { }
+ }
+ if (errors > 0)
+ throw new Exception("Charset "+charset+": "+errors+" errors");
+ }
+
+
+ private static void bug6371431() throws Exception {
+ String encoding = "Cp33722";
+ Charset charset = Charset.forName(encoding);
+ CharsetDecoder converter = charset.newDecoder();
+ converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+ converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+ int errors = 0;
+ for (int b = 0xa0; b < 0x100; b++) {
+ ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b });
+ try {
+ CharBuffer out = converter.decode(in);
+ if (out.length() == 0) {
+ errors++;
+ }
+ } catch (CharacterCodingException e) { }
+ }
+ if (errors > 0)
+ throw new Exception("Charset "+charset+": "+errors+" errors");
+ }
+
+ public static void main (String[] args) throws Exception {
+ bug6371437();
+ bug6371422();
+ bug6371416();
+ bug6371619();
+ bug6371431();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISCII91.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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 6431650
+ @summary Check charset ISCII91 and C2B/B2CISCII91 yield same encoding/decoding result
+ */
+
+
+import java.nio.*;
+import java.nio.charset.*;
+import sun.io.*;
+
+public class TestISCII91 {
+ public static void main(String[] args) throws Throwable{
+ CharToByteConverter c2b = new CharToByteISCII91();
+ ByteToCharConverter b2c = new ByteToCharISCII91();
+ Charset cs = Charset.forName("ISCII91");
+ String charsToEncode = getCharsForEncoding("ISCII91");
+
+ byte [] c2bBytes = c2b.convertAll(charsToEncode.toCharArray());
+ byte [] csBytes = cs.encode(charsToEncode).array();
+ for (int i = 0; i < c2bBytes.length; ++i) {
+ if (c2bBytes[i] != csBytes[i])
+ throw new RuntimeException("ISCII91 encoding failed!");
+ }
+
+ char[] c2bChars = b2c.convertAll(c2bBytes);
+ char[] csChars = cs.decode(ByteBuffer.wrap(csBytes)).array();
+ for (int i = 0; i < c2bChars.length; ++i) {
+ if (c2bChars[i] != csChars[i])
+ throw new RuntimeException("ISCII91 decoding failed!");
+ }
+ }
+
+
+ static String getCharsForEncoding(String encodingName)
+ throws CharacterCodingException{
+ Charset set = Charset.forName(encodingName);
+ CharBuffer chars = CharBuffer.allocate(300);
+ CharsetEncoder encoder = set.newEncoder();
+ for (int c = 0; chars.remaining() > 0 && c < Character.MAX_VALUE; ++c) {
+ if (Character.isDefined((char) c) && !Character.isISOControl((char) c) && encoder.canEncode((char) c)) {
+ chars.put((char) c);
+ }
+ }
+ chars.limit(chars.position());
+ chars.rewind();
+ return chars.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,440 @@
+/*
+ * 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 4779029 4924625 6392664
+ @summary Test decoding of various permutations of valid ISO-2022-CN byte sequences
+ */
+
+/*
+ * Regression test for NIO ISO-2022-CN decoder. Passes various valid
+ * ISO-2022-CN byte sequences to the decoder using the java.io
+ * InputStreamReader API
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022CNDecoder
+{
+ private static String encodingName = "ISO2022CN";
+
+ //
+ // Positive tests -- test both output and input processing against
+ // various "known good" data
+ //
+ private static boolean decodeTest (
+ byte encoded[],
+ char decoded[],
+ String label)
+ {
+ boolean retval = true;
+ int i = 0;
+
+ try {
+ //
+ // Ensure that reading decodes correctly
+ //
+ ByteArrayInputStream in;
+ InputStreamReader reader;
+
+ in = new ByteArrayInputStream(encoded);
+ reader = new InputStreamReader(in, encodingName);
+
+ for (i = 0; i < decoded.length; i++) {
+ int c = reader.read();
+
+ if (c != decoded[i]) {
+ System.err.print(label + ": read failed, char " + i);
+ System.err.print(" ... expected 0x"
+ + Integer.toHexString(decoded[i]));
+ if (c == -1)
+ System.err.println(", got EOF");
+ else
+ System.err.println(", got 0x"
+ + Integer.toHexString(c));
+ retval = false;
+ if (c == -1)
+ return retval;
+ }
+ }
+
+ int testChar;
+ if ((testChar = reader.read()) != -1) {
+ System.err.println(label + ": read failed, no EOF");
+ System.err.println("testChar is " +
+ Integer.toHexString((int)testChar));
+ return false;
+ }
+ String decodedString = new String(encoded, "ISO2022CN");
+
+ for (i = 0; i < decodedString.length(); i++) {
+ if (decodedString.charAt(i) != decoded[i])
+ System.err.println(label + ": read failed, char " + i);
+ }
+
+ CharsetDecoder dec = Charset.forName("ISO2022CN")
+ .newDecoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE)
+ .onMalformedInput(CodingErrorAction.REPLACE);
+ ByteBuffer bb = ByteBuffer.allocateDirect(encoded.length).put(encoded);
+ bb.flip();
+ CharBuffer cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte())
+ .asCharBuffer();
+ if (bb.hasArray() || cb.hasArray()) {
+ System.err.println(label + ": directBuffer failed, ");
+ return false;
+ }
+ if (!dec.decode(bb, cb, true).isUnderflow()) {
+ System.err.println(label + ": decoder's decode() failed!");
+ return false;
+ }
+ cb.flip();
+ for (i = 0; i < cb.limit(); i++) {
+ if (cb.get() != decoded[i])
+ System.err.println(label + ": decoder failed, char " + i);
+ }
+
+ } catch (Exception e) {
+ System.err.println(label + ": failed "
+ + "(i = " + i + "), "
+ + e.getClass().getName()
+ + ", " + e.getMessage());
+ e.printStackTrace();
+ return false;
+ }
+ return retval;
+ }
+
+ private static boolean equal(CoderResult a, CoderResult b) {
+ return (a == CoderResult.OVERFLOW && b == CoderResult.OVERFLOW) ||
+ (a == CoderResult.UNDERFLOW && b == CoderResult.UNDERFLOW) ||
+ ((a.isError() == b.isError()) &&
+ (a.isMalformed() == b.isMalformed()) &&
+ (a.isUnmappable() == b.isUnmappable()) &&
+ (a.length() == b.length()));
+ }
+
+ private static boolean decodeResultTest (byte encoded[],
+ CoderResult expected,
+ String label) {
+ CharsetDecoder dec = Charset.forName("ISO2022CN").newDecoder();
+ ByteBuffer bb = ByteBuffer.wrap(encoded);
+ CharBuffer cb = CharBuffer.allocate(encoded.length*(int)dec.maxCharsPerByte());
+ CoderResult result = dec.decode(bb, cb, true);
+ if (!equal(result, expected)) {
+ System.err.println(label + ": decoder's decode() failed!");
+ return false;
+ }
+
+ bb = ByteBuffer.allocateDirect(encoded.length).put(encoded);
+ bb.flip();
+ cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte())
+ .asCharBuffer();
+ if (bb.hasArray() || cb.hasArray()) {
+ System.err.println(label + ": directBuffer failed, ");
+ return false;
+ }
+ result = dec.reset().decode(bb, cb, true);
+ if (!equal(result, expected)) {
+ System.err.println(label + ": decoder's decode() - direct failed!");
+ return false;
+ }
+ return true;
+ }
+
+ //
+ // Negative tests -- only for input processing, make sure that
+ // invalid or corrupt characters are rejected.
+ //
+ private static boolean negative (byte encoded [], String label)
+ {
+ try {
+ ByteArrayInputStream in;
+ InputStreamReader reader;
+ int c;
+
+ in = new ByteArrayInputStream(encoded);
+ reader = new InputStreamReader(in, encodingName);
+
+ c = reader.read();
+ System.err.print (label + ": read failed, ");
+
+ if (c == -1)
+ System.err.println("reported EOF");
+ else
+ System.err.println("returned char 0x"
+ + Integer.toHexString(c)
+ + ", expected exception");
+ return false;
+
+ } catch (CharConversionException e) {
+ return true;
+
+ } catch (Throwable t) {
+ System.err.println(label + ": failed, threw "
+ + t.getClass().getName()
+ + ", " + t.getMessage());
+ }
+ return false;
+ }
+
+ private static boolean decodeTest6392664 () {
+ try {
+ CharsetDecoder dec = Charset.forName("ISO-2022-CN-GB").newDecoder();
+ dec.decode(ByteBuffer.wrap(new byte[] {(byte)0x0e, (byte)0x42, (byte)0x43 }));
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ //
+ // TEST #0: 7-bit unshifted values,
+ // shift-in of a valid decodable GB2312-80
+ // character and an unmappable GB2312-80 char
+ // This is a positive test.
+ //
+ private static byte test0_bytes[] = {
+ (byte)0x00,
+ (byte)0x01, (byte)0x02, (byte)0x03,
+ (byte)0x0E, (byte)0x21, (byte)0x2f,
+ (byte)0x0E, (byte)0xDD, (byte)0x9f
+ };
+
+ private static char test0_chars[] = {
+ 0x0000,
+ 0x0001, 0x0002, 0x0003,
+ 0x2019,
+ 0xFFFD
+ };
+
+ private static byte test1_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, (byte)0x21,
+ (byte)0x2f };
+
+ private static char test1_chars[] = {
+ 0x21, 0x2f
+ };
+
+ private static byte test2_bytes[] = {
+ (byte)0x0e,
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+ (byte)0x21, (byte)0x2f };
+
+ private static char test2_chars[] = {
+ 0x2019
+ };
+
+ private static byte test3_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+ (byte)0x0e,
+ (byte)0x21, (byte)0x2f };
+
+ private static byte test3a_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x41,
+ (byte)0x0e,
+ (byte)0x21, (byte)0x2f };
+
+ private static char test3_chars[] = {
+ 0x2019
+ };
+
+ private static byte test4_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+ (byte)0x0f,
+ (byte)0x21, (byte)0x2f };
+
+ private static char test4_chars[] = {
+ 0x21, 0x2f
+ };
+
+ private static byte test5_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+ (byte)0x0e, (byte)0x21, (byte)0x2e,
+ (byte)0x0f, (byte)0x21, (byte)0x2f };
+
+ private static char test5_chars[] = {
+ 0x2018, 0x21, 0x2f
+ };
+
+ private static byte test6_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+ (byte)0x0e, (byte)0x21, (byte)0x2e,
+ (byte)0x21, (byte)0x2f };
+
+ private static char test6_chars[] = {
+ 0x2018, 0x2019
+ };
+
+ private static byte test7_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G',
+ (byte)0x0e, (byte)0x21, (byte)0x2e,
+ (byte)0x21, (byte)0x2f };
+
+ private static char test7_chars[] = {
+ 0xFE50, 0xFE51
+ };
+
+ private static byte test8_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G',
+ (byte)0x0e, (byte)0x21, (byte)0x2e,
+ (byte)0x0f, (byte)0x21, (byte)0x2f };
+
+ private static char test8_chars[] = {
+ 0xFE50, 0x21, 0x2f
+ };
+
+ private static byte test9_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H',
+ (byte)0x1b, (byte)0x4e,
+ (byte)0x21, (byte)0x2f };
+
+ private static char test9_chars[] = {
+ 0x4e0e
+ };
+
+ /*
+ * Plane 3 support provided for compatibility with
+ * sun.io ISO2022_CN decoder. Officially ISO-2022-CN
+ * just handles planes 1/2 of CNS-11643 (1986)
+ * Test case data below verifies this compatibility
+ *
+ */
+
+ private static byte test10_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I',
+ (byte)0x1b, (byte)0x4f,
+ (byte)0x21, (byte)0x2f };
+
+ private static char test10_chars[] = {
+ 0x51e2
+ };
+
+ private static byte test11_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator
+ (byte)0x0e, //SO
+ (byte)0x21, (byte)0x2e, //GB2312 char
+ (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H', //SS2 Designator
+ (byte)0x1b, (byte)0x4e, //SS2
+ (byte)0x21, (byte)0x2f, //CNS-P2 char
+ (byte)0x21, (byte)0x2f //GB2312 char
+ };
+
+ private static char test11_chars[] = {
+ 0x2018,
+ 0x4e0e,
+ 0x2019
+ };
+
+ private static byte test12_bytes[] = {
+ (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator
+ (byte)0x0e, //SO
+ (byte)0x21, (byte)0x2e, //GB2312 char
+ (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I', //SS3 Designator
+ (byte)0x1b, (byte)0x4f, //SS3
+ (byte)0x21, (byte)0x2f, //CNS-P2 char
+ (byte)0x21, (byte)0x2f //GB2312 char
+ };
+
+ private static char test12_chars[] = {
+ 0x2018,
+ 0x51e2,
+ 0x2019
+ };
+
+
+ private static byte test13_bytes[] = {
+ (byte)0x0f0, // byte with MSB
+ };
+
+ private static char test13_chars[] = {
+ 0x00f0,
+ };
+
+ private static byte test14_bytes[] = {
+ (byte)0x0E, (byte)0x21, (byte)0x2f,
+ (byte)0x0E, (byte)0xDD, (byte)0x9f
+ };
+ private static CoderResult test14_result = CoderResult.unmappableForLength(2);
+
+ // Current ISO2022CN treats the "out of range" code points as "unmappable"
+ private static byte test15_bytes[] = {
+ (byte)0x1b, (byte)0x4f, // SS3
+ (byte)0x20, (byte)0x2f, // "out of range" CNS-P2 char
+ };
+ private static CoderResult test15_result = CoderResult.unmappableForLength(4);
+
+ /**
+ * Main program to test ISO2022CN conformance
+ *
+ */
+ public static void main (String argv []) throws Exception
+ {
+ boolean pass = true;
+
+ System.out.println ("");
+ System.out.println ("------ checking ISO2022CN decoder -----");
+
+ // This regtest must be the first one.
+ pass &= decodeTest6392664();
+
+ try {
+ new InputStreamReader (System.in, "ISO2022CN");
+ } catch (Exception e) {
+ encodingName = "ISO2022CN";
+ System.out.println ("... requires nonstandard encoding name "
+ + encodingName);
+ pass &= false;
+ }
+
+ //
+ // Positive tests -- good data is dealt with correctly
+ //
+ pass &= decodeTest(test0_bytes, test0_chars, "first batch");
+ pass &= decodeTest(test1_bytes, test1_chars, "escapes1");
+ pass &= decodeTest(test2_bytes, test2_chars, "escapes2");
+ pass &= decodeTest(test3_bytes, test3_chars, "escapes3");
+ pass &= decodeTest(test3a_bytes, test3_chars, "escapes3a");
+ pass &= decodeTest(test4_bytes, test4_chars, "escapes4");
+ pass &= decodeTest(test5_bytes, test5_chars, "escapes5");
+ pass &= decodeTest(test6_bytes, test6_chars, "escapes6");
+ pass &= decodeTest(test7_bytes, test7_chars, "escapes7");
+ pass &= decodeTest(test8_bytes, test8_chars, "escapes8");
+ pass &= decodeTest(test9_bytes, test9_chars, "escapes9");
+ pass &= decodeTest(test10_bytes, test10_chars, "escapes10");
+ pass &= decodeTest(test11_bytes, test11_chars, "escapes11");
+ pass &= decodeTest(test12_bytes, test12_chars, "escapes12");
+ pass &= decodeTest(test13_bytes, test13_chars, "escapes13");
+ pass &= decodeResultTest(test14_bytes, test14_result, "escapes14");
+ pass &= decodeResultTest(test15_bytes, test15_result, "escapes15");
+ // PASS/FAIL status is what the whole thing is about.
+ //
+ if (! pass) {
+ throw new Exception("FAIL -- incorrect ISO-2022-CN");
+ }
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022JP.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,612 @@
+/*
+ * 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 4626545 4879522 4913711 4119445
+ @summary Check full coverage encode/decode for ISO-2022-JP
+ */
+
+/*
+ * Tests the NIO converter for J2RE >= 1.4.1
+ * since the default converter used by String
+ * API is the NIO converter sun.nio.cs.ext.ISO2022_JP
+ */
+
+import java.io.*;
+public class TestISO2022JP {
+
+ private final static String US_ASCII =
+ "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" +
+ "\b\t\n\u000B\f\r" +
+ "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" +
+ "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" +
+ "\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\u00A5\u203E";
+
+ // Subset of chars sourced from JISX0208:1983
+
+ private final static String JISX0208SUBSET =
+ "u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" +
+ "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" +
+ "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" +
+ "\u4EDD\u3005\u3006\u3007\u30FC\u2014\u2010\uFF0F" +
+ "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" +
+ "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" +
+ "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" +
+ "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" +
+ "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" +
+ "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" +
+ "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" +
+ "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" +
+ "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" +
+ "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" +
+ "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" +
+ "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" +
+ "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" +
+ "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" +
+ "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" +
+ "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" +
+ "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" +
+ "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" +
+ "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" +
+ "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" +
+ "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" +
+ "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" +
+ "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" +
+ "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" +
+ "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" +
+ "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" +
+ "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" +
+ "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" +
+ "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" +
+ "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" +
+ "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" +
+ "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" +
+ "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" +
+ "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" +
+ "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" +
+ "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" +
+ "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" +
+ "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" +
+ "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" +
+ "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" +
+ "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" +
+ "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" +
+ "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" +
+ "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" +
+ "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" +
+ "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" +
+ "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" +
+ "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" +
+ "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" +
+ "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" +
+ "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" +
+ "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" +
+ "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" +
+ "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" +
+ "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" +
+ "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" +
+ "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" +
+ "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" +
+ "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" +
+ "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" +
+ "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" +
+ "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" +
+ "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" +
+ "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" +
+ "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" +
+ "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199";
+
+ final static String JISX0202KATAKANA =
+ "\uFF61\uFF62\uFF63\uFF64" +
+ "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" +
+ "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" +
+ "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" +
+ "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" +
+ "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" +
+ "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" +
+ "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" +
+ "\uFF9D\uFF9E\uFF9F";
+
+
+ final static byte[] expectedBytes1 = {
+ (byte) 0x0, (byte) 0x1, (byte) 0x2, (byte) 0x3,
+ (byte) 0x4, (byte) 0x5, (byte) 0x6, (byte) 0x7,
+ (byte) 0x8, (byte) 0x9, (byte) 0xa, (byte) 0xb,
+ (byte) 0xc, (byte) 0xd,
+ (byte) 0x10, (byte) 0x11, (byte) 0x12, (byte) 0x13,
+ (byte) 0x14, (byte) 0x15, (byte) 0x16, (byte) 0x17,
+ (byte) 0x18, (byte) 0x19, (byte) 0x1a,
+ (byte) 0x1c, (byte) 0x1d, (byte) 0x1e, (byte) 0x1f,
+ (byte) 0x20, (byte) 0x21, (byte) 0x22, (byte) 0x23,
+ (byte) 0x24, (byte) 0x25, (byte) 0x26, (byte) 0x27,
+ (byte) 0x28, (byte) 0x29, (byte) 0x2a, (byte) 0x2b,
+ (byte) 0x2c, (byte) 0x2d, (byte) 0x2e, (byte) 0x2f,
+ (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x33,
+ (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37,
+ (byte) 0x38, (byte) 0x39, (byte) 0x3a, (byte) 0x3b,
+ (byte) 0x3c, (byte) 0x3d, (byte) 0x3e, (byte) 0x3f,
+ (byte) 0x40, (byte) 0x41, (byte) 0x42, (byte) 0x43,
+ (byte) 0x44, (byte) 0x45, (byte) 0x46, (byte) 0x47,
+ (byte) 0x48, (byte) 0x49, (byte) 0x4a, (byte) 0x4b,
+ (byte) 0x4c, (byte) 0x4d, (byte) 0x4e, (byte) 0x4f,
+ (byte) 0x50, (byte) 0x51, (byte) 0x52, (byte) 0x53,
+ (byte) 0x54, (byte) 0x55, (byte) 0x56, (byte) 0x57,
+ (byte) 0x58, (byte) 0x59, (byte) 0x5a, (byte) 0x5b,
+ (byte) 0x5c, (byte) 0x5d, (byte) 0x5e, (byte) 0x5f,
+ (byte) 0x60, (byte) 0x61, (byte) 0x62, (byte) 0x63,
+ (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67,
+ (byte) 0x68, (byte) 0x69, (byte) 0x6a, (byte) 0x6b,
+ (byte) 0x6c, (byte) 0x6d, (byte) 0x6e, (byte) 0x6f,
+ (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73,
+ (byte) 0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77,
+ (byte) 0x78, (byte) 0x79, (byte) 0x7a, (byte) 0x7b,
+ (byte) 0x7c, (byte) 0x7d, (byte) 0x7e, (byte) 0x1b,
+ (byte) 0x28, (byte) 0x4a, (byte) 0x5c, (byte) 0x7e,
+ (byte) 0x1b, (byte) 0x28, (byte) 0x42, (byte) 0x75,
+ (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x30,
+ (byte) 0x1b, (byte) 0x24, (byte) 0x42, (byte) 0x21,
+ (byte) 0x22, (byte) 0x21, (byte) 0x23, (byte) 0x21,
+ (byte) 0x24, (byte) 0x21, (byte) 0x25, (byte) 0x21,
+ (byte) 0x26, (byte) 0x21, (byte) 0x27, (byte) 0x21,
+ (byte) 0x28, (byte) 0x21, (byte) 0x29, (byte) 0x21,
+ (byte) 0x2a, (byte) 0x21, (byte) 0x2b, (byte) 0x21,
+ (byte) 0x2c, (byte) 0x21, (byte) 0x2d, (byte) 0x21,
+ (byte) 0x2e, (byte) 0x21, (byte) 0x2f, (byte) 0x21,
+ (byte) 0x30, (byte) 0x21, (byte) 0x31, (byte) 0x21,
+ (byte) 0x32, (byte) 0x21, (byte) 0x33, (byte) 0x21,
+ (byte) 0x34, (byte) 0x21, (byte) 0x35, (byte) 0x21,
+ (byte) 0x36, (byte) 0x21, (byte) 0x37, (byte) 0x21,
+ (byte) 0x38, (byte) 0x21, (byte) 0x39, (byte) 0x21,
+ (byte) 0x3a, (byte) 0x21, (byte) 0x3b, (byte) 0x21,
+ (byte) 0x3c, (byte) 0x21, (byte) 0x3d, (byte) 0x21,
+ (byte) 0x3e, (byte) 0x21, (byte) 0x3f, (byte) 0x21,
+ (byte) 0x40, (byte) 0x21, (byte) 0x41, (byte) 0x21,
+ (byte) 0x42, (byte) 0x21, (byte) 0x43, (byte) 0x21,
+ (byte) 0x44, (byte) 0x21, (byte) 0x45, (byte) 0x21,
+ (byte) 0x46, (byte) 0x21, (byte) 0x47, (byte) 0x55,
+ (byte) 0x71, (byte) 0x55, (byte) 0x72, (byte) 0x55,
+ (byte) 0x73, (byte) 0x55, (byte) 0x74, (byte) 0x55,
+ (byte) 0x75, (byte) 0x55, (byte) 0x76, (byte) 0x55,
+ (byte) 0x77, (byte) 0x55, (byte) 0x78, (byte) 0x55,
+ (byte) 0x79, (byte) 0x55, (byte) 0x7a, (byte) 0x55,
+ (byte) 0x7b, (byte) 0x55, (byte) 0x7c, (byte) 0x55,
+ (byte) 0x7d, (byte) 0x55, (byte) 0x7e, (byte) 0x56,
+ (byte) 0x21, (byte) 0x56, (byte) 0x22, (byte) 0x56,
+ (byte) 0x23, (byte) 0x56, (byte) 0x24, (byte) 0x56,
+ (byte) 0x25, (byte) 0x56, (byte) 0x26, (byte) 0x56,
+ (byte) 0x27, (byte) 0x56, (byte) 0x28, (byte) 0x56,
+ (byte) 0x29, (byte) 0x56, (byte) 0x2a, (byte) 0x56,
+ (byte) 0x2b, (byte) 0x56, (byte) 0x2c, (byte) 0x56,
+ (byte) 0x2d, (byte) 0x56, (byte) 0x2e, (byte) 0x56,
+ (byte) 0x2f, (byte) 0x56, (byte) 0x30, (byte) 0x56,
+ (byte) 0x31, (byte) 0x56, (byte) 0x32, (byte) 0x56,
+ (byte) 0x33, (byte) 0x56, (byte) 0x34, (byte) 0x56,
+ (byte) 0x35, (byte) 0x56, (byte) 0x36, (byte) 0x56,
+ (byte) 0x37, (byte) 0x56, (byte) 0x38, (byte) 0x56,
+ (byte) 0x39, (byte) 0x56, (byte) 0x3a, (byte) 0x56,
+ (byte) 0x3b, (byte) 0x56, (byte) 0x3c, (byte) 0x56,
+ (byte) 0x3d, (byte) 0x56, (byte) 0x3e, (byte) 0x56,
+ (byte) 0x3f, (byte) 0x56, (byte) 0x40, (byte) 0x56,
+ (byte) 0x41, (byte) 0x56, (byte) 0x42, (byte) 0x56,
+ (byte) 0x43, (byte) 0x56, (byte) 0x44, (byte) 0x56,
+ (byte) 0x45, (byte) 0x56, (byte) 0x46, (byte) 0x56,
+ (byte) 0x47, (byte) 0x56, (byte) 0x48, (byte) 0x56,
+ (byte) 0x49, (byte) 0x56, (byte) 0x4a, (byte) 0x56,
+ (byte) 0x4b, (byte) 0x56, (byte) 0x4c, (byte) 0x56,
+ (byte) 0x4d, (byte) 0x56, (byte) 0x4e, (byte) 0x56,
+ (byte) 0x4f, (byte) 0x56, (byte) 0x50, (byte) 0x56,
+ (byte) 0x51, (byte) 0x56, (byte) 0x52, (byte) 0x56,
+ (byte) 0x53, (byte) 0x56, (byte) 0x54, (byte) 0x56,
+ (byte) 0x55, (byte) 0x56, (byte) 0x56, (byte) 0x56,
+ (byte) 0x57, (byte) 0x56, (byte) 0x58, (byte) 0x56,
+ (byte) 0x59, (byte) 0x56, (byte) 0x5a, (byte) 0x56,
+ (byte) 0x5b, (byte) 0x56, (byte) 0x5c, (byte) 0x56,
+ (byte) 0x5d, (byte) 0x56, (byte) 0x5e, (byte) 0x56,
+ (byte) 0x5f, (byte) 0x56, (byte) 0x60, (byte) 0x56,
+ (byte) 0x61, (byte) 0x56, (byte) 0x62, (byte) 0x56,
+ (byte) 0x63, (byte) 0x56, (byte) 0x64, (byte) 0x56,
+ (byte) 0x65, (byte) 0x56, (byte) 0x66, (byte) 0x56,
+ (byte) 0x67, (byte) 0x56, (byte) 0x68, (byte) 0x56,
+ (byte) 0x69, (byte) 0x56, (byte) 0x6a, (byte) 0x56,
+ (byte) 0x6b, (byte) 0x56, (byte) 0x6c, (byte) 0x56,
+ (byte) 0x6d, (byte) 0x56, (byte) 0x6e, (byte) 0x56,
+ (byte) 0x6f, (byte) 0x56, (byte) 0x70, (byte) 0x56,
+ (byte) 0x71, (byte) 0x56, (byte) 0x72, (byte) 0x56,
+ (byte) 0x73, (byte) 0x56, (byte) 0x74, (byte) 0x56,
+ (byte) 0x75, (byte) 0x56, (byte) 0x76, (byte) 0x56,
+ (byte) 0x77, (byte) 0x56, (byte) 0x78, (byte) 0x56,
+ (byte) 0x79, (byte) 0x56, (byte) 0x7a, (byte) 0x56,
+ (byte) 0x7b, (byte) 0x56, (byte) 0x7c, (byte) 0x56,
+ (byte) 0x7d, (byte) 0x56, (byte) 0x7e, (byte) 0x57,
+ (byte) 0x21, (byte) 0x57, (byte) 0x22, (byte) 0x57,
+ (byte) 0x23, (byte) 0x57, (byte) 0x24, (byte) 0x57,
+ (byte) 0x25, (byte) 0x57, (byte) 0x26, (byte) 0x57,
+ (byte) 0x27, (byte) 0x57, (byte) 0x28, (byte) 0x57,
+ (byte) 0x29, (byte) 0x57, (byte) 0x2a, (byte) 0x57,
+ (byte) 0x2b, (byte) 0x57, (byte) 0x2c, (byte) 0x57,
+ (byte) 0x2d, (byte) 0x57, (byte) 0x2e, (byte) 0x57,
+ (byte) 0x2f, (byte) 0x57, (byte) 0x30, (byte) 0x57,
+ (byte) 0x31, (byte) 0x57, (byte) 0x32, (byte) 0x57,
+ (byte) 0x33, (byte) 0x57, (byte) 0x34, (byte) 0x57,
+ (byte) 0x35, (byte) 0x57, (byte) 0x36, (byte) 0x57,
+ (byte) 0x37, (byte) 0x57, (byte) 0x38, (byte) 0x57,
+ (byte) 0x39, (byte) 0x57, (byte) 0x3a, (byte) 0x57,
+ (byte) 0x3b, (byte) 0x57, (byte) 0x3c, (byte) 0x57,
+ (byte) 0x3d, (byte) 0x57, (byte) 0x3e, (byte) 0x57,
+ (byte) 0x3f, (byte) 0x57, (byte) 0x40, (byte) 0x57,
+ (byte) 0x41, (byte) 0x57, (byte) 0x42, (byte) 0x57,
+ (byte) 0x43, (byte) 0x57, (byte) 0x44, (byte) 0x57,
+ (byte) 0x45, (byte) 0x57, (byte) 0x46, (byte) 0x57,
+ (byte) 0x47, (byte) 0x57, (byte) 0x48, (byte) 0x57,
+ (byte) 0x49, (byte) 0x57, (byte) 0x4a, (byte) 0x57,
+ (byte) 0x4b, (byte) 0x57, (byte) 0x4c, (byte) 0x57,
+ (byte) 0x4d, (byte) 0x57, (byte) 0x4e, (byte) 0x57,
+ (byte) 0x4f, (byte) 0x57, (byte) 0x50, (byte) 0x57,
+ (byte) 0x51, (byte) 0x57, (byte) 0x52, (byte) 0x57,
+ (byte) 0x53, (byte) 0x57, (byte) 0x54, (byte) 0x57,
+ (byte) 0x55, (byte) 0x57, (byte) 0x56, (byte) 0x57,
+ (byte) 0x57, (byte) 0x57, (byte) 0x58, (byte) 0x57,
+ (byte) 0x59, (byte) 0x57, (byte) 0x5a, (byte) 0x57,
+ (byte) 0x5b, (byte) 0x57, (byte) 0x5c, (byte) 0x57,
+ (byte) 0x5d, (byte) 0x57, (byte) 0x5e, (byte) 0x57,
+ (byte) 0x5f, (byte) 0x57, (byte) 0x60, (byte) 0x57,
+ (byte) 0x61, (byte) 0x57, (byte) 0x62, (byte) 0x57,
+ (byte) 0x63, (byte) 0x57, (byte) 0x64, (byte) 0x59,
+ (byte) 0x49, (byte) 0x59, (byte) 0x4a, (byte) 0x59,
+ (byte) 0x4b, (byte) 0x59, (byte) 0x4c, (byte) 0x59,
+ (byte) 0x4d, (byte) 0x59, (byte) 0x4e, (byte) 0x59,
+ (byte) 0x4f, (byte) 0x59, (byte) 0x50, (byte) 0x59,
+ (byte) 0x51, (byte) 0x59, (byte) 0x52, (byte) 0x59,
+ (byte) 0x53, (byte) 0x59, (byte) 0x54, (byte) 0x59,
+ (byte) 0x55, (byte) 0x59, (byte) 0x56, (byte) 0x59,
+ (byte) 0x57, (byte) 0x59, (byte) 0x58, (byte) 0x59,
+ (byte) 0x59, (byte) 0x59, (byte) 0x5a, (byte) 0x59,
+ (byte) 0x5b, (byte) 0x59, (byte) 0x5c, (byte) 0x59,
+ (byte) 0x5d, (byte) 0x59, (byte) 0x5e, (byte) 0x59,
+ (byte) 0x5f, (byte) 0x59, (byte) 0x60, (byte) 0x59,
+ (byte) 0x61, (byte) 0x59, (byte) 0x62, (byte) 0x59,
+ (byte) 0x63, (byte) 0x59, (byte) 0x64, (byte) 0x59,
+ (byte) 0x65, (byte) 0x59, (byte) 0x66, (byte) 0x59,
+ (byte) 0x67, (byte) 0x59, (byte) 0x68, (byte) 0x59,
+ (byte) 0x69, (byte) 0x59, (byte) 0x6a, (byte) 0x59,
+ (byte) 0x6b, (byte) 0x59, (byte) 0x6c, (byte) 0x59,
+ (byte) 0x6d, (byte) 0x59, (byte) 0x6e, (byte) 0x59,
+ (byte) 0x6f, (byte) 0x59, (byte) 0x70, (byte) 0x59,
+ (byte) 0x71, (byte) 0x59, (byte) 0x72, (byte) 0x59,
+ (byte) 0x73, (byte) 0x59, (byte) 0x74, (byte) 0x59,
+ (byte) 0x75, (byte) 0x59, (byte) 0x76, (byte) 0x59,
+ (byte) 0x77, (byte) 0x59, (byte) 0x78, (byte) 0x59,
+ (byte) 0x79, (byte) 0x59, (byte) 0x7a, (byte) 0x59,
+ (byte) 0x7b, (byte) 0x59, (byte) 0x7c, (byte) 0x59,
+ (byte) 0x7d, (byte) 0x59, (byte) 0x7e, (byte) 0x5a,
+ (byte) 0x21, (byte) 0x5a, (byte) 0x22, (byte) 0x5a,
+ (byte) 0x23, (byte) 0x5a, (byte) 0x24, (byte) 0x5a,
+ (byte) 0x25, (byte) 0x5a, (byte) 0x26, (byte) 0x5a,
+ (byte) 0x27, (byte) 0x5a, (byte) 0x28, (byte) 0x5a,
+ (byte) 0x29, (byte) 0x5a, (byte) 0x2a, (byte) 0x5a,
+ (byte) 0x2b, (byte) 0x5a, (byte) 0x2c, (byte) 0x5a,
+ (byte) 0x2d, (byte) 0x5a, (byte) 0x2e, (byte) 0x5a,
+ (byte) 0x2f, (byte) 0x5a, (byte) 0x30, (byte) 0x5a,
+ (byte) 0x31, (byte) 0x5a, (byte) 0x32, (byte) 0x5a,
+ (byte) 0x33, (byte) 0x5a, (byte) 0x34, (byte) 0x5a,
+ (byte) 0x35, (byte) 0x5a, (byte) 0x36, (byte) 0x5a,
+ (byte) 0x37, (byte) 0x5a, (byte) 0x38, (byte) 0x5a,
+ (byte) 0x39, (byte) 0x5a, (byte) 0x3a, (byte) 0x5a,
+ (byte) 0x3b, (byte) 0x5a, (byte) 0x3c, (byte) 0x5a,
+ (byte) 0x3d, (byte) 0x5a, (byte) 0x3e, (byte) 0x5a,
+ (byte) 0x3f, (byte) 0x5a, (byte) 0x40, (byte) 0x5a,
+ (byte) 0x41, (byte) 0x5a, (byte) 0x42, (byte) 0x5b,
+ (byte) 0x35, (byte) 0x5b, (byte) 0x36, (byte) 0x5b,
+ (byte) 0x37, (byte) 0x5b, (byte) 0x38, (byte) 0x5b,
+ (byte) 0x39, (byte) 0x5b, (byte) 0x3a, (byte) 0x5b,
+ (byte) 0x3b, (byte) 0x5b, (byte) 0x3c, (byte) 0x5b,
+ (byte) 0x3d, (byte) 0x5b, (byte) 0x3e, (byte) 0x5b,
+ (byte) 0x3f, (byte) 0x5b, (byte) 0x40, (byte) 0x5b,
+ (byte) 0x41, (byte) 0x5b, (byte) 0x42, (byte) 0x5b,
+ (byte) 0x43, (byte) 0x5b, (byte) 0x44, (byte) 0x5b,
+ (byte) 0x45, (byte) 0x5b, (byte) 0x46, (byte) 0x5b,
+ (byte) 0x47, (byte) 0x5b, (byte) 0x48, (byte) 0x5b,
+ (byte) 0x49, (byte) 0x5b, (byte) 0x4a, (byte) 0x5b,
+ (byte) 0x4b, (byte) 0x5b, (byte) 0x4c, (byte) 0x5b,
+ (byte) 0x4d, (byte) 0x5b, (byte) 0x4e, (byte) 0x5b,
+ (byte) 0x4f, (byte) 0x5b, (byte) 0x50, (byte) 0x5b,
+ (byte) 0x51, (byte) 0x5b, (byte) 0x52, (byte) 0x5b,
+ (byte) 0x53, (byte) 0x5b, (byte) 0x54, (byte) 0x5b,
+ (byte) 0x55, (byte) 0x5b, (byte) 0x56, (byte) 0x5b,
+ (byte) 0x57, (byte) 0x5b, (byte) 0x58, (byte) 0x5b,
+ (byte) 0x59, (byte) 0x5b, (byte) 0x5a, (byte) 0x5b,
+ (byte) 0x5b, (byte) 0x5b, (byte) 0x5c, (byte) 0x5b,
+ (byte) 0x5d, (byte) 0x5b, (byte) 0x5e, (byte) 0x5b,
+ (byte) 0x5f, (byte) 0x5b, (byte) 0x60, (byte) 0x5b,
+ (byte) 0x61, (byte) 0x5b, (byte) 0x62, (byte) 0x5b,
+ (byte) 0x63, (byte) 0x5b, (byte) 0x64, (byte) 0x5b,
+ (byte) 0x65, (byte) 0x5b, (byte) 0x66, (byte) 0x5b,
+ (byte) 0x67, (byte) 0x5b, (byte) 0x68, (byte) 0x5b,
+ (byte) 0x69, (byte) 0x5b, (byte) 0x6a, (byte) 0x5b,
+ (byte) 0x6b, (byte) 0x5b, (byte) 0x6c, (byte) 0x5b,
+ (byte) 0x6d, (byte) 0x5b, (byte) 0x6e, (byte) 0x5b,
+ (byte) 0x6f, (byte) 0x5b, (byte) 0x70, (byte) 0x5b,
+ (byte) 0x71, (byte) 0x5b, (byte) 0x72, (byte) 0x5b,
+ (byte) 0x73, (byte) 0x5b, (byte) 0x74, (byte) 0x5b,
+ (byte) 0x75, (byte) 0x5b, (byte) 0x76, (byte) 0x5b,
+ (byte) 0x77, (byte) 0x5b, (byte) 0x78, (byte) 0x5b,
+ (byte) 0x79, (byte) 0x5b, (byte) 0x7a, (byte) 0x5b,
+ (byte) 0x7b, (byte) 0x5b, (byte) 0x7c, (byte) 0x5b,
+ (byte) 0x7d, (byte) 0x5b, (byte) 0x7e, (byte) 0x5c,
+ (byte) 0x21, (byte) 0x5c, (byte) 0x22, (byte) 0x5c,
+ (byte) 0x23, (byte) 0x5c, (byte) 0x24, (byte) 0x5c,
+ (byte) 0x25, (byte) 0x5c, (byte) 0x26, (byte) 0x5c,
+ (byte) 0x27, (byte) 0x5c, (byte) 0x28, (byte) 0x5c,
+ (byte) 0x29, (byte) 0x5c, (byte) 0x2a, (byte) 0x5c,
+ (byte) 0x2b, (byte) 0x5c, (byte) 0x2c, (byte) 0x5c,
+ (byte) 0x2d, (byte) 0x5c, (byte) 0x2e, (byte) 0x5c,
+ (byte) 0x2f, (byte) 0x5c, (byte) 0x30, (byte) 0x5c,
+ (byte) 0x31, (byte) 0x5c, (byte) 0x32, (byte) 0x5c,
+ (byte) 0x33, (byte) 0x5c, (byte) 0x34, (byte) 0x5c,
+ (byte) 0x35, (byte) 0x5c, (byte) 0x36, (byte) 0x5d,
+ (byte) 0x79, (byte) 0x5d, (byte) 0x7a, (byte) 0x5d,
+ (byte) 0x7b, (byte) 0x5d, (byte) 0x7c, (byte) 0x5d,
+ (byte) 0x7d, (byte) 0x5d, (byte) 0x7e, (byte) 0x5e,
+ (byte) 0x21, (byte) 0x5e, (byte) 0x22, (byte) 0x5e,
+ (byte) 0x23, (byte) 0x5e, (byte) 0x24, (byte) 0x5e,
+ (byte) 0x25, (byte) 0x5e, (byte) 0x26, (byte) 0x5e,
+ (byte) 0x27, (byte) 0x5e, (byte) 0x28, (byte) 0x5e,
+ (byte) 0x29, (byte) 0x5e, (byte) 0x2a, (byte) 0x5e,
+ (byte) 0x2b, (byte) 0x5e, (byte) 0x2c, (byte) 0x5e,
+ (byte) 0x2d, (byte) 0x5e, (byte) 0x2e, (byte) 0x5e,
+ (byte) 0x2f, (byte) 0x5e, (byte) 0x30, (byte) 0x5e,
+ (byte) 0x31, (byte) 0x5e, (byte) 0x32, (byte) 0x5e,
+ (byte) 0x33, (byte) 0x5e, (byte) 0x34, (byte) 0x5e,
+ (byte) 0x35, (byte) 0x5e, (byte) 0x36, (byte) 0x5e,
+ (byte) 0x37, (byte) 0x5e, (byte) 0x38, (byte) 0x5e,
+ (byte) 0x39, (byte) 0x5e, (byte) 0x3a, (byte) 0x5e,
+ (byte) 0x3b, (byte) 0x5e, (byte) 0x3c, (byte) 0x5e,
+ (byte) 0x3d, (byte) 0x5e, (byte) 0x3e, (byte) 0x5e,
+ (byte) 0x3f, (byte) 0x5e, (byte) 0x40, (byte) 0x5e,
+ (byte) 0x41, (byte) 0x5e, (byte) 0x42, (byte) 0x5e,
+ (byte) 0x43, (byte) 0x5e, (byte) 0x44, (byte) 0x5e,
+ (byte) 0x45, (byte) 0x5e, (byte) 0x46, (byte) 0x5e,
+ (byte) 0x47, (byte) 0x5e, (byte) 0x48, (byte) 0x5e,
+ (byte) 0x49, (byte) 0x5e, (byte) 0x4a, (byte) 0x60,
+ (byte) 0x30, (byte) 0x60, (byte) 0x31, (byte) 0x60,
+ (byte) 0x32, (byte) 0x60, (byte) 0x33, (byte) 0x60,
+ (byte) 0x34, (byte) 0x60, (byte) 0x35, (byte) 0x60,
+ (byte) 0x36, (byte) 0x60, (byte) 0x37, (byte) 0x60,
+ (byte) 0x38, (byte) 0x60, (byte) 0x39, (byte) 0x60,
+ (byte) 0x3a, (byte) 0x60, (byte) 0x3b, (byte) 0x60,
+ (byte) 0x3c, (byte) 0x60, (byte) 0x3d, (byte) 0x60,
+ (byte) 0x3e, (byte) 0x60, (byte) 0x3f, (byte) 0x73,
+ (byte) 0x26, (byte) 0x73, (byte) 0x27, (byte) 0x73,
+ (byte) 0x28, (byte) 0x73, (byte) 0x29, (byte) 0x73,
+ (byte) 0x2a, (byte) 0x73, (byte) 0x2b, (byte) 0x73,
+ (byte) 0x2c, (byte) 0x73, (byte) 0x2d, (byte) 0x73,
+ (byte) 0x2e, (byte) 0x73, (byte) 0x2f, (byte) 0x73,
+ (byte) 0x30, (byte) 0x73, (byte) 0x31, (byte) 0x73,
+ (byte) 0x32, (byte) 0x73, (byte) 0x33, (byte) 0x73,
+ (byte) 0x34, (byte) 0x73, (byte) 0x35, (byte) 0x73,
+ (byte) 0x36, (byte) 0x73, (byte) 0x37, (byte) 0x73,
+ (byte) 0x38, (byte) 0x73, (byte) 0x39, (byte) 0x73,
+ (byte) 0x3a, (byte) 0x73, (byte) 0x3b, (byte) 0x73,
+ (byte) 0x3c, (byte) 0x73, (byte) 0x3d, (byte) 0x73,
+ (byte) 0x3e, (byte) 0x73, (byte) 0x3f, (byte) 0x73,
+ (byte) 0x40, (byte) 0x73, (byte) 0x41, (byte) 0x73,
+ (byte) 0x42, (byte) 0x73, (byte) 0x43, (byte) 0x73,
+ (byte) 0x44, (byte) 0x73, (byte) 0x45, (byte) 0x73,
+ (byte) 0x46, (byte) 0x73, (byte) 0x47, (byte) 0x73,
+ (byte) 0x48, (byte) 0x73, (byte) 0x49, (byte) 0x73,
+ (byte) 0x4a, (byte) 0x73, (byte) 0x4b, (byte) 0x73,
+ (byte) 0x4c, (byte) 0x73, (byte) 0x4d, (byte) 0x73,
+ (byte) 0x4e, (byte) 0x73, (byte) 0x4f, (byte) 0x73,
+ (byte) 0x50, (byte) 0x73, (byte) 0x51, (byte) 0x73,
+ (byte) 0x52, (byte) 0x73, (byte) 0x53, (byte) 0x73,
+ (byte) 0x54, (byte) 0x73, (byte) 0x55, (byte) 0x73,
+ (byte) 0x56, (byte) 0x73, (byte) 0x57, (byte) 0x73,
+ (byte) 0x58, (byte) 0x73, (byte) 0x59, (byte) 0x73,
+ (byte) 0x5a, (byte) 0x73, (byte) 0x5b, (byte) 0x73,
+ (byte) 0x5c, (byte) 0x73, (byte) 0x5d, (byte) 0x73,
+ (byte) 0x5e, (byte) 0x73, (byte) 0x5f, (byte) 0x73,
+ (byte) 0x60, (byte) 0x73, (byte) 0x61, (byte) 0x73,
+ (byte) 0x62, (byte) 0x73, (byte) 0x63, (byte) 0x73,
+ (byte) 0x64, (byte) 0x73, (byte) 0x65, (byte) 0x73,
+ (byte) 0x66, (byte) 0x73, (byte) 0x67, (byte) 0x73,
+ (byte) 0x68, (byte) 0x73, (byte) 0x69, (byte) 0x73,
+ (byte) 0x6a, (byte) 0x73, (byte) 0x6b, (byte) 0x73,
+ (byte) 0x6c, (byte) 0x73, (byte) 0x6d, (byte) 0x73,
+ (byte) 0x6e, (byte) 0x73, (byte) 0x6f, (byte) 0x73,
+ (byte) 0x70, (byte) 0x73, (byte) 0x71, (byte) 0x73,
+ (byte) 0x72, (byte) 0x73, (byte) 0x73, (byte) 0x73,
+ (byte) 0x74, (byte) 0x73, (byte) 0x75, (byte) 0x73,
+ (byte) 0x76, (byte) 0x73, (byte) 0x77, (byte) 0x73,
+ (byte) 0x78, (byte) 0x73, (byte) 0x79, (byte) 0x73,
+ (byte) 0x7a, (byte) 0x73, (byte) 0x7b, (byte) 0x73,
+ (byte) 0x7c, (byte) 0x73, (byte) 0x7d, (byte) 0x73,
+ (byte) 0x7e, (byte) 0x74, (byte) 0x21, (byte) 0x74,
+ (byte) 0x22, (byte) 0x74, (byte) 0x23, (byte) 0x74,
+ (byte) 0x24, (byte) 0x74, (byte) 0x25, (byte) 0x74,
+ (byte) 0x26, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+ (byte) 0x21, (byte) 0x22, (byte) 0x23, (byte) 0x24,
+ (byte) 0x25, (byte) 0x26, (byte) 0x27, (byte) 0x28,
+ (byte) 0x29, (byte) 0x2a, (byte) 0x2b, (byte) 0x2c,
+ (byte) 0x2d, (byte) 0x2e, (byte) 0x2f, (byte) 0x30,
+ (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x34,
+ (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38,
+ (byte) 0x39, (byte) 0x3a, (byte) 0x3b, (byte) 0x3c,
+ (byte) 0x3d, (byte) 0x3e, (byte) 0x3f, (byte) 0x40,
+ (byte) 0x41, (byte) 0x42, (byte) 0x43, (byte) 0x44,
+ (byte) 0x45, (byte) 0x46, (byte) 0x47, (byte) 0x48,
+ (byte) 0x49, (byte) 0x4a, (byte) 0x4b, (byte) 0x4c,
+ (byte) 0x4d, (byte) 0x4e, (byte) 0x4f, (byte) 0x50,
+ (byte) 0x51, (byte) 0x52, (byte) 0x53, (byte) 0x54,
+ (byte) 0x55, (byte) 0x56, (byte) 0x57, (byte) 0x58,
+ (byte) 0x59, (byte) 0x5a, (byte) 0x5b, (byte) 0x5c,
+ (byte) 0x5d, (byte) 0x5e, (byte) 0x5f, (byte) 0x1b,
+ (byte) 0x28, (byte) 0x42 };
+
+ private final static String MIXEDCONTENT =
+ "JA\u3000\u3002\u0062\uFF64PAN" +
+ "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" +
+ "\u30FB\uFF67\u203E";
+
+ static byte[] mixedBytesExpected = {
+ (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24,
+ (byte) 0x42, (byte) 0x21, (byte) 0x21, (byte) 0x21,
+ (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+ (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+ (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+ (byte) 0x50, (byte) 0x41, (byte) 0x4e, (byte) 0x1b,
+ (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24,
+ (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28,
+ (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28,
+ (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b,
+ (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b,
+ (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b,
+ (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26,
+ (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27,
+ (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e,
+ (byte) 0x1b, (byte) 0x28, (byte) 0x42 };
+
+ static byte[] repeatingEscapes = {
+ (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24,
+ (byte) 0x42, (byte)0x1b, (byte)0x24, (byte)0x42,
+ (byte) 0x21, (byte) 0x21, (byte) 0x21,
+ (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+ // embedded repeated iso-2022 escapes (see bugID 4879522)
+ (byte)0x1b, (byte)0x28, (byte)0x42,
+ (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+ (byte)0x0f, (byte)0x0e, (byte)0x0f,
+ (byte)0x1b, (byte)0x28, (byte)0x49,
+ (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+ (byte) 0x50, (byte) 0x41, (byte) 0x4e,
+ // embedded shift chars (see bugID 4879522)
+ (byte)0x0e, (byte)0x0f,
+ (byte) 0x1b,
+ (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24,
+ (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28,
+ (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28,
+ (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b,
+ (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b,
+ (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b,
+ (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26,
+ (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27,
+ (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e,
+ (byte) 0x1b, (byte) 0x28, (byte) 0x42 };
+
+
+ private static String JISX0212 =
+ "\u02d8\u6896\u9fa5";
+
+ private static byte[] expectedBytes_JISX0212 = {
+ (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44,
+ (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f,
+ (byte)0x6d, (byte)0x63,
+ (byte)0x1b, (byte)0x28, (byte)0x42
+ };
+
+ /*
+ * Tests the roundtrip integrity and expected encoding
+ * correctness for a String containing a substantial
+ * subset of ISO-2022-JP/ISO-2022-JP-2 encodeable chars
+ */
+
+ private static void roundTrip(String testStr, byte[] expectBytes,
+ String csName)
+ throws Exception {
+ byte[] encodedBytes = testStr.getBytes(csName);
+
+ if (encodedBytes.length != expectBytes.length) {
+ throw new Exception(csName + " Encoder error");
+ }
+
+ for (int i = 0; i < expectBytes.length; i++) {
+ if (encodedBytes[i] != expectBytes[i]) {
+ throw new Exception(csName + " Encoder error");
+ }
+ }
+ String decoded = new String(encodedBytes, csName);
+
+ if (!decoded.equals(testStr)) {
+ throw new Exception(csName + " Decoder error");
+ }
+ String decoded2 = new String(repeatingEscapes, csName);
+ if (!decoded2.equals(MIXEDCONTENT)) {
+ throw new Exception(csName + " Decoder error");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ // Long String containing sequential chars
+ // ASCII/yen/tilde/jisx0208 chars/katakana chars
+
+ String testStr1 = US_ASCII +
+ JISX0208SUBSET + JISX0202KATAKANA;
+ roundTrip(testStr1, expectedBytes1, "ISO-2022-JP");
+ roundTrip(testStr1, expectedBytes1, "ISO-2022-JP-2");
+ roundTrip(JISX0212, expectedBytes_JISX0212, "ISO-2022-JP-2");
+
+ // mixed chars which encode to the supported codesets
+ // of ISO-2022-JP/ISO-2022-JP-2
+
+ String testStr2 = MIXEDCONTENT;
+ roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP");
+ roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP-2");
+
+ String decoded2 = new String(repeatingEscapes, "ISO-2022-JP");
+ if (!decoded2.equals(MIXEDCONTENT)) {
+ throw new Exception("ISO-2022-JP Decoder error");
+ }
+
+ decoded2 = new String(repeatingEscapes, "ISO-2022-JP-2");
+ if (!decoded2.equals(MIXEDCONTENT)) {
+ throw new Exception("ISO-2022-JP-2 Decoder error");
+ }
+
+ // Test for bugID 4913711
+ // ISO-2022-JP encoding of a single input char yields
+ // 8 output bytes. Prior to fix for 4913711 the
+ // max bytes per char value was underspecified as 5.0
+ // and the code below would have thrown a BufferOverflow
+ // exception. This test validates the fix for 4913711
+
+ String testStr3 = "\u3042";
+ byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42,
+ (byte)0x24, (byte)0x22, (byte)0x1b,
+ (byte)0x28, (byte)0x42 };
+ byte[] encoded = testStr3.getBytes("ISO-2022-JP");
+ for (int i = 0; i < expected.length; i++) {
+ if (encoded[i] != expected[i])
+ throw new Exception("ISO-2022-JP Decoder error");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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 4251646
+ @summary Make sure buffer boundary convert works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022JPEncoder {
+ static char[] inputChars = {'\u0020', '\u0020', '\u0020', '\u0020',
+ '\u0020', '\u0020', '\u0020', '\u0020',
+ '\u0020', '\u4e00'};
+ static byte[] expectedBytes1 = {0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20};
+ static byte[] expectedBytes2 = {0x1b, 0x24, 0x42, 0x30, 0x6c,
+ 0x1b, 0x28, 0x42};
+ static byte[] outputBuff = new byte[10];
+
+ public static void main(String args[]) throws Exception {
+ CharsetEncoder enc = Charset.forName("ISO2022JP").newEncoder();
+ CharBuffer cb = CharBuffer.wrap(inputChars);
+ ByteBuffer bb = ByteBuffer.wrap(outputBuff);
+ CoderResult cr = enc.encode(cb, bb, false);
+ if (!cr.isOverflow())
+ throw new Exception("Expected CodeResult.OVERFLOW was not returned");
+ for (int i = 0; i < expectedBytes1.length; ++i) {
+ //System.out.println(expectedBytes1[i] + ":" + outputBuff[i]);
+ if (expectedBytes1[i] != outputBuff[i]) {
+ throw new Exception("Output bytes does not match at first conversion");
+ }
+ }
+ int nci = cb.position();
+ if (nci != expectedBytes1.length)
+ throw new Exception("Output length does not match at first conversion");
+ bb.clear();
+ cr = enc.encode(cb, bb, true);
+ enc.flush(bb);
+ //System.out.println(ret + "," + expectedBytes2.length);
+ bb.flip();
+ int len = bb.remaining();
+ if (len != expectedBytes2.length)
+ throw new Exception("Output length does not match at second conversion");
+ for (int i = 0; i < expectedBytes2.length; ++i) {
+ //System.out.println(expectedBytes2[i] + ":" + outputBuff[i]);
+ if (expectedBytes2[i] != outputBuff[i]) {
+ throw new Exception("Output bytes does not match at second conversion");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,101 @@
+/*
+ * 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 4262894 6233303
+ @summary Testing substitute character Escape sequence
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022JPSubBytes {
+ /* \U2460 is not valid character in ISO2022JP and will be substituted
+ * with replacement character. If the replacement character is not the
+ * "current charset" character, correct escape sequence should be output
+ * for changing character set.
+ */
+ static char[][] in = { {'\u25cb', '\u2460', '\u25cb'},
+ {'\u0061', '\u2460', '\u0061'},
+ {'\u25cb', '\u2460', '\u25cb'},
+ {'\u0061', '\u2460', '\u0061'},
+ };
+ static byte[][] expected = { {0x1b, 0x24, 0x42, 0x21, 0x7b,
+ 0x21, 0x29,
+ 0x21, 0x7b,
+ 0x1b, 0x28, 0x42},
+ {0x61,
+ 0x1b, 0x24, 0x42, 0x21, 0x29,
+ 0x1b, 0x28, 0x42, 0x61},
+ {0x1b, 0x24, 0x42, 0x21, 0x7b,
+ 0x1b, 0x28, 0x42, 0x3f,
+ 0x1b, 0x24, 0x42, 0x21, 0x7b,
+ 0x1b, 0x28, 0x42},
+ {0x61,
+ 0x3f,
+ 0x61}
+ };
+
+ public static void main(String args[]) throws Exception {
+ CharsetEncoder enc = Charset.forName("ISO2022JP")
+ .newEncoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE);
+
+ test(enc, in[0], expected[0]);
+
+ enc.reset();
+ test(enc, in[1], expected[1]);
+
+ enc.reset();
+ enc.replaceWith(new byte[]{(byte)'?'});
+ test(enc, in[2], expected[2]);
+
+ enc.reset();
+ test(enc, in[3], expected[3]);
+ }
+
+ public static void test (CharsetEncoder enc,
+ char[] inputChars,
+ byte[] expectedBytes) throws Exception
+ {
+ ByteBuffer bb = ByteBuffer.allocate(expectedBytes.length);
+ enc.encode(CharBuffer.wrap(inputChars), bb, true);
+ enc.flush(bb);
+ bb.flip();
+ byte[] outputBuff = bb.array();
+ int outputLen = bb.limit();
+ if (outputLen != expectedBytes.length) {
+ throw new Exception("Output bytes does not match");
+ }
+ for (int i = 0; i < outputLen; ++i) {
+ System.out.printf("<%x:%x> ",
+ expectedBytes[i] & 0xff,
+ outputBuff[i] & 0xff);
+ if (expectedBytes[i] != outputBuff[i]) {
+ System.out.println("...");
+ throw new Exception("Output bytes does not match");
+ }
+ }
+ System.out.println();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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 4429369
+ @summary ISO2022CN and ISO2022KR converters throw exception
+ */
+
+import java.io.*;
+import java.nio.charset.*;
+
+public class TestIllegalISO2022Esc {
+
+ public static void main ( String[] args) throws Exception {
+ int exceptionCount = 0;
+ String[] encName = {"ISO2022CN", "ISO2022KR" };
+ byte[]b= {
+ (byte)0x1b, //Illegal sequence for both converters.
+ (byte)')',
+ (byte)'x'
+ };
+
+ for ( int i=0; i < 2; i++) { // Test 2 converters.
+ try {
+ ByteArrayInputStream bais = new ByteArrayInputStream(b);
+ InputStreamReader isr =
+ new InputStreamReader(bais,encName[i]);
+ char cc[] = new char[1];
+ isr.read(cc,0,1); //attempt to read
+ } catch (MalformedInputException e) { } // Passes if thrown
+ catch (Throwable t) {
+ System.err.println("error with converter " + encName[i]);
+ exceptionCount++;
+ }
+ }
+
+ if (exceptionCount > 0)
+ throw new Exception ("Incorrect handling of illegal ISO2022 escapes");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestIllegalSJIS.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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 4117820
+ @summary Verify that SJIS.Decoder works properly for values between 0xA000 and 0xA0FC
+ */
+
+import java.nio.charset.*;
+import java.nio.*;
+
+public class TestIllegalSJIS {
+
+ public static void main(String[] args) throws Exception
+ {
+ CharsetDecoder dec = Charset.forName("SJIS").newDecoder()
+ .onUnmappableCharacter(CodingErrorAction.REPLACE)
+ .onMalformedInput(CodingErrorAction.REPLACE);
+ byte[] sjis = {(byte)0xA0, (byte)0x00};
+
+ int b;
+ for (b = 0; b < 0xFD; b++) {
+ sjis[1] = (byte) b;
+ CharBuffer cb = dec.decode(ByteBuffer.wrap(sjis));
+ if (cb.charAt(0) != 0xFFFD) {
+ throw new Exception(Integer.toHexString(0xa000 + b) + " failed to convert to 0xFFFD");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestJIS0208Decoder.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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 4179800
+ * @summary Make sure JIS0208.Decoder really works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestJIS0208Decoder {
+ static String outputString = "\u65e5\u672c\u8a9e\u30c6\u30ad\u30b9\u30c8";
+ static byte [] inputBytes = new byte[] {(byte)'F', (byte)'|', (byte)'K', (byte)'\\',
+ (byte)'8', (byte)'l', (byte)'%', (byte)'F',
+ (byte)'%', (byte)'-', (byte)'%', (byte)'9',
+ (byte)'%', (byte)'H'};
+
+ public static void main(String args[])
+ throws Exception
+ {
+ test();
+ }
+
+ private static void test()
+ throws Exception
+ {
+ CharsetDecoder dec = Charset.forName("JIS0208").newDecoder();
+ try {
+ String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString();
+ if (ret.length() != outputString.length()
+ || ! outputString.equals(ret)){
+ throw new Exception("ByteToCharJIS0208 does not work correctly");
+ }
+ }
+ catch (Exception e){
+ throw new Exception("ByteToCharJIS0208 does not work correctly");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestJIS0212Decoder.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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 4179800
+ @summary Make sure JIS0212.Decoder really works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestJIS0212Decoder {
+ static String outputString = "\u4e02\u4e04\u4e05\u4e0c\u4e12\u4e1f\u4e23";
+ static char [] outputChars = new char[8];
+ static byte [] inputBytes = new byte[] {(byte)0x30, (byte)0x21, (byte)0x30, (byte)0x22,
+ (byte)0x30, (byte)0x23, (byte)0x30, (byte)0x24,
+ (byte)0x30, (byte)0x25, (byte)0x30, (byte)0x26,
+ (byte)0x30, (byte)0x27};
+
+ public static void main(String args[])
+ throws Exception
+ {
+ test();
+ }
+
+ private static void test()
+ throws Exception
+ {
+ CharsetDecoder dec = Charset.forName("JIS0212").newDecoder();
+ try {
+ String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString();
+ if (ret.length() != outputString.length()
+ || ! outputString.equals(ret)){
+ throw new Exception("ByteToCharJIS0212 does not work correctly");
+ }
+ }
+ catch (Exception e){
+ throw new Exception("ByteToCharJIS0212 does not work correctly");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestMS5022X.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,750 @@
+/*
+ * 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 6173388 6319716
+ @summary Check full coverage encode/decode for Microsoft
+ ISO2022_JP variants MS50220, MS50221 and MSISO2022JP
+ */
+
+import java.io.*;
+import java.nio.charset.*;
+public class TestMS5022X {
+
+ private static String US_ASCII =
+ "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" +
+ "\b\t\n\u000B\f\r" +
+ "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" +
+ "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" +
+ "\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\u00A5\u203E";
+
+ // Subset of chars sourced from JISX0208:1983
+
+ private static String JISX0208SUBSET =
+ "\u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" +
+ "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" +
+ "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" +
+ "\u4EDD\u3005\u3006\u3007\u30FC\u2015\u2010\uFF0F" + //u2014->u2015
+ "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" +
+ "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" +
+ "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" +
+ "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" +
+ "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" +
+ "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" +
+ "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" +
+ "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" +
+ "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" +
+ "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" +
+ "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" +
+ "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" +
+ "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" +
+ "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" +
+ "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" +
+ "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" +
+ "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" +
+ "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" +
+ "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" +
+ "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" +
+ "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" +
+ "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" +
+ "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" +
+ "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" +
+ "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" +
+ "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" +
+ "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" +
+ "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" +
+ "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" +
+ "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" +
+ "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" +
+ "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" +
+ "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" +
+ "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" +
+ "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" +
+ "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" +
+ "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" +
+ "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" +
+ "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" +
+ "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" +
+ "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" +
+ "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" +
+ "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" +
+ "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" +
+ "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" +
+ "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" +
+ "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" +
+ "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" +
+ "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" +
+ "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" +
+ "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" +
+ "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" +
+ "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" +
+ "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" +
+ "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" +
+ "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" +
+ "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" +
+ "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" +
+ "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" +
+ "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" +
+ "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" +
+ "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" +
+ "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" +
+ "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" +
+ "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" +
+ "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199";
+
+ private static String JISX0201KATAKANA =
+ "\uFF61\uFF62\uFF63\uFF64" +
+ "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" +
+ "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" +
+ "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" +
+ "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" +
+ "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" +
+ "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" +
+ "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" +
+ "\uFF9D\uFF9E\uFF9F";
+
+ private static String JISX0208NECROW13 =
+ "\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467" +
+ "\u2468\u2469\u246A\u246B\u246C\u246D\u246E\u246F" +
+ "\u2470\u2471\u2472\u2473\u2160\u2161\u2162\u2163" +
+ "\u2164\u2165\u2166\u2167\u2168\u2169\u3349\u3314" +
+ "\u3322\u334D\u3318\u3327\u3303\u3336\u3351\u3357" +
+ "\u330D\u3326\u3323\u332B\u334A\u333B\u339C\u339D" +
+ "\u339E\u338E\u338F\u33C4\u33A1\u337B\u301E\u301F" +
+ "\u2116\u33CD\u2121\u32A4\u32A5\u32A6\u32A7\u32A8" +
+ "\u3231\u3232\u3239\u337E\u337D\u337C" +
+ "\u222e\u2211\u221f\u22bf";
+
+ private static byte[] expectedBytes_US_ASCII = {
+ (byte)0x0, (byte)0x1, (byte)0x2, (byte)0x3,
+ (byte)0x4, (byte)0x5, (byte)0x6, (byte)0x7,
+ (byte)0x8, (byte)0x9, (byte)0xa, (byte)0xb,
+ (byte)0xc, (byte)0xd,
+ (byte)0x10, (byte)0x11, (byte)0x12, (byte)0x13,
+ (byte)0x14, (byte)0x15, (byte)0x16, (byte)0x17,
+ (byte)0x18, (byte)0x19, (byte)0x1a,
+ (byte)0x1c, (byte)0x1d, (byte)0x1e, (byte)0x1f,
+ (byte)0x20, (byte)0x21, (byte)0x22, (byte)0x23,
+ (byte)0x24, (byte)0x25, (byte)0x26, (byte)0x27,
+ (byte)0x28, (byte)0x29, (byte)0x2a, (byte)0x2b,
+ (byte)0x2c, (byte)0x2d, (byte)0x2e, (byte)0x2f,
+ (byte)0x30, (byte)0x31, (byte)0x32, (byte)0x33,
+ (byte)0x34, (byte)0x35, (byte)0x36, (byte)0x37,
+ (byte)0x38, (byte)0x39, (byte)0x3a, (byte)0x3b,
+ (byte)0x3c, (byte)0x3d, (byte)0x3e, (byte)0x3f,
+ (byte)0x40, (byte)0x41, (byte)0x42, (byte)0x43,
+ (byte)0x44, (byte)0x45, (byte)0x46, (byte)0x47,
+ (byte)0x48, (byte)0x49, (byte)0x4a, (byte)0x4b,
+ (byte)0x4c, (byte)0x4d, (byte)0x4e, (byte)0x4f,
+ (byte)0x50, (byte)0x51, (byte)0x52, (byte)0x53,
+ (byte)0x54, (byte)0x55, (byte)0x56, (byte)0x57,
+ (byte)0x58, (byte)0x59, (byte)0x5a, (byte)0x5b,
+ (byte)0x5c, (byte)0x5d, (byte)0x5e, (byte)0x5f,
+ (byte)0x60, (byte)0x61, (byte)0x62, (byte)0x63,
+ (byte)0x64, (byte)0x65, (byte)0x66, (byte)0x67,
+ (byte)0x68, (byte)0x69, (byte)0x6a, (byte)0x6b,
+ (byte)0x6c, (byte)0x6d, (byte)0x6e, (byte)0x6f,
+ (byte)0x70, (byte)0x71, (byte)0x72, (byte)0x73,
+ (byte)0x74, (byte)0x75, (byte)0x76, (byte)0x77,
+ (byte)0x78, (byte)0x79, (byte)0x7a, (byte)0x7b,
+ (byte)0x7c, (byte)0x7d, (byte)0x7e, (byte)0x1b,
+ (byte)0x28, (byte)0x4a, (byte)0x5c, (byte)0x7e
+ };
+
+ private static byte[] expectedBytes_JISX0208SUBSET =
+ {
+ (byte)0x1b, (byte)0x24, (byte)0x42, (byte)0x21,
+ (byte)0x21, (byte)0x21,
+ (byte)0x22, (byte)0x21, (byte)0x23, (byte)0x21,
+ (byte)0x24, (byte)0x21, (byte)0x25, (byte)0x21,
+ (byte)0x26, (byte)0x21, (byte)0x27, (byte)0x21,
+ (byte)0x28, (byte)0x21, (byte)0x29, (byte)0x21,
+ (byte)0x2a, (byte)0x21, (byte)0x2b, (byte)0x21,
+ (byte)0x2c, (byte)0x21, (byte)0x2d, (byte)0x21,
+ (byte)0x2e, (byte)0x21, (byte)0x2f, (byte)0x21,
+ (byte)0x30, (byte)0x21, (byte)0x31, (byte)0x21,
+ (byte)0x32, (byte)0x21, (byte)0x33, (byte)0x21,
+ (byte)0x34, (byte)0x21, (byte)0x35, (byte)0x21,
+ (byte)0x36, (byte)0x21, (byte)0x37, (byte)0x21,
+ (byte)0x38, (byte)0x21, (byte)0x39, (byte)0x21,
+ (byte)0x3a, (byte)0x21, (byte)0x3b, (byte)0x21,
+ (byte)0x3c, (byte)0x21, (byte)0x3d, (byte)0x21,
+ (byte)0x3e, (byte)0x21, (byte)0x3f, (byte)0x21,
+ (byte)0x40, (byte)0x21, (byte)0x41, (byte)0x21,
+ (byte)0x42, (byte)0x21, (byte)0x43, (byte)0x21,
+ (byte)0x44, (byte)0x21, (byte)0x45, (byte)0x21,
+ (byte)0x46, (byte)0x21, (byte)0x47, (byte)0x55,
+ (byte)0x71, (byte)0x55, (byte)0x72, (byte)0x55,
+ (byte)0x73, (byte)0x55, (byte)0x74, (byte)0x55,
+ (byte)0x75, (byte)0x55, (byte)0x76, (byte)0x55,
+ (byte)0x77, (byte)0x55, (byte)0x78, (byte)0x55,
+ (byte)0x79, (byte)0x55, (byte)0x7a, (byte)0x55,
+ (byte)0x7b, (byte)0x55, (byte)0x7c, (byte)0x55,
+ (byte)0x7d, (byte)0x55, (byte)0x7e, (byte)0x56,
+ (byte)0x21, (byte)0x56, (byte)0x22, (byte)0x56,
+ (byte)0x23, (byte)0x56, (byte)0x24, (byte)0x56,
+ (byte)0x25, (byte)0x56, (byte)0x26, (byte)0x56,
+ (byte)0x27, (byte)0x56, (byte)0x28, (byte)0x56,
+ (byte)0x29, (byte)0x56, (byte)0x2a, (byte)0x56,
+ (byte)0x2b, (byte)0x56, (byte)0x2c, (byte)0x56,
+ (byte)0x2d, (byte)0x56, (byte)0x2e, (byte)0x56,
+ (byte)0x2f, (byte)0x56, (byte)0x30, (byte)0x56,
+ (byte)0x31, (byte)0x56, (byte)0x32, (byte)0x56,
+ (byte)0x33, (byte)0x56, (byte)0x34, (byte)0x56,
+ (byte)0x35, (byte)0x56, (byte)0x36, (byte)0x56,
+ (byte)0x37, (byte)0x56, (byte)0x38, (byte)0x56,
+ (byte)0x39, (byte)0x56, (byte)0x3a, (byte)0x56,
+ (byte)0x3b, (byte)0x56, (byte)0x3c, (byte)0x56,
+ (byte)0x3d, (byte)0x56, (byte)0x3e, (byte)0x56,
+ (byte)0x3f, (byte)0x56, (byte)0x40, (byte)0x56,
+ (byte)0x41, (byte)0x56, (byte)0x42, (byte)0x56,
+ (byte)0x43, (byte)0x56, (byte)0x44, (byte)0x56,
+ (byte)0x45, (byte)0x56, (byte)0x46, (byte)0x56,
+ (byte)0x47, (byte)0x56, (byte)0x48, (byte)0x56,
+ (byte)0x49, (byte)0x56, (byte)0x4a, (byte)0x56,
+ (byte)0x4b, (byte)0x56, (byte)0x4c, (byte)0x56,
+ (byte)0x4d, (byte)0x56, (byte)0x4e, (byte)0x56,
+ (byte)0x4f, (byte)0x56, (byte)0x50, (byte)0x56,
+ (byte)0x51, (byte)0x56, (byte)0x52, (byte)0x56,
+ (byte)0x53, (byte)0x56, (byte)0x54, (byte)0x56,
+ (byte)0x55, (byte)0x56, (byte)0x56, (byte)0x56,
+ (byte)0x57, (byte)0x56, (byte)0x58, (byte)0x56,
+ (byte)0x59, (byte)0x56, (byte)0x5a, (byte)0x56,
+ (byte)0x5b, (byte)0x56, (byte)0x5c, (byte)0x56,
+ (byte)0x5d, (byte)0x56, (byte)0x5e, (byte)0x56,
+ (byte)0x5f, (byte)0x56, (byte)0x60, (byte)0x56,
+ (byte)0x61, (byte)0x56, (byte)0x62, (byte)0x56,
+ (byte)0x63, (byte)0x56, (byte)0x64, (byte)0x56,
+ (byte)0x65, (byte)0x56, (byte)0x66, (byte)0x56,
+ (byte)0x67, (byte)0x56, (byte)0x68, (byte)0x56,
+ (byte)0x69, (byte)0x56, (byte)0x6a, (byte)0x56,
+ (byte)0x6b, (byte)0x56, (byte)0x6c, (byte)0x56,
+ (byte)0x6d, (byte)0x56, (byte)0x6e, (byte)0x56,
+ (byte)0x6f, (byte)0x56, (byte)0x70, (byte)0x56,
+ (byte)0x71, (byte)0x56, (byte)0x72, (byte)0x56,
+ (byte)0x73, (byte)0x56, (byte)0x74, (byte)0x56,
+ (byte)0x75, (byte)0x56, (byte)0x76, (byte)0x56,
+ (byte)0x77, (byte)0x56, (byte)0x78, (byte)0x56,
+ (byte)0x79, (byte)0x56, (byte)0x7a, (byte)0x56,
+ (byte)0x7b, (byte)0x56, (byte)0x7c, (byte)0x56,
+ (byte)0x7d, (byte)0x56, (byte)0x7e, (byte)0x57,
+ (byte)0x21, (byte)0x57, (byte)0x22, (byte)0x57,
+ (byte)0x23, (byte)0x57, (byte)0x24, (byte)0x57,
+ (byte)0x25, (byte)0x57, (byte)0x26, (byte)0x57,
+ (byte)0x27, (byte)0x57, (byte)0x28, (byte)0x57,
+ (byte)0x29, (byte)0x57, (byte)0x2a, (byte)0x57,
+ (byte)0x2b, (byte)0x57, (byte)0x2c, (byte)0x57,
+ (byte)0x2d, (byte)0x57, (byte)0x2e, (byte)0x57,
+ (byte)0x2f, (byte)0x57, (byte)0x30, (byte)0x57,
+ (byte)0x31, (byte)0x57, (byte)0x32, (byte)0x57,
+ (byte)0x33, (byte)0x57, (byte)0x34, (byte)0x57,
+ (byte)0x35, (byte)0x57, (byte)0x36, (byte)0x57,
+ (byte)0x37, (byte)0x57, (byte)0x38, (byte)0x57,
+ (byte)0x39, (byte)0x57, (byte)0x3a, (byte)0x57,
+ (byte)0x3b, (byte)0x57, (byte)0x3c, (byte)0x57,
+ (byte)0x3d, (byte)0x57, (byte)0x3e, (byte)0x57,
+ (byte)0x3f, (byte)0x57, (byte)0x40, (byte)0x57,
+ (byte)0x41, (byte)0x57, (byte)0x42, (byte)0x57,
+ (byte)0x43, (byte)0x57, (byte)0x44, (byte)0x57,
+ (byte)0x45, (byte)0x57, (byte)0x46, (byte)0x57,
+ (byte)0x47, (byte)0x57, (byte)0x48, (byte)0x57,
+ (byte)0x49, (byte)0x57, (byte)0x4a, (byte)0x57,
+ (byte)0x4b, (byte)0x57, (byte)0x4c, (byte)0x57,
+ (byte)0x4d, (byte)0x57, (byte)0x4e, (byte)0x57,
+ (byte)0x4f, (byte)0x57, (byte)0x50, (byte)0x57,
+ (byte)0x51, (byte)0x57, (byte)0x52, (byte)0x57,
+ (byte)0x53, (byte)0x57, (byte)0x54, (byte)0x57,
+ (byte)0x55, (byte)0x57, (byte)0x56, (byte)0x57,
+ (byte)0x57, (byte)0x57, (byte)0x58, (byte)0x57,
+ (byte)0x59, (byte)0x57, (byte)0x5a, (byte)0x57,
+ (byte)0x5b, (byte)0x57, (byte)0x5c, (byte)0x57,
+ (byte)0x5d, (byte)0x57, (byte)0x5e, (byte)0x57,
+ (byte)0x5f, (byte)0x57, (byte)0x60, (byte)0x57,
+ (byte)0x61, (byte)0x57, (byte)0x62, (byte)0x57,
+ (byte)0x63, (byte)0x57, (byte)0x64, (byte)0x59,
+ (byte)0x49, (byte)0x59, (byte)0x4a, (byte)0x59,
+ (byte)0x4b, (byte)0x59, (byte)0x4c, (byte)0x59,
+ (byte)0x4d, (byte)0x59, (byte)0x4e, (byte)0x59,
+ (byte)0x4f, (byte)0x59, (byte)0x50, (byte)0x59,
+ (byte)0x51, (byte)0x59, (byte)0x52, (byte)0x59,
+ (byte)0x53, (byte)0x59, (byte)0x54, (byte)0x59,
+ (byte)0x55, (byte)0x59, (byte)0x56, (byte)0x59,
+ (byte)0x57, (byte)0x59, (byte)0x58, (byte)0x59,
+ (byte)0x59, (byte)0x59, (byte)0x5a, (byte)0x59,
+ (byte)0x5b, (byte)0x59, (byte)0x5c, (byte)0x59,
+ (byte)0x5d, (byte)0x59, (byte)0x5e, (byte)0x59,
+ (byte)0x5f, (byte)0x59, (byte)0x60, (byte)0x59,
+ (byte)0x61, (byte)0x59, (byte)0x62, (byte)0x59,
+ (byte)0x63, (byte)0x59, (byte)0x64, (byte)0x59,
+ (byte)0x65, (byte)0x59, (byte)0x66, (byte)0x59,
+ (byte)0x67, (byte)0x59, (byte)0x68, (byte)0x59,
+ (byte)0x69, (byte)0x59, (byte)0x6a, (byte)0x59,
+ (byte)0x6b, (byte)0x59, (byte)0x6c, (byte)0x59,
+ (byte)0x6d, (byte)0x59, (byte)0x6e, (byte)0x59,
+ (byte)0x6f, (byte)0x59, (byte)0x70, (byte)0x59,
+ (byte)0x71, (byte)0x59, (byte)0x72, (byte)0x59,
+ (byte)0x73, (byte)0x59, (byte)0x74, (byte)0x59,
+ (byte)0x75, (byte)0x59, (byte)0x76, (byte)0x59,
+ (byte)0x77, (byte)0x59, (byte)0x78, (byte)0x59,
+ (byte)0x79, (byte)0x59, (byte)0x7a, (byte)0x59,
+ (byte)0x7b, (byte)0x59, (byte)0x7c, (byte)0x59,
+ (byte)0x7d, (byte)0x59, (byte)0x7e, (byte)0x5a,
+ (byte)0x21, (byte)0x5a, (byte)0x22, (byte)0x5a,
+ (byte)0x23, (byte)0x5a, (byte)0x24, (byte)0x5a,
+ (byte)0x25, (byte)0x5a, (byte)0x26, (byte)0x5a,
+ (byte)0x27, (byte)0x5a, (byte)0x28, (byte)0x5a,
+ (byte)0x29, (byte)0x5a, (byte)0x2a, (byte)0x5a,
+ (byte)0x2b, (byte)0x5a, (byte)0x2c, (byte)0x5a,
+ (byte)0x2d, (byte)0x5a, (byte)0x2e, (byte)0x5a,
+ (byte)0x2f, (byte)0x5a, (byte)0x30, (byte)0x5a,
+ (byte)0x31, (byte)0x5a, (byte)0x32, (byte)0x5a,
+ (byte)0x33, (byte)0x5a, (byte)0x34, (byte)0x5a,
+ (byte)0x35, (byte)0x5a, (byte)0x36, (byte)0x5a,
+ (byte)0x37, (byte)0x5a, (byte)0x38, (byte)0x5a,
+ (byte)0x39, (byte)0x5a, (byte)0x3a, (byte)0x5a,
+ (byte)0x3b, (byte)0x5a, (byte)0x3c, (byte)0x5a,
+ (byte)0x3d, (byte)0x5a, (byte)0x3e, (byte)0x5a,
+ (byte)0x3f, (byte)0x5a, (byte)0x40, (byte)0x5a,
+ (byte)0x41, (byte)0x5a, (byte)0x42, (byte)0x5b,
+ (byte)0x35, (byte)0x5b, (byte)0x36, (byte)0x5b,
+ (byte)0x37, (byte)0x5b, (byte)0x38, (byte)0x5b,
+ (byte)0x39, (byte)0x5b, (byte)0x3a, (byte)0x5b,
+ (byte)0x3b, (byte)0x5b, (byte)0x3c, (byte)0x5b,
+ (byte)0x3d, (byte)0x5b, (byte)0x3e, (byte)0x5b,
+ (byte)0x3f, (byte)0x5b, (byte)0x40, (byte)0x5b,
+ (byte)0x41, (byte)0x5b, (byte)0x42, (byte)0x5b,
+ (byte)0x43, (byte)0x5b, (byte)0x44, (byte)0x5b,
+ (byte)0x45, (byte)0x5b, (byte)0x46, (byte)0x5b,
+ (byte)0x47, (byte)0x5b, (byte)0x48, (byte)0x5b,
+ (byte)0x49, (byte)0x5b, (byte)0x4a, (byte)0x5b,
+ (byte)0x4b, (byte)0x5b, (byte)0x4c, (byte)0x5b,
+ (byte)0x4d, (byte)0x5b, (byte)0x4e, (byte)0x5b,
+ (byte)0x4f, (byte)0x5b, (byte)0x50, (byte)0x5b,
+ (byte)0x51, (byte)0x5b, (byte)0x52, (byte)0x5b,
+ (byte)0x53, (byte)0x5b, (byte)0x54, (byte)0x5b,
+ (byte)0x55, (byte)0x5b, (byte)0x56, (byte)0x5b,
+ (byte)0x57, (byte)0x5b, (byte)0x58, (byte)0x5b,
+ (byte)0x59, (byte)0x5b, (byte)0x5a, (byte)0x5b,
+ (byte)0x5b, (byte)0x5b, (byte)0x5c, (byte)0x5b,
+ (byte)0x5d, (byte)0x5b, (byte)0x5e, (byte)0x5b,
+ (byte)0x5f, (byte)0x5b, (byte)0x60, (byte)0x5b,
+ (byte)0x61, (byte)0x5b, (byte)0x62, (byte)0x5b,
+ (byte)0x63, (byte)0x5b, (byte)0x64, (byte)0x5b,
+ (byte)0x65, (byte)0x5b, (byte)0x66, (byte)0x5b,
+ (byte)0x67, (byte)0x5b, (byte)0x68, (byte)0x5b,
+ (byte)0x69, (byte)0x5b, (byte)0x6a, (byte)0x5b,
+ (byte)0x6b, (byte)0x5b, (byte)0x6c, (byte)0x5b,
+ (byte)0x6d, (byte)0x5b, (byte)0x6e, (byte)0x5b,
+ (byte)0x6f, (byte)0x5b, (byte)0x70, (byte)0x5b,
+ (byte)0x71, (byte)0x5b, (byte)0x72, (byte)0x5b,
+ (byte)0x73, (byte)0x5b, (byte)0x74, (byte)0x5b,
+ (byte)0x75, (byte)0x5b, (byte)0x76, (byte)0x5b,
+ (byte)0x77, (byte)0x5b, (byte)0x78, (byte)0x5b,
+ (byte)0x79, (byte)0x5b, (byte)0x7a, (byte)0x5b,
+ (byte)0x7b, (byte)0x5b, (byte)0x7c, (byte)0x5b,
+ (byte)0x7d, (byte)0x5b, (byte)0x7e, (byte)0x5c,
+ (byte)0x21, (byte)0x5c, (byte)0x22, (byte)0x5c,
+ (byte)0x23, (byte)0x5c, (byte)0x24, (byte)0x5c,
+ (byte)0x25, (byte)0x5c, (byte)0x26, (byte)0x5c,
+ (byte)0x27, (byte)0x5c, (byte)0x28, (byte)0x5c,
+ (byte)0x29, (byte)0x5c, (byte)0x2a, (byte)0x5c,
+ (byte)0x2b, (byte)0x5c, (byte)0x2c, (byte)0x5c,
+ (byte)0x2d, (byte)0x5c, (byte)0x2e, (byte)0x5c,
+ (byte)0x2f, (byte)0x5c, (byte)0x30, (byte)0x5c,
+ (byte)0x31, (byte)0x5c, (byte)0x32, (byte)0x5c,
+ (byte)0x33, (byte)0x5c, (byte)0x34, (byte)0x5c,
+ (byte)0x35, (byte)0x5c, (byte)0x36, (byte)0x5d,
+ (byte)0x79, (byte)0x5d, (byte)0x7a, (byte)0x5d,
+ (byte)0x7b, (byte)0x5d, (byte)0x7c, (byte)0x5d,
+ (byte)0x7d, (byte)0x5d, (byte)0x7e, (byte)0x5e,
+ (byte)0x21, (byte)0x5e, (byte)0x22, (byte)0x5e,
+ (byte)0x23, (byte)0x5e, (byte)0x24, (byte)0x5e,
+ (byte)0x25, (byte)0x5e, (byte)0x26, (byte)0x5e,
+ (byte)0x27, (byte)0x5e, (byte)0x28, (byte)0x5e,
+ (byte)0x29, (byte)0x5e, (byte)0x2a, (byte)0x5e,
+ (byte)0x2b, (byte)0x5e, (byte)0x2c, (byte)0x5e,
+ (byte)0x2d, (byte)0x5e, (byte)0x2e, (byte)0x5e,
+ (byte)0x2f, (byte)0x5e, (byte)0x30, (byte)0x5e,
+ (byte)0x31, (byte)0x5e, (byte)0x32, (byte)0x5e,
+ (byte)0x33, (byte)0x5e, (byte)0x34, (byte)0x5e,
+ (byte)0x35, (byte)0x5e, (byte)0x36, (byte)0x5e,
+ (byte)0x37, (byte)0x5e, (byte)0x38, (byte)0x5e,
+ (byte)0x39, (byte)0x5e, (byte)0x3a, (byte)0x5e,
+ (byte)0x3b, (byte)0x5e, (byte)0x3c, (byte)0x5e,
+ (byte)0x3d, (byte)0x5e, (byte)0x3e, (byte)0x5e,
+ (byte)0x3f, (byte)0x5e, (byte)0x40, (byte)0x5e,
+ (byte)0x41, (byte)0x5e, (byte)0x42, (byte)0x5e,
+ (byte)0x43, (byte)0x5e, (byte)0x44, (byte)0x5e,
+ (byte)0x45, (byte)0x5e, (byte)0x46, (byte)0x5e,
+ (byte)0x47, (byte)0x5e, (byte)0x48, (byte)0x5e,
+ (byte)0x49, (byte)0x5e, (byte)0x4a, (byte)0x60,
+ (byte)0x30, (byte)0x60, (byte)0x31, (byte)0x60,
+ (byte)0x32, (byte)0x60, (byte)0x33, (byte)0x60,
+ (byte)0x34, (byte)0x60, (byte)0x35, (byte)0x60,
+ (byte)0x36, (byte)0x60, (byte)0x37, (byte)0x60,
+ (byte)0x38, (byte)0x60, (byte)0x39, (byte)0x60,
+ (byte)0x3a, (byte)0x60, (byte)0x3b, (byte)0x60,
+ (byte)0x3c, (byte)0x60, (byte)0x3d, (byte)0x60,
+ (byte)0x3e, (byte)0x60, (byte)0x3f, (byte)0x73,
+ (byte)0x26, (byte)0x73, (byte)0x27, (byte)0x73,
+ (byte)0x28, (byte)0x73, (byte)0x29, (byte)0x73,
+ (byte)0x2a, (byte)0x73, (byte)0x2b, (byte)0x73,
+ (byte)0x2c, (byte)0x73, (byte)0x2d, (byte)0x73,
+ (byte)0x2e, (byte)0x73, (byte)0x2f, (byte)0x73,
+ (byte)0x30, (byte)0x73, (byte)0x31, (byte)0x73,
+ (byte)0x32, (byte)0x73, (byte)0x33, (byte)0x73,
+ (byte)0x34, (byte)0x73, (byte)0x35, (byte)0x73,
+ (byte)0x36, (byte)0x73, (byte)0x37, (byte)0x73,
+ (byte)0x38, (byte)0x73, (byte)0x39, (byte)0x73,
+ (byte)0x3a, (byte)0x73, (byte)0x3b, (byte)0x73,
+ (byte)0x3c, (byte)0x73, (byte)0x3d, (byte)0x73,
+ (byte)0x3e, (byte)0x73, (byte)0x3f, (byte)0x73,
+ (byte)0x40, (byte)0x73, (byte)0x41, (byte)0x73,
+ (byte)0x42, (byte)0x73, (byte)0x43, (byte)0x73,
+ (byte)0x44, (byte)0x73, (byte)0x45, (byte)0x73,
+ (byte)0x46, (byte)0x73, (byte)0x47, (byte)0x73,
+ (byte)0x48, (byte)0x73, (byte)0x49, (byte)0x73,
+ (byte)0x4a, (byte)0x73, (byte)0x4b, (byte)0x73,
+ (byte)0x4c, (byte)0x73, (byte)0x4d, (byte)0x73,
+ (byte)0x4e, (byte)0x73, (byte)0x4f, (byte)0x73,
+ (byte)0x50, (byte)0x73, (byte)0x51, (byte)0x73,
+ (byte)0x52, (byte)0x73, (byte)0x53, (byte)0x73,
+ (byte)0x54, (byte)0x73, (byte)0x55, (byte)0x73,
+ (byte)0x56, (byte)0x73, (byte)0x57, (byte)0x73,
+ (byte)0x58, (byte)0x73, (byte)0x59, (byte)0x73,
+ (byte)0x5a, (byte)0x73, (byte)0x5b, (byte)0x73,
+ (byte)0x5c, (byte)0x73, (byte)0x5d, (byte)0x73,
+ (byte)0x5e, (byte)0x73, (byte)0x5f, (byte)0x73,
+ (byte)0x60, (byte)0x73, (byte)0x61, (byte)0x73,
+ (byte)0x62, (byte)0x73, (byte)0x63, (byte)0x73,
+ (byte)0x64, (byte)0x73, (byte)0x65, (byte)0x73,
+ (byte)0x66, (byte)0x73, (byte)0x67, (byte)0x73,
+ (byte)0x68, (byte)0x73, (byte)0x69, (byte)0x73,
+ (byte)0x6a, (byte)0x73, (byte)0x6b, (byte)0x73,
+ (byte)0x6c, (byte)0x73, (byte)0x6d, (byte)0x73,
+ (byte)0x6e, (byte)0x73, (byte)0x6f, (byte)0x73,
+ (byte)0x70, (byte)0x73, (byte)0x71, (byte)0x73,
+ (byte)0x72, (byte)0x73, (byte)0x73, (byte)0x73,
+ (byte)0x74, (byte)0x73, (byte)0x75, (byte)0x73,
+ (byte)0x76, (byte)0x73, (byte)0x77, (byte)0x73,
+ (byte)0x78, (byte)0x73, (byte)0x79, (byte)0x73,
+ (byte)0x7a, (byte)0x73, (byte)0x7b, (byte)0x73,
+ (byte)0x7c, (byte)0x73, (byte)0x7d, (byte)0x73,
+ (byte)0x7e, (byte)0x74, (byte)0x21, (byte)0x74,
+ (byte)0x22, (byte)0x74, (byte)0x23, (byte)0x74,
+ (byte)0x24, (byte)0x74, (byte)0x25, (byte)0x74,
+ (byte)0x26
+ };
+
+ private static byte[] expectedBytes_JISX0201KATAKANA1 =
+ {
+ (byte)0x1b, (byte)0x28, (byte)0x49,
+ (byte)0x21, (byte)0x22, (byte)0x23, (byte)0x24,
+ (byte)0x25, (byte)0x26, (byte)0x27, (byte)0x28,
+ (byte)0x29, (byte)0x2a, (byte)0x2b, (byte)0x2c,
+ (byte)0x2d, (byte)0x2e, (byte)0x2f, (byte)0x30,
+ (byte)0x31, (byte)0x32, (byte)0x33, (byte)0x34,
+ (byte)0x35, (byte)0x36, (byte)0x37, (byte)0x38,
+ (byte)0x39, (byte)0x3a, (byte)0x3b, (byte)0x3c,
+ (byte)0x3d, (byte)0x3e, (byte)0x3f, (byte)0x40,
+ (byte)0x41, (byte)0x42, (byte)0x43, (byte)0x44,
+ (byte)0x45, (byte)0x46, (byte)0x47, (byte)0x48,
+ (byte)0x49, (byte)0x4a, (byte)0x4b, (byte)0x4c,
+ (byte)0x4d, (byte)0x4e, (byte)0x4f, (byte)0x50,
+ (byte)0x51, (byte)0x52, (byte)0x53, (byte)0x54,
+ (byte)0x55, (byte)0x56, (byte)0x57, (byte)0x58,
+ (byte)0x59, (byte)0x5a, (byte)0x5b, (byte)0x5c,
+ (byte)0x5d, (byte)0x5e, (byte)0x5f
+ };
+
+ private static byte[] expectedBytes_JISX0201KATAKANA2 =
+ {
+ (byte)0x1b, (byte)0x24, (byte)0x42,
+ (byte)0x21, (byte)0x23, (byte)0x21, (byte)0x56,
+ (byte)0x21, (byte)0x57, (byte)0x21, (byte)0x22,
+ (byte)0x21, (byte)0x26, (byte)0x25, (byte)0x72,
+ (byte)0x25, (byte)0x21, (byte)0x25, (byte)0x23,
+ (byte)0x25, (byte)0x25, (byte)0x25, (byte)0x27,
+ (byte)0x25, (byte)0x29, (byte)0x25, (byte)0x63,
+ (byte)0x25, (byte)0x65, (byte)0x25, (byte)0x67,
+ (byte)0x25, (byte)0x43, (byte)0x21, (byte)0x3c,
+ (byte)0x25, (byte)0x22, (byte)0x25, (byte)0x24,
+ (byte)0x25, (byte)0x26, (byte)0x25, (byte)0x28,
+ (byte)0x25, (byte)0x2a, (byte)0x25, (byte)0x2b,
+ (byte)0x25, (byte)0x2d, (byte)0x25, (byte)0x2f,
+ (byte)0x25, (byte)0x31, (byte)0x25, (byte)0x33,
+ (byte)0x25, (byte)0x35, (byte)0x25, (byte)0x37,
+ (byte)0x25, (byte)0x39, (byte)0x25, (byte)0x3b,
+ (byte)0x25, (byte)0x3d, (byte)0x25, (byte)0x3f,
+ (byte)0x25, (byte)0x41, (byte)0x25, (byte)0x44,
+ (byte)0x25, (byte)0x46, (byte)0x25, (byte)0x48,
+ (byte)0x25, (byte)0x4a, (byte)0x25, (byte)0x4b,
+ (byte)0x25, (byte)0x4c, (byte)0x25, (byte)0x4d,
+ (byte)0x25, (byte)0x4e, (byte)0x25, (byte)0x4f,
+ (byte)0x25, (byte)0x52, (byte)0x25, (byte)0x55,
+ (byte)0x25, (byte)0x58, (byte)0x25, (byte)0x5b,
+ (byte)0x25, (byte)0x5e, (byte)0x25, (byte)0x5f,
+ (byte)0x25, (byte)0x60, (byte)0x25, (byte)0x61,
+ (byte)0x25, (byte)0x62, (byte)0x25, (byte)0x64,
+ (byte)0x25, (byte)0x66, (byte)0x25, (byte)0x68,
+ (byte)0x25, (byte)0x69, (byte)0x25, (byte)0x6a,
+ (byte)0x25, (byte)0x6b, (byte)0x25, (byte)0x6c,
+ (byte)0x25, (byte)0x6d, (byte)0x25, (byte)0x6f,
+ (byte)0x25, (byte)0x73, (byte)0x21, (byte)0x2b,
+ (byte)0x21, (byte)0x2c,
+ (byte)0x1b, (byte)0x28, (byte)0x42
+ };
+
+ private static byte[] expectedBytes_JISX0208NECROW13 =
+ {
+ (byte)0x1b, (byte)0x24, (byte)0x42,
+ (byte)0x2d, (byte)0x21, (byte)0x2d, (byte)0x22,
+ (byte)0x2d, (byte)0x23, (byte)0x2d, (byte)0x24,
+ (byte)0x2d, (byte)0x25, (byte)0x2d, (byte)0x26,
+ (byte)0x2d, (byte)0x27, (byte)0x2d, (byte)0x28,
+ (byte)0x2d, (byte)0x29, (byte)0x2d, (byte)0x2a,
+ (byte)0x2d, (byte)0x2b, (byte)0x2d, (byte)0x2c,
+ (byte)0x2d, (byte)0x2d, (byte)0x2d, (byte)0x2e,
+ (byte)0x2d, (byte)0x2f, (byte)0x2d, (byte)0x30,
+ (byte)0x2d, (byte)0x31, (byte)0x2d, (byte)0x32,
+ (byte)0x2d, (byte)0x33, (byte)0x2d, (byte)0x34,
+ (byte)0x2d, (byte)0x35, (byte)0x2d, (byte)0x36,
+ (byte)0x2d, (byte)0x37, (byte)0x2d, (byte)0x38,
+ (byte)0x2d, (byte)0x39, (byte)0x2d, (byte)0x3a,
+ (byte)0x2d, (byte)0x3b, (byte)0x2d, (byte)0x3c,
+ (byte)0x2d, (byte)0x3d, (byte)0x2d, (byte)0x3e,
+ (byte)0x2d, (byte)0x40, (byte)0x2d, (byte)0x41,
+ (byte)0x2d, (byte)0x42, (byte)0x2d, (byte)0x43,
+ (byte)0x2d, (byte)0x44, (byte)0x2d, (byte)0x45,
+ (byte)0x2d, (byte)0x46, (byte)0x2d, (byte)0x47,
+ (byte)0x2d, (byte)0x48, (byte)0x2d, (byte)0x49,
+ (byte)0x2d, (byte)0x4a, (byte)0x2d, (byte)0x4b,
+ (byte)0x2d, (byte)0x4c, (byte)0x2d, (byte)0x4d,
+ (byte)0x2d, (byte)0x4e, (byte)0x2d, (byte)0x4f,
+ (byte)0x2d, (byte)0x50, (byte)0x2d, (byte)0x51,
+ (byte)0x2d, (byte)0x52, (byte)0x2d, (byte)0x53,
+ (byte)0x2d, (byte)0x54, (byte)0x2d, (byte)0x55,
+ (byte)0x2d, (byte)0x56, (byte)0x2d, (byte)0x5f,
+ (byte)0x2d, (byte)0x60, (byte)0x2d, (byte)0x61,
+ (byte)0x2d, (byte)0x62, (byte)0x2d, (byte)0x63,
+ (byte)0x2d, (byte)0x64, (byte)0x2d, (byte)0x65,
+ (byte)0x2d, (byte)0x66, (byte)0x2d, (byte)0x67,
+ (byte)0x2d, (byte)0x68, (byte)0x2d, (byte)0x69,
+ (byte)0x2d, (byte)0x6a, (byte)0x2d, (byte)0x6b,
+ (byte)0x2d, (byte)0x6c, (byte)0x2d, (byte)0x6d,
+ (byte)0x2d, (byte)0x6e, (byte)0x2d, (byte)0x6f,
+ (byte)0x2d, (byte)0x73, (byte)0x2d, (byte)0x74,
+ (byte)0x2d, (byte)0x78, (byte)0x2d, (byte)0x79,
+ (byte)0x1b, (byte)0x28, (byte)0x42
+ };
+
+
+ private static String MIXEDCONTENT =
+ "JA\u3000\u3002\u0062\uFF64PAN" +
+ "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" +
+ "\u30FB\uFF67\u203E";
+
+ static byte[] mixedBytesExpected = {
+ (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24,
+ (byte)0x42, (byte)0x21, (byte)0x21, (byte)0x21,
+ (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42,
+ (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49,
+ (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42,
+ (byte)0x50, (byte)0x41, (byte)0x4e, (byte)0x1b,
+ (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24,
+ (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28,
+ (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28,
+ (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b,
+ (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b,
+ (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b,
+ (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26,
+ (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27,
+ (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e,
+ (byte)0x1b, (byte)0x28, (byte)0x42 };
+
+ private static byte[] repeatingEscapes = {
+ (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24,
+ (byte)0x42, (byte)0x1b, (byte)0x24, (byte)0x42,
+ (byte)0x21, (byte)0x21, (byte)0x21,
+ (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42,
+ // embedded repeated iso-2022 escapes (see bugID 4879522)
+ (byte)0x1b, (byte)0x28, (byte)0x42,
+ (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49,
+ (byte)0x0f, (byte)0x0e, (byte)0x0f,
+ (byte)0x1b, (byte)0x28, (byte)0x49,
+ (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42,
+ (byte)0x50, (byte)0x41, (byte)0x4e,
+ // embedded shift chars (see bugID 4879522)
+ (byte)0x0e, (byte)0x0f,
+ (byte)0x1b,
+ (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24,
+ (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28,
+ (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28,
+ (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b,
+ (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b,
+ (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b,
+ (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26,
+ (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27,
+ (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e,
+ (byte)0x1b, (byte)0x28, (byte)0x42 };
+
+ private static String JISX0212 =
+ "\u02d8\u6896\ue757";
+
+ private static byte[] expectedBytes_JISX0212 = {
+ (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44,
+ (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f,
+ (byte)0x7e, (byte)0x7e,
+ (byte)0x1b, (byte)0x28, (byte)0x42
+ };
+
+ /*
+ * Tests the roundtrip integrity and expected encoding
+ * correctness for a String containing a substantial
+ * subset of MS5022X encodeable chars
+ */
+
+ private static void roundTrip(String name,
+ String testStr,
+ byte[] expectBytes)
+ throws Exception {
+ byte[] encodedBytes = testStr.getBytes(name);
+ if (encodedBytes.length != expectBytes.length) {
+ //System.out.printf("l1=%d, l2=%d\n",
+ // encodedBytes.length,expectBytes.length);
+ throw new Exception(name + " Encoder error");
+ }
+ for (int i = 0; i < expectBytes.length; i++) {
+
+ if (encodedBytes[i] != expectBytes[i]) {
+ //System.out.printf("--->");
+ //throw new Exception(name + " Encoder error");
+ }
+ //System.out.printf("%x, %x\n",
+ //encodedBytes[i],expectBytes[i]);
+ }
+ String decoded = new String(encodedBytes, name);
+ if (!decoded.equals(testStr)) {
+ throw new Exception(name + " Decoder error");
+ }
+ String decoded2 = new String(repeatingEscapes, name);
+ if (!decoded2.equals(MIXEDCONTENT)) {
+ throw new Exception(name + " Decoder error");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ String map = System.getProperty("sun.nio.cs.map");
+ if (map != null) {
+ map = map.toLowerCase(java.util.Locale.US);
+ Charset cs = Charset.forName("ISO-2022-JP");
+ if (map.indexOf("x-windows-50221/ISO-2022-jp") != -1 &&
+ !"x-windows-50220".equals(cs.name()) ||
+ map.indexOf("x-windows-50220/ISO-2022-jp") != -1 &&
+ !"x-windows-50220".equals(cs.name()) ||
+ map.indexOf("x-windows-iso2022jp/ISO-2022-jp") != -1 &&
+ !"x-windows-iso2022jp".equals(cs.name())) {
+ throw new Exception("Error: sun.nio.cs.map=" + map +
+ ", ISO-2022-JP=" + cs.name());
+ } else {
+ System.out.printf("ISO-2022-JP=%s\n", cs.name());
+ }
+ }
+
+ String testStr = US_ASCII +
+ JISX0208SUBSET +
+ JISX0201KATAKANA +
+ JISX0208NECROW13;
+
+ byte[] expectedBytes= (new String(expectedBytes_US_ASCII, "ASCII") +
+ new String(expectedBytes_JISX0208SUBSET, "ASCII") +
+ new String(expectedBytes_JISX0201KATAKANA1, "ASCII") +
+ new String(expectedBytes_JISX0208NECROW13, "ASCII")).
+ getBytes("ASCII");
+
+ //MS50221
+ roundTrip("MS50221", testStr, expectedBytes);
+ roundTrip("MS50221", JISX0212, expectedBytes_JISX0212);
+
+ //MS50220 without halfwidth kana
+ roundTrip("MS50220",
+ US_ASCII + JISX0208SUBSET + JISX0208NECROW13,
+ (new String(expectedBytes_US_ASCII, "ASCII") +
+ new String(expectedBytes_JISX0208SUBSET, "ASCII") +
+ new String(expectedBytes_JISX0208NECROW13,
+ 3,
+ expectedBytes_JISX0208NECROW13.length - 3,
+ "ASCII")).getBytes("ASCII"));
+ roundTrip("MS50220", JISX0212, expectedBytes_JISX0212);
+
+ // Try MS50220 with halfwidth kana encoding
+ byte[] encodedBytes = JISX0201KATAKANA.getBytes("MS50220");
+ if (encodedBytes.length != expectedBytes_JISX0201KATAKANA2.length) {
+ throw new Exception("MS50220 Encoder error");
+ }
+ for (int i = 0; i < expectedBytes_JISX0201KATAKANA2.length; i++) {
+ if (encodedBytes[i] != expectedBytes_JISX0201KATAKANA2[i]) {
+ throw new Exception("MS50220 Encoder error");
+ }
+ }
+
+ //x-windows-iso2022jp
+ testStr = testStr.replace('\u301E', '\u301D')
+ .replace('\u301C', '\uFF4E')
+ .replace('\u2016', '\u2225');
+ roundTrip("x-windows-iso2022jp",
+ testStr,
+ expectedBytes);
+
+ testStr = MIXEDCONTENT;
+ roundTrip("MS50221", testStr , mixedBytesExpected);
+
+ // Test for bugID 4913711
+ // ISO-2022-JP encoding of a single input char yields
+ // 8 output bytes. Prior to fix for 4913711 the
+ // max bytes per char value was underspecified as 5.0
+ // and the code below would have thrown a BufferOverflow
+ // exception. This test validates the fix for 4913711
+
+ testStr = "\u3042";
+ byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42,
+ (byte)0x24, (byte)0x22, (byte)0x1b,
+ (byte)0x28, (byte)0x42 };
+ byte[] encoded = testStr.getBytes("MS50221");
+ for (int i = 0; i < expected.length; i++) {
+ if (encoded[i] != expected[i])
+ throw new Exception("MS50221 Decoder error");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestMiscEUC_JP.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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 4121376
+ @summary Verify that EUC_JP 0x8FA2B7 maps to \uFF5E
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestMiscEUC_JP {
+
+ public static void main(String[] args) throws Exception
+ {
+ Charset cs = Charset.forName("EUC_JP");
+ CharsetDecoder dec = cs.newDecoder();
+ CharsetEncoder enc = cs.newEncoder();
+ byte[] euc = {(byte)0x8F, (byte)0xA2, (byte)0xB7};
+
+ CharBuffer cb = dec.decode(ByteBuffer.wrap(euc));
+ if (cb.charAt(0) != 0xFF5E) {
+ throw new Exception("Converted EUC_JP 0x8FA2B7 to: 0x"
+ + Integer.toHexString((int)cb.charAt(0)));
+ }
+ ByteBuffer bb = enc.encode(cb);
+
+ if (!((bb.limit() == 3)
+ && (bb.get() == euc[0])
+ && (bb.get() == euc[1])
+ && (bb.get() == euc[2]))) {
+ cb.flip();
+ bb.flip();
+ throw new Exception("Roundrip failed for char 0x"
+ + Integer.toHexString((int)cb.charAt(0)) + ": "
+ + Integer.toHexString(bb.limit()) + " 0x"
+ + Integer.toHexString((int)bb.get() & 0xff) + " "
+ + Integer.toHexString((int)bb.get() & 0xff) + " "
+ + Integer.toHexString((int)bb.get() & 0xff));
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestSJIS0213.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,116 @@
+/*
+ * 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 6529796 6710199
+ @summary Test SJIS/MS932_0213 charsets
+ */
+
+import java.util.Arrays;
+
+public class TestSJIS0213 {
+ private static String sjisStr = "\u2014\u301C\u2016\u2212\u00A2\u00A3\u00AC";
+ private static String winStr = "\u2015\uFF5E\u2225\uFF0D\uFFE0\uFFE1\uFFE2\u2252\u2261\u222B\u2211\u221A\u22A5\u2220\u2235\u2229\u222A";
+
+ private static String compStr = "\u304B\u309A\u304D\u309A\u304F\u309A\u3051\u309A\u3053\u309A\u30AB\u309A\u30AD\u309A\u30AF\u309A\u30B1\u309A\u30B3\u309A\u30BB\u309A\u30C4\u309A\u30C8\u309A\u31F7\u309A\u00E6\u0300\u0254\u0300\u0254\u0301\u028C\u0300\u028C\u0301\u0259\u0300\u0259\u0301\u025A\u0300\u025A\u0301\u02E9\u02E5\u02E5\u02E9";
+ private static byte[] compBytes = new byte[] {
+ (byte)0x82, (byte)0xf5,
+ (byte)0x82, (byte)0xf6,
+ (byte)0x82, (byte)0xf7,
+ (byte)0x82, (byte)0xf8,
+ (byte)0x82, (byte)0xf9,
+ (byte)0x83, (byte)0x97,
+ (byte)0x83, (byte)0x98,
+ (byte)0x83, (byte)0x99,
+ (byte)0x83, (byte)0x9a,
+ (byte)0x83, (byte)0x9b,
+ (byte)0x83, (byte)0x9c,
+ (byte)0x83, (byte)0x9d,
+ (byte)0x83, (byte)0x9e,
+ (byte)0x83, (byte)0xf6,
+ (byte)0x86, (byte)0x63,
+ (byte)0x86, (byte)0x67,
+ (byte)0x86, (byte)0x68,
+ (byte)0x86, (byte)0x69,
+ (byte)0x86, (byte)0x6a,
+ (byte)0x86, (byte)0x6b,
+ (byte)0x86, (byte)0x6c,
+ (byte)0x86, (byte)0x6d,
+ (byte)0x86, (byte)0x6e,
+ (byte)0x86, (byte)0x85,
+ (byte)0x86, (byte)0x86 };
+
+ private static String mixedStr = "\u002B\u0041\u007a\uff61\uff9f\u3000\u30a1\u4e00\u304B\u309A\u304b";
+ private static byte[] mixedBytes = new byte[] {
+ (byte)0x2b,
+ (byte)0x41, (byte)0x7a,
+ (byte)0xa1, (byte)0xdf,
+ (byte)0x81, (byte)0x40,
+ (byte)0x83, (byte)0x40,
+ (byte)0x88, (byte)0xea,
+ (byte)0x82, (byte)0xf5, // composite
+ (byte)0x82, (byte)0xa9 }; // base without cc
+
+ //base + base + cc
+ private static String mixedCompStr = "\u304D\u304B\u309A";
+ private static byte[] mixedCompBytes = new byte[] {
+ (byte)0x82, (byte)0xab, (byte)0x82, (byte)0xf5};
+
+ private static char[] unmappableChars = new char[] {
+ 0x80, 0xfffc, 0xfffd};
+
+ private static byte[] unmappableBytes = new byte[] {
+ 0x3f, 0x3f, 0x3f};
+
+ public static void main(String[] args) throws Exception {
+ if (!winStr.equals(new String(winStr.getBytes("MS932"), "MS932_0213")))
+ throw new RuntimeException("MS932_0213 failed on special codepoints!");
+
+ if (!(Arrays.equals(compStr.getBytes("MS932_0213"), compBytes)) ||
+ !compStr.equals(new String(compBytes, "MS932_0213")))
+ throw new RuntimeException("MS932_0213 failed on composites!");
+
+ if (!(Arrays.equals(mixedStr.getBytes("MS932_0213"), mixedBytes)) ||
+ !mixedStr.equals(new String(mixedBytes, "MS932_0213")))
+ throw new RuntimeException("MS932_0213 failed on mixed!");
+
+ if (!sjisStr.equals(new String(sjisStr.getBytes("SJIS"), "SJIS_0213")))
+ throw new RuntimeException("SJIS_0213 failed on special codepoints!");
+
+ if (!(Arrays.equals(compStr.getBytes("SJIS_0213"), compBytes)) ||
+ !compStr.equals(new String(compBytes, "SJIS_0213")))
+ throw new RuntimeException("SJIS_0213 failed on composites!");
+
+ if (!(Arrays.equals(mixedStr.getBytes("SJIS_0213"), mixedBytes)) ||
+ !mixedStr.equals(new String(mixedBytes, "SJIS_0213")))
+ throw new RuntimeException("SJIS_0213 failed on mixed!");
+
+ if (!(Arrays.equals(mixedCompStr.getBytes("SJIS_0213"), mixedCompBytes)) ||
+ !mixedCompStr.equals(new String(mixedCompBytes, "SJIS_0213")))
+ throw new RuntimeException("SJIS_0213 failed on mixedComp!");
+
+ if (!Arrays.equals(new String(unmappableChars).getBytes("SJIS_0213"), unmappableBytes) ||
+ !Arrays.equals(new String(unmappableChars).getBytes("MS932_0213"), unmappableBytes))
+ throw new RuntimeException("SJIS/MS932_0213 failed on unmappable encoding!");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java Wed Jul 05 16:38:48 2017 +0200
@@ -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 4697605 4741233
+ @summary Check decoder behaves correctly in ISO2022_JP
+ */
+
+import java.io.*;
+
+public class TestTrailingEscapesISO2022JP {
+
+ public static void main(String[] args) throws Exception {
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int len;
+
+ InputStream in =
+ new FileInputStream(new File(System.getProperty("test.src", "."),
+ "ISO2022JP.trailEsc"));
+ try {
+ byte[] b = new byte[4096];
+ while ( ( len = in.read( b, 0, b.length ) ) != -1 ) {
+ out.write(b, 0, len);
+ }
+ } finally {
+ in.close();
+ }
+
+ Reader inR = new InputStreamReader(new ByteArrayInputStream(
+ out.toByteArray()),
+ "iso-2022-jp");
+
+ try {
+ char[] c = new char[4096];
+ while ( ( len = inR.read( c, 0, c.length ) ) != -1 ) {
+ System.out.println(len);
+ if (len == 0)
+ throw new Exception("Read returned zero!");
+ }
+ } finally {
+ inR.close();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUTF8BOM.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,92 @@
+/*
+ * 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 4508058 6378911
+ @summary Check if UTF8 decoder handles BOM correctly
+ */
+
+import java.io.IOException;
+import java.nio.BufferOverflowException;
+import java.nio.*;
+import java.nio.charset.*;
+
+/* The fix for 6378911 is to backout the change we made for 4508058,
+ so this regtest is modified accordingly to leave the beginning
+ BOM untouched during decoding.
+ */
+public class TestUTF8BOM {
+ private static ByteBuffer bf = ByteBuffer.allocateDirect(1000);
+ private static void testDecode(String expected, byte[] input)
+ throws Exception
+ {
+ String out = new String(input, "utf8");
+ if (!out.equals(expected)) {
+ failureReport (out, expected);
+ throw new Exception("UTF_8 Decoding test failed");
+ }
+
+ //try directBuffer.
+ bf.clear();
+ bf.put(input).flip();
+ out = Charset.forName("UTF-8")
+ .decode(bf)
+ .toString();
+ if (!out.equals(expected)) {
+ failureReport (out, expected);
+ throw new Exception("UTF_8 Decoding test failed(directbuffer)");
+ }
+ }
+
+ private static void failureReport(String testStr,
+ String expected) {
+
+ System.err.println ("Expected Characters:");
+ for (int i = 0; i < expected.length() ; i++) {
+ System.out.println("expected char[" + i + "] : " +
+ Integer.toHexString((int)expected.charAt(i)) +
+ " obtained char[" + i + "] : " +
+ Integer.toHexString((int)testStr.charAt(i)));
+ }
+ }
+
+ public static void main (String[] args) throws Exception {
+ // Test 1: with BOM at beginning
+ testDecode("\ufeff\u0092\u0093",
+ new byte[] { (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
+ (byte) 0xc2, (byte) 0x92,
+ (byte) 0xc2, (byte) 0x93 });
+ // Test 2: with BOM at middle
+ testDecode("\u9200\ufeff\u9300",
+ new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
+ (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
+ (byte) 0xe9, (byte) 0x8c, (byte) 0x80 });
+
+ // Test 3: with BOM at end
+ testDecode("\u9200\u9300\ufeff",
+ new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
+ (byte) 0xe9, (byte) 0x8c, (byte) 0x80,
+ (byte) 0xef, (byte) 0xbb, (byte) 0xbf });
+ System.err.println ("\nPASSED UTF-8 decode BOM test");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUTF_16.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,196 @@
+/*
+ * 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 4403848 6348426 6407730
+ @summary Check correctness of the UTF-16 converter in all its flavors
+ */
+
+import java.io.IOException;
+import java.nio.BufferOverflowException;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestUTF_16 {
+
+ private static void testDecode(String charset,
+ String expected,
+ byte[] input)
+ throws Exception
+ {
+ String out = new String(input, charset);
+ if (!out.equals(expected)) {
+ failureReport (out, expected);
+ throw new Exception("UTF_16 Decoding test failed " + charset);
+ }
+ }
+
+ private static void testEncode(String charset,
+ String input,
+ byte[] expected)
+ throws Exception
+ {
+ byte[] testBytes = input.getBytes(charset);
+ for (int i = 0; i< expected.length; i++)
+ if (testBytes[i] != expected[i])
+ throw new Exception("UTF_16 Encoding test failed " + charset);
+
+ }
+
+ private static void warn(String s) {
+ System.err.println("FAILED Test 4403848 UTF-16" +
+ s) ;
+ }
+
+ private static void failureReport(String testStr,
+ String expected) {
+
+ System.err.println ("Expected Characters:");
+ for (int i = 0; i < expected.length() ; i++) {
+ warn("expected char[" + i + "] : " +
+ Integer.toHexString((int)expected.charAt(i)) +
+ "obtained char[" + i + "] : " +
+ Integer.toHexString((int)testStr.charAt(i)));
+ }
+ }
+
+ /*
+ private static void checkResult(char[] expected,
+ String testStr,
+ String testName)
+ throws Exception
+ {
+ if (testStr.length() != expected.length)
+ failureReport(testStr, expected);
+
+ for (int i = 0; i < testStr.length(); i++) {
+ if (testStr.charAt(i) != expected[i]) {
+ failureReport(testStr, expected);
+ throw new Exception ("REGTEST TestUTF16 failed: "
+ + testName);
+ }
+ }
+ System.err.println ("Test " + testName + " PASSED");
+ return;
+ }
+ */
+
+ private static void test() throws Exception {
+
+ // Tests: Check decoding of UTF-16.
+ // Ensures correct endian polarity
+ // of the decoders and appropriate
+ // interpretation of BOM bytes where
+ // they are required.
+
+ // Test 1: BigEndian UTF-16 Decoding
+
+ testDecode("UTF_16BE", "\u0092\u0093",
+ new byte[] { (byte) 0x00, (byte) 0x92,
+ (byte) 0x00, (byte) 0x93 });
+
+ // Test 1a: BigEndian UTF-16 Decoding. BOM bytes provided.
+ testDecode("UTF_16BE", "\ufeff\u0092\u0093",
+ new byte[] { (byte) 0xfe, (byte) 0xff,
+ (byte) 0x00, (byte) 0x92,
+ (byte) 0x00, (byte) 0x93 });
+
+ testDecode("UTF_16LE", "\u9200\u9300",
+ new byte[] { (byte) 0x00, (byte) 0x92,
+ (byte) 0x00, (byte) 0x93 });
+
+ // Test 2a: LittleEndian UTF-16 Decoding, BOM bytes provided.
+ testDecode("UTF_16LE", "\ufeff\u9200\u9300",
+ new byte[] { (byte) 0xff, (byte) 0xfe,
+ (byte) 0x00, (byte) 0x92,
+ (byte) 0x00, (byte) 0x93 });
+
+ // Test 3: UTF-16 (with mandatory byte order mark) Decoding
+
+ testDecode("UTF-16", "\u9200\u9300",
+ new byte[] { (byte) 0xfe, (byte) 0xff,
+ (byte) 0x92, (byte) 0x00,
+ (byte) 0x93, (byte) 0x00 });
+
+
+ // Test 3a: UTF-16 BOM omitted. This should decode OK.
+ testDecode("UTF-16", "\u9200\u9300",
+ new byte[] { (byte) 0x92, (byte) 0x00,
+ (byte) 0x93, (byte) 0x00 });
+
+
+ // Test 4: encoding using UTF-16
+ // BOM must be emitted when encoding and must be BigEndian.
+
+ testEncode("UTF-16", "\u0123",
+ new byte[] { (byte) 0xfe, (byte) 0xff,
+ (byte) 0x01, (byte) 0x23 });
+
+ // Test 5:
+ if (CoderResult.OVERFLOW !=
+ Charset.forName("UTF_16")
+ .newDecoder()
+ .decode((ByteBuffer)(ByteBuffer.allocate(4)
+ .put(new byte[]
+ {(byte)0xd8,(byte)0x00,
+ (byte)0xdc,(byte)0x01})
+ .flip()),
+ CharBuffer.allocate(1),
+ true)) {
+ throw new Exception ("REGTEST TestUTF16 Overflow test failed");
+ }
+
+ // Test 6: decoding using UTF_16LE_BOM/UnicodeLittle
+ // UnicodeLittle should accept non-BOM byte sequence
+
+ testDecode("UnicodeLittle", "Arial",
+ new byte[] { 'A', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0});
+
+ System.err.println ("\nPASSED UTF-16 encoder test");
+
+ // Reversed BOM in middle of stream Negative test.
+
+ /*
+ boolean caughtException = false;
+ try {
+ String out = new String(new byte[] {(byte)0x00,
+ (byte)0x92,
+ (byte)0xff,
+ (byte)0xfe},
+ "UTF-16");
+ } catch (IOException e) { caughtException = true; }
+
+ if (caughtException == false)
+ throw new Exception ("Incorrectly parsed BOM in middle of input");
+ */
+
+ // Fixed included with bug 4403848 fixes buffer sizing
+ // issue due to non provision of additional 2 bytes
+ // headroom for initial BOM bytes for UTF-16 encoding.
+ System.err.println ("OVERALL PASS OF UTF-16 Test");
+ }
+
+ public static void main (String[] args) throws Exception {
+ test();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUTF_32.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,197 @@
+/*
+ * 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.
+ */
+
+/*
+ @bug 6346419
+ @summary Check correctness of the UTF-32 and its variant charsets
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestUTF_32 {
+ private static void testDecode(String charset,
+ String expected,
+ byte[] input)
+ throws Exception
+ {
+ String out = new String(input, charset);
+ if (!out.equals(expected)) {
+ failureReport (out, expected);
+ throw new Exception("UTF_32 Decoding test failed: " + charset);
+ }
+ }
+
+ private static void testEncode(String charset,
+ String input,
+ byte[] expected)
+ throws Exception
+ {
+ byte[] testBytes = input.getBytes(charset);
+ for (int i = 0; i< expected.length; i++)
+ if (testBytes[i] != expected[i])
+ throw new Exception("UTF_32 Encoding test failed: [" + i + "]"+ charset);
+
+ }
+
+ private static void warn(String s) {
+ System.err.println("FAILED Test UTF-32:" +
+ s) ;
+ }
+
+ private static void failureReport(String testStr,
+ String expected) {
+ System.err.println ("Expected Characters:");
+ for (int i = 0; i < expected.length() ; i++) {
+ warn("expected char[" + i + "] : " +
+ Integer.toHexString((int)expected.charAt(i)) +
+ "obtained char[" + i + "] : " +
+ Integer.toHexString((int)testStr.charAt(i)));
+ }
+ }
+
+ private static void writeInt(OutputStream os, int i, boolean isBig)
+ throws Exception
+ {
+ if (isBig) {
+ os.write((i>>24) & 0xff);
+ os.write((i>>16) & 0xff);
+ os.write((i>>8) & 0xff);
+ os.write(i & 0xff);
+ } else {
+ os.write(i & 0xff);
+ os.write((i>>8) & 0xff);
+ os.write((i>>16) & 0xff);
+ os.write((i>>24) & 0xff);
+ }
+ }
+
+ private static byte[] getBytes(boolean doBOM, boolean isBig)
+ throws Exception
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(1024*1024);
+ if (doBOM)
+ writeInt(baos, 0xfeff, isBig);
+
+ for (int i = 0; i < 0xffff; i++) {
+ if (i < Character.MIN_SURROGATE ||
+ i > Character.MAX_SURROGATE)
+ writeInt(baos, i, isBig);
+ }
+ for (int i = 0x10000; i < 0x1ffff; i++) {
+ writeInt(baos, i, isBig);
+ }
+
+ for (int i = 0x100000; i < 0x10ffff; i++) {
+ writeInt(baos, i, isBig);
+ }
+ byte[] bb = baos.toByteArray();
+ baos.close();
+ return bb;
+ }
+
+ public static void main (String[] args) throws Exception {
+ byte[] bb;
+ String s;
+
+ // Test 1: UTF_32 BigEndian
+ bb = getBytes(false, true);
+ s = new String(bb, "UTF-32");
+ testDecode("UTF_32", s, bb);
+ testEncode("UTF_32", s, bb);
+
+ // Test 2: UTF_32 LittleEndian Decoding With BOM and
+ // BigEndian Encoding
+ bb = getBytes(true, false);
+ s = new String(bb, "UTF-32");
+ bb = getBytes(false, true);
+ testDecode("UTF_32", s, bb);
+ testEncode("UTF_32", s, bb);
+
+
+ // Test 3: UTF_32BE
+ bb = getBytes(false, true);
+ s = new String(bb, "UTF-32BE");
+ testDecode("UTF_32BE", s, bb);
+ testEncode("UTF_32BE", s, bb);
+
+
+ // Test 4: UTF_32LE
+ bb = getBytes(false, false);
+ s = new String(bb, "UTF-32LE");
+ testDecode("UTF_32LE", s, bb);
+ testEncode("UTF_32LE", s, bb);
+
+ // Test 5: UTF_32BE_BOM
+ bb = getBytes(true, true);
+ s = new String(bb, "UTF-32BE-BOM");
+ testDecode("UTF_32BE_BOM", s, bb);
+ testEncode("UTF_32BE_BOM", s, bb);
+
+
+ // Test 6: UTF_32LE_BOM
+ bb = getBytes(true, false);
+ s = new String(bb, "UTF-32LE-BOM");
+ testDecode("UTF_32LE_BOM", s, bb);
+ testEncode("UTF_32LE_BOM", s, bb);
+
+ s = "\u4e00\ufffd\u4e01";
+ // Test 7: BigEndian with reverse BOM in middle
+ bb = new byte[] {
+ (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x00,
+ (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x01
+ };
+ if (!s.equals(new String(bb, "UTF_32")) ||
+ !s.equals(new String(bb, "UTF_32BE")) ||
+ !s.equals(new String(bb, "UTF_32BE_BOM")))
+ throw new Exception("UTF_32 Decoding test failed: ");
+
+ // Test 7: LittleEndian with reverse BOM in middle
+ bb = new byte[] {
+ (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x4e,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0xfe,(byte)0xff,
+ (byte)0x01,(byte)0x4e,(byte)0x00,(byte)0x00
+ };
+ if (!s.equals(new String(bb, "UTF_32")) ||
+ !s.equals(new String(bb, "UTF_32LE")) ||
+ !s.equals(new String(bb, "UTF_32LE_BOM")))
+ throw new Exception("UTF_32 Decoding test failed: ");
+
+ // Test 8: Overflow
+ if (CoderResult.OVERFLOW !=
+ Charset.forName("UTF_32")
+ .newDecoder()
+ .decode((ByteBuffer)(ByteBuffer.allocate(4)
+ .put(new byte[]
+ {(byte)0,(byte)1, (byte)0,(byte)01})
+ .flip()),
+ CharBuffer.allocate(1),
+ true)) {
+ throw new Exception ("Test UTF-32 Overflow test failed");
+ }
+ System.err.println ("OVERALL PASS OF UTF-32 Test");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUni2HKSCS.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,327 @@
+/*
+ * 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 4634811
+ @summary Check Unicode 2.1 --> Big5-HKSCS reverse compatible mappings
+ */
+
+/*
+ * Mappings sourced from www.info.gov.hk/digital21/eng/hkscs
+ */
+
+public class TestUni2HKSCS {
+ private static final String uni21String =
+ "\uF3F5\uF3F8\uF3FD\uF403\uF413\uF415\uF418\uF419\uF41A"+
+ "\uF424\uF426\uF428\uF42B\uF42C\uF42D\uF437\uF439"+
+ "\uF43A\uF43C\uF445\uF44A\uF44E\uF44F\uF464\uF468"+
+ "\uF46A\uF46B\uF473\uF47A\uF487\uF489\uF493\uF494"+
+ "\uF496\uF49D\uF4A2\uF4AB\uF4AC\uF4AE\uF4B5\uF4C6"+
+ "\uF4CB\uF4D6\uF4E1\uF4FA\uF502\uF504\uF51E\uF529"+
+ "\uF52D\uF52E\uF530\uF536\uF540\uF544\uF554\uF637"+
+ "\uF638\uF63B\uF63C\uF641\uF642\uF643\uF644\uF648"+
+ "\uF64C\uF651\uF653\uF658\uF65D\uF65F\uF662\uF664"+
+ "\uF666\uF669\uF66C\uF66D\uF66E\uF675\uF677\uF67C"+
+ "\uF67E\uF688\uF68D\uF69D\uF6A1\uF6A2\uF6A5\uF6A7"+
+ "\uF6AE\uF6AF\uE316\uE326\uE32A\uE33C\uE351\uE35E"+
+ "\uE368\uE376\uE378\uE387\uE39C\uE3AD\uE3B3\uE3BE"+
+ "\uE3C2\uE3C7\uE3CB\uE3D1\uE3D2\uE3DE\uE3E2\uE3E4"+
+ "\uE3E8\uE3EA\uE3F5\uE3F7\uE406\uE40E\uE427\uE437"+
+ "\uE43D\uE449\uE44F\uE460\uE46B\uE47A\uE493\uE4A0"+
+ "\uE4A5\uE4A9\uE4B2\uE4BE\uE4BF\uE4C0\uE4DE\uE4E3"+
+ "\uE4E5\uE4ED\uE4F7\uE500\uE507\uE50E\uE534\uE539"+
+ "\uE53A\uE53B\uE53D\uE541\uE553\uE569\uE574\uE578"+
+ "\uE57B\uE57F\uE591\uE596\uE597\uE598\uE59C\uE5AE"+
+ "\uE5B9\uE5BC\uE5E0\uE5EC\uE5F5\uE5FA\uE5FE\uE60C"+
+ "\uE61D\uE629\uE62D\uE639\uE63B\uE63D\uE651\uE664"+
+ "\uE675\uE681\uE682\uE68D\uE694\uE69D\uE6A0\uE6A4"+
+ "\uE6A9\uE6AB\uE6B6\uE6C8\uE6E2\uE6E3\uE6E8\uE6ED"+
+ "\uE6EF\uE6F1\uE6F4\uE6F8\uE6FD\uE6FE\uE700\uE712"+
+ "\uE716\uE719\uE726\uE72E\uE730\uE738\uE73A\uE73B"+
+ "\uE749\uE74C\uE760\uE776\uE77E\uE780\uE78F\uE7AA"+
+ "\uE7AC\uE7AD\uE7AE\uE7C0\uE7C1\uE7C7\uE7CB\uE7D0"+
+ "\uE7D5\uE7D9\uE7E6\uE7EA\uE7F0\uE7F6\uE7FA\uE806"+
+ "\uE815\uE81B\uE81D\uE822\uE824\uE82E\uE831\uE832"+
+ "\uE83D\uE83F\uE850\uE853\uE85F\uE86B\uE86D\uE876"+
+ "\uE880\uE88E\uE899\uE89B\uE89C\uE8B3\uE8B7\uE8BC"+
+ "\uE8D2\uE8E2\uE8E4\uE8EC\uE8EE\uE8F4\uE8F6\uE8F7"+
+ "\uE8F9\uE8FA\uE8FD\uE901\uE906\uE90B\uE90E\uE90F"+
+ "\uE910\uE911\uE912\uE915\uE91B\uE931\uE932\uE946"+
+ "\uE949\uE965\uE96C\uE979\uE98D\uE994\uE996\uE99C"+
+ "\uE99D\uE99E\uE99F\uE9A1\uE9A2\uE9A7\uE9AA\uE9AC"+
+ "\uE9AE\uE9B5\uE9B7\uE9B9\uE9BA\uE9BC\uE9BD\uE9C5"+
+ "\uE9CF\uE9D0\uE9D6\uE9D8\uE9DB\uE9DE\uE9E5\uE9E6"+
+ "\uE9E9\uE9EB\uE9F7\uE9FE\uEA03\uEA0A\uEA0B\uEA0F"+
+ "\uEA13\uEA15\uEA1B\uEA21\uEA2A\uEA31\uEA35\uEA3C"+
+ "\uEA3D\uEA4C\uEA4F\uEA57\uEA63\uEA66\uEA75\uEA76"+
+ "\uEA7D\uEA82\uEA85\uEA87\uEA89\uEA8D\uEA90\uEA9B"+
+ "\uEA9D\uEAA6\uEAA8\uEAC8\uEAF7\uEB17\uEB51\uEB52"+
+ "\uEB60\uEB66\uEB6A\uEB87\uEB8B\uEB92\uEB96\uEBB1"+
+ "\uEBC3\uEBD6\uEBE0\uEBE6\uEBEA\uEBFF\uEC00\uEC03"+
+ "\uEC0B\uEC0D\uEC16\uEC3D\uEC4A\uEC4D\uEC53\uEC55"+
+ "\uEC61\uEC77\uEC7C\uEC7F\uEC87\uEC8C\uEC8F\uEC97"+
+ "\uECAE\uECB0\uECD0\uECD5\uECF4\uED05\uED1B\uED1F"+
+ "\uED23\uED33\uED37\uED38\uED3A\uED44\uED48\uED4C"+
+ "\uED59\uED5C\uED5D\uED5E\uED64\uED66\uED6D\uED6F"+
+ "\uED7B\uEDAE\uEDC1\uEDF3\uEDF5\uEE2E\uEE43\uEE45"+
+ "\uEE4A\uEE53\uEE59\uEE65\uEE89\uEE93\uEE97\uEE9F"+
+ "\uEEB2\uF6DD\uF820\uF821\uF822\uF823\uF824\uF825"+
+ "\uF826\uF827\uF828\uF829\uF82A\uF82B\uF82C\uF82D"+
+ "\uF82E\uF82F\uF830\uF831\uF832\uF833\uF834\uF835"+
+ "\uF836\uF837\uF838\uF839\uF83A\uF83B\uE005\uE008"+
+ "\uE028\uE02B\uE043\uE06A\uE06B\uE06E\uE07E\uE086"+
+ "\uE098\uE09B\uE0A0\uE0A8\uE0BB\uE0C2\uE0CD\uE0D7"+
+ "\uE0DA\uE0F1\uE0F4\uE0FA\uE0FC\uE104\uE105\uE10E"+
+ "\uE117\uE125\uE12A\uE12B\uE13C\uE143\uE144\uE153"+
+ "\uE15E\uE15F\uE160\uE164\uE17E\uE18C\uE19A\uE19C"+
+ "\uE1A7\uE1A9\uE1C6\uE1CF\uE1E0\uE1E1\uE1E3\uE1E7"+
+ "\uE1EA\uE1F4\uE1F8\uE203\uE211\uE217\uE218\uE239"+
+ "\uE23F\uE243\uE246\uE25D\uE25E\uE281\uE28A\uE298"+
+ "\uE2A2\uE2AC\uE2B1\uE2C8\uE2D7\uE30D";
+
+ private static final byte[] expectedBytes =
+ {(byte)0x89,(byte)0xb7,(byte)0x89,(byte)0xba,(byte)0x89,
+ (byte)0xbf,(byte)0x89,(byte)0xc5,(byte)0x89,(byte)0xd5,
+ (byte)0x89,(byte)0xd7,(byte)0x89,(byte)0xda,(byte)0x89,
+ (byte)0xdb,(byte)0x89,(byte)0xdc,(byte)0x89,(byte)0xe6,
+ (byte)0x89,(byte)0xe8,(byte)0x89,(byte)0xea,(byte)0x89,
+ (byte)0xed,(byte)0x89,(byte)0xee,(byte)0x89,(byte)0xef,
+ (byte)0x89,(byte)0xf9,(byte)0x89,(byte)0xfb,(byte)0x89,
+ (byte)0xfc,(byte)0x89,(byte)0xfe,(byte)0x8a,(byte)0x48,
+ (byte)0x8a,(byte)0x4d,(byte)0x8a,(byte)0x51,(byte)0x8a,
+ (byte)0x52,(byte)0x8a,(byte)0x67,(byte)0x8a,(byte)0x6b,
+ (byte)0x8a,(byte)0x6d,(byte)0x8a,(byte)0x6e,(byte)0x8a,
+ (byte)0x76,(byte)0x8a,(byte)0x7d,(byte)0x8a,(byte)0xac,
+ (byte)0x8a,(byte)0xae,(byte)0x8a,(byte)0xb8,(byte)0x8a,
+ (byte)0xb9,(byte)0x8a,(byte)0xbb,(byte)0x8a,(byte)0xc2,
+ (byte)0x8a,(byte)0xc7,(byte)0x8a,(byte)0xd0,(byte)0x8a,
+ (byte)0xd1,(byte)0x8a,(byte)0xd3,(byte)0x8a,(byte)0xda,
+ (byte)0x8a,(byte)0xeb,(byte)0x8a,(byte)0xf0,(byte)0x8a,
+ (byte)0xfb,(byte)0x8b,(byte)0x47,(byte)0x8b,(byte)0x60,
+ (byte)0x8b,(byte)0x68,(byte)0x8b,(byte)0x6a,(byte)0x8b,
+ (byte)0xa6,(byte)0x8b,(byte)0xb1,(byte)0x8b,(byte)0xb5,
+ (byte)0x8b,(byte)0xb6,(byte)0x8b,(byte)0xb8,(byte)0x8b,
+ (byte)0xbe,(byte)0x8b,(byte)0xc8,(byte)0x8b,(byte)0xcc,
+ (byte)0x8b,(byte)0xdc,(byte)0x8d,(byte)0x63,(byte)0x8d,
+ (byte)0x64,(byte)0x8d,(byte)0x67,(byte)0x8d,(byte)0x68,
+ (byte)0x8d,(byte)0x6d,(byte)0x8d,(byte)0x6e,(byte)0x8d,
+ (byte)0x6f,(byte)0x8d,(byte)0x70,(byte)0x8d,(byte)0x74,
+ (byte)0x8d,(byte)0x78,(byte)0x8d,(byte)0x7d,(byte)0x8d,
+ (byte)0xa1,(byte)0x8d,(byte)0xa6,(byte)0x8d,(byte)0xab,
+ (byte)0x8d,(byte)0xad,(byte)0x8d,(byte)0xb0,(byte)0x8d,
+ (byte)0xb2,(byte)0x8d,(byte)0xb4,(byte)0x8d,(byte)0xb7,
+ (byte)0x8d,(byte)0xba,(byte)0x8d,(byte)0xbb,(byte)0x8d,
+ (byte)0xbc,(byte)0x8d,(byte)0xc3,(byte)0x8d,(byte)0xc5,
+ (byte)0x8d,(byte)0xca,(byte)0x8d,(byte)0xcc,(byte)0x8d,
+ (byte)0xd6,(byte)0x8d,(byte)0xdb,(byte)0x8d,(byte)0xeb,
+ (byte)0x8d,(byte)0xef,(byte)0x8d,(byte)0xf0,(byte)0x8d,
+ (byte)0xf3,(byte)0x8d,(byte)0xf5,(byte)0x8d,(byte)0xfc,
+ (byte)0x8d,(byte)0xfd,(byte)0x8e,(byte)0x45,(byte)0x8e,
+ (byte)0x55,(byte)0x8e,(byte)0x59,(byte)0x8e,(byte)0x6b,
+ (byte)0x8e,(byte)0xa2,(byte)0x8e,(byte)0xaf,(byte)0x8e,
+ (byte)0xb9,(byte)0x8e,(byte)0xc7,(byte)0x8e,(byte)0xc9,
+ (byte)0x8e,(byte)0xd8,(byte)0x8e,(byte)0xed,(byte)0x8e,
+ (byte)0xfe,(byte)0x8f,(byte)0x45,(byte)0x8f,(byte)0x50,
+ (byte)0x8f,(byte)0x54,(byte)0x8f,(byte)0x59,(byte)0x8f,
+ (byte)0x5d,(byte)0x8f,(byte)0x63,(byte)0x8f,(byte)0x64,
+ (byte)0x8f,(byte)0x70,(byte)0x8f,(byte)0x74,(byte)0x8f,
+ (byte)0x76,(byte)0x8f,(byte)0x7a,(byte)0x8f,(byte)0x7c,
+ (byte)0x8f,(byte)0xa9,(byte)0x8f,(byte)0xab,(byte)0x8f,
+ (byte)0xba,(byte)0x8f,(byte)0xc2,(byte)0x8f,(byte)0xdb,
+ (byte)0x8f,(byte)0xeb,(byte)0x8f,(byte)0xf1,(byte)0x8f,
+ (byte)0xfd,(byte)0x90,(byte)0x44,(byte)0x90,(byte)0x55,
+ (byte)0x90,(byte)0x60,(byte)0x90,(byte)0x6f,(byte)0x90,
+ (byte)0xaa,(byte)0x90,(byte)0xb7,(byte)0x90,(byte)0xbc,
+ (byte)0x90,(byte)0xc0,(byte)0x90,(byte)0xc9,(byte)0x90,
+ (byte)0xd5,(byte)0x90,(byte)0xd6,(byte)0x90,(byte)0xd7,
+ (byte)0x90,(byte)0xf5,(byte)0x90,(byte)0xfa,(byte)0x90,
+ (byte)0xfc,(byte)0x91,(byte)0x45,(byte)0x91,(byte)0x4f,
+ (byte)0x91,(byte)0x58,(byte)0x91,(byte)0x5f,(byte)0x91,
+ (byte)0x66,(byte)0x91,(byte)0xae,(byte)0x91,(byte)0xb3,
+ (byte)0x91,(byte)0xb4,(byte)0x91,(byte)0xb5,(byte)0x91,
+ (byte)0xb7,(byte)0x91,(byte)0xbb,(byte)0x91,(byte)0xcd,
+ (byte)0x91,(byte)0xe3,(byte)0x91,(byte)0xee,(byte)0x91,
+ (byte)0xf2,(byte)0x91,(byte)0xf5,(byte)0x91,(byte)0xf9,
+ (byte)0x92,(byte)0x4c,(byte)0x92,(byte)0x51,(byte)0x92,
+ (byte)0x52,(byte)0x92,(byte)0x53,(byte)0x92,(byte)0x57,
+ (byte)0x92,(byte)0x69,(byte)0x92,(byte)0x74,(byte)0x92,
+ (byte)0x77,(byte)0x92,(byte)0xbd,(byte)0x92,(byte)0xc9,
+ (byte)0x92,(byte)0xd2,(byte)0x92,(byte)0xd7,(byte)0x92,
+ (byte)0xdb,(byte)0x92,(byte)0xe9,(byte)0x92,(byte)0xfa,
+ (byte)0x93,(byte)0x47,(byte)0x93,(byte)0x4b,(byte)0x93,
+ (byte)0x57,(byte)0x93,(byte)0x59,(byte)0x93,(byte)0x5b,
+ (byte)0x93,(byte)0x6f,(byte)0x93,(byte)0xa4,(byte)0x93,
+ (byte)0xb5,(byte)0x93,(byte)0xc1,(byte)0x93,(byte)0xc2,
+ (byte)0x93,(byte)0xcd,(byte)0x93,(byte)0xd4,(byte)0x93,
+ (byte)0xdd,(byte)0x93,(byte)0xe0,(byte)0x93,(byte)0xe4,
+ (byte)0x93,(byte)0xe9,(byte)0x93,(byte)0xeb,(byte)0x93,
+ (byte)0xf6,(byte)0x94,(byte)0x49,(byte)0x94,(byte)0x63,
+ (byte)0x94,(byte)0x64,(byte)0x94,(byte)0x69,(byte)0x94,
+ (byte)0x6e,(byte)0x94,(byte)0x70,(byte)0x94,(byte)0x72,
+ (byte)0x94,(byte)0x75,(byte)0x94,(byte)0x79,(byte)0x94,
+ (byte)0x7e,(byte)0x94,(byte)0xa1,(byte)0x94,(byte)0xa3,
+ (byte)0x94,(byte)0xb5,(byte)0x94,(byte)0xb9,(byte)0x94,
+ (byte)0xbc,(byte)0x94,(byte)0xc9,(byte)0x94,(byte)0xd1,
+ (byte)0x94,(byte)0xd3,(byte)0x94,(byte)0xdb,(byte)0x94,
+ (byte)0xdd,(byte)0x94,(byte)0xde,(byte)0x94,(byte)0xec,
+ (byte)0x94,(byte)0xef,(byte)0x95,(byte)0x44,(byte)0x95,
+ (byte)0x5a,(byte)0x95,(byte)0x62,(byte)0x95,(byte)0x64,
+ (byte)0x95,(byte)0x73,(byte)0x95,(byte)0xb0,(byte)0x95,
+ (byte)0xb2,(byte)0x95,(byte)0xb3,(byte)0x95,(byte)0xb4,
+ (byte)0x95,(byte)0xc6,(byte)0x95,(byte)0xc7,(byte)0x95,
+ (byte)0xcd,(byte)0x95,(byte)0xd1,(byte)0x95,(byte)0xd6,
+ (byte)0x95,(byte)0xdb,(byte)0x95,(byte)0xdf,(byte)0x95,
+ (byte)0xec,(byte)0x95,(byte)0xf0,(byte)0x95,(byte)0xf6,
+ (byte)0x95,(byte)0xfc,(byte)0x96,(byte)0x41,(byte)0x96,
+ (byte)0x4d,(byte)0x96,(byte)0x5c,(byte)0x96,(byte)0x62,
+ (byte)0x96,(byte)0x64,(byte)0x96,(byte)0x69,(byte)0x96,
+ (byte)0x6b,(byte)0x96,(byte)0x75,(byte)0x96,(byte)0x78,
+ (byte)0x96,(byte)0x79,(byte)0x96,(byte)0xa6,(byte)0x96,
+ (byte)0xa8,(byte)0x96,(byte)0xb9,(byte)0x96,(byte)0xbc,
+ (byte)0x96,(byte)0xc8,(byte)0x96,(byte)0xd4,(byte)0x96,
+ (byte)0xd6,(byte)0x96,(byte)0xdf,(byte)0x96,(byte)0xe9,
+ (byte)0x96,(byte)0xf7,(byte)0x97,(byte)0x43,(byte)0x97,
+ (byte)0x45,(byte)0x97,(byte)0x46,(byte)0x97,(byte)0x5d,
+ (byte)0x97,(byte)0x61,(byte)0x97,(byte)0x66,(byte)0x97,
+ (byte)0x7c,(byte)0x97,(byte)0xae,(byte)0x97,(byte)0xb0,
+ (byte)0x97,(byte)0xb8,(byte)0x97,(byte)0xba,(byte)0x97,
+ (byte)0xc0,(byte)0x97,(byte)0xc2,(byte)0x97,(byte)0xc3,
+ (byte)0x97,(byte)0xc5,(byte)0x97,(byte)0xc6,(byte)0x97,
+ (byte)0xc9,(byte)0x97,(byte)0xcd,(byte)0x97,(byte)0xd2,
+ (byte)0x97,(byte)0xd7,(byte)0x97,(byte)0xda,(byte)0x97,
+ (byte)0xdb,(byte)0x97,(byte)0xdc,(byte)0x97,(byte)0xdd,
+ (byte)0x97,(byte)0xde,(byte)0x97,(byte)0xe1,(byte)0x97,
+ (byte)0xe7,(byte)0x97,(byte)0xfd,(byte)0x97,(byte)0xfe,
+ (byte)0x98,(byte)0x53,(byte)0x98,(byte)0x56,(byte)0x98,
+ (byte)0x72,(byte)0x98,(byte)0x79,(byte)0x98,(byte)0xa8,
+ (byte)0x98,(byte)0xbc,(byte)0x98,(byte)0xc3,(byte)0x98,
+ (byte)0xc5,(byte)0x98,(byte)0xcb,(byte)0x98,(byte)0xcc,
+ (byte)0x98,(byte)0xcd,(byte)0x98,(byte)0xce,(byte)0x98,
+ (byte)0xd0,(byte)0x98,(byte)0xd1,(byte)0x98,(byte)0xd6,
+ (byte)0x98,(byte)0xd9,(byte)0x98,(byte)0xdb,(byte)0x98,
+ (byte)0xdd,(byte)0x98,(byte)0xe4,(byte)0x98,(byte)0xe6,
+ (byte)0x98,(byte)0xe8,(byte)0x98,(byte)0xe9,(byte)0x98,
+ (byte)0xeb,(byte)0x98,(byte)0xec,(byte)0x98,(byte)0xf4,
+ (byte)0x98,(byte)0xfe,(byte)0x99,(byte)0x40,(byte)0x99,
+ (byte)0x46,(byte)0x99,(byte)0x48,(byte)0x99,(byte)0x4b,
+ (byte)0x99,(byte)0x4e,(byte)0x99,(byte)0x55,(byte)0x99,
+ (byte)0x56,(byte)0x99,(byte)0x59,(byte)0x99,(byte)0x5b,
+ (byte)0x99,(byte)0x67,(byte)0x99,(byte)0x6e,(byte)0x99,
+ (byte)0x73,(byte)0x99,(byte)0x7a,(byte)0x99,(byte)0x7b,
+ (byte)0x99,(byte)0xa1,(byte)0x99,(byte)0xa5,(byte)0x99,
+ (byte)0xa7,(byte)0x99,(byte)0xad,(byte)0x99,(byte)0xb3,
+ (byte)0x99,(byte)0xbc,(byte)0x99,(byte)0xc3,(byte)0x99,
+ (byte)0xc7,(byte)0x99,(byte)0xce,(byte)0x99,(byte)0xcf,
+ (byte)0x99,(byte)0xde,(byte)0x99,(byte)0xe1,(byte)0x99,
+ (byte)0xe9,(byte)0x99,(byte)0xf5,(byte)0x99,(byte)0xf8,
+ (byte)0x9a,(byte)0x48,(byte)0x9a,(byte)0x49,(byte)0x9a,
+ (byte)0x50,(byte)0x9a,(byte)0x55,(byte)0x9a,(byte)0x58,
+ (byte)0x9a,(byte)0x5a,(byte)0x9a,(byte)0x5c,(byte)0x9a,
+ (byte)0x60,(byte)0x9a,(byte)0x63,(byte)0x9a,(byte)0x6e,
+ (byte)0x9a,(byte)0x70,(byte)0x9a,(byte)0x79,(byte)0x9a,
+ (byte)0x7b,(byte)0x9a,(byte)0xbd,(byte)0x9a,(byte)0xec,
+ (byte)0x9b,(byte)0x4d,(byte)0x9b,(byte)0xa9,(byte)0x9b,
+ (byte)0xaa,(byte)0x9b,(byte)0xb8,(byte)0x9b,(byte)0xbe,
+ (byte)0x9b,(byte)0xc2,(byte)0x9b,(byte)0xdf,(byte)0x9b,
+ (byte)0xe3,(byte)0x9b,(byte)0xea,(byte)0x9b,(byte)0xee,
+ (byte)0x9c,(byte)0x4a,(byte)0x9c,(byte)0x5c,(byte)0x9c,
+ (byte)0x6f,(byte)0x9c,(byte)0x79,(byte)0x9c,(byte)0xa1,
+ (byte)0x9c,(byte)0xa5,(byte)0x9c,(byte)0xba,(byte)0x9c,
+ (byte)0xbb,(byte)0x9c,(byte)0xbe,(byte)0x9c,(byte)0xc6,
+ (byte)0x9c,(byte)0xc8,(byte)0x9c,(byte)0xd1,(byte)0x9c,
+ (byte)0xf8,(byte)0x9d,(byte)0x46,(byte)0x9d,(byte)0x49,
+ (byte)0x9d,(byte)0x4f,(byte)0x9d,(byte)0x51,(byte)0x9d,
+ (byte)0x5d,(byte)0x9d,(byte)0x73,(byte)0x9d,(byte)0x78,
+ (byte)0x9d,(byte)0x7b,(byte)0x9d,(byte)0xa5,(byte)0x9d,
+ (byte)0xaa,(byte)0x9d,(byte)0xad,(byte)0x9d,(byte)0xb5,
+ (byte)0x9d,(byte)0xcc,(byte)0x9d,(byte)0xce,(byte)0x9d,
+ (byte)0xee,(byte)0x9d,(byte)0xf3,(byte)0x9e,(byte)0x53,
+ (byte)0x9e,(byte)0x64,(byte)0x9e,(byte)0x7a,(byte)0x9e,
+ (byte)0x7e,(byte)0x9e,(byte)0xa4,(byte)0x9e,(byte)0xb4,
+ (byte)0x9e,(byte)0xb8,(byte)0x9e,(byte)0xb9,(byte)0x9e,
+ (byte)0xbb,(byte)0x9e,(byte)0xc5,(byte)0x9e,(byte)0xc9,
+ (byte)0x9e,(byte)0xcd,(byte)0x9e,(byte)0xda,(byte)0x9e,
+ (byte)0xdd,(byte)0x9e,(byte)0xde,(byte)0x9e,(byte)0xdf,
+ (byte)0x9e,(byte)0xe5,(byte)0x9e,(byte)0xe7,(byte)0x9e,
+ (byte)0xee,(byte)0x9e,(byte)0xf0,(byte)0x9e,(byte)0xfc,
+ (byte)0x9f,(byte)0x70,(byte)0x9f,(byte)0xa5,(byte)0x9f,
+ (byte)0xd7,(byte)0x9f,(byte)0xd9,(byte)0xa0,(byte)0x53,
+ (byte)0xa0,(byte)0x68,(byte)0xa0,(byte)0x6a,(byte)0xa0,
+ (byte)0x6f,(byte)0xa0,(byte)0x78,(byte)0xa0,(byte)0x7e,
+ (byte)0xa0,(byte)0xac,(byte)0xa0,(byte)0xd0,(byte)0xa0,
+ (byte)0xda,(byte)0xa0,(byte)0xde,(byte)0xa0,(byte)0xe6,
+ (byte)0xa0,(byte)0xf9,(byte)0xc6,(byte)0xcd,(byte)0xc8,
+ (byte)0xd6,(byte)0xc8,(byte)0xd7,(byte)0xc8,(byte)0xd8,
+ (byte)0xc8,(byte)0xd9,(byte)0xc8,(byte)0xda,(byte)0xc8,
+ (byte)0xdb,(byte)0xc8,(byte)0xdc,(byte)0xc8,(byte)0xdd,
+ (byte)0xc8,(byte)0xde,(byte)0xc8,(byte)0xdf,(byte)0xc8,
+ (byte)0xe0,(byte)0xc8,(byte)0xe1,(byte)0xc8,(byte)0xe2,
+ (byte)0xc8,(byte)0xe3,(byte)0xc8,(byte)0xe4,(byte)0xc8,
+ (byte)0xe5,(byte)0xc8,(byte)0xe6,(byte)0xc8,(byte)0xe7,
+ (byte)0xc8,(byte)0xe8,(byte)0xc8,(byte)0xe9,(byte)0xc8,
+ (byte)0xea,(byte)0xc8,(byte)0xeb,(byte)0xc8,(byte)0xec,
+ (byte)0xc8,(byte)0xed,(byte)0xc8,(byte)0xee,(byte)0xc8,
+ (byte)0xef,(byte)0xc8,(byte)0xf0,(byte)0xc8,(byte)0xf1,
+ (byte)0xfa,(byte)0x45,(byte)0xfa,(byte)0x48,(byte)0xfa,
+ (byte)0x68,(byte)0xfa,(byte)0x6b,(byte)0xfa,(byte)0xa5,
+ (byte)0xfa,(byte)0xcc,(byte)0xfa,(byte)0xcd,(byte)0xfa,
+ (byte)0xd0,(byte)0xfa,(byte)0xe0,(byte)0xfa,(byte)0xe8,
+ (byte)0xfa,(byte)0xfa,(byte)0xfa,(byte)0xfd,(byte)0xfb,
+ (byte)0x43,(byte)0xfb,(byte)0x4b,(byte)0xfb,(byte)0x5e,
+ (byte)0xfb,(byte)0x65,(byte)0xfb,(byte)0x70,(byte)0xfb,
+ (byte)0x7a,(byte)0xfb,(byte)0x7d,(byte)0xfb,(byte)0xb6,
+ (byte)0xfb,(byte)0xb9,(byte)0xfb,(byte)0xbf,(byte)0xfb,
+ (byte)0xc1,(byte)0xfb,(byte)0xc9,(byte)0xfb,(byte)0xca,
+ (byte)0xfb,(byte)0xd3,(byte)0xfb,(byte)0xdc,(byte)0xfb,
+ (byte)0xea,(byte)0xfb,(byte)0xef,(byte)0xfb,(byte)0xf0,
+ (byte)0xfc,(byte)0x42,(byte)0xfc,(byte)0x49,(byte)0xfc,
+ (byte)0x4a,(byte)0xfc,(byte)0x59,(byte)0xfc,(byte)0x64,
+ (byte)0xfc,(byte)0x65,(byte)0xfc,(byte)0x66,(byte)0xfc,
+ (byte)0x6a,(byte)0xfc,(byte)0xa6,(byte)0xfc,(byte)0xb4,
+ (byte)0xfc,(byte)0xc2,(byte)0xfc,(byte)0xc4,(byte)0xfc,
+ (byte)0xcf,(byte)0xfc,(byte)0xd1,(byte)0xfc,(byte)0xee,
+ (byte)0xfc,(byte)0xf7,(byte)0xfd,(byte)0x49,(byte)0xfd,
+ (byte)0x4a,(byte)0xfd,(byte)0x4c,(byte)0xfd,(byte)0x50,
+ (byte)0xfd,(byte)0x53,(byte)0xfd,(byte)0x5d,(byte)0xfd,
+ (byte)0x61,(byte)0xfd,(byte)0x6c,(byte)0xfd,(byte)0x7a,
+ (byte)0xfd,(byte)0xa2,(byte)0xfd,(byte)0xa3,(byte)0xfd,
+ (byte)0xc4,(byte)0xfd,(byte)0xca,(byte)0xfd,(byte)0xce,
+ (byte)0xfd,(byte)0xd1,(byte)0xfd,(byte)0xe8,(byte)0xfd,
+ (byte)0xe9,(byte)0xfe,(byte)0x4d,(byte)0xfe,(byte)0x56,
+ (byte)0xfe,(byte)0x64,(byte)0xfe,(byte)0x6e,(byte)0xfe,
+ (byte)0x78,(byte)0xfe,(byte)0x7d,(byte)0xfe,(byte)0xb6,
+ (byte)0xfe,(byte)0xc5,(byte)0xfe,(byte)0xfb };
+
+ public static void main(String[] args) throws Exception {
+ byte[] encodedBytes = new byte[1000];
+
+ encodedBytes = uni21String.getBytes("Big5-HKSCS");
+
+ for (int i = 0; i < encodedBytes.length - 1; i++) {
+ if (encodedBytes[i] != expectedBytes[i]
+ || encodedBytes[i+1] != expectedBytes[i+1]) {
+ throw new Exception("Unexpected char->byte HKSCS mappings");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestX11JIS0201.java Wed Jul 05 16:38:48 2017 +0200
@@ -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.
+ *
+ * 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 4195325
+ * @summary name() should return "X11JIS0201"
+ *
+ */
+
+import java.nio.charset.*;
+
+public class TestX11JIS0201 {
+
+ public static void main(String args[])
+ throws Exception
+ {
+ test();
+ }
+
+ private static void test()
+ throws Exception
+ {
+ Class cl = null;
+ try {
+ cl = Class.forName("sun.awt.motif.X11JIS0201");
+ } catch (Exception e){
+ return;
+ }
+ Charset cs = (Charset)cl.newInstance();
+ if (! cs.name().equals("X11JIS0201")){
+ throw new Exception("X11JIS0201 does not work correctly");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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 4890726
+ @summary Check the correctness of KOI8_U by comparing to KOI8_R
+ */
+
+import java.util.*;
+import static java.lang.Character.UnicodeBlock;
+
+public class UkrainianIsNotRussian {
+ private static String decode(byte[] bytes, String encoding) throws Throwable {
+ String s = new String(bytes, encoding);
+ equal(s.length(), 1);
+ check(Arrays.equals(s.getBytes(encoding), bytes));
+ return s;
+ }
+
+ private static void realMain(String[] args) throws Throwable {
+ final byte[] bytes = new byte[1];
+ int differences = 0;
+ for (int i = 0; i < 0xff; i++) {
+ bytes[0] = (byte) i;
+ final String r = decode(bytes, "KOI8_R");
+ final String u = decode(bytes, "KOI8_U");
+ if (! r.equals(u)) {
+ differences++;
+ final char rc = r.charAt(0);
+ final char uc = u.charAt(0);
+ final UnicodeBlock rcb = UnicodeBlock.of(rc);
+ final UnicodeBlock ucb = UnicodeBlock.of(uc);
+ System.out.printf("%02x => %04x %s, %04x %s%n",
+ i, (int) rc, rcb, (int) uc, ucb);
+ check(rcb == UnicodeBlock.BOX_DRAWING &&
+ ucb == UnicodeBlock.CYRILLIC);
+ }
+ }
+ equal(differences, 8);
+ }
+
+ //--------------------- 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 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");}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java Wed Jul 05 16:38:48 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * 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 4522270
+ @summary Ensure that a zeroed byte array produces a valid String when EUC-TW decoded
+
+ */
+
+public class ZeroedByteArrayEUCTWTest
+{
+ public static void main(String[] args) throws Exception {
+ test("cns11643");
+ }
+
+ public static void test(String encoding) throws Exception {
+ String result = null;
+ byte[] data = new byte[16];
+
+ for (int i = 0; i < 16; i++) {
+ data[i] = 0;
+ }
+
+ result = new String(data, encoding);
+ if (result.length() != 16)
+ throw new Exception ("EUC_TW regression test bugID 4522270 failed");
+
+ for (int i=0; i < 16; i++) {
+ data[i] = (byte)( 32 + i);
+ }
+ }
+}
--- a/make/jprt.config Thu Jul 03 11:01:30 2008 -0700
+++ b/make/jprt.config Wed Jul 05 16:38:48 2017 +0200
@@ -142,9 +142,15 @@
solaris_arch=i386
fi
- # Get the SS11 compilers into path (make sure it matches ALT setting)
- compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/SS11/bin
- compiler_name=SS11
+ # Get the compilers into path (make sure it matches ALT setting)
+ if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then
+ compiler_name=${JPRT_SOLARIS_COMPILER_NAME}
+ else
+ # FIXUP: Change to SS12 when validated
+ #compiler_name=SS12
+ compiler_name=SS11
+ fi
+ compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/${compiler_name}/bin
ALT_COMPILER_PATH="${compiler_path}"
export ALT_COMPILER_PATH
dirMustExist "${compiler_path}" ALT_COMPILER_PATH