whole_func_string: function updateNodes(parent, old, vnodes, recycling, hooks, nextSibling, ns) {
  		if (old === vnodes || old == null && vnodes == null) return
  		else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns)
  		else if (vnodes == null) removeNodes(old, 0, old.length, vnodes)
  		else {
  			if (old.length === vnodes.length) {
  				var isUnkeyed = false
  				for (var i = 0; i < vnodes.length; i++) {
  					if (vnodes[i] != null && old[i] != null) {
  						isUnkeyed = vnodes[i].key == null && old[i].key == null
  						break
  					}
  				}
  				if (isUnkeyed) {
  					for (var i = 0; i < old.length; i++) {
  						if (old[i] === vnodes[i]) continue
  						else if (old[i] == null && vnodes[i] != null) createNode(parent, vnodes[i], hooks, ns, getNextSibling(old, i + 1, nextSibling))
  						else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes)
  						else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), recycling, ns)
  					}
  					return
  				}
  			}
  			recycling = recycling || isRecyclable(old, vnodes)
  			if (recycling) {
  				var pool = old.pool
  				old = old.concat(old.pool)
  			}
  			var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map
  			while (oldEnd >= oldStart && end >= start) {
  				var o = old[oldStart], v = vnodes[start]
  				if (o === v && !recycling) oldStart++, start++
  				else if (o == null) oldStart++
  				else if (v == null) start++
  				else if (o.key === v.key) {
  					var shouldRecycle = (pool != null && oldStart >= old.length - pool.length) || ((pool == null) && recycling)
  					oldStart++, start++
  					updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), shouldRecycle, ns)
  					if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling)
  				}
  				else {
  					var o = old[oldEnd]
  					if (o === v && !recycling) oldEnd--, start++
  					else if (o == null) oldEnd--
  					else if (v == null) start++
  					else if (o.key === v.key) {
  						var shouldRecycle = (pool != null && oldEnd >= old.length - pool.length) || ((pool == null) && recycling)
  						updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), shouldRecycle, ns)
  						if (recycling || start < end) insertNode(parent, toFragment(o), getNextSibling(old, oldStart, nextSibling))
  						oldEnd--, start++
  					}
  					else break
  				}
  			}
  			while (oldEnd >= oldStart && end >= start) {
  				var o = old[oldEnd], v = vnodes[end]
  				if (o === v && !recycling) oldEnd--, end--
  				else if (o == null) oldEnd--
  				else if (v == null) end--
  				else if (o.key === v.key) {
  					var shouldRecycle = (pool != null && oldEnd >= old.length - pool.length) || ((pool == null) && recycling)
  					updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), shouldRecycle, ns)
  					if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling)
  					if (o.dom != null) nextSibling = o.dom
  					oldEnd--, end--
  				}
  				else {
  					if (!map) map = getKeyMap(old, oldEnd)
  					if (v != null) {
  						var oldIndex = map[v.key]
  						if (oldIndex != null) {
  							var movable = old[oldIndex]
  							var shouldRecycle = (pool != null && oldIndex >= old.length - pool.length) || ((pool == null) && recycling)
  							updateNode(parent, movable, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns)
  							insertNode(parent, toFragment(movable), nextSibling)
  							old[oldIndex].skip = true
  							if (movable.dom != null) nextSibling = movable.dom
  						}
  						else {
  							var dom = createNode(parent, v, hooks, ns, nextSibling)
  							nextSibling = dom
  						}
  					}
  					end--
  				}
  				if (end < start) break
  			}
  			createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)
  			removeNodes(old, oldStart, oldEnd + 1, vnodes)
  		}
  	}
func_code_string: function updateNodes(parent, old, vnodes, recycling, hooks, nextSibling, ns) {
  		if (old === vnodes || old == null && vnodes == null) return
  		else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns)
  		else if (vnodes == null) removeNodes(old, 0, old.length, vnodes)
  		else {
  			if (old.length === vnodes.length) {
  				var isUnkeyed = false
  				for (var i = 0; i < vnodes.length; i++) {
  					if (vnodes[i] != null && old[i] != null) {
  						isUnkeyed = vnodes[i].key == null && old[i].key == null
  						break
  					}
  				}
  				if (isUnkeyed) {
  					for (var i = 0; i < old.length; i++) {
  						if (old[i] === vnodes[i]) continue
  						else if (old[i] == null && vnodes[i] != null) createNode(parent, vnodes[i], hooks, ns, getNextSibling(old, i + 1, nextSibling))
  						else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes)
  						else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), recycling, ns)
  					}
  					return
  				}
  			}
  			recycling = recycling || isRecyclable(old, vnodes)
  			if (recycling) {
  				var pool = old.pool
  				old = old.concat(old.pool)
  			}
  			var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map
  			while (oldEnd >= oldStart && end >= start) {
  				var o = old[oldStart], v = vnodes[start]
  				if (o === v && !recycling) oldStart++, start++
  				else if (o == null) oldStart++
  				else if (v == null) start++
  				else if (o.key === v.key) {
  					var shouldRecycle = (pool != null && oldStart >= old.length - pool.length) || ((pool == null) && recycling)
  					oldStart++, start++
  					updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), shouldRecycle, ns)
  					if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling)
  				}
  				else {
  					var o = old[oldEnd]
  					if (o === v && !recycling) oldEnd--, start++
  					else if (o == null) oldEnd--
  					else if (v == null) start++
  					else if (o.key === v.key) {
  						var shouldRecycle = (pool != null && oldEnd >= old.length - pool.length) || ((pool == null) && recycling)
  						updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), shouldRecycle, ns)
  						if (recycling || start < end) insertNode(parent, toFragment(o), getNextSibling(old, oldStart, nextSibling))
  						oldEnd--, start++
  					}
  					else break
  				}
  			}
  			while (oldEnd >= oldStart && end >= start) {
  				var o = old[oldEnd], v = vnodes[end]
  				if (o === v && !recycling) oldEnd--, end--
  				else if (o == null) oldEnd--
  				else if (v == null) end--
  				else if (o.key === v.key) {
  					var shouldRecycle = (pool != null && oldEnd >= old.length - pool.length) || ((pool == null) && recycling)
  					updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), shouldRecycle, ns)
  					if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling)
  					if (o.dom != null) nextSibling = o.dom
  					oldEnd--, end--
  				}
  				else {
  					if (!map) map = getKeyMap(old, oldEnd)
  					if (v != null) {
  						var oldIndex = map[v.key]
  						if (oldIndex != null) {
  							var movable = old[oldIndex]
  							var shouldRecycle = (pool != null && oldIndex >= old.length - pool.length) || ((pool == null) && recycling)
  							updateNode(parent, movable, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns)
  							insertNode(parent, toFragment(movable), nextSibling)
  							old[oldIndex].skip = true
  							if (movable.dom != null) nextSibling = movable.dom
  						}
  						else {
  							var dom = createNode(parent, v, hooks, ns, nextSibling)
  							nextSibling = dom
  						}
  					}
  					end--
  				}
  				if (end < start) break
  			}
  			createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)
  			removeNodes(old, oldStart, oldEnd + 1, vnodes)
  		}
  	}
func_documentation_string: update