jkesselm    01/05/11 08:57:33

  Modified:    java/src/org/apache/xml/dtm Tag: DTM_EXP
                        DTMDocumentImpl.java
  Log:
  Sloppy merge. Mea culpa...
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.12  +3 -541    
xml-xalan/java/src/org/apache/xml/dtm/Attic/DTMDocumentImpl.java
  
  Index: DTMDocumentImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xml/dtm/Attic/DTMDocumentImpl.java,v
  retrieving revision 1.1.2.11
  retrieving revision 1.1.2.12
  diff -u -r1.1.2.11 -r1.1.2.12
  --- DTMDocumentImpl.java      2001/05/11 15:49:27     1.1.2.11
  +++ DTMDocumentImpl.java      2001/05/11 15:57:30     1.1.2.12
  @@ -372,8 +372,6 @@
         java.lang.String qName, Attributes atts) 
          throws org.xml.sax.SAXException
     {
  -/**/System.out.println("Atts=="+atts);
  -
       processAccumulatedText();
   
       // %TBD% Split prefix off qname
  @@ -419,7 +417,7 @@
       for(int i=nAtts-1;i>=0;--i)      
         {
           qName=atts.getQName(i);
  -        if(qName.startsWith("xmlns:") || "xmlns".equals(qName))
  +        if(!(qName.startsWith("xmlns:") || "xmlns".equals(qName)))
             {
               // %TBD% I hate having to extract the prefix into a new
               // string when we may never use it. Consider pooling whole
  @@ -880,506 +878,6 @@
   //   // of appendAccumulatedText for the next set of characters receives
   //   int charStringStart=0,charStringLength=0;
   
  -<<<<<<< DTMDocumentImpl.java
  -
  -     // ========= Document Navigation Functions =========
  -
  -     /** Given a node handle, test if it has child nodes.
  -      * <p> %REVIEW% This is obviously useful at the DOM layer, where it
  -      * would permit testing this without having to create a proxy
  -      * node. It's less useful in the DTM API, where
  -      * (dtm.getFirstChild(nodeHandle)!=DTM.NULL) is just as fast and
  -      * almost as self-evident. But it's a convenience, and eases porting
  -      * of DOM code to DTM.  </p>
  -      *
  -      * @param nodeHandle int Handle of the node.
  -      * @return int true if the given node has child nodes.
  -      */
  -     public boolean hasChildNodes(int nodeHandle) {
  -             return(getFirstChild(nodeHandle) != NULL);
  -     }
  -
  -     /**
  -      * Given a node handle, get the handle of the node's first child.
  -      * If not yet resolved, waits for more nodes to be added to the 
document and
  -      * tries again.
  -      *
  -      * @param nodeHandle int Handle of the node.
  -      * @return int DTM node-number of first child, or DTM.NULL to indicate 
none exists.
  -      */
  -     public int getFirstChild(int nodeHandle) {
  -             // ###shs worry about tracing/debug later
  -             nodeHandle &= NODEHANDLE_MASK;
  -             // Read node into variable
  -             nodes.readSlot(nodeHandle, gotslot);
  -
  -             // type is the last half of first slot
  -             short type = (short) (gotslot[0] & 0xFFFF);
  -
  -             // Check to see if Element or Document node
  -             if ((type == ELEMENT_NODE) || (type == DOCUMENT_NODE) || 
  -                             (type == ENTITY_REFERENCE_NODE)) {
  -                     // In case when Document root is given
  -                     if (nodeHandle == 0) nodeHandle = 1;
  -                     int kid = nodeHandle + 1;
  -                     nodes.readSlot(kid, gotslot);
  -                     while (ATTRIBUTE_NODE == (gotslot[0] & 0xFFFF)) {
  -                             // points to next sibling
  -                             kid = gotslot[2];
  -                             // Return NULL if node has only attributes
  -                             if (kid == NULL) return NULL; 
  -                             nodes.readSlot(kid, gotslot);
  -                     }
  -                     // If parent slot matches given parent, return kid
  -                     if (gotslot[1] == nodeHandle)   return kid | 
m_docHandle;
  -             }
  -             // No child found
  -             return NULL;
  -     }
  -
  -     /**
  -     * Given a node handle, advance to its last child.
  -     * If not yet resolved, waits for more nodes to be added to the document 
and
  -     * tries again.
  -     *
  -     * @param nodeHandle int Handle of the node.
  -     * @return int Node-number of last child,
  -     * or DTM.NULL to indicate none exists.
  -     */
  -     public int getLastChild(int nodeHandle) {
  -             // ###shs put trace/debug later
  -             nodeHandle &= NODEHANDLE_MASK;
  -             // do not need to test node type since getFirstChild does that
  -             int lastChild = NULL;
  -             for (int nextkid = getFirstChild(nodeHandle); nextkid != NULL;
  -                             nextkid = getNextSibling(nextkid)) {
  -                     lastChild = nextkid;
  -             }
  -             return lastChild | m_docHandle;         
  -     }
  -
  -     /**
  -      * Retrieves an attribute node by by qualified name and namespace URI.
  -      *
  -      * @param nodeHandle int Handle of the node upon which to look up this 
attribute.
  -      * @param namespaceURI The namespace URI of the attribute to
  -      *   retrieve, or null.
  -      * @param name The local name of the attribute to
  -      *   retrieve.
  -      * @return The attribute node handle with the specified name (
  -      *   <code>nodeName</code>) or <code>DTM.NULL</code> if there is no such
  -      *   attribute.
  -      */
  -     public int getAttributeNode(int nodeHandle, String namespaceURI, String 
name) {
  -             int nsIndex = m_nsNames.stringToIndex(namespaceURI),
  -                                                                     
nameIndex = m_localNames.stringToIndex(name);
  -             nodeHandle &= NODEHANDLE_MASK;
  -             nodes.readSlot(nodeHandle, gotslot);
  -             short type = (short) (gotslot[0] & 0xFFFF);
  -             // If nodeHandle points to element next slot would be first 
attribute
  -             if (type == ELEMENT_NODE)
  -                     nodeHandle++;
  -             // Iterate through Attribute Nodes
  -             while (type == ATTRIBUTE_NODE) {
  -                     if ((nsIndex == (gotslot[0] << 16)) && (gotslot[3] == 
nameIndex))
  -                             return nodeHandle | m_docHandle;
  -                     // Goto next sibling
  -                     nodeHandle = gotslot[2];
  -                     nodes.readSlot(nodeHandle, gotslot);
  -             }
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, get the index of the node's first attribute.
  -      *
  -      * @param nodeHandle int Handle of the Element node.
  -      * @return Handle of first attribute, or DTM.NULL to indicate none 
exists.
  -      */
  -     public int getFirstAttribute(int nodeHandle) {
  -             nodeHandle &= NODEHANDLE_MASK;
  -
  -             // %REVIEW% jjk: Just a quick observation: If you're going to
  -             // call readEntry repeatedly on the same node, it may be
  -             // more efficiently to do a readSlot to get the data locally,
  -             // reducing the addressing and call-and-return overhead.
  -
  -             // Should we check if handle is element (do we want sanity 
checks?)
  -             if (ELEMENT_NODE != (nodes.readEntry(nodeHandle, 0) & 0xFFFF))
  -                     return NULL;
  -             // First Attribute (if any) should be at next position in table
  -             nodeHandle++;
  -             return(ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) & 
0xFFFF)) ? 
  -             nodeHandle | m_docHandle : NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, get the index of the node's first child.
  -      * If not yet resolved, waits for more nodes to be added to the 
document and
  -      * tries again
  -      *
  -      * @param nodeHandle handle to node, which should probably be an element
  -      *                   node, but need not be.
  -      *
  -      * @param inScope    true if all namespaces in scope should be returned,
  -      *                   false if only the namespace declarations should be
  -      *                   returned.
  -      * @return handle of first namespace, or DTM.NULL to indicate none 
exists.
  -      */
  -     public int getFirstNamespaceNode(int nodeHandle, boolean inScope) {
  -
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, advance to its next sibling.
  -      * %TBD% Remove - If not yet resolved, waits for more nodes to be added 
to the document and
  -      * tries again.
  -      * @param nodeHandle int Handle of the node.
  -      * @return int Node-number of next sibling,
  -      * or DTM.NULL to indicate none exists.
  -      */
  -     public int getNextSibling(int nodeHandle) {
  -             nodeHandle &= NODEHANDLE_MASK;
  -             // Document root has no next sibling
  -             if (nodeHandle == 0)
  -                     return NULL;
  -
  -             short type = (short) (nodes.readEntry(nodeHandle, 0) & 0xFFFF);
  -             if ((type == ELEMENT_NODE) || (type == ATTRIBUTE_NODE) ||
  -                             (type == ENTITY_REFERENCE_NODE)) {
  -                     int nextSib = nodes.readEntry(nodeHandle, 2);
  -                     if (nextSib == NULL)
  -                             return NULL;
  -                     if (nextSib != 0)
  -                             return (m_docHandle | nextSib);
  -                     // ###shs should cycle/wait if nextSib is 0? Working on 
threading next
  -             }
  -             // Next Sibling is in the next position if it shares the same 
parent
  -             int thisParent = nodes.readEntry(nodeHandle, 1);
  -             
  -             // If next node has same parent, it's a sibling.
  -             // NOTE that this is a DTM-level sib, _not_ a DOM-level
  -             // sib.
  -             // %TBD% Since DTM internals treat attrs
  -             // and namespace nodes as leading children, this will
  -             // advance from them to normal kids unless it is modified
  -             // to check nodetype.
  -             if (nodes.readEntry(++nodeHandle, 1) == thisParent)
  -                     return (m_docHandle | nodeHandle);
  -
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, find its preceeding sibling.
  -      * WARNING: DTM is asymmetric; this operation is resolved by search, 
and is
  -      * relatively expensive.
  -      *
  -      * @param nodeHandle the id of the node.
  -      * @return int Node-number of the previous sib,
  -      * or DTM.NULL to indicate none exists.
  -      */
  -     public int getPreviousSibling(int nodeHandle) {
  -             nodeHandle &= NODEHANDLE_MASK;
  -             // Document root has no previous sibling
  -             if (nodeHandle == 0)
  -                     return NULL;
  -
  -             int parent = nodes.readEntry(nodeHandle, 1);
  -             int kid = NULL;
  -             for (int nextkid = getFirstChild(parent); nextkid != nodeHandle;
  -                             nextkid = getNextSibling(nextkid)) {
  -                     kid = nextkid;
  -             }
  -             return kid | m_docHandle;
  -     }
  -
  -     /**
  -      * Given a node handle, advance to the next attribute. If an
  -      * element, we advance to its first attribute; if an attr, we advance to
  -      * the next attr on the same node.
  -      *
  -      * @param nodeHandle int Handle of the node.
  -      * @return int DTM node-number of the resolved attr,
  -      * or DTM.NULL to indicate none exists.
  -      */
  -     public int getNextAttribute(int nodeHandle) {
  -             nodeHandle &= NODEHANDLE_MASK;
  -             nodes.readSlot(nodeHandle, gotslot);
  -
  -             //%REVIEW% Why are we using short here? There's no storage
  -             //reduction for an automatic variable, especially one used
  -             //so briefly, and it typically costs more cycles to process
  -             //than an int would.
  -             short type = (short) (gotslot[0] & 0xFFFF);
  -
  -             if (type == ELEMENT_NODE) {
  -                     return getFirstAttribute(nodeHandle);
  -             } else if (type == ATTRIBUTE_NODE) {
  -                     if (gotslot[2] != NULL)
  -                             return (m_docHandle | gotslot[2]);
  -             }
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a namespace handle, advance to the next namespace.
  -      *
  -      * %TBD% THIS METHOD DOES NOT MATCH THE CURRENT SIGNATURE IN
  -      * THE DTM INTERFACE.  FIX IT, OR JUSTIFY CHANGING THE DTM
  -      * API.
  -      *
  -      * @param namespaceHandle handle to node which must be of type 
NAMESPACE_NODE.
  -      * @return handle of next namespace, or DTM.NULL to indicate none 
exists.
  -      */
  -     public int getNextNamespaceNode(int baseHandle,int namespaceHandle, 
boolean inScope) {
  -             // ###shs need to work on namespace
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, advance to its next descendant.
  -      * If not yet resolved, waits for more nodes to be added to the 
document and
  -      * tries again.
  -      *
  -      * @param subtreeRootNodeHandle
  -      * @param nodeHandle int Handle of the node.
  -      * @return handle of next descendant,
  -      * or DTM.NULL to indicate none exists.
  -      */
  -     public int getNextDescendant(int subtreeRootHandle, int nodeHandle) {
  -             subtreeRootHandle &= NODEHANDLE_MASK;
  -             nodeHandle &= NODEHANDLE_MASK;
  -             // Document root [Document Node? -- jjk] - no next-sib
  -             if (nodeHandle == 0)
  -                     return NULL;
  -             while (!m_isError) {
  -                     // Document done and node out of bounds
  -                     if (done && (nodeHandle > nodes.slotsUsed()))
  -                             break;
  -                     if (nodeHandle > subtreeRootHandle) {
  -                             nodes.readSlot(nodeHandle+1, gotslot);
  -                             if (gotslot[2] != 0) {
  -                                     short type = (short) (gotslot[0] & 
0xFFFF);
  -                                     if (type == ATTRIBUTE_NODE) {
  -                                             nodeHandle +=2;
  -                                     } else {
  -                                             int nextParentPos = gotslot[1];
  -                                             if (nextParentPos >= 
subtreeRootHandle)
  -                                                     return (m_docHandle | 
(nodeHandle+1));
  -                                             else
  -                                                     break;
  -                                     }
  -                             } else if (!done) {
  -                                     // Add wait logic here
  -                             } else
  -                                     break;
  -                     } else {
  -                             nodeHandle++;
  -                     }
  -             }
  -             // Probably should throw error here like original instead of 
returning
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, advance to the next node on the following axis.
  -      *
  -      * @param axisContextHandle the start of the axis that is being 
traversed.
  -      * @param nodeHandle
  -      * @return handle of next sibling,
  -      * or DTM.NULL to indicate none exists.
  -      */
  -     public int getNextFollowing(int axisContextHandle, int nodeHandle) {
  -             //###shs still working on
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, advance to the next node on the preceding axis.
  -      *
  -      * @param axisContextHandle the start of the axis that is being 
traversed.
  -      * @param nodeHandle the id of the node.
  -      * @return int Node-number of preceding sibling,
  -      * or DTM.NULL to indicate none exists.
  -      */
  -     public int getNextPreceding(int axisContextHandle, int nodeHandle) {
  -             // ###shs copied from Xalan 1, what is this suppose to do?
  -             nodeHandle &= NODEHANDLE_MASK;
  -             while (nodeHandle > 1) {
  -                     nodeHandle--;
  -                     if (ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) & 
0xFFFF))
  -                             continue;
  -
  -                     // if nodeHandle is _not_ an ancestor of
  -                     // axisContextHandle, specialFind will return it.
  -                     // If it _is_ an ancestor, specialFind will return -1
  -
  -                     // %REVIEW% unconditional return defeats the
  -                     // purpose of the while loop -- does this
  -                     // logic make any sense?
  -
  -                     return (m_docHandle | 
nodes.specialFind(axisContextHandle, nodeHandle));
  -             }
  -             return NULL;
  -     }
  -
  -     /**
  -      * Given a node handle, find its parent node.
  -      *
  -      * @param nodeHandle the id of the node.
  -      * @return int Node-number of parent,
  -      * or DTM.NULL to indicate none exists.
  -      */
  -     public int getParent(int nodeHandle) {
  -             // Should check to see within range?
  -
  -             // Document Root should not have to be handled differently
  -             return (m_docHandle | nodes.readEntry(nodeHandle, 1));
  -     }
  -
  -     /**
  -      * Returns the root element of the document.
  -      * @return nodeHandle to the Document Root.
  -      */
  -     public int getDocumentRoot() {
  -             return (m_docHandle | m_docElement);
  -     }
  -
  -     /**
  -             * Given a node handle, find the owning document node.
  -             *
  -             * @param nodeHandle the id of the node.
  -             * @return int Node handle of document, which should always be 
valid.
  -             */
  -     public int getDocument() {
  -             return m_docHandle;
  -     }
  -
  -     /**
  -      * Given a node handle, find the owning document node.  This has the 
exact
  -      * same semantics as the DOM Document method of the same name, in that 
if
  -      * the nodeHandle is a document node, it will return NULL.
  -      *
  -      * <p>%REVIEW% Since this is DOM-specific, it may belong at the DOM
  -      * binding layer. Included here as a convenience function and to
  -      * aid porting of DOM code to DTM.</p>
  -      *
  -      * @param nodeHandle the id of the node.
  -      * @return int Node handle of owning document, or NULL if the 
nodeHandle is
  -      *             a document.
  -      */
  -     public int getOwnerDocument(int nodeHandle) {
  -             // Assumption that Document Node is always in 0 slot
  -             if ((nodeHandle & NODEHANDLE_MASK) == 0)
  -                     return NULL;
  -             return (nodeHandle & DOCHANDLE_MASK);
  -     }
  -
  -
  -     /**
  -      * Get the string-value of a node as a String object
  -      * (see http://www.w3.org/TR/xpath#data-model
  -      * for the definition of a node's string-value).
  -      *
  -      * @param nodeHandle The node ID.
  -      *
  -      * @return A string object that represents the string-value of the 
given node.
  -      */
  -     public String getStringValue(int nodeHandle) {
  -     // ###zaj - researching 
  -     nodes.readSlot(nodeHandle, gotslot);
  -     int nodetype=gotslot[0] & 0xFF;         
  -     String value=null;
  -
  -     switch (nodetype) {                     
  -     case TEXT_NODE:   
  -     case COMMENT_NODE:
  -     case CDATA_SECTION_NODE: 
  -             value=m_char.getString(gotslot[2], gotslot[3]);         
  -             break;
  -     case PROCESSING_INSTRUCTION_NODE:
  -     case ATTRIBUTE_NODE:    
  -     case ELEMENT_NODE:
  -     case ENTITY_REFERENCE_NODE:
  -     default:
  -             break;
  -     }
  -     return value; 
  -            
  -     }
  -
  -     /**
  -      * Get number of character array chunks in
  -      * the string-value of a node.
  -      * (see http://www.w3.org/TR/xpath#data-model
  -      * for the definition of a node's string-value).
  -      * Note that a single text node may have multiple text chunks.
  -      *
  -      * EXPLANATION: This method is an artifact of the fact that the
  -      * underlying m_chars object may not store characters in a
  -      * single contiguous array -- for example,the current
  -      * FastStringBuffer may split a single node's text across
  -      * multiple allocation units.  This call tells us how many
  -      * separate accesses will be required to retrieve the entire
  -      * content. PLEASE NOTE that this may not be the same as the
  -      * number of SAX characters() events that caused the text node
  -      * to be built in the first place, since m_chars buffering may
  -      * be on different boundaries than the parser's buffers.
  -      *
  -      * @param nodeHandle The node ID.
  -      *
  -      * @return number of character array chunks in
  -      *         the string-value of a node.
  -      * */
  -     //###zaj - tbd
  -     public int getStringValueChunkCount(int nodeHandle)
  -     {
  -             //###zaj    return value 
  -             return 0;
  -     }
  -
  -     /**
  -      * Get a character array chunk in the string-value of a node.
  -      * (see http://www.w3.org/TR/xpath#data-model
  -      * for the definition of a node's string-value).
  -      * Note that a single text node may have multiple text chunks.
  -      *
  -      * EXPLANATION: This method is an artifact of the fact that
  -      * the underlying m_chars object may not store characters in a
  -      * single contiguous array -- for example,the current
  -      * FastStringBuffer may split a single node's text across
  -      * multiple allocation units.  This call retrieves a single
  -      * contiguous portion of the text -- as much as m-chars was
  -      * able to store in a single allocation unit.  PLEASE NOTE
  -      * that this may not be the same granularityas the SAX
  -      * characters() events that caused the text node to be built
  -      * in the first place, since m_chars buffering may be on
  -      * different boundaries than the parser's buffers.
  -      *
  -      * @param nodeHandle The node ID.
  -      * @param chunkIndex Which chunk to get.
  -      * @param startAndLen An array of 2 where the start position and length 
of
  -      *                    the chunk will be returned.
  -      *
  -      * @return The character array reference where the chunk occurs.  */
  -     //###zaj - tbd 
  -     public char[] getStringValueChunk(int nodeHandle, int chunkIndex,
  -                                                                             
                                                                int[] 
startAndLen) {return new char[0];}
  -
  -     /**
  -      * Given a node handle, return an ID that represents the node's 
expanded name.
  -      *
  -      * @param nodeHandle The handle to the node in question.
  -      *
  -      * @return the expanded-name id of the node.
  -      */
  -     public int getExpandedNameID(int nodeHandle) {
  -        nodes.readSlot(nodeHandle, gotslot);
  -
  -=======
  -
           // ========= Document Navigation Functions =========
   
           /** Given a node handle, test if it has child nodes.
  @@ -1563,9 +1061,7 @@
                   // Next Sibling is in the next position if it shares the 
same parent
                   int thisParent = nodes.readEntry(nodeHandle, 1);
                   
  -                // %REVIEW% jjk: Old code was reading from nodehandle+1.
  -                // That would be ++nodeHandle, not nodeHandle++. Check this!
  -                if (nodes.readEntry(nodeHandle++, 1) == thisParent)
  +                if (nodes.readEntry(++nodeHandle, 1) == thisParent)
                           return (m_docHandle | nodeHandle);
   
                   return NULL;
  @@ -1877,8 +1373,6 @@
            */
           public int getExpandedNameID(int nodeHandle) {
              nodes.readSlot(nodeHandle, gotslot);
  -
  ->>>>>>> 1.1.2.10
              String qName = m_localNames.indexToString(gotslot[3]); 
              // Remove prefix from qName
              // %TBD% jjk This is assuming the elementName is the qName.
  @@ -1905,18 +1399,6 @@
            * @return the expanded-name id of the node.
            */
           public int getExpandedNameID(String namespace, String localName, int 
type) {
  -<<<<<<< DTMDocumentImpl.java
  -        // Create expanded name
  -       // %TBD% jjk Expanded name is bitfield-encoded as
  -       // typeID[6]nsuriID[10]localID[16]. Switch to that form, and to
  -       // accessing the ns/local via their tables rather than confusing
  -       // nsnames and expandednames.
  -        String expandedName = namespace + ":" + localName;
  -        int expandedNameID = m_nsNames.stringToIndex(expandedName);
  -
  -        return expandedNameID;
  -     }
  -=======
              // Create expanded name
             // %TBD% jjk Expanded name is bitfield-encoded as
             // typeID[6]nsuriID[10]localID[16]. Switch to that form, and to
  @@ -1927,26 +1409,8 @@
   
              return expandedNameID;
           }
  ->>>>>>> 1.1.2.10
  -
   
   
  -<<<<<<< DTMDocumentImpl.java
  -     /**
  -      * Given an expanded-name ID, return the local name part.
  -      *
  -      * @param ExpandedNameID an ID that represents an expanded-name.
  -      * @return String Local name of this node.
  -      */
  -     public String getLocalNameFromExpandedNameID(int ExpandedNameID) {
  -
  -        // Get expanded name
  -        String expandedName = m_localNames.indexToString(ExpandedNameID); 
  -        // Remove prefix from expanded name
  -        int colonpos = expandedName.indexOf(":");
  -        String localName = expandedName.substring(colonpos+1);
  -
  -=======
           /**
            * Given an expanded-name ID, return the local name part.
            *
  @@ -1960,9 +1424,7 @@
              // Remove prefix from expanded name
              int colonpos = expandedName.indexOf(":");
              String localName = expandedName.substring(colonpos+1);
  -
  ->>>>>>> 1.1.2.10
  -        return localName;
  +        return localName;
           }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to