How can I deobfuscate this code?
return(function(i,a,n)local k=string.char;local e=string.sub;local l=table.concat;local m=math.ldexp;local r=getfenv or function()return _ENV end;local o=select;local g=unpack or table.unpack;local j=tonumber;local function p(h)local b,c,d="","",{}local g=256;local f={}for a=0,g-1 do f[a]=k(a)end;local a=1;local function i()local b=j(e(h,a,a),36)a=a+1;local c=j(e(h,a,a+b-1),36)a=a+b;return c end;b=k(i())d[1]=b;while a<#h do local a=i()if f[a]then c=f[a]else c=b..e(b,1,1)end;f[g]=b..e(c,1,1)d[#d+1],b,g=c,c,g+1 end;return table.concat(d)end local a=(bit or bit32);local d=a and a.bxor or function(a,c)local b,d,e=1,0,10 while a>0 and c>0 do local e,f=a%2,c%2 if e~=f then d=d+b end a,c,b=(a-e)/2,(c-f)/2,b*2 end if a<c then a=c end while a>0 do local c=a%2 if c>0 then d=d+b end a,b=(a-c)/2,b*2 end return d end local function c(c,a,b)if b then local a=(c/2^(a-1))%2^((b-1)-(a-1)+1);return a-a%1;else local a=2^(a-1);return(c%(a+a)>=a)and 1 or 0;end;end;local a=1;local function b()local c,e,f,b=i(j,a,a+3);c=d(c,219)e=d(e,219)f=d(f,219)b=d(b,219)a=a+4;return(b*16777216)+(f*65536)+(e*256)+c;end;local function h()local b=d(i(j,a,a),219);a=a+1;return b;end;local function f()local c,b=i(j,a,a+2);c=d(c,219)b=d(b,219)a=a+2;return(b*256)+c;end;local function p()local d=b();local a=b();local e=1;local d=(c(a,1,20)*(2^32))+d;local b=c(a,21,31);local a=((-1)^c(a,32));if(b==0)then if(d==0)then return a*0;else b=1;e=0;end;elseif(b==2047)then return(d==0)and(a*(1/0))or(a*(0/0));end;return m(a,b-1023)*(e+(d/(2^52)));end;local m=b;local function q(b)local c;if(not b)then b=m();if(b==0)then return'';end;end;c=e(j,a,a+b-1);a=a+b;local b={}for a=1,#c do b[a]=k(d(i(e(c,a,a)),219))end return l(b);end;local a=b;local function m(...)return{...},o('#',...)end local function k()local j={};local i={};local a={};local l={[#{"1 + 1 = 111";{397;924;79;408};}]=i,[#{{872;304;136;960};"1 + 1 = 111";{552;749;880;501};}]=nil,[#{"1 + 1 = 111";{355;485;5;987};{433;30;991;664};"1 + 1 = 111";}]=a,[#{{614;792;330;18};}]=j,};local a=b()local d={}for c=1,a do local b=h();local a;if(b==3)then a=(h()~=0);elseif(b==1)then a=p();elseif(b==2)then a=q();end;d[c]=a;end;for i=1,b()do local a=h();if(c(a,1,1)==0)then local e=c(a,2,3);local g=c(a,4,6);local a={f(),f(),nil,nil};if(e==0)then a[3]=f();a[4]=f();elseif(e==1)then a[3]=b();elseif(e==2)then a[3]=b()-(2^16)elseif(e==3)then a[3]=b()-(2^16)a[4]=f();end;if(c(g,1,1)==1)then a[2]=d[a[2]]end if(c(g,2,2)==1)then a[3]=d[a[3]]end if(c(g,3,3)==1)then a[4]=d[a[4]]end j[i]=a;end end;l[3]=h();for a=1,b()do i[a-1]=k();end;return l;end;local function j(a,i,f)a=(a==true and k())or a;return(function(...)local e=a[1];local d=a[3];local l=a[2];local m=m local c=1;local h=-1;local q={};local p={...};local o=o('#',...)-1;local k={};local b={};for a=0,o do if(a>=d)then q[a-d]=p[a+1];else b[a]=p[a+#{"1 + 1 = 111";}];end;end;local a=o-d+1 local a;local d;while true do a=e[c];d=a[1];if d<=28 then if d<=13 then if d<=6 then if d<=2 then if d<=0 then b[a[2]]=i[a[3]];elseif d>1 then b[a[2]]=(a[3]~=0);else local g;local d;f[a[3]]=b[a[2]];c=c+1;a=e[c];b[a[2]]=f[a[3]];c=c+1;a=e[c];b[a[2]]();c=c+1;a=e[c];b[a[2]]=f[a[3]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];d=a[2];g=b[a[3]];b[d+1]=g;b[d]=g[a[4]];end;elseif d<=4 then if d==3 then b[a[2]]=f[a[3]];else local f;local d;b[a[2]]=(a[3]~=0);c=c+1;a=e[c];d=a[2]b[d]=b[d](g(b,d+1,a[3]))c=c+1;a=e[c];d=a[2];f=b[a[3]];b[d+1]=f;b[d]=f[a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]];c=c+1;a=e[c];b[a[2]]=a[3];c=c+1;a=e[c];d=a[2]b[d]=b[d](g(b,d+1,a[3]))c=c+1;a=e[c];d=a[2];f=b[a[3]];b[d+1]=f;b[d]=f[a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]];c=c+1;a=e[c];b[a[2]]=a[3];end;elseif d==5 then local f;local d;b[a[2]][a[3]]=a[4];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]][a[3]]=b[a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];d=a[2];f=b[a[3]];b[d+1]=f;b[d]=f[a[4]];else b[a[2]]=a[3];end;elseif d<=9 then if d<=7 then if(b[a[2]]==a[4])then c=c+1;else c=a[3];end;elseif d==8 then b[a[2]]();else b[a[2]][a[3]]=b[a[4]];end;elseif d<=11 then if d>10 then i[a[3]]=b[a[2]];else local a=a[2]b[a]=b[a](g(b,a+1,h))end;elseif d>12 then local f;local d;d=a[2]b[d]=b[d](g(b,d+1,a[3]))c=c+1;a=e[c];d=a[2];f=b[a[3]];b[d+1]=f;b[d]=f[a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]];c=c+1;a=e[c];b[a[2]]=a[3];c=c+1;a=e[c];b[a[2]]=(a[3]~=0);else if(b[a[2]]~=a[4])then c=c+1;else c=a[3];end;end;elseif d<=20 then if d<=16 then if d<=14 then local f;local d;d=a[2]b[d]=b[d](g(b,d+1,a[3]))c=c+1;a=e[c];d=a[2];f=b[a[3]];b[d+1]=f;b[d]=f[a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]];c=c+1;a=e[c];b[a[2]]=a[3];c=c+1;a=e[c];d=a[2]b[d]=b[d](g(b,d+1,a[3]))elseif d==15 then f[a[3]]=b[a[2]];else f[a[3]]=b[a[2]];end;elseif d<=18 then if d>17 then local a=a[2]b[a]=b[a]()else i[a[3]]=b[a[2]];end;elseif d>19 then local c=a[2]b[c]=b[c](g(b,c+1,a[3]))else local h=l[a[3]];local g;local d={};g=n({},{__index=function(b,a)local a=d[a];return a[1][a[2]];end,__newindex=function(c,a,b)local a=d[a]a[1][a[2]]=b;end;});for f=1,a[4]do c=c+1;local a=e[c];if a[1]==27 then d[f-1]={b,a[3]};else d[f-1]={i,a[3]};end;k[#k+1]=d;end;b[a[2]]=j(h,g,f);end;elseif d<=24 then if d<=22 then if d==21 then local c=a[2]local d,a=m(b[c](g(b,c+1,a[3])))h=a+c-1 local a=0;for c=c,h do a=a+1;b[c]=d[a];end;else local c=a[2]local d,a=m(b[c](g(b,c+1,a[3])))h=a+c-1 local a=0;for c=c,h do a=a+1;b[c]=d[a];end;end;elseif d==23 then local c=a[2];local d=b[a[3]];b[c+1]=d;b[c]=d[a[4]];else b[a[2]]=a[3];end;elseif d<=26 then if d==25 then b[a[2]]=b[a[3]][a[4]];else c=a[3];end;elseif d>27 then if(b[a[2]]==a[4])then c=c+1;else c=a[3];end;else b[a[2]]=b[a[3]];end;elseif d<=43 then if d<=35 then if d<=31 then if d<=29 then local j;local l,k;local i;local d;b[a[2]]=f[a[3]];c=c+1;a=e[c];b[a[2]]=f[a[3]];c=c+1;a=e[c];d=a[2];i=b[a[3]];b[d+1]=i;b[d]=i[a[4]];c=c+1;a=e[c];b[a[2]]=a[3];c=c+1;a=e[c];b[a[2]]=(a[3]~=0);c=c+1;a=e[c];d=a[2]l,k=m(b[d](g(b,d+1,a[3])))h=k+d-1 j=0;for a=d,h do j=j+1;b[a]=l[j];end;c=c+1;a=e[c];d=a[2]b[d]=b[d](g(b,d+1,h))c=c+1;a=e[c];d=a[2]b[d]=b[d]()c=c+1;a=e[c];b[a[2]]=(a[3]~=0);c=c+1;a=e[c];d=a[2];i=b[a[3]];b[d+1]=i;b[d]=i[a[4]];elseif d==30 then b[a[2]][a[3]]=a[4];else local c=a[2];local d=b[a[3]];b[c+1]=d;b[c]=d[a[4]];end;elseif d<=33 then if d>32 then c=a[3];else b[a[2]][a[3]]=b[a[4]];end;elseif d>34 then b[a[2]]=f[a[3]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]][a[3]]=a[4];c=c+1;a=e[c];do return end;else local c=a[2]b[c]=b[c](g(b,c+1,a[3]))end;elseif d<=39 then if d<=37 then if d>36 then local h=l[a[3]];local g;local d={};g=n({},{__index=function(b,a)local a=d[a];return a[1][a[2]];end,__newindex=function(c,a,b)local a=d[a]a[1][a[2]]=b;end;});for f=1,a[4]do c=c+1;local a=e[c];if a[1]==27 then d[f-1]={b,a[3]};else d[f-1]={i,a[3]};end;k[#k+1]=d;end;b[a[2]]=j(h,g,f);else b[a[2]]=b[a[3]];end;elseif d==38 then do return end;else local a=a[2]b[a]=b[a]()end;elseif d<=41 then if d==40 then local c=a[2]b[c](g(b,c+1,a[3]))else local c=a[2]local e={b[c](b[c+1])};local d=0;for a=c,a[4]do d=d+1;b[a]=e[d];end end;elseif d>42 then b[a[2]]=f[a[3]];else b[a[2]]=f[a[3]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]]=b[a[3]][a[4]];c=c+1;a=e[c];b[a[2]][a[3]]=a[4];c=c+1;a=e[c];do return end;end;elseif d<=50 then if d<=46 then if d<=44 then local a=a[2]b[a](b[a+1])elseif d==45 then b[a[2]][a[3]]=a[4];else b[a[2]]=j(l[a[3]],nil,f);end;elseif d<=48 then if d==47 then local a=a[2]b[a](b[a+1])else do return end;end;elseif d>49 then b[a[2]]=j(l[a[3]],nil,f);else local a=a[2]b[a]=b[a](g(b,a+1,h))end;elseif d<=54 then if d<=52 then if d==51 then b[a[2]]=(a[3]~=0);else if(b[a[2]]~=a[4])then c=c+1;else c=a[3];end;end;elseif d==53 then local c=a[2]b[c](g(b,c+1,a[3]))else b[a[2]]=i[a[3]];end;elseif d<=56 then if d>55 then b[a[2]]=b[a[3]][a[4]];else local d;d=a[2]b[d](b[d+1])c=c+1;a=e[c];b[a[2]]=f[a[3]];c=c+1;a=e[c];b[a[2]]=a[3];c=c+1;a=e[c];d=a[2]b[d](b[d+1])c=c+1;a=e[c];b[a[2]]=(a[3]~=0);c=c+1;a=e[c];i[a[3]]=b[a[2]];end;elseif d>57 then local d=a[2]local e={b[d](b[d+1])};local c=0;for a=d,a[4]do c=c+1;b[a]=e[c];end else b[a[2]]();end;c=c+1;end;end);end;return j(true,{},r())();end)(string.byte,table.insert,setmetatable);