From 8441d370d3da7d6fca8a4025001d506e71b4c2ec Mon Sep 17 00:00:00 2001 From: David Montero Crespo Date: Fri, 5 Jun 2026 11:55:28 -0300 Subject: [PATCH] test(chipbus): a real Galaksija (1983 Z80 home computer) boots over the bus The public-domain Galaksija ROM (Voja Antonic; ROM A monitor + integer BASIC, ROM B float BASIC, 8 KB) runs on a standalone Z80 + external ROM + RAM + an inverter for address decode, all chip-to-chip over the shared bus, no board: ROM 0x0000-0x1FFF rom.CE = A13 RAM 0x2000-0x3FFF ram.CE = NOT A13 (the inverter chip) RD -> both OE ; WR -> RAM WE Pin-level boot proof (mirrors test_intel/test_z80/galaksija.test.js): watch M1, read the address bus on each opcode fetch, and confirm the Z80 leaves the reset vector (DI; SUB A; JP 0x03DA), reaches the init routine at 0x03DA, and runs 1000+ fetches across 50+ distinct ROM addresses -- the real firmware executing end-to-end through the settle-kernel bus. The on-screen "READY" prompt is the next milestone (needs the video display chip rendering the 0x2800 video RAM). galaksija-rom.c embeds the public-domain ROM A+B image. 38 chipbus tests across 8 files pass. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../__tests__/chipbus-galaksija-boot.test.ts | 124 ++++ .../fixtures/chipbus/galaksija-rom.wasm | Bin 0 -> 29689 bytes .../sdk/examples/galaksija-rom.c | 551 ++++++++++++++++++ .../sdk/examples/galaksija-rom.chip.json | 8 + 4 files changed, 683 insertions(+) create mode 100644 frontend/src/__tests__/chipbus-galaksija-boot.test.ts create mode 100644 frontend/src/__tests__/fixtures/chipbus/galaksija-rom.wasm create mode 100644 test/test_custom_chips/sdk/examples/galaksija-rom.c create mode 100644 test/test_custom_chips/sdk/examples/galaksija-rom.chip.json diff --git a/frontend/src/__tests__/chipbus-galaksija-boot.test.ts b/frontend/src/__tests__/chipbus-galaksija-boot.test.ts new file mode 100644 index 00000000..ff922ca6 --- /dev/null +++ b/frontend/src/__tests__/chipbus-galaksija-boot.test.ts @@ -0,0 +1,124 @@ +/** + * Phase 3 — a REAL 1983 home computer boots over the chip-to-chip bus. + * (project/multichip-bus/). + * + * Galaksija (Voja Antonic, 1983; ROM placed in the public domain by the author) + * is a Z80 home computer. Here its real 8 KB ROM (ROM A monitor + integer BASIC + * at 0x0000, ROM B float BASIC at 0x1000) runs on a standalone Z80 + external + * ROM + RAM + an inverter for address decode, all chip-to-chip over a shared + * bus, no board: + * ROM 0x0000-0x1FFF rom.CE = A13 + * RAM 0x2000-0x3FFF ram.CE = NOT A13 (the inverter chip) + * RD -> both OE ; WR -> RAM WE + * + * Boot proof is pin-level, mirroring test/test_intel/test_z80/galaksija.test.js: + * watch M1, read the address bus on each opcode fetch, and confirm the Z80 + * leaves the reset vector (DI; SUB A; JP 0x03DA), reaches the init routine at + * 0x03DA, and runs a thousand-plus fetches across many ROM addresses — i.e. the + * real Galaksija firmware executes end-to-end through the settle-kernel bus. The + * on-screen "READY" prompt is the next milestone (it needs the video display + * chip rendering the 0x2800 video RAM). + * + * Fixtures (wasi-sdk): z80.wasm from examples/intel/z80.c; galaksija-rom.wasm + * holds the public-domain ROM A+B; ram-64k/inverter from the committed examples. + * Skips cleanly if absent. + */ +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { readFileSync, existsSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { PinManager } from '../simulation/PinManager'; +import { ChipInstance } from '../simulation/customChips/ChipRuntime'; +import { + resolveChipNetKey, + setChipBusEnabledForTest, + resetChipNetIndexForTest, + type ChipNetState, +} from '../simulation/customChips/chipNets'; +import { syntheticChipPin } from '../simulation/customChips/syntheticPins'; +import { resetBusNets } from '../simulation/customChips/busNets'; + +const f = (n: string) => fileURLToPath(new URL(`./fixtures/chipbus/${n}`, import.meta.url)); +const paths = { z80: f('z80.wasm'), rom: f('galaksija-rom.wasm'), ram: f('ram-64k.wasm'), inv: f('inverter.wasm') }; +const haveFixtures = Object.values(paths).every(existsSync); + +const range = (n: number) => Array.from({ length: n }, (_, i) => i); + +const Z80_PINS = [ + ...range(16).map((i) => `A${i}`), ...range(8).map((i) => `D${i}`), + 'M1', 'MREQ', 'IORQ', 'RD', 'WR', 'RFSH', 'HALT', 'WAIT', + 'INT', 'NMI', 'RESET', 'BUSREQ', 'BUSACK', 'CLK', 'VCC', 'GND', +]; +const ROM_PINS = [...range(13).map((i) => `A${i}`), ...range(8).map((i) => `D${i}`), 'CE', 'OE']; +const RAM_PINS = [...range(16).map((i) => `A${i}`), ...range(8).map((i) => `D${i}`), 'CE', 'OE', 'WE', 'VCC', 'GND']; +const INV_PINS = ['IN', 'OUT']; + +const W: ChipNetState['wires'] = []; +const wire = (a: string, ap: string, b: string, bp: string) => + (W as { start: { componentId: string; pinName: string }; end: { componentId: string; pinName: string } }[]).push( + { start: { componentId: a, pinName: ap }, end: { componentId: b, pinName: bp } }); +for (const i of range(13)) { wire('z80', `A${i}`, 'rom', `A${i}`); wire('z80', `A${i}`, 'ram', `A${i}`); } +wire('z80', 'A13', 'rom', 'CE'); +wire('z80', 'A13', 'inv', 'IN'); +wire('inv', 'OUT', 'ram', 'CE'); +for (const i of range(8)) { wire('z80', `D${i}`, 'rom', `D${i}`); wire('z80', `D${i}`, 'ram', `D${i}`); } +wire('z80', 'RD', 'rom', 'OE'); +wire('z80', 'RD', 'ram', 'OE'); +wire('z80', 'WR', 'ram', 'WE'); + +const STATE: ChipNetState = { + wires: W, + components: [ + { id: 'z80', metadataId: 'custom-chip' }, { id: 'rom', metadataId: 'custom-chip' }, + { id: 'ram', metadataId: 'custom-chip' }, { id: 'inv', metadataId: 'custom-chip' }, + ], + boards: [], +}; +const pinKey = (c: string, p: string): number => resolveChipNetKey(STATE, c, p) ?? syntheticChipPin(c, p); +const wiresFor = (c: string, pins: string[]) => new Map(pins.map((p) => [p, pinKey(c, p)] as [string, number])); + +describe.skipIf(!haveFixtures)('chipbus Phase 3 — Galaksija (real Z80 home computer) boots over the bus', () => { + beforeEach(() => { setChipBusEnabledForTest(true); resetChipNetIndexForTest(); resetBusNets(); }); + afterEach(() => { setChipBusEnabledForTest(null); resetChipNetIndexForTest(); resetBusNets(); }); + + it('runs the public-domain Galaksija ROM: leaves reset, reaches init 0x03DA, executes 1000+ fetches', async () => { + const pm = new PinManager(); + const z80 = await ChipInstance.create({ wasm: new Uint8Array(readFileSync(paths.z80)), componentId: 'z80', pinManager: pm, wires: wiresFor('z80', Z80_PINS) }); + z80.start(); + const rom = await ChipInstance.create({ wasm: new Uint8Array(readFileSync(paths.rom)), componentId: 'rom', pinManager: pm, wires: wiresFor('rom', ROM_PINS) }); + rom.start(); + const ram = await ChipInstance.create({ wasm: new Uint8Array(readFileSync(paths.ram)), componentId: 'ram', pinManager: pm, wires: wiresFor('ram', RAM_PINS) }); + ram.start(); + const inv = await ChipInstance.create({ wasm: new Uint8Array(readFileSync(paths.inv)), componentId: 'inv', pinManager: pm, wires: wiresFor('inv', INV_PINS) }); + inv.start(); + + // Watch M1: on each opcode fetch, read the address bus = PC. + const addrKeys = range(16).map((i) => pinKey('z80', `A${i}`)); + const readPc = () => { let pc = 0; for (let i = 0; i < 16; i++) if (pm.getPinState(addrKeys[i])) pc |= 1 << i; return pc; }; + let fetches = 0, reached03DA = false, everMoved = false, lastPc = -1; + const seen = new Set(); + pm.onPinChange(pinKey('z80', 'M1'), (_p, state) => { + if (state) return; // only on M1 asserted (low) + const pc = readPc(); + fetches++; seen.add(pc); + if (pc === 0x03da) reached03DA = true; + if (pc !== lastPc && lastPc !== -1) everMoved = true; + lastPc = pc; + }); + + // Deassert control inputs, then release RESET (rising edge). + for (const p of ['WAIT', 'INT', 'NMI', 'BUSREQ']) pm.triggerPinChange(pinKey('z80', p), true); + pm.triggerPinChange(pinKey('z80', 'RESET'), false); + pm.triggerPinChange(pinKey('z80', 'RESET'), true); + + // ~60000 instructions of the 4 MHz pseudo-clock (250 ns period) — enough + // to clear the screen, set up the stack, and run the welcome-banner init. + z80.tickTimers(BigInt(60000 * 250)); + + expect(everMoved, 'PC advances past the reset vector').toBe(true); + expect(reached03DA, 'PC reaches the init routine at 0x03DA (JP target from reset)').toBe(true); + expect(fetches, 'opcode fetches over the run').toBeGreaterThan(1000); + expect(seen.size, 'distinct fetch addresses (init really runs through the ROM)').toBeGreaterThan(50); + + z80.dispose(); rom.dispose(); ram.dispose(); inv.dispose(); + }, 30_000); +}); diff --git a/frontend/src/__tests__/fixtures/chipbus/galaksija-rom.wasm b/frontend/src/__tests__/fixtures/chipbus/galaksija-rom.wasm new file mode 100644 index 0000000000000000000000000000000000000000..15b7211acbb7bf5372892eee65f949b5b037be02 GIT binary patch literal 29689 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 literal 0 HcmV?d00001 diff --git a/test/test_custom_chips/sdk/examples/galaksija-rom.c b/test/test_custom_chips/sdk/examples/galaksija-rom.c new file mode 100644 index 00000000..8d7e15b5 --- /dev/null +++ b/test/test_custom_chips/sdk/examples/galaksija-rom.c @@ -0,0 +1,551 @@ +/* + * galaksija-rom — 8 KB Galaksija home-computer ROM (ROM A + ROM B), a bus EPROM + * for the Phase 3 proof (project/multichip-bus/). Public-domain ROM by Voja + * Antonic (Galaksija, 1983). ROM A 0x0000-0x0FFF (monitor + integer BASIC), + * ROM B 0x1000-0x1FFF (float BASIC). Drives D0..D7 when CE and OE are low. + */ +#include "velxio-chip.h" +#include +#include + +#define ROM_SIZE 0x2000 + +static const uint8_t rom_image[ROM_SIZE] = { + 0xf3,0x97,0xc3,0xda,0x03,0xdf,0x2c,0x2c,0xcd,0xb2,0x0a,0xc3,0x6d,0x0a,0xf3,0xc9, + 0x7c,0xba,0xc0,0x7d,0xbb,0xc9,0xfb,0xc9,0xe3,0xcd,0x05,0x01,0xbe,0xc3,0x94,0x01, + 0xd9,0xfe,0x20,0xcd,0xb5,0x09,0xd9,0xc9,0x21,0x00,0x00,0xc9,0xcc,0xcc,0xcc,0x7e, + 0xf1,0xcd,0x14,0x04,0xc3,0x8f,0x07,0x1d,0xf5,0xc5,0xd5,0xe5,0x21,0xb0,0x2b,0x3e, + 0xc0,0x96,0x96,0x96,0x5f,0x7e,0x0f,0x0f,0x0f,0x47,0xb7,0x28,0x00,0x28,0x05,0x35, + 0xaf,0xd8,0x10,0xfd,0x23,0x77,0x43,0x21,0x7f,0x20,0x4d,0x3a,0xa8,0x2b,0x1f,0x38, + 0x00,0x3d,0x20,0xfd,0x18,0x07,0xf3,0x31,0xa8,0x2b,0xc3,0x17,0x03,0x0c,0x79,0xe6, + 0x08,0x0f,0x0f,0x0f,0xf6,0x28,0xed,0x47,0x13,0x11,0x0c,0x08,0x79,0x0f,0x0f,0x0f, + 0x3f,0xcb,0x1a,0xf6,0x1f,0x07,0xd6,0x40,0x0f,0xed,0x4f,0x72,0x14,0x14,0x14,0x14, + 0xaf,0x37,0x1f,0x1f,0xaa,0x57,0x61,0x78,0x42,0x52,0x45,0x41,0x4b,0x00,0x47,0x4c, + 0x00,0x00,0x80,0x00,0xaf,0x37,0x1f,0x1f,0x1f,0x67,0x17,0x77,0x05,0x28,0x0f,0xed, + 0x5f,0xd6,0x27,0xa5,0xed,0x4f,0x1d,0xc2,0x8b,0x00,0x3e,0x03,0x18,0xa3,0x36,0xbc, + 0x3a,0x82,0x2a,0xfe,0x3a,0x20,0x34,0x3a,0xaf,0x2b,0x07,0x30,0x2e,0x21,0x8a,0x2a, + 0x11,0x30,0x39,0x06,0x08,0x7a,0x34,0x34,0xbe,0x18,0x04,0x34,0xbe,0x3e,0x35,0x30, + 0x0a,0x73,0x2b,0xcb,0x40,0x28,0x02,0x2b,0x7a,0x10,0xf0,0x05,0x10,0x0d,0x7e,0xfe, + 0x34,0x38,0x08,0x2b,0xcb,0x4e,0x28,0x03,0x73,0x23,0x73,0xfd,0xe9,0xe1,0xd1,0xc1, + 0xf1,0xfb,0xed,0x4d,0x13,0x1a,0xfe,0x20,0x28,0xfa,0xc9,0x23,0xaf,0xcd,0xf3,0x0d, + 0x22,0x99,0x2a,0xf7,0xcf,0x23,0xaf,0xcd,0xf3,0x0d,0xd5,0xed,0x5b,0x99,0x2a,0x13, + 0xd7,0x30,0x31,0x18,0x21,0xcd,0x05,0x01,0xd6,0x41,0xd8,0xfe,0x1a,0x3f,0xd8,0x13, + 0xa7,0x20,0x2b,0xdf,0x28,0x27,0xcf,0x23,0x29,0x29,0xd5,0x38,0x17,0xed,0x5b,0x99, + 0x2a,0x19,0xd1,0xd5,0x38,0x0d,0xd1,0xdf,0x29,0x09,0xd5,0xeb,0xcd,0x83,0x01,0xd7, + 0x30,0x36,0x3e,0xd5,0xcd,0x99,0x07,0x53,0x4f,0x52,0x52,0x59,0x0d,0xaf,0x26,0x2a, + 0x17,0x17,0x6f,0xaf,0xc9,0xcd,0x72,0x01,0xd0,0xfe,0x41,0xd8,0xc6,0x09,0xfe,0x50, + 0x18,0x06,0x1a,0xfe,0x30,0xd8,0xfe,0x3a,0x3f,0xd8,0x13,0xe6,0x0f,0xc9,0x77,0x23, + 0x7d,0x18,0xf8,0xd5,0xed,0x5b,0x38,0x2c,0x2a,0x6a,0x2a,0x7d,0xe6,0xf0,0x6f,0xed, + 0x52,0xd1,0xaf,0xc9,0x23,0x28,0x07,0xc5,0x4e,0x06,0x00,0x09,0xc1,0x1b,0x13,0x23, + 0xe3,0xc9,0xcd,0x48,0x02,0x06,0x00,0x48,0xcd,0x05,0x01,0xcd,0xb0,0x01,0x18,0xfb, + 0xcd,0x72,0x01,0x38,0x20,0xcb,0xf0,0xcb,0x78,0x20,0x15,0xcd,0xc3,0x01,0xcb,0x40, + 0xc8,0x0d,0xc9,0xcd,0x4f,0x02,0xc8,0xd9,0x62,0x6b,0x08,0x4f,0xd9,0xcb,0xf8,0xf1, + 0xcb,0x40,0xc0,0x0c,0xc9,0xdf,0x2e,0x05,0xcb,0x40,0xcb,0xc0,0xc8,0xf1,0xcb,0x70, + 0xc8,0x21,0x18,0x00,0xc5,0xd5,0xd9,0xcd,0x14,0x09,0xd1,0x01,0xf3,0x01,0xc5,0xd5, + 0xc3,0x6d,0x0b,0xc1,0xd5,0xdf,0x45,0x1b,0xdf,0x2b,0x02,0x18,0x05,0xdf,0x2d,0x02, + 0xcb,0xc8,0xcd,0x4a,0x02,0xcd,0x72,0x01,0x38,0x0d,0xcb,0xe8,0xcd,0x4f,0x02,0x20, + 0x14,0x18,0xf2,0xd1,0xaf,0x18,0x17,0xcb,0x68,0x28,0xf8,0xf1,0xd9,0x79,0xb4,0x7d, + 0xd9,0x20,0x02,0xcb,0x7f,0xc2,0x5a,0x06,0xcb,0x48,0x28,0x02,0xed,0x44,0x81,0xa7, + 0x28,0x13,0xcb,0x7f,0x28,0x07,0x3c,0xf5,0xcd,0xf4,0x0a,0x18,0x05,0x3d,0xf5,0xcd, + 0xe3,0x0a,0xf1,0x18,0xea,0xcb,0x70,0xc9,0xcb,0xb0,0xd9,0xef,0x4d,0xd9,0xc9,0x08, + 0xd9,0x54,0x5d,0x79,0x06,0x00,0xf5,0x29,0xcb,0x11,0xcb,0x10,0x29,0xcb,0x11,0xcb, + 0x10,0x19,0x89,0x4f,0x3e,0x00,0x88,0x47,0xf1,0xd5,0x16,0x00,0x29,0xcb,0x11,0xcb, + 0x10,0x08,0x5f,0x19,0x7a,0x89,0x4f,0x7a,0x88,0x47,0xd1,0xd9,0xc9,0x5d,0x54,0x13, + 0x1a,0x1b,0x12,0x13,0xfe,0x0d,0x20,0xf7,0x18,0x25,0x7d,0xfe,0xb6,0x28,0x20,0x2b, + 0x18,0x1d,0x7e,0xfe,0x0d,0x28,0x18,0x18,0x51,0xcd,0xd3,0x0c,0xcd,0xf2,0x07,0xda, + 0x5a,0x06,0x3e,0x0c,0xe7,0x21,0xb6,0x2b,0x22,0x68,0x2a,0xcd,0x31,0x09,0xd9,0x11, + 0x00,0x28,0xed,0x53,0x68,0x2a,0x11,0xb6,0x2b,0x4e,0x36,0x00,0xcd,0x37,0x09,0x3e, + 0x5f,0xcd,0xb6,0x07,0xcd,0xf5,0x0c,0xfe,0x0d,0x28,0x71,0xb7,0x28,0xaf,0xfe,0x1d, + 0x28,0xb8,0xfe,0x1e,0x28,0xbc,0x38,0xd7,0x47,0xe5,0x21,0x34,0x2c,0xd7,0xe1,0x38, + 0xce,0x1b,0x1a,0x13,0x12,0x1b,0xd7,0x20,0xf8,0x70,0x23,0x18,0xc2,0x3a,0x68,0x2a, + 0xe6,0x1f,0x3e,0x0d,0x32,0xb5,0x2b,0xc8,0xe7,0xc9,0x3a,0x33,0x20,0x0f,0xd8,0x3a, + 0x31,0x20,0x0f,0x38,0xf5,0xcd,0xed,0x02,0x11,0x98,0x00,0xcd,0x37,0x09,0xed,0x5b, + 0x9f,0x2a,0x7a,0xb3,0xc4,0xed,0x08,0xfb,0xcd,0xed,0x02,0x11,0x07,0x0f,0xcd,0x37, + 0x09,0xef,0x11,0x31,0x30,0x31,0xa7,0x2a,0xd5,0xe5,0xe5,0xe5,0x2a,0x36,0x2c,0x23, + 0x23,0xe5,0x31,0xa8,0x2b,0xdd,0x21,0xac,0x2a,0xcd,0xbb,0x07,0xd5,0x11,0xb6,0x2b, + 0xcd,0xd3,0x0c,0xc1,0xca,0x8c,0x03,0x1b,0x7c,0x12,0x1b,0x7d,0x12,0xc5,0xd5,0x79, + 0x93,0xf5,0xcd,0xf2,0x07,0xd5,0x20,0x10,0xd5,0xcd,0x11,0x08,0xc1,0x2a,0x38,0x2c, + 0xcd,0x44,0x09,0x60,0x69,0x22,0x38,0x2c,0xc1,0x2a,0x38,0x2c,0xf1,0xe5,0xfe,0x03, + 0x28,0xaf,0x5f,0x16,0x00,0x19,0xed,0x5b,0x6a,0x2a,0xd7,0xd2,0x53,0x01,0x22,0x38, + 0x2c,0xd1,0xcd,0x4c,0x09,0xd1,0xe1,0xcd,0x44,0x09,0x18,0x95,0x21,0x17,0x03,0xe5, + 0x2e,0x0e,0x01,0x2e,0x9b,0x01,0x2e,0xee,0x26,0x0f,0xcd,0x05,0x01,0xd5,0x13,0x23, + 0xbe,0x28,0x06,0xcb,0x7e,0x20,0x0c,0x18,0x11,0x1a,0x13,0x23,0xbe,0x28,0xfa,0xcb, + 0x7e,0x28,0x03,0x1b,0x18,0x12,0xfe,0x2e,0x28,0x09,0x23,0xcb,0x7e,0x28,0xfb,0x23, + 0xd1,0x18,0xd7,0x23,0xcb,0x7e,0x28,0xfb,0x7e,0x23,0x6e,0xe6,0x7f,0x67,0xf1,0xcb, + 0x74,0xcb,0xb4,0xe5,0xc4,0x6a,0x0a,0xc3,0xa9,0x2b,0xed,0x56,0xfd,0x21,0xfd,0x00, + 0x21,0xff,0x27,0x75,0x45,0x23,0x70,0x34,0x20,0x03,0xb6,0x28,0xf8,0x22,0x6a,0x2a, + 0x31,0xad,0x2b,0x21,0x0b,0xc9,0xe5,0x3b,0xe5,0xcd,0x00,0x10,0xcd,0xd3,0x0c,0x11, + 0x3a,0x2c,0x19,0x31,0x3a,0x2c,0xe5,0xe5,0xc3,0x67,0x00,0xcd,0xd3,0x0c,0xed,0x5b, + 0x36,0x2c,0x18,0x0e,0x32,0xb5,0x2b,0xdf,0x3a,0x03,0xf1,0x18,0x10,0xdf,0x0d,0x20, + 0xf1,0xef,0xcd,0xf6,0x07,0x38,0xe1,0xed,0x53,0x9f,0x2a,0x13,0x13,0xcd,0xff,0x02, + 0xdd,0x21,0xac,0x2a,0x2e,0x2f,0xc3,0x98,0x03,0xcd,0x8e,0x06,0xcd,0x10,0x0b,0xef, + 0xc9,0xcf,0x7c,0xb5,0x20,0xe7,0xcd,0x1c,0x08,0x30,0xdc,0x18,0xbb,0xef,0xcd,0x13, + 0x08,0x18,0xf6,0xcf,0xd5,0xcd,0xf2,0x07,0xc2,0x5b,0x06,0xf1,0x18,0xc9,0xcd,0xd3, + 0x0c,0xcd,0xed,0x02,0xcd,0xf2,0x07,0x38,0x9f,0xcd,0x31,0x09,0xcd,0xf6,0x07,0x38, + 0xf6,0xcd,0xff,0x02,0x3a,0x30,0x20,0x21,0x34,0x20,0xa6,0x0f,0x30,0xeb,0x18,0xf1, + 0xdf,0x3a,0x05,0x3e,0x0d,0xe7,0x18,0xa5,0xdf,0x0d,0x46,0xe7,0x18,0x93,0xdf,0x22, + 0x54,0xcd,0x38,0x09,0x20,0xf6,0x18,0x15,0x2e,0x5c,0x01,0x2e,0x60,0x26,0x2a,0xcd, + 0x0e,0x06,0x7e,0x23,0xb7,0x28,0x06,0xe7,0x7d,0xe6,0x0f,0x20,0xf5,0xdf,0x2c,0x1b, + 0x3a,0x68,0x2a,0xe6,0x07,0x28,0x17,0x3e,0x20,0xe7,0x18,0xf4,0xcf,0x7c,0xf6,0x28, + 0xe6,0x29,0x67,0x22,0x68,0x2a,0xdf,0x2c,0x02,0x18,0x03,0xdf,0x3b,0x13,0xcd,0x14, + 0x04,0x2e,0xe0,0xc3,0x98,0x03,0xcd,0xd3,0x0c,0x22,0x6c,0x2a,0x20,0x06,0x3e,0x0c, + 0x01,0x3e,0x0d,0xe7,0xf7,0xcd,0x96,0x03,0x20,0x07,0xcd,0xb2,0x0a,0xcd,0xf6,0x08, + 0x3e,0xe7,0x18,0xb9,0xcd,0x74,0x09,0xcf,0xd5,0xcd,0xf2,0x07,0xc2,0x5b,0x06,0x2a, + 0x9f,0x2a,0xe5,0x2a,0xa3,0x2a,0xe5,0xef,0x22,0xa1,0x2a,0x39,0x22,0xa3,0x2a,0xc3, + 0x27,0x04,0x2a,0xa3,0x2a,0x7c,0xb5,0xca,0x5a,0x06,0xf9,0xe1,0x22,0xa3,0x2a,0xe1, + 0x22,0x9f,0x2a,0xd1,0xcd,0x59,0x09,0xf7,0xcf,0x01,0xef,0x23,0x22,0x91,0x2a,0x2a, + 0x9f,0x2a,0x22,0x93,0x2a,0xeb,0x22,0x95,0x2a,0x01,0x0a,0x00,0x2a,0xa1,0x2a,0xeb, + 0xef,0x39,0x3e,0x09,0x7e,0x23,0xb6,0x28,0x16,0x7e,0x2b,0xba,0x20,0xf5,0x7e,0xbb, + 0x20,0xf1,0xeb,0xef,0x39,0x44,0x4d,0x21,0x0a,0x00,0x19,0xcd,0x4c,0x09,0xf9,0x2a, + 0x95,0x2a,0xeb,0xf7,0xcd,0x8b,0x07,0x22,0x9b,0x2a,0xd5,0xeb,0x2a,0xa1,0x2a,0x7c, + 0xb5,0xca,0x5b,0x06,0xd7,0x28,0x09,0xd1,0xcd,0x59,0x09,0x2a,0x9b,0x2a,0x18,0xea, + 0xcd,0x45,0x0a,0xcd,0x6d,0x0a,0xeb,0x2a,0x91,0x2a,0xe5,0x19,0xe5,0xcd,0xbc,0x0a, + 0x2a,0xa1,0x2a,0xcd,0x3b,0x07,0xd1,0x2a,0x6e,0x2a,0xf1,0x07,0x30,0x01,0xeb,0x7c, + 0xaa,0xf2,0xa5,0x05,0xeb,0xd7,0xd1,0xda,0x24,0x05,0x2a,0x93,0x2a,0x22,0x9f,0x2a, + 0x18,0xad,0xca,0x36,0x07,0xe5,0xcd,0xfc,0x05,0x38,0x0f,0x28,0x25,0xe3,0xc1,0x0a, + 0xb7,0x28,0x2a,0x03,0xcd,0x7e,0x01,0x20,0xf6,0xc9,0xe1,0xdf,0x22,0x00,0xcd,0xd9, + 0x05,0x28,0x1a,0x13,0xcd,0x7e,0x01,0x20,0xf5,0x1a,0xfe,0x0d,0xc8,0xfe,0x22,0xc0, + 0x13,0xc9,0x1b,0xcd,0x96,0x03,0x28,0xe2,0xe1,0xcd,0x7e,0x01,0xc8,0xdf,0x2b,0x02, + 0x18,0xc3,0x36,0x00,0xcd,0x7f,0x01,0xc8,0x36,0x30,0x18,0xf8,0xcd,0x25,0x01,0xd8, + 0x1b,0x1a,0x13,0xfe,0x29,0xc8,0x1a,0xfe,0x24,0x28,0x02,0xaf,0xc9,0x13,0x7d,0xd6, + 0x5c,0x20,0x0a,0x2e,0x70,0xdf,0x28,0x03,0xcd,0x14,0x01,0xb4,0xc9,0xfe,0x07,0xd2, + 0x8f,0x07,0x2e,0x80,0xb4,0xc9,0xcd,0xfc,0x05,0x38,0x38,0xd5,0xf5,0xe5,0xed,0x5b, + 0x9d,0x2a,0x2a,0x38,0x2c,0xdf,0x23,0x02,0x18,0x03,0xdf,0x2c,0x0f,0xe1,0xf1,0xcd, + 0xb2,0x05,0xed,0x53,0x9d,0x2a,0xd1,0xdf,0x2c,0x43,0x18,0xda,0x1a,0x13,0xfe,0x0d, + 0x20,0xfa,0x13,0x13,0xd7,0x30,0xde,0xe1,0xf1,0x0e,0xd5,0xcd,0x99,0x07,0x48,0x4f, + 0x57,0x3f,0x0d,0xcf,0xd5,0xcd,0xf2,0x07,0x13,0x13,0x18,0xd6,0xd5,0x3e,0x3f,0xcd, + 0xbd,0x07,0x11,0xb6,0x2b,0xdf,0x0d,0x05,0xd1,0xcd,0xfc,0x05,0xf7,0xd1,0xd5,0xcd, + 0xfc,0x05,0x38,0xd7,0xd5,0x11,0xb6,0x2b,0xcd,0xb2,0x05,0xd1,0xf1,0xf7,0xdf,0x2d, + 0x06,0xef,0xcd,0xbc,0x0a,0x18,0x14,0xdf,0x2b,0x00,0xcd,0xb3,0x06,0xdf,0x2b,0x08, + 0xcd,0xb3,0x06,0xcd,0x32,0x0b,0x18,0xf5,0xdf,0x2d,0xdf,0xcd,0xb3,0x06,0xcd,0x1e, + 0x0b,0x18,0xea,0xcd,0x93,0x03,0xdf,0x2a,0x08,0xcd,0x93,0x03,0xcd,0xe6,0x0a,0x18, + 0xf5,0xdf,0x2f,0xc6,0xcd,0x93,0x03,0xcd,0xf7,0x0a,0x18,0xea,0x3e,0x01,0x01,0x3e, + 0x80,0xf5,0xdf,0x2a,0x05,0xf1,0x32,0xaf,0x2b,0xf7,0xf1,0x06,0xaf,0xa7,0xf5,0xcf, + 0xe5,0xcd,0x05,0x00,0xd5,0xeb,0x01,0x20,0x00,0x1c,0x21,0x00,0x28,0x16,0x03,0x3e, + 0x01,0x1d,0x28,0x0a,0x07,0x07,0x15,0x20,0xf8,0x09,0xcb,0x8c,0x18,0xef,0x47,0xd1, + 0xe3,0xcb,0xbd,0xcb,0xb5,0xcb,0x3d,0x30,0x01,0x07,0x26,0x00,0xc1,0x09,0x47,0xf1, + 0x78,0x20,0x0c,0xcb,0x7e,0x28,0x01,0xa6,0xef,0x28,0x01,0x23,0xc3,0xbc,0x0a,0xf5, + 0xcb,0x7e,0x20,0x02,0x36,0x80,0xf1,0xfa,0x2d,0x07,0x2f,0xa6,0x06,0xb6,0x77,0xf7, + 0xcd,0x8b,0x07,0xdf,0x3d,0x59,0xe5,0xcd,0xb2,0x0a,0xe1,0xcd,0x0e,0x09,0x01,0x04, + 0x00,0xd5,0xe5,0xeb,0xdd,0xe5,0xe1,0xed,0xb0,0xeb,0x2b,0x2b,0xcb,0x16,0x23,0xdd, + 0x7e,0x04,0x17,0xcb,0x1e,0x2b,0xcb,0x1e,0xe1,0xd1,0xc9,0xcd,0xfc,0x05,0x38,0x08, + 0xf5,0xdf,0x3d,0x2b,0xf1,0xcd,0xb2,0x05,0xf7,0x62,0x6b,0xcd,0xfc,0x05,0x18,0xac, + 0xd5,0xeb,0xcd,0xb2,0x0a,0xd1,0xc9,0xcd,0x25,0x01,0xd2,0x45,0x0a,0xcd,0xa2,0x01, + 0xc0,0xdf,0x28,0x0b,0xcd,0xb2,0x0a,0xdf,0x29,0x01,0xc9,0xcd,0x25,0x01,0xd0,0xd5, + 0xcd,0x99,0x07,0x57,0x48,0x41,0x54,0x3f,0x0d,0xd1,0xcd,0x37,0x09,0xed,0x5b,0x9f, + 0x2a,0x7b,0xb2,0x21,0x17,0x03,0xe3,0xc8,0xd7,0xd8,0x4e,0xc5,0x36,0x00,0xe5,0xcd, + 0x31,0x09,0xe1,0xc1,0x3e,0x3f,0x1b,0x71,0xc3,0x36,0x09,0x3e,0x3e,0x11,0xb6,0x2b, + 0xe7,0xd9,0x36,0x5f,0xd9,0xcd,0xf5,0x0c,0xe7,0xd9,0x36,0x5f,0xd9,0xfe,0x0d,0x28, + 0x0c,0xfe,0x1d,0x28,0x15,0xfe,0x0c,0x28,0xe2,0xfe,0x20,0x38,0xe8,0x12,0x13,0xfe, + 0x0d,0xc8,0x7b,0xfe,0x34,0x20,0xde,0x3e,0x1d,0xe7,0x7b,0xfe,0xb6,0x28,0xcc,0x1b, + 0x18,0xcf,0xed,0x5b,0x36,0x2c,0xe5,0x2a,0x36,0x2c,0x2b,0xd7,0xd2,0x17,0x03,0x2a, + 0x38,0x2c,0x2b,0xd7,0xe1,0xd8,0x1a,0x95,0x47,0x13,0x1a,0x9c,0x38,0x04,0x1b,0xb0, + 0xc9,0x13,0x13,0x1a,0xfe,0x0d,0x20,0xfa,0x13,0x18,0xdb,0x13,0x1a,0xef,0xfe,0x0d, + 0x28,0xf6,0xfe,0x21,0x28,0xec,0xfe,0x22,0x20,0x0a,0x13,0x1a,0xfe,0x0d,0x28,0xe8, + 0xfe,0x22,0x20,0xf6,0xfe,0x45,0x20,0xe3,0x2e,0xf6,0xc3,0x98,0x03,0xdd,0x7e,0xff, + 0xa7,0x3e,0x20,0x28,0x02,0x3e,0x2d,0xe7,0xaf,0xdd,0x77,0xff,0x3d,0xf5,0x21,0x2c, + 0x00,0xcd,0x05,0x0b,0x30,0x0d,0xcd,0xe3,0x0a,0xf1,0x3d,0x18,0xf0,0xcd,0xf4,0x0a, + 0xf1,0x3c,0xf5,0x21,0xa0,0x00,0xcd,0x05,0x0b,0x30,0xf2,0xdd,0x7e,0xfe,0xed,0x44, + 0x28,0x0b,0xd9,0xcb,0x39,0xcb,0x1c,0xcb,0x1d,0xd9,0x3d,0x18,0xf3,0x06,0x07,0xdd, + 0xe5,0xe1,0x36,0x00,0x23,0xaf,0xcd,0x4f,0x02,0xd9,0x78,0xd9,0x77,0x23,0x10,0xf5, + 0x01,0x00,0x06,0x2b,0x7e,0xfe,0x05,0x3f,0x3e,0x00,0x2b,0x8e,0xcb,0x21,0xfe,0x0a, + 0x38,0x02,0x3e,0x00,0x77,0xf5,0xa7,0x28,0x02,0xcb,0xc1,0xf1,0x10,0xe9,0x79,0xc1, + 0x38,0x06,0x04,0xc5,0x06,0x01,0x18,0xdf,0x4f,0x78,0x3c,0xfa,0xc8,0x08,0xfe,0x07, + 0x30,0x06,0x47,0xcd,0x1c,0x09,0x18,0x43,0xc5,0x06,0x01,0xcd,0x1c,0x09,0x3e,0x45, + 0xe7,0xc1,0xcb,0x78,0x3e,0x2b,0x28,0x08,0x3e,0x2d,0xe7,0x78,0xed,0x44,0x18,0x02, + 0xe7,0x78,0x06,0x30,0xfe,0x0a,0x38,0x1c,0xc6,0xf6,0x04,0x18,0xf7,0x1a,0x6f,0x13, + 0x1a,0x67,0x13,0xcd,0xbc,0x0a,0xd5,0xc5,0xe5,0xdd,0x7e,0xfe,0xfe,0x80,0xc2,0x3d, + 0x08,0xaf,0x06,0x20,0xf6,0x30,0x4f,0x78,0xe7,0x79,0xe7,0xe1,0xc1,0xd1,0x01,0xfb, + 0xff,0xdd,0x09,0xc9,0xcd,0x4c,0x0c,0x01,0x0a,0x00,0x18,0xf5,0x04,0x10,0x03,0x3e, + 0x2e,0xe7,0x7e,0xf6,0x30,0xe7,0x23,0xcb,0x39,0x20,0xf2,0x05,0x05,0xf8,0x04,0x18, + 0xeb,0xcd,0xed,0x08,0x3e,0x20,0xe7,0xaf,0x47,0x1a,0x13,0xb8,0xc8,0xe7,0xfe,0x0d, + 0x20,0xf7,0x3c,0xc9,0xd7,0xc8,0x1a,0x02,0x13,0x03,0x18,0xf8,0x78,0x92,0x20,0x03, + 0x79,0x93,0xc8,0x1b,0x2b,0x1a,0x77,0x18,0xf3,0xc1,0xe1,0x22,0xa1,0x2a,0x7c,0xb5, + 0x28,0x10,0xe1,0x22,0x91,0x2a,0xe1,0x22,0x6e,0x2a,0xe1,0x22,0x93,0x2a,0xe1,0x22, + 0x95,0x2a,0xc5,0xc9,0x21,0xc8,0xd4,0xc1,0x39,0xd2,0x53,0x01,0x2a,0xa1,0x2a,0x7c, + 0xb5,0x28,0x13,0x2a,0x95,0x2a,0xe5,0x2a,0x93,0x2a,0xe5,0x2a,0x6e,0x2a,0xe5,0x2a, + 0x91,0x2a,0xe5,0x2a,0xa1,0x2a,0xe5,0xc5,0xc9,0xdf,0x3e,0x07,0xcd,0x39,0x04,0xc8, + 0xd8,0x23,0xc9,0xdf,0x3d,0x06,0xcd,0x39,0x04,0xc0,0x23,0xc9,0xdf,0x3c,0x53,0xcd, + 0x39,0x04,0xd0,0x23,0xc9,0xf5,0xcd,0xac,0x2b,0x2a,0x68,0x2a,0x38,0x46,0x77,0x23, + 0x3e,0x2a,0xbc,0x20,0x3a,0x21,0xb0,0x2b,0xcd,0x3d,0x0a,0xe5,0x23,0x34,0xcd,0x3d, + 0x0a,0xb7,0xed,0x5b,0x6c,0x2a,0xcb,0x8a,0x21,0xe0,0x01,0xed,0x52,0x28,0x0e,0x38, + 0x0c,0x44,0x4d,0xcb,0xda,0xcb,0xea,0x21,0x20,0x00,0x19,0xed,0xb0,0x2a,0x6c,0x2a, + 0x7c,0xb5,0xe1,0x20,0x02,0x36,0x03,0x21,0xe0,0x29,0xe5,0xcd,0x34,0x0a,0xe1,0x22, + 0x68,0x2a,0xf1,0xc9,0xfe,0x0d,0x20,0x0e,0x7c,0xfe,0x2b,0x38,0x04,0x36,0x0d,0x18, + 0xee,0xcd,0x34,0x0a,0x18,0xaa,0xfe,0x0c,0x20,0x0d,0x21,0xff,0x29,0x36,0x20,0x2b, + 0xcb,0x4c,0x28,0xf9,0x23,0x18,0xd8,0xfe,0x1d,0x20,0xd4,0x36,0x20,0x2b,0xcb,0x4c, + 0x20,0xf2,0x18,0xcb,0x36,0x20,0x23,0x7d,0xe6,0x1f,0x20,0xf8,0xc9,0xed,0x57,0xe0, + 0x7e,0xb7,0x20,0xfc,0xc9,0xd5,0xe5,0xf5,0x01,0x04,0x00,0xdd,0xe5,0xd1,0xed,0xb0, + 0xdd,0xcb,0x02,0x16,0xdd,0xcb,0x03,0x16,0x78,0x1f,0xdd,0x77,0x04,0x37,0xdd,0xcb, + 0x02,0x1e,0x0e,0x05,0xdd,0x09,0xf1,0xe1,0xd1,0xc9,0xcd,0x81,0x07,0xd9,0xcd,0x0e, + 0x09,0x11,0x00,0x00,0xdd,0x7e,0x03,0xdd,0x4e,0x04,0xfe,0x80,0x28,0x2c,0xfe,0x01, + 0xfa,0xae,0x0a,0xfe,0x10,0xd9,0xf2,0x5a,0x06,0xd9,0x47,0xdd,0x7e,0x00,0xdd,0x6e, + 0x01,0xdd,0x66,0x02,0xcb,0x27,0xed,0x6a,0xcb,0x13,0xcb,0x12,0x10,0xf6,0xcb,0x21, + 0x30,0x08,0xb4,0xb5,0x28,0x01,0x13,0xcd,0xd7,0x0a,0xd5,0xd9,0xe1,0xc9,0x3e,0xff, + 0x18,0xec,0xcd,0x8e,0x06,0xcd,0x99,0x09,0x01,0x21,0x0a,0x00,0xd5,0xeb,0xcd,0x17, + 0x09,0xcd,0xd4,0x0a,0xd5,0x21,0x10,0x00,0xcb,0x1c,0xd9,0xd1,0xef,0x63,0x4a,0xcd, + 0x4c,0x0c,0x18,0x2f,0xaf,0x82,0xf0,0x7b,0xed,0x44,0x5f,0x7a,0x2f,0x3f,0xce,0x00, + 0x57,0x37,0xc9,0xcd,0xb9,0x0a,0xcd,0x68,0x0c,0x28,0x3e,0xbb,0xca,0x6b,0x0b,0xcd, + 0x81,0x0b,0x18,0x0f,0xcd,0xb9,0x0a,0xcd,0x68,0x0c,0x28,0x2d,0xbb,0xca,0x5b,0x06, + 0xcd,0xae,0x0b,0x18,0x68,0xcd,0x45,0x0a,0xcd,0x68,0x0c,0x01,0xfb,0xff,0x18,0x06, + 0xcd,0x68,0x0c,0x01,0xf6,0xff,0xdd,0x09,0xbd,0xcd,0xe6,0x0b,0xd1,0xc9,0xcd,0x68, + 0x0c,0x20,0x05,0xcd,0x62,0x0b,0x18,0x30,0xbb,0x28,0x53,0xaa,0x57,0x18,0x0b,0xcd, + 0x45,0x0a,0xcd,0x68,0x0c,0x28,0x2c,0xbb,0x28,0x44,0xcd,0x04,0x0c,0x28,0x0e,0x30, + 0x07,0xeb,0xd9,0xeb,0x79,0x48,0x47,0xd9,0xcd,0x17,0x0c,0x18,0x20,0x7c,0xaa,0x20, + 0x1a,0x1e,0x01,0xcd,0x3f,0x0c,0x18,0x15,0xdd,0x7e,0xff,0xee,0x80,0xdd,0x77,0xff, + 0xd1,0xc9,0xd5,0x62,0x6b,0xd9,0x6b,0x62,0x48,0xd9,0x01,0x2e,0x80,0xdd,0x74,0xfa, + 0xdd,0x75,0xf9,0xd9,0xdd,0x75,0xf6,0xdd,0x74,0xf7,0xdd,0x71,0xf8,0xd9,0xc3,0x0d, + 0x09,0x7c,0xaa,0x67,0x1d,0xe5,0xc5,0x06,0x18,0xcd,0x81,0x0c,0xaf,0xef,0x4f,0xd9, + 0xcb,0x39,0xcb,0x1c,0xcb,0x1d,0xd9,0x30,0x04,0x19,0x79,0x88,0x4f,0xd9,0x10,0x05, + 0xc1,0xe1,0xd9,0x18,0x30,0xd9,0xcb,0x19,0xcb,0x1c,0xcb,0x1d,0x18,0xe1,0x7b,0xed, + 0x44,0x5f,0x7c,0xaa,0x67,0xe5,0xc5,0x06,0x19,0xd9,0xed,0x52,0x79,0x98,0x4f,0x30, + 0x03,0x19,0x88,0x4f,0xd9,0x3f,0xed,0x6a,0xcb,0x11,0x10,0x0b,0xe5,0xc5,0xd9,0xc1, + 0xe1,0xd9,0xc1,0xe1,0xd9,0x18,0x5e,0xd9,0x29,0xcb,0x11,0x30,0xdd,0x3f,0xed,0x52, + 0x79,0x98,0x4f,0xb7,0x18,0xde,0x28,0x0a,0xbb,0x28,0x0f,0x7c,0xaa,0xcc,0x04,0x0c, + 0x18,0x07,0xbb,0xc8,0x37,0xcb,0x7a,0x18,0x03,0xc8,0xcb,0x7c,0x3f,0xc0,0x3f,0x1f, + 0x37,0xcb,0x17,0xc9,0x7d,0x93,0x28,0x07,0xe2,0x0d,0x0c,0xed,0x44,0x07,0xc9,0xd9, + 0x79,0xb8,0x20,0x01,0xd7,0xd9,0xc9,0x7d,0x93,0x28,0x0e,0xfe,0x18,0xd0,0xd9,0xcb, + 0x38,0xcb,0x1a,0xcb,0x1b,0x3d,0x20,0xf7,0xd9,0x1e,0x00,0x7c,0xaa,0xfa,0x46,0x0c, + 0xd9,0x19,0x79,0x88,0x4f,0x30,0x07,0xcb,0x19,0xcb,0x1c,0xcb,0x1d,0x37,0xd9,0x7d, + 0x8b,0xea,0x61,0x0c,0x6f,0xc9,0xd9,0xed,0x52,0x79,0x98,0x4f,0x06,0x18,0xaf,0x0c, + 0x0d,0xfa,0x5d,0x0c,0x3d,0x29,0xcb,0x11,0x10,0xf7,0x2e,0x80,0xc9,0xd9,0x85,0x18, + 0xe0,0x7c,0xb7,0xf2,0x58,0x06,0x18,0xf2,0xe1,0xd5,0xe5,0xdd,0x56,0xff,0xdd,0x5e, + 0xfe,0xdd,0x66,0xfa,0xdd,0x6e,0xf9,0xd9,0xdd,0x5e,0xfb,0xdd,0x56,0xfc,0xdd,0x46, + 0xfd,0xdd,0x6e,0xf6,0xdd,0x66,0xf7,0xdd,0x4e,0xf8,0xd9,0x3e,0x80,0xbd,0xc9,0xd5, + 0xd9,0x21,0xa7,0x2a,0xe5,0x5e,0x23,0x56,0x23,0x46,0xd9,0xcd,0x48,0x02,0xef,0x0e, + 0x03,0x06,0x08,0x56,0xd9,0x29,0xcb,0x11,0xd9,0xcb,0x12,0x30,0x06,0xd9,0x19,0x79, + 0x88,0x4f,0xd9,0x10,0xef,0x23,0x0d,0x20,0xe8,0xef,0xd9,0xd1,0x7d,0xc6,0x65,0x12, + 0x13,0x6f,0x7c,0xce,0xb0,0x12,0x13,0x67,0x79,0xce,0x05,0x12,0x4f,0xcd,0x14,0x09, + 0xc3,0x6d,0x0b,0xef,0xcd,0x05,0x01,0xcd,0x72,0x01,0x38,0x07,0x1b,0xcd,0xa2,0x01, + 0xcd,0x6d,0x0a,0x7c,0xb5,0xc9,0xbc,0x20,0x02,0x26,0x00,0xbd,0x20,0x02,0x2e,0x00, + 0x1d,0x20,0x0b,0x18,0x06,0xd9,0x2a,0xa5,0x2a,0x0e,0x0e,0x11,0x34,0x20,0x1a,0x0f, + 0x7b,0x38,0xe3,0xfe,0x32,0x20,0x08,0x0d,0x20,0xdc,0x3a,0xb4,0x2b,0x18,0x45,0xbc, + 0x28,0xde,0xbd,0x28,0xdb,0x06,0x00,0xd7,0x1a,0x0f,0x38,0xca,0x10,0xf9,0x7c,0xb7, + 0x20,0x03,0x63,0x18,0x05,0x7d,0xb7,0x20,0xd5,0x6b,0x22,0xa5,0x2a,0xef,0x7b,0xfe, + 0x34,0xca,0x61,0x04,0xfe,0x31,0xca,0x05,0x03,0xfe,0x1b,0x21,0x35,0x20,0x38,0x19, + 0xfe,0x1f,0x38,0x10,0xd6,0x1f,0xcb,0x1e,0x17,0x4f,0x21,0x70,0x0d,0x09,0xed,0x5f, + 0x32,0xa8,0x2a,0x7e,0x32,0xb4,0x2b,0xd9,0xc9,0xc6,0x40,0xcb,0x1e,0x38,0xf5,0x21, + 0x94,0x0d,0x01,0x5b,0x04,0xbe,0x28,0x05,0x23,0x0c,0x10,0xf9,0x0e,0x79,0x18,0xe4, + 0x20,0x20,0x5f,0x30,0x21,0x31,0x22,0x32,0x23,0x33,0x24,0x34,0x25,0x35,0x26,0x36, + 0xbf,0x37,0x28,0x38,0x29,0x39,0x2b,0x3b,0x2a,0x3a,0x3c,0x2c,0x2d,0x3d,0x3e,0x2e, + 0x3f,0x2f,0x0d,0x0d,0x58,0x43,0x5a,0x53,0x0c,0x00,0xcd,0x83,0x01,0xed,0x4b,0x99, + 0x2a,0xed,0x42,0x18,0x1a,0x4e,0x23,0x66,0x69,0x18,0x14,0x7c,0xb5,0x20,0x05,0xcd, + 0xf5,0x0c,0x18,0x06,0xcb,0xec,0x7e,0x2f,0xe6,0x01,0x6f,0x3e,0x6e,0x26,0x00,0xc3, + 0xbc,0x0a,0xcd,0xfc,0x05,0xe5,0xdf,0x2c,0x00,0xcd,0xfc,0x05,0xc1,0x0a,0xbe,0x20, + 0x0b,0xb7,0x28,0x07,0x23,0x03,0x7d,0xe6,0x0f,0x20,0xf2,0x3e,0xaf,0x18,0xd9,0xcd, + 0x65,0x01,0x38,0x14,0x1b,0xef,0xcd,0x65,0x01,0x38,0xd4,0x07,0x07,0x07,0x07,0x01, + 0xe6,0x0d,0xc5,0x06,0x04,0x07,0xed,0x6a,0xda,0x5a,0x06,0x10,0xf8,0xc9,0xf6,0xaf, + 0xf5,0xcf,0xe5,0xcd,0x05,0x00,0xe3,0xc1,0x71,0xf1,0x28,0x02,0x23,0x70,0xf7,0xd5, + 0x11,0xbd,0x0a,0xd5,0xe9,0xb2,0x7d,0xc9,0xcd,0x74,0x09,0xcd,0x30,0x07,0x22,0xa1, + 0x2a,0xdf,0x54,0xb2,0xdf,0x4f,0xaf,0xcf,0x22,0x6e,0x2a,0x2e,0xd8,0xc3,0x98,0x03, + 0x21,0x36,0x2c,0xe5,0x2a,0x38,0x2c,0xdf,0x0d,0x02,0x18,0x06,0xcf,0xe3,0xcd,0x05, + 0x00,0x23,0xd1,0x06,0x60,0xf3,0xaf,0xcd,0x68,0x0e,0x10,0xfa,0x3e,0xa5,0xcd,0x68, + 0x0e,0xcd,0x62,0x0e,0xcd,0x62,0x0e,0x2b,0x1a,0x13,0xcd,0x68,0x0e,0x30,0xf9,0x78, + 0x2f,0x5f,0xeb,0x7d,0xcd,0x68,0x0e,0x7c,0xd9,0x0e,0x10,0x21,0x38,0x20,0xcb,0x41, + 0x28,0x05,0x0f,0x06,0x64,0x30,0x0f,0x36,0xfc,0x06,0x32,0x10,0xfe,0x36,0xb8,0x06, + 0x32,0x10,0xfe,0x36,0xbc,0x04,0x10,0xfe,0x10,0xfe,0x0d,0x20,0xe1,0x03,0xcb,0x48, + 0x28,0xfb,0xd9,0x80,0x47,0xd7,0xc9,0xdf,0x3f,0x00,0xf5,0xdf,0x0d,0x02,0xef,0x3e, + 0xcf,0xe5,0xf3,0xcd,0xdd,0x0e,0x79,0xfe,0xa5,0x20,0xf8,0x47,0xcd,0xd9,0x0e,0x61, + 0xd1,0xd5,0x19,0xeb,0xcd,0xd9,0x0e,0x61,0x2b,0x78,0xc1,0x09,0x47,0xeb,0xcd,0xdd, + 0x0e,0x08,0x79,0xbe,0x28,0x05,0xf1,0x28,0x0d,0xf5,0x71,0x23,0xeb,0x08,0x38,0xed, + 0xcd,0xdd,0x0e,0xf1,0x04,0xc8,0xc3,0x8f,0x07,0xcd,0xdd,0x0e,0x69,0xd9,0x06,0x01, + 0x3e,0xa7,0x80,0x21,0x00,0x20,0xcb,0x46,0x28,0x07,0x3d,0x20,0xf5,0xd9,0x79,0x18, + 0xa2,0x06,0xda,0x3e,0xa9,0x10,0xfc,0x06,0x5a,0x4e,0xcb,0x19,0xce,0x00,0x10,0xf9, + 0x07,0xd9,0xcb,0x19,0xd9,0x18,0xd9,0x40,0x27,0x52,0x45,0x41,0x44,0x59,0x0d,0x4c, + 0x49,0x53,0x54,0x84,0x5e,0x52,0x55,0x4e,0x84,0x0b,0x4e,0x45,0x57,0x83,0xfc,0x53, + 0x41,0x56,0x45,0x8e,0x30,0x4f,0x4c,0x44,0x8e,0x97,0x45,0x44,0x49,0x54,0x82,0x99, + 0x4e,0x45,0x58,0x54,0x85,0x64,0x49,0x4e,0x50,0x55,0x54,0x86,0x6c,0x49,0x46,0x84, + 0x41,0x47,0x4f,0x54,0x4f,0x84,0x53,0x43,0x41,0x4c,0x4c,0x84,0xf4,0x55,0x4e,0x44, + 0x4f,0x54,0x86,0xcc,0x52,0x45,0x54,0x85,0x12,0x54,0x41,0x4b,0x45,0x86,0x26,0x21, + 0x84,0x4d,0x23,0x84,0x4d,0x46,0x4f,0x52,0x8e,0x18,0x50,0x52,0x49,0x4e,0x54,0x84, + 0x80,0x44,0x4f,0x54,0x86,0xcf,0x45,0x4c,0x53,0x45,0x84,0x4d,0x42,0x59,0x54,0x45, + 0x8d,0xff,0x57,0x4f,0x52,0x44,0x8d,0xfe,0x41,0x52,0x52,0x24,0xc1,0x0b,0x53,0x54, + 0x4f,0x50,0x83,0x17,0x48,0x4f,0x4d,0x45,0x84,0xd6,0x87,0x5b,0x52,0x4e,0x44,0x8c, + 0x8f,0x4d,0x45,0x4d,0x8d,0x9a,0x4b,0x45,0x59,0xcd,0xab,0x42,0x59,0x54,0x45,0xcd, + 0xbc,0x57,0x4f,0x52,0x44,0xcd,0xa5,0x50,0x54,0x52,0x87,0x69,0x56,0x41,0x4c,0xc7, + 0x70,0x45,0x51,0x8d,0xc2,0x49,0x4e,0x54,0xca,0xbc,0x26,0x8d,0xdf,0x55,0x53,0x52, + 0xce,0x0f,0x44,0x4f,0x54,0x86,0xdc,0x87,0x77,0x53,0x54,0x45,0x50,0x85,0x28,0x85, + 0x2a,0x41,0x54,0x84,0xbc,0x58,0x24,0x84,0x98,0x59,0x24,0x84,0x9b,0x84,0x8e,0x43, + 0x48,0x52,0x24,0xce,0x15,0x86,0x0b,0x45,0x4c,0x53,0x45,0x84,0x1a,0x88,0x1b,0x00, + 0x2a,0x6a,0x2a,0x7c,0xb5,0x20,0x04,0x2b,0x22,0x6a,0x2a,0x3e,0x0c,0x18,0x13,0xe3, + 0xd5,0x11,0x5b,0x07,0xd7,0x20,0x1d,0x21,0xf0,0x1d,0xd1,0xf1,0xc3,0x9a,0x03,0xc3, + 0x5b,0x07,0xe7,0x3e,0x0c,0x32,0xa8,0x2b,0x21,0xa1,0x10,0x11,0xa9,0x2b,0x01,0x06, + 0x00,0xed,0xb0,0xc9,0x11,0x8e,0x04,0xd7,0x20,0x13,0xd1,0xe3,0xf1,0xdf,0x25,0x0a, + 0xcf,0x3e,0x20,0xe7,0xcd,0x4c,0x13,0xc3,0xad,0x04,0xc3,0x8e,0x04,0x11,0x77,0x07, + 0xd7,0xd1,0xe3,0xc0,0x21,0x23,0x1e,0x18,0xc2,0xc3,0x77,0x07,0x01,0x80,0x04,0xc5, + 0x3e,0xff,0x32,0xb5,0x2b,0xc9,0xcd,0x60,0x10,0xcd,0xd3,0x0c,0xc3,0x64,0x04,0xf5, + 0x2a,0xb5,0x2b,0x2c,0x20,0x21,0x21,0xab,0x2a,0xcb,0x46,0x20,0x0e,0x21,0x99,0x10, + 0x06,0x04,0xbe,0x23,0x28,0x04,0x23,0x10,0xf9,0x26,0x7e,0xf5,0xcd,0xff,0x02,0xdb, + 0xff,0x17,0x38,0xf8,0xf1,0xd3,0xff,0xf1,0xc9,0x5b,0x43,0x5c,0x43,0x5d,0x5a,0x5e, + 0x53,0xc3,0x0f,0x10,0xc3,0x6f,0x10,0x2a,0x9f,0x2a,0x7c,0xb5,0xca,0x5a,0x06,0xeb, + 0x3e,0x01,0x32,0xb3,0x2b,0xcd,0xbf,0x10,0xdd,0x21,0xac,0x2a,0x2b,0xeb,0xf7,0xaf, + 0x32,0xaa,0x2a,0x32,0xdd,0x2b,0xeb,0xef,0x22,0xf6,0x2b,0x22,0x97,0x2a,0x2a,0x6a, + 0x2a,0x2b,0x77,0x2b,0x77,0xeb,0xcd,0x52,0x17,0xe5,0xcd,0xe6,0x10,0x21,0xaa,0x2a, + 0x34,0xaf,0x32,0xdd,0x2b,0xe1,0xaf,0x32,0xec,0x2b,0x32,0xea,0x2b,0x32,0xeb,0x2b, + 0x22,0x9f,0x2a,0xed,0x5b,0x38,0x2c,0xd7,0xd0,0x3a,0xdd,0x2b,0xfe,0x08,0xc8,0xcd, + 0xff,0x02,0xcd,0x33,0x17,0xe5,0xcd,0x0c,0x11,0xe1,0x18,0xe4,0x21,0x4d,0x12,0xe5, + 0x21,0xde,0x2b,0xdd,0x21,0xdb,0x2b,0x3a,0xdd,0x2b,0xb7,0xc8,0xfe,0x09,0xd2,0x24, + 0x13,0x3d,0x20,0x27,0x21,0x78,0x19,0x22,0xe6,0x2b,0x3e,0xcd,0x32,0xe5,0x2b,0x3e, + 0x03,0x32,0xe9,0x2b,0x2a,0xdf,0x2b,0x7c,0xb5,0xc8,0xcd,0x1b,0x13,0x22,0x97,0x2a, + 0x3a,0xe2,0x2b,0xb7,0x20,0x01,0x3c,0x32,0xb2,0x2b,0xc9,0x3d,0x20,0x21,0x7e,0x32, + 0xec,0x2b,0x11,0xe5,0x2b,0x06,0x03,0x3a,0xec,0x2b,0xb7,0xc8,0xdd,0x35,0x11,0x2a, + 0xdf,0x2b,0x7e,0x23,0x22,0xdf,0x2b,0x12,0x13,0xdd,0x34,0x0e,0x10,0xe9,0xc9,0x3d, + 0x20,0x04,0x3c,0xdd,0x77,0x0e,0x3d,0x20,0x0c,0xcd,0x18,0x13,0x2a,0xdf,0x2b,0x22, + 0xe5,0x2b,0xc3,0x48,0x13,0x3d,0x20,0x23,0xcd,0x1b,0x13,0x2a,0xdf,0x2b,0x7d,0xe6, + 0x04,0xc4,0x60,0x10,0x7d,0xe6,0x03,0x32,0xb3,0x2b,0x3a,0xe1,0x2b,0xb7,0xc8,0xfe, + 0x40,0xc2,0x2d,0x19,0x2a,0xe2,0x2b,0x22,0xf6,0x2b,0xc9,0x3d,0x20,0x0d,0xcd,0x18, + 0x13,0x2a,0xdf,0x2b,0x22,0xed,0x2b,0x22,0xea,0x2b,0xc9,0x3d,0xc0,0xcd,0x18,0x13, + 0xed,0x4b,0xdf,0x2b,0xed,0x43,0xed,0x2b,0xcd,0xd2,0x11,0xca,0x2d,0x19,0xf1,0xc3, + 0x54,0x12,0x3a,0xaa,0x2a,0xb7,0xc0,0x2a,0xda,0x2b,0x7c,0xb5,0xc8,0xcd,0x15,0x12, + 0xca,0x4f,0x16,0xe5,0x2a,0x38,0x2c,0xd7,0xe1,0xd2,0x53,0x01,0x7e,0x12,0x23,0x1b, + 0xcd,0x50,0x18,0x30,0xee,0xeb,0x23,0xcb,0xfe,0x2b,0x70,0x2b,0x71,0x2b,0x36,0x00, + 0xeb,0xaf,0x3c,0xc9,0x3a,0xaa,0x2a,0xb7,0x20,0x0b,0x2b,0x23,0xcd,0x50,0x18,0x30, + 0xfa,0xaf,0x47,0x4f,0xc9,0xe5,0xd9,0x2a,0x6a,0x2a,0x2b,0x18,0x12,0xd1,0xd5,0x1a, + 0xbe,0x28,0x16,0xf6,0x80,0xbe,0x28,0x15,0xcb,0x7e,0x2b,0x28,0xfb,0x2b,0x2b,0x7e, + 0xb7,0x20,0xea,0xe5,0xd9,0xd1,0xe1,0x3c,0xc9,0x2b,0x13,0x18,0xe2,0x13,0xeb,0xcd, + 0x50,0x18,0xeb,0x30,0xe3,0x2b,0x46,0x2b,0x4e,0xeb,0xd1,0xaf,0xc9,0xed,0x4b,0xea, + 0x2b,0xcd,0xd2,0x11,0x11,0xe4,0x2b,0x1a,0xb7,0x20,0x0b,0x21,0xe5,0x2b,0x01,0x04, + 0x00,0xed,0xb0,0x12,0x18,0x17,0xfe,0xed,0x28,0x13,0x21,0xe9,0x2b,0x34,0xdd,0x7e, + 0x03,0xfe,0x86,0x28,0x05,0xdd,0x7e,0x06,0xfe,0x86,0xcc,0xf7,0x1f,0xdd,0x46,0x0e, + 0x04,0x05,0xca,0x10,0x13,0x2a,0xea,0x2b,0xcd,0x57,0x13,0x3e,0x20,0xcd,0x70,0x13, + 0x11,0xe4,0x2b,0x3a,0xaa,0x2a,0xb7,0x28,0x20,0xc5,0x45,0x0e,0xfd,0xed,0x61,0x0c, + 0x3a,0xb3,0x2b,0xe6,0x02,0x1a,0xed,0x79,0xc1,0x28,0x0a,0xe5,0xd5,0xed,0x5b,0xf6, + 0x2b,0x19,0x77,0xd1,0xe1,0xcd,0x5c,0x13,0x13,0x23,0x10,0xd7,0x22,0xea,0x2b,0x3a, + 0xec,0x2b,0xb7,0x28,0x11,0x3e,0x0d,0xcd,0x70,0x13,0xdd,0x36,0x0e,0x00,0x11,0xe4, + 0x2b,0xcd,0x55,0x11,0x18,0xa7,0x3a,0xaa,0x2a,0xb7,0xc8,0x3a,0xb3,0x2b,0x1f,0xd0, + 0x3a,0x68,0x2a,0xe6,0x1f,0xfe,0x0b,0x30,0x05,0x3e,0x20,0xe7,0x18,0xf2,0xed,0x5b, + 0x9f,0x2a,0xcd,0x6f,0x19,0x3a,0xb3,0x2b,0x1f,0x30,0x10,0xcd,0xed,0x08,0x3a,0xdb, + 0x2b,0xb7,0x20,0x04,0x3e,0x20,0xe7,0xe7,0xcd,0x34,0x09,0xdd,0x2a,0xf4,0x2b,0xc9, + 0x2a,0xed,0x2b,0xcd,0x57,0x13,0x18,0xbe,0xcd,0x93,0x14,0x3a,0xde,0x2b,0xfe,0x40, + 0xc8,0xc3,0x2d,0x19,0x3d,0x4f,0xfe,0x2a,0xd2,0x82,0x13,0x06,0x06,0xaf,0xb6,0x23, + 0x10,0xfc,0x20,0xed,0x79,0xfe,0x15,0x38,0x07,0xdd,0x36,0x09,0xed,0xdd,0x34,0x0e, + 0x21,0x76,0x1e,0x09,0x7e,0xdd,0x77,0x0a,0xdd,0x34,0x0e,0xc9,0x3e,0x26,0xe7,0x3e, + 0x01,0x32,0xb3,0x2b,0x32,0xaa,0x2a,0x7c,0xcd,0x5c,0x13,0x7d,0x4f,0xe6,0xf0,0xcd, + 0x37,0x14,0xcd,0x68,0x13,0x79,0xe6,0x0f,0xc6,0x30,0xfe,0x3a,0x38,0x02,0xc6,0x07, + 0xf5,0x3a,0xaa,0x2a,0xb7,0x28,0x06,0x3a,0xb3,0x2b,0x1f,0x38,0x02,0xf1,0xc9,0xf1, + 0xe7,0xc9,0xcd,0x05,0x17,0x79,0x06,0x00,0xfe,0x34,0xd2,0xd6,0x13,0x21,0x35,0x1e, + 0x09,0x46,0xdd,0x36,0x0a,0xcb,0xdd,0x70,0x0b,0xdd,0x36,0x0e,0x02,0x21,0xe1,0x2b, + 0xfe,0x31,0x38,0x13,0xcd,0xd6,0x16,0xfe,0x08,0xd2,0x4f,0x16,0x07,0x07,0x07,0xdd, + 0xb6,0x0b,0xdd,0x77,0x0b,0x18,0x08,0x7e,0xb7,0xc2,0x2d,0x19,0x21,0xde,0x2b,0xcd, + 0xe6,0x16,0xdd,0xb6,0x0b,0xdd,0x77,0x0b,0x23,0x6e,0x3a,0xe4,0x2b,0xb7,0xc8,0xdd, + 0x66,0x0b,0x22,0xe6,0x2b,0xc9,0xfe,0x3c,0xdd,0x36,0x0e,0x01,0xd2,0x63,0x14,0x21, + 0x36,0x1e,0x09,0x5e,0x21,0xde,0x2b,0x7e,0xfe,0x06,0x28,0x50,0x3a,0xe1,0x2b,0xb7, + 0x28,0x08,0x7e,0xfe,0x0e,0x20,0xc2,0x21,0xe1,0x2b,0x7e,0xfe,0x40,0x28,0x1f,0xcd, + 0xe6,0x16,0xb3,0x23,0xdd,0x77,0x0a,0x7e,0xdd,0x77,0x0b,0xc9,0xdd,0x34,0x0e,0x23, + 0x23,0x3a,0xaa,0x2a,0xb7,0x28,0x05,0x7e,0xb7,0xc2,0x4f,0x16,0x2b,0xc9,0xcd,0x0c, + 0x14,0x7b,0xf6,0x46,0x18,0xde,0x1e,0x01,0xcd,0xed,0x16,0x30,0x0b,0x1c,0x7e,0xfe, + 0x08,0x30,0x0c,0xd6,0x04,0x38,0x61,0x07,0x07,0x07,0x07,0xc9,0x79,0xfe,0x37,0x30, + 0x57,0x21,0xe5,0x2b,0xfe,0x34,0x28,0x0c,0x3a,0xe4,0x2b,0xb7,0x20,0x4a,0x36,0xed, + 0x23,0xdd,0x34,0x0e,0xe5,0x21,0xe1,0x2b,0xcd,0x2e,0x14,0x21,0x3f,0x1e,0x09,0xb6, + 0xe1,0x77,0xc9,0xfe,0x3e,0x30,0x34,0xcd,0x90,0x14,0xcd,0x26,0x14,0x57,0x79,0x1d, + 0x28,0x0e,0xfe,0x3c,0x28,0x03,0x3e,0x0b,0x21,0x3e,0x03,0xb2,0x32,0xe5,0x2b,0xc9, + 0xfe,0x3c,0x28,0x03,0x3e,0x05,0x21,0x3e,0x04,0xb2,0x21,0xde,0x2b,0xc3,0x03,0x14, + 0x21,0xde,0x2b,0x3a,0xe1,0x2b,0xb7,0xc8,0xc3,0x2d,0x19,0xfe,0x3f,0xca,0x61,0x15, + 0xd2,0x8b,0x15,0x06,0x0b,0x21,0xa1,0x1e,0xcd,0x75,0x15,0x20,0x2d,0xfe,0x03,0x30, + 0x1a,0x21,0xdf,0x2b,0x3d,0x28,0x03,0x21,0xe2,0x2b,0xdd,0x36,0x0e,0x03,0x7e,0x32, + 0xe6,0x2b,0x23,0x7e,0x32,0xe7,0x2b,0xdd,0x70,0x0a,0xc9,0xfe,0x08,0x21,0xe5,0x2b, + 0x38,0x06,0x36,0xed,0x23,0xdd,0x34,0x0e,0x70,0xc9,0x21,0xde,0x2b,0xcd,0xed,0x16, + 0x38,0x33,0x07,0x07,0x07,0x5f,0x21,0xe1,0x2b,0x7e,0xfe,0x40,0x28,0x17,0xcd,0xe6, + 0x16,0xb3,0xfe,0x36,0x28,0xa2,0xf6,0x40,0x32,0xe5,0x2b,0x3a,0xe2,0x2b,0xdd,0xb6, + 0x04,0x32,0xe6,0x2b,0xc9,0x7b,0xf6,0x06,0x32,0xe5,0x2b,0xcd,0x0c,0x14,0x7e,0x21, + 0xde,0x2b,0xc3,0xc2,0x13,0xdd,0x36,0x0e,0x03,0x11,0xe1,0x2b,0x1a,0xfe,0x40,0x28, + 0x3a,0x06,0x08,0xfe,0xc0,0x28,0x11,0x7e,0xfe,0xc0,0x28,0x09,0xfe,0x07,0x20,0x03, + 0x1a,0xfe,0x06,0x20,0x3a,0xeb,0x06,0x00,0xcd,0x2e,0x14,0xf6,0x02,0xb0,0x47,0xe6, + 0x30,0xfe,0x20,0x78,0x28,0x09,0xdd,0x36,0x09,0xed,0xdd,0x34,0x0e,0xf6,0x41,0x32, + 0xe5,0x2b,0xeb,0x23,0x5e,0x23,0x56,0xeb,0xc3,0xd2,0x13,0xcd,0x2e,0x14,0x3c,0x18, + 0xee,0x3a,0xde,0x2b,0xcd,0xd8,0x15,0x21,0xc2,0x1e,0x06,0x03,0xcd,0x75,0x15,0xc2, + 0x2d,0x19,0xc3,0xc7,0x14,0x3a,0xde,0x2b,0xbe,0x23,0x20,0x06,0x3a,0xe1,0x2b,0xbe, + 0x28,0x05,0x23,0x23,0x10,0xef,0xc9,0x23,0x78,0x46,0xc9,0x21,0xde,0x2b,0x11,0xe1, + 0x2b,0x01,0x2d,0x19,0xc5,0x01,0x01,0x00,0xfe,0x41,0x28,0x06,0x30,0x43,0xeb,0x01, + 0x00,0x08,0xcb,0x7e,0xc8,0xcb,0x76,0x28,0x13,0x23,0x23,0x7e,0xb7,0xc0,0x2b,0x7e, + 0x32,0xe6,0x2b,0x1a,0xfe,0x0e,0xc0,0x3e,0xd3,0xb0,0x18,0x15,0x7e,0xfe,0x89,0xc0, + 0xdd,0x36,0x09,0xed,0xeb,0xcd,0xe6,0x16,0xfe,0x06,0xc8,0x07,0x07,0x07,0xf6,0x40, + 0xb1,0x32,0xe5,0x2b,0xf1,0xc3,0x48,0x13,0xfe,0x05,0xc0,0x3a,0xe4,0x2b,0xb7,0x18, + 0x67,0x4f,0xfe,0x44,0x20,0x0b,0x7e,0xfe,0x86,0x79,0x20,0x05,0x3e,0xe9,0xd1,0x18, + 0x75,0xfe,0x46,0x28,0x63,0x30,0x72,0xd6,0x42,0x07,0x5f,0xcd,0xbc,0x16,0x7b,0x30, + 0x0a,0x3c,0x3d,0xc8,0x3d,0x3d,0x20,0x03,0xcb,0x68,0xc0,0xe5,0x16,0x00,0x21,0x76, + 0x1e,0xed,0x5a,0x7e,0xb0,0x32,0xe5,0x2b,0xe1,0x3e,0x03,0xdd,0x77,0x0e,0x7e,0xfe, + 0x40,0xc0,0xf1,0x23,0x5e,0x23,0x56,0xed,0x53,0xe6,0x2b,0x79,0xfe,0x44,0xd0,0xdd, + 0x35,0x0e,0x2a,0xea,0x2b,0x23,0x23,0xeb,0xb7,0xed,0x52,0xdd,0x75,0x0b,0xdd,0x36, + 0x0c,0x00,0xcb,0x7d,0x20,0x01,0x25,0x24,0xc8,0xed,0x5b,0xaa,0x2a,0x1d,0xc0,0xed, + 0x5b,0x9f,0x2a,0x13,0x13,0xc3,0x5a,0x06,0xcd,0xbc,0x16,0x34,0x35,0xc0,0x3e,0xc9, + 0xd1,0x30,0x03,0x3e,0xc0,0xb0,0xc3,0x7c,0x14,0xd6,0x49,0x30,0x37,0x4f,0xcd,0x18, + 0x13,0x23,0x23,0x7e,0xb7,0xc4,0x49,0x16,0x2b,0x0c,0x20,0x1d,0xdd,0x34,0x0e,0xdd, + 0x36,0x09,0xed,0x7e,0x47,0xfe,0x03,0xd4,0x49,0x16,0x3e,0x56,0x05,0x28,0x07,0x3e, + 0x5e,0x05,0x28,0x02,0x3e,0x46,0xc3,0xee,0x15,0x7e,0xe6,0xc7,0xc4,0x49,0x16,0x7e, + 0xf6,0xc7,0x18,0xf2,0x07,0x07,0x4f,0x1a,0xb7,0xc0,0x7e,0xfe,0x07,0xc8,0xfe,0x03, + 0x20,0x02,0x3e,0x07,0xcd,0x2f,0x14,0xf6,0xc1,0xb1,0x18,0xda,0x06,0x00,0x7e,0xfe, + 0x09,0x20,0x03,0x3e,0x14,0x77,0xd6,0x11,0x3f,0xd0,0xfe,0x08,0xd0,0x07,0x07,0x07, + 0x23,0x23,0x23,0x47,0x37,0xc9,0xdd,0x7e,0x03,0xd6,0x40,0xdd,0xb6,0x05,0x20,0x0a, + 0xdd,0x7e,0x04,0xc9,0x1e,0x01,0xcd,0xed,0x16,0xd0,0xc3,0x2d,0x19,0x7e,0xb7,0x28, + 0xf9,0xfe,0x86,0x3e,0x06,0xc8,0x7e,0xfe,0x0f,0x3f,0xd8,0xd6,0x08,0xd8,0xfe,0x06, + 0x20,0x01,0x3c,0xb7,0xc9,0xcd,0x17,0x17,0x21,0xe1,0x2b,0x20,0x0a,0x50,0xcd,0x17, + 0x17,0xc0,0x78,0xba,0xc8,0x18,0xd3,0x06,0xfe,0x7e,0xe6,0x3f,0xfe,0x06,0xc8,0x05, + 0x3d,0x20,0x03,0x06,0xdd,0x3e,0x3d,0xc0,0xdd,0x70,0x09,0x7e,0xe6,0xc0,0xf6,0x06, + 0x77,0xaf,0xc9,0x11,0xea,0x2b,0x06,0x12,0xaf,0x1b,0x12,0x10,0xfc,0xd5,0xdd,0xe1, + 0x23,0x23,0xe5,0x2a,0xea,0x2b,0x22,0xed,0x2b,0xe1,0xe5,0x7e,0xfe,0x21,0xc4,0x59, + 0x17,0xe1,0x3e,0x0d,0xbe,0x23,0xc8,0x18,0xfb,0xe5,0xcd,0x05,0x18,0x20,0x19,0xe1, + 0x22,0xda,0x2b,0x23,0x7e,0xfe,0x0d,0x28,0x06,0xfe,0x20,0xc2,0x63,0x17,0x23,0xcd, + 0x3c,0x18,0xcd,0x0f,0x18,0x28,0x22,0xf5,0xf1,0x79,0xe6,0x7f,0xdd,0x77,0x05,0xcd, + 0x1a,0x18,0xcd,0x9c,0x17,0xdd,0x21,0xdb,0x2b,0xcd,0x3c,0x18,0xcd,0x69,0x19,0xfe, + 0x2c,0x20,0x06,0xcd,0x9d,0x17,0xcd,0x3c,0x18,0xc3,0xef,0x17,0x2b,0xcd,0x68,0x19, + 0xfe,0x28,0x20,0x05,0x23,0xdd,0xcb,0x06,0xfe,0x11,0xb3,0x1f,0xe5,0xcd,0x36,0x19, + 0x0c,0xcb,0xb9,0xeb,0xb7,0x28,0x3e,0xcd,0x68,0x19,0xf1,0xdd,0x7e,0x06,0xb1,0xdd, + 0x77,0x06,0x79,0xfe,0x03,0x30,0x1b,0xcd,0x69,0x19,0xfe,0x29,0x28,0x1b,0xfe,0x2d, + 0x28,0x04,0xfe,0x2b,0x20,0x1c,0xcd,0x66,0x18,0xe5,0xeb,0xcd,0x42,0x16,0x5d,0xe1, + 0x18,0x1e,0xcd,0x69,0x19,0xfe,0x29,0x20,0x09,0x2f,0x23,0xdd,0xae,0x06,0xf0,0xc3, + 0x2d,0x19,0xaf,0x18,0xf6,0xdd,0xcb,0x06,0xf6,0xe1,0xcd,0x66,0x18,0xdd,0x72,0x08, + 0xdd,0x73,0x07,0x18,0xdd,0xe5,0x11,0xb3,0x1f,0xcd,0x36,0x19,0xe1,0x20,0xe0,0x11, + 0xca,0x1e,0xcd,0x36,0x19,0x0c,0xeb,0x23,0xb7,0xc9,0xd6,0x02,0x20,0x1e,0xcd,0x68, + 0x19,0xfe,0x22,0x20,0xca,0x23,0x22,0xdf,0x2b,0x0e,0x00,0x7e,0xfe,0x22,0x23,0x28, + 0x07,0xfe,0x0d,0x28,0xba,0x0c,0x18,0xf3,0x79,0x32,0xde,0x2b,0xcd,0x69,0x19,0xfe, + 0x21,0x28,0x05,0xfe,0x0d,0xc0,0xf1,0xc9,0x23,0x7e,0xfe,0x0d,0x20,0xfa,0xf1,0xc9, + 0x7e,0xcd,0x73,0x01,0x1b,0xd0,0x13,0xfe,0x41,0xd8,0xfe,0x5f,0x3f,0xc9,0xcd,0xd7, + 0x18,0xed,0x4b,0xef,0x2b,0xc9,0xeb,0xef,0xdf,0x2b,0x00,0xfe,0x2d,0xc4,0xd7,0x18, + 0x22,0xef,0x2b,0xcd,0x7b,0x18,0xda,0x4f,0x16,0x18,0xf5,0xdf,0x2b,0x05,0xcd,0x5e, + 0x18,0x09,0xc9,0xdf,0x2d,0x0d,0xcd,0xd7,0x18,0xb7,0x44,0x4d,0x2a,0xef,0x2b,0xed, + 0x42,0xb7,0xc9,0xdf,0x3c,0x0c,0xcd,0xd7,0x18,0x45,0x2a,0xef,0x2b,0x29,0x10,0xfd, + 0xb7,0xc9,0xdf,0x3e,0x0f,0xcd,0xd7,0x18,0x45,0x2a,0xef,0x2b,0xcb,0x3c,0xcb,0x1d, + 0x10,0xfa,0xb7,0xc9,0xdf,0x23,0x0a,0xcd,0x5e,0x18,0x7c,0xa0,0x67,0x7d,0xa1,0x6f, + 0xc9,0xfe,0x29,0x28,0x0c,0xfe,0x0d,0x28,0x08,0xfe,0x21,0x28,0x04,0xfe,0x2c,0x20, + 0x5c,0xf1,0x2a,0xef,0x2b,0xeb,0xc9,0xcd,0x05,0x01,0xcd,0x73,0x01,0x38,0x0a,0x1b, + 0xcd,0x6f,0x19,0xcd,0xd3,0x0c,0xc3,0x0b,0x13,0xfe,0x26,0x20,0x16,0x13,0xcd,0x65, + 0x01,0xda,0x4f,0x16,0x1b,0xef,0xcd,0x65,0x01,0xd8,0xcd,0x37,0x14,0x01,0xf6,0x18, + 0xc3,0xf2,0x0d,0xeb,0xcd,0x57,0x18,0x38,0x10,0xcd,0x04,0x12,0x20,0x1f,0x3a,0xdd, + 0x2b,0xfe,0x06,0x28,0x18,0x50,0x59,0xeb,0xc9,0xeb,0xdf,0x22,0x09,0x1a,0x13,0x6f, + 0x26,0x00,0xdf,0x22,0x08,0xc9,0xdf,0x24,0x04,0x2a,0xea,0x2b,0xc9,0xed,0x5b,0x9f, + 0x2a,0x13,0x13,0xc3,0x8f,0x07,0x06,0x7f,0x7e,0x4e,0xeb,0x23,0xb6,0xf2,0x3b,0x19, + 0x04,0x7e,0xe6,0x7f,0xc8,0xb9,0x20,0xf3,0xeb,0xe5,0x13,0x1a,0xb7,0xfa,0x59,0x19, + 0x4f,0x23,0x7e,0xb9,0x28,0xf4,0xe1,0x18,0xe0,0x23,0xcd,0x50,0x18,0x2b,0x38,0x03, + 0x1b,0x18,0xf3,0x48,0xf1,0xeb,0xb7,0xc9,0x23,0xeb,0xcd,0x05,0x01,0xeb,0xc9,0xdd, + 0x22,0xf4,0x2b,0xdd,0x21,0xac,0x2a,0xc9,0xed,0x73,0x31,0x2c,0x31,0x31,0x2c,0xf5, + 0xc5,0xd5,0xe5,0xdd,0xe5,0x2a,0x31,0x2c,0x23,0x23,0xe5,0x5e,0x23,0x56,0xd9,0x08, + 0xf5,0xc5,0xd5,0xe5,0xfd,0xe5,0xd9,0xd5,0xcd,0xed,0x02,0x11,0xd8,0x1f,0xcd,0x37, + 0x09,0x11,0x30,0x2c,0x06,0x02,0xc5,0x06,0x06,0x3e,0x20,0xe7,0x1a,0x1b,0x67,0x1a, + 0x1b,0x6f,0xcd,0x57,0x13,0x10,0xf2,0x3e,0x0d,0xe7,0xc1,0x10,0xe9,0x2a,0x97,0x2a, + 0x7c,0xb5,0x3a,0xb2,0x2b,0xc4,0xde,0x19,0xcd,0xf5,0x0c,0xf1,0xf1,0xe1,0xd1,0xc1, + 0xf1,0x08,0xd9,0xf1,0xf1,0xe1,0xd1,0xc1,0xf1,0xed,0x7b,0x31,0x2c,0xc9,0x57,0xcd, + 0x4c,0x13,0x3e,0x3a,0xe7,0x06,0x08,0x3e,0x20,0xe7,0x7e,0xcd,0x5c,0x13,0x23,0x10, + 0xf6,0xcd,0xff,0x02,0x3e,0x0d,0xe7,0x15,0x20,0xe5,0xc9,0x3e,0x03,0xf5,0xcf,0xd5, + 0xcd,0xf2,0x07,0x20,0x12,0xe1,0xd5,0xd5,0xeb,0xcd,0x05,0x00,0xcd,0xf2,0x07,0x20, + 0x06,0xe3,0xd7,0xe3,0xda,0x59,0x03,0xc3,0x5b,0x06,0xcf,0x7c,0xb7,0xd5,0x20,0xf7, + 0xb5,0x28,0xf4,0x44,0x4d,0xef,0xe5,0xed,0x5b,0x36,0x2c,0x2a,0x38,0x2c,0xeb,0xd7, + 0xeb,0xe1,0x30,0x14,0x09,0xcb,0x7c,0x20,0xde,0xe5,0xeb,0x73,0x23,0x72,0xeb,0x13, + 0x1a,0xfe,0x0d,0x20,0xfa,0x13,0x18,0xe3,0xd1,0xf7,0xd5,0x2a,0x36,0x2c,0x2b,0x23, + 0xed,0x5b,0x38,0x2c,0xd7,0x30,0x31,0xcd,0xff,0x02,0x44,0x4d,0x23,0xe5,0xe1,0x23, + 0x7e,0xfe,0x0d,0x28,0xea,0xd1,0xd5,0xe5,0x1a,0xbe,0x20,0xf2,0x13,0x1a,0xfe,0x0d, + 0x28,0x03,0x23,0x18,0xf3,0xf1,0xd5,0xc5,0xc5,0xd1,0xcd,0x31,0x09,0xe1,0xd1,0x23, + 0x23,0x7e,0xfe,0x0d,0x20,0xfa,0x18,0xc7,0xd1,0x13,0x1a,0xfe,0x0d,0x20,0xfa,0xf7, + 0xcd,0x60,0x10,0xcf,0xe5,0xcd,0x05,0x00,0x7d,0xb7,0xe1,0xd5,0xc4,0xde,0x19,0xd1, + 0xf7,0xf5,0x04,0x35,0x00,0xae,0x56,0x19,0x00,0xf3,0x22,0x76,0x00,0x3d,0xaa,0x38, + 0x01,0xd6,0x0f,0x49,0x01,0xd6,0x0f,0xc9,0x00,0xd6,0x0f,0xc9,0x01,0x6d,0x12,0x83, + 0x7b,0x00,0x00,0xc0,0x81,0x00,0x00,0xf0,0x03,0x00,0x80,0x9d,0x86,0x00,0x30,0xb1, + 0x09,0x13,0x72,0x31,0x00,0x4f,0xf8,0x2d,0x01,0x5c,0x0b,0xb6,0x7b,0x85,0x88,0x08, + 0x7d,0xa8,0xaa,0x2a,0x7e,0xa9,0xaa,0x2a,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x80,0x00,0x58,0xd7,0x3b,0x7c,0xec,0x6d,0x84,0xfd,0xf6,0xc1,0x2f, + 0x7e,0x1c,0x31,0x9a,0xfe,0xb1,0x3d,0xda,0x7e,0xc6,0x7f,0x11,0xff,0x03,0xbc,0x4c, + 0x7f,0x7c,0xaa,0xaa,0xff,0xde,0x2e,0x65,0x03,0x21,0xb1,0x1a,0xc3,0x45,0x0a,0xcd, + 0x22,0x1b,0x06,0x05,0xdd,0x7e,0xfb,0xdd,0x77,0x00,0xdd,0x23,0x10,0xf6,0xc9,0xcd, + 0x22,0x1b,0xef,0xcd,0xbc,0x0a,0x18,0x0b,0x21,0xed,0x1a,0xe5,0xcd,0x22,0x1b,0xe1, + 0xcd,0x45,0x0a,0xc3,0x10,0x0b,0x01,0xf6,0xff,0x18,0x03,0x01,0x05,0x00,0xdd,0x09, + 0xc9,0x21,0xf6,0xff,0x18,0x03,0x21,0xf1,0xff,0xd5,0xdd,0xe5,0xd1,0x19,0x01,0x05, + 0x00,0xed,0xb0,0xd5,0xdd,0xe1,0xd1,0xc9,0xcd,0x81,0x07,0xcd,0x2f,0x1b,0xda,0x5a, + 0x06,0xca,0x5a,0x06,0xdd,0x36,0x0f,0x00,0xcd,0x38,0x1b,0x38,0x0b,0x21,0xe9,0x1a, + 0xcd,0xf3,0x1b,0xdd,0x34,0x0f,0x18,0xf0,0x21,0xe9,0x1a,0xcd,0x3b,0x1b,0x30,0x0b, + 0x21,0xe9,0x1a,0xcd,0x1c,0x1c,0xdd,0x35,0x0f,0x18,0xed,0xcd,0x22,0x1b,0x21,0xa1, + 0x1a,0xcd,0x7b,0x1d,0xcd,0x51,0x1b,0x21,0xa1,0x1a,0xcd,0xd4,0x1c,0xcd,0xf7,0x0a, + 0xcd,0xc8,0x1c,0xcd,0x1f,0x1b,0xcd,0xe6,0x0a,0x21,0xa5,0x1a,0xcd,0xf3,0x1b,0x21, + 0xa9,0x1a,0xcd,0xd4,0x1c,0xcd,0x51,0x1b,0xcd,0x22,0x1b,0xcd,0xe6,0x0a,0xcd,0xe6, + 0x0a,0x21,0xad,0x1a,0xcd,0xd4,0x1c,0xcd,0xe6,0x0a,0xdd,0x6e,0x0f,0x26,0x00,0xcb, + 0x7d,0x28,0x01,0x25,0xcd,0xbc,0x0a,0xcd,0x32,0x0b,0x21,0xe9,0x1a,0xcd,0x7b,0x1d, + 0x21,0xd1,0x1a,0xcd,0x45,0x0a,0xc3,0xe6,0x0a,0xcd,0x81,0x07,0xdd,0x7e,0xff,0xdd, + 0xcb,0xff,0xbe,0xc9,0xd5,0xcd,0x30,0x1c,0xd1,0xcd,0x24,0x1c,0xc3,0xf7,0x0a,0x01, + 0xfc,0x1b,0xc5,0xdf,0x44,0x0b,0xcd,0x81,0x07,0x21,0x15,0x1b,0xcd,0x45,0x0a,0x18, + 0xeb,0xc3,0x81,0x07,0xcd,0x0f,0x1c,0x21,0xb5,0x1a,0xcd,0xd4,0x1c,0xaf,0x18,0x04, + 0xcd,0x0f,0x1c,0x07,0xdd,0x77,0x14,0x21,0xb9,0x1a,0xe5,0xcd,0x3b,0x1b,0xe1,0x38, + 0x14,0xe5,0xcd,0x1c,0x1c,0xcd,0x22,0x1b,0xcd,0x6d,0x0a,0xcd,0xbc,0x0a,0xcd,0x1e, + 0x0b,0xe1,0xcd,0xf3,0x1b,0x21,0xb1,0x1a,0xe5,0xcd,0x3b,0x1b,0xe1,0x38,0x06,0xcd, + 0x7b,0x1d,0xdd,0x34,0x14,0x21,0xb5,0x1a,0xcd,0x3b,0x1b,0x38,0x0f,0xcd,0x22,0x1b, + 0xcd,0x46,0x1b,0xcd,0x19,0x1b,0xcd,0x4b,0x1b,0xcd,0x1e,0x0b,0x21,0xbd,0x1a,0xcd, + 0x3b,0x1b,0xd8,0xcd,0x1f,0x1b,0x21,0xbd,0x1a,0x06,0x04,0xc5,0xe5,0xcd,0x56,0x1b, + 0xcd,0x56,0x1b,0xcd,0xe6,0x0a,0xcd,0x56,0x1b,0xcd,0xe6,0x0a,0xdd,0xe5,0x01,0xec, + 0xff,0xdd,0x09,0x21,0x0f,0x00,0xcd,0x59,0x1b,0xdd,0xe1,0xe1,0x23,0x23,0x23,0x23, + 0xe5,0xcd,0x1c,0x1c,0xcd,0x32,0x0b,0xe1,0xc1,0x10,0xd0,0xdd,0xcb,0x0a,0x46,0x28, + 0x04,0xdd,0xcb,0xff,0xfe,0xcd,0xc8,0x1c,0xcd,0x46,0x1b,0xef,0xcd,0xbc,0x0a,0xcd, + 0x4b,0x1b,0x18,0x03,0xcd,0x45,0x0a,0xc3,0x32,0x0b,0xdf,0x28,0x58,0xcd,0xb2,0x0a, + 0xcd,0x6b,0x1b,0xdf,0x2c,0x4f,0xcd,0xb2,0x0a,0xdf,0x29,0x49,0xcd,0xe6,0x0a,0x18, + 0x2a,0xcf,0xe5,0xcd,0x05,0x00,0xc1,0xed,0x69,0xf7,0x4d,0x44,0xed,0x68,0x18,0x03, + 0xcd,0x1d,0x19,0xc3,0xbd,0x0d,0xcd,0x81,0x07,0xcd,0x2f,0x1b,0xc8,0xcd,0x6b,0x1b, + 0x21,0xe9,0x1a,0xcd,0x45,0x0a,0x18,0xd4,0xcd,0x81,0x07,0xcd,0xfc,0x1b,0x17,0xf5, + 0xcd,0x22,0x1b,0xcd,0x6d,0x0a,0xe5,0xcd,0xbc,0x0a,0xcd,0x1e,0x0b,0xef,0x23,0xcd, + 0xbc,0x0a,0xe1,0x7c,0xb7,0xc2,0x5a,0x06,0xb5,0x28,0x0b,0xe5,0x21,0xd5,0x1a,0xcd, + 0xf3,0x1b,0xe1,0x2d,0x20,0xf5,0x21,0xd9,0x1a,0xe5,0xcd,0x45,0x0a,0xe1,0x06,0x06, + 0xc5,0x23,0x23,0x23,0x23,0xe5,0xcd,0x56,0x1b,0xcd,0xe6,0x0a,0xe1,0xe5,0xcd,0xd4, + 0x1c,0xe1,0xc1,0x10,0xeb,0xcd,0xe6,0x0a,0xf1,0xd2,0xc8,0x1c,0xcd,0x46,0x1b,0x21, + 0xed,0x1a,0xcd,0x45,0x0a,0xcd,0x4b,0x1b,0xc3,0xf7,0x0a,0xcd,0x45,0x0a,0xc3,0x1e, + 0x0b,0xcd,0xf9,0x1b,0x17,0xf5,0xcd,0x2f,0x1b,0xca,0x97,0x10,0xcd,0x38,0x1b,0xf5, + 0x38,0x12,0xcd,0x22,0x1b,0xcd,0x46,0x1b,0x21,0xed,0x1a,0xcd,0x45,0x0a,0xcd,0x4b, + 0x1b,0xcd,0xf7,0x0a,0xcd,0x1f,0x1b,0xcd,0xe6,0x0a,0xef,0xcd,0xbc,0x0a,0x21,0xf5, + 0x1a,0x06,0x08,0xc5,0xe5,0xcd,0xd4,0x1c,0xcd,0x51,0x1b,0xcd,0xe6,0x0a,0xe1,0x23, + 0x23,0x23,0x23,0xc1,0x10,0xed,0x21,0xed,0x1a,0xcd,0xd4,0x1c,0xcd,0x56,0x1b,0xcd, + 0xe6,0x0a,0xf1,0x38,0x12,0xcd,0x22,0x1b,0xcd,0x46,0x1b,0x21,0xb5,0x1a,0xcd,0x45, + 0x0a,0xcd,0x4b,0x1b,0xcd,0x1e,0x0b,0xf1,0x30,0x04,0xdd,0xcb,0xff,0xfe,0xc3,0xc5, + 0x1c,0x4c,0x50,0x52,0x49,0x4e,0x54,0x90,0x5c,0x4c,0x4c,0x49,0x53,0x54,0x90,0x66, + 0x4f,0x55,0x54,0x9c,0xf1,0x3c,0x90,0xa7,0x2f,0x9a,0x4a,0x52,0x45,0x4e,0x9a,0x1a, + 0x4c,0x44,0x55,0x4d,0x50,0x9a,0x90,0x44,0x55,0x4d,0x50,0x9a,0x93,0x44,0x45,0x4c, + 0x99,0xfb,0x90,0x1f,0x53,0x51,0x52,0x9d,0x06,0x4c,0x4e,0x9b,0x68,0x41,0x42,0x53, + 0x9b,0xf9,0x53,0x49,0x4e,0x9c,0x30,0x43,0x4f,0x53,0x9c,0x24,0x54,0x47,0x9c,0x04, + 0x41,0x52,0x43,0x54,0x47,0x9d,0x81,0x50,0x49,0x9b,0x19,0x45,0x58,0x50,0x9d,0x18, + 0x50,0x4f,0x57,0x9c,0xda,0x49,0x4e,0x50,0xdc,0xfa,0x22,0x9d,0x00,0x90,0x59,0x00, + 0x10,0x08,0x18,0x20,0x28,0x38,0x40,0xc0,0x80,0x00,0x80,0x88,0x98,0x90,0xa0,0xb0, + 0xa8,0xb8,0x00,0x09,0x4a,0x42,0x10,0x00,0x18,0x20,0xc3,0xc2,0xcd,0xc4,0x00,0x2f, + 0x3f,0x37,0x76,0xf3,0xfb,0xd9,0x07,0x17,0x0f,0x1f,0x27,0xb0,0xa0,0xb8,0xa8,0xb1, + 0xa1,0xb9,0xa9,0xb2,0xa2,0xba,0xaa,0xb3,0xa3,0xbb,0xab,0x44,0x4d,0x45,0x6f,0x67, + 0x00,0x0e,0x0f,0x57,0x0f,0x0e,0x47,0x0e,0x10,0x5f,0x10,0x0e,0x4f,0x0e,0x84,0x0a, + 0x0e,0x85,0x1a,0x84,0x0e,0x02,0x85,0x0e,0x12,0x07,0x06,0xf9,0x0e,0xc0,0x3a,0xc0, + 0x0e,0x32,0x87,0x06,0xe3,0x03,0x03,0x08,0x05,0x06,0xeb,0xd2,0x45,0x47,0xd4,0x45, + 0x58,0x54,0xd7,0x4f,0x52,0x44,0xc2,0x59,0x54,0x45,0xcf,0x50,0x54,0xcf,0x52,0x47, + 0xc5,0x51,0x55,0xbe,0xce,0x4f,0x50,0xc3,0x50,0x4c,0xc3,0x43,0x46,0xd3,0x43,0x46, + 0xc8,0x41,0x4c,0x54,0xc4,0x49,0xc5,0x49,0xc5,0x58,0x58,0xd2,0x4c,0x43,0x41,0xd2, + 0x4c,0x41,0xd2,0x52,0x43,0x41,0xd2,0x52,0x41,0xc4,0x41,0x41,0xcc,0x44,0x49,0x52, + 0xcc,0x44,0x49,0xcc,0x44,0x44,0x52,0xcc,0x44,0x44,0xc3,0x50,0x49,0x52,0xc3,0x50, + 0x49,0xc3,0x50,0x44,0x52,0xc3,0x50,0x44,0xc9,0x4e,0x49,0x52,0xc9,0x4e,0x49,0xc9, + 0x4e,0x44,0x52,0xc9,0x4e,0x44,0xcf,0x54,0x49,0x52,0xcf,0x55,0x54,0x49,0xcf,0x54, + 0x44,0x52,0xcf,0x55,0x54,0x44,0xce,0x45,0x47,0xd2,0x45,0x54,0x49,0xd2,0x45,0x54, + 0x4e,0xd2,0x4c,0x44,0xd2,0x52,0x44,0xd2,0x4c,0x43,0xd2,0x4c,0xd2,0x52,0x43,0xd2, + 0x52,0xd3,0x4c,0x41,0xd3,0x52,0x41,0xd3,0x52,0x4c,0xc2,0x49,0x54,0xd3,0x45,0x54, + 0xd2,0x45,0x53,0xc1,0x44,0x44,0xc1,0x44,0x43,0xd3,0x42,0x43,0xd3,0x55,0x42,0xc1, + 0x4e,0x44,0xcf,0x52,0xd8,0x4f,0x52,0xc3,0x50,0xc9,0x4e,0x43,0xc4,0x45,0x43,0xcc, + 0x44,0xc5,0x58,0xc9,0x4e,0xcf,0x55,0x54,0xc4,0x4a,0x4e,0x5a,0xca,0x52,0xca,0x50, + 0xc3,0x41,0x4c,0x4c,0xd2,0x45,0x54,0xd2,0x53,0x54,0xc9,0x4d,0xd0,0x4f,0x50,0xd0, + 0x55,0x53,0x48,0x80,0xc9,0x58,0xc9,0x59,0xc1,0x46,0xc2,0x43,0xc4,0x45,0xc8,0x4c, + 0xd3,0x50,0xc2,0xc3,0xc4,0xc5,0xc8,0xcc,0xc1,0xc9,0xd2,0xce,0x5a,0xda,0xce,0x43, + 0xc3,0xd0,0x4f,0xd0,0x45,0xd0,0xcd,0x80,0x20,0x20,0x41,0x46,0x20,0x20,0x20,0x42, + 0x43,0x20,0x20,0x20,0x44,0x45,0x20,0x20,0x20,0x48,0x4c,0x20,0x20,0x49,0x58,0x49, + 0x59,0x20,0x53,0x50,0x28,0x29,0x0d,0x3a,0xdd,0x2b,0xfe,0x45,0xc8,0x34,0xc9,0x05, +}; + +typedef struct { vx_pin a[13]; vx_pin d[8]; vx_pin ce; vx_pin oe; bool driving; } chip_t; +static chip_t G; + +static uint16_t read_addr(void){ uint16_t v=0; for(int i=0;i<13;i++) if(vx_pin_read(G.a[i])) v|=(1u<>i)&1);} G.driving=true; } +static void release_data(void){ if(!G.driving) return; for(int i=0;i<8;i++) vx_pin_set_mode(G.d[i],VX_INPUT); G.driving=false; } + +static void update_outputs(void){ + int ce_low=(vx_pin_read(G.ce)==0), oe_low=(vx_pin_read(G.oe)==0); + if(ce_low&&oe_low) drive_data(rom_image[read_addr()]); else release_data(); +} +static void on_pin_change(void* u, vx_pin p, int v){ (void)u;(void)p;(void)v; update_outputs(); } + +void chip_setup(void){ + char name[4]; + for(int i=0;i<13;i++){ name[0]='A'; if(i<10){name[1]='0'+i;name[2]=0;} else {name[1]='1';name[2]='0'+(i-10);name[3]=0;} G.a[i]=vx_pin_register(name,VX_INPUT);} + for(int i=0;i<8;i++){ name[0]='D';name[1]='0'+i;name[2]=0; G.d[i]=vx_pin_register(name,VX_INPUT);} + G.ce=vx_pin_register("CE",VX_INPUT); G.oe=vx_pin_register("OE",VX_INPUT); G.driving=false; + for(int i=0;i<13;i++) vx_pin_watch(G.a[i],VX_EDGE_BOTH,on_pin_change,0); + vx_pin_watch(G.ce,VX_EDGE_BOTH,on_pin_change,0); + vx_pin_watch(G.oe,VX_EDGE_BOTH,on_pin_change,0); + update_outputs(); +} diff --git a/test/test_custom_chips/sdk/examples/galaksija-rom.chip.json b/test/test_custom_chips/sdk/examples/galaksija-rom.chip.json new file mode 100644 index 00000000..1be45d01 --- /dev/null +++ b/test/test_custom_chips/sdk/examples/galaksija-rom.chip.json @@ -0,0 +1,8 @@ +{ + "schema": "velxio-chip/v1", + "name": "Galaksija ROM (8K)", + "author": "Velxio (ROM: Voja Antonic, public domain)", + "license": "MIT (chip) / public-domain (ROM image)", + "description": "8 KB EPROM holding the public-domain Galaksija (1983) home-computer ROM A (monitor + integer BASIC) + ROM B (float BASIC). A0..A12 address, D0..D7 data, CE/OE active-low. Fixture for the Phase 3 chip-to-chip bus proof: a real Z80 boots this over the bus.", + "pins": ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "CE", "OE"] +}