diff --git a/README.md b/README.md index 877b6ba..cc1da6d 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ Line: - F6: Toggle between NTSC color TV and green phosphor monochrome monitor - F7: Save current state to disk - F8: Restore state from disk +- F10: Cycle character generator codepages. Only if the character generator ROM has more than one 2Kb pages. - F12: Save a screen snapshot to a file `snapshot.png` Only valid on SDL mode @@ -91,6 +92,8 @@ Only valid on SDL mode ### Command line options ``` + -base64a + setup a Base64A clone -charRom string rom file for the character generator (default "/Apple2rev7CharGen.rom") -disk string diff --git a/apple2.go b/apple2.go index 54f095f..710e6d0 100644 --- a/apple2.go +++ b/apple2.go @@ -13,6 +13,7 @@ import ( // Apple2 represents all the components and state of the emulated machine type Apple2 struct { + Name string cpu *core6502.State mmu *memoryManager io *ioC0Page @@ -84,6 +85,8 @@ const ( CommandLoadState // CommandDumpDebugInfo dumps usefull info CommandDumpDebugInfo + // CommandNextCharGenPage cycles the CharGen page if several + CommandNextCharGenPage ) // SendCommand enqueues a command to the emulator thread @@ -111,6 +114,9 @@ func (a *Apple2) executeCommand(command int) { a.load("apple2.state") case CommandDumpDebugInfo: a.dumpDebugInfo() + case CommandNextCharGenPage: + a.cg.nextPage() + fmt.Printf("Chargen page %v\n", a.cg.page) } } diff --git a/apple2Setup.go b/apple2Setup.go index d08d9af..c87d192 100644 --- a/apple2Setup.go +++ b/apple2Setup.go @@ -7,6 +7,7 @@ func NewApple2(charRomFile string, clockMhz float64, isColor bool, fastMode bool, panicSS bool) *Apple2 { var a Apple2 + a.Name = "Apple ][+" a.mmu = newMemoryManager(&a) a.cpu = core6502.NewNMOS6502(a.mmu) if charRomFile != "" { diff --git a/apple2main.go b/apple2main.go index 813312d..9a10f1d 100644 --- a/apple2main.go +++ b/apple2main.go @@ -66,13 +66,6 @@ func MainApple() *Apple2 { ) flag.Parse() - if *dumpChars { - cg := NewCharacterGenerator(*charRomFile) - cg.Dump() - os.Exit(0) - return nil - } - a := NewApple2(*charRomFile, *cpuClock, !*mono, *fastDisk, *panicSS) if *base64a { NewBase64a(a) @@ -92,5 +85,11 @@ func MainApple() *Apple2 { //a.AddCardInOut(2) //a.AddCardLogger(4) + if *dumpChars { + a.cg.Dump() + os.Exit(0) + return nil + } + return a } diff --git a/apple2sdl/main.go b/apple2sdl/main.go index 55f931a..5b69091 100644 --- a/apple2sdl/main.go +++ b/apple2sdl/main.go @@ -26,7 +26,7 @@ func SDLRun(a *apple2.Apple2) { defer window.Destroy() defer renderer.Destroy() - window.SetTitle("Apple2") + window.SetTitle(a.Name) kp := newSDLKeyBoard(a) a.SetKeyboardProvider(kp) diff --git a/apple2sdl/sdlKeyboard.go b/apple2sdl/sdlKeyboard.go index 0591e3d..8e4740f 100644 --- a/apple2sdl/sdlKeyboard.go +++ b/apple2sdl/sdlKeyboard.go @@ -101,6 +101,8 @@ func (k *sdlKeyboard) putKey(keyEvent *sdl.KeyboardEvent) { k.a.SendCommand(apple2.CommandLoadState) case sdl.K_F9: k.a.SendCommand(apple2.CommandDumpDebugInfo) + case sdl.K_F10: + k.a.SendCommand(apple2.CommandNextCharGenPage) case sdl.K_F12: apple2.SaveSnapshot(k.a, "snapshot.png") } diff --git a/base64a.go b/base64a.go index 35abb12..eab80eb 100644 --- a/base64a.go +++ b/base64a.go @@ -15,14 +15,32 @@ type Base64a struct { // NewBase64a instantiates an apple2 func NewBase64a(a *Apple2) *Base64a { - var b Base64a b.a = a + a.Name = "Base 64A" b.loadRom() + // Configure the character generator + if !a.cg.customRom { + a.cg.load("/BASE64A_ROM7_CharGen.BIN") + } + a.cg.setColumnMap(base64aCharGenColumnsMap) + a.cg.setPage(1) + return &b } +func base64aCharGenColumnsMap(column int) int { + bit := column + 2 + // Weird positions + if column == 6 { + bit = 2 + } else if column == 0 { + bit = 1 + } + return bit +} + const ( // There are 6 ROM chips. Each can have 4Kb or 8Kb. They can fill // 2 or 4 banks with 2kb windows. @@ -87,7 +105,7 @@ func (b *Base64a) loadRom() { func (b *Base64a) changeRomBank(bank uint8) { b.romBank = bank - fmt.Printf("Change to ROM bank #%v\n", b.romBank) + //fmt.Printf("Change to ROM bank #%v\n", b.romBank) b.a.mmu.physicalROM = b.romBanks[b.romBank] b.a.mmu.resetRomPaging() // If rom was not active. This is going to far? } diff --git a/characterGenerator.go b/characterGenerator.go index e62eefc..2adb3b3 100644 --- a/characterGenerator.go +++ b/characterGenerator.go @@ -11,11 +11,17 @@ import ( // CharacterGenerator represents the ROM wth the characters bitmaps type CharacterGenerator struct { - data []uint8 + data []uint8 + customRom bool + columnMap charColumnMap + page int } +type charColumnMap func(column int) int + const ( - rev7CharGenSize = 2048 + rev7CharGenSize = 2048 + defaultCharGenROM = "/Apple2rev7CharGen.rom" ) // NewCharacterGenerator instantiates a new Character Generator with the rom on the file given @@ -26,27 +32,50 @@ func NewCharacterGenerator(filename string) *CharacterGenerator { } func (cg *CharacterGenerator) load(filename string) { + cg.customRom = !isInternalResource(filename) bytes := loadResource(filename) size := len(bytes) - if size != rev7CharGenSize { + if size < rev7CharGenSize { panic("Character ROM size not supported") } cg.data = bytes } -func (cg *CharacterGenerator) getPixel(char uint8, row int, column int) bool { - bits := cg.data[int(char)*8+row] - bit := bits >> (uint(6 - column)) & 1 - return bit == 1 +func (cg *CharacterGenerator) setColumnMap(columnMap charColumnMap) { + // Regular Apple II uses bits 6 to 0 but some clones have other mappings + cg.columnMap = columnMap } -func (cg *CharacterGenerator) dumpCharFast(char uint8) { +func (cg *CharacterGenerator) setPage(page int) { + // Some clones had a switch to change codepage with extra characters + pages := len(cg.data) / rev7CharGenSize + cg.page = page % pages +} + +func (cg *CharacterGenerator) nextPage() { + cg.setPage(cg.page + 1) +} + +func (cg *CharacterGenerator) getPixel(char uint8, row int, column int) bool { + bits := cg.data[int(char)*8+row+cg.page*rev7CharGenSize] + var bit int + if cg.columnMap != nil { + bit = cg.columnMap(column) + } else { + // Standard Apple 2 mapping + bit = 6 - column + } + value := bits >> uint(bit) & 1 + return value == 1 +} + +func (cg *CharacterGenerator) dumpCharRaw(char int) { base := int(char) * 8 fmt.Printf("Char: %v\n---------\n", char) for i := 0; i < 8; i++ { fmt.Print("|") b := cg.data[base+i] - for j := 6; j >= 0; j-- { + for j := 0; j < 8; j++ { if (b>>uint(j))&1 == 1 { fmt.Print("#") } else { @@ -76,7 +105,12 @@ func (cg *CharacterGenerator) dumpChar(char uint8) { // Dump to sdtout all the character maps func (cg *CharacterGenerator) Dump() { - for i := 0; i < 256; i++ { - cg.dumpChar(uint8(i)) + pages := len(cg.data) / rev7CharGenSize + for p := 0; p < pages; p++ { + cg.setPage(p) + for i := 0; i < 256; i++ { + cg.dumpChar(uint8(i)) + //cg.dumpCharRaw(int(i)) + } } } diff --git a/resources.go b/resources.go index 4b63b9d..93e5afb 100644 --- a/resources.go +++ b/resources.go @@ -13,9 +13,13 @@ const ( internalPrefix = "/" ) +func isInternalResource(filename string) bool { + return strings.HasPrefix(filename, internalPrefix) +} + func loadResource(filename string) []uint8 { var file io.Reader - if strings.HasPrefix(filename, internalPrefix) { + if isInternalResource(filename) { // load from embedded resource resource := strings.TrimPrefix(filename, internalPrefix) resourceFile, err := romdumps.Assets.Open(resource) diff --git a/romdumps/romdumps_vfsdata.go b/romdumps/romdumps_vfsdata.go index 8099011..a606c6e 100644 --- a/romdumps/romdumps_vfsdata.go +++ b/romdumps/romdumps_vfsdata.go @@ -19,7 +19,7 @@ var Assets = func() http.FileSystem { fs := vfsgen۰FS{ "/": &vfsgen۰DirInfo{ name: "/", - modTime: time.Date(2019, 6, 7, 18, 3, 9, 943068405, time.UTC), + modTime: time.Date(2019, 6, 9, 16, 41, 30, 66545749, time.UTC), }, "/Apple2_Plus.rom": &vfsgen۰CompressedFileInfo{ name: "Apple2_Plus.rom", @@ -77,6 +77,13 @@ var Assets = func() http.FileSystem { compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x78\x7b\x74\x53\xc7\xb5\xf7\x48\xc7\xb6\x64\x19\x82\x52\x12\x50\x68\x92\x0e\x60\x3b\x76\x6a\x8c\x09\x26\x9f\x97\x91\x6d\x61\x64\x2c\x9c\xf3\xf1\x58\xd0\x2c\x1e\xe9\xb7\xce\x97\x86\x56\xe2\xd2\x57\x02\xab\xef\x15\x20\x1e\x47\x71\xaa\x5c\x99\xc4\x2d\xb4\x75\x7a\x50\x75\xa8\xc7\x17\x35\x36\x85\xac\x65\xb7\x72\x8f\x89\x65\x74\x04\xd8\x53\xe3\x24\x98\x36\xa9\xdb\x1b\x14\x59\xc5\xe4\x84\xa7\x1e\xe7\x71\xd7\x91\x8c\x89\x6f\xd3\x75\xff\x6c\xef\x5a\x1d\x5b\x33\xfb\x37\x7b\xcf\x73\xef\xd9\xb3\xe7\x34\x19\x61\x63\xa2\x04\xcf\xf3\xea\x5d\x13\xa8\xbc\xa7\xb8\xa1\xa2\xa8\x7c\x73\x71\x5b\x31\x03\x41\x62\xb0\xac\xfb\xde\x30\xbc\x27\xe1\xbd\xe5\xd2\x39\x20\x48\x38\x43\xcb\xbc\x37\x19\x76\x39\xd1\xb3\x8f\x34\x2f\x63\x1f\xc1\x00\x55\xc0\x92\x84\xdb\x7c\x8b\x71\x34\x95\x52\xf9\x39\xe8\x11\x67\xa9\xc5\xab\x77\x3d\x8f\x8a\x4d\xa6\xdc\x62\x54\xcc\x70\x15\x16\x17\xe5\xd9\xce\x7b\xb6\xf3\xb0\x59\xa1\xf7\xa6\x98\xcc\x80\x3d\xc5\x25\xde\x9c\xa6\xa6\xa6\xa6\xd2\x79\xcc\xb1\x6a\xff\x6a\xf8\x23\x19\x3a\x92\x47\xab\x3b\x9b\xbc\xf9\xbb\xbb\xcd\x82\x4f\x9c\x53\xfa\x62\x53\x57\xf0\xe9\x24\xfc\x4e\x82\xe4\xb0\xfb\x31\xe8\x0a\x1e\x4b\xa2\xf2\x52\x0a\x2d\x3f\x5c\xfa\xef\x5d\x87\x59\x6a\xa2\x55\x2c\x68\xf2\x1a\x9b\x9a\xf2\xa1\x9b\xa4\xc2\x6e\x72\x8d\x51\x55\x15\x1e\x4c\x38\x7a\xaa\xe1\x25\xd9\xa7\x83\x4d\xc9\xc1\xe5\x61\xef\xc7\x3e\x8a\xcf\xf1\x5e\x73\x76\xf6\xf2\x49\x54\xd6\x0b\x52\x68\x19\x06\x6c\x6e\xde\xb2\xe2\xb2\x47\xdd\x24\xe1\xfa\x1d\x9c\x92\x23\xe4\x0a\x74\x24\xfd\xcb\x7d\x79\x13\x94\xf8\x60\x5e\xb9\xf7\x9e\xe0\xaf\x93\x70\x4a\x0e\xf6\x26\x45\x2a\xc3\xff\x90\x71\x57\x7c\x08\x2f\xc9\x5c\xb9\x10\xeb\xa9\xf6\x5e\x83\x4f\x26\xbb\x62\x44\x17\x3e\x0c\x2f\xc9\xad\xf4\x25\xd9\x47\x61\x36\x23\x98\x60\xaa\xb8\xe5\xfe\xd5\x5d\x66\x9d\x7b\x57\xb5\x57\x17\x66\x72\xe0\xd6\x8a\xb9\xfb\x73\xbc\xd4\x92\xad\x2b\xb5\x32\x07\xce\x94\xab\xb5\x12\x2c\xb1\xaf\x9c\x1b\xb6\x83\x7b\xb3\x25\xd6\x69\xe5\xfe\x1c\xef\x9d\xb2\x78\xc5\x8b\x3f\x01\x8b\x0f\x1c\x04\x60\xfb\xff\x6d\x3b\xd4\xd2\x84\x3a\x8e\xe3\xe3\xbf\xe8\xf4\x8f\x83\x8b\x7e\x3f\x78\xb0\xf5\xc1\xa5\x5f\x7c\xf9\xb3\x47\x3b\x5a\x1f\x5a\xda\xf1\xf2\x43\x47\x41\xe9\x03\xbf\x72\x75\x3e\xb0\xb4\x70\xcb\x67\x97\x16\x6e\x79\xe0\x28\x58\xb4\x73\x27\xe7\x2a\x2c\xfc\xd5\xaf\x3a\x03\xa5\xe0\xfb\xe0\xfe\x9f\x7d\xf5\x67\x9c\xab\x74\x4b\xf3\xfc\xca\x7b\x39\xd7\x52\xf6\xe2\xd3\x3b\x1c\xc5\x4f\xbf\xe6\xde\x6a\x0f\x6f\x75\xda\x63\xaf\x81\x93\xc6\xe6\xbd\x27\x4b\xbe\xb6\xf7\xc6\xb9\xa6\x67\xaf\xf9\x5b\x41\x97\xcf\xb7\x77\xef\xde\x67\xed\xce\x13\x8f\x9d\x00\x4b\xc0\xa2\x45\xc5\xc5\xcf\x3e\xeb\x0e\x0f\x46\x8a\x1d\x76\xbb\x2f\x8c\x1a\x9c\x0e\x93\xc9\x54\x41\xed\x51\xa8\x12\x48\xab\x4e\x54\xed\x44\xab\xf7\x88\x14\x3c\x98\x80\x97\x52\xf4\x2e\x95\xde\x9d\x80\x24\x01\xb7\x24\x51\x75\xf3\x6a\x67\x15\xfd\x0d\xe5\x22\x5c\x9e\x86\xaf\x2a\xf0\x25\x25\xa0\x8e\x5c\x2c\x33\xf3\x81\xeb\xd4\x7a\xee\xfc\x0d\x8a\x2c\x0c\x5c\xa3\xc8\x3c\x3c\x71\xfe\x3a\x45\x8c\x2c\xf5\xc3\x6b\x14\x0d\x26\xf6\x5c\xa3\x20\x93\xf6\xe5\x06\xa5\x54\xc7\x47\x54\x84\xdc\xc6\xe1\x16\x80\x74\xac\x61\x48\xc7\xe9\x04\x5e\x7c\xd7\x93\x30\xf4\x80\x71\x5d\x9a\x5c\x71\xbb\xcd\x37\xf7\x00\x10\x8f\xc3\x57\x64\xdc\x80\x6c\x18\xa0\x35\xbe\x74\x46\x33\xc1\x87\x53\x70\x4a\xc6\x41\x38\x25\x9f\x6a\x82\x97\xe4\x58\x45\x8c\xd9\x9e\x02\x13\x0d\x50\x05\x2a\xa5\x5a\x4f\x0f\x5c\x08\xb1\x6f\x9e\x1c\x60\x59\x76\xf0\xf4\x80\xfa\xd6\xc0\xc5\x71\x72\x21\xf0\x0d\x9e\x05\xf1\x78\xf0\x19\xde\x9c\x13\x26\x09\x37\x83\x01\x72\x04\x9e\xe4\x03\x5b\xf9\xc0\x66\x1e\x03\xb1\x20\xb0\x89\x0f\x6c\xe1\xe1\xe3\x09\x7c\x1f\x5a\x82\x01\x82\xb8\x04\x2d\xc6\x16\xb4\x14\x2f\x44\x45\xf4\x12\x09\x6e\x93\xd8\x82\x5e\x63\xfa\xc8\x3d\x39\x6e\x72\x9b\xc9\xac\xd4\x73\x83\x62\x04\x0f\xb1\x1c\x07\x3c\xdf\x2e\x56\xf0\xaf\x92\xb9\xe2\xa3\x7c\xbb\x68\xe0\x5f\x10\xa9\x32\x33\x4f\xcb\xe9\x2a\xba\x4c\xea\xec\x7d\x22\x05\x7f\x9c\x86\x73\x64\x61\xb8\xfb\xaa\x20\x78\xe3\xc2\x39\x31\x4a\x62\x65\x66\xfe\x38\xe0\xcd\xe9\x8a\x73\xf1\x78\x3c\x3e\x7d\xf2\x4a\xef\x9c\xbc\x12\x93\x29\xb7\x04\x95\x30\xc2\x8b\xe4\x33\xd8\x06\x3b\x25\x96\xc7\x73\x60\xa7\x14\xa8\xe0\xdd\xe4\x26\xe3\x2f\x6c\x2b\x89\x16\x72\x85\xa1\xc5\xdd\x5f\x66\x04\xb6\xfb\xa3\x4e\xf3\x15\xc1\x23\xee\x10\x5a\xc5\x1d\x82\x9b\x08\x43\x85\xe6\x18\xb7\x18\x15\x0e\x15\x72\x4b\x42\x45\xdd\x05\x43\x45\x5c\x11\x1c\x48\xef\x82\xa8\x84\x59\xcf\x8b\x25\x2e\xd9\xcb\x8b\x97\x5c\xb2\xb7\x4c\x7c\xdf\x25\x7b\x9f\x22\x93\xfe\x42\xae\xc8\x01\x0b\x25\xf8\xba\xc4\x02\xa7\x0b\x84\x96\x7a\xc5\xee\x08\xb7\x04\x15\xb1\xa0\xb9\x50\xfc\x00\x03\x54\x18\x2d\xe2\x8a\x42\x4b\xbd\x6f\x0e\x15\x71\x4b\x34\x59\xae\x04\x3d\xca\x95\xa2\xcf\xfb\x17\xbb\x9d\x2e\x5d\x68\x69\xf7\x5c\xad\xb6\xa7\xa4\xed\x51\xb7\x39\x59\xf1\x67\x16\xc0\xd7\xa5\xee\x16\x7f\x21\x66\xdb\x4a\xc2\x83\x8b\xbd\x49\xa6\xca\x31\xa9\x23\x92\x73\x52\x47\x6e\x31\xd1\x7a\xa2\x8f\xae\xe5\xac\xa1\x5a\xae\xe6\x72\x5d\xd4\x4a\xf4\xd1\x1a\x86\x7d\x02\xfe\x41\x22\x49\x97\xd2\x7d\x93\x5d\x0c\xff\x20\x85\xc3\x6e\x22\x7b\x73\xd9\xc7\xdc\x44\x3e\x0e\x79\xb6\x2c\xc2\xf8\x8c\x0e\x98\x92\x9c\x8f\xb2\xd5\x11\x72\x93\x81\xb2\xe4\x0e\x30\x7c\xc3\x72\x73\xa2\x61\x39\x5a\xce\xef\x67\xfc\x85\x3d\x25\x0e\xfc\xa7\x78\xbc\xad\xc4\xb9\xa7\x0a\x44\x37\x10\x7d\x74\xa3\x67\x27\xaf\xed\x59\x00\xf0\x65\x66\x9e\x81\x73\x64\xc8\x65\x54\xf2\x53\xf1\x3a\x13\x04\x7a\x38\x25\x0b\x6e\xf1\xd1\x98\x70\x98\x18\xa1\x59\x8a\x90\x94\xb8\x60\xe2\xb6\x97\x82\xd5\xea\x84\xda\x5d\x66\xf1\xce\xc7\x7f\x84\x53\x32\x7c\x45\xe6\x56\xc2\x29\xd9\xa7\x6b\x15\x6f\x45\xe0\x2a\x59\x68\x27\xfa\x9e\x92\x78\x26\x75\x00\xbd\xe0\x21\x27\xe0\xcf\x24\xec\x21\x3b\xfd\x35\xc7\xac\xf0\x15\x19\xda\x92\x2c\xc0\x01\x7a\x4a\xe6\xac\xf9\x06\x54\xcb\xd5\xa0\x3a\xce\x5a\x6a\x20\x14\x3c\x24\x67\x2c\xba\xc7\x0a\x2f\xc9\xb0\x4f\xf2\xc6\x98\x26\x6f\xbc\xa9\x89\xab\xf5\xea\xd7\xab\xbb\xac\x8e\x8c\x91\x3b\x1d\x9a\x7f\x85\x97\x65\x67\xe9\xbc\xfc\x6e\xa1\xcf\xab\x77\xe5\xed\x79\x1c\x08\xac\x57\x5f\xf4\x58\xf3\x2a\x07\xfc\x76\xda\xe9\x5f\xc5\x0c\x55\x8a\x3f\x8f\x90\x05\x42\x1f\xf9\x0d\x5a\xc1\xd5\xb6\xd9\xa2\x36\xa2\x8f\xae\x61\xfc\x95\xbd\xaa\x0e\xad\x60\x7c\xba\x53\xb5\xed\xf5\xed\xf6\x88\xf9\x36\xd3\x63\x6d\xab\x87\x27\x25\xaf\x46\xfd\xbe\x5e\x7c\x10\x1e\xca\xce\x21\x33\x1b\xdc\xa9\x4d\xa9\x5e\x83\x58\x5b\xf0\x49\xc9\x3b\xce\xc0\x7d\x0a\xbe\xcf\x41\xef\x4a\x65\xaf\x00\xcf\x76\x7e\x52\x47\x3e\x62\x5a\x45\xc3\x29\x6b\x7b\x75\xc4\x9c\x64\xd8\x3a\xa2\x67\xd5\xe6\xc7\xb4\x93\x55\xeb\xab\x62\x3f\x4b\x8c\x19\xea\x71\x56\xe4\x6a\x4b\xe7\x89\x79\xf9\x3c\x0b\x44\x3d\x96\x5f\x03\xed\x3a\x26\x1e\xa7\xc1\x04\xbd\x4d\x82\xfb\x14\x58\xa7\xee\xa9\x06\x9e\xed\xfc\x50\x25\xdc\xa7\x78\xb6\xf3\x74\x82\xc2\x36\x28\x48\xec\x23\x3e\xb0\xc6\xea\x38\x6a\x85\x53\x0a\xec\x93\xd8\x87\x9c\xde\xab\xec\x12\x38\xa5\x88\xfb\x7d\x66\x13\x7c\x47\x22\x29\x06\x02\xc5\xe9\x24\x7b\x60\x4a\xc2\x0b\xa0\x20\xa1\x72\x98\x92\xd8\x42\x28\x4b\xdd\x49\x28\x4b\xec\x6a\x78\x45\x3a\x60\x6d\x28\x47\xe5\x5a\x07\xab\xbc\x22\xbc\x22\x85\xca\xc5\xb9\x38\xa4\x2d\x74\x54\x5b\xde\x94\x8c\x5f\xd4\x74\xe3\x70\x70\x0d\xc7\xd6\xf9\x1b\x4b\x18\xd4\xd0\xb2\xae\xb9\xd1\xe8\x44\x8e\xbe\x96\xf5\x17\x19\xd8\xac\xcc\xb8\xb9\x8b\xb0\x5a\xc5\x5d\x68\x25\xfc\x8a\x0c\xcf\xa8\xf0\x97\x6a\x73\x25\xbb\xd0\x5d\x11\x1b\x3f\xa7\x92\x04\xec\x57\xfd\x95\xf4\x73\xaa\x8f\x32\x69\xa9\xb8\xb6\xb8\x2e\x62\x4e\x70\x2b\x48\xde\xa9\xba\xf6\x9a\xf6\x35\x31\xf1\x3a\xc9\xf3\x81\x96\xda\x96\xba\x5e\xa0\x0f\xaf\xef\x16\x4c\xde\x0b\x2e\xb7\x90\xea\x3e\xcf\x60\xc5\xd1\xfb\x9f\xaa\x83\x5b\xc1\x82\xe6\x15\x8c\xee\x44\xce\xd4\x47\xd7\xae\xe0\xdf\x1c\xf3\xe7\xb5\x1b\x3e\xce\x15\xc1\x5f\x5f\xfd\xe5\xd0\x91\x13\x42\xff\xc0\x2a\xd7\x5b\x3f\x7a\x63\xe1\xc2\xcf\x7f\xee\x85\x2f\x7f\xf1\xdc\x29\x69\xe1\xc2\x9b\x54\x9a\x7a\x3a\xf5\x95\xc4\x6f\x4f\xf4\x9f\xf8\x68\xf0\xc4\x74\x1b\xfd\xac\x36\x3f\x1c\x9c\x6e\xf3\xfc\x27\xdb\xd8\x52\xa5\xf3\x50\x85\x36\xd5\xdc\x0a\x54\x41\x7f\x35\xc1\x59\x91\xc4\xd5\x20\xd9\x07\x8e\x5a\x91\x82\xc1\x01\x6b\x3c\xf8\xa5\x44\xfb\x81\xd8\x44\x2e\xb9\x45\x1f\x00\x9e\x6d\x3c\x43\x57\x26\xe8\x6f\x24\x3c\xdb\x78\x47\xab\xe3\xb0\xc3\xe8\x03\x9c\x22\xe6\x1c\x90\x5a\x94\xa0\x27\x23\x69\xce\x48\x96\x38\x3b\x9d\x5d\x4e\xcf\x36\x9e\xb6\xa5\x40\x36\x61\x15\x25\xe9\x97\x14\xf0\xc9\xf4\x4f\x76\xff\x71\x56\x8f\x64\xe0\x6a\x3c\xb2\x81\xab\xf5\x28\x06\xae\xce\xa3\x1a\xe8\xf3\x8a\x0f\x04\x7f\x9a\xd4\xd6\xf6\x60\x66\x6d\x01\xc9\x80\xac\x01\xd9\x80\x6a\x02\x8a\x01\xd5\x06\x54\x03\xaa\x8b\x33\xd8\x03\xbd\x0a\x1e\xd1\xb2\xb3\x5a\xc6\x6a\xd9\x51\xe8\x55\xe8\xd7\x95\x4f\xeb\x57\xdb\x9b\xf3\xca\xdf\xc4\x42\x77\xf7\xc6\xd1\xea\xf0\x81\x60\x34\xd9\x31\x01\xb4\x5d\xbd\xe9\xec\x72\xd2\x13\x9a\x0a\x82\x0f\x6b\x87\x90\xbe\x92\x9a\xb5\x95\x00\xfe\x38\x1d\xa3\x93\x29\x1f\x08\x2e\x48\x69\x93\x35\x66\x27\xbb\x8d\x67\x7c\x20\x58\x3a\xbb\x8a\xde\xa5\x02\xb8\x4f\xa1\xd7\x2e\x9a\x5e\x3f\x1c\x48\xc7\xe3\x71\xf8\x40\xda\x89\xca\x9c\x68\x99\xcf\x18\x34\xa7\xdb\xad\x11\x92\x38\x5a\x2d\xd6\xfb\x97\x0b\x50\xdc\x2e\x30\x62\x83\x40\x8b\x4f\x09\x7b\xc4\xed\x82\x4d\x5c\x55\xfa\xb9\xf5\xf7\x09\x39\xa2\xbe\xa7\xfa\x88\x15\xb8\xcd\x09\xf8\x48\x9a\xb6\x82\xd9\x51\xc4\xaa\x74\x36\x8a\x80\x6b\xd3\x70\x73\x9a\x5e\x94\xb2\x38\x91\x23\x5b\xc5\x2d\x87\x5c\xba\x79\xb5\xc5\x7b\x9f\x05\x7e\x35\xdd\x75\xd8\xd1\xea\x60\xf5\x96\x9e\xea\x2e\x77\x4f\x75\xcb\x6a\x54\xdd\x7d\x9d\x5b\xe6\xe0\xca\x1c\xf0\x7b\xe9\x59\xf7\xff\x4b\x69\x9a\x24\xe1\x4b\x69\x1c\x84\x2f\xa5\x4f\x35\xd1\x20\x55\x31\x69\x7e\xda\xc2\xea\x7a\xaa\x21\x97\x46\xd5\x87\xab\xba\x7d\xf0\xd7\xe9\xaa\xee\xd7\xe3\x71\xba\x20\x4d\xcb\xa9\x8c\xa1\x62\xe2\xc0\x09\x07\x7d\x00\x64\x51\x9d\x03\xab\x77\x11\x3d\x0b\x1d\x9c\x25\x79\xc9\x81\x53\x1a\xa2\x0d\xa9\xc3\x0e\xbc\x6b\x96\xe4\x56\x07\x4e\xde\x45\xaf\x38\xb0\x7c\x17\x4d\xcd\x42\x97\x66\xa1\x27\x67\xb5\x6b\x9a\xee\xd3\x07\x82\x23\x69\x4d\x4d\x16\x72\x8b\x61\x3c\xdb\x78\x27\x6a\x73\x22\x6f\xe6\x24\x41\xa0\x39\x48\x26\x6b\x13\xa9\xf4\xa7\xd9\xc4\xe4\x81\x26\x72\x9f\xbf\xee\x58\x2d\xd1\xb9\x23\xad\x96\xcb\xd5\xa8\xd6\xac\x0b\x1f\xbe\xbc\x9a\xfc\x9b\x7f\x79\x6f\x0d\x68\xab\xd6\x94\xf4\x63\x59\xfb\x7f\x49\x86\x9c\xdc\xbc\x1a\x55\xd3\xed\x12\xfc\xb5\xec\xaf\x84\x03\x72\xd6\x93\x3d\x31\x0e\x12\x24\xc1\xdf\x4f\x62\x9a\x2b\x1a\xaa\x84\x23\x32\xdd\x2e\x71\x35\xf0\x3d\xb9\x2b\x08\x92\xa1\x7a\x32\x3f\xc8\x27\x42\x6b\xc9\x1c\xce\xee\x2f\xe7\x3b\x44\x77\xa8\x5c\xfc\xf9\x50\x0d\xf9\x63\xd4\x3e\xb4\x4a\x7c\xc7\x5f\x79\xb8\x0b\xfe\x55\xc6\xef\xc3\xa4\x0c\x0d\x0a\xee\x47\x2b\xe1\xfd\x0a\x5c\xaa\x04\x80\x5e\x60\xc5\xf9\x61\xc1\x2f\x1e\x72\xc3\x01\x59\x78\x95\xbc\xdd\x2a\x8e\xc2\x15\x0a\xa6\x50\x0d\xac\x94\x4d\x93\xfd\xc2\x69\xef\x80\xc9\xe4\xcb\x31\x15\xd7\x17\xaf\x8d\x98\x13\x43\x35\xe2\x0d\xf3\x07\xbe\x5c\x58\x29\x37\x57\xbe\x77\x32\x41\xe6\xc3\x4a\xf9\xbd\xbe\x84\x38\x37\xd8\x97\x10\x0d\x82\x5f\xa4\xfc\x95\x16\x77\xb1\x7d\x82\x22\x73\xe1\x80\xcc\xd5\x89\xba\x58\xcb\x2a\x1f\xe5\x6e\xa9\x89\x98\x05\xce\x6e\x32\xe5\xae\x12\x60\x77\xde\xb1\x55\xa2\x3e\x7f\x3f\xb2\x37\x57\xf6\x02\xbd\xf0\x1b\x31\x47\xf0\x90\xfd\xf4\x53\x92\xe6\x86\x05\x56\x4c\x30\xf0\x07\x37\xb8\x84\x79\xbe\xf0\x0a\xb9\x59\x98\x34\x9b\xb8\xb4\x98\x17\x4d\x11\x7d\x34\xa9\xdd\x66\x49\x94\xd2\x1e\x24\x99\x44\x1f\xba\xe9\x03\xc1\x6f\x2d\xf8\xfb\x7a\x62\x3e\xcd\xde\x16\x39\xb0\x74\x17\x6d\x99\xa5\xff\xfe\x59\x36\xf5\xcb\x59\x08\x38\xb0\x32\xcb\xc2\x12\xb3\xec\x26\xf9\xf7\xec\xad\x7a\x56\x2f\x5f\x99\xc5\x3b\x33\x8b\xf7\xed\xe9\x11\x7c\x20\xb8\x41\xb9\xb3\xaa\x43\xd2\xa7\x9a\x9f\xb6\x17\x74\x8b\x42\xbf\xa0\xd0\x5f\x52\xb8\xa4\x48\xd1\xaf\x2b\x34\x9b\xd0\x9c\x4f\x9d\x42\x1f\x92\xe8\x1f\x28\xf4\x8e\xa4\x46\x13\xe5\x6f\xa7\x65\xf4\x81\xe0\x9b\x4a\x07\xa0\x32\xa6\x5b\xa2\xd9\x2e\xa0\x3c\xdb\x78\x8f\x99\xcf\xdc\xc0\x80\x5e\xab\x75\x45\xd7\xd0\x35\x9a\x6b\xf3\x81\xe0\x9f\x15\xd1\x10\x83\x67\x55\x7a\x54\xa1\x45\xc5\xf3\x4e\x68\x54\x18\x1a\x67\x7f\xc7\x8e\xbf\x31\xec\x01\x01\x33\x1f\xd0\x82\x67\x61\x9c\x50\x74\xae\x4a\xbf\xae\x64\x1b\x2d\x50\xa7\x1b\x19\x54\x7a\xa9\x3a\x36\x40\x42\xec\x68\x68\x60\x70\x9c\xfd\xdd\x4c\x13\x7c\x66\xc6\x57\xbf\x08\xbd\x0a\x74\x25\x35\xe7\x87\x54\xbc\x00\xbe\xaa\xa2\x72\x88\x54\xb6\x10\x1e\x55\xbb\x93\xf0\xa8\xca\xae\x86\x6f\xa8\xf1\x78\x26\x84\x08\xaa\x99\x10\xe2\x0d\x35\x54\x2e\x7e\x06\x87\xb4\xf6\xa3\x5a\x7b\xad\x1f\x6d\x2b\x9e\x4f\x66\x17\x9d\x9a\xa5\x6d\x61\x16\x92\x67\xa1\x2b\xb3\x50\xdf\x2c\x24\x4e\x6f\xdd\x74\xf2\x81\xa0\xa8\x76\x24\x0c\x9a\x1b\xbf\x49\x27\x32\x17\xc8\xd3\x99\x3b\x60\x42\xd5\xfe\xe0\x43\x12\x5c\x2a\xf9\xe6\x06\xe7\x49\x1d\x9b\xf2\x22\xe6\xdb\xd0\x91\x76\xf8\x1e\x0e\xbe\x9a\xee\xd8\x94\x17\x3c\x91\xee\x20\x79\xc1\xdf\xa7\x3b\x36\x19\x82\x62\xba\x83\x18\x22\xe6\xcb\x4e\x61\x58\xfc\x3f\x55\xdc\x73\xc8\x3a\x99\x8b\x62\xdc\x5e\x54\x33\x09\xd0\x24\x9b\x83\x41\x5b\xcc\xdd\x16\x73\xe3\x1c\x2d\xcb\x82\x2a\xce\x3a\xa9\x43\x56\x4e\x13\xa9\xa1\x57\x26\x59\xd0\x13\xeb\x8a\x71\x31\x64\xad\x9a\xa4\x50\x0c\xd5\x73\x93\xd9\xe6\x68\x6d\xab\x65\x97\x55\x8b\x72\x5d\x00\xd5\x45\x5a\x2d\xbb\x6a\x51\x2d\x57\xa7\x01\x16\xc0\xb5\x12\x17\x43\x36\x6e\x12\xad\xd1\x9c\xbd\xcd\xa5\x6f\xb3\x85\x7b\x6c\x2e\xd0\x66\x0b\x6b\xc1\x6a\x84\xc4\x0f\x8b\x05\x96\x5d\x36\x64\xe3\xd6\xb8\x00\x5a\x53\xc5\xd9\x26\xf5\x1a\x98\x04\x68\x0d\x0b\x2c\x5c\xec\x9b\x36\x64\x0f\x73\x93\xdf\xb4\xa1\x86\x1e\xbb\x68\x8c\xda\x49\x22\xda\x40\x6e\x44\xed\x44\x1f\x6d\x70\x73\xf6\xaa\xcb\xb1\xb6\x7a\xae\xe1\xf2\x64\xb8\xad\x9e\xab\x45\xf5\x5c\x1d\x5a\xcb\xd9\x51\x2d\xd7\x80\xea\xdc\xda\xf8\xb5\xc8\xca\xd5\xa1\x1a\x0c\xda\xac\xda\x12\x5a\xdb\x62\xbe\x87\x1c\xbb\x77\xef\xde\xad\x45\xd7\x1d\x9b\x0c\x31\xe7\x34\x81\xad\xc8\x86\x17\xa3\x35\x18\x20\x3b\xd6\xa3\x06\xac\x43\xeb\x30\x40\x8d\x70\x73\x1a\x3a\xd2\x9e\x71\x83\x10\x12\x4b\x85\x61\xd1\x2a\x8c\x8b\xf5\xc2\x19\x71\xbd\x70\x5a\xdc\x29\x84\x45\x5a\x10\xc4\xff\x27\x44\x44\xa7\x70\x56\x7c\x56\x38\x2f\x7e\x1f\xae\x94\xc4\x08\x0b\x7a\xac\x22\x05\x9f\x48\x71\x31\xf4\x1c\x37\x89\xf6\x96\x6d\xe6\xe9\xe7\x25\xf8\x44\x4a\xeb\x93\x76\x25\xe1\x5f\x52\x18\xc0\xc2\x94\x46\x3e\x96\xc6\xd4\x34\x59\x9c\xc6\xba\x69\x52\x9f\xc6\xfa\x69\xb2\x2e\xad\x89\xe7\xdc\x45\x8f\xa5\xb1\xe1\x2e\x2a\x4e\xe3\xdc\xbb\x48\x9f\xc6\x79\x59\xc4\x82\x63\x8d\x62\xbe\xc9\x64\x8a\x88\x5a\x8c\x7a\xac\x11\x35\xf6\x58\x73\x1b\xdb\xac\xb1\x56\x81\x22\xb9\xf0\x89\x94\x0f\xb4\x34\x32\x9c\x75\xfa\x95\x92\x51\xaf\x6e\xb6\x7a\xb3\x5a\xfc\xc4\x2e\x32\xdc\x1a\x8b\x2b\x07\xad\x61\xb8\x35\x55\x93\xd9\xd2\xe2\x82\xd3\x38\x53\xda\x2c\xae\xfd\x77\x34\xca\x70\xb6\xaa\xc9\xfd\x77\x54\x9a\xe1\x95\xcc\xe2\x95\xcc\xf0\xa6\x1f\x30\x9c\x8d\xe8\x87\xd6\x0c\xd9\x18\x78\x30\x35\x64\x37\x5b\xb0\x01\xd9\x61\x6b\x0a\x76\xa6\x86\x1a\xcc\x26\x6c\x40\x0d\x70\x30\x05\xbf\x9b\x62\xe0\x77\x53\x51\x3b\x67\x2f\x35\x20\x3b\x59\x00\x0f\xa5\xe0\x4f\x52\xd1\x06\xae\xa1\xd4\x80\x1a\x48\x1e\x7c\x33\x05\x0f\xa6\x98\xbc\x75\x66\x83\xa6\x48\x38\x9a\x62\x2c\x5f\x5e\xe7\x35\x60\x1b\x5a\x07\xc7\x53\x0c\x0b\x7a\x6c\xb9\xeb\xda\x6c\x4c\xc6\x43\x68\x2f\x44\x4d\x63\xac\xc9\x47\x59\x76\x3b\x70\xb7\x57\x8f\x7b\x8e\x7c\x60\x70\xba\x45\x63\x84\x4c\xb9\x7d\x14\x89\xb1\xa6\x63\x8d\x62\x81\xdb\xed\x76\x47\xc4\x1c\xad\xf0\x51\xbd\x1f\x18\xd6\xef\x3f\xf2\x81\x21\x22\x52\x6e\x72\x8d\x19\x1c\x1d\x78\xb7\x4f\xe8\x7f\x9b\x1c\x8f\xf4\x9f\x0b\x0d\x8d\x1d\x3f\xdb\x3f\x2a\x9c\x09\x8f\x1d\x3f\xdf\x3f\x38\xf2\xee\x30\x19\xb8\x70\xa1\x6f\x5c\x63\x9f\xc9\xb2\xc3\xd3\xec\xd3\x19\x76\xa8\x3f\x34\x3c\x78\x7c\xb8\x7f\x38\x74\x71\xec\x38\x19\x18\x1b\x0b\x8d\x0e\xb3\xc3\x6f\x9f\x3f\x1d\x1a\xed\x67\x59\x76\x7c\xe4\xed\x51\xf6\x6c\x68\xbc\x7f\x9a\x1c\x1c\x18\x1b\xe8\xef\xee\x66\xbb\xb3\xbf\xe1\xd0\xbb\x9a\xa7\xc4\xa1\x0b\xc7\x87\xf1\x08\xdc\x2e\xd1\xa2\x1e\x6e\x97\xf0\x75\x4f\x42\x8f\xff\xe2\xb9\xad\x9f\xc6\xe9\x4f\x60\xc7\x61\x87\x56\xa5\x68\x55\x65\x9e\xdb\x7a\x67\xa7\x93\x16\xf5\xec\xbc\xde\x5d\xd2\x11\x51\xef\x36\xdf\xd6\x6e\x3b\xcf\x0e\x1e\x6e\xd3\xee\x07\xcf\x4e\x9e\xf1\xec\xe0\x3d\xdb\xf8\x3d\x92\xca\xb0\xf9\xbd\xfb\xa4\x23\xb7\x34\x29\xfa\x96\x5e\xfd\x07\xa4\xc2\x77\x36\xdd\xc3\x56\x60\x8b\xa7\x42\x7b\x9b\x4a\x6e\x72\xc3\x89\x36\xb2\xb7\x9c\x47\x80\x3e\x4c\x92\xdc\x46\xcf\x0e\x1e\x6d\x60\xf3\x7b\x6f\xe9\x1d\xbd\x2d\x72\x66\xaa\xd7\xb9\x0d\x0e\x4c\xd0\x46\x16\x34\x6f\x28\x03\x7c\xc5\x6f\xe1\x2d\x7d\x74\x03\xb9\x81\x36\x44\x37\x72\x1b\x4b\xe7\x91\x39\xf8\x4f\xfe\xc2\xdf\x97\x10\xbd\xd3\xd1\x56\xc2\x6d\xf0\x6f\x24\x63\xf1\xb8\x78\x2e\xb0\x99\x13\x96\x91\xd0\xc4\x26\xef\x00\xb7\x01\xa9\x99\xb7\xff\x79\x07\x43\x57\xc9\x9e\x1d\xbc\xe5\xe3\x0d\xda\xd6\xfc\x23\xb6\xe0\x5f\xe9\x9f\x24\x65\x6e\x70\x1f\x08\xfa\xd4\x4c\xbc\x63\x23\x37\xb5\x58\x67\x07\xcf\x02\x1f\xc0\x00\xa9\x41\x90\x68\x50\x91\x1a\x9b\x00\xe4\xc6\xd5\xb9\x54\x98\x37\x92\x2b\xc2\x11\x91\x8a\xc7\xe3\x99\x80\x2b\xfb\x09\x81\xf6\xaa\xda\x0f\x00\x55\x05\x80\x35\xf6\x5e\x55\x67\x0e\x58\xf6\x20\xee\x91\xb4\xc1\xb2\xf7\x3f\xfd\xff\x25\x0c\x3c\x7a\x33\xcc\xcf\x87\xba\x7c\x2d\xd4\xd1\x9b\x4d\x9d\xbd\x15\x26\x0f\x65\x0e\x6b\x45\x8e\x79\x0f\x65\xf6\x6c\xd6\x4e\x2f\xdc\x64\x64\xeb\xb1\x11\x3e\x33\x1a\x30\xf3\x57\xf5\xe6\x80\x99\xa7\xef\x35\x56\x54\x7c\xff\x3b\xfb\xf6\x9e\xa8\xae\xfe\xce\xbe\x6f\x9d\x02\xf8\x29\xa4\x60\x23\x52\xe1\xca\x7c\xe6\xc2\xc8\xdb\xc3\x83\xec\x58\xe8\xc2\x58\x9f\xa7\xcf\xb3\x25\xd3\xc5\xe3\x09\x36\x07\xcf\x43\x0a\x06\x48\xc2\x7a\x24\x47\x25\x4e\x82\xcf\x24\xf0\x23\x68\x19\x06\x9e\x4d\xbc\xe7\x49\x1e\x96\x24\xc2\x43\x32\xb9\x32\xa4\x90\xf7\xf0\xfd\xa8\x08\x2e\x91\xe0\x1c\x6d\x76\xf4\xe3\x46\xcf\x66\xde\xb3\x85\xf7\x6c\xcd\xf4\xf5\xbe\x51\xdb\x14\x38\x25\x5b\x38\xd5\xa5\x43\xaa\xa0\x92\x6b\x58\xc3\x33\xe2\xf8\xc6\xcc\x6c\xb0\x07\x4e\xc9\x99\x8c\xb9\xe3\x15\x33\x33\x3b\x0e\xf8\xc3\x26\x6f\x92\x81\xdb\x24\x6c\x41\x0a\xce\xcf\xce\x9d\x8c\x86\x2e\x5c\x60\x07\x86\xc7\x35\x67\xc9\x8e\x8d\xb0\xec\x5b\x23\xc3\x63\xc2\xf0\xdb\xa1\xbe\xbb\x3d\xb1\xa0\x47\x81\x53\x72\x58\xe8\x23\xb7\xb4\x0e\x60\x30\x1f\xeb\xd0\x22\xf8\x5b\x93\x00\x48\x1e\xfc\x63\x3e\xfd\x4c\x3e\xcc\x33\xc1\xad\x26\x61\x4f\x16\xef\xcd\x60\xb7\x49\x98\x9f\xc5\xcd\x19\xfc\x35\x93\xf0\x5c\x16\xbf\x96\xc1\xd5\x26\xc1\x9a\xc5\xfe\x0c\xf6\x99\x84\xd3\x59\x7c\x32\x83\x67\x96\x27\xdc\x9d\x30\x3b\x34\x32\xca\xbe\x79\xf2\x2c\x3b\x3a\x72\x7e\x7a\xcf\x33\xab\xcf\xb2\xb9\x45\xf0\x92\x1c\x5d\x94\x5d\x3f\xab\xa5\xb7\xc2\xa1\xb7\xce\xb2\x23\x19\xf9\x3e\xfc\x30\x52\xb0\xe9\xd3\x24\xb3\x62\xa1\xd1\xd1\x91\xd1\x8c\x64\x53\x7e\xb1\xf1\x0d\xa3\xcb\xf8\xb9\x82\xc0\x76\x1e\x13\xa4\xc2\xb8\x29\xb0\x2d\x4b\x5d\x35\x71\x49\x0f\xa8\x60\x3c\xdb\x79\x7c\x71\x86\x73\xf1\x0e\x47\x97\xe5\x4c\xcc\x70\x26\xee\x70\xf4\x59\x4e\x6c\x86\x13\xbb\xc3\xa1\x2a\x18\x6d\x1c\x71\x86\x23\xde\xe1\xe4\x64\x39\x89\x2c\x67\x67\x96\xba\x9a\x91\x99\xa6\x76\xdc\xa1\xb8\xa4\x27\xb7\x22\xf3\x0c\xc1\x00\x7d\x8c\x14\x16\x60\x23\xba\x66\xe1\x92\xdf\x54\x50\x72\xe8\x63\x62\xe4\xae\x89\x73\x86\xae\x89\xc6\xa8\x42\x26\xa3\x2a\xb9\xcc\x04\x76\xf0\x81\x6d\x3c\x4d\x19\xa7\x0d\x3f\x55\xc0\x82\x66\x7b\xf3\xba\xe6\x46\x6c\x46\x0d\xbe\x6e\xf8\xf5\x02\x9f\x19\x13\xd4\x00\xbf\x57\xe0\xab\xc8\x10\xde\x02\xac\x43\xb9\xf0\x5b\x73\x68\x30\xd1\x63\x47\xeb\xd6\xab\x6d\xf6\x1e\x7b\xc3\xba\xf5\x6a\x6e\x23\x6a\xe4\xd6\xb5\xd9\xc3\xe4\x43\x06\x7e\xa1\x00\x72\x05\xd1\x86\x08\xb9\xc9\x94\xbd\xcc\x97\xbd\xcc\xc3\x2f\x14\x94\x1d\xe4\xa7\x2b\xaf\x30\x65\x2f\xf0\x65\x2f\xfc\xf7\x4a\x9c\x83\x8a\xf0\x02\x54\x08\x97\x48\x5c\x03\xbc\x24\xe3\x3c\x54\xc4\x35\xb2\xc6\xdd\x0e\x7c\x3f\x2a\xf4\xe6\xc2\x0f\x0b\x08\x05\xc7\x0a\x9c\xd1\x22\x37\x89\x33\x70\x89\x94\xfd\x24\x3b\xa2\x65\x67\x35\x45\x6a\x55\x33\x1f\x2f\x33\x19\x83\xf5\xa8\x08\x9b\x33\x9d\xfa\x0c\xc1\x2d\x73\xe0\x94\x1c\x31\xdf\xd6\x86\xd2\x84\xcd\xa8\xd0\x97\x1b\xdc\x79\xa7\xb6\x1b\xd9\xb5\x41\x7d\xc6\xe9\x16\xf8\xb4\xd6\x8f\xa0\x65\x63\x70\x4a\xe6\xec\x70\x4a\x8e\x16\x45\xed\x11\xf2\x3e\x33\x76\x21\x34\xc6\x9e\x1f\x18\xfd\x45\x5f\xe8\xcc\x00\xc1\x14\xd2\xe3\x04\xa2\xe0\xd7\x25\x7a\x41\x01\x06\x28\x07\xe7\xa1\x5c\x4c\x21\x4d\x09\x3a\x16\xf4\xe8\xdb\xc0\x50\x0e\xc9\x19\xca\xad\xb8\x27\x0a\x88\x3e\xaa\x8b\xea\x49\x2c\x4a\x91\x0f\x98\xe3\xb7\x19\x05\x28\x57\x9a\xd4\xff\x28\xff\x47\x7b\xe6\x7f\xa5\x7f\xa5\xff\x95\xe9\x7f\xba\xff\xff\x2b\x00\x00\xff\xff\x26\xad\xfb\xbb\x00\x20\x00\x00"), }, + "/BASE64A_ROM7_CharGen.BIN": &vfsgen۰CompressedFileInfo{ + name: "BASE64A_ROM7_CharGen.BIN", + modTime: time.Date(2019, 6, 9, 15, 51, 19, 742298204, time.UTC), + uncompressedSize: 4096, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\xa1\xd2\xe3\x3c\x0c\x5c\x28\x68\x58\x28\x58\x18\x18\x68\x18\xe8\x47\x30\xfc\xa0\xc1\x07\x02\x0d\x05\x0b\x0b\x7f\x68\xd8\x47\x28\xec\x23\x14\x7e\xb0\x30\xd0\xe8\x9f\x9b\x95\xdb\x9b\x23\x37\x73\xb8\xa9\x26\x33\xaa\x52\x79\xa5\xd5\xda\xe3\x44\x2d\x66\x56\xa0\xc9\xac\x9b\x61\x35\xe3\x83\x62\x22\x62\x85\xb1\x31\xee\x22\xab\x48\x7f\x7a\xc1\x26\x22\x37\xdb\x60\xbe\xcc\x50\x94\x56\x50\x69\x56\x60\xcb\xf1\x70\x5c\x0c\xe2\xd6\x61\xf7\xd6\x98\x67\x76\x6e\x37\xe6\x3b\xae\xe3\x3b\x1e\xe3\xb6\x5c\x3c\xe6\xba\x62\x52\x88\xd3\x1d\x57\x61\xcf\x7c\x77\xc9\xe3\xd6\xee\xc4\x4b\x6c\xdd\x3d\xf3\x7a\x8d\x1a\xa4\x43\x01\x8f\x2f\x5f\x60\x41\x28\x34\xc8\xe0\x89\x3f\xac\xbf\x7e\x8c\x2a\x8a\x94\x92\xc7\xf3\x32\x2f\x8f\xe5\x06\xdd\x8e\xe5\xbf\x55\x71\x38\x47\x0d\xb7\x2b\xc2\xf1\x18\xd8\xe7\xa4\x61\xac\x0b\x22\x12\x14\x1a\x6b\xad\x51\xa1\xad\x68\x69\x5e\xbd\xab\x0e\xec\x69\x24\xff\xae\x85\x69\x02\xbc\x4f\xa0\xd8\xad\x9d\xd9\xd7\x34\xe6\x57\xac\x66\xf6\xdf\x6b\xcc\xe4\x1f\x73\x5a\x7a\x8c\xe8\xb2\xfa\x5c\x73\x90\x95\x73\x70\x9e\x21\x70\x6e\x7c\xe8\xb7\x1a\x67\xc7\x26\xfc\xf0\x1a\x58\x25\x68\xf4\xf2\x6c\x20\x68\xe4\x4a\x14\x8b\xce\x77\xf7\xfa\x17\xb7\x8f\xfe\x7b\xd5\xff\x73\xfe\x77\xad\x7f\x54\x02\x7e\x03\x28\x75\xb3\x6f\x08\xc7\x6b\x2b\xe0\x0c\x37\xd4\xba\x99\xd9\xc6\xff\xad\xcb\x86\x7c\x0a\x2b\xe7\x8e\x31\xf1\x32\xf2\x89\x3f\x39\xff\x88\x1c\x63\x5c\x26\x11\x5b\xe6\xc5\xfc\x2d\xdf\x03\xf7\xd6\x1a\x6b\x8f\x7c\x5f\x6f\x65\xc4\xab\x08\xb0\x11\xaf\x02\x8f\x03\xe7\xc1\xfa\xa5\xae\x08\x2c\x77\xca\x00\x5e\x7d\x0e\xfe\xf4\xad\xdd\xe9\xd3\xe0\x64\xde\x8f\x53\x0a\x9d\xba\x3a\x9f\xcb\x17\xca\xe9\x74\x72\x9d\xd9\x3f\xb7\x28\xfb\xf9\xff\x69\xc5\xda\xe3\x4b\xb6\xb7\xd3\xbf\x1f\x68\x1d\xe0\xee\xaf\x40\xbf\xd2\xfa\x3f\x9f\xff\x94\x7a\xea\x29\xbd\xfd\xf9\xdf\xbd\xfe\x7f\xb9\xff\x3f\xfa\xef\x44\xff\xcf\xf9\xdf\xb5\xfe\xd9\x67\x83\xb7\xbb\xff\x7f\xa6\xe9\x30\x4d\x3f\xf0\x5d\xad\x8a\x39\xe7\x6b\xce\x33\xbf\x07\xdc\x5e\xf7\xff\xaf\x00\x00\x00\xff\xff\x20\x8b\x4f\x53\x00\x10\x00\x00"), + }, "/DISK2.rom": &vfsgen۰CompressedFileInfo{ name: "DISK2.rom", modTime: time.Date(2019, 6, 7, 16, 50, 59, 550488426, time.UTC), @@ -101,6 +108,7 @@ var Assets = func() http.FileSystem { fs["/BASE64A_E8.BIN"].(os.FileInfo), fs["/BASE64A_F0.BIN"].(os.FileInfo), fs["/BASE64A_F8.BIN"].(os.FileInfo), + fs["/BASE64A_ROM7_CharGen.BIN"].(os.FileInfo), fs["/DISK2.rom"].(os.FileInfo), fs["/dos33.dsk"].(os.FileInfo), }