├── example.png
├── src
└── Trainer-Editor
│ ├── hte.ico
│ ├── ROMs
│ ├── BPRE.json
│ ├── BPGE.ini
│ ├── BPEE.ini
│ ├── BPRE.ini
│ ├── AXVE.ini
│ ├── epsi.ini
│ ├── AXPE.ini
│ └── MrDS.ini
│ ├── Resources
│ ├── Add_16x.png
│ ├── Close_16x.png
│ ├── Edit_16x.png
│ ├── Export_16x.png
│ ├── Import_16x.png
│ ├── Remove_16x.png
│ ├── Save_16x.png
│ ├── OpenFolder_16x.png
│ └── InformationSymbol_16x.png
│ ├── App.config
│ ├── Settings.cs
│ ├── settings.json
│ ├── Properties
│ ├── Settings.settings
│ ├── Settings.Designer.cs
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ └── Resources.resx
│ ├── Program.cs
│ ├── Forms
│ ├── AboutDialog.cs
│ ├── OffsetDialog.cs
│ ├── FreeSpaceDialog.cs
│ ├── AboutDialog.Designer.cs
│ ├── AboutDialog.resx
│ ├── OffsetDialog.resx
│ ├── FreeSpaceDialog.resx
│ ├── OffsetDialog.Designer.cs
│ └── FreeSpaceDialog.Designer.cs
│ ├── Game.cs
│ ├── Trainer.cs
│ ├── NumberBox.cs
│ ├── MainForm.Pokemon.cs
│ ├── Trainer-Editor.csproj
│ ├── MainForm.Trainers.cs
│ ├── MainForm.cs
│ └── MainForm.resx
├── README.md
├── Trainer-Editor.sln
├── LICENSE
└── .gitignore
/example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/example.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/hte.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/hte.ico
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/BPRE.json:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/ROMs/BPRE.json
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/Add_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/Add_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/Close_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/Close_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/Edit_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/Edit_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/Export_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/Export_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/Import_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/Import_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/Remove_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/Remove_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/Save_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/Save_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/OpenFolder_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/OpenFolder_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/Resources/InformationSymbol_16x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erandis-vol/Trainer-Editor/HEAD/src/Trainer-Editor/Resources/InformationSymbol_16x.png
--------------------------------------------------------------------------------
/src/Trainer-Editor/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Settings.cs:
--------------------------------------------------------------------------------
1 | namespace Hopeless
2 | {
3 | public class Settings
4 | {
5 | public bool RepointAutomatically { get; set; }
6 |
7 | public bool CleanRepointed { get; set; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | // Determines whether a party should be repointed automatically.
3 | "RepointAutomatically": true,
4 |
5 | // Determines whether a repointed party should be overwritten with freespace.
6 | "CleanRepointed": false
7 | }
8 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Hopeless Trainer Editor
2 | Copyright 2015-2017 erandis-vol
3 |
4 | A trainer editor for the non-Japanese 3rd generation Pokémon games.
5 |
6 | 
7 |
8 | ## Features
9 | * Basic trainer editing
10 | * Pointer-based loading of data
11 | * (Be careful editing the settings files because of this!)
12 | * Trainer import and export
13 | * Basic trainer randomizer
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/BPGE.ini:
--------------------------------------------------------------------------------
1 | ; Pokémon LeafGreen (English)
2 | [pokemon]
3 | Count=412
4 | Names=0x144
5 |
6 | [pokemon_sprites]
7 | FrontData=0x128
8 | RegularPalettes=0x130
9 |
10 | [items]
11 | Count=375
12 | Data=0x1C8
13 |
14 | [attacks]
15 | Count=355
16 | Names=0x148
17 |
18 | [trainers]
19 | Count=743
20 | Data=0xFC00
21 |
22 | [trainer_classes]
23 | Count=107
24 | Data=0x259CC
25 | Names=0xD8074
26 |
27 | [trainer_sprites]
28 | Count=148
29 | Data=0x3473C
30 | Palettes=0x3474C
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/BPEE.ini:
--------------------------------------------------------------------------------
1 | ; Pokémon Emerald (English)
2 | [pokemon]
3 | Count=412
4 | Names=0x144
5 |
6 | [pokemon_sprites]
7 | FrontData=0x2CAE0
8 | RegularPalettes=0x130
9 |
10 | [items]
11 | Count=377
12 | Data=0x1C8
13 |
14 | [attacks]
15 | Count=355
16 | Names=0x148
17 |
18 | [trainers]
19 | Count=855
20 | Data=0x3587C
21 |
22 | [trainer_classes]
23 | Count=66
24 | Data=0x4E6A8
25 | Names=0x183B4
26 |
27 | [trainer_sprites]
28 | Count=93
29 | Data=0x5DF78
30 | Palettes=0x5DF80
31 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/BPRE.ini:
--------------------------------------------------------------------------------
1 | ; Pokémon FireRed (English)
2 | [pokemon]
3 | Count=412
4 | Names=0x144
5 |
6 | [pokemon_sprites]
7 | FrontData=0x128
8 | RegularPalettes=0x130
9 |
10 | [items]
11 | Count=375
12 | Data=0x1C8
13 |
14 | [attacks]
15 | Count=355
16 | Names=0x148
17 |
18 | [trainers]
19 | Count=743
20 | Data=0xFC00
21 |
22 | [trainer_classes]
23 | Count=107
24 | Data=0x259CC
25 | Names=0xD80A0
26 |
27 | [trainer_sprites]
28 | Count=148
29 | Data=0x3473C
30 | Palettes=0x3474C
31 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/AXVE.ini:
--------------------------------------------------------------------------------
1 | ; Pokémon Ruby (English)
2 | [pokemon]
3 | Count=412
4 | Names=0xFA58
5 |
6 | [pokemon_sprites]
7 | FrontData=0xD324
8 | RegularPalettes=0x40954
9 |
10 | [items]
11 | Count=349
12 | Data=0xA98F0
13 |
14 | [attacks]
15 | Count=355
16 | Names=0x2E18C
17 |
18 | [trainers]
19 | Count=694
20 | Data=0xD890
21 |
22 | [trainer_classes]
23 | Count=59
24 | Data=0x24120
25 | Names=0xF7088
26 |
27 | [trainer_sprites]
28 | Count=148
29 | Data=0x31ADC
30 | Palettes=0x31AF0
31 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/epsi.ini:
--------------------------------------------------------------------------------
1 | ; Epsilon's artificial RED base
2 | [pokemon]
3 | Count=1020
4 | Names=0x144
5 |
6 | [pokemon_sprites]
7 | FrontData=0x128
8 | RegularPalettes=0x130
9 |
10 | [items]
11 | Count=375
12 | Data=0x1C8
13 |
14 | [attacks]
15 | Count=512
16 | Names=0x148
17 |
18 | [trainers]
19 | Count=743
20 | Data=0xFC00
21 |
22 | [trainer_classes]
23 | Count=107
24 | Data=0x259CC
25 | Names=0xD80A0
26 |
27 | [trainer_sprites]
28 | Count=148
29 | Data=0x3473C
30 | Palettes=0x3474C
31 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/AXPE.ini:
--------------------------------------------------------------------------------
1 | ; Pokémon Sapphire (English)
2 | [pokemon]
3 | Count=412
4 | Names=0xFA58
5 |
6 | [pokemon_sprites]
7 | FrontData=0xD324
8 | RegularPalettes=0x40954
9 |
10 | [items]
11 | Count=349
12 | Data=0xA98F0
13 |
14 | [attacks]
15 | Count=355
16 | Names=0x2E18C
17 |
18 | [trainers]
19 | Count=694
20 | Data=0xD890
21 |
22 | [trainer_classes]
23 | Count=59
24 | Data=0x24120
25 | Names=0xF7088
26 |
27 | [trainer_sprites]
28 | Count=148
29 | Data=0x31ADC
30 | Palettes=0x31AF0
31 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/ROMs/MrDS.ini:
--------------------------------------------------------------------------------
1 | ; MrDollSteak's Attack and Decap. base
2 | [pokemon]
3 | Count=412
4 | Names=0x144
5 |
6 | [pokemon_sprites]
7 | FrontData=0x128
8 | RegularPalettes=0x130
9 |
10 | [items]
11 | Count=375
12 | Data=0x1C8
13 |
14 | [attacks]
15 | Count=512
16 | Names=0x148
17 |
18 | [trainers]
19 | Count=743
20 | Data=0xFC00
21 |
22 | [trainer_classes]
23 | Count=107
24 | Data=0x259CC
25 | Names=0xD80A0
26 |
27 | [trainer_sprites]
28 | Count=148
29 | Data=0x3473C
30 | Palettes=0x3474C
31 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace Hopeless
5 | {
6 | static class Program
7 | {
8 | ///
9 | /// The main entry point for the application.
10 | ///
11 | [STAThread]
12 | static void Main()
13 | {
14 | Application.EnableVisualStyles();
15 | Application.SetCompatibleTextRenderingDefault(false);
16 | Application.Run(new MainForm());
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/AboutDialog.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Forms;
2 |
3 | namespace Hopeless.Forms
4 | {
5 | public partial class AboutDialog : Form
6 | {
7 | public AboutDialog()
8 | {
9 | InitializeComponent();
10 |
11 | label1.Left = (ClientSize.Width - label1.Width) / 2;
12 | label2.Left = (ClientSize.Width - label2.Width) / 2;
13 | label3.Left = (ClientSize.Width - label3.Width) / 2;
14 | label4.Left = (ClientSize.Width - label4.Width) / 2;
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/OffsetDialog.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace Hopeless.Forms
5 | {
6 | public partial class OffsetDialog : Form
7 | {
8 | public OffsetDialog(int offset, int count)
9 | {
10 | InitializeComponent();
11 |
12 | Offset = offset;
13 | Count = count;
14 | }
15 |
16 | public int Offset
17 | {
18 | get { return txtOffset.Value; }
19 | private set { txtOffset.Value = value; }
20 | }
21 |
22 | public int Count
23 | {
24 | get { return txtSize.Value; }
25 | set { txtSize.Value = value; }
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Trainer-Editor.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 14
4 | VisualStudioVersion = 14.0.25420.1
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trainer-Editor", "src\Trainer-Editor\Trainer-Editor.csproj", "{D511F97B-8CC5-4608-AD34-461E3D3B6E38}"
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 | {D511F97B-8CC5-4608-AD34-461E3D3B6E38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {D511F97B-8CC5-4608-AD34-461E3D3B6E38}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {D511F97B-8CC5-4608-AD34-461E3D3B6E38}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {D511F97B-8CC5-4608-AD34-461E3D3B6E38}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015-2017 erandis-vol
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/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 Hopeless.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 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Game.cs:
--------------------------------------------------------------------------------
1 | namespace Hopeless
2 | {
3 | class Game
4 | {
5 | public GameTrainers Trainers { get; set; }
6 | public GamePokemon Pokemon { get; set; }
7 | public GameItems Items { get; set; }
8 | public GameAttacks Attacks { get; set; }
9 | }
10 |
11 | class GameTrainers
12 | {
13 | public int Count { get; set; }
14 | public int Data { get; set; }
15 | public GameTrainersClasses Classes { get; set; }
16 | public GameTrainersSprites Sprites { get; set; }
17 | }
18 |
19 | class GameTrainersClasses
20 | {
21 | public int Count { get; set; }
22 | public int Data { get; set; }
23 | public int Names { get; set; }
24 | }
25 |
26 | class GameTrainersSprites
27 | {
28 | public int Count { get; set; }
29 | public int Dat { get; set; }
30 | public int Palettes { get; set; }
31 | }
32 |
33 | class GamePokemon
34 | {
35 | public int Count { get; set; }
36 | public int Names { get; set; }
37 | public int Sprites { get; set; }
38 | public int Palettes { get; set; }
39 | }
40 |
41 | class GameItems
42 | {
43 | public int Count { get; set; }
44 | public int Data { get; set; }
45 | }
46 |
47 | class GameAttacks
48 | {
49 | public int Count { get; set; }
50 | public int Names { get; set; }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/FreeSpaceDialog.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Windows.Forms;
4 | using GBAHL.IO;
5 |
6 | namespace Hopeless.Forms
7 | {
8 | public partial class FreeSpaceDialog : Form
9 | {
10 | ROM rom;
11 | int[] results;
12 | int selection = -1;
13 |
14 | public FreeSpaceDialog(ROM rom, int neededBytes, int searchStart)
15 | {
16 | InitializeComponent();
17 | this.rom = rom;
18 |
19 | txtNeeded.Value = neededBytes;
20 | txtSearchStart.Value = searchStart;
21 | txtNeeded.ReadOnly = true;
22 |
23 | Search();
24 | }
25 |
26 | private void button3_Click(object sender, EventArgs e)
27 | {
28 | Search();
29 | }
30 |
31 | private void txtRepointTo_TextChanged(object sender, EventArgs e)
32 | {
33 | button1.Enabled = txtRepointTo.Value > 0;
34 | }
35 |
36 | private void Search()
37 | {
38 | txtRepointTo.Value = rom.Find(0xFF, txtNeeded.Value, txtSearchStart.Value);
39 | button1.Enabled = txtRepointTo.Value > 0;
40 | }
41 |
42 | public int Offset
43 | {
44 | get { return txtRepointTo.Value; }
45 | }
46 |
47 | public int SearchStart
48 | {
49 | get { return txtSearchStart.Value; }
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("Hopeless Trainer Editor")]
9 | [assembly: AssemblyDescription("Hopeless Trainer Editor")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("lost")]
12 | [assembly: AssemblyProduct("Hopeless Trainer Editor")]
13 | [assembly: AssemblyCopyright("Copyright © lost 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("d511f97b-8cc5-4608-ad34-461e3d3b6e38")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Trainer.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Hopeless
4 | {
5 | public class Trainer
6 | {
7 | public int Index { get; }
8 |
9 | public byte Class;
10 | public byte Gender;
11 | public byte Music;
12 | public byte Sprite;
13 | public string Name = string.Empty;
14 | public bool HasHeldItems;
15 | public ushort[] Items = new ushort[4];
16 | public bool DoubleBattle;
17 | //public byte[] Padding = new byte[3];
18 | public uint AI;
19 |
20 | public bool HasCustomAttacks;
21 | public int PartyOffset;
22 | public List Party = new List();
23 |
24 | public Trainer(int index)
25 | {
26 | Index = index;
27 | }
28 |
29 | ///
30 | /// The size of this in bytes.
31 | ///
32 | public int Size
33 | {
34 | get { return 40; }
35 | }
36 |
37 | ///
38 | /// The original size of this 's party in bytes.
39 | ///
40 | public int OriginalPartySize { get; set; } = 0;
41 |
42 | ///
43 | /// The size of this 's party in bytes.
44 | ///
45 | public int PartySize
46 | {
47 | get
48 | {
49 | return Party.Count * (HasCustomAttacks ? 16 : 8);
50 | }
51 | }
52 |
53 | ///
54 | /// Gets whether this 's party requires repointing to safely save.
55 | ///
56 | public bool RequiresRepoint
57 | {
58 | get { return PartySize > OriginalPartySize || (PartyOffset == 0 && Party.Count != 0); }
59 | }
60 | }
61 |
62 | public class Pokemon
63 | {
64 | public Pokemon(int index)
65 | {
66 | Index = index;
67 | }
68 |
69 | public int Index { get; set; }
70 |
71 | public ushort EVs { get; set; } = 0;
72 | public ushort Species { get; set; } = 0;
73 | public ushort Level { get; set; } = 0;
74 | public ushort HeldItem { get; set; } = 0;
75 | public ushort[] Attacks { get; } = new ushort[4];
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/NumberBox.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Globalization;
3 | using System.Windows.Forms;
4 |
5 | namespace Hopeless
6 | {
7 | public class DecimalBox : TextBox
8 | {
9 | public int MaximumValue { get; set; } = int.MaxValue - 1;
10 | public int MinimumValue { get; set; } = 0;
11 |
12 | public int Value
13 | {
14 | get
15 | {
16 | if (TextLength > 0)
17 | {
18 | int i;
19 | if (int.TryParse(Text, out i))
20 | return i;
21 | }
22 | return 0;
23 | }
24 | set
25 | {
26 | Text = value.ToString();
27 | }
28 | }
29 |
30 | protected override void OnKeyPress(KeyPressEventArgs e)
31 | {
32 | if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
33 | e.Handled = true;
34 |
35 | base.OnKeyPress(e);
36 | }
37 |
38 | protected override void OnTextChanged(EventArgs e)
39 | {
40 | base.OnTextChanged(e);
41 |
42 | if (Value < MinimumValue)
43 | Value = MinimumValue;
44 | if (Value > MaximumValue)
45 | Value = MaximumValue;
46 | }
47 | }
48 |
49 | public class HexBox : TextBox
50 | {
51 | public int MaximumValue { get; set; } = int.MaxValue - 1;
52 | public int MinimumValue { get; set; } = 0;
53 |
54 | public int Value
55 | {
56 | get
57 | {
58 | if (TextLength > 0)
59 | {
60 | int i;
61 | if (int.TryParse(Text, NumberStyles.HexNumber, null, out i))
62 | return i;
63 | }
64 | return 0;
65 | }
66 | set
67 | {
68 | Text = value.ToString("X");
69 | }
70 | }
71 |
72 | protected override void OnKeyPress(KeyPressEventArgs e)
73 | {
74 | if (!char.IsControl(e.KeyChar) &&
75 | !char.IsDigit(e.KeyChar) &&
76 | !(e.KeyChar >= 'a' && e.KeyChar <= 'f') &&
77 | !(e.KeyChar >= 'A' && e.KeyChar <= 'F'))
78 | e.Handled = true;
79 |
80 | base.OnKeyPress(e);
81 | }
82 |
83 | protected override void OnTextChanged(EventArgs e)
84 | {
85 | base.OnTextChanged(e);
86 |
87 | if (Value < MinimumValue)
88 | Value = MinimumValue;
89 | if (Value > MaximumValue)
90 | Value = MaximumValue;
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/MainForm.Pokemon.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Drawing;
3 | using GBAHL.Drawing;
4 | using GBAHL.IO;
5 | using GBAHL.Text;
6 |
7 | namespace Hopeless
8 | {
9 | public partial class MainForm
10 | {
11 | int pokemonCount;
12 | int itemCount;
13 | int attackCount;
14 |
15 | string[] pokemon;
16 | string[] items;
17 | string[] attacks;
18 |
19 | void LoadPokemonNames()
20 | {
21 | var nameTablePtr = romInfo.GetInt32("pokemon", "Names", 16);
22 | rom.Seek(nameTablePtr);
23 | rom.ReadPointerAndSeek();
24 | pokemon = rom.ReadTextTable(11, pokemonCount, Table.Encoding.English);
25 | }
26 |
27 | void LoadAttacks()
28 | {
29 | var tablePtr = romInfo.GetInt32("attacks", "Names", 16);
30 | rom.Seek(tablePtr);
31 | rom.ReadPointerAndSeek();
32 | attacks = rom.ReadTextTable(13, attackCount, Table.Encoding.English);
33 | }
34 |
35 | void LoadItems()
36 | {
37 | var firstItemPtr = romInfo.GetInt32("items", "Data", 16);
38 | rom.Seek(firstItemPtr);
39 | var firstItem = rom.ReadPointer();
40 |
41 | items = new string[itemCount];
42 | for (int i = 0; i < itemCount; i++)
43 | {
44 | rom.Seek(firstItem + i * 44);
45 | items[i] = rom.ReadText(14, Table.Encoding.English);
46 | }
47 | }
48 |
49 | Image LoadFrontSprite(int id)
50 | {
51 | Sprite sprite;
52 | Palette palette;
53 |
54 | try
55 | {
56 | // ------------------------------
57 | // read compressed sprite
58 | rom.Seek(romInfo.GetInt32("pokemon_sprites", "FrontData", 16));
59 | rom.ReadPointerAndSeek();
60 | rom.Skip(id * 8);
61 | rom.ReadPointerAndSeek();
62 | sprite = rom.ReadCompressedSprite4();
63 |
64 | // ------------------------------
65 | // read compressed palette
66 | rom.Seek(romInfo.GetInt32("pokemon_sprites", "RegularPalettes", 16));
67 | rom.ReadPointerAndSeek();
68 | rom.Skip(id * 8);
69 | rom.ReadPointerAndSeek();
70 | if (rom.PeekCompressed())
71 | palette = rom.ReadCompressedPalette();
72 | else
73 | palette = rom.ReadPalette(16);
74 |
75 | // ------------------------------
76 | return sprite.ToImage(8, 8, palette, false);
77 | }
78 | catch (Exception ex)
79 | {
80 | #if DEBUG
81 | Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
82 | #endif
83 | return invisible;
84 | }
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | x64/
19 | x86/
20 | bld/
21 | [Bb]in/
22 | [Oo]bj/
23 |
24 | # Libraries
25 | [Ll]ib
26 |
27 | # Visual Studio 2015 cache/options directory
28 | .vs/
29 | # Uncomment if you have tasks that create the project's static files in wwwroot
30 | #wwwroot/
31 |
32 | # MSTest test Results
33 | [Tt]est[Rr]esult*/
34 | [Bb]uild[Ll]og.*
35 |
36 | # NUNIT
37 | *.VisualState.xml
38 | TestResult.xml
39 |
40 | # Build Results of an ATL Project
41 | [Dd]ebugPS/
42 | [Rr]eleasePS/
43 | dlldata.c
44 |
45 | # DNX
46 | project.lock.json
47 | artifacts/
48 |
49 | *_i.c
50 | *_p.c
51 | *_i.h
52 | *.ilk
53 | *.meta
54 | *.obj
55 | *.pch
56 | *.pdb
57 | *.pgc
58 | *.pgd
59 | *.rsp
60 | *.sbr
61 | *.tlb
62 | *.tli
63 | *.tlh
64 | *.tmp
65 | *.tmp_proj
66 | *.log
67 | *.vspscc
68 | *.vssscc
69 | .builds
70 | *.pidb
71 | *.svclog
72 | *.scc
73 |
74 | # Chutzpah Test files
75 | _Chutzpah*
76 |
77 | # Visual C++ cache files
78 | ipch/
79 | *.aps
80 | *.ncb
81 | *.opendb
82 | *.opensdf
83 | *.sdf
84 | *.cachefile
85 |
86 | # Visual Studio profiler
87 | *.psess
88 | *.vsp
89 | *.vspx
90 | *.sap
91 |
92 | # TFS 2012 Local Workspace
93 | $tf/
94 |
95 | # Guidance Automation Toolkit
96 | *.gpState
97 |
98 | # ReSharper is a .NET coding add-in
99 | _ReSharper*/
100 | *.[Rr]e[Ss]harper
101 | *.DotSettings.user
102 |
103 | # JustCode is a .NET coding add-in
104 | .JustCode
105 |
106 | # TeamCity is a build add-in
107 | _TeamCity*
108 |
109 | # DotCover is a Code Coverage Tool
110 | *.dotCover
111 |
112 | # NCrunch
113 | _NCrunch_*
114 | .*crunch*.local.xml
115 | nCrunchTemp_*
116 |
117 | # MightyMoose
118 | *.mm.*
119 | AutoTest.Net/
120 |
121 | # Web workbench (sass)
122 | .sass-cache/
123 |
124 | # Installshield output folder
125 | [Ee]xpress/
126 |
127 | # DocProject is a documentation generator add-in
128 | DocProject/buildhelp/
129 | DocProject/Help/*.HxT
130 | DocProject/Help/*.HxC
131 | DocProject/Help/*.hhc
132 | DocProject/Help/*.hhk
133 | DocProject/Help/*.hhp
134 | DocProject/Help/Html2
135 | DocProject/Help/html
136 |
137 | # Click-Once directory
138 | publish/
139 |
140 | # Publish Web Output
141 | *.[Pp]ublish.xml
142 | *.azurePubxml
143 | # TODO: Comment the next line if you want to checkin your web deploy settings
144 | # but database connection strings (with potential passwords) will be unencrypted
145 | *.pubxml
146 | *.publishproj
147 |
148 | # NuGet Packages
149 | *.nupkg
150 | # The packages folder can be ignored because of Package Restore
151 | **/packages/*
152 | # except build/, which is used as an MSBuild target.
153 | !**/packages/build/
154 | # Uncomment if necessary however generally it will be regenerated when needed
155 | #!**/packages/repositories.config
156 | # NuGet v3's project.json files produces more ignoreable files
157 | *.nuget.props
158 | *.nuget.targets
159 |
160 | # Microsoft Azure Build Output
161 | csx/
162 | *.build.csdef
163 |
164 | # Microsoft Azure Emulator
165 | ecf/
166 | rcf/
167 |
168 | # Microsoft Azure ApplicationInsights config file
169 | ApplicationInsights.config
170 |
171 | # Windows Store app package directory
172 | AppPackages/
173 | BundleArtifacts/
174 |
175 | # Visual Studio cache files
176 | # files ending in .cache can be ignored
177 | *.[Cc]ache
178 | # but keep track of directories ending in .cache
179 | !*.[Cc]ache/
180 |
181 | # Others
182 | ClientBin/
183 | ~$*
184 | *~
185 | *.dbmdl
186 | *.dbproj.schemaview
187 | *.pfx
188 | *.publishsettings
189 | node_modules/
190 | orleans.codegen.cs
191 |
192 | # RIA/Silverlight projects
193 | Generated_Code/
194 |
195 | # Backup & report files from converting an old project file
196 | # to a newer Visual Studio version. Backup files are not needed,
197 | # because we have git ;-)
198 | _UpgradeReport_Files/
199 | Backup*/
200 | UpgradeLog*.XML
201 | UpgradeLog*.htm
202 |
203 | # SQL Server files
204 | *.mdf
205 | *.ldf
206 |
207 | # Business Intelligence projects
208 | *.rdl.data
209 | *.bim.layout
210 | *.bim_*.settings
211 |
212 | # Microsoft Fakes
213 | FakesAssemblies/
214 |
215 | # GhostDoc plugin setting file
216 | *.GhostDoc.xml
217 |
218 | # Node.js Tools for Visual Studio
219 | .ntvs_analysis.dat
220 |
221 | # Visual Studio 6 build log
222 | *.plg
223 |
224 | # Visual Studio 6 workspace options file
225 | *.opt
226 |
227 | # Visual Studio LightSwitch build output
228 | **/*.HTMLClient/GeneratedArtifacts
229 | **/*.DesktopClient/GeneratedArtifacts
230 | **/*.DesktopClient/ModelManifest.xml
231 | **/*.Server/GeneratedArtifacts
232 | **/*.Server/ModelManifest.xml
233 | _Pvt_Extensions
234 |
235 | # Paket dependency manager
236 | .paket/paket.exe
237 |
238 | # FAKE - F# Make
239 | .fake/
240 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/AboutDialog.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace Hopeless.Forms
2 | {
3 | partial class AboutDialog
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
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 Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.label1 = new System.Windows.Forms.Label();
32 | this.label2 = new System.Windows.Forms.Label();
33 | this.label3 = new System.Windows.Forms.Label();
34 | this.panel1 = new System.Windows.Forms.Panel();
35 | this.label4 = new System.Windows.Forms.Label();
36 | this.button1 = new System.Windows.Forms.Button();
37 | this.SuspendLayout();
38 | //
39 | // label1
40 | //
41 | this.label1.AutoSize = true;
42 | this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
43 | this.label1.Location = new System.Drawing.Point(12, 9);
44 | this.label1.Name = "label1";
45 | this.label1.Size = new System.Drawing.Size(238, 25);
46 | this.label1.TabIndex = 0;
47 | this.label1.Text = "Hopeless Trainer Editor";
48 | //
49 | // label2
50 | //
51 | this.label2.AutoSize = true;
52 | this.label2.Location = new System.Drawing.Point(14, 47);
53 | this.label2.Name = "label2";
54 | this.label2.Size = new System.Drawing.Size(142, 13);
55 | this.label2.TabIndex = 1;
56 | this.label2.Text = "Copyright © lost 2015 - 2017";
57 | //
58 | // label3
59 | //
60 | this.label3.AutoSize = true;
61 | this.label3.Location = new System.Drawing.Point(14, 34);
62 | this.label3.Name = "label3";
63 | this.label3.Size = new System.Drawing.Size(121, 13);
64 | this.label3.TabIndex = 2;
65 | this.label3.Text = "Version 1.0 (3/11/2017)";
66 | //
67 | // panel1
68 | //
69 | this.panel1.BackColor = System.Drawing.SystemColors.ControlLight;
70 | this.panel1.Location = new System.Drawing.Point(12, 65);
71 | this.panel1.Name = "panel1";
72 | this.panel1.Size = new System.Drawing.Size(313, 1);
73 | this.panel1.TabIndex = 3;
74 | //
75 | // label4
76 | //
77 | this.label4.AutoSize = true;
78 | this.label4.Location = new System.Drawing.Point(14, 69);
79 | this.label4.Name = "label4";
80 | this.label4.Size = new System.Drawing.Size(282, 52);
81 | this.label4.TabIndex = 4;
82 | this.label4.Text = "Hopeless Trainer Editor is a program that allows the editing\r\nof trainers in Gen." +
83 | " III non-Japanese Pokémon games.\r\n\r\nThanks for using!";
84 | this.label4.TextAlign = System.Drawing.ContentAlignment.TopCenter;
85 | //
86 | // button1
87 | //
88 | this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
89 | | System.Windows.Forms.AnchorStyles.Right)));
90 | this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
91 | this.button1.Location = new System.Drawing.Point(12, 130);
92 | this.button1.Name = "button1";
93 | this.button1.Size = new System.Drawing.Size(313, 23);
94 | this.button1.TabIndex = 5;
95 | this.button1.Text = "Alright!";
96 | this.button1.UseVisualStyleBackColor = true;
97 | //
98 | // AboutDialog
99 | //
100 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
101 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
102 | this.ClientSize = new System.Drawing.Size(337, 165);
103 | this.Controls.Add(this.button1);
104 | this.Controls.Add(this.label4);
105 | this.Controls.Add(this.panel1);
106 | this.Controls.Add(this.label3);
107 | this.Controls.Add(this.label2);
108 | this.Controls.Add(this.label1);
109 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
110 | this.MaximizeBox = false;
111 | this.MinimizeBox = false;
112 | this.Name = "AboutDialog";
113 | this.ShowInTaskbar = false;
114 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
115 | this.Text = "About Hopeless Trainer Editor";
116 | this.TopMost = true;
117 | this.ResumeLayout(false);
118 | this.PerformLayout();
119 |
120 | }
121 |
122 | #endregion
123 |
124 | private System.Windows.Forms.Label label1;
125 | private System.Windows.Forms.Label label2;
126 | private System.Windows.Forms.Label label3;
127 | private System.Windows.Forms.Panel panel1;
128 | private System.Windows.Forms.Label label4;
129 | private System.Windows.Forms.Button button1;
130 | }
131 | }
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/AboutDialog.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 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/OffsetDialog.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 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/FreeSpaceDialog.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 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/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 Hopeless.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("Hopeless.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 | /// Looks up a localized resource of type System.Drawing.Bitmap.
65 | ///
66 | internal static System.Drawing.Bitmap Add_16x {
67 | get {
68 | object obj = ResourceManager.GetObject("Add_16x", resourceCulture);
69 | return ((System.Drawing.Bitmap)(obj));
70 | }
71 | }
72 |
73 | ///
74 | /// Looks up a localized resource of type System.Drawing.Bitmap.
75 | ///
76 | internal static System.Drawing.Bitmap Close_16x {
77 | get {
78 | object obj = ResourceManager.GetObject("Close_16x", resourceCulture);
79 | return ((System.Drawing.Bitmap)(obj));
80 | }
81 | }
82 |
83 | ///
84 | /// Looks up a localized resource of type System.Drawing.Bitmap.
85 | ///
86 | internal static System.Drawing.Bitmap Edit_16x {
87 | get {
88 | object obj = ResourceManager.GetObject("Edit_16x", resourceCulture);
89 | return ((System.Drawing.Bitmap)(obj));
90 | }
91 | }
92 |
93 | ///
94 | /// Looks up a localized resource of type System.Drawing.Bitmap.
95 | ///
96 | internal static System.Drawing.Bitmap Export_16x {
97 | get {
98 | object obj = ResourceManager.GetObject("Export_16x", resourceCulture);
99 | return ((System.Drawing.Bitmap)(obj));
100 | }
101 | }
102 |
103 | ///
104 | /// Looks up a localized resource of type System.Drawing.Bitmap.
105 | ///
106 | internal static System.Drawing.Bitmap Import_16x {
107 | get {
108 | object obj = ResourceManager.GetObject("Import_16x", resourceCulture);
109 | return ((System.Drawing.Bitmap)(obj));
110 | }
111 | }
112 |
113 | ///
114 | /// Looks up a localized resource of type System.Drawing.Bitmap.
115 | ///
116 | internal static System.Drawing.Bitmap InformationSymbol_16x {
117 | get {
118 | object obj = ResourceManager.GetObject("InformationSymbol_16x", resourceCulture);
119 | return ((System.Drawing.Bitmap)(obj));
120 | }
121 | }
122 |
123 | ///
124 | /// Looks up a localized resource of type System.Drawing.Bitmap.
125 | ///
126 | internal static System.Drawing.Bitmap OpenFolder_16x {
127 | get {
128 | object obj = ResourceManager.GetObject("OpenFolder_16x", resourceCulture);
129 | return ((System.Drawing.Bitmap)(obj));
130 | }
131 | }
132 |
133 | ///
134 | /// Looks up a localized resource of type System.Drawing.Bitmap.
135 | ///
136 | internal static System.Drawing.Bitmap Remove_16x {
137 | get {
138 | object obj = ResourceManager.GetObject("Remove_16x", resourceCulture);
139 | return ((System.Drawing.Bitmap)(obj));
140 | }
141 | }
142 |
143 | ///
144 | /// Looks up a localized resource of type System.Drawing.Bitmap.
145 | ///
146 | internal static System.Drawing.Bitmap Save_16x {
147 | get {
148 | object obj = ResourceManager.GetObject("Save_16x", resourceCulture);
149 | return ((System.Drawing.Bitmap)(obj));
150 | }
151 | }
152 | }
153 | }
154 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/OffsetDialog.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace Hopeless.Forms
2 | {
3 | partial class OffsetDialog
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
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 Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.textBox1 = new System.Windows.Forms.TextBox();
32 | this.txtOffset = new Hopeless.HexBox();
33 | this.lblDescription = new System.Windows.Forms.Label();
34 | this.bCancel = new System.Windows.Forms.Button();
35 | this.bOK = new System.Windows.Forms.Button();
36 | this.label1 = new System.Windows.Forms.Label();
37 | this.label2 = new System.Windows.Forms.Label();
38 | this.txtSize = new Hopeless.DecimalBox();
39 | this.SuspendLayout();
40 | //
41 | // textBox1
42 | //
43 | this.textBox1.Location = new System.Drawing.Point(57, 45);
44 | this.textBox1.Name = "textBox1";
45 | this.textBox1.ReadOnly = true;
46 | this.textBox1.Size = new System.Drawing.Size(17, 20);
47 | this.textBox1.TabIndex = 6;
48 | this.textBox1.Text = "0x";
49 | //
50 | // txtOffset
51 | //
52 | this.txtOffset.Location = new System.Drawing.Point(73, 45);
53 | this.txtOffset.MaximumValue = 33554431;
54 | this.txtOffset.MinimumValue = 0;
55 | this.txtOffset.Name = "txtOffset";
56 | this.txtOffset.Size = new System.Drawing.Size(102, 20);
57 | this.txtOffset.TabIndex = 5;
58 | this.txtOffset.Text = "0";
59 | this.txtOffset.Value = 0;
60 | //
61 | // lblDescription
62 | //
63 | this.lblDescription.AutoSize = true;
64 | this.lblDescription.Location = new System.Drawing.Point(9, 9);
65 | this.lblDescription.Name = "lblDescription";
66 | this.lblDescription.Size = new System.Drawing.Size(165, 26);
67 | this.lblDescription.TabIndex = 7;
68 | this.lblDescription.Text = "The program will try to load a new\r\nparty for the trainer.";
69 | //
70 | // bCancel
71 | //
72 | this.bCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
73 | this.bCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
74 | this.bCancel.Location = new System.Drawing.Point(100, 97);
75 | this.bCancel.Name = "bCancel";
76 | this.bCancel.Size = new System.Drawing.Size(75, 23);
77 | this.bCancel.TabIndex = 8;
78 | this.bCancel.Text = "Cancel";
79 | this.bCancel.UseVisualStyleBackColor = true;
80 | //
81 | // bOK
82 | //
83 | this.bOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
84 | this.bOK.DialogResult = System.Windows.Forms.DialogResult.OK;
85 | this.bOK.Location = new System.Drawing.Point(19, 97);
86 | this.bOK.Name = "bOK";
87 | this.bOK.Size = new System.Drawing.Size(75, 23);
88 | this.bOK.TabIndex = 9;
89 | this.bOK.Text = "OK";
90 | this.bOK.UseVisualStyleBackColor = true;
91 | //
92 | // label1
93 | //
94 | this.label1.AutoSize = true;
95 | this.label1.Location = new System.Drawing.Point(13, 48);
96 | this.label1.Name = "label1";
97 | this.label1.Size = new System.Drawing.Size(38, 13);
98 | this.label1.TabIndex = 10;
99 | this.label1.Text = "Offset:";
100 | //
101 | // label2
102 | //
103 | this.label2.AutoSize = true;
104 | this.label2.Location = new System.Drawing.Point(13, 74);
105 | this.label2.Name = "label2";
106 | this.label2.Size = new System.Drawing.Size(38, 13);
107 | this.label2.TabIndex = 11;
108 | this.label2.Text = "Count:";
109 | //
110 | // txtSize
111 | //
112 | this.txtSize.Location = new System.Drawing.Point(56, 71);
113 | this.txtSize.MaximumValue = 2147483646;
114 | this.txtSize.MinimumValue = 0;
115 | this.txtSize.Name = "txtSize";
116 | this.txtSize.Size = new System.Drawing.Size(118, 20);
117 | this.txtSize.TabIndex = 12;
118 | this.txtSize.Text = "0";
119 | this.txtSize.Value = 0;
120 | //
121 | // OffsetDialog
122 | //
123 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
124 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
125 | this.ClientSize = new System.Drawing.Size(187, 132);
126 | this.Controls.Add(this.txtSize);
127 | this.Controls.Add(this.label2);
128 | this.Controls.Add(this.label1);
129 | this.Controls.Add(this.bOK);
130 | this.Controls.Add(this.bCancel);
131 | this.Controls.Add(this.lblDescription);
132 | this.Controls.Add(this.textBox1);
133 | this.Controls.Add(this.txtOffset);
134 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
135 | this.MaximizeBox = false;
136 | this.MinimizeBox = false;
137 | this.Name = "OffsetDialog";
138 | this.ShowInTaskbar = false;
139 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
140 | this.Text = "Load Party From...";
141 | this.TopMost = true;
142 | this.ResumeLayout(false);
143 | this.PerformLayout();
144 |
145 | }
146 |
147 | #endregion
148 |
149 | private System.Windows.Forms.TextBox textBox1;
150 | private HexBox txtOffset;
151 | private System.Windows.Forms.Label lblDescription;
152 | private System.Windows.Forms.Button bCancel;
153 | private System.Windows.Forms.Button bOK;
154 | private System.Windows.Forms.Label label1;
155 | private System.Windows.Forms.Label label2;
156 | private DecimalBox txtSize;
157 | }
158 | }
--------------------------------------------------------------------------------
/src/Trainer-Editor/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 |
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 |
122 | ..\Resources\Remove_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
123 |
124 |
125 | ..\Resources\InformationSymbol_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
126 |
127 |
128 | ..\Resources\OpenFolder_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
129 |
130 |
131 | ..\Resources\Add_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
132 |
133 |
134 | ..\Resources\Save_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
135 |
136 |
137 | ..\Resources\Import_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
138 |
139 |
140 | ..\Resources\Close_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
141 |
142 |
143 | ..\Resources\Edit_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
144 |
145 |
146 | ..\Resources\Export_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
147 |
148 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Trainer-Editor.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {D511F97B-8CC5-4608-AD34-461E3D3B6E38}
8 | WinExe
9 | Properties
10 | Hopeless
11 | HTE
12 | v4.6.2
13 | 512
14 | true
15 |
16 |
17 |
18 | AnyCPU
19 | true
20 | full
21 | false
22 | ..\..\bin\Debug\
23 | DEBUG;TRACE
24 | prompt
25 | 4
26 |
27 |
28 | AnyCPU
29 | pdbonly
30 | true
31 | ..\..\bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 |
36 |
37 | hte.ico
38 |
39 |
40 |
41 | ..\..\lib\GBAHL.dll
42 |
43 |
44 | ..\..\lib\GBAHL.Drawing.GDI.dll
45 |
46 |
47 | False
48 | ..\..\lib\Newtonsoft.Json.dll
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | Form
65 |
66 |
67 | AboutDialog.cs
68 |
69 |
70 | Form
71 |
72 |
73 | FreeSpaceDialog.cs
74 |
75 |
76 |
77 | Form
78 |
79 |
80 | MainForm.cs
81 |
82 |
83 | Form
84 | MainForm.cs
85 |
86 |
87 | Form
88 | MainForm.cs
89 |
90 |
91 | Component
92 |
93 |
94 | Form
95 |
96 |
97 | OffsetDialog.cs
98 |
99 |
100 |
101 |
102 |
103 |
104 | AboutDialog.cs
105 |
106 |
107 | FreeSpaceDialog.cs
108 |
109 |
110 | MainForm.cs
111 |
112 |
113 | OffsetDialog.cs
114 |
115 |
116 | ResXFileCodeGenerator
117 | Resources.Designer.cs
118 | Designer
119 |
120 |
121 | True
122 | Resources.resx
123 | True
124 |
125 |
126 | SettingsSingleFileGenerator
127 | Settings.Designer.cs
128 |
129 |
130 | True
131 | Settings.settings
132 | True
133 |
134 |
135 | Always
136 |
137 |
138 | Always
139 |
140 |
141 | PreserveNewest
142 |
143 |
144 | PreserveNewest
145 |
146 |
147 | PreserveNewest
148 |
149 |
150 | PreserveNewest
151 |
152 |
153 | PreserveNewest
154 |
155 |
156 | PreserveNewest
157 |
158 |
159 | PreserveNewest
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
203 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/Forms/FreeSpaceDialog.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace Hopeless.Forms
2 | {
3 | partial class FreeSpaceDialog
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
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 Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.label1 = new System.Windows.Forms.Label();
32 | this.label2 = new System.Windows.Forms.Label();
33 | this.txtNeeded = new Hopeless.DecimalBox();
34 | this.txtSearchStart = new Hopeless.HexBox();
35 | this.textBox1 = new System.Windows.Forms.TextBox();
36 | this.label3 = new System.Windows.Forms.Label();
37 | this.button1 = new System.Windows.Forms.Button();
38 | this.button2 = new System.Windows.Forms.Button();
39 | this.panel1 = new System.Windows.Forms.Panel();
40 | this.textBox2 = new System.Windows.Forms.TextBox();
41 | this.txtRepointTo = new Hopeless.HexBox();
42 | this.button3 = new System.Windows.Forms.Button();
43 | this.SuspendLayout();
44 | //
45 | // label1
46 | //
47 | this.label1.AutoSize = true;
48 | this.label1.Location = new System.Drawing.Point(12, 41);
49 | this.label1.Name = "label1";
50 | this.label1.Size = new System.Drawing.Size(69, 13);
51 | this.label1.TabIndex = 0;
52 | this.label1.Text = "Search Start:";
53 | //
54 | // label2
55 | //
56 | this.label2.AutoSize = true;
57 | this.label2.Location = new System.Drawing.Point(12, 15);
58 | this.label2.Name = "label2";
59 | this.label2.Size = new System.Drawing.Size(77, 13);
60 | this.label2.TabIndex = 1;
61 | this.label2.Text = "Needed Bytes:";
62 | //
63 | // txtNeeded
64 | //
65 | this.txtNeeded.Location = new System.Drawing.Point(95, 12);
66 | this.txtNeeded.MaximumValue = 33554431;
67 | this.txtNeeded.MinimumValue = 0;
68 | this.txtNeeded.Name = "txtNeeded";
69 | this.txtNeeded.Size = new System.Drawing.Size(113, 20);
70 | this.txtNeeded.TabIndex = 2;
71 | this.txtNeeded.Text = "0";
72 | this.txtNeeded.Value = 0;
73 | //
74 | // txtSearchStart
75 | //
76 | this.txtSearchStart.Location = new System.Drawing.Point(110, 38);
77 | this.txtSearchStart.MaximumValue = 33554431;
78 | this.txtSearchStart.MinimumValue = 0;
79 | this.txtSearchStart.Name = "txtSearchStart";
80 | this.txtSearchStart.Size = new System.Drawing.Size(98, 20);
81 | this.txtSearchStart.TabIndex = 3;
82 | this.txtSearchStart.Text = "0";
83 | this.txtSearchStart.Value = 0;
84 | //
85 | // textBox1
86 | //
87 | this.textBox1.Location = new System.Drawing.Point(95, 38);
88 | this.textBox1.Name = "textBox1";
89 | this.textBox1.ReadOnly = true;
90 | this.textBox1.Size = new System.Drawing.Size(17, 20);
91 | this.textBox1.TabIndex = 4;
92 | this.textBox1.Text = "0x";
93 | //
94 | // label3
95 | //
96 | this.label3.AutoSize = true;
97 | this.label3.Location = new System.Drawing.Point(12, 103);
98 | this.label3.Name = "label3";
99 | this.label3.Size = new System.Drawing.Size(63, 13);
100 | this.label3.TabIndex = 6;
101 | this.label3.Text = "Repoint To:";
102 | //
103 | // button1
104 | //
105 | this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
106 | this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
107 | this.button1.Location = new System.Drawing.Point(12, 129);
108 | this.button1.Name = "button1";
109 | this.button1.Size = new System.Drawing.Size(95, 23);
110 | this.button1.TabIndex = 7;
111 | this.button1.Text = "Repoint";
112 | this.button1.UseVisualStyleBackColor = true;
113 | //
114 | // button2
115 | //
116 | this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
117 | this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
118 | this.button2.Location = new System.Drawing.Point(113, 129);
119 | this.button2.Name = "button2";
120 | this.button2.Size = new System.Drawing.Size(95, 23);
121 | this.button2.TabIndex = 8;
122 | this.button2.Text = "Cancel";
123 | this.button2.UseVisualStyleBackColor = true;
124 | //
125 | // panel1
126 | //
127 | this.panel1.BackColor = System.Drawing.SystemColors.ControlLight;
128 | this.panel1.Location = new System.Drawing.Point(12, 93);
129 | this.panel1.Name = "panel1";
130 | this.panel1.Size = new System.Drawing.Size(197, 1);
131 | this.panel1.TabIndex = 9;
132 | //
133 | // textBox2
134 | //
135 | this.textBox2.Location = new System.Drawing.Point(95, 100);
136 | this.textBox2.Name = "textBox2";
137 | this.textBox2.ReadOnly = true;
138 | this.textBox2.Size = new System.Drawing.Size(17, 20);
139 | this.textBox2.TabIndex = 11;
140 | this.textBox2.Text = "0x";
141 | //
142 | // txtRepointTo
143 | //
144 | this.txtRepointTo.Location = new System.Drawing.Point(110, 100);
145 | this.txtRepointTo.MaximumValue = 33554431;
146 | this.txtRepointTo.MinimumValue = 0;
147 | this.txtRepointTo.Name = "txtRepointTo";
148 | this.txtRepointTo.Size = new System.Drawing.Size(98, 20);
149 | this.txtRepointTo.TabIndex = 10;
150 | this.txtRepointTo.Text = "0";
151 | this.txtRepointTo.Value = 0;
152 | this.txtRepointTo.TextChanged += new System.EventHandler(this.txtRepointTo_TextChanged);
153 | //
154 | // button3
155 | //
156 | this.button3.Location = new System.Drawing.Point(12, 64);
157 | this.button3.Name = "button3";
158 | this.button3.Size = new System.Drawing.Size(196, 23);
159 | this.button3.TabIndex = 12;
160 | this.button3.Text = "Find Free Space";
161 | this.button3.UseVisualStyleBackColor = true;
162 | this.button3.Click += new System.EventHandler(this.button3_Click);
163 | //
164 | // FreeSpaceDialog
165 | //
166 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
167 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
168 | this.ClientSize = new System.Drawing.Size(220, 164);
169 | this.Controls.Add(this.button3);
170 | this.Controls.Add(this.textBox2);
171 | this.Controls.Add(this.txtRepointTo);
172 | this.Controls.Add(this.panel1);
173 | this.Controls.Add(this.button2);
174 | this.Controls.Add(this.button1);
175 | this.Controls.Add(this.label3);
176 | this.Controls.Add(this.textBox1);
177 | this.Controls.Add(this.txtSearchStart);
178 | this.Controls.Add(this.txtNeeded);
179 | this.Controls.Add(this.label2);
180 | this.Controls.Add(this.label1);
181 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
182 | this.MaximizeBox = false;
183 | this.MinimizeBox = false;
184 | this.Name = "FreeSpaceDialog";
185 | this.ShowInTaskbar = false;
186 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
187 | this.Text = "Find Free Space";
188 | this.TopMost = true;
189 | this.ResumeLayout(false);
190 | this.PerformLayout();
191 |
192 | }
193 |
194 | #endregion
195 |
196 | private System.Windows.Forms.Label label1;
197 | private System.Windows.Forms.Label label2;
198 | private DecimalBox txtNeeded;
199 | private HexBox txtSearchStart;
200 | private System.Windows.Forms.TextBox textBox1;
201 | private System.Windows.Forms.Label label3;
202 | private System.Windows.Forms.Button button1;
203 | private System.Windows.Forms.Button button2;
204 | private System.Windows.Forms.Panel panel1;
205 | private System.Windows.Forms.TextBox textBox2;
206 | private HexBox txtRepointTo;
207 | private System.Windows.Forms.Button button3;
208 | }
209 | }
--------------------------------------------------------------------------------
/src/Trainer-Editor/MainForm.Trainers.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Drawing;
3 | using System.IO;
4 | using System.Windows.Forms;
5 | using GBAHL.Drawing;
6 | using GBAHL.Text;
7 | using Hopeless.Forms;
8 |
9 | namespace Hopeless
10 | {
11 | public partial class MainForm
12 | {
13 | Trainer trainer;
14 | Pokemon member = null;
15 |
16 | int trainerCount;
17 | int trainerSpriteCount;
18 | int classCount;
19 |
20 | string[] names;
21 | string[] classes;
22 |
23 | void LoadTrainer(int index)
24 | {
25 | trainer = new Trainer(index);
26 |
27 | // seek trainer offset
28 | rom.Seek(romInfo.GetInt32("trainers", "Data", 16));
29 | rom.ReadPointerAndSeek();
30 | rom.Skip(index * 40);
31 |
32 | // read trainer data
33 | var flags = rom.ReadByte();
34 | trainer.HasCustomAttacks = (flags & 1) == 1;
35 | trainer.HasHeldItems = (flags & 2) == 2;
36 | trainer.Class = rom.ReadByte();
37 | var genderMusic = rom.ReadByte();
38 | trainer.Gender = (byte)((genderMusic & 128) >> 7);
39 | trainer.Music = (byte)(genderMusic & 127);
40 | trainer.Sprite = rom.ReadByte();
41 | trainer.Name = rom.ReadText(12, Table.Encoding.English);
42 | for (int i = 0; i < 4; i++)
43 | trainer.Items[i] = rom.ReadUInt16();
44 | trainer.DoubleBattle = rom.ReadByte() == 1;
45 | rom.Skip(3);
46 | trainer.AI = rom.ReadUInt32();
47 | var partyCount = rom.ReadByte();
48 | rom.Skip(3);
49 | trainer.PartyOffset = rom.ReadPointer();
50 | // todo: there's more padding ?
51 |
52 | // read party data
53 | LoadParty(partyCount);
54 | }
55 |
56 | void LoadParty(int partyCount)
57 | {
58 | if (partyCount <= 0 || trainer.PartyOffset <= 0)
59 | return;
60 |
61 | // --
62 | rom.Seek(trainer.PartyOffset);
63 |
64 | // read pokemon data
65 | trainer.Party.Clear();
66 | for (int i = 0; i < partyCount; i++) {
67 | var p = new Pokemon(i);
68 | p.EVs = rom.ReadUInt16();
69 | p.Level = rom.ReadUInt16();
70 | p.Species = rom.ReadUInt16();
71 |
72 | if (trainer.HasHeldItems)
73 | p.HeldItem = rom.ReadUInt16();
74 |
75 | if (trainer.HasCustomAttacks)
76 | for (int j = 0; j < 4; j++)
77 | p.Attacks[j] = rom.ReadUInt16();
78 |
79 | if (!trainer.HasHeldItems) // TODO: would be neat to edit this
80 | rom.Skip(2);
81 |
82 | trainer.Party.Add(p);
83 | }
84 |
85 | trainer.OriginalPartySize = rom.Position - trainer.PartyOffset;
86 | }
87 |
88 | void SaveTrainer()
89 | {
90 | // repoint party
91 | if (trainer.RequiresRepoint)
92 | {
93 | int newOffset = -1;
94 |
95 | // find freespace
96 | if (repointAutomaticallyToolStripMenuItem.Checked)
97 | {
98 | newOffset = rom.Find(0xFF, trainer.PartySize, 0x720000);
99 | }
100 | else
101 | {
102 | using (var fs = new FreeSpaceDialog(rom, trainer.PartySize, lastSearch))
103 | {
104 | fs.Text = "Repoint Party";
105 |
106 | if (fs.ShowDialog() == DialogResult.OK)
107 | {
108 | newOffset = fs.Offset;
109 | lastSearch = fs.SearchStart;
110 | }
111 | }
112 | }
113 |
114 | if (newOffset == -1)
115 | {
116 | MessageBox.Show("Unable to repoint party!\nIt was not saved.",
117 | "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
118 |
119 | return;
120 | }
121 |
122 | // overwrite old party with freespace
123 | if (cleanRepointedTrainersToolStripMenuItem.Checked)
124 | {
125 | rom.Seek(trainer.PartyOffset);
126 | for (int i = 0; i < trainer.OriginalPartySize; i++)
127 | rom.WriteByte(0xFF);
128 | }
129 |
130 | // set new offset for party
131 | trainer.PartyOffset = newOffset;
132 | }
133 |
134 | //rom.Seek(romInfo.GetInt32("trainers", "Data", 16) + trainer.Index * 40);
135 | rom.Seek(romInfo.GetInt32("trainers", "Data", 16));
136 | rom.ReadPointerAndSeek();
137 | rom.Skip(trainer.Index * 40);
138 |
139 | // write trainer data
140 | rom.WriteByte((byte)((trainer.HasCustomAttacks ? 1 : 0) + (trainer.HasHeldItems ? 2 : 0)));
141 | rom.WriteByte(trainer.Class);
142 | rom.WriteByte((byte)((trainer.Gender << 7) + trainer.Music));
143 | rom.WriteByte(trainer.Sprite);
144 | rom.WriteText(trainer.Name, 12, Table.Encoding.English);
145 | for (int i = 0; i < 4; i++)
146 | rom.WriteUInt16(trainer.Items[i]);
147 | rom.WriteByte((byte)(trainer.DoubleBattle ? 1 : 0));
148 | rom.Skip(3);
149 | rom.WriteUInt32(trainer.AI);
150 | rom.WriteByte((byte)trainer.Party.Count);
151 | rom.Skip(3);
152 | rom.WritePointer(trainer.PartyOffset);
153 |
154 | if (trainer.Party.Count == 0)
155 | return;
156 |
157 | // write party
158 | rom.Seek(trainer.PartyOffset);
159 | foreach (var p in trainer.Party)
160 | {
161 | rom.WriteUInt16(p.EVs);
162 | rom.WriteUInt16(p.Level);
163 | rom.WriteUInt16(p.Species);
164 |
165 | if (trainer.HasHeldItems)
166 | rom.WriteUInt16(p.HeldItem);
167 |
168 | if (trainer.HasCustomAttacks)
169 | for (int i = 0; i < 4; i++)
170 | rom.WriteUInt16(p.Attacks[i]);
171 |
172 | if (!trainer.HasHeldItems)
173 | rom.WriteUInt16(0);
174 | }
175 |
176 | // finally, update original party size
177 | trainer.OriginalPartySize = trainer.PartySize;
178 | }
179 |
180 | void ResizeTrainers(int newCount)
181 | {
182 | // repoint the trainer table
183 |
184 | // original information
185 | var originalOffset = romInfo.GetInt32("trainers", "Data", 16);
186 | var originalSize = trainerCount * 40;
187 |
188 | var newOffset = -1;
189 | var newSize = newCount * 40;
190 |
191 | var buffer = new int[newCount];
192 |
193 | // copy old table for moving
194 | rom.Seek(originalOffset);
195 | for (int i = 0; i < Math.Min(trainerCount, newCount); i++)
196 | buffer[i] = rom.ReadPointer();
197 |
198 | // overwrite old table with free space
199 | rom.Seek(originalOffset);
200 | for (int i = 0; i < trainerCount; i++)
201 | rom.WriteUInt32(0xFFFFFFFFu);
202 |
203 | // find space for the new table
204 | if (newCount > trainerCount)
205 | {
206 | if (repointAutomaticallyToolStripMenuItem.Checked)
207 | {
208 | newOffset = rom.Find(0xFF, newSize, 0x720000);
209 | }
210 | else
211 | {
212 | using (var fs = new FreeSpaceDialog(rom, newSize, lastSearch))
213 | {
214 | fs.Text = "Repoint Trainer Table";
215 |
216 | if (fs.ShowDialog() == DialogResult.OK) {
217 | newOffset = fs.Offset;
218 | lastSearch = fs.SearchStart;
219 | }
220 | }
221 | }
222 | }
223 | else
224 | {
225 | newOffset = originalOffset;
226 | }
227 |
228 | if (newOffset == -1)
229 | {
230 | MessageBox.Show("Unable to resize trainer table!\nAborted.",
231 | "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
232 |
233 | return;
234 | }
235 |
236 | // write new table
237 | rom.Seek(newOffset);
238 | for (int i = 0; i < newCount; i++)
239 | rom.WritePointer(buffer[i]);
240 |
241 | // TODO: trainers with an offset of 0 result in error, allow for 'blank' trainer
242 | // find and replace all pointers to table
243 | // update ini
244 | }
245 |
246 | void RandomizeTrainers()
247 | {
248 | // preserve current trainer
249 | var t = trainer;
250 | var m = member;
251 | var r = new Random();
252 |
253 | // for every trainer, randomize just the species
254 | // of every pokemon in their party
255 | for (int i = 0; i < trainerCount; i++)
256 | {
257 | LoadTrainer(i);
258 |
259 | foreach (var member in trainer.Party)
260 | {
261 | var s = r.Next(0, pokemonCount);
262 | while ((s > 251 && s < 277) || (s > 411 && s < 440)) // unsafe indexes
263 | s = r.Next(0, pokemonCount);
264 |
265 | member.Species = (ushort)s;
266 | }
267 |
268 | SaveTrainer();
269 | }
270 |
271 | trainer = t;
272 | member = m;
273 | }
274 |
275 | void LoadNames()
276 | {
277 | // Read offset of names
278 | var firstTrainerPtr = romInfo.GetInt32("trainers", "Data", 16);
279 | rom.Seek(firstTrainerPtr);
280 | var firstTrainer = rom.ReadPointer();
281 |
282 | // Read names
283 | names = new string[trainerCount];
284 | for (int i = 0; i < trainerCount; i++)
285 | {
286 | rom.Seek(firstTrainer + i * 40 + 4);
287 | names[i] = rom.ReadText(12, Table.Encoding.English);
288 | }
289 | }
290 |
291 | void LoadClasses()
292 | {
293 | var tablePtr = romInfo.GetInt32("trainer_classes", "Names", 16);
294 | rom.Seek(tablePtr);
295 |
296 | rom.ReadPointerAndSeek();
297 | classes = rom.ReadTextTable(13, classCount, Table.Encoding.English);
298 | }
299 |
300 | void SaveClasses()
301 | {
302 | var tablePtr = romInfo.GetInt32("trainer_classes", "Names", 16);
303 | rom.Seek(tablePtr);
304 |
305 | rom.ReadPointerAndSeek();
306 | rom.WriteTextTable(classes, 13, Table.Encoding.English);
307 | }
308 |
309 | Image LoadTrainerSprite(int id)
310 | {
311 | Sprite sprite;
312 | Palette palette;
313 |
314 | try
315 | {
316 | // ------------------------------
317 | // read compressed sprite
318 | rom.Seek(romInfo.GetInt32("trainer_sprites", "Data", 16));
319 | rom.ReadPointerAndSeek();
320 | rom.Skip(id * 8);
321 | rom.ReadPointerAndSeek();
322 | sprite = rom.ReadCompressedSprite4();
323 |
324 | // ------------------------------
325 | // read compressed palette
326 | rom.Seek(romInfo.GetInt32("trainer_sprites", "Palettes", 16));
327 | rom.ReadPointerAndSeek();
328 | rom.Skip(id * 8);
329 | rom.ReadPointerAndSeek();
330 |
331 | if (rom.PeekCompressed())
332 | palette = rom.ReadCompressedPalette();
333 | else
334 | palette = rom.ReadPalette(16);
335 |
336 | // ------------------------------
337 | return sprite.ToImage(8, 8, palette, false);
338 | }
339 | catch (Exception ex)
340 | {
341 | #if DEBUG
342 | Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
343 | #endif
344 | return invisible;
345 | }
346 | }
347 |
348 | void ExportTrainer(string filename)
349 | {
350 | // dump a trainer to a file
351 | if (trainer == null)
352 | return;
353 |
354 | using (var fs = File.Create(filename))
355 | using (var bw = new BinaryWriter(fs))
356 | {
357 | // write trainer data
358 | bw.Write(trainer.Name);
359 | bw.Write(trainer.Class);
360 | bw.Write(trainer.Gender);
361 | bw.Write(trainer.Sprite);
362 | bw.Write(trainer.Music);
363 | for (int i = 0; i < 4; i++)
364 | bw.Write(trainer.Items[i]);
365 |
366 | bw.Write(trainer.DoubleBattle);
367 | bw.Write(trainer.HasCustomAttacks);
368 | bw.Write(trainer.HasHeldItems);
369 |
370 | // write party
371 | bw.Write(trainer.Party.Count);
372 | foreach (var p in trainer.Party)
373 | {
374 | bw.Write(p.Species);
375 | bw.Write(p.Level);
376 | bw.Write(p.EVs);
377 | bw.Write(p.HeldItem);
378 | for (int i = 0; i < 4; i++)
379 | bw.Write(p.Attacks[i]);
380 | }
381 | }
382 | }
383 |
384 | void ImportTrainer(string filename)
385 | {
386 | if (trainer == null)
387 | return;
388 |
389 | using (var fs = File.OpenRead(filename))
390 | using (var br = new BinaryReader(fs))
391 | {
392 | trainer.Name = br.ReadString();
393 | trainer.Class = br.ReadByte();
394 | trainer.Gender = br.ReadByte();
395 | trainer.Sprite = br.ReadByte();
396 | trainer.Music = br.ReadByte();
397 | for (int i = 0; i < 4; i++)
398 | trainer.Items[i] = br.ReadUInt16();
399 |
400 | trainer.DoubleBattle = br.ReadBoolean();
401 | trainer.HasCustomAttacks = br.ReadBoolean();
402 | trainer.HasHeldItems = br.ReadBoolean();
403 |
404 | trainer.Party.Clear();
405 | var count = br.ReadInt32();
406 |
407 | for (int i = 0; i < count; i++)
408 | {
409 | var p = new Pokemon(i);
410 | p.Species = br.ReadUInt16();
411 | p.Level = br.ReadUInt16();
412 | p.EVs = br.ReadUInt16();
413 | p.HeldItem = br.ReadUInt16();
414 | for (int j = 0; j < 4; j++)
415 | p.Attacks[j] = br.ReadUInt16();
416 |
417 | trainer.Party.Add(p);
418 | }
419 |
420 | // TODO: check that values <= game max for safe importing
421 | }
422 | }
423 |
424 | void DisplayTrainer()
425 | {
426 | ignore = true;
427 | if (trainer == null)
428 | {
429 | txtName.Text = string.Empty; ;
430 | rMale.Checked = true;
431 | rFemale.Checked = false;
432 |
433 | nSprite.Value = 0;
434 |
435 | cClass.SelectedIndex = 0;
436 | txtClassID.Value = 0;
437 | txtClass.Text = classes[0];
438 |
439 | cItem1.SelectedIndex = 0;
440 | cItem2.SelectedIndex = 0;
441 | cItem3.SelectedIndex = 0;
442 | cItem4.SelectedIndex = 0;
443 |
444 | txtMusic.Value = 0;
445 | txtAI.Value = 0;
446 |
447 | chkDoubleBattle.Checked = false;
448 | chkHeldItems.Checked = false;
449 | chkMovesets.Checked = false;
450 |
451 | listParty.Items.Clear();
452 | cHeld.Enabled = false;
453 | cAttack1.Enabled = false;
454 | cAttack2.Enabled = false;
455 | cAttack3.Enabled = false;
456 | cAttack4.Enabled = false;
457 |
458 | pSprite.Image = invisible;
459 | for (int i = 0; i < 6; i++)
460 | partyPictureBoxes[i].Image = invisible;
461 |
462 | grpTrainer.Text = "Trainer";
463 | grpParty.Text = "Party";
464 | }
465 | else
466 | {
467 | txtName.Text = trainer.Name;
468 | rMale.Checked = trainer.Gender == 0;
469 | rFemale.Checked = trainer.Gender == 1;
470 |
471 | nSprite.Value = trainer.Sprite;
472 |
473 | cClass.SelectedIndex = trainer.Class;
474 | txtClassID.Value = trainer.Class;
475 | txtClass.Text = classes[trainer.Class];
476 |
477 | cItem1.SelectedIndex = trainer.Items[0];
478 | cItem2.SelectedIndex = trainer.Items[1];
479 | cItem3.SelectedIndex = trainer.Items[2];
480 | cItem4.SelectedIndex = trainer.Items[3];
481 |
482 | txtMusic.Value = trainer.Music;
483 | txtAI.Value = (int)(trainer.AI & 0x1FF); // AI is the first 9 bits
484 |
485 | chkDoubleBattle.Checked = trainer.DoubleBattle;
486 | chkHeldItems.Checked = trainer.HasHeldItems;
487 | chkMovesets.Checked = trainer.HasCustomAttacks;
488 |
489 | listParty.Items.Clear();
490 | foreach (var pk in trainer.Party)
491 | {
492 | var i = new ListViewItem(pokemon[pk.Species]);
493 | i.SubItems.Add($"{pk.Level}");
494 |
495 | listParty.Items.Add(i);
496 | }
497 |
498 | cHeld.Enabled = trainer.HasHeldItems;
499 |
500 | cAttack1.Enabled = trainer.HasCustomAttacks;
501 | cAttack2.Enabled = trainer.HasCustomAttacks;
502 | cAttack3.Enabled = trainer.HasCustomAttacks;
503 | cAttack4.Enabled = trainer.HasCustomAttacks;
504 |
505 | grpTrainer.Text = $"Trainer (0x{trainer.Index:X3})";
506 | grpParty.Text = $"Party (0x{trainer.PartyOffset:X7})";
507 | if (trainer.RequiresRepoint) grpParty.Text += "*";
508 | }
509 | ignore = false;
510 | }
511 |
512 | void DisplayPartyMember()
513 | {
514 | ignore = true;
515 |
516 | if (member == null)
517 | {
518 | txtSpecies.Value = 0;
519 | txtLevel.Value = 0;
520 | txtEVs.Value = 0;
521 | cSpecies.SelectedIndex = 0;
522 | cHeld.SelectedIndex = 0;
523 | cAttack1.SelectedIndex = 0;
524 | cAttack2.SelectedIndex = 0;
525 | cAttack3.SelectedIndex = 0;
526 | cAttack4.SelectedIndex = 0;
527 | }
528 | else
529 | {
530 | txtSpecies.Value = member.Species;
531 | cSpecies.SelectedIndex = member.Species;
532 | txtLevel.Value = member.Level;
533 | txtEVs.Value = member.EVs;
534 |
535 | if (trainer.HasHeldItems)
536 | cHeld.SelectedIndex = member.HeldItem;
537 |
538 | if (trainer.HasCustomAttacks)
539 | {
540 | cAttack1.SelectedIndex = member.Attacks[0];
541 | cAttack2.SelectedIndex = member.Attacks[1];
542 | cAttack3.SelectedIndex = member.Attacks[2];
543 | cAttack4.SelectedIndex = member.Attacks[3];
544 | }
545 | }
546 |
547 | ignore = false;
548 | }
549 | }
550 | }
551 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/MainForm.cs:
--------------------------------------------------------------------------------
1 | using GBAHL;
2 | using GBAHL.IO;
3 | using GBAHL.Configuration;
4 | using Hopeless.Forms;
5 | using System;
6 | using System.IO;
7 | using System.Drawing;
8 | using System.Windows.Forms;
9 |
10 | namespace Hopeless
11 | {
12 | public partial class MainForm : Form
13 | {
14 | private Settings settings;
15 | private Game game;
16 |
17 | //ROM rom;
18 | //Settings romInfo;
19 | private int lastSearch = 0x720000;
20 |
21 | private Bitmap invisible = new Bitmap(64, 64);
22 | private PictureBox[] partyPictureBoxes;
23 |
24 | private bool ignore = false;
25 |
26 | public MainForm()
27 | {
28 | InitializeComponent();
29 |
30 | partyPictureBoxes = new PictureBox[6] { p1, p2, p3, p4, p5, p6 };
31 | }
32 |
33 | protected override void OnLoad(EventArgs e)
34 | {
35 | // ----------------------------------------------------------------
36 | try
37 | {
38 | using (var fs = File.OpenRead("settings.json"))
39 | {
40 | settings = JsonConfiguration.Default.Load(fs);
41 | }
42 | }
43 | catch
44 | {
45 | settings = new Settings { RepointAutomatically = false, CleanRepointed = true };
46 | }
47 |
48 | repointAutomaticallyToolStripMenuItem.Checked = settings.RepointAutomatically;
49 | cleanRepointedTrainersToolStripMenuItem.Checked = settings.CleanRepointed;
50 |
51 | // ----------------------------------------------------------------
52 | grpTrainer.Enabled = false;
53 | bRandomize.Enabled = false;
54 | saveToolStripMenuItem.Enabled = false;
55 | importToolStripMenuItem.Enabled = false;
56 | exportToolStripMenuItem.Enabled = false;
57 | changePartyOffsetToolStripMenuItem.Enabled = false;
58 |
59 | base.OnLoad(e);
60 | }
61 |
62 | protected override void OnFormClosed(FormClosedEventArgs e)
63 | {
64 | try
65 | {
66 | using (var fs = File.Create("settings.json"))
67 | {
68 | JsonConfiguration.Default.Save(fs, settings);
69 | }
70 | }
71 | catch (Exception ex)
72 | {
73 | #if DEBUG
74 | Console.WriteLine(ex);
75 | #endif
76 | }
77 |
78 | invisible.Dispose();
79 |
80 | base.OnFormClosed(e);
81 | }
82 |
83 | private void openToolStripMenuItem_Click(object sender, EventArgs e)
84 | {
85 | openFileDialog1.FileName = "";
86 | openFileDialog1.Filter = "GBA ROMs|*.gba";
87 | openFileDialog1.Title = "Open ROM";
88 |
89 | if (openFileDialog1.ShowDialog() != DialogResult.OK) return;
90 |
91 | if (!OpenROM(openFileDialog1.FileName))
92 | return;
93 |
94 | LoadAll();
95 |
96 | // populate form
97 | listTrainers.Items.Clear();
98 | for (int i = 0; i < trainerCount; i++)
99 | {
100 | var item = new ListViewItem($"{i:X3}");
101 | item.SubItems.Add(names[i]);
102 | listTrainers.Items.Add(item);
103 | }
104 | txtSearchId.MaximumValue = trainerCount - 1;
105 |
106 | grpTrainer.Enabled = true;
107 | bRandomize.Enabled = true;
108 | saveToolStripMenuItem.Enabled = true;
109 | importToolStripMenuItem.Enabled = true;
110 | exportToolStripMenuItem.Enabled = true;
111 | changePartyOffsetToolStripMenuItem.Enabled = true;
112 |
113 | cClass.Items.Clear();
114 | cClass.Items.AddRange(classes);
115 |
116 | cItem1.Items.Clear();
117 | cItem1.Items.AddRange(items);
118 | cItem2.Items.Clear();
119 | cItem2.Items.AddRange(items);
120 | cItem3.Items.Clear();
121 | cItem3.Items.AddRange(items);
122 | cItem4.Items.Clear();
123 | cItem4.Items.AddRange(items);
124 |
125 | cHeld.Items.Clear();
126 | cHeld.Items.AddRange(items);
127 |
128 | cSpecies.Items.Clear();
129 | cSpecies.Items.AddRange(pokemon);
130 |
131 | cAttack1.Items.Clear();
132 | cAttack1.Items.AddRange(attacks);
133 | cAttack2.Items.Clear();
134 | cAttack2.Items.AddRange(attacks);
135 | cAttack3.Items.Clear();
136 | cAttack3.Items.AddRange(attacks);
137 | cAttack4.Items.Clear();
138 | cAttack4.Items.AddRange(attacks);
139 |
140 | DisplayTrainer();
141 | DisplayPartyMember();
142 | }
143 |
144 | private void saveToolStripMenuItem_Click(object sender, EventArgs e)
145 | {
146 | if (trainer == null)
147 | return;
148 |
149 | SaveTrainer();
150 | SaveClasses();
151 |
152 | grpParty.Text = $"Party (0x{trainer.PartyOffset:X7})";
153 |
154 | listTrainers.Items[trainer.Index].SubItems[1].Text = trainer.Name;
155 | names[trainer.Index] = trainer.Name;
156 | }
157 |
158 | private void exitToolStripMenuItem_Click(object sender, EventArgs e)
159 | {
160 | Close();
161 | }
162 |
163 | private void importToolStripMenuItem_Click(object sender, EventArgs e)
164 | {
165 | if (trainer == null)
166 | return;
167 |
168 | openFileDialog1.Title = $"Import Trainer {trainer.Index}";
169 | openFileDialog1.Filter = "Trainer Files|*.trainer";
170 | openFileDialog1.FileName = "";
171 |
172 | if (openFileDialog1.ShowDialog() == DialogResult.OK)
173 | {
174 | ImportTrainer(openFileDialog1.FileName);
175 |
176 | DisplayTrainer();
177 | member = null;
178 |
179 | for (int i = 0; i < 6; i++)
180 | {
181 | Image sprite = invisible;
182 | if (i < trainer.Party.Count)
183 | {
184 | sprite = LoadFrontSprite(trainer.Party[i].Species);
185 | }
186 | partyPictureBoxes[i].Image = sprite;
187 | }
188 | pSprite.Image = LoadTrainerSprite(trainer.Sprite);
189 | }
190 | }
191 |
192 | private void exportToolStripMenuItem_Click(object sender, EventArgs e)
193 | {
194 | if (trainer == null)
195 | return;
196 |
197 | saveFileDialog1.Title = $"Export Trainer {trainer.Index}";
198 | saveFileDialog1.Filter = "Trainer Files|*.trainer";
199 | saveFileDialog1.FileName = $"{trainer.Index:X3} {trainer.Name}";
200 |
201 | if (saveFileDialog1.ShowDialog() == DialogResult.OK)
202 | ExportTrainer(saveFileDialog1.FileName);
203 | }
204 |
205 | private void repointAutomaticallyToolStripMenuItem_Click(object sender, EventArgs e)
206 | {
207 | settings.RepointAutomatically = repointAutomaticallyToolStripMenuItem.Checked;
208 | }
209 |
210 | private void cleanRepointedTrainersToolStripMenuItem_Click(object sender, EventArgs e)
211 | {
212 | settings.CleanRepointed = cleanRepointedTrainersToolStripMenuItem.Checked;
213 | }
214 |
215 | private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
216 | {
217 | using (var a = new AboutDialog())
218 | a.ShowDialog();
219 | }
220 |
221 | private void listTrainers_SelectedIndexChanged(object sender, EventArgs e)
222 | {
223 | var index = -1;
224 | foreach (int x in listTrainers.SelectedIndices)
225 | index = x;
226 |
227 | if (index == -1)
228 | return;
229 |
230 | // ------------------------------
231 | LoadTrainer(index);
232 | member = null;
233 |
234 | for (int i = 0; i < 6; i++)
235 | {
236 | Image sprite = invisible;
237 | if (i < trainer.Party.Count)
238 | {
239 | sprite = LoadFrontSprite(trainer.Party[i].Species);
240 | }
241 | partyPictureBoxes[i].Image = sprite;
242 | }
243 | pSprite.Image = LoadTrainerSprite(trainer.Sprite);
244 |
245 | // ------------------------------
246 | DisplayTrainer();
247 | DisplayPartyMember();
248 | }
249 |
250 | private void listParty_SelectedIndexChanged(object sender, EventArgs e)
251 | {
252 | var index = -1;
253 | foreach (int x in listParty.SelectedIndices)
254 | index = x;
255 |
256 | if (index == -1)
257 | return;
258 |
259 | // ------------------------------
260 | member = trainer.Party[index];
261 | DisplayPartyMember();
262 | }
263 |
264 | bool OpenROM(string filename)
265 | {
266 | try
267 | {
268 | string gameCode;
269 |
270 | using (var fs = File.Open(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
271 | using (var gb = new GbaBinaryStream(fs))
272 | {
273 | gameCode = gb.Code;
274 | }
275 |
276 | using (var fs = File.OpenRead($@"ROMs\{gameCode}.json"))
277 | {
278 | game = JsonConfiguration.Default.Load(fs);
279 | }
280 | }
281 | catch (Exception ex)
282 | {
283 | MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
284 | return false;
285 | }
286 |
287 |
288 |
289 | // ROM temp = null;
290 |
291 | // //var custom = Path.ChangeExtension(filename, ".hte");
292 | // try
293 | // {
294 | // // open ROM file
295 | // temp = new ROM(filename);
296 |
297 | // // check for settings file
298 | // if (!File.Exists($@"ROMs\{temp.Code}.ini")) {
299 | // MessageBox.Show("ROM code {temp.Code} is not supported!",
300 | // "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
301 | // temp?.Dispose();
302 | // return false;
303 | // }
304 |
305 | // // open settings file
306 | // romInfo = Settings.FromFile($@"ROMs\{temp.Code}.ini", Settings.Format.INI);
307 | // }
308 | // catch (Exception ex)
309 | // {
310 | //#if DEBUG
311 | // MessageBox.Show($"{ex.Message}",
312 | // "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
313 | //#else
314 | // MessageBox.Show($"There was an error opening the ROM.",
315 | // "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
316 | //#endif
317 |
318 | // temp?.Dispose();
319 | // return false;
320 | // }
321 |
322 | // // update title
323 | // Text = $"Hopeless Trainer Editor v1.0 - [{Path.GetFileName(openFileDialog1.FileName)}]";
324 |
325 | // // set new open ROM and report success
326 | // rom?.Dispose();
327 | // rom = temp;
328 | // return true;
329 |
330 | return false;
331 | }
332 |
333 | void LoadAll()
334 | {
335 | // get limits from .ini
336 | pokemonCount = romInfo.GetInt32("pokemon", "Count");
337 | itemCount = romInfo.GetInt32("items", "Count");
338 | attackCount = romInfo.GetInt32("attacks", "Count");
339 |
340 | trainerCount = romInfo.GetInt32("trainers", "Count");
341 | trainerSpriteCount = romInfo.GetInt32("trainer_sprites", "Count");
342 | classCount = romInfo.GetInt32("trainer_classes", "Count");
343 |
344 | // load all data needed
345 | LoadNames();
346 | LoadClasses();
347 | LoadPokemonNames();
348 | LoadAttacks();
349 | LoadItems();
350 |
351 | // settings for editor
352 | txtSpecies.MaximumValue = pokemonCount - 1;
353 | txtClassID.MaximumValue = classCount - 1;
354 | nSprite.Maximum = trainerSpriteCount - 1;
355 | }
356 |
357 | private void txtName_TextChanged(object sender, EventArgs e)
358 | {
359 | if (ignore)
360 | return;
361 |
362 | trainer.Name = txtName.Text;
363 | }
364 |
365 | private void rMale_CheckedChanged(object sender, EventArgs e)
366 | {
367 | if (ignore)
368 | return;
369 |
370 | if (rMale.Checked)
371 | trainer.Gender = 0;
372 | }
373 |
374 | private void rFemale_CheckedChanged(object sender, EventArgs e)
375 | {
376 | if (ignore)
377 | return;
378 |
379 | if (rFemale.Checked)
380 | trainer.Gender = 1;
381 | }
382 |
383 | private void nSprite_ValueChanged(object sender, EventArgs e)
384 | {
385 | if (ignore)
386 | return;
387 |
388 | trainer.Sprite = (byte)nSprite.Value;
389 | pSprite.Image = LoadTrainerSprite(trainer.Sprite);
390 | }
391 |
392 | private void txtClassID_TextChanged(object sender, EventArgs e)
393 | {
394 | if (ignore || txtClassID.Value >= classCount)
395 | return;
396 |
397 | trainer.Class = (byte)txtClassID.Value;
398 |
399 | ignore = true;
400 | cClass.SelectedIndex = txtClassID.Value;
401 | txtClass.Text = classes[trainer.Class];
402 | ignore = false;
403 | }
404 |
405 | private void cClass_SelectedIndexChanged(object sender, EventArgs e)
406 | {
407 | if (ignore)
408 | return;
409 |
410 | trainer.Class = (byte)cClass.SelectedIndex;
411 |
412 | ignore = true;
413 | txtClassID.Value = cClass.SelectedIndex;
414 | txtClass.Text = classes[trainer.Class];
415 | ignore = false;
416 | }
417 |
418 | private void txtClass_TextChanged(object sender, EventArgs e)
419 | {
420 | if (ignore)
421 | return;
422 |
423 | classes[trainer.Class] = txtClass.Text;
424 | cClass.Items[trainer.Class] = txtClass.Text;
425 | }
426 |
427 | private void cItem_SelectedIndexChanged(object sender, EventArgs e)
428 | {
429 | if (ignore)
430 | return;
431 |
432 | trainer.Items[0] = (ushort)cItem1.SelectedIndex;
433 | trainer.Items[1] = (ushort)cItem2.SelectedIndex;
434 | trainer.Items[2] = (ushort)cItem3.SelectedIndex;
435 | trainer.Items[3] = (ushort)cItem4.SelectedIndex;
436 | }
437 |
438 | private void txtMusic_TextChanged(object sender, EventArgs e)
439 | {
440 | if (ignore)
441 | return;
442 |
443 | trainer.Music = (byte)txtMusic.Value;
444 | }
445 |
446 | private void txtAI_TextChanged(object sender, EventArgs e)
447 | {
448 | if (ignore)
449 | return;
450 |
451 | trainer.AI = (trainer.AI & ~0x1FFu) | (uint)(txtAI.Value & 0x1FF);
452 | }
453 |
454 | private void chkDoubleBattle_CheckedChanged(object sender, EventArgs e)
455 | {
456 | if (ignore)
457 | return;
458 |
459 | trainer.DoubleBattle = chkDoubleBattle.Checked;
460 | }
461 |
462 | private void chkHeldItems_CheckedChanged(object sender, EventArgs e)
463 | {
464 | if (ignore)
465 | return;
466 |
467 | trainer.HasHeldItems = chkHeldItems.Checked;
468 |
469 | ignore = true;
470 | cHeld.Enabled = trainer.HasHeldItems;
471 |
472 | if (!trainer.HasHeldItems || member == null)
473 | {
474 | cHeld.SelectedIndex = 0;
475 | }
476 | else
477 | {
478 | cHeld.SelectedIndex = member.HeldItem;
479 | }
480 | ignore = false;
481 | }
482 |
483 | private void chkMovesets_CheckedChanged(object sender, EventArgs e)
484 | {
485 | if (ignore)
486 | return;
487 |
488 | trainer.HasCustomAttacks = chkMovesets.Checked;
489 |
490 | ignore = true;
491 | cAttack1.Enabled = trainer.HasCustomAttacks;
492 | cAttack2.Enabled = trainer.HasCustomAttacks;
493 | cAttack3.Enabled = trainer.HasCustomAttacks;
494 | cAttack4.Enabled = trainer.HasCustomAttacks;
495 |
496 | if (!trainer.HasCustomAttacks || member == null)
497 | {
498 | cAttack1.SelectedIndex = 0;
499 | cAttack2.SelectedIndex = 0;
500 | cAttack3.SelectedIndex = 0;
501 | cAttack4.SelectedIndex = 0;
502 | }
503 | else
504 | {
505 | cAttack1.SelectedIndex = member.Attacks[0];
506 | cAttack2.SelectedIndex = member.Attacks[1];
507 | cAttack3.SelectedIndex = member.Attacks[2];
508 | cAttack4.SelectedIndex = member.Attacks[3];
509 | }
510 | ignore = false;
511 | }
512 |
513 | private void txtSpecies_TextChanged(object sender, EventArgs e)
514 | {
515 | if (ignore || member == null || txtSpecies.Value >= pokemonCount)
516 | return;
517 |
518 | member.Species = (ushort)txtSpecies.Value;
519 |
520 | ignore = true;
521 | cSpecies.SelectedIndex = member.Species;
522 |
523 | partyPictureBoxes[member.Index].Image = LoadFrontSprite(member.Species);
524 | listParty.Items[member.Index].SubItems[0].Text = pokemon[member.Species];
525 | ignore = false;
526 | }
527 |
528 | private void cSpecies_SelectedIndexChanged(object sender, EventArgs e)
529 | {
530 | if (ignore || member == null)
531 | return;
532 |
533 | member.Species = (ushort)cSpecies.SelectedIndex;
534 |
535 | ignore = true;
536 | txtSpecies.Value = member.Species;
537 |
538 | partyPictureBoxes[member.Index].Image = LoadFrontSprite(member.Species);
539 | listParty.Items[member.Index].SubItems[0].Text = pokemon[member.Species];
540 | ignore = false;
541 | }
542 |
543 | private void txtLevel_TextChanged(object sender, EventArgs e)
544 | {
545 | if (ignore || member == null)
546 | return;
547 |
548 | member.Level = (ushort)((member.Level & 0xFF00) | (byte)txtLevel.Value);
549 |
550 | ignore = true;
551 | listParty.Items[member.Index].SubItems[1].Text = member.Level.ToString();
552 | ignore = false;
553 | }
554 |
555 | private void txtEVs_TextChanged(object sender, EventArgs e)
556 | {
557 | if (ignore || member == null)
558 | return;
559 |
560 | member.EVs = (ushort)((member.EVs & 0xFF00) | (byte)txtEVs.Value);
561 | }
562 |
563 | private void cHeld_SelectedIndexChanged(object sender, EventArgs e)
564 | {
565 | if (ignore || member == null)
566 | return;
567 |
568 | member.HeldItem = (ushort)cHeld.SelectedIndex;
569 | }
570 |
571 | private void cAttack_SelectedIndexChanged(object sender, EventArgs e)
572 | {
573 | if (ignore || member == null)
574 | return;
575 |
576 | member.Attacks[0] = (ushort)cAttack1.SelectedIndex;
577 | member.Attacks[1] = (ushort)cAttack2.SelectedIndex;
578 | member.Attacks[2] = (ushort)cAttack3.SelectedIndex;
579 | member.Attacks[3] = (ushort)cAttack4.SelectedIndex;
580 | }
581 |
582 | private void bPartyAdd_Click(object sender, EventArgs e)
583 | {
584 | if (trainer == null || trainer.Party.Count >= 6)
585 | return;
586 |
587 | var p = new Pokemon(trainer.Party.Count);
588 | trainer.Party.Add(p);
589 |
590 | ignore = true;
591 | var i = new ListViewItem(pokemon[0]);
592 | i.SubItems.Add("0");
593 | listParty.Items.Add(i);
594 |
595 | grpParty.Text = $"Party (0x{trainer.PartyOffset:X7})";
596 | if (trainer.RequiresRepoint) grpParty.Text += "*";
597 |
598 | ShiftParty();
599 | ignore = false;
600 | }
601 |
602 | private void bPartyRemove_Click(object sender, EventArgs e)
603 | {
604 | if (member == null || trainer.Party.Count <= 1)
605 | return;
606 |
607 | trainer.Party.RemoveAt(member.Index);
608 |
609 | ignore = true;
610 | listParty.Items.RemoveAt(member.Index);
611 | member = null;
612 |
613 | txtSpecies.Value = 0;
614 | txtLevel.Value = 0;
615 | txtEVs.Value = 0;
616 | cSpecies.SelectedIndex = 0;
617 | cHeld.SelectedIndex = 0;
618 | cAttack1.SelectedIndex = 0;
619 | cAttack2.SelectedIndex = 0;
620 | cAttack3.SelectedIndex = 0;
621 | cAttack4.SelectedIndex = 0;
622 |
623 | grpParty.Text = $"Party (0x{trainer.PartyOffset:X7})";
624 | if (trainer.RequiresRepoint) grpParty.Text += "*";
625 |
626 | ShiftParty();
627 |
628 | ignore = false;
629 | }
630 |
631 | void ShiftParty()
632 | {
633 | for (int i = 0; i < trainer.Party.Count; i++)
634 | trainer.Party[i].Index = i;
635 |
636 | for (int i = 0; i < 6; i++)
637 | {
638 | Image sprite = invisible;
639 | if (i < trainer.Party.Count)
640 | sprite = LoadFrontSprite(trainer.Party[i].Species);
641 |
642 | partyPictureBoxes[i].Image = sprite;
643 | }
644 | }
645 |
646 | private void txtSearchId_KeyUp(object sender, KeyEventArgs e)
647 | {
648 | if (rom == null)
649 | return;
650 |
651 | if (e.KeyCode == Keys.Enter /*&& txtSearchId.Value <= trainerCount*/)
652 | {
653 | listTrainers.TopItem = listTrainers.Items[txtSearchId.Value];
654 | listTrainers.TopItem.Selected = true;
655 |
656 | e.Handled = e.SuppressKeyPress = true;
657 | }
658 | }
659 |
660 | private void txtSearchName_KeyUp(object sender, KeyEventArgs e)
661 | {
662 | if (rom == null || e.KeyCode != Keys.Enter || txtSearchName.TextLength <= 0)
663 | return;
664 |
665 | // get text to search for
666 | var search = txtSearchName.Text.ToLower();
667 |
668 | // get initial position to search from
669 | var start = listTrainers.TopItem.Index;
670 | if (start > 0)
671 | start++;
672 |
673 | var result = -1;
674 |
675 | search:
676 | // search names for text
677 | for (int i = start; i < trainerCount; i++)
678 | {
679 | var name = names[i].ToLower();
680 | if (name.IndexOf(search) >= 0)
681 | {
682 | result = i;
683 | break;
684 | }
685 | }
686 |
687 | if (result == -1 && start > 0)
688 | {
689 | // first time not found, search from top
690 | start = 0;
691 | goto search;
692 | }
693 | else if (result >= 0)
694 | {
695 | // result found
696 | listTrainers.TopItem = listTrainers.Items[result];
697 | listTrainers.TopItem.Selected = true;
698 | }
699 |
700 | e.Handled = e.SuppressKeyPress = true;
701 | }
702 |
703 | private void bRandomize_Click(object sender, EventArgs e)
704 | {
705 | if (rom == null)
706 | return;
707 |
708 | // confirm that the user actually wants to randomize
709 | if (MessageBox.Show("This will randomize every single trainer's party.\n" +
710 | "Are you sure you want to do this?",
711 | "Randomize?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
712 | return;
713 |
714 | // (simple) randomize all trainers
715 | RandomizeTrainers();
716 |
717 | // reload current trainer
718 | if (trainer != null)
719 | {
720 | LoadTrainer(trainer.Index);
721 |
722 | if (member != null)
723 | member = trainer.Party[member.Index];
724 |
725 | DisplayTrainer();
726 | DisplayPartyMember();
727 |
728 | for (int i = 0; i < 6; i++)
729 | {
730 | Image sprite = invisible;
731 | if (i < trainer.Party.Count)
732 | {
733 | sprite = LoadFrontSprite(trainer.Party[i].Species);
734 | }
735 | partyPictureBoxes[i].Image = sprite;
736 | }
737 | }
738 | }
739 |
740 | private void changePartyOffsetToolStripMenuItem_Click(object sender, EventArgs e)
741 | {
742 | using (var d = new OffsetDialog(trainer.PartyOffset, trainer.Party.Count))
743 | {
744 | if (d.ShowDialog() == DialogResult.OK)
745 | {
746 | // --
747 | if (trainer.PartyOffset == d.Offset)
748 | return;
749 |
750 | // Load a fresh party
751 | trainer.PartyOffset = d.Offset;
752 | LoadParty(d.Count);
753 |
754 | // Adjust party
755 | member = null;
756 |
757 | for (int i = 0; i < 6; i++) {
758 | Image sprite = invisible;
759 | if (i < trainer.Party.Count) {
760 | sprite = LoadFrontSprite(trainer.Party[i].Species);
761 | }
762 | partyPictureBoxes[i].Image = sprite;
763 | }
764 | pSprite.Image = LoadTrainerSprite(trainer.Sprite);
765 |
766 | // ------------------------------
767 | DisplayTrainer();
768 | DisplayPartyMember();
769 | }
770 | #if DEBUG
771 | else
772 | {
773 | Console.WriteLine("Change offset canceled.");
774 | }
775 | #endif
776 | }
777 | }
778 | }
779 | }
780 |
--------------------------------------------------------------------------------
/src/Trainer-Editor/MainForm.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 | 17, 17
122 |
123 |
124 | 132, 17
125 |
126 |
127 | 272, 17
128 |
129 |
130 |
131 |
132 | AAABAAcAEBAAAAEACABoBQAAdgAAABQUAAABACAAuAYAAN4FAAAYGAAAAQAgAIgJAACWDAAAICAAAAEA
133 | CACoCAAAHhYAADAwAAABAAgAqA4AAMYeAABAQAAAAQAIACgWAABuLQAAAAAAAAEACACYAwAAlkMAACgA
134 | AAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAJCQkAD4+PgAKCjQAAAA
135 | qAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
136 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
137 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
138 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
139 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
140 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
141 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
142 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
143 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
144 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
145 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
146 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
147 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
148 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
149 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
150 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
151 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
152 | AAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAABAgAAAgEAAAAAAAAAAAEAAwMAAAICAAAA
153 | AAAAAAABAAMAAAAAAgAAAAAAAAABAwUFBAUFBgUFAgEAAAAAAQQDAwQDBQYCAgYBAAAAAAEDAwMDBAQC
154 | AgICAQAAAAABAgMDAwMDAwICAgEAAAAAAAEDAwMDAwMCAgEAAAAAAAABAgMDAwMCAgIBAAAAAAAAAAEB
155 | AgICAgEBAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
156 | AACWYQAAlCcAAIADAACABwAAgAEAAMADAADAAwAAwAMAAMADAADgBwAA4AcAAPAPAAD8PwAA//8AAP//
157 | AAAoAAAAFAAAACgAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
158 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
159 | AAAAAAAAAAAAkAAAAMAAAACRAAAAAAAAAMAAAAAwAAAAAAAAAC8AAADAAAAAwAAAADAAAAAAAAAALwAA
160 | AMAAAADAAAAAwAAAAMAAAACRAAAAAAAAAAAAAADAAAAA/wAAAMAAAAAAAAAA/wAAAD9AQEBAJycnnwAA
161 | AP8AAAD/JycnoEBAQEAAAAA/AAAA/wAAAP8AAACeAAAAfwAAAGAAAAAAAAAAAAAAAL8AAAD/AAAA0AAA
162 | AEAAAAD/HBwccVBQUJ5AQED/AAAA/wAAAP8/Pz//UFBQoBwcHG8AAAD/AAAA/wAAAHEAAAAgAAAAAAAA
163 | AAAAAAAAAAAAvgAAAP8AAAD/AAAA/wAAAP8wMDD/aGho/2xsbP8AAAD/AAAA/2tra/9oaGj/MDAw/wAA
164 | AP8AAAD/AAAA/wAAAIAAAAAAAAAAAAAAAAAAAAC/AAAA/xAQEP9AQED/AAAA/7q6uv/4+Pj/u7u7/wAA
165 | AP8AAAD/bGxs/5CQkP9tbW3/AAAA/wAAAP8AAABAAAAAAAAAAAAAAAAAAAAAAAAAAL8AAAD/EBAQ/0BA
166 | QP8AAAD/urq6/5ubm/8uLi7/AAAA/wAAAP8bGxv/Wlpa/2xsbP8AAAD/AAAA/wAAANAAAADAAAAAkQAA
167 | AAAAAAAAAAAAXxYWFr8/Pz//nZ2d/wAAVP9cXLH/SEid/w8PY/8AAFX/AABU/wAARf8jI27/NjaK/wAA
168 | Vf9ISEj/Kioq/xYWFr8AAABgAAAAAAAAAAAAAAAAQEBAf2Bga//ExO7/Pz+8/z4+vP8zM8b/LS3L/z4+
169 | vP8AAKj/AACK/xISkf8kJKL/JCSi/2trjP9LS1P/QEBAgAAAAAAAAAAAAAAAAAAAAABAQEB/Ojpk/ygo
170 | 0P/4+Pj/+Pj4/5GR5P9cXNr/+Pj4/wAAqP8AAIr/SEiI/5CQkP+QkJD/AACA/zAwUP9AQECAAAAAAAAA
171 | AAAAAAAAAAAAAEBAQH9tbW3/+Pj4//j4+P/4+Pj/+Pj4/8XF7v8oKND/KCjQ/3Z2oP+QkJD/kJCQ/5CQ
172 | kP+QkJD/VFRU/0BAQIAAAAAAAAAAAAAAAAAAAAAAQEBAgFpaWv+qqqr/+Pj4//j4+P/4+Pj/6+v2/8XF
173 | 7v/ExO7/2Nji/7e3t/+QkJD/kJCQ/5CQkP9UVFT/QEBAgAAAAAAAAAAAAAAAAAAAAABAQEA/UFBQn2ho
174 | aP/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/xMTE/5CQkP+QkJD/aGho/1BQUJ5AQEBAAAAAAAAA
175 | AAAAAAAAAAAAAAAAAABAQEA/QEBA/97e3v/y8vL/+Pj4//j4+P/4+Pj/+Pj4/+Tk5P+3t7f/kJCQ/5CQ
176 | kP9AQED/QEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD9AQED/kJCQ/97e3v/4+Pj/+Pj4//j4
177 | +P/4+Pj/qqqq/5CQkP+QkJD/kJCQ/0BAQP9AQEBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
178 | AABAQED/QEBA/2hoaP+QkJD/kJCQ/5CQkP+QkJD/aGho/0BAQP9AQED/AAAAAAAAAAAAAAAAAAAAAAAA
179 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD9AQEA/UFBQn1RUVP9UVFT/VFRU/1RUVP9QUFCfQEBAP0BA
180 | QD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA/QEBAgEBA
181 | QH9AQEB/QEBAf0BAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
182 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
183 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
184 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//8ACJCBAAiAAQAIAAMACAADAAgABwAIAAEACAABAAwAAwAMAA
185 | MADAADAAwAAwAMAAMADgAHAA4ABwAPgB8AD4AfAA/gfwAP//8AD///AAKAAAABgAAAAwAAAAAQAgAAAA
186 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
187 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
188 | AAAAAABAAAAAgQAAAIAAAABAAAAAAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAgQAAAIAAAABAAAAAAAAA
189 | AAAAAABAAAAAgQAAAIAAAACAAAAAgQAAAIAAAABAAAAAAAAAAAAAAAB/AAAA/wAAAP8AAACAAAAAAAAA
190 | AP8AAACAAAAAAAAAAAAAAAB/AAAA/wAAAP8AAACAAAAAAAAAAAAAAAB/AAAA/wAAAP8AAAD/AAAA/wAA
191 | AP8AAACAAAAAAAAAAAAAAAB+AAAA/wAAAP8AAACBAAAAAAAAAP8AAACBAAAAAEBAQP8gICD/AAAA/wAA
192 | AP8gICD/QEBA/wAAAAAAAAB+AAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA/wAA
193 | AP8AAAC/AAAAgQAAAP8VFRW/QEBAgWhoaP80NDT/AAAA/wAAAP80NDT/aGho/0BAQIAVFRW/AAAA/wAA
194 | AP8AAAC/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAB/AAAA/wAAAP8AAAD/AAAA/wAAAP8gICD/QEBA/5CQ
195 | kP9ISEj/AAAA/wAAAP9ISEj/kJCQ/0BAQP8gICD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAA
196 | AAAAAAB+AAAA/wAAAP8gICD/QEBA/wAAAP97e3v/+Pj4//j4+P99fX3/AAAA/wAAAP9HR0f/kJCQ/5CQ
197 | kP9JSUn/AAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA/wAAAP8gICD/QEBA/wAA
198 | AP98fHz/+Pj4/3t7e/8+Pj7/AAAA/wAAAP8kJCT/R0dH/5CQkP9ISEj/AAAA/wAAAP8AAAC/AAAAgQAA
199 | AIAAAABAAAAAAAAAAAAAAAB/AAAA/wAAAP8gICD/QEBA/wAAAP97e3v/+Pj4/wAAAP8AAAD/AAAA/wAA
200 | AP8AAAD/AAAA/5CQkP9ISEj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACAAAAAAAAAAAAAAAAAAAAAAEBA
201 | QP+bm5v/+Pj4/wAAqP8AAKj/AACo/ygo0P8UFLz/AACo/wAAqP8AAJT/AACA/wAAqP8AAKj/AACo/5CQ
202 | kP9oaGj/QEBA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQP9oaJL/j4/k/3190P98fND/fX3Q/ygo
203 | 0P9SUtD/fX3Q/wAAqP8AAJT/AACA/0hInP9ISJz/SUmc/0hIiP9ERGT/QEBA/wAAAAAAAAAAAAAAAAAA
204 | AAAAAAAAAAAAAEBAQP80NIj/KCjQ//j4+P/4+Pj/+Pj4/ygo0P+Pj+T/+Pj4/wAAqP8AAJT/AACA/5CQ
205 | kP+QkJD/kJCQ/wAAgP8gIGD/QEBA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQP+bm5v/+Pj4//j4
206 | +P/4+Pj/+Pj4//j4+P+RkeT/KCjQ/ygo0P9cXLD/kJCQ/5CQkP+QkJD/kJCQ/5CQkP9oaGj/QEBA/wAA
207 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQP+CgoL/xMTE//j4+P/4+Pj/+Pj4//j4+P/ExO7/kZHk/5GR
208 | 5P+qqtT/xMTE/5CQkP+QkJD/kJCQ/5CQkP9oaGj/QEBA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBA
209 | QP9oaGj/kJCQ//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4/5CQkP+QkJD/kJCQ/5CQ
210 | kP9oaGj/QEBA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEB+QEBA//j4+P/4+Pj/+Pj4//j4
211 | +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4/5CQkP+QkJD/kJCQ/0BAQP9AQECBAAAAAAAAAAAAAAAAAAAAAAAA
212 | AAAAAAAAAAAAAAAAAABAQECAQEBA/8TExP/e3t7/+Pj4//j4+P/4+Pj/+Pj4//j4+P/e3t7/xMTE/5CQ
213 | kP+QkJD/kJCQ/0BAQP9AQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEB/QEBA/5CQ
214 | kP/ExMT/+Pj4//j4+P/4+Pj/+Pj4//j4+P/ExMT/kJCQ/5CQkP+QkJD/kJCQ/0BAQP9AQECAAAAAAAAA
215 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQP9AQED/QEBA/5CQkP+QkJD/kJCQ/5CQ
216 | kP+QkJD/kJCQ/0BAQP9AQED/QEBA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
217 | AAAAAAAAAAAAAEBAQH9AQECAQEBAfmhoaP9oaGj/aGho/2hoaP9oaGj/aGho/0BAQH9AQECAQEBAfgAA
218 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBA
219 | QP9AQED/QEBA/0BAQP9AQED/QEBA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
220 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
221 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
222 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
223 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
224 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wCEwwEAhMMBAISB
225 | DwCAAAcAgAAHAIAADwCAAAEAgAABAOAABwDgAAcA4AAHAOAABwDgAAcA4AAHAPAADwDwAA8A8AAPAPwA
226 | PwD8AD8A/4H/AP///wD///8A////ACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
227 | AAAAAAAAQEBAAJCQkAD4+PgAKCjQAAAAqAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
228 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
229 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
230 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
231 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
232 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
233 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
234 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
235 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
236 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
237 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
238 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
239 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
240 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
241 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
242 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
243 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
244 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
245 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
246 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB
247 | AAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgIAAAAAAgIBAQAAAAAAAAAAAAAAAAAAAAAAAAAA
248 | AQECAgAAAAACAgEBAAAAAAAAAAAAAAAAAAAAAAEBAAADAwMDAAAAAAICAgIAAAAAAAAAAAAAAAAAAAAA
249 | AQEAAAMDAwMAAAAAAgICAgAAAAAAAAAAAAAAAAAAAAABAQAAAwMAAAAAAAAAAAICAAAAAAAAAAAAAAAA
250 | AAAAAAEBAAADAwAAAAAAAAAAAgIAAAAAAAAAAAAAAAAAAAEBAwMFBQUFBAQFBQUFBgYFBQUFAgIBAQAA
251 | AAAAAAAAAQEDAwUFBQUEBAUFBQUGBgUFBQUCAgEBAAAAAAAAAAABAQQEAwMDAwQEAwMFBQYGAgICAgYG
252 | AQEAAAAAAAAAAAEBBAQDAwMDBAQDAwUFBgYCAgICBgYBAQAAAAAAAAAAAQEDAwMDAwMDAwQEBAQCAgIC
253 | AgICAgEBAAAAAAAAAAABAQMDAwMDAwMDBAQEBAICAgICAgICAQEAAAAAAAAAAAEBAgIDAwMDAwMDAwMD
254 | AwMCAgICAgIBAQAAAAAAAAAAAQECAgMDAwMDAwMDAwMDAwICAgICAgEBAAAAAAAAAAAAAAEBAwMDAwMD
255 | AwMDAwMDAgICAgEBAAAAAAAAAAAAAAAAAQEDAwMDAwMDAwMDAwMCAgICAQEAAAAAAAAAAAAAAAABAQIC
256 | AwMDAwMDAwMCAgICAgIBAQAAAAAAAAAAAAAAAAEBAgIDAwMDAwMDAwICAgICAgEBAAAAAAAAAAAAAAAA
257 | AAABAQEBAgICAgICAgIBAQEBAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgEBAQEAAAAAAAAAAAAA
258 | AAAAAAAAAAAAAAEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEAAAAAAAAAAAAA
259 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
260 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
261 | AAAAAAAAAAAAAP//////////wzw8A8M8PAPDMAw/wzAMP8AAAA/AAAAPwAAAP8AAAD/AAAADwAAAA/AA
262 | AA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/AAAP/wAAD/8AAA//AAAP/8AAP//AAD///AP///w
263 | D///////////////////////KAAAADAAAABgAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
264 | AABAQEAAkJCQAPj4+AAoKNAAAACoAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
265 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
266 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
267 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
268 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
269 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
270 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
271 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
272 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
273 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
274 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
276 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
277 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
278 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
279 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
280 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
281 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
282 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
283 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
284 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
285 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
286 | AAAAAAAAAAABAQEAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA
287 | AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAABAQEAAAAA
288 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQECAgIAAAAAAAACAgIBAQEAAAAAAAAAAAAAAAAA
289 | AAAAAAAAAAAAAAAAAAAAAAABAQECAgIAAAAAAAACAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
290 | AAAAAAABAQECAgIAAAAAAAACAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAADAwMDAwMA
291 | AAAAAAACAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAADAwMDAwMAAAAAAAACAgICAgIA
292 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAADAwMDAwMAAAAAAAACAgICAgIAAAAAAAAAAAAAAAAA
293 | AAAAAAAAAAAAAAABAQEAAAADAwMAAAAAAAAAAAAAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB
294 | AQEAAAADAwMAAAAAAAAAAAAAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAADAwMAAAAA
295 | AAAAAAAAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEDAwMFBQUFBQUEBAQFBQUFBQUGBgYFBQUF
296 | BQUCAgIBAQEAAAAAAAAAAAAAAAABAQEDAwMFBQUFBQUEBAQFBQUFBQUGBgYFBQUFBQUCAgIBAQEAAAAA
297 | AAAAAAAAAAABAQEDAwMFBQUFBQUEBAQFBQUFBQUGBgYFBQUFBQUCAgIBAQEAAAAAAAAAAAAAAAABAQEE
298 | BAQDAwMDAwMEBAQDAwMFBQUGBgYCAgICAgIGBgYBAQEAAAAAAAAAAAAAAAABAQEEBAQDAwMDAwMEBAQD
299 | AwMFBQUGBgYCAgICAgIGBgYBAQEAAAAAAAAAAAAAAAABAQEEBAQDAwMDAwMEBAQDAwMFBQUGBgYCAgIC
300 | AgIGBgYBAQEAAAAAAAAAAAAAAAABAQEDAwMDAwMDAwMDAwMEBAQEBAQCAgICAgICAgICAgIBAQEAAAAA
301 | AAAAAAAAAAABAQEDAwMDAwMDAwMDAwMEBAQEBAQCAgICAgICAgICAgIBAQEAAAAAAAAAAAAAAAABAQED
302 | AwMDAwMDAwMDAwMEBAQEBAQCAgICAgICAgICAgIBAQEAAAAAAAAAAAAAAAABAQECAgIDAwMDAwMDAwMD
303 | AwMDAwMDAwMCAgICAgICAgIBAQEAAAAAAAAAAAAAAAABAQECAgIDAwMDAwMDAwMDAwMDAwMDAwMCAgIC
304 | AgICAgIBAQEAAAAAAAAAAAAAAAABAQECAgIDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgIBAQEAAAAA
305 | AAAAAAAAAAAAAAABAQEDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAAB
306 | AQEDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAABAQEDAwMDAwMDAwMD
307 | AwMDAwMDAwMCAgICAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAABAQECAgIDAwMDAwMDAwMDAwMCAgICAgIC
308 | AgIBAQEAAAAAAAAAAAAAAAAAAAAAAAABAQECAgIDAwMDAwMDAwMDAwMCAgICAgICAgIBAQEAAAAAAAAA
309 | AAAAAAAAAAAAAAABAQECAgIDAwMDAwMDAwMDAwMCAgICAgICAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAAA
310 | AAABAQEBAQECAgICAgICAgICAgIBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQECAgIC
311 | AgICAgICAgIBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQECAgICAgICAgICAgIBAQEB
312 | AQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAA
313 | AAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
314 | AAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
315 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
316 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
317 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
318 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
319 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AADgcfgfgAcAAOBx
320 | +B+ABwAA4HH4H4AHAADgccADgf8AAOBxwAOB/wAA4HHAA4H/AADgAAAAAD8AAOAAAAAAPwAA4AAAAAA/
321 | AADgAAAAAf8AAOAAAAAB/wAA4AAAAAH/AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAAD8AAAAAD8AAPwA
322 | AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
323 | AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+A
324 | AAAB/wAA/4AAAAH/AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD//8AD//8AAP//wAP//wAA///AA///
325 | AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAQAAAAIAA
326 | AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQACQkJAA+Pj4ACgo0AAAAKgAAACAAAAA
327 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
328 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
329 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
330 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
331 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
332 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
333 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
334 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
335 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
336 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
337 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
338 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
339 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
340 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
341 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
342 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
343 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
344 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
345 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
346 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
347 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
348 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
349 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
350 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
351 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
352 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAA
353 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAEBAQEAAAAAAAAAAAAA
354 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAABAQEBAAAAAAAA
355 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAQEBAQAA
356 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQICAgIAAAAAAAAAAAIC
357 | AgIBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAAAAAAAA
358 | AAACAgICAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAgICAgAA
359 | AAAAAAAAAgICAgEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQIC
360 | AgIAAAAAAAAAAAICAgIBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAMD
361 | AwMDAwMDAAAAAAAAAAACAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAA
362 | AAADAwMDAwMDAwAAAAAAAAAAAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB
363 | AQEAAAAAAwMDAwMDAwMAAAAAAAAAAAICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
364 | AAABAQEBAAAAAAMDAwMDAwMDAAAAAAAAAAACAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
365 | AAAAAAAAAQEBAQAAAAADAwMDAAAAAAAAAAAAAAAAAAAAAAICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
366 | AAAAAAAAAAAAAAEBAQEAAAAAAwMDAwAAAAAAAAAAAAAAAAAAAAACAgICAAAAAAAAAAAAAAAAAAAAAAAA
367 | AAAAAAAAAAAAAAAAAAABAQEBAAAAAAMDAwMAAAAAAAAAAAAAAAAAAAAAAgICAgAAAAAAAAAAAAAAAAAA
368 | AAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAADAwMDAAAAAAAAAAAAAAAAAAAAAAICAgIAAAAAAAAAAAAA
369 | AAAAAAAAAAAAAAAAAAAAAAAAAQEBAQMDAwMFBQUFBQUFBQQEBAQFBQUFBQUFBQYGBgYFBQUFBQUFBQIC
370 | AgIBAQEBAAAAAAAAAAAAAAAAAAAAAAEBAQEDAwMDBQUFBQUFBQUEBAQEBQUFBQUFBQUGBgYGBQUFBQUF
371 | BQUCAgICAQEBAQAAAAAAAAAAAAAAAAAAAAABAQEBAwMDAwUFBQUFBQUFBAQEBAUFBQUFBQUFBgYGBgUF
372 | BQUFBQUFAgICAgEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAQMDAwMFBQUFBQUFBQQEBAQFBQUFBQUFBQYG
373 | BgYFBQUFBQUFBQICAgIBAQEBAAAAAAAAAAAAAAAAAAAAAAEBAQEEBAQEAwMDAwMDAwMEBAQEAwMDAwUF
374 | BQUGBgYGAgICAgICAgIGBgYGAQEBAQAAAAAAAAAAAAAAAAAAAAABAQEBBAQEBAMDAwMDAwMDBAQEBAMD
375 | AwMFBQUFBgYGBgICAgICAgICBgYGBgEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAQQEBAQDAwMDAwMDAwQE
376 | BAQDAwMDBQUFBQYGBgYCAgICAgICAgYGBgYBAQEBAAAAAAAAAAAAAAAAAAAAAAEBAQEEBAQEAwMDAwMD
377 | AwMEBAQEAwMDAwUFBQUGBgYGAgICAgICAgIGBgYGAQEBAQAAAAAAAAAAAAAAAAAAAAABAQEBAwMDAwMD
378 | AwMDAwMDAwMDAwQEBAQEBAQEAgICAgICAgICAgICAgICAgEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBAQMD
379 | AwMDAwMDAwMDAwMDAwMEBAQEBAQEBAICAgICAgICAgICAgICAgIBAQEBAAAAAAAAAAAAAAAAAAAAAAEB
380 | AQEDAwMDAwMDAwMDAwMDAwMDBAQEBAQEBAQCAgICAgICAgICAgICAgICAQEBAQAAAAAAAAAAAAAAAAAA
381 | AAABAQEBAwMDAwMDAwMDAwMDAwMDAwQEBAQEBAQEAgICAgICAgICAgICAgICAgEBAQEAAAAAAAAAAAAA
382 | AAAAAAAAAQEBAQICAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgIBAQEBAAAAAAAA
383 | AAAAAAAAAAAAAAEBAQECAgICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAQEBAQAA
384 | AAAAAAAAAAAAAAAAAAABAQEBAgICAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgEB
385 | AQEAAAAAAAAAAAAAAAAAAAAAAQEBAQICAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgIC
386 | AgIBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIC
387 | AgIBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC
388 | AgICAgICAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
389 | AwMCAgICAgICAgEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAwMDAwMDAwMDAwMDAwMDAwMD
390 | AwMDAwMDAgICAgICAgIBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQICAgIDAwMDAwMDAwMD
391 | AwMDAwMDAgICAgICAgICAgICAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAwMDAwMD
392 | AwMDAwMDAwMDAwICAgICAgICAgICAgEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAgICAgMD
393 | AwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgIBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQIC
394 | AgIDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
395 | AAABAQEBAQEBAQICAgICAgICAgICAgICAgIBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
396 | AAAAAAAAAQEBAQEBAQECAgICAgICAgICAgICAgICAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
397 | AAAAAAAAAAAAAAEBAQEBAQEBAgICAgICAgICAgICAgICAgEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAA
398 | AAAAAAAAAAAAAAAAAAABAQEBAQEBAQICAgICAgICAgICAgICAgIBAQEBAQEBAQAAAAAAAAAAAAAAAAAA
399 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAA
400 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAA
401 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAA
402 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAA
403 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
404 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
405 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
406 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
407 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
408 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
409 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
410 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
411 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
412 | //////////////////////////////APD/AP8AAP8A8P8A/wAA/wDw/wD/AAD/APD/AP8AAP8A8PAADw
413 | D//wDw8AAPAP//APDwAA8A//8A8PAADwD//wAAAAAAAA//AAAAAAAAD/8AAAAAAAAP/wAAAAAAAA//AA
414 | AAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAA
415 | AA//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8A
416 | AAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAA
417 | AP//AAAAAAAA///wAAAAAA////AAAAAAD///8AAAAAAP///wAAAAAA////AAAAAAD///8AAAAAAP///w
418 | AAAAAA////AAAAAAD////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD//////wAA////////AAD/
419 | //////8AAP///////wAA////////////////////////////////////////////////////////////
420 | /////////////////////////////4lQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAA19J
421 | REFUeNrt3bFxIjEUgGHWswHhhS6B0CUoJFQZhJRCSBkqQSU4dBkXku014BkHz5z2oe/LZXbF+h9tIHE4
422 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/WUzBWKWUbeb77717Bgd6MwUgAIAAAAIACAAg
423 | AIAAAAIACAAgAIAAAAIACAAgAIAAAHu1zj4Bo/fj11pn/wqGzv/s5xFYAYAAAAIACAAgAIAAAAIACAAg
424 | AIAAAAIACAAgAIAAAAIA7Fb6vdDR/fzR/fiXy2XqB+h+v6e+/tZaaHz28wSsAMArACAAgAAAAgAIACAA
425 | gAAAAgAIACAAgAAAAgAIACAAwG6ts0/A7Pv5R89f9vMErAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAA
426 | QAAAAQAEAHiS4ecBlFK2yPhaq2+Rkc9P6PntvS9WAIAAAAIACAAgAIAAAAIACAAgAIAAAAIACAAgAIAA
427 | AAIAfGPNfgPR36fP7uvjY+jn98nn3woAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAIAnSX8e
428 | QHQ//Onzc+rrb8djaPzf6zU0/s/tNnT+o9d/KMUKABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAA
429 | QACAZ0h/HsDo/fDh6z+dUl9/1Ht0P35U9DyC1qwAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEA
430 | BAB4huUX/sY28gZK8PfZe++h8Y/HIzT+mHw/f9QtuB//Ovo8geT/w1YA4BUAEABAAAABAAQAEABAAAAB
431 | AAQAEABAAAABAAQAEABgt1ZTMFb28wSi+/lfwJL54q0AwCsAIACAAAACAAgAIACAAAACAAgAIACAAAAC
432 | AAgAIADAbqU/D6D3PvTzz+dzaHytdeoHsLWW/Ra24Pih5wlYAYBXAEAAAAEABAAQAEAAAAEABAAQAEAA
433 | AAEABAAQAEAAgN1aX+AeovupQ/u5e+9DP3+06H7+F5i/JfP3ZwUAXgEAAQAEABAAQAAAAQAEABAAQAAA
434 | AQAEABAAQAAAAQB26zf2Mmffj536990P9sNv/oetAAABAAQAEABAAAABAAQAEABAAEAAAAEABAAQAEAA
435 | AAEAAAAAAAAAAAAAAAAAAAAAAP6Df2jaW1dC93h8AAAAAElFTkSuQmCC
436 |
437 |
438 |
--------------------------------------------------------------------------------