├── .gitignore ├── CodemastersBinImage.sln ├── CodemastersBinImage ├── App.config ├── BinImage.cs ├── CodemastersBinImage.csproj ├── Helpers.cs ├── PluginVideoSega.cs ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── WinImploder.cs ├── frmMain.Designer.cs ├── frmMain.cs ├── frmMain.resx ├── icon100x100.ico └── win_imploder.dll └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | CodemastersBinImage/obj/ 2 | CodemastersBinImage/bin/ 3 | *.suo 4 | -------------------------------------------------------------------------------- /CodemastersBinImage.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Express 2013 for Windows Desktop 4 | VisualStudioVersion = 12.0.21005.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodemastersBinImage", "CodemastersBinImage\CodemastersBinImage.csproj", "{5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /CodemastersBinImage/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CodemastersBinImage/BinImage.cs: -------------------------------------------------------------------------------- 1 | using Helper; 2 | using PluginVideoSega; 3 | using System; 4 | using System.Drawing; 5 | using System.IO; 6 | using WinImploder; 7 | 8 | namespace CodemastersBinImage 9 | { 10 | public class BinImageData 11 | { 12 | byte[] data = null; 13 | 14 | public BinImageData(byte[] data) 15 | { 16 | if (ImploderWork.CheckImp(data)) 17 | { 18 | this.data = ImploderWork.Explode(data); 19 | } 20 | else 21 | { 22 | this.data = data; 23 | } 24 | } 25 | 26 | public BinImageData(Bitmap image) 27 | { 28 | byte[] tiles; 29 | ushort[] mapping; 30 | Color[] palette; 31 | ushort width; 32 | ushort height; 33 | 34 | VideoSega.ImageToData(image, null, out tiles, out mapping, out palette, out width, out height); 35 | image.Dispose(); 36 | 37 | MemoryStream dataStream = new MemoryStream(); 38 | dataStream.WriteWordInc(0, (ushort)(tiles.Length / TileSize)); 39 | dataStream.WriteWordInc(0, width); 40 | dataStream.WriteWordInc(0, height); 41 | 42 | byte[] palBytes = VideoSega.PaletteToByteArray(palette); 43 | dataStream.Write(palBytes, 0, palBytes.Length); 44 | 45 | byte[] mapBytes = Mapper.WordMapToByteMap(mapping); 46 | dataStream.Write(mapBytes, 0, mapBytes.Length); 47 | 48 | dataStream.Write(tiles, 0, tiles.Length); 49 | 50 | data = dataStream.ToArray(); 51 | } 52 | 53 | public byte[] Data 54 | { 55 | get 56 | { 57 | if (data != null) 58 | { 59 | return ImploderWork.ImplodeBest(data, (uint)data.Length); 60 | } 61 | return data; 62 | } 63 | } 64 | 65 | public int TilesCountOffset 66 | { 67 | get { return 0; } 68 | } 69 | 70 | public ushort TilesCount 71 | { 72 | get 73 | { 74 | if (data == null) return 0; 75 | return data.ReadWord(TilesCountOffset); 76 | } 77 | set 78 | { 79 | if (data == null) return; 80 | data.WriteWord(TilesCountOffset, value); 81 | } 82 | } 83 | 84 | public int WidthOffset 85 | { 86 | get { return TilesCountOffset + 2; } 87 | } 88 | 89 | public ushort Width 90 | { 91 | get 92 | { 93 | if (data == null) return 0; 94 | ushort width = data.ReadWord(WidthOffset); 95 | return (ushort)((width > 0xFF) ? 0 : width); 96 | } 97 | set 98 | { 99 | if (data == null) return; 100 | data.WriteWord(WidthOffset, (ushort)((value > 0xFF) ? 0 : value)); 101 | } 102 | } 103 | 104 | public int HeightOffset 105 | { 106 | get { return WidthOffset + 2; } 107 | } 108 | 109 | public ushort Height 110 | { 111 | get 112 | { 113 | if (data == null) return 0; 114 | ushort height = data.ReadWord(HeightOffset); 115 | return (ushort)((height > 0xFF) ? 0 : height); 116 | } 117 | set 118 | { 119 | if (data == null) return; 120 | data.WriteWord(HeightOffset, (ushort)((value > 0xFF) ? 0 : value)); 121 | } 122 | } 123 | 124 | public int PaletteOffset 125 | { 126 | get { return HeightOffset + 2; } 127 | } 128 | 129 | public int PaletteSize 130 | { 131 | get { return 0x20; } 132 | } 133 | 134 | public Color[] Palette 135 | { 136 | get 137 | { 138 | if (data == null) return null; 139 | if (PaletteOffset + PaletteSize > data.Length) return null; 140 | 141 | byte[] pal = new byte[PaletteSize]; 142 | Array.Copy(data, PaletteOffset, pal, 0, pal.Length); 143 | 144 | return VideoSega.PaletteFromByteArray(pal); 145 | } 146 | 147 | set 148 | { 149 | if (data == null) return; 150 | byte[] pal = VideoSega.PaletteToByteArray(value); 151 | Array.Copy(pal, 0, data, PaletteOffset, PaletteSize); 152 | } 153 | } 154 | 155 | public int MappingOffset 156 | { 157 | get { return PaletteOffset + PaletteSize; } 158 | } 159 | 160 | public int MappingSize 161 | { 162 | get 163 | { 164 | ushort width = Width; 165 | ushort height = Height; 166 | 167 | if (width * height == 0) return 0; 168 | 169 | return width * height * 2; 170 | } 171 | } 172 | 173 | public ushort[] Mapping 174 | { 175 | get 176 | { 177 | if (data == null) return null; 178 | if (MappingOffset + MappingSize > data.Length) return null; 179 | 180 | ushort[] mapping = new ushort[MappingSize / 2]; 181 | 182 | for (int i = 0; i < mapping.Length; ++i) 183 | { 184 | mapping[i] = data.ReadWord(MappingOffset + i * 2); 185 | } 186 | 187 | return mapping; 188 | } 189 | 190 | set 191 | { 192 | if (data == null) return; 193 | 194 | for (int i = 0; i < value.Length; ++i) 195 | { 196 | data.WriteWord(MappingOffset + i * 2, value[i]); 197 | } 198 | } 199 | } 200 | 201 | public int TilesOffset 202 | { 203 | get { return MappingOffset + MappingSize; } 204 | } 205 | 206 | public int TileSize 207 | { 208 | get { return 0x20; } 209 | } 210 | 211 | public int TilesSize 212 | { 213 | get { return TilesCount * TileSize; } 214 | } 215 | 216 | public byte[] Tiles 217 | { 218 | get 219 | { 220 | if (data == null) return null; 221 | if (TilesOffset + TilesSize > data.Length) return null; 222 | 223 | byte[] tiles = new byte[TilesSize]; 224 | 225 | Array.Copy(data, TilesOffset, tiles, 0, TilesSize); 226 | 227 | return tiles; 228 | } 229 | 230 | set 231 | { 232 | ushort width = Width; 233 | ushort height = Height; 234 | 235 | if (width * height == 0) return; 236 | 237 | TilesCount = (ushort)(value.Length / TileSize); 238 | Array.Copy(value, 0, data, TilesOffset, TilesSize); 239 | } 240 | } 241 | 242 | public void ImageAndMask(out Bitmap image) 243 | { 244 | image = VideoSega.ImageFromData(Tiles, Mapping, Palette, Width, Height); 245 | } 246 | } 247 | } 248 | -------------------------------------------------------------------------------- /CodemastersBinImage/CodemastersBinImage.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F} 8 | WinExe 9 | Properties 10 | CodemastersBinImage 11 | CodemastersBinImage 12 | v4.0 13 | 512 14 | Client 15 | 16 | 17 | x86 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | true 26 | 27 | 28 | x86 29 | pdbonly 30 | true 31 | bin\Release\ 32 | TRACE 33 | prompt 34 | 4 35 | true 36 | 37 | 38 | 39 | 40 | 41 | icon100x100.ico 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | Form 54 | 55 | 56 | frmMain.cs 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | frmMain.cs 65 | 66 | 67 | ResXFileCodeGenerator 68 | Resources.Designer.cs 69 | Designer 70 | 71 | 72 | True 73 | Resources.resx 74 | True 75 | 76 | 77 | SettingsSingleFileGenerator 78 | Settings.Designer.cs 79 | 80 | 81 | True 82 | Settings.settings 83 | True 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | PreserveNewest 93 | 94 | 95 | 96 | 103 | -------------------------------------------------------------------------------- /CodemastersBinImage/Helpers.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Drawing; 4 | using System.Drawing.Imaging; 5 | using System.IO; 6 | using System.Runtime.InteropServices; 7 | 8 | namespace Helper 9 | { 10 | public static class Helpers 11 | { 12 | public static UInt16 ReadWord(this byte[] array, int index) 13 | { 14 | return (ushort)((array[index] << 8) | array[index + 1]); 15 | } 16 | 17 | public static byte ReadByteInc(this MemoryStream stream, int index = 0) 18 | { 19 | stream.Seek(index, SeekOrigin.Current); 20 | 21 | byte[] array = new byte[1]; 22 | stream.Read(array, 0, array.Length); 23 | return array[0]; 24 | } 25 | 26 | public static UInt16 ReadWord(this MemoryStream stream, int index = 0) 27 | { 28 | long pos = stream.Position; 29 | stream.Seek(index, SeekOrigin.Current); 30 | 31 | byte[] array = new byte[2]; 32 | stream.Read(array, 0, array.Length); 33 | 34 | stream.Position = pos; 35 | return (ushort)((array[0] << 8) | array[1]); 36 | } 37 | 38 | public static UInt16 ReadWordInc(this MemoryStream stream, int index = 0) 39 | { 40 | stream.Seek(index, SeekOrigin.Current); 41 | 42 | byte[] array = new byte[2]; 43 | stream.Read(array, 0, array.Length); 44 | return (ushort)((array[0] << 8) | array[1]); 45 | } 46 | 47 | public static UInt32 ReadLong(this byte[] array, int index) 48 | { 49 | return (uint)((array[index] << 24) | (array[index + 1] << 16) | (array[index + 2] << 8) | array[index + 3]); 50 | } 51 | 52 | public static UInt32 ReadLong(this MemoryStream stream, int index = 0) 53 | { 54 | long pos = stream.Position; 55 | stream.Seek(index, SeekOrigin.Current); 56 | 57 | byte[] array = new byte[4]; 58 | stream.Read(array, 0, array.Length); 59 | 60 | stream.Position = pos; 61 | return (uint)((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3]); 62 | } 63 | 64 | public static UInt32 ReadLongInc(this MemoryStream stream, int index = 0) 65 | { 66 | stream.Seek(index, SeekOrigin.Current); 67 | 68 | byte[] array = new byte[4]; 69 | stream.Read(array, 0, array.Length); 70 | return (uint)((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3]); 71 | } 72 | 73 | public static void WriteWord(this byte[] array, int index, ushort value) 74 | { 75 | array[index++] = (byte)((value >> 8) & 0xFF); 76 | array[index] = (byte)(value & 0xFF); 77 | } 78 | 79 | public static void WriteWordInc(this MemoryStream stream, int index, ushort value) 80 | { 81 | stream.Seek(index, SeekOrigin.Current); 82 | 83 | byte[] array = new byte[2]; 84 | array[0] = (byte)((value >> 8) & 0xFF); 85 | array[1] = (byte)(value & 0xFF); 86 | stream.Write(array, 0, array.Length); 87 | } 88 | 89 | public static void WriteLong(this byte[] array, int index, uint value) 90 | { 91 | array[index++] = (byte)((value >> 24) & 0xFF); 92 | array[index++] = (byte)((value >> 16) & 0xFF); 93 | array[index++] = (byte)((value >> 8) & 0xFF); 94 | array[index] = (byte)(value & 0xFF); 95 | } 96 | 97 | public static void WriteLongInc(this MemoryStream stream, int index, uint value) 98 | { 99 | stream.Seek(index, SeekOrigin.Current); 100 | 101 | byte[] array = new byte[4]; 102 | array[0] = (byte)((value >> 24) & 0xFF); 103 | array[1] = (byte)((value >> 16) & 0xFF); 104 | array[2] = (byte)((value >> 8) & 0xFF); 105 | array[3] = (byte)(value & 0xFF); 106 | stream.Write(array, 0, array.Length); 107 | } 108 | 109 | public static void IncPos(this MemoryStream stream, int value) 110 | { 111 | stream.Seek(value, SeekOrigin.Current); 112 | } 113 | 114 | public static void SubPos(this MemoryStream stream, int value) 115 | { 116 | stream.Seek(-value, SeekOrigin.Current); 117 | } 118 | 119 | public static Bitmap CropImage(Bitmap source, Rectangle cropArea) 120 | { 121 | return source.Clone(cropArea, source.PixelFormat); 122 | } 123 | 124 | public static byte[] BitmapToArray(Bitmap image) 125 | { 126 | using (MemoryStream ms = new MemoryStream()) 127 | { 128 | image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 129 | return ms.ToArray(); 130 | } 131 | } 132 | 133 | public static Bitmap BitmapFromArray(byte[] array) 134 | { 135 | using (var ms = new MemoryStream(array)) 136 | { 137 | return new Bitmap(ms); 138 | } 139 | } 140 | 141 | public static uint mask(byte bit_idx, byte bits_cnt = 1) 142 | { 143 | return (uint)(((1 << bits_cnt) - 1) << bit_idx); 144 | } 145 | 146 | public static class CompareByteArray 147 | { 148 | [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] 149 | static extern int memcmp(byte[] b1, byte[] b2, long count); 150 | 151 | static public bool Compare(byte[] b1, byte[] b2) 152 | { 153 | return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0; 154 | } 155 | } 156 | 157 | public class CompareByteArrays : IEqualityComparer 158 | { 159 | public bool Equals(byte[] x, byte[] y) 160 | { 161 | return Helpers.CompareByteArray.Compare(x, y); 162 | } 163 | public int GetHashCode(byte[] obj) 164 | { 165 | var str = Convert.ToBase64String(obj); 166 | return str.GetHashCode(); 167 | } 168 | } 169 | 170 | public class CompareKey : IEqualityComparer> 171 | { 172 | public bool Equals(Tuple x, Tuple y) 173 | { 174 | return Helpers.CompareByteArray.Compare(x.Item1, y.Item1); 175 | } 176 | public int GetHashCode(Tuple obj) 177 | { 178 | var str = Convert.ToBase64String(obj.Item1); 179 | return str.GetHashCode(); 180 | } 181 | } 182 | 183 | public class CompareValue : IEqualityComparer> 184 | { 185 | public bool Equals(Tuple x, Tuple y) 186 | { 187 | return (x.Item2 == y.Item2); 188 | } 189 | public int GetHashCode(Tuple obj) 190 | { 191 | return obj.Item2.GetHashCode(); 192 | } 193 | } 194 | 195 | public static int SearchBytes(byte[] array, byte[] value, int from) 196 | { 197 | int found = 0; 198 | for (int i = from; i < array.Length; i++) 199 | { 200 | if (array[i] == value[found]) 201 | { 202 | if (++found == value.Length) 203 | { 204 | return i - found + 1; 205 | } 206 | } 207 | else 208 | { 209 | found = 0; 210 | } 211 | } 212 | return -1; 213 | } 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /CodemastersBinImage/PluginVideoSega.cs: -------------------------------------------------------------------------------- 1 | using Helper; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Drawing; 5 | using System.Drawing.Imaging; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Runtime.InteropServices; 9 | 10 | namespace PluginVideoSega 11 | { 12 | public class ScreenPoint 13 | { 14 | byte _X = 0; 15 | byte _Y = 0; 16 | ushort _PlaneAddr = 0x0000; 17 | 18 | public ScreenPoint() { } 19 | 20 | public ScreenPoint(byte x, byte y, ushort planeAddr) 21 | { 22 | _X = x; 23 | _Y = y; 24 | _PlaneAddr = planeAddr; 25 | } 26 | 27 | public byte X 28 | { 29 | get { return _X; } 30 | set { _X = value; } 31 | } 32 | 33 | public byte Y 34 | { 35 | get { return _Y; } 36 | set { _Y = value; } 37 | } 38 | 39 | public ushort PlaneAddr 40 | { 41 | get { return _PlaneAddr; } 42 | set { _PlaneAddr = value; } 43 | } 44 | } 45 | 46 | public static class VideoSega 47 | { 48 | public static Color[] PaletteFromByteArray(byte[] pal) 49 | { 50 | Color[] retn = new Color[16]; 51 | 52 | for (int x = 0, offset = 0; x < 16; x++, offset += 2) 53 | retn[x] = ColorFromWord(pal.ReadWord(offset)); 54 | 55 | return retn; 56 | } 57 | 58 | public static byte[] PaletteToByteArray(Color[] pal) 59 | { 60 | byte[] retn = new byte[32]; 61 | 62 | int offset = 0; 63 | for (int x = 0; x < 16; x++, offset += 2) 64 | { 65 | ushort W = ColorToWord(pal[x]); 66 | 67 | retn[offset + 0] = (byte)((W >> 8) & 0xFF); 68 | retn[offset + 1] = (byte)((W >> 0) & 0xFF); 69 | } 70 | 71 | return retn; 72 | } 73 | 74 | public static ushort ColorToWord(Color color) 75 | { 76 | ushort W = 0; 77 | 78 | W |= (ushort)(((color.R >> 4) & 0xE) << 0); 79 | W |= (ushort)(((color.G >> 4) & 0xE) << 4); 80 | W |= (ushort)(((color.B >> 4) & 0xE) << 8); 81 | 82 | return W; 83 | } 84 | 85 | public static Color ColorFromWord(ushort Word) 86 | { 87 | byte r = (byte)(((Word >> 0) & 0xE) << 4); 88 | byte g = (byte)(((Word >> 4) & 0xE) << 4); 89 | byte b = (byte)(((Word >> 8) & 0xE) << 4); 90 | return Color.FromArgb(r, g, b); 91 | } 92 | 93 | public static Color[] PaletteApplySega(Color[] pal) 94 | { 95 | byte[] tmp = PaletteToByteArray(pal); 96 | return PaletteFromByteArray(tmp); 97 | } 98 | 99 | public static Color ColorApplySega(Color color) 100 | { 101 | ushort tmp = ColorToWord(color); 102 | return ColorFromWord(tmp); 103 | } 104 | 105 | public static void TileToData(Bitmap tile, byte[] tiles, int tilePos) 106 | { 107 | BitmapData tileData = tile.LockBits(new Rectangle(0, 0, tile.Width, tile.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 108 | byte[] tileBytes = new byte[tileData.Height * tileData.Stride]; 109 | Marshal.Copy(tileData.Scan0, tileBytes, 0, tileBytes.Length); 110 | 111 | for (int h = 0; h < 8; ++h) 112 | for (int w = 0; w < 4; ++w) 113 | { 114 | tiles[tilePos] = (byte)((tileBytes[h * tileData.Stride + w * 2 + 0] << 4) & 0xF0); 115 | tiles[tilePos] |= (byte)((tileBytes[h * tileData.Stride + w * 2 + 1] << 0) & 0x0F); 116 | tilePos++; 117 | } 118 | 119 | tile.UnlockBits(tileData); 120 | } 121 | 122 | public static bool TileFromData(byte[] bytes, BitmapData data, int x, int y, byte[] tiles, ushort word) 123 | { 124 | ushort tilePos = Mapper.TilePos(word); 125 | for (int h = 0; h < 8; h++) 126 | for (int w = 0; w < 4; w++) 127 | { 128 | if (tilePos >= tiles.Length) return false; 129 | 130 | int newW1 = x + (Mapper.HF(word) ? (7 - (w * 2 + 0)) : (w * 2 + 0)); 131 | int newW2 = x + (Mapper.HF(word) ? (7 - (w * 2 + 1)) : (w * 2 + 1)); 132 | int newH = y + (Mapper.VF(word) ? (7 - h) : h); 133 | 134 | byte B = tiles[tilePos++]; 135 | bytes[newH * data.Stride + newW1] = (byte)((B & 0xF0) >> 4); 136 | bytes[newH * data.Stride + newW2] = (byte)((B & 0x0F) >> 0); 137 | } 138 | 139 | return true; 140 | } 141 | 142 | public static Bitmap ImageMaskFromData(ushort[] mapping, ushort width, ushort height) 143 | { 144 | if (mapping == null) return null; 145 | if (width == 0) return null; 146 | if (height == 0) return null; 147 | 148 | Bitmap mask = new Bitmap(width * 8, height * 8, PixelFormat.Format8bppIndexed); 149 | ColorPalette maskPal = mask.Palette; 150 | 151 | for (int i = 0; i < maskPal.Entries.Length; ++i) 152 | { 153 | maskPal.Entries[i] = ColorApplySega(Color.White); // Clear palette 154 | } 155 | 156 | BitmapData data = mask.LockBits(new Rectangle(0, 0, mask.Width, mask.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); 157 | byte[] bytes = new byte[data.Height * data.Stride]; 158 | Marshal.Copy(data.Scan0, bytes, 0, bytes.Length); 159 | 160 | byte pal = 0; 161 | for (ushort y = 0; y < height; ++y) 162 | for (ushort x = 0; x < width; ++x) 163 | { 164 | ushort word = mapping[y * width + x]; 165 | bool prior = Mapper.P(word); 166 | pal = Mapper.PalIdx(word); 167 | 168 | for (int h = 0; h < 8; h++) 169 | for (int w = 0; w < 8; w++) 170 | { 171 | bytes[(y * 8 + h) * data.Stride + (x * 8 + w)] = (byte)(prior ? 1 : 0); 172 | } 173 | } 174 | 175 | maskPal.Entries[1] = Color.FromArgb((pal << 4), 0, 0); // First color for non prior 176 | mask.Palette = maskPal; 177 | 178 | Marshal.Copy(bytes, 0, data.Scan0, bytes.Length); 179 | mask.UnlockBits(data); 180 | 181 | return mask; 182 | } 183 | 184 | public static Bitmap ImageFromData(byte[] tiles, ushort[] mapping, Color[] palette, ushort widthInTiles, ushort heightInTiles) 185 | { 186 | if (tiles == null) return null; 187 | if (mapping == null) return null; 188 | if (palette == null) return null; 189 | if (widthInTiles == 0) return null; 190 | if (heightInTiles == 0) return null; 191 | 192 | Bitmap image = new Bitmap(widthInTiles * 8, heightInTiles * 8, PixelFormat.Format8bppIndexed); 193 | 194 | BitmapData imageData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); 195 | byte[] imageBytes = new byte[imageData.Height * imageData.Stride]; 196 | Marshal.Copy(imageData.Scan0, imageBytes, 0, imageBytes.Length); 197 | 198 | for (ushort y = 0; y < heightInTiles; ++y) 199 | for (ushort x = 0; x < widthInTiles; ++x) 200 | if (!TileFromData(imageBytes, imageData, x * 8, y * 8, tiles, mapping[y * widthInTiles + x])) 201 | { 202 | image.UnlockBits(imageData); 203 | return null; 204 | } 205 | 206 | Marshal.Copy(imageBytes, 0, imageData.Scan0, imageBytes.Length); 207 | image.UnlockBits(imageData); 208 | 209 | PaletteToImage(image, palette); 210 | 211 | return image; 212 | } 213 | 214 | public static void ImageToData(Bitmap image, Bitmap mask, out byte[] tiles, out ushort[] mapping, out Color[] palette, out ushort width, out ushort height) 215 | { 216 | width = (ushort)image.Width; 217 | height = (ushort)image.Height; 218 | 219 | List> tilesAllHF = new List>(); 220 | List tilesAll = new List(); 221 | 222 | for (int y = 0; y < height; y += 8) 223 | for (int x = 0; x < width; x += 8) 224 | { 225 | int idx = (y / 8) * (width / 8) + (x / 8); 226 | 227 | Rectangle rect = new Rectangle(new Point(x, y), new Size(8, 8)); 228 | Bitmap tile = Helpers.CropImage(image, rect); 229 | 230 | byte[] hash00 = Helpers.BitmapToArray(tile); // !HF, !VF 231 | tile.RotateFlip(RotateFlipType.RotateNoneFlipX); 232 | byte[] hash10 = Helpers.BitmapToArray(tile); // HF, !VF 233 | tile.RotateFlip(RotateFlipType.RotateNoneFlipY); 234 | byte[] hash11 = Helpers.BitmapToArray(tile); // HF, VF 235 | tile.RotateFlip(RotateFlipType.RotateNoneFlipX); 236 | byte[] hash01 = Helpers.BitmapToArray(tile); // !HF, VF 237 | 238 | tilesAll.Add(new byte[][] { hash00, hash10, hash11, hash01 }); 239 | 240 | tilesAllHF.Add(new Tuple(hash00, idx)); 241 | tilesAllHF.Add(new Tuple(hash10, idx)); 242 | tilesAllHF.Add(new Tuple(hash11, idx)); 243 | tilesAllHF.Add(new Tuple(hash01, idx)); 244 | } 245 | 246 | tilesAllHF = tilesAllHF.Distinct(new Helpers.CompareKey()).ToList(); //remove tile duplicates 247 | tilesAllHF = tilesAllHF.Distinct(new Helpers.CompareValue()).ToList(); //remove tile duplicates 248 | 249 | BitmapData maskData = null; 250 | byte[] maskBytes = null; 251 | 252 | if (mask != null) 253 | { 254 | maskData = mask.LockBits(new Rectangle(0, 0, mask.Width, mask.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 255 | maskBytes = new byte[maskData.Height * maskData.Stride]; 256 | Marshal.Copy(maskData.Scan0, maskBytes, 0, maskBytes.Length); 257 | } 258 | 259 | MemoryStream stream = new MemoryStream(); 260 | for (int i = 0; i < tilesAll.Count; ++i) 261 | { 262 | int x = (i % (width / 8)); 263 | int y = (i / (width / 8)); 264 | 265 | int idx = 0; 266 | for (int l = 0; l < tilesAll[i].Length; ++l) 267 | if ((idx = tilesAllHF.FindIndex(a => Helpers.CompareByteArray.Compare(a.Item1, tilesAll[i][l]))) >= 0) 268 | { 269 | ushort word = 0; 270 | bool HF = false, VF = false; // !HF, !VF 271 | switch (l) 272 | { 273 | case 1: // HF, !VF 274 | HF = true; VF = false; 275 | break; 276 | case 2: // HF, VF 277 | HF = true; VF = true; 278 | break; 279 | case 3: // !HF, VF 280 | HF = false; VF = true; 281 | break; 282 | } 283 | 284 | bool prior = false; 285 | 286 | if (mask != null) 287 | { 288 | for (int h = 0; h < 8; h++) 289 | for (int w = 0; w < 8; w++) 290 | if (maskBytes[(y * 8 + h) * maskData.Stride + (x * 8 + w)] == 1) 291 | { 292 | prior = true; 293 | break; 294 | } 295 | 296 | word = Mapper.EncodeTileInfo((ushort)idx, HF, VF, (byte)(mask.Palette.Entries[1].R >> 4), prior); 297 | } 298 | else 299 | { 300 | word = Mapper.EncodeTileInfo((ushort)idx, HF, VF, 0, prior); 301 | } 302 | 303 | stream.WriteWordInc(0, word); 304 | break; 305 | } 306 | } 307 | 308 | if (mask != null) 309 | { 310 | mask.UnlockBits(maskData); 311 | } 312 | 313 | width /= 8; 314 | height /= 8; 315 | 316 | mapping = Mapper.ByteMapToWordMap(stream.ToArray()); 317 | palette = PaletteFromImage(image); 318 | 319 | int tilesCount = tilesAllHF.Count; 320 | tiles = new byte[0x20 * tilesCount]; 321 | 322 | for (int i = 0; i < tilesCount; ++i) 323 | { 324 | Bitmap tile = Helpers.BitmapFromArray(tilesAllHF[i].Item1); 325 | TileToData(tile, tiles, i * 0x20); 326 | tile.Dispose(); 327 | } 328 | } 329 | 330 | public static Bitmap TilesetFromData(byte[] tiles, Color[] palette, out int tilesCount, ushort tilesInRow = 16) 331 | { 332 | tilesCount = (tiles != null ? (tiles.Length / 0x20) : 0); 333 | tilesInRow = (ushort)((tilesCount < tilesInRow) ? tilesCount : tilesInRow); 334 | 335 | if (tilesCount != 0) 336 | { 337 | ushort[] mapping = new ushort[tilesCount]; 338 | 339 | for (int x = 0; x < tilesCount; x++) 340 | { 341 | mapping[x] = Mapper.EncodeTileInfo((ushort)x, false, false, 0, false); 342 | } 343 | 344 | return ImageFromData(tiles, mapping, palette, tilesInRow, (ushort)(tilesCount / tilesInRow)); 345 | } 346 | 347 | return null; 348 | } 349 | 350 | public static Color[] PaletteFromImage(Bitmap image) 351 | { 352 | Color[] colors = new Color[16]; 353 | 354 | for (int i = 0; i < colors.Length; ++i) 355 | { 356 | colors[i] = ColorApplySega(image.Palette.Entries[i]); 357 | } 358 | 359 | return colors; 360 | } 361 | 362 | public static void PaletteToImage(Bitmap image, Color[] palette) 363 | { 364 | ColorPalette imagePal = image.Palette; 365 | 366 | for (int i = 0; i < imagePal.Entries.Length; ++i) 367 | { 368 | imagePal.Entries[i] = ColorApplySega(Color.Black); // Clear palette 369 | } 370 | for (int i = 0; i < palette.Length; ++i) 371 | { 372 | imagePal.Entries[i] = Color.FromArgb( 373 | palette[i].R | ((i & 0x0C) >> 2), 374 | palette[i].G | ((i & 0x02) >> 1), 375 | palette[i].B | ((i & 0x01) >> 0) 376 | ); // Fill image palette 377 | } 378 | image.Palette = imagePal; 379 | } 380 | 381 | public static ushort GetVramWriteAddr(uint value) 382 | { 383 | return (ushort)(((value & Helpers.mask(0, 2)) << 14) | ((value & Helpers.mask(16, 14)) >> 16)); 384 | } 385 | 386 | public static uint SetVramWriteAddr(ushort value) 387 | { 388 | return (uint)(((value >> 14) & Helpers.mask(0, 2)) | ((value << 16) & Helpers.mask(16, 14)) | (1 << 30)); 389 | } 390 | 391 | public static ScreenPoint VramAddrToScreenPoint(ushort vramAddr, byte screenSize) 392 | { 393 | ushort planeAddr = (ushort)(vramAddr & 0xE000); 394 | vramAddr &= 0x1FFF; 395 | vramAddr >>= 1; 396 | byte x = (byte)(vramAddr % screenSize); 397 | byte y = (byte)(vramAddr / screenSize); 398 | return new ScreenPoint(x, y, planeAddr); 399 | } 400 | 401 | public static ushort VramAddrFromScreenPoint(ScreenPoint xy, byte screenSize) 402 | { 403 | ushort vramAddr = (ushort)(xy.Y * screenSize + xy.X); 404 | vramAddr <<= 1; 405 | vramAddr &= 0x1FFF; 406 | vramAddr |= (ushort)(xy.PlaneAddr & 0xE000); 407 | return vramAddr; 408 | } 409 | } 410 | 411 | public static class Mapper 412 | { 413 | public static ushort TileIdx(ushort Word) 414 | { 415 | return (ushort)(Word & 0x7FF); 416 | } 417 | 418 | public static byte PalIdx(ushort Word) 419 | { 420 | return (byte)((Word & 0x6000) >> 13); 421 | } 422 | 423 | public static bool HF(ushort Word) 424 | { 425 | return ((Word & 0x800) >> 11) == 1; 426 | } 427 | 428 | public static bool VF(ushort Word) 429 | { 430 | return ((Word & 0x1000) >> 12) == 1; 431 | } 432 | 433 | public static bool P(ushort Word) 434 | { 435 | return ((Word & 0x8000) >> 15) == 1; 436 | } 437 | 438 | public static ushort ApplyTileIdx(ushort Word, ushort tileIdx) 439 | { 440 | return (ushort)((Word & ~0x07FF) | tileIdx); 441 | } 442 | 443 | public static ushort ApplyPalIdx(ushort Word, byte palIdx) 444 | { 445 | return (ushort)((Word & ~0x6000) | (palIdx << 13)); 446 | } 447 | 448 | public static ushort ApplyHF(ushort Word, int hf) 449 | { 450 | return (ushort)((Word & ~0x0800) | (hf << 11)); 451 | } 452 | 453 | public static ushort ApplyVF(ushort Word, int vf) 454 | { 455 | return (ushort)((Word & ~0x1000) | (vf << 12)); 456 | } 457 | 458 | public static ushort ApplyP(ushort Word, int p) 459 | { 460 | return (ushort)((Word & ~0x8000) | (p << 15)); 461 | } 462 | 463 | public static ushort TilePos(ushort Word) 464 | { 465 | ushort idx = TileIdx(Word); 466 | ushort tilesPos = (ushort)(idx * 0x20); 467 | return tilesPos; 468 | } 469 | 470 | public static ushort EncodeTileInfo(ushort idx, bool hf, bool vf, byte palIndex, bool p) 471 | { 472 | int retn = ((p ? 1 : 0) << 15) | ((palIndex & 3) << 13) | ((vf ? 1 : 0) << 12) | ((hf ? 1 : 0) << 11) | (idx & 0x7FF); 473 | return (ushort)retn; 474 | } 475 | 476 | public static byte[] WordMapToByteMap(ushort[] wordMap, ushort StartMask = 0) 477 | { 478 | int len = wordMap.Length; 479 | 480 | byte[] retn = new byte[len * 2]; 481 | for (int i = 0, j = 0; i < len; i++, j += 2) 482 | { 483 | retn[j] = (byte)(((wordMap[i] & 0xFF00) >> 8) - StartMask); 484 | retn[j + 1] = (byte)((wordMap[i] & 0xFF) - StartMask); 485 | } 486 | 487 | return retn; 488 | } 489 | 490 | public static ushort[] ByteMapToWordMap(byte[] byteMap, ushort StartMask = 0) 491 | { 492 | int len = byteMap.Length / 2; 493 | ushort[] retn = new ushort[len]; 494 | for (int i = 0, j = 0; i < len; i++, j += 2) 495 | retn[i] = (ushort)((((byteMap[j] << 8) | byteMap[j + 1]) & 0xFFFF) + StartMask); 496 | return retn; 497 | } 498 | } 499 | } -------------------------------------------------------------------------------- /CodemastersBinImage/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace CodemastersBinImage 5 | { 6 | static class Program 7 | { 8 | [STAThread] 9 | static void Main() 10 | { 11 | /* 12 | string[] args = Environment.GetCommandLineArgs(); 13 | 14 | if (args.Length >= 2) // mode, files, {log, rom} 15 | { 16 | if (!File.Exists(args[2])) return; // files 17 | 18 | string[] files = File.ReadAllLines(args[2]); 19 | 20 | char mode = args[1].ToLower()[0]; // mode 21 | 22 | if (mode == 'e') 23 | { 24 | for (int i = 0; i < files.Length; i++) 25 | { 26 | bool isBitmap; 27 | try 28 | { 29 | isBitmap = (Bitmap.FromFile(files[i]) != null); 30 | } 31 | catch 32 | { 33 | isBitmap = false; 34 | } 35 | 36 | BinImageData bid = BinImageData.FromFile(files[i]); 37 | 38 | if (bid == null) continue; 39 | 40 | if (!isBitmap) 41 | { 42 | Bitmap bmp = bid.Image; 43 | 44 | if (bmp == null) continue; 45 | 46 | bmp.Save(Path.GetFileName(Path.ChangeExtension(files[i], ".bmp")), ImageFormat.Bmp); 47 | bmp.Dispose(); 48 | } 49 | else 50 | { 51 | File.WriteAllBytes(Path.GetFileName(Path.ChangeExtension(files[i], ".imp.bin")), bid.Data); 52 | } 53 | } 54 | } 55 | else if (mode == 'i') 56 | { 57 | if (!File.Exists(args[4])) return; // rom 58 | if (!File.Exists(args[3])) return; // log 59 | 60 | byte[] rom = File.ReadAllBytes(args[4]); 61 | string[] log = File.ReadAllLines(args[3]); 62 | 63 | List diffs = new List(log.Length); 64 | 65 | Regex regex = new Regex(@"^([A-Fa-f0-9]{8}) \(([A-Fa-f0-9]{4})"); 66 | for (int i = 0; i < log.Length; i++) 67 | { 68 | Match match = regex.Match(log[i]); 69 | 70 | if (match.Success) 71 | { 72 | int size = Convert.ToInt32(match.Groups[2].Value, 16); 73 | 74 | BinImageData bid = BinImageData.FromFile(files[i]); 75 | 76 | byte[] impData = bid.Data; 77 | 78 | int diff = (impData.Length - size) + ((i > 0) ? diffs[i - 1] : 0); 79 | Console.WriteLine("[{0:000}, {1}]: {2}", i, files[i], diff); 80 | 81 | diffs.Add(diff); 82 | } 83 | } 84 | 85 | int firstOffset = 0, newOffset = 0; 86 | for (int i = 0; i < log.Length; i++) 87 | { 88 | Match match = regex.Match(log[i]); 89 | 90 | if (match.Success) 91 | { 92 | int offset = Convert.ToInt32(match.Groups[1].Value, 16); 93 | int size = Convert.ToInt32(match.Groups[2].Value, 16); 94 | 95 | firstOffset = ((firstOffset == 0) ? offset : firstOffset); 96 | 97 | BinImageData bid = BinImageData.FromFile(files[i]); 98 | 99 | byte[] impData = bid.Data; 100 | 101 | newOffset = offset + ((i > 0) ? diffs[i - 1] : 0); 102 | 103 | for (int k = 0; k < (0xD089C - newOffset); ++k) 104 | { 105 | rom[newOffset + k] = 0x00; // clear old imps 106 | } 107 | 108 | Array.Copy(impData, 0, rom, newOffset, impData.Length); 109 | 110 | if (i > 0) 111 | { 112 | List refs = new List(); 113 | 114 | int refFrom = -1; 115 | while ((refFrom = Helpers.SearchBytes( 116 | rom, 117 | new byte[] { 118 | (byte)((offset >> 24) & 0xFF), 119 | (byte)((offset >> 16) & 0xFF), 120 | (byte)((offset >> 8) & 0xFF), 121 | (byte)((offset >> 0) & 0xFF), 122 | }, refFrom + 1 123 | )) != -1) 124 | { 125 | if (refFrom >= firstOffset) continue; 126 | refs.Add(refFrom); 127 | } 128 | 129 | for (int j = 0; j < refs.Count; ++j) 130 | { 131 | Console.WriteLine(string.Format("Fixing ref {0:X6}: {1:X6} -> {2:X6}", refs[j], offset, newOffset)); 132 | rom.WriteLong(refs[j], (uint)newOffset); 133 | } 134 | } 135 | } 136 | } 137 | File.WriteAllBytes(Path.ChangeExtension(args[4], ".new.bin"), rom); 138 | } 139 | 140 | return; 141 | } 142 | */ 143 | 144 | Application.EnableVisualStyles(); 145 | Application.SetCompatibleTextRenderingDefault(false); 146 | Application.Run(new frmMain()); 147 | } 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /CodemastersBinImage/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Управление общими сведениями о сборке осуществляется с помощью 6 | // набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, 7 | // связанные со сборкой. 8 | [assembly: AssemblyTitle("CodemastersBinImage")] 9 | [assembly: AssemblyDescription("Codemasters Imploded Images Tool")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Lab 313")] 12 | [assembly: AssemblyProduct("CodemastersBinImage")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Параметр ComVisible со значением FALSE делает типы в сборке невидимыми 18 | // для COM-компонентов. Если требуется обратиться к типу в этой сборке через 19 | // COM, задайте атрибуту ComVisible значение TRUE для этого типа. 20 | [assembly: ComVisible(false)] 21 | 22 | // Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM 23 | [assembly: Guid("6af724ef-e090-4789-9b01-da71a156de9a")] 24 | 25 | // Сведения о версии сборки состоят из следующих четырех значений: 26 | // 27 | // Основной номер версии 28 | // Дополнительный номер версии 29 | // Номер сборки 30 | // Редакция 31 | // 32 | // Можно задать все значения или принять номера сборки и редакции по умолчанию 33 | // используя "*", как показано ниже: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.3.0.0")] 36 | [assembly: AssemblyFileVersion("1.3.0.0")] 37 | -------------------------------------------------------------------------------- /CodemastersBinImage/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CodemastersBinImage.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CodemastersBinImage.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /CodemastersBinImage/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /CodemastersBinImage/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CodemastersBinImage.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /CodemastersBinImage/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CodemastersBinImage/WinImploder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Runtime.InteropServices; 4 | 5 | namespace WinImploder 6 | { 7 | public static class ImploderWork 8 | { 9 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)] 10 | static unsafe extern int implode(byte* input, uint size, byte mode); 11 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)] 12 | static unsafe extern int imploded_size(byte* input); 13 | 14 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)] 15 | static unsafe extern int check_imp(byte* input); 16 | 17 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)] 18 | static unsafe extern int explode(byte* input); 19 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)] 20 | static unsafe extern int exploded_size(byte* input); 21 | 22 | public unsafe static byte[] Implode(byte[] input, uint size, byte mode) 23 | { 24 | byte[] output = new byte[0x10000]; 25 | Array.Copy(input, output, input.Length); 26 | 27 | fixed (byte* pOutput = output) 28 | { 29 | int out_size = implode(pOutput, size, mode); 30 | if (out_size != 0) 31 | { 32 | byte[] result = new byte[out_size]; 33 | Array.Copy(output, result, out_size); 34 | 35 | return result; 36 | } 37 | 38 | return null; 39 | } 40 | } 41 | 42 | public static byte[] ImplodeBest(byte[] input, uint size) 43 | { 44 | byte bestMode = 0; 45 | int bestLen = Implode(input, size, 0).Length; 46 | 47 | if (bestLen == 0) return null; 48 | 49 | for (byte i = 1; i < 0x0C; ++i) 50 | { 51 | int len = Implode(input, size, i).Length; 52 | 53 | if (len == 0) continue; 54 | 55 | if (bestLen > len) 56 | { 57 | bestMode = i; 58 | bestLen = len; 59 | } 60 | } 61 | 62 | if (bestLen == 0) return null; 63 | return Implode(input, size, bestMode); 64 | } 65 | 66 | public unsafe static int ImplodedSize(byte[] input, int pos = 0) 67 | { 68 | fixed (byte* pInput = input) 69 | { 70 | return imploded_size(&pInput[pos]); 71 | } 72 | } 73 | 74 | public unsafe static bool CheckImp(byte[] input, int pos = 0) 75 | { 76 | fixed (byte* pInput = input) 77 | { 78 | return (check_imp(&pInput[pos]) != 0); 79 | } 80 | } 81 | 82 | public unsafe static byte[] Explode(byte[] input, int pos = 0) 83 | { 84 | byte[] output = new byte[ExplodedSize(input, pos)]; 85 | Array.Copy(input, output, input.Length); 86 | 87 | fixed (byte* pOutput = output) 88 | { 89 | int out_size = explode(&pOutput[0]); 90 | 91 | if (out_size != 0) 92 | { 93 | byte[] result = new byte[out_size]; 94 | Array.Copy(output, result, out_size); 95 | 96 | return result; 97 | } 98 | 99 | return null; 100 | } 101 | } 102 | 103 | public unsafe static int ExplodedSize(byte[] input, int pos) 104 | { 105 | fixed (byte* pInput = input) 106 | { 107 | return exploded_size(&pInput[pos]); 108 | } 109 | } 110 | 111 | public static List> FindImploded(byte[] input) 112 | { 113 | List> list = new List>(); 114 | 115 | int i = 0; 116 | while (i < input.Length) 117 | { 118 | if (CheckImp(input, i)) 119 | { 120 | int size = ImplodedSize(input, i); 121 | 122 | if (i + size > input.Length) 123 | { 124 | i++; 125 | continue; 126 | } 127 | 128 | list.Add(new Tuple(i, size)); 129 | 130 | i += size; 131 | } 132 | else 133 | { 134 | i++; 135 | } 136 | } 137 | 138 | return ((list.Count > 0) ? list : null); 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /CodemastersBinImage/frmMain.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace CodemastersBinImage 2 | { 3 | partial class frmMain 4 | { 5 | /// 6 | /// Требуется переменная конструктора. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Освободить все используемые ресурсы. 12 | /// 13 | /// истинно, если управляемый ресурс должен быть удален; иначе ложно. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Код, автоматически созданный конструктором форм Windows 24 | 25 | /// 26 | /// Обязательный метод для поддержки конструктора - не изменяйте 27 | /// содержимое данного метода при помощи редактора кода. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); 32 | this.pbImage = new System.Windows.Forms.PictureBox(); 33 | this.dlgOpen = new System.Windows.Forms.OpenFileDialog(); 34 | this.dlgSave = new System.Windows.Forms.SaveFileDialog(); 35 | this.dlgOpenBmp = new System.Windows.Forms.OpenFileDialog(); 36 | this.pnlLeft = new System.Windows.Forms.Panel(); 37 | this.lvItems = new System.Windows.Forms.ListView(); 38 | this.chIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 39 | this.chOffset = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 40 | this.chSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 41 | this.pnlButtons = new System.Windows.Forms.Panel(); 42 | this.btnExportAll = new System.Windows.Forms.Button(); 43 | this.btnImplode = new System.Windows.Forms.Button(); 44 | this.btnExport = new System.Windows.Forms.Button(); 45 | this.btnBrowse = new System.Windows.Forms.Button(); 46 | this.tbPath = new System.Windows.Forms.TextBox(); 47 | this.dlgSaveDir = new System.Windows.Forms.FolderBrowserDialog(); 48 | ((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit(); 49 | this.pnlLeft.SuspendLayout(); 50 | this.pnlButtons.SuspendLayout(); 51 | this.SuspendLayout(); 52 | // 53 | // pbImage 54 | // 55 | this.pbImage.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 56 | this.pbImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 57 | this.pbImage.Dock = System.Windows.Forms.DockStyle.Fill; 58 | this.pbImage.Location = new System.Drawing.Point(350, 0); 59 | this.pbImage.Name = "pbImage"; 60 | this.pbImage.Size = new System.Drawing.Size(459, 387); 61 | this.pbImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; 62 | this.pbImage.TabIndex = 2; 63 | this.pbImage.TabStop = false; 64 | // 65 | // dlgOpen 66 | // 67 | this.dlgOpen.Filter = "ROM Files (*.bin;*.gen)|*.bin;*.gen|All Files (*.*)|*.*"; 68 | this.dlgOpen.RestoreDirectory = true; 69 | this.dlgOpen.Title = "Select the game ROM..."; 70 | // 71 | // dlgSave 72 | // 73 | this.dlgSave.DefaultExt = "bmp"; 74 | this.dlgSave.Filter = "BMP Files (*.bmp)|*.bmp"; 75 | this.dlgSave.RestoreDirectory = true; 76 | this.dlgSave.Title = "Where to save bitmap..."; 77 | // 78 | // dlgOpenBmp 79 | // 80 | this.dlgOpenBmp.Filter = "BMP Files (*.bmp)|*.bmp"; 81 | this.dlgOpenBmp.RestoreDirectory = true; 82 | this.dlgOpenBmp.Title = "Select Bitmap file..."; 83 | // 84 | // pnlLeft 85 | // 86 | this.pnlLeft.Controls.Add(this.lvItems); 87 | this.pnlLeft.Controls.Add(this.pnlButtons); 88 | this.pnlLeft.Dock = System.Windows.Forms.DockStyle.Left; 89 | this.pnlLeft.Location = new System.Drawing.Point(0, 0); 90 | this.pnlLeft.Name = "pnlLeft"; 91 | this.pnlLeft.Size = new System.Drawing.Size(350, 387); 92 | this.pnlLeft.TabIndex = 7; 93 | // 94 | // lvItems 95 | // 96 | this.lvItems.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { 97 | this.chIndex, 98 | this.chOffset, 99 | this.chSize}); 100 | this.lvItems.Dock = System.Windows.Forms.DockStyle.Fill; 101 | this.lvItems.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 102 | this.lvItems.FullRowSelect = true; 103 | this.lvItems.GridLines = true; 104 | this.lvItems.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; 105 | this.lvItems.HideSelection = false; 106 | this.lvItems.Location = new System.Drawing.Point(0, 70); 107 | this.lvItems.MultiSelect = false; 108 | this.lvItems.Name = "lvItems"; 109 | this.lvItems.Size = new System.Drawing.Size(350, 317); 110 | this.lvItems.TabIndex = 6; 111 | this.lvItems.UseCompatibleStateImageBehavior = false; 112 | this.lvItems.View = System.Windows.Forms.View.Details; 113 | this.lvItems.SelectedIndexChanged += new System.EventHandler(this.lvItems_SelectedIndexChanged); 114 | this.lvItems.Resize += new System.EventHandler(this.lvItems_Resize); 115 | // 116 | // chIndex 117 | // 118 | this.chIndex.Text = "#"; 119 | this.chIndex.Width = 50; 120 | // 121 | // chOffset 122 | // 123 | this.chOffset.Text = "Offset"; 124 | this.chOffset.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; 125 | this.chOffset.Width = 100; 126 | // 127 | // chSize 128 | // 129 | this.chSize.Text = "Size"; 130 | this.chSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; 131 | this.chSize.Width = 100; 132 | // 133 | // pnlButtons 134 | // 135 | this.pnlButtons.Controls.Add(this.btnExportAll); 136 | this.pnlButtons.Controls.Add(this.btnImplode); 137 | this.pnlButtons.Controls.Add(this.btnExport); 138 | this.pnlButtons.Controls.Add(this.btnBrowse); 139 | this.pnlButtons.Controls.Add(this.tbPath); 140 | this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Top; 141 | this.pnlButtons.Location = new System.Drawing.Point(0, 0); 142 | this.pnlButtons.Name = "pnlButtons"; 143 | this.pnlButtons.Size = new System.Drawing.Size(350, 70); 144 | this.pnlButtons.TabIndex = 7; 145 | // 146 | // btnExportAll 147 | // 148 | this.btnExportAll.AutoSize = true; 149 | this.btnExportAll.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 150 | this.btnExportAll.Enabled = false; 151 | this.btnExportAll.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 152 | this.btnExportAll.Location = new System.Drawing.Point(105, 38); 153 | this.btnExportAll.Name = "btnExportAll"; 154 | this.btnExportAll.Size = new System.Drawing.Size(87, 25); 155 | this.btnExportAll.TabIndex = 7; 156 | this.btnExportAll.Text = "Export All"; 157 | this.btnExportAll.UseVisualStyleBackColor = true; 158 | this.btnExportAll.Click += new System.EventHandler(this.btnExportAll_Click); 159 | // 160 | // btnImplode 161 | // 162 | this.btnImplode.AutoSize = true; 163 | this.btnImplode.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 164 | this.btnImplode.Enabled = false; 165 | this.btnImplode.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 166 | this.btnImplode.Location = new System.Drawing.Point(198, 38); 167 | this.btnImplode.Name = "btnImplode"; 168 | this.btnImplode.Size = new System.Drawing.Size(94, 25); 169 | this.btnImplode.TabIndex = 6; 170 | this.btnImplode.Text = "Implode BMP"; 171 | this.btnImplode.UseVisualStyleBackColor = true; 172 | this.btnImplode.Click += new System.EventHandler(this.btnImplode_Click); 173 | // 174 | // btnExport 175 | // 176 | this.btnExport.AutoSize = true; 177 | this.btnExport.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 178 | this.btnExport.Enabled = false; 179 | this.btnExport.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 180 | this.btnExport.Location = new System.Drawing.Point(12, 38); 181 | this.btnExport.Name = "btnExport"; 182 | this.btnExport.Size = new System.Drawing.Size(87, 25); 183 | this.btnExport.TabIndex = 5; 184 | this.btnExport.Text = "Export BMP"; 185 | this.btnExport.UseVisualStyleBackColor = true; 186 | this.btnExport.Click += new System.EventHandler(this.btnExport_Click); 187 | // 188 | // btnBrowse 189 | // 190 | this.btnBrowse.AutoSize = true; 191 | this.btnBrowse.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 192 | this.btnBrowse.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 193 | this.btnBrowse.Location = new System.Drawing.Point(298, 8); 194 | this.btnBrowse.Name = "btnBrowse"; 195 | this.btnBrowse.Size = new System.Drawing.Size(38, 25); 196 | this.btnBrowse.TabIndex = 2; 197 | this.btnBrowse.Text = "..."; 198 | this.btnBrowse.UseVisualStyleBackColor = true; 199 | this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); 200 | // 201 | // tbPath 202 | // 203 | this.tbPath.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 204 | this.tbPath.Location = new System.Drawing.Point(12, 12); 205 | this.tbPath.Name = "tbPath"; 206 | this.tbPath.ReadOnly = true; 207 | this.tbPath.Size = new System.Drawing.Size(280, 20); 208 | this.tbPath.TabIndex = 1; 209 | this.tbPath.WordWrap = false; 210 | // 211 | // frmMain 212 | // 213 | this.AllowDrop = true; 214 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 215 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 216 | this.ClientSize = new System.Drawing.Size(809, 387); 217 | this.Controls.Add(this.pbImage); 218 | this.Controls.Add(this.pnlLeft); 219 | this.DoubleBuffered = true; 220 | this.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 221 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 222 | this.Name = "frmMain"; 223 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 224 | this.Text = "Codemasters BinImage"; 225 | this.Load += new System.EventHandler(this.frmMain_Load); 226 | this.DragDrop += new System.Windows.Forms.DragEventHandler(this.frmMain_DragDrop); 227 | this.DragEnter += new System.Windows.Forms.DragEventHandler(this.frmMain_DragEnter); 228 | ((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit(); 229 | this.pnlLeft.ResumeLayout(false); 230 | this.pnlButtons.ResumeLayout(false); 231 | this.pnlButtons.PerformLayout(); 232 | this.ResumeLayout(false); 233 | 234 | } 235 | 236 | #endregion 237 | private System.Windows.Forms.PictureBox pbImage; 238 | private System.Windows.Forms.OpenFileDialog dlgOpen; 239 | private System.Windows.Forms.SaveFileDialog dlgSave; 240 | private System.Windows.Forms.OpenFileDialog dlgOpenBmp; 241 | private System.Windows.Forms.Panel pnlLeft; 242 | private System.Windows.Forms.ListView lvItems; 243 | private System.Windows.Forms.ColumnHeader chIndex; 244 | private System.Windows.Forms.ColumnHeader chOffset; 245 | private System.Windows.Forms.ColumnHeader chSize; 246 | private System.Windows.Forms.Panel pnlButtons; 247 | private System.Windows.Forms.Button btnImplode; 248 | private System.Windows.Forms.Button btnExport; 249 | private System.Windows.Forms.Button btnBrowse; 250 | private System.Windows.Forms.TextBox tbPath; 251 | private System.Windows.Forms.Button btnExportAll; 252 | private System.Windows.Forms.FolderBrowserDialog dlgSaveDir; 253 | } 254 | } 255 | 256 | -------------------------------------------------------------------------------- /CodemastersBinImage/frmMain.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Drawing; 4 | using System.Drawing.Imaging; 5 | using System.IO; 6 | using System.Windows.Forms; 7 | using WinImploder; 8 | 9 | namespace CodemastersBinImage 10 | { 11 | public partial class frmMain : Form 12 | { 13 | byte[] rom = null; 14 | string romPath = string.Empty; 15 | List> itemsList = null; 16 | 17 | public frmMain() 18 | { 19 | InitializeComponent(); 20 | } 21 | 22 | private void LoadFile(string fileName) 23 | { 24 | btnExportAll.Enabled = false; 25 | 26 | romPath = fileName; 27 | tbPath.Text = Path.GetFileName(romPath); 28 | 29 | lvItems.Items.Clear(); 30 | pbImage.Image = null; 31 | 32 | rom = File.ReadAllBytes(romPath); 33 | itemsList = ImploderWork.FindImploded(rom); 34 | 35 | if (itemsList == null) return; 36 | 37 | int i = 0; 38 | while (i < itemsList.Count) 39 | { 40 | Tuple pair = itemsList[i]; 41 | 42 | int offset = pair.Item1; 43 | int size = pair.Item2; 44 | 45 | byte[] data = new byte[size]; 46 | Array.Copy(rom, offset, data, 0, size); 47 | 48 | BinImageData bid = new BinImageData(data); 49 | 50 | Bitmap image; 51 | bid.ImageAndMask(out image); 52 | 53 | if (image == null) 54 | { 55 | itemsList.Remove(pair); 56 | continue; 57 | } 58 | 59 | image.Dispose(); 60 | 61 | string[] row = { string.Format("{0:000}", i + 1), string.Format("0x{0:X6}", offset), string.Format("0x{0:X4} ({0:00000})", size) }; 62 | var lvItem = new ListViewItem(row); 63 | lvItems.Items.Add(lvItem); 64 | 65 | i++; 66 | } 67 | 68 | if (lvItems.Items == null) return; 69 | 70 | btnExportAll.Enabled = true; 71 | 72 | lvItems.Items[0].Focused = true; 73 | lvItems.Items[0].Selected = true; 74 | lvItems.Select(); 75 | } 76 | 77 | private void btnBrowse_Click(object sender, System.EventArgs e) 78 | { 79 | if (dlgOpen.ShowDialog() != DialogResult.OK) return; 80 | if (!File.Exists(dlgOpen.FileName)) return; 81 | 82 | LoadFile(dlgOpen.FileName); 83 | } 84 | 85 | private void btnExport_Click(object sender, System.EventArgs e) 86 | { 87 | if (lvItems.SelectedIndices.Count == 0) return; 88 | if (rom == null) return; 89 | if (itemsList == null) return; 90 | 91 | int index = lvItems.SelectedIndices[0]; 92 | int offset = itemsList[index].Item1; 93 | int size = itemsList[index].Item2; 94 | 95 | dlgSave.FileName = Path.GetFileName(Path.ChangeExtension(romPath, string.Format(".{0:000}_{1:X6}.bmp", index + 1, offset))); 96 | if (dlgSave.ShowDialog() != DialogResult.OK) return; 97 | string imageName = dlgSave.FileName; 98 | 99 | byte[] data = new byte[size]; 100 | Array.Copy(rom, offset, data, 0, size); 101 | 102 | BinImageData bid = new BinImageData(data); 103 | 104 | Bitmap image; 105 | bid.ImageAndMask(out image); 106 | 107 | if (image == null) return; 108 | 109 | image.Save(imageName, ImageFormat.Bmp); 110 | MessageBox.Show(string.Format("{0}{1}File: \"{2}\".", 111 | "File successfully converted to bitmap!", 112 | Environment.NewLine, 113 | Path.GetFileName(imageName) 114 | ), "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 115 | 116 | image.Dispose(); 117 | 118 | lvItems.Select(); 119 | } 120 | 121 | private void btnExportAll_Click(object sender, EventArgs e) 122 | { 123 | if (rom == null) return; 124 | if (itemsList == null) return; 125 | 126 | dlgSaveDir.SelectedPath = Path.GetDirectoryName(romPath); 127 | if (dlgSaveDir.ShowDialog() != DialogResult.OK) return; 128 | string saveDir = dlgSaveDir.SelectedPath; 129 | 130 | for (int i = 0; i < itemsList.Count; ++i) 131 | { 132 | int offset = itemsList[i].Item1; 133 | int size = itemsList[i].Item2; 134 | 135 | byte[] data = new byte[size]; 136 | Array.Copy(rom, offset, data, 0, size); 137 | 138 | BinImageData bid = new BinImageData(data); 139 | 140 | Bitmap image; 141 | bid.ImageAndMask(out image); 142 | 143 | if (image == null) return; 144 | 145 | string imageName = Path.Combine(dlgSaveDir.SelectedPath, 146 | Path.GetFileName(Path.ChangeExtension(romPath, string.Format(".{0:000}_{1:X6}.bmp", i + 1, offset))) 147 | ); 148 | image.Save(imageName, ImageFormat.Bmp); 149 | 150 | image.Dispose(); 151 | 152 | Application.DoEvents(); 153 | } 154 | 155 | MessageBox.Show(string.Format("{0}{1}Directory: \"{2}\".", 156 | "All files successfully exported to directory!", 157 | Environment.NewLine, 158 | dlgSaveDir.SelectedPath 159 | ), "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 160 | 161 | lvItems.Select(); 162 | } 163 | 164 | private void btnImplode_Click(object sender, System.EventArgs e) 165 | { 166 | if (lvItems.SelectedIndices.Count == 0) return; 167 | if (rom == null) return; 168 | if (itemsList == null) return; 169 | 170 | int index = lvItems.SelectedIndices[0]; 171 | int offset = itemsList[index].Item1; 172 | int size = itemsList[index].Item2; 173 | 174 | dlgOpenBmp.Title = "Select your image Bitmap..."; 175 | dlgOpenBmp.FileName = Path.GetFileName(Path.ChangeExtension(romPath, string.Format(".{0:000}_{1:X6}.bmp", index + 1, offset))); 176 | if (dlgOpenBmp.ShowDialog() != DialogResult.OK) return; 177 | string imageFile = dlgOpenBmp.FileName; 178 | 179 | BinImageData bid = new BinImageData((Bitmap.FromFile(imageFile) as Bitmap)); 180 | 181 | if (bid == null) return; 182 | 183 | Bitmap image; 184 | bid.ImageAndMask(out image); 185 | 186 | if (image == null) return; 187 | image.Dispose(); 188 | 189 | byte[] data = bid.Data; 190 | 191 | if (data.Length <= size) 192 | { 193 | for (int i = 0; i < size; ++i) 194 | { 195 | rom[offset + i] = 0x00; // clearing space 196 | } 197 | 198 | Array.Copy(data, 0, rom, offset, data.Length); 199 | File.WriteAllBytes(romPath, rom); 200 | 201 | MessageBox.Show("File successfully imploded and inserted into ROM!", 202 | "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 203 | } 204 | else 205 | { 206 | string fileName = Path.ChangeExtension(imageFile, ".imp.bin"); 207 | File.WriteAllBytes(fileName, bid.Data); 208 | 209 | MessageBox.Show(string.Format("{0}{4}{1}{4}{2}{4}File: \"{3}\".", 210 | string.Format("Size of imploded data exceeds original one by +{0} bytes!", data.Length - size), 211 | "Saving in external file...", 212 | "File successfully converted to binary data!", 213 | Path.GetFileName(fileName), 214 | Environment.NewLine 215 | ), "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 216 | } 217 | 218 | lvItems_SelectedIndexChanged(sender, e); 219 | lvItems.Select(); 220 | } 221 | 222 | private void lvItems_SelectedIndexChanged(object sender, System.EventArgs e) 223 | { 224 | if (lvItems.SelectedIndices.Count == 0) return; 225 | if (rom == null) return; 226 | if (itemsList == null) return; 227 | 228 | btnImplode.Enabled = false; 229 | btnExport.Enabled = false; 230 | 231 | int index = lvItems.SelectedIndices[0]; 232 | int offset = itemsList[index].Item1; 233 | int size = itemsList[index].Item2; 234 | 235 | byte[] data = new byte[size]; 236 | Array.Copy(rom, offset, data, 0, size); 237 | 238 | BinImageData bid = new BinImageData(data); 239 | 240 | Bitmap image; 241 | bid.ImageAndMask(out image); 242 | 243 | if (image == null) return; 244 | 245 | pbImage.Image = image; 246 | 247 | btnImplode.Enabled = true; 248 | btnExport.Enabled = true; 249 | } 250 | 251 | private void SizeLastColumn(ListView lv) 252 | { 253 | lv.Columns[lv.Columns.Count - 1].Width = -2; 254 | } 255 | 256 | private void lvItems_Resize(object sender, EventArgs e) 257 | { 258 | SizeLastColumn((ListView)sender); 259 | } 260 | 261 | private void frmMain_Load(object sender, EventArgs e) 262 | { 263 | SizeLastColumn(lvItems); 264 | } 265 | 266 | private void frmMain_DragEnter(object sender, DragEventArgs e) 267 | { 268 | if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true) 269 | { 270 | e.Effect = DragDropEffects.All; 271 | } 272 | } 273 | 274 | private void frmMain_DragDrop(object sender, DragEventArgs e) 275 | { 276 | string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop)); 277 | 278 | LoadFile(files[0]); 279 | } 280 | } 281 | } 282 | -------------------------------------------------------------------------------- /CodemastersBinImage/frmMain.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 127, 17 122 | 123 | 124 | 226, 17 125 | 126 | 127 | 320, 17 128 | 129 | 130 | 17, 17 131 | 132 | 133 | 65 134 | 135 | 136 | 137 | 138 | AAABAAEAZGQAACAAIACoogAAFgAAACgAAABkAAAAyAAAAAEAIAAAAAAAgKIAAAAAAAAAAAAAAAAAAAAA 139 | AAAhIij/IiIo/yQjKf8jIyn/IyMp/yMjKf8jIyn/JCMp/yMhKP8hICb/Hx4k/xsbIf8YGB7/Fxgd/xcX 140 | Hf8WFhz/FhYc/xYWHP8WFhz/FhYc/xYWHP8WFhz/FhYc/xYWHP8WFhz/FhYc/xYWHP8WFhz/FhYc/xcX 141 | HP8ZGBv/GRcd/xkXHf8ZGBz/Fxcc/xYWHP8XFhz/Fhcc/xYXG/8WGBz/Fhcc/xYXHP8WFxz/FRcb/xUX 142 | G/8VFhr/FRUa/xQVGv8WFhz/FxYd/xYWHP8WFhz/Fxcd/xcYHv8XFx3/Fxgc/xkZHv8aGR//Ghog/xwc 143 | If8eHSL/Hh4i/x0eI/8eHiT/Hx8l/yAfJf8gICb/ISIn/yMkKf8kJSr/JiYr/ycnLP8nJi3/JiYs/yYm 144 | LP8mJyz/Jyct/yYmLP8mJiz/JiYs/yYlLP8lJSv/JSUr/yUlK/8lJSv/JCQq/yQkKv8kJCr/JCQq/yQk 145 | Kv8kJCr/JCQq/yQkKv8kJCr/JCQq/yQjKf8jIyn/IyMp/yMjKf8jIyn/Iygr/yMnKv8jJSr/JCYq/yQl 146 | K/8jKCv/JSkr/yQlK/8jJyv/IyYp/yEjKP8fICX/HB8i/xoeIf8aGh//GBke/xgZHv8YGB7/GBge/xgY 147 | Hv8YFx3/GBcd/xcXHf8XFx3/Fxcd/xcXHf8YFx3/GBcd/xcXHf8YFx3/GRgd/xkYHf8YGB3/GBkd/xcY 148 | HP8XGB3/Fhge/xYZHv8WGR7/Fhof/xYZH/8WGR//Fhgf/xYZH/8WGR//Fhog/xYaIP8WGR7/Fhod/xca 149 | Hf8YGR7/GRsf/xsdIP8bHyL/GyEi/xwhIv8dIyL/HyMk/yAiJv8hJCb/Iico/yQoKf8kKCr/JCkr/yUp 150 | LP8lKSz/Jisu/ycrLv8oLi7/KS4v/youL/8qLzH/Kiww/yorL/8qKi//Kikw/ykqL/8pKS7/KCku/ykp 151 | L/8oKS7/KCgu/ygnLf8nJy3/Jyct/yYmLP8mJiz/JiYs/yYmK/8lJSv/JSUr/yUlK/8lJSv/JSUr/yUl 152 | LP8kJSv/JCUq/yQkK/8kJSr/JCUq/yM3MP8kNS3/JC8q/yQ2K/8mMC3/Jz0u/yU3LP8mOS//JD4v/yQ1 153 | LP8kLyr/Iywp/yAxJ/8eLiX/Hici/x4mI/8dIiT/HR8k/x0fIv8cHiL/HB0i/x0cI/8dHSL/HB0i/xwe 154 | I/8cHCL/HBwi/xwcIv8bHCH/Ghwi/xkcIf8ZHCH/GBwh/xgbIP8YGyD/GBsg/xcbIP8YHCH/GB4j/xcf 155 | Jv8XHib/GCAk/xgiIv8XICb/Fx8o/xohJ/8YHyT/FyEk/xgjIv8ZKSH/HCkj/x4lJf8eLyX/Hzgo/x82 156 | J/8gNSj/ITsr/yM7Lf8lOC3/Jjku/yY+MP8nQjH/KEEx/ypDMv8qRjX/K0k1/ypINf8pSDX/K003/ytF 157 | Nf8rTTf/K0g3/yw8Nf8sOTX/LTo1/y02NP8tMTP/LDQ0/ysxMv8rLzL/Ky0z/ysvM/8rLTH/Kiov/ykr 158 | MP8pLDL/KCww/ygsMP8nKi//KCgv/ycqL/8nKi//Jikv/yYpLf8mKi3/Jiwt/yYsLP8lKSz/JSos/yUp 159 | LP8kQjL/JEMs/yZBLf8kSy7/J0Ev/ylOLv8nRi//KlU0/ydUMv8lRi7/Jzwu/yU9Lv8kQi3/JDwr/yM8 160 | Kv8jOyv/JCwr/yMuK/8kLSv/JCwq/yQqK/8kKyr/JCgp/yQqK/8kKSr/IyQp/yMkK/8iJSr/IiUp/yIl 161 | Kf8gJSn/HiEm/x0fJP8cHyT/GyAk/xkfJf8ZHif/GR8n/xkiJ/8YIyv/GSQu/xglLP8YKyT/GCwl/xgl 162 | Lv8ZJCf/GCUm/xgnKf8bLCn/HDQl/x5FKv8hQCv/Iz0p/yFTL/8jUy7/JEws/yRQM/8kUDT/JlE0/ypU 163 | Nf8qVTb/KVc3/ytaN/8rXzn/LGc//ytnPf8rZz7/Lm9C/y1sP/8ubkH/L3NA/y5fOv8vVzj/LVA5/y1R 164 | OP8wQDj/L0E4/y9IOP8vPjb/Lzg3/y81OP8uPDb/LjU1/y4yM/8tNDP/LDYz/yw1NP8sMTX/KzE0/ys0 165 | M/8qNDP/KjA1/yoyMv8pMS//KTIw/yg3L/8pNDD/KDQw/yg4L/8oMTD/JU4y/yZNL/8nVTH/J1Qx/ylW 166 | M/8nWTP/LF03/yxnOP8rYDX/KFYx/ylRMv8qVTP/KUwy/ylNMv8pWjX/KlE3/ys/Nv8qSzX/KkU2/yw8 167 | Nf8rQDT/Kz4x/yw+Mv8sPDH/LTAx/y0wMv8sOTP/KzU0/ywwM/8rLzL/KjAx/yksKv8nJir/IyUq/yIn 168 | Kv8fJiz/HiQt/xwjKv8bJCr/GyUs/xsmLv8aJTD/GSgt/xkyIv8ZLCr/GSgs/xouKP8dKin/HjYo/yE9 169 | Kf8kRSz/Ilox/yRUMP8mWDD/JmIz/yVZMP8mWTL/J103/ydgOP8oYjj/KWQ5/ythOv8sZjr/LGw7/y1u 170 | Pf8tbT//L3JB/y5zQ/8ueUX/MIVI/y+BSP8wbED/M3JC/zFlP/8xYkD/M08+/zJfQP8yXD//MU86/zNK 171 | PP8xTjr/MFI5/zFIPP8xSTn/MUM0/zA/N/8xOzr/MEM3/y5INv8uPjb/LzY3/y42Nv8sQjL/LD40/ys+ 172 | Nf8qRDP/Kj8z/ypAMv8oSTH/KT0y/yhdN/8oWjX/KF83/ypYM/8tYTj/KmU5/y9nPv8uaz3/LWQ6/y1k 173 | Ov8uZTz/LWE7/y1cO/8uZz7/MG9B/zFgQf8vUz//MGJD/y5WPv8wTzr/MVs//zBQOf8wTTn/MkE2/zI6 174 | Nv8xSDf/L0s4/zE5Ov8xODb/Lzs0/y86Mv8tMy7/Li0w/yssMP8oLzD/JzEw/yMrLf8hKCv/Hykp/x0p 175 | K/8eJin/HSgr/xskL/8bMib/GzMk/x0rKv8dNCf/IDIr/yI4K/8iRCz/JEMr/yVLLv8kWDD/J1cu/yRZ 176 | Mv8mVi//JlYu/ydYM/8pWDT/KF03/yhgOP8tYjf/K2Y6/ylpO/8qbD7/Lm1B/y9uPv8tb0H/L3dG/zCB 177 | SP8uekf/M3lI/zOASf80bkP/M2pF/zNrQ/82c0j/NWBD/zVcPv82V0D/NGA+/zRYO/80WDz/NVA5/zVK 178 | Ov81SDv/NE07/zRUO/81RD3/NDo9/zM7Of8xSDX/L0w4/zBHPP8uSzj/LVA1/y1INv8sSDf/Klc2/ytN 179 | NP8rYzz/LmM6/y5iPP8uXzv/L2I8/y9lPP8waT//MG1A/y1sPv8xb0H/M3BD/zFrRf8wbUP/M3VF/zR8 180 | S/80cUf/Ml5B/zZwS/82a0j/NWhF/zRjQ/8xYUP/M1pA/zVIOv8zTTn/MFc6/zNEOP81NDj/Mj82/y9D 181 | Mf8vPTH/MDIx/y8uMf8sLzD/Kjcw/yk0Lv8nLi7/JCst/yEvKf8gLCr/ISkp/yArJ/8eKSn/HDIl/x41 182 | I/8fLCj/HzQm/yA0Kf8hNyr/IT0o/yFCKv8jQCr/I0Ip/yRIKv8iTCz/JEws/yRNLP8kTyz/J08u/yVS 183 | M/8mVDT/KFY0/ylXNf8oXDb/KWA5/yxgOv8sYzr/LmY9/y9sQf8wcEL/MW5C/zN8SP8xe0b/MnNH/zNs 184 | SP83dUr/OXtJ/zlkQ/85ZUP/O11C/zxgP/85Wz3/OVo9/zpSO/84Wjz/OVc6/zZdP/84UED/OUM//zZN 185 | P/82Uzz/NV85/zVRPP8zUzz/MVM4/zNcOv8xVTr/M1w8/zBiPv8wWjr/MGI9/zNlPv8zZz7/Mmk+/zBp 186 | QP8ybD//NG1A/zRxQv8xcED/M3JD/zZzRf83ckn/NXhL/zaATf80g03/NYFR/zhxSf86fE//OXRN/zVx 187 | S/83bkn/Nm5I/zZhQ/8zUT7/MVU7/zBPOf8zOTf/MTc0/y1DNf8rQjL/Kzgw/y0tLv8rKyz/KDMr/yg3 188 | LP8oLiv/Jy4s/yUrK/8hMSj/ISop/yEpKP8gLyb/Hyon/x0wI/8dMCP/HSol/x4zJP8eMCT/HzUl/x4y 189 | JP8dOiT/HTcl/x43JP8eOSP/Hzsk/yA+Jv8gQCX/IkEn/yFDKf8iRiv/I0gu/yRJL/8lSzD/Jk4x/ydR 190 | Mf8nUzH/J1Qz/yhWNP8rWTb/K104/y1jOv8saz3/LWg9/zFqRP8za0L/M3pD/zd3Q/85a0X/Om5F/zto 191 | Qf8+YEH/PGJD/z1dQf9AZT//P2g//z1kQP9AZz//PlY+/zpeP/86XUH/PGRA/zlnQP88WD7/OmE9/zdg 192 | Ov84Zz//NWJA/zZzRf80bkL/Nmk//zNoQv81akH/NW1B/zZyQf81dET/N3RF/zl2Rv84dkf/OnZD/zl4 193 | Sf87eUv/OntK/zl6S/86g0//OIpS/zmFUf85fVL/OYNV/zl2Tv82dk7/NHFK/zFuRv8vXD//LlM//y5N 194 | Of8tQTP/LTkw/ys8MP8rRjP/KT8w/yczLf8lKiv/Iigo/x4rJf8bJCP/HCEi/xoiIf8aHyD/GCMh/xgd 195 | If8YHyL/Gicj/xsoJf8bKiT/HCwk/xwtJP8eMyT/HTAi/xsxIv8aKyD/Gi0g/xoxIP8bMyH/HTQi/xw0 196 | I/8bNST/GzQk/xsyJv8ZMSX/GDEq/xgwJ/8YMCT/GDIj/xkzI/8bNCj/HDgt/x09Lf8iQy//JEcw/yZO 197 | Mf8pVDP/Klc1/ypYN/8tVzn/LWE6/y5rPP8xYj3/M2hD/zZtRP85YkP/PGdJ/z9xSv8/aUP/QHVE/0Js 198 | R/9Ac0j/Q21H/0VlRP9Ab0T/QGVH/0F1R/88a0b/QG5F/z11Rv89cEX/PHRJ/zt3Sf87hU7/OXlI/zd3 199 | SP84bUb/Om5G/zlxRf87cUf/OndJ/zt8Sv87fUr/PH5L/z2CS/88hk3/PIVP/zuGT/88gk3/PIVN/zyS 200 | VP87iFD/OoVS/zuEU/83eE3/MmxF/y9pQv8rYj//KFI6/yhGNP8mQS7/KEAs/yQ0Kv8dLSX/FyUe/w4W 201 | E/8JDAv/BgcE/wQEAP8BAgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wECAP8EBQD/BQcE/wYK 202 | CP8JDw3/DhgV/xMhHP8WKR//Giwh/xosIP8WJyD/EiAd/w8YF/8KEBD/BgwK/wUHBf8DBQL/AgIA/wEA 203 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAwD/BQcD/wYMCf8KExD/EB4a/xYuJv8dPC7/JUk0/yZQ 204 | NP8mUTT/KlA2/yxbOf8uXD3/M15A/zdySf8/b0z/QmxJ/0F+TP9EdEz/R35O/0V1Tf9Gdkv/RHhM/0R/ 205 | T/9EfUz/QHhM/0GETP9Ah1D/QH9Q/0J8Tv8/iVL/PJNX/zyIT/8+gk3/OnVI/zlyRv9Ackj/PGpF/z56 206 | S/88hk3/PYVM/z6GS/88jVL/PY1R/zyRUP89j1H/PI5S/z+OUv8/lVj/Po5W/0CHUf86g0//NXBI/y5e 207 | Pv8pVzn/Jk4y/yVDL/8iOyn/IUAs/xMkHP8FBgb/AAAA/wAAAP8AAAD/AAAF/wIBFP8EAyD/BQQw/wYG 208 | OP8HB0D/CQhH/wkISP8IB0L/BgY6/wYGNf8FBC3/BAMe/wICFv8AAAn/AAAA/wAAAP8AAAD/AgMD/w0V 209 | E/8MExb/AgIE/wAAAP8AAAD/AAAB/wEADP8CARj/BAMi/wUFMP8GBjf/Bwc//wgJRf8JCUf/CQhH/wcI 210 | Qf8GBjj/BQUw/wQCIP8CABP/AAAE/wAAAP8AAAD/AAEA/wcNDv8YLSb/IkQv/yJBLv8lSTH/KEw0/y1U 211 | Of8yYED/OGNE/z9vS/9CgVP/R35Q/0mHVf9IgVb/R4FV/0iJV/9Hi1j/RoFQ/0SHVf9DjlX/RJNc/0OJ 212 | Vf9CiFT/QpBX/0CWWP9AjlL/Po1R/1SKWf97r4b/e7WS/26gbf89iE7/P49T/0CPUf9AkFH/P5FU/z+R 213 | U/8+lVT/P5VT/z+TVP9ClFf/QZhb/0KSWP9AhlL/OHxJ/zNoQP8rVTX/JUgu/yFBK/8eOyf/Hzgn/xMl 214 | G/8AAAD/AQEJ/wYFO/8JCmb/DA2H/w4Qn/8QEq//EhO6/xQVxf8WF8z/GBjR/xgY1f8ZGdb/FxjU/xYX 215 | 0P8VFsr/FBTE/xITu/8QErD/DxCj/w0Oj/8KC3P/BwdK/wEACP8AAAD/AAAA/wICD/8ICFX/Cgt3/wwO 216 | kv8QEKT/EBKx/xITvP8UFcX/FhfM/xgX0f8YGNX/GRnV/xgY1f8WF9H/FhfM/xUVxv8SFLv/EBKv/w8Q 217 | n/8NDob/Cgpj/wYFNf8AAAT/AgED/xgrJ/8gOyz/IDwr/yNALP8mSDD/LFE3/zNdP/88cEr/Q4JV/0iF 218 | V/9Jjl3/So1d/0uPYP9KkmH/SIpY/0iLWP9Ijlz/R5Jd/0abZf9Gllr/RZVX/0OWV/9Bmlv/QZpY/0GY 219 | V/93n2z/mcmh/4TLqv+AtX3/P45T/0GUVf9Cl1X/QJhV/0OUVf9BmFf/QZhW/0OZVv9DmFb/Q5lY/0SY 220 | WP9Fllf/QYxU/zp+S/8yaD7/KVUy/yRILP8gPyr/Hzwn/x05Jv8GCwj/AgAG/wsNhP8OELf/DxG3/xER 221 | uv8SErv/ExO+/xYVw/8XF8f/GBjM/xoZ0P8aGdP/GhrT/xoZ0/8ZGdH/GBjO/xcXyv8VFsf/FBTC/xMT 222 | vv8RErv/EBG4/w4Psv8DAx//AQEA/wAAAP8FBTT/EBG7/w8RtP8QEbf/ERK6/xMTvf8VFcL/FxfH/xgY 223 | zP8aGdD/GhnT/xoa0/8aGdP/GRnR/xgYzv8XF8r/FhbH/xQUw/8TE8D/ERK9/xARuP8PELX/Cwtz/wAA 224 | AP8LExX/ITst/yA6K/8iPiz/JUYv/ytPN/80XT//PHJL/0SFWP9Kil7/TJJl/02UZv9Nk2j/SpZn/0qS 225 | YP9LlF7/SJdf/0eZY/9HnWb/R5dh/0iZXP9EnVv/Q59d/0KeXf9DnF3/icmu/5rAkf9YklP/RI1V/0OX 226 | WP9ElFT/RJRV/0SWVP9HllT/RZlY/0SZWf9Fmln/RppT/0acVf9ImFj/R5ZY/0OSVf8+h0//NXRE/y9k 227 | O/8qVTL/JUsv/yVGLf8fPSn/AwYA/wQCIv8OD63/Dg+q/w8Qrf8REbT/FBO8/xYVw/8YF8r/GRnR/xoa 228 | 1/8cG9z/HBzf/x0c3/8cHN//HBze/xwb2/8aGtf/GBnS/xcXy/8UFcT/ExO7/xARsv8OD6j/AgIY/wMC 229 | Bv8CAgH/BAQs/w4Qr/8PEKz/EhG1/xMSvP8VFcL/FxfK/xkZ0f8aGtb/HBvb/xwc3/8dHN//HBzf/xwc 230 | 3v8bG9v/GhrX/xkZ0v8XF8z/FRXE/xMTu/8QEbH/DhCs/wwOpP8BABL/BwwL/yRCM/8mRTH/KEg0/ytS 231 | N/8xXT7/N21I/0B+Uf9Iilv/TJJg/06SY/9Pkmf/S5Rm/0yTZv9LmGb/Sppj/0mfYf9HnmP/R51k/0ma 232 | Zf9JmmP/RqJj/0WhXP9Fnlv/Rp1c/3u+iP9qrHL/To1T/0uUWf9Io2P/SZZc/0iSVP9JnFv/SZxd/0WZ 233 | Vv9EmFn/Rpla/0iZVf9Imlb/SZxX/0ibVv9JlFT/RY9Q/z6CSf85dUT/M2g9/zBeOf8tWDf/KE4z/wUJ 234 | Af8CARz/DQ+m/w8Qrf8QEbL/ERK5/xQUwf8XFsn/GhnS/xsa2f8cG97/Hhzi/x8e5f8gHeb/Hx3m/x8d 235 | 5P8eHeP/HRzf/xwb3P8ZGdX/FxjO/xUVxP8RErv/DxCp/wIBEv8FBwn/BAYE/wMCJP8OEK//EBCx/xIS 236 | uf8UFMD/FhfI/xkZ0f8bGtn/HBve/x4c4v8fHuX/IB3m/x8d5v8fHeT/Hh3j/x0c3/8bG9z/GRrW/xgY 237 | zv8VFcX/EhO5/w8Rs/8ND5z/AQAM/woSEP8tUj3/L1U7/y9eP/80ZEP/OW9K/z5+Uv9FhVf/So1c/0yW 238 | Yv9KnGf/Sqtq/0yhZf9JnmT/SaVp/0ydZv9Kn2X/S6Fl/0uhZP9Jn2b/SJ5o/0ejZv9HoV7/RZ9b/0Wk 239 | Xv9UoV7/Tqpj/1SUVv9Qn2H/Taxq/02WXv9LmV3/SaRi/0iWW/9ElVr/R5ld/0iZWv9KlFf/SpdX/0mZ 240 | V/9LmFT/TpVW/0ySVf9JjVH/Q4ZO/0B/TP89d0n/Om9A/zl5Sf8NHRH/AAAH/w0Omv8PELH/EBGz/xMT 241 | vP8VFcX/GBjO/xoa1/8cG97/Hx3k/yAd5/8gHuj/IB7p/yAd6f8gHuj/IB7o/x4d5v8dHOL/HBvd/xka 242 | 1v8WF8v/ExTC/xAQp/8BAAr/CA0N/wcKCf8CARr/DhCr/xARtf8TE7v/FhXE/xkYzf8bGdb/HBve/x4d 243 | 5P8fHuf/IB7o/yAe6f8gHen/IB7o/yAe6P8eHeb/Hh3i/xwc3v8ZGtb/FxfM/xQUv/8SErz/DQ6Q/wAA 244 | AP8TIx//OGpG/zloRf87c0r/Pn5S/0GGWf9EmWD/R6dn/0qWX/9OoWT/Satp/0m5bv9Jrmv/R7Jq/0m8 245 | b/9KuXL/SKRq/0qhaf9LoWb/S6Nk/0ikZv9MoWb/TJxg/0qfYP9IpGL/WqNh/1etaP9UqmT/T7dx/0+j 246 | Zf9OmV7/Saxn/0esZf9Hml3/RaVj/0inY/9Jm13/TY5Z/0yRV/9MkVj/TJhX/0uTWv9MhlX/SYZR/0mR 247 | Vf9ElFb/RJBV/0CYWv9Crmj/Hkku/wAAAP8MDXn/DxG4/xARtP8UFL//FxfJ/xkZ0/8bG9v/Hh3i/yAe 248 | 5/8hHun/Hx7r/x8f6/8gH+v/ICDq/yEf6v8hHur/IB7m/x0c4f8cG9z/GRjQ/xUWyf8PEaD/AAAB/w0Z 249 | Ff8KExH/AQAN/w4Ppf8QErf/FBO+/xcWyP8ZGdL/Gxvb/x0d4f8gHuf/IR7p/x8f6v8gH+v/IB/r/yAf 250 | 6/8hH+v/IR7q/yAe5v8eHeL/HBvc/xoZ0/8VFcP/ExTF/wsMav8AAAD/J0c3/0SBU/9EfFD/RohU/0iU 251 | Xf9Jp2f/SL5v/0fDcP9MuG//UaJk/1CZX/9NnmX/SrZt/0m9b/9LwHT/TLBx/0qrb/9Jomf/S6Nn/06h 252 | Z/9Pomf/TaJo/02fZv9KoGT/SKJj/12mZv9cnmD/V6Ni/1KpZ/9PrWv/TL9z/0q7bv9Irmb/R6pm/0eq 253 | Zv9MmGD/T45a/06RV/9OlVf/T5db/0ubXf9XpGf/bK53/2qkb/9Mml//RJ9c/0ihXP9Ds2z/RMBv/zKG 254 | Uf8AAAD/CAdD/xARuP8RErT/FRXB/xgXzP8aGtf/HBvf/x8d5f8gHun/IB7r/yAf6/8gIOv/IiHr/yUk 255 | 7P8oJuv/JiTr/yMh6P8fHuT/HRze/xkZ0/8XF9D/DxCQ/wAAAP8XMST/Eycf/wAAAP8OD5j/ERK7/xUU 256 | wP8YF8z/GhnW/xwc3v8eHeX/Hx/p/yAf6v8gH+v/ICDs/yIg7P8lI+3/Jybs/yYk6/8jIej/Hx7l/xwb 257 | 3/8ZGdb/FhbH/xMUwv8GBTL/AgIA/z52Vf9Lll3/SYxX/0qWWv9MnWH/S69p/0u/cP9MwnP/ULFt/0+b 258 | Xv9Ql17/Sq1s/0y1bf9PoGT/Tbxz/0+ra/9On2T/SaZn/0ynZv9Mpmb/TaNo/0una/9Mp2r/S6Vl/0qk 259 | Y/9eqGX/WqNk/1agZP9Sp2n/TbNw/0y3bv9NqGf/T5lh/02UXP9Nkln/UI1Z/1CQWP9Rjlr/UJZZ/06d 260 | Wv9QpF//otCY/4zlyv+o3LL/Zqtr/0KeW/9Io1//SaBi/0uoY/9Ho1//CxkM/wEAC/8OD6H/ERK5/xUV 261 | wf8ZGM3/GxrX/x0c4P8gHub/IB7p/yAf6/8gH+v/IiHr/yko6/85N+3/Q0Lu/z087P8sK+j/IiDk/x0c 262 | 3v8aGdL/FxfT/w4Oc/8AAAD/J1I5/yJDNv8AAAD/DA6B/xESv/8VFL//GBfM/xoa1v8dHN//Hx7l/x8f 263 | 6f8gH+r/IB/r/yIh7P8oJ+z/Nzbt/0NC7f8+Pez/LSzp/yIh5f8dHN7/GRnV/xcXzv8REqH/AAAA/xQo 264 | H/9PpGv/TaVl/0+fZ/9RmGL/UJdh/0+ZYf9PomP/UaNj/1GcXv9OmV7/T5xh/0uwa/9QnmL/UZhe/06h 265 | ZP9OsWz/S6pm/02nZP9OqWP/Tatk/0ypaP9NqWn/Tqpo/06pZ/9Mqmf/WrFp/1mkZ/9VrW//T7h0/1Cg 266 | Z/9PkVz/TZ9i/0+eYv9Rjlr/UI1Z/1GLW/9QjVv/UJBZ/1CQWf9Pl1v/TZ1d/3W3e/+Ix47/dLt5/06l 267 | YP9Kp2H/S6xk/06kZP9NnmL/Uqto/yZUN/8AAAD/Cwxj/xITwv8UFb7/FxjN/xoa1/8cHN//IB7l/yAf 268 | 6P8fH+r/IB/r/yQk7P84N+3/Xl7x/3h48/9paPH/QEDr/yUl5P8cHNz/GRjP/xcXz/8JCEb/AAAA/zt2 269 | VP8yY03/AAAA/woKWP8REsD/FRS+/xgXzP8aGtX/HBzf/x8e5f8gH+j/Hx/r/yAf6/8jI+z/NTTt/1pb 270 | 7/93d/P/a2vw/0ND6v8mJuT/HR3c/xgY0P8YF9L/CgtW/wAAAP85bFP/Xrt+/1Wtcv9Xq3X/Wahy/1qh 271 | bf9Ynmr/V55p/1edaP9XnGb/VKBm/1eeZv9Xnmb/VaJm/1KoZ/9SqGj/Uqhm/1GrZ/9Srmf/Ua5o/1Ct 272 | bP9Prmz/UK1s/0+vbv9PsWr/TrFp/1uSW/9ZjFn/VpZi/1SgZv9Rl2D/Uo1c/1WNW/9TjVv/Uo5d/1OS 273 | XP9VkV7/U5Rd/1OXXv9UmF7/VJlh/1OfYv9NoGD/T6Bc/0+jXv9Rqmf/U7Nw/1K2b/9Ut3H/VLJy/1a2 274 | df9MoGv/Bw4H/wIAE/8QEaj/FBXC/xcXyf8aGtT/HBvc/x4d4/8fHuf/IB7p/yAe6v8mJez/QkDt/3V0 275 | 8v+Xl/T/g4Py/05N6f8nJ+H/HBvX/xgY0f8UE7L/AAAM/wwaEP9JmGb/RYdi/wcMCP8DARz/EBKy/xQU 276 | v/8XF8n/GhnU/xsb3P8eHeL/Hx7m/yAe6f8gHur/JSPr/z497P9wcPL/l5b1/4aG8v9RUOr/KSrh/x0c 277 | 1/8YGdT/ExSo/wAABv8QGxb/Wqly/16xd/9brHj/Xat4/12od/9dpHH/XKZy/12pdv9bqHD/WaVy/1ik 278 | bf9Zp23/Wahv/1iubv9YsG3/VbBu/1axbf9Us2z/UL1w/1G8df9Us3L/ULt1/1C2c/9Rsm//UbNt/1C2 279 | bP9ZkVr/VpBb/1WMW/9VjVr/UpNa/1GTXP9SkFz/UpZf/1CjZf9SnGD/VZZh/1GlZv9RnmX/Upxk/1Kg 280 | Zf9Uo2b/VKdm/1SqaP9Uqmr/Valq/1aub/9TtXL/VbVx/1Wzc/9Us3L/X718/zVlSv8AAAD/CgpF/xQU 281 | xP8WFsT/GBnQ/xoa2P8cG9//Hh3j/yAd5v8gHuf/JCPp/zc26/9cXO//d3bx/2Zm7f8+PuT/IyLc/xka 282 | zv8WF9P/CwxW/wAAAP8sWD3/T6dp/1CjZ/8lRzT/AAAA/wwNaP8TFMb/FRbC/xgZz/8aGtf/HBze/x4d 283 | 4/8gHub/IR7n/yMj6P81NOr/WVnv/3Z28P9oae3/QEHm/yUk3f8aGtH/FhjL/wgJNP8AAAD/QoRi/2XB 284 | ff9grHT/Yat4/2Kpef9gqHf/X6t3/12ud/9csXb/XLB5/1utdv9brXD/W610/1utdP9ZsHL/WLFy/1W2 285 | cv9Su3L/Ub1y/1G+cP9PwXT/Ub51/1S9dv9Tu3P/Ur5z/1C/c/9Su2//VpJb/1aNXf9Xj13/U5Nd/1KU 286 | Xv9RlWH/Tplg/0+ZXv9RpGb/Ualp/1KgZf9Pq2v/UqJl/1GjZv9SpWj/Ualo/1KsZ/9VrGj/Vaxr/1at 287 | bP9WsXD/VbRz/1e1c/9YtnT/V7V2/1yxeP9er3j/FCUa/wAAAP8PEJD/FRbO/xcXx/8ZGtP/Gxva/xwb 288 | 3v8eHeL/Hh3j/yEf5f8nJuX/NjXo/0FA5/85OeT/KSje/x0c0f8XGdb/EROd/wAAAP8NFw//S5Na/0+X 289 | YP9QnWH/Rotd/wcMCv8BAAj/ERGk/xUWyP8YF8f/GRnT/xsb2f8cG97/Hhzh/x4d4/8gH+X/Jibm/zQ0 290 | 5/9BQOf/Ozvk/yop3v8dHdD/GRnZ/xASiP8AAAD/Hj8y/2HGhf9gt3f/YrZ7/2O0f/9itID/YrN8/2Cz 291 | e/9etXz/W7l7/1u3fP9cs3f/W7J4/1qzd/9YtHb/WbR1/1m0dP9VuXf/Ur51/1PDdf9SwnX/U7x1/1K9 292 | df9UvnX/VcB3/1TBc/9Rv3H/VLxv/1OSXf9SkV//UpNd/1KUXf9SlF//UZpj/0+nZ/9Tp2r/U6Rm/1Kq 293 | aP9Qqmr/U6pq/1Ovbf9StG//UbNs/1KwZ/9Ss2z/VrBs/1iyb/9WtG7/VbVy/1S1cf9St2//UbNu/1Cv 294 | bf9Op2v/Uq1q/0CIUv8DBQD/BQMb/xMTrv8XF8z/GBfJ/xka0/8aGtj/HBvc/xwc3v8dHN//Hx7g/yIh 295 | 4P8jI9//IiDa/x0b0f8ZGdj/ExSz/wQDHf8BAAD/O3FL/1GbYP9Oj17/TZBi/1Cfaf8yYEj/AAAA/wUF 296 | Lf8TFLn/FxfM/xgYyf8ZGdL/GhrY/xwb3P8cHN7/HRzg/x8d4f8hIeD/IiPf/yEh3P8dHNL/GRrY/xMU 297 | qf8CAA//CBIN/0aqaf9Pum7/UbBp/1izc/9YtHn/XLV6/2C5f/9huIL/YrqE/1+8gf9dvH//W7l//1u3 298 | f/9YuXr/Vrt5/1a7eP9UvHf/U7x6/1W9eP9TvHP/U752/1LBe/9Tv3r/Ur14/0/Ad/9RvXL/VLps/1K5 299 | bP9TlF7/VJRe/1KWXf9Sl17/UJtj/0+eZP9PpGT/Uatq/1Kva/9SrWj/U65q/1Sybf9UtW7/UrRs/1Ow 300 | a/9Vrmb/ULFr/06xaP9Ns2n/Ta5o/0ytav9Jrmj/SKxm/0mnZv9LpWf/S6Jl/0ydX/9RqWb/M2NC/wAA 301 | AP8GByH/FBSv/xcY0v8XGMr/GBjO/xoZ0/8bGtf/GxrY/xoa2P8bGtf/GxvU/xsa1/8ZGtv/ExOj/wME 302 | HP8CAgD/OGhJ/1enbv9RnGT/U5tl/1GdaP9RoWv/Wqxz/zJcRP8AAAD/BgUq/xQTrf8YGNP/FxjO/xcZ 303 | zv8aGdL/GxrW/xsa2P8aGtn/GxrY/xob1P8aGtL/GRnc/xUUp/8EBBb/AQIB/zuKW/9OwXH/SrVn/022 304 | aP9Os3D/TrNt/1Czbv9StHL/VLZ2/1a2d/9Tt3z/U7x+/1e6e/9YuXz/WL19/1i+ff9Yvnz/V797/1W9 305 | ef9Sv3n/Vbx2/1S6dP9Svnn/U714/1W3cv9UuXL/Urpy/1K2bf9Stmr/UpZg/1OWX/9TmGD/Uppi/0+f 306 | ZP9Qo2X/UaVk/1CmY/9RrGj/ULJt/1Cxbf9Qr2r/TbRo/0yxZv9Lq2L/Sqxi/0euZv9GsGX/SK9l/0iu 307 | Z/9Irmf/SbBq/0qpav9MpGb/TKFl/0yiYv9Lnl//TZpf/1qvcv8rTjj/AAAA/wUFF/8QEoz/FxfO/xgY 308 | 1f8YGNP/GBnU/xkZ1/8ZGdn/Ghrd/xkZ2v8WFbf/DAtf/wQDCP8AAAD/Eh0X/y1PNf8eNSP/GS8e/xgr 309 | G/8ZLB7/GjMi/yM+Kf8wVzn/EBoa/wAAAP8EBBD/DQ1q/xQUuP8YGNX/GRjX/xkZ1v8ZGdb/GRnX/xoZ 310 | 2f8ZGdz/GBjS/xAShf8DBA7/AAAA/y1sSP9OyHT/R7lv/0+5Zv9SuGr/VLZ0/1O4cv9Tt3L/VLZz/1G5 311 | cf9QuHH/Srt0/0bCdP9LtG3/TLRu/025dv9NvHj/Ubp3/1S7ef9SunX/Ur12/1W+eP9Xu3X/Vbd0/1W5 312 | cv9Vt3L/U65w/1aobf9Xpmv/Va1s/1SXX/9SmWD/Upth/1CaY/9NoWP/S6ho/0uoZP9NpWL/SaZj/0qq 313 | Yv9KqGL/SKtk/0itZP9Iq2T/SK5k/0eyZP9Hr2P/Sq9m/0qtaP9Iq2X/Sqpn/0mraP9JpmT/TKJh/02s 314 | af9Trm7/WK1x/2Gudv9osXv/a7N9/zlVQf8BAQP/AAAA/wcGNf8QEIH/FBSo/xQVsf8UFLL/ExOm/xAP 315 | hf8KCUj/BAMM/wAAAP8AAAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/AQAA/wAAAP8AAAD/AAAA/wAA 316 | AP8AAAL/AAAB/wEBAP8FBBL/CgpQ/xAQi/8TE6j/FRS2/xUWtv8UFan/EBF+/wYGLf8AAAD/BAcK/0B9 317 | XP9o2I//XMN6/1PGdf9OwnD/Ublu/0+7b/9Qvm//Urtw/1G6cP9Qu3D/UL1y/1G7cP9KwXP/Sbpv/0a6 318 | bv9Gu3P/RLp0/0m2df9LtnP/SbZs/0y2bf9Os27/TrRx/066df9Qs3L/UrRz/1SudP9Um2r/WZ5p/1ug 319 | ZP9PmF3/T5ld/0yhYv9Js2v/SKtk/0e8av9GtGj/SKhm/0moZP9JqmP/Satm/0mtZf9JrGX/SK9o/0ey 320 | Z/9HtWj/R7Fo/0isZ/9Jqmb/SqVi/0yiYv9Mo2X/U6Nk/12pbv9jrnf/aLZ+/2m0fv9psXv/aaN0/2yc 321 | c/91rn//ToNe/xQnGv8BAQD/AAAA/wAAAP8BAQb/AwIJ/wMCAv8BAAD/AAAA/wAAAP8GBgj/HhoY/zYv 322 | Kf9LQzv/YFVL/2xfVf9yZlv/d2pg/3hrYv92amL/cGZe/2RcVP9NRkH/NS8s/xkWGf8CAgf/AAAA/wAA 323 | AP8CAQD/AwME/wICC/8AAAX/AAAA/wAAAP8DAwL/IT4x/1Opef9o1pH/Y9GM/2jPi/9qzIT/ZsmB/2DI 324 | gP9XxXf/TsJx/0m9cf9IvHL/Rr9w/0jCcv9IwHL/R8J0/0S+c/9ExHT/R8F3/0a9df9HtHP/R7Rv/0ey 325 | bv9JsG3/Ta5s/0ytbP9JvXP/S7lz/0uvbv9It3D/b7J3/4PKnf+CxZ7/Tppe/0ydYP9Kt2v/SMRw/0a+ 326 | bP9Js2n/SK1n/0atZP9IrGb/SKtn/0isZv9IrGX/Satl/0uuaP9Ir2v/RrBp/0iuZ/9Jp2T/TKRg/1Ok 327 | Zv9apm7/Yaxz/2asd/9ppXP/aqh4/2mzf/9ponb/bat6/26re/9olm7/W4Zf/1qVY/9Rn2v/PW5W/zBJ 328 | Qf8vPDj/EBQS/wAAAP8AAAD/AgEE/x4ZGv9IPTj/altQ/35tYP+Hdmj/i3pt/45+cf+RgXP/lIN3/5aG 329 | ef+XiHz/mYt+/5uNgf+ej4P/n5CF/5yOhP+QhHr/dGpj/0ZAP/8TERn/AAAD/wAAAP8DAwb/FSse/x1N 330 | M/8nZET/P5pj/1zPhf9l0oz/Y8+L/2LViv9i0or/ZdCG/2rNiP9pz4z/Yc+M/13Lh/9UxoH/S8V5/0a+ 331 | dP9DvnD/QsNz/0S/dP9GuHH/Rr90/0e2c/9ItnL/RrZw/0a3bf9Jsm7/SLNv/0u4cv9MtHL/SrJu/02y 332 | bf9NrG7/Ratp/4HDhf+d4Lv/l9u5/06cYP9NnV//TaZi/0q9cP9Hu23/SbVr/0ulZv9JqGX/Sqdi/0uo 333 | Zf9JqWT/Saxm/0iqZf9Iq2b/R7Jt/06ta/9Wq2j/WrNy/1+ydv9lr3X/Zq54/2atdv9npnX/aKR1/2ql 334 | d/9toHn/b5p1/2ePbv9bjGf/UX9c/1F4WP9UdV3/Un9o/2iWgP9um4f/NUQ//wUHB/8IBgb/OzMt/2JU 335 | SP98alz/h3Rm/4l3Z/+LeWr/kH1v/5WCdP+ah3n/nYx+/6CPgv+jkoX/ppWI/6iXiv+pmYz/qZqN/6mZ 336 | jf+omI3/p5mN/6iajv+mmo//kod9/3BoYf8wLSz/AAAA/wwdE/8zgE7/TdB5/0XCcv9DuWz/S79x/1XH 337 | e/9hzof/Z9CM/2XOjP9h0Y//Xs6N/1/Oiv9gy4r/YMuL/2DLif9cx4T/VMN+/1DBev9JuHX/RrVu/0a2 338 | cf9IsW7/Saxs/0mxbP9JsWr/SK5o/0ira/9IrGz/SrJw/0qxcv9MrGj/Talq/0mxbf9KsW3/Yaxq/5/F 339 | jv9NoGD/TZ5h/1Graf9Nq2f/S6Zj/0e5av9Lpmb/S6Np/0qkZf9KpmD/Sahd/0umYv9QpWb/V61w/1u9 340 | f/9gtnr/X7d4/1++f/9ks3z/aah3/2mpd/9opnT/a6Fz/22eeP9vmXj/Zo9u/1iDYf9Tdln/UHRY/1N0 341 | Xv9VcmP/WXFl/3GXhv9jgW//FBcU/wAAAP8aFRP/Y1RJ/4FuX/+FcWL/h3Rm/416a/+TgHH/mYZ2/52K 342 | e/+ij4D/p5SF/6uXiv+sm43/r56R/7KhlP+1pJf/uKaZ/7ionP+5qZ3/uamd/7eonP+zpZn/rqGW/6ue 343 | lP+rnpP/pZiO/2FZU/8HBgb/AAAA/x9MLf9Gvm7/R79w/0e7bv9Hu27/SMNy/1jKgf9gzoz/YdGQ/2DP 344 | jP9jy4r/YsiI/2HJif9gxoj/YcWI/2DEhv9gxIH/XcCA/1i9e/9TuHj/TbBx/0iuav9Iq2X/Sahm/0ql 345 | Z/9KpmP/SqNl/0udZv9Lp2r/Srdz/0y0cP9OsWv/T7Nu/0ypaP9qrW7/S59h/0yfZP9NoWT/S6Fi/0ql 346 | Zv9LpWT/S6Zm/0mkZv9KpWb/TaZn/1Ssav9ZtHb/XLV8/1+yff9hs37/YbN4/1+5ef9js3f/Zq12/2Wu 347 | ff9ms3v/a6h4/26dd/9okG3/W4Ji/1F2Wf9Sclj/VHRe/1VzXv9Wcl7/YX1w/3qShP9feWz/Cg4M/wAA 348 | AP83MCn/eGZX/4BtX/+EcWL/jnlq/5SAcf+ahXb/n4p7/6SPgP+olIX/rJeI/66djf+zoZL/t6WX/7mp 349 | m/+9rJ//v66i/8GxpP/Cs6f/w7Sp/8W1qf/Dtan/wbSo/7+xpf+6rKL/tKad/6yflv+sn5b/hn11/yEg 350 | HP8AAAD/Gzsl/0i4bv9JvW//Srht/0m7cP9Hv3D/S8N1/1fGf/9lyIb/asWL/2jBh/9lwYX/Y8CG/2O6 351 | hf9huX7/YLl7/2G3f/9is3z/YbJ6/16veP9arG//Vqhn/1CiYv9Ko2L/SaJe/0qhY/9On2X/TKNn/02o 352 | a/9QpWX/VZ9k/1mkaP9Zp2T/WqVg/1Gqav9PpWj/TKpn/0qjYf9HpWP/Sadn/0+paP9Uq2r/WK5w/1yv 353 | c/9esHX/XLF6/2G8f/9mx4f/ZsCG/2O2gP9ltHz/aLR9/2q+h/9sw4b/brJ8/2KWbv9XhmH/Unpd/1Ry 354 | Wv9UcVv/UIhn/0yIZf9QhWz/ZJF6/3yZjf9gd2v/CAkI/wAAAP9HPTT/f2xd/4FtXf+KdmX/k35u/5iD 355 | dP+eiXr/o41+/6eSg/+rlof/sJuM/7Sgkf+4ppb/u6qc/7+vov/Ftan/y72x/9DFuv/Wy8L/2dDH/9zT 356 | yv/d1Mz/3NPM/9rRyf/WzMX/0Ma9/8i+tf/Atav/sKad/6ygmP+ckYj/MC8q/wAAAP8dOSb/U7Jv/02v 357 | av9Osmz/UrJt/1C1bP9Nt2//VbZx/2K5ev9tvYT/bruE/227g/9xw4X/ccOH/228hP9qrn3/aKl9/2Wy 358 | gf9nu37/abd5/2Stc/9fqG7/Walt/1KnZ/9PpGT/TqBh/06fYv9PomP/VKVl/1mmZ/9fqGb/Za1j/2uv 359 | Y/9RuHL/TrZw/06vaP9NqGj/U6pr/1evbv9bsXH/XLJ0/1ywdP9csHL/XrJ0/2e9f/9aoXL/PGpS/yVA 360 | M/8ZKR//FSQW/xYnGv8hNyz/OFdF/0l3WP9ViWD/Vn5a/1R1Xf9UemP/U3hi/02DZf9WhGn/aJ6D/3eo 361 | kf9pi3z/DhIP/wAAAP9KQDf/gm9e/4JuX/+MeWf/lX9w/52Gd/+gi3z/pI+A/6mUhf+smYr/sp+Q/7al 362 | lv+7q53/xbaq/9DEuv/b08v/5eDa/+zo4//v7en/8u/s//Pw7P/z8e3/8/Ht//Lv7v/x7ez/7+zp/+vp 363 | 5f/n49//39vV/9LMxf+/t7D/sqig/6Wakf8yMC3/AAAA/y1ONf9ou3f/V6lk/1mtZ/9ermf/YK5q/1+r 364 | af9dpmb/Y6lo/3a7eP98uIL/V4hl/zNTQf8gMib/FyMX/xYiF/8bLCP/Kkk5/0RyVv9ipHP/ard5/2Ot 365 | cf9ir3H/YLFw/16tcP9ZqWr/WKhm/1unZP9jqWP/a6xh/3WvYv9+s2L/ULNs/1K8df9aunr/XLN2/1q0 366 | c/9btnT/W7By/1yzdv9dsnb/Y7l5/1ysdf8yWkX/CA0L/wAAAP8AAQD/AAAJ/wAAEv8AAA3/AAAB/wAA 367 | AP8BAgL/HSsm/0ZqVP9ViGv/ToRq/06AaP9flXz/cKKL/3Oei/9zppH/Hi0l/wAAAP9EOjL/hHBg/4Rw 368 | YP+QeWn/l4Fw/52Hd/+ijX3/pZCB/6mVhv+vnI3/taOV/7uqnf/FuKv/183F/+fj3v/v7Oj/8u/r//Hv 369 | 6//w7ur/8e7q//Du6v/x7ev/8e7r//Hu6v/x7er/8O3q/+/s6P/u6+f/7enm/+ro5P/m49//3drW/8/L 370 | xf/AubP/p6CX/yYlIv8AAAD/UnJQ/4HJgP9vsWT/bqhj/3KqYv94p1//caZi/4CwZv9dfEr/GSYf/wEA 371 | AP8AAAD/AAAD/wAAEP8AABH/AAAF/wABAP8AAAD/EBgT/0JuUf9qs3b/Z7Ny/2Swc/9ntnb/arJ1/26y 372 | cv9yr2z/eKxl/32uYf+Er13/j7Bb/1uzc/9euHn/X7J3/12sbv9etXT/Xrp5/120df9euHv/Z8GA/0+N 373 | Zv8PGhj/AAAA/wMDG/8JCmn/DQ2a/wwOr/8NDbb/Dg6y/wwNo/8LC33/BgUy/wAAAP8DBQf/L05F/1mL 374 | c/9lmH//cqOI/3CdhP95r5j/P1dN/wAAAP8vKSP/gm5f/4RwYf+Qemn/mIBx/56Hd/+hjHz/ppKB/6uX 375 | iP+xn5D/uKaY/8O0qP/WzsX/5+Te/+7s6f/u7Oj/7uvn/+7r5//v7Oj/8O3p//Hu6v/x7ur/8u7t//Lu 376 | 7P/y7+v/8e7q//Hu6v/w7en/7+zo/+3q5v/r6OT/6OTg/+Tf3P/e2tX/0s/K/8nGwP+hnZn/Dw4O/wMG 377 | A/+DrHH/ntB9/5a6ZP+RrFn/tLxe/6q3X/80RC3/AAAA/wAAAf8HBkT/DAyK/wwOqP8NDrP/DQ61/wwN 378 | rP8MDJH/CAhX/wIBDf8AAAD/HzEp/2amc/9vu3b/bLNw/3S1cf98tHD/hrVt/5O1av+it2b/sLpi/8C7 379 | XP9gp2//X6hu/2CzdP9gtnX/YLZ1/2C2eP9esXf/aMSB/0iFX/8EBgn/AAAA/woJU/8ODrb/Dg7N/w4O 380 | y/8PDsv/Dg7K/w4Oyv8NDsv/Dg7N/w4Nxf8KCnL/AwML/wAAAP81Tkz/e7Kb/3Khiv90pY//cKaQ/wsP 381 | Dv8OCgn/d2VY/4dyY/+Oemn/l4Fw/56Hd/+gi3z/ppGC/6yYiP+yn5H/u6qc/87CuP/k39n/7evm/+zp 382 | 5f/s6eT/7erm/+7r5//v7Oj/8O3p//Dt6f/x7ur/8u/r//Lv6//y7+v/8u/r//Hu6v/x7ur/8O3p/+/s 383 | 6P/u6+f/7Onl/+rn4//n5OD/5ODb/9zY0//OysX/zsnG/399ef8AAAD/P0Qp/9Dfh//IynX/0cll/9PE 384 | X/89NyL/AAAA/wUGG/8LDI3/DQ3K/w4OzP8NDsr/Dg7K/w4Oyv8ODsv/Dg7L/w4Ozf8NDaX/Bgc5/wAA 385 | AP8SGhj/bqFu/4W7ef+DsXD/jLRw/5i2av+vu2X/wr9k/83CY//RwGL/Y6Nv/2Olb/9hq3L/X7R2/2G4 386 | eP9hsnb/Zrt8/06MY/8FCQn/AgAM/wwLgv8NDsz/Dg7J/w4Oy/8ODtD/Dw7T/w8O0/8PDtP/Dw7R/w4O 387 | zf8ODcv/DQ3C/wcHWv8DBA//AAAA/ztRTP93tZ3/dbue/zRVSP8AAAD/W05D/4t2Zv+OeGn/l4Jx/5yH 388 | d/+hi3v/pZCB/6yYif+zoZL/wLGl/9nQyP/p5+H/6ufj/+nm4f/r6OT/7erm/+3q5v/u6+f/7+zo//Dt 389 | 6f/w7ur/8e7q//Lv6//y7+v/8u/r//Lv6//x7ur/8e7q//Dt6f/v7Oj/7uvn/+3q5v/r6OT/6eXh/+fj 390 | 3v/i3tn/2tbR/8vHw//IxcD/RkRC/wAAAP+xpWP/5NZ//9fKd/9CPSb/AAAA/wYGGv8ICXf/Dg7L/w4O 391 | yf8PDs7/Dw7S/w8O0/8PDtP/Dw7S/w4O0P8ODcr/DQ7L/w4Oxf8KC2P/AAAA/xgeG/+JpXT/nbh5/6m2 392 | cf+3t2v/vLNm/8q9Zv/Qv2P/zr1f/2ekcP9npHD/Zqdw/2Kvdf9is3f/Zbd6/1+tef8MFxP/AAAA/wsM 393 | kf8ODtH/Dg3I/w4O0/8PD9j/Dw/a/w8P2/8PD9v/Dw/a/w8P2v8PD9j/Dw7X/w4Nwf8GB2T/BgZT/wQF 394 | G/8AAAD/V4p8/2mjhf8AAAD/Lici/4x2Z/+MeGn/loFy/56Gdv+hi3z/pI+A/6qWh/+0oZL/w7aq/+Hc 395 | 1f/q5+P/5+Tf/+jl4P/q5+L/6ufj/+rn4//q5+P/6+jk/+3q5v/v6+j/7+zo/+/s6P/u6+f/7uvn/+/s 396 | 6P/w7en/8e7q//Hu6v/w7en/7+zo/+7r5//t6ub/7Ojk/+vn4v/o5N//5eHc/+Dc1//W087/z8rF/7Gs 397 | p/8GBgj/LSga/8m1fP9dVD//AAAA/wkHL/8FBVP/CQh5/w4OzP8PD9b/EA/Y/xAP2/8PD9v/Dw/b/w8P 398 | 2/8PD9n/Dw/Y/w8O0f8NDsj/Dg7Q/wwLbP8AAAD/MjMr/6uwd/++rmz/uKFj/6WOWP+ok1j/taJa/8az 399 | Xf9ooXD/aaVx/2enb/9kqG//ZKZw/260fv81WUb/AAAA/wkKX/8ODs3/Dg3H/w8O0/8QD9j/EBDb/xAO 400 | 3P8QDtz/EA7c/xAO3P8QDtz/EA/a/xAP3P8ODsX/Bwdc/wcGYP8ICGL/AAAA/x4vLf8tST//AAAA/2VX 401 | S/+Qe2v/k39u/5uHdv+gi3z/pI+A/6qVhv+wnY7/wrOn/+Hd1v/n5eD/5eLd/+Xi3f/m497/7Onk//Tx 402 | 7f/8+fT///35///8+P/9+/b//Pn1//369f///fn////8/////P///fn/+fby//Hu6v/t6ub/7evn/+/s 403 | 6P/u6+f/7erm/+zo5f/r5uP/6ubh/+fj3v/j39r/3trV/9DMx//QzMb/Xlxa/wAAAP9tX0v/EQ8L/wEA 404 | Dv8JCHL/BgZS/wkIdP8OD9L/EA/a/xAP2/8QDtz/EA7c/xAO3P8QDtz/EA7c/xAP2/8PD9j/Dw7R/w0N 405 | xv8ODcT/BwY1/wAAAP96c1b/uaVr/6KMWv+dh1X/moNT/5V9Tv+gilP/aaFw/2mjcv9ppnL/aqhx/2in 406 | bf9bm2v/DRYQ/wAADv8NDbD/DQ7J/w8O0f8PD9j/EA/b/xAO3P8PDtz/EA/c/xAP3P8PDtz/EA7c/xAO 407 | 2/8QD97/DQ2+/wYGWP8HB2P/CQmC/wQELf8DAgD/AAAD/xUSD/+CcGH/kn1u/5mFdf+fi3r/o45//6iT 408 | hP+vnIz/uaib/9rUzf/m49//4d7Z/+nm4P/28+7/+fbx/+jl4f/IxcH/oJ6b/3h3df9dXFv/TExK/0RD 409 | Qv9GRUT/UE9O/2RjYv+BgH7/rKqn/9XT0P/08u7////8//z69v/w7en/6+jk/+3q5v/t6eX/7Ofk/+rm 410 | 4f/o5N//5uLd/+Hd2P/X08//1NDL/52Zlf8AAAD/CgoM/wMCAP8GBUf/CQmC/wcGV/8IB2v/Dg7P/xAP 411 | 3f8QD9v/EA7c/w8P3P8QD9z/Dw7c/w8O3P8QDtz/Dw/b/w8P1/8PDs3/Dg7M/w0MkP8AAAD/OjMr/7Wf 412 | bf+lkGD/p5Fg/6SPW/+YhFL/loJS/3KXd/9uonP/a6Zu/2SbY/9Ym17/PG5M/wAAAP8HBk7/Dg7K/w0O 413 | yf8PDtb/EBDa/xAO3P8QDtz/ERDc/xMT3P8UFNz/ExLc/xEQ3P8QDtz/Dw7f/wwMrf8GBlH/CAhu/woK 414 | g/8HBlj/BAMA/wAAAP9FOzT/loBx/5aBcv+eiXr/o45//6iSg/+smYr/s6OV/9HIvv/h3tn/5uPe//bz 415 | 7v/i4Nv/paOf/1taWP8jISH/AwMD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 416 | AP8IBwf/LS0s/2xrav+4tbP/8vDs///8+P/v7Oj/6ubj/+zn5P/r5+L/6eXg/+fj3v/k4Nv/3trV/9TQ 417 | y//Dv7n/JCQk/wAAAP8EAwr/CAhv/wkJgP8HB2P/BwZd/w4OxP8QD97/EA7c/xER3P8TE9z/FBTc/xIS 418 | 3P8QENz/EA7c/xAO3P8PD9r/Dw7U/w4OyP8ODr7/AgEj/w4MBf+WhGD/pJBi/56LXv+ei13/mohY/5eE 419 | Vf95kXb/bJRq/1eZXf9SkVn/XqNs/y9TPv8AAAD/Cgt//w0Ozf8ODs3/Dw/Y/xAP2/8QD9z/EhHd/xoZ 420 | 3f8kJN//KSng/yEg3/8XFtz/ERDc/w8P3v8LCpL/BgZP/wgId/8JCID/CAhy/wEBCv8EAwT/c2NY/5eC 421 | cv+ch3j/oo1+/6aRgf+ql4j/sJ+Q/8W5rv/e29P/7uzl/9zZ1P97eHX/HRwc/wAAAP8BAQH/AAAA/wIC 422 | Av8GBgb/CAgH/wcHB/8GBgX/BQUF/wUFBf8GBgb/BwcH/wgICP8GBgb/AQEB/wAAAP8BAQD/AAAA/ysq 423 | Kf+TkY//7+3p//j08P/o5OH/6+fi/+rm4P/o5N//5eHc/+Hd2P/W0s3/2NTN/2dlZf8AAAD/BgUi/wkJ 424 | fv8ICH3/Bwhv/wYGUP8NDK7/Dw/e/xER3P8YGN3/JCPg/yop4f8iIt//Fxfd/xIQ3P8QDtz/EA/b/w8P 425 | 1/8NDsr/Dg7K/wcHUv8AAAD/YFQ8/4t6Tf+KelD/intR/4p4T/+Jd03/bIlo/2GKZP9XlWD/V5Ja/2io 426 | eP8rSTv/AAAA/wwMlP8ODsz/Dw7P/xAP2f8QD9v/ERDc/xcW3f8tLOH/UFDl/11d5/9FReP/IyPe/xQU 427 | 3P8PD9f/CAhw/wUGVf8JCHv/CQh+/woJev8AABH/ExAM/4h3av+ZhHX/oIt8/6WPgf+plYX/rp2N/7qq 428 | nf/X08r/8/Dn/5qYlf8WFhX/AAAA/wEBAf8GBgX/BgYG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 429 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/BwcH/wUFBf8BAQH/AAAA/yUkJP+9urf//vv3/+fk 430 | 3//q5uH/6eXg/+fj3v/k4Nv/3NjT/9nVz/+cmZj/AAAA/wUELv8JCYL/CQh9/wkId/8FBk3/CwqM/xEQ 431 | 3v8WFdz/Kirg/01N5P9dXej/SEjk/yYm3/8VFN3/EA/c/xAP2/8PD9j/Dg7M/w4Ozf8JCWr/AAAA/09G 432 | MP+EdUT/f3BD/4ByRf+Bckj/gXJI/2Cbcv9glWv/YJRl/1qabP9ns4X/K0s7/wAAAP8MDZv/Dg3M/w8O 433 | 0P8QD9n/EA7c/xIQ3f8cG97/QkHj/3l47P+NjO//aGjp/zEx4f8WF+D/Dg7A/wUFUf8HB2P/CQl8/wkH 434 | fv8JCnz/AAAV/xEOCf+Pem7/n4l6/6OOgP+ok4T/rpmK/7Ggkv/NxLn/7uvj/3Vzb/8BAAD/AQEB/wIC 435 | Av8AAAD/AAAA/wAAAP8ODQ3/MzIx/1xbWf+EgoD/nZyZ/6uqqP+wrq3/sK6t/6qop/+ZmJf/fXx7/1RT 436 | Uv8qKSn/BwcH/wAAAP8AAAD/AAAA/wMDA/8AAAD/CQgI/5eVkv/9+vb/6eXh/+nl4P/o5N//5eHc/9/b 437 | 1v/e2tX/pKGe/wAAAP8DBDP/CAmD/wkIfP8JCXr/BgZW/wcGY/8RENH/Ghrf/z084v90der/jo3v/2xs 438 | 6v81NeL/GBjd/xEQ3f8QDtz/Dw/Y/w4OzP8ODs7/Cgpx/wAAAP9USjP/iHxI/31xQf99bz//dmc8/3xs 439 | RP9koHT/Yphu/16nc/9as3v/Z8uQ/y5WQ/8AAAD/DA2T/w4OzP8PDs//EA/Z/xAP2/8SENz/Gxve/zw9 440 | 4/9vcOr/goLu/2Fh6P8vLuD/FhXf/wsLlv8GBUr/CAhx/wkJfP8JCH7/CQl5/wAAEP8WEw//lYJ2/6KN 441 | fv+nkoP/q5eJ/7Cdj/++sKT/4d3U/19eWv8AAAD/AgIC/wAAAP8KCgr/MTAv/2FgXv+opaL/2NXS//Lw 442 | 7P/9+/b///75///9+P///Pj///z4///9+f///vr////9/////////v3/9PLx/9XT0f+enZv/VVVU/yor 443 | Kv8EBQT/AAAA/wEBAf8AAAD/f317//f07//p5OH/6eXg/+fj3v/i3tn/4t7Z/66qqf8BAQD/AwMs/wkJ 444 | gv8JCHz/CQl7/wcHaP8FBUn/DQ2s/xoZ4P84OOL/a2zp/4OD7v9kZej/MjLi/xcX3f8RD9z/EA/b/w8P 445 | 1/8ODsz/Dw7N/wkJZ/8AAAD/V041/4F0P/91aTn/eWs5/3hoN/98azz/apht/2aicv9duXj/Y7Bx/27O 446 | j/9DdV//AAAA/woLc/8NDsz/Dg7M/w8P1/8QD9v/EBDc/xUU3v8jI97/Ojvi/0VE5P8zNOH/HR3f/xAQ 447 | w/8HBlv/BgZd/wgId/8JCHv/CQh//wkJb/8AAAD/LCcl/6OPgP+jkIH/qpaH/66cjv+yopX/3dXL/19e 448 | W/8AAAD/AAAA/xMSEv9ubGn/ysjD/+/s5//49O//+PXw//Hu6f/t6eX/6+jk/+zp5f/u6uf/7+zo//Dt 449 | 6f/w7en/8e7r//Hu6//x7ez/8e7t//Px8P/7+fX////9//79+//39fH/xMPB/15dXf8KCgn/AQEB/wAA 450 | AP+Bf3z//fj0/+fj3v/p5eD/5eHc/+Le2P/KxsT/FRYR/wAAFP8LCX3/CQh8/wgJe/8ICHX/BgZS/wgI 451 | b/8TE9L/ISHf/zk54v9FReT/NTXi/x8e3v8TEtz/EA/c/xAP2/8PD9X/Dg7J/w4Oyf8GBUX/AQAA/3ls 452 | QP+RfkH/gWs5/414O/+ZhT7/rZ1J/26rdf9soG3/ba54/2+zev90x4r/Y6B1/wMAAP8FBTv/Dg7G/w4O 453 | yf8PDtX/Dw/a/xAP2/8RENz/FRTd/xsa3v8dHd3/GRjd/xMS1/8JCX7/BQVJ/wgIcP8ICXj/CAh6/wkJ 454 | g/8ICE//AAAA/1JIRf+qlob/pZKE/62ai/+vnY//ybuu/5+clf8AAAD/AgIC/1NTUP/PzMb/+PTv/+3q 455 | 5f/m497/5uPe/+jl4f/r6OT/7erm/+/s6P/w7en/8u/r//Pw7P/08e3/9PHt//Ty7//z8fH/9fHw//by 456 | 8f/28vH/8vDv//Du7f/y7e3/8/Dt//v59f////3/ysjF/0dFRf8AAAD/CAcH/8XCv//07+z/6OPg/+jk 457 | 3//g3Nf/4NzY/z89Pv8AAAD/Cwpp/wkJgP8JCXr/CQh4/wcHaf8FBEn/Cwub/xQU3f8aGtz/HR3e/xkY 458 | 3f8UE93/ERDc/xAP2/8QD9n/Dw7S/w4Oyf8PDrT/AAAT/xgXC/+tn07/qZRG/6SKQv+3o0r/wrFQ/8q6 459 | VP92pGr/dahv/3eqcv9/p3L/frZ2/4q6ef8iKSD/AAAA/w0Mnv8NDsr/Dg7O/w8P1/8PD9r/EA/b/xAQ 460 | 3P8REdz/ERHc/xAQ3v8LC5//BQVI/wcHYf8ICXj/CAl6/wcIev8JCX3/AwMc/wMDAP+Bc2r/qJWH/6qX 461 | if+vno//sqGU/9fNwf9EQ0H/BwYG/6WinP/w7uX/6OTe/+Hd2f/l4t3/6OXg/+rn4v/r6OT/7erm/+7r 462 | 5//w7en/8e7q//Lw6//z8O3/9PHu//Tx7//08vD/9PLx//Xz8v/28/L/9vPy//Xz8v/18vH/9vLx//Xx 463 | 7//y7uz/7+vp//r49P/+/Pj/nJqZ/wAAAP9nZ2T//vr2/+fj4P/q5eH/497a/+fk3v+EgoP/AAAA/wcH 464 | Of8JCYP/CAh6/wkJev8ICHb/BgZX/wUFUv8MDbf/ERHf/xER3P8SEdz/EBDb/xAP2/8PD9r/Dg/V/w4N 465 | y/8ODc3/Cwt4/wAAAP9XUC3/zrxW/7+sUf/GsFT/y7dV/8q3Vf/It1j/fbF0/4Gqbv+Frm//irV0/5W5 466 | df+zy4b/dn9b/wAAAP8JBz7/Dg3H/w4Oxv8PDtH/Dw/X/xAP2v8QD9r/EBDc/w8P3f8MDKn/BQVH/wUE 467 | P/8GBlj/Bwdo/wgIcP8ICYD/CAdO/wAAAP80Ly7/pJKE/6aTh/+um43/saGT/7eqnf/Z08j/kY+J/7q2 468 | r//v6+L/3NnR/+He2P/m497/5+Tf/+nm4f/q5+L/7Onk/+3q5v/u6+f/8O3p//Lv6//z8Oz/9PDu//Xx 469 | 8P/08vH/9fPy//b08//29PP/9vTz//b08//29PP/9vTz//fz8v/28vH/9fHw//Tw8P/x7ev/8Ozo//// 470 | //+6ubb/qaek//f08P/r6OT/7Ofk/+fj3//g3Nf/ysfE/xwbHP8AAAD/CQln/wgIff8ICG7/Bwdl/wYG 471 | VP8EBDr/BgZZ/w0Nvv8RD9//EA/b/xAP2v8QD9r/Dw/W/w4Ozv8NDsn/Dg21/wMCGf8HBwH/sqRQ/9jF 472 | XP/MuVz/0Ltd/9G7XP/Pu1r/0L5f/4XAeP+Mr2j/j6xl/63Adf/T0IP/y8uC/9jRgv85Nin/AAAA/wwL 473 | av8ODs7/DQ7I/w8O0/8RD9r/EA/d/w4Oz/8KC5X/BQZQ/wUEPP8EBTv/BAQ7/wQFQP8FBVH/BgVR/wUD 474 | C/8AAAD/ZVlU/6qYif+plor/sZ6R/7Wkl//Ataj/19PK/+fi2P/j3tX/2tfP/+Dc1//k4Nv/5+Pe/+fk 475 | 3//p5uH/6ufj/+zp5f/u6+f/7+zo//Hu6v/z8Oz/9PDv//Tx8P/08vH/9fPy//b08//29PP/9/X0//f1 476 | 9P/39fT/9/X0//b08//29PP/9fPy//Ty8f/z8fD/9PHw//Tw7v/v7Oj/+vj0//r49P/u6+f/7uvn/+3p 477 | 5f/p5uL/3tvX/+Dd2P9GREb/AAAA/wYFGv8GBln/BQVK/wQFPv8EBDz/BAQ8/wUFPP8GBl3/Cwyo/w4P 478 | 1v8QD93/EA/Z/w4Oz/8ODsr/DQ3G/woKQ/8AAAD/Z2E//+DUbP/UxGT/2cRp/9bAX//Ywl3/3clk/97N 479 | af+PunH/qr1o/8TEcP/VzID/3s6D/9rLgf/e0IT/vbBz/xQTEf8AAAD/DAtt/w0Ozv8ODs7/Dg7G/wwM 480 | pf8ICHH/BgZd/wcHa/8ICHH/CAhr/wcHXf8FBUn/BAQ3/wIBCf8CAgP/AAAB/3JmXP+rmoz/rJqN/7Oi 481 | lf+4p5r/yr+0/9nXzf/X08r/2tbO/97b0//h3df/5ODb/+fj3v/n5N//6ebh/+vo5P/s6eX/7uvn//Dt 482 | 6f/y7+v/8/Dt//Tx8P/18vH/9fPy//b08//39fT/+Pb1//j29f/49vX/+ff2//j29f/39fT/9vT0//b0 483 | 8//18/L/9fPy//Xy8f/18fD/9PHu//Ht6v/w7en/8e7q//Dt6f/u6+f/7Onl/+He2v/l4d3/V1ZU/wAA 484 | AP8EBAL/AgIT/wQEPv8FBkz/BgZi/wgHbf8ICHH/Bwdm/wYGXf8JCH3/DQyw/w4Nyf8ODtH/DQ7E/wsK 485 | Sf8AAAD/NjMl/9vOef/f1Hv/3s9y/+HOa//gy2r/4Mpk/+LMY//p1Wz/rcFw/8fHef/Xx3j/08V3/9fJ 486 | gP/ZyoX/08WB/+DRhf+uoWz/EhEP/wAAAP8IBkP/CAh4/wYHWv8GBU//Bwdq/w0Njv8VFaP/FRWo/w8P 487 | ov8LC5b/CAiE/wYFTf8BAQD/AQIF/wAAAP9/cmf/rpyP/66dkf+1pZj/u6yf/8/Jvv/Y1sz/2NXN/9vY 488 | 0P/e29P/4d7W/+Lf2f/j39v/5uPe/+jl4f/q5+P/6+jk/+vo5P/v7Oj/8/Ds//Tx7v/08vH/9fPy//b0 489 | 8//39fT/+Pb1//n39v/59/b/+ff2//j29f/18/L/9vTz//f18//29PP/9fPy//Lw7//18fD/9vLx//Xx 490 | 8f/08e//8/Ds//Lv6//x7ur/8O3p/+7r5//j4Nz/6ebi/2lnZf8AAAD/BAQG/wIBB/8GB2L/CQmG/wsL 491 | mv8REaX/Fhap/xMTn/8LC4f/BgZh/wUGTv8HB2H/CAh2/wYGLf8AAAD/NzIj/+XUdf/15Xj/8+J8//bm 492 | gv/w337/7dxz/+DTZv/m12L/3dZm/9rMfP/Ux3r/0sV5/83Bcv/SxHj/2MqE/9fIhv/UxYH/4tGG/7yv 493 | df8wLCT/AAAA/wQDF/8EBT7/CAhs/w0Nmf8gILT/Pz/P/z8/1P8jI8T/Dw+v/wsLoP8ICG//AQEA/wIB 494 | B/8CAQL/iHtw/7Cfkv+xoJX/uaic/7+xpf/TzsX/2dXM/9nWzv/c2dH/3tvT/93a0//r5+L/+vfx//bz 495 | 7f/z8ev/9fPu//v59P////v/+PXw/+/s6v/08vD/9fPy//b08//39fT/+ff2//n39v/6+Pf/+vj3//f1 496 | 9P/9/Pv//////////////////////////////////Pr6//Pw7//08vH/9fLx//Xx7//08O//8+/t//Lv 497 | 6v/w7en/5uPf/+zp5f92dHL/AAAA/wUEBv8CAg7/CQmG/wwLof8SErP/KirJ/0ND1v84Ocn/GRmt/wwL 498 | kf8HB2D/BAQ2/wMDDP8AAAD/XVY1//Loff//84D//ut9///tg//+7YX/9+iB/+vge/+1vW3/tMVt/8DN 499 | b//XyoH/0cV6/9THff/VyH//0cV4/9PGff/Vx4P/2MmJ/9PEg//f0oz/3dKO/zYyJP8AAAH/CQlf/woL 500 | lv8QEKv/MDDH/1xd4v9bXOP/NTXS/xMTtf8LDKz/CAdo/wMDAP8AAAX/BQUE/5CDeP+yopX/tKOY/7ur 501 | n//EuK3/19LJ/9nUzP/Z187/29jQ/9zZ0f/z7+j/yMbB/2tqZ/84NzX/Ly4t/y8uLf83NjX/dXRz/9zZ 502 | 1/////7/8u/u//X08//39fT/+ff2//r49//6+Pf/+/n4//j29v//////6Ofn/4KBgf89PDz/MDAw/zEx 503 | Mf85OTn/amlo/9TS0v//////9PPy//Xy8f/28/L/9fHx//Tw7//08O3/8u7s/+nl4v/v7Oj/gX99/wAA 504 | AP8FBQb/AwIG/woJh/8MDKv/GBi8/0BA2P9gYeT/VVXd/yYlv/8NDab/CgqQ/wkISP8AAAD/eHBC//// 505 | if/77YD//eqC//7uhv/97Ir//++N/+jgf/+wyIT/pMOI/5i8gf+OtHf/1siA/9XHfv/WyH//2s2K/9jL 506 | hP/Txn3/0cR8/9TIh//XzI7/0MWH/9zNgP+OhVb/AAAA/wkIOf8LDKz/Dg+0/yIivf9AQc3/Q0PP/yko 507 | xf8REbz/DAym/wMDIP8ODQT/HhsU/wICAv+XiH7/tKSY/7anm/+9raH/yL6z/9jTy//Y08z/2dfN/9vZ 508 | z//r6OH/fn14/wkKCf8wMDH/aWlq/35+f/+CgoL/bm5v/y0tLf8FBAT/h4aF///////08vH/+Pb1//n3 509 | 9v/6+Pf/+/n4//j29v//////mJiY/wkJCf8mJib/ampq/4GBgf9/f3//a2tr/zU1Nf8ICAj/eHh3//38 510 | /P/39fT/9fPy//Xz8v/08vH/9fHw//Tw7//r5+X/8e7p/4aEgv8AAAD/MjAq/wMCAP8HB0P/Cwy0/xQU 511 | u/8vL8j/RkXR/zs7y/8bG7n/DQ62/wwMm/8DAhv/DQwF/93Tc///84P//OqE///tif/+7o3//+6T//rs 512 | h//L0YT/n7iI/5bFiP+UwIb/jrCC/9PGff/UyIH/2cyH/9fKgv/d0I//3NGS/9DEeP/Ownf/1suK/9DF 513 | fP/NwXb/3dCB/0I/K/8AAAD/Cgk7/w0Nl/8SErr/HBvF/x4dx/8UFMD/Dg6d/wsJMP8AAAD/bWY+/1pU 514 | LP8AAAD/m42B/7emmv+5qZ3/vq+j/8rDuP/Y1Mv/2dTL/9nVy//q593/XVxZ/wQFBf+VlZX/2dnZ/+Li 515 | 4f/19fX/5ubm/8vLy//BwcH/kZGR/xUVFf99fHz///////b08v/6+Pf/+/n5//j29v//////kpKS/xEQ 516 | EP+Hh4f/wMDA/8nJyf/j4+P/9fX1/+Pj4//b29v/m5ub/woKCv9SUVH///7+//b08//29PP/9vTz//Xz 517 | 8f/18fD/7eno//Pv7f+KiIb/AAAA/4mBW/84NSn/AAAA/woKSv8PD6v/FxfC/x8fxv8ZGcL/ERC2/w0M 518 | hv8JCCT/AAAA/4V8Rv///Yn/++mC///tif//7o///+6T//7ul///75T/292E/5q8if+Vx4r/jsuE/4+7 519 | hf/SxHv/2s6M/9/Vlv/Zzoj/1Mh7/9rPif/Tx3j/ybxm/8S2Xv/NvmX/08Rt/97Obv/KvGX/My4g/wAA 520 | AP8BAQb/AgIx/wcHSv8IB0r/AgI2/wEBCv8AAAD/Tkku///4hf9TTyv/AAAA/5qNgf+6qZ3/u6uf/7+x 521 | pf/Ox73/2dXL/9bRyP/r5dz/h4SA/wkJCv+vr6//39/f/+bm5v/t7e3/gYGB/yUlJf8ICAj/BwcH/y8v 522 | L/9bW1v/BwYG/5WUlP//////9/X0//j29v//////qamp/wYGBv9YWFj/NjY2/wgICP8HBwf/ISEh/3Z2 523 | dv/n5+f/6enp/97e3v+7u7v/Dw8P/39+fv//////9PLx//f19P/29PP/9vPy/+7q6f/18vH/iIaE/wAA 524 | AP+dlFz/0cZ//yIgGf8AAAD/AgET/wUEPv8ICEv/BwdH/wEBJf8BAQD/AAAA/2leLv/76WX//ut6//7t 525 | iv//7o7//+6U///umP/+7pr///Cd/+/qj/+hyon/mMCK/5DEh/+Nz4b/08d+/9rQjv/f15n/3taV/87D 526 | cP/Mv2n/y71m/76uT/++rU//wLBV/8i2XP/gzlz/+ONg/+PRXP+IfDz/NzIX/wsJAf8AAAD/AAAA/wYF 527 | AP8yLxr/pJlX//nygv///4z/X1kx/wAAAP+ViH7/vaui/7ysof/As6j/0MnA/9jUyv/c187/08/H/xQU 528 | E/+Dg4P/39/f/+fn5//w8PD/RkZG/wAAAP8CAgL/AAAA/wAAAP8AAAD/BwcH/yQkJP8NDQ3/0NDQ//// 529 | /////f3/4eDg/xYWFv8gICD/CQkJ/wAAAP8AAAD/AAAA/wICAv8AAAD/NTU1/+jo6P/q6ur/3t7e/5WV 530 | lf8PDg7/3dzb///9/P/39fT/9/X0//b08//t7Ov/9vTz/3x7ev8AAAD/nZRc/+/jiv/Sxnz/d25M/x4c 531 | E/8CAgD/AAAB/wEAAP8NDAT/Qj0g/7inSf//9GP//elk//3nav/+7IP//+6V///vl//+7pr//u2f//3t 532 | m//v6o3/rMuJ/5K7i/+Vxo3/kNCJ/9HFev/Z0o//3NaX/9jQjP/Sx33/zL1j/76uTP+8rEn/va1M/7+u 533 | T//fy1L//eZS//3mUv/95lL///JX//3rVv/jzlL/yLxh/8i8ZP/g0G3/+/B+///9hv/46YH///6T/3px 534 | RP8AAAD/i392/7+upf+7raL/wrWq/9HMwv/V0cj/6uXb/4OBfP8fHx//zs7O/97e3v//////a2tr/wAA 535 | AP8GBgb/AgIC/wEBAf8BAQH/AwMD/wEBAf8HBwf/BAQE/05OTv///////////2JhYf8BAQH/CQkJ/wEB 536 | Af8CAgL/AQEB/wEBAf8EBAT/BwcH/wAAAP9YWFj//v7+/9/f3//W1tb/Kyws/319fP//////9vTz//n3 537 | 9v/39fT/7uzr//f19P9qaWj/AAAA/76zbf/36Yn/5tmB//fli//j0YT/0sFu/8KxU//BsVL/08Fa//jp 538 | Yf//9WT/++Vi//7nav//6XH//ul3//7sjv/+753//u6d//7vmf//8JL/xNSI/5bDkf+Zv47/lcKN/47I 539 | if/NwHD/08qE/9fQkv/Yz4//0sh+/8O1Wf+9q0v/vatL/7ypS//ZxFD//udT///oUv//51L//+dS//3l 540 | Uf/+5lD///Jr///4ef//+Hr///V9//7uf//864T/++qI////mf+Xjlj/AAAA/3lvaP/Bsaj/u66i/8S3 541 | rP/SzsT/1dHI/+rk2/9BPz3/Wlpb/9/f3//u7u7/2tra/w0NDf8AAAD/AQEB/wAAAP8CAgL/AwMD/wAA 542 | AP8EBAT/AAAA/xUUFf8MDAz/xsfG/93c3P8SEhL/FRYW/wAAAP8BAQH/AAAA/wICAv8BAQH/AAAA/wMD 543 | A/8DAwP/AwMD/8nJyf/z8/P/4ODg/2xsbP83Nzf///////j29v/59/f/+ff2//Du7f/29PP/UE9P/wAA 544 | AP/e0YD///iS//rqiP/554b//euG///1iP//93z///Bl///qZP/952T/++Vn///oa///6XH//+l4///p 545 | fv/+6YL//+2U//Xrjf/Q24f/0d+G/9XdiP+lzIv/jsGI/5DIjf+Q2JD/z8J5/83Bd//QxoL/2M6S/9XI 546 | e//GtVz/valN/7ulSv/Fr0z/79lR///oUv/+5lL//+dS///nUv//5k///upi//3sdf/863X//Ot5//3s 547 | fv/+7oX//+6M//zskP///J//ua5t/wAAAP9gWVP/wrSq/7ytpP/EuK7/087E/9nUy//d2ND/ISAf/4SF 548 | hf/h4eH/+/v7/6enp/8AAAD/AwMD/wAAAP8AAAD/AQEB/wAAAP8BAQH/AQEB/wAAAP8UFBT/Kioq/2tr 549 | a/98fHz/JCQk/xsbG/8AAAD/AQEB/wAAAP8AAAD/CwsL/x4eHv8CAgL/BAQE/wAAAP+bm5v//v7+/+Dg 550 | 4P+Xl5f/HBwc//Lx8f/9+/v/+ff3//n39v/x8O//8e7u/y8vMf8RDwX/9OaS///ylv/+7ZL//++Q//7u 551 | jf/97Iv//OyN//zpff/952r//uhu///pcf//6XT//ul5///pfv//6oL//umG//3pe//P1oD/nLyR/5q9 552 | jP+myIr/m8qP/4/Mi/+TzIv/kNSM/9THf//Sxnr/ybxp/82/bv/Xx3P/0b5j/76pTv/GsEz/7dRQ///n 553 | Uv//51L//+dS///nUv//5lD//ulf//7tdf//7Xb//+16///ugP//7ob//+6M///vkv/97pf///ac/+DP 554 | df8AAAD/OzYz/8GyqP+9rqX/xbmv/9POxP/b187/0czD/xcWFf+bm5z/4eHh//////+dnZ3/AAAA/wMD 555 | A/8CAgL/AAAA/x4eHv+np6f/2tra/3x8fP8AAAD/CQkJ/3l5ef8gICD/GRkZ/3Z2dv8SEhL/AAAA/wMD 556 | A/8AAAD/Nzc3/9jY2P/9/f3/sLCw/xUVFf8AAAD/l5eX///////h4eH/rKys/xISEv/e3d3///////r4 557 | +P/59/b/9vT0/97c2/8JCQ3/Ozci///3n//+7pj//++Y///vlv//75X//++U///vlP//75X//uuD///p 558 | df//6Xn//+l7//7pfv//6oH//umE///rhf/w53L/nMR2/5O/hv+bwY//l76O/5nGjv+Tzov/kcqH/47C 559 | gv/Qw2v/0cNn/8O0Uv/Nulf/zLhY/76oTf/JsU//8dlT///qUv//51L//+dS///nUv/+51D//uhc//7t 560 | df//7Xf//+57///ugP//7of//++M///vkv//75f//u+c//7si///7IH/LCgV/w4NEf+0ppv/wLCn/8W5 561 | r//Tz8X/3djP/83IwP8VFRT/oqKi/+Pj4//6+vr/xcXF/wAAAP8CAgL/AwMD/wAAAP+kpKT///////v7 562 | +///////NTU1/wkJCf/FxcX/JiYm/xMTE//ExMT/IyMj/wAAAP8EBAT/AAAA/7e3t///////+Pj4//// 563 | //9vb2//AAAA/7a2tv/+/v7/4uLi/7Kysv8RERH/2djY///////6+Pj/+Pb2//z6+/+4trX/AAAA/3dx 564 | Sf///6T/++uW///vmf//75n//++Y///vmP//75j//++Y///vmv/+64b//ul8///qf///6oD//+qC///p 565 | hf/863f/v9hz/4u6fP+Is3f/jr6C/5vEkP+Vvoz/ks+L/5DYh/+NzYH/w7RX/72tSv+/r0v/xrJN/8ex 566 | Tv/ErEr/6tNS///nVP//5lL//+dS///nUv//51L//udX//7scv//7nj//+58///ugf//7of//++M///v 567 | kv//75b///Ca//7vlv/753////mJ/2dgNv8AAAD/lYqA/8S2rP/CuK7/08/F/9vVzv/Uzsf/GBgW/5eY 568 | mP/l5eX/7u7u//r6+v87Ozv/AAAA/wgICP8AAAD/qqqq///////5+fn//////zAwMP9SUlL/7e3t/zs7 569 | O/8pKSn/5+fn/3Jycv8AAAD/CAgI/wAAAP+fn5////////n5+f//////Tk5O/xsbG//19fX/8vLy/+Xl 570 | 5f+pqan/ExMT/+Ti4v//////+/n5//b09P//////fX18/wAAAP+0pmD///2f//vtmP//8Jr///Ca///v 571 | mf//75n//++Z///vmf//75r//vCY//7rhf//6n///+qC///pg///6oT//ex6/8rdc/+Qu3r/hrp8/4e7 572 | e/+JtoP/jbqM/468i/+TyYj/k8mF/76uTP/QvU3/28hO/9vGTv/XwE3/6tFQ///pUf//51H//+dS///o 573 | U///6FT//udT//7qbP//7nv//+59///ug///7oj//++N///vkv//75b//u+Y//7wnf//7In//OZ+///4 574 | i/+toVz/AAAA/2JaVf/Juq//wbWs/9POxP/Y08v/4NrS/yMiIP+BgYH/5uXl/+rq6v/+/v7/yMjI/wwM 575 | DP8AAAD/AAAA/zQ0NP/l5eX//////5+fn/8iIiL/3Nzc/+Xl5f9NTU3/Ojo6/9/f3//j4+P/NTU1/wAA 576 | AP8AAAD/HR0d/7q6uv/r6+v/gICA/wAAAP+4uLj//////+zs7P/m5ub/lJSU/x0dHf/29fX///7+//v6 577 | +v/49fX/+Pb2/zc3Of8FBAD/6NZy///yj//975v///CZ///vmf//75r//++c///vm///75z//++c///v 578 | nf/+75n//+qE///pgv//6YT//+qD//7qhP//7X//2+Jx/8zddv/Q33b/rMt0/9The/+p2Y3/j8OK/5PQ 579 | hP/ax1P/+eFV///nVP/95lP//ORS//7nU///51P//+dT///nVP//51b//+ZW///oZP//7Hv//+x////t 580 | hP//7on//+6O///vkv//75b//++Y///vnP/+7pX//uqA//3pgv//7Yb/69t7/w0MBP8iIB//wLCn/8S2 581 | rf/RzcP/1tDJ/+rk3P8+PTr/Xl9f/+Tk5P/q6ur/8vLy///////Hx8f/LS0t/wAAAP8AAAD/BwcH/x4e 582 | Hv83Nzf/3Nzc//Hx8f/g4OD/U1NT/z4+Pv/c3Nz/7u7u/+jo6P9AQED/AAAA/wEBAf8BAQH/AAAA/xcX 583 | F/+3t7f///////Ly8v/s7Oz/5eXl/3Jycv82Njb///////v6+v/7+fn///39/9LQz/8AAAD/SEMl///1 584 | g//86H7//+6Y///vnP//75z//++c///vnP//75z//++c///vnP//75z//++d///ulf//6oT//+qE///q 585 | hP//6oT//emE///rgP//7IH//ex7//jsev//7X3/x+Z4/8TihP/k7IH/9+Fc///oW///51n//+dX///o 586 | Vv//51b//+dX///nV///51n//+dZ//7mYf//6nv//+uB///shv//7Ir//+2P///tk///7pX//+6Y///v 587 | mv//7pv//uqG///pgf//6YP//OaB///2iv9aUy//AAAA/5eMg//KvbL/z8m//9XQyf/t59//bmxo/zMz 588 | NP/a2tr/5eXl//T09P/y8vL//f39//X19f+3t7f/i4uL/4WFhf+tra3/9PT0//r6+v/m5ub/4eHh/0tL 589 | S/85OTn/3d3d/+Xl5f/4+Pj/+Pj4/7y8vP+MjIz/iIiI/6+vr//z8/P//v7+//Ly8v/09PT/5+fn/9/f 590 | 3/9CQkL/Z2dn///////6+Pj/+Pb2//////+GhIL/AAAA/6CUU///+Ib/+uR7//7riv//753//+6c///u 591 | nf//7pz//+6c///unP//7p3//++c///um///757//+yP//7pgv//6YX//+mE///phP/+6YX//emE//3p 592 | hP/+6YT//uiA//Xrdf/87oL//+2Q//3mY//+52H//+df///nXP/+51z//udc///nXP//513//+df//7n 593 | Yv/+6Xv//+qD///qh///64v//+yP///sk///7JX//+yX///smv//7Z3//uyU//7nf///6IL//+iC//vl 594 | gP//9Yn/tqhf/wAAAP9NSET/yb2y/8zEu//X0sv/5d/X/62qpP8SEhL/vb29/+Pj4//x8fH/9fX1//Ly 595 | 8v/19fX///////////////////////b29v/y8vL/5+fn/9ra2v86Ojr/KCgo/9XV1f/m5ub/8vLy//X1 596 | 9f/+/v7/////////////////9/f3//Ly8v/19fX/8vLy/+Pj4//Jycn/FxcX/66urv//////+vj4//v6 597 | +v/x7+//JiYo/w0KA//q13f//+yB//3nf//+54D//+yV///unf//7Zz//+2d///tnP//7Zz//+2d///t 598 | nP//7Zz//+2c//7tmv/+6Yj//+eC///nhP//54P//+eD//7ngv/+54L//+iD//Hccv/x3HT/7tZw/+/a 599 | bf//5mr//+Vn///lZf//5mP//+Zj///mYv//5mL//+Zk//7lZf/+6Xj//+qG///qhv//6oz//+uP///r 600 | kf//7JT//+yW///sl///65n//uya//7nhv/+5X///+aB///mgf/+5YH//+eC//vmgv8rJxb/AwMG/6+j 601 | mf/Pxrz/19LL/9rUzf/g3dT/IyIh/3l5ev/j4+P/6+vr//T09P/19fX/9PT0//Ly8v/x8fH/8fHx//Ly 602 | 8v/19fX/8/Pz/+Xl5f/Ozs7/IyMj/xMTE//FxcX/5OTk//Ly8v/19fX/8vLy//Hx8f/x8fH/8vLy//T0 603 | 9P/19fX/9fX1/+zs7P/k5OT/jIyM/xkZGf/y8vL///////n4+P//////xMTC/wAAAP9nXzb///WH//zj 604 | fv//54H//+aA//7niP//7J3//+ye///snv//7J7//+yd///sm///7Zv//+2b///sm///7Jv//+uZ//7n 605 | hf/+5YH//uWD///mhP/75Hv/9uFx//jhdf/Mw2z/rKtv/6OocP+nqG3//uNu//7kbP//5Gr//+Rp///j 606 | aP//4mf//+Jo//7iaP/+5nX//+mG///oh///6Ir//umN///pkP//6ZP//uqU///qlv//6pb//+uZ//7o 607 | j//+5Hz//+SA///jgP//44D//+OA//zgf///8oj/nY9S/wAAAP94cGn/0ci9/9TPyP/X0sv/7Ojf/4B+ 608 | ef8fHyD/zMzM/+Tk5P/y8vL/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1/+/v7//j4+P/q6ur/xIS 609 | Ev8KCgr/nZ2d/+Pj4//u7u7/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//Ly8v/j4+P/1NTU/ysr 610 | K/92dnb///////r5+f/49/f//////2FhYv8AAAD/08Jt///thv/94oH//+WC///lg//+5IH//umS///s 611 | n///653//+ud///rnf//65z//+qc///qnP//6pv//+ma///qmv/+6JT//uSC///kgv/+437/5ddv/66/ 612 | bP+wwW7/gbBy/4Wlcf+Emm7/hZ9x///hb///4W7//uFt///ibP//4Wv//uFr//7hav/+5HX//ueG///n 613 | hv//54n//+iL//7pjf//6ZD//+mS///pkv//6ZP//+qV///qkv/+433//+N7///kfP//433//+N+///j 614 | f///43///uN+///qiP81MSD/CgkM/7ivo//W0Mf/2NTM/9rXz//n5Nz/LCsq/1lZWv/h4eH/5ubm//Ly 615 | 8v/09PT/9fX1//X19f/19fX/9fX1//T09P/n5+f/4eHh/1lZWf9RUVH/Y2Nj/0ZGRv/f39//5ubm//T0 616 | 9P/19fX/9fX1//X19f/19fX/9fX1//Ly8v/n5+f/4+Pj/2xsbP8gICD/9vb2//7+/v/5+Pj//////8HA 617 | v/8AAAD/cGY6///1iv/74YD//+SC///lg///5YP//+WD//7kg//+6pr//+ue///rnf//65z//+qc///q 618 | m///6Zv//+qZ///qmP//6pf//uqY//7okf/95ID//+N6/83Oaf9+pm//ca5z/3azb/90tGv/esBp/3zL 619 | aP//4Gv//+Br///gav//4Gr//+Fr///gaf/+4W///ueA///mgv//5oT//+eH///niP//6Ir//+iM///o 620 | jv//6Y7//+iQ///qk//+5YH//+F1///jeP//4nj//+N5///jev//43v//+N8//zfeP//9JL/t61z/wAA 621 | AP9aVVD/29XK/9XTyv/Y1c3/6OXd/7e1r/8FBAX/nJuc/+Tk5P/m5ub/8fHx//T09P/19fX/9fX1//T0 622 | 9P/w8PD/4ODg/8fHx/8SEhL/sLCw/8nJyf8LCwv/u7u7/+Dg4P/v7+//9fX1//X19f/19fX/9PT0//Ly 623 | 8v/n5+f/5OTk/6SkpP8DAwP/tLS0///////5+fn/+vj4//78/P88PD7/BgQA/+LQdv//6oT//eOA//7l 624 | gf//5IH//+SB///kgv/+5ID//ueO///rnf//65n//+uZ///qmf//6pj//+qY///ql///6pb//+qV///q 625 | lP/+6pX//ueK///iff/+43P/w8xr/4a5bv91qG3/e8Bv/3fFav91tGn//99o///fZ///32f//99o///f 626 | Z///32n//uR5//7mfv//5n7//uaA//7mgv//5oP//+aF///nh///54j//+eK///ojf/+54j//uFy//7i 627 | c///4nT//+J0///idf//4nb//+J2///ieP/+4nj//eeP///0nf87NyT/AAAA/6Wflv/h3dT/2NTN/9rX 628 | z//z7+f/hoWB/xUVFf+3t7f/4eHh/+Li4v/r6+v/8PDw//Hx8f/v7+//4uLi/9/f3/9kZGT/KSkp//n5 629 | +f//////Ozo6/1BQUP/d3d3/4eHh/+/v7//y8vL/8fHx/+zs7P/i4uL/4eHh/8PDw/8YGBj/enp6//// 630 | ///6+fn/+Pf3//////+ampj/AAAA/2JaM///8of//N9+///jgP//43///+OA///jgP//44D//+SA///k 631 | gP/+6ZT//+qa///pmP//6Zf//+qX///qlv//6ZX//+mU///pk///6ZL//+mS///pkv/+5oP//+J5//rm 632 | bP+mz2n/eK9y/4y9b/99unL/e5dt///fZf//3mX//95l///eZf/+3mX//uJz///kev//5Hr//+V8///l 633 | ff//5X///uWA///mgv//5oT//+aF///mhv//54n//uJ2//7gbv//4HD//+Bw///hcv//4XP//uFz//7h 634 | dP//4XP//uN9//znkv//9Jr/uaxu/wAAAP8pJyX/1NDI/9vXz//c2dH/3drS//f07v9lZGL/BAQF/5KS 635 | kv/a2tr/4uHh/+Li4v/i4uL/39/f/+Dg4P+SkpL/AwMD/7q6uv///////////83MzP8FBQX/goKC/+Dg 636 | 4P/e3t7/4+Pj/+Li4v/h4eH/3d3d/56env8KCgr/ZWVl///////6+vr/+vn5///////a2tr/Dg4P/xEP 637 | C//gznv//+mC//7igP//44D//+OA///jgP//44D//+R////jgP//4n7//uaG///qmP//6pb//+qV///q 638 | lf/+6pT//+mT///pk///6ZL//+mR///pkP//6I7//uiO///kf//24HH/4OBs/6LBbP92n3D/fqlz/3uY 639 | bP//3V///91f///dX///3V3//t9n//7ic///4nP//+N1///jdv//43f//+R4///kev//5Xv//+V9///l 640 | fv//5oH//uR5///eZv//32j//99p///fav//4Gv//+Bs///gbf//4G///uBs//7lgf//6Y///OaL///4 641 | mP9yaUL/AAAA/2BeWf/m4tv/2dbO/+Dd1f/i3tn/8/Dq/4F/fP8EAwP/MzQ0/4qKiv+0tLT/vb29/7a2 642 | tv93d3f/AAAA/42Li///////9/X0//j29v//////oaKi/wAAAP9sbGz/tbW1/729vf+2trb/kJCQ/zw8 643 | PP8BAQH/d3d3//7+/v/7+/v/+vr6//r6+v/6+vr/Q0JB/wAAAP+hmWX///iZ//vgeP//5H3//+N9///j 644 | ff//43z//+N8///jff//43z//+N8///iev//6Iv//+uU///qkv//6ZL//+iR///pkP//6JD//+iO///o 645 | jf//6Iz//+eL///niv//54f//eF4///gb//c3mn/kblt/4CSbP92j2j//9xV///cVv//3FX//t1Z//7h 646 | Z///4Wn//+Fq///ia//+4mz//+Ju///jb//+43H//+Ry///kdP//5HX//+V3//7fYv/+3V3//95f///e 647 | X///3mD//99h///eYf//32P//99j//7gZ//+5oH//+eD//7mg///6Yb/9+eH/zo0H/8AAAD/hoR+/+zo 648 | 3//b19D/49/a/+bh3f/7+fP/0c7K/15cW/8bGxr/EhIS/xQUFP8QERH/HRwc/6inp///////9vTz//r4 649 | 9//7+fn/+Pf3//////+5uLj/IiIi/w8PD/8UFBT/EhIS/xkZGf9XV1f/0tLS///////6+vr/+/v7//j3 650 | 9///////cHBu/wAAAP9jWzv///ea//vnjv/+43n//+N2///jdv//43b//+N3///jdv//4nb//+J1///i 651 | df/+4nT//uN3///pjP//6I3//+iL///oiv//6Ir//+eJ///oh///6Ib//+eF///mhP/+5oP//uaC//7l 652 | ff/94W3/5tVi/6O7af97mG7/dZJp///bUv//21H//ttS//7fXv//4GL//+Bi///gZf//4WX//uFn///h 653 | af//4mr//+Ns//7jbf/+427//uRx///gZv//3Ff//t1Z///dWf//3Vr//91b//7dW///3Vz//t5d//7d 654 | W//+4Wr//+d9///mfP//53///eR+///vhf/bzHL/FxQM/wAAAP+fnJb/7erk/97a1f/n497/5ePe//Lw 655 | 7P///vr/7erm/8vJxv+9u7j/ysnH//Hw7///////9fPy//j29f/6+Pf/+/n5//z6+v/6+Pj///////j4 656 | +P/T09P/wsLC/9DQ0P/z8/P///////7+/v/6+/v/+/v7//f39///////j42M/wAAAP82MSD/8+aN///s 657 | kP/+6ZD//uV9///icf/+4nP//uJz//7ic//+4nL//+Fy///icf/+4nH//uJy//7hb//+5H3//+mK///o 658 | h///54f//+eG///nhP/+54P//+eC///ngf/+5oD//+aA///mff/95n7//+Zz/8bGYP94oW//eptu/3ac 659 | av//21D//9pO///dV//+31///99e///gYP//32H//+Bi///hZP//4WX//+Fn///hZ///4mn//+Nr//7i 660 | av/+3Fb//9xT///cVf//3FX//9xW///cVv//3Vf//91Y///dWf//3Fj//uNu//7lef//5Xj//+V5///m 661 | ev/84nn///OD/8GyYf8IBgP/CAgI/6aknf/y7+n/4t/a/+nm4f/q5+P/6ubi//Hu6f/69/L//vz4//z6 662 | +P/29PL/8/Hw//j29f/59/b/+vj3//v5+P/7+vn//fv7//r4+P/9/Pz///////////////////7+//v5 663 | +f/8+vr//fv7//r5+f//////nZyb/wAAAP8fGxL/3dB9///xkP/95on//+mN//7nhP/+4m///+Fw///h 664 | b///4W///+Fu///hbv//4W7//+Fu//7hbf//4W3//+Fu//7mgf//54T//+eD///mgv//5oH//uaB///m 665 | fv//5n3//uV8///lfP//5Xv//uR5//zidP/X0mb/faFn/2+WZv92pWv//thM///aUv//3Fn//txZ//7c 666 | Wv//3Vz//t1d//7eXv/+3l///t5g///eYv//32P//+Bj///hZ//+21j//tlN///aUP/+2lD//tpQ//7Z 667 | Uf/+2VH//tpS///bU//+2lL//txa///jcf/+43L//uNx//7jcv/+43P//uR0//vgcv//73v/y7hg/xsX 668 | Df8BAQL/gX96//Dt6P/m497/6ebi/+3q5v/u6+j/7+zo//Dt6v/w7u3/8/Hw//b08//49vX/+ff2//n3 669 | 9v/6+Pf/+/n5//z6+v/9+/v//Pv7//v6+v/7+fn/+/r6//z7+//+/Pz/+/n5//z7+//8/Pv/cW9u/wAA 670 | AP8yLRv/4dB5///vif/844P//ueG///mhf//5oX//uFx///faf//32r//99q///faf//32n//99p///f 671 | af/+32j//t9o///eZ//+323//uV///7lfv//5H3//uR8//7ke//+5Hv//uR5///jeP//43f//uN2///j 672 | df/33nD/zNBv/4anbP9ijmT/bppm//7aTP//3FT//9xV///dVf//3Ff//91Y///eWv//3lv//95c///e 673 | Xf//317//99f//7gYf/+3lz//tlL///ZTP//2U3//9lN///ZTf//2k7//9lO///ZTv//2k///tlN//7f 674 | X///427//+Js//7ibP//4m3//uJu//7jbv//42//+95t///xef/WwFf/Ix0M/wAAAP93dHD/9/Tv/+zp 675 | 5f/o5eH/7+zo//Hu6v/y7+z/8vDv//Ty8f/29PP/9/X0//j29f/59/b/+vj3//v5+P/8+vr//Pr6//37 676 | +//++/v//Pz8//z8/P/7+/v/+Pf3//79/f/+/v7/YGBe/wAAAP88NSD/6tp6///whf/74n7//+aA//7m 677 | gP//5oD//+aC//7jdv//3mT//95m///eZf//3mX//95l///eZP//3mT//95k///eZP/+3mT//t5h///h 678 | cP/+5Xr//uR4///keP//43f//uN2//7jdv/+43X//+N1///ic///4nL//uJz///jbP/PzGn/k7xp/3Sv 679 | bP/+2FD//tlR///aUv//21L//9tV///bVv//21f//9xY//7cWv/+3Vr//t1b//3eXP/+3l7//9lO///X 680 | SP//10r//tdJ//7XS//+10z//9dM///XTP//10z//9dM//7YTv/+32X//+Fo///haP//4Wn//+Fp//7h 681 | av/+4Wr//+Fq///iav/63Wr//+Va/+TGSf86MRX/AAAA/1ZUUP/f3Nf/+ffy/+zp5f/t6ub/8u/s//Lw 682 | 7//08vH/9fPy//f19P/49vX/+ff2//r49//6+Pj/+/n6//z6+v/9+/v//fv7//z6+v/59/f/+/r6//// 683 | ///e3dz/Q0NB/wAAAP9USyr/9OF5///qfv/84Xj//+V7///le///5Xv//+V6///lev/+5Hj//91i///c 684 | X///3GD//9xg///cX///3F///9xf///cX///3F///txf///cX///3WH//+Jz///idP//4nP//+Jy///i 685 | cv//4XH//+Fw///hcP//4W///+Bv///gbv/94G3//99n//bdYv+Pv2f//NdO//zXT//72E//+9hQ//vY 686 | U//72VT/+9lU//vZVv/82Vj//dpY//3aWf/721v/+9lU//vURv/81Uj/+9VH//vVSP/71En/+9RJ//vV 687 | Sf/71En/+9VK//rUSP/72FL//N5l//3dY//93WT//t5k//zeZf/83mb//N5m//3fZv/832f//d5l//nU 688 | TP/+3U3/99dO/1ZHHf8AAAD/HBwb/56cmP/28u7//Pn1//Dt6f/u6+r/8vDv//Xz8v/29PP/9/X0//n3 689 | 9v/6+Pf/+vj4//v5+f/7+fn/+vj4//n39//8+/v///////j39/+SkY//EBEQ/wAAAP90ZC3//+t3//zk 690 | df/733L//eJ0//3hdP/94nT//eJ0//3ic//94XP//eJ1//3dZf/92Vj//dpb//3aWv/92Vn//dlZ//3Z 691 | Wv/+2lr//dlZ//3ZWf/92Vr//dlZ//3cYv/94G///d9t//zfbf/9323//N9s//zfbP/93mv//d5q//3f 692 | av/83mn//d9o//3eaP/33Gb/2dNh//nTS//51Ez/+tRN//rVT//61VD/+9VR//rWUf/611L/+9dU//vX 693 | Vf/811b/+thY//rTS//60UX/+tFH//rRRv/60Ub/+tJH//rSR//60kf/+tJH//rSR//50Ub/+tlY//zc 694 | Yf/822D//Nth//zaYf/822H//Nti//rbY//622L/+ttk//vZXf/600j/99BH//vVSv/82Ev/iXQq/woJ 695 | BP8AAAD/Ojk3/6+uqf/18+/////7//r39f/z8fD/8vDv//Px8P/08vH/9fPy//b09P/39fX/+/n5///+ 696 | /v//////9vb1/6empP8qKir/AAAA/xYUCf+iizj//+BX//rdaf/53W3/+99u//vfbv/73m7/+99u//vf 697 | bv/73m7/+t5t//rfbv/73Wn/+9VV//vWVP/81lX//dZV//3WVf/81lT//NVU//3WVf/91lX//dVV//vW 698 | Vv/711X/+9xk//vdav/73Gj//N1o//zcaP/73Gf//Nxn//zcZv/83Gb/+9tl//vbZP/822X//Ntk//7Z 699 | Yf/600v/+tNL//rUS//61E3/+tVP//vVUP/71lD/+9ZR//vWUv/81lP//NdV//vVUP/70UX/+9FG//vR 700 | Rv/70Ub/+9FG//vRRv/70Ub/+9FG//vRRf/70UT/+dNI//vaXf/82l7//Ntf//zaX//82l///Npf//zb 701 | X//722D/+9pf//vbYf/711X/+tFG//rSR//50Ub/+dFH///gTP/Yt0D/VEcb/wAAAP8AAAD/Li4v/4+O 702 | if/X1dL//Pr5//////////////////////////////////39/P/S0c7/gH9+/yAhI/8AAAD/BwUC/2tZ 703 | I//nxUj//+FS//nRS//62V7/+95q//vdaP/83Wn//N5p//zeaf/83mn/+91o//vdaP/73Wj//N1p//zX 704 | V//71E//+9VR//vVUP/71FH/+9VR//vVUf/81VH//NVR//zVUv/81VL//NVR//zXV//83GT//Ntk//zb 705 | ZP/822T//Ntk//3bY//922P//Npj//zaYv/82mL//Npi//vZYf/62WH/+tNJ//rTSf/51Er/+dRK//rU 706 | TP/71U3/+tVO//rWT//71lD/+9ZR//zWUv/60kb/+9FC//vRQ//70UP/+9FD//vRQ//70UP/+9FD//vR 707 | Q//70UP/+9BB//nVTv/62Vz/+tlb//vaW//72lv/+9pb//vaXP/72l3//Npd//vaXf/7217/+tRO//rR 708 | Q//60kX/+tJE//nRRP/2zkP//dlH///dSf/IqTr/WUsa/wgGAf8AAAD/BAQH/zU1OP9jYmL/f399/4yM 709 | iv+Lioj/enl4/1tZWv8qKy7/AgIE/wAAAP8RDQP/bVwh/9i1P///4E7//NdK//fQSP/600j/+tdT//zd 710 | ZP/83GP//Ntj//zcZP/93GT//Nxk//zcZP/83GT//Ntk//3cZf/82Vv/+tRL//rUTP/61Ez/+tRN//rU 711 | Tf/61E3/+tRN//rUTf/61E3/+tRN//vVTv/71E3/+9ha//zbYf/72l//+9lf//vZX//72l//+tpe//vZ 712 | Xf/62V3/+9ld//vZXP/72Vz/+9lc//rTRv/600f/+tNI//rUSf/61Er/+tRK//rVS//61Uv/+tVM//rX 713 | Tv/71Ej/+tBA//rRQf/60UH/+tFB//rRQf/60UH/+tFB//rRQf/60UL/+tFB//rRQf/72FT/+tlZ//rZ 714 | WP/72Vj/+9lY//vaWP/62Vn/+tlZ//rZWf/72lr/+9pa//rTRf/60EH/+tFD//rRQv/60UL/+tFC//jP 715 | Qv/5zkH//tpF///dRf/jwEf/mYY8/0g/Gv8LCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Eg4B/1dJ 716 | GP+ojjH/7MdC///gSf/+2Ub/+M9D//rRRf/70kX/+9JE//vUSv/72l7//Npe//zaX//82l7//Npe//vb 717 | Xv/821///Ntf//zbX//8217/+9pd//vUS//700f/+9NI//rTSP/600n/+tNJ//vTSf/700n/+9NJ//vT 718 | Sf/700r/+9NJ//vUTv/82Vv/+9lb//vYWv/72Vr/+9lZ//vYWf/72Fn/+9hZ//vYWP/82Ff//NhY//zY 719 | WP/700X/+9NF//vTRv/71Ef/+9RI//vUSf/71Ur/+9VL//vVS//71Uv//NFB//zRP//70ED/+9FA//vR 720 | QP/70UD/+9FA//vRQP/70UD/+9FA//vRP//800X//NlW//3ZVv/82Vb//NlX//zZV//82Vf//NlX//zZ 721 | WP/82Vj//NlZ//zYVf/70UH/+9FA//zRQP/80UD//NFB//zRQf/80UH/+9FB//nPQf/5zj7//tpO///p 722 | YP//5F7/789W/9K2Tf+2nkP/qpM+/6yVP/++pEb/271R//XSUv//3Ub//99G//7UQ//4zkL/+c9C//vR 723 | Q//80UP/+9FD//vRQ//80UT/+9hX//zaWv/82lr//Npa//zaWv/82lr//Npa//zaWv/72lr//NlZ//za 724 | W//81U///NJE//zSRf/70kX/+9JF//vSRf/70kb/+9JG//vSR//70kf/+9JH//zTR//700b//NZQ//zY 725 | V//72Fb/+9hW//zXVf/811X//dhV//zXVP/81lP//NZT//zXU//811P/+dND//nTRP/400T/+NNE//nU 726 | Rv/51Ef/+NRH//nVSP/51Ur/+dJD//nRPv/50T//+dE+//nRPv/50T7/+dE+//nRPv/40T7/+NE+//jR 727 | P//50T7/+tZN//rZVP/62FP/+thT//nXVf/52FX/+tlV//rZVf/62VX/+tlV//nZV//51k3/+dA+//nR 728 | P//50T//+dI///nRP//50UD/+dFA//nRQP/50UD/+dA+//jUS//21lb/99ZV//3cWP//4Vr//+Vb///n 729 | W///5lv//+Ra///gW//82lT/9s8///XOPv/40ED/+dFA//nRQf/50UH/+dFB//nRQf/50UH/+dA///nW 730 | Tf/52Vj/+tlW//vZV//72Ff/+9hX//vYV//72Ff/+9hX//vYVv/72Ff/+thU//nSQ//50kL/+dJD//nS 731 | Q//50kP/+dJC//rSQ//60kT/+tJE//rSRP/60kP/+tJE//rSRf/61lD/+9dT//rXUf/611H/+tdR//zW 732 | UP/71k//+9ZP//vWT//71k//+9VP//rSP//600D/+dNA//nTQf/500L/+tNC//nUQ//51UX/+dRD//rR 733 | PP/70Tz/+9E8//vRPP/70Tz/+9E8//vRPP/70Tz/+9E8//vRPP/70Tz/+tI+//rXTf/72E7//NhP//zY 734 | T//62E//+thP//rYUP/62FD/+tlQ//rZUP/52VL/+tRE//vRO//70Tz/+9E8//vRPP/70Tz/+9E8//vR 735 | PP/70Tz/+9E8//rROv/61kr/+9lT//rYUf/511H/+NZR//fVUP/31VD/99VQ//jWUf/511L/+ddP//rR 736 | Pv/70Tz/+9E8//rRPP/50Tz/+dE9//nRPf/50T3/+dE9//jRO//500X/+tlT//rYUf/62FL/+9hS//vY 737 | Uv/62FH/+thR//rYUP/62FD/+thQ//rYUf/500T/+dE8//nSPv/50j7/+dE+//rSP//60j//+tI///rS 738 | P//60j//+tI///rSP//60j7/+dND//vWTP/71kv/+9ZL//rWS//51Ur/+dVK//rWSv/51kn/+dVJ//rV 739 | Sf/60T3/+dE+//nSP//60j//+tJA//rTQP/500H/+dNB//nRPP/60Dv/+9A8//vQPP/70Dz/+9A8//vQ 740 | O//70Dv/+9A8//vQO//70Dz/+9A7//rSQP/61k3/+tdL//vXTf/7103/+tdN//rXTf/6107/+tdO//rX 741 | Tv/6107/+9dP//rSQP/70Dv/+9A8//vQPP/70Dz/+9A8//vQPP/70Dz/+9A8//vQPP/60Dr/+tVI//vZ 742 | UP/62E//+thP//rYT//72E//+9hP//vYT//72FD/+9hR//vXTv/60T3/+9A7//vQPP/60Dz/+dE7//nQ 743 | O//5zzv/+dA7//nQO//5zzv/+dE///rXTv/6107/+9dO//rYT//62E//+tdO//rXTv/62E7/+tdO//rX 744 | Tf/710//+tVI//nQPP/60Dz/+tA8//rQPP/60Dz/+tA8//nQPP/50Dz/+tA8//rRPP/60Tz/+tE9//nR 745 | PP/51EX/+tZJ//rVSP/51Uj/+dRG//jURv/51Eb/+dNG//nTRf/600X/+dI9//nRPf/50T7/+dI///nS 746 | P//50kD/+dJA//nRPv/50Dr/+dA6//nQOv/50Dr/+dA6//nQOv/50Dr/+dA6//nQOv/50Dr/+dA7//jQ 747 | Ov/51EX/+tZM//rWTP/61kz/+tVN//rWTf/61k3/+tdO//rXTv/6107/+tdO//rWTP/50Dz/+s88//nQ 748 | PP/50Dz/+dA8//nQPP/50Dz/+dA8//nQPP/60Dz/+dA7//nVSf/610//+ddO//nXTv/6107/+ddO//rX 749 | Tv/5107/+tdO//vXTv/6107/+dE+//rPPP/50Dz/+tA8//rPPP/60Dz/+tA8//rQPP/60Dz/+tA8//rQ 750 | PP/61Uv/+tdO//rWTv/61k7/+tZO//rWTf/71k3/+9ZN//rWTf/61U3/+tZM//rWTP/60T//+dA8//rQ 751 | Pf/60Dz/+tA8//rQPP/60Dz/+s88//rQPP/50D3/+dA9//nQPf/50Dz/+dE+//nURv/500j/+dNH//nU 752 | Rv/500X/+dNF//nTRP/500T/+dNE//vPPf/7zz7//M8///vPPv/70D//+9FA//zQQP/7zjz/+847//vO 753 | O//6zjv/+s47//rOO//6zjv/+s47//rOO//6zjv/+s47//rOOv/7zjz//NNJ//vVSv/81Uv//NVL//zV 754 | S//81Ez//NRM//vVTP/71Uz/+9VM//zWTf/900n/+846//rOO//6zjv/+s47//rOO//6zjv/+s47//rO 755 | O//6zjv/+s47//rOOv/71En//NVO//zVTf/81U3//NVN//zVTf/81U3//NVN//zVTf/81U3/+9VN//vQ 756 | Pv/6zjv/+s47//rOO//6zjv/+s47//rOO//6zjv/+s47//rOO//7zTr/+9NH//vVTf/81Ez//NRM//zU 757 | TP/81Ev//NRL//zUTP/81Ev//NRL//3USv/81Ez/+9JD//vOOv/6zjv/+s47//rOO//6zjv/+s47//rO 758 | O//6zjv/+847//vOO//7zjv/+848//vOO//80EH/+9FF//vRRP/80UP/+9FD//vQQv/80EP//NBC//zQ 759 | Qv/7zDz/+8w9//vMPv/6zD7/+80///vOQP/6zT3/+sw6//vMO//7zDv/+8w7//vMO//7zDv/+8w7//vM 760 | O//7zDv/+8w7//vMO//6zDr/+85A//vSSv/80kn//NJK//zSSv/80kr//NJL//zSS//700z//NNL//zT 761 | TP/9007/+9BE//rLOv/7zDv/+8w7//vMO//7zDv/+8w7//vMO//7zDv/+8w7//vMO//7zDv//NJK//zT 762 | Tv/80k3//NNN//zSTf/80k3//NJN//zSTf/80k3//NJN//zTTf/7zT7/+8w6//vMO//7zDv/+8w7//vM 763 | O//6zDv/+8w7//vMO//6zDv/+ss6//vOQv/7003//NJL//3SS//80kv//NJL//zRS//80kr//NJK//vS 764 | Sv/70kn/+9JJ//vRSP/6zDz/+sw7//rMO//6zDv/+sw7//rMO//6zDv/+sw7//rMO//6zDv/+sw7//rM 765 | O//7zDv/+8w8//vOQv/7z0T/+85C//vOQ//7zkL/+85B//vNQf/7zUH/+Ms8//jLPf/4yz7/+co+//nL 766 | Pv/5yz7/+sk6//nJOv/5yjr/+co6//nKOv/5yjr/+co6//nKOv/5yjr/+co6//nKOv/5yjr/+ck6//nO 767 | RP/5z0f/+tBI//rQSP/60Ej/+tBJ//rPSv/60Er/+9BJ//rRSv/60Er/+tFM//nMQP/5yTn/+co6//nK 768 | Ov/5yjr/+co6//nKOv/5yjr/+co6//nKOv/5yTn/+co7//nQSf/50Uz/+dBL//nQS//50Uz/+dFM//nR 769 | TP/50Uz/+dFM//nRS//60Uz/+cs///nJOf/5yjr/+co6//nKOv/5yTr/+ck6//nKOv/5yjr/+co6//nJ 770 | Of/6yj3/+89K//vPSv/6z0v/+s9K//rPS//6z0r/+tBI//rQSP/60Ej/+dBI//nPR//5z0j/+cs///nJ 771 | Of/6yTr/+sk7//rJPP/6yTz/+sk8//rJPP/5yjz/+co8//nKPP/5yjz/+co7//nJO//5yj7/+s1D//rM 772 | Qf/6zEL/+ctB//jLQf/6y0H/+stB//nKPP/5yj3/+ck9//jKPf/5yj3/+ck7//jIOv/4yDv/+cg7//nI 773 | O//5yDv/+cg7//nIO//5yDv/+cg7//nIO//5yDv/+ck6//nKPP/6zkb/+s5H//rOR//6zkf/+s5H//vP 774 | SP/5z0j/+s9J//rPSv/6z0r/+s9K//rPSf/5yj3/+ck6//nIO//4yDv/+Mg7//nIO//5yDv/+cg7//nI 775 | O//5yDv/+cg6//nJPP/6z0n/+tBL//rQS//60Ev/+tBL//rQS//60Ev/+tBL//rQS//60Ev/+tBL//nK 776 | QP/4yDr/+cg7//nIO//5yDv/+Mg7//jIO//5yDv/+cg7//nIO//4yDv/+Mk7//nOR//6z0r/+s9J//vP 777 | Sf/7z0j/+s5I//rOR//7zkf/+85H//rNR//6zUf/+s5I//rNQ//5yTr/+Mg7//nJO//5yTv/+ck7//nJ 778 | O//5yTv/+Mk7//jJO//4yTv/+Mk7//jJO//4yTv/+Mg7//rKP//6y0L/+ctB//nLQP/4ykD/+cpA//nK 779 | QP/5yTv/+ck8//rJPf/4yj3/+Mk8//nJOv/5yTr/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJ 780 | O//5yTv/+ck7//jJOf/5zEH/+s1G//rNRv/7zkb/+85G//vORv/6zUb/+c9G//rPSP/6z0n/+tBI//rR 781 | Sf/5z0X/+ck6//nJO//5yTr/+ck6//nJOv/5yTr/+Mk6//jJOv/5yTv/+ck7//nJOv/5yTz/+s9I//rQ 782 | Sv/7z0r/+89K//rPSv/6z0r/+s9K//rPSv/6z0r/+s9J//rQSv/5y0D/+ck6//nJO//5yTv/+ck7//nJ 783 | O//5yTv/+ck7//nJO//5yTv/+ck7//jJOv/6zUL/+tBI//rPR//7zUb/+85G//rNRv/7zkb/+s1G//rN 784 | Rv/7zkb/+s5G//rORv/6zkb/+co8//jJOv/5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJ 785 | O//5yTv/+ck7//jJOf/5yTv/+cs+//nLP//5yz//+ctA//nKQP/5yj//+ck7//nJO//6yjz/+so8//nK 786 | O//4yjj/+ck6//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTr/+cxD//nN 787 | RP/5zUT/+c5F//rORf/6zkX/+s5F//rORf/7z0b/+89G//rPR//60En/+c1C//nKOP/5yjn/+ck5//nK 788 | Of/5yjn/+co5//nJOP/5yTj/+ck7//nJO//5yTv/+co8//rPR//50Ej/+dBI//nQSP/60Ej/+dBI//nP 789 | R//50Ej/+dBI//rQSP/50Ej/+ctB//nJOv/5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJ 790 | O//5yDr/+ss+//rOR//6zUb/+s1G//rORf/6zkX/+s5F//rORf/6zkX/+s5F//rORf/5zUT/+c1F//nK 791 | P//5yDr/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nK 792 | O//5yz7/+co+//jKPf/4yj3/+Mo9//nJO//5yTv/+Mo7//nKO//5yjr/+co5//nJOv/5yTr/+ck6//nJ 793 | Ov/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTr/+cs8//nOQ//5zUP/+c1E//rNRP/6zkT/+s5F//rO 794 | Rf/6zkX/+s9G//rPRv/6z0b/+9BI//nMQP/5yjn/+co6//nKOv/5yjr/+co5//nKOf/5yjn/+co5//nK 795 | Ov/5yTr/+ck6//nKPP/6z0f/+c9H//nPR//5z0f/+89H//rPR//6z0f/+s5G//rORv/6z0b/+s9H//nM 796 | Qf/5yDn/+ck7//nJOv/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTv/+ck5//jKO//6zkX/+s5F//rO 797 | Rf/6zkX/+s5F//rORf/6zUT/+c1E//nNRP/5zUT/+c1E//nOQ//5zUH/+Mk6//nJOv/5yTr/+ck6//nJ 798 | Ov/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTn/+co8//nKPf/5yj3/+Mo8//jK 799 | PP/6yTj/+sk4//rKOP/6yjj/+co4//nKOf/7yjj/+sk3//rJN//6yTf/+sk3//rJN//6yTf/+sk3//rJ 800 | N//6yTf/+sk3//vLPf/6zEH/+s1A//rNQf/6zUL/+s1B//vNQv/7zUP/+s9C//vPRP/8z0X/+9BF//vQ 801 | RP/6zDv/+ss4//rLOf/7yzn/+ss4//nKOP/6yzn/+so4//nKOP/5yjj/+co4//rKN//6yzv/+89F//vO 802 | Rf/7zkX/+85E//vORP/7zkX/+85F//vORf/6zkX/+s5E//vPRf/6zD//+sk2//rJOP/6yTf/+sk3//rJ 803 | N//6yTf/+sk3//rJN//6yDj/+sk3//rJN//6yjj/+81C//vOQ//7zUP/+81D//vNQ//6zEP/+s1C//rO 804 | Qv/6zUL/+s1B//rNQf/7zUD/+s1A//nKOv/6yTf/+sk3//rJN//6yTf/+sk3//rJN//6yTf/+sk3//rJ 805 | N//6yTf/+sk3//rJN//6yTf/+sk3//rJOP/7yjr/+co7//rKOv/6yjn/AAAAAAAAAAAAAAAAAMo4/wAA 806 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK 807 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA 808 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA 809 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA 810 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK 811 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA 812 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA 813 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA 814 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK 815 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA 816 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA 817 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA 818 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK 819 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA 820 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA 821 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA 822 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK 823 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA 824 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA 825 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA 826 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK 827 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA 828 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA 829 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA 830 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK 831 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA 832 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/w== 833 | 834 | 835 | -------------------------------------------------------------------------------- /CodemastersBinImage/icon100x100.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lab313ru/CodemastersBinImage/10090d756d50ec8f5bdbb0f829e1a3eee71d12dc/CodemastersBinImage/icon100x100.ico -------------------------------------------------------------------------------- /CodemastersBinImage/win_imploder.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lab313ru/CodemastersBinImage/10090d756d50ec8f5bdbb0f829e1a3eee71d12dc/CodemastersBinImage/win_imploder.dll -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodemastersBinImage 2 | Codemasters Sega Mega Drive / Genesis games Images converter 3 | 4 | This tool allows you to extract and insert back general graphics in **Sega Genesis** / **Mega Drive** games by **Codemasters**. 5 | 6 | Features: 7 | - Search general graphics data in ROMs; 8 | - Exporting graphics to BMP images; 9 | - Imploding your images back into ROM; 10 | - In case of compressed image is greater than original one, compressed binary will be saved separately for manual insertion. 11 | --------------------------------------------------------------------------------