In "RemoveRange(IEnumerable<T> items)" in INPC.cs around line 540 the items get removed by:
foreach(var item in items) {
var index = IndexOf(item);
RemoveItemBase(index);
}
In case one of the items is not present, "index" is -1 and RemoveItemBase eventually results in an ArgumentOutOfRangeException. I'm not sure if this is the desired behavior but I think RemoveItemBase(index) should only be called here if the index is >= 0. This would be more in line with other ICollection implementations in .NET which simply return false if one tries to remove a non-existent item. If one tries to call RemoveAt(-1) it's a different matter and an exception is justified by the fact that the index comes from outside. But in RemoveRange we talk about internal code.