function Encode(N)return(N:gsub("\046",function(N)local V,A="",N:byte()for N=8,1,-1 do V=V..(A%2^N-A%2^(N-1)>0 and"\049"or"\048")end return V end).."\048\048\048\048"):gsub("\037\100\037\100\037\100\063\037\100\063\037\100\063\037\100\063",function(N)if#N<6 then return""end local V=0 for A=1,6,1 do V=V+(N:sub(A,A)=="\049"and 2^(6-A)or 0)end return b:sub(V+1,V+1)end)..({"";"\061\061","\061"})[#N%3+1]end function Decode(N)N=string.gsub(N,"\091\094"..(b.."\061\093"),"")return(N:gsub("\046",function(N)if N=="\061"then return""end local V,A="",b:find(N)-1 for N=6,1,-1 do V=V..(A%2^N-A%2^(N-1)>0 and"\049"or"\048")end return V end)):gsub("\037\100\037\100\037\100\063\037\100\063\037\100\063\037\100\063\037\100\063\037\100\063",function(N)if#N~=8 then return""end local V=0 for A=1,8,1 do V=V+(N:sub(A,A)=="\049"and 2^(8-A)or 0)end return string.char(V)end)end return{Encode=Encode,Decode=Decode}



function Encode(data)
    return ((data:gsub('.', function(x) 
        local r, b = '', x:byte()
        for i = 8, 1, -1 do 
			r = r..(b%2 ^ i - b%2 ^ (i - 1) > 0 and '1' or '0') 
		end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if #x < 6 then  return ''  end
        local c = 0
        for i = 1, 6 do 
			c = c+(x:sub(i,i)=='1' and 2^(6-i) or 0) 
		end
        return b:sub(c + 1, c + 1)
    end)..({'', '==', '='})[#data%3 + 1])
end


function Decode(data)
    data = string.gsub(data, '[^'..b..'=]', '')
    return (data:gsub('.', function(x)
        if x == '=' then  return ''  end
        local r, f= '', (b:find(x) - 1)
        for i = 6, 1, -1 do r=r..(f%2 ^ i - f%2 ^ (i - 1) > 0 and '1' or '0') end
        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if #x ~= 8 then  return ''  end
        local c = 0
        for i = 1, 8 do c = c + (x:sub(i, i)== '1' and 2 ^ (8 - i) or 0) end
        return string.char(c)
    end))
end


return {Encode = Encode, Decode = Decode}

