From d1f63f2c5f3d44df164e5928cede51b763dd9897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Alexis=20Guerra=20G=C3=B3mez?= Date: Tue, 19 Jun 2012 15:31:55 -0400 Subject: [PATCH 1/4] Adding support for dimension.top() in ascending order --- src/crossfilter.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/crossfilter.js b/src/crossfilter.js index d11e9e38..09484bed 100644 --- a/src/crossfilter.js +++ b/src/crossfilter.js @@ -42,6 +42,7 @@ function crossfilter() { filterRange: filterRange, filterAll: filterAll, top: top, + topAsc: topAsc, group: group, groupAll: groupAll }; @@ -222,6 +223,24 @@ function crossfilter() { return array; } + + // Basically same as top but on ascending order + // Note: observes this dimension's filter, unlike group and groupAll. + function topAsc(k) { + var array = [], + i = lo0, + j; + + while (i < hi0 && k > 0) { + if (!filters[j = index[i]]) { + array.push(data[j]); + --k; + } + i++; + } + + return array; + } // Adds a new group to this dimension, using the specified key function. function group(key) { From 09243d24e36aef6ef3255fdd5b568eff3f382499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Alexis=20Guerra=20G=C3=B3mez?= Date: Tue, 19 Jun 2012 15:32:10 -0400 Subject: [PATCH 2/4] Adding support for dimension.top() in ascending order --- crossfilter.js | 19 +++++++++++++++++++ crossfilter.min.js | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/crossfilter.js b/crossfilter.js index 1aaabca2..e5e41794 100644 --- a/crossfilter.js +++ b/crossfilter.js @@ -557,6 +557,7 @@ function crossfilter() { filterRange: filterRange, filterAll: filterAll, top: top, + topAsc: topAsc, group: group, groupAll: groupAll }; @@ -737,6 +738,24 @@ function crossfilter() { return array; } + + // Basically same as top but on ascending order + // Note: observes this dimension's filter, unlike group and groupAll. + function topAsc(k) { + var array = [], + i = lo0, + j; + + while (i < hi0 && k > 0) { + if (!filters[j = index[i]]) { + array.push(data[j]); + --k; + } + i++; + } + + return array; + } // Adds a new group to this dimension, using the specified key function. function group(key) { diff --git a/crossfilter.min.js b/crossfilter.min.js index 981f0d64..9844d7ef 100644 --- a/crossfilter.min.js +++ b/crossfilter.min.js @@ -1 +1 @@ -(function(a){function b(a){return a}function c(a,b){for(var c=0,d=b.length,e=new Array(d);c>1;a(b[f])>1;c>>1)+1;while(--f>0)d(a,f,e,b);return a}function c(a,b,c){var e=c-b,f;while(--e>0)f=a[b],a[b]=a[b+e],a[b+e]=f,d(a,1,e,b);return a}function d(b,c,d,e){var f=b[--e+c],g=a(f),h;while((h=c<<1)<=d){ha(b[e+h+1])&&h++;if(g<=a(b[e+h]))break;b[e+c]=b[e+h],c=h}b[e+c]=f}return b.sort=c,b}function i(a){function c(c,d,e,f){var g=new Array(f=Math.min(e-d,f)),h,i,j,k;for(i=0;ih)g[0]=k,h=a(b(g,0,f)[0]);while(++dc&&a(b[f-1])>h;--f)b[f]=b[f-1];b[f]=g}return b}return b}function m(a){function c(a,c,e){return(e-c>1,j=i-f,k=i+f,l=b[g],m=a(l),n=b[j],o=a(n),p=b[i],q=a(p),r=b[k],s=a(r),t=b[h],u=a(t),v;m>o&&(v=l,l=n,n=v,v=m,m=o,o=v),s>u&&(v=r,r=t,t=v,v=s,s=u,u=v),m>q&&(v=l,l=p,p=v,v=m,m=q,q=v),o>q&&(v=n,n=p,p=v,v=o,o=q,q=v),m>s&&(v=l,l=r,r=v,v=m,m=s,s=v),q>s&&(v=p,p=r,r=v,v=q,q=s,s=v),o>u&&(v=n,n=t,t=v,v=o,o=u,u=v),o>q&&(v=n,n=p,p=v,v=o,o=q,q=v),s>u&&(v=r,r=t,t=v,v=s,s=u,u=v);var w=n,x=o,y=r,z=s;b[g]=l,b[j]=b[d],b[i]=p,b[k]=b[e-1],b[h]=t;var A=d+1,B=e-2,C=x<=z&&x>=z;if(C)for(var D=A;D<=B;++D){var E=b[D],F=a(E);if(Fx)for(;;){var G=a(b[B]);if(G>x){B--;continue}if(Gz)for(;;){var G=a(b[B]);if(G>z){B--;if(Bh){var H,G;while((H=a(b[A]))<=x&&H>=x)++A;while((G=a(b[B]))<=z&&G>=z)--B;for(var D=A;D<=B;D++){var E=b[D],F=a(E);if(F<=x&&F>=x)D!==A&&(b[D]=b[A],b[A]=E),A++;else if(F<=z&&F>=z)for(;;){var G=a(b[B]);if(G<=z&&G>=z){B--;if(BN)for(b=N,c=Math.min(e,O);bO)for(b=Math.max(e,O),c=f;b=N&&a>0)k[d=D[c]]||(b.push(e[d]),--a);return b}function X(a){function K(b,c,g,i){function Q(){++n===m&&(p=s(p,j<<=1),h=s(h,j),m=G(j))}var o=d,p=E(n,m),t=v,u=F,w=n,y=0,z=0,A,B,C,D,K,L;J&&(t=u=x),d=new Array(n),n=0,h=w>1?r(h,f):E(f,m),w&&(C=(B=o[0]).key);while(z=D))++z;while(zL)){h[A=c[z]+g]=n,k[A]&q||(K.value=t(K.value,e[A]));if(++z>=i)break;D=a(b[z])}Q()}while(yy)for(y=0;y1?(H=M,I=O):(n===1?(H=N,I=P):(H=x,I=x),h=null),l[A]=H}function M(a,b,c){if(a===p||J)return;var f,g,i,j;for(f=0,i=b.length;fj&&(k=s(k,j<<=1)),P(e,0,f),Q(e,0,f),o}function t(){function i(a,d,g){var i;if(h)return;for(i=d;i>1;e(t[s])>1;n>>1)+1;while(--s>0)r(e,s,i,t);return e}function n(e,t,n){var i=n-t,s;while(--i>0)s=e[t],e[t]=e[t+i],e[t+i]=s,r(e,1,i,t);return e}function r(t,n,r,i){var s=t[--i+n],o=e(s),u;while((u=n<<1)<=r){ue(t[i+u+1])&&u++;if(o<=e(t[i+u]))break;t[i+n]=t[i+u],n=u}t[i+n]=s}return t.sort=n,t}function a(e){function n(n,r,i,s){var o=new Array(s=Math.min(i-r,s)),u,a,f,l;for(a=0;au)o[0]=l,u=e(t(o,0,s)[0]);while(++rn&&e(t[s-1])>u;--s)t[s]=t[s-1];t[s]=o}return t}return t}function h(e){function n(e,n,i){return(i-n>1,f=a-s,l=a+s,c=t[o],h=e(c),p=t[f],d=e(p),v=t[a],m=e(v),g=t[l],y=e(g),b=t[u],w=e(b),E;h>d&&(E=c,c=p,p=E,E=h,h=d,d=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E),h>m&&(E=c,c=v,v=E,E=h,h=m,m=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),h>y&&(E=c,c=g,g=E,E=h,h=y,y=E),m>y&&(E=v,v=g,g=E,E=m,m=y,y=E),d>w&&(E=p,p=b,b=E,E=d,d=w,w=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E);var S=p,x=d,T=g,N=y;t[o]=c,t[f]=t[r],t[a]=v,t[l]=t[i-1],t[u]=b;var C=r+1,k=i-2,L=x<=N&&x>=N;if(L)for(var A=C;A<=k;++A){var O=t[A],M=e(O);if(Mx)for(;;){var _=e(t[k]);if(_>x){k--;continue}if(_N)for(;;){var _=e(t[k]);if(_>N){k--;if(ku){var D,_;while((D=e(t[C]))<=x&&D>=x)++C;while((_=e(t[k]))<=N&&_>=N)--k;for(var A=C;A<=k;A++){var O=t[A],M=e(O);if(M<=x&&M>=x)A!==C&&(t[A]=t[C],t[C]=O),C++;else if(M<=N&&M>=N)for(;;){var _=e(t[k]);if(_<=N&&_>=N){k--;if(kF)for(t=F,n=Math.min(i,I);tI)for(t=Math.max(i,I),n=s;t=F&&e>0)l[r=A[n]]||(t.push(i[r]),--e);return t}function J(e){var t=[],n=F,r;while(n0)l[r=A[n]]||(t.push(i[r]),--e),n++;return t}function K(e){function B(t,n,o,a){function U(){++p===h&&(v=y(v,f<<=1),u=y(u,f),h=_(f))}var d=r,v=O(p,h),b=E,w=M,S=p,T=0,N=0,C,k,L,A,B,j;H&&(b=w=x),r=new Array(p),p=0,u=S>1?g(u,s):O(s,h),S&&(L=(k=d[0]).key);while(N=A))++N;while(Nj)){u[C=n[N]+o]=p,l[C]&m||(B.value=b(B.value,i[C]));if(++N>=a)break;A=e(t[N])}U()}while(TT)for(T=0;T1?(D=F,P=q):(p===1?(D=I,P=R):(D=x,P=x),u=null),c[C]=D}function F(e,t,n){if(e===v||H)return;var s,o,a,f;for(s=0,a=t.length;sf&&(l=y(l,f<<=1)),q(i,0,s),R(i,0,s),d}function b(){function a(e,r,o){var a;if(u)return;for(a=r;a Date: Thu, 21 Jun 2012 19:16:53 -0400 Subject: [PATCH 3/4] Changing topAsc to bottom --- crossfilter.js | 4 ++-- crossfilter.min.js | 2 +- src/crossfilter.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crossfilter.js b/crossfilter.js index e5e41794..00d0e472 100644 --- a/crossfilter.js +++ b/crossfilter.js @@ -557,7 +557,7 @@ function crossfilter() { filterRange: filterRange, filterAll: filterAll, top: top, - topAsc: topAsc, + bottom: bottom, group: group, groupAll: groupAll }; @@ -741,7 +741,7 @@ function crossfilter() { // Basically same as top but on ascending order // Note: observes this dimension's filter, unlike group and groupAll. - function topAsc(k) { + function bottom(k) { var array = [], i = lo0, j; diff --git a/crossfilter.min.js b/crossfilter.min.js index 9844d7ef..f1888c99 100644 --- a/crossfilter.min.js +++ b/crossfilter.min.js @@ -1 +1 @@ -(function(e){function t(e){return e}function n(e,t){for(var n=0,r=t.length,i=new Array(r);n>1;e(t[s])>1;n>>1)+1;while(--s>0)r(e,s,i,t);return e}function n(e,t,n){var i=n-t,s;while(--i>0)s=e[t],e[t]=e[t+i],e[t+i]=s,r(e,1,i,t);return e}function r(t,n,r,i){var s=t[--i+n],o=e(s),u;while((u=n<<1)<=r){ue(t[i+u+1])&&u++;if(o<=e(t[i+u]))break;t[i+n]=t[i+u],n=u}t[i+n]=s}return t.sort=n,t}function a(e){function n(n,r,i,s){var o=new Array(s=Math.min(i-r,s)),u,a,f,l;for(a=0;au)o[0]=l,u=e(t(o,0,s)[0]);while(++rn&&e(t[s-1])>u;--s)t[s]=t[s-1];t[s]=o}return t}return t}function h(e){function n(e,n,i){return(i-n>1,f=a-s,l=a+s,c=t[o],h=e(c),p=t[f],d=e(p),v=t[a],m=e(v),g=t[l],y=e(g),b=t[u],w=e(b),E;h>d&&(E=c,c=p,p=E,E=h,h=d,d=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E),h>m&&(E=c,c=v,v=E,E=h,h=m,m=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),h>y&&(E=c,c=g,g=E,E=h,h=y,y=E),m>y&&(E=v,v=g,g=E,E=m,m=y,y=E),d>w&&(E=p,p=b,b=E,E=d,d=w,w=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E);var S=p,x=d,T=g,N=y;t[o]=c,t[f]=t[r],t[a]=v,t[l]=t[i-1],t[u]=b;var C=r+1,k=i-2,L=x<=N&&x>=N;if(L)for(var A=C;A<=k;++A){var O=t[A],M=e(O);if(Mx)for(;;){var _=e(t[k]);if(_>x){k--;continue}if(_N)for(;;){var _=e(t[k]);if(_>N){k--;if(ku){var D,_;while((D=e(t[C]))<=x&&D>=x)++C;while((_=e(t[k]))<=N&&_>=N)--k;for(var A=C;A<=k;A++){var O=t[A],M=e(O);if(M<=x&&M>=x)A!==C&&(t[A]=t[C],t[C]=O),C++;else if(M<=N&&M>=N)for(;;){var _=e(t[k]);if(_<=N&&_>=N){k--;if(kF)for(t=F,n=Math.min(i,I);tI)for(t=Math.max(i,I),n=s;t=F&&e>0)l[r=A[n]]||(t.push(i[r]),--e);return t}function J(e){var t=[],n=F,r;while(n0)l[r=A[n]]||(t.push(i[r]),--e),n++;return t}function K(e){function B(t,n,o,a){function U(){++p===h&&(v=y(v,f<<=1),u=y(u,f),h=_(f))}var d=r,v=O(p,h),b=E,w=M,S=p,T=0,N=0,C,k,L,A,B,j;H&&(b=w=x),r=new Array(p),p=0,u=S>1?g(u,s):O(s,h),S&&(L=(k=d[0]).key);while(N=A))++N;while(Nj)){u[C=n[N]+o]=p,l[C]&m||(B.value=b(B.value,i[C]));if(++N>=a)break;A=e(t[N])}U()}while(TT)for(T=0;T1?(D=F,P=q):(p===1?(D=I,P=R):(D=x,P=x),u=null),c[C]=D}function F(e,t,n){if(e===v||H)return;var s,o,a,f;for(s=0,a=t.length;sf&&(l=y(l,f<<=1)),q(i,0,s),R(i,0,s),d}function b(){function a(e,r,o){var a;if(u)return;for(a=r;a>1;e(t[s])>1;n>>1)+1;while(--s>0)r(e,s,i,t);return e}function n(e,t,n){var i=n-t,s;while(--i>0)s=e[t],e[t]=e[t+i],e[t+i]=s,r(e,1,i,t);return e}function r(t,n,r,i){var s=t[--i+n],o=e(s),u;while((u=n<<1)<=r){ue(t[i+u+1])&&u++;if(o<=e(t[i+u]))break;t[i+n]=t[i+u],n=u}t[i+n]=s}return t.sort=n,t}function a(e){function n(n,r,i,s){var o=new Array(s=Math.min(i-r,s)),u,a,f,l;for(a=0;au)o[0]=l,u=e(t(o,0,s)[0]);while(++rn&&e(t[s-1])>u;--s)t[s]=t[s-1];t[s]=o}return t}return t}function h(e){function n(e,n,i){return(i-n>1,f=a-s,l=a+s,c=t[o],h=e(c),p=t[f],d=e(p),v=t[a],m=e(v),g=t[l],y=e(g),b=t[u],w=e(b),E;h>d&&(E=c,c=p,p=E,E=h,h=d,d=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E),h>m&&(E=c,c=v,v=E,E=h,h=m,m=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),h>y&&(E=c,c=g,g=E,E=h,h=y,y=E),m>y&&(E=v,v=g,g=E,E=m,m=y,y=E),d>w&&(E=p,p=b,b=E,E=d,d=w,w=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E);var S=p,x=d,T=g,N=y;t[o]=c,t[f]=t[r],t[a]=v,t[l]=t[i-1],t[u]=b;var C=r+1,k=i-2,L=x<=N&&x>=N;if(L)for(var A=C;A<=k;++A){var O=t[A],M=e(O);if(Mx)for(;;){var _=e(t[k]);if(_>x){k--;continue}if(_N)for(;;){var _=e(t[k]);if(_>N){k--;if(ku){var D,_;while((D=e(t[C]))<=x&&D>=x)++C;while((_=e(t[k]))<=N&&_>=N)--k;for(var A=C;A<=k;A++){var O=t[A],M=e(O);if(M<=x&&M>=x)A!==C&&(t[A]=t[C],t[C]=O),C++;else if(M<=N&&M>=N)for(;;){var _=e(t[k]);if(_<=N&&_>=N){k--;if(kF)for(t=F,n=Math.min(i,I);tI)for(t=Math.max(i,I),n=s;t=F&&e>0)l[r=A[n]]||(t.push(i[r]),--e);return t}function J(e){var t=[],n=F,r;while(n0)l[r=A[n]]||(t.push(i[r]),--e),n++;return t}function K(e){function B(t,n,o,a){function U(){++p===h&&(v=y(v,f<<=1),u=y(u,f),h=_(f))}var d=r,v=O(p,h),b=E,w=M,S=p,T=0,N=0,C,k,L,A,B,j;H&&(b=w=x),r=new Array(p),p=0,u=S>1?g(u,s):O(s,h),S&&(L=(k=d[0]).key);while(N=A))++N;while(Nj)){u[C=n[N]+o]=p,l[C]&m||(B.value=b(B.value,i[C]));if(++N>=a)break;A=e(t[N])}U()}while(TT)for(T=0;T1?(D=F,P=q):(p===1?(D=I,P=R):(D=x,P=x),u=null),c[C]=D}function F(e,t,n){if(e===v||H)return;var s,o,a,f;for(s=0,a=t.length;sf&&(l=y(l,f<<=1)),q(i,0,s),R(i,0,s),d}function b(){function a(e,r,o){var a;if(u)return;for(a=r;a Date: Sun, 16 Sep 2012 09:43:46 -0700 Subject: [PATCH 4/4] Add tests for dimension.bottom. --- crossfilter.js | 6 +-- crossfilter.min.js | 2 +- src/crossfilter.js | 6 +-- test/crossfilter-test.js | 95 ++++++++++++++++++++++++++++++++++++++-- 4 files changed, 99 insertions(+), 10 deletions(-) diff --git a/crossfilter.js b/crossfilter.js index 00d0e472..fd7e4589 100644 --- a/crossfilter.js +++ b/crossfilter.js @@ -722,7 +722,7 @@ function crossfilter() { return filterIndex((refilter = crossfilter_filterAll)(values)); } - // Returns the top K selected records, based on this dimension's order. + // Returns the top K selected records based on this dimension's order. // Note: observes this dimension's filter, unlike group and groupAll. function top(k) { var array = [], @@ -738,8 +738,8 @@ function crossfilter() { return array; } - - // Basically same as top but on ascending order + + // Returns the bottom K selected records based on this dimension's order. // Note: observes this dimension's filter, unlike group and groupAll. function bottom(k) { var array = [], diff --git a/crossfilter.min.js b/crossfilter.min.js index f1888c99..4b2af448 100644 --- a/crossfilter.min.js +++ b/crossfilter.min.js @@ -1 +1 @@ -(function(e){function t(e){return e}function n(e,t){for(var n=0,r=t.length,i=new Array(r);n>1;e(t[s])>1;n>>1)+1;while(--s>0)r(e,s,i,t);return e}function n(e,t,n){var i=n-t,s;while(--i>0)s=e[t],e[t]=e[t+i],e[t+i]=s,r(e,1,i,t);return e}function r(t,n,r,i){var s=t[--i+n],o=e(s),u;while((u=n<<1)<=r){ue(t[i+u+1])&&u++;if(o<=e(t[i+u]))break;t[i+n]=t[i+u],n=u}t[i+n]=s}return t.sort=n,t}function a(e){function n(n,r,i,s){var o=new Array(s=Math.min(i-r,s)),u,a,f,l;for(a=0;au)o[0]=l,u=e(t(o,0,s)[0]);while(++rn&&e(t[s-1])>u;--s)t[s]=t[s-1];t[s]=o}return t}return t}function h(e){function n(e,n,i){return(i-n>1,f=a-s,l=a+s,c=t[o],h=e(c),p=t[f],d=e(p),v=t[a],m=e(v),g=t[l],y=e(g),b=t[u],w=e(b),E;h>d&&(E=c,c=p,p=E,E=h,h=d,d=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E),h>m&&(E=c,c=v,v=E,E=h,h=m,m=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),h>y&&(E=c,c=g,g=E,E=h,h=y,y=E),m>y&&(E=v,v=g,g=E,E=m,m=y,y=E),d>w&&(E=p,p=b,b=E,E=d,d=w,w=E),d>m&&(E=p,p=v,v=E,E=d,d=m,m=E),y>w&&(E=g,g=b,b=E,E=y,y=w,w=E);var S=p,x=d,T=g,N=y;t[o]=c,t[f]=t[r],t[a]=v,t[l]=t[i-1],t[u]=b;var C=r+1,k=i-2,L=x<=N&&x>=N;if(L)for(var A=C;A<=k;++A){var O=t[A],M=e(O);if(Mx)for(;;){var _=e(t[k]);if(_>x){k--;continue}if(_N)for(;;){var _=e(t[k]);if(_>N){k--;if(ku){var D,_;while((D=e(t[C]))<=x&&D>=x)++C;while((_=e(t[k]))<=N&&_>=N)--k;for(var A=C;A<=k;A++){var O=t[A],M=e(O);if(M<=x&&M>=x)A!==C&&(t[A]=t[C],t[C]=O),C++;else if(M<=N&&M>=N)for(;;){var _=e(t[k]);if(_<=N&&_>=N){k--;if(kF)for(t=F,n=Math.min(i,I);tI)for(t=Math.max(i,I),n=s;t=F&&e>0)l[r=A[n]]||(t.push(i[r]),--e);return t}function J(e){var t=[],n=F,r;while(n0)l[r=A[n]]||(t.push(i[r]),--e),n++;return t}function K(e){function B(t,n,o,a){function U(){++p===h&&(v=y(v,f<<=1),u=y(u,f),h=_(f))}var d=r,v=O(p,h),b=E,w=M,S=p,T=0,N=0,C,k,L,A,B,j;H&&(b=w=x),r=new Array(p),p=0,u=S>1?g(u,s):O(s,h),S&&(L=(k=d[0]).key);while(N=A))++N;while(Nj)){u[C=n[N]+o]=p,l[C]&m||(B.value=b(B.value,i[C]));if(++N>=a)break;A=e(t[N])}U()}while(TT)for(T=0;T1?(D=F,P=q):(p===1?(D=I,P=R):(D=x,P=x),u=null),c[C]=D}function F(e,t,n){if(e===v||H)return;var s,o,a,f;for(s=0,a=t.length;sf&&(l=y(l,f<<=1)),q(i,0,s),R(i,0,s),d}function b(){function a(e,r,o){var a;if(u)return;for(a=r;a>1;a(b[f])>1;c>>1)+1;while(--f>0)d(a,f,e,b);return a}function c(a,b,c){var e=c-b,f;while(--e>0)f=a[b],a[b]=a[b+e],a[b+e]=f,d(a,1,e,b);return a}function d(b,c,d,e){var f=b[--e+c],g=a(f),h;while((h=c<<1)<=d){ha(b[e+h+1])&&h++;if(g<=a(b[e+h]))break;b[e+c]=b[e+h],c=h}b[e+c]=f}return b.sort=c,b}function i(a){function c(c,d,e,f){var g=new Array(f=Math.min(e-d,f)),h,i,j,k;for(i=0;ih)g[0]=k,h=a(b(g,0,f)[0]);while(++dc&&a(b[f-1])>h;--f)b[f]=b[f-1];b[f]=g}return b}return b}function m(a){function c(a,c,e){return(e-c>1,j=i-f,k=i+f,l=b[g],m=a(l),n=b[j],o=a(n),p=b[i],q=a(p),r=b[k],s=a(r),t=b[h],u=a(t),v;m>o&&(v=l,l=n,n=v,v=m,m=o,o=v),s>u&&(v=r,r=t,t=v,v=s,s=u,u=v),m>q&&(v=l,l=p,p=v,v=m,m=q,q=v),o>q&&(v=n,n=p,p=v,v=o,o=q,q=v),m>s&&(v=l,l=r,r=v,v=m,m=s,s=v),q>s&&(v=p,p=r,r=v,v=q,q=s,s=v),o>u&&(v=n,n=t,t=v,v=o,o=u,u=v),o>q&&(v=n,n=p,p=v,v=o,o=q,q=v),s>u&&(v=r,r=t,t=v,v=s,s=u,u=v);var w=n,x=o,y=r,z=s;b[g]=l,b[j]=b[d],b[i]=p,b[k]=b[e-1],b[h]=t;var A=d+1,B=e-2,C=x<=z&&x>=z;if(C)for(var D=A;D<=B;++D){var E=b[D],F=a(E);if(Fx)for(;;){var G=a(b[B]);if(G>x){B--;continue}if(Gz)for(;;){var G=a(b[B]);if(G>z){B--;if(Bh){var H,G;while((H=a(b[A]))<=x&&H>=x)++A;while((G=a(b[B]))<=z&&G>=z)--B;for(var D=A;D<=B;D++){var E=b[D],F=a(E);if(F<=x&&F>=x)D!==A&&(b[D]=b[A],b[A]=E),A++;else if(F<=z&&F>=z)for(;;){var G=a(b[B]);if(G<=z&&G>=z){B--;if(BN)for(b=N,c=Math.min(e,O);bO)for(b=Math.max(e,O),c=f;b=N&&a>0)k[d=D[c]]||(b.push(e[d]),--a);return b}function X(a){var b=[],c=N,d;while(c0)k[d=D[c]]||(b.push(e[d]),--a),c++;return b}function Y(a){function K(b,c,g,i){function Q(){++n===m&&(p=s(p,j<<=1),h=s(h,j),m=G(j))}var o=d,p=E(n,m),t=v,u=F,w=n,y=0,z=0,A,B,C,D,K,L;J&&(t=u=x),d=new Array(n),n=0,h=w>1?r(h,f):E(f,m),w&&(C=(B=o[0]).key);while(z=D))++z;while(zL)){h[A=c[z]+g]=n,k[A]&q||(K.value=t(K.value,e[A]));if(++z>=i)break;D=a(b[z])}Q()}while(yy)for(y=0;y1?(H=M,I=O):(n===1?(H=N,I=P):(H=x,I=x),h=null),l[A]=H}function M(a,b,c){if(a===p||J)return;var f,g,i,j;for(f=0,i=b.length;fj&&(k=s(k,j<<=1)),P(e,0,f),Q(e,0,f),o}function t(){function i(a,d,g){var i;if(h)return;for(i=d;i