var Hashtable=(function(){function n(z){return(typeof z==="undefined")}function l(z){return(typeof z==="function")}function j(z){return(typeof z==="string")}function f(A,z){return l(A[z])}function m(z){return f(z,"equals")}function k(z){return f(z,"hashCode")}function h(A){if(j(A)){return A}else{if(k(A)){var z=A.hashCode();if(!j(z)){return h(z)}return z}else{if(f(A,"toString")){return A.toString()}else{return String(A)}}}}function i(A,z){return A.equals(z)}function d(A,z){if(m(z)){return z.equals(A)}else{return A===z}}function a(A,z){return A===z}function g(B,F,E,D,A){var C;for(var G=0,z=B.length;G<z;G++){C=B[G];if(A(F,E(C))){return D?[G,C]:true}}return false}function t(B,A){if(f(B,"splice")){B.splice(A,1)}else{if(A===B.length-1){B.length=A}else{var D=B.slice(A+1);B.length=A;for(var C=0,z=D.length;C<z;C++){B[A+C]=D[C]}}}}function o(A,z){if(A===null){throw new Error("null is not a valid "+z)}else{if(n(A)){throw new Error(z+" must not be undefined")}}}var s="key",r="value";function q(z){o(z,s)}function y(z){o(z,r)}function x(z,B,A){this.entries=[];this.addEntry(z,B);if(A!==null){this.getEqualityFunction=function(){return A}}}function w(z){return z[0]}function v(z){return z[1]}x.prototype={getEqualityFunction:function(z){if(m(z)){return i}else{return d}},searchForEntry:function(z){return g(this.entries,z,w,true,this.getEqualityFunction(z))},getEntryForKey:function(z){return this.searchForEntry(z)[1]},getEntryIndexForKey:function(z){return this.searchForEntry(z)[0]},removeEntryForKey:function(A){var z=this.searchForEntry(A);if(z){t(this.entries,z[0]);return true}return false},addEntry:function(A,z){this.entries[this.entries.length]=[A,z]},size:function(){return this.entries.length},keys:function(B){var A=B.length;for(var C=0,z=this.entries.length;C<z;C++){B[A+C]=this.entries[C][0]}},values:function(C){var B=C.length;for(var A=0,z=this.entries.length;A<z;A++){C[B+A]=this.entries[A][1]}},containsKey:function(z){return g(this.entries,z,w,false,this.getEqualityFunction(z))},containsValue:function(z){return g(this.entries,z,v,false,a)}};function e(){}e.prototype=[];function c(z){return z[0]}function b(B,A,z){return g(B,A,c,true,z)}function u(B,A){var z=B[A];if(z&&(z instanceof e)){return z[1]}return null}function p(C,B){var A=[];var z={};C=l(C)?C:h;B=l(B)?B:null;this.put=function(D,I){q(D);y(I);var H=C(D);var F=u(z,H);if(F){var G=F.getEntryForKey(D);if(G){G[1]=I}else{F.addEntry(D,I)}}else{var E=new e();E[0]=H;E[1]=new x(D,I,B);A[A.length]=E;z[H]=E}};this.get=function(E){q(E);var G=C(E);var F=u(z,G);if(F){var D=F.getEntryForKey(E);if(D){return D[1]}}return null};this.containsKey=function(F){q(F);var E=C(F);var D=u(z,E);if(D){return D.containsKey(F)}return false};this.containsValue=function(E){y(E);for(var F=0,D=A.length;F<D;F++){if(A[F][1].containsValue(E)){return true}}return false};this.clear=function(){A.length=0;z={}};this.isEmpty=function(){return A.length===0};this.keys=function(){var E=[];for(var F=0,D=A.length;F<D;F++){A[F][1].keys(E)}return E};this.values=function(){var F=[];for(var E=0,D=A.length;E<D;E++){A[E][1].values(F)}return F};this.remove=function(D){q(D);var G=C(D);var F=u(z,G);if(F){if(F.removeEntryForKey(D)){if(F.size()===0){var E=b(A,G,F.getEqualityFunction(D));t(A,E[0]);delete z[G]}}}};this.size=function(){var F=0;for(var E=0,D=A.length;E<D;E++){F+=A[E][1].size()}return F}}return p})();