{$mode objfpc}
uses math;
const
                finp            =               '';
                fout            =               '';
                modulo          =               trunc(1e9+7);
                maxn            =               2000;
var
                fi,fo           :               text;
                n,h             :               integer;
                f               :               array[1..maxn,0..maxn] of int64;
                a               :               array[1..maxn] of integer;
procedure openfile;
begin
        assign(fi,finp);reset(fi);
        assign(fo,fout);rewrite(fo);
end;
procedure closefile;
begin
        close(fi);close(fo);
end;
procedure enter;
var
        i               :               integer;
begin
        readln(fi,n,h);
        for i:=1 to n do
                read(fi,a[i]);
end;
procedure add(var a:int64;b:int64);
begin
        a:=(a+b) mod modulo;
end;
procedure process;
var
        i,j             :               integer;
begin
        //Tai 1 [] hoac do no thing
        f[1][0]:=ord((a[i]=h) or (a[i]+1=h));
        //Tai 1 [
        f[1][1]:=ord(a[i]+1=h);
        for i:=2 to n do
        for j:=max(h-a[i]-1,0) to min(h-a[i],i) do
        begin
                //
                if j+a[i]=h then
                begin
                        //Tai i [
                        if j>0 then
                                add(f[i,j],f[i-1,j-1]);
                        //Do no thing
                        add(f[i,j],f[i-1,j]);
                end
                else
                if j+a[i]+1=h then
                begin
                        //Tai i ]
                        add(f[i,j],f[i-1,j+1]*(j+1));
                        //Tai i []
                        add(f[i,j],f[i-1,j]);
                        //Tai i ][
                        add(f[i,j],f[i-1,j]*j);
                end;
        end;
        writeln(fo,f[n,0]);
end;
begin
        openfile;
        enter;
        process;
        closefile;
end.