                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

if(typeof(vp)=="undefined")
{var vp=function(){};}
vp.comparer=function(){};vp.comparer.caseSensitive=function(o1,o2)
{if(o1>o2)
{return 1;}
else if(o1<o2)
{return-1;}
else if(o1==o2)
{return 0;}};vp.comparer.caseInsensitive=function(o1,o2)
{return vp.comparer.caseSensitive(o1.toLowerCase(),o2.toLowerCase());};vp.comparer.prefixSearchComparer=function(o1,o2)
{var sCompareTo=o1.toLowerCase();var sSubject=o2.toLowerCase();if(sSubject.startsWith&&sSubject.startsWith(sCompareTo,true))
{return 0;}
return vp.comparer.caseInsensitive(sCompareTo,sSubject);};vp.comparer.__getComparer=function(bCaseSensitiveOrCompareFunction)
{if(typeof(bCaseSensitiveOrCompareFunction)=="undefined"||bCaseSensitiveOrCompareFunction===null)
{return vp.comparer.caseSensitive;}
else if(typeof(bCaseSensitiveOrCompareFunction)=="function")
{return bCaseSensitiveOrCompareFunction;}
else if(!bCaseSensitiveOrCompareFunction)
{return vp.comparer.caseInsensitive;}
else if(bCaseSensitiveOrCompareFunction)
{return vp.comparer.caseSensitive;}};Array.prototype.indexOf=function(vValue,bCaseSensitiveOrCompareFunction)
{var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);var iLen=this.length;for(var i=0;i<iLen;i++)
{if(fnCompare(this[i],vValue)===0)
{return i;}}
return-1;};Array.prototype.contains=function(vValue,bCaseSensitiveOrCompareFunction)
{return this.indexOf(vValue,bCaseSensitiveOrCompareFunction)!=-1;};Array.prototype.add=function(vValue)
{this.push(vValue);};Array.prototype.append=function(aArr)
{var iLen=aArr.length;for(var i=0;i<iLen;i++)
{this.push(aArr[i]);}};Array.prototype.insert=function(vValue,iIndex)
{for(var i=this.length;i>iIndex;i--)
{this[i]=this[i-1];}
this[iIndex]=vValue;};Array.prototype.remove=function(iIndex)
{if(typeof(iIndex)!="number")
{throw new Error("Array.remove requires an integer argument");}
this.splice(iIndex,1);};Array.prototype.removeAll=function()
{while(this.length>0)
{this.remove(0);}};Array.prototype.removeValue=function(vValue)
{var iIndex=this.indexOf(vValue);if(iIndex!=-1)
{this.remove(iIndex);}};Array.prototype.binarySearch=function(vValue,bCaseSensitiveOrCompareFunction)
{var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);var iLow,iHigh,iMid,iRound;iLow=0;iHigh=this.length-1;iRound=0;while(iLow<=iHigh){iRound++;iMid=Math.floor((iLow+iHigh)/2);var iCompare=fnCompare(vValue,this[iMid]);if(iCompare<0)
{iHigh=iMid-1;}
else if(iCompare>0)
{iLow=iMid+1;}
else
{return iMid;}}
return-1;};Array.prototype.insertSorted=function(vValue,bCaseSensitiveOrCompareFunction)
{var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);var iLow,iHigh,iMid,iRound;iLow=0;iHigh=this.length-1;iRound=0;while(iLow<=iHigh){iRound++;iMid=Math.floor((iLow+iHigh)/2);var iCompare=fnCompare(vValue,this[iMid]);if(iCompare<0)
{iHigh=iMid-1;}
else if(iCompare>0)
{iLow=iMid+1;}
else
{break;}}
if(fnCompare(vValue,this[iMid])>0){this.insert(vValue,iMid+1);}else{this.insert(vValue,iMid);}};Array.prototype.findAllStartsWith=function(sPrefix)
{var index=this.binarySearch(sPrefix,vp.comparer.prefixSearchComparer);if(index<0)
{return new Array();}
var startIndex=index;do
{startIndex--;}while(startIndex>=0&&this[startIndex].startsWith(sPrefix,true));startIndex++;var endIndex=index+1;while(endIndex<this.length&&this[endIndex].startsWith(sPrefix,true))
{endIndex++;}
endIndex--;var results=new Array();index=startIndex;for(index=startIndex;index<=endIndex;index++)
{results.push(this[index]);}
return results;};Array.prototype.appendSorted=function(arr,bCaseSensitiveOrCompareFunction,bRemoveDuplicates){var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);var arr1=this;var arr2=arr;var i=0;var j=0;var aOut=[];while(i<arr1.length||j<arr2.length)
{if(i>=arr1.length)
{aOut.add(arr2[j]);j++;continue;}
if(j>=arr2.length)
{aOut.add(arr2[i]);i++;continue;}
var iCompare=fnCompare(arr1[i],arr2[j]);if(iCompare<0)
{aOut.add(arr1[i]);i++;}
else if(iCompare>0)
{aOut.add(arr2[j]);j++;}
else
{aOut.add(arr1[i]);if(!bRemoveDuplicates)
{aOut.add(arr2[j]);}
i++;j++;}}
this.removeAll();this.append(aOut);};Array.prototype.equals=function(aCompare)
{if(this.length!=aCompare.length)
{return false;}
for(var i=0;i<this.length;i++)
{if(this[i]!==aCompare[i])
{return false;}}
return true;};if(!Array.prototype.map)
{Array.prototype.map=function(fnAction,oThis)
{var iLen=this.length;if(typeof fnAction!="function")
{throw new TypeError();}
var aOut=new Array(iLen);for(var i=0;i<iLen;i++)
{if(i in this)
{aOut[i]=fnAction.call(oThis,this[i],i,this);}}
return aOut;};}
