changeset 1801:62a4cf863cbf

Merge
author asaha
date Fri, 22 Dec 2017 13:00:55 -0800
parents fbb7c1e76e59 f6b6ad6feb6e
children 9f3f9fa285b9
files .hgtags
diffstat 9 files changed, 403 insertions(+), 109 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Tue Oct 24 13:15:08 2017 -0700
+++ b/.hgtags	Fri Dec 22 13:00:55 2017 -0800
@@ -701,6 +701,8 @@
 30f83ac389f06c38dc0b6f71b1d8344c01436a16 jdk8u112-b15
 8ef3cc2bbc7dc687e9502ae957337b1ded1b32d4 jdk8u112-b16
 7d4291146927c3430652a07f506d530c2eff7eb9 jdk8u112-b31
+46db19bfd51b4039cff4dae563c3b5d3f70d64da jdk8u112-b32
+d52e17760c1dafa4fa17ec388aeaaf8fcacb444b jdk8u112-b33
 3a25f8a752524bad7e78800158c485b890be3982 jdk8u121-b00
 1ebd97292358cd158b6f7d5884526207fbfe796e jdk8u121-b01
 349d130d7a7f2bcaaed8dd2696030022eb4e7b75 jdk8u121-b02
@@ -715,6 +717,12 @@
 acbfa2934b2411dd20aacb42d1c8dd198fe9f8e9 jdk8u121-b11
 cc9a5d631b77582d52aceaf6d6066e99533d1756 jdk8u121-b12
 386e9b79fcf5bfad5ff7b0fc991a7c6c5cbfed17 jdk8u121-b13
+61eb6e79aabe13253306d6e614a21619dacfa2cc jdk8u121-b31
+d28f2fc91487a86a7deffe71e38179067807c60b jdk8u121-b32
+58f874750c2823443a8712f3728e6aa91d45bb5b jdk8u121-b33
+3f0f5fc9e9a8c487dee66d7b300e265a10fd1355 jdk8u121-b34
+345b15579d5e3563e818d95ff9c47cabea1c5771 jdk8u121-b35
+1c16b68906a0bf305f1e23072bfd6cb3f3fc84be jdk8u121-b36
 e30c16839f2225d2fff653088636dafcb812cd4d jdk8u131-b00
 464cf9d3b00291fcf879ceca1b66bc7588093c47 jdk8u131-b01
 1656050026687c96900eed3b415d0ca1a0dc55b3 jdk8u131-b02
@@ -727,6 +735,10 @@
 c5fd9c3a2eb12d366d59195dbea54c60db2a1df3 jdk8u131-b09
 de3c63a8b2e52d47554c999a65dbcec7f6d9c1be jdk8u131-b10
 2b88cb53e31fb637d7c37cc3414bb3eb3e9d1f0d jdk8u131-b11
+4db7f76e9f3266c8ba5c801996b27009bb17b335 jdk8u131-b31
+d81babb8888496371bb80757f2650dec9ff95175 jdk8u131-b32
+6184f10981e7a321b52c13c609bb41f289d85270 jdk8u131-b33
+2cb574e6eca33fad6858dcfc9c6c7b45a112e965 jdk8u131-b34
 7056e474d6e3b7b3bac76bc35f8c4c321bf9abe9 jdk8u141-b00
 0f825574a7c8742494810d1f29193bfc3f1d370c jdk8u141-b01
 66d2dbe82668e425317ec0c421f5384399b220c9 jdk8u141-b02
@@ -745,6 +757,14 @@
 4f242f33e89a7900f2fcdcd9402058b6d01f340c jdk8u141-b15
 77461a27d91fcb53106e6b3234468bff4d0eec9e jdk8u144-b00
 0d5d2e29f93b01ffa4998c2e3a61d2e6eaa96b1b jdk8u144-b01
+e03501807899791ff7888884bcf47eb39be594bb jdk8u141-b31
+1bbe5d997ab4e030dd961ab78e11ddae1bc6786c jdk8u141-b32
+77461a27d91fcb53106e6b3234468bff4d0eec9e jdk8u144-b00
+0d5d2e29f93b01ffa4998c2e3a61d2e6eaa96b1b jdk8u144-b01
+d3a4dd903475fd77fae2f6f87deb9219f455dcff jdk8u144-b31
+5d81bcd53ba0d79ab2843891759b31e4ef497fad jdk8u144-b32
+b7f3faccefc33fc76d7c5c1c4d4cf6c85d0dad61 jdk8u144-b33
+ecfa8b7c2c1f71a3f9240ad0c6a5e3f7104a9cce jdk8u144-b34
 2dbdceff6ade82aa9942cdea6b62d5655d65183c jdk8u151-b00
 4449c73dbfdf2e32889e3ce769bd4160daa48b71 jdk8u151-b01
 ffa099d5b88ff14cea677d2afa4229354e9404d0 jdk8u151-b02
@@ -785,8 +805,58 @@
 2b4802994bf5a4a634258c9ff06d3da474130f8b jdk8u152-b14
 f89071fbde60b327d6940a34fcdeed96b6440dd2 jdk8u152-b15
 674aecf3d87ae774e2026a1cb2a60eaa651bc7c2 jdk8u152-b16
+2dbdceff6ade82aa9942cdea6b62d5655d65183c jdk8u151-b00
+4449c73dbfdf2e32889e3ce769bd4160daa48b71 jdk8u151-b01
+ffa099d5b88ff14cea677d2afa4229354e9404d0 jdk8u151-b02
+a6814326f989837019ff7dd0d9b0e57065499bc5 jdk8u151-b03
+cefb3694f8565e1f23ff3231fd21523f52161a95 jdk8u151-b04
+8977426affc02fdf74b1163865059ec86ddccb61 jdk8u151-b05
+3289ad7e88f3aa38fdaa4910e9eeed5e1e5430b1 jdk8u151-b06
+58d0ffe75dc5597310d422e214dc077476bd2338 jdk8u122-b00
+a87b06da783bb5a11f7857220789979129e39e7c jdk8u122-b01
+8684348ae5eb6f895d19e4752dea567642dbcec4 jdk8u122-b02
+117a593d021502529821afbd7e0d695c170449f8 jdk8u122-b03
+117a593d021502529821afbd7e0d695c170449f8 jdk8u122-b03
+0000000000000000000000000000000000000000 jdk8u122-b03
+0000000000000000000000000000000000000000 jdk8u122-b03
+f8661a76fe475b1d7653493e407086830fde81f8 jdk8u122-b03
+7bd4195b17aa0a268eee4bc4b89f30ed3b096898 jdk8u122-b04
+f86d6064d7cfa022425c3df03d4335511ab33ecb jdk8u132-b00
+ea3d3c26102dcb82d9b140f729308395310dae7a jdk8u152-b00
+1819d008129b31df8c74b5d16e9daabc2bdcc10c jdk8u152-b01
+06f411ed0014d88050d9bd1e74c208a9fa3cfb6e jdk8u152-b02
+d36e9c6f195c5604626f7c836c17826960ca2a11 jdk8u152-b03
+4f94cc55256028ab54390abe212959c241b0670f jdk8u152-b04
+2917e61cfadab474625d19fb7775ccdec5584738 jdk8u152-b05
+bc6e4d3f7a20c34dcdccc1be17792188ccdcb917 jdk8u152-b06
+87992ac3484c6c2ae5cad4ad14701a03a9ec963c jdk8u152-b07
+1f7bbfb8b2632ac610c3a0d7d944ff0a3967469a jdk8u152-b08
+a9e83644bd11b5da49bb4424eed9c5a34003085c jdk8u152-b09
+2dbdceff6ade82aa9942cdea6b62d5655d65183c jdk8u151-b00
+aed470d361fe9b3a6714e6c9942923c188dcc050 jdk8u161-b00
+968a7e1a6e6c5e79237b796e562f149214e2ae9b jdk8u161-b01
+bb767c7211eace9df83649ba937d2ce507223e4d jdk8u161-b02
+b50b596df2a1b4ad86e73d0d309c27c7ba1ad0c0 jdk8u161-b03
+ea5791706d0992acb1f74129128ba5f60dcfff6e jdk8u161-b04
+897b749544e9803038c9696e145959bdc9eb5008 jdk8u161-b05
+bbdd5e2c46e87bafe419a82309ddbb1ffc8f6215 jdk8u161-b06
+b1a36f62733a920e04d9eed825264dbe12d91ef4 jdk8u161-b07
+49b9defc1bfc0507f87e05bba4de4d8b3cca1996 jdk8u161-b08
+2b03640b61bda0a4d8e89c57d919bf1742aeeb8f jdk8u161-b09
+1a3e06fc462b39d065e9fc78191cc6d8a9c33fc0 jdk8u161-b10
+104006ed6c31ed1fe46cbee9d665e0dbc6bcac13 jdk8u161-b11
+b49016a1d704c25d6e66f3d6eb614b70f8a931eb jdk8u161-b12
 1160ad38fc7495c01c25421ae89689232481eb6b jdk8u162-b00
 86b1cd17fde74427ac4b9312cc56bafc57b32fb4 jdk8u162-b01
 1b40ae740b78de002d4096feee0407a4ce0e1608 jdk8u162-b02
 b28af4ff80a964defc89cc9c7084f8f6e82a52ba jdk8u162-b03
+8cfa77f0651d850cfd3c8e8eea8272d6ccefa86f jdk8u162-b04
+6f3097ab2b1bfc00f8efc895369faf2228422526 jdk8u162-b05
+59f9887ee15eefabe300dedf835abd1c0aec40df jdk8u162-b06
+5066fa48df81b06eeffebc10e13308b68cd59e89 jdk8u162-b07
+7279642d20886178bd18a713a309619e3298935c jdk8u162-b08
+59171db1d423142a596dcde1f353d4277f016b98 jdk8u162-b09
+2c68567bdcf2bb465d38c9783c0886df98fc496e jdk8u162-b10
+6029daad75bf459b330fc79ebf208dc35dc682d5 jdk8u162-b11
+ace99846c1fd92e8bec4cbe912ec3fc8a74fbf0c jdk8u162-b12
 72dbc8d63308f5b04b9fd3e06d139d673f992212 jdk8u172-b00
--- a/THIRD_PARTY_README	Tue Oct 24 13:15:08 2017 -0700
+++ b/THIRD_PARTY_README	Fri Dec 22 13:00:55 2017 -0800
@@ -7,7 +7,7 @@
 
 --- begin of LICENSE ---
 
-Copyright (c) 2000-2011 France Télécom
+Copyright (c) 2000-2011 France T??l??com
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -849,7 +849,7 @@
 --- begin of LICENSE ---
 
 Copyright notice
-Copyright © 2011 Ecma International
+Copyright ?? 2011 Ecma International
 Ecma International
 Rue du Rhone 114
 CH-1204 Geneva
@@ -916,7 +916,7 @@
 
 --- begin of LICENSE ---
 
-Copyright © 2001,2003 Keith Packard
+Copyright ?? 2001,2003 Keith Packard
 
 Permission to use, copy, modify, distribute, and sell this software and its
 documentation for any purpose is hereby granted without fee, provided that the
@@ -2212,16 +2212,16 @@
 Unicode Terms of Use
 
 For the general privacy policy governing access to this site, see the Unicode
-Privacy Policy. For trademark usage, see the Unicode® Consortium Name and
+Privacy Policy. For trademark usage, see the Unicode?? Consortium Name and
 Trademark Usage Policy.
 
 A. Unicode Copyright.
-   1. Copyright © 1991-2013 Unicode, Inc. All rights reserved.
+   1. Copyright ?? 1991-2013 Unicode, Inc. All rights reserved.
 
    2. Certain documents and files on this website contain a legend indicating
       that "Modification is permitted." Any person is hereby authorized,
       without fee, to modify such documents and files to create derivative
-      works conforming to the Unicode® Standard, subject to Terms and
+      works conforming to the Unicode?? Standard, subject to Terms and
       Conditions herein.
 
     3. Any person is hereby authorized, without fee, to view, use, reproduce,
@@ -2287,14 +2287,14 @@
 
 E.Trademarks & Logos.
    1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode,
-      Inc.  “The Unicode Consortium” and “Unicode, Inc.” are trade names of
+      Inc.  ???The Unicode Consortium??? and ???Unicode, Inc.??? are trade names of
       Unicode, Inc.  Use of the information and materials found on this
-      website indicates your acknowledgement of Unicode, Inc.’s exclusive
+      website indicates your acknowledgement of Unicode, Inc.???s exclusive
       worldwide rights in the Unicode Word Mark, the Unicode Logo, and the
       Unicode trade names.
 
-   2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark
-      Policy”) are incorporated herein by reference and you agree to abide by
+   2. The Unicode Consortium Name and Trademark Usage Policy (???Trademark
+      Policy???) are incorporated herein by reference and you agree to abide by
       the provisions of the Trademark Policy, which may be changed from time
       to time in the sole discretion of Unicode, Inc.
 
@@ -2317,12 +2317,12 @@
 
    2. Modification by Unicode.  Unicode shall have the right to modify this
       Agreement at any time by posting it to this site. The user may not
-      assign any part of this Agreement without Unicode’s prior written
+      assign any part of this Agreement without Unicode???s prior written
       consent.
 
    3. Taxes. The user agrees to pay any taxes arising from access to this
       website or use of the information herein, except for those based on
-      Unicode’s net income.
+      Unicode???s net income.
 
    4. Severability.  If any provision of this Agreement is declared invalid or
       unenforceable, the remaining provisions of this Agreement shall remain
@@ -2351,7 +2351,7 @@
 
 COPYRIGHT AND PERMISSION NOTICE
 
-Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under the
+Copyright ?? 1991-2012 Unicode, Inc. All rights reserved. Distributed under the
 Terms of Use in http://www.unicode.org/copyright.html.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
--- a/src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerWriteGrow.java	Tue Oct 24 13:15:08 2017 -0700
+++ b/src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerWriteGrow.java	Fri Dec 22 13:00:55 2017 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,11 +26,13 @@
 package com.sun.corba.se.impl.encoding;
 
 import com.sun.corba.se.impl.orbutil.ORBConstants;
+import com.sun.corba.se.impl.orbutil.ORBUtility;
 import com.sun.corba.se.impl.encoding.ByteBufferWithInfo;
 import com.sun.corba.se.impl.encoding.BufferManagerWrite;
 import com.sun.corba.se.pept.encoding.OutputObject;
 import com.sun.corba.se.pept.transport.Connection;
 import com.sun.corba.se.spi.orb.ORB;
+import com.sun.corba.se.spi.orb.ORBData;
 
 public class BufferManagerWriteGrow extends BufferManagerWrite
 {
@@ -48,7 +50,20 @@
      * buffer manager as set in the ORB.
      */
     public int getBufferSize() {
-        return orb.getORBData().getGIOPBufferSize();
+        ORBData orbData = null;
+        int bufferSize = ORBConstants.GIOP_DEFAULT_BUFFER_SIZE;
+        if (orb != null) {
+            orbData = orb.getORBData();
+            if (orbData != null) {
+                bufferSize = orbData.getGIOPBufferSize();
+                dprint("BufferManagerWriteGrow.getBufferSize: bufferSize == " + bufferSize);
+            } else {
+                dprint("BufferManagerWriteGrow.getBufferSize: orbData reference is NULL");
+            }
+        } else {
+            dprint("BufferManagerWriteGrow.getBufferSize: orb reference is NULL");
+        }
+        return bufferSize;
     }
 
     public void overflow (ByteBufferWithInfo bbwi)
@@ -89,4 +104,9 @@
      */
     public void close() {}
 
+    private void dprint(String msg) {
+        if (orb.transportDebugFlag) {
+            ORBUtility.dprint(this, msg);
+        }
+    }
 }
--- a/src/share/classes/com/sun/corba/se/impl/encoding/CDRInputStream_1_0.java	Tue Oct 24 13:15:08 2017 -0700
+++ b/src/share/classes/com/sun/corba/se/impl/encoding/CDRInputStream_1_0.java	Fri Dec 22 13:00:55 2017 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,18 +32,9 @@
 
 package com.sun.corba.se.impl.encoding;
 
+import java.io.Serializable;
 import java.io.IOException;
-import java.io.Serializable;
-import java.io.ByteArrayInputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
-import java.io.StreamCorruptedException;
-import java.io.OptionalDataException;
-import java.io.IOException;
-
-import java.util.Stack;
-
-import java.net.URL;
+
 import java.net.MalformedURLException;
 
 import java.nio.ByteBuffer;
@@ -53,19 +44,11 @@
 
 import java.math.BigDecimal;
 
-import java.rmi.Remote;
-import java.rmi.StubNotFoundException;
-
 import java.security.AccessController;
 import java.security.PrivilegedExceptionAction;
 import java.security.PrivilegedActionException;
 
 import org.omg.CORBA.SystemException;
-import org.omg.CORBA.Object;
-import org.omg.CORBA.Principal;
-import org.omg.CORBA.TypeCode;
-import org.omg.CORBA.Any;
-import org.omg.CORBA.portable.Delegate;
 import org.omg.CORBA.portable.ValueBase;
 import org.omg.CORBA.portable.IndirectionException;
 import org.omg.CORBA.CompletionStatus;
@@ -82,15 +65,12 @@
 import org.omg.CORBA.MARSHAL;
 import org.omg.CORBA.portable.IDLEntity;
 
-import javax.rmi.PortableRemoteObject;
 import javax.rmi.CORBA.Tie;
-import javax.rmi.CORBA.Util;
 import javax.rmi.CORBA.ValueHandler;
 
 import com.sun.corba.se.pept.protocol.MessageMediator;
 import com.sun.corba.se.pept.transport.ByteBufferPool;
 
-import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry;
 import com.sun.corba.se.spi.protocol.CorbaClientDelegate;
 
 import com.sun.corba.se.spi.ior.IOR;
@@ -99,9 +79,6 @@
 
 import com.sun.corba.se.spi.orb.ORB;
 import com.sun.corba.se.spi.orb.ORBVersionFactory;
-import com.sun.corba.se.spi.orb.ORBVersion;
-
-import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
 
 import com.sun.corba.se.spi.logging.CORBALogDomains;
 import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
@@ -725,12 +702,14 @@
     //    IDLEntity.class.isAssignableFrom( clz ).
     // 3. If clz is an interface, use it to create the appropriate
     //    stub factory.
+
     public org.omg.CORBA.Object read_Object(Class clz)
     {
         // In any case, we must first read the IOR.
         IOR ior = IORFactories.makeIOR(parent) ;
-        if (ior.isNil())
+        if (ior.isNil()) {
             return null ;
+        }
 
         PresentationManager.StubFactoryFactory sff = ORB.getStubFactoryFactory() ;
         String codeBase = ior.getProfile().getCodebase() ;
@@ -739,6 +718,7 @@
         if (clz == null) {
             RepositoryId rid = RepositoryId.cache.getId( ior.getTypeId() ) ;
             String className = rid.getClassName() ;
+            orb.validateIORClass(className);
             boolean isIDLInterface = rid.isIDLType() ;
 
             if (className == null || className.equals( "" ))
@@ -761,11 +741,9 @@
         } else {
             // clz is an interface class
             boolean isIDL = IDLEntity.class.isAssignableFrom( clz ) ;
-
             stubFactory = sff.createStubFactory( clz.getName(),
                 isIDL, codeBase, clz, clz.getClassLoader() ) ;
         }
-
         return internalIORToObject( ior, stubFactory, orb ) ;
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/corba/se/impl/ior/IORTypeCheckRegistryImpl.java	Fri Dec 22 13:00:55 2017 -0800
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.corba.se.impl.ior;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.sun.corba.se.impl.orbutil.ORBUtility;
+import com.sun.corba.se.spi.ior.IORTypeCheckRegistry;
+import com.sun.corba.se.spi.orb.ORB;
+
+public class IORTypeCheckRegistryImpl implements IORTypeCheckRegistry {
+
+    private final Set<String> iorTypeNames;
+    private static final Set<String> builtinIorTypeNames;
+    private ORB theOrb;
+
+    static {
+        builtinIorTypeNames = initBuiltinIorTypeNames();
+    }
+
+    public IORTypeCheckRegistryImpl(String filterProperties, ORB orb) {
+        theOrb = orb;
+        iorTypeNames = parseIorClassNameList(filterProperties);
+    }
+
+    /*
+     *
+     * A note on the validation flow:
+     * 1. against the filter class name list
+     * 2. against the builtin class name list
+     */
+    @Override
+    public boolean isValidIORType(String iorClassName) {
+        dprintTransport(".isValidIORType : iorClassName == " + iorClassName);
+        return validateIorTypeByName(iorClassName);
+    }
+
+
+    private boolean validateIorTypeByName(String iorClassName) {
+        dprintTransport(".validateIorTypeByName : iorClassName == " + iorClassName);
+        boolean isValidType;
+
+        isValidType = checkIorTypeNames(iorClassName);
+
+        if (!isValidType) {
+            isValidType = checkBuiltinClassNames(iorClassName);
+        }
+
+        dprintTransport(".validateIorTypeByName : isValidType == " + isValidType);
+        return isValidType;
+    }
+
+
+    /*
+     * check if the class name corresponding to an IOR Type name
+     * is in the ior class name list as generated from the filter property.
+     * So if the IOR type is recorded in the registry then allow the creation of the
+     * stub factory and let it resolve and load the class. That is if current
+     * type check deliberation permits.
+     * IOR Type names are configured by the filter property
+     */
+    private boolean checkIorTypeNames(
+            String theIorClassName) {
+        return (iorTypeNames != null) && (iorTypeNames.contains(theIorClassName));
+    }
+
+    /*
+     * Check the IOR interface class name against the set of
+     * class names that correspond to the builtin JDK IDL stub classes.
+     */
+    private boolean checkBuiltinClassNames(
+            String theIorClassName) {
+        return builtinIorTypeNames.contains(theIorClassName);
+    }
+
+    private Set<String> parseIorClassNameList(String filterProperty) {
+        Set<String> _iorTypeNames = null;
+        if (filterProperty != null) {
+            String[] tempIorClassNames = filterProperty.split(";");
+            _iorTypeNames = Collections.unmodifiableSet(new HashSet<>(Arrays
+                    .asList(tempIorClassNames)));
+            if (theOrb.orbInitDebugFlag) {
+                dprintConfiguredIorTypeNames();
+            }
+        }
+        return _iorTypeNames;
+    }
+
+    private static Set<String> initBuiltinIorTypeNames() {
+        Set<Class<?>> builtInCorbaStubTypes = initBuiltInCorbaStubTypes();
+        String[] tempBuiltinIorTypeNames = new String[builtInCorbaStubTypes.size()];
+        int i = 0;
+        for (Class<?> _stubClass : builtInCorbaStubTypes) {
+            tempBuiltinIorTypeNames[i++] = _stubClass.getName();
+        }
+        return Collections.unmodifiableSet(new HashSet<>(Arrays
+                .asList(tempBuiltinIorTypeNames)));
+    }
+
+    private static Set<Class<?>> initBuiltInCorbaStubTypes() {
+        Class<?> tempBuiltinCorbaStubTypes[] = {
+            com.sun.corba.se.spi.activation.Activator.class,
+            com.sun.corba.se.spi.activation._ActivatorStub.class,
+            com.sun.corba.se.spi.activation._InitialNameServiceStub.class,
+            com.sun.corba.se.spi.activation._LocatorStub.class,
+            com.sun.corba.se.spi.activation._RepositoryStub.class,
+            com.sun.corba.se.spi.activation._ServerManagerStub.class,
+            com.sun.corba.se.spi.activation._ServerStub.class,
+            org.omg.CosNaming.BindingIterator.class,
+            org.omg.CosNaming._BindingIteratorStub.class,
+            org.omg.CosNaming.NamingContextExt.class,
+            org.omg.CosNaming._NamingContextExtStub.class,
+            org.omg.CosNaming.NamingContext.class,
+            org.omg.CosNaming._NamingContextStub.class,
+            org.omg.DynamicAny.DynAnyFactory.class,
+            org.omg.DynamicAny._DynAnyFactoryStub.class,
+            org.omg.DynamicAny.DynAny.class,
+            org.omg.DynamicAny._DynAnyStub.class,
+            org.omg.DynamicAny.DynArray.class,
+            org.omg.DynamicAny._DynArrayStub.class,
+            org.omg.DynamicAny.DynEnum.class,
+            org.omg.DynamicAny._DynEnumStub.class,
+            org.omg.DynamicAny.DynFixed.class,
+            org.omg.DynamicAny._DynFixedStub.class,
+            org.omg.DynamicAny.DynSequence.class,
+            org.omg.DynamicAny._DynSequenceStub.class,
+            org.omg.DynamicAny.DynStruct.class,
+            org.omg.DynamicAny._DynStructStub.class,
+            org.omg.DynamicAny.DynUnion.class,
+            org.omg.DynamicAny._DynUnionStub.class,
+            org.omg.DynamicAny._DynValueStub.class,
+            org.omg.DynamicAny.DynValue.class,
+            org.omg.PortableServer.ServantActivator.class,
+            org.omg.PortableServer._ServantActivatorStub.class,
+            org.omg.PortableServer.ServantLocator.class,
+            org.omg.PortableServer._ServantLocatorStub.class};
+        return new HashSet<>(
+                Arrays.asList(tempBuiltinCorbaStubTypes));
+    }
+
+    private void dprintConfiguredIorTypeNames() {
+        if (iorTypeNames != null) {
+            for (String iorTypeName : iorTypeNames) {
+                ORBUtility.dprint(this, ".dprintConfiguredIorTypeNames: " + iorTypeName);
+            }
+        }
+    }
+
+    private void dprintTransport(String msg) {
+        if (theOrb.transportDebugFlag) {
+            ORBUtility.dprint(this, msg);
+        }
+    }
+}
--- a/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java	Tue Oct 24 13:15:08 2017 -0700
+++ b/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java	Fri Dec 22 13:00:55 2017 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,37 +32,25 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
-import java.lang.reflect.InvocationTargetException;
 
 import java.util.Set;
 import java.util.HashSet;
-import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.Properties;
 import java.util.Vector;
 import java.util.Hashtable;
 import java.util.Map;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Collection;
 import java.util.Collections;
-import java.util.StringTokenizer;
 import java.util.Enumeration;
 import java.util.WeakHashMap;
 
 import java.net.InetAddress;
 
 import java.security.PrivilegedAction;
+import java.security.Security;
 import java.security.AccessController;
 
-import javax.rmi.CORBA.Util;
 import javax.rmi.CORBA.ValueHandler;
 
-import org.omg.CORBA.Context;
-import org.omg.CORBA.ContextList;
-import org.omg.CORBA.Environment;
-import org.omg.CORBA.ExceptionList;
-import org.omg.CORBA.ORBPackage.InvalidName;
 import org.omg.CORBA.NVList;
 import org.omg.CORBA.TCKind;
 import org.omg.CORBA.NamedValue;
@@ -75,7 +63,6 @@
 import org.omg.CORBA.UnionMember;
 import org.omg.CORBA.ValueMember;
 import org.omg.CORBA.BAD_PARAM;
-import org.omg.CORBA.MARSHAL;
 
 import org.omg.CORBA.portable.ValueFactory;
 
@@ -83,10 +70,7 @@
 
 import com.sun.org.omg.SendingContext.CodeBase;
 
-import com.sun.corba.se.pept.broker.Broker;
 import com.sun.corba.se.pept.protocol.ClientInvocationInfo;
-import com.sun.corba.se.pept.transport.ContactInfo;
-import com.sun.corba.se.pept.transport.ConnectionCache;
 import com.sun.corba.se.pept.transport.TransportManager;
 
 import com.sun.corba.se.spi.ior.IOR;
@@ -95,8 +79,6 @@
 import com.sun.corba.se.spi.ior.IORFactories;
 import com.sun.corba.se.spi.ior.ObjectKey;
 import com.sun.corba.se.spi.ior.ObjectKeyFactory;
-import com.sun.corba.se.spi.ior.iiop.IIOPFactories;
-import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
 import com.sun.corba.se.spi.oa.OAInvocationInfo;
 import com.sun.corba.se.spi.oa.ObjectAdapterFactory;
 import com.sun.corba.se.spi.orb.DataCollector;
@@ -113,24 +95,18 @@
 import com.sun.corba.se.spi.protocol.ClientDelegateFactory;
 import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry;
 import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher;
-import com.sun.corba.se.spi.protocol.RequestDispatcherDefault;
 import com.sun.corba.se.spi.protocol.PIHandler;
-import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
-import com.sun.corba.se.spi.protocol.ForwardException;
 import com.sun.corba.se.spi.resolver.Resolver;
 import com.sun.corba.se.spi.resolver.LocalResolver;
-import com.sun.corba.se.spi.orb.StringPair;
-import com.sun.corba.se.spi.orb.StringPair;
 import com.sun.corba.se.spi.transport.CorbaContactInfoListFactory;
 import com.sun.corba.se.spi.transport.CorbaTransportManager;
+import com.sun.corba.se.spi.ior.IORTypeCheckRegistry;
 import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketManager;
+import com.sun.corba.se.spi.logging.CORBALogDomains;
 import com.sun.corba.se.spi.copyobject.CopierManager;
-import com.sun.corba.se.spi.presentation.rmi.PresentationDefaults;
-import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
 import com.sun.corba.se.spi.presentation.rmi.StubAdapter;
 import com.sun.corba.se.spi.servicecontext.ServiceContextRegistry;
 
-import com.sun.corba.se.impl.corba.TypeCodeFactory;
 import com.sun.corba.se.impl.corba.TypeCodeImpl;
 import com.sun.corba.se.impl.corba.NVListImpl;
 import com.sun.corba.se.impl.corba.ExceptionListImpl;
@@ -139,9 +115,6 @@
 import com.sun.corba.se.impl.corba.EnvironmentImpl;
 import com.sun.corba.se.impl.corba.AsynchInvoke;
 import com.sun.corba.se.impl.corba.AnyImpl;
-import com.sun.corba.se.impl.corba.RequestImpl;
-import com.sun.corba.se.impl.dynamicany.DynAnyFactoryImpl;
-import com.sun.corba.se.impl.encoding.EncapsOutputStream;
 import com.sun.corba.se.impl.encoding.CachedCodeBase;
 import com.sun.corba.se.impl.interceptors.PIHandlerImpl;
 import com.sun.corba.se.impl.interceptors.PINoOpHandlerImpl;
@@ -150,12 +123,10 @@
 import com.sun.corba.se.impl.ior.TaggedProfileTemplateFactoryFinderImpl;
 import com.sun.corba.se.impl.oa.toa.TOAFactory;
 import com.sun.corba.se.impl.oa.poa.BadServerIdHandler;
-import com.sun.corba.se.impl.oa.poa.DelegateImpl;
 import com.sun.corba.se.impl.oa.poa.POAFactory;
 import com.sun.corba.se.impl.orbutil.ORBConstants;
 import com.sun.corba.se.impl.orbutil.ORBUtility;
 import com.sun.corba.se.impl.orbutil.StackImpl;
-import com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolImpl;
 import com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolManagerImpl;
 import com.sun.corba.se.impl.protocol.RequestDispatcherRegistryImpl;
 import com.sun.corba.se.impl.protocol.CorbaInvocationInfo;
@@ -164,7 +135,7 @@
 import com.sun.corba.se.impl.util.Utility;
 import com.sun.corba.se.impl.logging.ORBUtilSystemException;
 import com.sun.corba.se.impl.copyobject.CopierManagerImpl;
-import com.sun.corba.se.impl.presentation.rmi.PresentationManagerImpl;
+import com.sun.corba.se.impl.ior.IORTypeCheckRegistryImpl;
 
 /**
  * The JavaIDL ORB implementation.
@@ -226,6 +197,8 @@
 
     private ServiceContextRegistry serviceContextRegistry ;
 
+    private IORTypeCheckRegistry iorTypeCheckRegistry;
+
     // Needed here to implement connect/disconnect
     private TOAFactory toaFactory ;
 
@@ -274,6 +247,8 @@
     // insNamingDelegate.
     private final Object resolverLock = new Object() ;
 
+    private static final String IORTYPECHECKREGISTRY_FILTER_PROPNAME = "com.sun.CORBA.ORBIorTypeCheckRegistryFilter";
+
     private TaggedComponentFactoryFinder taggedComponentFactoryFinder ;
 
     private IdentifiableFactoryFinder taggedProfileFactoryFinder ;
@@ -413,6 +388,37 @@
         serviceContextRegistry = new ServiceContextRegistry( this ) ;
     }
 
+    private void initIORTypeCheckRegistry() {
+        String filterProps = AccessController
+                .doPrivileged(new PrivilegedAction<String>() {
+                    public String run() {
+                        String props = System
+                                .getProperty(IORTYPECHECKREGISTRY_FILTER_PROPNAME);
+                        if (props == null) {
+                            props = Security
+                                    .getProperty(IORTYPECHECKREGISTRY_FILTER_PROPNAME);
+                        }
+                        return props;
+                    }
+                });
+        if (filterProps != null) {
+            try {
+                iorTypeCheckRegistry = new IORTypeCheckRegistryImpl(filterProps, this);
+            } catch (Exception ex) {
+                throw wrapper.bootstrapException(ex);
+            }
+
+            if (this.orbInitDebugFlag) {
+                dprint(".initIORTypeCheckRegistry, IORTypeCheckRegistryImpl created for properties == "
+                        + filterProps);
+            }
+        } else {
+            if (this.orbInitDebugFlag) {
+                dprint(".initIORTypeCheckRegistry, IORTypeCheckRegistryImpl NOT created for properties == ");
+            }
+        }
+    }
+
     protected void setDebugFlags( String[] args )
     {
         for (int ctr=0; ctr<args.length; ctr++ ) {
@@ -494,6 +500,8 @@
         getThreadPoolManager();
 
         super.getByteBufferPool();
+
+        initIORTypeCheckRegistry();
     }
 
     private synchronized POAFactory getPOAFactory()
@@ -2089,6 +2097,17 @@
         }
         return copierManager ;
     }
+
+    @Override
+    public void validateIORClass(String iorClassName) {
+        if (iorTypeCheckRegistry != null) {
+            if (!iorTypeCheckRegistry.isValidIORType(iorClassName)) {
+                throw ORBUtilSystemException.get( this,
+                        CORBALogDomains.OA_IOR ).badStringifiedIor();
+            }
+        }
+    }
+
 } // Class ORBImpl
 
 ////////////////////////////////////////////////////////////////////////
--- a/src/share/classes/com/sun/corba/se/impl/orb/ORBSingleton.java	Tue Oct 24 13:15:08 2017 -0700
+++ b/src/share/classes/com/sun/corba/se/impl/orb/ORBSingleton.java	Fri Dec 22 13:00:55 2017 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,28 +31,16 @@
 
 package com.sun.corba.se.impl.orb;
 
-import java.util.Collection;
 import java.util.Properties;
-import java.util.Hashtable;
 
 import java.applet.Applet;
 
 import java.net.URL;
 
-import java.io.IOException ;
-
-import java.util.logging.Logger ;
-
-import org.omg.CORBA.Context;
-import org.omg.CORBA.ContextList;
-import org.omg.CORBA.Environment;
-import org.omg.CORBA.ExceptionList;
 import org.omg.CORBA.ORBPackage.InvalidName;
 import org.omg.CORBA.NVList;
 import org.omg.CORBA.TCKind;
-import org.omg.CORBA.NamedValue;
 import org.omg.CORBA.NO_IMPLEMENT;
-import org.omg.CORBA.Object;
 import org.omg.CORBA.Request;
 import org.omg.CORBA.TypeCode;
 import org.omg.CORBA.Any;
@@ -63,7 +51,6 @@
 import org.omg.CORBA.PolicyError;
 
 import org.omg.CORBA.portable.OutputStream;
-import org.omg.CORBA.portable.RemarshalException;
 
 import com.sun.corba.se.pept.protocol.ClientInvocationInfo ;
 import com.sun.corba.se.pept.transport.ContactInfo;
@@ -71,15 +58,12 @@
 import com.sun.corba.se.pept.transport.Selector ;
 import com.sun.corba.se.pept.transport.TransportManager;
 
-import com.sun.corba.se.spi.legacy.connection.ORBSocketFactory;
 import com.sun.corba.se.spi.orb.ORBData;
 import com.sun.corba.se.spi.orb.Operation;
 import com.sun.corba.se.spi.orb.ORB;
 import com.sun.corba.se.spi.orb.ORBVersion;
 import com.sun.corba.se.spi.orb.ORBVersionFactory;
 import com.sun.corba.se.spi.oa.OAInvocationInfo;
-import com.sun.corba.se.spi.oa.ObjectAdapter;
-import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
 import com.sun.corba.se.spi.protocol.ClientDelegateFactory;
 import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry;
 import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher;
@@ -92,22 +76,17 @@
 import com.sun.corba.se.spi.ior.ObjectKey;
 import com.sun.corba.se.spi.ior.ObjectKeyFactory;
 import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
-import com.sun.corba.se.pept.transport.ByteBufferPool ;
 import com.sun.corba.se.spi.transport.CorbaContactInfoListFactory ;
 import com.sun.corba.se.spi.transport.CorbaTransportManager;
 import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketManager;
 import com.sun.corba.se.spi.orbutil.closure.Closure;
 import com.sun.corba.se.spi.orbutil.threadpool.ThreadPoolManager;
-import com.sun.corba.se.spi.logging.LogWrapperFactory;
-import com.sun.corba.se.spi.logging.LogWrapperBase;
 import com.sun.corba.se.spi.copyobject.CopierManager;
 import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
 import com.sun.corba.se.spi.presentation.rmi.PresentationDefaults;
 
 import com.sun.corba.se.spi.servicecontext.ServiceContextRegistry;
-import com.sun.corba.se.spi.servicecontext.ServiceContexts;
 
-import com.sun.corba.se.impl.corba.TypeCodeFactory;
 import com.sun.corba.se.impl.corba.TypeCodeImpl;
 import com.sun.corba.se.impl.corba.NVListImpl;
 import com.sun.corba.se.impl.corba.NamedValueImpl;
@@ -117,9 +96,6 @@
 import com.sun.corba.se.impl.corba.AnyImpl;
 import com.sun.corba.se.impl.encoding.BufferManagerFactory;
 import com.sun.corba.se.impl.encoding.CodeSetComponentInfo;
-import com.sun.corba.se.impl.encoding.MarshalInputStream;
-import com.sun.corba.se.impl.encoding.EncapsOutputStream;
-import com.sun.corba.se.impl.encoding.MarshalOutputStream;
 import com.sun.corba.se.impl.oa.poa.BadServerIdHandler;
 import com.sun.corba.se.impl.orbutil.ORBConstants;
 import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketEndPointInfo;
@@ -768,6 +744,12 @@
     public CopierManager getCopierManager() {
         return null ;
     }
+
+    @Override
+    public void validateIORClass(String iorClassName) {
+        getFullORB().validateIORClass(iorClassName);
+    }
+
 }
 
 // End of file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/corba/se/spi/ior/IORTypeCheckRegistry.java	Fri Dec 22 13:00:55 2017 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.corba.se.spi.ior;
+
+public interface IORTypeCheckRegistry {
+    public boolean isValidIORType(String iorClassName);
+}
+
--- a/src/share/classes/com/sun/corba/se/spi/orb/ORB.java	Tue Oct 24 13:15:08 2017 -0700
+++ b/src/share/classes/com/sun/corba/se/spi/orb/ORB.java	Fri Dec 22 13:00:55 2017 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,16 +42,13 @@
 import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry ;
 import com.sun.corba.se.spi.protocol.ClientDelegateFactory ;
 import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ;
-import com.sun.corba.se.spi.protocol.CorbaMessageMediator ;
 import com.sun.corba.se.spi.protocol.PIHandler ;
 import com.sun.corba.se.spi.resolver.LocalResolver ;
 import com.sun.corba.se.spi.resolver.Resolver ;
 import com.sun.corba.se.spi.transport.CorbaContactInfoListFactory ;
-import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketEndPointInfo;
 import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketManager;
 import com.sun.corba.se.spi.monitoring.MonitoringConstants;
 import com.sun.corba.se.spi.monitoring.MonitoringManager;
-import com.sun.corba.se.spi.monitoring.MonitoringManagerFactory;
 import com.sun.corba.se.spi.monitoring.MonitoringFactories;
 
 import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder ;
@@ -60,8 +57,6 @@
 import com.sun.corba.se.spi.ior.ObjectKeyFactory ;
 import com.sun.corba.se.spi.ior.IOR ;
 
-import com.sun.corba.se.spi.orbutil.closure.Closure ;
-
 import com.sun.corba.se.spi.orb.Operation ;
 import com.sun.corba.se.spi.orb.ORBData ;
 import com.sun.corba.se.spi.orb.ORBVersion ;
@@ -135,6 +130,7 @@
     public boolean shutdownDebugFlag = false;
     public boolean giopDebugFlag = false;
     public boolean invocationTimingDebugFlag = false ;
+    public boolean orbInitDebugFlag = false;
 
     // SystemException log wrappers.  Protected so that they can be used in
     // subclasses.
@@ -564,6 +560,24 @@
     public abstract ThreadPoolManager getThreadPoolManager();
 
     public abstract CopierManager getCopierManager() ;
+
+    /*
+     * This method is called to verify that a stringified IOR passed to
+     * an org.omg.CORBA.ORB::string_to_object method contains a valid and acceptable IOR type.
+     * If an ORB is configured with IOR type checking enabled,
+     * the ORB executes a IOR type registry lookup to
+     * validate that the class name extract from a type id in
+     * a stringified IOR is a known and accepted type.
+     * A CORBA {@code org.omg.CORBA.DATA_CONVERSION} exception will be thrown should the type check fail.
+     *
+     * @param iorClassName
+     *        a string representing the class name corresponding to the type id of an IOR
+     * @throws org.omg.CORBA.DATA_CONVERSION
+     *           exception with an indication that it is a "Bad stringified IOR", which is thrown
+     *           when the type check fails.
+     */
+    public abstract void validateIORClass(String iorClassName);
+
 }
 
 // End of file.