diff --git a/BG4.cs b/BG4.cs index d1986cf..7046617 100644 --- a/BG4.cs +++ b/BG4.cs @@ -20,9 +20,14 @@ public int CompareTo(FileEntry rhs) } } + class InvalidBG4Exception : Exception + { + public InvalidBG4Exception(string message) : base(message) { } + } + class BG4 { - public string Extract(string filename, string path, bool overwrite = true) + public static string Extract(string filename, string path, bool overwrite = true) { string result = "Files successfully extracted."; @@ -40,14 +45,12 @@ public string Extract(string filename, string path, bool overwrite = true) // TODO: Decipher header values - while (br.ReadUInt32() != 0xFFFFFFFF) { } // Jump to the end of the entry + while (br.ReadUInt32() != 0xFFFFFFFF) { } // Jump to the end of the header br.ReadBytes(2); // 00 00 // Loop through file details bool eoh = false; - List entries = new List(); - List filenames = new List(); FileEntry entry = new FileEntry(); while (!eoh) @@ -72,6 +75,7 @@ public string Extract(string filename, string path, bool overwrite = true) entry = new FileEntry(); } + // File entry closer if (br.PeekString() == Encoding.ASCII.GetString(new byte[] { 0x00, 0x00, 0x00, 0x80 })) br.ReadBytes(4); // 00 00 00 80 } @@ -81,11 +85,16 @@ public string Extract(string filename, string path, bool overwrite = true) } } + // Sort the file entries into NameIndex order + entries.Sort(); + // Filenames bool eofn = false; + List filenames = new List(); + while (!eofn) { - if (filenames.Count == entries.Count) + if (br.PeekString(2) == Encoding.ASCII.GetString(new byte[] { 0xFF, 0xFF })) eofn = true; else { @@ -106,9 +115,6 @@ public string Extract(string filename, string path, bool overwrite = true) } } - // Arrange the file entries in NameIndex order - entries.Sort(); - // Extract! for (int i = 0; i < entries.Count; i++) { @@ -142,14 +148,9 @@ public string Extract(string filename, string path, bool overwrite = true) return result; } - public void Pack(string filename, string path) + public static void Pack(string filename, string path) { - + throw new NotImplementedException(); } } - - class InvalidBG4Exception : Exception - { - public InvalidBG4Exception(string message) : base(message) { } - } } \ No newline at end of file diff --git a/MSBT.cs b/MSBT.cs index 83032ba..02c84a2 100644 --- a/MSBT.cs +++ b/MSBT.cs @@ -70,7 +70,7 @@ class TXT2 class Entry { public UInt32 Length; - public List Values = new List(); + public List Values = new List(); public byte[] Value; public Int32 ID; @@ -79,6 +79,13 @@ public override string ToString() return (Length > 0 ? Encoding.ASCII.GetString(Value) : (ID + 1).ToString()); } } + + class Value + { + public byte[] Data; + public bool Editable = true; + public bool NullTerminated = true; + } class MSBT { @@ -93,7 +100,7 @@ class MSBT public TXT2 TXT2 = new TXT2(); public List SectionOrder = new List(); - byte paddingChar = 0xAB; + private byte paddingChar = 0xAB; public MSBT(string filename) { @@ -170,18 +177,8 @@ private void ReadLBL1(BinaryReaderX br) LBL1.SectionSize = br.ReadUInt32(); LBL1.Unknown1 = br.ReadBytes(8); LBL1.Unknown2 = br.ReadBytes(8); - uint startOfLabels = (uint)br.BaseStream.Position + sizeof(UInt32); - while (!eoi) - { - uint temp = br.ReadUInt32(); - if (temp > 2) - { - startOfLabels = temp + (uint)offset + (uint)LBL1.Unknown1.Length + (uint)LBL1.Unknown2.Length; - eoi = true; - } - } - br.BaseStream.Seek(-sizeof(UInt32), SeekOrigin.Current); - LBL1.Unknown3 = br.ReadBytes((int)startOfLabels - (int)br.BaseStream.Position); + uint startOfLabels = 0x35C; // Magic LBL1 label start position + LBL1.Unknown3 = br.ReadBytes((int)(startOfLabels - br.BaseStream.Position)); while (br.BaseStream.Position < (offset + LBL1.Identifier.Length + sizeof(UInt32) + LBL1.Unknown1.Length + LBL1.SectionSize)) { @@ -256,9 +253,6 @@ private void ReadTXT2(BinaryReaderX br) { byte[] unichar = br.ReadBytes(2); - if (unichar[0] == paddingChar && unichar[1] == paddingChar) - break; - if (Header.ByteOrderMark[0] == 0xFE) Array.Reverse(unichar); @@ -266,17 +260,41 @@ private void ReadTXT2(BinaryReaderX br) result.AddRange(unichar); else { - entry.Values.Add(result.ToArray()); + Value val = new Value(); + val.Data = result.ToArray(); + + if (result.Count == 0) + val.Editable = false; + + entry.Values.Add(val); result.Clear(); } } } + + // Strange extended string without null termination + if (result.Count > 1) + { + Value finalVal = new Value(); + finalVal.Data = result.ToArray(); + finalVal.Editable = false; + finalVal.NullTerminated = false; + entry.Values.Add(finalVal); + } + entry.ID = i; TXT2.OriginalEntries.Add(entry); + // Duplicate entries for editing Entry entryEdited = new Entry(); - foreach (byte[] value in entry.Values) - entryEdited.Values.Add(value); + foreach (Value value in entry.Values) + { + Value val = new Value(); + val.Data = value.Data; + val.Editable = value.Editable; + val.NullTerminated = value.NullTerminated; + entryEdited.Values.Add(val); + } entryEdited.Value = entry.Value; entryEdited.ID = entry.ID; TXT2.Entries.Add(entryEdited); @@ -289,7 +307,11 @@ private void PaddingSeek(BinaryReaderX br) { long remainder = br.BaseStream.Position % 16; if (remainder > 0) + { + paddingChar = br.ReadByte(); + br.BaseStream.Seek(-1, SeekOrigin.Current); br.BaseStream.Seek(16 - remainder, SeekOrigin.Current); + } } public bool Save() @@ -461,9 +483,9 @@ private bool WriteTXT2(BinaryWriterX bw) for (int i = 0; i < TXT2.NumberOfStrings; i++) { - foreach (byte[] value in TXT2.Entries[i].Values) + foreach (Value value in TXT2.Entries[i].Values) { - newSize += (UInt32)(value.Length + 2); + newSize += (UInt32)(value.Data.Length + (value.NullTerminated ? 2 : 0)); } } @@ -479,8 +501,8 @@ private bool WriteTXT2(BinaryWriterX bw) for (int i = 0; i < TXT2.NumberOfStrings; i++) { offsets.Add(offsetsLength + runningTotal); - foreach (byte[] value in TXT2.Entries[i].Values) - runningTotal += ((UInt32)value.Length) + 2; + foreach (Value value in TXT2.Entries[i].Values) + runningTotal += (UInt32)(value.Data.Length + (value.NullTerminated ? 2 : 0)); } for (int i = 0; i < TXT2.NumberOfStrings; i++) bw.Write(offsets[i]); @@ -489,18 +511,21 @@ private bool WriteTXT2(BinaryWriterX bw) for (int j = 0; j < TXT2.Entries[i].Values.Count; j++) TXT2.OriginalEntries[i].Values[j] = TXT2.Entries[i].Values[j]; - foreach (byte[] value in TXT2.Entries[i].Values) + foreach (Value value in TXT2.Entries[i].Values) { if (Header.ByteOrderMark[0] == 0xFF) - bw.Write(value); + bw.Write(value.Data); else - for (int j = 0; j < value.Length; j += 2) + for (int j = 0; j < value.Data.Length; j += 2) { - bw.Write(value[j + 1]); - bw.Write(value[j]); + bw.Write(value.Data[j + 1]); + bw.Write(value.Data[j]); } - bw.Write('\0'); - bw.Write('\0'); + if (value.NullTerminated) + { + bw.Write('\0'); + bw.Write('\0'); + } } } diff --git a/MsbtEditor.csproj b/MsbtEditor.csproj index c724e1d..778d26c 100644 --- a/MsbtEditor.csproj +++ b/MsbtEditor.csproj @@ -58,6 +58,12 @@ + + Form + + + frmBG4.cs + Form @@ -68,6 +74,9 @@ + + frmBG4.cs + frmMain.cs Designer diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 2e63427..4d44d6a 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -31,4 +31,4 @@ // // È possibile specificare tutti i valori oppure impostare valori predefiniti per i numeri relativi alla revisione e alla build // usando l'asterisco '*' come illustrato di seguito: -[assembly: AssemblyVersion("0.8.*")] +[assembly: AssemblyVersion("0.8.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index bbb1f90..ab8a166 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -200,6 +200,16 @@ internal class Resources { } } + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon msbteditor { + get { + object obj = ResourceManager.GetObject("msbteditor", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index b8dcc4d..5b669ad 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -160,6 +160,9 @@ ..\images\menu-up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\images\msbteditor.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\images\tab-class.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/frmBG4.Designer.cs b/frmBG4.Designer.cs new file mode 100644 index 0000000..62cdf04 --- /dev/null +++ b/frmBG4.Designer.cs @@ -0,0 +1,125 @@ +namespace MsbtEditor +{ + partial class frmBG4 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tlsMain = new System.Windows.Forms.ToolStrip(); + this.panel1 = new System.Windows.Forms.Panel(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.colFilename = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colFilesize = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colType = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // tlsMain + // + this.tlsMain.GripMargin = new System.Windows.Forms.Padding(0); + this.tlsMain.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.tlsMain.ImageScalingSize = new System.Drawing.Size(32, 32); + this.tlsMain.Location = new System.Drawing.Point(0, 0); + this.tlsMain.Name = "tlsMain"; + this.tlsMain.Padding = new System.Windows.Forms.Padding(4, 0, 0, 0); + this.tlsMain.Size = new System.Drawing.Size(599, 25); + this.tlsMain.TabIndex = 0; + // + // panel1 + // + this.panel1.Controls.Add(this.dataGridView1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 25); + this.panel1.Name = "panel1"; + this.panel1.Padding = new System.Windows.Forms.Padding(5); + this.panel1.Size = new System.Drawing.Size(599, 617); + this.panel1.TabIndex = 1; + // + // dataGridView1 + // + this.dataGridView1.AllowUserToAddRows = false; + this.dataGridView1.AllowUserToDeleteRows = false; + this.dataGridView1.BackgroundColor = System.Drawing.SystemColors.Window; + this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.colFilename, + this.colFilesize, + this.colType}); + this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView1.Location = new System.Drawing.Point(5, 5); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.ReadOnly = true; + this.dataGridView1.RowHeadersVisible = false; + this.dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; + this.dataGridView1.Size = new System.Drawing.Size(589, 607); + this.dataGridView1.TabIndex = 0; + // + // colFilename + // + this.colFilename.HeaderText = "Filename"; + this.colFilename.Name = "colFilename"; + this.colFilename.ReadOnly = true; + // + // colFilesize + // + this.colFilesize.HeaderText = "Size"; + this.colFilesize.Name = "colFilesize"; + this.colFilesize.ReadOnly = true; + // + // colType + // + this.colType.HeaderText = "Type"; + this.colType.Name = "colType"; + this.colType.ReadOnly = true; + // + // frmBG4 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(599, 642); + this.Controls.Add(this.panel1); + this.Controls.Add(this.tlsMain); + this.Name = "frmBG4"; + this.Text = "BG4 Explorer"; + this.Load += new System.EventHandler(this.frmBG4_Load); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip tlsMain; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.DataGridViewTextBoxColumn colFilename; + private System.Windows.Forms.DataGridViewTextBoxColumn colFilesize; + private System.Windows.Forms.DataGridViewTextBoxColumn colType; + } +} \ No newline at end of file diff --git a/frmBG4.cs b/frmBG4.cs new file mode 100644 index 0000000..39d1733 --- /dev/null +++ b/frmBG4.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using MsbtEditor.Properties; +using System.IO; + +namespace MsbtEditor +{ + public partial class frmBG4 : Form + { + private FileInfo File = null; + public string FileName = string.Empty; + + public frmBG4() + { + InitializeComponent(); + this.Icon = Properties.Resources.msbteditor; + } + + private void frmBG4_Load(object sender, EventArgs e) + { + //FolderBrowserDialog fbd = new FolderBrowserDialog(); + //fbd.Description = "Select the destination directory to extarct the files into."; + //fbd.SelectedPath = Settings.Default.InitialDirectory; + + //if (fbd.ShowDialog() == DialogResult.OK) + //{ + // string directory = fbd.SelectedPath; + + // if (Directory.Exists(directory)) + // { + // bool overwrite = true; + + // if (new DirectoryInfo(directory).GetFiles().Length > 0) + // overwrite = MessageBox.Show("Is it OK to overwrite files in the destination directory?", "Overwrite?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes ? true : false; + + // string result = BG4.Extract(FileName, directory, overwrite); + + // MessageBox.Show(result, "BG4 Extraction Result", MessageBoxButtons.OK, MessageBoxIcon.Information); + // } + //} + + + + } + } +} \ No newline at end of file diff --git a/frmBG4.resx b/frmBG4.resx new file mode 100644 index 0000000..2ab88d8 --- /dev/null +++ b/frmBG4.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/frmMain.Designer.cs b/frmMain.Designer.cs index ba3d697..9c03077 100644 --- a/frmMain.Designer.cs +++ b/frmMain.Designer.cs @@ -28,7 +28,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); this.mnuMain = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -36,7 +35,8 @@ private void InitializeComponent() this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.lZCompressionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.BG4ExplorerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.compressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.decompressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -59,8 +59,6 @@ private void InitializeComponent() this.sfdSaveEntity = new System.Windows.Forms.SaveFileDialog(); this.lblSubStrings = new System.Windows.Forms.Label(); this.txtConcatenated = new System.Windows.Forms.TextBox(); - this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.extractBG4ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mnuMain.SuspendLayout(); this.stsMain.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); @@ -70,7 +68,6 @@ private void InitializeComponent() // this.mnuMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem, - this.lZCompressionToolStripMenuItem, this.toolsToolStripMenuItem, this.helpToolStripMenuItem}); this.mnuMain.Location = new System.Drawing.Point(0, 0); @@ -131,32 +128,40 @@ private void InitializeComponent() this.exitToolStripMenuItem.Text = "E&xit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // - // lZCompressionToolStripMenuItem + // toolsToolStripMenuItem // - this.lZCompressionToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.BG4ExplorerToolStripMenuItem, this.compressToolStripMenuItem, this.decompressToolStripMenuItem}); - this.lZCompressionToolStripMenuItem.Name = "lZCompressionToolStripMenuItem"; - this.lZCompressionToolStripMenuItem.Size = new System.Drawing.Size(117, 20); - this.lZCompressionToolStripMenuItem.Text = "LZ11 &Compression"; + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20); + this.toolsToolStripMenuItem.Text = "&Tools"; + // + // BG4ExplorerToolStripMenuItem + // + this.BG4ExplorerToolStripMenuItem.Image = global::MsbtEditor.Properties.Resources.menu_export; + this.BG4ExplorerToolStripMenuItem.Name = "BG4ExplorerToolStripMenuItem"; + this.BG4ExplorerToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F8; + this.BG4ExplorerToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.BG4ExplorerToolStripMenuItem.Text = "BG4 &Extract"; + this.BG4ExplorerToolStripMenuItem.Click += new System.EventHandler(this.BG4ExplorerToolStripMenuItem_Click); // // compressToolStripMenuItem // this.compressToolStripMenuItem.Image = global::MsbtEditor.Properties.Resources.tab_class; this.compressToolStripMenuItem.Name = "compressToolStripMenuItem"; this.compressToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F9; - this.compressToolStripMenuItem.Size = new System.Drawing.Size(164, 22); - this.compressToolStripMenuItem.Text = "&Compress"; - this.compressToolStripMenuItem.Click += new System.EventHandler(this.compressToolStripMenuItem_Click); + this.compressToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.compressToolStripMenuItem.Text = "LZ11 &Compress"; // // decompressToolStripMenuItem // this.decompressToolStripMenuItem.Image = global::MsbtEditor.Properties.Resources.tab_class; this.decompressToolStripMenuItem.Name = "decompressToolStripMenuItem"; this.decompressToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F10; - this.decompressToolStripMenuItem.Size = new System.Drawing.Size(164, 22); - this.decompressToolStripMenuItem.Text = "&Decompress"; - this.decompressToolStripMenuItem.Click += new System.EventHandler(this.decompressToolStripMenuItem_Click); + this.decompressToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.decompressToolStripMenuItem.Text = "LZ11 &Decompress"; // // helpToolStripMenuItem // @@ -233,7 +238,7 @@ private void InitializeComponent() this.hbxHexView.ShadowSelectionColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(60)))), ((int)(((byte)(188)))), ((int)(((byte)(255))))); this.hbxHexView.Size = new System.Drawing.Size(550, 166); this.hbxHexView.StringViewVisible = true; - this.hbxHexView.TabIndex = 10; + this.hbxHexView.TabIndex = 6; this.hbxHexView.UseFixedBytesPerLine = true; this.hbxHexView.VScrollBarVisible = true; this.hbxHexView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.hbxSelectAll_KeyDown); @@ -302,7 +307,7 @@ private void InitializeComponent() this.txtOriginal.Name = "txtOriginal"; this.txtOriginal.ReadOnly = true; this.txtOriginal.Size = new System.Drawing.Size(248, 157); - this.txtOriginal.TabIndex = 6; + this.txtOriginal.TabIndex = 4; this.txtOriginal.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSelectAll_KeyDown); // // txtEdit @@ -314,7 +319,7 @@ private void InitializeComponent() this.txtEdit.Multiline = true; this.txtEdit.Name = "txtEdit"; this.txtEdit.Size = new System.Drawing.Size(243, 157); - this.txtEdit.TabIndex = 4; + this.txtEdit.TabIndex = 3; this.txtEdit.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSelectAll_KeyDown); this.txtEdit.KeyUp += new System.Windows.Forms.KeyEventHandler(this.txtEdit_KeyUp); // @@ -327,7 +332,7 @@ private void InitializeComponent() this.lstSubStrings.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0); this.lstSubStrings.Name = "lstSubStrings"; this.lstSubStrings.Size = new System.Drawing.Size(44, 157); - this.lstSubStrings.TabIndex = 7; + this.lstSubStrings.TabIndex = 2; this.lstSubStrings.SelectedIndexChanged += new System.EventHandler(this.lstSubStrings_SelectedIndexChanged); // // lblOriginal @@ -372,24 +377,9 @@ private void InitializeComponent() this.txtConcatenated.Name = "txtConcatenated"; this.txtConcatenated.ReadOnly = true; this.txtConcatenated.Size = new System.Drawing.Size(549, 95); - this.txtConcatenated.TabIndex = 15; + this.txtConcatenated.TabIndex = 5; this.txtConcatenated.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSelectAll_KeyDown); // - // toolsToolStripMenuItem - // - this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.extractBG4ToolStripMenuItem}); - this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; - this.toolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20); - this.toolsToolStripMenuItem.Text = "&Tools"; - // - // extractBG4ToolStripMenuItem - // - this.extractBG4ToolStripMenuItem.Name = "extractBG4ToolStripMenuItem"; - this.extractBG4ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.extractBG4ToolStripMenuItem.Text = "&Extract BG4"; - this.extractBG4ToolStripMenuItem.Click += new System.EventHandler(this.extractBG4ToolStripMenuItem_Click); - // // frmMain // this.AllowDrop = true; @@ -407,7 +397,6 @@ private void InitializeComponent() this.Controls.Add(this.lblStrings); this.Controls.Add(this.lstStrings); this.Controls.Add(this.mnuMain); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MainMenuStrip = this.mnuMain; this.MinimumSize = new System.Drawing.Size(870, 576); this.Name = "frmMain"; @@ -433,10 +422,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem lZCompressionToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem compressToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem decompressToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; private System.Windows.Forms.ListBox lstStrings; private System.Windows.Forms.Label lblStrings; private System.Windows.Forms.Label lblEdit; @@ -459,7 +445,9 @@ private void InitializeComponent() private System.Windows.Forms.TextBox txtConcatenated; private System.Windows.Forms.ToolStripStatusLabel slbActions; private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem extractBG4ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem BG4ExplorerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem compressToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem decompressToolStripMenuItem; } } diff --git a/frmMain.cs b/frmMain.cs index d524c8b..8c7b31e 100644 --- a/frmMain.cs +++ b/frmMain.cs @@ -17,6 +17,7 @@ public partial class frmMain : Form public frmMain(string[] args) { InitializeComponent(); + this.Icon = Properties.Resources.msbteditor; if (args.Length > 0 && File.Exists(args[0])) OpenFile(args[0]); @@ -46,6 +47,8 @@ private void frmMain_FormClosing(object sender, FormClosingEventArgs e) e.Cancel = true; break; } + + Settings.Default.Save(); } private void frmMain_DragEnter(object sender, DragEventArgs e) @@ -138,6 +141,7 @@ private void OpenFile(string filename = "") UpdateForm(); Settings.Default.InitialDirectory = new FileInfo(filename).DirectoryName; Settings.Default.Save(); + Settings.Default.Reload(); } else { @@ -152,6 +156,7 @@ private void OpenFile(string filename = "") LoadFile(); Settings.Default.InitialDirectory = new FileInfo(ofdOpenFile.FileName).DirectoryName; Settings.Default.Save(); + Settings.Default.Reload(); } catch (Exception ex) { @@ -167,6 +172,7 @@ private void OpenFile(string filename = "") private void LoadFile() { lstStrings.Items.Clear(); + lstSubStrings.Items.Clear(); if (_msbt.HasLabels) { @@ -207,6 +213,7 @@ private DialogResult SaveFile(bool saveAs = false) _msbt.File = new FileInfo(sfdSaveEntity.FileName); Settings.Default.InitialDirectory = new DirectoryInfo(sfdSaveEntity.FileName).FullName; Settings.Default.Save(); + Settings.Default.Reload(); } if (dr == DialogResult.OK) @@ -244,6 +251,14 @@ private void lstStrings_SelectedIndexChanged(object sender, EventArgs e) private void lstSubStrings_SelectedIndexChanged(object sender, EventArgs e) { + Entry entry = (Entry)lstStrings.SelectedItem; + Value val = _msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex]; + + txtEdit.Enabled = val.Editable; + txtOriginal.Enabled = val.Editable; + txtConcatenated.Enabled = val.Editable; + hbxHexView.Enabled = val.Editable; + UpdateTextView(); UpdateOriginalText(); UpdateTextPreview(); @@ -308,7 +323,7 @@ private void txtEdit_KeyUp(object sender, KeyEventArgs e) string result = txtEdit.Text; Entry entry = (Entry)lstStrings.SelectedItem; - _msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex] = Encoding.Unicode.GetBytes(result.Replace("\r\n", "\n")); + _msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex].Data = Encoding.Unicode.GetBytes(result.Replace("\r\n", "\n")); if (txtEdit.Text != txtOriginal.Text) _hasChanges = true; @@ -322,7 +337,7 @@ private void UpdateTextView() { Entry entry = (Entry)lstStrings.SelectedItem; - txtEdit.Text = Encoding.Unicode.GetString(_msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex]).Replace("\n", "\r\n"); + txtEdit.Text = Encoding.Unicode.GetString(_msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex].Data).Replace("\n", "\r\n"); slbAddress.Text = "String: " + (entry.ID + 1) + "/" + (lstSubStrings.SelectedIndex + 1); } @@ -331,7 +346,7 @@ private void UpdateOriginalText() { Entry entry = (Entry)lstStrings.SelectedItem; - txtOriginal.Text = Encoding.Unicode.GetString(_msbt.TXT2.OriginalEntries[entry.ID].Values[lstSubStrings.SelectedIndex]).Replace("\n", "\r\n"); + txtOriginal.Text = Encoding.Unicode.GetString(_msbt.TXT2.OriginalEntries[entry.ID].Values[lstSubStrings.SelectedIndex].Data).Replace("\n", "\r\n"); } private void UpdateTextPreview() @@ -339,8 +354,8 @@ private void UpdateTextPreview() Entry entry = (Entry)lstStrings.SelectedItem; string result = string.Empty; - foreach (byte[] value in _msbt.TXT2.Entries[entry.ID].Values) - result += Encoding.Unicode.GetString(value).Replace("\n", "\r\n"); + foreach (Value value in _msbt.TXT2.Entries[entry.ID].Values) + result += Encoding.Unicode.GetString(value.Data).Replace("\n", "\r\n"); txtConcatenated.Text = result; } @@ -353,7 +368,7 @@ protected void byteProvider_Changed(object sender, EventArgs e) List bytes = new List(); for (int i = 0; i < (int)dfbp.Length; i++) bytes.Add(dfbp.ReadByte(i)); - _msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex] = bytes.ToArray(); + _msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex].Data = bytes.ToArray(); UpdateTextView(); UpdateTextPreview(); @@ -370,7 +385,7 @@ private void UpdateHexView() try { Entry entry = (Entry)lstStrings.SelectedItem; - MemoryStream strm = new MemoryStream(_msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex]); + MemoryStream strm = new MemoryStream(_msbt.TXT2.Entries[entry.ID].Values[lstSubStrings.SelectedIndex].Data); dfbp = new DynamicFileByteProvider(strm); dfbp.Changed += new EventHandler(byteProvider_Changed); @@ -403,19 +418,16 @@ private string FileName() } // Tools - private void extractBG4ToolStripMenuItem_Click(object sender, EventArgs e) + private void BG4ExplorerToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Select a BG4 Binary..."; ofd.Filter = "BG4 Archive (*.dat)|*.dat|All Files (*.*)|*.*"; ofd.InitialDirectory = Settings.Default.InitialDirectory; - //ofd.RestoreDirectory = true; if (ofd.ShowDialog() == DialogResult.OK) { - string filename = ofd.FileName; - - if (File.Exists(filename)) + if (File.Exists(ofd.FileName)) { FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.Description = "Select the destination directory to extarct the files into."; @@ -423,19 +435,14 @@ private void extractBG4ToolStripMenuItem_Click(object sender, EventArgs e) if (fbd.ShowDialog() == DialogResult.OK) { - string directory = fbd.SelectedPath; - - if (Directory.Exists(directory)) + if (Directory.Exists(fbd.SelectedPath)) { bool overwrite = true; - if (new DirectoryInfo(directory).GetFiles().Length > 0) + if (new DirectoryInfo(fbd.SelectedPath).GetFiles().Length > 0) overwrite = MessageBox.Show("Is it OK to overwrite files in the destination directory?", "Overwrite?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes ? true : false; - // Extract - BG4 bg4 = new BG4(); - - string result = bg4.Extract(filename, directory, overwrite); + string result = BG4.Extract(ofd.FileName, fbd.SelectedPath, overwrite); MessageBox.Show(result, "BG4 Extraction Result", MessageBoxButtons.OK, MessageBoxIcon.Information); } diff --git a/frmMain.resx b/frmMain.resx index 271e81a..d4330ab 100644 --- a/frmMain.resx +++ b/frmMain.resx @@ -132,261 +132,4 @@ 71 - - - - AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA - AABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAHx8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP/Pz9H/z8/R/8/P - 0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P - 0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P - 0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/z8/R/8/P0f/Pz9H/fHx8/3x8 - fP/T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT - 0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT - 0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT - 0//T09P/fHx8/3x8fP/U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU - 0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU - 0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU - 0//U1NP/1NTT/9TU0//U1NP/fHx8/3x8fP/U1NT/1NTU/9TU1P98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP/V1dX/1dXV/9XV1f98fHz///////// - ////////////////////////////////////////////////////////fHx8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////fHx8/3x8fP/W1tb/1tbW/9bW - 1v98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///RuSP//////fHx8//// - ///////////////////////i//////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////fHx8/3x8 - fP/W1tb/1tbW/9bW1v98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9v - P///////fHx8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////fHx8/3x8fP/Y2Nj/2NjY/9jY2P98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///28///9vP///////fHx8/////////////////wAAAP////////////////8AAAD///////// - //8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP//////////////////////AAAA//// - ////////////////////////fHx8/3x8fP/Z2dn/2dnZ/9nZ2f98fHz///////9vP///bz///28///9v - P///bz///28///9vP///bz///28///9vP///////fHx8/////////////////wAAAP//////AAAA//// - //8AAAD//////wAAAP////////////////8AAAD//////wAAAP////////////////8AAAD///////// - ////////AAAA////////////////////////////fHx8/3x8fP/Z2dn/2dnZ/9nZ2f98fHz///////9v - P///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8/////////////////wAA - AP//////AAAA//////8AAAD///////////////////////////8AAAD//////wAAAP////////////// - //8AAAD/////////////////AAAA////////////////////////////fHx8/3x8fP/Z2dn/2dnZ/9nZ - 2f98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//// - /////////////wAAAP8AAAD//////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP///////////wAA - AP8AAAD/AAAA/wAAAP//////////////////////AAAA////////////////////////////fHx8/3x8 - fP/a2tr/2tra/9ra2v98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9v - P///////fHx8/////////////////wAAAP8AAAD//////wAAAP8AAAD//////wAAAP////////////// - /////////////wAAAP////////////////8AAAD/////////////////AAAA//////////////////// - ////////fHx8/3x8fP/a2tr/2tra/9ra2v98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///28///9vP///////fHx8/////////////////wAAAP////////////////8AAAD//////wAA - AP////////////////8AAAD//////wAAAP////////////////8AAAD/////////////////AAAA//// - ////////////////////////fHx8/3x8fP/b29v/29vb/9vb2/98fHz///////9vP///bz///28///9v - P///bz///28///9vP///bz///28//+5uTP//////fHx8/////////////////wAAAP////////////// - //8AAAD///////////8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP///////////wAA - AP8AAAD/AAAA/wAAAP8AAAD/////////////////fHx8/3x8fP/d3d3/3d3d/93d3f98fHz///////lv - RP//bz///28///9vP///bz///28///9vP///bz///28//95tWf//////fHx8//////////////////// - ///////y//////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////1////////////////fHx8/3x8fP/d3d3/3d3d/93d - 3f98fHz/////////////////////////////////////////////////////////////////fHx8//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////fHx8/3x8 - fP/e3t7/3t7e/97e3v98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP/f39//39/f/9/f3/98fHz///////////////////////////////////////// - ////////////////////////fHx8/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f - 3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f - 3//f39//39/f/9/f3//f39//fHx8/3x8fP/f39//39/f/9/f3/98fHz///////9vP///bz///28///9v - P///bz///28///9vP///bz///28///9vP///////fHx8/9/f3//f39//39/f/9/f3//f39//39/f/9/f - 3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f - 3//f39//39/f/9/f3//f39//39/f/9/f3//f39//fHx8/3x8fP/f39//39/f/9/f3/98fHz///////9v - P///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8/9/f3//f39//fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/39/f/9/f3//f39//fHx8/3x8fP/e3t7/3t7e/97e - 3v98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8/97e - 3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e - 3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/fHx8/3x8 - fP/h4eH/4eHh/+Hh4f98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9v - P///////fHx8/+Hh4f/h4eH/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP/h4eH/4eHh/+Hh - 4f/h4eH/fHx8/3x8fP/l5eX/5eXl/+Xl5f98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///28///9vP///////fHx8/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl - 5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl - 5f/l5eX/5eXl/+Xl5f/l5eX/fHx8/3x8fP/o6Oj/6Ojo/+jo6P98fHz///////9vP///bz///28///9v - P///bz///28///9vP///bz///28///9vP///////fHx8/+jo6P/o6Oj/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/fHx8/3x8fP/p6en/6enp/+np6f98fHz///////9v - P///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/fHx8/3x8fP/p6en/6enp/+np - 6f98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8/+np - 6f/p6en/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/6enp/+np6f/p6en/6enp/+np6f/p6en/fHx8/3x8 - fP/q6ur/6urq/+rq6v98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9v - P///////fHx8/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq - 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq - 6v/q6ur/fHx8/3x8fP/r6+v/6+vr/+vr6/98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///28///5vQP//////fHx8/+vr6//r6+v/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/fHx8/3x8fP/r6+v/6+vr/+vr6/98fHz///////////////////////// - ////////////////////////////////////////fHx8/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/fHx8/3x8fP/s7Oz/7Ozs/+zs7P98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/+zs7P/s7Oz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/fHx8/3x8fP/t7e3/7e3t/+3t - 7f98fHz/////////////////////////////////////////////////////////////////fHx8/+3t - 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t - 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/fHx8/3x8 - fP/u7u7/7u7u/+7u7v98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9v - P///////fHx8/+7u7v/u7u7/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u - 7v/u7u7/fHx8/3x8fP/u7u7/7u7u/+7u7v98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///28///9vP///////fHx8/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u - 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u - 7v/u7u7/7u7u/+7u7v/u7u7/fHx8/3x8fP/v7+//7+/v/+/v7/98fHz///////9vP///bz///28///9v - P///bz///28///9vP///bz///28///9vP///////fHx8/+/v7//v7+//fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP/v7+//7+/v/+/v - 7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//fHx8/3x8fP/w8PD/8PDw//Dw8P98fHz///////9v - P///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//Dw8P/w8PD/8PDw//Dw - 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw - 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/fHx8/3x8fP/x8fH/8fHx//Hx - 8f98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//Hx - 8f/x8fH/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/fHx8/3x8 - fP/x8fH/8fHx//Hx8f98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9v - P///////fHx8//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx - 8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx - 8f/x8fH/fHx8/3x8fP/y8vL/8vLy//Ly8v98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///28///9vP///////fHx8//Ly8v/y8vL/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/fHx8/3x8fP/z8/P/8/Pz//Pz8/98fHz///////9vP///bz///28///9v - P///bz///28///9vP///bz///28///9vP///////fHx8//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/fHx8/3x8fP/z8/P/8/Pz//Pz8/98fHz///////9v - P///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//Pz8//z8/P/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP/z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/fHx8/3x8fP/09PT/9PT0//T0 - 9P98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/fHx8/3x8 - fP/19fX/9fX1//X19f98fHz///////////////////////////////////////////////////////// - ////////fHx8//X19f/19fX/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X1 - 9f/19fX/fHx8/3x8fP/29vb/9vb2//b29v98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/fHx8/3x8fP/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/fHx8/3x8fP/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/fHx8/3x8fP/z9vT/8/b0//P2 - 9P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P2 - 9P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P2 - 9P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/8/b0//P29P/z9vT/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAA - AAAAAAAAAAAAAAAAAAB8fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz///////////////////////// - /////////////////////////////3x8fP////////////////////////////////////////////// - ////////////////////////////////////////////////////////fHx8/3x8fP///////28///9v - P///bz///28///9vP///bz///28///9vP///////fHx8//////8AAAD///////////8AAAD//////wAA - AP8AAAD/AAAA////////////AAAA/wAAAP////////////////8AAAD///////////98fHz/fHx8//// - ////bz///28///9vP///bz///28///9vP///bz///28///////98fHz//////wAAAP///////////wAA - AP//////////////////////AAAA//////8AAAD//////wAAAP///////////wAAAP///////////3x8 - fP98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///////3x8fP//////AAAA//// - ////////AAAA////////////AAAA/wAAAP///////////wAAAP8AAAD/////////////////AAAA//// - ////////fHx8/3x8fP///////28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//// - //8AAAD/AAAA/wAAAP8AAAD//////wAAAP//////////////////////AAAA//////8AAAD///////// - //8AAAD///////////98fHz/fHx8////////bz///28///9vP///bz///28///9vP///bz///28///// - //98fHz//////wAAAP///////////wAAAP///////////wAAAP8AAAD/AAAA//////8AAAD/AAAA//// - ////////AAAA/wAAAP8AAAD//////3x8fP98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///////3x8fP////////////////////////////////////////////////////////////// - ////////////////////////////////////////fHx8/3x8fP///////28///9vP///bz///28///9v - P///bz///28///9vP///////fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8//////////////////// - //////////////////////////////////98fHz///////////////////////////////////////// - /////////////////////////////////////////////////////////////3x8fP98fHz///////9v - P///bz///28///9vP///bz///28///9vP///bz///////3x8fP//////bm5u/25ubv9ubm7/bm5u/25u - bv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv//////fHx8/3x8 - fP///////28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //98fHz/fHx8////////bz///28///9vP///bz///28///9vP///bz///28///////98fHz//////25u - bv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25u - bv///////////3x8fP98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///////3x8 - fP////////////////////////////////////////////////////////////////////////////// - ////////////////////////fHx8/3x8fP///////28///9vP///bz///28///9vP///bz///28///9v - P///////fHx8//////9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25u - bv9ubm7/bm5u/25ubv////////////////98fHz/fHx8////////bz///28///9vP///bz///28///9v - P///bz///28///////98fHz///////////////////////////////////////////////////////// - /////////////////////////////////////////////3x8fP98fHz///////9vP///bz///28///9v - P///bz///28///9vP///bz///////3x8fP//////bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25u - bv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv//////////////////////fHx8/3x8fP////////////// - ////////////////////////////////////////fHx8//////////////////////////////////// - //////////////////////////////////////////////////////////////////98fHz/fHx8//// - ////bz///28///9vP///bz///28///9vP///bz///28///////98fHz//////25ubv9ubm7/bm5u/25u - bv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv///////////////////////////3x8 - fP98fHz///////9vP///bz///28///9vP///bz///28///9vP///bz///////3x8fP//////9fX1//X1 - 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX///////////////////////// - ////////fHx8/3x8fP///////28///9vP///bz///28///9vP///bz///28///9vP///////fHx8//// - //9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv////////////// - //////////////////98fHz/fHx8////////bz///28///9vP///bz///28///9vP///bz///28///// - //98fHz///////////////////////////////////////////////////////////////////////// - /////////////////////////////3x8fP98fHz///////9vP///bz///28///9vP///bz///28///9v - P///bz///////3x8fP//////bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25u - bv//////////////////////////////////////fHx8/3x8fP///////28///9vP///bz///28///9v - P///bz///28///9vP///////fHx8///////19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X1 - 9f/19fX/9fX1//////////////////////////////////////98fHz/fHx8////////bz///28///9v - P///bz///28///9vP///bz///28///////98fHz//////25ubv9ubm7/bm5u/25ubv9ubm7/bm5u/25u - bv9ubm7/bm5u/25ubv///////////////////////////////////////////3x8fP98fHz///////// - /////////////////////////////////////////////3x8fP////////////////////////////// - ////////////////////////////////////////////////////////////////////////fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8//////9ubm7/bm5u/25u - bv9ubm7/bm5u/25ubv9ubm7/bm5u/25ubv////////////////////////////////////////////// - //98fHz/fHx8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3x8fP98fHz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8 - fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAEAAAACAAAAABACAAAAAAAEAE - AAAAAAAAAAAAAAAAAAAAAAAAfHx89Hx8fPR8fHz0fHx89Hx8fPR8fHz0fHx89Hx8fPR8fHz0fHx89Hx8 - fPR8fHz0fHx89Hx8fPR8fHz0fHx86dTU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU0//U1NP/1NTT/9TU - 0//U1NP/1NTT/9TU0//U1NP/1NTT/3x8fPTW1tb///////////////////////////////////////// - //////////////////////////////////98fHz02dnZ////////bz///28/////////////Dg4O//// - ////////AAAA////////////AAAA////////////fHx89Nra2v///////28///9vP////////////wAA - AP///////////wAAAP///////////wAAAP///////////3x8fPTc3Nz///////////////////////// - //////////////////////////////////////////////////98fHz039/f//////////////////// - ///f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//fHx89N7e3v//////+m9D//pv - Q///////3t7e/4CAgP+AgID/gICA/4CAgP+AgID/gICA/4CAgP+AgID/3t7e/3x8fPTn5+f///////pv - Q//6b0P//////+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/98fHz06urq//// - ///////////////////q6ur/gICA/4CAgP+AgID/gICA/4CAgP+AgID/gICA/+rq6v/q6ur/fHx89Ovr - 6///////////////////////6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/3x8 - fPTu7u7///////pvQ//6b0P//////+7u7v+AgID/gICA/4CAgP+AgID/gICA/4CAgP/u7u7/7u7u/+7u - 7v98fHz08fHx///////6b0P/+m9D///////x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx - 8f/x8fH/fHx89PLy8v//////////////////////8vLy/4CAgP+AgID/gICA/4CAgP+AgID/8vLy//Ly - 8v/y8vL/8vLy/3x8fPT09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P98fHz09vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/fHx89wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - - \ No newline at end of file