Utils.LinkedList=function(){};Utils.LinkedList.prototype={length:0,first:null,last:null,each:function(a){var b=this.first,n=this.length;for(var i=0;i<n;i++){a(b,i);b=b.next}},empty:function(){var a=this.first,b,n=this.length;for(var i=0;i<n;i++){b=a.next;this.remove(a);a=b}},at:function(i){if(!(i>=0&&i<this.length)){return null}var a=this.first;while(i--){a=a.next}return a},randomNode:function(){var n=Math.floor(Math.random()*this.length);return this.at(n)},indexOf:function(a){var b=this.first,n=this.length;for(var i=0;i<n;i++){if(b==a){return i}b=b.next}return null},toArray:function(){var a=[],b=this.first,n=this.length;while(n--){a.push(b.data||b);b=b.next}return a}};Utils.LinkedList.Node=function(a){this.prev=null;this.next=null;this.data=a};Utils.LinkedList.Circular=function(){};Object.extend(Utils.LinkedList.Circular.prototype,Utils.LinkedList.prototype);Object.extend(Utils.LinkedList.Circular.prototype,{append:function(a){if(this.first===null){a.prev=a;a.next=a;this.first=a;this.last=a}else{a.prev=this.last;a.next=this.first;this.first.prev=a;this.last.next=a;this.last=a}this.length++},prepend:function(a){if(this.first===null){this.append(a);return}else{a.prev=this.last;a.next=this.first;this.first.prev=a;this.last.next=a;this.first=a}this.length++},insertAfter:function(a,b){b.prev=a;b.next=a.next;a.next.prev=b;a.next=b;if(b.prev==this.last){this.last=b}this.length++},insertBefore:function(a,b){b.prev=a.prev;b.next=a;a.prev.next=b;a.prev=b;if(b.next==this.first){this.first=b}this.length++},remove:function(a){if(this.length>1){a.prev.next=a.next;a.next.prev=a.prev;if(a==this.first){this.first=a.next}if(a==this.last){this.last=a.prev}}else{this.first=null;this.last=null}a.prev=null;a.next=null;this.length--}});