BITS=[16,8,4,2,1];BASE32="0123456789bcdefghjkmnpqrstuvwxyz";NEIGHBORS={right:{even:"bc01fg45238967deuvhjyznpkmstqrwx"},left:{even:"238967debc01fg45kmstqrwxuvhjyznp"},top:{even:"p0r21436x8zb9dcf5h7kjnmqesgutwvy"},bottom:{even:"14365h7k9dcfesgujnmqp0r2twvyx8zb"}};BORDERS={right:{even:"bcfguvyz"},left:{even:"0145hjnp"},top:{even:"prxz"},bottom:{even:"028b"}};NEIGHBORS.bottom.odd=NEIGHBORS.left.even;NEIGHBORS.top.odd=NEIGHBORS.right.even;NEIGHBORS.left.odd=NEIGHBORS.bottom.even;NEIGHBORS.right.odd=NEIGHBORS.top.even;BORDERS.bottom.odd=BORDERS.left.even;BORDERS.top.odd=BORDERS.right.even;BORDERS.left.odd=BORDERS.bottom.even;BORDERS.right.odd=BORDERS.top.even;function refine_interval(B,C,A){if(C&A){B[0]=(B[0]+B[1])/2}else{B[1]=(B[0]+B[1])/2}}function calculateAdjacent(E,B){E=E.toLowerCase();var A=E.charAt(E.length-1);var C=(E.length%2)?"odd":"even";var D=E.substring(0,E.length-1);if(BORDERS[B][C].indexOf(A)!=-1){D=calculateAdjacent(D,B)}return D+BASE32[NEIGHBORS[B][C].indexOf(A)]}function decodeGeoHash(B){var A=1;var C=[];var D=[];C[0]=-90;C[1]=90;D[0]=-180;D[1]=180;lat_err=90;lon_err=180;for(i=0;i<B.length;i++){c=B[i];cd=BASE32.indexOf(c);for(j=0;j<5;j++){mask=BITS[j];if(A){lon_err/=2;refine_interval(D,cd,mask)}else{lat_err/=2;refine_interval(C,cd,mask)}A=!A}}C[2]=(C[0]+C[1])/2;D[2]=(D[0]+D[1])/2;return{latitude:C,longitude:D}}function encodeGeoHash(H,A){var D=1;var E=0;var G=[];var C=[];var I=0;var B=0;var F=12;geohash="";G[0]=-90;G[1]=90;C[0]=-180;C[1]=180;while(geohash.length<F){if(D){mid=(C[0]+C[1])/2;if(A>mid){B|=BITS[I];C[0]=mid}else{C[1]=mid}}else{mid=(G[0]+G[1])/2;if(H>mid){B|=BITS[I];G[0]=mid}else{G[1]=mid}}D=!D;if(I<4){I++}else{geohash+=BASE32[B];I=0;B=0}}return geohash};