Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local i,h,b,m,l,d,e,y,r,w,u,v,l,l=assert,error,ipairs,pairs,tostring,type,setmetatable,io,math,table.sort,math.max,string.char,io.open,_G;local function p(n)local l={};local e=e({},l)function l:__index(l)local n=n(l);e[l]=n
- return n
- end
- return e
- end
- local function l(n,l)l=l or 1
- h({n},l+1)end
- local function _(n)local l={}l.outbs=n
- l.wnd={}l.wnd_pos=1
- return l
- end
- local function t(l,e)local n=l.wnd_pos
- l.outbs(e)l.wnd[n]=e
- l.wnd_pos=n%32768+1
- end
- local function n(l)return i(l,'unexpected end of file')end
- local function o(n,l)return n%(l+l)>=l
- end
- local a=p(function(l)return 2^l end)local c=e({},{__mode='k'})local function g(o)local l=1
- local e={}function e:read()local n
- if l<=#o then
- n=o:byte(l)l=l+1
- end
- return n
- end
- return e
- end
- local l
- local function s(d)local n,l,o=0,0,{};function o:nbits_left_in_byte()return l
- end
- function o:read(e)e=e or 1
- while l<e do
- local e=d:read()if not e then return end
- n=n+a[l]*e
- l=l+8
- end
- local o=a[e]local a=n%o
- n=(n-a)/o
- l=l-e
- return a
- end
- c[o]=true
- return o
- end
- local function f(l)return c[l]and l or s(g(l))end
- local function s(l)local n
- if y.type(l)=='file'then
- n=function(n)l:write(v(n))end
- elseif d(l)=='function'then
- n=l
- end
- return n
- end
- local function d(e,o)local l={}if o then
- for e,n in m(e)do
- if n~=0 then
- l[#l+1]={val=e,nbits=n}end
- end
- else
- for n=1,#e-2,2 do
- local o,n,e=e[n],e[n+1],e[n+2]if n~=0 then
- for e=o,e-1 do
- l[#l+1]={val=e,nbits=n}end
- end
- end
- end
- w(l,function(n,l)return n.nbits==l.nbits and n.val<l.val or n.nbits<l.nbits
- end)local e=1
- local o=0
- for n,l in b(l)do
- if l.nbits~=o then
- e=e*a[l.nbits-o]o=l.nbits
- end
- l.code=e
- e=e+1
- end
- local e=r.huge
- local c={}for n,l in b(l)do
- e=r.min(e,l.nbits)c[l.code]=l.val
- end
- local function o(n,e)local l=0
- for e=1,e do
- local e=n%2
- n=(n-e)/2
- l=l*2+e
- end
- return l
- end
- local d=p(function(l)return a[e]+o(l,e)end)function l:read(a)local o,l=1,0
- while 1 do
- if l==0 then
- o=d[n(a:read(e))]l=l+e
- else
- local n=n(a:read())l=l+1
- o=o*2+n
- end
- local l=c[o]if l then
- return l
- end
- end
- end
- return l
- end
- local function b(l)local a=2^1
- local e=2^2
- local c=2^3
- local d=2^4
- local n=l:read(8)local n=l:read(8)local n=l:read(8)local n=l:read(8)local t=l:read(32)local t=l:read(8)local t=l:read(8)if o(n,e)then
- local n=l:read(16)local e=0
- for n=1,n do
- e=l:read(8)end
- end
- if o(n,c)then
- while l:read(8)~=0 do end
- end
- if o(n,d)then
- while l:read(8)~=0 do end
- end
- if o(n,a)then
- l:read(16)end
- end
- local function p(l)local f=l:read(5)local i=l:read(5)local e=n(l:read(4))local a=e+4
- local e={}local o={16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}for n=1,a do
- local l=l:read(3)local n=o[n]e[n]=l
- end
- local e=d(e,true)local function r(o)local t={}local a
- local c=0
- while c<o do
- local o=e:read(l)local e
- if o<=15 then
- e=1
- a=o
- elseif o==16 then
- e=3+n(l:read(2))elseif o==17 then
- e=3+n(l:read(3))a=0
- elseif o==18 then
- e=11+n(l:read(7))a=0
- else
- h'ASSERT'end
- for l=1,e do
- t[c]=a
- c=c+1
- end
- end
- local l=d(t,true)return l
- end
- local n=f+257
- local l=i+1
- local n=r(n)local l=r(l)return n,l
- end
- local a
- local o
- local c
- local r
- local function h(e,n,l,d)local l=l:read(e)if l<256 then
- t(n,l)elseif l==256 then
- return true
- else
- if not a then
- local l={[257]=3}local e=1
- for n=258,285,4 do
- for n=n,n+3 do l[n]=l[n-1]+e end
- if n~=258 then e=e*2 end
- end
- l[285]=258
- a=l
- end
- if not o then
- local l={}for e=257,285 do
- local n=u(e-261,0)l[e]=(n-(n%4))/4
- end
- l[285]=0
- o=l
- end
- local a=a[l]local l=o[l]local l=e:read(l)local o=a+l
- if not c then
- local e={[0]=1}local l=1
- for n=1,29,2 do
- for n=n,n+1 do e[n]=e[n-1]+l end
- if n~=1 then l=l*2 end
- end
- c=e
- end
- if not r then
- local n={}for e=0,29 do
- local l=u(e-2,0)n[e]=(l-(l%2))/2
- end
- r=n
- end
- local l=d:read(e)local a=c[l]local l=r[l]local l=e:read(l)local l=a+l
- for e=1,o do
- local l=(n.wnd_pos-1-l)%32768+1
- t(n,i(n.wnd[l],'invalid distance'))end
- end
- return false
- end
- local function u(l,a)local i=l:read(1)local e=l:read(2)local r=0
- local o=1
- local c=2
- local f=3
- if e==r then
- l:read(l:nbits_left_in_byte())local e=l:read(16)local o=n(l:read(16))for e=1,e do
- local l=n(l:read(8))t(a,l)end
- elseif e==o or e==c then
- local n,o
- if e==c then
- n,o=p(l)else
- n=d{0,8,144,9,256,7,280,8,288,nil}o=d{0,5,32,nil}end
- repeat until h(l,a,n,o);end
- return i~=0
- end
- local function e(l)local n,l=f(l.input),_(s(l.output))repeat until u(n,l)end
- return function(n)local l=f(n.input)local n=s(n.output)b(l)e{input=l,output=n}l:read(l:nbits_left_in_byte())l:read()end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement