import java.util.Base64

object MyBase64 {
    private val H2B = HashMap<Char, Char>()
    private val B2H = HashMap<Char, Char>()

    init {
        val myBase64 = "⣿⣾⣽⣼⣻⣺⣹⣸⣷⣶⣵⣴⣳⣲⣱⣰⣯⣮⣭⣬⣫⣪⣩⣨⣧⣦⣥⣤⣣⣢⣡⣠⣟⣞⣝⣜⣛⣚⣙⣘⣗⣖⣕⣔⣓⣒⣑⣐⣏⣎⣍⣌⣋⣊⣉⣈⣇⣆⣅⣄⣃⣂⣁⣀".toCharArray()
        val base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray()
        for (i in myBase64.indices) {
            H2B[myBase64[i]] = base64[i]
            B2H[base64[i]] = myBase64[i]
        }
    }

    fun encode(bytes: ByteArray): String {
        val chars = Base64.getEncoder().encodeToString(bytes).toCharArray()
        val sb = StringBuilder()
        for (c in chars) {
            if (c == '=') continue
            sb.append(B2H[c])
        }
        return sb.toString()
    }

    fun decode(myBase64: String): ByteArray {
        val chars = myBase64.toCharArray()
        val sb = StringBuilder()
        for (c in chars) {
            sb.append(H2B[c])
        }
        val padding = 4 - (sb.length % 4)
        if (padding != 4) {
            repeat(padding) {
                sb.append('=')
            }
        }
        return Base64.getDecoder().decode(sb.toString())
    }
}

fun main() {
    val encoded = MyBase64.encode("hello, world! 你好,世界!".toByteArray())
    println(encoded)
    val decoded = MyBase64.decode(encoded)
    println(String(decoded))
    /*
    val i = '⣿'.code
    for (n in 0 until 64) {
        print(Char(i-n))
    }
    */
}