Circuits.CC

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Circuits.CC

Post by Alekcandr »

Shaos wrote:хм, и точно - я их в солдермаске тоже рисую, причём с теми же размерами - поэтому в gerbv не видно :roll:
Допили? А дать потестить гербер?
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Alekcandr wrote:
Shaos wrote:хм, и точно - я их в солдермаске тоже рисую, причём с теми же размерами - поэтому в gerbv не видно :roll:
Допили? А дать потестить гербер?
Некогда допиливать - пока вот спаял одну платку на потестить :roll:
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Кто хочет, может заказать себе 3 на OSHPark: https://oshpark.com/shared_projects/Ux20E03D

P.S. И кстати у меня несколько осталось - могу подарить кому сильно надо :mrgreen:
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Shaos wrote:Похоже в некоторых "гудибэгах" на Суперконференции Хакадея в этом ноябре будут вот эти платки :mrgreen:

Image
Некоторые товарищи начали уже что-то собирать на этой платке :mrgreen:

https://twitter.com/i/status/1199893766724706310
https://twitter.com/i/status/1200230917890920448
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

По быстрому накидал адаптер PLCC-28:
plcc28ad.png
Оно правда при конверсии в герберы слегка подглюкивает, но заказывать уже можно :mrgreen:
plcc28ad-gerbv.jpg
P.S. Из того что видно сразу:
1) стрелка вверх внутри квадрата по периметру микрухи отсутствует (известная проблема - пофиксю);
2) толстые провода (синий цвет в левом-верхнем углу) не отрисовались (тут надо думать т.к. они могут идти в любую сторону);
3) через текст "AUTHOR: SHAOS" проходит горизонтальный проводник - его там быть не должно (это побочный эффект от алгоритма продолжения проводника под текстом)...
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Shaos wrote:
Shaos wrote:Только щас заметил - стрелки вверх нету внутри квадрата PLCC-44 :(

Стрелки у меня не входят в nedofont.c - придётся вписать вручную прямо в утилиту CCCP
Кроме стрелок ещё надо бы сделать флаг разрешения-запрещения закрашивания дырок VIA зелёнкой - сейчас они закрашиваются, если производитель не решит самостоятельно наложить свою маску поверх моих слоёв soldermask, и как минимум один американский производитель плат требовал держать их открытыми (может для электрического тестирования?)
Вобщем по умолчанию переходные отверстия надо держать закрашенными, а чтобы их открыть, надо использовать опцию -o
Также зеленые квадраты (и полуквадраты) по умолчанию превращаются в дорожки слотов с обоих сторон - чтобы сделать их шелкографией можно добавить опцию -n (для рисования картинок)
Можно еще добавить опцию генерации расширений гербер-файлов по стандарту sunstone.com (которых я раньше часто использовал) - скажем -s
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Shaos wrote:
Shaos wrote:Похоже в некоторых "гудибэгах" на Суперконференции Хакадея в этом ноябре будут вот эти платки :mrgreen:

Image
Некоторые товарищи начали уже что-то собирать на этой платке :mrgreen:

https://twitter.com/i/status/1199893766724706310
https://twitter.com/i/status/1200230917890920448
Вот такой конечный результат у людей получился :)
https://twitter.com/QuantumWesley/status/1205274709408927744
You do not have the required permissions to view the files attached to this post.
User avatar
fifan
Devil
Posts: 917
Joined: 06 Oct 2006 03:17
Location: г.Лянтор,Сургутского р-на,ХМАО

Re: Circuits.CC

Post by fifan »

Значит пины питания подключаются пользователем? Значит можно использовать любую микросхему в корпусе PLCC44.
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

fifan wrote:Значит пины питания подключаются пользователем? Значит можно использовать любую микросхему в корпусе PLCC44.
Угу - любую. Это же просто PLCC-адаптер...
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Shaos wrote:Кто хочет, может заказать себе 3 на OSHPark: https://oshpark.com/shared_projects/Ux20E03D

P.S. И кстати у меня несколько осталось - могу подарить кому сильно надо :mrgreen:
Ещё раз повторяю вопрос - надо кому? :roll:
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Автор RC2014 тоже решил что-то поделать с моей платкой ;)
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Claude Code написал мне программку на питоне, которая умеет конвертировать произвольный CCC-файл в PNG:

Code: Select all

#!/usr/bin/env python3
"""
Convert CCC format files to PNG images.
CCC format: comma-separated decimal integers representing cell indices
- Single 0 = row separator
- Double 0 (0,0) = end of file
Each integer (0-255) maps to an embedded 8x8 cell image.

This is a fully standalone program - all 256 cell images are embedded.
"""

import sys
from pathlib import Path
from PIL import Image
from io import BytesIO
import base64


# Embedded cell image data (256 cells: 0000-00ff)
# Each cell is an 8x8 RGB image stored as base64-encoded PNG
CELLS_DATA = {
    "0000": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAADklEQVR4nGNgGA5gFQMAAhwAq7bCL0kAAAAASUVORK5CYII=",
    "0001": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nJWOwQkAMAwCLyUzOqRT9hMaKOmjggiHiAFm0hopkJVWMxlIIzju4feUqqPrRHy/2lUbB7+vlEi9AAAAAElFTkSuQmCC",
    "0002": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAN0lEQVR4nJXOMQoAIRQD0ad4xn/InNJiF7Sw0DSBDIRpxCn9uGL8nVpbZQP4UETdXFkSJWjPVhPzPAcT2o4K9gAAAABJRU5ErkJggg==",
    "0003": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nGNkYFjFgA0wYRVlYGBggdKrwhBiYasYGBgYVkHMgpu3CiqC0yhGqGIMoxhJdhUAI7cKCExJT0YAAAAASUVORK5CYII=",
    "0004": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNkYFjFgA0wYRXFJ8GI3SB8OqhnOQALSQIMzPWFfwAAAABJRU5ErkJggg==",
    "0005": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsKQ9cMlYAwyjCIZAAD8qwYD+atCzgAAAABJRU5ErkJggg==",
    "0006": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWND4DKugakg3inQAAHrrBQmQN/UIAAAAAElFTkSuQmCC",
    "0007": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWFbB2WFQFavINIp0AAD05wYJgHys9AAAAABJRU5ErkJggg==",
    "0008": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoCZYhVWUCZccEy59TAwMYVjlIDqwyAEA9AwEB4SXVzAAAAAASUVORK5CYII=",
    "0009": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgIBUwQulVSGJhMJFVyBIwBhPpRiGBVcjyOI0CADRHBgOb6qJOAAAAAElFTkSuQmCC",
    "000a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgIBUwQulVSGJhDAwMDCxofIZVUDVMJBuFDFYhy+M0CgCyeAUJCh422wAAAABJRU5ErkJggg==",
    "000b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgIBUwQulVSGJhDAwMDCyr4OwwqAqICBPJRiGDVcjyOI0CACyDBgkt3LOpAAAAAElFTkSuQmCC",
    "000c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNkQIBVMEYYAwMDE5JEGLIKRgZ0ANXHhCERhiGCTR9VAAAIrgOxLGnjxgAAAABJRU5ErkJggg==",
    "000d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsKQ9cMlYAwyjCLZVQAtZgdZ/M8WRQAAAABJRU5ErkJggg==",
    "000e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWND4DKugakg3ChkQ5yoAq5cGXxF/JgUAAAAASUVORK5CYII=",
    "000f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nGNgQIBVDAyr4BwmBhyAEaEaDsIYGBgYWFbB2WFQFavINAoZEOcqACWiB19+A5HaAAAAAElFTkSuQmCC",
    "0010": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNkYFjFgA0wYRUdtBIAidoAuiOe/Y8AAAAASUVORK5CYII=",
    "0011": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgoBpgXIVDgol6duAEAFRlAK7l9p89AAAAAElFTkSuQmCC",
    "0012": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgQIBVDAyr4BwmBhxgcEoAAP3yAWOXdalEAAAAAElFTkSuQmCC",
    "0013": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgQIBVDAyr4BwmBhwApwTjKhwSOHUgAwotBwCg9ANeAuSmfgAAAABJRU5ErkJggg==",
    "0014": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNkwASrGBgYGBgxhSCACasoqgQD9STCUCQYGTDBKgYGBgYAVXsDDOR/KSEAAAAASUVORK5CYII=",
    "0015": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMklEQVR4nGNkwASrGBgYGBgxhSCACasoAwMDC5wbhmoeEwMOgGQHqlFIOlDNQnUVklYA+aQEt8/FXBcAAAAASUVORK5CYII=",
    "0016": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgWMXAsIoBEzBBaQxpJhTeKlwSOHWQLhGGYLJgCkEAAFN2BA97mnk5AAAAAElFTkSuQmCC",
    "0017": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMElEQVR4nGNgWMXAsIoBEzBBaQxpJhQekhwLmglwKSYGHABdRxh2HWEIJgumEAQAALE6BRN+4TYbAAAAAElFTkSuQmCC",
    "0018": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNkWMWAFTBhF0aRCGNgCMOUCGNAYxA0Cu4EGIORZFcBAKU7BA9i1avSAAAAAElFTkSuQmCC",
    "0019": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAOElEQVR4nG2NQRIAIAgCVx/pI3tlB4dMixMugxipRSkAfFKdVjRa1Ru9jIJHCs5DGfuMA5GNmBTYUXUHuND4vEEAAAAASUVORK5CYII=",
    "001a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAF0lEQVR4nGNgIBUwrsIhwYRLB+kSpAMAZqgAsuFozHoAAAAASUVORK5CYII=",
    "001b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAEklEQVR4nGNcxYAdMOEQH6QSAIsuALqj0AtvAAAAAElFTkSuQmCC",
    "001c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNkYGBgYGBYxQAFYTAGE1ZRBgYGJqyiUB2Yoiim0w4AAGaCBAivWjq8AAAAAElFTkSuQmCC",
    "001d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoDFYxcDAhFWUAVNiFYzBhFU0DFkCWZSBgQEA0g4EB8nSW1EAAAAASUVORK5CYII=",
    "001e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMElEQVR4nGNgQAarEEwmBhwASWIViiaCOpBMh7Dx64AoD0MiV8F1hCEpDmNgYGAAAPgPBg3j2J99AAAAAElFTkSuQmCC",
    "001f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgYGBgWMUABUgMJnQhGJsRiwQDA0MYXAcGYIIrQVaOJEEAINmEUwcAKHkFtLWh86UAAAAASUVORK5CYII=",
    "0020": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAADElEQVR4nGNgGB4AAADIAAGtQHYiAAAAAElFTkSuQmCC",
    "0021": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgIAxWMTCsQvCYcCnDKYFhGomAGB0AK9MCrZcYYVAAAAAASUVORK5CYII=",
    "0022": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgIAxWIZEMDExE6KA/AADXyAFXvuGGhAAAAABJRU5ErkJggg==",
    "0023": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgIABWoTMYUUThIAy3DiZcZpNuFE4AAGyBBgEnR48qAAAAAElFTkSuQmCC",
    "0024": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgIAqsQjAZMYVQFa7CqgO7ckw7VjEwrMKlIwy3qwCPSAeoSWQNLQAAAABJRU5ErkJggg==",
    "0025": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgIAusYmBYhc5mQlfBwMAQhkcfFlEUo7CbgAMAAB3FCKlF7dYXAAAAAElFTkSuQmCC",
    "0026": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYofQqJLEwZAWr0BmMWOSw6EDXtwpVxSqsloehqsMEACilCP5b5d5NAAAAAElFTkSuQmCC",
    "0027": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgIAxWMTCswiNHtCgtAQB+rQKpi/NyRQAAAABJRU5ErkJggg==",
    "0028": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgIAxWMTCsIkKUCZd+0iUIWo4BAMdpBAOB1jRPAAAAAElFTkSuQmCC",
    "0029": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgIAxWMTCsIkKOCZca0iWItBwJAAC/cQQDfv1AGQAAAABJRU5ErkJggg==",
    "002a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgIAqsQjCZMIUgbEYsysOQdRAwHZnEZTlOAAAjSQWsJocJJgAAAABJRU5ErkJggg==",
    "002b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoAysQjCZcKlhxFTLwMDAEEaGUTgBANxSAlqXGaJ3AAAAAElFTkSuQmCC",
    "002c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgGBxgFQPDKjxyBEUBdP4CqTYf1A8AAAAASUVORK5CYII=",
    "002d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgoD1ghNKrUIXDqGkHAFgiAQJ6TOavAAAAAElFTkSuQmCC",
    "002e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgGBxgFQPDKgSPiWT9AFQuAVcRsILUAAAAAElFTkSuQmCC",
    "002f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgoBisYmBYRT9RHAAARfQGpZhRSEgAAAAASUVORK5CYII=",
    "0030": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgwAEYofQqVOEwiMQqKAdZERMuo0iXwGk5TgAAsOIDtBVqP98AAAAASUVORK5CYII=",
    "0031": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgIBasYmBYxcDAwMCELgoDTCiiYVglkEQxjCJGAicAAL3NA1/A9dnwAAAAAElFTkSuQmCC",
    "0032": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFbhkkADqxgYGBiYSDaKBcEMI04HTgAAPogDCfqj3kQAAAAASUVORK5CYII=",
    "0033": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFbhkkADqxgYGBiY8BqFqpaBgYEhDLdROC3HCQBgkQOweI6mWAAAAABJRU5ErkJggg==",
    "0034": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCySgsEmgAvx04AQB3RQMIw03l3wAAAABJRU5ErkJggg==",
    "0035": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNQJJhINooRi9gqvDpwAgAmzQMJfBItFgAAAABJRU5ErkJggg==",
    "0036": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAEYGRgYGFZhkWBBMMNQJJioYtQqvDpwAgA9LgNiS1LK9AAAAABJRU5ErkJggg==",
    "0037": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAEYGRgYGFbhkkADqxgYGBiYcBlFRQmcAADMAQFfQWJlmQAAAABJRU5ErkJggg==",
    "0038": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTNQzCqcOnAAAk4IEDC+/uIUAAAAASUVORK5CYII=",
    "0039": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTCQbxYhFbBVeHTgBAH0hA7MBtp1PAAAAAElFTkSuQmCC",
    "003a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgoACsYmBYheAxDaRRAAvVAq0gph3mAAAAAElFTkSuQmCC",
    "003b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoACsYmBYheAxUc8oDDmCogAspQP/IDhreAAAAABJRU5ErkJggg==",
    "003c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgoBisYmBYRZYQ9aQZGAA9/AalCeceQwAAAABJRU5ErkJggg==",
    "003d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoBpgZGBgYFiFIRxGTR04AQCzeAIDcMfVZAAAAABJRU5ErkJggg==",
    "003e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgIAusYmBYRVVp4oRwAwBN7Aal4KFrdAAAAABJRU5ErkJggg==",
    "003f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYEcxVMEYYAwMDAxOKaBiCzYKsCjdYhWQgcYAY5QA3bwUGqm8oqwAAAABJRU5ErkJggg==",
    "0040": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYofQqVOEwrKKrGBgYGFjQ+HDAhMsObEbhsxwPAADzHARb3n7+6AAAAABJRU5ErkJggg==",
    "0041": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYEcxVKBJMKKJhDAxhaBLYjVqFRYIFwYQZAlGH0yicAACkTgO3h6L7oQAAAABJRU5ErkJggg==",
    "0042": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMUlEQVR4nHXMsQ0AIAwDwSNixgzJlHSRgsh3tt5mYMHpXUK0nMoLA78rsJ/r8sbFyAX0GAS2dsSyCAAAAABJRU5ErkJggg==",
    "0043": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmHDZgU3HKryW4wQAY5ADZYubxrEAAAAASUVORK5CYII=",
    "0044": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMUlEQVR4nGNgwAEYGRgYGFahioUxMDAwMKHwwxjg6pgYGLAoZ1iFKQEDOCWwWY4fAADizgQLpn/f2AAAAABJRU5ErkJggg==",
    "0045": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmBD8VShm4jQKp+U4AQDtRgUPPtGXAQAAAABJRU5ErkJggg==",
    "0046": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmBD8VShmYjOKAU0HkQAAqxADvM7p0b8AAAAASUVORK5CYII=",
    "0047": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqMCRgxjJhVY7PcpwAAInWA7stJK0cAAAAAElFTkSuQmCC",
    "0048": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCyShUwIJgEmkHTgAAjaYDYcfvoIMAAAAASUVORK5CYII=",
    "0049": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgwAEYofQqJLEwNDWrUKSZcBlFvgTc9FU4FMIBAI+mA7KDFM9jAAAAAElFTkSuQmCC",
    "004a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYEcxVSMJhaMpWIaSZcBnFhKYQVQKf5XAd6NZiAAD50gSxGQfOQQAAAABJRU5ErkJggg==",
    "004b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMKGrhCliwiqKahQqYEEwCdhBEAAAfa0FYdfcFLAAAAAASUVORK5CYII=",
    "004c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgwAdWMTCsQhdjwqWYdAkW7FYyMDDCWcQCACdVArR5YoTvAAAAAElFTkSuQmCC",
    "004d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nI3MwQ0AIAxC0adDdshO6ckoBxM5NIRf4KEBDWpnDfP89HUDXGmCisFs1LEJfrQAYQMEtkUlUD4AAAAASUVORK5CYII=",
    "004e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAM0lEQVR4nHXLwQ0AIAxC0adDdshO6ck0JMoJ+MBHCxrU7Rr2bDoeO1I/QQXLR41NkOytAy8DBLZtJcfZAAAAAElFTkSuQmCC",
    "004f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMIl0Cp+U4AQAaNAJhftx21AAAAABJRU5ErkJggg==",
    "0050": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTFQxigGvUTgBAFFMArliVZ6rAAAAAElFTkSuQmCC",
    "0051": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMIl5iFdRYnJbjBABSMANh24EvVwAAAABJRU5ErkJggg==",
    "0052": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTCQbhaQjDMm0MEyjwhDWYAcAk7AEY42IgKMAAAAASUVORK5CYII=",
    "0053": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqcBrFiEVsFV4dOAEAoWEEC1DuJ4kAAAAASUVORK5CYII=",
    "0054": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWCC0mFIYmFwiTB05QxhcB04jSJeAicAABxGAg71T1jGAAAAAElFTkSuQmCC",
    "0055": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSQUUJRmQLESAMQyEcAAA5HAK1ZRHYogAAAABJRU5ErkJggg==",
    "0056": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANElEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSQYzEKiQSagcSHwrC4DrCUETxAQDcawS1Y8ZBeAAAAABJRU5ErkJggg==",
    "0057": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSQaTEKqx2YNEBtxaTgQkAn+0ECwkJjQwAAAAASUVORK5CYII=",
    "0058": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nHWLsQ0AMAjDDEdyZK7sUAFFKpkgdmCJAQiAyE6voPzzsMHoqX/mKjDd23iLMdmWA9rxCQX0ScpeAAAAAElFTkSuQmCC",
    "0059": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nH3NwQ0AIAhD0adDMiRTelGDB/yHJrQppWFAgjhewuwaJcii+1W5N3Eb8bi/jZYFJ2EEtSYKU1UAAAAASUVORK5CYII=",
    "005a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVwHQwoQhBFjJhCGHZgMQqb5TgBAEaNBgj3sSeBAAAAAElFTkSuQmCC",
    "005b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYofQqJLEwBgYGBhYUZWEIJhMuoyiVWIXqCqwAAAUUArg92EUVAAAAAElFTkSuQmCC",
    "005c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAF0lEQVR4nGNgIAusYmBYNVjkGBgYGBgARfQGpbrvdQMAAAAASUVORK5CYII=",
    "005d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAEYofQqJLEwTGWrECqYcBlFugQLFsvxAwB2JAMKCttkpAAAAABJRU5ErkJggg==",
    "005e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgIAqsQjCZ0EVXoUlA+GHo+mgLANs9A63DEDwPAAAAAElFTkSuQmCC",
    "005f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgGFKAkYGBgWEVFgkADikArA8arLkAAAAASUVORK5CYII=",
    "0060": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgIAqsIkKUiQgdNAMAEr8CAXmZhxUAAAAASUVORK5CYII=",
    "0061": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoBpghNKrUIXDMEVXQblMuIxiQTcqDMNYNAAAWOIEsA4sqJoAAAAASUVORK5CYII=",
    "0062": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgwAdWYRFjwqUYpwQjFqPCsNqxCsplwWM/dgAAZG0EXIv77lwAAAAASUVORK5CYII=",
    "0063": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrUIXDMEVXIXPRlBNhFDYAAHBCBKuofj3zAAAAAElFTkSuQmCC",
    "0064": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgIAGsYmBgYGDCJYtTggVZO3ZDEexVhHVgAwA+xQQJ9fSHFQAAAABJRU5ErkJggg==",
    "0065": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpghNKrkMTCGBgYGJjQRVG4aBL4jcIJADvwBAMFIT0AAAAAAElFTkSuQmCC",
    "0066": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgIAxWMTCswiXBgFUOVYgRi2gYXjuYiHAVKgAAhM4FqgVQ4H0AAAAASUVORK5CYII=",
    "0067": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpghNKrUIXDMEVXQbn4dSADfDrCGBgYGACRxgZW+HQraAAAAABJRU5ErkJggg==",
    "0068": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgwAdWYRFjwqUYpwQjFqPCsNqxCsrFaRROAABIJQOwlWPnVgAAAABJRU5ErkJggg==",
    "0069": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgIAxWEaEGnw4mXHKoEjh1EAMA9EICBTvi2r4AAAAASUVORK5CYII=",
    "006a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgIAxWEaEGnw4mXHKoEug68Fm7Cl0aACbJBAOTwdPSAAAAAElFTkSuQmCC",
    "006b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgIABWoQswEVKxCl2UCY8cKn8VlI1hB0EAAEueBgFh9bCAAAAAAElFTkSuQmCC",
    "006c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgIABWMTCswiOHBJhwKUOVWIVLghijcAIAdMsCsX11qJgAAAAASUVORK5CYII=",
    "006d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhbGwMDAwITMgZKrkCUwAE4JnAAA5ukCXptzYBMAAAAASUVORK5CYII=",
    "006e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoBpghNKrkMTCkBWsQmKsYmBgYGDCZRROCZwAABycAwSFYOvmAAAAAElFTkSuQmCC",
    "006f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrkMTC4Cxk0VVQLhN5RmEDAERgBAOKBdIoAAAAAElFTkSuQmCC",
    "0070": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhYGZyFLrIJyWbDIoajCAEy4LAcAa1wEWqENDmYAAAAASUVORK5CYII=",
    "0071": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoBpghNKrUIXDMEVXQbks2HVgB6sYGBgYmHDJAgBeZgRakfv28AAAAABJRU5ErkJggg==",
    "0072": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgoAVYhUSiSyCJMuHSj1MCJwAACXMCrR3uwjQAAAAASUVORK5CYII=",
    "0073": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpgRDBXIQmHMbCgqwzDZcQqqFYWBJ9IAAD0ZQNeK7KLgQAAAABJRU5ErkJggg==",
    "0074": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgIAxWofCYUERXMWAD2HVgyKFK4NRBDAAArhkDWyGvYiYAAAAASUVORK5CYII=",
    "0075": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoDpYhcRYxcDAwMCESyVOCUYspjEwMIThthQAAIMDBMebjPoAAAAASUVORK5CYII=",
    "0076": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoDpYhcRYxcDAwMAE5YchyTEgSyDrC0OTCCPOUgB/1QRbXaL5mwAAAABJRU5ErkJggg==",
    "0077": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoC5YhUquYmBgYGDCpRinBCOKaRAQhtdeAFE1A65eo8AQAAAAAElFTkSuQmCC",
    "0078": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYxcCwCsbAKYcuikVuFSobiz4kAAAZdgdPVvlB7gAAAABJRU5ErkJggg==",
    "0079": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgoC5YhcpexcDAwMCESzEjFk0MDAxhWI1dhUtHGAMDAwMAU+kFVyGNswsAAAAASUVORK5CYII=",
    "007a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoBpgZGBgYFiFJBCGqWYVphCy6CooG8MonAbCAABPFASr2DKEDQAAAABJRU5ErkJggg==",
    "007b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgIAqsYmBYRawoA7ooE1ZRYnQQ0IdkPwBkWAapb6/92QAAAABJRU5ErkJggg==",
    "007c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgIAqsQjCZcKnBKUEkoMgOAJbwAV1aUNgAAAAAAElFTkSuQmCC",
    "007d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgIABWMTCsIlMOBpjwyBHUgVMtqgQAbFAGqZni+7wAAAAASUVORK5CYII=",
    "007e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAE0lEQVR4nGNgIAxWIZGERAcKAACPRwKpcWPjtAAAAABJRU5ErkJggg==",
    "007f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgIAqswiOKLrcKnc2E3YRVEAlsgBG3nTgAAEWGBVb0MbvqAAAAAElFTkSuQmCC",
    "0080": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYEcxVKBJMKKJhDAxhaBLYjVqFRYIFwYQZAlGH0yicAACkTgO3h6L7oQAAAABJRU5ErkJggg==",
    "0081": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYGRgYGFZhCIcxsCBzkAETyUYhScCNWoVHBx4AALe3BLWodVEnAAAAAElFTkSuQmCC",
    "0082": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMUlEQVR4nHXMsQ0AIAwDwSNixgzJlHSRgsh3tt5mYMHpXUK0nMoLA78rsJ/r8sbFyAX0GAS2dsSyCAAAAABJRU5ErkJggg==",
    "0083": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmHDZQboETgAAIMQCEOieKPcAAAAASUVORK5CYII=",
    "0084": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYEcxVSMJhDEwoomEIKSYGHIB0CUZ0a2GABdklyA4BAFd8A7muOgsBAAAAAElFTkSuQmCC",
    "0085": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmBD8VShm4jQKp+U4AQDtRgUPPtGXAQAAAABJRU5ErkJggg==",
    "0086": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nHXNwQkAIAwEwdEiU2Sq9KEiEXKvcFn2aDIgQdwuYRYs31kfv6qyWzv/jThcq2qzAD9JBV/lNRI3AAAAAElFTkSuQmCC",
    "0087": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVwHWgAiwTczDBkO7AYhc1ynAAAGk0Fskoy4+UAAAAASUVORK5CYII=",
    "0088": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANElEQVR4nH3MwQ0AIAgEwZEiLZIq/WgMRt0PZA+OBw0S9OUS4rzMOeNqa1AL60ffa1ztjwEvAwS2aQyhYAAAAABJRU5ErkJggg==",
    "0089": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nGNgwAdWMTCsgjFgXCYUFWEwOQY0iVUIJhO6aBhWHWEIJhNWUXwAAGO7BrNLJ73vAAAAAElFTkSuQmCC",
    "008a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAMklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMKGrhCliwiqKahQqYEEwCdhBEAAAfa0FYdfcFLAAAAAASUVORK5CYII=",
    "008b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgwAEYEcxVKBJMKKJhDAxhaBIYgEyJVbhksQEASOICtjiFuxQAAAAASUVORK5CYII=",
    "008c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANUlEQVR4nI3MwQ0AIAxC0adDdshO6ckoBxM5NIRf4KEBDWpnDfP89HUDXGmCisFs1LEJfrQAYQMEtkUlUD4AAAAASUVORK5CYII=",
    "008d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCyShUwIJgEmkHTgAAjaYDYcfvoIMAAAAASUVORK5CYII=",
    "008e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMIl0Cp+U4AQAaNAJhftx21AAAAABJRU5ErkJggg==",
    "008f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTLiMoqIETgAA/HUBuPGlE1cAAAAASUVORK5CYII=",
    "0090": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFUMDAwMTFQxigGvUTgBAFFMArliVZ6rAAAAAElFTkSuQmCC",
    "0091": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYGRgYGFZhkWBBMMNgjFVoEqgqmHDZgU3HKryW4wQAY5ADZYubxrEAAAAASUVORK5CYII=",
    "0092": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAEYGRgYGFZhkWCC0mFIYmFwiTB05QxhcB04jSJeAicAABxGAg71T1jGAAAAAElFTkSuQmCC",
    "0093": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nH3MwQ0AIAzDwIMhGbJT8kKqEMHPWA6BAQXW2QpmKqJoVw9xUd8isgGU9QOxNNF/+AAAAABJRU5ErkJggg==",
    "0094": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgwAEYofQqVOEwBiaEaBgSuQoigQ3glMBvB9xoTDYmAAANTgS3Yb+P2gAAAABJRU5ErkJggg==",
    "0095": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAANklEQVR4nHWLsQ0AMAjDDEdyZK7sUAFFKpkgdmCJAQiAyE6voPzzsMHoqX/mKjDd23iLMdmWA9rxCQX0ScpeAAAAAElFTkSuQmCC",
    "0096": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgwAdWMTCsQmcz4VJMRQlGqIXEglUMANNnBAa/DKIqAAAAAElFTkSuQmCC",
    "0097": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgwAEYGRgYGFYxMDAwMITBxFYxMDAwMOHSgVMCySgsEmgAvx04AQB3RQMIw03l3wAAAABJRU5ErkJggg==",
    "0098": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nI3NMQoAIADDwNNH+si+0slBsGDGhlAKAwLW2QKzFbdIE7V4n3+yAXu+AwlhXJvgAAAAAElFTkSuQmCC",
    "0099": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALUlEQVR4nI3NMQoAIADDwNNH+si+0slBsGDGhlAKAwLW2QKzFbdIE7V4n38RG30SA7MKOdbJAAAAAElFTkSuQmCC",
    "009a": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNgwAEYGRgYGFbBeGEICSY0PqoETqOQTYOZyYTGhxq7CpcOPAAAmeQEYKnd/CEAAAAASUVORK5CYII=",
    "009b": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAL0lEQVR4nI3MwQkAIAwEwdEiU2Sq9BVQIZB93rJHw4IEUVvC7oqJyPr8Rbh5iwkHt/QECojLwHkAAAAASUVORK5CYII=",
    "009c": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgIABWMTCsQhFgwqUSpwQjwihkEIamI4yBIQyqDocOPAAAnVMEXY55g28AAAAASUVORK5CYII=",
    "009d": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgwAEYofQqVOEwiMQqKAdZESMDJsAigWQgQaPQLMcDAI4LBllDo++UAAAAAElFTkSuQmCC",
    "009e": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKklEQVR4nGNgwAdWMTCsQmczoasIgzJQJZAAksQqXBJhuCQgcquwKEIBAAuDBrMHDWNVAAAAAElFTkSuQmCC",
    "009f": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgwAEYofQqrBIQ0TAGZEVMeI3CMAcVrEJirGJgwWIHfgAANCcGButx4YQAAAAASUVORK5CYII=",
    "00a0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoBpghNKrUIXDMEVXQblMuIxiQTcqDMNYNAAAWOIEsA4sqJoAAAAASUVORK5CYII=",
    "00a1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgwAEYofQqVOEwZA6aHAOaHEwav1HIojBNLERYgAoAftMGrTqH5LoAAAAASUVORK5CYII=",
    "00a2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgwAdWMTCsQhdjIqQDAzBikQjDqgNmHwse07ADACIYBa46Ux/DAAAAAElFTkSuQmCC",
    "00a3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoBpghNKrkMTCMJWtQlWBVQibUdhNgwEAXqwEq9d/4vcAAAAASUVORK5CYII=",
    "00a4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpghNKrUIXDMEVXQbn4dSADfDrCGBgYGACRxgZW+HQraAAAAABJRU5ErkJggg==",
    "00a5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpghNKrkMTCGBgYGJjQRVG4aBL4jcIJADvwBAMFIT0AAAAAAElFTkSuQmCC",
    "00a6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNgoC5YxcCwCsaAcZkYGBgYwrAoZkRoQgVMCNEwJBIPAAD1VgWudjmESwAAAABJRU5ErkJggg==",
    "00a7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoBpghNKrUIXDMFXCVDBhEV2FKYFkAgt2OxgYAA4wBAivCIt5AAAAAElFTkSuQmCC",
    "00a8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAI0lEQVR4nGNgoDpYhcRYxcDAwMCESyVOCUYspjEwMIThthQAAIMDBMebjPoAAAAASUVORK5CYII=",
    "00a9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgIAxWMTCsIkIZknJUfUy4VOKUYMRiGgMDQxhuSwHYVQRYxJ0bkgAAAABJRU5ErkJggg==",
    "00aa": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYhcFA4SOJMmJXGMbAhMxhCCPCUgBkTARYvGROcAAAAABJRU5ErkJggg==",
    "00ab": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoBpgRDBXIQmHYYqugrKZcBmFUwInAAAZnAMErFlhNwAAAABJRU5ErkJggg==",
    "00ac": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgoDpYBSNXYRVFkmPCZQROCZwAAMdfBKu0WEsRAAAAAElFTkSuQmCC",
    "00ad": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoDpYhcRYxcDAwMCESyULFk0MaDrCGBjCiLAUACIFA13YqLTEAAAAAElFTkSuQmCC",
    "00ae": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrkMTC4Cxk0VVQLhN5RmEDAERgBAOKBdIoAAAAAElFTkSuQmCC",
    "00af": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoBpghNKrUIXDGJiQOQxhCB4TAw6AUwInAACtxwG00e2tVQAAAABJRU5ErkJggg==",
    "00b0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgWMXAwMCAhcQNBqMOALxECqGn/2nKAAAAAElFTkSuQmCC",
    "00b1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgYGBgWMWAjcQuyoBDdIB1AABOQBVBmKyDtQAAAABJRU5ErkJggg==",
    "00b2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgYGBgWMWASTJCWdjBoNMBAKJTDU1MO/3yAAAAAElFTkSuQmCC",
    "00b3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNgQAarEEwmBhxgcEoAAIHEALlbT/HwAAAAAElFTkSuQmCC",
    "00b4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgQAarEEwmBhyAdAkWZHNxA4osBwDrjAINN6w+UwAAAABJRU5ErkJggg==",
    "00b5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgQAarEEwmBhwApwQLsnbcAEkR6TpwWg4AVWMDYeKqzYAAAAAASUVORK5CYII=",
    "00b6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNggINVSCQDAxMDDkC6BAvcUNyAUssBj6EDYbG06d8AAAAASUVORK5CYII=",
    "00b7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoD1gZFiFIRaGxl+FRDIwMOEyCqcEAK66AlpkoTMiAAAAAElFTkSuQmCC",
    "00b8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoBpgZFiFKhCGVRmSIhZ0HdgBkiImXGoA+hcDBpzYv1oAAAAASUVORK5CYII=",
    "00b9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNggINVSCQDAxMDDoBTggWulxCAqUPVEYZHLUFXAQD7TwULuTu2pwAAAABJRU5ErkJggg==",
    "00ba": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNggINVSCQDAxMDDjA4JQD9SAFjueA6xgAAAABJRU5ErkJggg==",
    "00bb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpgZFiFIRaGVSVMHQuKDnxqYeqYcFkOACOMBAY0p2jpAAAAAElFTkSuQmCC",
    "00bc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNggINVSCQDAxMDDoBTggWulxCAqSNeB0EAALbPA1/gGMFAAAAAAElFTkSuQmCC",
    "00bd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNggINVSCQDAxMDDkC6BCPcUAQIw6WYTAAAV7sCXERIEygAAAAASUVORK5CYII=",
    "00be": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgQAarEEwmBhwApwQLsnbcAEkRkTqIAQA9SQK1kdeBnwAAAABJRU5ErkJggg==",
    "00bf": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgoD1gZFiFKhCGVRmSIiZcRuGUAACHOgGwvCjgrQAAAABJRU5ErkJggg==",
    "00c0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgQAarEEwmBhyAdAlGXHZQEQAAuVABXFVLgHYAAAAASUVORK5CYII=",
    "00c1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgQAarEEwmBhyAdAlGZHNpBADBSAFcPqjnEgAAAABJRU5ErkJggg==",
    "00c2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoD1gZFhFjDIkRUy41OCUAABrWAFaFohb2gAAAABJRU5ErkJggg==",
    "00c3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgQAarEEwmBhyAdAlGXHYw4JIg3Q4A4mgCCtpotOsAAAAASUVORK5CYII=",
    "00c4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAEUlEQVR4nGNgoD1gZFhFczsAQkAArKURdJ8AAAAASUVORK5CYII=",
    "00c5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgQAarEEwmBhyAdAlGZHNxA4osBwDqYAIKuAbSIAAAAABJRU5ErkJggg==",
    "00c6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgQAarEEwmBhwApwQjLqMYcEmQrgOn5QBDGwNbD7hQtQAAAABJRU5ErkJggg==",
    "00c7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNggINVSCQDAxMDDkC6BAsWsVW4JMLIswMARk8CZ994XnoAAAAASUVORK5CYII=",
    "00c8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNggINVSCQDAxMDDoBTggWL2Cq8fEbcCkkFAKf8A1zOsaFWAAAAAElFTkSuQmCC",
    "00c9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgoBpgRDBX4VKDKsGCSxpDgoGBIYyBgYGBCZfBALrRAmBtEhGKAAAAAElFTkSuQmCC",
    "00ca": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNggINVSCQDAxMDDoBTggWuF91MXICRgDwJAADEigNcV5nKIAAAAABJRU5ErkJggg==",
    "00cb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpgZFhFkY4wBmwGrEIiGRiYcBkFAO68A61bWRgiAAAAAElFTkSuQmCC",
    "00cc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKElEQVR4nGNggINVSCQDAxMDDoBTggWL2Cq8fAwdq3BJMDAwhOG1HACv7wO7VaNYkAAAAABJRU5ErkJggg==",
    "00cd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAE0lEQVR4nGNgoBpgZFhFcx04AQCDuAFXNbwBBgAAAABJRU5ErkJggg==",
    "00ce": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNggINVSCQDAxMDDoBTggWuF91MXIARRT4Mq3IiXQUAL50FsowbNIEAAAAASUVORK5CYII=",
    "00cf": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgQAarEEwmBhwApwQjsnaiAOk6cAIAAdUCBZzeVw4AAAAASUVORK5CYII=",
    "00d0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNggINVSCQDAxMDDkC6BCPcUNoBADzbAgZALE0iAAAAAElFTkSuQmCC",
    "00d1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAF0lEQVR4nGNgoBpgZFhFGx1IiphwqQEAm9ICA6tZpbsAAAAASUVORK5CYII=",
    "00d2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNgoD1gZFhFUM0qJJKBgQmXMpwSAJPaAgR7GMx3AAAAAElFTkSuQmCC",
    "00d3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAG0lEQVR4nGNggINVSCQDAxMDDkC6BCO6HTQAADbhAgYDT+z9AAAAAElFTkSuQmCC",
    "00d4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgQAarEEwmBhwApwQjLqMYcEkQqYMYAAArAQKvArv60QAAAABJRU5ErkJggg==",
    "00d5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgoBpgROGtwqUMSYJ0HUy41AAAxP4CrYVyat8AAAAASUVORK5CYII=",
    "00d6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGklEQVR4nGNgoD1gRDBX4VKzCkWaCZcynBIAjeACBJzCo5cAAAAASUVORK5CYII=",
    "00d7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNggINVSCQDAxMDDkC6BCPcUNyAUssBjnUDXivTk20AAAAASUVORK5CYII=",
    "00d8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgQAarEEwmBhwApwQjsnbcAEkR6TpwWg4AUwsDW4+6rBIAAAAASUVORK5CYII=",
    "00d9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgQAarEEwmBhyAdAkWZHNpBADCdAFfIXGD+gAAAABJRU5ErkJggg==",
    "00da": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGUlEQVR4nGNgoD1gROGtwqUMSYIJlxqcEgBjYAFafTiWOgAAAABJRU5ErkJggg==",
    "00db": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAE0lEQVR4nGNkWMWAFTBhFx6sEgCKhAC6r/jUNgAAAABJRU5ErkJggg==",
    "00dc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNgoD1gZFiFXYIJlw7SJQBDbACyAe6yiAAAAABJRU5ErkJggg==",
    "00dd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNkWMWAAGEIJhMDDjA4JQDJAAEQBuzXjgAAAABJRU5ErkJggg==",
    "00de": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNkQAarEEwmBhxgcEoAAIKMALql0gTaAAAAAElFTkSuQmCC",
    "00df": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFUlEQVR4nGNkWMWAFTBhFyZHgh4AAIiQALJRSBqJAAAAAElFTkSuQmCC",
    "00e0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhYGZyFLrIJyWbDIoajCAEy4LAcAa1wEWqENDmYAAAAASUVORK5CYII=",
    "00e1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHklEQVR4nGNgoBpghNKrUIXDMEVXIXPRlBNhFDYAAHBCBKuofj3zAAAAAElFTkSuQmCC",
    "00e2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgoBpgZGBgYFiFKhbGwMDAwITMgZKrkCUwAE4JnAAA5ukCXptzYBMAAAAASUVORK5CYII=",
    "00e3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAKUlEQVR4nGNgoC5YhcpexcDAwMCESzEjFk0MDAxhWI1dhUtHGAMDAwMAU+kFVyGNswsAAAAASUVORK5CYII=",
    "00e4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALklEQVR4nGNgoACsQuExYgoxMDAwhDEwwVkIkoGBgQEusQqLadjtYMKqhoGBAQB72ARcr4uT6wAAAABJRU5ErkJggg==",
    "00e5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYxcCwCsbAKYcuikVuFSobiz4kAAAZdgdPVvlB7gAAAABJRU5ErkJggg==",
    "00e6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoDpYhcRYxcDAwMCESyVOCUYspuG3EgD4tgNYRt2aFgAAAABJRU5ErkJggg==",
    "00e7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgoDpYhcRYxcDAwMCESyUjFk0MDAxhWM1chSmKBABC3ARW8vc3NwAAAABJRU5ErkJggg==",
    "00e8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgoC5YhUquYmBgYGDCpZigBLJp+AEAXzsEAymO+tUAAAAASUVORK5CYII=",
    "00e9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAH0lEQVR4nGNgoC5YhUquYmBgYGDCpRinBCPCECJtBQBKcwQClRUNMgAAAABJRU5ErkJggg==",
    "00ea": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIElEQVR4nGNgoC5YxcCwCl2MESEHB2FomlB1s2CRww8AiMsFAiXplasAAAAASUVORK5CYII=",
    "00eb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgoC5YhYXLhOCgSsMkwtC1IukgEgAAax0EWfsbDfAAAAAASUVORK5CYII=",
    "00ec": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHUlEQVR4nGNgoDpYhS7AiEUiDKuOVVA2Cx7TsAMAORsEWEKKfC4AAAAASUVORK5CYII=",
    "00ed": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpghNKrkMTCkCXQpMMYmND4eI1CVYEOAC5iBAZ0Za1XAAAAAElFTkSuQmCC",
    "00ee": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgoC5YhcSAsZlQpMMQ6pjQNTGg6QjDLo0FAADDVwVZBu8OfQAAAABJRU5ErkJggg==",
    "00ef": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAHElEQVR4nGNgoBpgRDBXIQmHYYqugrJJ14ETAACanwX/VagwFwAAAABJRU5ErkJggg==",
    "00f0": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAALElEQVR4nGNggINVSCQDAyMyBxmwIJhhKFpZMNVCVDCh2IFkJk6jcFqOEwAA5F0GY+tho2MAAAAASUVORK5CYII=",
    "00f1": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJElEQVR4nGNgIAxWIZF4ACOKcggIY2BgYGDCon0VFhYRRuEEABHTBVcj20O6AAAAAElFTkSuQmCC",
    "00f2": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgoBpgRDBXwRhhEIlVmKrx6kAFSLqZcFkOAAclA1ofSWL2AAAAAElFTkSuQmCC",
    "00f3": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgQAarEEwmBhyAGIlVKKYxYrWAgYGBBYspYZhCxLgKAHqJA7YUycDiAAAAAElFTkSuQmCC",
    "00f4": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJUlEQVR4nGNgQAarEEwmBhyAGIlVKKYxIpuLDBix2ByGy3j8AACSCAOxvQP/ewAAAABJRU5ErkJggg==",
    "00f5": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgQAarEEwmBhyAGIlVKKaxIJuLDBix2ByGqYwYVwEAq04EYGbLjGoAAAAASUVORK5CYII=",
    "00f6": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJklEQVR4nGNgQAarEEwmBhyAGIlVKKYxIpuLDBix2ByGqYwYVwEAqiIEXdiX04cAAAAASUVORK5CYII=",
    "00f7": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAK0lEQVR4nGNgQAarEEwmBhwASWIVuiYM/iq4DnRVyCIYOhixqArDdAqSPgC2fges6zB15QAAAABJRU5ErkJggg==",
    "00f8": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNgQAarGBhWQZksDGggDCGHqgMGmDBlYUZh0UieUTglAFu0BGFT1cf6AAAAAElFTkSuQmCC",
    "00f9": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAJ0lEQVR4nGNkgIBVDCggjIEJzkIWhamFK0fThy6NBSBJM2KXJgcAAHWQBwHX6gLAAAAAAElFTkSuQmCC",
    "00fa": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAEklEQVR4nGNgGJxgFQPDKlKkAVMgAqkgiF9iAAAAAElFTkSuQmCC",
    "00fb": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIklEQVR4nGNgQAarEEwmBhyAdAkWZHNxAyRFLPilkYRgogAMVwQLc597zwAAAABJRU5ErkJggg==",
    "00fc": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGElEQVR4nGNgIBUwYhFbhVUIXZQ4IfIAAMBXBKgbakdJAAAAAElFTkSuQmCC",
    "00fd": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFklEQVR4nGNggIBVDAyrGFABFqHBCwDhnwKp0eW+qQAAAABJRU5ErkJggg==",
    "00fe": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAFElEQVR4nGNgoD1gZGBgYFhFWzsAQEIArKZ9/uQAAAAASUVORK5CYII=",
    "00ff": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAIUlEQVR4nGNgYGBgWMWAjYSw0ABWQYgEE25JqulgxKUDAPNUB/4MMEtcAAAAAElFTkSuQmCC",
}


def read_ccc_file(input_path):
    """Read CCC file and return list of rows (each row is a list of integers)."""
    with open(input_path, 'r') as f:
        content = f.read().strip()

    # Parse comma-separated integers
    numbers = [int(x.strip()) for x in content.split(',')]

    # Split by rows (single 0 = row separator, double 0 = end of file)
    rows = []
    current_row = []

    i = 0
    while i < len(numbers):
        if numbers[i] == 0:
            # Check if this is end of file (double 0)
            if i + 1 < len(numbers) and numbers[i + 1] == 0:
                # End of file - save current row if not empty
                if current_row:
                    rows.append(current_row)
                break
            else:
                # Single 0 - row separator
                if current_row:
                    rows.append(current_row)
                    current_row = []
        else:
            current_row.append(numbers[i])
        i += 1

    return rows


def get_cell_image(cell_index):
    """Get embedded cell image as PIL Image object."""
    hex_key = f"{cell_index:04x}"

    if hex_key not in CELLS_DATA:
        # Create a placeholder (dark gray square)
        return Image.new('RGB', (8, 8), color=(64, 64, 64))

    # Decode base64 PNG data
    b64_data = CELLS_DATA[hex_key]
    png_bytes = base64.b64decode(b64_data)
    cell_image = Image.open(BytesIO(png_bytes)).convert('RGB')

    return cell_image


def create_image_from_rows(rows, cell_size=8):
    """Create composite image from rows of cell indices.

    All cell images are embedded as 8x8 RGB images in CELLS_DATA.
    Adds 4-pixel black padding on all sides.
    """
    if not rows:
        raise ValueError("No rows found in CCC file")

    # Calculate dimensions
    max_width = max(len(row) for row in rows) if rows else 0
    height = len(rows)

    if max_width == 0:
        raise ValueError("Invalid row width")

    # Create new image with black background (no padding yet)
    image_width = max_width * cell_size
    image_height = height * cell_size
    composite = Image.new('RGB', (image_width, image_height), color='black')

    # Paste cells into composite image
    for row_idx, row in enumerate(rows):
        for col_idx, cell_index in enumerate(row):
            cell_image = get_cell_image(cell_index)

            # Calculate position
            x = col_idx * cell_size
            y = row_idx * cell_size

            # Paste cell
            composite.paste(cell_image, (x, y))

    # Add 4-pixel black padding on all sides
    padding = 4
    padded_width = image_width + 2 * padding
    padded_height = image_height + 2 * padding
    padded = Image.new('RGB', (padded_width, padded_height), color='black')
    padded.paste(composite, (padding, padding))

    return padded


def main():
    if len(sys.argv) != 3:
        print("Usage: ccc_to_png.py <input.ccc> <output.png>")
        sys.exit(1)

    input_file = Path(sys.argv[1])
    output_file = Path(sys.argv[2])

    if not input_file.exists():
        print(f"Error: Input file not found: {input_file}")
        sys.exit(1)

    try:
        # Read CCC file
        rows = read_ccc_file(input_file)
        print(f"Read {len(rows)} rows from {input_file}")

        # Create composite image (uses embedded cell data)
        image = create_image_from_rows(rows)
        print(f"Created image: {image.width}x{image.height} pixels")

        # Save image
        image.save(output_file)
        print(f"Saved to {output_file}")

    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == '__main__':
    main()
https://gitlab.com/shaos/circuits_cc/-/commits/master?ref_type=HEADS
Screenshot from 2026-01-18 20-17-44.png
P.S. На следующий день ещё добавили 4-пиксельный отступ со всех сторон для пущей красоты...
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

Я недавно зарегистрировал домен circuits.club чтобы таки допилить и запустить платную версию Circuits.CC :roll:

Пилить буду с помощью ИИ - всё, что делает бот, будет идти под другим именем, чтобы было видно, что в проекте написано руками, а что сгенерировано ботом:

Image
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

ИИ пробует переписать бекенд Circuits.CC с PHP+MySQL на Node.js+MySQL при этом в HTML-фронтэнде надо будет поменять только одну строчку:

Code: Select all

 Update sandbox.html                                                                                  
 Change line 48 from:                                                                                           
 var db = '/pcb/pcbdb.php?';                                                                                    
 To:                                                                                                            
 var db = 'http://localhost:3000/api/pcb?';     
User avatar
Shaos
Admin
Posts: 24851
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Circuits.CC

Post by Shaos »

ИИ закончил :mrgreen:

Code: Select all

● Implementation Complete ✓                                                                                            
                                                                                                                       
  I've successfully implemented the Node.js backend for Circuits.CC. Here's what was created:                          
                                                                                                                       
  Files Created                                                                                                        
                                                                                                                       
  1. nodejs/pcbdb-server.js - Main Express server with:                                                                
    - Automatic database and table initialization on startup                                                           
    - Two main API modes:                                                                                              
      - GET /api/pcb?id=0 - Returns current board state (all latest cell values)                                     
      - GET /api/pcb?id=N&col=C&row=R&sym=S - Inserts action and returns updates since id=N                            
    - Health check endpoint: GET /api/health                                                                           
    - Manual setup endpoint: GET /api/setup                                                                            
    - Proper error handling and graceful shutdown                                                                      
  2. nodejs/package.json - Dependencies configured:                                                                    
    - express (HTTP framework)                                                                                         
    - mysql2 (with promises for async/await)                                                                           
    - dotenv (configuration management)                                                                                
    - nodemon (development auto-reload)                                                                                
  3. nodejs/.env.example - Configuration template for easy setup                                                       
  4. nodejs/.env - Pre-configured with your MySQL root credentials                                                     
  5. nodejs/README-pcbdb.md - Comprehensive documentation including:                                                   
    - Installation steps                                                                                               
    - API endpoint reference                                                                                           
    - Testing examples                                                                                                 
    - Frontend integration options                                                                                     
    - Troubleshooting guide                                                                                            
                                                                                                                       
  API Testing Results                                                                                                  
                                                                                                                       
  All endpoints tested and working:                                                                                    
                                                                                                                       
  Test 1: Empty board (id=0)                                                                                           
    → Returns: (empty)                                                                                                 
                                                                                                                       
  Test 2: Insert component (id=1, col=5, row=10, sym=65)                                                               
    → Returns: 5,10,65,2 (the new record)                                                                              
                                                                                                                       
  Test 3: Insert component (id=1, col=6, row=11, sym=66)                                                               
    → Returns: 5,10,65,2 \n 6,11,66,3 (all records since id=1)                                                         
                                                                                                                       
  Test 4: Get current board state (id=0)                                                                               
    → Returns: 5,10,65,2 \n 6,11,66,3 (all current cells)                                                              
                                                                                                                       
  Test 5: Poll for updates since id=2                                                                                  
    → Returns: 6,11,66,3 \n 7,12,67,4 (updates since id=2)                                                             
                                                                                                                       
  Key Features                                                                                                         
                                                                                                                       
  - ✅ Automatic initialization - Creates database and tables on first run                                             
  - ✅ Security - Uses parameterized queries (prevents SQL injection)                                                  
  - ✅ Connection pooling - 10 concurrent connections for efficiency                                                   
  - ✅ IP tracking - Records client IP for each action                                                                 
  - ✅ Exact API compatibility - Matches PHP output format (CSV)                                                       
  - ✅ Production-ready - Proper error handling and graceful shutdown                                                  
                                                                                                                       
  To Use                                                                                                               
                                                                                                                       
  cd nodejs                                                                                                            
  npm start                                                                                                            
                                                                                                                       
  The server will run on http://localhost:3000 with the API at /api/pcb                                                
                                                                                                                       
  Next Steps                                                                                                           
                                                                                                                       
  To integrate with the frontend, update www/sandbox.html line 48:                                                     
  var db = 'http://localhost:3000/api/pcb?';                                                                           
                                                                                                                       
  Or use a reverse proxy to maintain the existing URL structure.                                                       
                                                                                                                       
✻ Cooked for 1m 40s