Updated URL to the new getting started page - the old one was throwing a javascript error because it was hosted on the GitHub wiki, which doesn't support IE 8 (which is what is in Visual Studio 2012 and 2013). New page hosted on GitHub pages.
Fix for "disappearing breadcrumb" problem, which was actually caused by an invalid match which caused the breadcrumb to appear when it was misconfigured, and then disappear (as it should have not appeared in the first place). This involved not storing the URL for matching unless it is provided explicitly in the Url property or it is provided by a non-default URL resolver in which case we can't assume we can use route values for the match. An additional collection was added to check whether we have any duplicate URLs, since a partial URL list no longer serves that purpose.
Changed resolved URL caching logic so it only caches if there are no custom RouteValue parameters, since depending on the state of the request (the current node) these cached values could be incorrect, leading to confusion. Basically, this means any nodes configured with "id" will be resolved on demand, and only the nodes with area, controller, and action (with nothing more) will be cached, if caching is enabled.
Fixed node matching logic when two nodes with the same route key and different route value are used, the match wasn't hitting the correct node if the wrong breadcrumb shown. This issue probably existed for awhile, but was hidden by the fact that the URL matched on instead of the route values because the URL was stored previously. Went back to the v3 source and confirmed that the check for an exact match was missing before comparing the match including the action method parameter. Had to change 2 failing unit tests, which I suspect were incorrect all along.
Factored duplicate looping logic in MatchesRoute into another method.
Removed unnecessary recursion from SiteMap.FindSiteMapNodeFromControllerAction method. This both turns a recursive lookup into a simple loop on the keyTable and also bypasses the authorization check, which is deferred until the matching node is found.
Refactored FindSiteMapNodeFromMvc and FindSiteMapFromControllerAction. Renamed FindSiteMapNodeFromControllerAction to FindSiteMapNodeFromMvcRoute because controller action is not taken into account in this method.
Fixed RouteValueDictionary so it no longer requires action method parameters because they are no longer being considered in the comparison.
Removed call to ResolveActionMethodParameters from SiteMapNode.MatchesRoute() because it is no longer needed.
Revert "Removed call to ResolveActionMethodParameters from SiteMapNode.MatchesRoute() because it is no longer needed."

This reverts commit f4da87e9eff006251cdd9fac042e33c0175eae52.
Removed call to ResolveActionMethodParameters from SiteMapNode.MatchesRoute() because it is no longer required, and changed call to use the new overload of RouteValues.MatchesRoute() that doesn't accept action parameters.
Deprecated the ResolveActionMethodParameters() method, but left the implementation in place in case it is being used (it is public). Left comments as reminders to remove the ActionMethodParameterResolver and related types in version 5.
Removed UrlParameter.Optional from the list of possibilities for an empty value match because it is never passed in from the routing infrastructure and also the string.IsNullOrEmpty(value.ToString()) case would cover it anyway.
Updated unit tests for NodeMatchesRoute 1) call the new overload that doesn't accept actionParmeters as a parameter 2) consider only the lowercase version of controller, action, and area from the route source because those are the only possibilities 3) removed all unit tests that only existed to test the functionality of actionParameters 4) removed all unit tests that only existed to test the UrlParameter.Optional case, which isn't a possibility
Performance: Fixed issue in SiteMapPathHelper where a passed in startingNodeKey would cause 2 node searches instead of 1.