import os, sys
from itertools import islice, repeat, chain
table = r"!#$%&'()+,-.0123456789;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{}~"
def ChunkBySize(lst, size):
lst = iter(lst)
return list(iter(lambda: list(islice(lst, size)), []))
def PadRight(lst, padding, size):
return list(islice(chain(lst, repeat(padding)), size))
def Encode(data):
block = ChunkBySize(data, 4)
lastLen = len(block[-1])
block[-1] = PadRight(block[-1], 0, 4)
return "".join([table[y] for x in map(lambda x: [x // 52200625, x // 614125 % 85, x // 7225 % 85, x // 85 % 85, x % 85], map(lambda x: x[0] << 24 | x[1] << 16 | x[2] << 8 | x[3], block)) for y in x][:None if lastLen == 4 else lastLen-4])
def Decode(data):
dataLen = len(data)
paddingLen = dataLen if dataLen % 5 == 0 else dataLen // 5 + 5
return bytes([y & 0xff for x in map(lambda x: sum([x[0] * 52200625, x[1] * 614125, x[2] * 7225, x[3] * 85, x[4]]), ChunkBySize(map(lambda x: table.index(x), data.ljust(paddingLen,'~')),5)) for y in [x >> 24, x >> 16, x >> 8, x]][:None if dataLen == paddingLen else dataLen - paddingLen])