yukiのブログ

作ったものなど

シェルで絵を描く

シェルには背景や文字の色を変える機能があります。通常はデフォルトの色が気に入らない場合に変更するのに使いますが、この機能を使って絵を描くプログラムを書きました*1

動かす

記事の最後にあるシェルスクリプトを保存し、実行権限を与えて実行すると、nyancatがシェルに現れます*2

f:id:e-yuki67:20161225193534p:plain

手持ちの画像で試す場合には、記事の最後にあるpythonソースコードを適当な名前(例えばshell.py)で保存して

python3 shell.py hoge.jpg -n 75

とすれば、 hoge.jpgを描くシェルスクリプトhoge.shが作られます。nオプションを使ってシェルで表示される画像の横幅を調節できます。

なお起動にはPillowという画像処理パッケージが必要です。以下のコマンドでインストールできます。

python3 -m pip install pillow

解説

シェルのカラーコード

シェルの色はRGB値ではなく以下のカラーコードによって指定します。

f:id:e-yuki67:20161225193532p:plain

シェルでコマンド

echo -e "\e[48;5;XXXhoge"

を実行すると、シェルの背景色がカラーコードXXX番に対応する色になった上でhogeが出力されます。

なお上の画像は以下のスクリプトで生成されました。

#!/bin/bash
for color in {0..255} ; do
    echo -en "\e[48;5;${color}m ${color} \t\e[0m"
    if [ $((($color + 1) % 10)) == 0 ] ; then
        echo
    fi
done
echo

ドットを描く

背景色を変えたうえで空白を出力すると、その色でドットを描くことができます。

例えば以下のコマンドを実行すると、

echo -e "\e[48;5;6m  \e[48;5;7m  \e[48;5;8m  \e[48;5;9m  \e[m"

以下のような色が出力されます。

f:id:e-yuki67:20161225193529p:plain

画像からRGB値を取得する

pythonには画像を扱うライブラリPillowがあります。Pillowを使えば、各座標のRGB値をまとめた配列を画像から簡単に手に入れることができます。

def load_image(filename):
    """
    画像から色配列を作る。
    """
    array = []
    image = Image.open(filename)
    width, height = image.size

    for y in range(height):
        array.append([])
        for x in range(width):
            color = image.getpixel((x, y))
            array[-1].append(color)
    return array

実際には画像のすべてのピクセルのRGB値は必要ないので、いくつか飛ばすなどして対応します。

RGB値をカラーコードに変換する

シェルの色をRGB値で設定することはできないので、カラーコードに変換する必要があります。

そこで以下の戦略を取りました。

  • カラーコードと対応するRGB値を対応させたpythonの辞書式配列を作っておく
  • RGB値を受け取ったら自書式配列のkeyの中で一番近いRGB値を計算し、そのRGB値に対応するカラーコードを返す

まず以下のような自書式配列を作っておきます。この配列を作るのにもpythonスクリプトを使いました。

Color_Pallet = {
    (0, 0, 0): 16,
    (0, 0, 95): 17,
    (0, 0, 135): 18,
    (0, 0, 175): 19,
    (0, 0, 215): 20,
    (0, 0, 255): 21,
    (0, 95, 0): 22,
    (0, 95, 95): 23,
    (0, 95, 135): 24,
    (0, 95, 175): 25,
    (0, 95, 215): 26,
    (0, 95, 255): 27,
    (0, 135, 0): 28,
           .
           .
          (略)
           .
           .
    (255, 255, 0): 226,
    (255, 255, 95): 227,
    (255, 255, 135): 228,
    (255, 255, 175): 229,
    (255, 255, 215): 230,
    (255, 255, 255): 231,
}

上のColor_Palletを見るとわかりますが、カラーコードが表すRGB値には

  • R, G, Bの値が0, 95, 135, 175, 215, 255 だけ
  • それらの数字どんな組み合わせもカラーコードが表すRGB値である

という特徴があります。

この特徴を生かせば、RGB値を受け取って自書式配列のkeyの中で一番近いRGB値を計算する関数がシンプルに書けます*3

def color_code_from_rgb(rgb):
    """rgbに対応するシェルのカラーコードを返す。"""
    r = truncate(rgb[0])
    g = truncate(rgb[1])
    b = truncate(rgb[2])
    return Color_Pallet[(r, g, b)]

def truncate(val):
    """valを0, 95, 135, 175, 215, 255の中で一番近い値に潰す。"""
    if val < 155:
        if val < 120:
            if val < 42:
                return 0
            else:
                return 95
        else:
            return 135
    else:
        if val < 195:
            return 135
        else:
            if val < 235:
                return 215
            else:
                return 255

pythonシェルスクリプトを作る

ピクセルのRGB値が入った配列を作る関数とRGB値をシェルのカラーコードに変換する関数が書けたので、あとはこれを出力すれば絵になります。

pythonから直接出力してもいいのですが、そうするとpythonが無い環境で実行できなくなるので、シェルスクリプトを作るようなプログラムとしました。

以下はシェルスクリプトを作る部分の抜粋です。抜粋なので、定義されていない変数などもあります。

def draw(self, color_array):
    """
    color_arrayを使って絵を描く。
    """
    self.open(color_array)
    for x_array in color_array:
        for rgb in x_array:
            self.put_pixel(rgb)
        self.new_line()
    self.close()

def open(self, color_array):
    self.file = open(self.filename, "w+")
    self.file.write("#!/bin/bash\n")
    self.file.write("echo -e $'")
    return

def put_pixel(self, rgb):
    color_code = ShellArrayPrinter.color_code_from_rgb(rgb)
    self.file.write("\\e[48;5;%dm  " % color_code)

def new_line(self):
    # 改行すると後方が現在の背景色で塗りつぶされるので、デフォルトの背景色に戻す。
    self.file.write("\\e[48;5;231m\\n")

def close(self):
    self.file.write("\\e[38;5;232m\\em")
    self.file.write("\\e[48;5;231m\\em'")
    self.file.close()

あとはこれらの関数をつなぎ合わせれば完成です。

参考文献

このプログラムはもともとエクセルで絵を描くプログラムとして描かれたものを、プログラマならシェルだろうと思ってシェルに対応させたものです。 エクセルで絵を描くというネタは、Automate the Boring Stuff with Pythonで紹介されているopenpyxlというモジュールを知ったときに思いつきました。

また元のエクセルで絵を描くプログラムをシェルに対応するように書き直す際には、今読んでいるSICPで強調されていた「処理を抽象化して中身は後から作る」という考え方が役に立ちました。

実際、今回書いたコードをエクセルへの対応は、以下のコードだけで完了します。

class ExcelArrayPrinter(ColorArrayPrinter):
    """
    エクセルでお絵かきするためのクラス
    """

    def __init__(self, filename, cell_size=10):
        super().__init__()
        self.cell_size = cell_size
        self.filename = filename + ".xlsx"
        self.x = 0
        self.y = 0

    def open(self, color_array):
        self.file = openpyxl.Workbook()
        sheet = self.file.active
        for y in range(len(color_array)):
            # pylint: disable=maybe-no-member
            sheet.row_dimensions[y + 1].height = self.cell_size / 2
            for x in range(len(color_array[0])):
                letter = openpyxl.utils.get_column_letter(x + 1)
                sheet.column_dimensions[letter].width = self.cell_size / 11.07
            # pylint: enable=maybe-no-member

    def put_pixel(self, rgb):
        key = openpyxl.utils.get_column_letter(self.x + 1) + str(self.y + 1)
        self.file.active[key].fill = openpyxl.styles.PatternFill(
            patternType='solid', fgColor=self.x11_from_rgb(rgb))
        self.x += 1

    def new_line(self):
        self.x = 0
        self.y += 1

    def close(self):
        self.file.save(filename=self.filename)

    @staticmethod
    def x11_from_rgb(rgb):
        r_str = hex(rgb[0])[2:].rjust(2, '0')
        g_str = hex(rgb[1])[2:].rjust(2, '0')
        b_str = hex(rgb[2])[2:].rjust(2, '0')
        return "ff" + r_str + g_str + b_str

この2冊の本はどちらも無料で読めます。こんなに素晴らしい本がタダで読めるなんて驚きました*4

コード

画像からシェルスクリプトを作るpythonプログラムのコードです。もともと複数ファイルだったものを一つに結合したので読みにくいかもしれません。

# -*- coding: utf-8 -*-
import argparse
import os
from PIL import Image


class ColorArrayPrinter(object):
    """
    色配列を描画するための基底クラス。
    このクラスを継承していくつかの関数をオーバーライドすれば、
    色配列を表示できるようになる。
    """

    def __init__(self):
        self.file = None

    def draw(self, color_array):
        """
        color_arrayを使って絵を描く。
        """
        self.open(color_array)
        for x_array in color_array:
            for rgb in x_array:
                self.put_pixel(rgb)
            self.new_line()
        self.close()

    def open(self, color_array):
        """
        ファイルを(おそらくはself.fileに)開いて、初期設定を行う。
        初期設定に使う情報を得るためにcolor_arrayも渡される。
        """
        assert False, "Override me!"

    def put_pixel(self, rgb):
        """
        座標(self.x, self.y)をrgbの色で塗る。
        描かれる順番は
        (0,0)->(0,1)->...->(0,n)->
        (1,0)->(1,1)->...->(1,n)->
        .................->(m,n)
        で決まっている。(シェルに出力するときにこの順番の方が良いため)
        """
        assert False, "Override me!"

    def new_line(self):
        """
        ファイルに改行を加える。
        文字が記録される場合を想定した関数なので、何もしなくて済むこともあると思う。
        """
        assert False, "Override me!"

    def close(self):
        """
        ファイルを閉じ、セーブする。
        """
        assert False, "Override me!"

class ColorArrayPainter(list):
    """
    色配列を作ったりいじったりするためのクラス。
    """

    def __init__(self):
        super().__init__()
        self.width = 0
        self.height = 0

    def put_pixel(self, x, y, rgb):
        """
        座標(x, y)の色をrgbにする
        (x, y)が領域の外だったら何もしない
        """
        if x < self.width and y < self.height:
            self[y][x] = rgb

    @staticmethod
    def load_image(filename, width):
        """
        画像から色配列を作る。
        widthは出来上がる色配列のx方向の要素数。
        """
        image = Image.open(filename)
        original_width, original_height = image.size
        height = width / original_width * original_height
        diff_x = (original_width - 1) / (width - 1)
        diff_y = (original_height - 1) / (height - 1)

        x = 0
        y = 0
        array = ColorArrayPainter()
        while y <= original_height:
            array.append([])
            x = 0
            while x <= original_width:
                color = image.getpixel((int(x), int(y)))
                array[-1].append(color)
                x += diff_x
            y += diff_y
        array.width = len(array[0])
        array.height = len(array)
        return array


class ShellArrayPrinter(ColorArrayPrinter):
    """
    シェルでお絵かきするためのクラス
    """

    def __init__(self, filename):
        super().__init__()
        self.filename = filename + ".sh"

    def open(self, color_array):
        self.file = open(self.filename, "w+")
        self.file.write("#!/bin/bash\n")
        self.file.write("echo -e $'")
        return

    def put_pixel(self, rgb):
        color_code = ShellArrayPrinter.color_code_from_rgb(rgb)
        self.file.write("\\e[48;5;%dm  " % color_code)

    def new_line(self):
        self.file.write("\\e[48;5;231m\\n")

    def close(self):
        self.file.write("\\e[m\\em")
        self.file.write("\\e[m\\em'")
        self.file.close()

    @staticmethod
    def color_code_from_rgb(rgb):
        """rgbに対応するシェルのカラーコードを返す。"""
        r = ShellArrayPrinter.truncate(rgb[0])
        g = ShellArrayPrinter.truncate(rgb[1])
        b = ShellArrayPrinter.truncate(rgb[2])
        return ShellArrayPrinter.Color_Pallet[(r, g, b)]

    @staticmethod
    def truncate(val):
        """valをPallet_Numsの一番近い値に潰す。"""
        if val < 155:
            if val < 120:
                if val < 42:
                    return 0
                else:
                    return 95
            else:
                return 135
        else:
            if val < 195:
                return 135
            else:
                if val < 235:
                    return 215
                else:
                    return 255

    Pallet_Nums = [0, 95, 135, 175, 215, 255]

    # RGB値と対応するシェルのカラーコード
    Color_Pallet = {
        (0, 0, 0): 16,
        (0, 0, 95): 17,
        (0, 0, 135): 18,
        (0, 0, 175): 19,
        (0, 0, 215): 20,
        (0, 0, 255): 21,
        (0, 95, 0): 22,
        (0, 95, 95): 23,
        (0, 95, 135): 24,
        (0, 95, 175): 25,
        (0, 95, 215): 26,
        (0, 95, 255): 27,
        (0, 135, 0): 28,
        (0, 135, 95): 29,
        (0, 135, 135): 30,
        (0, 135, 175): 31,
        (0, 135, 215): 32,
        (0, 135, 255): 33,
        (0, 175, 0): 34,
        (0, 175, 95): 35,
        (0, 175, 135): 36,
        (0, 175, 175): 37,
        (0, 175, 215): 38,
        (0, 175, 255): 39,
        (0, 215, 0): 40,
        (0, 215, 95): 41,
        (0, 215, 135): 42,
        (0, 215, 175): 43,
        (0, 215, 215): 44,
        (0, 215, 255): 45,
        (0, 255, 0): 46,
        (0, 255, 95): 47,
        (0, 255, 135): 48,
        (0, 255, 175): 49,
        (0, 255, 215): 50,
        (0, 255, 255): 51,
        (95, 0, 0): 52,
        (95, 0, 95): 53,
        (95, 0, 135): 54,
        (95, 0, 175): 55,
        (95, 0, 215): 56,
        (95, 0, 255): 57,
        (95, 95, 0): 58,
        (95, 95, 95): 59,
        (95, 95, 135): 60,
        (95, 95, 175): 61,
        (95, 95, 215): 62,
        (95, 95, 255): 63,
        (95, 135, 0): 64,
        (95, 135, 95): 65,
        (95, 135, 135): 66,
        (95, 135, 175): 67,
        (95, 135, 215): 68,
        (95, 135, 255): 69,
        (95, 175, 0): 70,
        (95, 175, 95): 71,
        (95, 175, 135): 72,
        (95, 175, 175): 73,
        (95, 175, 215): 74,
        (95, 175, 255): 75,
        (95, 215, 0): 76,
        (95, 215, 95): 77,
        (95, 215, 135): 78,
        (95, 215, 175): 79,
        (95, 215, 215): 80,
        (95, 215, 255): 81,
        (95, 255, 0): 82,
        (95, 255, 95): 83,
        (95, 255, 135): 84,
        (95, 255, 175): 85,
        (95, 255, 215): 86,
        (95, 255, 255): 87,
        (135, 0, 0): 88,
        (135, 0, 95): 89,
        (135, 0, 135): 90,
        (135, 0, 175): 91,
        (135, 0, 215): 92,
        (135, 0, 255): 93,
        (135, 95, 0): 94,
        (135, 95, 95): 95,
        (135, 95, 135): 96,
        (135, 95, 175): 97,
        (135, 95, 215): 98,
        (135, 95, 255): 99,
        (135, 135, 0): 100,
        (135, 135, 95): 101,
        (135, 135, 135): 102,
        (135, 135, 175): 103,
        (135, 135, 215): 104,
        (135, 135, 255): 105,
        (135, 175, 0): 106,
        (135, 175, 95): 107,
        (135, 175, 135): 108,
        (135, 175, 175): 109,
        (135, 175, 215): 110,
        (135, 175, 255): 111,
        (135, 215, 0): 112,
        (135, 215, 95): 113,
        (135, 215, 135): 114,
        (135, 215, 175): 115,
        (135, 215, 215): 116,
        (135, 215, 255): 117,
        (135, 255, 0): 118,
        (135, 255, 95): 119,
        (135, 255, 135): 120,
        (135, 255, 175): 121,
        (135, 255, 215): 122,
        (135, 255, 255): 123,
        (175, 0, 0): 124,
        (175, 0, 95): 125,
        (175, 0, 135): 126,
        (175, 0, 175): 127,
        (175, 0, 215): 128,
        (175, 0, 255): 129,
        (175, 95, 0): 130,
        (175, 95, 95): 131,
        (175, 95, 135): 132,
        (175, 95, 175): 133,
        (175, 95, 215): 134,
        (175, 95, 255): 135,
        (175, 135, 0): 136,
        (175, 135, 95): 137,
        (175, 135, 135): 138,
        (175, 135, 175): 139,
        (175, 135, 215): 140,
        (175, 135, 255): 141,
        (175, 175, 0): 142,
        (175, 175, 95): 143,
        (175, 175, 135): 144,
        (175, 175, 175): 145,
        (175, 175, 215): 146,
        (175, 175, 255): 147,
        (175, 215, 0): 148,
        (175, 215, 95): 149,
        (175, 215, 135): 150,
        (175, 215, 175): 151,
        (175, 215, 215): 152,
        (175, 215, 255): 153,
        (175, 255, 0): 154,
        (175, 255, 95): 155,
        (175, 255, 135): 156,
        (175, 255, 175): 157,
        (175, 255, 215): 158,
        (175, 255, 255): 159,
        (215, 0, 0): 160,
        (215, 0, 95): 161,
        (215, 0, 135): 162,
        (215, 0, 175): 163,
        (215, 0, 215): 164,
        (215, 0, 255): 165,
        (215, 95, 0): 166,
        (215, 95, 95): 167,
        (215, 95, 135): 168,
        (215, 95, 175): 169,
        (215, 95, 215): 170,
        (215, 95, 255): 171,
        (215, 135, 0): 172,
        (215, 135, 95): 173,
        (215, 135, 135): 174,
        (215, 135, 175): 175,
        (215, 135, 215): 176,
        (215, 135, 255): 177,
        (215, 175, 0): 178,
        (215, 175, 95): 179,
        (215, 175, 135): 180,
        (215, 175, 175): 181,
        (215, 175, 215): 182,
        (215, 175, 255): 183,
        (215, 215, 0): 184,
        (215, 215, 95): 185,
        (215, 215, 135): 186,
        (215, 215, 175): 187,
        (215, 215, 215): 188,
        (215, 215, 255): 189,
        (215, 255, 0): 190,
        (215, 255, 95): 191,
        (215, 255, 135): 192,
        (215, 255, 175): 193,
        (215, 255, 215): 194,
        (215, 255, 255): 195,
        (255, 0, 0): 196,
        (255, 0, 95): 197,
        (255, 0, 135): 198,
        (255, 0, 175): 199,
        (255, 0, 215): 200,
        (255, 0, 255): 201,
        (255, 95, 0): 202,
        (255, 95, 95): 203,
        (255, 95, 135): 204,
        (255, 95, 175): 205,
        (255, 95, 215): 206,
        (255, 95, 255): 207,
        (255, 135, 0): 208,
        (255, 135, 95): 209,
        (255, 135, 135): 210,
        (255, 135, 175): 211,
        (255, 135, 215): 212,
        (255, 135, 255): 213,
        (255, 175, 0): 214,
        (255, 175, 95): 215,
        (255, 175, 135): 216,
        (255, 175, 175): 217,
        (255, 175, 215): 218,
        (255, 175, 255): 219,
        (255, 215, 0): 220,
        (255, 215, 95): 221,
        (255, 215, 135): 222,
        (255, 215, 175): 223,
        (255, 215, 215): 224,
        (255, 215, 255): 225,
        (255, 255, 0): 226,
        (255, 255, 95): 227,
        (255, 255, 135): 228,
        (255, 255, 175): 229,
        (255, 255, 215): 230,
        (255, 255, 255): 231,
    }


def make_parser():
    """
    パーサーを作って、パーサーを返す。
    返り値に直接parse_arg()することが前提になっている。
    """
    parser = argparse.ArgumentParser(description="Make excel from image.")
    parser.add_argument(dest="filename", action="store",
                        help="Configure path to the image.")
    parser.add_argument("-n", dest="width", default=50, action="store",
                        help="Configure the width of generationg image.")
    return parser


def prompt():
    """
    対話処理など
    """
    arg = make_parser().parse_args()

    array = ColorArrayPainter.load_image(arg.filename, int(arg.width))

    filename = os.path.splitext(arg.filename)[0]

    shell_printer = ShellArrayPrinter(filename)
    shell_printer.draw(array)

    print("ended.")

prompt()

nyancatを表示するシェルスクリプトです。死ぬほど長いです。

#!/bin/bash
echo -e $'\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;116m  \e[48;5;195m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;17m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;17m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;23m  \e[48;5;102m  \e[48;5;101m  \e[48;5;95m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;101m  \e[48;5;102m  \e[48;5;101m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;17m  \e[48;5;102m  \e[48;5;222m  \e[48;5;222m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;212m  \e[48;5;213m  \e[48;5;212m  \e[48;5;212m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;59m  \e[48;5;59m  \e[48;5;59m  \e[48;5;59m  \e[48;5;59m  \e[48;5;59m  \e[48;5;59m  \e[48;5;59m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;174m  \e[48;5;222m  \e[48;5;210m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;212m  \e[48;5;168m  \e[48;5;213m  \e[48;5;213m  \e[48;5;204m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;212m  \e[48;5;222m  \e[48;5;222m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;174m  \e[48;5;222m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;206m  \e[48;5;168m  \e[48;5;213m  \e[48;5;213m  \e[48;5;168m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;210m  \e[48;5;222m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;174m  \e[48;5;213m  \e[48;5;213m  \e[48;5;168m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;176m  \e[48;5;176m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;222m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;23m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;196m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;196m  \e[48;5;160m  \e[48;5;16m  \e[48;5;174m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;225m  \e[48;5;16m  \e[48;5;16m  \e[48;5;212m  \e[48;5;168m  \e[48;5;177m  \e[48;5;213m  \e[48;5;222m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;196m  \e[48;5;196m  \e[48;5;16m  \e[48;5;174m  \e[48;5;212m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;59m  \e[48;5;96m  \e[48;5;213m  \e[48;5;213m  \e[48;5;222m  \e[48;5;16m  \e[48;5;23m  \e[48;5;59m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;208m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;208m  \e[48;5;16m  \e[48;5;174m  \e[48;5;212m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;206m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;213m  \e[48;5;213m  \e[48;5;222m  \e[48;5;16m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;220m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;220m  \e[48;5;220m  \e[48;5;16m  \e[48;5;16m  \e[48;5;227m  \e[48;5;208m  \e[48;5;208m  \e[48;5;16m  \e[48;5;174m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;226m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;226m  \e[48;5;226m  \e[48;5;226m  \e[48;5;190m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;227m  \e[48;5;220m  \e[48;5;16m  \e[48;5;174m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;168m  \e[48;5;168m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;118m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;118m  \e[48;5;118m  \e[48;5;118m  \e[48;5;118m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;174m  \e[48;5;213m  \e[48;5;212m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;206m  \e[48;5;168m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;82m  \e[48;5;83m  \e[48;5;83m  \e[48;5;83m  \e[48;5;77m  \e[48;5;77m  \e[48;5;83m  \e[48;5;83m  \e[48;5;77m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;82m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;174m  \e[48;5;212m  \e[48;5;204m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;231m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;231m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;82m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;83m  \e[48;5;83m  \e[48;5;83m  \e[48;5;83m  \e[48;5;83m  \e[48;5;83m  \e[48;5;16m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;174m  \e[48;5;212m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;102m  \e[48;5;16m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;32m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;174m  \e[48;5;212m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;212m  \e[48;5;168m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;210m  \e[48;5;210m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;210m  \e[48;5;210m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;33m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;33m  \e[48;5;16m  \e[48;5;174m  \e[48;5;222m  \e[48;5;212m  \e[48;5;204m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;174m  \e[48;5;174m  \e[48;5;102m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;102m  \e[48;5;210m  \e[48;5;210m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;33m  \e[48;5;33m  \e[48;5;16m  \e[48;5;174m  \e[48;5;222m  \e[48;5;222m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;213m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;63m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;63m  \e[48;5;62m  \e[48;5;63m  \e[48;5;16m  \e[48;5;16m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;222m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;63m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;60m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;59m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;102m  \e[48;5;17m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;16m  \e[48;5;102m  \e[48;5;102m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;23m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;16m  \e[48;5;16m  \e[48;5;16m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;23m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;189m  \e[48;5;60m  \e[48;5;66m  \e[48;5;66m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;104m  \e[48;5;66m  \e[48;5;102m  \e[48;5;68m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;24m  \e[48;5;231m\n\e[m\em\e[m\em'

感想

Markdownって便利だなぁ。

*1:BashZshでは256色使えるが、Bash on Windowsでは16色しか使えない。そのため生成されるスクリプトも色が変になる。

*2:シェルにコピペしてもうまく動かない。長すぎて一度に貼り付けられないようだ。

*3:もっと工夫すればColor_Palletもいらない気もする。

*4:本当に驚くべきはSICPが30年以上前に書かれたということだと思う。