whole_func_string: function replaceWith($rootElement, elementsToRemove, newNode) {
        var firstElementToRemove = elementsToRemove[0],
            removeCount = elementsToRemove.length,
            parent = firstElementToRemove.parentNode,
            i, ii;
  
        if ($rootElement) {
          for (i = 0, ii = $rootElement.length; i < ii; i++) {
            if ($rootElement[i] === firstElementToRemove) {
              $rootElement[i++] = newNode;
              for (var j = i, j2 = j + removeCount - 1,
                       jj = $rootElement.length;
                   j < jj; j++, j2++) {
                if (j2 < jj) {
                  $rootElement[j] = $rootElement[j2];
                } else {
                  delete $rootElement[j];
                }
              }
              $rootElement.length -= removeCount - 1;
  
              // If the replaced element is also the jQuery .context then replace it
              // .context is a deprecated jQuery api, so we should set it only when jQuery set it
              // http://api.jquery.com/context/
              if ($rootElement.context === firstElementToRemove) {
                $rootElement.context = newNode;
              }
              break;
            }
          }
        }
  
        if (parent) {
          parent.replaceChild(newNode, firstElementToRemove);
        }
  
        // Append all the `elementsToRemove` to a fragment. This will...
        // - remove them from the DOM
        // - allow them to still be traversed with .nextSibling
        // - allow a single fragment.qSA to fetch all elements being removed
        var fragment = window.document.createDocumentFragment();
        for (i = 0; i < removeCount; i++) {
          fragment.appendChild(elementsToRemove[i]);
        }
  
        if (jqLite.hasData(firstElementToRemove)) {
          // Copy over user data (that includes AngularJS's $scope etc.). Don't copy private
          // data here because there's no public interface in jQuery to do that and copying over
          // event listeners (which is the main use of private data) wouldn't work anyway.
          jqLite.data(newNode, jqLite.data(firstElementToRemove));
  
          // Remove $destroy event listeners from `firstElementToRemove`
          jqLite(firstElementToRemove).off('$destroy');
        }
  
        // Cleanup any data/listeners on the elements and children.
        // This includes invoking the $destroy event on any elements with listeners.
        jqLite.cleanData(fragment.querySelectorAll('*'));
  
        // Update the jqLite collection to only contain the `newNode`
        for (i = 1; i < removeCount; i++) {
          delete elementsToRemove[i];
        }
        elementsToRemove[0] = newNode;
        elementsToRemove.length = 1;
      }
func_code_string: function replaceWith($rootElement, elementsToRemove, newNode) {
        var firstElementToRemove = elementsToRemove[0],
            removeCount = elementsToRemove.length,
            parent = firstElementToRemove.parentNode,
            i, ii;
  
        if ($rootElement) {
          for (i = 0, ii = $rootElement.length; i < ii; i++) {
            if ($rootElement[i] === firstElementToRemove) {
              $rootElement[i++] = newNode;
              for (var j = i, j2 = j + removeCount - 1,
                       jj = $rootElement.length;
                   j < jj; j++, j2++) {
                if (j2 < jj) {
                  $rootElement[j] = $rootElement[j2];
                } else {
                  delete $rootElement[j];
                }
              }
              $rootElement.length -= removeCount - 1;
  
              // If the replaced element is also the jQuery .context then replace it
              // .context is a deprecated jQuery api, so we should set it only when jQuery set it
              // http://api.jquery.com/context/
              if ($rootElement.context === firstElementToRemove) {
                $rootElement.context = newNode;
              }
              break;
            }
          }
        }
  
        if (parent) {
          parent.replaceChild(newNode, firstElementToRemove);
        }
  
        // Append all the `elementsToRemove` to a fragment. This will...
        // - remove them from the DOM
        // - allow them to still be traversed with .nextSibling
        // - allow a single fragment.qSA to fetch all elements being removed
        var fragment = window.document.createDocumentFragment();
        for (i = 0; i < removeCount; i++) {
          fragment.appendChild(elementsToRemove[i]);
        }
  
        if (jqLite.hasData(firstElementToRemove)) {
          // Copy over user data (that includes AngularJS's $scope etc.). Don't copy private
          // data here because there's no public interface in jQuery to do that and copying over
          // event listeners (which is the main use of private data) wouldn't work anyway.
          jqLite.data(newNode, jqLite.data(firstElementToRemove));
  
          // Remove $destroy event listeners from `firstElementToRemove`
          jqLite(firstElementToRemove).off('$destroy');
        }
  
        // Cleanup any data/listeners on the elements and children.
        // This includes invoking the $destroy event on any elements with listeners.
        jqLite.cleanData(fragment.querySelectorAll('*'));
  
        // Update the jqLite collection to only contain the `newNode`
        for (i = 1; i < removeCount; i++) {
          delete elementsToRemove[i];
        }
        elementsToRemove[0] = newNode;
        elementsToRemove.length = 1;
      }
func_documentation_string: This is a special jqLite.replaceWith, which can replace items which
  have no parents, provided that the containing jqLite collection is provided.
  
  @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes
  in the root of the tree.
  @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep
  the shell, but replace its DOM node reference.
  @param {Node} newNode The new DOM node.