internal static Duo <XmlNode, string> GetNodeAtPosition(XmlNode node, int selectionStart, int selectionLength, XmlNodeType moveUpTo, params XmlNodeType[] moveUpIf) { XmlNode parentNode = null; string str = null; string str2; if ((((node != null) && !SharedUtil.IsEmpty(str2 = node.OuterXml)) && ((selectionStart >= 0) && (selectionStart <= str2.Length))) && ((selectionLength >= 0) && ((selectionStart + selectionLength) <= str2.Length))) { str = str2.Substring(selectionStart, selectionLength); if (!node.HasChildNodes) { parentNode = node; } else { int num; string innerXml = node.InnerXml; int num2 = num = str2.IndexOf(innerXml, str2.IndexOf('>')); if (num2 < 0) { num2 = num = 0; } if (selectionStart >= num) { foreach (XmlNode node3 in node.ChildNodes) { if (((selectionStart >= num2) && (selectionStart < (num2 + node3.OuterXml.Length))) && ((parentNode = GetNodeAtPosition(node3, selectionStart - num2, selectionLength, moveUpTo, new XmlNodeType[0]).Value1) != null)) { break; } num2 += node3.OuterXml.Length; } } if (parentNode == null) { parentNode = node; } } if (moveUpTo != XmlNodeType.None) { while (((parentNode != null) && (parentNode.NodeType != moveUpTo)) && (parentNode.ParentNode != null)) { parentNode = parentNode.ParentNode; } } else if (!SharedUtil.IsEmpty((ICollection)moveUpIf)) { while (((parentNode != null) && SharedUtil.In <XmlNodeType>(parentNode.NodeType, moveUpIf)) && (parentNode.ParentNode != null)) { parentNode = parentNode.ParentNode; } } } return(new Duo <XmlNode, string>(parentNode, str)); }