diff --git a/ABStudio.sln b/ABStudio.sln new file mode 100644 index 0000000..cbda417 --- /dev/null +++ b/ABStudio.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ABStudio", "ABStudio\ABStudio.csproj", "{30ADF767-664C-47C5-89C6-60CDC84051B9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {30ADF767-664C-47C5-89C6-60CDC84051B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30ADF767-664C-47C5-89C6-60CDC84051B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30ADF767-664C-47C5-89C6-60CDC84051B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30ADF767-664C-47C5-89C6-60CDC84051B9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EEFF4524-997D-4861-96A6-75253F9EE431} + EndGlobalSection +EndGlobal diff --git a/ABStudio/ABStudio.csproj b/ABStudio/ABStudio.csproj new file mode 100644 index 0000000..a67552b --- /dev/null +++ b/ABStudio/ABStudio.csproj @@ -0,0 +1,182 @@ + + + + + Debug + AnyCPU + {30ADF767-664C-47C5-89C6-60CDC84051B9} + WinExe + ABStudio + ABStudio + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + + + icon.ico + + + + ..\packages\Aspose.Zip.23.5.0\lib\net40\Aspose.Zip.dll + + + ..\packages\CppSharp.Runtime.1.0.45.22293\lib\netstandard2.0\CppSharp.Runtime.dll + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Text.Encoding.CodePages.4.5.0\lib\net461\System.Text.Encoding.CodePages.dll + + + + + + + + + + + + + + Component + + + Component + + + + + + + + + + + Form + + + ComboAskForm.cs + + + Form + + + Main.cs + + + Form + + + MCQAskForm.cs + + + Form + + + NumUpDownAskForm.cs + + + Form + + + SpritesheetEditor.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + ComboAskForm.cs + + + Main.cs + + + MCQAskForm.cs + + + SpritesheetEditor.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + PreserveNewest + + + + \ No newline at end of file diff --git a/ABStudio/App.config b/ABStudio/App.config new file mode 100644 index 0000000..5754728 --- /dev/null +++ b/ABStudio/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ABStudio/Controls/CustomPanel.cs b/ABStudio/Controls/CustomPanel.cs new file mode 100644 index 0000000..07e4962 --- /dev/null +++ b/ABStudio/Controls/CustomPanel.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using ABStudio.Misc; + +namespace ABStudio.Controls +{ + public class CustomPanel : Panel + { + public event MouseEventHandler CTRLMouseWheel; + + + protected override void OnMouseWheel(MouseEventArgs e) + { + if (((Common.GetAsyncKeyState(0xA2) & 0x8000) > 0) || ((Common.GetAsyncKeyState(0xA3) & 0x8000) > 0)) // LCONTROL or RCONTROL held + { + CTRLMouseWheel.Invoke(this, e); + ((HandledMouseEventArgs)e).Handled = true; + } + else + { + base.OnMouseWheel(e); + } + } + } +} diff --git a/ABStudio/Controls/PictureBoxDB.cs b/ABStudio/Controls/PictureBoxDB.cs new file mode 100644 index 0000000..4ad9c90 --- /dev/null +++ b/ABStudio/Controls/PictureBoxDB.cs @@ -0,0 +1,537 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.Layout; + +namespace ABStudio.Controls +{ + public class PictureBoxDB : PictureBox + { + public InterpolationMode InterpolationMode { get; set; } + public bool AllowSRectCreation { get; set; } = true; + public event EventHandler RectResize; + public event EventHandler SelectedSRectChanged; + public event EventHandler SRectCreated; + public object SelectedSRect { + get => selectedSRect; + set + { + selectedSRect = value as SizableRect; + RaiseSelectedSRectChanged(); + this.Invalidate(); + } + } + + private List srects = new List(); + private SizableRect selectedSRect = null; + + public PictureBoxDB() : base() + { + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.DoubleBuffered = true; + this.UpdateStyles(); + + InterpolationMode = InterpolationMode.Default; + } + + private void RaiseRectResize(SizableRect srect) + { + if (RectResize != null) + { + SizableRectEventArgs srea = new SizableRectEventArgs(srect, srect.rect, srect.LinkedObject); + RectResize.Invoke(this, srea); + } + } + + private void RaiseSelectedSRectChanged() + { + if (SelectedSRectChanged != null) + SelectedSRectChanged.Invoke(this, EventArgs.Empty); + } + + private void RaiseSRectCreated(SizableRect srect) + { + if (SRectCreated != null) + { + SizableRectEventArgs srea = new SizableRectEventArgs(srect, srect.rect, srect.LinkedObject); + SRectCreated.Invoke(this, srea); + } + } + + public object AddSRect(Rectangle rect, object linkedObject=null) + { + SizableRect srect = new SizableRect(rect, this); + srect.LinkedObject = linkedObject; + + srects.Add(srect); + + this.Invalidate(); + + return srect; + } + + public void EditSRect(object srect, Rectangle rect) + { + (srect as SizableRect).rect = rect; + + this.Invalidate(); + } + + public void RemoveSRect(object srect) + { + SizableRect sizableRect = srect as SizableRect; + srects.Remove(sizableRect); + + if (SelectedSRect == sizableRect) + SelectedSRect = null; + + this.Invalidate(); + } + + public void ClearSRects() + { + srects.Clear(); + SelectedSRect = null; + + this.Invalidate(); + } + + public object GetSRectLinkedObject(object srect) + { + return (srect as SizableRect).LinkedObject; + } + + public void SetSRectLinkedObject(object srect, object linkedObject) + { + (srect as SizableRect).LinkedObject = linkedObject; + } + + public Point ConvertControlPointToPicturePoint(Point pt) + { + if (this.Image == null) + return pt; + + int w = (int)Math.Round((pt.X * this.Image.Width) / (double)this.Width); + int h = (int)Math.Round((pt.Y * this.Image.Height) / (double)this.Height); + + return new Point(w, h); + } + + public Point ConvertPicturePointToControlPoint(Point pt) + { + if (this.Image == null) + return pt; + + int w = (int)Math.Round((pt.X * this.Width) / (double)this.Image.Width); + int h = (int)Math.Round((pt.Y * this.Height) / (double)this.Image.Height); + + return new Point(w, h); + } + + public Rectangle ConvertControlRectToPictureRect(Rectangle rect) + { + Point orig = ConvertControlPointToPicturePoint(rect.Location); + Point s = ConvertControlPointToPicturePoint(new Point(rect.X + rect.Width, rect.Y + rect.Height)); + + return new Rectangle(orig, new Size(s.X - orig.X, s.Y - orig.Y)); + } + + public Rectangle ConvertPictureRectToControlRect(Rectangle rect) + { + Point orig = ConvertPicturePointToControlPoint(rect.Location); + Point s = ConvertPicturePointToControlPoint(new Point(rect.X + rect.Width, rect.Y + rect.Height)); + + return new Rectangle(orig, new Size(s.X - orig.X, s.Y - orig.Y)); + } + + private MouseEventArgs ConvertMEA(MouseEventArgs e) + { + Point pt = ConvertControlPointToPicturePoint(e.Location); + return new MouseEventArgs(e.Button, e.Clicks, pt.X, pt.Y, e.Delta); + } + + protected override void OnPaint(PaintEventArgs e) + { + if (this.Image != null) + { + + e.Graphics.InterpolationMode = InterpolationMode; + //base.OnPaint(e); + + double zoomX = (double)this.Width / (double)this.Image.Width; + double zoomY = (double)this.Height / (double)this.Image.Height; + e.Graphics.DrawImage(this.Image, (int)Math.Round(zoomX / 2), (int)Math.Round(zoomY / 2), this.Width, this.Height); + + + foreach (SizableRect srect in srects) + { + try + { + srect.Draw(e.Graphics, selectedSRect == srect); + } + catch (Exception exp) + { + Console.WriteLine(exp.Message); + } + } + } + + Contract.Requires(e != null); + PaintEventHandler handler = (PaintEventHandler)Events[typeof(Control).GetField("EventPaint", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null)]; + if (handler != null) handler(this, e); + } + + bool isDown = false; + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + e = ConvertMEA(e); + + SizableRect formerSelectedSRect = selectedSRect; + + if (e.Button == MouseButtons.Left) + { + if (selectedSRect == null || !selectedSRect.IsPointInRect(e.Location)) + { + selectedSRect = null; + foreach (SizableRect srect in srects) + { + if (srect.IsPointInRect(e.Location)) + { + selectedSRect = srect; + break; + } + } + } + + if (selectedSRect != null) + selectedSRect.MouseDown(e); + } + else if(e.Button == MouseButtons.Right) + { + if(AllowSRectCreation && !isDown) + { + selectedSRect = AddSRect(new Rectangle(e.Location, new Size(5, 5))) as SizableRect; + RaiseSRectCreated(selectedSRect); + isDown = true; + } + } + + if (formerSelectedSRect != selectedSRect) + RaiseSelectedSRectChanged(); + + this.Invalidate(); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + + e = ConvertMEA(e); + + isDown = false; + + if (selectedSRect != null) + selectedSRect.MouseUp(e); + } + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + + e = ConvertMEA(e); + + if (selectedSRect != null && selectedSRect.MouseMove(e)) + RaiseRectResize(selectedSRect); + } + + public class SizableRectEventArgs : EventArgs + { + private object srect; + private Rectangle rect; + private object linkedObject = null; + + public object SRect { get => srect; } + public Rectangle Rect { get => rect; } + public object LinkedObject { get => linkedObject; } + + public SizableRectEventArgs(object srect, Rectangle rect, object linkedObject) + { + this.srect = srect; + this.rect = rect; + this.linkedObject = linkedObject; + } + } + + private class SizableRect + { + private PictureBoxDB mPictureBox; + public Rectangle rect; + public bool AllowDeformingDuringMovement = false; + public object LinkedObject = null; + private bool mIsClick = false; + private bool mMove = false; + private int oldX; + private int oldY; + private int sizeNodeRect = 5; + private PosSizableRect nodeSelected = PosSizableRect.None; + + private enum PosSizableRect + { + UpMiddle, + LeftMiddle, + LeftBottom, + LeftUp, + RightUp, + RightMiddle, + RightBottom, + BottomMiddle, + None + + }; + + public SizableRect(Rectangle r, PictureBoxDB owner) + { + rect = r; + mIsClick = false; + this.mPictureBox = owner; + } + + public void Draw(Graphics g, bool isSelected) + { + Color col = isSelected ? Color.Red : Color.DarkGreen; + Pen pen = new Pen(col); + + g.DrawRectangle(pen, mPictureBox.ConvertPictureRectToControlRect(rect)); + + foreach (PosSizableRect pos in Enum.GetValues(typeof(PosSizableRect))) + { + g.DrawRectangle(pen, GetRect(pos, true)); + } + } + + public void MouseDown(MouseEventArgs e) + { + mIsClick = true; + + nodeSelected = PosSizableRect.None; + nodeSelected = GetNodeSelectable(e.Location); + + if (rect.Contains(new Point(e.X, e.Y))) + { + mMove = true; + } + oldX = e.X; + oldY = e.Y; + } + + public void MouseUp(MouseEventArgs e) + { + mIsClick = false; + mMove = false; + } + + public bool MouseMove(MouseEventArgs e) + { + ChangeCursor(e.Location); + if (mIsClick == false) + { + return false; + } + + Rectangle backupRect = rect; + + switch (nodeSelected) + { + case PosSizableRect.LeftUp: + rect.X += e.X - oldX; + rect.Width -= e.X - oldX; + rect.Y += e.Y - oldY; + rect.Height -= e.Y - oldY; + break; + case PosSizableRect.LeftMiddle: + rect.X += e.X - oldX; + rect.Width -= e.X - oldX; + break; + case PosSizableRect.LeftBottom: + rect.Width -= e.X - oldX; + rect.X += e.X - oldX; + rect.Height += e.Y - oldY; + break; + case PosSizableRect.BottomMiddle: + rect.Height += e.Y - oldY; + break; + case PosSizableRect.RightUp: + rect.Width += e.X - oldX; + rect.Y += e.Y - oldY; + rect.Height -= e.Y - oldY; + break; + case PosSizableRect.RightBottom: + rect.Width += e.X - oldX; + rect.Height += e.Y - oldY; + break; + case PosSizableRect.RightMiddle: + rect.Width += e.X - oldX; + break; + + case PosSizableRect.UpMiddle: + rect.Y += e.Y - oldY; + rect.Height -= e.Y - oldY; + break; + + default: + if (mMove) + { + rect.X = rect.X + e.X - oldX; + rect.Y = rect.Y + e.Y - oldY; + } + break; + } + oldX = e.X; + oldY = e.Y; + + if (rect.Width < 5 || rect.Height < 5) + { + rect = backupRect; + } + + TestIfRectInsideArea(); + + mPictureBox.Invalidate(); + + return !rect.Equals(backupRect); + } + + private void TestIfRectInsideArea() + { + // Test if rectangle still inside the area. + if (rect.X < 0) rect.X = 0; + if (rect.Y < 0) rect.Y = 0; + if (rect.Width <= 0) rect.Width = 1; + if (rect.Height <= 0) rect.Height = 1; + + if (rect.X + rect.Width > mPictureBox.Image.Width) + { + rect.X = mPictureBox.Image.Width - rect.Width - 1; + } + if (rect.Y + rect.Height > mPictureBox.Image.Height) + { + rect.Y = mPictureBox.Image.Height - rect.Height - 1; + } + } + + public bool IsPointInRect(Point pt) + { + return rect.Contains(pt) ||(GetNodeSelectable(pt) != PosSizableRect.None); + } + + private Rectangle CreateRectSizableNode(int x, int y, bool convert = false) + { + if(convert) + { + Point pt = mPictureBox.ConvertPicturePointToControlPoint(new Point(x, y)); + x = pt.X; + y = pt.Y; + } + + return new Rectangle(x - sizeNodeRect / 2, y - sizeNodeRect / 2, sizeNodeRect, sizeNodeRect); + } + + private Rectangle GetRect(PosSizableRect p, bool convert = false) + { + switch (p) + { + case PosSizableRect.LeftUp: + return CreateRectSizableNode(rect.X, rect.Y, convert); + + case PosSizableRect.LeftMiddle: + return CreateRectSizableNode(rect.X, rect.Y + rect.Height / 2, convert); + + case PosSizableRect.LeftBottom: + return CreateRectSizableNode(rect.X, rect.Y + rect.Height, convert); + + case PosSizableRect.BottomMiddle: + return CreateRectSizableNode(rect.X + rect.Width / 2, rect.Y + rect.Height, convert); + + case PosSizableRect.RightUp: + return CreateRectSizableNode(rect.X + rect.Width, rect.Y, convert); + + case PosSizableRect.RightBottom: + return CreateRectSizableNode(rect.X + rect.Width, rect.Y + rect.Height, convert); + + case PosSizableRect.RightMiddle: + return CreateRectSizableNode(rect.X + rect.Width, rect.Y + rect.Height / 2, convert); + + case PosSizableRect.UpMiddle: + return CreateRectSizableNode(rect.X + rect.Width / 2, rect.Y, convert); + default: + return new Rectangle(); + } + } + + private PosSizableRect GetNodeSelectable(Point p) + { + foreach (PosSizableRect r in Enum.GetValues(typeof(PosSizableRect))) + { + if (GetRect(r).Contains(p)) + { + return r; + } + } + return PosSizableRect.None; + } + + private void ChangeCursor(Point p) + { + mPictureBox.Cursor = GetCursor(GetNodeSelectable(p)); + } + + /// + /// Get cursor for the handle + /// + /// + /// + private Cursor GetCursor(PosSizableRect p) + { + switch (p) + { + case PosSizableRect.LeftUp: + return Cursors.SizeNWSE; + + case PosSizableRect.LeftMiddle: + return Cursors.SizeWE; + + case PosSizableRect.LeftBottom: + return Cursors.SizeNESW; + + case PosSizableRect.BottomMiddle: + return Cursors.SizeNS; + + case PosSizableRect.RightUp: + return Cursors.SizeNESW; + + case PosSizableRect.RightBottom: + return Cursors.SizeNWSE; + + case PosSizableRect.RightMiddle: + return Cursors.SizeWE; + + case PosSizableRect.UpMiddle: + return Cursors.SizeNS; + default: + return Cursors.Default; + } + } + } + } +} diff --git a/ABStudio/Controls/SizableRect.cs b/ABStudio/Controls/SizableRect.cs new file mode 100644 index 0000000..4428223 --- /dev/null +++ b/ABStudio/Controls/SizableRect.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace ABStudio.Controls +{ +} diff --git a/ABStudio/DataReader.cs b/ABStudio/DataReader.cs new file mode 100644 index 0000000..80c8d03 --- /dev/null +++ b/ABStudio/DataReader.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ABStudio +{ + public static class ByteArrayExtensions + { + public static string GetString(this byte[] bytes, int idx) { int i = idx; return bytes.GetString(ref i); } + public static string GetString(this byte[] bytes, ref int idx) + { + ushort charCount = bytes.GetUInt16(ref idx); + + string output = ""; + for (int i = 0; i < charCount; i++) + { + output += (char)bytes[idx + i]; + } + + idx += charCount; + + return output; + } + + public static float GetFloat(this byte[] bytes, int idx) { int i = idx; return bytes.GetFloat(ref i); } + public static float GetFloat(this byte[] bytes, ref int idx) + { + float val = System.BitConverter.ToSingle(bytes.Skip(idx).Take(4).Reverse().ToArray(), 0); + idx += 4; + return val; + } + + public static long GetInt64(this byte[] bytes, int idx) { int i = idx; return bytes.GetInt64(ref i); } + public static long GetInt64(this byte[] bytes, ref int idx) + { + return (long)bytes.GetUInt64(ref idx); + } + + public static ulong GetUInt64(this byte[] bytes, int idx) { int i = idx; return bytes.GetUInt64(ref i); } + public static ulong GetUInt64(this byte[] bytes, ref int idx) + { + ulong val = ((ulong)bytes[idx + 7]) | ((ulong)bytes[idx + 6] << 8) | ((ulong)bytes[idx + 5] << 16) | ((ulong)bytes[idx + 4] << 24) | ((ulong)bytes[idx + 3] << 32) | ((ulong)bytes[idx + 2] << 40) | ((ulong)bytes[idx + 1] << 48) | ((ulong)bytes[idx] << 56); + idx += 8; + return val; + } + + public static int GetInt32(this byte[] bytes, int idx) { int i = idx; return bytes.GetInt32(ref i); } + public static int GetInt32(this byte[] bytes, ref int idx) + { + return (int)bytes.GetUInt32(ref idx); + } + + public static uint GetUInt32(this byte[] bytes, int idx) { int i = idx; return bytes.GetUInt32(ref i); } + public static uint GetUInt32(this byte[] bytes, ref int idx) + { + uint val = ((uint)bytes[idx + 3]) | ((uint)bytes[idx + 2] << 8) | ((uint)bytes[idx + 1] << 16) | ((uint)bytes[idx] << 24); + idx += 4; + return val; + } + + public static short GetInt16(this byte[] bytes, int idx) { int i = idx; return bytes.GetInt16(ref i); } + public static short GetInt16(this byte[] bytes, ref int idx) + { + return (short)bytes.GetUInt16(ref idx); + } + + public static ushort GetUInt16(this byte[] bytes, int idx) { int i = idx; return bytes.GetUInt16(ref i); } + public static ushort GetUInt16(this byte[] bytes, ref int idx) + { + ushort val = (ushort)(((uint)bytes[idx + 1]) | ((uint)bytes[idx] << 8)); + idx += 2; + return val; + } + } + + public static class ByteListExtensions + { + public static void AddString(this List bytes, string item) + { + bytes.AddUInt16((ushort)item.Length); + + foreach (char c in item) + { + bytes.Add((byte)(c & 0xFF)); + } + } + + public static void AddFloat(this List bytes, float item) + { + foreach (byte b in BitConverter.GetBytes(item)) + { + bytes.Add(b); + } + } + + public static void InsertFloat(this List bytes, int index, float item) + { + int i = index; + foreach (byte b in BitConverter.GetBytes(item)) + { + bytes[i] = b; + i++; + } + } + + public static void AddInt64(this List bytes, long item) + { + bytes.AddUInt64((uint)item); + } + + public static void InsertInt64(this List bytes, int index, long item) + { + bytes.InsertUInt64(index, (uint)item); + } + + public static void AddUInt64(this List bytes, ulong item) + { + bytes.Add((byte)((item >> 16) & 0xFF)); + bytes.Add((byte)((item >> 56) & 0xFF)); + bytes.Add((byte)((item >> 48) & 0xFF)); + bytes.Add((byte)((item >> 40) & 0xFF)); + bytes.Add((byte)((item >> 32) & 0xFF)); + bytes.Add((byte)((item >> 24) & 0xFF)); + bytes.Add((byte)((item >> 8) & 0xFF)); + bytes.Add((byte)(item & 0xFF)); + } + + public static void InsertUInt64(this List bytes, int index, ulong item) + { + bytes[index] = (byte)((item >> 56) & 0xFF); + bytes[index + 1] = (byte)((item >> 48) & 0xFF); + bytes[index + 2] = (byte)((item >> 40) & 0xFF); + bytes[index + 3] = (byte)((item >> 32) & 0xFF); + bytes[index + 4] = (byte)((item >> 24) & 0xFF); + bytes[index + 5] = (byte)((item >> 16) & 0xFF); + bytes[index + 6] = (byte)((item >> 8) & 0xFF); + bytes[index + 7] = (byte)(item & 0xFF); + } + + public static void AddInt32(this List bytes, int item) + { + bytes.AddUInt32((uint)item); + } + + public static void InsertInt32(this List bytes, int index, int item) + { + bytes.InsertUInt32(index, (uint)item); + } + + public static void AddUInt32(this List bytes, uint item) + { + bytes.Add((byte)((item >> 24) & 0xFF)); + bytes.Add((byte)((item >> 16) & 0xFF)); + bytes.Add((byte)((item >> 8) & 0xFF)); + bytes.Add((byte)(item & 0xFF)); + } + + public static void InsertUInt32(this List bytes, int index, uint item) + { + bytes[index] = (byte)((item >> 24) & 0xFF); + bytes[index + 1] = (byte)((item >> 16) & 0xFF); + bytes[index + 2] = (byte)((item >> 8) & 0xFF); + bytes[index + 3] = (byte)(item & 0xFF); + } + + public static void AddInt16(this List bytes, short item) + { + bytes.AddUInt16((ushort)item); + } + + public static void InsertInt16(this List bytes, int index, short item) + { + bytes.InsertUInt16(index, (ushort)item); + } + + public static void AddUInt16(this List bytes, uint item) + { + bytes.Add((byte)((item >> 8) & 0xFF)); + bytes.Add((byte)(item & 0xFF)); + } + + public static void InsertUInt16(this List bytes, int index, ushort item) + { + bytes[index] = (byte)((item >> 8) & 0xFF); + bytes[index + 1] = (byte)(item & 0xFF); + } + } +} diff --git a/ABStudio/FileFormats/DAT/DATFile.cs b/ABStudio/FileFormats/DAT/DATFile.cs new file mode 100644 index 0000000..1e1e942 --- /dev/null +++ b/ABStudio/FileFormats/DAT/DATFile.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace ABStudio.FileFormats.DAT +{ + public partial class DATFile + { + private MainSection file; + private Type type => file.section.GetType(); + public string Type => type.Name.Substring(0, type.Name.Length - "Section".Length); + public byte[] AsBytes => file.AsBytes(); + public byte[] AsJSONBytes => file.AsJSONBytes(); + + + private DATFile() { } + public DATFile(string filename) : this(File.ReadAllBytes(filename)) { } + public DATFile(byte[] data) + { + file = new MainSection(data); + } + + public SpriteData GetAsSpriteData() + { + if (type == typeof(SpriteSection)) + return (file.section as SpriteSection).file; + else + throw new Exception("Current file isn't of type " + type.ToString() + "."); + } + + public static DATFile NewSpriteData() + { + DATFile dat = new DATFile(); + + dat.file = new MainSection(); + dat.file.section = new SpriteSection(); + + return dat; + } + } +} diff --git a/ABStudio/FileFormats/DAT/Sections/MainSection.cs b/ABStudio/FileFormats/DAT/Sections/MainSection.cs new file mode 100644 index 0000000..a2a38d7 --- /dev/null +++ b/ABStudio/FileFormats/DAT/Sections/MainSection.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace ABStudio.FileFormats.DAT +{ + public partial class DATFile + { + private sealed class MainSection : Section + { + public override string Magic => "KA3D"; + public Section section = null; + + public MainSection() : base() { } + public MainSection(byte[] data) : base(data) { } + + public override byte[] AsJSONBytes() + { + return section.AsJSONBytes(); + } + + protected override byte[] AsCoreBytes() + { + return section.AsBytes(); + } + + protected override void FromCoreBytes(byte[] data) + { + Type[] types = Assembly.GetAssembly(typeof(Section)).GetTypes().Where(t => t.IsSubclassOf(typeof(Section))).ToArray(); + + string wantedMagic = "" + (char)data[0] + (char)data[1] + (char)data[2] + (char)data[3]; + + bool supported = false; + foreach (Type type in types) + { + Section o = Activator.CreateInstance(type) as Section; + string typeMagic = o.Magic; + + if (wantedMagic == typeMagic) + { + section = Activator.CreateInstance(type) as Section; + section.FromBytes(data); + + supported = true; + break; + } + } + + if (!supported) + { + throw new Exception("Unsupported DAT section type \"" + wantedMagic + "\"."); + } + } + } + } +} diff --git a/ABStudio/FileFormats/DAT/Sections/Section.cs b/ABStudio/FileFormats/DAT/Sections/Section.cs new file mode 100644 index 0000000..0d06d03 --- /dev/null +++ b/ABStudio/FileFormats/DAT/Sections/Section.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace ABStudio.FileFormats.DAT +{ + public partial class DATFile + { + private abstract class Section + { + public abstract string Magic { get; } + + public Section() { } + public Section(byte[] data) + { + FromBytes(data); + } + + public abstract byte[] AsJSONBytes(); + + public byte[] AsBytes() + { + List rawdata = new List(); + foreach (char c in Magic) + rawdata.Add((byte)(c & 0xFF)); + + byte[] actualData = this.AsCoreBytes(); + rawdata.AddUInt32((uint)actualData.Length); + + return rawdata.Concat(actualData).ToArray(); + } + + public void FromBytes(byte[] data) + { + for (int c = 0; c < Magic.Length; c++) + { + if (data[c] != Magic[c]) + throw new Exception("A " + this.GetType().Name + " section was initiated with an unmatching byte array."); + } + + byte[] rawdata = data.Skip(8).Take((int)data.GetUInt32(4)).ToArray(); + + this.FromCoreBytes(rawdata); + } + + protected abstract byte[] AsCoreBytes(); + protected abstract void FromCoreBytes(byte[] data); + } + } +} diff --git a/ABStudio/FileFormats/DAT/Sections/SpriteSection.cs b/ABStudio/FileFormats/DAT/Sections/SpriteSection.cs new file mode 100644 index 0000000..a21ee8f --- /dev/null +++ b/ABStudio/FileFormats/DAT/Sections/SpriteSection.cs @@ -0,0 +1,108 @@ +using ABStudio.FileFormats.ZSTREAM; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace ABStudio.FileFormats.DAT +{ + public partial class DATFile + { + public class SpriteData + { + public List filenames = new List(); + public List sprites = new List(); + + public ZSTREAMFile associatedZSTREAM = null; + + public class Sprite + { + public string name = ""; + public Rectangle rect = new Rectangle(); + public Point orig = new Point(); + } + public byte[] AsJSONBytes() + { + if (associatedZSTREAM != null) + return associatedZSTREAM.Save(); + + throw new Exception("Can't save as JSON without ZSTREAM information."); + } + } + + private sealed class SpriteSection : Section + { + public override string Magic => "SPRT"; + public SpriteData file = new SpriteData(); + + public SpriteSection() : base() { } + public SpriteSection(byte[] data) : base(data) { } + + public override byte[] AsJSONBytes() + { + return file.AsJSONBytes(); + } + + protected override byte[] AsCoreBytes() + { + List rawdata = new List(); + + + rawdata.AddUInt16((ushort)file.filenames.Count); + foreach (string filename in file.filenames) + rawdata.AddString(filename); + + rawdata.AddUInt16((ushort)file.sprites.Count); + foreach (SpriteData.Sprite sprite in file.sprites) + { + rawdata.AddString(sprite.name); + rawdata.AddUInt16((ushort)sprite.rect.X); + rawdata.AddUInt16((ushort)sprite.rect.Y); + rawdata.AddUInt16((ushort)sprite.rect.Width); + rawdata.AddUInt16((ushort)sprite.rect.Height); + rawdata.AddUInt16((ushort)sprite.orig.X); + rawdata.AddUInt16((ushort)sprite.orig.Y); + } + + + return rawdata.ToArray(); + } + + protected override void FromCoreBytes(byte[] data) + { + file.filenames = new List(); + file.sprites = new List(); + + int idx = 0; + + ushort texCount = data.GetUInt16(ref idx); + for (int texN = 0; texN < texCount; texN++) + file.filenames.Add(data.GetString(ref idx)); + + ushort spriteCount = data.GetUInt16(ref idx); + for (int spriteN = 0; spriteN < spriteCount; spriteN++) + { + SpriteData.Sprite sprite = new SpriteData.Sprite(); + + sprite.name = data.GetString(ref idx); + sprite.rect.X = data.GetUInt16(ref idx); + sprite.rect.Y = data.GetUInt16(ref idx); + sprite.rect.Width = data.GetUInt16(ref idx); + sprite.rect.Height = data.GetUInt16(ref idx); + sprite.orig.X = data.GetUInt16(ref idx); + sprite.orig.Y = data.GetUInt16(ref idx); + + file.sprites.Add(sprite); + } + + file.associatedZSTREAM = new ZSTREAMFile(); + file.associatedZSTREAM.associatedSD = file; + } + } + } +} diff --git a/ABStudio/FileFormats/PVR/PVRFile.cs b/ABStudio/FileFormats/PVR/PVRFile.cs new file mode 100644 index 0000000..9691adf --- /dev/null +++ b/ABStudio/FileFormats/PVR/PVRFile.cs @@ -0,0 +1,244 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace ABStudio.FileFormats.PVR +{ + public class PVRFile + { + private IntPtr tex = IntPtr.Zero; + + public PVRFile(string filename) : this(File.ReadAllBytes(filename)) { } + + public PVRFile(byte[] pvrData) + { + IntPtr dataPtr = Marshal.AllocHGlobal(pvrData.Length); + Marshal.Copy(pvrData, 0, dataPtr, pvrData.Length); + + tex = PVRTexLib.PVRTexLibCreateTextureFromData(dataPtr); + if (ReferenceEquals(tex, null)) + throw new Exception("Invalid PVR file."); + } + + public PVRFile(Bitmap bmp, string format="r4g4b4a4") + { + PVRHeaderCreateParams headerCreateParams = new PVRHeaderCreateParams(); + headerCreateParams.PixelFormat = FormatStringToULong("r8g8b8a8"); + headerCreateParams.Width = (uint)bmp.Width; + headerCreateParams.Height = (uint)bmp.Height; + headerCreateParams.Depth = 1u; + headerCreateParams.NumMipMaps = 1u; + headerCreateParams.NumArrayMembers = 1u; + headerCreateParams.NumFaces = 1u; + headerCreateParams.ColourSpace = PVRTexLibColourSpace.PVRTLCS_Linear; + headerCreateParams.ChannelType = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm; + headerCreateParams.PreMultiplied = false; + IntPtr header = PVRTexLib.PVRTexLibCreateTextureHeader(headerCreateParams); + + ulong textureSize = PVRTexLib.PVRTexLibGetTextureDataSize(header, -1, true, true); + if (textureSize == 0) + return; + + /* + BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + var length = bitmapData.Stride * bitmapData.Height; + byte[] bytes = new byte[length]; + Marshal.Copy(bitmapData.Scan0, bytes, 0, length); + bmp.UnlockBits(bitmapData); + */ + + uint bytesPerPixel = PVRTexLib.PVRTexLibGetTextureBitsPerPixel(header) / 8U; + + // Number of pixel for this (2D) surface + uint numPixels = (uint)(bmp.Width * bmp.Height); + + byte[] data = new byte[numPixels * bytesPerPixel]; + + // All pixels in this surface + for (uint pixel = 0U; pixel < numPixels; ++pixel) + { + uint currPixel = pixel * bytesPerPixel; + + Color col = bmp.GetPixel((int)(pixel % bmp.Width), (int)(pixel / bmp.Width)); + data[currPixel] = col.R; + data[currPixel + 1] = col.G; + data[currPixel + 2] = col.B; + data[currPixel + 3] = col.A; + } + + //bytes = data; + + IntPtr texPtr = Marshal.AllocHGlobal(data.Length); + Marshal.Copy(data, 0, texPtr, data.Length); + + tex = PVRTexLib.PVRTexLibCreateTexture(header, texPtr); + + Marshal.FreeHGlobal(texPtr); + + if (format != "r8g8b8a8") + TranscodeTex(format); + } + + ~PVRFile() + { + if (!ReferenceEquals(tex, null)) + PVRTexLib.PVRTexLibDestroyTexture(tex); + } + + public string GetFormat() + { + if (ReferenceEquals(tex, null)) + return ""; + + ulong val = PVRTexLib.PVRTexLibGetTexturePixelFormat(tex); + + return FormatULongToString(val); + } + + public static string FormatULongToString(ulong format) + { + char c1 = (char)(format & 0xFF); + char c2 = (char)((format >> 8) & 0xFF); + char c3 = (char)((format >> 16) & 0xFF); + char c4 = (char)((format >> 24) & 0xFF); + byte n1 = (byte)((format >> 32) & 0xFF); + byte n2 = (byte)((format >> 40) & 0xFF); + byte n3 = (byte)((format >> 48) & 0xFF); + byte n4 = (byte)((format >> 56) & 0xFF); + + return "" + c1 + n1 + c2 + n2 + c3 + n3 + c4 + n4; + } + + public static ulong FormatStringToULong(string format) + { + ulong val = 0; + val |= (ulong)(format[0] & 0xFF); + val |= ((ulong)(format[2] & 0xFF) << 8); + val |= ((ulong)(format[4] & 0xFF) << 16); + val |= ((ulong)(format[6] & 0xFF) << 24); + val |= (((ulong)(format[1] - '0') & 0xFF) << 32); + val |= (((ulong)(format[3] - '0') & 0xFF) << 40); + val |= (((ulong)(format[5] - '0') & 0xFF) << 48); + val |= (((ulong)(format[7] - '0') & 0xFF) << 56); + + return val; + } + + public void TranscodeTex(string format) => TranscodeTex(FormatStringToULong(format)); + public void TranscodeTex(ulong format) + { + IntPtr newTex = Transcode(format); + + PVRTexLib.PVRTexLibDestroyTexture(tex); + + tex = newTex; + } + + private IntPtr Transcode(string format) => Transcode(FormatStringToULong(format)); + private IntPtr Transcode(ulong format) + { + IntPtr newTex = PVRTexLib.PVRTexLibCopyTexture(tex); + if (ReferenceEquals(newTex, null)) + throw new Exception("Couldn't duplicate PVR file."); + + IntPtr newHeader = PVRTexLib.PVRTexLibGetTextureHeaderW(newTex); + if (ReferenceEquals(newHeader, null)) + { + PVRTexLib.PVRTexLibDestroyTexture(newTex); + throw new Exception("Couldn't get duplicated PVR file header."); + } + + PVRTexLibTranscoderOptions options = new PVRTexLibTranscoderOptions(); + options.SizeofStruct = 48; + options.PixelFormat = format; + options.ChannelType0 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm; + options.ChannelType1 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm; + options.ChannelType2 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm; + options.ChannelType3 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm; + options.Colourspace = PVRTexLibColourSpace.PVRTLCS_Linear; + options.Quality = PVRTexLibCompressorQuality.PVRTLCQ_PVRTCNormal; + options.DoDither = false; + options.MaxRange = 1.0f; + options.MaxThreads = 0u; + + bool didTranscode = PVRTexLib.PVRTexLibTranscodeTexture(newTex, options); + if (!didTranscode) + { + PVRTexLib.PVRTexLibDestroyTexture(newTex); + throw new Exception("Couldn't transcode PVR file."); + } + + return newTex; + } + + public void Save(string filename) + { + if (!PVRTexLib.PVRTexLibSaveTextureToFile(tex, filename)) + throw new Exception("Couldn't save PVR file."); + } + + public byte[] Save() + { + string fn = System.IO.Path.GetTempFileName(); + + Save(fn); + + byte[] bytes = File.ReadAllBytes(fn); + + File.Delete(fn); + + return bytes; + } + + public Bitmap AsBitmap(uint level=0, uint array=0, uint face=0, uint slice=0) + { + IntPtr newTex = Transcode("r8g8b8a8"); + IntPtr newHeader = PVRTexLib.PVRTexLibGetTextureHeaderW(newTex); + + uint bytesPerPixel = PVRTexLib.PVRTexLibGetTextureBitsPerPixel(newHeader) / 8U; + if (bytesPerPixel != 4) + { + PVRTexLib.PVRTexLibDestroyTexture(newTex); + throw new Exception("PVR transcoding failed."); + } + + // Width and height for this Mip level + uint levelWidth = PVRTexLib.PVRTexLibGetTextureWidth(newHeader, level); + uint levelHeight = PVRTexLib.PVRTexLibGetTextureHeight(newHeader, level); + + Bitmap bmp = new Bitmap((int)levelWidth, (int)levelHeight); + + // Number of pixel for this (2D) surface + uint numPixels = levelWidth * levelHeight; + + IntPtr data = PVRTexLib.PVRTexLibGetTextureDataPtr(newTex, level, array, face, slice); + if (ReferenceEquals(data, null)) + { + PVRTexLib.PVRTexLibDestroyTexture(newTex); + throw new Exception("Couldn't get pixel data for transcoded PVR file."); + } + + + // All pixels in this surface + for (uint pixel = 0U; pixel < numPixels; ++pixel) + { + byte[] px = new byte[bytesPerPixel]; + Marshal.Copy(data, px, 0, (int)bytesPerPixel); + + bmp.SetPixel((int)(pixel % levelWidth), (int)(pixel / levelWidth), Color.FromArgb(px[3], px[0], px[1], px[2])); + + data = IntPtr.Add(data, (int)bytesPerPixel); + } + + PVRTexLib.PVRTexLibDestroyTexture(newTex); + + return bmp; + } + } +} diff --git a/ABStudio/FileFormats/PVR/PVRTexLib.cs b/ABStudio/FileFormats/PVR/PVRTexLib.cs new file mode 100644 index 0000000..d60eeb9 --- /dev/null +++ b/ABStudio/FileFormats/PVR/PVRTexLib.cs @@ -0,0 +1,4451 @@ +// ---------------------------------------------------------------------------- +// +// This is autogenerated code by CppSharp. +// Do not edit this file or all your changes will be lost after re-generation. +// +// ---------------------------------------------------------------------------- +using System; +using System.Runtime.InteropServices; +using System.Security; +using __CallingConvention = global::System.Runtime.InteropServices.CallingConvention; +using __IntPtr = global::System.IntPtr; + +#pragma warning disable CS0109 // Member does not hide an inherited member; new keyword is not required + +namespace ABStudio.FileFormats.PVR +{ + /// *********************************************************************** + /// + /// Values for each meta data type that PVRTexLib knows about. + /// Texture arrays hinge on each surface being identical in all + /// but content, including meta data. If the meta data varies even + /// slightly then a new texture should be used. + /// It is possible to write your own extension to get around this however. + /// *********************************************************************** + /// + public enum PVRTexLibMetaData + { + PVRTLMD_TextureAtlasCoords = 0, + PVRTLMD_BumpData = 1, + PVRTLMD_CubeMapOrder = 2, + PVRTLMD_TextureOrientation = 3, + PVRTLMD_BorderData = 4, + PVRTLMD_Padding = 5, + PVRTLMD_PerChannelType = 6, + PVRTLMD_SupercompressionGlobalData = 7, + PVRTLMD_MaxRange = 8, + PVRTLMD_NumMetaDataTypes = 9 + } + + /// *********************************************************************** + /// + /// Axis + /// *********************************************************************** + /// + public enum PVRTexLibAxis + { + PVRTLA_X = 0, + PVRTLA_Y = 1, + PVRTLA_Z = 2 + } + + /// *********************************************************************** + /// + /// Image orientations per axis + /// *********************************************************************** + /// + [Flags] + public enum PVRTexLibOrientation + { + PVRTLO_Left = 1, + PVRTLO_Right = 0, + PVRTLO_Up = 2, + PVRTLO_Down = 0, + PVRTLO_Out = 4, + PVRTLO_In = 0 + } + + /// *********************************************************************** + /// + /// Describes the colour space of the texture + /// *********************************************************************** + /// + public enum PVRTexLibColourSpace + { + PVRTLCS_Linear = 0, + PVRTLCS_sRGB = 1, + PVRTLCS_BT601 = 2, + PVRTLCS_BT709 = 3, + PVRTLCS_BT2020 = 4, + PVRTLCS_NumSpaces = 5 + } + + /// *********************************************************************** + /// + /// Channel names for non-compressed formats + /// *********************************************************************** + /// + public enum PVRTexLibChannelName + { + PVRTLCN_NoChannel = 0, + PVRTLCN_Red = 1, + PVRTLCN_Green = 2, + PVRTLCN_Blue = 3, + PVRTLCN_Alpha = 4, + PVRTLCN_Luminance = 5, + PVRTLCN_Intensity = 6, + PVRTLCN_Depth = 7, + PVRTLCN_Stencil = 8, + PVRTLCN_Unspecified = 9, + PVRTLCN_NumChannels = 10 + } + + /// *********************************************************************** + /// + /// Compressed pixel formats that PVRTexLib understands + /// *********************************************************************** + /// + public enum PVRTexLibPixelFormat + { + PVRTLPF_PVRTCI_2bppRGB = 0, + PVRTLPF_PVRTCI_2bppRGBA = 1, + PVRTLPF_PVRTCI_4bppRGB = 2, + PVRTLPF_PVRTCI_4bppRGBA = 3, + PVRTLPF_PVRTCII_2bpp = 4, + PVRTLPF_PVRTCII_4bpp = 5, + PVRTLPF_ETC1 = 6, + PVRTLPF_DXT1 = 7, + PVRTLPF_DXT2 = 8, + PVRTLPF_DXT3 = 9, + PVRTLPF_DXT4 = 10, + PVRTLPF_DXT5 = 11, + PVRTLPF_BC1 = 7, + PVRTLPF_BC2 = 9, + PVRTLPF_BC3 = 11, + PVRTLPF_BC4 = 12, + PVRTLPF_BC5 = 13, + PVRTLPF_BC6 = 14, + PVRTLPF_BC7 = 15, + PVRTLPF_UYVY_422 = 16, + PVRTLPF_YUY2_422 = 17, + PVRTLPF_BW1bpp = 18, + PVRTLPF_SharedExponentR9G9B9E5 = 19, + PVRTLPF_RGBG8888 = 20, + PVRTLPF_GRGB8888 = 21, + PVRTLPF_ETC2RGB = 22, + PVRTLPF_ETC2RGBA = 23, + PVRTLPF_ETC2RGB_A1 = 24, + PVRTLPF_EAC_R11 = 25, + PVRTLPF_EAC_RG11 = 26, + PVRTLPF_ASTC_4x4 = 27, + PVRTLPF_ASTC_5x4 = 28, + PVRTLPF_ASTC_5x5 = 29, + PVRTLPF_ASTC_6x5 = 30, + PVRTLPF_ASTC_6x6 = 31, + PVRTLPF_ASTC_8x5 = 32, + PVRTLPF_ASTC_8x6 = 33, + PVRTLPF_ASTC_8x8 = 34, + PVRTLPF_ASTC_10x5 = 35, + PVRTLPF_ASTC_10x6 = 36, + PVRTLPF_ASTC_10x8 = 37, + PVRTLPF_ASTC_10x10 = 38, + PVRTLPF_ASTC_12x10 = 39, + PVRTLPF_ASTC_12x12 = 40, + PVRTLPF_ASTC_3x3x3 = 41, + PVRTLPF_ASTC_4x3x3 = 42, + PVRTLPF_ASTC_4x4x3 = 43, + PVRTLPF_ASTC_4x4x4 = 44, + PVRTLPF_ASTC_5x4x4 = 45, + PVRTLPF_ASTC_5x5x4 = 46, + PVRTLPF_ASTC_5x5x5 = 47, + PVRTLPF_ASTC_6x5x5 = 48, + PVRTLPF_ASTC_6x6x5 = 49, + PVRTLPF_ASTC_6x6x6 = 50, + PVRTLPF_BASISU_ETC1S = 51, + PVRTLPF_BASISU_UASTC = 52, + PVRTLPF_RGBM = 53, + PVRTLPF_RGBD = 54, + PVRTLPF_PVRTCI_HDR_6bpp = 55, + PVRTLPF_PVRTCI_HDR_8bpp = 56, + PVRTLPF_PVRTCII_HDR_6bpp = 57, + PVRTLPF_PVRTCII_HDR_8bpp = 58, + PVRTLPF_VYUA10MSB_444 = 59, + PVRTLPF_VYUA10LSB_444 = 60, + PVRTLPF_VYUA12MSB_444 = 61, + PVRTLPF_VYUA12LSB_444 = 62, + PVRTLPF_UYV10A2_444 = 63, + PVRTLPF_UYVA16_444 = 64, + PVRTLPF_YUYV16_422 = 65, + PVRTLPF_UYVY16_422 = 66, + PVRTLPF_YUYV10MSB_422 = 67, + PVRTLPF_YUYV10LSB_422 = 68, + PVRTLPF_UYVY10MSB_422 = 69, + PVRTLPF_UYVY10LSB_422 = 70, + PVRTLPF_YUYV12MSB_422 = 71, + PVRTLPF_YUYV12LSB_422 = 72, + PVRTLPF_UYVY12MSB_422 = 73, + PVRTLPF_UYVY12LSB_422 = 74, + PVRTLPF_YUV_3P_444 = 270, + PVRTLPF_YUV10MSB_3P_444 = 271, + PVRTLPF_YUV10LSB_3P_444 = 272, + PVRTLPF_YUV12MSB_3P_444 = 273, + PVRTLPF_YUV12LSB_3P_444 = 274, + PVRTLPF_YUV16_3P_444 = 275, + PVRTLPF_YUV_3P_422 = 276, + PVRTLPF_YUV10MSB_3P_422 = 277, + PVRTLPF_YUV10LSB_3P_422 = 278, + PVRTLPF_YUV12MSB_3P_422 = 279, + PVRTLPF_YUV12LSB_3P_422 = 280, + PVRTLPF_YUV16_3P_422 = 281, + PVRTLPF_YUV_3P_420 = 282, + PVRTLPF_YUV10MSB_3P_420 = 283, + PVRTLPF_YUV10LSB_3P_420 = 284, + PVRTLPF_YUV12MSB_3P_420 = 285, + PVRTLPF_YUV12LSB_3P_420 = 286, + PVRTLPF_YUV16_3P_420 = 287, + PVRTLPF_YVU_3P_420 = 288, + PVRTLPF_YUV_2P_422 = 480, + PVRTLPF_YUV10MSB_2P_422 = 481, + PVRTLPF_YUV10LSB_2P_422 = 482, + PVRTLPF_YUV12MSB_2P_422 = 483, + PVRTLPF_YUV12LSB_2P_422 = 484, + PVRTLPF_YUV16_2P_422 = 485, + PVRTLPF_YUV_2P_420 = 486, + PVRTLPF_YUV10MSB_2P_420 = 487, + PVRTLPF_YUV10LSB_2P_420 = 488, + PVRTLPF_YUV12MSB_2P_420 = 489, + PVRTLPF_YUV12LSB_2P_420 = 490, + PVRTLPF_YUV16_2P_420 = 491, + PVRTLPF_YUV_2P_444 = 492, + PVRTLPF_YVU_2P_444 = 493, + PVRTLPF_YUV10MSB_2P_444 = 494, + PVRTLPF_YUV10LSB_2P_444 = 495, + PVRTLPF_YVU10MSB_2P_444 = 496, + PVRTLPF_YVU10LSB_2P_444 = 497, + PVRTLPF_YVU_2P_422 = 498, + PVRTLPF_YVU10MSB_2P_422 = 499, + PVRTLPF_YVU10LSB_2P_422 = 500, + PVRTLPF_YVU_2P_420 = 501, + PVRTLPF_YVU10MSB_2P_420 = 502, + PVRTLPF_YVU10LSB_2P_420 = 503, + PVRTLPF_NumCompressedPFs = 504 + } + + /// *********************************************************************** + /// + /// Data types. Describes how the data is interpreted by PVRTexLib and + /// how the pointer returned by PVRTexLib_GetTextureDataPtr() should + /// be interpreted. + /// *********************************************************************** + /// + public enum PVRTexLibVariableType + { + PVRTLVT_UnsignedByteNorm = 0, + PVRTLVT_SignedByteNorm = 1, + PVRTLVT_UnsignedByte = 2, + PVRTLVT_SignedByte = 3, + PVRTLVT_UnsignedShortNorm = 4, + PVRTLVT_SignedShortNorm = 5, + PVRTLVT_UnsignedShort = 6, + PVRTLVT_SignedShort = 7, + PVRTLVT_UnsignedIntegerNorm = 8, + PVRTLVT_SignedIntegerNorm = 9, + PVRTLVT_UnsignedInteger = 10, + PVRTLVT_SignedInteger = 11, + PVRTLVT_SignedFloat = 12, + PVRTLVT_Float = 12, + PVRTLVT_UnsignedFloat = 13, + PVRTLVT_NumVarTypes = 14, + PVRTLVT_Invalid = 255 + } + + /// *********************************************************************** + /// + /// Quality level to compress the texture with. Applies to PVRTC, + /// ETC, ASTC, BASIS and IMGIC formats. + /// *********************************************************************** + /// + public enum PVRTexLibCompressorQuality + { + /// PVRTC fastest + PVRTLCQ_PVRTCFastest = 0, + /// PVRTC fast + PVRTLCQ_PVRTCFast = 1, + /// PVRTC low + PVRTLCQ_PVRTCLow = 2, + /// PVRTC normal + PVRTLCQ_PVRTCNormal = 3, + /// PVRTC high + PVRTLCQ_PVRTCHigh = 4, + /// PVRTC very high + PVRTLCQ_PVRTCVeryHigh = 5, + /// PVRTC thorough + PVRTLCQ_PVRTCThorough = 6, + /// PVRTC best + PVRTLCQ_PVRTCBest = 7, + /// Number of PVRTC modes + PVRTLCQ_NumPVRTCModes = 8, + /// ETC fast + PVRTLCQ_ETCFast = 0, + /// ETC normal + PVRTLCQ_ETCNormal = 1, + /// ETC slow + PVRTLCQ_ETCSlow = 2, + /// Number of ETC modes + PVRTLCQ_NumETCModes = 3, + /// ASTC very fast + PVRTLCQ_ASTCVeryFast = 0, + /// ASTC fast + PVRTLCQ_ASTCFast = 1, + /// ASTC medium + PVRTLCQ_ASTCMedium = 2, + /// ASTC thorough + PVRTLCQ_ASTCThorough = 3, + /// ASTC exhaustive + PVRTLCQ_ASTCExhaustive = 4, + /// Number of ASTC modes + PVRTLCQ_NumASTCModes = 5, + /// BASISU lowest quality + PVRTLCQ_BASISULowest = 0, + /// BASISU low quality + PVRTLCQ_BASISULow = 1, + /// BASISU normal quality + PVRTLCQ_BASISUNormal = 2, + /// BASISU high quality + PVRTLCQ_BASISUHigh = 3, + /// BASISU best quality + PVRTLCQ_BASISUBest = 4, + /// Number of BASISU modes + PVRTLCQ_NumBASISUModes = 5 + } + + /// *********************************************************************** + /// + /// Filter to apply when resizing an image + /// *********************************************************************** + /// + public enum PVRTexLibResizeMode + { + /// Nearest filtering + PVRTLRM_Nearest = 0, + /// Linear filtering + PVRTLRM_Linear = 1, + /// Cubic filtering, uses Catmull-Rom splines. + PVRTLRM_Cubic = 2, + /// Number of resize modes + PVRTLRM_Modes = 3 + } + + /// *********************************************************************** + /// + /// File container type + /// *********************************************************************** + /// + public enum PVRTexLibFileContainerType + { + /// PVR: https://docs.imgtec.com/Specifications/PVR_File_Format_Specification/topics/pvr_intro.html + PVRTLFCT_PVR = 0, + /// KTX version 1: https://www.khronos.org/registry/KTX/specs/1.0/ktxspec_v1.html + PVRTLFCT_KTX = 1, + /// KTX version 2: https://github.khronos.org/KTX-Specification/ + PVRTLFCT_KTX2 = 2, + /// ASTC compressed textures only: https://github.com/ARM-software/astc-encoder + PVRTLFCT_ASTC = 3, + /// Basis Universal compressed textures only: https://github.com/BinomialLLC/basis_universal + PVRTLFCT_BASIS = 4, + /// DirectDraw Surface: https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds-reference + PVRTLFCT_DDS = 5, + /// C style header + PVRTLFCT_CHeader = 6 + } + + /// *********************************************************************** + /// + /// The clamping mode to use when performing a colour diff + /// *********************************************************************** + /// + public enum PVRTexLibColourDiffMode + { + /// Absolute + PVRTLCDM_Abs = 0, + /// Signed + PVRTLCDM_Signed = 1 + } + + /// *********************************************************************** + /// + /// Legacy API enum. + /// *********************************************************************** + /// + public enum PVRTexLibLegacyApi + { + /// OpenGL ES 1.x + PVRTLLAPI_OGLES = 1, + /// OpenGL ES 2.0 + PVRTLLAPI_OGLES2 = 2, + /// Direct 3D M + PVRTLLAPI_D3DM = 3, + /// Open GL + PVRTLLAPI_OGL = 4, + /// DirextX 9 + PVRTLLAPI_DX9 = 5, + /// DirectX 10 + PVRTLLAPI_DX10 = 6, + /// Open VG + PVRTLLAPI_OVG = 7, + /// MGL + PVRTLLAPI_MGL = 8 + } + + /// + /// ************************************************************************** + /// * Integer types + /// ************************************************************************** + /// + public unsafe partial class PVRTextureHeaderV3 : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 52, Pack = 4)] + public partial struct __Internal + { + internal uint u32Version; + internal uint u32Flags; + internal ulong u64PixelFormat; + internal uint u32ColourSpace; + internal uint u32ChannelType; + internal uint u32Height; + internal uint u32Width; + internal uint u32Depth; + internal uint u32NumSurfaces; + internal uint u32NumFaces; + internal uint u32MIPMapCount; + internal uint u32MetaDataSize; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTextureHeaderV3@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0); + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTextureHeaderV3 managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTextureHeaderV3 managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static PVRTextureHeaderV3 __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new PVRTextureHeaderV3(native.ToPointer(), skipVTables); + } + + internal static PVRTextureHeaderV3 __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (PVRTextureHeaderV3)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static PVRTextureHeaderV3 __CreateInstance(__Internal native, bool skipVTables = false) + { + return new PVRTextureHeaderV3(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private PVRTextureHeaderV3(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected PVRTextureHeaderV3(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public PVRTextureHeaderV3() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTextureHeaderV3.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public PVRTextureHeaderV3(PVRTextureHeaderV3 _0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTextureHeaderV3.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRTextureHeaderV3.__Internal*)__Instance) = *((PVRTextureHeaderV3.__Internal*)_0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// Version of the file header, used to identify it. + public uint U32Version + { + get + { + return ((__Internal*)__Instance)->u32Version; + } + + set + { + ((__Internal*)__Instance)->u32Version = value; + } + } + + /// Various format flags. + public uint U32Flags + { + get + { + return ((__Internal*)__Instance)->u32Flags; + } + + set + { + ((__Internal*)__Instance)->u32Flags = value; + } + } + + /// The pixel format, 8cc value storing the 4 channel identifiers and their respective sizes. + public ulong U64PixelFormat + { + get + { + return ((__Internal*)__Instance)->u64PixelFormat; + } + + set + { + ((__Internal*)__Instance)->u64PixelFormat = value; + } + } + + /// The Colour Space of the texture, currently either linear RGB or sRGB. + public uint U32ColourSpace + { + get + { + return ((__Internal*)__Instance)->u32ColourSpace; + } + + set + { + ((__Internal*)__Instance)->u32ColourSpace = value; + } + } + + /// Variable type that the channel is stored in. Supports signed/unsigned int/short/byte or float for now. + public uint U32ChannelType + { + get + { + return ((__Internal*)__Instance)->u32ChannelType; + } + + set + { + ((__Internal*)__Instance)->u32ChannelType = value; + } + } + + /// Height of the texture. + public uint U32Height + { + get + { + return ((__Internal*)__Instance)->u32Height; + } + + set + { + ((__Internal*)__Instance)->u32Height = value; + } + } + + /// Width of the texture. + public uint U32Width + { + get + { + return ((__Internal*)__Instance)->u32Width; + } + + set + { + ((__Internal*)__Instance)->u32Width = value; + } + } + + /// Depth of the texture. (Z-slices) + public uint U32Depth + { + get + { + return ((__Internal*)__Instance)->u32Depth; + } + + set + { + ((__Internal*)__Instance)->u32Depth = value; + } + } + + /// Number of members in a Texture Array. + public uint U32NumSurfaces + { + get + { + return ((__Internal*)__Instance)->u32NumSurfaces; + } + + set + { + ((__Internal*)__Instance)->u32NumSurfaces = value; + } + } + + /// Number of faces in a Cube Map. Maybe be a value other than 6. + public uint U32NumFaces + { + get + { + return ((__Internal*)__Instance)->u32NumFaces; + } + + set + { + ((__Internal*)__Instance)->u32NumFaces = value; + } + } + + /// Number of MIP Maps in the texture - NB: Includes top level. + public uint U32MIPMapCount + { + get + { + return ((__Internal*)__Instance)->u32MIPMapCount; + } + + set + { + ((__Internal*)__Instance)->u32MIPMapCount = value; + } + } + + /// Size of the accompanying meta data. + public uint U32MetaDataSize + { + get + { + return ((__Internal*)__Instance)->u32MetaDataSize; + } + + set + { + ((__Internal*)__Instance)->u32MetaDataSize = value; + } + } + } + + /// *********************************************************************** + /// + /// Structure containing various texture header parameters for + /// PVRTexLib_CreateTextureHeader(). + /// *********************************************************************** + /// + public unsafe partial class PVRHeaderCreateParams : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 48)] + public partial struct __Internal + { + internal ulong pixelFormat; + internal uint width; + internal uint height; + internal uint depth; + internal uint numMipMaps; + internal uint numArrayMembers; + internal uint numFaces; + internal PVRTexLibColourSpace colourSpace; + internal PVRTexLibVariableType channelType; + internal byte preMultiplied; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRHeader_CreateParams@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0); + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRHeaderCreateParams managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRHeaderCreateParams managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static PVRHeaderCreateParams __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new PVRHeaderCreateParams(native.ToPointer(), skipVTables); + } + + internal static PVRHeaderCreateParams __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (PVRHeaderCreateParams)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static PVRHeaderCreateParams __CreateInstance(__Internal native, bool skipVTables = false) + { + return new PVRHeaderCreateParams(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private PVRHeaderCreateParams(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected PVRHeaderCreateParams(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public PVRHeaderCreateParams() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRHeaderCreateParams.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public PVRHeaderCreateParams(PVRHeaderCreateParams _0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRHeaderCreateParams.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRHeaderCreateParams.__Internal*)__Instance) = *((PVRHeaderCreateParams.__Internal*)_0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// pixel format + public ulong PixelFormat + { + get + { + return ((__Internal*)__Instance)->pixelFormat; + } + + set + { + ((__Internal*)__Instance)->pixelFormat = value; + } + } + + /// texture width + public uint Width + { + get + { + return ((__Internal*)__Instance)->width; + } + + set + { + ((__Internal*)__Instance)->width = value; + } + } + + /// texture height + public uint Height + { + get + { + return ((__Internal*)__Instance)->height; + } + + set + { + ((__Internal*)__Instance)->height = value; + } + } + + /// texture depth + public uint Depth + { + get + { + return ((__Internal*)__Instance)->depth; + } + + set + { + ((__Internal*)__Instance)->depth = value; + } + } + + /// number of MIP maps + public uint NumMipMaps + { + get + { + return ((__Internal*)__Instance)->numMipMaps; + } + + set + { + ((__Internal*)__Instance)->numMipMaps = value; + } + } + + /// number of array members + public uint NumArrayMembers + { + get + { + return ((__Internal*)__Instance)->numArrayMembers; + } + + set + { + ((__Internal*)__Instance)->numArrayMembers = value; + } + } + + /// number of faces + public uint NumFaces + { + get + { + return ((__Internal*)__Instance)->numFaces; + } + + set + { + ((__Internal*)__Instance)->numFaces = value; + } + } + + /// colour space + public PVRTexLibColourSpace ColourSpace + { + get + { + return ((__Internal*)__Instance)->colourSpace; + } + + set + { + ((__Internal*)__Instance)->colourSpace = value; + } + } + + /// channel type + public PVRTexLibVariableType ChannelType + { + get + { + return ((__Internal*)__Instance)->channelType; + } + + set + { + ((__Internal*)__Instance)->channelType = value; + } + } + + /// has the RGB been pre-multiplied by the alpha? + public bool PreMultiplied + { + get + { + return ((__Internal*)__Instance)->preMultiplied != 0; + } + + set + { + ((__Internal*)__Instance)->preMultiplied = (byte)(value ? 1 : 0); + } + } + } + + /// *********************************************************************** + /// + /// Structure containing a textures orientation in each axis. + /// *********************************************************************** + /// + public unsafe partial class PVRTexLib_Orientation : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 12)] + public partial struct __Internal + { + internal PVRTexLibOrientation x; + internal PVRTexLibOrientation y; + internal PVRTexLibOrientation z; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_Orientation@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0); + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLib_Orientation managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLib_Orientation managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static PVRTexLib_Orientation __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new PVRTexLib_Orientation(native.ToPointer(), skipVTables); + } + + internal static PVRTexLib_Orientation __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (PVRTexLib_Orientation)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static PVRTexLib_Orientation __CreateInstance(__Internal native, bool skipVTables = false) + { + return new PVRTexLib_Orientation(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private PVRTexLib_Orientation(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected PVRTexLib_Orientation(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public PVRTexLib_Orientation() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLib_Orientation.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public PVRTexLib_Orientation(PVRTexLib_Orientation _0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLib_Orientation.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRTexLib_Orientation.__Internal*)__Instance) = *((PVRTexLib_Orientation.__Internal*)_0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// X axis orientation + public PVRTexLibOrientation X + { + get + { + return ((__Internal*)__Instance)->x; + } + + set + { + ((__Internal*)__Instance)->x = value; + } + } + + /// Y axis orientation + public PVRTexLibOrientation Y + { + get + { + return ((__Internal*)__Instance)->y; + } + + set + { + ((__Internal*)__Instance)->y = value; + } + } + + /// Z axis orientation + public PVRTexLibOrientation Z + { + get + { + return ((__Internal*)__Instance)->z; + } + + set + { + ((__Internal*)__Instance)->z = value; + } + } + } + + /// *********************************************************************** + /// + /// Structure containing a OpenGL[ES] format. + /// *********************************************************************** + /// + public unsafe partial class PVRTexLibOpenGLFormat : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 12)] + public partial struct __Internal + { + internal uint internalFormat; + internal uint format; + internal uint type; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_OpenGLFormat@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0); + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibOpenGLFormat managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibOpenGLFormat managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static PVRTexLibOpenGLFormat __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new PVRTexLibOpenGLFormat(native.ToPointer(), skipVTables); + } + + internal static PVRTexLibOpenGLFormat __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (PVRTexLibOpenGLFormat)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static PVRTexLibOpenGLFormat __CreateInstance(__Internal native, bool skipVTables = false) + { + return new PVRTexLibOpenGLFormat(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private PVRTexLibOpenGLFormat(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected PVRTexLibOpenGLFormat(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public PVRTexLibOpenGLFormat() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibOpenGLFormat.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public PVRTexLibOpenGLFormat(PVRTexLibOpenGLFormat _0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibOpenGLFormat.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRTexLibOpenGLFormat.__Internal*)__Instance) = *((PVRTexLibOpenGLFormat.__Internal*)_0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// GL internal format + public uint InternalFormat + { + get + { + return ((__Internal*)__Instance)->internalFormat; + } + + set + { + ((__Internal*)__Instance)->internalFormat = value; + } + } + + /// GL format + public uint Format + { + get + { + return ((__Internal*)__Instance)->format; + } + + set + { + ((__Internal*)__Instance)->format = value; + } + } + + /// GL type + public uint Type + { + get + { + return ((__Internal*)__Instance)->type; + } + + set + { + ((__Internal*)__Instance)->type = value; + } + } + } + + /// *********************************************************************** + /// + /// Structure containing a block of meta data for a texture. + /// *********************************************************************** + /// + public unsafe partial class PVRTexLibMetaDataBlock : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 24)] + public partial struct __Internal + { + internal uint DevFOURCC; + internal uint u32Key; + internal uint u32DataSize; + internal __IntPtr Data; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_MetaDataBlock@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0); + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibMetaDataBlock managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibMetaDataBlock managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static PVRTexLibMetaDataBlock __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new PVRTexLibMetaDataBlock(native.ToPointer(), skipVTables); + } + + internal static PVRTexLibMetaDataBlock __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (PVRTexLibMetaDataBlock)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static PVRTexLibMetaDataBlock __CreateInstance(__Internal native, bool skipVTables = false) + { + return new PVRTexLibMetaDataBlock(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private PVRTexLibMetaDataBlock(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected PVRTexLibMetaDataBlock(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public PVRTexLibMetaDataBlock() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibMetaDataBlock.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public PVRTexLibMetaDataBlock(PVRTexLibMetaDataBlock _0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibMetaDataBlock.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRTexLibMetaDataBlock.__Internal*)__Instance) = *((PVRTexLibMetaDataBlock.__Internal*)_0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// A 4cc descriptor of the data type's creator. Values starting with 'PVR' are reserved for PVRTexLib. + public uint DevFOURCC + { + get + { + return ((__Internal*)__Instance)->DevFOURCC; + } + + set + { + ((__Internal*)__Instance)->DevFOURCC = value; + } + } + + /// A unique value identifying the data type, and thus how to read it. For example PVRTexLibMetaData. + public uint U32Key + { + get + { + return ((__Internal*)__Instance)->u32Key; + } + + set + { + ((__Internal*)__Instance)->u32Key = value; + } + } + + /// Size of 'Data' in bytes. + public uint U32DataSize + { + get + { + return ((__Internal*)__Instance)->u32DataSize; + } + + set + { + ((__Internal*)__Instance)->u32DataSize = value; + } + } + + /// Meta data bytes + public byte* Data + { + get + { + return (byte*)((__Internal*)__Instance)->Data; + } + + set + { + ((__Internal*)__Instance)->Data = (__IntPtr)value; + } + } + } + + public unsafe partial class PVRTexLibTranscoderOptions : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 48, Pack = 4)] + public partial struct __Internal + { + internal uint sizeofStruct; + internal ulong pixelFormat; + internal fixed int channelType[4]; + internal PVRTexLibColourSpace colourspace; + internal PVRTexLibCompressorQuality quality; + internal byte doDither; + internal float maxRange; + internal uint maxThreads; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_TranscoderOptions@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0); + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibTranscoderOptions managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibTranscoderOptions managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static PVRTexLibTranscoderOptions __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new PVRTexLibTranscoderOptions(native.ToPointer(), skipVTables); + } + + internal static PVRTexLibTranscoderOptions __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (PVRTexLibTranscoderOptions)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static PVRTexLibTranscoderOptions __CreateInstance(__Internal native, bool skipVTables = false) + { + return new PVRTexLibTranscoderOptions(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private PVRTexLibTranscoderOptions(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected PVRTexLibTranscoderOptions(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public PVRTexLibTranscoderOptions() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibTranscoderOptions.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public PVRTexLibTranscoderOptions(PVRTexLibTranscoderOptions _0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibTranscoderOptions.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRTexLibTranscoderOptions.__Internal*)__Instance) = *((PVRTexLibTranscoderOptions.__Internal*)_0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// For versioning - sizeof(PVRTexLib_TranscoderOptions) + public uint SizeofStruct + { + get + { + return ((__Internal*)__Instance)->sizeofStruct; + } + + set + { + ((__Internal*)__Instance)->sizeofStruct = value; + } + } + + /// Pixel format type + public ulong PixelFormat + { + get + { + return ((__Internal*)__Instance)->pixelFormat; + } + + set + { + ((__Internal*)__Instance)->pixelFormat = value; + } + } + + /// Per-channel variable type. + public PVRTexLibVariableType ChannelType0 + { + get + { + return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[0]; + } + + set + { + ((__Internal*)__Instance)->channelType[0] = (int)value; + } + } + + /// Per-channel variable type. + public PVRTexLibVariableType ChannelType1 + { + get + { + return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[1]; + } + + set + { + ((__Internal*)__Instance)->channelType[1] = (int)value; + } + } + + /// Per-channel variable type. + public PVRTexLibVariableType ChannelType2 + { + get + { + return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[2]; + } + + set + { + ((__Internal*)__Instance)->channelType[2] = (int)value; + } + } + + /// Per-channel variable type. + public PVRTexLibVariableType ChannelType3 + { + get + { + return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[3]; + } + + set + { + ((__Internal*)__Instance)->channelType[3] = (int)value; + } + } + + /// Colour space + public PVRTexLibColourSpace Colourspace + { + get + { + return ((__Internal*)__Instance)->colourspace; + } + + set + { + ((__Internal*)__Instance)->colourspace = value; + } + } + + /// Compression quality for PVRTC, ASTC, ETC, BASISU and IMGIC, higher quality usually requires more processing time. + public PVRTexLibCompressorQuality Quality + { + get + { + return ((__Internal*)__Instance)->quality; + } + + set + { + ((__Internal*)__Instance)->quality = value; + } + } + + /// Apply dithering to lower precision formats. + public bool DoDither + { + get + { + return ((__Internal*)__Instance)->doDither != 0; + } + + set + { + ((__Internal*)__Instance)->doDither = (byte)(value ? 1 : 0); + } + } + + /// Max range value for RGB[M|D] encoding + public float MaxRange + { + get + { + return ((__Internal*)__Instance)->maxRange; + } + + set + { + ((__Internal*)__Instance)->maxRange = value; + } + } + + /// Max number of threads to use for transcoding, if set to 0 PVRTexLib will use all available cores. + public uint MaxThreads + { + get + { + return ((__Internal*)__Instance)->maxThreads; + } + + set + { + ((__Internal*)__Instance)->maxThreads = value; + } + } + } + + /// *********************************************************************** + /// + /// Structure containing the resulting error metrics computed by: + /// PVRTexLib_MaxDifference(), + /// PVRTexLib_MeanError(), + /// PVRTexLib_MeanSquaredError(), + /// PVRTexLib_RootMeanSquaredError(), + /// PVRTexLib_StandardDeviation(), + /// PVRTexLib_PeakSignalToNoiseRatio(). + /// *********************************************************************** + /// + public unsafe partial class PVRTexLibErrorMetrics : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 80)] + public partial struct __Internal + { + internal fixed byte channels[64]; + internal double allChannels; + internal double rgbChannels; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_ErrorMetrics@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0); + } + + public unsafe partial class _0 : IDisposable + { + [StructLayout(LayoutKind.Sequential, Size = 16)] + public partial struct __Internal + { + internal PVRTexLibChannelName name; + internal double value; + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0@PVRTexLib_ErrorMetrics@@QEAA@AEBU01@@Z", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr __0); + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibErrorMetrics._0 managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibErrorMetrics._0 managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static _0 __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new _0(native.ToPointer(), skipVTables); + } + + internal static _0 __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (_0)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static _0 __CreateInstance(__Internal native, bool skipVTables = false) + { + return new _0(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private _0(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected _0(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public _0() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics._0.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public _0(PVRTexLibErrorMetrics._0 __0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics._0.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRTexLibErrorMetrics._0.__Internal*)__Instance) = *((PVRTexLibErrorMetrics._0.__Internal*)__0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// Channel name. PVRTLCN_NoChannel indicates invalid entry. + public PVRTexLibChannelName Name + { + get + { + return ((__Internal*)__Instance)->name; + } + + set + { + ((__Internal*)__Instance)->name = value; + } + } + + /// Value for this channel. + public double Value + { + get + { + return ((__Internal*)__Instance)->value; + } + + set + { + ((__Internal*)__Instance)->value = value; + } + } + } + + public __IntPtr __Instance { get; protected set; } + + internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap = + new global::System.Collections.Concurrent.ConcurrentDictionary(); + + internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibErrorMetrics managed) + { + NativeToManagedMap[native] = managed; + } + + internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibErrorMetrics managed) + { + + return NativeToManagedMap.TryGetValue(native, out managed); + } + + protected bool __ownsNativeInstance; + + internal static PVRTexLibErrorMetrics __CreateInstance(__IntPtr native, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + return new PVRTexLibErrorMetrics(native.ToPointer(), skipVTables); + } + + internal static PVRTexLibErrorMetrics __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false) + { + if (native == __IntPtr.Zero) + return null; + if (__TryGetNativeToManagedMapping(native, out var managed)) + return (PVRTexLibErrorMetrics)managed; + var result = __CreateInstance(native, skipVTables); + if (saveInstance) + __RecordNativeToManagedMapping(native, result); + return result; + } + + internal static PVRTexLibErrorMetrics __CreateInstance(__Internal native, bool skipVTables = false) + { + return new PVRTexLibErrorMetrics(native, skipVTables); + } + + private static void* __CopyValue(__Internal native) + { + var ret = Marshal.AllocHGlobal(sizeof(__Internal)); + *(__Internal*)ret = native; + return ret.ToPointer(); + } + + private PVRTexLibErrorMetrics(__Internal native, bool skipVTables = false) + : this(__CopyValue(native), skipVTables) + { + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + protected PVRTexLibErrorMetrics(void* native, bool skipVTables = false) + { + if (native == null) + return; + __Instance = new __IntPtr(native); + } + + public PVRTexLibErrorMetrics() + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + } + + public PVRTexLibErrorMetrics(PVRTexLibErrorMetrics _0) + { + __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics.__Internal)); + __ownsNativeInstance = true; + __RecordNativeToManagedMapping(__Instance, this); + *((PVRTexLibErrorMetrics.__Internal*)__Instance) = *((PVRTexLibErrorMetrics.__Internal*)_0.__Instance); + } + + public void Dispose() + { + Dispose(disposing: true, callNativeDtor: __ownsNativeInstance); + } + + partial void DisposePartial(bool disposing); + + internal protected virtual void Dispose(bool disposing, bool callNativeDtor) + { + if (__Instance == IntPtr.Zero) + return; + NativeToManagedMap.TryRemove(__Instance, out _); + DisposePartial(disposing); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + __Instance = IntPtr.Zero; + } + + /// Per-channel metrics, not all entries have to be valid. + public PVRTexLibErrorMetrics._0[] Channels + { + get + { + PVRTexLibErrorMetrics._0[] __value = null; + if (((__Internal*)__Instance)->channels != null) + { + __value = new PVRTexLibErrorMetrics._0[4]; + for (int i = 0; i < 4; i++) + __value[i] = PVRTexLibErrorMetrics._0.__GetOrCreateInstance((IntPtr)((PVRTexLibErrorMetrics._0.__Internal*)&(((__Internal*)__Instance)->channels[i * sizeof(PVRTexLibErrorMetrics._0.__Internal)])), true, true); + } + return __value; + } + + set + { + if (value != null) + { + if (value.Length != 4) + throw new ArgumentOutOfRangeException("value", "The dimensions of the provided array don't match the required size."); + for (int i = 0; i < 4; i++) + *(PVRTexLibErrorMetrics._0.__Internal*)&((__Internal*)__Instance)->channels[i * sizeof(PVRTexLibErrorMetrics._0.__Internal)] = *(PVRTexLibErrorMetrics._0.__Internal*)value[i].__Instance; + } + } + } + + /// Value for all channels. + public double AllChannels + { + get + { + return ((__Internal*)__Instance)->allChannels; + } + + set + { + ((__Internal*)__Instance)->allChannels = value; + } + } + + /// Value for RGB channels. + public double RgbChannels + { + get + { + return ((__Internal*)__Instance)->rgbChannels; + } + + set + { + ((__Internal*)__Instance)->rgbChannels = value; + } + } + } + + public unsafe partial class PVRTexLib + { + public partial struct __Internal + { + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetDefaultTextureHeaderParams", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetDefaultTextureHeaderParams(__IntPtr result); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureHeader", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibCreateTextureHeader(__IntPtr attribs); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureHeaderFromHeader", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibCreateTextureHeaderFromHeader(__IntPtr header, uint metaDataCount, __IntPtr metaData); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CopyTextureHeader", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibCopyTextureHeader(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_DestroyTextureHeader", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibDestroyTextureHeader(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureCreateRaw", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibTextureCreateRaw(uint width, uint height, uint depth, uint wMin, uint hMin, uint dMin, uint nBPP, bool bMIPMap, __IntPtr pfnAllocCallback); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureLoadTiled", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibTextureLoadTiled(byte* pDst, uint widthDst, uint heightDst, byte* pSrc, uint widthSrc, uint heightSrc, uint elementSize, bool twiddled); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBitsPerPixel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureBitsPerPixel(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetFormatBitsPerPixel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetFormatBitsPerPixel(ulong u64PixelFormat); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureChannelCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureChannelCount(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureChannelType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern PVRTexLibVariableType PVRTexLibGetTextureChannelType(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureColourSpace", CallingConvention = __CallingConvention.Cdecl)] + internal static extern PVRTexLibColourSpace PVRTexLibGetTextureColourSpace(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureWidth", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureWidth(__IntPtr header, uint mipLevel); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureHeight", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureHeight(__IntPtr header, uint mipLevel); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDepth", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureDepth(__IntPtr header, uint mipLevel); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDataSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong PVRTexLibGetTextureDataSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureOrientation", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureOrientation(__IntPtr header, __IntPtr result); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureOpenGLFormat", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureOpenGLFormat(__IntPtr header, __IntPtr result); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureOpenGLESFormat", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureOpenGLESFormat(__IntPtr header, __IntPtr result); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureVulkanFormat", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureVulkanFormat(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureD3DFormat", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureD3DFormat(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDXGIFormat", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureDXGIFormat(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureFormatMinDims", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureFormatMinDims(__IntPtr header, uint* minX, uint* minY, uint* minZ); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetPixelFormatMinDims", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetPixelFormatMinDims(ulong ui64Format, uint* minX, uint* minY, uint* minZ); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureMetaDataSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureMetaDataSize(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureIsPreMultiplied", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGetTextureIsPreMultiplied(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureIsFileCompressed", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGetTextureIsFileCompressed(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureIsBumpMap", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGetTextureIsBumpMap(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBumpMapScale", CallingConvention = __CallingConvention.Cdecl)] + internal static extern float PVRTexLibGetTextureBumpMapScale(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetNumTextureAtlasMembers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetNumTextureAtlasMembers(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureAtlasData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern float* PVRTexLibGetTextureAtlasData(__IntPtr header, uint* count); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureNumMipMapLevels", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureNumMipMapLevels(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureNumFaces", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureNumFaces(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureNumArrayMembers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint PVRTexLibGetTextureNumArrayMembers(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureCubeMapOrder", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureCubeMapOrder(__IntPtr header, sbyte[] cubeOrder); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBumpMapOrder", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureBumpMapOrder(__IntPtr header, sbyte[] bumpOrder); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTexturePixelFormat", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong PVRTexLibGetTexturePixelFormat(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureHasPackedChannelData", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibTextureHasPackedChannelData(__IntPtr header); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureChannelType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureChannelType(__IntPtr header, PVRTexLibVariableType type); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureColourSpace", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureColourSpace(__IntPtr header, PVRTexLibColourSpace colourSpace); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureD3DFormat", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSetTextureD3DFormat(__IntPtr header, uint d3dFormat); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureDXGIFormat", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSetTextureDXGIFormat(__IntPtr header, uint dxgiFormat); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureOGLFormat", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSetTextureOGLFormat(__IntPtr header, __IntPtr oglFormat); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureOGLESFormat", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSetTextureOGLESFormat(__IntPtr header, __IntPtr oglesFormat); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureVulkanFormat", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSetTextureVulkanFormat(__IntPtr header, uint vulkanFormat); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTexturePixelFormat", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTexturePixelFormat(__IntPtr header, ulong format); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureWidth", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureWidth(__IntPtr header, uint width); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureHeight", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureHeight(__IntPtr header, uint height); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureDepth", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureDepth(__IntPtr header, uint depth); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureNumArrayMembers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureNumArrayMembers(__IntPtr header, uint numMembers); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureNumMIPLevels", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureNumMIPLevels(__IntPtr header, uint numMIPLevels); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureNumFaces", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureNumFaces(__IntPtr header, uint numFaces); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureOrientation", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureOrientation(__IntPtr header, __IntPtr orientation); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureIsFileCompressed", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureIsFileCompressed(__IntPtr header, bool isFileCompressed); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureIsPreMultiplied", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureIsPreMultiplied(__IntPtr header, bool isPreMultiplied); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBorder", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureBorder(__IntPtr header, uint* borderWidth, uint* borderHeight, uint* borderDepth); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetMetaDataBlock", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGetMetaDataBlock(__IntPtr header, uint devFOURCC, uint key, __IntPtr dataBlock, __IntPtr pfnAllocCallback); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureHasMetaData", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibTextureHasMetaData(__IntPtr header, uint devFOURCC, uint key); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureBumpMap", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureBumpMap(__IntPtr header, float bumpScale, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string bumpOrder); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureAtlas", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureAtlas(__IntPtr header, float* atlasData, uint dataSize); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureCubeMapOrder", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureCubeMapOrder(__IntPtr header, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string cubeMapOrder); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureBorder", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibSetTextureBorder(__IntPtr header, uint borderWidth, uint borderHeight, uint borderDepth); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_AddMetaData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibAddMetaData(__IntPtr header, __IntPtr dataBlock); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_RemoveMetaData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibRemoveMetaData(__IntPtr header, uint devFOURCC, uint key); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTexture", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibCreateTexture(__IntPtr header, __IntPtr data); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CopyTexture", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibCopyTexture(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MoveTexture", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibMoveTexture(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_DestroyTexture", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibDestroyTexture(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureFromFile", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibCreateTextureFromFile([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureFromData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibCreateTextureFromData(__IntPtr data); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDataPtr", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibGetTextureDataPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDataConstPtr", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibGetTextureDataConstPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureHeader", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibGetTextureHeader(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureHeaderW", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr PVRTexLibGetTextureHeaderW(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_AddPaddingMetaData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibAddPaddingMetaData(__IntPtr texture, uint padding); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveTextureToFile", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSaveTextureToFile(__IntPtr texture, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveTextureToMemory", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSaveTextureToMemory(__IntPtr texture, PVRTexLibFileContainerType fileType, __IntPtr privateData, ulong* outSize, __IntPtr pfnRealloc); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveSurfaceToImageFile", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSaveSurfaceToImageFile(__IntPtr texture, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath, uint MIPLevel, uint arrayMember, uint face, uint ZSlice); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveTextureToLegacyPVRFile", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSaveTextureToLegacyPVRFile(__IntPtr texture, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath, PVRTexLibLegacyApi api); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_IsTextureMultiPart", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibIsTextureMultiPart(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureParts", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void PVRTexLibGetTextureParts(__IntPtr inTexture, __IntPtr* outTextures, uint* count); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ResizeTexture", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibResizeTexture(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, PVRTexLibResizeMode resizeMode); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ResizeTextureCanvas", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibResizeTextureCanvas(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, int xOffset, int yOffset, int zOffset); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_RotateTexture", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibRotateTexture(__IntPtr texture, PVRTexLibAxis rotationAxis, bool forward); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_FlipTexture", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibFlipTexture(__IntPtr texture, PVRTexLibAxis flipDirection); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_BorderTexture", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibBorderTexture(__IntPtr texture, uint borderX, uint borderY, uint borderZ); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_PreMultiplyAlpha", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibPreMultiplyAlpha(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_Bleed", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibBleed(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureChannels", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSetTextureChannels(__IntPtr texture, uint numChannelSets, PVRTexLibChannelName* channels, uint* pValues); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureChannelsFloat", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibSetTextureChannelsFloat(__IntPtr texture, uint numChannelSets, PVRTexLibChannelName* channels, float* pValues); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CopyTextureChannels", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibCopyTextureChannels(__IntPtr textureDestination, __IntPtr textureSource, uint numChannelCopies, PVRTexLibChannelName* destinationChannels, PVRTexLibChannelName* sourceChannels); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GenerateNormalMap", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGenerateNormalMap(__IntPtr texture, float fScale, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string channelOrder); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GenerateMIPMaps", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGenerateMIPMaps(__IntPtr texture, PVRTexLibResizeMode filterMode, int mipMapsToDo); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ColourMIPMaps", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibColourMIPMaps(__IntPtr texture); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TranscodeTexture", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibTranscodeTexture(__IntPtr texture, __IntPtr transcoderOptions); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_Decompress", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibDecompress(__IntPtr texture, uint maxThreads); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_EquiRectToCubeMap", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibEquiRectToCubeMap(__IntPtr texture, PVRTexLibResizeMode filter); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GenerateDiffuseIrradianceCubeMap", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGenerateDiffuseIrradianceCubeMap(__IntPtr texture, uint sampleCount, uint mapSize); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GeneratePreFilteredSpecularCubeMap", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibGeneratePreFilteredSpecularCubeMap(__IntPtr texture, uint sampleCount, uint mapSize, uint numMipLevelsToDiscard, bool zeroRoughnessIsExternal); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MaxDifference", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibMaxDifference(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MeanError", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibMeanError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MeanSquaredError", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_RootMeanSquaredError", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibRootMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_StandardDeviation", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibStandardDeviation(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_PeakSignalToNoiseRatio", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibPeakSignalToNoiseRatio(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ColourDiff", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibColourDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float multiplier, PVRTexLibColourDiffMode mode); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ToleranceDiff", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibToleranceDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float tolerance); + + [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_BlendDiff", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool PVRTexLibBlendDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float blendFactor); + } + + /// *********************************************************************** + /// + /// Default header attributes. + /// *********************************************************************** + /// + /// Sets up default texture header parameters. + public static void PVRTexLibSetDefaultTextureHeaderParams(PVRHeaderCreateParams result) + { + var __arg0 = result is null ? __IntPtr.Zero : result.__Instance; + __Internal.PVRTexLibSetDefaultTextureHeaderParams(__arg0); + } + + /// *********************************************************************** + /// The header attributes + /// + /// A handle to a new texture header. + /// *********************************************************************** + /// + /// + /// Creates a new texture header using the supplied + /// header parameters. + /// + public static __IntPtr PVRTexLibCreateTextureHeader(PVRHeaderCreateParams attribs) + { + var __arg0 = attribs is null ? __IntPtr.Zero : attribs.__Instance; + var ___ret = __Internal.PVRTexLibCreateTextureHeader(__arg0); + return ___ret; + } + + /// *********************************************************************** + /// PVRTextureHeaderV3 structure to create from. + /// Number of items in metaData, can be 0. + /// Array of meta data blocks, can be null. + /// + /// A handle to a new texture header. + /// *********************************************************************** + /// + /// + /// Creates a new texture header from a PVRV3 structure. + /// Optionally supply meta data. + /// + public static __IntPtr PVRTexLibCreateTextureHeaderFromHeader(PVRTextureHeaderV3 header, uint metaDataCount, PVRTexLibMetaDataBlock metaData) + { + var __arg0 = header is null ? __IntPtr.Zero : header.__Instance; + var __arg2 = metaData is null ? __IntPtr.Zero : metaData.__Instance; + var ___ret = __Internal.PVRTexLibCreateTextureHeaderFromHeader(__arg0, metaDataCount, __arg2); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// A handle to a new texture header. + /// *********************************************************************** + /// + /// + /// Creates a new texture header by copying values from a + /// previously allocated texture header. + /// + public static __IntPtr PVRTexLibCopyTextureHeader(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibCopyTextureHeader(header); + return ___ret; + } + + /// *********************************************************************** + /// + /// Handle to a PVRTexLib_PVRTextureHeader. + /// *********************************************************************** + /// + /// Free a previously allocated texture header. + public static void PVRTexLibDestroyTextureHeader(__IntPtr header) + { + __Internal.PVRTexLibDestroyTextureHeader(header); + } + + /// ************************************************************************ + /// Width of the texture in pixels + /// Height of the texture in pixels + /// Number of Z layers + /// Minimum width of a texture level + /// Minimum height of a texture level + /// Minimum depth of a texture level + /// Bits per pixel + /// Create memory for MIP-map levels also? + /// Memory allocation callback function. + /// + /// Allocated texture memory. free()d by caller. + /// ************************************************************************ + /// + /// + /// Low level texture creation function. + /// Creates a PVRTextureHeaderV3 structure, + /// including room for the specified texture, in memory. + /// + public static PVRTextureHeaderV3 PVRTexLibTextureCreateRaw(uint width, uint height, uint depth, uint wMin, uint hMin, uint dMin, uint nBPP, bool bMIPMap, Delegates.Func___IntPtr_ulong pfnAllocCallback) + { + var __arg8 = pfnAllocCallback == null ? global::System.IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(pfnAllocCallback); + var ___ret = __Internal.PVRTexLibTextureCreateRaw(width, height, depth, wMin, hMin, dMin, nBPP, bMIPMap, __arg8); + var __result0 = PVRTextureHeaderV3.__GetOrCreateInstance(___ret, false); + return __result0; + } + + /// *************************************************************************** + /// Texture to place the tiled data + /// Width of destination texture + /// Height of destination texture + /// Texture to tile + /// Width of source texture + /// Height of source texture + /// Bytes per pixel + /// + /// True if the data is twiddled + /// *************************************************************************** + /// + /// + /// Low level texture creation function. + /// Load blocks of data from pSrc into pDst. + /// + public static void PVRTexLibTextureLoadTiled(byte* pDst, uint widthDst, uint heightDst, byte* pSrc, uint widthSrc, uint heightSrc, uint elementSize, bool twiddled) + { + __Internal.PVRTexLibTextureLoadTiled(pDst, widthDst, heightDst, pSrc, widthSrc, heightSrc, elementSize, twiddled); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Number of bits per pixel. + /// *********************************************************************** + /// + /// Gets the number of bits per pixel for the specified texture header. + public static uint PVRTexLibGetTextureBitsPerPixel(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureBitsPerPixel(header); + return ___ret; + } + + /// *********************************************************************** + /// A PVR pixel format ID. + /// + /// Number of bits per pixel. + /// *********************************************************************** + /// + /// Gets the number of bits per pixel for the specified pixel format. + public static uint PVRTexLibGetFormatBitsPerPixel(ulong u64PixelFormat) + { + var ___ret = __Internal.PVRTexLibGetFormatBitsPerPixel(u64PixelFormat); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// For uncompressed formats the number of channels between 1 and 4. + /// For compressed formats 0 + /// *********************************************************************** + /// + /// Gets the number of channels for the specified texture header. + public static uint PVRTexLibGetTextureChannelCount(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureChannelCount(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// PVRTexLibVariableType enum. + /// *********************************************************************** + /// + /// Gets the channel type for the specified texture header. + public static PVRTexLibVariableType PVRTexLibGetTextureChannelType(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureChannelType(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// PVRTexLibColourSpace enum. + /// *********************************************************************** + /// + /// Gets the colour space for the specified texture header. + public static PVRTexLibColourSpace PVRTexLibGetTextureColourSpace(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureColourSpace(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// MIP level that user is interested in. + /// + /// Width of the specified MIP-Map level. + /// *********************************************************************** + /// + /// + /// Gets the width of the user specified MIP-Map level for the + /// texture + /// + public static uint PVRTexLibGetTextureWidth(__IntPtr header, uint mipLevel) + { + var ___ret = __Internal.PVRTexLibGetTextureWidth(header, mipLevel); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// MIP level that user is interested in. + /// + /// Height of the specified MIP-Map level. + /// *********************************************************************** + /// + /// + /// Gets the height of the user specified MIP-Map + /// level for the texture + /// + public static uint PVRTexLibGetTextureHeight(__IntPtr header, uint mipLevel) + { + var ___ret = __Internal.PVRTexLibGetTextureHeight(header, mipLevel); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// MIP level that user is interested in. + /// + /// Depth of the specified MIP-Map level. + /// *********************************************************************** + /// + /// + /// Gets the depth of the user specified MIP-Map + /// level for the texture + /// + public static uint PVRTexLibGetTextureDepth(__IntPtr header, uint mipLevel) + { + var ___ret = __Internal.PVRTexLibGetTextureDepth(header, mipLevel); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Specifies a MIP level to check, + /// 'PVRTEX_ALLMIPLEVELS' can be passed to get + /// the size of all MIP levels. + /// + /// + /// Size of all surfaces is calculated if true, + /// only a single surface if false. + /// + /// + /// Size of all faces is calculated if true, + /// only a single face if false. + /// + /// + /// Size in PIXELS of the specified texture area. + /// *********************************************************************** + /// + /// + /// Gets the size in PIXELS of the texture, given various input + /// parameters. User can retrieve the total size of either all + /// surfaces or a single surface, all faces or a single face and + /// all MIP-Maps or a single specified MIP level. All of these + /// + public static uint PVRTexLibGetTextureSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces) + { + var ___ret = __Internal.PVRTexLibGetTextureSize(header, mipLevel, allSurfaces, allFaces); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Specifies a mip level to check, + /// 'PVRTEX_ALLMIPLEVELS' can be passed to get + /// the size of all MIP levels. + /// + /// + /// Size of all surfaces is calculated if true, + /// only a single surface if false. + /// + /// + /// Size of all faces is calculated if true, + /// only a single face if false. + /// + /// + /// Size in BYTES of the specified texture area. + /// *********************************************************************** + /// + /// + /// Gets the size in BYTES of the texture, given various input + /// parameters. User can retrieve the size of either all + /// surfaces or a single surface, all faces or a single face + /// and all MIP-Maps or a single specified MIP level. + /// + public static ulong PVRTexLibGetTextureDataSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces) + { + var ___ret = __Internal.PVRTexLibGetTextureDataSize(header, mipLevel, allSurfaces, allFaces); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Pointer to a PVRTexLib_Orientation structure. + /// *********************************************************************** + /// + /// Gets the data orientation for this texture. + public static void PVRTexLibGetTextureOrientation(__IntPtr header, PVRTexLib_Orientation result) + { + var __arg1 = result is null ? __IntPtr.Zero : result.__Instance; + __Internal.PVRTexLibGetTextureOrientation(header, __arg1); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Pointer to a PVRTexLib_OpenGLFormat structure. + /// *********************************************************************** + /// + /// Gets the OpenGL equivalent format for this texture. + public static void PVRTexLibGetTextureOpenGLFormat(__IntPtr header, PVRTexLibOpenGLFormat result) + { + var __arg1 = result is null ? __IntPtr.Zero : result.__Instance; + __Internal.PVRTexLibGetTextureOpenGLFormat(header, __arg1); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Pointer to a PVRTexLib_OpenGLESFormat structure. + /// *********************************************************************** + /// + /// Gets the OpenGLES equivalent format for this texture. + public static void PVRTexLibGetTextureOpenGLESFormat(__IntPtr header, PVRTexLibOpenGLFormat result) + { + var __arg1 = result is null ? __IntPtr.Zero : result.__Instance; + __Internal.PVRTexLibGetTextureOpenGLESFormat(header, __arg1); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// A VkFormat enum value. + /// *********************************************************************** + /// + /// Gets the Vulkan equivalent format for this texture. + public static uint PVRTexLibGetTextureVulkanFormat(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureVulkanFormat(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// A D3DFORMAT enum value. + /// *********************************************************************** + /// + /// Gets the Direct3D equivalent format for this texture. + public static uint PVRTexLibGetTextureD3DFormat(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureD3DFormat(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// A DXGI_FORMAT enum value. + /// *********************************************************************** + /// + /// Gets the DXGI equivalent format for this texture. + public static uint PVRTexLibGetTextureDXGIFormat(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureDXGIFormat(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// Returns the minimum width. + /// Returns the minimum height. + /// + /// Returns the minimum depth. + /// *********************************************************************** + /// + /// + /// Gets the minimum dimensions (x,y,z) + /// for the textures pixel format. + /// + public static void PVRTexLibGetTextureFormatMinDims(__IntPtr header, ref uint minX, ref uint minY, ref uint minZ) + { + fixed (uint* __minX1 = &minX) + { + var __arg1 = __minX1; + fixed (uint* __minY2 = &minY) + { + var __arg2 = __minY2; + fixed (uint* __minZ3 = &minZ) + { + var __arg3 = __minZ3; + __Internal.PVRTexLibGetTextureFormatMinDims(header, __arg1, __arg2, __arg3); + } + } + } + } + + /// *********************************************************************** + /// A PVR Pixel Format ID. + /// Returns the minimum width. + /// Returns the minimum height. + /// + /// Returns the minimum depth. + /// *********************************************************************** + /// + /// + /// Gets the minimum dimensions (x,y,z) + /// for the textures pixel format. + /// + public static void PVRTexLibGetPixelFormatMinDims(ulong ui64Format, ref uint minX, ref uint minY, ref uint minZ) + { + fixed (uint* __minX1 = &minX) + { + var __arg1 = __minX1; + fixed (uint* __minY2 = &minY) + { + var __arg2 = __minY2; + fixed (uint* __minZ3 = &minZ) + { + var __arg3 = __minZ3; + __Internal.PVRTexLibGetPixelFormatMinDims(ui64Format, __arg1, __arg2, __arg3); + } + } + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Size, in bytes, of the meta data stored in the header. + /// *********************************************************************** + /// + /// + /// Returns the total size of the meta data stored in the header. + /// This includes the size of all information stored in all MetaDataBlocks. + /// + public static uint PVRTexLibGetTextureMetaDataSize(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureMetaDataSize(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// True if texture is premultiplied. + /// *********************************************************************** + /// + /// + /// Returns whether or not the texture's colour has been + /// pre-multiplied by the alpha values. + /// + public static bool PVRTexLibGetTextureIsPreMultiplied(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureIsPreMultiplied(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// True if it is file compressed. + /// *********************************************************************** + /// + /// + /// Returns whether or not the texture is compressed using + /// PVRTexLib's FILE compression - this is independent of + /// any texture compression. + /// + public static bool PVRTexLibGetTextureIsFileCompressed(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureIsFileCompressed(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// True if it is a bump map. + /// *********************************************************************** + /// + /// Returns whether or not the texture is a bump map. + public static bool PVRTexLibGetTextureIsBumpMap(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureIsBumpMap(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Returns the bump map scale value as a float. + /// *********************************************************************** + /// + /// + /// Gets the bump map scaling value for this texture. + /// If the texture is not a bump map, 0.0f is returned. If the + /// texture is a bump map but no meta data is stored to + /// specify its scale, then 1.0f is returned. + /// + public static float PVRTexLibGetTextureBumpMapScale(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureBumpMapScale(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// The number of sub textures defined by meta data. + /// *********************************************************************** + /// + /// + /// Works out the number of possible texture atlas members in + /// the texture based on the width, height, depth and data size. + /// + public static uint PVRTexLibGetNumTextureAtlasMembers(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetNumTextureAtlasMembers(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// Number of floats in the returned data set. + /// + /// A pointer directly to the texture atlas data. NULL if + /// the texture does not have atlas data. + /// *********************************************************************** + /// + /// Returns a pointer to the texture atlas data. + public static float* PVRTexLibGetTextureAtlasData(__IntPtr header, ref uint count) + { + fixed (uint* __count1 = &count) + { + var __arg1 = __count1; + var ___ret = __Internal.PVRTexLibGetTextureAtlasData(header, __arg1); + return ___ret; + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Number of MIP-Map levels in this texture. + /// *********************************************************************** + /// + /// Gets the number of MIP-Map levels stored in this texture. + public static uint PVRTexLibGetTextureNumMipMapLevels(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureNumMipMapLevels(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Number of faces in this texture. + /// *********************************************************************** + /// + /// Gets the number of faces stored in this texture. + public static uint PVRTexLibGetTextureNumFaces(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureNumFaces(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Number of array members in this texture. + /// *********************************************************************** + /// + /// Gets the number of array members stored in this texture. + public static uint PVRTexLibGetTextureNumArrayMembers(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTextureNumArrayMembers(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Null terminated cube map order string. + /// *********************************************************************** + /// + /// + /// Gets the cube map face order. + /// cubeOrder string will be in the form "ZzXxYy" with capitals + /// representing positive and lower case letters representing + /// negative. I.e. Z=Z-Positive, z=Z-Negative. + /// + public static void PVRTexLibGetTextureCubeMapOrder(__IntPtr header, sbyte[] cubeOrder) + { + if (cubeOrder == null || cubeOrder.Length != 7) + throw new ArgumentOutOfRangeException("cubeOrder", "The dimensions of the provided array don't match the required size."); + __Internal.PVRTexLibGetTextureCubeMapOrder(header, cubeOrder); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// terminated bump map order string relative to rgba. + /// *********************************************************************** + /// + /// + /// Gets the bump map channel order relative to rgba. + /// For example, an RGB texture with bumps mapped to XYZ returns + /// 'xyz'. A BGR texture with bumps in the order ZYX will also + /// return 'xyz' as the mapping is the same: R=X, G=Y, B=Z. + /// If the letter 'h' is present in the string, it means that + /// the height map has been stored here. + /// Other characters are possible if the bump map was created + /// manually, but PVRTexLib will ignore these characters. They + /// are returned simply for completeness. + /// + public static void PVRTexLibGetTextureBumpMapOrder(__IntPtr header, sbyte[] bumpOrder) + { + if (bumpOrder == null || bumpOrder.Length != 5) + throw new ArgumentOutOfRangeException("bumpOrder", "The dimensions of the provided array don't match the required size."); + __Internal.PVRTexLibGetTextureBumpMapOrder(header, bumpOrder); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// 64-bit pixel type ID. + /// *********************************************************************** + /// + /// Gets the 64-bit pixel type ID of the texture. + public static ulong PVRTexLibGetTexturePixelFormat(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibGetTexturePixelFormat(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// True if the texture format is packed, false otherwise. + /// *********************************************************************** + /// + /// + /// Checks whether the pixel format of the texture is packed. + /// E.g. R5G6B5, R11G11B10, R4G4B4A4 etc. + /// + public static bool PVRTexLibTextureHasPackedChannelData(__IntPtr header) + { + var ___ret = __Internal.PVRTexLibTextureHasPackedChannelData(header); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// A PVRTexLibVariableType enum. + /// *********************************************************************** + /// + /// Sets the variable type for the channels in this texture. + public static void PVRTexLibSetTextureChannelType(__IntPtr header, PVRTexLibVariableType type) + { + __Internal.PVRTexLibSetTextureChannelType(header, type); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// A PVRTexLibColourSpace enum. + /// *********************************************************************** + /// + /// Sets the colour space for this texture. + public static void PVRTexLibSetTextureColourSpace(__IntPtr header, PVRTexLibColourSpace colourSpace) + { + __Internal.PVRTexLibSetTextureColourSpace(header, colourSpace); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// A D3DFORMAT enum. + /// + /// True if successful. + /// *********************************************************************** + /// + /// + /// Sets the format of the texture to PVRTexLib's internal + /// representation of the D3D format. + /// + public static bool PVRTexLibSetTextureD3DFormat(__IntPtr header, uint d3dFormat) + { + var ___ret = __Internal.PVRTexLibSetTextureD3DFormat(header, d3dFormat); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// A DXGI_FORMAT enum. + /// + /// True if successful. + /// *********************************************************************** + /// + /// + /// Sets the format of the texture to PVRTexLib's internal + /// representation of the DXGI format. + /// + public static bool PVRTexLibSetTextureDXGIFormat(__IntPtr header, uint dxgiFormat) + { + var ___ret = __Internal.PVRTexLibSetTextureDXGIFormat(header, dxgiFormat); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// The OpenGL format. + /// + /// True if successful. + /// *********************************************************************** + /// + /// + /// Sets the format of the texture to PVRTexLib's internal + /// representation of the OpenGL format. + /// + public static bool PVRTexLibSetTextureOGLFormat(__IntPtr header, PVRTexLibOpenGLFormat oglFormat) + { + var __arg1 = oglFormat is null ? __IntPtr.Zero : oglFormat.__Instance; + var ___ret = __Internal.PVRTexLibSetTextureOGLFormat(header, __arg1); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// The OpenGLES format. + /// + /// True if successful. + /// *********************************************************************** + /// + /// + /// Sets the format of the texture to PVRTexLib's internal + /// representation of the OpenGLES format. + /// + public static bool PVRTexLibSetTextureOGLESFormat(__IntPtr header, PVRTexLibOpenGLFormat oglesFormat) + { + var __arg1 = oglesFormat is null ? __IntPtr.Zero : oglesFormat.__Instance; + var ___ret = __Internal.PVRTexLibSetTextureOGLESFormat(header, __arg1); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// A VkFormat enum. + /// + /// True if successful. + /// *********************************************************************** + /// + /// + /// Sets the format of the texture to PVRTexLib's internal + /// representation of the OpenGLES format. + /// + public static bool PVRTexLibSetTextureVulkanFormat(__IntPtr header, uint vulkanFormat) + { + var ___ret = __Internal.PVRTexLibSetTextureVulkanFormat(header, vulkanFormat); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// The format of the pixel. + /// *********************************************************************** + /// + /// Sets the pixel format for this texture. + public static void PVRTexLibSetTexturePixelFormat(__IntPtr header, ulong format) + { + __Internal.PVRTexLibSetTexturePixelFormat(header, format); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// The new width. + /// *********************************************************************** + /// + /// Sets the texture width. + public static void PVRTexLibSetTextureWidth(__IntPtr header, uint width) + { + __Internal.PVRTexLibSetTextureWidth(header, width); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// The new height. + /// *********************************************************************** + /// + /// Sets the texture height. + public static void PVRTexLibSetTextureHeight(__IntPtr header, uint height) + { + __Internal.PVRTexLibSetTextureHeight(header, height); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// The new depth. + /// *********************************************************************** + /// + /// Sets the texture depth. + public static void PVRTexLibSetTextureDepth(__IntPtr header, uint depth) + { + __Internal.PVRTexLibSetTextureDepth(header, depth); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// The new number of array members. + /// *********************************************************************** + /// + /// Sets the number of array members in this texture. + public static void PVRTexLibSetTextureNumArrayMembers(__IntPtr header, uint numMembers) + { + __Internal.PVRTexLibSetTextureNumArrayMembers(header, numMembers); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// New number of MIP-Map levels. + /// *********************************************************************** + /// + /// Sets the number of MIP-Map levels in this texture. + public static void PVRTexLibSetTextureNumMIPLevels(__IntPtr header, uint numMIPLevels) + { + __Internal.PVRTexLibSetTextureNumMIPLevels(header, numMIPLevels); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// New number of faces for this texture. + /// *********************************************************************** + /// + /// Sets the number of faces stored in this texture. + public static void PVRTexLibSetTextureNumFaces(__IntPtr header, uint numFaces) + { + __Internal.PVRTexLibSetTextureNumFaces(header, numFaces); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Pointer to a PVRTexLib_Orientation struct. + /// *********************************************************************** + /// + /// Sets the data orientation for a given axis in this texture. + public static void PVRTexLibSetTextureOrientation(__IntPtr header, PVRTexLib_Orientation orientation) + { + var __arg1 = orientation is null ? __IntPtr.Zero : orientation.__Instance; + __Internal.PVRTexLibSetTextureOrientation(header, __arg1); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Sets the file compression to true or false. + /// *********************************************************************** + /// + /// + /// Sets whether or not the texture is compressed using + /// PVRTexLib's FILE compression - this is independent of + /// any texture compression. Currently unsupported. + /// + public static void PVRTexLibSetTextureIsFileCompressed(__IntPtr header, bool isFileCompressed) + { + __Internal.PVRTexLibSetTextureIsFileCompressed(header, isFileCompressed); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Sets if texture is premultiplied. + /// *********************************************************************** + /// + /// + /// Sets whether or not the texture's colour has been + /// pre-multiplied by the alpha values. + /// + public static void PVRTexLibSetTextureIsPreMultiplied(__IntPtr header, bool isPreMultiplied) + { + __Internal.PVRTexLibSetTextureIsPreMultiplied(header, isPreMultiplied); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// Border width + /// Border height + /// + /// Border depth + /// *********************************************************************** + /// + /// Obtains the border size in each dimension for this texture. + public static void PVRTexLibGetTextureBorder(__IntPtr header, ref uint borderWidth, ref uint borderHeight, ref uint borderDepth) + { + fixed (uint* __borderWidth1 = &borderWidth) + { + var __arg1 = __borderWidth1; + fixed (uint* __borderHeight2 = &borderHeight) + { + var __arg2 = __borderHeight2; + fixed (uint* __borderDepth3 = &borderDepth) + { + var __arg3 = __borderDepth3; + __Internal.PVRTexLibGetTextureBorder(header, __arg1, __arg2, __arg3); + } + } + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Four character descriptor representing the + /// creator of the meta data + /// + /// Key value representing the type of meta data stored + /// returned meta block data + /// Memory allocation callback function. + /// + /// True if the meta data block was found. + /// *********************************************************************** + /// + /// + /// Returns a copy of a block of meta data from the texture. + /// If the meta data doesn't exist, a block with a data size + /// of 0 will be returned. + /// + public static bool PVRTexLibGetMetaDataBlock(__IntPtr header, uint devFOURCC, uint key, PVRTexLibMetaDataBlock dataBlock, Delegates.Func___IntPtr_uint pfnAllocCallback) + { + var __arg3 = dataBlock is null ? __IntPtr.Zero : dataBlock.__Instance; + var __arg4 = pfnAllocCallback == null ? global::System.IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(pfnAllocCallback); + var ___ret = __Internal.PVRTexLibGetMetaDataBlock(header, devFOURCC, key, __arg3, __arg4); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Four character descriptor representing the + /// creator of the meta data + /// + /// Key value representing the type of meta data stored + /// + /// True if the specified meta data bock exists + /// *********************************************************************** + /// + /// + /// Returns whether or not the specified meta data exists as + /// part of this texture header. + /// + public static bool PVRTexLibTextureHasMetaData(__IntPtr header, uint devFOURCC, uint key) + { + var ___ret = __Internal.PVRTexLibTextureHasMetaData(header, devFOURCC, key); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// Floating point "height" value to scale the bump map. + /// + /// Up to 4 character string, with values x,y,z,h in + /// some combination. Not all values need to be present. + /// Denotes channel order; x,y,z refer to the + /// corresponding axes, h indicates presence of the + /// original height map. It is possible to have only some + /// of these values rather than all. For example if 'h' + /// is present alone it will be considered a height map. + /// The values should be presented in RGBA order, regardless + /// of the texture format, so a zyxh order in a bgra texture + /// should still be passed as 'xyzh'. Capitals are allowed. + /// Any character stored here that is not one of x,y,z,h + /// or a NULL character will be ignored when PVRTexLib + /// reads the data, but will be preserved. This is useful + /// if you wish to define a custom data channel for instance. + /// In these instances PVRTexLib will assume it is simply + /// colour data. + /// *********************************************************************** + /// + /// Sets a texture's bump map data. + public static void PVRTexLibSetTextureBumpMap(__IntPtr header, float bumpScale, string bumpOrder) + { + __Internal.PVRTexLibSetTextureBumpMap(header, bumpScale, bumpOrder); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// Pointer to an array of atlas data. + /// + /// Number of floats in atlasData. + /// *********************************************************************** + /// + /// + /// Sets the texture atlas coordinate meta data for later display. + /// It is up to the user to make sure that this texture atlas + /// data actually makes sense in the context of the header. + /// + public static void PVRTexLibSetTextureAtlas(__IntPtr header, ref float atlasData, uint dataSize) + { + fixed (float* __atlasData1 = &atlasData) + { + var __arg1 = __atlasData1; + __Internal.PVRTexLibSetTextureAtlas(header, __arg1, dataSize); + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Up to 6 character string, with values + /// x,X,y,Y,z,Z in some combination. Not all + /// values need to be present. Denotes face + /// order; Capitals refer to positive axis + /// positions and small letters refer to + /// negative axis positions. E.g. x=X-Negative, + /// X=X-Positive. It is possible to have only + /// some of these values rather than all, as + /// long as they are NULL terminated. + /// NB: Values past the 6th character are not read. + /// *********************************************************************** + /// + /// Sets the texture's face ordering. + public static void PVRTexLibSetTextureCubeMapOrder(__IntPtr header, string cubeMapOrder) + { + __Internal.PVRTexLibSetTextureCubeMapOrder(header, cubeMapOrder); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// Border width + /// Border height + /// + /// Border depth + /// *********************************************************************** + /// + /// + /// Sets a texture's border size data. This value is subtracted + /// from the current texture height/width/depth to get the valid + /// texture data. + /// + public static void PVRTexLibSetTextureBorder(__IntPtr header, uint borderWidth, uint borderHeight, uint borderDepth) + { + __Internal.PVRTexLibSetTextureBorder(header, borderWidth, borderHeight, borderDepth); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Meta data block to be added. + /// *********************************************************************** + /// + /// Adds an arbitrary piece of meta data. + public static void PVRTexLibAddMetaData(__IntPtr header, PVRTexLibMetaDataBlock dataBlock) + { + var __arg1 = dataBlock is null ? __IntPtr.Zero : dataBlock.__Instance; + __Internal.PVRTexLibAddMetaData(header, __arg1); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// + /// Four character descriptor representing the + /// creator of the meta data + /// + /// + /// Key value representing the type of meta data stored. + /// *********************************************************************** + /// + /// Removes a specified piece of meta data, if it exists. + public static void PVRTexLibRemoveMetaData(__IntPtr header, uint devFOURCC, uint key) + { + __Internal.PVRTexLibRemoveMetaData(header, devFOURCC, key); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTextureHeader. + /// Texture data (may be NULL) + /// + /// A new texture handle. + /// *********************************************************************** + /// + /// + /// Creates a new texture based on a texture header, + /// and optionally copies the supplied texture data. + /// + public static __IntPtr PVRTexLibCreateTexture(__IntPtr header, __IntPtr data) + { + var ___ret = __Internal.PVRTexLibCreateTexture(header, data); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a PVRTexLib_PVRTexture to copy from. + /// + /// A new texture handle. + /// *********************************************************************** + /// + /// Creates a copy of the supplied texture. + public static __IntPtr PVRTexLibCopyTexture(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibCopyTexture(texture); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a PVRTexLib_PVRTexture to move from. + /// + /// A new texture handle. + /// *********************************************************************** + /// + /// + /// Creates a new texture, moving the contents of the + /// supplied texture into the new texture. + /// + public static __IntPtr PVRTexLibMoveTexture(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibMoveTexture(texture); + return ___ret; + } + + /// *********************************************************************** + /// + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// *********************************************************************** + /// + /// Free a texture. + public static void PVRTexLibDestroyTexture(__IntPtr texture) + { + __Internal.PVRTexLibDestroyTexture(texture); + } + + /// *********************************************************************** + /// File path to the texture to load from. + /// + /// A new texture handle OR NULL on failure. + /// *********************************************************************** + /// + /// + /// Creates a new texture from a file. + /// Accepted file formats are: PVR, KTX, KTX2, ASTC, DDS, BASIS, + /// PNG, JPEG, BMP, TGA, GIF, HDR, EXR, PSD, PPM, PGM and PIC + /// + public static __IntPtr PVRTexLibCreateTextureFromFile(string filePath) + { + var ___ret = __Internal.PVRTexLibCreateTextureFromFile(filePath); + return ___ret; + } + + /// *********************************************************************** + /// Pointer to texture data + /// + /// A new texture handle OR NULL on failure. + /// *********************************************************************** + /// + /// + /// Creates a new texture from a pointer that includes a header + /// structure, meta data and texture data as laid out in a file. + /// This functionality is primarily for user-defined file loading. + /// Header may be any version of pvr. + /// + public static __IntPtr PVRTexLibCreateTextureFromData(__IntPtr data) + { + var ___ret = __Internal.PVRTexLibCreateTextureFromData(data); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Offset to MIP Map levels + /// Offset to array members + /// Offset to face numbers + /// Offset to Z slice (3D textures only) + /// + /// Pointer into the texture data OR NULL on failure. + /// *********************************************************************** + /// + /// + /// Returns a pointer to the texture's data. + /// The data offset is calculated using the parameters below. + /// + public static __IntPtr PVRTexLibGetTextureDataPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice) + { + var ___ret = __Internal.PVRTexLibGetTextureDataPtr(texture, MIPLevel, arrayMember, faceNumber, ZSlice); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Offset to MIP Map levels + /// Offset to array members + /// Offset to face numbers + /// Offset to Z slice (3D textures only) + /// + /// Pointer into the texture data OR NULL on failure. + /// *********************************************************************** + /// + /// + /// Returns a const pointer to the texture's data. + /// The data offset is calculated using the parameters below. + /// + public static __IntPtr PVRTexLibGetTextureDataConstPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice) + { + var ___ret = __Internal.PVRTexLibGetTextureDataConstPtr(texture, MIPLevel, arrayMember, faceNumber, ZSlice); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// PVRTexLib_PVRTextureHeader handle. + /// *********************************************************************** + /// + /// Returns a read only texture header. + public static __IntPtr PVRTexLibGetTextureHeader(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibGetTextureHeader(texture); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// PVRTexLib_PVRTextureHeader handle. + /// *********************************************************************** + /// + /// Gets a write-able handle to the texture header. + public static __IntPtr PVRTexLibGetTextureHeaderW(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibGetTextureHeaderW(texture); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// Padding boundary value + /// *********************************************************************** + /// + /// + /// Pads the texture data to a boundary value equal to "padding". + /// For example setting padding=8 will align the start of the + /// texture data to an 8 byte boundary. + /// NB: This should be called immediately before saving as + /// the value is worked out based on the current meta data size. + /// + public static void PVRTexLibAddPaddingMetaData(__IntPtr texture, uint padding) + { + __Internal.PVRTexLibAddPaddingMetaData(texture, padding); + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// File path to write to + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Saves the texture to a given file path. + /// File type will be determined by the extension present in the string. + /// Valid extensions are: PVR, KTX, KTX2, ASTC, DDS, BASIS and h + /// If no extension is present the PVR format will be selected. + /// Unsupported formats will result in failure. + /// ASTC files only support ASTC texture formats. + /// BASIS files only support Basis Universal texture formats. + /// + public static bool PVRTexLibSaveTextureToFile(__IntPtr texture, string filePath) + { + var ___ret = __Internal.PVRTexLibSaveTextureToFile(texture, filePath); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// File container type to wrap the texture data with. + /// + /// Pointer to a user supplied allocation context. + /// PVRTexLib will pass this into pfnRealloc when a [re]allocation + /// is required. + /// + /// Size, in bytes, of the resulting 'file'/data. + /// + /// Callback function to reallocate memory on-demand. + /// Return NULL to indicate allocation failure. + /// + /// + /// True if the method succeeds. + /// N.B This function may allocate even if it fails. + /// *********************************************************************** + /// + /// + /// Similar to PVRTexLib_SaveTextureToFile, but redirects + /// the data to a memory buffer instead of a file. + /// Caller is responsible for de-allocating memory. + /// + public static bool PVRTexLibSaveTextureToMemory(__IntPtr texture, PVRTexLibFileContainerType fileType, __IntPtr privateData, ref ulong outSize, Delegates.Func_bytePtr___IntPtr_ulong pfnRealloc) + { + fixed (ulong* __outSize3 = &outSize) + { + var __arg3 = __outSize3; + var __arg4 = pfnRealloc == null ? global::System.IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(pfnRealloc); + var ___ret = __Internal.PVRTexLibSaveTextureToMemory(texture, fileType, privateData, __arg3, __arg4); + return ___ret; + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Path to write the image file. + /// Mip level. + /// Array index. + /// Face index. + /// Z index. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Writes out a single surface to a given image file. + /// File type is determined by the extension present in the filepath string. + /// Supported file types are PNG, JPG, BMP, TGA and HDR. + /// If no extension is present then the PNG format will be selected. + /// Unsupported formats will result in failure. + /// + public static bool PVRTexLibSaveSurfaceToImageFile(__IntPtr texture, string filePath, uint MIPLevel, uint arrayMember, uint face, uint ZSlice) + { + var ___ret = __Internal.PVRTexLibSaveSurfaceToImageFile(texture, filePath, MIPLevel, arrayMember, face, ZSlice); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// File path to write to + /// Target API + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Saves the texture to a file, stripping any + /// extensions specified and appending .pvr. This function is + /// for legacy support only and saves out to PVR Version 2 file. + /// The target api must be specified in order to save to this format. + /// + public static bool PVRTexLibSaveTextureToLegacyPVRFile(__IntPtr texture, string filePath, PVRTexLibLegacyApi api) + { + var ___ret = __Internal.PVRTexLibSaveTextureToLegacyPVRFile(texture, filePath, api); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// True if texture contains more than one PVRTexLib_PVRTexture. + /// *********************************************************************** + /// + /// + /// Queries the texture object to determine if there are multiple + /// texture objects associated with the handle. This may be the + /// case after loading certain file types such as EXR, since EXR + /// files may contain several images/layers with unique pixel formats. + /// In these cases PVRTexLib will group all images with the same + /// pixel format into a single PVRTexLib_PVRTexture object, where + /// each PVRTexLib_PVRTexture can contain multiple array surfaces. + /// + public static bool PVRTexLibIsTextureMultiPart(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibIsTextureMultiPart(texture); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// Array of PVRTexLib_PVRTexture handles to be populated. + /// All returned handles are independent of each other and 'inTexture'. + /// + /// + /// The number of parts held by inTexture + /// *********************************************************************** + /// + /// + /// Retrieves (and moves ownership of) the PVRTexLib_PVRTexture handles + /// stored within a multi-part texture and stores them in 'outTextures'. + /// Call this function with 'outTextures' == NULL to populate count + /// and then allocate an appropriately sized array. Handles returned + /// in 'outTextures' should be de-allocated as normal via + /// PVRTexLib_DestroyTexture. After calling this function, subsequent + /// calls to PVRTexLib_IsTextureMultiPart on the same handle will + /// return false. + /// + public static void PVRTexLibGetTextureParts(__IntPtr inTexture, __IntPtr* outTextures, ref uint count) + { + fixed (uint* __count2 = &count) + { + var __arg2 = __count2; + __Internal.PVRTexLibGetTextureParts(inTexture, outTextures, __arg2); + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// New width + /// New height + /// New depth + /// Filtering mode + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Resizes the texture to new specified dimensions. + public static bool PVRTexLibResizeTexture(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, PVRTexLibResizeMode resizeMode) + { + var ___ret = __Internal.PVRTexLibResizeTexture(texture, newWidth, newHeight, newDepth, resizeMode); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// New width + /// New height + /// New depth + /// X Offset value from the top left corner + /// Y Offset value from the top left corner + /// Z Offset value from the top left corner + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Resizes the canvas of a texture to new specified dimensions. + /// Offset area is filled with transparent black colour. + /// + public static bool PVRTexLibResizeTextureCanvas(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, int xOffset, int yOffset, int zOffset) + { + var ___ret = __Internal.PVRTexLibResizeTextureCanvas(texture, newWidth, newHeight, newDepth, xOffset, yOffset, zOffset); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Rotation axis + /// Direction of rotation; true = clockwise, false = anti-clockwise + /// + /// True if the method succeeds or not. + /// *********************************************************************** + /// + /// Rotates a texture by 90 degrees around the given axis. + public static bool PVRTexLibRotateTexture(__IntPtr texture, PVRTexLibAxis rotationAxis, bool forward) + { + var ___ret = __Internal.PVRTexLibRotateTexture(texture, rotationAxis, forward); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Flip direction + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Flips a texture on a given axis. + public static bool PVRTexLibFlipTexture(__IntPtr texture, PVRTexLibAxis flipDirection) + { + var ___ret = __Internal.PVRTexLibFlipTexture(texture, flipDirection); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// X border + /// Y border + /// Z border + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Adds a user specified border to the texture. + public static bool PVRTexLibBorderTexture(__IntPtr texture, uint borderX, uint borderY, uint borderZ) + { + var ___ret = __Internal.PVRTexLibBorderTexture(texture, borderX, borderY, borderZ); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Pre-multiplies a texture's colours by its alpha values. + public static bool PVRTexLibPreMultiplyAlpha(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibPreMultiplyAlpha(texture); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Allows a texture's colours to run into any fully transparent areas. + public static bool PVRTexLibBleed(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibBleed(texture); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Number of channels to set + /// Channels to set + /// uint32 values to set channels to + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Sets the specified number of channels to values specified in pValues. + public static bool PVRTexLibSetTextureChannels(__IntPtr texture, uint numChannelSets, ref PVRTexLibChannelName channels, ref uint pValues) + { + fixed (PVRTexLibChannelName* __channels2 = &channels) + { + var __arg2 = __channels2; + fixed (uint* __pValues3 = &pValues) + { + var __arg3 = __pValues3; + var ___ret = __Internal.PVRTexLibSetTextureChannels(texture, numChannelSets, __arg2, __arg3); + return ___ret; + } + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Number of channels to set + /// Channels to set + /// float values to set channels to + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Sets the specified number of channels to values specified in float pValues. + public static bool PVRTexLibSetTextureChannelsFloat(__IntPtr texture, uint numChannelSets, ref PVRTexLibChannelName channels, ref float pValues) + { + fixed (PVRTexLibChannelName* __channels2 = &channels) + { + var __arg2 = __channels2; + fixed (float* __pValues3 = &pValues) + { + var __arg3 = __pValues3; + var ___ret = __Internal.PVRTexLibSetTextureChannelsFloat(texture, numChannelSets, __arg2, __arg3); + return ___ret; + } + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Number of channels to copy + /// Channels to set + /// Source channels to copy from + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Copies the specified channels from textureSource + /// into textureDestination. textureSource is not modified so it + /// is possible to use the same texture as both input and output. + /// When using the same texture as source and destination, channels + /// are preserved between swaps e.g. copying Red to Green and then + /// Green to Red will result in the two channels trading places + /// correctly. Channels in eChannels are set to the value of the channels + /// in eChannelSource. + /// + public static bool PVRTexLibCopyTextureChannels(__IntPtr textureDestination, __IntPtr textureSource, uint numChannelCopies, ref PVRTexLibChannelName destinationChannels, ref PVRTexLibChannelName sourceChannels) + { + fixed (PVRTexLibChannelName* __destinationChannels3 = &destinationChannels) + { + var __arg3 = __destinationChannels3; + fixed (PVRTexLibChannelName* __sourceChannels4 = &sourceChannels) + { + var __arg4 = __sourceChannels4; + var ___ret = __Internal.PVRTexLibCopyTextureChannels(textureDestination, textureSource, numChannelCopies, __arg3, __arg4); + return ___ret; + } + } + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Scale factor + /// Channel order + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Generates a Normal Map from a given height map. + /// Assumes the red channel has the height values. + /// By default outputs to red/green/blue = x/y/z, + /// this can be overridden by specifying a channel + /// order in channelOrder. The channels specified + /// will output to red/green/blue/alpha in that order. + /// So "xyzh" maps x to red, y to green, z to blue + /// and h to alpha. 'h' is used to specify that the + /// original height map data should be preserved in + /// the given channel. + /// + public static bool PVRTexLibGenerateNormalMap(__IntPtr texture, float fScale, string channelOrder) + { + var ___ret = __Internal.PVRTexLibGenerateNormalMap(texture, fScale, channelOrder); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Filter mode + /// + /// Number of levels of MIPMap chain to create. + /// Use PVRTEX_ALLMIPLEVELS to create a full mip chain. + /// + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Generates MIPMap chain for a texture. + public static bool PVRTexLibGenerateMIPMaps(__IntPtr texture, PVRTexLibResizeMode filterMode, int mipMapsToDo) + { + var ___ret = __Internal.PVRTexLibGenerateMIPMaps(texture, filterMode, mipMapsToDo); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Colours a texture's MIPMap levels with different colours + /// for debugging purposes. MIP levels are coloured in the + /// following repeating pattern: Red, Green, Blue, Cyan, + /// Magenta and Yellow + /// + public static bool PVRTexLibColourMIPMaps(__IntPtr texture) + { + var ___ret = __Internal.PVRTexLibColourMIPMaps(texture); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// struct containing transcoder options. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// Transcodes a texture from its original format into the specified format. + public static bool PVRTexLibTranscodeTexture(__IntPtr texture, PVRTexLibTranscoderOptions transcoderOptions) + { + if (ReferenceEquals(transcoderOptions, null)) + throw new global::System.ArgumentNullException("transcoderOptions", "Cannot be null because it is a C++ reference (&)."); + var __arg1 = transcoderOptions.__Instance; + var ___ret = __Internal.PVRTexLibTranscodeTexture(texture, __arg1); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// The maximum number of threads to use for decompression, + /// if set to 0 PVRTexLib will use all available cores. + /// + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// A convenience function to decompresses a texture into the most + /// appropriate format based on the textures 'compressed' format, + /// for example a PVRTC compressed texture may decompress to RGB888 + /// or RGBA8888. This function may also be used to 'decompress' + /// packed formats into something easier to manipulate for example + /// RGB565 will be decompressed to RGB888. + /// + public static bool PVRTexLibDecompress(__IntPtr texture, uint maxThreads) + { + var ___ret = __Internal.PVRTexLibDecompress(texture, maxThreads); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// Filtering mode to apply when sampling the source texture. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Creates a cubemap with six faces from an equirectangular + /// projected texture. The input must have an aspect ratio of 2:1, + /// i.e. the width must be exactly twice the height. + /// + public static bool PVRTexLibEquiRectToCubeMap(__IntPtr texture, PVRTexLibResizeMode filter) + { + var ___ret = __Internal.PVRTexLibEquiRectToCubeMap(texture, filter); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// The number of samples to use when generating + /// the diffuse map. + /// + /// Output dimensions, in pixels. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Generates a mipmapped diffuse irradiance texture from a cubemap + /// environment map, to be used primarily with physically based + /// rendering (PBR) techniques. + /// The input must be a cubemap, the width must equal height, + /// and the depth must equal 1. + /// + public static bool PVRTexLibGenerateDiffuseIrradianceCubeMap(__IntPtr texture, uint sampleCount, uint mapSize) + { + var ___ret = __Internal.PVRTexLibGenerateDiffuseIrradianceCubeMap(texture, sampleCount, mapSize); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// + /// The number of samples to use when generating + /// the specular map. + /// + /// Output dimensions, in pixels. + /// + /// The number of Mip levels to be discarded + /// from the bottom of the Mip chain. + /// + /// + /// False to include a roughness of zero + /// when generating the prefiltered environment map. + /// True to omit a rougness of zero, implying that the user + /// will supply roughness zero from the environment texture. + /// + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Generates a prefiltered specular irradiance texture from a + /// cubemap environment map, to be used primarily with physically + /// based rendering (PBR) techniques. + /// Each Mip level of the specular map is blurred by a roughness + /// value between 0 and 1. + /// The input must be a cubemap, the width must equal height, + /// and the depth must equal 1. + /// + public static bool PVRTexLibGeneratePreFilteredSpecularCubeMap(__IntPtr texture, uint sampleCount, uint mapSize, uint numMipLevelsToDiscard, bool zeroRoughnessIsExternal) + { + var ___ret = __Internal.PVRTexLibGeneratePreFilteredSpecularCubeMap(texture, sampleCount, mapSize, numMipLevelsToDiscard, zeroRoughnessIsExternal); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// The Mip to compare. + /// The array to compare. + /// The face to compare. + /// The Z slice to compare. + /// Structure containing the resulting values. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the maximum difference between two given input textures. + /// The MIPLevel, arrayMember, face and zSlice values determine which + /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice + /// should be valid in both input textures. Both textures must have the + /// same dimensions. The function will only compare common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be compared. + /// + public static bool PVRTexLibMaxDifference(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics) + { + var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance; + var ___ret = __Internal.PVRTexLibMaxDifference(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// The Mip to compare. + /// The array to compare. + /// The face to compare. + /// The Z slice to compare. + /// Structure containing the resulting values. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the mean error between two given input textures. + /// The MIPLevel, arrayMember, face and zSlice values determine which + /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice + /// should be valid in both input textures. Both textures must have the + /// same dimensions. The function will only compare common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be compared. + /// + public static bool PVRTexLibMeanError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics) + { + var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance; + var ___ret = __Internal.PVRTexLibMeanError(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// The Mip to compare. + /// The array to compare. + /// The face to compare. + /// The Z slice to compare. + /// Structure containing the resulting values. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the mean squared error (MSE) between two given input textures. + /// The MIPLevel, arrayMember, face and zSlice values determine which + /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice + /// should be valid in both input textures. Both textures must have the + /// same dimensions. The function will only compare common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be compared. + /// + public static bool PVRTexLibMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics) + { + var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance; + var ___ret = __Internal.PVRTexLibMeanSquaredError(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// The Mip to compare. + /// The array to compare. + /// The face to compare. + /// The Z slice to compare. + /// Structure containing the resulting values. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the root mean squared error (RMSE) between two given + /// input textures. + /// The MIPLevel, arrayMember, face and zSlice values determine which + /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice + /// should be valid in both input textures. Both textures must have the + /// same dimensions. The function will only compare common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be compared. + /// + public static bool PVRTexLibRootMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics) + { + var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance; + var ___ret = __Internal.PVRTexLibRootMeanSquaredError(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// The Mip to compare. + /// The array to compare. + /// The face to compare. + /// The Z slice to compare. + /// Structure containing the resulting values. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the standard deviation between two given input textures. + /// The MIPLevel, arrayMember, face and zSlice values determine which + /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice + /// should be valid in both input textures. Both textures must have the + /// same dimensions. The function will only compare common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be compared. + /// + public static bool PVRTexLibStandardDeviation(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics) + { + var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance; + var ___ret = __Internal.PVRTexLibStandardDeviation(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// The Mip to compare. + /// The array to compare. + /// The face to compare. + /// The Z slice to compare. + /// Structure containing the resulting values. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the PSNR between two given input textures. + /// The MIPLevel, arrayMember, face and zSlice values determine which + /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice + /// should be valid in both input textures. Both textures must have the + /// same dimensions. The function will only compare common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be compared. + /// + public static bool PVRTexLibPeakSignalToNoiseRatio(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics) + { + var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance; + var ___ret = __Internal.PVRTexLibPeakSignalToNoiseRatio(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// PVRTexLib_PVRTexture that will contain the result on success. + /// + /// The factor to multiply the deltas to highlight differences, + /// generally a value between 1 and 10. + /// + /// The clamping mode to use, currently supports absolute and signed. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the the [mode] delta per channel between two given + /// input textures. Both textures must have the same dimensions and + /// may not be compressed. The function will only compare common + /// channels i.e. if 'LHS' has RGB while 'RHS' has RGBA channels, + /// then only the RGB channels will be compared. + /// + public static bool PVRTexLibColourDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float multiplier, PVRTexLibColourDiffMode mode) + { + var ___ret = __Internal.PVRTexLibColourDiff(textureLHS, textureRHS, textureResult, multiplier, mode); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// PVRTexLib_PVRTexture that will contain the result on success. + /// The cut-off value to compare the pixel delta to. + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Computes the total absolute pixel difference between two given + /// input textures and modulates the output based on the tolerance + /// value supplied. Deltas of zero will appear black while pixels + /// with deltas greater than or equal to the threshold are set to + /// red and finally deltas less than the tolerance are set to blue. + /// Both textures must have the same dimensions and may not be + /// compressed. The function will only compare common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be compared. + /// + public static bool PVRTexLibToleranceDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float tolerance) + { + var ___ret = __Internal.PVRTexLibToleranceDiff(textureLHS, textureRHS, textureResult, tolerance); + return ___ret; + } + + /// *********************************************************************** + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// A handle to a previously allocated PVRTexLib_PVRTexture. + /// PVRTexLib_PVRTexture that will contain the result on success. + /// + /// The blend weight to use in the blend equation: + /// (LHS_delta * BF) + (RHS_delta * (1 - BF)). The value is clamped + /// between 0 and 1. + /// + /// + /// True if the method succeeds. + /// *********************************************************************** + /// + /// + /// Blend each channel of the input textures using the blend factor + /// as a weighting of the first texture against the second. + /// Both textures must have the same dimensions and may not be + /// compressed. The function will only blend common channels i.e. + /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB + /// channels will be blended. + /// + public static bool PVRTexLibBlendDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float blendFactor) + { + var ___ret = __Internal.PVRTexLibBlendDiff(textureLHS, textureRHS, textureResult, blendFactor); + return ___ret; + } + } + + namespace Delegates + { + [SuppressUnmanagedCodeSecurity, UnmanagedFunctionPointer(__CallingConvention.Cdecl)] + public unsafe delegate __IntPtr Func___IntPtr_ulong(ulong allocSize); + + [SuppressUnmanagedCodeSecurity, UnmanagedFunctionPointer(__CallingConvention.Cdecl)] + public unsafe delegate __IntPtr Func___IntPtr_uint(uint allocSize); + + [SuppressUnmanagedCodeSecurity, UnmanagedFunctionPointer(__CallingConvention.Cdecl)] + public unsafe delegate byte* Func_bytePtr___IntPtr_ulong(__IntPtr privateData, ulong allocSize); + } +} diff --git a/ABStudio/FileFormats/ZSTREAM/ZSTREAMFile.cs b/ABStudio/FileFormats/ZSTREAM/ZSTREAMFile.cs new file mode 100644 index 0000000..7058dfa --- /dev/null +++ b/ABStudio/FileFormats/ZSTREAM/ZSTREAMFile.cs @@ -0,0 +1,760 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Microsoft.VisualBasic; +using Newtonsoft.Json.Linq; +using ABStudio.FileFormats.DAT; +using ABStudio.FileFormats.PVR; +using ABStudio.Forms; +using SevenZip; +using SevenZip.Compression.LZMA; + +namespace ABStudio.FileFormats.ZSTREAM +{ + public class ZSTREAMFile + { + public DATFile associatedDAT = null; + public DATFile.SpriteData associatedSD = null; + + bool noInit = false; + int atlas = -1; + string encKey = ""; + bool wasLZMA = false; + + Meta meta = new Meta(); + + class Meta + { + public string app = ""; + public string format = ""; + public string image = ""; + public int sizeW = -1, sizeH = -1, scale = -1; + public string version = ""; + } + + List placementInfos = new List(); + + class PlacementInfo + { + public int x = -1; + public int y = -1; + public int w = -1; + public int h = -1; + public int position = -1; + public int length = -1; + } + + static string[] keyList = new string[] + { + "55534361505170413454534E56784D49317639534B39554330795A75416E6232", // Classic + "7A65506865737435666151755832533241707265403472654368417445765574", // Seasons + "55534361505170413454534E56784D49317639534B39554330795A75416E6232", // Rio + "526D67645A304A656E4C466757776B5976434C326C5361684662456846656334", // Space + "416E3874336D6E38553673706951307A4848723361316C6F44725261336D7445", // Star Wars + "4230706D3354416C7A6B4E3967687A6F65324E697A456C6C50644E3068516E69", // Star Wars II + "454A52626357683831594734597A6A664C41504D7373416E6E7A785161446E31" // Friends + }; + + static string[] keyNames = new string[] + { + "Classic", + "Seasons", + "Rio", + "Space", + "Star Wars", + "Star Wars II", + "Friends", + }; + + public ZSTREAMFile() + { + this.noInit = true; + } + + public ZSTREAMFile(string filename) : this(File.ReadAllBytes(filename)) { } + + public ZSTREAMFile(byte[] zstreamData) + { + if (zstreamData[0] != '{') + { + bool isLZMA = zstreamData[1] == 'L' && zstreamData[2] == 'Z' && zstreamData[3] == 'M' && zstreamData[4] == 'A'; + + if(!isLZMA) + { + for (int i = 0; i < keyList.Length; i++) + { + try + { + byte[] decoded = Decrypt(zstreamData, keyList[i]); + if (decoded != null) + { + zstreamData = decoded; + encKey = keyList[i]; + break; + } + } + catch (Exception) { } + } + + if(encKey == "") + throw new Exception("Couldn't decrypt encrypted file. It might have been encrypted with an unknown key, or its content is invalid."); + + isLZMA = zstreamData[1] == 'L' && zstreamData[2] == 'Z' && zstreamData[3] == 'M' && zstreamData[4] == 'A'; + } + + + if(isLZMA) + { + this.wasLZMA = true; + + SevenZip.Compression.LZMA.Decoder lzmaDecoder = new SevenZip.Compression.LZMA.Decoder(); + + MemoryStream msIn = new MemoryStream(zstreamData.Skip(9).ToArray()); + using (MemoryStream msOut = new MemoryStream()) + { + // Read the decoder properties + byte[] properties = new byte[5]; + msIn.Read(properties, 0, 5); + + + // Read in the decompress file size. + byte[] fileLengthBytes = new byte[8]; + msIn.Read(fileLengthBytes, 0, 8); + long fileLength = BitConverter.ToInt64(fileLengthBytes, 0); + + lzmaDecoder.SetDecoderProperties(properties); + lzmaDecoder.Code(msIn, msOut, msIn.Length, fileLength, null); + + msIn.Close(); + + zstreamData = msOut.ToArray(); + } + } + } + + JObject jo = JObject.Parse(Encoding.UTF8.GetString(zstreamData)); + JToken root = jo.Root; + + + JToken meta = root.SelectToken("meta"); + this.meta.app = meta.SelectToken("app").ToObject(); + this.meta.format = meta.SelectToken("format").ToObject(); + this.meta.image = meta.SelectToken("image").ToObject(); + this.meta.version = meta.SelectToken("version").ToObject(); + + JToken metaSize = meta.SelectToken("size"); + this.meta.sizeW = metaSize.SelectToken("w").ToObject(); + this.meta.sizeH = metaSize.SelectToken("h").ToObject(); + this.meta.scale = metaSize.SelectToken("scale").ToObject(); + + DATFile dat = DATFile.NewSpriteData(); + DATFile.SpriteData spriteData = dat.GetAsSpriteData(); + spriteData.associatedZSTREAM = this; + + spriteData.filenames.Add(this.meta.image); + + JToken frames = root.SelectToken("frames"); + foreach (JToken frame in frames.Children()) + { + DATFile.SpriteData.Sprite sprite = new DATFile.SpriteData.Sprite(); + + sprite.name = frame.SelectToken("filename").ToObject(); + + JToken pivot = frame.SelectToken("pivot"); + sprite.orig = new Point( + pivot.SelectToken("x").ToObject(), + pivot.SelectToken("y").ToObject()); + + JToken fframe = frame.SelectToken("frame"); + sprite.rect = new Rectangle( + fframe.SelectToken("x").ToObject(), + fframe.SelectToken("y").ToObject(), + fframe.SelectToken("w").ToObject(), + fframe.SelectToken("h").ToObject()); + + JToken stream = frame.SelectToken("stream"); + if (stream != null) { + if(stream.SelectToken("atlas") != null) + this.atlas = stream.SelectToken("atlas").ToObject(); + + PlacementInfo pInfo = new PlacementInfo(); + pInfo.x = sprite.rect.X; + pInfo.y = sprite.rect.Y; + pInfo.w = stream.SelectToken("width").ToObject(); + pInfo.h = stream.SelectToken("height").ToObject(); + pInfo.position = stream.SelectToken("position").ToObject(); + pInfo.length = stream.SelectToken("length").ToObject(); + + placementInfos.Add(pInfo); + + int xDisp = (pInfo.w - sprite.rect.Width) / 2; + int yDisp = (pInfo.h - sprite.rect.Height) / 2; + + sprite.rect.X += xDisp; + sprite.rect.Y += yDisp; + } + + + + spriteData.sprites.Add(sprite); + } + + associatedDAT = dat; + associatedSD = spriteData; + } + + public void UpdateBitmap(Bitmap bmp, string filename) + { + this.meta.image = filename; + this.meta.sizeW = bmp.Width; + this.meta.sizeH = bmp.Height; + } + + public Bitmap GetBitmap(string path) + { + byte[] rawData = null; + + try + { + rawData = File.ReadAllBytes(path); + } + catch(Exception) + { + try + { + rawData = File.ReadAllBytes(path + ".7z"); + } + catch (Exception) + { + throw new Exception("Couldn't read find file \"" + path + "\""); + } + } + + if(rawData[0] == '7' && rawData[1] == 'z') + { + using (MemoryStream outMS = new MemoryStream()) + { + using (MemoryStream inMS = new MemoryStream(rawData)) + { + using (Aspose.Zip.SevenZip.SevenZipArchive archive = new Aspose.Zip.SevenZip.SevenZipArchive(inMS)) + { + foreach(Aspose.Zip.SevenZip.SevenZipArchiveEntry v in archive.Entries) + { + v.Extract(outMS); + break; + } + } + } + + rawData = outMS.ToArray(); + } + } + + Bitmap bmp = new Bitmap(this.meta.sizeW, this.meta.sizeH); + + using(Graphics g = Graphics.FromImage(bmp)) + { + int numimg = 0; + foreach (PlacementInfo pInfo in placementInfos) + { + byte[] streamData = rawData.Skip(pInfo.position).Take(pInfo.length + 0x28).ToArray(); + + byte[] pvrVer = new byte[streamData.Length + 0xC]; + pvrVer[0] = (byte)'P'; + pvrVer[1] = (byte)'V'; + pvrVer[2] = (byte)'R'; + pvrVer[3] = 3; + + pvrVer[4] = 0; + pvrVer[5] = 0; + pvrVer[6] = 0; + pvrVer[7] = 0; + + string fmt = ""; + int n = 0x20; + while (streamData[n] != 0 || n == 0x28) { + fmt += (char)streamData[n]; + n++; + } + int half = fmt.Length / 2; + fmt = fmt.ToLower(); + + byte ch1 = (byte)((0 < half) ? fmt[0] : 0); + byte ch2 = (byte)((1 < half) ? fmt[1] : 0); + byte ch3 = (byte)((2 < half) ? fmt[2] : 0); + byte ch4 = (byte)((3 < half) ? fmt[3] : 0); + byte va1 = (byte)Convert.ToInt32(new string(new char[] { ((half < fmt.Length) ? fmt[half] : '0') })); + byte va2 = (byte)Convert.ToInt32(new string(new char[] { (((half + 1) < fmt.Length) ? fmt[half + 1] : '0') })); + byte va3 = (byte)Convert.ToInt32(new string(new char[] { (((half + 2) < fmt.Length) ? fmt[half + 2] : '0') })); + byte va4 = (byte)Convert.ToInt32(new string(new char[] { (((half + 3) < fmt.Length) ? fmt[half + 3] : '0')})); + + pvrVer[8] = ch1; + pvrVer[9] = ch2; + pvrVer[0xA] = ch3; + pvrVer[0xB] = ch4; + + pvrVer[0xC] = va1; + pvrVer[0xD] = va2; + pvrVer[0xE] = va3; + pvrVer[0xF] = va4; + + pvrVer[0x10] = 0; + pvrVer[0x11] = 0; + pvrVer[0x12] = 0; + pvrVer[0x13] = 0; + + pvrVer[0x14] = 4; + pvrVer[0x15] = 0; + pvrVer[0x16] = 0; + pvrVer[0x17] = 0; + + pvrVer[0x18] = streamData[9]; + pvrVer[0x19] = streamData[8]; + pvrVer[0x1A] = 0; + pvrVer[0x1B] = 0; + + pvrVer[0x1C] = streamData[7]; + pvrVer[0x1D] = streamData[6]; + pvrVer[0x1E] = 0; + pvrVer[0x1F] = 0; + + pvrVer[0x20] = 1; + pvrVer[0x21] = 0; + pvrVer[0x22] = 0; + pvrVer[0x23] = 0; + + pvrVer[0x24] = 1; + pvrVer[0x25] = 0; + pvrVer[0x26] = 0; + pvrVer[0x27] = 0; + + pvrVer[0x28] = 1; + pvrVer[0x29] = 0; + pvrVer[0x2A] = 0; + pvrVer[0x2B] = 0; + + pvrVer[0x2C] = 1; + pvrVer[0x2D] = 0; + pvrVer[0x2E] = 0; + pvrVer[0x2F] = 0; + + pvrVer[0x30] = 0; + pvrVer[0x31] = 0; + pvrVer[0x32] = 0; + pvrVer[0x33] = 0; + + for(int i = 0x28; i < streamData.Length; i++) + { + pvrVer[i + 0xC] = streamData[i]; + } + + PVRFile pvr = new PVRFile(pvrVer); + Bitmap subBmp = pvr.AsBitmap(); + + g.DrawImage(subBmp, new Point(pInfo.x, pInfo.y)); + } + } + + return bmp; + } + + public void SaveBitmap(Bitmap bmp, string path) + { + if (noInit) + if (!AskForInfo()) + throw new Exception("Can't proceed without ZSTREAM information"); + + int pos = 0; + byte[] outBytes = new byte[placementInfos.Last().position + placementInfos.Last().length + 0x28]; + + string fmt = this.meta.format.ToLower(); + int half = fmt.Length / 2; + + char ch1 = (char)((0 < half) ? fmt[0] : 0); + char ch2 = (char)((1 < half) ? fmt[1] : 0); + char ch3 = (char)((2 < half) ? fmt[2] : 0); + char ch4 = (char)((3 < half) ? fmt[3] : 0); + char va1 = (char)((half < fmt.Length) ? fmt[half] : 0); + char va2 = (char)(((half + 1) < fmt.Length) ? fmt[half + 1] : 0); + char va3 = (char)(((half + 2) < fmt.Length) ? fmt[half + 2] : 0); + char va4 = (char)(((half + 3) < fmt.Length) ? fmt[half + 3] : 0); + + fmt = new string(new char[] { ch1, va1, ch2, va2, ch3, va3, ch4, va4 }); + + foreach (PlacementInfo pInfo in placementInfos) + { + Bitmap subbmp = bmp.Clone(new Rectangle(pInfo.x, pInfo.y, pInfo.w, pInfo.h), bmp.PixelFormat); + + PVRFile pvr = new PVRFile(subbmp, fmt); + byte[] asData = pvr.Save().Skip(0x44).ToArray(); + byte[] header = new byte[0x28]; + + subbmp.Dispose(); + + int fullLen = pInfo.length + 0x28; + + header[0] = (byte)((fullLen >> 24) & 0xFF); + header[1] = (byte)((fullLen >> 16) & 0xFF); + header[2] = (byte)((fullLen >> 8) & 0xFF); + header[3] = (byte)(fullLen & 0xFF); + + header[4] = 0; + header[5] = 0x28; + + header[6] = (byte)((pInfo.w >> 8) & 0xFF); + header[7] = (byte)(pInfo.w & 0xFF); + + header[8] = (byte)((pInfo.h >> 8) & 0xFF); + header[9] = (byte)(pInfo.h & 0xFF); + + header[0xA] = (byte)((this.atlas >> 8) & 0xFF); + header[0xB] = (byte)(this.atlas & 0xFF); + + header[0xC] = 0; + header[0xD] = 0; + header[0xE] = 0; + header[0xF] = 0; + header[0x10] = 0; + header[0x11] = 0; + header[0x12] = 0; + header[0x13] = 0; + header[0x14] = 0; + header[0x15] = 0; + header[0x16] = 0; + header[0x17] = 0; + + header[0x18] = 0; + header[0x19] = 1; + header[0x1A] = 0; + header[0x1B] = 1; + header[0x1C] = 0; + header[0x1D] = 1; + header[0x1E] = 0; + header[0x1F] = 1; + + int fmtLen = this.meta.format.Length; + header[0x20] = (byte)((0 < fmtLen) ? this.meta.format[0] : 0); + header[0x21] = (byte)((1 < fmtLen) ? this.meta.format[1] : 0); + header[0x22] = (byte)((2 < fmtLen) ? this.meta.format[2] : 0); + header[0x23] = (byte)((3 < fmtLen) ? this.meta.format[3] : 0); + header[0x24] = (byte)((4 < fmtLen) ? this.meta.format[4] : 0); + header[0x25] = (byte)((5 < fmtLen) ? this.meta.format[5] : 0); + header[0x26] = (byte)((6 < fmtLen) ? this.meta.format[6] : 0); + header[0x27] = (byte)((7 < fmtLen) ? this.meta.format[7] : 0); + + foreach (byte b in header) + outBytes[pos++] = b; + + foreach (byte b in asData) + outBytes[pos++] = b; + } + + using (MemoryStream outMS = new MemoryStream()) + { + using (MemoryStream inMS = new MemoryStream(outBytes)) + { + using (Aspose.Zip.SevenZip.SevenZipArchive archive = new Aspose.Zip.SevenZip.SevenZipArchive()) + { + archive.CreateEntry(Path.GetFileNameWithoutExtension(path) + ".zstream", inMS); + + archive.Save(outMS); + } + } + + outBytes = outMS.ToArray(); + } + + + File.WriteAllBytes(path + ".7z", outBytes); + } + + private bool AskForInfo() + { + string[] apps = new string[] { "ArtPacker", "Adobe" }; + using (MCQAskForm mcqAskForm = new MCQAskForm(apps, "JSON creation app")) + { + if (mcqAskForm.ShowDialog() == DialogResult.OK) + { + meta.app = apps[mcqAskForm.ChosenAnswer]; + } + else return false; + } + + string[] versions = new string[] { "2.4.19" }; + using (MCQAskForm mcqAskForm = new MCQAskForm(versions, "JSON creation app version")) + { + if (mcqAskForm.ShowDialog() == DialogResult.OK) + { + meta.version = versions[mcqAskForm.ChosenAnswer]; + } + else return false; + } + + string[] formats = new string[] { "RGBA4444", "RGBA8888", "RGB565" }; + using (MCQAskForm mcqAskForm = new MCQAskForm(formats, "JSON image format")) + { + if (mcqAskForm.ShowDialog() == DialogResult.OK) + { + meta.format = formats[mcqAskForm.ChosenAnswer]; + } + else return false; + } + + string[] encryptions = (new string[] { "None" }).Concat(keyNames).Concat(new string[] { "Custom" }).ToArray(); + using (ComboAskForm comboAskForm = new ComboAskForm(encryptions, "JSON encryption")) + { + if (comboAskForm.ShowDialog() == DialogResult.OK) + { + if (comboAskForm.ComboIndex > 0 && comboAskForm.ComboIndex < encryptions.Length - 1) + this.encKey = keyList[comboAskForm.ComboIndex - 1]; + else if (comboAskForm.ComboIndex == encryptions.Length - 1) + { + string answer = Interaction.InputBox("Custom key:", "Enter a custom key"); + this.encKey = answer; + } + else + this.encKey = ""; + } + else return false; + } + + string[] lzmas = new string[] { "Yes", "No" }; + using (MCQAskForm mcqAskForm = new MCQAskForm(lzmas, "JSON LZMA Compression?")) + { + if (mcqAskForm.ShowDialog() == DialogResult.OK) + { + this.wasLZMA = (mcqAskForm.ChosenAnswer == 0) ? true : false; + } + else return false; + } + + using (NumUpDownAskForm numUpDownAskForm = new NumUpDownAskForm(0, 0, 255, 1)) + { + numUpDownAskForm.Title = "Atlas ID"; + if (numUpDownAskForm.ShowDialog() == DialogResult.OK) + { + this.atlas = (int)numUpDownAskForm.NumValue; + } + else return false; + } + + this.noInit = false; + return true; + } + + public byte[] Save() + { + if (noInit) + if (!AskForInfo()) + throw new Exception("Can't proceed without ZSTREAM information"); + + JObject root = new JObject(); + + int position = 0; + this.placementInfos.Clear(); + + JArray jframes = new JArray(); + foreach(DATFile.SpriteData.Sprite sprite in associatedSD.sprites) + { + JObject jframeentry = new JObject(); + + JArray jextrude = new JArray(); + jextrude.Add(0); + jextrude.Add(0); + jextrude.Add(0); + jextrude.Add(0); + jframeentry.Add("extrude", jextrude); + + jframeentry.Add("filename", sprite.name); + + JObject jframe = new JObject(); + int xPad = (sprite.rect.X <= 0) ? 0 : 1; + int yPad = (sprite.rect.Y <= 0) ? 0 : 1; + jframe.Add("h", sprite.rect.Height); + jframe.Add("w", sprite.rect.Width); + jframe.Add("x", sprite.rect.X - xPad); + jframe.Add("y", sprite.rect.Y - yPad); + jframeentry.Add("frame", jframe); + + JObject jpivot = new JObject(); + jpivot.Add("x", sprite.orig.X); + jpivot.Add("y", sprite.orig.Y); + jframeentry.Add("pivot", jpivot); + + jframeentry.Add("rotated", false); + + JObject jstream = new JObject(); + int wPad = xPad + (((sprite.rect.X + sprite.rect.Width) >= this.meta.sizeW) ? 0 : 1); + int hPad = yPad + (((sprite.rect.Y + sprite.rect.Height) >= this.meta.sizeH) ? 0 : 1); + + int fmtBitsSum = 0; + for (int i = (this.meta.format.Length / 2); i < this.meta.format.Length; i++) + fmtBitsSum += Convert.ToInt32(this.meta.format[i].ToString()); + int length = fmtBitsSum * ((sprite.rect.Width + wPad) * (sprite.rect.Height + hPad)) / 8; + + jstream.Add("atlas", this.atlas); + jstream.Add("height", sprite.rect.Height + hPad); + jstream.Add("length", length); + jstream.Add("position", position); + jstream.Add("width", sprite.rect.Width + wPad); + jframeentry.Add("stream", jstream); + + PlacementInfo pInfo = new PlacementInfo(); + pInfo.x = sprite.rect.X - xPad; + pInfo.y = sprite.rect.Y - yPad; + pInfo.w = sprite.rect.Width + wPad; + pInfo.h = sprite.rect.Height + hPad; + pInfo.position = position; + pInfo.length = length; + placementInfos.Add(pInfo); + + position += 0x28 + length; + + jframes.Add(jframeentry); + } + root.Add("frames", jframes); + + JObject jmeta = new JObject(); + jmeta.Add("app", this.meta.app); + jmeta.Add("format", this.meta.format); + jmeta.Add("image", this.meta.image); + + JObject jsize = new JObject(); + jsize.Add("h", this.meta.sizeH); + jsize.Add("scale", this.meta.scale); + jsize.Add("w", this.meta.sizeW); + jmeta.Add("size", jsize); + + jmeta.Add("version", this.meta.version); + + root.Add("meta", jmeta); + + + byte[] outBytes = Encoding.UTF8.GetBytes(root.ToString(Newtonsoft.Json.Formatting.None)); + + if (wasLZMA) + { + SevenZip.Compression.LZMA.Encoder lzmaEncoder = new SevenZip.Compression.LZMA.Encoder(); + + CoderPropID[] propIDs = + { + CoderPropID.Algorithm + }; + + object[] properties = + { + (System.Int32)(1) + }; + + lzmaEncoder.SetCoderProperties(propIDs, properties); + + MemoryStream msIn = new MemoryStream(outBytes); + using (MemoryStream msOut = new MemoryStream()) + { + lzmaEncoder.Code(msIn, msOut, msIn.Length, -1, null); + + msIn.Close(); + + UInt64 tLen = (UInt64)outBytes.Length; + + byte[] header = new byte[] { 0x89, 0x4C, 0x5A, 0x4D, 0x41, 0x0D, 0x0A, 0x1A, 0x0A, + 0x5D, 0x00, 0x00, 0x01, 0x00, + (byte)(tLen & 0xFF), + (byte)((tLen >> 8) & 0xFF), + (byte)((tLen >> 16) & 0xFF), + (byte)((tLen >> 24) & 0xFF), + (byte)((tLen >> 32) & 0xFF), + (byte)((tLen >> 40) & 0xFF), + (byte)((tLen >> 48) & 0xFF), + (byte)((tLen >> 52) & 0xFF) + }; + + outBytes = header.Concat(msOut.ToArray()).ToArray(); + } + } + + if (encKey != "") + { + try + { + outBytes = Encrypt(outBytes, encKey); + } + catch (Exception) { + throw new Exception("Couldn't encrypt file."); + } + } + + return outBytes; + } + + + public static byte[] Decrypt(byte[] cipherData, string keyString) + { + byte[] key = new byte[32]; + for (int i = 0; i < keyString.Length; i += 2) + key[i / 2] = Convert.ToByte(keyString.Substring(i, 2), 16); + + byte[] iv = new byte[16]; + + try + { + using (var rijndaelManaged = + new RijndaelManaged { Key = key, IV = iv, Mode = CipherMode.CBC }) + using (var memoryStream = + new MemoryStream(cipherData)) + using (var cryptoStream = + new CryptoStream(memoryStream, + rijndaelManaged.CreateDecryptor(key, iv), + CryptoStreamMode.Read)) + using (var memoryStream2 = + new MemoryStream()) + { + (new StreamReader(cryptoStream)).BaseStream.CopyTo(memoryStream2); + return memoryStream2.ToArray(); + } + } + catch (CryptographicException e) + { + Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); + return null; + } + } + public static byte[] Encrypt(byte[] cipherData, string keyString) + { + byte[] key = new byte[32]; + for (int i = 0; i < keyString.Length; i += 2) + key[i / 2] = Convert.ToByte(keyString.Substring(i, 2), 16); + + byte[] iv = new byte[16]; + + try + { + using (var rijndaelManaged = + new RijndaelManaged { Key = key, IV = iv, Mode = CipherMode.CBC }) + using (var memoryStream = + new MemoryStream(cipherData)) + using (var cryptoStream = + new CryptoStream(memoryStream, + rijndaelManaged.CreateEncryptor(key, iv), + CryptoStreamMode.Read)) + using (var memoryStream2 = + new MemoryStream()) + { + (new StreamReader(cryptoStream)).BaseStream.CopyTo(memoryStream2); + return memoryStream2.ToArray(); + } + } + catch (CryptographicException e) + { + Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); + return null; + } + } + } +} diff --git a/ABStudio/Forms/ComboAskForm.Designer.cs b/ABStudio/Forms/ComboAskForm.Designer.cs new file mode 100644 index 0000000..9a664af --- /dev/null +++ b/ABStudio/Forms/ComboAskForm.Designer.cs @@ -0,0 +1,79 @@ + +namespace ABStudio.Forms +{ + partial class ComboAskForm + { + /// + /// 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.questionComboBox = new System.Windows.Forms.ComboBox(); + this.okButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // questionComboBox + // + this.questionComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.questionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.questionComboBox.FormattingEnabled = true; + this.questionComboBox.Location = new System.Drawing.Point(12, 12); + this.questionComboBox.Name = "questionComboBox"; + this.questionComboBox.Size = new System.Drawing.Size(317, 21); + this.questionComboBox.TabIndex = 0; + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(131, 39); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + // + // ComboAskForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(341, 74); + this.Controls.Add(this.okButton); + this.Controls.Add(this.questionComboBox); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ComboAskForm"; + this.ShowIcon = false; + this.Text = "Question"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ComboBox questionComboBox; + private System.Windows.Forms.Button okButton; + } +} \ No newline at end of file diff --git a/ABStudio/Forms/ComboAskForm.cs b/ABStudio/Forms/ComboAskForm.cs new file mode 100644 index 0000000..5e7a860 --- /dev/null +++ b/ABStudio/Forms/ComboAskForm.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ABStudio.Forms +{ + public partial class ComboAskForm : Form + { + public int ComboIndex + { + get => questionComboBox.SelectedIndex; + set => questionComboBox.SelectedIndex = value; + } + + public ComboAskForm(string[] coll, string question) + { + InitializeComponent(); + + this.Text = question; + int winSize = TextRenderer.MeasureText(question, this.Font).Width + 97; + + questionComboBox.Items.Clear(); + for (int i = 0; i < coll.Length; i++) + { + questionComboBox.Items.Add(coll[i]); + int maybeWinSize = TextRenderer.MeasureText(coll[i], questionComboBox.Font).Width + 66; + if (maybeWinSize > winSize) + winSize = maybeWinSize; + } + + if (questionComboBox.Items.Count > 0) + questionComboBox.SelectedIndex = 0; + + this.Width = winSize; + okButton.Location = new Point(winSize / 2 - okButton.Width / 2, okButton.Location.Y); + } + } +} diff --git a/ABStudio/Forms/ComboAskForm.resx b/ABStudio/Forms/ComboAskForm.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/ABStudio/Forms/ComboAskForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ABStudio/Forms/MCQAskForm.Designer.cs b/ABStudio/Forms/MCQAskForm.Designer.cs new file mode 100644 index 0000000..e4493ce --- /dev/null +++ b/ABStudio/Forms/MCQAskForm.Designer.cs @@ -0,0 +1,51 @@ + +namespace ABStudio.Forms +{ + partial class MCQAskForm + { + /// + /// 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.SuspendLayout(); + // + // MCQAskForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(441, 47); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "MCQAskForm"; + this.ShowIcon = false; + this.Text = "Question"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/ABStudio/Forms/MCQAskForm.cs b/ABStudio/Forms/MCQAskForm.cs new file mode 100644 index 0000000..b3b74d3 --- /dev/null +++ b/ABStudio/Forms/MCQAskForm.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ABStudio.Forms +{ + public partial class MCQAskForm : Form + { + public int ChosenAnswer => chosenAnswer; + + private int chosenAnswer; + + public MCQAskForm(string[] answers, string question) + { + InitializeComponent(); + + this.Text = question; + int winSize = TextRenderer.MeasureText(question, this.Font).Width + 97; + + int currX = 12; + for (int i = 0; i < answers.Length; i++) + { + Button btn = new Button(); + btn.Location = new Point(currX, 12); + btn.Text = answers[i]; + btn.Tag = i; + + btn.Width = TextRenderer.MeasureText(answers[i], btn.Font).Width + 38; + currX += btn.Width + 6; + + btn.Click += new EventHandler(this.answerButton_Click); + this.Controls.Add(btn); + } + + this.Width = Math.Max(winSize, currX + 22); + } + + private void answerButton_Click(object sender, EventArgs e) + { + this.chosenAnswer = (int)((sender as Button).Tag); + this.DialogResult = DialogResult.OK; + } + } +} diff --git a/ABStudio/Forms/MCQAskForm.resx b/ABStudio/Forms/MCQAskForm.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/ABStudio/Forms/MCQAskForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ABStudio/Forms/Main.Designer.cs b/ABStudio/Forms/Main.Designer.cs new file mode 100644 index 0000000..d3efb58 --- /dev/null +++ b/ABStudio/Forms/Main.Designer.cs @@ -0,0 +1,127 @@ + +namespace ABStudio.Forms +{ + partial class Main + { + /// + /// Variable nécessaire au concepteur. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Nettoyage des ressources utilisées. + /// + /// true si les ressources managées doivent être supprimées ; sinon, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Code généré par le Concepteur Windows Form + + /// + /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas + /// le contenu de cette méthode avec l'éditeur de code. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); + this.menuStrip = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openButton = new System.Windows.Forms.Button(); + this.newButton = new System.Windows.Forms.Button(); + this.menuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip + // + this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(0, 0); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(320, 24); + this.menuStrip.TabIndex = 0; + this.menuStrip.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.newToolStripMenuItem.Text = "New"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.openToolStripMenuItem.Text = "Open..."; + this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); + // + // openButton + // + this.openButton.Location = new System.Drawing.Point(163, 27); + this.openButton.Name = "openButton"; + this.openButton.Size = new System.Drawing.Size(145, 23); + this.openButton.TabIndex = 1; + this.openButton.Text = "Open..."; + this.openButton.UseVisualStyleBackColor = true; + this.openButton.Click += new System.EventHandler(this.openToolStripMenuItem_Click); + // + // newButton + // + this.newButton.Location = new System.Drawing.Point(12, 27); + this.newButton.Name = "newButton"; + this.newButton.Size = new System.Drawing.Size(145, 23); + this.newButton.TabIndex = 2; + this.newButton.Text = "New"; + this.newButton.UseVisualStyleBackColor = true; + this.newButton.Click += new System.EventHandler(this.newButton_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(320, 62); + this.Controls.Add(this.newButton); + this.Controls.Add(this.openButton); + this.Controls.Add(this.menuStrip); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip; + this.Name = "Main"; + this.Text = "AB Classic Studio"; + this.Load += new System.EventHandler(this.Main_Load); + this.Resize += new System.EventHandler(this.Main_Resize); + this.menuStrip.ResumeLayout(false); + this.menuStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.Button openButton; + private System.Windows.Forms.Button newButton; + } +} + diff --git a/ABStudio/Forms/Main.cs b/ABStudio/Forms/Main.cs new file mode 100644 index 0000000..3c64650 --- /dev/null +++ b/ABStudio/Forms/Main.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ABStudio.FileFormats.DAT; +using ABStudio.Misc; + +namespace ABStudio.Forms +{ + public partial class Main : Form + { + public Main() + { + InitializeComponent(); + } + + + private void Main_Load(object sender, EventArgs e) + { + Main_Resize(sender, e); + + foreach(string displayName in Common.DisplayNames) + { + ToolStripMenuItem item = new ToolStripMenuItem(displayName); + item.Name = "new" + displayName + "ToolStripMenuItem"; + item.Click += new System.EventHandler(newFileToolStripMenuItem_Click); + + newToolStripMenuItem.DropDownItems.Add(item); + } + } + + private void Main_Resize(object sender, EventArgs e) + { + int wPerButton = (this.Size.Width - 46) / 2; + int hPerButton = this.Size.Height - 78; + newButton.Size = new Size(wPerButton, hPerButton); + openButton.Location = new Point(this.Size.Width - wPerButton - 28, openButton.Location.Y); + openButton.Size = new Size(wPerButton, hPerButton); + } + + private void newFileToolStripMenuItem_Click(object sender, EventArgs e) + { + string fullName = (sender as ToolStripMenuItem).Name; + string displayName = fullName.Substring(3, fullName.Length - 20); + + DATFile file = Common.MakeNew(displayName); + + if (file != null) + Common.OpenEditor("", file); + } + + private void newButton_Click(object sender, EventArgs e) + { + DATFile file = Common.AskForNew(); + + if (file != null) + Common.OpenEditor("", file); + } + + private void openToolStripMenuItem_Click(object sender, EventArgs e) => Common.OpenFileInNewEditor(); + } +} diff --git a/ABStudio/Forms/Main.resx b/ABStudio/Forms/Main.resx new file mode 100644 index 0000000..388a8e0 --- /dev/null +++ b/ABStudio/Forms/Main.resx @@ -0,0 +1,3288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + XPLJr9wrL/nB+6KB11eVJxUqAha60boTrhBEIsAHRJwALzNFIE83wNCTUUhaEBKCUI3AFYK09ABwG2Uh + YgD4ZABCpBHweyGiZcJzEOWAriO8/iREuHS73eeM0P6FjoN/rNJID7jHPkF8JT1gz2E24rvkT6vuh8if + UeEHbDtV4udNfoYGyAzyMyLiA5ZvCfJbAYjIbzmbjfyDbtiM/j9M0fvZf+B9HAAAAABJRU5ErkJggigA + AACAAAAAAAEAAAEAIAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAHe5v/B3uc/wd8nf8HfZ7/B32f/wh+ + oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqErP8Kha3/Coau/wuG + r/8Lh7D/C4ix/wuIsv8LibP/DIq0/wyKtf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nuv8Njrv/DY68/w2O + vf8Oj77/DpC+/w6Qv/8OkMD/DpDA/w6Rwf8OkcL/D5LC/w+Sw/8PksP/D5LE/w+SxP8Pk8X/D5PF/w+U + xv8PlMb/D5TG/w+Ux/8PlMf/D5TH/w+Ux/8Qlcj/EJXI/xCVyP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCV + yP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCUx/8PlMf/D5TH/w+Ux/8Pk8b/D5TG/w+Uxv8Pk8X/D5PF/w+T + xf8PksT/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkcH/DpDA/w6QwP8OkL//Do++/w6Pvf8Njr3/DY68/w2N + u/8Njbr/DY25/w2MuP8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIs/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqE + rf8KhKz/CoSr/wqDqv8Jg6n/CYOo/wmCp/8Jgqb/CYGk/wiAo/8If6L/CH6h/wh+oP8Ifp//B32e/wd8 + nf8He5z/B3ub/wd7nP8HfJ3/B32e/wd9n/8IfqD/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgab/CYKn/wmD + qP8Kg6n/CoSq/wqFrP8Kha3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyKtf8Mirb/DIu3/wyL + uP8NjLn/DY26/w2Nuv8Njrv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8OkcL/D5LD/w+S + w/8PksT/D5PF/w+Txf8PlMb/D5TG/w+Uxv8PlMf/D5TH/xCVyP8QlMj/EJXI/xCWyf8Qlsn/EJXJ/xCW + yf8Qlcn/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlcn/EJbJ/xCV + yf8Qlsn/EJXI/xCVyP8Qlcj/EJXI/w+Ux/8PlMf/D5TG/w+Uxv8Pk8X/D5LF/w+SxP8PksT/D5LD/w+S + w/8OkcL/DpHB/w6Rwf8OkMD/DpC//w6Pvv8Oj73/DY69/w2OvP8Njbv/DY26/w2Nuf8Mi7j/DIu3/wyK + tv8MirX/DIq0/wyJs/8LiLL/C4ix/wuHsP8Lhq//C4au/wqFrf8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmB + p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh+oP8Ifp//B32e/wd8nf8He5z/B3yd/wd9nv8HfZ//CH6g/wh+ + of8If6L/CICj/wiApP8JgKX/CYKm/wmCp/8Jg6n/CoSq/wqEq/8KhKz/CoWt/wqFrv8Lhq//C4ew/wuI + sf8LiLL/DImz/wyKtP8MirX/DIq2/wyLt/8MjLj/DY25/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Q + v/8OkMD/DpHB/w6Rwv8PksP/D5LD/w+SxP8Pk8X/D5PF/w+Uxv8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCW + yf8Qlcn/EJXJ/xCWyv8Qlcr/EJbK/xCXy/8Ql8v/EJbL/xCXy/8Ql8v/EJbL/xCWy/8Ql8z/EJfM/xCX + zP8Ql8z/EJfM/xCWy/8Qlsv/EJfL/xCWy/8Qlsv/EJfL/xCWyv8Qlsr/EJbK/xCWyv8Qlsn/EJbJ/xCV + yP8Qlcj/EJXI/w+Ux/8PlMf/D5PG/w+Txf8PksX/D5LE/w+SxP8PksP/DpHC/w6Rwv8OkcH/DpDA/w6Q + v/8OkL7/Do+9/w2Ovf8Njrz/DY27/w2Nuv8NjLn/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuH + sf8Lh7D/C4av/wqFrv8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+ + oP8Ifp//B32e/wd8nf8HfZ7/B32f/wh+oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jg6j/CYOp/wqD + qv8Khav/CoSs/wqFrf8Lhq7/C4av/wuHsf8LiLL/C4mz/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2N + uv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8PksX/D5TG/w+U + xv8PlMf/EJTH/xCUyP8Qlcj/EJXJ/xCVyf8Qlsr/EJbK/xCXy/8Qlsv/EJbL/xCXzP8Qlsz/EJfM/xGX + zP8RmM3/EZfN/xGXzf8RmM3/EZjN/xGXzf8Rl83/EZfN/xGXzf8Rl83/EZjN/xGYzf8Rl83/EZjN/xGY + zf8Ql8z/EJfM/xCWzP8Ql8z/EJfL/xCWy/8Ql8v/EJbK/xCWyv8Qlsn/EJbJ/xCVyP8Qlcj/D5TH/w+U + x/8Pk8b/D5PF/w+Txf8PksT/D5LD/w+Sw/8OkcL/DpHB/w6QwP8OkL//Do++/w6Pvf8Njrz/DY68/w2N + u/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8MibP/C4iy/wuIsf8Lh7D/C4av/wqFrv8KhK3/CoSs/wqF + q/8Kg6n/CYOo/wmBp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd9n/8IfqD/CH6h/wh/ + ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8KhKr/CoSr/wqErP8Kha3/C4av/wuHsP8Lh7H/C4iy/wuJ + s/8MibT/DIq1/wyKtv8Mi7f/DYy4/w2Nuf8Njbv/DY68/w2OvP8Oj73/DpC+/w6Qv/8OkMD/DpHB/w6R + wv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Txv8PlMf/EJXI/xCVyP8Qlcn/EJbK/xCWyv8Ql8v/EJbL/xCX + zP8Qlsz/EJfM/xGYzf8Rl83/EZfN/xGYzv8RmM7/EZjO/xGYzv8Rmc//EZnP/xGYz/8RmM//EZjP/xGY + z/8RmM//EZjP/xGYz/8RmM//EZjP/xGZz/8RmM7/EZjO/xGYzv8RmM7/EZjO/xGXzf8Rl83/EZjN/xCX + zP8Qlsz/EJbL/xCWy/8Qlsr/EJXK/xCVyf8Qlsn/EJXI/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S + w/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mi7f/DIq2/wyK + tf8MibT/C4iz/wuIsv8Lh7D/C4av/wqFrv8KhK3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiA + pP8IgKP/CH+i/wh+oP8Ifp//CH6g/wh+of8If6L/CICj/wmBpP8JgaX/CYKn/wmDqP8Jg6n/CoOq/wqF + q/8KhKz/CoWu/wuGr/8Lh7D/C4ex/wuIsv8MibP/DIq0/wyKtv8Mi7f/DIu4/w2Muf8Njbr/DY27/w2O + vP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Ux/8QlMf/EJXI/xCW + yf8Qlcn/EJbK/xCXy/8Ql8v/EJfM/xCXzP8RmM3/EZfN/xGYzv8RmM7/EZjO/xGYz/8Rmc//EZnP/xGa + 0P8RmdD/EZrQ/xGZ0P8RmdD/EZrR/xGa0f8RmdH/EZnR/xGZ0f8RmdH/EZrR/xGa0f8RmdD/EZnQ/xGZ + 0P8RmdD/EZnQ/xGa0P8Rmc//EZjP/xGZz/8RmM7/EZjO/xGXzf8Rl83/EZjN/xCXzP8Ql8z/EJbL/xCW + yv8Qlsr/EJbJ/xCWyf8QlMj/D5TH/w+Uxv8PlMb/D5PF/w+SxP8PksP/D5LD/w6Rwv8OkcH/DpDA/w6Q + v/8Oj77/DY69/w2OvP8Njbv/DY26/w2MuP8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsv8Lh7H/C4av/wuG + rv8Kha3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8IfqH/CH+i/wiA + o/8IgKT/CYGl/wmCp/8Jg6j/CYOp/wqDqv8KhKv/CoWt/wqFrv8Lhq//C4ew/wuIsf8LiLL/DIm0/wyK + tf8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+S + xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXI/xCVyf8Qlsr/EJbK/xCWy/8Ql8z/EJfM/xGXzf8Rl83/EZjO/xGY + zv8RmM//EZnP/xGZ0P8RmdD/EZnQ/xGZ0f8RmtH/EZrR/xKb0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa + 0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtH/EZrR/xGZ0f8RmtH/EZnQ/xGZ + 0P8RmtD/EZnP/xGZz/8RmM7/EZjO/xGXzf8RmM3/EJfM/xCWy/8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U + x/8Pk8b/D5TG/w+Sxf8PksT/D5LD/w6Swv8OkcH/DpDA/w6Qv/8OkL7/DY69/w2OvP8Njrv/DY26/w2M + uf8Mi7j/DIu3/wyKtv8MirT/C4mz/wuIsv8Lh7H/C4ew/wuGrv8Kha3/CoSs/wqFq/8KhKr/CYOp/wmC + p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqE + rf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyLt/8NjLn/DY26/w2Nu/8Njrz/DY69/w6P + vv8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJXI/xCWyf8Qlcr/EJfL/xCW + y/8Ql8z/EZjN/xGXzf8RmM7/EZjO/xGZz/8RmtD/EZnQ/xGZ0P8RmdH/EZrR/xKa0v8SmtL/EprS/xKa + 0/8SmtP/EpvT/xKb0/8Sm9T/EpvU/xKb1P8Sm9T/EpvU/xKc1P8SnNT/EpvU/xKb1P8Sm9T/EpvU/xKb + 1P8SnNT/EpvT/xKb0/8SmtP/EpvT/xKa0v8SmtL/EpvS/xGa0f8RmdH/EZnQ/xGZ0P8Rmc//EZjP/xGY + zv8RmM7/EZfN/xCXzP8Qlsz/EJbL/xCWyv8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S + w/8OkcL/DpHB/w6QwP8OkL//Do++/w2Ovf8Njrz/DY26/w2Nuf8Mi7j/DIu3/wyKtv8MirX/DImz/wuI + sv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqFq/8Kg6r/CYOp/wmCp/8Jgqb/CYGl/wiApP8If6L/CICj/wiA + pP8JgaX/CYGm/wmDqP8Jg6n/CoOq/wqEq/8KhK3/CoWu/wuGr/8Lh7D/C4iy/wuIs/8MibT/DIq1/wyK + tv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U + x/8Qlcf/EJXI/xCVyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZjP/xGZz/8RmdD/EZnR/xGa + 0f8SmtL/EprS/xKb0/8SmtP/EpvT/xKb1P8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc1f8SnNX/EpzW/xKc + 1v8SnNb/EpzW/xKc1v8SnNb/EpzW/xKc1v8Sndb/EpzV/xKc1f8SnNX/EpzV/xKd1f8SnNT/EpvU/xKb + 1P8Sm9P/EprT/xKa0v8SmtL/EprR/xGZ0f8RmdD/EZnQ/xGZz/8Rmc//EZjO/xGXzf8RmM3/EJbM/xCW + y/8Qlsr/EJbK/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Sw/8PksL/DpHB/w6QwP8OkL//Do++/w2O + vf8Njrz/DY27/w2Nuv8NjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqF + q/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKT/CYGl/wmCpv8Jg6j/CYOp/wqDqv8KhKv/CoSt/wqF + rv8Lhq//C4ew/wuIsv8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Muf8Njbr/DY68/w2Ovf8Oj77/DpC//w6Q + wP8OkcH/DpLC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCWyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGY + zv8RmM7/EZnP/xGZ0P8RmdD/EZnR/xKa0v8SmtL/EprT/xKb0/8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc + 1v8SnNb/Ep3W/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd + 1/8Tndf/E53X/xOd1/8Sndb/Ep3W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKb1P8SmtP/EprT/xKa + 0v8SmtH/EZnR/xGZ0P8RmtD/EZjP/xGYzv8Rl83/EZfN/xCXzP8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U + x/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvf8Njrz/DY27/w2Nuv8NjLn/DIu3/wyK + tv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha3/CoSs/wqFq/8KhKr/CYOo/wmBp/8Jgab/CYGl/wmA + pf8Jgab/CYKn/wmDqf8Kg6r/CoSr/wqFrf8Kha7/C4av/wuHsP8LiLL/C4mz/wyKtP8Mirb/DIu3/wyL + uP8Njbn/DY27/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCW + yf8Qlsr/EJbK/xCXy/8Ql8z/EZfN/xGYzv8Rmc//EZnP/xGZ0P8RmdH/EZrR/xKa0v8SmtP/EpvT/xKb + 1P8SnNT/EpzV/xKc1f8SnNb/Ep3W/xOd1/8Tndf/E53X/xOe2P8Tntj/E57Y/xOe2P8Tntn/E57Z/xOe + 2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntj/E57Y/xOe2P8Tntj/E53X/xOd + 1/8Tndf/E53W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKa0/8SmtL/EprS/xGa0f8RmdD/EZnQ/xGZ + z/8RmM7/EZfN/xGYzf8Ql8z/EJbL/xCWyv8Qlcn/EJXI/w+Ux/8PlMb/D5PF/w+SxP8PksP/DpHC/w6R + wf8OkMD/DpC//w6Pvv8Njrz/DY67/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuG + r/8Kha3/CoSs/wqEq/8KhKr/CYOo/wmCp/8Jgqb/CYKm/wmCp/8Jg6n/CoOq/wqEq/8KhKz/CoWu/wuG + r/8Lh7D/C4iy/wuJs/8MirT/DIq2/wyLt/8Mi7j/DY25/w2Nu/8Njrz/DY69/w6Qvv8OkMD/DpHB/w6R + wv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcn/EJbK/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZnP/xGZ + 0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzV/xKc1v8Sndb/E53X/xOd1/8Tntj/E57Y/xOe + 2f8Tntn/E57Z/xOf2v8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOf2/8Tn9v/E5/b/xOf + 2/8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOe2f8Tntn/E57Z/xOe2P8Tntj/E57Y/xOd1/8Tndf/Ep3W/xKc + 1v8SnNX/EpzV/xKb1P8Sm9P/EprT/xKa0v8RmtH/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Rl8z/EJfM/xCX + y/8Qlsr/EJXJ/xCUyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY27/w2N + uv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuGr/8Kha3/CoSs/wqEq/8Kg6n/CYKo/wmC + p/8Jgqf/CYOo/wqEqv8KhKv/CoSs/wqFrv8Lhq//C4ew/wuIsv8LibP/DIq0/wyKtv8Mi7f/DIy4/w2N + uv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8PlMb/D5TH/xCVyP8Qlsn/EJbK/xCX + y/8Ql8z/EZjN/xGXzf8RmM7/EZnP/xGZ0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzW/xKd + 1v8Tndf/E53X/xOe2P8Tntj/E57Z/xOe2f8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOg2/8UoNz/FKDc/xSg + 3P8UoNz/FKHc/xSh3P8Uodz/FKHc/xSh3P8Uodz/FKHc/xSg3P8UoNz/FKDc/xSg2/8ToNv/E5/b/xOf + 2/8Tn9r/E5/a/xOf2v8Tntn/E57Z/xOe2P8Tntj/E53X/xOd1/8Sndb/EpzW/xKc1f8SnNT/EpvU/xKa + 0/8SmtL/EZrR/xGa0f8RmdD/EZjP/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/xCVyP8PlMf/D5PG/w+T + xf8PksT/D5LD/w6Rwv8OkcH/DpC//w6Pvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuI + sv8Lh7H/C4ew/wuGrv8KhK3/CoSs/wqEqv8Jg6n/CYKo/wmCqP8Kg6n/CoSr/wqErP8Kha3/C4av/wuH + sP8LiLL/C4iz/wyKtP8Mirb/DIu3/wyMuP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S + xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJbM/xGXzf8RmM7/EZjP/xGZ0P8RmdH/EprR/xKa + 0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2P8Tntn/E5/a/xOf2v8Tn9v/E5/b/xOf + 2/8UoNz/FKDb/xSh3f8Uo9//E5/b/xKSyP8OgbL/C2mP/wlVdv8IQ1z/Bz9Y/wc/WP8IQlv/CExp/wpk + i/8Ne6r/EY/G/xOd2f8Uot7/FKHe/xSg3P8Uodz/FKHc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E5/a/xOe + 2f8Tntn/E57Y/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xGa0f8RmdD/EZnP/xGZ + z/8RmM7/EZjN/xCWzP8Ql8v/EJbK/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6Rwv8OkcH/DpDA/w6Q + vv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGrv8KhK3/CoWs/wqE + qv8Jg6n/CYOp/wqFq/8KhKz/CoWt/wuGr/8Lh7D/C4ix/wuIs/8MibT/DIq1/wyLt/8Mi7j/DY26/w2N + u/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJbL/xGX + zP8Rl83/EZjO/xGZz/8RmdD/EZrR/xKa0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe + 2f8Tntn/E5/a/xOf2/8Tn9v/FKDb/xSi3v8SmNH/CmOI/wMpOf8ACg3/AAQF/wALDv8ABAX/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAME/wAJDP8ABAX/AAoO/wEY + Iv8HQlz/EIzB/xSh3v8UoN3/FKHc/xSg3P8UoNv/E5/b/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd + 1/8SnNb/EpzV/xKc1P8Sm9P/EprT/xKa0v8RmdH/EZnQ/xGYz/8RmM7/EZfN/xCWzP8Qlsv/EJbK/xCW + yf8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyK + tv8MirX/DIm0/wuIsv8Lh7H/C4av/wqFrv8KhK3/CoSr/wqDqv8KhKr/CoWs/wqErf8Lhq7/C4ew/wuH + sf8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Nuf8Njbv/DY68/w6Pvv8OkL//DpDA/w6Rwf8PksP/D5LE/w+T + xf8PlMb/EJTH/xCWyf8Qlsr/EJbL/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc + 1P8SnNX/EpzW/xOd1/8Tntj/E57Y/xOe2f8Tn9r/E5/a/xOf2/8UoNz/EpjS/wdCW/8ABwn/AAcI/wAC + Av8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAgL/wAHCf8DJDL/DXmn/xSi + 3v8UoNz/FKDc/xOg2/8Tn9v/E5/a/xOe2f8Tntn/E57Y/xOd1/8Tndf/EpzW/xKc1f8Sm9T/EpvT/xKa + 0v8RmtH/EZnQ/xGZz/8RmM7/EZjO/xGXzP8Qlsv/EJbK/xCWyf8QlMj/D5TH/w+Txv8Pk8X/D5LE/w6R + wv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DImz/wuIsv8Lh7H/C4av/wqF + rv8KhKz/CoSr/wqFq/8KhK3/CoWu/wuGr/8Lh7H/C4iy/wyJtP8MirX/DIu3/wyLuP8Njbn/DY27/w2O + vP8Oj73/DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlcn/EJbK/xCWy/8Qlsz/EZfN/xGY + zv8Rmc//EZnQ/xGa0f8SmtL/EprT/xKb1P8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOf + 2/8Sls7/BDBC/wAEBv8AAgL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/BgYG/wQE + BP8CAgL/BwcH/wgICP8EBAT/AAAA/wAAAP8CAgL/BgYG/wgICP8FBQX/AgIC/wcHB/8DAwP/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAkM/wAICf8JVXb/FKHd/xSg2/8UoNz/E5/b/xOf + 2v8Tntn/E57Z/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpvU/xKa0/8SmtL/EZnR/xGZ0P8RmM//EZjO/xGX + zf8Qlsz/EJfL/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2N + uv8NjLn/DIu3/wyKtv8MirX/C4mz/wuIsv8Lh7D/C4av/wqGrv8KhKz/CoSs/wqFrv8Lhq//C4ex/wuI + sv8MibP/DIq1/wyKtv8Mi7j/DYy5/w2Nu/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+U + x/8Qlcj/EJbJ/xCWyv8Qlsv/EJfM/xGXzf8RmM7/EZnQ/xGZ0f8SmtL/EprT/xKb1P8SnNX/EpzV/xKd + 1v8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOh3f8KWXv/AAgK/wACAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8GBgb/BAQE/w4ODv89PT3/d3d3/5WVlf+dnZ3/np6e/52dnf+cnJz/nJyc/5ycnP+cnJz/nJyc/5yc + nP+cnJz/nJyc/52dnf+dnZ3/n5+f/5ycnP+NjY3/ZmZm/zU1Nf8EBAT/AQEB/wICAv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8ACAr/AAsP/w59rP8Uod3/FKDc/xOf2/8Tn9r/E57Z/xOe2f8Tntj/E53X/xKc + 1v8SnNX/EpzU/xKb0/8SmtL/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Ql8z/EJbL/xCWyv8Qlcj/D5TH/w+U + xv8PksX/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY27/w2Nuv8NjLn/DIu3/wyKtv8MirT/C4iz/wuI + sf8Lh7D/C4av/wqFrf8QiK//C4av/wuHsP8LiLL/C4iz/wyKtf8Mirb/DIu3/w2Muf8Njbr/DY68/w2P + vf8OkL//DpDA/w6Rwf8PksP/D5LE/w+Txf8PlMf/EJTI/xCWyf8Qlsr/EJbL/xGYzf8RmM7/EZjP/xGZ + 0P8RmdH/EprS/xKa0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tntn/E5/a/xOh3f8GOlH/AAYH/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AwMD/wYGBv8xMTH/goKC/52dnf+dnZ3/nJyc/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/5ycnP+dnZ3/m5ub/2tra/8cHBz/AgIC/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAI + Cf8ITWr/FKLe/xSg3P8Tn9v/E5/a/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGa + 0f8Rmc//EZjO/xGYzf8Qlsz/EJfL/xCWyv8Qlsn/D5TH/w+Uxv8PksX/D5LE/w6Rwv8OkcH/DpC//w6P + vv8Njr3/DY67/w2Nuv8NjLj/DIu3/wyKtf8MibT/C4iz/wuIsf8Lh7D/Coau/yaUt/8olbn/G5C3/wqI + sv8MirT/DIq2/wyLt/8NjLn/DY26/w2OvP8Njr3/Do++/w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TH/xCU + yP8Qlsn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8Sm9P/EpzU/xKc1f8Sndb/E53X/xOe + 2P8Tntn/E5/a/xOg2/8ITmv/AAcI/wAAAP8AAAD/AAAA/wAAAP8CAgL/BgYG/05OTv+bm5v/nJyc/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/lJSU/zg4OP8EBAT/AAAA/wAAAP8AAAD/AAAA/wAAAP8ABgf/B0Jc/xSh3f8ToNv/E5/b/xOf + 2v8Tntn/E57Y/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCV + yv8Qlsn/D5TH/w+Uxv8Pk8X/D5LE/w6Swv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuv8Mi7j/DIu3/wyK + tf8MibT/C4iy/wuHsf8Lhq//J5S4/yqXu/8rmLz/LJi+/yiXvv8Li7f/DIy4/w2Nuv8Njrv/DY69/w6P + vv8OkMD/DpHB/w+Sw/8PksT/D5LF/w+Txv8Qlcj/EJbJ/xCWyv8Qlsv/EZfN/xGYzv8RmM//EZnQ/xGa + 0f8SmtL/EpvU/xKc1f8SnNb/E53X/xOe2P8Tntn/E5/a/xOf2v8Qi7//AAkL/wAAAP8AAAD/AAAA/wAA + AP8EBAT/MDAw/5iYmP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+cnJz/nZ2d/56env+fn5//nJyc/5ycnP+Ojo7/FBQU/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAcK/wtjiP8UoNv/E5/b/xOf2v8Tntn/E57Y/xOd1/8Sndb/EpzV/xKc + 1P8SmtP/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJbL/xCVyv8Qlsn/D5TH/w+Uxv8Pk8X/D5LD/w6R + wv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuf8Mi7j/DIq2/wyKtf8MibP/C4iy/wuHsP8plrr/Kpe8/yyY + vf8umb//L5vB/zGdw/8yncT/EpC8/w2OvP8Oj77/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJXI/xCW + yf8Qlsr/EJbL/xGXzf8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb1P8SnNX/EpzW/xOd1/8Tntj/E57Z/xOf + 2v8Tn9v/BCc1/wACAv8AAAD/AAAA/wAAAP8CAgL/VFRU/56env+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/m5ub/52dnf+lpaX/r6+v/7m5uf/BwcH/xMTE/8fH + x//IyMj/yMjI/8jIyP/Hx8f/xMTE/8HBwf+6urr/srKy/6mpqf+goKD/nJyc/4aGhv87Ozv/FxcX/wcH + B/8DAwP/AQEB/wgICP8JCQn/DAwM/wQEBP8DAwP/BAQE/wQEBP8CAgL/CAgI/wMDA/8AAAD/AAAA/wAH + CP8TnNb/FKDb/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1P8Sm9P/EprS/xGZ0f8RmND/EZjP/xGX + zf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Rwv8OkMD/DpC//w6Pvf8Njrz/DY26/w2M + uf8Mi7f/DIq2/wyKtP8LiLP/C4ix/yqXu/8rl73/LZm+/y+bwf8wncP/M57E/zWgxv83osj/OaTK/x6W + w/8NkMD/DpHC/w+Sw/8Pk8X/D5PG/xCVyP8Qlcn/EJXK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EprS/xKa + 0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tn9r/E57a/wAHCf8AAAD/AAAA/wAAAP8BAQH/GRkZ/zU1 + Nf9tbW3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nJyc/52dnf+wsLD/xcXF/8rK + yv/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/IyMj/CAgI/wICAv8CAgL/BwcH/zs7O/9wcHD/mJiY/6ampv+qqqr/qKio/6io + qP+oqKj/qKio/6ioqP+qqqr/pqam/3l5ef8SEhL/BQUF/wAGB/8IVHP/FKDb/xOf2/8Tn9r/E57Z/xOe + 2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+U + xv8PksT/D5LD/w6Rwf8OkMD/Do++/w2Ovf8Njbv/DY26/w2MuP8Mi7f/DIq1/wyJtP8LiLL/Kpi8/yyZ + vv8um8D/MJzB/zKexP80n8X/N6LI/zijyf86pMv/O6XM/z6nzv8wocv/C5DE/w+Uxv8PlMf/EJbJ/xCW + yv8Ql8v/EZjN/xGYzv8RmM//EZnQ/xKa0v8SmtP/EpvU/xKc1f8Sndb/E53X/xOe2P8Tntn/E5/a/xKW + zv8ACAr/AAAA/wAAAP8AAAD/CAgI/zU1Nf81NTX/NTU1/zg4OP+ampr/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+cnJz/pKSk/8PDw//Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/5ycnP8GBgb/paWl/6io + qP+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en + p/+mpqb/CQkJ/wAAAP8BFR3/FKDd/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ + 0f8RmND/EZjP/xGXzf8Qlsz/EJbL/xCVyf8QlMj/D5TH/w+Txf8PksT/D5LD/w6Rwf8OkMD/Do++/w2O + vf8Njbv/DY26/wyLuP8Lirb/HpK6/yeXvP8smL3/LZm//y+bwf8xncP/NJ/F/zWgxv83osj/OaTK/zul + zP89ps3/P6jP/0Gq0P9Dq9L/QKrS/xGWyf8Qlsr/EJbL/xCXzP8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb + 1P8SnNX/Ep3W/xOd1/8Tntn/E5/a/xOf2/8Rkcf/AAYI/wAAAP8AAAD/AQEB/ykpKf81NTX/NTU1/zU1 + Nf81NTX/NTU1/zc3N/+dnZ3/nZ2d/52dnf+dnZ3/vb29/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/IyMj/CQkJ/zQ0NP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io + qP+oqKj/qKio/6ioqP+np6f/p6en/6ioqP+Xl5f/hoaG/6ioqP94eHj/AAAA/wAAAP8ACw//E57Z/xOg + 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCW + yf8QlMj/D5PG/w+Txf8PksT/DpHC/w6Rwf8OkL//Do++/wuNvP8ak77/LZvC/yqZwP8qmb//KJe9/yya + vv8umsD/MJ3C/zOexP80n8b/N6LI/zmjyf87pMv/PKbN/z+ozv9BqdD/Q6vS/0Wt1P9HrtX/SK/W/0qw + 2P8dnM//EZjO/xGYz/8RmdD/EZrR/xKa0/8Sm9T/EpzV/xKd1v8Tndf/E57Z/xOf2v8Tn9v/EpnS/wAH + CP8AAAD/AAAA/wEBAf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ZGRv+fn5//x8fH/8jI + yP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ysrP8HBwf/qKio/6io + qP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+pqan/hoaG/y8vL/8eHh7/JiYm/yUl + Jf+jo6P/qamp/wcHB/8AAAD/AAAA/wAAAP8ABgf/EpXN/xSg2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc + 1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJbK/xCWyf8Qlcj/D5TG/w+Txf8PksP/DZHC/xWT + wv8yoMj/MqDH/zCexv8uncP/LZvB/yqZwP8pmL7/LZm//y+bwf8yncP/NJ/F/zWgx/84osj/OaTL/zum + zP8+p87/QKjP/0Kq0f9ErNP/Rq7V/0iu1v9KsNj/TLLZ/0+z2v9RtNz/MabW/w6Y0f8SmtL/EpvU/xKc + 1f8Sndb/E53X/xOe2f8Tn9r/E5/b/xSg3P8ACg3/AAAA/wAAAP8ICAj/NTU1/zU1Nf81NTX/NTU1/zU1 + Nf81NTX/NTU1/zU1Nf81NTX/Q0ND/3x8fP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/IyMj/DQ0N/yIiIv+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en + p/+ioqL/MzMz/yUlJf8kJCT/JCQk/yQkJP8kJCT/Ghoa/6enp/9eXl7/AAAA/xISEv8BAQH/AAAA/wAA + AP8ABgj/EpPK/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8Rmc//EZjO/xGX + zf8Qlsv/EJbK/xCWyf8QlMf/EJTG/zOizf86ps7/OKTM/zaiyv80oMj/MZ/H/y+exf8tm8L/K5rB/yqZ + v/8umsD/MJ3D/zOexP80n8b/N6LI/zmkyv87pcz/PKbN/z+oz/9BqdD/Q6vS/0at1P9HrtX/SbDX/0ux + 2f9Ostr/ULTb/1G13f9Ttt7/V7jf/0qz3f8OmdT/EpzW/xOd1/8Tntn/E5/a/xOf2/8UoNv/AA4U/wAA + AP8AAAD/CQkJ/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pz8//0RERP9FRUX/RUVF/5CQ + kP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8XFxf8HBwf/oKCg/6io + qP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+hoaH/JCQk/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP9XV1f/p6en/wYGBv8CAgL/RUVF/zk5Of8BAQH/AAAA/wAAAP8ACAn/E5vW/xSg3P8Tn9r/E57Z/xOe + 2P8Tndf/EpzW/xKc1P8SmtP/EprS/xGZ0P8RmM//EZjO/xGXzP8Nlcv/LqLQ/0Kq0/8/qtL/PKfQ/zqn + z/85pc3/N6PL/zWhyf8zoMj/MJ7G/y+exP8tm8L/KpnA/y+cwf8ynsT/NJ/F/zahx/85osn/OqTL/zum + zf8/qM7/QanQ/0Or0v9ErNP/R63V/0iv1v9KsNj/TrPa/1C02/9QtNz/U7be/1W43/9XueD/Wrri/1q7 + 4/9au+P/GqHa/xSf2v8Tn9v/FKDc/wpafP8AAAD/AAAA/wgICP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1 + Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RkZG/5WVlf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/RUVF/wcHB/+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/MTEx/yUl + Jf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/6ampv+fn5//AQEB/ykpKf9FRUX/RUVF/0JC + Qv8CAgL/AAAA/wAAAP8ACg3/FKHd/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzV/xKb1P8SmtP/EpvS/w2X + 0P8koNL/SLDZ/0Wt1/9ErNb/QqvU/0Cq0/89qNH/PKfQ/zqmzv84pc3/NqLK/zShyf8yoMf/L53F/y2c + w/8rm8H/MJ3D/zOfxf81oMb/N6LI/zmky/87pcz/PabO/z+oz/9BqdH/Q6vS/0at1f9Irtb/SrDY/0yy + 2f9Ostr/ULTc/1G13f9VuN//Vrjg/1m64f9au+P/XLvj/1695P9hv+b/Y7/n/y6q3/8Rn93/AAgK/wAA + AP8BAQH/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zo6Ov9ERET/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/4mJif/IyMj/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf8FBQX/YGBg/6io + qP+oqKj/qKio/6ioqP+np6f/fX19/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8aGhr/p6en/zo6Ov8CAgL/RERE/0VFRf9FRUX/RUVF/0JCQv8BAQH/AAAA/wAAAP8ACQv/FKDc/xSg + 2/8Tn9r/E57Z/xOe2P8Tndf/EZzV/xuf1f9Ls93/TrTd/0uy2/9JsNr/SK/Y/0Wt1/9ErNX/QqvU/z+q + 0v88qNH/O6fP/zmmzv83pMz/NaLK/zOhyP8wnsb/Lp3E/y2bwv8ynsT/NJ/G/zahx/84osn/OaTL/zum + zf8/qM//QanQ/0Or0v9ErNP/Rq3V/0iu1v9KsNj/TrLa/1C13P9RtN3/VLfe/1a54P9YueH/Wrri/1y7 + 4/9evOT/YL7l/2K/5/9kwOj/ZcHp/xIlLf8AAAD/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1 + Nf9AQED/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/2RkZP/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/vb29/wkJCf+pqan/qKio/6ioqP+oqKj/qKio/ywsLP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/0xMTP+np6f/BgYG/xcXF/9FRUX/RUVF/0VF + Rf9FRUX/RUVF/z8/P/8CAgL/AAAA/wAAAP8GQlr/FKHd/xOg2/8Un9r/FZ/Z/0m14P9VuOL/U7fh/1G2 + 3/9Ptd7/TbTd/0uy2/9JsNr/R67Y/0St1v9DrNX/QKrT/z6p0v88qND/OqfP/zilzf81osv/NKLJ/zKg + x/8vncX/LZvD/zOfxf80oMf/N6LI/zmjyv86pcz/PafO/z+p0P9BqdH/Q6vT/0at1f9Irtb/SrDY/02z + 2v9PtNv/ULXc/1K13v9VuN//V7ng/1q64v9bu+P/Xbzk/2C+5f9hv+b/Y8Do/2XB6f9mwOb/AQYI/wAA + AP8YGBj/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/1BQUP/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9PT0//BQUF/6en + p/+oqKj/qKio/6ampv8fHx//JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/oKCg/6ampv8FBQX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/y0tLf8AAAD/AAAA/wAE + Bv8SmdP/PrHi/1295v9au+X/WLvk/1e54v9VuOL/Urfg/1C23/9OtN3/TLPc/0mw2v9IsNn/Ra3X/0St + 1v9Cq9T/QKvT/zyn0f87p8//OaTN/zajy/81osr/M6HI/zCfx/8unMT/M5/G/zWhx/84o8n/OaPL/zul + zf8/qM//QanR/0Or0v9FrNT/RqzV/0mv1/9Lsdj/TrLa/1C03P9RtN3/Vbff/1e54P9YuuH/Wrvj/1y7 + 4/9eveX/Yb/m/2PA5/9lwen/ZsPp/xYsNf8AAAD/AgIC/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ND + Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0pK + Sv+2trb/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/yMjI/woKCv9TU1P/qKio/6ioqP+ZmZn/JSUl/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yAgIP+oqKj/aWlp/wMDA/9ERET/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/w4ODv8AAAD/AAAA/wEHCf9gv+f/X77n/1y85v9avOX/V7rj/1a5 + 4v9TtuH/Ubbf/0+13v9Ns93/S7Hb/0mw2v9Hrtj/RK7X/0Kr1f9Aq9T/PqnS/zuo0P86ps//OKXN/zWi + y/8zocn/MqDH/y+dxf80oMf/N6LI/zmjyv86pcz/PafO/z+o0P9BqtH/Q6vT/0at1f9Irtb/SrDY/02y + 2v9PtNv/ULXd/1O23v9Vtt//V7ng/1q64v9cu+P/Xrzk/2C/5v9iv+f/ZMDo/2bD6v9pxOz/AgkM/wAA + AP8gICD/NTU1/zU1Nf81NTX/NTU1/zU1Nf9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0ZGRv9hYWH/ysrK/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Ly8v/DQ0N/6Oj + o/+oqKj/i4uL/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/Kysr/6enp/8YGBj/FxcX/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wIC + Av8AAAD/AAAA/0eOrP9gv+j/Xr7n/1u85f9Zu+T/V7nj/1a44v9StuD/ULXf/06z3f9Mstz/SrHa/0iv + 2f9Grtf/RK3W/0Kr1P9AqtP/PKjR/zqmz/84o83/NqPM/zWiyv8zocj/MJ7G/zWgx/84osn/OaPL/zul + zf8+qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9Lsdj/TrLa/1C03P9RtN3/VLff/1a44P9YuuH/W7vj/128 + 5P9fvuX/YcDn/2PA6P9lwen/aMLq/ztuhf8AAAD/AQEB/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pj4+/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9KSkr/mZmZ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/7W1tf8EBAT/qKio/4KCgv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9ubm7/qKio/wMDA/87Ozv/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Ozs7/wAAAP8AAAD/AggK/2DA6f9fv+j/XL3m/1q8 + 5f9XuuT/Vrni/1S34f9RtuD/T7Xe/02z3f9Lsdv/SbDa/0ev2P9Erdf/QqzV/0Cr1P8+qdL/O6jR/zml + zv83pMz/NaLL/zOhyf8xn8f/N6LI/zmjyv86pMz/PKbO/z+p0P9BqtH/Q6vT/0at1f9Hrdb/SbDY/02x + 2f9Ps9v/ULTd/1O23v9Vt9//V7nh/1q64v9cu+P/Xr3l/2C+5v9iwOf/ZMHp/2bD6v9owun/AgoM/wAA + AP8TExP/NTU1/zU1Nf81NTX/NTU1/zg4OP9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RERE/0JCQv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/SEhI/62t + rf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/VFRU/yIi + Iv+Kior/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/6Kiov+np6f/CQkJ/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9ERET/CQkJ/wAAAP8AAAD/Tpy+/2DA6f9ev+f/W7zm/1m85f9XueP/Vbji/1K34P9Qtd//TrTe/0yy + 3P9Jsdv/R6/Z/0Wv2P9DrNb/QazV/z+q0/88qdH/OqXP/zilzf81osz/NKLK/zKgyP84o8n/OaPL/zul + zf89qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9LsNj/TrHa/1C03P9RtN3/VLff/1a34P9YuuH/W7vj/128 + 5P9fvub/Yb/n/2PB6P9lwun/aMLq/2rF7P8CCQz/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/RERE/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zU1Nf82Njb/NjY2/zU1Nf8/Pz//RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0dHR/+SkpL/ysrK/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9ISEj/CgoK/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/qamp/46Ojv8DAwP/RERE/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9CQkL/AQEB/wAAAP8EDBD/YMDp/1+/ + 6P9dvuf/Wrzl/1e55P9WueP/VLfh/1C24P9PtN7/TbPd/0qx2/9IsNr/Rq/Y/0St1/9CrNX/QKvU/z2p + 0v86p9D/OKTO/zekzP81osv/M6HJ/zijyv85o8v/O6bN/z6o0P9BqtH/Q6vT/0Wt1f9Hrdb/SbDY/0yx + 2f9Ostv/ULTc/1O23v9Vt9//V7jh/1q74v9cvOT/Xr3l/2C/5v9iwej/ZcHp/2bC6v9pw+v/S4yp/wAA + AP8CAgL/NTU1/zU1Nf81NTX/NTU1/0NDQ/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP81NTX/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9ISEj/W1tb/7a2tv/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/0lJ + Sf8AAAD/JCQk/yQkJP8hISH/GRkZ/ykpKf86Ojr/RERE/0hISP9ISEj/SEhI/0ZGRv8/Pz//NjY2/yws + LP8kJCT/Gxsb/xkZGf8AAAD/BAQE/wsLC/8MDAz/ExMT/xoaGv8nJyf/MjIy/zw8PP9BQUH/RERE/0VF + Rf9FRUX/RUVF/0RERP8ICAj/AAAA/wIICv9hwer/YMDp/16/6P9cveb/Wbvl/1e55P9VuOL/Urfh/1C1 + 3/9OtN7/S7Lc/0mx2/9Hr9n/RK7Y/0Os1v9BrNX/P6rT/zuo0f85pc//N6TN/zWjy/8zosr/OaPK/zqk + zP89qM//P6nQ/0Gq0v9ErNT/Rq3V/0iu1/9KsNj/TbHa/0+z2/9RtN3/VLff/1a44P9YuuL/Wrvj/128 + 5P9fvub/Yb/n/2PA6P9lwen/aMPq/2rD6/8XKzX/AAAA/xQUFP81NTX/NTU1/zU1Nf88PDz/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ODg4/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/0ND + Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP88PDz/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0hI + SP9NTU3/h4eH/8DAwP/Ly8v/ycnJ/8jIyP/Jycn/gICA/wAAAP8gICD/sLCw/7u7u/+6urr/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+6urr/urq6/7u7u/+8vLz/vLy8/7q6 + uv+0tLT/paWl/319ff9MTEz/Nzc3/wwMDP8MDAz/BgYG/woKCv8BAQH/AQEB/zk5Of8AAAD/AAAA/zVo + f/9gwOn/X7/o/12+5/9avOb/V7rk/1a54/9TuOH/ULXg/0603v9Ns93/SrHb/0iw2v9Fr9j/RK3X/0Gs + 1f8/qtT/PKjS/zqlz/84pM7/NqPM/zSiyv85o8v/O6XN/z6o0P8/qdH/QqvT/0Ss1P9Grtb/SK/Y/0ux + 2f9Os9v/ULTc/1K13v9Vt9//V7jh/1m74v9bvOT/Xr3l/2C/5/9iwOj/ZMHp/2bC6v9ow+v/a8Xs/wMK + Df8AAAD/MDAw/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP81NTX/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/RERE/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/zY2 + Nv82Njb/Ojo6/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0xMTP9HR0f/SUlJ/1lZ + Wf9ubm7/AwMD/0VFRf+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/7q6 + uv+7u7v/vb29/w0NDf8DAwP/RUVF/wICAv8AAAD/BAwQ/2HA6f9gwOj/Xb/o/1u95v9YuuX/V7rk/1S5 + 4v9Rt+H/T7Xf/0203v9Lstz/SLHb/0ev2f9Ertj/QqzW/0Cr1P89qdL/OqbQ/zmlz/83pM3/NKPL/zmk + zP88ps7/P6nQ/0Cq0v9Dq9P/Ra3V/0eu1/9KsNj/TLLa/06z2/9QtN3/U7be/1W34P9XueL/Wrvj/1y8 + 5P9evub/Yb/n/2PA6P9lwun/Z8Tr/2rE7P9tyPD/AwwP/wICAv82Njb/NTU1/zU1Nf9CQkL/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1 + Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/QUFB/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/Q0ND/zc3N/81NTX/NTU1/zU1Nf81NTX/Ojo6/0NDQ/8NDQ3/Dg4O/7q6uv+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8nJyf/Pz8//CgoK/xcXF/9FRUX/Ghoa/wAA + AP8BBwn/Y8Ps/2DA6f9fv+j/Xb7n/1m75v9XuuT/Vrnj/1O44f9QteD/TrTe/0yz3f9Jstv/R7Da/0Su + 2P9Crdf/QKvV/z6p0/87qNH/OaXP/zekzv81pMz/OaTM/z2nz/8/qdH/QavS/0Ss1P9Frtb/SK7X/0uw + 2f9Nstr/T7Pc/1K13v9Ut9//Vrjh/1i64v9avOT/Xb3l/1+/5/9hv+f/Y8Hp/2XC6v9oxOv/asbt/2rB + 6P8AAwT/AQEB/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9ERET/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/OTk5/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2 + Nv82Njb/NjY2/zY2Nv81NTX/RERE/0VFRf9FRUX/RERE/zk5Of82Njb/NjY2/zY2Nv82Njb/NjY2/zY2 + Nv82Njb/NjY2/zU1Nf8HBwf/uLi4/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8DA + wP/Pz8//0NDQ/5mZmf8CAgL/RERE/0VFRf9BQUH/AAAA/wADA/9guuH/YcHq/1+/6P9dv+j/W73n/1e7 + 5f9WuuT/U7ni/1C24f9Otd//TbTe/0qy3P9Hsdr/Ra/Z/0Ot1/9BrNb/P6rU/z2o0v86ptD/OKXO/zaj + zP87pc3/PafP/z+p0f9Bq9P/RK3V/0au1v9Ir9j/S7La/06z2/9QtN3/Urbe/1W44P9XueH/Wbrj/1y9 + 5P9evub/Tpm4/yM4Qf9kwen/Z8Pr/2nE7P9rxu3/XKjJ/wAAAP8FBQX/NTU1/zU1Nf9DQ0P/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP83Nzf/NjY2/zY2Nv82Njb/NjY2/zU1 + Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VF + Rf8+Pj7/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/yAgIP8bGxv/urq6/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/76+vv/Pz8//0NDQ/9DQ0P/Ly8v/CgoK/0RERP9FRUX/RUVF/0RE + RP8BAQH/AAAA/z9/mv9iwer/YMDp/16+6P9bvef/WLvm/1a65P9VueP/Urjh/0+14P9NtN7/S7Pd/0ix + 2/9GsNn/RK7Y/0Ks1v9Aq9X/PajS/zqm0P84pc//N6TN/zymzv8+qND/QKnR/0Os1P9ErNX/Rq7X/0qw + 2f9Mstr/TrPc/1C03f9Stt//Vbjg/1e54v9avOT/XL3l/16/5/8OExT/EA8P/xcpMf9oxev/asbt/2zG + 7f9BeZH/AAAA/wUFBf8sLCz/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0RERP84ODj/NjY2/zY2Nv81NTX/RUVF/0VFRf9FRUX/RUVF/0RERP82Njb/NjY2/zY2 + Nv82Njb/NjY2/zY2Nv82Njb/NTU1/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv82Njb/KCgo/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf93d3f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8HBwf/Pz8//0NDQ/9DQ + 0P/Q0ND/zc3N/w0NDf9DQ0P/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/Hj1K/2PC6/9gwOr/Xr/o/1y+ + 5/9avOb/V7vl/1a64/9TuOL/ULbg/0613/9Ms93/SbLc/0ew2v9Er9n/Qq3X/0Cr1f89qdP/O6fR/zml + z/83pM7/PKbO/z+p0P9AqtL/RK3U/0Wu1v9Irtf/SrHZ/02z2/9Ps9z/UbXe/1O33/9WueH/WLrj/1q8 + 5P9dvub/LFVn/xAQEP8QEBD/EA8P/xgqMv9qxez/bcfu/ypNXP8AAAD/Ghoa/zU1Nf8hISH/BAQE/ysr + K/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/RUVF/0RE + RP9FRUX/RUVF/0VFRf9FRUX/QUFB/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv81NTX/RUVF/0VF + Rf9DQ0P/NjY2/zY2Nv82Njb/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Xl5e/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/urq6/8bGxv/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8HBwf8LCwv/RERE/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/GRkZ/wAAAP8BBQb/Y8Lr/2HB6v9fv+n/Xb7o/1u95/9XuuX/Vrrk/1O54/9QtuH/TrXf/0y0 + 3v9Kstz/R7Hb/0Wv2f9Drdf/QKvV/z6p0/89qNL/OabQ/zekzv88p8//P6jR/0Gr0/9ErdX/Rq7W/0iw + 2P9Lstr/TbPb/1C03f9St9//VLfg/1e54v9Zu+P/W7zl/16/5/8QEhL/EBAQ/xAQEP8QEBD/EA8P/xgq + Mf9ux+7/JUVT/wAAAP8kJCT/NTU1/0RERP9FRUX/RUVF/zExMf8ICAj/HR0d/0NDQ/9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf89PT3/NjY2/zY2 + Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9FRUX/RUVF/z8/P/82Njb/NjY2/zMzM/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2tra/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/vb29/83Nzf/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8/P + z/+EhIT/CgoK/z4+Pv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf8xMTH/AAAA/wEHCf9kw+z/YsLr/1/A + 6v9dv+j/W73n/1i75f9WuuT/VLnj/1K44v9OtuD/TbXf/0uz3f9Isdv/RbDa/0Ou2P9BrNb/P6rU/z2o + 0v86ptD/OKXP/z2nz/8/qNH/QqzT/0St1f9Grtf/SbHZ/0uy2v9Os9z/ULTd/1K23/9VuOH/V7ni/1q7 + 5P9cveX/W7je/w0TFP8QEBD/EBAQ/xAQEP8QEBD/EBAP/xYnLv8cND//AAAA/ysrK/87Ozv/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/Pz8//xYWFv8AAAD/AAAA/yIiIv9ERET/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/PT09/0VF + Rf9FRUX/PT09/zY2Nv82Njb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/x8fH/8/P + z//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/JSUl/w8PD/81NTX/NjY2/zU1Nf89PT3/RERE/0VF + Rf9FRUX/RUVF/0BAQP8AAAD/AQUG/2XF7v9jw+z/YMHq/16/6f9bvef/Wbvm/1e75f9UueP/Urji/0+3 + 4f9NtN//S7Pd/0iy3P9GsNr/RK/Z/0Kt1/8/qtT/PanT/zqn0f84pc//PajQ/z+p0f9DrNT/RK3W/0au + 1/9JsNn/TLPb/0603P9QtN7/Urfg/1W54f9XuuP/Wrvk/1y85f9fvub/YcDo/0B4j/8LDg//EBAQ/xAQ + EP8QEBD/EBAQ/wIEBP8AAAD/Li4u/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9BQUH/AgIC/wAAAP8AAAD/AAAA/wYGBv8rKyv/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PDw8/zY2 + Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf8+Pj7/NjY2/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP+7u7v/u7u7/7q6uv/Dw8P/z8/P/8/Pz//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//nZ2d/wsL + C/8rKyv/NTU1/zY2Nv82Njb/NjY2/zY2Nv87Ozv/RUVF/0VFRf9FRUX/RERE/wICAv8EDBD/Z8bv/2PD + 7P9hwev/X7/p/1y+6P9avOb/V7rl/1a65P9TueP/ULfh/0214P9MtN7/SbPc/0ew2/9Er9n/Qq3X/0Cr + 1f89qNP/O6fR/zim0P8+p9D/QKrS/0Ot1P9Erdb/R6/Y/0qx2f9Ms9v/T7Td/1C13v9Tt+D/Vbni/1i6 + 4/9au+T/Xb7m/2C/5/9hwOj/ZMLq/2fD6/9fsdb/Gisx/xASEv8QEBD/AgIC/wAAAP8uLi7/RERE/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yEhIf8AAAD/AAAA/wAA + AP8AAAD/AAAA/x8fH/9FRUX/RUVF/0VFRf9BQUH/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/Nzc3/0VF + Rf9FRUX/RUVF/0FBQf8pKSn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/Pz8//z8/P/9DQ0P/Q0ND/0NDQ/9DQ + 0P/Q0ND/0NDQ/9DQ0P/Pz8//xsbG/xMTE/8ICAj/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2 + Nv9ERET/RUVF/0VFRf9FRUX/AwMD/wEHCf9lw+z/ZMLs/2LC6/9fwOr/Xb7o/1q95/9Xu+X/Vrnk/1O5 + 4/9RuOL/TrXg/0yz3v9Ks93/R7Db/0Sv2f9CrNf/QKvV/z6q1P88qNL/OKbQ/z6o0f9Bq9P/Q6zU/0Wu + 1/9IsNj/SrHa/0203P9PtN3/Tq/W/0CKp/8yZnv/JElZ/yFFVP8dO0j/GjQ+/xkwOv8aMTr/HTVA/yJB + Tv8nSVj/LlNj/0BxiP8LFRn/AAAA/zIyMv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf85OTn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DAwM/zo6 + Ov82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xQUFP/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//xcXF/x4eHv8EBAT/AAAA/wIC + Av8mJib/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zc3N/9FRUX/RUVF/0RERP8AAAD/AQUG/2bC + 7P9kw+z/YsLs/1/A6v9dv+n/W73n/1i75v9WuuT/U7nj/1G44v9OtOD/TLPe/0q03f9Hsdv/RK/Z/0Kt + 1/9ArNb/PqrU/zyo0v85p9H/PqjR/0Kr0/9ErNX/Ra3X/0mx2f9Lsdr/TbPc/0+13f8JDxH/EBAQ/xAQ + EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wUFBf8AAAD/LCws/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/yMjI/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/Kysr/zY2Nv82Njb/Pj4+/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5ycnP/Q0ND/0NDQ/8/P + z//R0dH/i4uL/wgICP8NDQ3/dHR0/35+fv81NTX/BwcH/wAAAP8BAQH/MDAw/zY2Nv82Njb/NjY2/zY2 + Nv82Njb/NTU1/0RERP9FRUX/RUVF/wEBAf8BBAX/ZsPs/2TD7f9iwuz/YMHr/12/6f9bvej/Wbzm/1a6 + 5f9TueP/Ubfi/0614P9MtN//SrPd/0ix2/9FsNr/Q67Y/0Gr1v8+qtT/PKnT/zqn0f8/qdH/QqrT/0Os + 1f9Frtf/SbDZ/0uy2/9NtNz/SrLb/wwPDv8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ + EP8QEBD/EBAQ/xAQEP8QEBD/CAgI/wAAAP8dHR3/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ICAg/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkJCf9CQkL/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/1ZWVv8+Pj7/DAwM/w0NDf8MDAz/gYGB/+Pj4//f39//29vb/9zc + 3P/b29v/wMDA/wkJCf8BAQH/KCgo/zY2Nv82Njb/NjY2/zY2Nv82Njb/RUVF/0VFRf9FRUX/AQEB/wAE + Bv9Muun/YcLs/2TC7P9gwev/Xb/q/1u+6P9ZvOf/Vrrl/1S65P9SuOL/T7bg/0203/9LtN7/SLDb/0Ww + 2v9Drtj/QazW/z+q1f89qNP/OqfR/xWWyP8Qlcj/C5PJ/w6Vy/8Rl83/EpnP/xGZ0f8SmtL/EDZC/xAQ + EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8LCwv/AAAA/xUV + Ff9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0FBQf8EBAT/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/GRkZ/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYG + Bv9TU1P/7e3t//7+/v/////////////////+/v7///////X19f/b29v/29vb/ywsLP8BAQH/NDQ0/zY2 + Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf8BAQH/AAcJ/xal5f8VpeT/FqTj/xCh4f8UouD/Iafh/0Cz + 4/9TueX/Vbrk/1K34v9QtuH/TbTf/0u03v9Jstz/RbDa/0Ou2P9Crdf/P6vV/z2p0/87qNL/D5TH/xCW + yf8Qlsr/EJfM/xGYzv8Rmc//EZnR/xKa0/8RdJz/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ + EP8QEBD/EBAQ/xASEf8QHyX/EmKF/w4ODv8AAAD/BAQE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/Kysr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/6enp//7+/v/ExMT/Wlpa/7y8vP/+/v7///////// + ///////////////////r6+v/29vb/yIiIv8GBgb/NTU1/zY2Nv82Njb/NTU1/0RERP9FRUX/RERE/wAA + AP8ACxD/Fqjp/xWl5f8VpOP/FaTi/xSi4P8Uod//FKHd/xSg3P8Un9r/EJ3Y/xKc1/8dodj/Nqva/0Ww + 2/9GsNr/Q67Z/0Gt1/8/q9X/ParU/zuo0v8PlMf/EJXJ/xCXy/8Ql8z/EZjO/xGZ0P8RmtH/EprT/xKb + 1P8QFBX/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBMU/xAgJf8Tir3/FZ3Z/xARD/8QDxD/EBAQ/wAA + AP8CAgL/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8iIiL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP/+/v7/h4eH/wAAAP8AAAD/AAAA/3Nzc//////////////////////////////////t7e3/29vb/wsL + C/81NTX/NjY2/zY2Nv83Nzf/RUVF/0VFRf9FRUX/AwMD/wAGBv8Wp+j/FaXl/xWl5P8VpOL/FaPh/xSi + 3/8Uod7/FKDc/xOf2/8Tntn/E53X/xKc1v8Sm9T/EprS/xKZ0f8Pl87/D5jN/xmazf8qoc//N6bR/xCU + x/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa0v8Sm9P/EpvU/xASD/8QEBD/EBAQ/xAQEP8QFBX/EBkc/xOD + s/8VpeP/FaXk/xE1Qv8QEhP/EBAQ/xAQEP8QEBD/AAAA/wMDA/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PT09/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//7+/v8QEBD/AAAA/wAAAP8AAAD/DAwM//7+ + /v/////////////////////////////////b29v/ERER/y0tLf82Njb/NjY2/0FBQf9FRUX/RUVF/0RE + RP8CAgL/AAcK/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc + 1P8SmtP/EZnR/xGZz/8RmM7/EJbM/xCWyv8Qlsn/EJXI/xCVyf8Ql8v/EZfN/xGZz/8RmdD/EprS/xKc + 1P8SnNX/EV57/xARDv8QLDX/EoW1/xSi3/8Uod7/FKLg/xSZ0/8QFRX/EBAQ/xAQEP8QEBD/EBAQ/xAR + Ev8ACQ3/AAAA/0FBQf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RESP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/xkZGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD//v7+/xAQEP8AAAD/AAAA/wAAAP8ODg7//v7+//////////////////////////////////X1 + 9f9TU1P/ICAg/zY2Nv81NTX/RERE/0VFRf9FRUX/QEBA/wAAAP8ACQz/Fqbm/xam5v8VpeT/FaTj/xWj + 4f8UouD/FKHe/xSh3f8Tn9v/E5/a/xOe2P8Sndb/EpzV/xKa0/8RmtH/EZrQ/xGYzv8Ql8z/EJbK/xCW + yf8Qlcj/EJbK/xCWy/8Rl83/EZjP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh + 3v8SY4T/EBMU/xAQEP8QEBD/EBAQ/xAQEP8QEA//E2GC/wc7Uv8AAAD/KCgo/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/Xl5e/wEBAf8HBwf/Dg4O/+7u + 7v///////////////////////////////////////////1dXV/8kJCT/NjY2/0JCQv9FRUX/RUVF/0VF + Rf8wMDD/AAAA/wY4T/8Wp+f/Fqbm/xWl5P8VpOP/FaTi/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xOe + 1/8SnNX/EpvT/xKa0f8RmdD/EZjO/xCXzP8Ql8v/EJXJ/xCVyP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa + 0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/EV9//xAPD/8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAT + E/8Xqer/EYi9/wAAAP8KCgr/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/2xsbP/+/v7///////////////////////////////////////// + ///+/v7/MDAw/zExMf85OTn/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/DnWj/xan5/8Wpub/FaXl/xWk + 4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCW + y/8Qlsn/EJXI/xCVyv8Ql8z/EZfN/xGZz/8RmdH/EprS/xKc1P8SnNb/E53X/xOe2f8Tn9v/FKHc/xSh + 3v8Uod//EBUV/xAQEP8QEBD/EBAQ/xAQEP8QFRb/Fabn/xep6/8Xqez/AAgL/wEBAf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8zMzP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsL + C/9/f3///v7+//////////////////////////////////7+/v8JCQn/Nzc3/0VFRf9FRUX/RUVF/0VF + Rf9ERET/AgIC/wAEBf8VpeX/Fqfo/xam5v8VpeX/FaTj/xWk4v8UouD/FKHf/xSh3f8UoNz/E5/a/xOe + 2P8Tndf/EpzV/xKc1P8SmtL/EZnQ/xGYzv8RmM3/EJbL/xCWyf8Qlcj/EJbK/xCXzP8RmM7/EZnP/xGZ + 0f8Sm9P/EpzU/xKc1v8Tntj/E57Z/xOf2/8UoNz/FKHe/xSi4P8TgrL/EBAR/xAQEP8QEBD/EBAP/xNg + gf8WqOr/F6nr/xep6/8ACQz/AAAA/0JCQv9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8iIiL/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/QUFB/yEhIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/kJCQ//7+/v////////////// + ////////oKCg/xkZGf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8CAgL/AAME/xan6f8Wp+j/Fqbm/xWl + 5f8VpeT/FaTi/xWj4f8Uod//FKHd/xSg3P8Tn9r/E57Z/xOd1/8SnNX/EpvU/xKa0v8RmdD/EZnP/xGX + zf8Ql8v/EJXJ/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/EpzW/xOe2P8Tntn/E5/b/xSh + 3f8Uod7/FKLg/xWj4f8SWnf/EA8P/xAQEP8QEBD/Fqfo/xao6v8XqOv/F6ns/wY3Tv8AAAD/HBwc/0VF + Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/zMzM/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/xwc + HP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KCgr/AgIC/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DQ0N/56env/+/v7///////X19f8NDQ3/RERE/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/Pj4+/wAAAP8BFyD/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh3/8Uod7/FKDc/xOf + 2v8Tntn/E53X/xKc1f8Sm9T/EpvS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJbJ/xCWyv8Qlsz/EZjO/xGZ + z/8RmtH/EprT/xKc1P8Sndb/E57Y/xOe2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWj4v8RO0v/EBUX/xWl + 5f8WqOn/Fqjq/xeo6/8Xqez/FJnW/wAAAf8DAwP/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/KCgo/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/0VFRf9ERET/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woK + Cv+0tLT/CwsL/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8YGBj/AAAA/w96qv8WqOn/Fqfo/xan + 5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh3v8UoNz/E5/a/xOe2f8Tndf/Ep3W/xKb1P8SmtL/EZnQ/xGZ + z/8Rl83/EJbL/xCWyv8Qlsn/EJbK/xCXzP8RmM7/EZnP/xGa0f8SmtP/Ep3V/xKd1v8Tntj/E57Z/xOf + 2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWk4/8Vntr/Fqfn/xao6f8WqOr/F6nr/xep7P8Xq+//AAYI/wEB + Af9DQ0P/RUVF/0VFRf9FRUX/AAAA/wAAAP8BAQj/ISOo/wAAAP8AAAD/AAAA/wAAAP86Ojr/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf86Ojr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9ERET/RUVF/0VFRf9ERET/ICAg/wEB + Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/Ojo6/0RERP9FRUX/RUVF/0VF + Rf9FRUX/RERE/wICAv8ACg3/F6rs/xao6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg + 3P8Tn9r/E57Z/xOd1/8SnNb/EpvU/xKa0v8RmtH/EZjP/xGYzf8Qlsv/EJbK/xCWyf8Qlsr/EJfM/xGY + zv8Rmc//EZrR/xKa0/8SndX/Ep3W/xOe2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWj4f8VpOP/FaXk/xam + 5v8Wp+f/Fqjp/xao6v8Xqev/F6rt/xeq7v8EKDn/AAAA/xkZGf9FRUX/RUVF/0VFRf8UFBT/AAAA/wAA + AP8fIZ3/KizQ/xgZev8AAAD/AAAA/wAAAP8zMzP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8BAQH/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/BAQE/0FBQf9ERET/RUVF/0VFRf9AQED/AAAA/wESGf8XqOr/Fqfp/xan + 6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSi3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1v8Sm9T/EprS/xGa + 0f8RmM//EZjN/xCWy/8Qlsr/EJbJ/xCWyv8Ql8z/EZjO/xGZz/8RmtH/EprT/xKd1f8Sndb/E57Y/xOe + 2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWk4/8VpeT/Fqbm/xan5/8WqOn/Fqjq/xep6/8Xqu3/F6ru/xSa + 2f8AAAH/AQEB/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8qLND/KizQ/ygqyv8AAAD/AAAA/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/MzMz/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RERE/xQUFP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/woK + Cv9ERET/RERE/w8PD/8AAAD/EYm//xep6/8WqOn/Fqfo/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh + 3v8UoNz/E5/a/xOe2f8Tndf/EpzW/xKb1P8SmtL/EZrR/xGYz/8RmM3/EJbL/xCWyv8Qlsn/EJbK/xCX + zP8RmM7/EZnP/xGa0f8SmtP/EpzU/xKd1v8Tntj/E57Z/xOf2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWl + 5P8Wpub/Fqfn/xao6f8WqOr/F6jr/xep7P8Xqu7/G6zv/wIICf8AAAD/NjY2/0VFRf9FRUX/RUVF/zMz + M/8AAAD/AAAA/yos0P8sLtb/KizR/ykrz/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AwMD/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wEBAf8RERH/PDw8/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zMz + M/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/z09Pf8DAwP/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAv8hISH/AgIC/wAICv8Xqu3/F6nr/xao + 6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg3P8Tn9r/E57Z/xOd1/8Sndb/EpvU/xKa + 0v8RmdD/EZjP/xGXzf8Qlsv/EJbK/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/Ep3W/xOe + 2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWk4f8VpOP/FaXk/xam5v8Wp+f/Fqfo/xao6v8XqOv/Eqjs/2nI + 8/94zvb/O2R3/wAAAP8CAgL/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/FRZo/yst0/8sLtb/KizQ/yIk + rf8AAAD/AAAA/wcHB/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf8WFhb/AAAA/wAAAP8AAAD/AQEB/xAQEP88PDz/RERE/0VFRf9FRUX/RUVF/0VF + Rf9CQkL/IiIi/wcHB/8RERH/MzMz/0VFRf8EBAT/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8MDAz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CVBx/xeq7P8Xqev/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh + 3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJXI/xCW + yv8Ql8z/EZjO/xGZz/8RmdH/EpvT/xKc1P8SnNb/E57Y/xOe2f8Tn9v/FKDc/xSh3v8UouD/FaPh/xWk + 4/8VpeT/Fqbm/xan5/8Wp+j/F6jq/ze07f90zPT/d871/3jP9v980Pf/AwoN/wAAAP8/Pz//RUVF/0VF + Rf9FRUX/AAAA/wAAAP8QEVT/KizQ/ywu1v8sLtb/KizQ/w0OQ/8AAAD/AAAA/zg4OP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8CAgL/FBQU/z09 + Pf9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP84ODj/AwMD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEHCf9Cu/L/GKrs/xap + 6/8Wp+n/Fqfo/xam5v8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3f8UoNz/E5/a/xOe2f8Tndf/EpzV/xKb + 1P8SmtL/EZnQ/xGZz/8Rl83/EJfL/xCVyf8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8Sm9P/EpzU/xKc + 1v8Tndf/E57Z/xOf2/8Uodz/FKHe/xSh3/8Vo+H/FaTi/xWl5P8VpeX/Fqfn/xSm6P9uyfH/csvz/3TM + 9P92zfT/eM/2/3vO9f8dMTv/AAAA/wYGBv9ERET/RUVF/0VFRf8AAAD/AAAA/wICC/8qLND/LC7W/ywu + 1v8qLND/KizQ/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/DAwM/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Kk5d/27K9P9nxvL/Eqbq/xao6f8Wp+j/Fqbm/xWl5f8VpOP/FaTi/xSi + 4P8Uod//FKHd/xSg3P8Tn9r/E57Y/xOd1/8SnNX/EpzU/xKa0v8RmdD/EZjO/xGYzf8Qlsv/EJbJ/xCV + yP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/FKHf/xWj + 4f8VpOL/FaXk/xOk5f9Tvuz/bMjw/27I8f9xy/P/c8z0/3XN9P93zvX/ec/2/3rN8/8CBwj/AAAA/z4+ + Pv9FRUX/RUVF/wAAAP8AAAD/DxBP/yos0P8sLtb/LC7W/yst0v8qLND/HiCY/wAAAP8AAAD/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/yIiIv8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9ERET/NDQ0/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wIJC/9wzPb/bcr0/2zI + 8v9qx/H/Gajp/xan6P8Wpub/FaXl/xWk4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc + 1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCWy/8Qlsn/EJXI/xCWyv8Qlsv/EZjN/xGYz/8RmdD/EprS/xKb + 1P8SnNX/E53X/xOe2f8Tn9r/FKDc/xSh3v8Uod//FaPh/xWk4v8kquX/Z8Xu/2nG7/9rx/D/bsfx/3DJ + 8v9yzPP/dMz0/3fO9f94zvb/e9D2/xIgJ/8AAAD/AQEB/0RERP9FRUX/AAAA/wAAAP8VFmj/KizQ/y0v + 1v8xM9f/Ky3T/yos0f8qLND/AAAA/wAAAP8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/ERER/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsL + C/8AAAD/AAAA/wAAAP8AAAD/Q3qT/3DL9P9tyvT/bMjy/2jG8f9lxvH/RLjr/xem5v8VpeT/FaTj/xWk + 4v8UouD/FKHf/xSh3f8ToNv/E5/a/xOe2P8Tntf/EpzV/xKb0/8Sm9L/EZnQ/xGYzv8Rl8z/EJfL/xCV + yf8Qlcj/EJXJ/xCXy/8Rl83/EZnP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh + 3/8RoeD/XcDr/2TC7P9mxO7/acbv/2vH8P9tyPH/b8ny/3LL8/90zPT/ds31/3fO9v97z/b/es3z/wIH + CP8AAAD/MzMz/0VFRf8AAAD/AAAA/yos0P8qLNL/MTPX/zY42f8sLtb/Ky3U/yos0P8RElX/AAAA/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/QEBA/wAAAP8AAAD/MjIy/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zg4OP8BAQH/AAAA/wIIC/9wyvT/bsr0/23J + 8/9rx/L/aMbx/2XF8P9kxO//YMLt/xGi5P8VpOP/FaPh/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xKd + 1v8SnNX/EprT/xGa0f8RmtD/EZjO/xCXzP8Ql8v/EJbJ/xCUx/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa + 0v8Sm9P/EpzV/xOd1/8Tntj/E5/a/xSg2/8Uod3/O7Hk/17A6v9hwev/Y8Ls/2bE7f9oxu//asfw/23I + 8f9uyfL/ccrz/3LL9P91zfX/d872/3nO9v980Pf/HjQ+/wAAAP8DAwP/Ly8v/wAAAP8AAAD/KizQ/yst + 1f82N9n/NjjZ/ywu1v8tL9b/Ky3U/yos0P8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/DQ0N/wAA + AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RERE/wICAv8CBQf/bcLq/3DL9f9tyvT/bMnz/2rI8v9nxvH/ZcXw/2PE7/9gwu3/XsDs/x6n + 5P8Vo+H/FKLg/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCW + yv8Qlsn/D5TH/xCVyf8Ql8v/EJfM/xGYzv8RmdD/EZrR/xKa0/8SnNX/Ep3W/xOe2P8Tn9r/GKHc/1q8 + 5/9cvuj/XsDq/2DB6/9iwuz/ZMPt/2fF7/9px/D/a8fw/23J8v9wyvP/csvz/3TM9P9Jf5f/CQ8S/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8qLND/LC7W/zY42f82ONn/LC7W/zEz1/8sLtb/KizQ/wAA + AP8AAAD/IiIi/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8ICAj/AAAA/zFZbP9yy/X/b8r0/23K + 9P9syfP/acjy/2bG8f9lxvD/YsPu/1/B7f9dwOz/W7/r/0W25v8Uot//FKHe/xSh3P8Tn9v/E57Z/xOd + 1/8SnNb/EpzU/xKa0v8RmdH/EZnP/xGXzf8Ql8z/EJXK/xCVyP8PlMf/EJbJ/xCWyv8Ql8z/EZjO/xGZ + z/8RmtH/EprT/xKc1P8SnNb/D5zX/0u14v9WuuX/WLvm/1u96P9dv+n/X8Hr/2LC7P9kw+3/ZsXu/2jG + 7/9rx/D/bcjx/2/K8/9xyvP/HDM9/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAE/yos + 0P8tL9b/NjjZ/zY42f8wMtf/NjjZ/zEz1/8qLND/AAAA/wAAAP8GBgb/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8jIyP/AAAA/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9ERET/HBwc/wAAAP8CBQb/csz1/3DL9f9tyvT/bMr0/2rI8v9nxvH/Zcbx/2PF8P9hw+7/X8Ht/13A + 7P9bv+v/WL7p/1S76P8RoN3/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8RmM//EZjN/xCW + y/8Qlsr/EJTI/w+Ux/8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8SmtL/EpvU/yml2f9Qt+L/U7jj/1a7 + 5f9Xu+b/Wr3o/1y/6f9ewOr/YcHr/2PD7f9lxO7/Z8Xv/2nG8P9rx/H/bsny/3DJ8/8AAAD/AAAA/wAA + AP8AAAH/AwMP/wAAAP8AAAD/AAAA/wAAAP8VFmj/Ky3T/zM01/82ONn/NjjZ/zQ22P82ONn/NjjZ/yst + 0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP83Nzf/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zc3N/8AAAD/AggL/3PN9v9zzPb/b8v1/23K + 9P9syfP/acfy/2bF8f9lxPD/Y8Tv/2DC7v9dwOz/XMDr/1q/6/9Xven/Vbzo/1O65v8jpt3/E5/a/xOe + 2P8Tndf/EpzV/xKb0/8SmtL/EZnQ/xGYzv8Rl83/EJfL/xCVyf8Qlcj/D5TG/xCUyP8Qlsr/EJbL/xGY + zf8RmM//EZnQ/xKa0v9LtN7/TbTg/1C34f9TuOP/Vbrk/1e85v9Zvef/W77p/12/6v9gwOv/YsLs/2TE + 7v9mxe//acfw/2rH8f9tyfL/b8nz/wAAAP8AAAD/AAAA/woLNf8rLdT/Ky3T/ywu1v8sLtb/FRZm/xUW + aP8rLdX/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/LC7W/xMUY/8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/zU1Nf8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP9JSUn/AgIC/wIFB/9mtdr/c832/3DM9f9uyvT/bMr0/2rJ8/9pyPL/ZcXx/2TE8P9ixO//X8Ht/13A + 7P9cv+v/Wb/q/1a96f9Uu+f/Urrm/1C45P9BsuH/E57Y/xKd1v8SnNX/EpvT/xKa0f8RmdD/EZjO/xGX + zP8Ql8v/EJXJ/xCUx/8PlMb/EJXI/xCVyf8Qlsv/EZjN/w+Xzv84qdf/SbLc/0u03v9NtN//T7bh/1G4 + 4v9TueT/Vrvl/1i95/9bvej/Xb/q/1/A6/9hwuz/Y8Pt/2XF7/9nxe//acbw/2zJ8f9uyfL/T4+s/wAA + AP8AAAD/AAAA/wAAAP8sLtb/KizP/ywu1v8sLtb/KSvL/ywu1v8xM9f/NjjZ/zEz1/82ONn/NjjZ/zY4 + 2f8sLtb/FRZo/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/w8P + D/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9KSkr/TExM/wICAv8AAAD/SH+Z/3PN9/9zzPb/b8v1/23K + 9P9syvT/asnz/2bF8f9lxPD/Y8Xw/2HD7v9ewe3/XMDs/1q/6/9Yvur/Vbzo/1S75/9SueX/T7jk/0y2 + 4v9KteH/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Uxv8PlMf/EJXJ/xCX + y/8cnM7/Q63Y/0Sv2v9HsNv/SrLd/0y03/9OteD/Ubfi/1O54/9VuuX/V7zm/1m96P9bvun/Xr/q/2DB + 6/9iw+3/ZMTu/2bF7/9px/D/a8fx/23J8v9vyfP/ccr0/xwzPf8AAAD/AAAA/wAAAP8rLdX/Ky3T/ywu + 1v8oKsj/Ky3T/ywu1v82ONn/LC7W/ywu1v82ONn/NjjZ/ywu1v8VFmj/AAAA/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/zQ0NP9FRUX/RUVF/0VFRf9ERET/UFBQ/0xM + TP8CAgL/AAAA/zNcb/9zzPb/c8z2/3HN9v9uy/X/bMn0/2rI8/9px/L/ZcXx/2TE8P9ixO//YMLu/13B + 7f9cv+v/Wb/q/1e96f9VvOj/Urrm/1G55f9Ot+P/S7Xi/0q04P9Hs9//JKPX/xKa0v8RmdH/EZjP/xGX + zf8Ql8z/EJXK/xCVyP8PlMf/D5PF/w+Ux/8Olcj/O6jT/0Cr1v9Crdj/RK7Z/0ev2/9Jsdz/S7Pe/021 + 4P9PtuH/Urjj/1S55P9Wu+b/WL3n/1u+6f9dv+r/X8Dr/2HC7P9jxO7/ZcXv/2fF7/9px/H/a8ny/23J + 8v9wyvP/csv0/1eZt/8AAAD/AAAA/xUWaf8qLM7/LC7W/ygqx/8qLND/LC7W/zQ22P8sLtb/LC7W/zY4 + 2f82ONn/LC7W/xMUYf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAA + AP8AAAD/AAAA/0VFRf9ERET/TU1N/1FRUf9ISEj/AgIC/wAAAP8eNED/dM32/3PN9/9xzPb/b8v1/23J + 9P9syfT/asnz/2fG8v9lxPD/Y8Tw/2HD7/9ewu3/XMDs/1u/6/9Zvur/Vbzp/1S75/9Suub/T7jk/0y2 + 4/9LteH/SbPg/0ax3v9EsNz/PKzZ/xCY0P8Rmc//EZfN/xCWy/8Qlsr/EJTI/w+Uxv8Pk8X/J53L/zuo + 0v89qtT/P6vV/0Ks1/9Drtn/RbDa/0ix3P9Ks97/TLTf/0+24f9Rt+L/U7nk/1W75f9XvOf/Wb7o/1u+ + 6f9dv+r/X8Hs/2LD7f9kxO7/ZsXv/2jG8P9qyPH/bcny/27K8/9wyvT/csz1/wAAAP8AAAD/AAAA/yst + 0v8sLtb/Ky3U/ykrzP8sLtb/LC7W/zI01/8sLtb/NjjZ/zY42f8sLtX/AAAH/wAAAP8AAAD/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/FxcX/1FRUf9RUVH/Nzc3/wIC + Av8AAAD/HzdB/3XO9/9zzff/csz2/3HN9v9tyvT/bMn0/2rI8/9ox/L/ZcXx/2TE8P9ixO//YMPu/13B + 7f9cwOz/Wb7q/1e96f9VvOj/U7vn/1G55f9Ot+T/TLbi/0u04f9ItN//RbHe/0Ow3P9Brtr/P63Z/xKY + zv8Rl8z/EJfL/xCWyf8Qlcf/D5TG/zakzf84ptD/OqjS/zyp0/8+qtX/Qa3X/0Kt2P9Ertr/R7Db/0qy + 3f9MtN//TbXg/1C34v9SueP/VLnl/1a75v9Yvej/W77p/12/6v9ewOv/YcLt/2PE7v9lxe//Z8bw/2nH + 8f9ryPL/bcjy/2/K8/9xy/T/c8z1/wAAAP8AAAD/KCrE/yst0v8sLtb/KCrH/yos0P8sLtb/NjjZ/ywu + 1v82ONn/NjjZ/yst0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wAAAP8AAAD/UVFR/yMjI/8AAAD/AAAA/zNcbv92zvf/dM33/3PM9v9xzPb/bsr0/0WM + pf9artH/acjy/2fG8f9lxfH/Y8Tw/2DD7/9ewu7/XMDs/1q/6/9Yver/Vrzp/1S86P9Suub/ULnl/0y3 + 4/9LteL/SrTg/0ay3/9EsN3/Qq/b/0Cu2v8+rNj/PKvX/yOf0P8Qlsr/EJbJ/w+Ux/8Pk8X/NaPN/zel + z/85p9H/O6nT/z2p1P9ArNb/Qq3Y/0Su2f9FsNv/SLLd/0qz3v9MtOD/T7bh/1G44/9TueT/Vbvm/1e9 + 5/9Zvuj/W77p/13A6/9fwez/YsPt/2XE7v9mxe//aMXw/2nH8f9syPL/bcnz/3DK9P9xy/X/AAAA/wAA + AP8FBRv/KizO/ywu1v8sLtb/KCrH/yst0/8sLs//Ky3S/zY42f82ONn/KizR/wAAAP8AAAD/IiIi/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/R0dH/1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAF + B/9Jf5j/ds/4/3TO+P9zzff/ccz2/3DM9v9tyvX/S5aw/0WOp/9Djaf/QYuj/0mZtv9bt+D/YMTv/13B + 7f9cwOv/Wb7q/1e96f9VvOn/U7vn/1G65v9PuOT/TLbj/0u14f9JtOD/RbLe/0Ow3f9Cr9v/P63Z/z6r + 2P88q9b/OajU/zOm0v8PlMj/D5TG/w+Txf80osz/NqTO/zim0P87qNL/PanU/z6r1v9Brdf/Qq3Z/0Sv + 2v9Isdz/SrPe/0u03/9OtuH/ULji/1K45P9UuuX/Vrzn/1i96P9avun/Xb/q/17A6/9gwu3/YsPu/2XE + 7v9mxfD/Y73l/zVkef8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8rLdX/KizQ/ywu1v8rLdL/KCrJ/ywu + 1v8sLtb/LC7O/zAyyP8pK87/AAAA/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/SUlJ/1FR + Uf9RUVH/UVFR/wAAAP8AAAD/AAAA/wAAAP8ABwn/FZfU/0O99v90zvj/c8z3/3LM9v9wzPb/bcr1/2zJ + 9P9Vpsf/RI2n/0OMpv9Bjab/QIuk/z+LpP8+i6T/PImh/zuJo/9Cl7b/S6jO/1C13/9Suub/ULrm/0y2 + 5P9LteL/SrTg/0ey3v9FsN3/QrDb/0Cu2v8+rNj/PazX/zqq1v84p9T/M5/I/yuLq/8ObYv/DGiF/zSj + zP82o83/N6bQ/zmn0f87qdP/ParV/0Gt1/9Crtj/Q67a/0ax2/9Isd3/SrPf/0y04P9OtuL/Ubjj/1O5 + 5f9Vu+b/V7vn/1m96P9bvun/XcDr/1/B7P8xYXb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wsLN/8qLM//KizQ/ywu1v8pK8z/LC7W/ywu1v8sLtb/LC7W/ywu1v8ICSv/AAAA/wAA + AP8AAAD/AAAA/wAAAP80NDT/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9ERET/TU1N/1FRUf9RUVH/UVFR/1FRUf9QUFD/Dg4O/wAAAP8AAAD/AAgK/xmu + 8/8YrfT/Ga3z/3DL9v9yzPb/ccz2/27M9v9syfT/a8jz/1+33f9Djab/Qo2m/0GMpf8/iqT/Pouk/z2K + o/87iKL/Ooeh/zmGoP84hqD/NoWf/zWFnv8zg53/MoKb/zB/mf8vfpf/LHyW/yx8lv8qfJb/KXuU/yd3 + kf8meZL/JXiS/yR4kf8edZD/QnF//2JiYv+5ubn/MqLL/zSjzf82pM7/OKbR/zup0/88qdT/P6vW/0Gu + 2P9Crtn/RK/b/0iy3P9Jst7/TLTf/0214f9Pt+L/Ubjk/1S65f9WvOf/WLzo/1q+6f8BAgP/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8cHBv/HB0b/xwdG/8cHRv/HB0b/y4wrf8qLM//KizO/yst + 0f8pK8v/KizO/yst0v8sLtb/LC7W/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/IyMj/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9HR0f/UFBQ/1FRUf9RUVH/UVFR/1FR + Uf9QUFD/MzMz/wMDA/8AAAD/AAMF/wc3Tv8ZrvT/GK30/xit8/8YrfL/Eqry/3DL9v9uzPX/aGVl/21n + Zv9mdn7/ZajE/0KNpf9AjKb/QIqj/z+LpP8+i6T/PIqj/zqHof85h6H/OIag/zeFn/82hp//NIOd/zKD + nf8xgZv/MIKb/y6Amf8tfpn/LH2X/yp7lv8pe5T/JXmU/yx5kP9RcXv/YWFg/5ubm//5+fn/+fn5//X1 + 9f8xocr/NKPM/zajzv83ptD/OafR/zuq1P89qtX/QazX/0Kv2f9Dr9r/RrHc/0iz3f9KtN//TLXg/062 + 4v9QuOP/Urnl/1S65f8vZn7/AAAA/wAAAP8AAAD/AAAA/wAAAP8jJCL/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zg5PP8rLdT/KizO/ywu1v8sLtb/KizR/yoszv8qLM7/Ky3U/ywu + 1v8sLtb/LC7W/x4glv8AAAD/AAAA/wAAAP8AAAD/AAAA/yIiIv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/0VF + Rf9OTk7/UVFR/1FRUf9RUVH/UVFR/1FRUf9RUVH/RUVF/wMDA/8AAAD/AAAA/wAKDv8Vnt3/Ga70/xit + 9P8YrfP/GK7z/xis8v8YrPH/LbLx/23K9f9pdnv//v7+//7+/v/8/Pz/zc3N/4eHh/9nZGP/Ymhp/191 + e/9Te4j/R4CT/0CDmf86g5z/N4Se/zSEnf8ygZz/MoKb/zGAmv80f5f/N3yS/z94iv9Rc37/YWxu/2Bf + Xv+BgoH/0NDQ//7+/v/+/v7///////39/f/6+vr/9fX1/zCgyv8zo8z/NaPN/zalz/85ptH/OqnT/z2q + 1f8/rNb/Qa3Y/0Ku2f9Er9v/R7Ld/0my3v9LtOD/TbXh/0+34/9RuOT/ESYv/wAAAP8AAAD/AAAA/xsc + G/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/KizQ/yst0v8sLtb/LC7W/ywu1v8qLM//KizO/yst0v8sLtb/LC7W/ywu1v8mKLz/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/IiIi/zo6Ov9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RkZG/05OTv9RUVH/UVFR/1FRUf9RUVH/UVFR/1FRUf9QUFD/QkJC/wMD + A/8AAAD/AAAA/wAHCv8IQl3/GbD2/xmu9f8YrfT/GK3z/xiu8/8YrPL/GKzx/xir8P8Xq+//YMXz/2mg + uP/v7+////////////////////////7+/v///////v7+//7+/v/z8/P/5eXl/9TU1P/Hx8f/v8DA/7y8 + vP+/v7//xMTE/9HR0f/j4+P/8vLy//7+/v/+/v7//v7+/////////////////////////////f39//n5 + +f/19fX/L6DJ/zGhy/80pM3/NqTO/zel0P85qNL/O6nU/z2r1v9Ardf/Qq7Z/0Ov2v9GsNz/SLLd/0q0 + 3/9MteD/Trbi/xQtOP8AAAD/AAAA/wAAAP85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/y0tK/8sLtb/LC7W/yoszv8qLND/LC7W/ywu + 1v8sLtb/Ky3T/yoszv8qLND/LC7W/ywu1v8sLtb/LC7W/wICC/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yYm + Jv9RUVH/UVFR/1FRUf9RUVH/LS0t/wMDA/8AAAD/AAAA/wADBP8CGib/GK3z/xmv9f8ZrvX/GK30/xit + 8/8YrvP/GKzy/xis8f8YrPD/F6vv/xer7/8Uqe7/acDn/7Ozs/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////f39////////////////////////9/f3/+fn5//X19f8unsj/MKHK/zOjzP80pM7/NqXP/zmm + 0f87qdP/PKrV/z+s1v9Brdj/Qq/a/0Sv2/9Hst3/SLLe/0q14P85iKj/AAAA/wAAAP8MDAz/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/JiYk/ygqsv8wMtf/LjDW/yos0f8qLM7/KizO/yst0v8uMNb/NjjZ/zEz1/8rLdL/KizO/yst + 0v8sLtb/LC7W/ywu1v8WF2v/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAD + Bf8BExz/F6Tn/xmv9f8ZrvX/Ga/1/xit9P8YrfP/GK7z/xis8v8YrPH/GKzw/xis8P8Xq+//F6ru/xeq + 7f8Zq+7/fX+A//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////8AAAD/YGBg//////////////////39 + /f/5+fn/9fX1/y2ex/8voMn/MaHL/zSkzf81pM7/N6bQ/zmo0v87qdT/PavW/z+s1/9Brtn/Qq/a/0Ww + 3P9Ist3/SbPf/wAAAP8AAAD/AAAA/zk6N/85Ojf/OTo3/zk6N/85Ojf/Ozw5/0JDQP9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9CQ0D/PD06/zk6N/85Ojf/OTo3/zk6N/8xMS//Gxsa/x8gTv8zNdj/NjjZ/ywu + 1v8qLNH/KizO/yoszv8qLM7/Ky3U/zEz1/82ONn/LjDW/yos0P8qLM7/Ky3S/ywu1v8sLtb/LC7W/ywu + 1v8sLtb/Ky3S/xcYcv8WF2v/Fhdr/xUWav8SE1r/Cgoz/wYHIv8FBRz/Bwck/woKMv8RElb/FRZq/wQE + Ff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcwRP8ZsPb/Ga71/xmv9f8YrfT/GK3z/xiu + 8/8YrPL/GKzx/xis8P8YrPD/F6vv/xep7v8Xqe3/F6ns/xSo7P9jY2P//v7+//////////////////// + ////////AAAA//////////////////////////////////////////////////////////////////// + ////////AAAA/wAAAP8AAAD/mZmZ/////////////f39//n5+f/19fX/LJ3G/y6eyP8woMr/MqPM/zSk + zv82pM//OabR/zqo0/87qdT/PqzW/0Gt2P9Cr9r/RK/b/0ax3P9Cps7/AAAA/wAAAP8yMzH/OTo3/zk6 + N/85Ojf/Ozw5/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JD + QP85Ojf/OTo3/zk6N/8xMS//ICAf/xsbGv8nKaX/MzXY/zY42f8uMNb/Ky3U/yoszv8qLM7/KizO/yos + 0f8sLtb/NDbY/zM02P8sLtb/KizR/yoszv8qLM7/KizP/yst0v8sLtX/LC7W/ywu1v8sLtb/LC7W/ywu + 1v8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu1v8sLtb/LC7W/zc4Sf85Ojf/JSUk/xUVFP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DFZ6/xit8/8YrvP/GKzy/xis8f8YrPD/GKzw/xer7/8Xqe7/F6nt/xep + 7P8XqOv/F6jp/2RgX/////////////////////////////////8AAAD/AAAA//////////////////// + ////////////////////////////////////////Pz8//wAAAP8AAAD/AAAA/wAAAP8AAAD///////// + ///9/f3/+fn5//T09P8rnMX/LZ7H/y6fyf8xocv/M6PN/zWlz/83ptD/OafS/zup1P88qtX/P6zX/0Gt + 2f9Cr9r/RbHc/yNYbv8AAAD/AAAA/z5dev85Ojf/OTo3/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/80NTL/MDAu/xsb + Gv8bGxr/Jiid/zAy1/82ONn/MzXY/ywu1v8rLdT/KizP/yoszv8qLM7/LC7W/zQ22P82ONn/NjjZ/zEz + 1/8sLtb/Ky3S/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yst + 0v8rLdL/MjOG/zk6N/85Ojf/OTo3/zk6N/85Ojf/LzAt/wkKCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wlC + Xf8YrPH/GKvw/xes8P8Xq+//F6nu/xep7f8Xqez/F6jr/xao6v8Xp+j/aWNi//7+/v////////////// + ////////Pz8//wAAAP8AAAD/AAAA/wAAAP9/f3//////////////////////////////////Pz8//wAA + AP8AAAD/WVlZ//////////////////////////////////z8/P/5+fn/9PT0/ymbxP8sncb/Lp7I/zCh + yv8yosz/NKTO/zakz/83ptH/OafS/zup1P8+q9b/QK3Y/0Gu2f9Cr9v/AAAA/wAAAP8AAAD/RH64/zk6 + N/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6N/85Ojf/MjIw/y8vLf8bGxr/Gxsa/yAhWP8sLtb/MTPX/zY4 + 2f82ONn/MTPX/ywu1v8rLdP/Ky3S/y4w1v82ONn/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/NjjZ/zU3 + 2P8zNdj/MDLX/y0v1v8tL9b/LjDW/y8x1v8rLdP/KizO/ygqx/8dHkD/MjIw/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/8vMC3/AAAA/wAAAP8AAAD/AAAA/wAAAP8Pb5v/F6vv/xeq7v8Xqe3/F6ns/xeo + 6/8WqOr/Fqjp/xao6P9qbGz//v7+//////////////////////8AAAD/AAAA/zMzM/9sbGz/AAAA/wAA + AP8AAAD/AAAA/wAAAP9/f3///////8rKyv8zMzP/c3Nz//////////////////////////////////// + /////////Pz8//n5+f/09PT/KZzE/yucxf8tnsf/Lp7J/zGiy/8zo83/NKTO/zal0P84p9L/OqjT/zup + 1f8+qtb/Qa7Z/0Ku2v8AAAD/AAAA/xoaGf9Hjtb/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf85Ojf/ODk2/zExL/8xMS//JiYk/xsbGv8bGxr/Hh4+/yYonf8sLtb/MTPX/zU32P82ONn/NjjZ/zY4 + 2f82ONn/NjjZ/zY42f82ONn/MTPX/yst0/8qLM7/KizO/yoszv8qLM7/KizO/yoszv8rLdT/Ky3V/yMk + d/8bGxr/Gxsa/y8vLf80NDL/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wwM + C/8AAAD/AAAA/wAAAP8AAAD/F6nt/xep7P8XqOv/Fqjq/xao6f8Wp+j/Fqfn/2dvcf/+/v7///////// + /////////////7a2tv////////////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA + AP9mZmb/8vLy/////////////////xkZGf/////////////////8/Pz/+Pj4//T09P8omsL/KZvE/yyd + xv8tnsj/L6DK/zKizP80pM7/NaXP/zem0f85p9L/OqnU/z2q1f8+rNf/Qa3Z/wAAAP8AAAD/DQ0M/1CR + 0f9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zg5Nv8xMS//MTEv/zEx + L/8mJiX/Gxsa/xsbGv8bGxr/Gxsa/xwcKP8jJHj/IyR3/ygqtf8rLdb/LC7W/ywu1v8sLtb/Ky3V/ygq + sP8jJHf/IyR4/x0dM/8bGxr/Gxsa/xsbGv8lJST/Li4s/zExL/80NDL/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/wAAAP8AAAD/F6nr/xan + 6v8WqOn/Fqfo/xan5/8Wpub/ZHF2//7+/v////////////////////////////////////////////// + ////////Pz8//wAAAP8AAAD///////////9/f3//AgIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + //////////////z8/P/4+Pj/9PT0/yeYwf8pnMT/KpzF/yyex/8unsn/MKHL/zKizf80pM7/NqXQ/zem + 0f85qNP/O6nU/z6q1v8/rNf/AAEB/wAAAP8AAAD/Q0RB/1Sn+/9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zs8Of85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//Li4s/yYm + JP8mJiT/JCQj/yIiIP8hIR//JSUj/yYmJP8mJiT/JiYl/zAwLv8xMS//MTEv/zExL/8xMS//MTEv/zU1 + M/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/8SEhL/AAAA/wAAAP8AAAD/Fqfp/xan6P8Wp+f/Fqbm/xam5f9icnj//f39//// + ////////////////////////v7+//wAAAP9/f3//KCgo/wAAAP8AAAD/kJCQ//////////////////// + //////////////////+ZmZn/AAAA/wAAAP8AAAD//////////////////Pz8//j4+P/09PT/JpjA/yeZ + wv8pnMT/K53G/yyeyP8unsn/MaHL/zOjzf80pM//NqXQ/zin0v86qdP/O6nV/z6r1v8kY3z/AAAA/wAA + AP9DREH/Q0NA/1Sn+/9Up/v/T4rF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9AQT7/OTo3/zk6N/85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zEx + L/8xMS//MTEv/zU1M/83ODX/OTo3/zk6N/85Ojf/Pj88/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/QEE+/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8qKyn/AAAA/wAA + AP8AAAD/Fqfn/xam5v8VpeX/FaXk/2Nwdf/9/f3///////////////////////////9dXV3/AAAA/wAA + AP8AAAD/rKys////////////f39//wAAAP8AAAD/AAAA/wAAAP88PDz/////////////////Hh4e/wAA + AP/////////////////8/Pz/+Pj4//Pz8/8lmL//J5jB/yibw/8pnMX/LJ7H/y2fyP8vn8r/MqLN/zOj + zv81pM//NqbR/zmn0v86qNT/O6rV/z6r1/8AAAD/AAAA/wAAAP9DREH/Q0RB/0+Ozf9Up/v/VKf7/0+R + 0v9DQ0D/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf8+Pzz/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/89Pjv/Pj88/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf8+Pzz/OTo3/zk6N/85Ojf/OTo3/zk6N/8kJCL/AAAA/wAAAP8LU3P/FaXl/xWl5P8VpeP/ZW9y//7+ + /v////////////////////////////////8AAAD/AAAA/////////////////wAAAP8AAAD/AAAA/z8/ + P/8/Pz//Pz8//wAAAP////////////////////////////////////////////z8/P/4+Pj/8/Pz/yOX + vv8mmMD/J5nC/ymcxP8qncb/LJ7H/y6eyf8wocv/MqLN/zSkz/81pdD/NqbR/zmn0/86qNT/PKrW/y6A + of8AAAD/AAAA/wAAAP9DREH/Q0RB/0NEQf9Pj8//VKf7/1Sn+/9Up/v/S3We/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/1hZVv/w8PD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/85Ojf/OTo3/zk6 + N/8AAAD/AAAA/wAAAP8VpeT/FaTj/xWj4f9qbW3//v7+/////////////////////////////////wAA + AP9oaGj/////////////////KCgo/6Ghof//////v7+//7+/v/+ioqL//////1NTU/////////////// + /////////////////////////Pz8//j4+P/z8/P/Ipa9/ySXv/8mmMH/J5nC/ymcxf8rncb/LJ7I/y6f + yv8woMv/MqLN/zSkz/81pdD/N6bS/zmo0/86qdX/ParW/w8qNf8AAAD/AAAA/wAAAP8iIiH/Q0RB/0NE + Qf9DREH/Sm2O/1Sn+/9Up/v/VKf7/1Sn+/9HXXD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/cnNw//////90dHL/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/w97qv8VpOL/FqPg/2to + aP/+/v7///////////////////////////////////////////////////////////9/f3//WVlZ/3h4 + eP8AAAD/JCQk/wAAAP+UlJT/AAAA///////////////////////////////////////8/Pz/9/f3//Pz + 8/8hlLv/I5a+/yWYwP8mmMH/KJrD/ymbxf8rncf/LJ7J/y6fyv8xosz/MqLN/zSkz/82ptH/N6fS/zmp + 1P86qdX/PavW/yt4lv8AAAD/AAAA/wAAAP8AAAD/ICAf/0NEQf9DREH/Q0RB/0NEQf9LdZ3/VKf7/1Sn + +/9Up/v/S3Wd/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf////////////////9vcG7/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH///////// + //9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6 + N/85Ojf/OTo3/wAAAP8AAAD/Axki/xWj4f8Wot//amNi//7+/v////////////////////////////// + /////////////////////////////1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/zs7O/+RkZH///////// + //////////////////////////////v7+//39/f/8/Pz/yCTuv8hlLz/I5e//yWYwP8nmcL/KZzE/yqd + xv8snsf/LJ/J/y+gy/8xocz/MqLN/zSl0P82ptH/N6jT/zmp1P87qtX/PavX/z6r2P8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8yMzH/Q0RB/0NEQf9DREH/REpM/1Om+v9Up/v/VKf7/0dcb/9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//Pz8/+goJ//8/Pz//// + ///Pz8//Q0RB/0NEQf9CQ0D/u7u6////////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zk6N/85Ojf/AAAA/wAAAP8AAAD/FKLg/xOh + 3/9mZGP/////////////////////////////////////////////////////////////////8/Pz/wAA + AP8AAAD///////////8AAAD/AAAA/xYWFv8AAAD/SUlJ////////////////////////////+/v7//f3 + 9//z8/P/H5O6/yGTu/8hlL3/JJe//yWYwf8nmcL/KZzF/yqdxv8snsj/LZ/J/y+gy/8yos3/M6PO/zSl + 0P82p9L/N6fT/zmo1P87q9b/PavX/z6r2P9Artn/AgcJ/wAAAP8AAAD/AAAA/wAAAP8AAAD/DQ0M/0JD + QP9DREH/Q0RB/0NDQP9Up/v/VKf7/0+NzP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB///////////////////////+/v7/3Nzb//// + ////////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9CQ0H/OTo3/zxOXv8GDBH/AAAA/wAAAP8Uod//DaDf/15fX//+/v7///////////////////////// + /////////////////////////////wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA + AP8AAAD///////////////////////7+/v/7+/v/9/f3//Pz8/8dkrn/H5K6/yGUvP8ilb3/JZjA/yaZ + wf8nmsP/KZvF/yqdx/8snsj/Lp/K/zCgy/8yos3/M6PO/zWl0P82ptL/N6fT/zmo1P88qtb/PKvX/z6s + 2P8+rdn/EpvS/wlNaf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8uLy3/Q0RB/0NEQf9HX3X/VKf7/0+O + zP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9KS0j/VFVS/1RVUv9LTEn/Q0RB/0NEQf94eHb/Q0RB/6Cg + n///////////////////////rq6t/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/R47W/wAAAP8AAAD/AAAA/xSh + 3f8Nndz/bW9v//7+/v////////////////////////////////////////////////9/f3//AAAA/wAA + AP9MTEz/AAAA/wAAAP+UlJT/BwcH////////////Pz8//39/f////////////////////////v7+//v7 + +//39/f/8vLy/xyQt/8ekrn/IJO7/yGUvP8ilr7/JZjA/yaZwv8nmsP/KZvF/yqdx/8sn8n/LqDK/zCh + zP8xos3/MqPO/zWl0P82p9L/N6jT/zmp1f87qtb/PavX/w+Yz/8RmtH/EprS/xKa0/8Sm9T/BTBC/wAA + AP8AAAD/AAAA/wAAAP8AAAD/MjMx/0NEQf9DR0f/VKf7/0dcb/9DREH/Q0RB/0NEQf9DREH/T1BN/1RV + Uv9UVVL/VFVS/1RVUv9UVVL//v7+/////////////////5+fnv9DREH/Q0RB/1NUUf///////v7+/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/SGaB/02a6P88Tl7/AAAA/wAAAP8KUG7/FKDc/xub0f+JiYn///////////////////////// + //////////////////////////////////8AAAD/////////////////f39//wAAAP////////////// + ///////////////////////////////////+/v7/+/v7//f39//y8vL/G4+2/xyQt/8ek7r/IJS7/yGU + vf8jl7//JZjB/yaZwv8omsT/KZvF/yueyP8sn8n/LqDK/zChzP8yos3/MqPO/zWl0P82ptL/N6fT/zmp + 1f8bnM7/EZjO/xGZz/8RmdD/EprS/xKa0/8Sm9T/EpzV/w11oP8AAAD/AAAA/wAAAP8AAAD/EBAP/0NE + Qf9GW2z/VKf7/0NEQf9DREH/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9XWFX//////4yN + i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf/39/b///////////+ioqH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9IY3z/UJDQ/1Sn+/9Up/v/R15z/yorKP8AAAD/AAAA/xSg + 3P8Tn9v/LIy1/7y8vP///////////////////////////////////////////////////////////+7u + 7v////////////////9/f3//AAAA/2JiYv//////f39//yIiIv8AAAD///////////////////////7+ + /v/7+/v/9/f3//Ly8v8ajrX/G4+2/xyRuP8fk7r/IJS7/yGUvf8kl7//JZjB/yeZwv8omsT/KZzF/yue + yP8sn8n/LqHL/zChzP8xos3/M6TP/zWk0P82ptH/MKXR/xCXzP8Rl83/EZjO/xGZz/8RmdD/EprR/xKa + 0/8Sm9T/EpzV/xKc1v8OdaH/AAAA/wAAAP8AAAD/AAAA/0NEQf9QlNj/RE9W/0NEQf9DREH/T1BN/1RV + Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1NUUf/+/v7/R0hF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf///////////3JycP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/RFBY/0t1nv9Me6n/U6b5/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/VKf7/1Sn + +/9Up/v/THqn/0NEQf9DREH/AAAA/wAAAP8AAAD/E5/a/xOe2f9QfI3/6enp//////////////////// + ////////////////////////////////////////Hh4e/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP+Kior//////////////////v7+//v7+//29vb/8vLy/xmNs/8ajrX/G5C3/x2R + uf8fk7r/IJS8/yGVvf8kmMD/JZnB/yeaw/8omsT/KZzG/yudx/8sn8n/L6HL/zChzP8yos3/M6TP/zWk + 0P8Plcn/EJbK/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZrR/xKa0v8Sm9P/EpzU/xKc1v8Tndf/BCc1/wAA + AP8AAAD/EBEQ/0NEQP9TpPX/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV + Uv9UVVL/Q0RB/42OjP9zdHL/QkNA/0NEQf9DREH/Q0RB/8LCwf//////Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NGRf9RmeH/VKf7/1Sn+/9Up/v/VKf7/1Sn + +/9Up/v/VKf7/1Sn+/9Pjs3/S3Wd/0t0nP9DQ0D/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/AAAA/xOf + 2v8Tntn/E57X/2ducf/+/v7///////////////////////////////////////////////////////// + //8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////////////// + ///+/v7/+vr6//b29v/y8vL/F4uy/xmNtP8ajrX/HJC3/x6Suf8fk7v/IJS8/yGVvv8kmMD/JZjB/yea + w/8om8T/KZzG/yqeyP8sn8r/LqHL/y+hzP8xos3/EJTH/xCVyP8Qlcn/EJbK/xCXzP8Rl83/EZjO/xGZ + z/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc1f8SnNb/BCc1/wAAAP8AAAD/Q0RB/1Sn+/9DREH/Q0RB/1RV + Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9/gH7////////////39/f//////4yN + i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9Up/v/VKf7/1Sn+/9NgLP/Rldl/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/MzQx/wAAAP8AAAD/AAAA/wAAAP8LZYr/E57Y/xOe2P8Undb/ZmFg//////////////////// + /////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA//////////////////7+/v/6+vr/9vb2//Hx8f8WirD/F4uy/xmO + tP8aj7b/HJC3/x6Tuv8fk7v/IJS8/yGVvv8kmMD/JZnC/yeaw/8om8X/KZzG/yqdyP8sn8r/LqHL/yGb + yf8Pk8X/D5TH/xCVyP8Qlcn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc + 1f8SnNb/AAAA/wAAAP8PDw7/S3Wd/0lqiv9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV + Uv92d3T/////////////////XF1a/8PEw///////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9ESk7/VKf7/1Ol+P9DRED/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9CQ0D/Kysp/yEiIP8hIiD/Hh4d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dnai/xOe + 2P8Tndf/Ep3W/wqa1/9wcXL//v7+//////////////////////////////////////////////////// + ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////// + /////////v7+//r6+v/29vb/8fHx/xaKr/8WirH/GIyy/xmOtf8aj7b/HJC3/x6Suv8fk7v/IJS9/yGV + vv8kmMD/JZnC/yebw/8om8X/KZzG/yqdyP8rnsn/D5LD/w+SxP8Pk8X/D5TH/xCVyP8Qlsn/EJbK/xCW + y/8Ql8z/EZfN/xGYzv8Rmc//EZnQ/xGa0f8SmtL/EpvT/xKc1P8GNUj/AAAA/wAAAP9DREH/VKf7/0NE + Qf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS//////9UVVL/VFVS/87Ozf/c3dz///////// + ////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/1Sn + +/9HXG//Q0RB/0NEQf8iIyH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CU9s/xOe2P8Tndf/E53X/xKc1v8SnNX/H5XF/7u7u/////////////// + //////////////////////////////////////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA///////////////////////+/v7/+vr6//b29v/x8fH/FYqu/xaK + sP8WirH/GI2z/xmOtf8aj7b/HJG4/x6Suv8fk7v/IJS9/yKWvv8kl8D/JZnC/yebw/8om8X/KZzG/w2Q + wP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlsn/EJXK/xCXy/8Ql8z/EZfN/xGYzv8RmM//EZnQ/xGZ + 0f8SmtL/EprT/xKb1P8AAAD/AAAA/zAxL/9Tpvr/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV + Uv/Dw8L/qaqo/1RVUv9UVVL/wMDA//////+goJ//Q0RB/0NEQf+hoaD/QkNA/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/RVJb/0NEQf8ODg7/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAID/wlPbf8Nb5j/E57Z/xOe2P8Tndf/E53X/xKc + 1v8SnNX/EpzU/xKb0/9YeYX//Pz8//////////////////////////////////////////////////// + //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1lZWf////////////// + //////////////39/f/6+vr/9vb2//Hx8f8Uiaz/FYuv/xaKsP8Wi7H/GI2z/xmOtf8bj7f/HJC4/x6T + uv8flLz/IZS9/yKWvv8kl8D/JZnC/yabw/8Vk7//DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U + x/8Qlcj/EJbK/xCXy/8Ql8z/EZjN/xGYzv8RmM//EZnQ/xGZ0P8RmtH/EprS/wAAAP8AAAD/AAAA/0ZW + ZP9Nf7L/S0xJ/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS////////////qaqo//////////////////// + //9VVlP/Q0RB/6Okov+hoaD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/TorG/0py + mP87Ozn/AAAA/wAAAP8AAAD/AAAA/wAAAP8mXHP/NoKi/0u35f9Kt+X/Srbk/0m25P9JteP/R7Xj/zmv + 3/8Tntn/E57Z/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprR/2JfX//+/v7///////// + ////////////////////////////////////////////////////////////////////////jIyM/39/ + f/9/f3//jIyM/////////////////////////////////////////////f39//r6+v/19fX/8fHx/xGG + q/8Uiq3/FYqv/xaKsP8Wi7L/GY20/xmPtf8bkLf/HJG4/x6Suv8flLz/IJS9/yKWvv8kl8D/IZfB/w2O + vP8Oj77/DpC//w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJfM/xGX + zf8RmM7/EZjP/xGZ0P8RmdH/CU1p/wAAAP8AAAD/Q0RB/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV + Uv9UVVL///////////////////////////////////////////+0tbP//////6GhoP9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0ZVYf9TpPb/QkNA/wAAAP8AAAD/AAAA/xUzQP9Lt+X/Srbk/0q2 + 5P9JtuT/SbXj/0m14/9IteP/R7Ti/0az4v9Gs+H/RbPh/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb + 1P8SmtP/EprS/xGa0f8kjrj/xsbG//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////8/Pz/+/v7//Pz8//Cw8P/EYaq/xKHq/8Uia3/FYqv/xaKsP8Wi7L/GI2z/xmP + tf8aj7f/HJC4/x6Suv8flLz/IJW9/yKVvv8Mjbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S + xP8Pk8X/D5TG/w+Ux/8QlMj/EJXJ/xCVyv8Qlsv/EJbM/xGXzf8RmM7/EZjO/xGZz/8RmdD/AAAA/wAA + AP8hIiD/THuq/0dec/9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv////////////////////////////// + ////////////////////////oKGf/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/VKf7/0NE + Qf8AAAD/AAAA/wAAAP9HsN3/Sbbj/0m24/9IteP/SLXj/0e04v9GtOL/RrPh/0Wy4f9Fs+H/RLLg/0Sy + 3/9Csd//EJzW/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xKa0f8RmdH/DpjQ/2ZlZP/+/v7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v7+//7+/v/+/v7//v7+/+zs7P+7vLz/g39+/15jY/9MdoL/IoKg/wmD + qv8QhKj/EYaq/xKHrP8Uiq3/FYuv/xaKsf8Wi7L/GI2z/xmPtv8aj7f/HJC4/x2Suv8flLz/DYy4/wyM + uP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8Qlcf/EJXI/xCW + yf8Qlsr/EJbL/xCWzP8Rl83/EZjO/xGYz/8AAQH/AAAA/wAAAP9DREH/VKf7/0tMSf9UVVL/VFVS/1RV + Uv9UVVL/VFVS//////////////////////////////////////////////////////+FhYP/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/1On+/9ETVL/Dg4N/wAAAP8AAAD/NYep/0e14v9GtOL/RrPi/0az + 4f9FsuH/RbPh/0Sy4P9EsuD/Q7Hf/0Kx3/9Csd//QLDe/0Cv3f8Yntb/EpzU/xKb1P8SmtP/EprS/xKa + 0f8RmdH/EZnQ/xGZz/8kjrj/YWhp/3t1df+dnJz/wMHB/9jY2P/n5+f/7/Dw//j4+P/8/Pz//f39//39 + /f/+/v7//v7+//39/f/9/f3//Pz8//b29v/v7+//5+jo/93e3v/Fxsb/paWl/4eDgv9tbGz/WGNm/013 + g/8ug5//G4uv/wyIsf8Tiq//Eomu/xCHrP8Phar/DoWp/w+Ep/8Qhaj/EYer/xKHrP8Uia3/FYuv/xaK + sf8Wi7L/GI2z/xmPtv8aj7f/HJC4/xaPt/8Mirb/DIu3/wyMuP8Njbn/DY27/w2OvP8Njr3/DpC+/w6Q + v/8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJfL/xCXzP8Ql8z/EZfN/w59 + qf8AAAD/AAAA/z9APf9Soe//R1tt/1RVUv9UVVL/VFVS/1RVUv9UVVL/5OXk//////////////////// + /////////////////////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9OicT/TX6w/zAx + L/8AAAD/AAAA/xEsOP9Fs+H/RbLg/0Sy4P9EsuD/RLLg/0Ox3/9Dsd//QrHf/0Gx3v9AsN7/QK/d/z+v + 3f8/rtz/Pq7c/zCo2P8SmtP/EprS/xGa0f8RmdH/EZnQ/xGZz/8RmM7/EZjO/xGXzf8Rl8z/EpfL/wyV + y/8Klcv/CZLJ/xOVxv8VksH/GY+8/x6Quf8hj7b/I4+1/ySPtP8ijrP/II2z/x2Ms/8Yi7X/FIy2/xKO + uf8MjLj/CIq4/wiKuP8Iibb/GI+3/xiOtv8XjrX/Foy0/xaLsv8Ti7H/Eoqv/xKJrv8Qh6z/D4Wq/w6E + qf8Ng6f/DoOm/w+Ep/8Qhqn/EYer/xKHrP8Uia3/FYuw/xaKsf8Wi7L/GI2z/xmPtv8aj7b/C4iz/wyK + tP8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+T + xf8PlMb/EJXH/xCVyP8Qlsn/EJbK/xCWy/8Ql8z/EZfM/wAAAP8AAAD/AAAA/0NEQP9Up/v/S0xJ/1RV + Uv9UVVL/VFVS/1RVUv9UVVL///////////////////////////////////////////+Jioj/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/R1xv/1Ok9/9DREH/AAAA/wAAAP8AAAD/Q7Hf/0Ox3/9Csd//QrHf/0Gx + 3v9Bsd7/QK/e/0Cv3f8/r93/P6/d/z+u3P8+rtz/Pa7b/z2t2/89rdr/PKza/xGZ0f8RmdD/EZnQ/xGY + z/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6R + wv8OkcH/DpDA/w6Qv/8Oj77/DY68/w2Ou/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyJtP8LibP/Fo61/xaN + tP8Wi7L/E4qx/xKKr/8SiK3/EIes/w+Gq/8Ohan/DYOn/wyCpv8MgaT/DoOm/w+Ep/8QhKj/EYar/xKH + rP8Uiq7/FYyw/xaKsf8Wi7L/F42z/wqHsP8LiLL/C4mz/wyKtP8MirX/DIu3/wyLuP8NjLn/DY26/w2O + u/8Njrz/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcj/EJbJ/xCW + yv8Qlsv/CEtm/wAAAP8AAAD/Q0RB/1Ke6/9Kc5r/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/X2Be/9nZ + 2f//////////////////////aWpn/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NDQP9Up/v/Q0RB/wAA + AP8AAAD/AAAA/0Cw3v9AsN7/QK/d/0Cv3f9Ar93/P6/d/z+v3P8/rtz/Pq7c/z6u2/89rdv/Pa3b/z2t + 2v88rNr/OqvZ/zqr2f85qtj/D5jP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCV + yP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+Sw/8OkcL/DpHB/w6Qv/8OkL7/DY69/w2OvP8Njbv/DY26/w2M + uf8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsf8Lh7D/Fouy/xOKsf8Siq//Eoiu/xCHrP8Phqv/DoWp/w2C + p/8Ngqb/CoGl/wyBo/8MgaT/DoOm/w+Ep/8Qhan/EYar/xKHrP8UiK3/FYyw/xWKsf8OiK//C4av/wuH + sP8LiLL/C4iz/wyJtP8MirX/DIq2/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY+9/w6Qvv8OkL//DpDA/w6R + wf8PksP/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJbJ/xCWyf8Qlsr/AAAA/wAAAP8NDQz/Q0RB/1Sn + +/9DRED/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/VKf7/0NEQf8ODw7/AAAA/wAAAP8vgqX/P67c/z+u3P8/rtz/Pq/c/z6u + 2/89rdv/Pa3b/z2t2v88rdr/PKza/zus2f86q9n/OavZ/ziq2P84qtj/N6rX/zep1v8Vms//EZfN/xGY + zf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCVyP8QlMf/D5TH/w+Uxv8PksX/D5LE/w+Sw/8OkcL/DpHB/w6Q + wP8OkL//Do++/w2Ovf8Njrz/DY27/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuG + r/8PiK//Eomv/xKIrv8Qh6z/D4ar/w6Fqf8Ng6f/DYOm/wqCpf8JgKP/C4Ci/wyBo/8NgqT/DoOm/w+F + qP8Qhan/EYer/xGHrP8TiK3/E4uv/wqErf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyL + t/8NjLj/DY26/w2Nu/8Njrz/DY69/w6Pvv8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5PF/w+U + xv8PlMf/EJXI/xCWyf8GP1X/AAAA/wAAAP9DREH/SnOZ/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV + Uv9UVVL/VFVS/0dIRf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0NA/1Sn+/9FUVr/IyQj/wAA + AP8AAAD/Dys2/z2u2/89rdr/Pa3a/zyt2v88rdr/O6za/zur2f86q9n/OqvZ/zmr2P85qtj/OKrY/zeq + 1/83qdf/N6nW/zao1v81qNX/NafV/yei0f8Ql8z/EJbL/xCWyv8Qlsr/EJbJ/xCVyP8QlMf/D5TH/w+T + xv8Pk8X/D5LE/w+Sw/8PksL/DpHC/w6Rwf8OkL//Do++/w6Pvf8Njrz/DY67/w2Nuv8NjLn/DIu4/wyL + t/8Mirb/DIq1/wyJs/8LiLL/C4ex/wuHsP8Lhq//CoWt/wqErP8RiK3/EIes/w+Gq/8Ohan/DYOn/w2D + pv8LgaX/CoCj/wl/ov8KgKH/C4Ci/wyBo/8MgaT/DoOm/w+FqP8Phan/EIar/xGHrP8JhKr/CoSr/wqF + rf8Kha7/C4av/wuHsP8LiLH/C4iy/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2Nuv8Njrv/DY68/w2P + vf8OkL7/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Txf8PlMb/D5TH/xCVyP8AAAD/AAAA/wAA + AP9DREH/U6Lz/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9TVFH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0ZZaP9Up/v/R1xu/zIzMf8AAAD/AAAA/wAAAP86q9n/OqvZ/zqr2f85q9n/OarY/zmq + 2P85qtj/OKrY/ziq1/83qtf/N6nX/zap1v82qdb/NajV/zWn1f81p9X/NKbU/zOm0/8zptP/MqbS/xCW + yv8Qlcn/EJbJ/xCVyP8PlMf/D5TH/w+Txv8Pk8X/D5LE/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6P + vv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqF + rf8KhKz/CoSr/wqDqv8Phqv/DoSp/w2Dp/8Mgqb/CoKl/wl/o/8Jf6L/CH6g/wh9n/8KgKH/Cn+i/wyB + o/8MgaT/DoOm/w+FqP8Phan/CYKo/wmDqf8Kg6r/CoSr/wqErP8Kha7/C4av/wuHsP8Lh7H/C4iy/wuJ + s/8MirT/DIq1/wyKtv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R + wv8PksP/D5LE/w+Txf8Pk8X/D5TG/wdQa/8AAAD/AAAA/ywtK/9DREH/VKf7/1Sn+/9FVGD/R0hF/1NU + Uf9UVVL/S0xJ/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9PjMj/VKf7/0ZXZf9CQ0D/AAAA/wAA + AP8AAAD/N6rX/zeq1/83qtf/N6rX/zep1/83qtf/N6nW/zap1v82qdb/NafV/zWn1f81p9X/NafU/zSn + 1P8zptP/M6bT/zOm0/8yptL/MaTR/zCk0f8wo9D/D5XI/xCVyP8PlMf/D5PG/w+Uxv8Pk8X/D5LE/w+S + xP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Qvv8Nj73/DY68/w2Ou/8Njbr/DY25/wyLuP8Mi7f/DIq2/wyK + tf8MibT/C4iz/wuIsv8Lh7H/C4av/wuGrv8Kha3/CoSs/wqEq/8KhKr/CYOp/wqDqP8Ng6f/DIKm/wqC + pf8Jf6P/CX+i/wh+of8Ifp//B3ye/wh9n/8JfqD/CoCi/wyBo/8MgaT/DYOm/wyDpv8Jgqf/CYOo/wmD + qf8KhKr/CoSr/wqErP8Kha3/C4au/wuHsP8Lh7H/C4iy/wuIs/8MibT/DIq1/wyKtv8Mi7f/DIu4/w2N + uf8Njbr/DY67/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwf8OkcL/D5LD/w+SxP8PksT/D5PF/wAA + AP8AAAD/AAAA/0JDQP9DREH/Upvk/1Sn+/9Tpvr/RVBY/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9LdZ3/VKf7/1Sn+/9DREH/QUI//wAAAP8AAAD/AAAA/zap1v82qdb/NajV/zWo1f81qNX/NajV/zWn + 1f81p9X/NafU/zSm1P80ptP/M6bT/zOm0/8zptP/MqbS/zKl0f8xpNH/MKPQ/zCi0P8wos//L6LP/y6i + zv8Rlcf/D5TG/w+Txf8Pk8X/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2O + vP8Njbv/DY26/w2Muf8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha7/CoWt/wqE + rP8KhKv/CoSq/wmCqP8Jgqf/CYGm/wyCpf8KgaX/CYCj/wl/ov8IfqH/CH6f/wd9nv8HfJ3/CHye/wh9 + n/8Jf6D/CoCi/wuAo/8MgaT/CYGk/wmBpf8Jgab/CYOo/wmDqf8Kg6r/CoSr/wqErP8KhK3/Coau/wuG + r/8Lh7D/C4ix/wuIsv8MibP/DIq1/wyKtv8Mi7f/DIu4/w2Muf8Njbn/DY26/w2Ou/8Njrz/DY69/w6P + vv8OkL//DpDA/w6Rwf8OkcH/DpHC/w+Sw/8PksP/D5LE/wAAAP8AAAD/AAAA/0NEQf9DREH/R1xv/1Sn + +/9Up/v/VKf7/1Sn+/9Tpvr/U6T2/1Sn+/9Up/v/VKf7/1Sn+/9LdJv/Q0RB/zIzMf8AAAD/AAAA/wAA + AP8xncf/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/MqbS/zKl0v8xpNH/MaTR/zCj + 0P8wo9D/MKPQ/y+iz/8vo8//LaLO/y2izv8soc3/K6DN/x+ayf8PksT/D5LE/w+Sw/8PksP/DpHC/w6R + wf8OkMD/DpC//w6Qv/8Oj77/DY69/w2OvP8Njbv/DY26/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuI + s/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqErf8Khaz/CoSq/wqDqf8Jg6j/CYGn/wmCpv8JgaX/CICk/wl/ + o/8Jf6L/CH6h/wh+n/8HfZ7/B3yd/wd7nP8HfJ3/B3ye/wh9n/8JfqD/CoCi/wh/ov8IgKP/CICk/wmB + pf8Jgqb/CYKn/wmCqP8KhKr/CoWr/wqErP8KhK3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyK + tf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R + wv8PksL/C3Sb/wAAAP8AAAD/AAAA/zIzMP9DREH/Q0RB/0NFQ/9Meqf/VKf7/1Sn+/9Up/v/VKf7/1GZ + 4P9HXG//Q0RB/0NEQf8SEhH/AAAA/wAAAP8AAAD/Koqu/zKl0f8ypdH/MaTR/zGk0f8xpNH/MaTR/zGk + 0f8wpNH/MKPQ/zCj0P8wotD/MKPQ/y+iz/8vo8//LqPP/y2izv8toc7/LKHN/yyhzf8roM3/Kp/M/yqg + zP8pnsr/KJ3K/w+Sw/8OkcL/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2OvP8Njbv/DY26/w2N + uf8NjLj/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqFrf8KhKz/CoSr/wqE + qv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd8nf8HfJz/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAgAAAAAABAAABAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wEFCf8CCg3/CwsL/wMJ + Ff8EExr/ERER/xcYFv8YGBf/EBYY/xAYGv8bGxv/HyAe/yAgH/8HCCT/Bhsj/xgdJ/8LDDj/HR44/wkh + K/8SIyn/BSg3/xIrNv8ZMTz/IyMj/ycoJv8nKCj/Kysr/zAwLv83Nzb/P0A9/0BBPv8ODkT/DxBK/xAR + Tv8RElf/HyBJ/wY1Sf8VN0X/Bz1T/xE+Uf8iPEj/NzhN/yAhWv8VFmf/Fxhy/yIjaP81NmL/IyR3/wdB + Wv8XRFb/KEhW/z1MV/8rUF//CEto/xJMY/8JUG7/ClV2/xJcfP8gTmH/K1Rm/zJZav85XHT/EmB+/yZi + ev81Y3b/RERD/0dIRf9JSkf/QEZK/0RKTP9LS0r/T1BN/1BRTv9ETVP/RVFa/1RVU/9fYF3/YGFe/0ZY + Z/9HXnL/SGB2/0hie/9Cb3v/SG55/1dvef9JcHz/WHJ7/2ZnZv9wcW//anV4/3d3d/+AgH7/GxyH/x0f + kf8eIJb/JieN/zEyhf8mKJb/Jiem/y4wrf8nKLn/C12A/wthhf8MZYv/EmaK/w1slf8SbZP/DXGc/wd8 + nf8IfZ7/EnSY/yVth/86a4H/LXOM/zlziv8jd5H/LnWT/yZ5lP8re5T/JXuc/y1+mf87e5P/Dnek/wh9 + of8Oe6n/EXuq/xF+sP8of6H/SWWA/0lohf9Jaor/SHiK/1F1hP9Idpj/ZXuC/3F+gv9MeKT/THys/0t/ + sv8pK8z/LzHP/zEyzP8rLdP/LjDV/zM12P8tgZ3/M4Od/wmBpP8KhKv/D4iv/xKHrP8LhrD/C4m0/w2N + uv8Vi7P/DpC+/xyRuf8qhaX/OYik/yeNtf8wi7D/JJa8/zOSuP9cgI3/RYKa/3iDh/9oiJX/RIym/0aT + rv9fkab/TYK1/06FvP9Flrb/VJq5/2qbsv9Sob//E47E/w6Sw/8Olcr/DpjP/xCWy/8SnNX/KZvE/zKd + xP8hn9D/FKDc/y2hzP82o8v/KaTW/zOl0f85ptD/NqjV/zyp0/8zqdn/PKza/z6w3/8Vpub/GK3y/xmw + 9v8prOX/Na7j/yuw6/86suf/IrDy/ze38v9NicT/UI7M/0ufw/9Zn8D/UJDP/0iO1v9Qk9b/RaTJ/1Wm + yP9DrNX/V63S/0mx3P9Std3/ZKrK/2Gt0P9ot9v/TZbg/1Ga4/9Snuv/U6Du/0q14v9Xu+T/U6X5/0W+ + 9v9Qv/L/Yr7m/13A6/9awvL/ZMLr/2rI8v9zzPX/e9D3/4aGhv+Qj4//kJGP/4eWm/+bm5v/m5+g/5qh + o/+np6f/urq6/8K/v//AwL//yMjI/9DPz//U1NT/5+fn//39/f8AAAD/AAAA/21tbW5ubm6UlJSUlJSV + lJWVlZWYlZmWmZmZmZmamZqampqampqyspqysrKysrKysrKdtZ21tbW1tbW1tbW1tbW1tbW1tbW1tbW1 + tbOdtbKdsrKzsrKyspyynJyanJqampqampqZmZmZmZmWlpmYlZWVlZWUlZSVlJSUbZRtbW1tbW1ubpRt + lJSUlJWUlZWVlZmVmZWZmJmZmZqZnJmcmpyanJqyspyasrKysrKysrWdtbW1tbW1tbW1tbW1tbW1tbW1 + tbW1tbW1tbW1tbW1tbW1tZ2ysrKyspyysrKcnJqcmpqampqamZmamZmZlpiYlZiVlZWUlJSUlJSUbpRt + bW1tbW1ulJSUlJSUlZSVlZWVlpWWmZmZmZmamZqZmpqampqcspqcsrKysrKds521tbW1tbW1tbW1tbW1 + tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tJ21sp21srKysrKyspyympqampqamZmZmZmZlpiYlZiVlZWV + lJSUlG6UbXxtbW1ulG6UlJSUlZSVlZWVmZWVmZmZmZqampmamZycnJyysrKctbKysrWdtbW1tbW1tbW1 + tbW1tbW1tbW1tbW1tba1tba1tba1tba1tbW1tbW1tbW1tbW1tbW1srKysrKcnJycnJqcmpqampmZmZmZ + mZaWlZWVlZWVlJWUlJSUbpRtbm2UlJSUlJSVlJWVlZWZlpmWmZmZmZmZnJqcnJycspyysrKynJ21tbW1 + tbW1tbW1tbW1tbW1tba1trW2tba1tba1tbW1tba1tba1trW1tbW1tbW1tbW1tbKdtbKysrKysrKcnJqc + mpyZmpqamZmZmZiZmJWYlZWUlZSUlJRubnx8lG6UlJSUlZWVlZmVmZmVmZmZmZqampqcmpycnJycsrKy + s7K1tbW1tbW1tbW1trW1tra2trW2tbW1trW2tba2tba2tra2tba1tba1tba1tbW1tbW1tbW1tbW1tZ2y + tLKysrKcspqcmpyamZmamZmZmZaYmJWVlZWVlJWUlJSUbW6UlJSUlZSVlZWVlZWWmZmZmpmamZqcmpyc + nLKysrKynbKdtbW1tbW1tbW1tbW1trW1tbW1trW2tra2tra2tra2tra2tra2tra2tba2tba2tba1tbW1 + tbW1tbW1tbKdsrKysrKcnJycmpqanJmampmZmZmVmZWVlZWUlZSUlJSUfJSUlJWUlZWVlZmVmZaZmZma + mZqampycnLKcsrKys7K1tbW1tbW1tbW1tbW2trW1tra2tra2tra2tra2tra2tra2tra2tra2tra2trW2 + tbW2tbW2trW1trW1tbW1tbW1tZ2ysrKcnJycnJqampmZmZmZlpmWmJWVlZWVlJWUlJSUlJSVlJWVlZWV + mZaZlpmZmZqampycnJycsrKcnLKdtbW1tbW1tbW1tba2tbW1tra2tra2tra2tra6tra2tra2tra2tra2 + ura2tra2tra2tra2trW1trW1tbW1tbW1tbW1sp21nLWyspycnJqcmpyZmpqZmZaZmJmVlZWVlJWUlJSU + lJWUlZWVlZmWmZmZmpmampqanJycnLKdsrOztbW1tbW1tbW1tra1tbW2tra2tra2tra2trq2tra2trq6 + ura6urq2tra2tra2tra6tra2tra2tra1trW1trW1tbW1tbW1tbW1nLKysrKcnJqamZyZmZmZmZaYlZWV + lZWVlJSUlJWUlZWVlZmVmZmWmZmZmpqanJycnLKynLKynbW1tbW1tbW1trW1tba2tra2tra2tra2trq2 + trq2tra6tra2ura2tsW2tra2trq2ura2ura2tra2tra2tra1tra1tbW1tbW1tbKys7KynLKcnJycmZya + mpmZmZmZlZmVlZSVlJSUlJWVlZWZlZmWmZmZmpqampycnJyysrKzs7W1tbW1tbW2tba1tra2tra2tra2 + tra2tra2trq6trq6xbbFtrq2xbq2trq6xbbFtrq2ura2trq2ura2tra2tra1tba2tbW1tbW1tbWdsrKz + nLKynJycmZqZmZmZmZmVlpWVlZWVlZWUlZWVlZaZmZaZmpmampqcnJyysp2ysp21tbW1tbW1tbW1tba2 + tra2trq2trq2tsW2xbq6urq6tra6trbFtsW2tsW2ura2urq2urq2urq6tra2tra2tra2tra2tbW1tbW1 + tbW1tbWysrKyspycnJycmpqcmpmZmZmYmJiVlZWUlJWVlZWZlZmZmZqZmpqanJycnLKysrOytbW1tbW1 + tbW2tra2tra2tra2tra6trq6ura2tra6urWbfmg6OjY2Nzg6OWtvm7W2usW6urq6trq6urq6trq2tra2 + tra2tra2trW1tbW1tbW1nbKysrKcnJycmpmZmZmZmZmVmJWVlZWVlZWZlZmWmZmZmZqampycnLKynbK1 + nbW1tbW1tbW2tbW2tra2tra2tra2ura6ura2tn46MRUEAQAAAQEAAAEAAAAAAAEAAAQPJThrsbrFtra6 + tra6ura6tra2tra2trW1tra1tbW1tbW1s521spyynJycmpqampmZmZmYmZWVlZWWlZmVmZmZmpmampqc + nJyysrKytbK1tbW1tba1tbW2tra2tra2tra6tsW2urZ+ORUBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEBBSdptbbFura6ura2ura2tra2tra1tba1trW1tbW1srKcspycnJycnJqZmpaZmZaVlZiVlZWWlZaZ + mZmZmpqcnJycsp2ysrKytbW1tbW1tba2tra2tra2trbFtra6tn4xBQAAAAAAAAAAAwEBAwMLGBgYGA0Y + DQgDAAAAAAAAAAAAAAEAFTmxxba6urq2tsW2tra2tra2tbW1tbW1tbW1s7OysrKcnJyanJmampmZmZmY + lZWVlpiZmZmZmpqampqcnJyysrK1srW1tbW1tbW2tba2tra2tra6tra2tTkPAAAAAAAAAAEIHEdYW+/v + 8vXy8/Lz9fL18vLy7llNQhoDAAAAAAAAAAAVara2trq6tra2trq2tra2tra1trW1tbW1nbKcspycnJyc + mpqZmZmZlpiYlZeWlpaZlpqZmpqcnLKcnLKysrK1tbW1tba1trW2tra2trq2tra2tTYDAQAAAAADCEJY + 7/Ly8vPy9fPy8/Lz8vLy8vLz8vL18vPy8vLuTR0DAAAAAAAABDq1urq6urq2tra2tra2tbW1tbW1tbW1 + tbWysrKcnJyampqampmZmZiWoqKdlpqWmpmcmpycnLKysrW1tbW1tbW1trW1ura2trbFtrq6tjgEAAAA + AAELTO7y8vXy8vPy8/Ly8vLy8vLy8vLz8vLz8vLy8/Lz8/Ly8/JbQwgAAAAAAAI2tbq6trq2ura2tra2 + tra1tbW1tbW1srKysrKcnJyampqZmZmZlpiio6Kjop2ampycnLKcsrKysrW1tbW1tba1tra2tra2tra2 + um8PAAAAAQNCW/Xy8/Ly8vLy8vLy8/Lz8/Py8/Pz8/Pz8vLy8/Pz8vLy8vPy8u/uXEwIAAAAAAAEZrbF + tra2tra2tra2tba2tbW1tbW1s7KznbKcnJyampqamZmWmaKiuKK4uKKimpycnLKytbWytbW1tbW2tra1 + ura2tra2urYxAAAAAANJ7/L18vLy8vL18vLz8vPz9fX29vb29/f49/f29vb29fX1W0cdGAYBAwMAAwYI + BgMBAAEAD3+2xbbFtra2tra2tbW2tba1tbW1nbOynLKcnJyampmZmZmWuKOiuLi4uLy8t5yysrKytbW1 + tbW2tbS1tra2tra2xbqbDwAAAAELHFny8/Ly9fLz8vLz9fb2+fn5+fn5+fn5+fr5+fn5+vn5+fkYAQMc + TFiI7/X19fX19fPuWB0BBDm2tra6trq2tra2trW1tbW1tbWytbKyspycnJqampqZmZmiori4uLi81bzV + vLuisrOytbW0tba1tra6tbq6trq2fgQAAAAGHB0dHe7y8vLz8vP19/n5+fn6+fr5+fn5+fr5+fn5+fn5 + +fn57gNc9fX19fX19fX19fX19fX19e4aABa1trq6tra2tra2tra1tbW1tbWytbKynLKcnJycmp2doqK4 + uLi4vLy8wbzB19e8ubW1tbS0tLa1urW6trbFtnwDAAABEB0cHR0dQvLy8vX2+fn5+fn5+fn5+fn5+vn5 + +fn5+fr5+fr5+fkYR/X19fX19fX19fX19fX18lvv9VgAAA+bura6trq2tra2tba2tbW1tbWytbKynJyc + nJ2iuKKiori4uLi8vNW8wdXX19fX17m1trS2tLq0ura6trZ+BAAAAxwdHR0dHB0dTPX3+fn5+fr5+fr5 + +fn5+fn5+fn5+fr5+fn5+fn57gPy9fX19fX19fX19fNZRxsYGO7yBgAAAAR+ura6tra2tra2tbW2tbW0 + s7Wyspycoru4uLi3t6K4uLi4vLzVvNXX1dfY19nY2tm8uba0tra6urq6tQUAAA4cHR0cHR0dHR0q7vn5 + +fn5+fn5+fn5+fr5+fn5+vn5+fn5+fn5+fkcHvX19fX19fX19e5IGBoYGBgd9U0ABgAAAAR+urq2urq2 + tra2trW1tbO1srK5u7+8vLy4uLi4t6K4uLjVvLzBwdfX2Nfa19ra2traxLm6urq6urYVAAAGHR0dHRwd + HR0qQkdC7/n5+vn5+fn6+fn6+fn5+vn5+fn5+fr5+vn59QPu9fX19fX19e5CGBgYGBkYGE71CAFCGwEA + AASXtsW2trq2tra2trS1tLm7wcHVv7y8vLy4uKKiuLi4vLzVvNXV19fX19fa2dra4+Pj59m9urq2OQAB + Ax0dHB0dHR0dQkVCQkJH7/n5+fr5+fn5+fn5+fn5+fn6+fn5+fn5+flMGPX19fX19fJHGBgYGBkYGBgY + 71wBGkdCHQEAAAWxurq6tra2tra1ur7X2dfX18HBwby8vLu4vLe4uLy8vL/B19fX19fa2tra2uPj493j + 5+faxLUCAAMcHR0cHR0cHkJCQkJCR0JF7vn5+fn5+fn5+fn6+fn5+fn5+fr5+fn5+QhN9fX19fVZGxga + GBoYGBoYGB31RwMfQkJCHQEAABW2trq6ura2vcPa2dnZ19fX18G/vLy8vLi3ori4vLzVvMHV19fX2NfZ + 2tra2uPj2ufn6urqMwAAGx0dHR0dHSpCR0JHQkJCR0JFW/n5+fr5+vn5+fn5+fr5+fn5+fn5+fnyAfL1 + 9fXzRxgYGBgYGBgYGBgaTPUGDUVCR0JCHQEAADbFtra9xOPa2tna2dnX2dfXwcHBvLy8uLy3vLy8vLzB + wdfX19fZ2tra2trd493o6urn6q4AAAsdHR0cHR0eQkVCQkJCQkJCQkJHWPb5+fn5+fn5+vn5+fn5+vn5 + +fr5+U4b9fX17x0YGBgYGhgYGhgYGhju7gMdQkNCRUJCGwAAAX7L4+Pj4+Pj49na2dnX19fBwb+8vLy8 + uLe4uNW81dXV19fX19rZ2tra49rj4+fd5+rqMwABHBwdHR0dQkJCR0JCQkdDQkJHQkJCTPP5+fn6+fn5 + +fr5+fn5+fn5+fn5G0z19VwbGBgYGhgYGBgYGRgYGvVOA0JCQkJHQkJCCAAAFufq5+Pj49rZ2tnZ2dfX + 19fXwcG8vLy4vLy8vLzBwdfX19jZ2tjZ2uPj5+Pn5+fq6t0DABAdHR0dHCpCQkJCQkdCQkJDQkNCQkdC + R1v3+fn5+fn5+fn5+fn6+fn5+fcD7vVbGhgYGBoYGBgaGBgYGBhE9R0NRUJCQ0JDQkNCAwABeujj4+Pj + 4+Pj2drZ2dnX18HBv7y8vLy31by81cHV19fX19fa2tra2trj5+fn6urqcQABHRwdHR1CRUJHRUJCQkJC + QkJCQkJCQkJCQknv+fn5+fn5+fr5+fn5+vn57wb1WxgYGBoYGBgYGBgaGBkYGlj1BhxCQ0JCQ0VCQkcc + AAAQ4+fq5+Pj2tna2dnZ19fX18HXvLy8vLy8vLy/wdfX19ja2tra2uPn5+fj5+rq6uoWAAsdHB0dHUJC + QkJCQkJHQkNCKkJCQkdCR0JHQkJN8/n5+fn6+fn5+fn5+flYKlsYGRgYGBgYGhgYGBgYGBgY7u4DHkJD + QkJDQkNCQ0IGAACl6OPj4+Pj49rZ2dnZ2dfXwde8vLy8u7y81cHV19fX19nZ2tra2trj4+fq3erq2AEA + Gx0dHR1CR0JCQkdCQkIqHR0dHSpCQkJFQkJDQkJHTO/3+fn5+fn5+vn5+U4LGhgYGhgaGBgYGBoaGBgZ + GBjzWwZCRUJFQkJCQkJDQh0AABfq6urj4+Pa2eja2dfZ19fXvMS8vLy8vLy819fX19nX2tjZ2uPj5+fn + 6urq6+uEAAMdHRwdQkJCQkJHQkJCQh0dHR0dHUJCQkJDQkJCQ0JCR0dZ8/f6+fr5+fn5TgAYGBgdR0xO + Tk5YTkxMTEUdHRgGAQgLGBobHB0dQh9CQggAAdbj4+Pj4+Pj2dnZ2dnZ19fBwby8wby8v7/V19fX19ra + 2tra2trj2urd6urq6jMACB0dHSpCR0JCQkJCR0IdHR0dHB0dQkNCQkVCHSofQkJCQkJHR1ju9ff5+flb + ABvv9vb49vb29vb29vb2+Pb29vb28+/uWU1KHRgDAQEDDQAAcerq6OPj49rj2trZ2dfE19m8wby8vLy8 + 18HX19jX2dna2uPj5+fq5+rn6t3sFAAaHR0dQkJCQkJHQkJCQh0dHR0dHR0fRUJCQh0dHR0qQkJCR0JC + QkNDRUxOW1gBTPb29vb29vj29vb49vb2+Pb29vb49vb29vb29vb1GwAfAwAX5+jo4+Pj49nZ2dnZ2dfX + wcHBvLy8vMHV19fX19fa2dra49ra6trq6urq690AABwcHUJCQkJDKkdCQkJCHR0dHR0dHUJDQkIdHR0c + HR0fQkJDQkJCHR0dHR0dHwgd9vf29vf29vf29vb49vb29vj29vb49vb29vb2+foQDUIYAALn6ufq4+Po + 4+Pa4tnZ2dfB2bzBvLy8vNfX19fa2tra2trj4+rj6urq6ursrgEDHR0dQkJCQkdCR0JCRyodHR0dHR0d + R0JCKh0cHR0dHR1FR0JCKhwdHR0dHR0dGwDy9vb29vb29vb2+Pb29vj29vb49vb29vj2+fr67gNCQh0A + Aa3q6Ojj4+Pa2dnZ2dnZ18TBvLzBvLzBwdfX19fZ2dra2trn2uqlNerq6+qlAQMdHUJDQkJCQkJCQkJH + Qh0dHR0dHUJCQkIdHR0dHR0dHUJCQh4dHR0dHR0dHR0dDR329vb29vb29vb29vb29vb29vb29vb29/r7 + +vUIHkJFQgABcejq4+jj6Ojj49rZ2dnX19nXwby8vNXX19fX2dra2uPj4+Pn2gsDM+rq61MAAxgdQkJC + Q0JHQkJCRUJCQh4dHSpCQkJCQh0dHR0dHR0dRUJFHR0dHR0YBgMAAAMDA1j39vb39vf29vb39vb29vb2 + 9vb2+fr6+vr1GB5CQkdCBgA86urq4+Pj2trZ2eLZ2dfZwby8wby8wdfX2NfZ2drZ2trn2uhBBgYGM+zq + QQALGxgYGCpCQkJCR0JCQ0VDQkJCRUJDQkIeHR0dHB0dHR1CQh4dHR0cAwAAAAAAAAAAAAhO9fb29vb2 + 9vb29vb29vb4+fn5+vr78hAdQkNCQ0INABfq6uPq4+jj6OPi2tnZ18TZ18HBvMHV2dfX2dra2trj4+Po + 2gYGBgYGM+o+ABgdQkIqGxgYHUJCQkJCQkJDQkNCQkNCQyodHR0dHR0dHUJCQh0dGwAAAAAAAAAAAAAA + AAADWPb29/b29vb29vb5+fr6+/v7+lsIHUJFQ0JCQhsAEOrq6uPo4+PZ2trZ2dnZ2cG8wbzBvMHX19fZ + 2dnZ2trj2uiwFAYGBgYGMzMAGB5CQkJCRUIcEAYGGBwfQkJCQ0JDQkJDHR0dHR0dHR0eQkMdHRwBAAAA + AAAAAAAAAAAAAAAAG/X29vb29vn5+fv5+/v5+vZCCBwdHR1CQ0JCHQAB5+ro6uPj6Oji6OLZ2dfZ2dnB + wbzV19fX19nZ2trj4+Pa5+rahBQFBgYGAAAaQkJCR0JCQkJCQhwIAQADBhseQkNCQkMeHR0dHB0dHUJC + Qh8dAwAAAAAAAAAAAAAAAAAAAAAAB/L29vn5+fv5+/v6+fvuCxgdHR0dHSpCQkUeAAHj6uro6OPj49rZ + 2tni2cTXvLzBwbzB19fZ2drZ2trj6Ojj6Orq6qozBgYDABpDQkJCR0JHQkdCQkIeGAMBAAADGBxCQh4d + HR0dHR0dQ0JFHxgAAAAAAAAAAAAAAAAAAAAAAAAAB/n6+vv7+vv7+fr1HQYbHR0cHR0dHUJCQkIAAdbq + 6ujo6Nro4uPi4tnZ2cTZ18G819fZ19nX2dqpc0A9PTw1NTM8PUE9KQMAG0JCQ0VCQkJCQkJCR0JCQhsG + AAAAAAMLGx0dHR0dHUJCQkJCAwAAAAAAAAAAAAAAAAAAAAAAAAAAHfv6+fr6+/n1QgAABhgdHR0dHR0d + HUJDQgAA0evo6ujj4+ja49nZ2dnZwcG818G8wdfX2dnZ2RcGBgYGAwYGBgYDBgYDAwAbRUJCQkJHRUJH + QkVCRUJCR0IqGwMAAAAAAAcYHR0eQ0JCQx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA7vr7+/dbHQtbW0wL + AAMbHR0dHR0dRUNCAwDW6uro6Oja6Nno49nZ2dnZ18TBvNfV2dnZ2dnEFwYGAwYGBgYGBgYGBgYDABhC + Q0JHQkJCQkJCQkJCQkdCQkJCQh0QAwAAAAAACBxCQkVDCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAALWEwb + Axju+/z8+/vyGQAZHR0dHR1CQkIBALjj6Oro6Ojj6Nni2tnZ2cS82bzBtbe5tbW0tboxBgYGBgYGBgYG + BgYFBgMADUJCQkJFQkdCQkVCR0JCQkVCQkdCQkdCHAgAAAAAAAMNHUMDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAADVj5/f39/f39/fz7RwAbHR0dHUJDQgMAscXFxb3Ky+LZ49rZ2dnZ2dnBwcG1tbW1tba2tj8G + BgMGAwUGBgYGCSYmBQAGQ0JDQkdCQkJCR0JCQkJCR0JCR0JCQkJCRyobAwEBAAAAAwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAb7/fVb9f39/f39/fz8KgYdHR0dQkNCAAK2xcXFxbq6urq6ur3EwNnZvNnBwLW1 + tbW1tLS0nQYGBgYGBgYGKGt+FgYDAANFQkVCQkJCQ0JDQkdCQ0JCQkVCQkdCQkJCR0JCHQ0DAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAHf3uAAADW/39/f39/fz2AxwdHR1DQkIAAcXFusW6usW6ura6tra2 + tra5ubu8tbW1tba2uba2EwYGBgcma7a2MgYGBgYAAEJCQkJCR0JFQkJCRUJCRUJCR0JCQkJCQkdCQkJH + QkIcBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY/R0AAAAb/f39/f39/fwdGh0dH0NCKgAPxcXFxcW6 + urq6ura2tra1tbW1tbW1tbW1tbW2tLY/DDFrtcW6lxQGBgYGBg8AHUJHQkJCQkNFQ0JHQkJHQkJCQkcq + R0VCQkJHKkdCQkdCDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8RwAAAB/9/f39/f39/FgLHR1CQ0Id + ABbFxcXFusW6urq6urq2tra2tbW1tbW1tbW2tra2ura6urq6uj8GBgYGBgZpNgAaQkNCQkJHQkJCQkNC + QkNCQkdCQkJHQkJHQkVCQkJCRUIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZCAQML+f39/f39/f39 + WBgdH0JCQhsANsXFxcXFurq6urq2trS2tba1tbW1tbW1tbW0trW6trq6urppBQMGBgYGFsVrAAhCQkJD + QkNCQkNCQkNCQkJCQkdCQkJCQkJCQkJHQkJCQkIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATPz9 + /f39/f39/f1JGipCQ0JFDQBpxcXFxbrFxbq6trq6trq1tra1tbW1tbW2tLa2tra6tra6xbUHBgYGBgm1 + xbYBA0JDRUNCQkNFQkJCQkNFQ0NFQkJFQkdCQkJHQkJCRUJHQhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAACFz8/f39/f39/QkdQ0NCQkMGALHFxcXFxbq6urq6ura2trW2tbW1tbW1tbW1tLa2trq6urq6 + um8GBgYGP8XGxQ8AHUJCQ0IfGhgdQkVEQkJCQkJCQkJCQkdCQkJHQkJCQkIdGQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAQvv/P39/f3vGEJCQ0JDQgAFxcXFxcW6xbq6ura6trq2trW2tLW1tbW1trW5 + tra2ura6urq6xT8GBhbFxcbGNgAYRUNCQwYAAAADG0JHRUNCQ0dCR0JCRypCQkdCQkdCGAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAEN8v39+QtCQkJDQkIcACXGxcXFxcW6xbq6urq2urW2tba1 + tbW1tbW1tba1tra6urq6urrFujcLtcXFxcV+AANDQkUdAAAAAAAABh1CQkJCQkJCQkJCR0JCQkJCQkMZ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKh0GAAAAAAAAAAAAGe4LHUNCQkVDQxQAa8XFxcXFusW6xbq2 + trq6tra0trW1tbW1tbW2tra2ura6urq6xbrFxbXFxcfFx8UFAB1DQx4AABFdDgAAAB1CRUJDRUJCR0JC + QkVCR0JCRxsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1DQkIYAQAAAAAAAAAAAQMdQkNCQ0JCAwG2xcXF + xcXFurq6urq6urS2tba1tbW1tbW1tba1tra2ura6usW6xcXFxcXFxcXGxTEAC0JDRQ0AAF2PLAAAABtD + QkJHQkJFQkJHQkJCQkJDHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAYqQkJCQkIdAwAAAAAAAAAAAAAGHUNC + Qh0AJcXGxcXFusXFxbq6trq2ura2tra1tbW1tbW2tba2trq2urq6urq6xcXFxcfFx8XGfQEDQkJCQgMA + BI+PYwQAAB1DQkNCQkJCR0JCRypHQkJCAQAAAAAAAAAAAAAAAAAAAAAAAAMcQkJDQkdCRUJCDQAAAAAA + AAAAAAAACB1ECABvxsXFxcXFxbq6urq6ura2trS2tbW1tbW1tbW1trW2trq6urq6xcXFxcXFxcXFxsbL + BQAbRUNCGwAAY4+PYwQAAEJDQkJHQkJCQkJCR0JCQkIGAAAAAAEAAwsbCAAAAQAAAAAAG0JDQkJCQkJC + QkJHHAMAAAAAAAAAAAAAAQ0CBcXFxsXFxcW6xcW6ura6ura2urW6tbW1tbW1tba2tra2ura6urq6usXF + xcXFxcbF6O1TAAZCQkMfAAAtj5CPXgAABkJFQkNCQkJHQkJCQkJCRxABAQEDCBwqR0JCQhwYCAsbKgYB + HUNDQkNCR0JHQkJCKgsBAAAAAAAAAAAAAAA5xcXFxcXFxcW6urq6urq2tra1tbW1tbW1tbW1trW2tra6 + urq6usXFxcXFxcXFy+zs7d0DAB1CQ0MEACOPj5CPIwAAHUJCQkdFQkJFQkJHQkJCHAMLHUJCR0JCR0JC + QkJHQkJCQwYAHUNCRUJCRUJCR0JCQhsDAAAAAAAAAAAABMPHxcbFxcXFusXFurq2ura2ura6tba1tbW1 + tbW2tba2trq2urq6urq6xcXFzOvs7e3s7TUABkJCQgYAEY+Qj4+MBAADQkVCQkJCQkdCQkVCQkdCQkJC + QkJCQkJHKkJCR0JCQkdCHQEDQkJCQ0JCQkdCQkVHQh8IAQAAAAAAAAA97OnFxsXFxcXFurq6urq6ura2 + tbS1tbW1tbW1tba1tra2trq6urrFxcXFxeLr7Ors7O3t2wAAHUVDAwAjj4+Qj4xdAAAcR0JCR0JCQkdC + QkJCRUJCR0JFQkdCQkJHQkJCQkVCR0JDGAADQkJCR0JCQkJCQkNFQkIbAQAAAAAABerr7OnKxcXFxbrF + urq6trq2urW6ubW1tbW1tbW1trW6tbq2urq6urq6xcvo6urs7Ozs7O3tMwAGQkIAACyPkZGPj4wEAAhC + Q0JCQkVCQkJCR0JHQkJCRUJCQkJCRUJCQkdCQkJCQkVCBAALQkNCQkNCQkVHQkJCR0IfCAAAAACE6+vr + 6+vLxcXFxbrFurq6urq0trW2tbW1tbW1tbW2tba2tra6urq6usXi6urr7Ors7Ozs7e3bAgAbHQAAXpCR + kZCPjyMAAUJDQkJCR0JCQkJCQkJCQkJCR0JHQkJHQkJDQkJCR0JCQkIdAAAaQ0JCQkdCQkJCQkJCQkJD + GwMAFuzs6+vr6uvoxbrFurq6ura6trq2tba1tbW1tbW1tba1urS6trq6urrL6Orq6+vq7Ort7O3t7e00 + AAMZAACMj5GRkZGPXgAAHUJCQkdCRUJHQkdCRUJHQkdCQkJCQkJCQkcqR0JCQkJHQkIIAAEdRUNCRUNC + QkdCRUNDRUMeAQLW6+vr6+vr6OnoyrrFurq6trq0urW0trW1tbW1tbW1tbS0tra2urq94ujo6Ovq6uvr + 7Ors7IYzFxYAAAAABI+RkZGRkZCPAAAYQkZCQkJCRUJCQkJCRUJCRUJCR0JCR0JCQkJHQkdCQkVCQh8A + AANCQkNCQkNCQkJCQkNCQgYBQezs7Ovr6uvr6Ojoy8W6urq2ura6trq1trW1tbW1tbW1urW6tLq6xOjo + 6Ojo6urr6+rs7Ow9AAAAAAAAAAAgj5GRkZGRkZEOAAhFQ0JCQkdCQkdCQkdCQkJCQkJFQkJDQkJCR0VC + QkVCQkJHQhgAAAtCQkNCQ0VCR0JDQkUNABbr7Ovr6+vp6+jo6Ojj4sW6urq6urW2tbW1tbW1srW1tbS1 + trS6vdnj2ePj6Ojo6Ovq6+rs6wAADhEREQQAACyQkZGRkZGRjxEABkJCR0JCQkJCQkVCQkJHRUJHQkJH + KkJHQkJCQkJCQkdCQkJCQgMAABxDQkJDQkJDQkNDHAAF3ezt6+vr6+vq6ejo6Ojo4r26urW6tbq1trW1 + tbWzs7W0tbW0udni6OPo6Ojo6Orq6uvr6+vsAQAAI4yPkGUsLY+RkZGRkZGRLAAGQ0JCQkJHQkJCR0JC + R0JCQkJCQkJCR0JCQkJFQkdCQkVCQkJHGwAAAx5CQ0JCQkNCRx0AAa7r7Ovr6+vr6+nq6Ojo5uLj4sS6 + urq0trW1tbW1tbKdtbW0tMLZ2dnZ4uLj4+jo6Ojr6urr6uyGAAAABGWPkI+Pj5GRkZGRkY8sAABCR0JF + QkJHQkNCQkJCQkJHQkJHQkJHRUJHQkdCQkJCQkdCQkJFBgAACEVDQ0JFQ0odAwGG7e3t6+zr6+vq6Ojo + 6Ojo4+bj4sS6tra2urW1tbW1tbW1tbvZ2dnZ2ePj4+Po4+Po6Ojr6+vr6+zbMwAADoyPj4yPj5GQj5GR + kSwAAEJDQkJDQkVCQkVCQkdCR0JFQ0JCQ0JCQkJCQkJCQkdCR0JCQ0IdAAAAG0JCQkRJHQMAQezs6+vr + 6+vo6unp6Ojm4+Lo4uLi2eK9trS1tbW1tbW1tbW9wbzE2dnZ2eLj4uPo6Ojq6ujq6uvr6+zspQAALIyQ + jI+QkZCRkZGQLAADRUNCQkNCQ0JCR0JFQkJCQkJCQ0VCQkdCQ0JCR0JCQkJCQ0JFQ0IGAAADQkNHTB0D + AD3s7Ozt6+vr6+vr6+jo6Ojm6OLo4uLi2dnAtrW1tbW1srK5wcHZ2dnZ2dnZ6Nno6Obj6Ojp6+vr6+vs + 6+zsFwADj4+PjI+QkY+RkZARAAZCQ0JDQkNCQkNCQkJDQ0JDQ0JFQkJDQkJCQkNFQkNFQkJFQkJDQh0A + AAAYSUkdAAE87Ozs6+zr6+vr6+no6Ojo6Oji6OLi4tnE2cHBurW1tbW1vrzAwcHB18TZ2eLZ4+Lj4+jj + 4+jo6urq6+rs7OyoAABej4+MjI+Rj5GRjxEABkVCQ0NCQkJFQ0JDQkJCQkJCQkdCQkNCRUNCQkNCQkdC + QkdCQkJCQgYAAABCGwAAce3s7OzssNbq6+ro6Ojo6Oji6OPi4uLi4tnZxMTBubW1tbK8wcHBwdnB2dnZ + 2eLj2eji6Ojo6Orr6+vq7Ozq7O0FACKQkI+Mj42NkZGMAAAYQkJCQ0VDQ0JCQ0JCQ0VDQkNCQ0JCQ0JC + Q0JDQkNCQ0JCQ0JDQkJHKgAAAAEAAIbs7Ozs7OvWqaWp1djo6Ojo6OPj4uPi4tnZ2cPEwcHAu7W1sry8 + vMHBwcTE2dnZ2eLi4+Pj6OPo6Orq6tqoQTMXDwAAAGWPkIyMj5CMkWUAAAAGHUVCQ0JCQ0JCQ0JDQkJF + Q0JDQkJFQ0JCQ0JCQkNCQkNCQkJKSUlJBgAAAAR/5ezs7Ozr7NaoqaWoqKWprbDV2tra4uLi4sTZ2cTB + wLy3nm9wvL7AwcHX19nZ2dnZ2ejj4uPj6Ojq1kEFAAAAAAAAAAAAIo2MkY+Pj4+PZSMAAAAAAxtCRUNC + Q0RCRUNCQ0JDQkJDRUJDQkNCRUNFQ0NFQ0VHTEhMSUcIAAAVtsbG6+vs5+zr2KipqZ+pk6iTqJOTk5OT + k5Ofn56eknh2cnJWh/W7vLy8wcG819fE2dni4uLj4+Pj1SYAAAAAAAADBgwNDAwNYoyMjIyPj4+Pj4ws + BAAAAAMYQkVFQkJDQkJDQkJDQkJDQ0JDQkNCQ0JCQkdHSUlJTEkcAwABNsbHxsbM7Otb8aeqpZ+on5+o + k5+Tk5OTk5KTknd3dnZ6c1am9fv9/by8vsHBxNfZxNnZ2dni4+Lj40EAAAAABw0cHh4cHhweHB4dNGSN + kJCPj4+Pj4+PXQQAAAAAGB9CRkJCRUJDQkJDQkNCQ0VDRUNCREdHSUxMTEkdBgAAD3/HxsbGxsbN7Kf9 + /fz29e6HV4SEhIalpXOThHOEhFNVpvL2/P39/f39u7y8vLy8xLzXxNnZ2eLZ49omAAAADRwdHR4cHhwe + HR4dHR4cHSqMj5CQj4+Mj4+QkF0RAAAAAAYYGx0fRUVEQ0NFQkVCQkJHR0lLTExMSUkdBgAAATnFx8bG + xsbGxsXlr/r9/f39/f39/Pv5+fb29vb2+fn7/P39/f39/f39/f28u7zAwMHEwcTZxNnZ2eLiMgAAAxwd + HR4cHh0dHh0eHB4dHR0eHJGMjIyQkJCPj4yPkI9jIAAAAAAAAAAAAAAEBgYGBgYGBgYGGR5JSEQbAwAA + ASe2xsbGx8fGxsXGxszb9v39/f39/f39/f39/f39/f39/f39/f1b+/39/f39/Le8u7y8vMHBwdnX2dnZ + 4noAAAcdHR4dHR4dHR4dHR4cHh0eHhwZYJGRj4yMj5GRkY+Pj5CQZSwRAAAAAAAAAAAAAAAAAAAAAAAA + AAADAQAAASWbx8bHx8fGxsbGxsbGxb3y/f39/f39/f39/f39/f39/f39/f399gBY/f39/f39u7u8vMDA + vMTBxMTE2dnZBQABHR0eHR0fHx8fQx9DHx8eHR0dHRwNLo6RkY+MjIyQkZGQjIyMkI+PjGJfLSwsLCwi + ICAhIiwsIAAAAAAAAAAFMZvHx8fGxsXHxsbGxsXGxe79/f39/ftM9v39/f39/f39/f39/fwbAAPy/f39 + /f24u7u8vLzAwcHB2dfE2XcAABseHR0fH0MfQ0MfH0MfQx9CHx4dHhwNFGCRkZGQkIyMjJGRkZCOjY2Q + kI+Qj5CQkI+QkI+Pj5CQLxwNDAMBAAAAAA85usfGx8bFxsXGxcbFWv39/f39+QAd/P39/f39/f39/fxY + AAAAAAv9/f39/be4u7y7wLzAwcHZxNnZOwAEPh0dH0MfH0MfHx9DH0MfQx9CHx8eHRwcDRhgjpGRkJCN + jIyQkZGRkZGOkY2NjIyMkIyMj4+Pj49hHR0dHB0NBwAAAAABNsXGxcbGxsXGxcZa/f39/f1MAAADQu72 + /f39/fxNAANY/P35+/39/f38t7u3vLy8wMG8xMHEwdkWABCGHh9CH0MfH0MfQx9DH0JCQkJCH0IfHR4c + HA0YLmORkZGRkZGRkZGRkZGRkZGRkJCQkJCRkY6QZCQcHh4dHh0dHg0GAAAAAmbGxsbFxsXFxYX9/f39 + +wAATlgbAAAAHVv28kxb/P39/f39/f39/f23t7u7u7y8vMC8wcHZxBYADNNLQh9DH0JDH0JDHx9DHx9D + H0MfQx9CHx4cHBwNDRgrYGWRjpGRkZGRkY6RjZCNjY2NjWViMBINHB0eHRweHR4cHh0cBwAAABW6xcXG + xcbFhfz9/f399vz9/f399u4dAAAAHVj2/P37WP39/f39/Le3u7e7vLzAwMDBw8PXFQAGq9RGQx9DHx9E + H0JCQx9DHx9DH0JDH0MfQh4eHRwcHBkNDQwkKzAwYmRkZGRkYTAwKyQZDQ0bHBwcHR0eHR0dHh0eHB4d + GwMAAAWxxcXFxcWE/P39/f39/f39/ftMA0z8+e9HBgAAGAAA+f39/f39ore3uLu8u7y8wMDBwdkmAANL + 4dRPH0IfQh9DHx9CH0JEH0MfQh8fQkJCH0MfHhwdHBwcHBwcDRsNGQ0NDRkNHBwcHBwcHRweHR0eHR4d + Hh0dHR0dHh0dHgcAAAK1xcXFxYX8/f39/f31TO5MAAbu/P35/P39+/JCABj9/f39/fy3t7e3u7u8vMC8 + wMHBwUAAABxP4eSrS0MfQx8fRB9DHx9CQkJCQkMfH0MfQx9DHx4eHh0cHBwcHBwcHBwcHBwcHBweHB4e + Hx9DH0IfQx9DHx8eHh0dHh0dHg0AABPFxcXFhPz9/f39/VsAAAPy/fzuBwAABlj9/f1CAPz9/f39/aKi + t7e7t7u8vMC8wMHEvAIAAx5Gq+Tkq1AfQkMfQh9CQh9CH0JCH0MfQx9CH0MfQx8fHx8eHR4cHhweHR4e + Hh0fH0MfQx9CH0MfREIfQx8fRB9DHx8dHR4dHQ0AADnFxcWF/P39/f39/QAA+/39CAALEB0bC/n9/f37 + /f39/f38t7e3t7u4u7u7vMC8wMHBcAAABh1CS6vk5OGJS0IfQkIfRB9DH0JCH0MfQx9DH0IfWfgfQkJC + Qh9CQx9DHx9DQx9DH0IfQx9DHx8fH0MfQkQfH0MfQx8dHR4dHQYABLbFxYX8/f39/f39HVv9/f1F7vj5 + 9fn5WP39/f39/f39/f2ioreit7e7vLu8vMDAwMHEMgAAARkfQkqE1OTk1INFQkJCH0JDH0MfQh9DH0Mf + Qx/w/fIfHx9DH0NCSVhDH0MfHx9DH0MfQh9DH0RDH0QfHx9DH0MfH0QfHR0dHAAAacXFVfz9/f39/f39 + /f39/FvuHEcLGO4d/f39/f39/f39/J2it7e7t7e3u7y7vMDAwMHBQAAAAAAYHUJCS4ng5OGGRx9DHx9D + QkJCH0IfQh9DTP39/e5EH0MfH0z8/EMfH0MfQx9CH0JDH0MfHx8fH0MfQ0IfQh9DHx8eHh0dAQAnxbZV + /f39/f39/f39/f32Wx0AAAAATPX8/f39/f39/f39op2ioqK4t7u7u7y8wLzAwcTBoxUAAAAABhsfH0NS + 0OTkUkJCQx8fH0MfQx9DH0NE+PX4/fZJRFn2/f36H0JDH0MfQx9DQkIfQkMfREJEH0MfH0QfQx9DH0Qd + HR0QABW2xVv9/f39/f39/f39/fz5GAD2+wsAR0Lu/f39/f39/fydoqKitbe3u7e7u7u8wLzAwMHB154m + AAAAAAALHB9CT9Lkqx8fQx9DH0JCQkIfH0MfH0JO/Pz8/fr4/P1JH0IfQx9CH0IfH0MfH0IfHx8fQh9D + H0MfQx8fH0IdPhYAFcW2W/39/f39/f39/f35QhoAAPn8AAAGABj9/f39/f39/aKdoqKit7e3t7u7u7y7 + wMDBwcHEwcGbOAUAAAAAAxsfH4bkq0IfQkJDH0lJSUlDTvBZ8vz9+/31Hx9DTh8fQx9CH0JCQkNDH0Mf + RB9DQkRCQkIfQh9CH0QfHzTOBQAlurfv/f39/f39/f39/e4AHVgLC1sd9/1M7v39/f39/f38m6KdoqKi + t7e3u7i7vLy8vMDAwMDBurW6tn4xAgAAAAMcQk/kgkMfH0NJSUlOSUn5/f388kwfWf37TR9CQkJCQx9D + H0MfHx9DH0IfQh8fHx9CH0IfQx9DH0SG3lAAADm6oPP9/f39/f39/f39/Ab7/f1bAPn9/fn5/f39/f39 + /f2dnaKdoqK3t7e3ubu7u7y9vMDAwb21trW1trq1ZxMAAAAIQlLgQh9DRElMTExMSfD99UMfQkJCSfr9 + /fAfQh9CH0MfQh9DHx9DH0JCQkJCQkJCH0NGUIOr4eSDGQAAbLqf9v39/f39/f39/f399f39/VsAWPmI + Rxr8/f39/f38/J2bnaKinZ2it7e3t7u7u7y+vsC9tbW1tra1tbq1umcFAAADH86BQh9JTElMSUxMWflJ + H0IfQkIfHvz9XEIfQx9CQkJCQh9DH0IfQk+ChorPz9Lk5OTk5N+KSx0AAAW6uqX5/f39/f39/f39/f1H + G0IYAAAAAAAAAPL9/f39/f39m6KdnZ2iore3t7e3ubu7vLu8vLWzs7W1tba2trq2urUlAAALT6xCQklJ + TE1JTExMSUxJXO5YQx9C9vwfQx9DH0MfQx8fREJCUazk5OTk5NTQzqyGhlBLQkMcAwAAfrq2hfz9/f39 + /f39/f39/QAAAAAAAAAAAAAAHf39/f39/fybm52dop2iop23t7e3t7u7vLy1nbW1tbW1trW1tra2trYl + AAAd30dCTExJTExMSUxMTPL9/f38W0MfQ0JCQh9DH0IfH0MfS9Lk36iCT0JCQkJCH0JCQx0bBgAAAD+2 + trZa/f39/f39/f39/f35AAAAAAAAAAAAAAAA/f39/f39/ZebnZ2dnZ2iore3t7e3u7u7tbW1tbW1tbW1 + tra1tba2trUCAAuGg0JMTExMSUxMTO77/P3y+f1YHx9CH0IfQkIfQx9DH0/k0lBCQkIfHRwZGBgMBgYA + AAAAAAJourq2tfL9/f39/f39/f39/fYAAAAAAAAAAAAAAEL9/f39/f38nZebm52dop2dop23t7e3u7ey + srW1tbW1tbW1tba2tra2tjEAAEfUQklJTExMTElZ+05Y+fv9+vz2H0MfQx9DH0NCQh9P4YNDHRkHAAAA + AAAAAAAAAAAAAAU4tbq2trae9v39/f39/f39/f39/QMAAAAAAAAAAAAG+f39/f39/fyXm5ugm52doqKd + t7e3t7m3srKysrWytbW1tbW1tbW2tbq1fAAAG85PSExMSUxMTPb1SUz2/fYeH/VZQ0IfQkJDHx8fQ9RS + HQsAAAAAAAAAAAAAFhUlOGeXtrq2tra2toT8/f39/f39/f39/f39+xgAAAAAAAAGWP39/f39/f38/Zeb + m5uXnZudnaKdnZ23t52cnLKcmrW1tbW1tbW1trW2tba2BQAFgahITExMTExJ/fz2/P39/VtC9fNCH0Mf + Qh9CQkKKhh0AAAAAEzx1n7ji4uLivbq6ura6tra6tba2pv39/f39/f39/f39/f39/fny7u7u+P39/f39 + /f39/f38l5eXm6CdoJ2dnaKit7ednJyynLK1srKztbW1tbW1tbW2tbY5AAAe30dMSUxJTFj9/f39/f39 + /fb98h9DH0MfQx9DUs4dAAAAO7zi4uLi4sviy+LEtra2ura2tra2tp/2/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39+/aXl5ebl5ubnZudnZ2dnZyampqcsrKysrKysrW1tbO1tbW1tpsAAA2KgkxMTExJ + XP39/f39/f39/f3zQx9CH0JCH0rfRgMABJ/i4uLL4uLi4uLZ2dm5urq1ura2trW1pv39/f39/f39/f39 + /f39/f39/f39/f39/f38+vbzp4Rzl5SXl5eXm52bop2dnZ2cmpycnJycnLKysrK1srK0s7O1tbW1thUA + A0vfR0xMTExO/f39/f39/f39/fAfRB9DHx9E1E8KAAB14uLL4uLiy9nZxMTE2bq6tba2tbW1tqCk8vX2 + 9/n7+/z7/Pz8/Pv7+/v5+fb19fGkhHeSl5eXl5WXl5eXl5ebm5uXnZ2dnZmZmpqampyympyysrKys521 + tbW1tbW1ZwAAHM6FSUxMTEn5/f39/f39/f39TEMfQ0IfQ4mJGwAAMuLE4uLZxNnZy8TE2cTLvba2urW2 + tra1tbW1tbWgoJ6enp6Sn5KSnp6enpeel5mZnZ2bm52bl5eXl5SUl5eXl5eXm5udm52ZmZqZmZycmpqy + srKysrWytbW1tbW1tbW1BAAGUN9JSUlMTE77/f39/f39/fIfQh8fQx+C0h0AAA/B2cTZxMTExMPZw8TD + w8PAtbW2trW1tbWztLW1tbKytZy1srKaspyanJqZnJmZmZmbnZubl5eXlZSUl26XbpeXl5ebm5edmZaZ + mZmcmZqanJqanJycspyasrWzs7W1tbM2AAAdzolMTExMTEnw+Pv9/flcH0NCH0MfT99FAwACo9nExMTD + xNnExMPDw8PDwdm2trW1tbW1s7Ozs7WytbWatbKcmrKampqamZyZmZmZmZabl5uXl5WXl5eUlJeXl5eX + l5eXnZaYmZmYmZmamZyanJydsrK1srW1srKys7W1tZsAAAZL5E9MSUlMTExMSUlEH0MfHx9DH0/fTwgA + AHDExNnExNnDw8PDw8PDw8PDwrW1tbW1tbW1tZ2ysrWcsrWymrKynJycmpqamZmZmZiWmZaZl5eVl5SU + lJSUbm6XbpeXl5eXlZiYmJmZmZmZmpmampqampqcsrKasrOys7K1tTYAAB2G30tMTExMSUxMRB9DH0JC + Qx9P4VEYAAAyw8PDw8PDwsPDw8HBw8LDwr6+vbW1tLW1tbW1tbWynLWyspqynJqampqdmZmZmZmZmZmV + lZeXlZeUl5SUfHyUl5SXl5eXl5WVlZaYmJmYmZmZmpqampycsrKasrK1nbKysrO1mAEABkLS1EtJTElM + TElCQx9CHx9CUuSCGwAAD7zDw8PDw8PDwcLCw8LAwMC+wr67tbSys7KztbWysrWyspqaspyanJqZmpmZ + mZmZmZWYlZWVlZeXlJeUlHyUbpRulJSUl5eUlZWVlZaWlZmZmZmZmZqampqamrKasrKytbObtZq1NgAA + GEbU4VJESUlHQh8fQkJCSorhUh0AAAG4wcPBwsLCv8LCwMDCvsC+vr68vb61nbWys7KymrWymrKasrKa + mpqampqZmZmZmZWYmZWVlZWUlZSXlJR8lG5ubpSUl26XlJWUlZWVlZiZlpaZlpmZmZqZmpqamrKcmpqy + srKytbW1DwAAHUbO5NKCRh8fQkIfS4ng1E8dAAACoMDCwsLAwL7CvsDAvr6+vb6+vL28u7W1tbWdsrKy + spyymrKcmpyampmamZmZmZmWmZaVlZWVlZWUlZR8lJRtfG1ufHyUlJSUlJWVlJWVlZWYmZmZmZmZmZqa + mpqampqysrKaspyymrV8AgAAHUKC3+Tk1M/Pz9/k4YZDGwAAAIDAvr6+vr6+vr6+vry9vry8vbu9u72+ + tbK1srKysrKyspyympqamZqampmZmZmZlpmYlZWVlZWVlJR8lJR8fHxtbW1tbnyUlJSUlJSVlZWVlZWV + mJiZmZmZmZmZmpqampqamrKcsrKysrJoAAAAG0JCUorP3+DSrIJGHwsAAAF4vr6+vr6+vr6+vr28vby7 + vbu7u7u7u7e3srKysrKcnJqampqampqamZmZmZmZmZWYlZWVlZWVlJSUlJR8fHxtbW0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA + AABAAAAAgAAAAAEAIAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32e/wh+oP8If6L/CICk/wmC + pv8Jgqj/CoSq/wqErP8Lhq7/C4ex/wuIs/8MirT/DIq2/wyLuP8Njbr/DY68/w6Pvf8OkL//DpDA/w6R + wv8PksP/D5LE/w+Sxf8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCWyf8Qlsn/EJXJ/xCVyf8Qlsn/EJbJ/xCV + yP8QlMj/EJXH/w+Ux/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkL//Do++/w2OvP8Njbv/DYy5/wyL + t/8MirX/C4mz/wuIsf8Lhq//CoSt/wqEq/8Jg6n/CYKn/wmBpf8If6L/CH6g/wd9nv8He5z/B32e/wh+ + oP8If6L/CICk/wmCpv8Jg6n/CoSr/wqErf8Lhq//C4ix/wyJtP8Mirb/DIu4/w2Nuv8Njrz/Do+9/w6Q + v/8OkcH/D5LC/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJbJ/xCWyv8Ql8v/EJfL/xCXzP8Ql8z/EJfM/xGX + zP8Rl8z/EJfM/xCXzP8Qlsz/EJbL/xCWy/8Qlsr/EJXJ/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6R + wf8OkMD/Do++/w2OvP8Njbr/DIu4/wyKtv8MirT/C4iy/wuHsP8Kha7/CoWs/wqEqf8Jgqf/CYGl/wiA + o/8IfqD/B32e/wh+oP8If6L/CYGk/wmCp/8Jg6n/CoSr/wqGrv8Lh7D/C4iy/wyKtP8Mi7f/DYy5/w2N + u/8Njr3/DpC//w6Rwf8PksL/D5LE/w+Uxv8PlMf/EJXI/xCWyv8Ql8v/EJfM/xGYzf8Rl83/EZjO/xGZ + z/8Rmc//EZnP/xGZ0P8RmdD/EZnQ/xGZ0P8RmtD/EZnP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCV + yv8Qlsn/EJXH/w+Uxv8Pk8X/D5LD/w6Rwf8OkL//Do+9/w2Ou/8Njbn/DIu3/wyKtf8LiLP/C4ex/wqG + rv8KhKz/CoSq/wmCp/8JgaX/CICj/wh+oP8If6L/CICk/wmCp/8Jg6n/CoSr/wqFrv8Lh7D/C4iz/wyK + tf8Mi7f/DY26/w2OvP8Oj77/DpDA/w6Rwv8PksT/D5TG/w+Ux/8Qlsn/EJbK/xCXzP8Rl83/EZjO/xGY + z/8RmdD/EZnR/xGa0f8SmtL/EprS/xKa0/8Sm9P/EpvT/xKb0/8Sm9P/EprT/xKa0/8SmtL/EpvS/xGZ + 0f8RmdD/EZnP/xGYzv8Rl83/EJbM/xCXy/8Qlcn/EJXI/w+Uxv8PksT/D5LD/w6Rwf8OkL//DY68/w2N + uv8Mi7j/DIq2/wyJs/8Lh7H/C4av/wqErP8Kg6r/CYKn/wmApf8IgKP/CICk/wmCpv8Jg6n/CoSr/wqF + rv8Lh7D/C4iz/wyKtf8Mi7j/DY26/w2OvP8OkL//DpHB/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/xGX + zf8RmM//EZnQ/xGa0f8SmtL/EpvT/xKb1P8SnNX/EpzV/xKc1v8Sndb/E53W/xOd1/8Tndf/E57X/xKd + 1v8SnNb/Ep3W/xKc1f8SnNT/EpvT/xKa0/8SmtH/EZnQ/xGYz/8RmM7/EJfM/xCWy/8Qlsn/EJXH/w+U + xv8PksT/DpHC/w6Qv/8Njr3/DY27/w2Muf8Mirb/DIm0/wuIsf8Lhq//CoSs/wqEqv8Jgqf/CYGl/wmC + pv8Jg6n/CoWr/wqFrv8Lh7D/C4mz/wyKtv8Mi7j/DY27/w2Ovf8OkL//DpHC/w+SxP8PlMb/EJXI/xCV + yv8Ql8z/EZfN/xGYz/8RmdD/EprS/xKb0/8SnNT/EpzV/xKd1v8Tndf/E57Y/xOe2f8Tntn/E57Z/xOf + 2v8Tn9r/E5/a/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb0/8SmtL/EZnR/xGZ + z/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Txf8PksP/DpDA/w6Pvv8Njrv/DYy5/wyKtv8MibT/C4ix/wuG + r/8KhKz/CoOp/wmBp/8Jgqj/CoWr/wqGrv8Lh7D/C4iz/wyKtv8MjLj/DY27/w6Pvf8OkMD/D5LC/w+T + xf8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGZ0P8SmtL/EpvT/xKc1f8Sndb/E53X/xOe2f8Tn9r/E5/a/xOg + 2/8UoNz/FKDc/xSh3f8Uot7/FKLf/xSi3/8Uod3/FKDc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E57Z/xOe + 2P8Tndf/EpzV/xKb1P8SmtL/EZnR/xGYz/8Rl83/EJbL/xCVyf8Qlcf/D5PF/w+Sw/8OkcH/Do++/w2O + vP8NjLn/DIq2/wyJtP8Lh7H/C4au/wqErP8Jg6n/CoSq/wqErf8Lh7D/C4iz/wyKtf8Mi7j/DY27/w6P + vv8OkMD/D5LD/w+Txf8PlMf/EJbK/xCXzP8RmM7/EZnQ/xKa0f8Sm9P/EpzV/xOd1v8Tntj/E57Z/xOf + 2v8UoNz/DHKd/wAJDf8AAwT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAEB/wAF + Bv8ISmb/FKLe/xSg3P8Tn9v/E5/a/xOe2P8Tndf/EpzV/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJbK/xCV + yP8PlMb/D5LD/w6Rwf8OkL7/DY68/w2Muf8Mirb/DImz/wuHsf8Kha7/CoSr/wqErP8Lhq//C4iy/wyK + tf8Mi7j/DY27/w6Pvf8OkMD/D5LD/w+Txf8Qlcj/EJbK/xCXzP8RmM7/EZnQ/xKa0v8SnNT/EpzW/xOe + 2P8Tntn/E57a/wY5Tv8AAQH/AAAA/wAAAP8AAAD/BgYG/wgICP86Ojr/cXFx/46Ojv+VlZX/kJCQ/4WF + hf9DQ0P/DQ0N/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAgK/xSi3v8ToNv/E5/a/xOe2P8Tndf/EpzV/xKa + 0/8RmdH/EZjP/xGYzf8Ql8v/EJXI/w+Uxv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4ew/wqF + rf8jkrb/C4iy/wyKtP8Mi7f/DY26/w2Ovf8OkMD/D5LD/w+Txf8QlMj/EJbK/xGYzf8RmM//EZnR/xKa + 0/8SnNX/E53X/xOe2f8Tn9r/AAcJ/wAAAP8AAAD/BAQE/0RERP+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ycnP+Li4v/BAQE/wAAAP8AAAD/AAMD/xGQ + xf8Tn9v/E57Z/xOe2P8SnNb/EpvU/xKa0v8RmtD/EZfN/xCXy/8Qlsn/D5TG/w+SxP8OkcH/Do++/w2N + u/8MjLj/DIq1/wuIsv8Lhq//KZa6/yyZvv8wnML/C4y5/w2Ovf8OkL//D5LC/w+Txf8Qlcj/EJbK/xGX + zf8RmM//EZrR/xKb1P8SnNb/E57Y/xOf2v8KW33/AAAA/wAAAP8ODg7/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+cnJz/m5ub/52dnf+enp7/nZ2d/5ubm/+dnZ3/nZ2d/52dnf+UlJT/Xl5e/zEx + Mf8WFhb/AAAA/wAAAP8AAAD/AAQF/xSh3f8Tn9r/E57Y/xKd1v8SnNT/EprS/xGZ0P8Rl83/EJbL/xCW + yf8PlMb/D5LD/w6QwP8Oj73/DY27/wyLuP8MirX/C4iy/yuYvf8um8D/M57E/zeiyP86pMv/EpPC/w+T + xf8Qlcf/EJbK/xGYzf8RmM//EprS/xKb1P8SnNb/E57Y/xOf2v8ACg7/AAAA/wEBAf81NTX/i4uL/52d + nf+dnZ3/nZ2d/5ycnP++vr7/yMjI/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8jI + yP8EBAT/iIiI/6mpqf+np6f/qKio/6ioqP+oqKj/qKio/6mpqf8HBwf/Ax8s/xOf2/8Tntn/E53X/xKc + 1f8SmtL/EZjQ/xGXzf8Qlsv/EJXI/w+Uxv8PksP/DpDA/w2Ovf8Njbr/DIu3/wyJs/8smb//MJ3D/zSf + xv85pMr/PKbN/0Gp0P9GrNT/MaTR/xCXzP8RmM//EprR/xKb1P8Sndb/E57Z/xOf2/8ABgf/AAAA/zIy + Mv81NTX/NTU1/zU1Nf+cnJz/sLCw/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf9AQED/p6en/6ioqP+oqKj/qKio/6ioqP+oqKj/qamp/0lJSf8TExP/oaGh/wAA + AP8ACQz/E6Db/xOe2f8Tndf/EpzV/xKa0v8RmdD/EZfN/xCWyv8Qlcj/D5PF/w6Rwv8Mj7//L57F/y2b + wv8pmb//L5vB/zOfxf83osj/O6XM/0Coz/9Dq9L/SK7W/0ux2f9QtNv/Urbd/xOc1P8Sndb/E57Z/xOf + 2/8ACg3/AAAA/zU1Nf81NTX/NTU1/zU1Nf84ODj/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/BAQE/6ioqP+oqKj/qKio/6ioqP9fX1//JCQk/yQk + JP8kJCT/paWl/wQEBP8rKyv/AAAA/wAHCP8UoNz/E57Z/xOd1/8SnNT/EprS/xGZz/8RmM3/EJbK/zGj + zv87p8//OKTM/zOgyP8vnsX/KprB/zGew/81oMf/OaTL/z6nzv9CqtH/Rq3V/0qw2P9PtNv/Urbe/1e5 + 4P9au+P/X73k/wyc2v8RjsT/AAAA/zU1Nf81NTX/NTU1/zU1Nf9ERET/RUVF/0VFRf9GRkb/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/vLy8/6enp/+oqKj/qKio/5+f + n/8kJCT/JCQk/yQkJP8kJCT/JCQk/6enp/8ICAj/RUVF/0NDQ/8AAAD/AAoN/xSg3P8Tntn/E53X/xKb + 1P8goNT/SrHa/0au1/9Cq9T/PajR/zmmzv81osr/MZ/H/y2bwv8zn8X/OKLJ/zulzf9AqdD/RKzT/0iu + 1v9Nstr/ULTd/1W43/9auuL/Xrzk/2K/5v9lwen/AAAA/ywsLP81NTX/NTU1/zU1Nf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wcH + B/+oqKj/qKio/yEhIf8kJCT/JCQk/yQkJP8kJCT/JCQk/xoaGv9ERET/RERE/0VFRf9FRUX/Ojo6/wAA + AP8Nb5r/EJ7b/1q65P9VuOL/ULbf/0yz3P9Jsdr/RKzW/0Cr0/87p9D/N6TM/zOhyf8vnsX/NaDH/zmj + y/8+qM//QqrS/0at1f9KsNj/ULTc/1S33v9YuuH/XLvj/2C/5v9lwej/UZm5/wEBAf81NTX/NTU1/zU1 + Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/5CQkP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf8ICAj/qKio/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP+Tk5P/CQkJ/0VF + Rf9FRUX/RUVF/0VFRf8GBgb/AAAA/2C/6P9bvOb/V7nj/1O34f9OtN3/SrHb/0eu2P9CrNX/PajS/zml + zv81osr/MJ/H/zejyf87pc3/QKnQ/0Or0/9Irtb/TrLa/1G03f9VuOD/Wrvi/1695f9jwej/Z8Lq/wIH + Cv8xMTH/NTU1/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9FRUX/RUVF/0VFRf9FRUX/SEhI/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/lZWV/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/p6en/wkJCf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8YMj3/X7/o/1m85f9WuOL/ULbf/0yz + 3P9Ir9n/RK3W/0Cr0/86ptD/NqPM/zOhyf85o8r/PajP/0Gq0v9GrdX/SrDY/0+z2/9Ttt7/WLnh/1y8 + 5P9hv+f/ZcHp/2nD6v8AAAD/NTU1/zU1Nf9ERET/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/SEhI/7CwsP/Jycn/ycnJ/8nJyf/Jycn/y8vL/xoaGv8kJCT/JCQk/ygo + KP8oKCj/KSkp/ycnJ/8lJSX/JCQk/4CAgP8/Pz//RUVF/0VFRf9ERET/RUVF/0VFRf8oKCj/AAAA/2DA + 6f9cvuf/V7nk/1K34f9OtN7/SrHb/0Wu2P9CrNX/PKjS/zilzv80osr/OaTM/z6o0P9Dq9P/R67W/0yy + 2v9QtN3/Vbfg/1q74/9evub/Y8Do/2fC6v9kuN3/AQEB/zU1Nf82Njb/RUVF/0VFRf9FRUX/RUVF/0FB + Qf82Njb/NjY2/zY2Nv9ERET/RUVF/0NDQ/82Njb/Pj4+/0VFRf9FRUX/RUVF/0tLS/9dXV3/tra2/8jI + yP8GBgb/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+7u7v/ubm5/4CA + gP8MDAz/BAQE/wAAAP9iwev/Xr/o/1m85f9WueP/ULbg/0yz3f9HsNn/Q63W/z+q0/85pc//NaPM/zul + zf8/qdH/RK3V/0iv2P9Os9v/UrXe/1e54f9cvOT/YL/n/2TB6f9pxOz/GTA5/x0dHf81NTX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf83Nzf/NjY2/zY2Nv82Njb/RUVF/0RERP82Njb/NjY2/zY2Nv9ERET/RUVF/0RE + RP81NTX/NjY2/zY2Nv81NTX/AQEB/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u//Ozs7/RERE/0RERP8CAgL/GzdD/1/A6f9bvef/V7rk/1K34f9NtN7/SLHb/0Su + 2P9Aq9X/OqbQ/zekzf88ps7/QarS/0Wu1v9LsNn/T7Pc/1S33/9YuuL/Xb7l/xATFP9mwur/asbt/wEG + CP81NTX/Ozs7/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/RUVF/0VFRf87Ozv/NjY2/zY2 + Nv82Njb/PT09/0VFRf82Njb/NjY2/zY2Nv81NTX/Gxsb/zU1Nf9ERET/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8rKyv/Q0ND/zc3N/0RERP9FRUX/NjY2/wIICv9hwer/Xb7o/1e7 + 5f9TueL/TrXf/0qy3P9Fr9n/QazW/zyo0v84pc7/PafP/0Os0/9Grtf/S7La/1C03f9VuOH/Wrvk/1Ws + 0f8QEBD/EA8P/2zG7f8EDRD/NTU1/0VFRf8DAwP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/NTU1/zY2Nv82Njb/NjY2/0FBQf9ERET/NjY2/zU1Nf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP+5ubn/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/z8/P/9DQ0P/Q0ND/ra2t/0RERP9FRUX/RUVF/0VF + Rf8AAAD/Y8Lr/16/6f9avOb/Vbrk/1C34f9Ms93/R7Da/0Kt1/89qdP/OKXP/z+o0f9ErtX/R6/Y/02z + 2/9Rtt//Vrni/1u85P9fvOT/ERUV/xAQEP8QEBD/AAID/zQ0NP9FRUX/RUVF/0VFRf9FRUX/EBAQ/wAA + AP8iIiL/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv9ERET/RUVF/zY2Nv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8TExP/Pz8//0NDQ/9DQ0P/Q0ND/CAgI/zU1 + Nf82Njb/Ojo6/0VFRf9FRUX/AAAA/2TC7P9fwOr/W73n/1a65P9RuOL/TLTe/0ex2/9Crdf/PqrU/zmm + 0P8/qNH/RKzV/0mw2f9OtNz/UbXe/1e75P9dvef/Yb/n/2XC6/9syPH/HTM8/wAAAP9ERET/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/0JCQv81NTX/NjY2/zY2Nv81NTX/RUVF/0RE + RP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9DQ0P/Q0ND/0NDQ/9DQ + 0P95eXn/CwsL/zU1Nf82Njb/NjY2/zY2Nv9FRUX/RUVF/wAAAP9lw+z/YMHr/1u96P9XuuX/Urji/021 + 3/9Jstz/Q67Y/z+r1f86p9H/QKrS/0St1v9JsNr/TrTd/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ + EP8AAAD/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8AAAD/AAAA/wAA + AP8tLS3/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP/R0dH/y8vL/xAQEP8cHBz/3Nzc/83Nzf8ICAj/Kioq/zY2Nv82Njb/PDw8/0VFRf8AAAD/ZcTt/2HB + 6/9dv+n/WLvm/1O44/9NtOD/SrPd/0Su2f9Aq9X/O6jS/xCVyP8Qlsv/EZjO/xKa0v8QEhL/EBAQ/xAQ + EP8QEBD/EBAQ/xAQEP8QEhL/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/IiIi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/+Dg4P/+/v7//v7+////////////4eHh/ysrK/82Njb/NjY2/z09 + Pf9FRUX/AAAA/xWl5f8VpOL/FKLf/wyd3P8tqt3/TrTg/0mx3f9Er9n/QKzW/zup0/8Qlcj/EJfM/xGY + z/8SmtL/EE9n/xAQEP8QEBD/EBQV/xOHuf8Sa5H/EBAQ/wUFBf8nJyf/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/x8fH/AAAA/wEBAf////////////// + ///j4+P/AgIC/zY2Nv9ERET/RUVF/wAAAP8Wpub/FaTj/xSi4P8Uod3/E5/a/xOd1/8Sm9P/EZnQ/xGY + zf8MlMn/EJbJ/xCXzP8Rmc//EprT/xKd1v8Sksj/FKHc/xSh3/8QFBX/EBAQ/xAQEP8Vir7/AwMD/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/29vb/wAA + AP8QEBD//////////////////////wsLC/82Njb/RUVF/0RERP8ABQb/Fqbm/xWl5P8Vo+H/FKHe/xOf + 2v8Tndf/EpvU/xGa0f8RmM3/EJbK/xCVyf8Rl8z/EZnQ/xKb0/8Tndf/E5/a/xSh3f8QEQ7/EBAQ/xAQ + EP8QFRX/F6jq/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/6Ojo//////////////////////8NDQ3/RERE/0VFRf9ERET/AAoN/xan + 5/8VpeT/FaPh/xSh3v8Tn9v/E57Y/xKc1P8RmdH/EZjO/xCWyv8Qlsn/EZjN/xGZ0P8SnNT/E53X/xOf + 2v8Uod3/FKLg/xAPEP8QEBD/Fqfo/xeq7P8AAgP/RERE/0VFRf9FRUX/AAAA/xISEv9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/9vb2///////p6en/RERE/0VF + Rf9FRUX/Dw8P/xKRyf8Wp+f/FaXk/xWj4f8Uod7/E5/b/xOe2P8SndX/EZrR/xGYzv8Qlsr/EJXJ/xGX + zf8RmdD/EpvU/xOd1/8Tn9r/FKHd/xWj4f8VpOP/FZrV/xao6f8Xquz/BCk6/x4eHv9FRUX/AAAA/wAA + AP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9FRUX/DAwM/wAAAP8AAAD/AAAA/wAA + AP8LCwv/RERE/0VFRf9FRUX/RUVF/wAAAP8WqOn/Fqfn/xWl5P8Vo+H/FKHe/xOg2/8Tntj/EpzV/xGa + 0f8RmM7/EJbK/xCVyf8Rl83/EZnQ/xKb1P8Tndf/E5/a/xSh3f8Vo+H/FaXk/xam5v8WqOn/F6rs/xer + 8P8AAAD/RUVF/0VFRf8AAAD/KizQ/x8hnf8AAAD/NjY2/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEREf9FRUX/RUVF/0VF + Rf9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAwP/RERE/0VFRf8ACAr/Fqfq/xan5/8VpeT/FaTi/xSh + 3v8ToNv/E57Y/xKc1f8RmtH/EZjO/xCXy/8Qlcn/EZjN/xGZ0P8SnNT/E53X/xOf2v8Uod3/FaLg/xWl + 5P8Wpub/Fqfp/xeq7P9BuvH/AQQF/0RERP9FRUX/AAAA/wAAAP8sLtb/KSvO/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/xEREf9ERET/MzMz/wAAAP8AAAD/FBQU/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8DAwP/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/FaHh/xao + 6v8Wp+f/FaXk/xWj4f8Uod7/E6Db/xOe2P8SnNX/EZrR/xGYzv8Qlsr/EJbJ/xGYzf8RmdD/EpvT/xOd + 1/8Tn9r/FKHd/xSi4P8VpOP/Fqbm/xKl6P9zzPT/d831/2Glw/8CAgL/RUVF/0VFRf8AAAD/LC7W/yst + 0/8BAQj/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8jIyP/RERE/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8AAAD/AAAA/wAA + AP8AAAD/AAEB/1nB8f8WqOr/Fqfn/xWl5P8VpOH/FKHe/xOf2/8Tntj/EpzU/xGZ0f8RmM7/EJbK/xCW + yf8Ql8z/EZnQ/xKa0/8Sndb/E5/a/xSh3f8UouD/FaTj/2bF7v9tyPH/csvz/3bO9f97z/b/AAAA/0VF + Rf8iIiL/AAAA/ywu1v8sLtb/KizQ/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsLC/8DAwP/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/wICAv8AAAD/AAAA/2rA5/9tyPP/Z8bx/xan5/8VpeT/FaPh/xSh3v8Tn9v/E53X/xKc + 1P8RmdH/EZfN/xCVyv8Qlcj/EJbM/xGZz/8SmtP/EpzW/xOe2f8UoNz/HaXh/2LC7P9nxe7/bMbw/3DK + 8/90zPT/ec/2/1SPqv8BAQH/AAAA/wAAAv8sLtb/MDLX/ywu1v8AAAD/ERER/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/zY2 + Nv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wIJC/9vyvT/bMnz/2bH8f9jxO7/FKTj/xSi + 4P8Uod3/E5/a/xOd1/8Sm9T/EZnQ/xGXzf8Qlsr/EJTI/xCWy/8RmM//EprS/xKc1f8Tntn/WLvm/12/ + 6f9hwev/ZcTu/2rG8P9uyfL/csv0/wAAAP8AAAD/AAAA/wAAAP8qLND/NDbY/zY42f82ONn/Fxh0/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0FBQf8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP9yy/X/bcr0/2rH + 8v9lxfD/YcLu/1zA6/9Ruuf/FKHd/xOf2v8Sndb/EpvT/xGZ0P8Rl8z/EJXJ/w+Ux/8Ql8v/EZjO/xKa + 0f9Br93/Ubfi/1a75f9avuj/X8Hr/2PD7f9oxu//bMjx/zhkef8AAAD/Ky3V/yst1f8AAAD/KizQ/zY4 + 2f82ONn/NjjZ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RERE/wIC + Av9wxu7/cMv1/2zK9P9nxvH/Y8Xw/17B7f9bv+v/Vbzo/1G55f8Tntn/EpzW/xKa0v8Rmc//EJbM/xCV + yP8PlMf/EJXK/xCYzv9Hr9v/S7Pe/1C34f9UuuT/WL3n/12/6v9iwuz/Zsbv/2rH8f9uyvP/AAAA/wAA + AP8sLtb/LC7W/yos0P82ONn/MjTX/zY42f8qLND/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/IiIi/0VF + Rf9FRUX/Tk5O/wICAv8+boT/c8z2/23J9P9qyfP/ZcXx/2LE7/9dwOz/Wb7q/1S75/9PuOT/S7Xh/xee + 1v8SmtL/EZjO/xCWy/8Qlcj/D5TG/zyp0/9BrNb/RK/a/0qy3f9OteD/U7nj/1a85v9bvun/X8Dr/2TE + 7v9oxvD/bMjy/3DK9P82YHP/AAAA/yst0v8oKsj/LC7W/ywu1v82ONn/KizQ/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/wAAAP9FRUX/UVFR/wICAv8bLjb/c833/3DM9f9syfT/Z8by/2PE8P9fwu7/W7/r/1a8 + 6f9Suub/Tbfj/0q04P9FsN3/QK3Z/xGYzv8Qlsr/D5TH/zalzv87qNL/P6vW/0Ou2f9Isdz/TLTf/1C3 + 4v9VuuX/WL3o/12/6v9hwu3/ZcTv/2nH8f9tyfL/csz1/wAAAP8rLdP/LC7W/yos0f8zNdf/NjjZ/yUn + vP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8/boT/dM33/3HM9v9qxe7/RIyl/2PD + 7v9hwu7/XcHt/1m+6v9UvOj/ULnl/0u24v9Is9//Q7Dc/z6s2f87q9b/EJXJ/w+Txv81o83/OKbR/z2p + 1P9Crdj/Ra/b/0qy3v9Pt+H/Urnk/1a85/9bvun/X8Hs/2TE7v8AAAD/AAAA/wAAAP8AAAD/AAAA/yos + 0P8qLNH/LC7W/ywu1v8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/1FRUf9RUVH/AAAA/wAAAP8Xpun/Ysf2/3LL + 9v9ty/X/asjz/0OMpv9BjKX/Pouk/zuIov84hZ//Noag/z2XuP9Cpcz/QarU/z6o0/83ncT/KYOh/yN1 + jf9DbXj/NKPM/zalz/87qdP/QKzW/0Ov2v9Ist3/TLTg/1C34/9UuuX/Qo2u/wAAAP8AAAD/AAAA/yor + Kf85Ojf/OTo3/zk6N/8zNHj/KizO/yst0v8qLM7/LC7W/ywu1v8FBRr/AAAA/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9PT0//UVFR/1FRUf9QUFD/AgIC/wAI + C/8ZrvT/GK3z/xit8v9uy/b/19fX/42Ojf9gcnf/Qomf/zuJo/85h6D/N4Sf/zSEnv8xgpz/MICZ/yt+ + mP8se5P/YW1w/6qrq//+/v7/9/f3/zGhyv81pM7/OabR/z2r1f9Crtj/RbDb/0qz3v9NtuH/CRUa/wAA + AP82NzT/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8rLdT/Ky3U/ywu1v8qLM7/Ky3U/ywu + 1v8WF2v/AAAA/wAAAP8AAAD/BQUF/yIiIv8oKCj/RUVF/0VFRf9FRUX/SkpK/1FRUf9RUVH/UVFR/09P + T/8DAwP/AAAA/xKLw/8ZrvX/GK3z/xis8v8Yq/D/F6vu/2FcWv///////////////////////v7+//// + //////////////7+/v////////////////////////////f39/8un8j/M6PM/zal0P87qtT/P6zX/0Ku + 2v9Hst3/S7Xg/wAAAP85Ojf/OTo3/zk6N/85Ojf/QEE+/z9APf85Ojf/OTo3/zk6N/8zNDH/Jymm/zI0 + 1/8qLM7/KizO/zEz1/8wMtf/KizO/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/C1yB/xmv9v8Zr/X/GK3z/xis8v8YrPD/F6vv/xep7f9UfZD///////// + //////////////////////////////////////////////////8AAAD///////7+/v/39/f/LJ3G/zCh + y/80pM7/OafR/zyq1f9Brdj/RLDb/wAAAP8VLEL/OTo3/0BBPv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/OTo3/zIyMP8bGxr/LS/W/zQ22P8rLdT/KizO/yst0v82ONn/LC7W/yoszv8qLM7/KizP/yst + 0v8rLdX/LC7W/ywu1v8sLtb/Ky3V/zk6N/85Ojf/AAAA/wAAAP8AAAD/AAAA/xit8v8YrPD/F6vv/xep + 7f8XqOv/Jp3R/////////////////wAAAP/j4+P//////////////////////wAAAP8AAAD/Xl5e//// + ///+/v7/9/f3/yqcxf8unsj/MqLN/zal0P85qNP/PqvW/0Ku2v8AAAD/QWyX/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zExL/8bGxr/IiJo/y8x1/82ONn/MjTY/zI0 + 1/82ONn/NjjZ/zEz1/8qLM7/KizO/yoszv8oKsj/KizO/xsbGv85Ojf/OTo3/zk6N/85Ojf/OTo3/wAA + AP8AAAD/BSo7/xep7f8XqOv/Fqjp/xmn5f///////////7+/v//X19f//////wAAAP8AAAD/AAAA/39/ + f////////////////////////v7+//b29v8pm8P/LJ7H/y+fyv80pM7/N6bR/zup1P8/rNf/AAAA/0BB + Pv9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zEx + L/8xMS//JiYk/xsbGv8bGxr/Gxsa/xsbGv8bGxr/Gxsa/xsbGv8mJiT/MTEv/zU1M/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wAAAP8AAAD/Fqfp/xan5/8So+X///////////////////////// + //8AAAD/AAAA////////////f39//wAAAP8AAAD///////7+/v/29vb/J5jA/ymcxf8tn8j/MqLM/zSk + z/84p9L/O6nV/wAAAP8AAAD/Q0RB/1Sn+/9HW2z/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/QkNA/zk6N/85Ojf/NTUz/zU1M/81NTP/NTUz/zk6N/85Ojf/Pj88/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9BQj//OTo3/zk6N/85Ojf/AAAA/wUpOf8VpeX/E6Pi//// + /////////////0NDQ/8AAAD//////wAAAP8AAAD/AAAA/39/f///////AAAA///////9/f3/9vb2/ySX + v/8nmcL/K53G/y6eyf8yos3/NaXQ/zmn0/89q9b/AAAA/wAAAP9DREH/Rlhn/1Sn+/9Up/v/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf87PDn/OTo3/zk6 + N/8AAAD/FaTj/xug2P//////////////////////////////////////f39//39/f/9/f3////////// + /////////f39//X19f8hlLz/JZjA/yiaw/8rnsf/LqDK/zKizf81ptH/OajU/z2r1/8AAAD/AAAA/wAA + AP9DREH/Q0RB/0+Kxf9Up/v/Q0NA/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf///////////0NE + Qf9DREH/T1BN//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/zs8Of85Ojf/AAAA/xWj4f8rj7r//////////////////////////////////////wAA + AP8DAwP/ra2t//b29v////////////39/f/19fX/H5K6/yKUvf8mmcH/KZvF/yyeyP8wocv/MqPO/zan + 0v85qdT/PavX/0Ct2f8AAAD/AAAA/wAAAP8aGxn/Q0RB/0+OzP9Pjsz/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf//////9vb2/0NEQf/Ly8r/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTk3/wAAAP8Uod7/W3iD//////////////////// + ////////AAAA/wAAAP8AAAD/AAAA/39/f/8AAAD////////////9/f3/9fX1/xyQt/8glLv/IpW+/yaZ + wv8pm8X/LJ/J/zChzP8yo87/NqfS/zmp1f8SmM7/EZnQ/xKa0/8SnNX/AAAA/wAAAP8eHx7/Q0hJ/0NE + Qf9DREH/S0xJ/1RVUv9UVVL/VFVS//////9DREH/Q0RB/0NEQf//////iouJ/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/UZnh/z1WbP8AAAD/FKDc/2pk + Y////////////////////////////////////////////wAAAP//////AAAA/////////////f39//T0 + 9P8ajrX/HJG4/yCUvP8jl7//JprD/ymcxf8sn8n/MKHM/zOkz/80ptH/EJfM/xGYzv8RmdD/EprT/xKc + 1f8Tndf/AAAA/wQEBP9Up/v/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/2pr + af9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/S3ei/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/S3Wd/0NE + Qf8AAAD/AAAA/xOe2f9vcHH///////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA + AP////////////z8/P/09PT/F4uy/xqPtv8ekrn/IJS8/ySYwP8nmsP/KZzG/yyfyv8vocz/D5TH/xCV + yf8Qlsv/EZjO/xGY0P8SmtL/EpvU/xKc1v8AAAD/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS//// + /////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/S3eh/0NEQf9DREH/Q0RB/0NE + Qf9DREH/PDw5/wAAAP8AAAD/AAAA/xOe2P8Tndb/5eXl////////////////////////////AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/goKC///////8/Pz/9PT0/xaLsP8YjLP/G4+2/x6Suv8glL3/JJfA/yeb + w/8pnMb/DZDB/w+SxP8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGa0f8SmtP/AAAA/wEBAf9LdZ3/VFVS/1RV + Uv9UVVL/VFVS/1RVUv9UVVL//////0JDQP+pqaj/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/Q0RB/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/E57Z/xOd1/8SnNX/EZvU//7+/v////////////// + //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/////////////Pz8//Pz8/8Uia3/Foqw/xiM + s/8bj7f/HpK6/yCUvf8jl8D/HJXA/w6Qv/8OkcH/D5LE/w+Txv8Qlcj/EJbK/xGXzP8RmM7/EZnQ/xKa + 0v8AAAD/UJTY/1RVUv9UVVL/VFVS/6ipp/////////////////9xcW///////0NEQf9DREH/Q0RB/0NE + Qf9HXnL/Ojs4/wAAAP8AAAD/S7fl/0q25P9JtuT/SLXj/0a04v8Tntj/E53X/xKc1v8Sm9T/EprS/111 + fv////////////////////////////////////////////////////////////////////////////z8 + /P/y8vL/EYeq/xSJrf8Wi7H/GI2z/xuPt/8dkrr/IJW9/w2Nuv8Njrz/DpC//w6Rwf8PksP/D5TG/xCV + yP8Qlsr/EJbL/xGXzf8RmM//AAAA/0NEQf9DREH/VFVS/1RVUv/w8fD///////////////////////// + //9DREH/Q0RB/0NEQf9DREH/Q0RB/wAAAP9JteP/R7Xj/0az4v9Gs+H/RLPg/0Oy3/9Bsd//EpzV/xKb + 1P8SmtP/EZnR/w6Y0P/y8vL//v7+//7+/v/+/v7///////////////////////7+/v/+/v7///////7+ + /v/Iycn/cG1t/0V8jP8Khq7/D4Wq/w+Ep/8Rhqv/FImt/xaKsf8YjbP/Go+3/wyKtP8Mi7f/DY25/w2O + vP8Oj77/DpDA/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/wQmM/8AAAD/VKf7/1RVUv9UVVL/VFVS//// + //////////////////9qa2j/Q0RB/0NEQf9DREH/T47M/wAAAP8EDA//RLLg/0Ox3/9Csd//QbDe/0Cv + 3f8/rtz/Pa7b/xCZ0v8RmdH/EZrQ/xGYzv8RmM3/EJbL/xCVyf8Qlcf/EJPF/xGTw/8QkcD/EJC+/w6O + vP8Ojbr/DIu4/wyKtf8Xj7b/Foyz/xSLsf8SiK7/D4Wq/w2Dp/8MgaT/D4Sn/xGGq/8Uia3/FYqx/wuH + r/8LiLL/DIm0/wyLt/8NjLn/DY67/w6Pvf8OkMD/DpHC/w+SxP8PlMb/D5TH/xCWyf8Qlsr/AAAA/0NE + Qf9GWmv/VFVS/1RVUv9UVVL/VFVS/6Chn/9DREH/Q0RB/0NEQf9DREH/VKf7/wAAAP8AAAD/QK/d/z+u + 3P8/rtz/Pq7b/z2t2/88rdr/OqvZ/zmq2P8zqNb/EZjO/xCXzP8Qlsv/EJXJ/xCVyP8Pk8b/D5LE/w+S + wv8OkMD/Do++/w2OvP8Njbr/DIu3/wyKtf8LiLL/C4ew/xOKsf8SiK7/D4ar/w2Cp/8KgaX/C4Ci/wyB + pP8Phaj/EYer/xOIrf8KhK3/C4av/wuIsf8MibT/DIq2/wyLuP8Njbr/DY69/w6Qv/8OkcH/D5LD/w+S + xP8PlMb/D5TH/wAAAP8AAAD/T47M/0NEQf9UVVL/VFVS/1RVUv9DREH/Q0RB/0NEQf9DREH/VKf7/zEy + MP8AAAD/PK3a/zus2f86q9n/OqvZ/zmq2P83qtf/N6nX/zWo1f81p9X/M6bT/xCXy/8Qlcn/EJXI/w+T + xv8Pk8X/D5LD/w6Rwf8OkL//DY69/w2Nu/8NjLn/DIu3/wyKtP8LiLL/C4ew/wqFrf8KhKv/D4ar/w2D + p/8KgaX/CX+i/wh9n/8LgKL/DIGk/w+Ep/8Jg6j/CoOq/wqErP8Lhq//C4ex/wuJs/8MirX/DIu3/w2N + uf8Njrv/Do+9/w6Qv/8OkcH/D5LD/w+SxP8PlMb/AAAA/zIzMf9Tpvv/S3We/0NEQf9DREH/Q0RB/0NE + Qf9DQ0D/VKf7/0JCQP8AAAD/N6nW/zap1v82qdb/NqjV/zWn1f81p9X/NKfU/zOm0/8ypdL/MKTR/y+i + z/8PlMf/D5TG/w+Txf8PksP/DpHC/w6QwP8Oj77/DY68/w2Nuv8Mi7j/DIq2/wyJtP8LiLL/C4av/wqE + rf8KhKv/CYKo/wuCpv8KgaX/CX+i/wh+n/8HfJ3/CH2f/wqAov8IgKP/CYGl/wmCp/8KhKr/CoSs/wqF + rv8Lh7D/C4iy/wyKtP8Mirb/DIy4/w2Nuv8Njrz/Do++/w6Qv/8OkcH/DpHC/w+SxP8AAAD/QEE+/0NE + Qf9Up/v/VKf7/1Sn+/9Up/v/Q0RB/zAxL/8AAAD/J3+h/zOm0/8zp9P/MqbS/zKl0f8xpNH/MKPQ/zCj + 0P8uos//LaLO/yyhzf8qn8z/DZHE/w+Sw/8OkcH/DpDA/w6Pvv8Njrz/DY27/w2Muf8Mi7f/DIq1/wuI + s/8Lh7H/C4av/wqFrf8KhKr/CYKo/wmCpv8IgKT/CX+i/wh+n/8HfJ3/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAgAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAEB/wgI + B/8BBAr/AwkM/wsLC/8QEA//BAsT/wgUGP8SEhL/GBkX/xAXGv8QGBv/Gxwc/x8gHv8gIR//CAgn/wMa + JP8MHCP/BB4q/xYeIf8KCzX/BCAt/xQjKv8EKDf/GC02/xYxPf8jIyP/KCgm/ycpKf8rLCv/MDEu/yQk + Nv8lLDD/Kisx/yUlPP8uNTr/Nzc3/z9APf9AQT7/Dg9G/xARTv8RElf/BjJE/ww1Rv8GNkn/BzlO/xM3 + Rv8HPFT/JSVI/yg7SP8mJlX/FRZp/xgZef8nKGT/JSZ3/zIzf/8HQln/GURW/yVBTP88Q0b/JExe/zlL + W/8JSmb/EUlg/xJRbP8LV3f/EVZy/y1Obv8sV2n/N1lu/ztbdP84Znr/RERD/0hJRv9ESUv/S0tK/09R + Tv9QUU7/RExR/0NQWv9LU1j/U1NR/1hZVv9bXFv/YWJf/0ZZaP9HXXH/R2B3/0phdv9IZH3/YmJi/2xs + bP9xcm//c3Nz/3x8fP9/gH7/gYF//xschv8dH5D/HiCT/yMlm/8mJ6T/LzGl/yUnuP8KX4H/DGWL/xJl + iP8NapP/B3yd/wh+n/8gaIT/OWyD/yxwjP86dIr/JnWU/zd7lv8OdaH/CX2h/xJ1ov9KaIT/SmyM/0Z3 + jP9JbpL/TnKT/0N9lv9LdJz/QX+b/0x5pP9Me6j/TX+w/ykryf8vMc//Ky3S/y4w1P8yNNf/N4Ga/wmB + pP8KhKv/GoKi/xGHqv8Sia3/HYiv/wuHsP8LibT/DY27/xCBsf8Ui7L/Goyz/xKEuP8Qir7/HI24/w6Q + vv8akLf/HJK6/y6Jqv89iqf/Jo+6/zKNtP89j7T/JJa9/zSVu/9GgZf/V4aV/3CTnf9Fiqb/WpWs/02B + tP9Ohbz/QJi5/1mauP9vnK7/epym/xGNwf8OksP/D5bL/xOUxv8ZlcP/EJXK/xGYzv8amsz/EpzU/ymb + xP82nML/IZ/R/xSg3P8soMz/NqPL/yCh1f8spNP/J6XZ/y2q3/8zpdH/OabR/zWo1f88qdP/M6rc/zus + 2v8VpuX/GK3y/yir5P8yruT/LbDr/z6y4/8msPD/T4rF/1CPzf9HncD/UJHT/1elxf9DrNX/V63S/0Sw + 3P9Lstv/U7Tc/2Kt0P9htdn/RLLg/0u14f9GuOv/S7rs/1e75P9Gu/H/Yr3l/13B7P9MwPb/V8Dw/2PC + 6/91xuv/asfx/3PM9f+EhIP/i4uK/4+Qjv+RkY//mZmZ/5ikqf+Grbr/kqu1/6Kiov+oqaf/qqqq/6+w + rv+ntbj/ubm5/8DAv/+UssD/qb7G/77Bwf/IyMj/1tbW/+bm5v/09PT//v7+/wAAAP8AAAD/AAAA/2xs + bIiIiIiJiY6Pj4+QkJCQrJCtra2tra+ur7GxsbGxrrGxsa6xsa2vra2tra2srZCQkI+Pj4mJiYmJiIh1 + bWxsbYiIiImJiY+Pj4+QkJCQkK2tra2xrrSxsbGxsbGurrKxrrGusbGxsbGxrK2trZCQkJCQj4+Pj4mJ + iYmIiGxtbYiIiImJjo6Pj4+QkJCsra2tsbGxrKyxrLS0tLS0tLSytLS0tLSxtLGxsbGusa2trZCXkJCQ + j4+PjomJiYiIdYiIiYmOiY+Pj4+XkJCXra2xrrGxtLG0tLS0tLS0tLS0tLS0tLS0tLS0tLGxsayxsa+t + rayQkJCPj4+JiYmIiIiIiIiJi4+Pj4+QkJCtra2xsayxrLS0tLS0tLS0tLS0tLi0uLS0tLS0tLS0tLSx + sbKxsaytrZeQkI+Pj4mJiYmIiImOiY+Pj5CXl62tra+xsbG0tLS0tLS4tLi0uLi0uLi4tLi0tLS0uLS0 + tLS0tLSsrLGxra2XkJCQj46PiYmJiImJiY+Pj4+Xl5etr6+xsay0tLS0tLS0tLS0tLSslHZ2dpGstMW4 + tLS4uLi0tLS0tLSxsa+sra2tkJCQj4+PiYmJiY6Pj4+Xl5evrbGysbS0tLS0uLS4uJRBLxACAAAAAAAA + AAIGKkF2tLS0tLS0tLS0tKy0sa+trJCQkJCPiYuJiY+Pj4+Xl5evra+xrLS0tLS0tLSsPgYCAAIaJEtS + WlpaU00lGwUAAAIvdrS4uLS0tLS0sbGxr62tl5CPj4+Oj5iMko+Xl5etrbGysbS0tLS0uKwsAAIOUV7q + 7urq7uru6u7u6u7q5lohAQAQarS0tLi0tLSxsbGvra2XkJCQj4mfn5+Yl5etra6xsbS0tLS0tEICAiRe + 6urq6uru8PDx8fHx8PDuX1pRSyQGAQASdrS0tLS0tLSxsa+tl62Qj4+Pn7a6urq1r66vsrS0tLS0tBcA + CCFd7uru8PP0+Pj4+Pj4+Pj48yFTX+ru8O7uXiE+tLS0tLS0sbGxr62Ql5eQmJ+2urq6wtG5srK0tLS0 + tBIBDCQkJOnx+Pj4+fj4+Pj4+Pj4+Frn8PDw8O/mWltcABe0tLi0tLSxsq+tr7Cfn7W1urq60dHS1NXT + u7S0tCsBHSQkJCRR8/j4+Pj4+Pj4+Pj4+PQl8O/u7loeGhtdGg4AF7S0tLS0tLG0v7q6urmfoLq6ztHR + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA + IAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32f/wh/ov8JgaT/CYKn/wqEqv8KhK3/C4ew/wuI + s/8MirX/DIu4/w2Nuv8Njrz/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJTH/xCVyP8Qlsn/EJbJ/xCV + yf8Qlcn/EJbJ/xCWyf8Qlcj/EJXI/w+Ux/8PlMb/D5LE/w+Sw/8OkcH/DpC//w2Ovf8Njbv/DIy4/wyK + tv8MibP/C4ex/wqFrv8KhKv/CYKo/wmBpf8If6L/CH6g/wd8nf8HfZ//CH+i/wmBpf8Jgqj/CoSr/wqF + rv8Lh7H/DIm0/wyLt/8Njbn/DY68/w6Qv/8OkcH/D5LD/w+Txf8PlMf/EJXI/xCVyv8Qlsv/EJfM/xGX + zf8Rl83/EZjO/xGYzv8RmM7/EZjO/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/w+Ux/8PlMb/D5LE/w6R + wv8OkL//DY69/w2Nuv8Mi7j/DIq1/wuIsv8Lhq//CoSs/wmDqf8Jgqb/CICj/wh+oP8If6L/CYGl/wmD + qP8KhKv/C4av/wuIsv8MirX/DIu4/w2Nu/8Oj77/DpHB/w+Sw/8Pk8X/EJXI/xCWyv8Qlsv/EZfN/xGY + zv8RmtD/EZnR/xKb0v8SmtL/EpvT/xKa0/8SmtP/EprT/xKa0v8SmtL/EZnR/xGZ0P8RmM//EZfN/xCX + zP8Qlcr/EJXI/w+Txv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4av/wqErP8Jg6n/CYKm/wiA + o/8JgKT/CYOo/wqEq/8Lhq//C4iy/wyKtf8NjLj/DY68/w6Qv/8OkcL/D5LE/w+Ux/8Qlcn/EJbL/xGY + zv8Rmc//EZnR/xKa0v8Sm9T/EpzV/xKc1v8Sndb/E53X/xOd1/8Tndf/E53X/xKd1v8SnNb/EpzV/xKb + 1P8SmtP/EZrR/xGY0P8RmM7/EJfM/xCWyv8Qlcj/D5PF/w6Rwv8OkMD/DY68/w2Muf8Mirb/C4iz/wuG + r/8KhKz/CYOp/wmBpf8Jg6j/CoSr/wuGr/8LiLL/DIq2/w2Muf8Njrz/DpDA/w+Sw/8PlMb/EJXI/xCW + y/8Rl83/EZnQ/xKa0v8Sm9T/EpzV/xOd1/8Tntj/E57Z/xOf2v8Tn9v/E6Db/xSg2/8UoNv/E6Db/xOf + 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJXJ/w+Uxv8PksT/DpDA/w2O + vf8Njbr/DIq2/wuIs/8Lh7D/CoWs/wmDqP8KhKr/CoWu/wuIsv8MirX/DYy5/w2Ovf8OkMD/D5LE/w+U + x/8Qlcn/EJbM/xGYz/8RmtH/EpvU/xKc1v8Tntj/E5/a/xOf2/8Tntr/AAMD/wAEBf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAQH/Dn6t/xSh3P8UoNv/E5/a/xOe2P8SnNb/EpvU/xKa0v8RmdD/EZfN/xCV + yv8Qlcf/D5LE/w6Rwf8Oj77/DY26/wyKtv8LiLP/C4av/wqEq/8KhK3/C4ex/wyKtf8NjLj/DY68/w6Q + wP8PksP/D5TH/xCWyv8Rl83/EZnQ/xKa0/8SnNX/E53X/xOf2v8ToNv/AAEC/wAAAP8AAAD/DAwM/1JS + Uv+bm5v/nJyc/5ycnP+cnJz/nZ2d/4eHh/8CAgL/AAAA/wAAAP8AAAD/AAcK/xSg3P8Tn9r/E57Y/xKc + 1f8SmtP/EZnQ/xGYzv8Qlsv/EJXI/w+SxP8OkcH/DY+9/w2Nuf8Mirb/C4iy/wqFrv8olbn/Eoy1/wyL + uP8Njrz/DpDA/w+SxP8PlMf/EJbK/xGYzv8RmdD/EpvT/xKd1v8Tntn/E5/Z/wAAAP8AAAD/RUVF/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/AwMD/wAA + AP8ACAv/FKDb/xOe2f8Tndf/EpvU/xGZ0f8RmM7/EJbL/xCVyP8PksT/DpHB/w2Ovf8NjLn/DIq1/wuH + sf8rl73/MJzC/zagxv83osr/D5LD/w+Ux/8Qlcr/EZjO/xGZ0f8Sm9T/E53X/xOf2v8ADhH/AAAA/zQ0 + NP+cnJz/nZ2d/52dnf+dnZ3/tbW1/8jIyP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/IyMj/Dg4O/4aG + hv+oqKj/qKio/6ioqP+oqKj/CwsL/wVEXv8Tn9r/E57Y/xKc1f8SmtL/EZjO/xCWy/8Qlcj/D5LE/w6Q + wP8Njrz/DIu4/wyJtP8tmr//M5/F/zmkyv8+p87/Q6vS/0iw1/8RmM3/EZnQ/xKb1P8Tndf/E5/a/wAE + Bf8AAAD/NTU1/zU1Nf81NTX/oaGh/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf8EBAT/qKio/6ioqP+oqKj/qKio/6SkpP8kJCT/p6en/wAAAP8ACQz/E5/b/xOe2P8SnNX/EZrR/xGY + zv8Qlsr/D5TH/w+Sw/8imcP/L57F/yqZv/8wncP/NqHH/zumzf9BqdH/R63V/02y2f9Rtd3/V7ng/wya + 1/8Tn9r/AyAt/wICAv81NTX/NTU1/zU1Nf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8jIyP+lpaX/qKio/6ioqP83Nzf/JCQk/yQkJP8kJCT/PDw8/0VFRf8AAAD/AAcJ/xOf + 2/8Tntj/EpzU/xGZ0f8RmM3/Q6zU/zyn0P84pc3/M6DH/y2bwv80n8X/OaTL/z+oz/9ErNP/SrDY/1C0 + 3P9WueD/W7vj/2G+5v9mwun/AAAA/zU1Nf81NTX/NjY2/0VFRf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/39/f/+oqKj/p6en/yQkJP8kJCT/JCQk/yQkJP8jIyP/AQEB/0VF + Rf9FRUX/AAAA/wdScv8Sntr/V7ni/1C23/9Lsdv/Ra3X/0Cq0/86ps//NaLK/y+dxf82ocj/O6XN/0Gq + 0v9HrdX/TrLa/1O33v9ZuuL/Xr3l/2TA6P8DDRL/NTU1/zU1Nf83Nzf/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wQEBP+pqan/JCQk/yQkJP8kJCT/JCQk/yQk + JP+np6f/RERE/0VFRf9FRUX/RERE/wAAAP9gv+j/Wbzl/1S34f9Os93/SbDa/0Os1f88qNL/N6TM/zKg + x/85o8r/PqjP/0Ss1P9JsNj/ULTc/1e44P9cu+P/YsDn/2jC6v8AAAD/NTU1/zU1Nf9FRUX/RUVF/0VF + Rf9DQ0P/NTU1/0VFRf9FRUX/RUVF/0VFRf/Kysr/ycnJ/8nJyf/Jycn/ycnJ/3Z2dv8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP+qqqr/RUVF/0VFRf9FRUX/RUVF/w8PD/8AAgP/Xb7n/1e54/9RtuD/S7Lc/0Wv + 2P9Aq9T/OaTO/zOiyv85pMz/QKnR/0at1v9Nsdr/U7be/1m64v9evub/ZcHp/2rD6/8BAQH/NTU1/0VF + Rf9FRUX/RUVF/0RERP82Njb/NjY2/0RERP9FRUX/PDw8/0NDQ/9FRUX/RUVF/0NDQ//ExMT/ycnJ/wAA + AP+6urr/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/u7u7/7e3t/9ERET/EBAQ/wMDA/8AAAD/YMDp/1q8 + 5v9UuOL/TrTe/0ew2v9Crdb/O6jR/zakzP88ps7/QqvT/0iv2P9Os9v/Vbjg/1u85P9hwOj/Z8Pq/12s + zf81NTX/QEBA/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/0VFRf9ERET/NjY2/zY2Nv9ERET/RUVF/zY2 + Nv82Njb/NjY2/ysrK/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+5ubn/z8/P/0RE + RP8AAAD/YcHq/1y+5/9WuuT/ULXg/0my2/9Ertj/PajS/zekzv8+qND/RK3V/0uw2f9Qtd3/V7ni/12+ + 5v8QEBD/acTr/wABAf8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf87Ozv/RERE/0VFRf81NTX/NjY2/zY2 + Nv9ERET/ODg4/zY2Nv8AAAD/AAAA/wAAAP8AAAD/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/9DQ + 0P/Pz8//Q0ND/0VFRf8iIiL/Y8Hp/16/6P9XuuX/Urji/0yz3f9Frtn/QKvU/zilz/8/qNH/Ra7W/0yy + 2/9Std//WLrj/1u54P8QEBD/EBAQ/wABAv82Njb/RUVF/0VFRf86Ojr/AAAA/0RERP9FRUX/RUVF/0VF + Rf82Njb/NjY2/zY2Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8/P + z//Q0ND/0NDQ/7+/v/81NTX/NTU1/0VFRf9FRUX/KE9f/2DA6v9avOb/U7nj/0203/9HsNv/QKvV/zqn + 0f8/qdL/Rq3X/02z3P9TuOH/SJS1/zt1jf8/d4//V5+//wAAAP9ERET/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wEBAf81NTX/NjY2/zU1Nf9FRUX/NjY2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/0NDQ/9DQ0P/Pz8//AQEB/zY2Nv82Njb/NjY2/z4+Pv9ERET/Dx8m/2HB6/9bvej/Vbrk/020 + 4P9Hsdv/QazW/zuo0v9AqtL/LqTS/xOa0P8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wICAv9ERET/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP9FRUX/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CwsL/yIiIv//////8vLy/9vb2/8CAgL/NjY2/zU1Nf9FRUX/AR0p/yeq + 5f9cv+n/Vrrk/0614P9Jstz/QqzX/zyp0/8Qlsn/EZfN/xKa0v8QGRn/EBAQ/xAQEP8QKjX/EBQT/w8P + D/9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//v7+/wAAAP8FBQX////////////a2tr/NTU1/z09 + Pf9ERET/Cld5/xWk4/8UouD/E6Db/xOd1/8SmtP/EpjO/xqay/8Qlsn/EZjO/xKa0v8TnNb/E57a/xSh + 3/8QEA//EBAQ/xNznP8VFRX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP+BgYH///////// + ////////NjY2/0VFRf9FRUX/Fqfo/xWl5P8UouD/FKDc/xOe2P8SnNT/EZjP/xCWyv8Qlsr/EZjO/xKa + 0/8Tndf/FKDc/xSh4P8QEBD/EBEQ/xep6/8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/ERER/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8ODg7//f39///////+/v7/RUVF/0VFRf8EBAT/Fqfo/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCX + y/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8UmNT/Fqfo/xeq7P8ABAX/RUVF/zk5Of8CAgv/AAAA/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9DQ0P/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/PDw8/wAAAP8AAAD/AAAA/xYWFv9ERET/RUVF/0VFRf8AAAD/Fqjp/xWl5f8Vo+H/FKHd/xOe + 2P8Sm9T/EZrQ/xCWy/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xeq7P8XrPH/MjIy/0VF + Rf8AAAD/KizQ/wAAAP9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/zk5Of9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8AAAD/BQUF/0RERP8ENUr/Fqjp/xWl + 5f8Vo+H/FKHd/xOe2P8Sm9T/EZrQ/xCWy/8Qlsr/EZjO/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xOn + 6/94zvX/AAAA/0VFRf8AAAD/KizQ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/y4u + Lv9FRUX/RUVF/0VFRf9FRUX/RUVF/ycnJ/9FRUX/RUVF/0VFRf9FRUX/JCQk/wAAAP8AAAD/AAAA/wAA + AP8Xqez/Fqjp/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCXy/8Qlcn/EZjO/xKa0/8Tndf/E5/b/xSi + 4P8VpOP/a8fw/3HL8/93zfX/J0JQ/0RERP8ICAj/KizQ/ywu1v8qLND/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wkJCf9DQ0P/RUVF/0VFRf9FRUX/RUVF/0RE + RP8AAAD/AAAA/wULDv9syfP/FKbo/xWl5P8Vo+H/FKHc/xOe2P8Sm9T/EZnP/xCWyv8Qlsn/EZjO/xKa + 0v8Sndb/E5/b/zSv4v9jwuz/acfw/3DJ8v90zPT/e9D3/wAAAP8AAAD/KizQ/zY42f8sLtb/AAAA/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/3DL9f9rx/L/ZMXw/1u/6/8UouD/FKDc/xOd1/8SmtP/EZnP/xCV + yv8Qlcj/EZjN/xGZ0f8Sndb/Vbnk/1u96P9gwev/ZsXv/23H8f8FCw3/AAAA/wAAAP8AAAD/LC7W/zY4 + 2f82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf8FBQX/c833/23K9P9nxfH/Y8Tv/1zA6/9WvOj/E5/b/xOd + 1/8SmtL/EZjO/xCWyf8PlMf/EJbM/0ew2/9Ms97/Urjj/1i85/9ewOr/ZMTu/2rG8P9vyfP/AAAA/ywu + 1v8sLtb/LC7W/zQ22P82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wkJCf9FRUX/RUVF/ykpKf9IgZv/cMz1/2vJ8/9lxPD/X8Lu/1m/ + 6v9Uu+f/Tbbj/w6a1f8RmdH/EZfN/xCVyP8MkcX/PqvV/0Su2f9Kst3/ULfi/1a75v9bvun/YcPt/2fF + 7/9syPL/ccz1/wAAAP8sLtX/KizS/ywu1v82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9QUFD/EhIS/xIgJP9zzPb/bcn0/2jG + 8v9jxfD/XcHs/1e86f9Suub/S7Xi/0Wx3f8/rNn/EJfM/w+Ux/82pc7/O6nT/0Kt2P9Isdz/TbXg/1O5 + 5P9Yvej/XcDr/2XE7v9px/H/bsnz/wAAAP8sLtb/Ky3V/ykrx/81N9j/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Tk5O/wAAAP8AAAD/IYOr/3PN + 9/9wzPb/RY6n/0KNpv9Bkaz/Wr7r/1S75/9Ot+T/SbTg/0Ow3P89q9j/N6fT/w6Qwv80o8z/OabR/z+r + 1v9Er9r/SrTf/0+34/9Vu+b/Dh0l/wAAAP8AAAD/CQkJ/zk6N/85Ojf/KizO/yoszv8rLdT/LC7W/wAA + AP8AAAD/OTk5/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf9RUVH/SEhI/wAA + AP8ZrvT/GK7z/3DL9v+bm5z/U4CO/z6Jo/88iqP/OIag/zWFnv8xgpz/LX6Z/yl8lv82dor/l5eX//n5 + +f8xocv/NqXP/zyq1f9Cr9n/SLLd/0y14f8AAAD/FxcW/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/ywu + 1v8qLM//LC7W/yoszv8sLtb/AAAI/wAAAP8AAAD/AAAA/wICAv8LCwv/CwsL/wsLC/8+Pj7/UVFR/0JC + Qv8AAAD/BCs9/xmu9f8YrfP/GKzx/xer7/99fX3///////////////////////////////////////// + //////////////j4+P8unsj/NKPN/zmo0v8+rNb/Qq/b/0KkzP8AAAD/OTo3/z4/PP9DREH/Q0RB/0NE + Qf9AQT7/OTo3/yQkI/8wMtf/LC7W/yoszv8sLtb/LC7W/yoszv8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu + 1v8cHB//AAAA/wAAAP8AAAD/GK70/xiu8/8YrPH/F6vv/xeq7P9sa2v///////////8AAAD///////// + /////////////wAAAP8AAAD///////j4+P8sncX/MaLL/zakz/86qNP/Qa3Y/wAAAP9Hjtb/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf82NjT/Gxsa/ykquf82ONn/LS/W/ywu1v82ONn/NjjZ/zQ2 + 2P8zNdf/LC7W/ygqy/8bHCr/OTo3/zk6N/85Ojf/AQEB/wAAAP8Xq+//F6rs/xao6v9bdn///////9zc + 3P8qKir/AAAA/wAAAP+3t7f/Kioq//////////////////j4+P8pm8P/LZ7I/zOjzf83ptH/PKrV/wAA + AP9DREH/Q0xR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zc4Nf8xMS//Li4s/xsb + Gv8bGxr/Gxsa/xwcG/8tLSz/MTEv/zg4Nv85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/C2CH/xan + 5/9KhJv///////////8pKSn/ExMT/1FRUf///////////wAAAP8AAAD///////f39/8mmMD/KpzF/y6f + yv80pM//OajT/z6s1/8AAAD/Q0RB/1Sn+/9Lc5v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/z4/PP87PDn/Pj88/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6 + N/85Ojf/AAAA/xWl5P9Xe4j///////////8AAAD//////wAAAP+AgID/gICA//////////////////f3 + 9/8hlbz/J5nC/yudx/8wocv/NKXQ/zmo1P8+q9f/AAAA/wQEBP9DREH/UJPX/1Sn+/9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf//////Q0RB/0NEQf9DREH/kpOR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf85Ojf/Njc0/wMaJP9nZWb//////////////////////7Kysv8AAAD/AAAA//// + //////////////b29v8fk7r/JJe//yiaw/8sn8j/MaHM/zWm0f85qNT/PqvY/w+Ar/8AAAD/AAAA/0NE + Qf9GXHD/Q0RB/0NEQf9DREH/UVJP/0NEQf9DREH///////////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/QGmT/wMaJP9mZmf//////////////////////wAA + AP8AAAD/AAAA/wAAAP////////////b29v8ckLf/IJS7/yWYwP8omsT/LJ/J/zGizf81pdD/JZ/Q/xGY + z/8SmtL/EpzV/wAAAP8AAAD/SW6Q/0NEQf9UVVL/VFVS/1RVUv9fYF3/Q0RB/0NEQf//////Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DQ0D/S3We/1Sn+/9TpPb/AAAA/xOf2/+fn5////////// + //////////////////9qamr/AAAA/wAAAP////////////X19f8YjbP/HJC3/yCUvP8lmMH/KJvF/yyf + yv8woc3/EJXI/xCWy/8RmM7/EZrR/xKb1P8Tndb/AAAA/0NEQf9UVVL/VFVS/1RVUv9UVVL///////T0 + 9P9DREH/Q0RB/0NEQf9DREH/Q0RB/0dedP9Tpvr/Q0RB/0NEQf9DREH/Q0RB/zo7OP8AAAD/AQ0R/xOd + 1//+/v7//////////////////////wAAAP8AAAD/AAAA/wAAAP////////////X19f8WirD/GY20/x2R + uP8glL3/JZnC/yibxf8OkcL/D5PF/xCVyP8Qlsv/EZjO/xGZ0f8SmtP/AAAA/1Sn+/9UVVL/VFVS/1RV + Uv9UVVL//////0NEQf9dXlv/Q0RB/0NEQf9DREH/Q0RB/0NEQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wxu + mP8Tntj/EpzW/xKb0////////////////////////////wAAAP8AAAD/AAAA/wcHB/////////////X1 + 9f8Sh6z/Foqw/xmOtf8dkbj/IJS9/wyNu/8Oj77/DpHB/w+Txf8PlMf/EJXK/xGXzf8Rmc//AAAA/0NE + Qf9UVVL/VFVS/29wbv//////////////////////Q0RB/0NEQf9DREH/Q0RB/wAAAP9KtuT/SbXj/0e0 + 4v9FsuH/J6Xa/xKc1v8Sm9T/EprS/2pkZP////////////////////////////////////////////// + ///+/v7/+fn5/2poaf8PhKj/Eois/xaKsf8ZjrX/HJG4/wyLt/8Njbr/Do+9/w6Rwf8PksP/D5TG/xCW + yf8Ql8v/EZfN/wAAAP9To/b/VFVS/1RVUv////////////////9CQ0D/Q0RB/0NEQf9Qldv/AAAA/0Sy + 4P9EsuD/QrHf/0Cw3v8/r93/Pa7b/xKa0f8RmdD/EZjO/xCWy/8Tlsn/CZLH/wOQx/8Dj8X/A4zB/wWK + vP8PjLj/DIq0/xaNtf8Ti7H/EYes/w2EqP8MgaT/EISo/xOIrf8VirH/C4ew/wyJs/8Mirb/DY26/w2O + vf8OkL//D5LC/w+Txf8PlMf/EJbJ/wAAAP9DREH/VFVS/1RVUv9UVVL/VFVS/0NEQf9DREH/Q0RB/1Sn + +/8AAAD/P6/d/z+u3P8+r9z/Pa3b/zyt2v85q9n/N6rX/xGXzf8Qlsz/EJXK/xCVyP8PksX/D5LD/w6Q + wP8Oj73/DY26/wyLt/8MibT/C4ex/xOLsf8Rhqz/DoOp/wqBpf8KgKH/DIGk/w+FqP8KhKn/CoWt/wuH + sP8LiLP/DIq2/w2Muf8Njbv/Do++/w6Rwf8PksP/D5PF/w+Ux/8AAAD/VKf7/0tMSf9UVVL/Q0RB/0NE + Qf9DREH/VKf7/wAAAP8SNkb/OarY/ziq1/83qdf/NqjW/zWn1f8zptP/MqXS/xCVyf8QlMf/D5PF/w+S + w/8OkcH/DpC//w2OvP8NjLn/DIq2/wuJs/8Lh7D/CoWt/wqDqv8NhKj/CoGl/wh+of8HfJ3/CoCh/wqA + o/8Jgab/CYOp/wqErP8Lhq//C4iy/wyJtP8Mi7f/DY26/w2OvP8Oj77/DpDA/w+Sw/8ABAX/AAAA/0NG + Rf9Up/v/VKf7/1Sn+/9EUVr/AAAA/wAAAP8zptP/M6bT/zOn0/8ypdH/MKPQ/zCj0P8uo8//LKHN/xaX + xv8PksP/DpHB/w6Qv/8Njr3/DY26/wyLuP8MirX/C4iy/wuGr/8Kha3/CoSq/wmCp/8IgKT/CH6h/wd9 + nv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAMAAAAGAAAAABAAgAAAAAAAASAAAAAAAAAAAAAAAA + AAAAAAAAAAAA/wUGDP8DCQv/CwsL/w8QD/8QEA//BQoU/wcQE/8LERT/AhQb/wsSHP8REhH/ExcY/xMY + Gv8bGxv/ICEf/wgJK/8HGyT/Fh4i/xgdIP8LCzb/AyAr/w4iK/8WIif/BCg3/xYrNP8SMD7/Jycn/zEy + L/8oKDz/ODg3/z9APf9AQT7/DQ5B/xQVTP8GMkT/CDNH/wY5Tv8NPE//ETNB/xM9Tf8YP0//BztR/w49 + Uf8pKUP/IzpE/ykqVv8mPVT/FBVg/whEXP8UQFL/MkBL/y9FWv8nS1r/MERX/zlGUP87SFP/MEhf/wlN + af8STmf/Gk5j/xZPaf8KUW7/C1V1/zJKYP8rVWj/P1Ji/zlTa/8xWWv/N2R4/0REQ/9HSEX/SUpH/0NJ + TP9MTEz/UFFO/0VQV/9FUlv/U1NS/1hZVv9QWF7/XFxc/0RXZ/9HXnL/QF57/1Bgbf9LYXX/RmN+/0hi + ef9iYmL/bGxr/3R0dP95enf/e3t7/xsdif8dH5H/KCmE/yUmnP8lJ6r/KSu2/wxcgf8MZYv/DWyU/w9s + mP8TbJL/DXaf/wd9nv8IfJ7/KGuI/zpsg/89dYn/K3eW/zp7k/8OdKD/CH6h/w99rP8Rd6T/LX+g/0hm + gv9GaYv/SWyM/0pukP9LcZX/RHyW/0pzm/9MdqD/THqm/018qv8pK8j/Ky3S/y4w0/8zNdf/OoKZ/wmB + pP8KhKv/EIWp/xyFq/8SiKz/C4aw/wuJtP8Njbv/EoS1/xSLsv8ZjbT/EoO5/xKJvP8OkL//HJC3/xaS + vf8dkbn/IYmr/yuJqf86kK7/IpS8/yuYvf86kLT/NJO4/0SDl/9Xi5z/ZJCe/02MqP9Kka//UZGu/02A + sv9El7T/S5Wy/0qat/9BmLn/TJy7/1Gauf9dob7/aqS+/3enuv9/rLr/Eo/F/w6Sw/8TlMX/EJXJ/xGY + zf8cmcj/EpvT/xyc0v8Tntj/KZvF/zGdw/88ncX/IJ/R/xSg3P8tocz/NqPL/yah0f8rpNT/JKTY/yun + 3P8sqN3/M6XR/zqm0P81qNb/PKnT/zKp2f87rNr/FaXl/xis8v8gq+r/NbLp/02fwv9Npsn/VaXG/0Os + 1P9Or9f/Q67Y/0mv2P9EsNz/S7Lb/1K13f9hpMP/dq7H/2Sz2P9Es+L/S7Xh/0u45/9Btun/V7rk/2O9 + 5P9dwOv/WMP0/2PC6/9px/H/c8z1/4KCgv+HiIb/ioqJ/5CQj/+Tk5P/l5iW/5ycnP+Bqrr/mbK9/6Sk + pP+nqKb/qKmn/6qqqv+6urr/gK3A/5+6xf+mws7/scfO/8jIyP/R0dH/29zc/9/g4P/j4+P/6+vr//T0 + 9P/+/v7/AAAA/2pqhYWFhoaKi4yMjJKSr7CurrGusbGxsrGxsbGxsbGxr6+SjIyMi4uLhoaFhYVqampy + hYWKiYuLi4yMkpKur7GxsbKxsrKysrK0sbGxsbGxsbGvkpKMjIyLi4uGhoWFanKFhoaGi4uMjIyvsK6x + sbGysrSytLS0tLS0tLS0tLKxsrGxsbCvkoyMi4uLhoaFhYWGhoqLi5KLr6+wsbGytLK0tLS0tra2tra0 + tra2tLS0srKxsbGur6+MjIuLioaGhYaHhouLi5Kvr7GxsbKytLS2tra2u7a2trS7tru2tra2tLS0srKx + sa+vkoyLi4uGhoaKi4uSkpKvsbGytLK0tra2rmU6GBEGBgYQGCU/c7a2tra0tLKysbGvr4yMi4uKhoeL + i4uSkq+vsbGytLa2tmQVAQscSllaW1paT0YPAQYxjba2trS0srGxr6+SkouLipmTjpKSr7CysrS0tLZo + BgpK5evr6+vr6+7r6+vr5k4MABiNtra0tLGxsa+vjIyLi5qavbezr7KytLS2tCQBD+Xr6+7y8vf39/f3 + 9+kfUVvl5VtJOra2tLS0sbGvkoyLjri9vb3Qxbq0tLa0IwYcHkbu9/f39/j39/f391Hu7vHrW0rlASO0 + tra0tLGvsre3mre9xc7T1tbVx7Y6Ax4eHkZR9/f39/f49/f38Vrx7lEbDxxOHgMatbS0tb/Fzr29t729 + ztDQ1tbe4qkGHh4eRkZGUfL39/f39/f4Wu7mHBsPG1EcRiAGP8vU1dXS0L29t7290NPW1t7f4jUPHh9G + RkZGSUrq9/f39/f3WV0bDxsPG1ocSUYeAc/e3tXT1Ma9vb3O0NPW3t/i2QoeHkZJRh8fRkZGWev39/f3 + HhsbGxsbG1keR0dGD0He3t7V0MbGvb3G0NbW1t/ipQweRkZGRhweIEYfIEZOW+nuG+jv8fHx6+jlW1lO + Ewrf3t7V1dLGvcbR09XW4NbidxseRkZGIB4eRh8eHiBGHh4eG/Hy8vLy8vLy8vfrHAup4N7e1NDGvb3Q + 1d7ezxepRBseRkdGRh9GRx4cHkYfHAwDAx7p8vLy8vL39/EfRhtw3t7e29TGxsbQ1dbepRcNGR5HHh4b + HR5GRh4eHkYeBQAAAAAASvLy9/j45RweRh1F4t7e1dTSvdDV1XBtRUUtAx5GRkZGHg4DDhseHkYbAAAA + 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 + AAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAHfZ7/CH+i/wmBpv8Khav/C4av/wuI + s/8Mi7f/DY27/w6Pvv8OkcH/D5LE/w+Uxv8QlMj/EJbJ/xCWyv8Ql8v/EJfL/xCWyv8Qlcn/EJXI/w+U + xv8PksT/DpHC/w6Qv/8Njrv/DIu4/wyJtP8Lh7D/CoWr/wmCp/8IgKP/B32e/wh/ov8Jgqf/CoSr/wuH + sP8MirX/DYy5/w6Pvf8OkcH/D5PF/xCUyP8Ql8v/EZfN/xGZz/8RmdD/EZnR/xKa0f8Sm9L/EZrR/xGZ + 0P8RmM//EZjN/xCWy/8Qlcj/D5PF/w6Rwv8Oj77/DY26/wyKtf8Lh7H/CoSs/wmCp/8IgKP/CYKm/wqE + q/8Lh7D/DIq1/w2Nuv8OkL//D5LE/xCUx/8Qlsv/EZjO/xGZ0f8Sm9P/EpzV/xOd1/8Tntj/E57Y/xOe + 2P8Tntj/E53X/xKc1f8Sm9T/EZrR/xGZz/8Ql8z/EJXI/w+SxP8OkMD/DY27/wyKtv8LiLH/CoSs/wmC + p/8Khav/C4ew/wyKtv8Njbv/DpDA/w+Sxf8Qlcn/EZjN/xGZ0f8SnNT/E53X/xOf2v8UoNv/Dn6u/wAL + D/8ACQv/AAME/wIdKf8Uot//FKDc/xOf2v8Tndf/EpzV/xKa0f8RmM7/EJXK/w+Uxv8OkcH/DY68/wyK + tv8Lh7H/CoSr/wuGr/8MirX/DY26/w6QwP8Pk8X/EJXK/xGYz/8SmtP/E53X/xOf2v8ABgf/AAAA/woK + Cv+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ubm/8FBQX/AAAA/wIdKP8Tn9r/E53X/xKb0/8Rmc//EJbL/w+U + xv8OkcH/DY67/wyKtv8Lh7D/LJi9/zSexP8OkL//D5PF/xCVyv8RmM//EpvU/xOe2P8BFR3/AAAA/52d + nf+dnZ3/nZ2d/6Ghof/Jycn/ycnJ/8nJyf/Jycn/vr6+/wQEBP81NTX/dHR0/wYGBv8Pfq7/E57Z/xKc + 1P8RmND/EJfL/w+Uxv8OkMD/DY26/wyJtP8wnMH/OaLJ/0Gp0P9Irtb/EJjP/xKb1P8Tntn/AAYH/zU1 + Nf81NTX/NTU1/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9/f3//qKio/6ioqP8nJyf/JCQk/wAA + AP8ABwj/E57Z/xKc1f8RmtD/EJbK/w+Txf81oMj/LJvB/zSfxv88ps3/Ra3U/06y2v9XueD/Xr3k/2C+ + 5/81NTX/NTU1/0RERP9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ioqP9SUlL/JCQk/yQk + JP+lpaX/RUVF/0FBQf8CHSj/E57Z/1K33/9JsNr/QavU/zilzf8wnsb/OKPK/0Gp0f9Jr9f/UbXd/1y7 + 4/9jwOj/AAAA/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf8iIiL/JSUl/yQk + JP8kJCT/JCQk/5SUlP9FRUX/RUVF/wICAv9fv+j/V7nj/06z3f9Frdf/PKnR/zSiyv87pc3/RKvU/06y + 2v9XuOD/X77m/2jD6/80NDT/QUFB/0VFRf9FRUX/NjY2/zY2Nv9FRUX/RERE/0VFRf+tra3/ycnJ/wgI + CP+Tk5P/vLy8/7y8vP+urq7/SkpK/wkJCf8JCQn/Kysr/wIJDP9avOb/Ubfg/0mw2v9AqtT/N6TN/z+p + 0P9Hrtf/ULTd/1q74/9jwOf/a8Xs/zU1Nf9FRUX/RUVF/0VFRf82Njb/RERE/zY2Nv82Njb/RUVF/zY2 + Nv82Njb/NjY2/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8/Pz/9FRUX/AAAA/1+/6P9VuuP/TLPd/0Kt + 1/85pc//QKrS/0qx2f9Tt+D/XLzl/xAQEP9wyfD/RERE/0VFRf8iIiL/RUVF/0VFRf9FRUX/NjY2/zY2 + Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/y8vL/+7u7v/u7u7/9DQ0P/Q0ND/NTU1/0VFRf8EBAT/YsLr/1e6 + 5f9OteD/RK7Z/zyo0v9CrNP/S7Lb/w4NC/8RFhj/EhcY/wsLCv9FRUX/RUVF/0VFRf9FRUX/MTEx/wAA + AP8oKCj/NjY2/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/1FRUf/Q0ND/DQ0N/wICAv82Njb/NjY2/yoq + Kv9jwuz/Wrzn/1C34f9HsNv/PanT/xCWyv8RmdD/EBAQ/xAQEP8QEhL/EBIT/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2lpaf/+/v7//////wgI + CP82Njb/HR0d/xWl5P8Uod7/E57Y/xac0v8/q9X/EJfL/xGa0f8Tntj/FKHe/xAQEP8RKjX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE//// + ////////5+fn/0VFRf8BAQH/FaXl/xSh3/8Tntn/EprS/xCXzP8Ql8v/EprS/xOe2f8Uod//EA8P/xao + 6v8BAQH/RUVF/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/ygoKP9ERET/RUVF/wAKDf8Wpub/FKLg/xOf2v8SmtP/EJfM/xCXy/8SmtL/E57Z/xSh + 3/8VpeX/F6nr/wU1TP9FRUX/AAAA/yos0P9FRUX/RUVF/0VFRf9FRUX/Li4u/wAAAP8AAAD/AAAA/wAA + AP9FRUX/RUVF/0VFRf8CAgL/AAAA/wAAAP85OTn/F6jr/xam5v8UouD/E5/a/xKa0/8Ql8z/EJfL/xKb + 0v8Tntj/FKHf/xWl5f9wyfL/eM/2/yEhIf8AAAD/MTPX/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/zY2Nv9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP9syPL/FaXl/xSi4P8Tntn/EprT/xCW + zP8Qlcr/EZnR/xOd1/9Uuub/ZMPt/23H8f92zfX/AwkM/wAAAP82ONn/KizR/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RUVF/0VFRf9ERET/cMv1/2fG8f9fwe3/FKHf/xOe + 2P8SmtL/EJbL/xCWyf8Rmc//TrTg/1i85v9gwev/acbw/wAAAP8sLtb/KSvN/zY42f8xM9f/MjIy/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RkZG/1WXtf9tyvT/ZcTw/1y/ + 6/9Tuub/EZ3X/xGZ0P8Qlsr/OafR/0Kt2P9Ls97/U7nk/1y+6f9lxO7/bcny/wAAAP8sLtb/MDLX/zEz + 1/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/1BQUP8oR1X/ccz2/2nI + 8/9gw+//WL3p/0+45P9Fst7/PqzY/xCUyP82pM7/PqrV/0ex3P9PtuL/V7zn/wAAAP8AAAD/AAAA/x4f + lP8pK8r/LC7W/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf8CAgL/Ga/2/3PM + 9v9rw+v/QYyl/zyJov82hZ//MYGb/yt8l/8neZL/oaKi/zKiy/86qNP/Qq7Z/0q03/8AAAD/OTo3/zk6 + N/85Ojf/OTo3/yMkdf8qLM7/MDLX/ywu1v8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/AAgM/xmu + 9f8YrPL/F6vv//7+/v/////////////////////////////////7+/v/Lp7I/zakz/89q9b/RbHc/zk6 + N/9DREH/Q0RB/0NEQf9DREH/P0A9/yQkIv8xM9f/Ky3V/zI02P81N9j/Ky3S/yst0v8sLtb/LzAt/zk6 + N/8KCgr/AAAA/xer7/8XqOv/mZqa//////8AAAD/Pz8//7+/v//5+fn///////v7+/8pnMT/MaHK/zen + 0v8/rNf/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JDQP8xMS//MTEv/zExL/8xMS//MTEv/zk6 + N/8+Pzz/QkNA/zk6N/85Ojf/AAAA/xan5/91dnb//////wAAAP//////AAAA//////9/f3//+vr6/ySX + v/8rnsf/MqLN/zmo0/8AAAD/Q0RB/0t1nf9RmuP/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/AAAA/5aWlv///////////wkJCf8AAAD/X19f//// + ///6+vr/H5O6/yaZwf8sn8n/M6PO/zmo1P8RmtD/AAAA/wAAAP9GWWn/Q0RB/09QTf9UVVL//////3N0 + cv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NFRP8AAAD//v7+////////////AAAA/wAA + AP////////////n5+f8bjrX/IJS8/yeaw/8sn8r/M6PP/xCXzP8RmdD/EpzU/wAAAP9HXG//VFVS/1RV + Uv9UVVL/4ODg/6Sko/9DREH/Q0RB/0NEQf9Up/v/S3We/0NEQf9DREH/AAAA/xOe2f////////////// + //8AAAD/AAAA/wAAAP//////+Pj4/xaKsP8bj7b/IZS9/yaaw/8OkcL/D5TG/xCWy/8RmM//EprT/0NE + Qf9UVVL/VFVS/1RVUv9NTkv/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/Mn2c/xOe2f8Sndb/EprT//// + //////////////////8AAAD////////////4+Pj/EYer/xaKsf8aj7f/DIu3/w2OvP8OkcH/D5PF/xCV + yf8RmM3/AAAA/1RVUv9UVVL///////////9DREH/Q0RB/0dcb/8udpb/RbLh/0Ox3/9Ar93/EprT/xGZ + 0P8Klc7/WW1z/21ra/94cnL/bGts/1drcP8cj7T/FIqw/w+Gqv8MgaT/EYer/xGJr/8LiLL/DIq2/w2N + u/8OkL//D5LD/w+Ux/8Oibj/Rllq/1RVUv9UVVL/Q0RB/0NEQf9Up/v/AAAA/z2u2/89rdr/OqvZ/zep + 1/8RmM3/EJbK/w+Ux/8PksT/DpDA/w2OvP8Mi7f/C4iy/wqGrv8Phqv/CoGl/wh9n/8MgaT/CYOo/wqE + rP8Lh7H/DIq1/w2Muf8Njr3/DpDA/w+Sw/8AAAD/T4vI/0psjf9DRED/UZfe/wAAAP81qNX/NKfU/zOm + 0/8xpNH/L6LP/yygzf8PksT/DpHB/w2Ovf8Njbn/DIq1/wuIsf8KhK3/CYOo/wqCpf8Ifp//AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAQEB/wwMDP8PDxr/DBIU/xMU + FP8SGRz/HBwc/w8eJf8ZGSv/EhM7/w0kLf8WICX/GyEj/xklKv8LKjf/Eycw/xQpMf8QKjX/HSsw/xYz + P/8cMDn/IyMj/yUnKP8rKyv/Li49/yMxOf80NDT/ODk2/zIyPP87Ozv/QUI//xESR/8SE0j/FBVd/wc3 + S/8MN0z/BzlP/ww5Tv8RNUX/GjVA/xg7SP8HPFL/CD5U/y4vS/8vMEn/LT1M/zE8Rv8uLlP/FBVi/xgZ + df8uL27/JSdw/wlDXP8QRVz/JkJO/ypCUf8qS1z/NUpd/whKZf8KTGj/Eklh/xJQa/8JVXP/HVt3/zVN + Zf8hUmf/KlRm/yxXaP8wV2r/OVJp/yNacf8kX3j/Pmp+/0NEQ/9LS0r/RExQ/1NTU/9ZWlf/Ulha/1tb + W/9GVmL/Q1dp/0FbdP9CXnj/QWB+/0hkff9QY3P/ZGRj/2doZf9sbGv/cHFv/3Nzc/93eHb/fn5+/yAh + lv8qK5T/ISOj/ygqr/8mKLb/Jii6/yoru/8MYYb/DGWK/xZkhP8Ocp3/B32e/wl+n/8paoT/J22I/yl2 + l/8IfqH/D3uo/xp9pf8Qeqr/RWaG/0pqiP9KbY3/TG6O/0J0i/8qLMX/Ky3P/ywu0/8uMNT/MTPW/zM1 + 2P8IgKP/CYGm/wyCpf8Jg6j/CoSr/w+Gq/8PgK//CoWs/w2Hr/8bhKT/EYer/xCIr/8Lh7D/C4ix/wyJ + s/8MirX/DI26/w2OvP8RgrP/FIqw/xqPtv8Rjbz/DpC//xuQt/89i6b/PI6q/yCUvP8lmL//LJm9/0KG + nf9JiKP/Vo+i/16br/9DlrH/U5u7/1uevf8RjsP/DpDB/w+SxP8PlMb/EJLC/xyXw/8Qlsr/EZjO/xKa + 0/8endD/E57Y/yWZwv8qm8T/IpzK/y2fyf8xm8P/FKLf/y2izv81oMb/M6PN/zmkzP8ioNP/LKTT/yWl + 2/8optv/M6bT/zmm0f87qdP/O6zZ/xWk4v8bpuL/F6nr/xus7/8YrfL/JKvm/zux4/9PoML/RabO/1ur + zf9Cq9T/T6nQ/0Ou2P9Fsdz/S7Lb/1K13f9fuN//ZqnA/3i0yP96uM//arbZ/0Wz4f9OtuH/T7jl/0m6 + 7v9Rt+D/VLnj/1q75P9Svev/W77p/2C/5v9dwOz/TsD0/1zC8P9iwev/bcfv/2XF8P9ox/H/bcny/4KC + gf+Li4v/lJST/5ubm/+jo6P/qquq/7S0tP+7u7v/v8C//4O6zf+YuML/hbvQ/5HA1f+ZwtT/mcTY/7DK + 1v+7093/w8PD/8nJyf/Q0ND/1Nrd/9nZ2f/m5ub/6+vr//Ly8v/8/Pz/AAAA/2lugIGFi4yNoqKjpaSn + p6enp6enp6Whjo6OiYmEgH1pfYCEhYyNk6OjpKeoqampqampqainp6enoY6NjImEgX2AgYqMjZOjpaep + qampq6urq6upq6mpqaeno6KOjYuEgIGKjI2TpaepqamrqGg+NCoqO2aPq6upqainpKKOjIuEiIyTk6So + qampbyMISldcXV1bTx0HO6GrqamnpI6OjIqZmaakqKipqToEW+jp6+vs7OxdV1pPS2erq6inp6KOkLC1 + xry3qakqFRtM7ff39/f39lvq509PFySrq6mnrq2ts7XIzc7ZbRUaHklZ9vf39/fo6FcWFUwbFju4vczI + tbC1yMzN2eAZGklJSUlN6ff39+VKFRUWTElJBsXXzMq8tLXJzNjZxwwdSUkbHUkeT+bqTFtdXVtcWE0X + Q9vXzMi7u8rN2Z+bF0pJSRweHRxJHRcV6ezs7Ozt7EkZ4NnMyrXIzNjFBTYaHRwaHkkdGx4VAAAAT+z2 + 9+pJSQzc2NTIvMjMQzg2Ax5JSR4VBgYaSQAAAAAAT+nnHRodFdnZ1Mu8qKgRBSYDG0lKSUpJGgYBAAAA + AAABXfb+Vx0Wvr+4ubenqZKPBTUXSUlJSUlKSRoAAAAAAAAG7P7oSRS+vqupp6epqbE9vhQbAhdJSklJ + FQAAAAAABAEBW0xJPMCxq6mop6ixscDAPx0JMRdJSUkVAAQBAQZJHgQAAAZvvr6rqaeoqam+w93SFgh6 + Hx1KSUlJSUlKFx1JShcBD9bAvqupqKSpscTg5KANCXteGklJSUlKSUlJBElJSReg4tq4q6mnp7bU2ODh + RDBge2QVSUpJSUlJSkkaBkkbdOTi29q5qai0yszY3eDkOHd6YRdJSUlKSUlJSR4EF0jh3ODa1cu3pbS8 + y9XJQhIGM3hjHwweSUlJSklKSg1o3vCcmpWWlZ3vtLzLxgsaHR0bMnp6YSEJCAgIFRUlq8LC9f78/fz7 + 6/6ytMhrLh5JSR4dK193fHt7emQvFwYlp8Dz+lvo6Oft/q20umtAVUkeSUkeHhocLCwcGx4eHRsFofH+ + 5eVa5+j+l620uigZc3RLHh5J6krlSUkeSR5JHhs08v7860zo/v6Xra+0vHAqC1RLSk3n6ehJHkkeSR5L + Uyr0/v7mWeX+/pSXrbKuqKihDlFMTObmWUlJUHNyckALcfn+/kkAAPf+kJSXrKWnqKloN0xb9vZbSUst + JkFGZqGt/v7+6lfn/v2HkJSSjqKlp6cPVlv+/lxJOUbUy8SqqbDR8PDu0M+ehn+HiIqMjY6jpD5FTldY + SVImvb29vKqnpKWijoyLiYd+an+AhIqMjY6ijgpUdXNTELC6urq3rqOijo2MioSAfm4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA + AAAYAAAAMAAAAAEAIAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAHfZ//CYGl/wqEq/8Lh7H/DIq2/w2O + u/8OkMD/D5LE/w+Ux/8Qlcn/EJbL/xCWzP8Qlsz/EJfL/xCWyv8QlMf/D5LE/w6Rwf8Njrz/DIu3/wuH + sf8KhKv/CYKm/wh+oP8JgaX/CoSr/wuIsv8NjLj/Do++/w+SxP8Qlsn/EZfM/xGY0P8SmtL/EpvU/xKc + 1f8SnNX/EpvU/xKa0v8RmdD/EZfN/xCVyf8PksT/DpC//w2Nuf8LiLP/CoSs/wmCpv8KhKv/C4iy/w2M + uf8OkMD/D5TG/xCWy/8RmdD/EpzV/xOe2P8Tn9v/FKHc/xCNwf8Untn/FKHd/xOf2/8Tntj/EpzV/xGZ + 0f8Qlsz/D5TH/w6Rwf8Njbr/C4iz/wqErP8Lh7H/DYy4/w6QwP8PlMf/EZfN/xKa0/8Tntj/AAoM/wAA + AP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/5ycnP8AAAD/C2yV/xOe2f8Sm9T/EZjO/xCVyP8OkcH/DY25/wuI + sv8vm8H/OaTK/xGUxv8Rl83/EpvU/xOf2v8AAAD/NTU1/52dnf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6io + qP+oqKj/qKio/6Kiov8Tn9r/EpzV/xGYzv8PlMf/DpC//ySWvv81oMf/QKnQ/0uw2P9XueD/Yb7m/wAA + AP81NTX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/AwMD/6ioqP8kJCT/JCQk/0JCQv8AAAD/E5/b/w2Y + 0/9Hrtj/O6bQ/zCfx/85pMz/Rq3V/1G03f9evOT/acTs/zU1Nf9FRUX/RUVF/0VFRf9FRUX/ycnJ/8nJ + yf/Jycn/p6en/yQkJP8kJCT/Gxsb/0VFRf9FRUX/AAAA/1m75P9Ns93/QqzV/zajy/8/qdD/S7HZ/1e4 + 4f9jwOj/AAAA/0RERP9FRUX/NjY2/zY2Nv81NTX/Ojo6/0VFRf9AQED/urq6/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/QkJC/1+/6P9RtuH/Ra/Z/zmlz/9Cq9P/TrLc/1q85P8QEBD/AAAA/yMjI/9FRUX/RUVF/0VF + Rf82Njb/NjY2/zY2Nv8AAAD/AAAA/56env+7u7v/u7u7/9DQ0P9FRUX/RUVF/2LC6/9WuuT/SbLc/z2o + 0v9Eq9X/Q5q9/xAQEP8QEBD/AQEB/0VFRf9FRUX/RUVF/wAAAP8AAAD/RUVF/wAAAP8AAAD/AAAA/wAA + AP/Pz8//AwMD/xYWFv82Njb/RUVF/2XD7f9Yu+b/TLPe/z+r1f8Qlsv/EpvU/xA7S/8QEhT/AAAA/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8DAwP/RUVF/xam + 5v8Uod7/EpzV/xGYzf8Qlsz/EpzV/xSh3v8QEBD/Fqns/0VFRf8AAAD/RUVF/0VFRf9FRUX/RUVF/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/9ra2v9ERET/RERE/xan5/8Uod//Ep3W/xGXzf8Qlsz/EpzV/xSh + 3v8Wpub/F6nt/0RERP8AAAD/AAAA/0VFRf9FRUX/RUVF/wAAAP8yMjL/AAAA/wAAAP9FRUX/RUVF/wAA + AP8AAAD/AAAA/xan5/8Uod//Ep3W/xGXzf8Ql8z/Ep3V/xSh3f9nxe7/c8z0/wACAv8AAAD/KizQ/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8CAgL/bcr0/yut5/8Uod7/EpzW/xGY + zf8Qlsr/Gp7U/1a75f9jw+3/bsrz/yst1f8qLND/NjjZ/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8FBQX/RUVF/0VFRf9uxO3/asjy/13A7P9SueX/EpvU/xCWy/86qNL/RbDb/1G44/9dv+r/Z8bw/3LL + 9f8sLtb/LC7W/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/zRfc/9tyvT/Y8Pv/1m+ + 6v9MtuP/Qa/b/xCVyf82pM7/QazX/0u04P8AAAD/OTo3/zk6N/85Ojf/LC7W/ywu1v8AAAD/RUVF/0VF + Rf9FRUX/RERE/1FRUf8DAwP/Ga71/xit8f//////r6+v/2JkZP9gYWH/9/f3//7+/v8voMr/OqjT/0Wx + 3P85Ojf/Q0RB/0NEQf9DREH/MTEv/zY42f8qLM7/LC7W/yoszv8qLM//KizP/zk6N/8AAAD/GKzx/xeq + 7f/+/v7/AAAA//////////////////39/f8pnMX/M6PO/z2r1v9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf85Ojf/MTEv/zExL/85Ojf/Q0RB/0NEQf86Ozj/OTo3/xWm5v////////////////8AAAD///////39 + /f8jlr7/LJ7I/zWl0P8+rNj/AAAA/0NEQf9DREH/Q0RB/0NEQf9CQ0D//////0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/wAAAP//////////////////////6enp//z8/P8ckLf/JZjB/yyfyf80pdH/EZjP/xKc + 1f8AAAD/Q0RB/1RVUv9DREH/Q0RB/0NEQf9DREH/Q0RB/1Sn+/9Up/v/Q0RB/wxul////////////wAA + AP8AAAD/AAAA//v7+/8WirD/HJC4/ySXwP8OkcL/EJXI/xGXzf8SmtL/Q0RB/1RVUv//////Q0RB/0NE + Qf9DREH/AAAA/0u35f9HtOL/E53X/xKa0/////////////////////////////v7+/8Qhaj/Foqx/wyJ + s/8Njbr/DpDA/w+Txf8Qlcr/IiMh/1RVUv//////iIiG/0NEQf8AAAD/QLDe/z+u3P88rdr/EZnP/xCW + y/8PlMb/DpHB/w2Nu/8MibT/E4qx/w2EqP8Kf6H/CYGm/wqErP8LiLL/DIu4/w2Ovf8OkcL/B1Bs/1Om + +f9DREH/Q0RB/wEBAf82qNX/NafV/zOm0/8wo9D/D5TG/w+Sw/8Oj77/DYy5/wuIs/8KhK3/CYKn/wh+ + of8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAAAAABAAgAAAAAAIAE + AAAAAAAAAAAAAAAAAAAAAAAAAQEB/w0NDf8UFBT/Ghsc/xIfJf8fHyb/HR0s/w4QPf8YIyf/FSYu/xom + K/8cLTX/ES05/x8xOP8hISH/IiQj/yQkJP8nJyr/LCws/yIiOP8uMTL/KDc9/zQ0NP8wNzz/Nzc8/zk5 + Of89Pjv/PT09/z9APf9AQT7/GBlL/xobU/8ZGln/FjVC/xs3RP8fO0z/JTpE/yM6Sf8kPkj/ID1N/yY9 + Tf8zM0T/NT5B/zQ1SP8xMlT/IiN4/xZBVv8XSF7/IkBO/yhIVv82SFD/Mkda/zJJXv8zUFz/DUhh/xJP + av8MUWz/ElBq/wpUdP8LWHn/Dlp5/wtef/80TWT/KlVm/zBVav8/V23/QUJB/0NEQf9ERUL/REVF/0xN + Sv9OTkz/QE9c/0xSVv9FUFj/UVFR/1RUVP9YWVb/Wlpa/11dXP9GVWH/QFhu/0dcbv9GXnT/W2Bh/0hg + df9MZn3/YmJi/2pqav9ubm3/cXFx/3Z2dv96enr/IiOe/yosm/8jJKn/Jym2/ycpv/8pK7//DGGF/w9m + jf8MaI7/EWWL/wh+n/8qaIL/KHKP/z1wh/8/d47/JHKS/zF9nP8JfqD/Dnqm/xF3p/8Sfq3/R3qS/ywu + yv8uMM3/LzHV/zM12P8JgaX/DIOn/wqDqP8KhKv/DoWp/w+Ar/8Khaz/EIWp/xaJrv8fi6//D4Gx/wuI + sv8Ni7b/DIy5/w2Ovf8Qg7T/Fouw/xWNtP8OkL//HJG4/x2TvP8vhaf/MoKi/zeHqf8qkrf/I5a+/yWU + vv8ukbj/LJa8/0yXuP8XjsD/DpDB/w+TxP8PlMb/FJPB/xGQxf8Qlcf/FJXH/xuTwP8Qlsn/FJbI/xCX + zP8RmM3/FZrO/xmbzv8Ul9D/EpvT/xOe2P8hl8D/JZjB/y+cwf8qnMT/JZ/N/yyeyP8on8z/MZ/G/zCc + yP8Uod7/HaXf/zWhx/8woMr/NaLJ/zOjzv82o8z/NqTO/zqlzP8tptj/MaXS/zSl0P8xotb/OqbQ/zWo + 1f85qNP/PajR/z2q1v84q9n/ParY/z+v3f8Wpub/F6rt/zu06v8qs/L/V5/A/1qoy/9Cq9P/Q67Y/1Or + 0P9GsNv/S7Lc/1ix1v9Ttd7/WbXc/0Kz4/9PuOX/T7zr/1O34P9UueP/W7zk/2O84/9dwOv/Y8Pt/2rI + 8v9zy/P/gYGB/4SEgv+Ghob/iYmI/4yMi/+NjY3/kJCQ/5WVlf+bm5v/k7G7/6Ghof+lpaT/qKin/6qq + qv+0tLT/urq6/5G1wP+kwcr/rsfR/63Q3/+61N//tdTi/8PDw//FxcX/yMjI/87Pz//J2t//0NDQ/9ra + 2f/a4eT/3ePl//r6+v//////AAAA/2d3eoKDhZaanp6goKCgoJualoWDgnl3Z3d6goSWl56gpKWlpqWl + paWgnpeWhIN6eHuChIWYoKWlpXBjOjxkhqWlpaGYloSDfYiEiZukpZU2Kldc4eBbTAs6pKWknpaEgqmy + raKlcQRF6+319vboXORZMnGloJuZi7LLz9fBCRZCWvX29vbh3hYWHQqVucG/rLjL0dhrFkNFQk/p9vZL + EBBFHEIx2M/LuMDP2Nk1HUUZGxsbS1lX7Ozr5uAI0tbOuMvPzSQVHBsZRBkbEgABV+317EwWlNfPwb9t + JA0ORUUZEA4WAgAAAE/rXBYZjtXPwKB8NwwKRUVFRUUSAAAAABRM/lsYhqamo6ClpTlkGQUbRUUbAAAA + AAEC4E8UsMWlpaGlsMW8FCAeQkVCARADA0UWAQAvxbGloaGlsdXdNSBiEkVFRUVFGxJFQgPKx7CloZ65 + 19vJB112E0VFRUVFRRAZG3Lc29OmoLvO1NrZQGF1BkVEREVFRUICa9nQ1s/Bi7vMzz8PEixzXx8RFBYW + QiRxyPDv7u7n+7O/jRdCQx0sXnN0YF8tDiFwxvPp7Ovl/aq1jjNVRUNDHB0pKxgaHRoSZPH15Vzp/pGz + u2kiPlJERuriT0NDQ0NFLvL+6Uv1/YqorKuhbyNJTeHfR0NSU0E0PPv+5BBa/YeKp5eeoT1QWfrqQ0gw + aGyBr/7++eP3+H6Hg4SJm4koVO3jSifDzsKhn5GTj4B/e254fYKEhZY4QVZTJZK+urqfloWEgn15bgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAA + AAAAAAAAAAAAAAAAAAAIf6L/CoSr/wyJtP8Njrz/D5LD/xCVyP8Ql8z/EZjO/xGYzv8Ql8z/EJbJ/w+S + xP8Njr3/DIq1/wqErP8IgKP/CoSr/wyKtv8OkMD/EJXI/xGZ0P8SnNX/E57Z/xOg2/8ToNv/E57Z/xKc + 1v8RmdD/EJXJ/w6QwP8Mirb/CoWs/xKMtf8OkMD/EJbK/xKb0/8Tn9r/RUVF/52dnf+dnZ3/nZ2d/52d + nf8DAwP/FKDb/xKb1P8Qlsv/DpHB/wyKtf82ocf/R63V/1e54P8DIS3/NTU1/0VFRf/Jycn/ycnJ/8nJ + yf+oqKj/JCQk/zw8PP8ABwn/EpzU/0Os1P8zoMf/PqjP/1C03P9iwOf/NTU1/0VFRf82Njb/RUVF/8nJ + yf/Jycn/JCQk/yQkJP9FRUX/RUVF/12+5/9Lstz/OaTO/0St1f9XueL/acXs/0VFRf9FRUX/RERE/zY2 + Nv85OTn/AAAA/7u7u/+7u7v/u7u7/0NDQ/9jwer/Urji/0Cr1P8updL/EBAQ/xAQEP9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wAAAP8AAAD/DAwM//Ly8v82Njb/Ah0p/1a65P9CrNf/EZjO/xSg3P8QERH/RUVF/0VF + Rf9FRUX/RUVF/xEREf8AAAD/AAAA/wAAAP/+/v7/RUVF/xan6P8Uod3/EZnP/xGYzv8UoNz/Fqfo/wAA + AP8qLND/RUVF/0VFRf8AAAD/RUVF/0VFRf9FRUX/JCQk/wAAAP8WqOn/FKHd/xGZz/8RmM3/Vbnk/2bF + 7/8AAAD/LC7W/wAAAP9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf90zvj/Y8Tv/xOf2/8RmM7/O6nT/021 + 4P9dwOv/bsnz/yst1f8AAAD/RUVF/0VFRf9FRUX/RUVF/05OTv8jg6z/RY6n/1q/6/9JtOD/N6fT/zSj + zf9Cr9v/OTo3/0NEQf85Ojf/LC7W/ywu1v8sLtb/LC7W/wAAAP8YrvT/F6vv//////////////////// + //8qncX/OajT/0NEQf9DREH/Q0RB/0NEQf9DREH/Pj88/0NEQf9DREH/Q0RB/wAAAP///////////39/ + f///////IJS7/yyfyf8loND/EpzV/0pukv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0t1nf8AAAD///////// + //8AAAD//////xaKsP8glL3/DpHB/xCWyv8AAAD/VFVS//////9DREH/Q0RB/0m24/8npdr/EprS//// + //////////////n5+f8MgaT/CoWt/wyKtv8Oj77/D5PF/1Sn+/9DREH/VKf7/zmq2P82qdb/MqbS/w+T + xf8OkL//DIq2/wqFrf8KgaX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAD/Dw8P/w8UFv8VFRX/FSgw/yMjI/8lJSX/KSkp/yoqKv8rKyv/Jygy/ywwMv8vMTL/LzU3/zIy + Mv8zMzP/MjI0/zA2OP8wMD7/ODg4/zk6Ov86Ojr/Ozs7/zw8PP8+Pzz/Pz8//z9APf9BQj//HjpF/zk6 + SP8cHWz/Jyho/yIjdv8iI3r/GUhc/y9HWP84TFX/NkpZ/zJMXP81TFz/N0xc/z9QXv8SSmT/HU5n/xNS + bf8PXn//ElRx/xdcev8ZXHn/Lkxt/zNWZ/86XW3/NWBy/0BAQP9BQUH/QkJB/0NDQ/9DRkX/RERE/0VF + Rf9GRkb/REhJ/09PT/9JSlb/TFpf/1BQUP9TVFH/VldZ/1hYWP9bXVv/XFxc/11dXf9fX1//RVZl/1lq + eP9gYGD/YmJi/2RlYv9iZ2n/b29v/3Fxcf99fX3/IySE/yYno/8sLaL/Jiis/ykrtv8RYoP/DW+Y/w5x + m/8WcZn/LmmD/zFxjv8gd5z/MXua/wh/ov9AdYz/CICj/wuCpf8NgqX/CoSr/w2Brf8Khaz/C4au/wyG + rf8PgbD/DIq1/w2Ltf8Njrz/Do++/xaLsf8Qh7n/DpC//xySuf8ck7z/IoSt/y6IrP8glLz/Mpe+/0yC + mv91lJ//S5u8/w6QwP8PkcL/D5LD/w+SxP8PlMb/EpLB/xOTyf8Qlcn/EJbK/xCXzP8Rl8z/EZjO/xWZ + zv8RmdD/EprT/xKb1P8SnNX/IJfH/yKXxP8qnMX/LZ/J/zCfx/87msD/FKDc/zeiyP80pM3/OqbP/z6o + z/8hotf/KaLQ/yyj0v8uo9D/IqDZ/yup3v82qNX/N6nW/zmo0/8/q9T/Pa3b/xel5v8rr+r/O6/h/zyw + 4P9EocX/TqDD/02jxP9OpMf/RK3V/0Wt1f9Lstz/U7LY/1C03P9qstD/TbXg/1K44f9eueD/X8Lu/2fF + 7/+AgID/hoaG/46Ojv+SkpL/k5SS/5mZmf+ampr/n5+f/6SkpP+oqKj/s7Oz/7m5uf+8vLz/v7+//5PC + 0f+tyNL/vdvm/8fHx//Jycn/2tra/9/f3//L2+P/yuDq/+Tk5P/g6ez/8PDw/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/YWZqbHyBg4WFhIF9bGpnYWZqeoGHiWlYWW+Kh4J7amZxf4KKLUC0urpIJF2Jg39rkqqgMA9Q + xcbAtUE6LJaYj5WtsQs6GUu7t0Q+RxR5q5SprDQTFxoTEwNPwMBMYLCfmBwENTgOBwMAAEy8N1ujnIWA + LhEQOzsDAAABtkZakYeFkaIzHhI7CAkGNgUCmpGHhqSzMVMfOzs6Owg3d7KbhZ6vpjJWIBU7PDwMXK6o + paeTkA0aHVRVUiEKKqHJv8HHjXYjSTk3Qz8XGxgiyr1Ry3WOjFcnQrhNPUkpK8y+Fs1ucnyCL07IRSZe + c4vEw3jCY2hqbWUoSiV0nZd+cGpnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/ABStudio/Forms/NumUpDownAskForm.Designer.cs b/ABStudio/Forms/NumUpDownAskForm.Designer.cs new file mode 100644 index 0000000..130d78a --- /dev/null +++ b/ABStudio/Forms/NumUpDownAskForm.Designer.cs @@ -0,0 +1,78 @@ + +namespace ABStudio.Forms +{ + partial class NumUpDownAskForm + { + /// + /// 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.okButton = new System.Windows.Forms.Button(); + this.questionNumUpDown = new System.Windows.Forms.NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)(this.questionNumUpDown)).BeginInit(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(131, 39); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + // + // questionNumUpDown + // + this.questionNumUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.questionNumUpDown.Location = new System.Drawing.Point(12, 13); + this.questionNumUpDown.Name = "questionNumUpDown"; + this.questionNumUpDown.Size = new System.Drawing.Size(317, 20); + this.questionNumUpDown.TabIndex = 2; + // + // NumUpDownAskForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(341, 74); + this.Controls.Add(this.questionNumUpDown); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "NumUpDownAskForm"; + this.ShowIcon = false; + this.Text = "Question"; + ((System.ComponentModel.ISupportInitialize)(this.questionNumUpDown)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.NumericUpDown questionNumUpDown; + } +} \ No newline at end of file diff --git a/ABStudio/Forms/NumUpDownAskForm.cs b/ABStudio/Forms/NumUpDownAskForm.cs new file mode 100644 index 0000000..41fa343 --- /dev/null +++ b/ABStudio/Forms/NumUpDownAskForm.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ABStudio.Forms +{ + public partial class NumUpDownAskForm : Form + { + public string Title + { + set => this.Text = value; + } + public decimal NumValue + { + get => questionNumUpDown.Value; + set => questionNumUpDown.Value = value; + } + + public NumUpDownAskForm(decimal defaultValue, decimal minValue, decimal maxValue, decimal increment=1.0m) + { + InitializeComponent(); + + questionNumUpDown.DecimalPlaces = BitConverter.GetBytes(decimal.GetBits(increment)[3])[2]; // https://stackoverflow.com/a/13493771 + + if (increment == 1) + questionNumUpDown.DecimalPlaces = 0; + + questionNumUpDown.Increment = increment; + questionNumUpDown.Minimum = minValue; + questionNumUpDown.Maximum = maxValue; + questionNumUpDown.Value = defaultValue; + } + } +} diff --git a/ABStudio/Forms/SpritesheetEditor.Designer.cs b/ABStudio/Forms/SpritesheetEditor.Designer.cs new file mode 100644 index 0000000..005363d --- /dev/null +++ b/ABStudio/Forms/SpritesheetEditor.Designer.cs @@ -0,0 +1,777 @@ + +namespace ABStudio.Forms +{ + partial class SpritesheetEditor + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SpritesheetEditor)); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openHereToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openInNewInstanceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.importToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importSpritesheetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importSpritesFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportSpritesheetImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportCroppedSpritesheetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clearAllSpritesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.propertiesGroupBox = new System.Windows.Forms.GroupBox(); + this.selectedSpriteGroupBox = new System.Windows.Forms.GroupBox(); + this.spriteOrigPtMapLabel = new System.Windows.Forms.Label(); + this.spriteOrigPtMapBRButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapBButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapBLButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapTRButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapTButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapTLButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapRButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapCButton = new System.Windows.Forms.Button(); + this.spriteOrigPtMapLButton = new System.Windows.Forms.Button(); + this.spriteOrigPtLabel = new System.Windows.Forms.Label(); + this.spriteOrigPtYLabel = new System.Windows.Forms.Label(); + this.spriteOrigPtXLabel = new System.Windows.Forms.Label(); + this.spriteOrigPtYNumUpDown = new System.Windows.Forms.NumericUpDown(); + this.spriteOrigPtXNumUpDown = new System.Windows.Forms.NumericUpDown(); + this.spriteRectHLabel = new System.Windows.Forms.Label(); + this.spriteRectWLabel = new System.Windows.Forms.Label(); + this.spriteRectHNumUpDown = new System.Windows.Forms.NumericUpDown(); + this.spriteRectWNumUpDown = new System.Windows.Forms.NumericUpDown(); + this.spriteRectLabel = new System.Windows.Forms.Label(); + this.spriteRectYLabel = new System.Windows.Forms.Label(); + this.spriteRectXLabel = new System.Windows.Forms.Label(); + this.spriteRectYNumUpDown = new System.Windows.Forms.NumericUpDown(); + this.spriteRectXNumUpDown = new System.Windows.Forms.NumericUpDown(); + this.spriteNameLabel = new System.Windows.Forms.Label(); + this.spriteNameTextBox = new System.Windows.Forms.TextBox(); + this.reloadPictureButton = new System.Windows.Forms.Button(); + this.filenameLabel = new System.Windows.Forms.Label(); + this.filenameTextBox = new System.Windows.Forms.TextBox(); + this.imageViewPanel = new ABStudio.Controls.CustomPanel(); + this.insideViewPanel = new System.Windows.Forms.Panel(); + this.spritesheetPictureBox = new ABStudio.Controls.PictureBoxDB(); + this.menuStrip1.SuspendLayout(); + this.propertiesGroupBox.SuspendLayout(); + this.selectedSpriteGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtYNumUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtXNumUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectHNumUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectWNumUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectYNumUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectXNumUpDown)).BeginInit(); + this.imageViewPanel.SuspendLayout(); + this.insideViewPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.spritesheetPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(931, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator1, + this.importToolStripMenuItem, + this.exportToolStripMenuItem, + this.toolStripSeparator2, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.newToolStripMenuItem.Text = "New"; + this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.openHereToolStripMenuItem, + this.openInNewInstanceToolStripMenuItem}); + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.openToolStripMenuItem.Text = "Open..."; + // + // openHereToolStripMenuItem + // + this.openHereToolStripMenuItem.Name = "openHereToolStripMenuItem"; + this.openHereToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openHereToolStripMenuItem.Size = new System.Drawing.Size(227, 22); + this.openHereToolStripMenuItem.Text = "Here"; + this.openHereToolStripMenuItem.Click += new System.EventHandler(this.openHereToolStripMenuItem_Click); + // + // openInNewInstanceToolStripMenuItem + // + this.openInNewInstanceToolStripMenuItem.Name = "openInNewInstanceToolStripMenuItem"; + this.openInNewInstanceToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.O))); + this.openInNewInstanceToolStripMenuItem.Size = new System.Drawing.Size(227, 22); + this.openInNewInstanceToolStripMenuItem.Text = "In new instance"; + this.openInNewInstanceToolStripMenuItem.Click += new System.EventHandler(this.openInNewInstanceToolStripMenuItem_Click); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.saveToolStripMenuItem.Text = "Save"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.saveAsToolStripMenuItem.Text = "Save As..."; + this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(188, 6); + // + // importToolStripMenuItem + // + this.importToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.importSpritesheetToolStripMenuItem, + this.importSpritesFolderToolStripMenuItem}); + this.importToolStripMenuItem.Name = "importToolStripMenuItem"; + this.importToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.importToolStripMenuItem.Text = "Import..."; + // + // importSpritesheetToolStripMenuItem + // + this.importSpritesheetToolStripMenuItem.Name = "importSpritesheetToolStripMenuItem"; + this.importSpritesheetToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); + this.importSpritesheetToolStripMenuItem.Size = new System.Drawing.Size(208, 22); + this.importSpritesheetToolStripMenuItem.Text = "Spritesheet"; + this.importSpritesheetToolStripMenuItem.Click += new System.EventHandler(this.importSpritesheetToolStripMenuItem_Click); + // + // importSpritesFolderToolStripMenuItem + // + this.importSpritesFolderToolStripMenuItem.Name = "importSpritesFolderToolStripMenuItem"; + this.importSpritesFolderToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.I))); + this.importSpritesFolderToolStripMenuItem.Size = new System.Drawing.Size(208, 22); + this.importSpritesFolderToolStripMenuItem.Text = "Sprites folder"; + this.importSpritesFolderToolStripMenuItem.Click += new System.EventHandler(this.importSpritesFolderToolStripMenuItem_Click); + // + // exportToolStripMenuItem + // + this.exportToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exportSpritesheetImageToolStripMenuItem, + this.exportCroppedSpritesheetToolStripMenuItem}); + this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; + this.exportToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.exportToolStripMenuItem.Text = "Export..."; + // + // exportSpritesheetImageToolStripMenuItem + // + this.exportSpritesheetImageToolStripMenuItem.Name = "exportSpritesheetImageToolStripMenuItem"; + this.exportSpritesheetImageToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); + this.exportSpritesheetImageToolStripMenuItem.Size = new System.Drawing.Size(248, 22); + this.exportSpritesheetImageToolStripMenuItem.Text = "Spritesheet to image"; + this.exportSpritesheetImageToolStripMenuItem.Click += new System.EventHandler(this.exportSpritesheetImageToolStripMenuItem_Click); + // + // exportCroppedSpritesheetToolStripMenuItem + // + this.exportCroppedSpritesheetToolStripMenuItem.Name = "exportCroppedSpritesheetToolStripMenuItem"; + this.exportCroppedSpritesheetToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.E))); + this.exportCroppedSpritesheetToolStripMenuItem.Size = new System.Drawing.Size(248, 22); + this.exportCroppedSpritesheetToolStripMenuItem.Text = "Cropped spritesheet"; + this.exportCroppedSpritesheetToolStripMenuItem.Click += new System.EventHandler(this.exportCroppedSpritesheetToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(188, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q))); + this.exitToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.exitToolStripMenuItem.Text = "Exit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.clearAllSpritesToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20); + this.editToolStripMenuItem.Text = "Edit"; + // + // clearAllSpritesToolStripMenuItem + // + this.clearAllSpritesToolStripMenuItem.Name = "clearAllSpritesToolStripMenuItem"; + this.clearAllSpritesToolStripMenuItem.Size = new System.Drawing.Size(153, 22); + this.clearAllSpritesToolStripMenuItem.Text = "Clear all sprites"; + this.clearAllSpritesToolStripMenuItem.Click += new System.EventHandler(this.clearAllSpritesToolStripMenuItem_Click); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.helpToolStripMenuItem.Text = "Help"; + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.H))); + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.aboutToolStripMenuItem.Text = "About"; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); + // + // propertiesGroupBox + // + this.propertiesGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.propertiesGroupBox.Controls.Add(this.selectedSpriteGroupBox); + this.propertiesGroupBox.Controls.Add(this.reloadPictureButton); + this.propertiesGroupBox.Controls.Add(this.filenameLabel); + this.propertiesGroupBox.Controls.Add(this.filenameTextBox); + this.propertiesGroupBox.Location = new System.Drawing.Point(547, 27); + this.propertiesGroupBox.Name = "propertiesGroupBox"; + this.propertiesGroupBox.Size = new System.Drawing.Size(372, 503); + this.propertiesGroupBox.TabIndex = 2; + this.propertiesGroupBox.TabStop = false; + this.propertiesGroupBox.Text = "Properties"; + // + // selectedSpriteGroupBox + // + this.selectedSpriteGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapBRButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapBButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapBLButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapTRButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapTButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapTLButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapRButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapCButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapLButton); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtYLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtXLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtYNumUpDown); + this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtXNumUpDown); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectHLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectWLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectHNumUpDown); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectWNumUpDown); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectYLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectXLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectYNumUpDown); + this.selectedSpriteGroupBox.Controls.Add(this.spriteRectXNumUpDown); + this.selectedSpriteGroupBox.Controls.Add(this.spriteNameLabel); + this.selectedSpriteGroupBox.Controls.Add(this.spriteNameTextBox); + this.selectedSpriteGroupBox.Location = new System.Drawing.Point(9, 65); + this.selectedSpriteGroupBox.Name = "selectedSpriteGroupBox"; + this.selectedSpriteGroupBox.Size = new System.Drawing.Size(357, 432); + this.selectedSpriteGroupBox.TabIndex = 4; + this.selectedSpriteGroupBox.TabStop = false; + this.selectedSpriteGroupBox.Text = "Selected sprite"; + // + // spriteOrigPtMapLabel + // + this.spriteOrigPtMapLabel.AutoSize = true; + this.spriteOrigPtMapLabel.Location = new System.Drawing.Point(229, 162); + this.spriteOrigPtMapLabel.Name = "spriteOrigPtMapLabel"; + this.spriteOrigPtMapLabel.Size = new System.Drawing.Size(31, 13); + this.spriteOrigPtMapLabel.TabIndex = 26; + this.spriteOrigPtMapLabel.Text = "Map:"; + // + // spriteOrigPtMapBRButton + // + this.spriteOrigPtMapBRButton.Location = new System.Drawing.Point(323, 215); + this.spriteOrigPtMapBRButton.Name = "spriteOrigPtMapBRButton"; + this.spriteOrigPtMapBRButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapBRButton.TabIndex = 25; + this.spriteOrigPtMapBRButton.Text = "↘"; + this.spriteOrigPtMapBRButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapBRButton.Click += new System.EventHandler(this.spriteOrigPtMapBRButton_Click); + // + // spriteOrigPtMapBButton + // + this.spriteOrigPtMapBButton.Location = new System.Drawing.Point(294, 215); + this.spriteOrigPtMapBButton.Name = "spriteOrigPtMapBButton"; + this.spriteOrigPtMapBButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapBButton.TabIndex = 24; + this.spriteOrigPtMapBButton.Text = "↓"; + this.spriteOrigPtMapBButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapBButton.Click += new System.EventHandler(this.spriteOrigPtMapBButton_Click); + // + // spriteOrigPtMapBLButton + // + this.spriteOrigPtMapBLButton.Location = new System.Drawing.Point(265, 215); + this.spriteOrigPtMapBLButton.Name = "spriteOrigPtMapBLButton"; + this.spriteOrigPtMapBLButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapBLButton.TabIndex = 23; + this.spriteOrigPtMapBLButton.Text = "↙"; + this.spriteOrigPtMapBLButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapBLButton.Click += new System.EventHandler(this.spriteOrigPtMapBLButton_Click); + // + // spriteOrigPtMapTRButton + // + this.spriteOrigPtMapTRButton.Location = new System.Drawing.Point(323, 157); + this.spriteOrigPtMapTRButton.Name = "spriteOrigPtMapTRButton"; + this.spriteOrigPtMapTRButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapTRButton.TabIndex = 22; + this.spriteOrigPtMapTRButton.Text = "↗"; + this.spriteOrigPtMapTRButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapTRButton.Click += new System.EventHandler(this.spriteOrigPtMapTRButton_Click); + // + // spriteOrigPtMapTButton + // + this.spriteOrigPtMapTButton.Location = new System.Drawing.Point(294, 157); + this.spriteOrigPtMapTButton.Name = "spriteOrigPtMapTButton"; + this.spriteOrigPtMapTButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapTButton.TabIndex = 21; + this.spriteOrigPtMapTButton.Text = "↑"; + this.spriteOrigPtMapTButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapTButton.Click += new System.EventHandler(this.spriteOrigPtMapTButton_Click); + // + // spriteOrigPtMapTLButton + // + this.spriteOrigPtMapTLButton.Location = new System.Drawing.Point(265, 157); + this.spriteOrigPtMapTLButton.Name = "spriteOrigPtMapTLButton"; + this.spriteOrigPtMapTLButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapTLButton.TabIndex = 20; + this.spriteOrigPtMapTLButton.Text = "↖"; + this.spriteOrigPtMapTLButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapTLButton.Click += new System.EventHandler(this.spriteOrigPtMapTLButton_Click); + // + // spriteOrigPtMapRButton + // + this.spriteOrigPtMapRButton.Location = new System.Drawing.Point(323, 186); + this.spriteOrigPtMapRButton.Name = "spriteOrigPtMapRButton"; + this.spriteOrigPtMapRButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapRButton.TabIndex = 19; + this.spriteOrigPtMapRButton.Text = "→ "; + this.spriteOrigPtMapRButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapRButton.Click += new System.EventHandler(this.spriteOrigPtMapRButton_Click); + // + // spriteOrigPtMapCButton + // + this.spriteOrigPtMapCButton.Location = new System.Drawing.Point(294, 186); + this.spriteOrigPtMapCButton.Name = "spriteOrigPtMapCButton"; + this.spriteOrigPtMapCButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapCButton.TabIndex = 18; + this.spriteOrigPtMapCButton.Text = "•"; + this.spriteOrigPtMapCButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapCButton.Click += new System.EventHandler(this.spriteOrigPtMapCButton_Click); + // + // spriteOrigPtMapLButton + // + this.spriteOrigPtMapLButton.Location = new System.Drawing.Point(265, 186); + this.spriteOrigPtMapLButton.Name = "spriteOrigPtMapLButton"; + this.spriteOrigPtMapLButton.Size = new System.Drawing.Size(23, 23); + this.spriteOrigPtMapLButton.TabIndex = 17; + this.spriteOrigPtMapLButton.Text = "←"; + this.spriteOrigPtMapLButton.UseVisualStyleBackColor = true; + this.spriteOrigPtMapLButton.Click += new System.EventHandler(this.spriteOrigPtMapLButton_Click); + // + // spriteOrigPtLabel + // + this.spriteOrigPtLabel.AutoSize = true; + this.spriteOrigPtLabel.Location = new System.Drawing.Point(6, 133); + this.spriteOrigPtLabel.Name = "spriteOrigPtLabel"; + this.spriteOrigPtLabel.Size = new System.Drawing.Size(63, 13); + this.spriteOrigPtLabel.TabIndex = 16; + this.spriteOrigPtLabel.Text = "Origin point:"; + // + // spriteOrigPtYLabel + // + this.spriteOrigPtYLabel.AutoSize = true; + this.spriteOrigPtYLabel.Location = new System.Drawing.Point(243, 133); + this.spriteOrigPtYLabel.Name = "spriteOrigPtYLabel"; + this.spriteOrigPtYLabel.Size = new System.Drawing.Size(17, 13); + this.spriteOrigPtYLabel.TabIndex = 15; + this.spriteOrigPtYLabel.Text = "Y:"; + // + // spriteOrigPtXLabel + // + this.spriteOrigPtXLabel.AutoSize = true; + this.spriteOrigPtXLabel.Location = new System.Drawing.Point(105, 133); + this.spriteOrigPtXLabel.Name = "spriteOrigPtXLabel"; + this.spriteOrigPtXLabel.Size = new System.Drawing.Size(17, 13); + this.spriteOrigPtXLabel.TabIndex = 14; + this.spriteOrigPtXLabel.Text = "X:"; + // + // spriteOrigPtYNumUpDown + // + this.spriteOrigPtYNumUpDown.Location = new System.Drawing.Point(266, 131); + this.spriteOrigPtYNumUpDown.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.spriteOrigPtYNumUpDown.Minimum = new decimal(new int[] { + 32768, + 0, + 0, + -2147483648}); + this.spriteOrigPtYNumUpDown.Name = "spriteOrigPtYNumUpDown"; + this.spriteOrigPtYNumUpDown.Size = new System.Drawing.Size(85, 20); + this.spriteOrigPtYNumUpDown.TabIndex = 13; + this.spriteOrigPtYNumUpDown.ValueChanged += new System.EventHandler(this.spriteOrigPtYNumUpDown_ValueChanged); + // + // spriteOrigPtXNumUpDown + // + this.spriteOrigPtXNumUpDown.Location = new System.Drawing.Point(128, 131); + this.spriteOrigPtXNumUpDown.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.spriteOrigPtXNumUpDown.Minimum = new decimal(new int[] { + 32768, + 0, + 0, + -2147483648}); + this.spriteOrigPtXNumUpDown.Name = "spriteOrigPtXNumUpDown"; + this.spriteOrigPtXNumUpDown.Size = new System.Drawing.Size(85, 20); + this.spriteOrigPtXNumUpDown.TabIndex = 12; + this.spriteOrigPtXNumUpDown.ValueChanged += new System.EventHandler(this.spriteOrigPtXNumUpDown_ValueChanged); + // + // spriteRectHLabel + // + this.spriteRectHLabel.AutoSize = true; + this.spriteRectHLabel.Location = new System.Drawing.Point(219, 89); + this.spriteRectHLabel.Name = "spriteRectHLabel"; + this.spriteRectHLabel.Size = new System.Drawing.Size(41, 13); + this.spriteRectHLabel.TabIndex = 11; + this.spriteRectHLabel.Text = "Height:"; + // + // spriteRectWLabel + // + this.spriteRectWLabel.AutoSize = true; + this.spriteRectWLabel.Location = new System.Drawing.Point(84, 89); + this.spriteRectWLabel.Name = "spriteRectWLabel"; + this.spriteRectWLabel.Size = new System.Drawing.Size(38, 13); + this.spriteRectWLabel.TabIndex = 10; + this.spriteRectWLabel.Text = "Width:"; + // + // spriteRectHNumUpDown + // + this.spriteRectHNumUpDown.Location = new System.Drawing.Point(266, 87); + this.spriteRectHNumUpDown.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.spriteRectHNumUpDown.Name = "spriteRectHNumUpDown"; + this.spriteRectHNumUpDown.Size = new System.Drawing.Size(85, 20); + this.spriteRectHNumUpDown.TabIndex = 9; + this.spriteRectHNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectHNumUpDown_ValueChanged); + // + // spriteRectWNumUpDown + // + this.spriteRectWNumUpDown.Location = new System.Drawing.Point(128, 87); + this.spriteRectWNumUpDown.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.spriteRectWNumUpDown.Name = "spriteRectWNumUpDown"; + this.spriteRectWNumUpDown.Size = new System.Drawing.Size(85, 20); + this.spriteRectWNumUpDown.TabIndex = 8; + this.spriteRectWNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectWNumUpDown_ValueChanged); + // + // spriteRectLabel + // + this.spriteRectLabel.AutoSize = true; + this.spriteRectLabel.Location = new System.Drawing.Point(6, 63); + this.spriteRectLabel.Name = "spriteRectLabel"; + this.spriteRectLabel.Size = new System.Drawing.Size(59, 13); + this.spriteRectLabel.TabIndex = 7; + this.spriteRectLabel.Text = "Rectangle:"; + // + // spriteRectYLabel + // + this.spriteRectYLabel.AutoSize = true; + this.spriteRectYLabel.Location = new System.Drawing.Point(243, 63); + this.spriteRectYLabel.Name = "spriteRectYLabel"; + this.spriteRectYLabel.Size = new System.Drawing.Size(17, 13); + this.spriteRectYLabel.TabIndex = 6; + this.spriteRectYLabel.Text = "Y:"; + // + // spriteRectXLabel + // + this.spriteRectXLabel.AutoSize = true; + this.spriteRectXLabel.Location = new System.Drawing.Point(105, 63); + this.spriteRectXLabel.Name = "spriteRectXLabel"; + this.spriteRectXLabel.Size = new System.Drawing.Size(17, 13); + this.spriteRectXLabel.TabIndex = 5; + this.spriteRectXLabel.Text = "X:"; + // + // spriteRectYNumUpDown + // + this.spriteRectYNumUpDown.Location = new System.Drawing.Point(266, 61); + this.spriteRectYNumUpDown.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.spriteRectYNumUpDown.Name = "spriteRectYNumUpDown"; + this.spriteRectYNumUpDown.Size = new System.Drawing.Size(85, 20); + this.spriteRectYNumUpDown.TabIndex = 4; + this.spriteRectYNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectYNumUpDown_ValueChanged); + // + // spriteRectXNumUpDown + // + this.spriteRectXNumUpDown.Location = new System.Drawing.Point(128, 61); + this.spriteRectXNumUpDown.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.spriteRectXNumUpDown.Name = "spriteRectXNumUpDown"; + this.spriteRectXNumUpDown.Size = new System.Drawing.Size(85, 20); + this.spriteRectXNumUpDown.TabIndex = 3; + this.spriteRectXNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectXNumUpDown_ValueChanged); + // + // spriteNameLabel + // + this.spriteNameLabel.AutoSize = true; + this.spriteNameLabel.Location = new System.Drawing.Point(6, 22); + this.spriteNameLabel.Name = "spriteNameLabel"; + this.spriteNameLabel.Size = new System.Drawing.Size(66, 13); + this.spriteNameLabel.TabIndex = 2; + this.spriteNameLabel.Text = "Sprite name:"; + // + // spriteNameTextBox + // + this.spriteNameTextBox.Location = new System.Drawing.Point(78, 19); + this.spriteNameTextBox.Name = "spriteNameTextBox"; + this.spriteNameTextBox.Size = new System.Drawing.Size(273, 20); + this.spriteNameTextBox.TabIndex = 0; + this.spriteNameTextBox.TextChanged += new System.EventHandler(this.spriteNameTextBox_TextChanged); + // + // reloadPictureButton + // + this.reloadPictureButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.reloadPictureButton.Location = new System.Drawing.Point(304, 18); + this.reloadPictureButton.Name = "reloadPictureButton"; + this.reloadPictureButton.Size = new System.Drawing.Size(62, 23); + this.reloadPictureButton.TabIndex = 2; + this.reloadPictureButton.Text = "Reload"; + this.reloadPictureButton.UseVisualStyleBackColor = true; + this.reloadPictureButton.Click += new System.EventHandler(this.reloadPictureButton_Click); + // + // filenameLabel + // + this.filenameLabel.AutoSize = true; + this.filenameLabel.Location = new System.Drawing.Point(6, 24); + this.filenameLabel.Name = "filenameLabel"; + this.filenameLabel.Size = new System.Drawing.Size(85, 13); + this.filenameLabel.TabIndex = 1; + this.filenameLabel.Text = "Picture filename:"; + // + // filenameTextBox + // + this.filenameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.filenameTextBox.Location = new System.Drawing.Point(97, 19); + this.filenameTextBox.Name = "filenameTextBox"; + this.filenameTextBox.Size = new System.Drawing.Size(201, 20); + this.filenameTextBox.TabIndex = 3; + this.filenameTextBox.TextChanged += new System.EventHandler(this.filenameTextBox_TextChanged); + // + // imageViewPanel + // + this.imageViewPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.imageViewPanel.AutoScroll = true; + this.imageViewPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imageViewPanel.Controls.Add(this.insideViewPanel); + this.imageViewPanel.Location = new System.Drawing.Point(12, 27); + this.imageViewPanel.Name = "imageViewPanel"; + this.imageViewPanel.Size = new System.Drawing.Size(529, 503); + this.imageViewPanel.TabIndex = 0; + this.imageViewPanel.CTRLMouseWheel += new System.Windows.Forms.MouseEventHandler(this.imageViewPanel_CTRLMouseWheel); + this.imageViewPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.imageViewPanel_Scroll); + // + // insideViewPanel + // + this.insideViewPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.insideViewPanel.Controls.Add(this.spritesheetPictureBox); + this.insideViewPanel.Location = new System.Drawing.Point(3, 3); + this.insideViewPanel.Name = "insideViewPanel"; + this.insideViewPanel.Size = new System.Drawing.Size(523, 497); + this.insideViewPanel.TabIndex = 1; + // + // spritesheetPictureBox + // + this.spritesheetPictureBox.AllowSRectCreation = true; + this.spritesheetPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.spritesheetPictureBox.Location = new System.Drawing.Point(3, 3); + this.spritesheetPictureBox.Name = "spritesheetPictureBox"; + this.spritesheetPictureBox.SelectedSRect = null; + this.spritesheetPictureBox.Size = new System.Drawing.Size(100, 50); + this.spritesheetPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.spritesheetPictureBox.TabIndex = 0; + this.spritesheetPictureBox.TabStop = false; + this.spritesheetPictureBox.RectResize += new System.EventHandler(this.spritesheetPictureBox_RectResize); + this.spritesheetPictureBox.SelectedSRectChanged += new System.EventHandler(this.spritesheetPictureBox_SelectedSRectChanged); + this.spritesheetPictureBox.SRectCreated += new System.EventHandler(this.spritesheetPictureBox_SRectCreated); + this.spritesheetPictureBox.Click += new System.EventHandler(this.spritesheetPictureBox_Click); + this.spritesheetPictureBox.Paint += new System.Windows.Forms.PaintEventHandler(this.spritesheetPictureBox_Paint); + // + // SpritesheetEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(931, 542); + this.Controls.Add(this.propertiesGroupBox); + this.Controls.Add(this.imageViewPanel); + this.Controls.Add(this.menuStrip1); + this.DoubleBuffered = true; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; + this.MainMenuStrip = this.menuStrip1; + this.Name = "SpritesheetEditor"; + this.Text = "AB Classic Spritesheet Editor"; + this.Load += new System.EventHandler(this.SpritesheetEditor_Load); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SpritesheetEditor_KeyDown); + this.Resize += new System.EventHandler(this.SpritesheetEditor_Resize); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.propertiesGroupBox.ResumeLayout(false); + this.propertiesGroupBox.PerformLayout(); + this.selectedSpriteGroupBox.ResumeLayout(false); + this.selectedSpriteGroupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtYNumUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtXNumUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectHNumUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectWNumUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectYNumUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.spriteRectXNumUpDown)).EndInit(); + this.imageViewPanel.ResumeLayout(false); + this.insideViewPanel.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.spritesheetPictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private ABStudio.Controls.CustomPanel imageViewPanel; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openHereToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openInNewInstanceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportSpritesheetImageToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportCroppedSpritesheetToolStripMenuItem; + private ABStudio.Controls.PictureBoxDB spritesheetPictureBox; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importSpritesheetToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importSpritesFolderToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.Panel insideViewPanel; + private System.Windows.Forms.GroupBox propertiesGroupBox; + private System.Windows.Forms.TextBox filenameTextBox; + private System.Windows.Forms.Label filenameLabel; + private System.Windows.Forms.Button reloadPictureButton; + private System.Windows.Forms.GroupBox selectedSpriteGroupBox; + private System.Windows.Forms.TextBox spriteNameTextBox; + private System.Windows.Forms.Label spriteNameLabel; + private System.Windows.Forms.Label spriteRectYLabel; + private System.Windows.Forms.Label spriteRectXLabel; + private System.Windows.Forms.NumericUpDown spriteRectYNumUpDown; + private System.Windows.Forms.NumericUpDown spriteRectXNumUpDown; + private System.Windows.Forms.Label spriteRectHLabel; + private System.Windows.Forms.Label spriteRectWLabel; + private System.Windows.Forms.NumericUpDown spriteRectHNumUpDown; + private System.Windows.Forms.NumericUpDown spriteRectWNumUpDown; + private System.Windows.Forms.Label spriteRectLabel; + private System.Windows.Forms.Label spriteOrigPtLabel; + private System.Windows.Forms.Label spriteOrigPtYLabel; + private System.Windows.Forms.Label spriteOrigPtXLabel; + private System.Windows.Forms.NumericUpDown spriteOrigPtYNumUpDown; + private System.Windows.Forms.NumericUpDown spriteOrigPtXNumUpDown; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem clearAllSpritesToolStripMenuItem; + private System.Windows.Forms.Label spriteOrigPtMapLabel; + private System.Windows.Forms.Button spriteOrigPtMapBRButton; + private System.Windows.Forms.Button spriteOrigPtMapBButton; + private System.Windows.Forms.Button spriteOrigPtMapBLButton; + private System.Windows.Forms.Button spriteOrigPtMapTRButton; + private System.Windows.Forms.Button spriteOrigPtMapTButton; + private System.Windows.Forms.Button spriteOrigPtMapTLButton; + private System.Windows.Forms.Button spriteOrigPtMapRButton; + private System.Windows.Forms.Button spriteOrigPtMapCButton; + private System.Windows.Forms.Button spriteOrigPtMapLButton; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + } +} \ No newline at end of file diff --git a/ABStudio/Forms/SpritesheetEditor.cs b/ABStudio/Forms/SpritesheetEditor.cs new file mode 100644 index 0000000..a6d817f --- /dev/null +++ b/ABStudio/Forms/SpritesheetEditor.cs @@ -0,0 +1,691 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ABStudio.Controls; +using ABStudio.FileFormats.DAT; +using ABStudio.FileFormats.PVR; +using ABStudio.Misc; +using StbRectPackSharp; + +namespace ABStudio.Forms +{ + public partial class SpritesheetEditor : Form + { + private static readonly string Title = "AB Classic Spritesheet Editor"; + + private string originalPath = ""; + private DATFile file = null; + private DATFile.SpriteData data = null; + private Bitmap spritesheet = null; + private float zoom = 1.0f; + private object SelectedObj => spritesheetPictureBox.SelectedSRect; + private DATFile.SpriteData.Sprite SelectedSprite => spritesheetPictureBox.GetSRectLinkedObject(SelectedObj) as DATFile.SpriteData.Sprite; + + #region Extensions management + + private static readonly string[] supportedPicExt = new string[] { "pvr", "png", "jpg", "gif", "bmp", "tiff" }; + private static readonly string[] supportedPicName = new string[] { "PowerVR Image File", "Portable Network Graphics", "Joint Photographic Experts Group", "Graphics Interchange Format", "Bitmap Image file", "Tagged Image File Format" }; + + private static string GenerateSaveExtension(bool allowPVR) + { + string ext = ""; + + for(int i = (allowPVR ? 0 : 1); i < supportedPicExt.Length; i++) + { + ext += supportedPicName[i] + " (*." + supportedPicExt[i] + ")| *." + supportedPicExt[i] + "|"; + } + + return ext + "All files (*.*)|*.*"; + } + + private static string[] GenerateSaveExtensionTable(bool allowPVR) + { + List exts = new List(); + + for(int i = (allowPVR ? 0 : 1); i < supportedPicExt.Length; i++) + { + exts.Add(supportedPicName[i] + " (*." + supportedPicExt[i] + ")"); + } + + return exts.ToArray(); + } + + #endregion + + #region Constructor + + public SpritesheetEditor(string path, DATFile file) + { + InitializeComponent(); + + originalPath = path; + ChangeFile(file); + } + + #endregion + + #region Form triggers + + private void RefreshTitle() + { + this.Text = Title + " - " + ((originalPath == "") ? "New file" : Path.GetFileName(originalPath)); + } + + private void SpritesheetEditor_Load(object sender, EventArgs e) + { + } + + private void SpritesheetEditor_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete && spritesheetPictureBox.Focused) + { + spritesheetPictureBox_KeyPressDel(sender, e); + e.Handled = true; + } + } + + private void SpritesheetEditor_Resize(object sender, EventArgs e) + { + RefreshZoom(); + } + + #endregion + + #region Menu Strip triggers + + private void newToolStripMenuItem_Click(object sender, EventArgs e) + { + ChangeFile(Common.NewSpritesheetFile()); + } + + private void openHereToolStripMenuItem_Click(object sender, EventArgs e) + { + DATFile file = Common.OpenFile(ref originalPath); + + if (file != null) + ChangeFile(file); + } + + private void openInNewInstanceToolStripMenuItem_Click(object sender, EventArgs e) => Common.OpenFileInNewEditor(); + + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + Common.SaveFile(ref originalPath, file); + + if(!originalPath.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) + { + data.associatedZSTREAM = null; + } + + if (!SaveSpritesheet()) + return; + + RefreshTitle(); + } + + private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!Common.SaveAsFile(ref originalPath, file)) + return; + + if (!SaveSpritesheet()) + return; + + RefreshTitle(); + } + + private bool SaveSpritesheet() + { + string ext = Path.GetExtension(data.filenames[0]).ToLower(); + + bool isJsonStreamCombo = (originalPath.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) && (ext == ".stream"); + + if (data.filenames[0] == "" || ext == "") + { + MessageBox.Show("Please write a filename for the picture to save with your spritesheet.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + if (supportedPicExt.ToList().IndexOf(ext.Substring(1)) < 0 && !isJsonStreamCombo) + { + MessageBox.Show("Unsupported extention \"" + ext + "\", please use a supported extension like PVR or PNG.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + string fname = Path.GetDirectoryName(originalPath) + Path.DirectorySeparatorChar + data.filenames[0]; + + if (ext == ".pvr") + { + PVRFile pvr = new PVRFile(spritesheet); + pvr.Save(fname); + } + else if(ext == ".stream") + { + data.associatedZSTREAM.SaveBitmap(spritesheet, fname); + } + else + { + spritesheet.Save(fname); + } + + return true; + } + + private void importSpritesheetToolStripMenuItem_Click(object sender, EventArgs e) + { + using (OpenFileDialog dialog = new OpenFileDialog()) + { + dialog.Filter = GenerateSaveExtension(true); + dialog.DefaultExt = (originalPath == "" || data.filenames.Count < 1 || data.filenames[0] == "") ? "pvr" : Path.GetExtension(data.filenames[0]).Substring(1); + dialog.FilterIndex = 1; + dialog.RestoreDirectory = true; + if (dialog.ShowDialog() == DialogResult.OK) + { + LoadBitmap(dialog.FileName); + + filenameTextBox.Text = Path.GetFileName(dialog.FileName); + } + } + } + + private void importSpritesFolderToolStripMenuItem_Click(object sender, EventArgs e) + { + FolderPicker dialog = new FolderPicker(); + if (dialog.ShowDialog() == true) + { + MCQAskForm maf = new MCQAskForm(new string[] { "Insert them", "Overwrite existing ones", "Don't import them" }, "In which way do you want to import borders of the imported sprites?"); + if(maf.ShowDialog() == DialogResult.OK) + { + Packer packer = new Packer(256, 256); + + List bmps = new List(); + List names = new List(); + foreach(string file in Directory.GetFiles(dialog.ResultPath)) + { + if (supportedPicExt.ToList().IndexOf(Path.GetExtension(file).Substring(1)) < 0) + continue; + + bmps.Add(new Bitmap(file)); + names.Add(Path.GetFileNameWithoutExtension(file)); + } + + foreach (Bitmap bmp in bmps) { + Packer.PackRectForce(ref packer, bmp.Width + 4, bmp.Height + 4, bmp); + } + + if (maf.ChosenAnswer == 1) + data.sprites.Clear(); + + Bitmap full = new Bitmap(packer.Width, packer.Height); + using (Graphics g = Graphics.FromImage(full)) + { + foreach (PackerRectangle rect in packer.PackRectangles) + { + Bitmap bmp = rect.Data as Bitmap; + Rectangle mainRect = new Rectangle(rect.X + 2, rect.Y + 2, bmp.Width, bmp.Height); + g.DrawImage(bmp, mainRect, new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel); + + g.DrawImage(bmp, new Rectangle(rect.X+1, rect.Y+2, 1, bmp.Height), new Rectangle(0, 0, 1, bmp.Height), GraphicsUnit.Pixel); + g.DrawImage(bmp, new Rectangle(rect.X+bmp.Width+2, rect.Y+2, 1, bmp.Height), new Rectangle(bmp.Width-1, 0, 1, bmp.Height), GraphicsUnit.Pixel); + + g.DrawImage(bmp, new Rectangle(rect.X+2, rect.Y+1, bmp.Width, 1), new Rectangle(0, 0, bmp.Width, 1), GraphicsUnit.Pixel); + g.DrawImage(bmp, new Rectangle(rect.X+2, rect.Y+bmp.Height+2, bmp.Width, 1), new Rectangle(0, bmp.Height-1, bmp.Width, 1), GraphicsUnit.Pixel); + + if (maf.ChosenAnswer != 2) + { + DATFile.SpriteData.Sprite sprite = new DATFile.SpriteData.Sprite(); + sprite.name = names[bmps.IndexOf(bmp)]; + sprite.rect = mainRect; + sprite.orig = new Point(sprite.rect.Width / 2, sprite.rect.Height / 2); + + data.sprites.Add(sprite); + } + } + } + + spritesheet = full; + spritesheetPictureBox.Image = spritesheet; + RefreshRects(); + RefreshZoom(); + + filenameTextBox.Text = "-- IMPORTED SPRITE FOLDER, REPLACE THIS --"; + } + } + } + + private void exportSpritesheetImageToolStripMenuItem_Click(object sender, EventArgs e) + { + SaveFileDialog dialog; + dialog = new SaveFileDialog(); + dialog.Filter = GenerateSaveExtension(false);// "Portable Network Graphics|*.png|Joint Photographic Experts Group|*.jpg|Graphics Interchange Format|*.gif|Bitmap Image file|*.bmp|Tagged Image File Format|*.tiff|All files (*.*)|*.*"; + dialog.DefaultExt = supportedPicExt[1]; + dialog.FileName = Path.GetFileNameWithoutExtension(originalPath) + "." + supportedPicExt[1]; + if (dialog.ShowDialog() == DialogResult.OK) + spritesheet.Save(dialog.FileName); + } + + private void exportCroppedSpritesheetToolStripMenuItem_Click(object sender, EventArgs e) + { + FolderPicker dialog = new FolderPicker(); + if (dialog.ShowDialog() == true) + { + + ComboAskForm caf = new ComboAskForm(GenerateSaveExtensionTable(false), "In which format do you want to save the cropped spritesheet?"); + if (caf.ShowDialog() == DialogResult.OK) + { + foreach (DATFile.SpriteData.Sprite sprite in data.sprites) + { + if (sprite.rect.Width < 1 || sprite.rect.Height < 1) + continue; + + Bitmap bmp = new Bitmap(sprite.rect.Width, sprite.rect.Height); + + using (Graphics g = Graphics.FromImage(bmp)) + { + g.DrawImage(spritesheet, new Rectangle(0, 0, sprite.rect.Width, sprite.rect.Height), sprite.rect, GraphicsUnit.Pixel); + } + + bmp.Save(dialog.ResultPath + Path.DirectorySeparatorChar + sprite.name + "." + supportedPicExt[caf.ComboIndex+1]); + } + } + } + } + + private void exitToolStripMenuItem_Click(object sender, EventArgs e) => Close(); + + private void clearAllSpritesToolStripMenuItem_Click(object sender, EventArgs e) + { + spritesheetPictureBox.ClearSRects(); + data.sprites.Clear(); + } + + private void aboutToolStripMenuItem_Click(object sender, EventArgs e) + { + MessageBox.Show("AB Studio Spritesheets Editor" + + Environment.NewLine + "By RSM (rsm4618 @ Discord)" + + Environment.NewLine + + Environment.NewLine + "Libraries used:" + + Environment.NewLine + "- PVRTexLib" + + Environment.NewLine + "- CppSharp" + + Environment.NewLine + "- Newtonsoft.Json" + + Environment.NewLine + "- Aspose.Zip" + + Environment.NewLine + + Environment.NewLine + "Documentation:" + + Environment.NewLine + "- RizDub" + + Environment.NewLine + "- AB360" + + Environment.NewLine + + Environment.NewLine + "Special thanks:" + + Environment.NewLine + "- AB Series Modding Hub Discord Server" + + Environment.NewLine + "- Hidden birds", + "About", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + #endregion + + #region Reloading & Refreshing utility functions + + private void ChangeFile(DATFile file) + { + RefreshTitle(); + this.file = file; + this.data = file.GetAsSpriteData(); + LoadBitmap(); + RefreshRects(); + RefreshLocalSprite(); + + while (data.filenames.Count < 1) + data.filenames.Add(""); + + filenameTextBox.Text = data.filenames[0]; + } + + private void LoadBitmap(string path=null) + { + if (path == "") + path = null; + + bool hasSpecifiedPath = path != null; + + if (data.filenames.Count <= 0 && !hasSpecifiedPath) + { + spritesheet = new Bitmap(4, 4); + } + else if(data.filenames.Count == 1 || hasSpecifiedPath) + { + string fullPath = (hasSpecifiedPath) ? path : (Path.GetDirectoryName(originalPath) + Path.DirectorySeparatorChar + data.filenames[0]); + string ext = Path.GetExtension(fullPath).ToLower(); + if(ext == ".pvr") + { + PVRFile pvr = new PVRFile(fullPath); + spritesheet = pvr.AsBitmap(); + } + else if(fullPath.EndsWith(".stream") || ext == ".zstream") + { + if (data.associatedZSTREAM != null) + spritesheet = data.associatedZSTREAM.GetBitmap(fullPath); + else + throw new Exception("Non-JSON sheets can't have a stream or zstream texture"); + } + else + { + spritesheet = new Bitmap(fullPath); + } + + if (data.associatedZSTREAM != null) + data.associatedZSTREAM.UpdateBitmap(spritesheet, Path.GetFileName(fullPath)); + } + else + { + MessageBox.Show("Multi-spritesheet DAT files aren't supported.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + spritesheetPictureBox.Image = spritesheet; + RefreshZoom(); + } + + private void RefreshZoom() + { + float w = spritesheet.Width * zoom; + float h = spritesheet.Height * zoom; + + insideViewPanel.Size = new Size(Math.Max((int)Math.Round(w * 1.1f), imageViewPanel.Width - 6), Math.Max((int)Math.Round(h * 1.1f), imageViewPanel.Height - 6)); + spritesheetPictureBox.Location = new Point((int)Math.Round((insideViewPanel.Size.Width / 2.0f) - (w / 2.0f)), (int)Math.Round((insideViewPanel.Size.Height / 2.0f) - (h / 2.0f))); + spritesheetPictureBox.Size = new Size((int)Math.Round(w), (int)Math.Round(h)); + } + + private void RefreshRects() + { + spritesheetPictureBox.ClearSRects(); + + foreach(DATFile.SpriteData.Sprite sprite in data.sprites) + { + spritesheetPictureBox.AddSRect(sprite.rect, sprite); + } + } + + private void RefreshLocalSprite() + { + bool isSelected = SelectedObj != null; + selectedSpriteGroupBox.Enabled = isSelected; + + if (isSelected) + { + DATFile.SpriteData.Sprite sprite = SelectedSprite; + spriteNameTextBox.Text = sprite.name; + spriteRectXNumUpDown.Value = sprite.rect.X; + spriteRectYNumUpDown.Value = sprite.rect.Y; + spriteRectWNumUpDown.Value = sprite.rect.Width; + spriteRectHNumUpDown.Value = sprite.rect.Height; + spriteOrigPtXNumUpDown.Value = sprite.orig.X; + spriteOrigPtYNumUpDown.Value = sprite.orig.Y; + } + } + + private void RefreshSelectedRect() + { + if (SelectedObj != null) + spritesheetPictureBox.EditSRect(SelectedObj, SelectedSprite.rect); + } + + #endregion + + #region Image view panel triggers + + private void imageViewPanel_CTRLMouseWheel(object sender, MouseEventArgs e) + { + if (e.Delta > 0) + { + if (zoom < 10.0f) + zoom /= 0.9f; + else + return; + } + else + { + if (imageViewPanel.HorizontalScroll.Visible || imageViewPanel.VerticalScroll.Visible) + zoom *= 0.9f; + else + return; + } + + int viewportWidthBefore = imageViewPanel.Width - (imageViewPanel.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0); + int viewportHeightBefore = imageViewPanel.Height - (imageViewPanel.HorizontalScroll.Visible ? SystemInformation.HorizontalScrollBarHeight : 0); + + double scrollbarLeftRatio = (double)imageViewPanel.HorizontalScroll.Value / (double)imageViewPanel.HorizontalScroll.Maximum; + double scrollbarTopRatio = (double)imageViewPanel.VerticalScroll.Value / (double)imageViewPanel.VerticalScroll.Maximum; + int scrollbarRightPos = (imageViewPanel.HorizontalScroll.Value + viewportWidthBefore); + double scrollbarRightRatio = (double)(imageViewPanel.HorizontalScroll.Value + viewportWidthBefore) / (double)imageViewPanel.HorizontalScroll.Maximum; + int scrollbarTopPos = (imageViewPanel.VerticalScroll.Value + viewportHeightBefore); + double scrollbarBottomRatio = (double)(imageViewPanel.VerticalScroll.Value + viewportHeightBefore) / (double)imageViewPanel.VerticalScroll.Maximum; + + RefreshZoom(); + imageViewPanel.PerformLayout(); + + int viewportWidthAfter = imageViewPanel.Width - (imageViewPanel.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0); + int viewportHeightAfter = imageViewPanel.Height - (imageViewPanel.HorizontalScroll.Visible ? SystemInformation.HorizontalScrollBarHeight : 0); + + int zoomLeft = (int)Math.Round(imageViewPanel.HorizontalScroll.Maximum * scrollbarLeftRatio); + int zoomTop = (int)Math.Round(imageViewPanel.VerticalScroll.Maximum * scrollbarTopRatio); + + int goRight = (int)Math.Round(imageViewPanel.HorizontalScroll.Maximum * scrollbarRightRatio) - zoomLeft - viewportWidthBefore; + int goDown = (int)Math.Round(imageViewPanel.VerticalScroll.Maximum * scrollbarBottomRatio) - zoomTop - viewportHeightBefore; + + int zoomFinalX = (int)Math.Round(zoomLeft + (goRight * ((double)e.X / (double)viewportWidthBefore))); + int zoomFinalY = (int)Math.Round(zoomTop + (goDown * ((double)e.Y / (double)viewportHeightBefore))); + + if (zoomFinalX < 0) + zoomFinalX = 0; + if (zoomFinalX > imageViewPanel.HorizontalScroll.Maximum) + zoomFinalX = imageViewPanel.HorizontalScroll.Maximum; + + if (imageViewPanel.HorizontalScroll.Visible) + imageViewPanel.HorizontalScroll.Value = zoomFinalX; + + if (zoomFinalY < 0) + zoomFinalY = 0; + if (zoomFinalY > imageViewPanel.VerticalScroll.Maximum) + zoomFinalY = imageViewPanel.VerticalScroll.Maximum; + + if (imageViewPanel.VerticalScroll.Visible) + imageViewPanel.VerticalScroll.Value = zoomFinalY; + + imageViewPanel.PerformLayout(); + + } + + private void imageViewPanel_Scroll(object sender, ScrollEventArgs e) + { + } + + #endregion + + #region Spritesheet picturebox triggers + + private void spritesheetPictureBox_RectResize(object sender, PictureBoxDB.SizableRectEventArgs e) + { + DATFile.SpriteData.Sprite sprite = e.LinkedObject as DATFile.SpriteData.Sprite; + sprite.rect = e.Rect; + + RefreshLocalSprite(); + } + + private void spritesheetPictureBox_SRectCreated(object sender, PictureBoxDB.SizableRectEventArgs e) + { + DATFile.SpriteData.Sprite sprite = new DATFile.SpriteData.Sprite(); + sprite.name = ""; + sprite.rect = e.Rect; + sprite.orig = new Point(sprite.rect.Width / 2, sprite.rect.Height / 2); + data.sprites.Add(sprite); + + spritesheetPictureBox.SetSRectLinkedObject(e.SRect, sprite); + } + + private void spritesheetPictureBox_Click(object sender, EventArgs e) + { + (sender as Control).Focus(); + } + + private void spritesheetPictureBox_Paint(object sender, PaintEventArgs e) + { + if(SelectedObj != null) + { + Point pt = spritesheetPictureBox.ConvertPicturePointToControlPoint(SelectedSprite.orig); + Point pt2 = spritesheetPictureBox.ConvertPicturePointToControlPoint(SelectedSprite.rect.Location); + e.Graphics.DrawRectangle(new Pen(Color.Red), new Rectangle(pt2.X + pt.X - 2, pt2.Y + pt.Y - 2, 5, 5)); + } + } + + private void spritesheetPictureBox_SelectedSRectChanged(object sender, EventArgs e) + { + RefreshLocalSprite(); + } + + private void spritesheetPictureBox_KeyPressDel(object sender, KeyEventArgs e) + { + if (SelectedObj != null) + { + data.sprites.Remove(SelectedSprite); + spritesheetPictureBox.RemoveSRect(SelectedObj); + RefreshLocalSprite(); + } + } + + #endregion + + #region Manual rectangle edit controls triggers + + private void filenameTextBox_TextChanged(object sender, EventArgs e) + { + while (data.filenames.Count < 1) + data.filenames.Add(""); + + data.filenames[0] = filenameTextBox.Text; + } + + private void reloadPictureButton_Click(object sender, EventArgs e) + { + if (filenameTextBox.Text == "") + MessageBox.Show("No path to reload.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + else + LoadBitmap(); + } + private void spriteNameTextBox_TextChanged(object sender, EventArgs e) + { + SelectedSprite.name = spriteNameTextBox.Text; + } + + private void spriteRectXNumUpDown_ValueChanged(object sender, EventArgs e) + { + SelectedSprite.rect.X = (int)spriteRectXNumUpDown.Value; + RefreshSelectedRect(); + } + + private void spriteRectYNumUpDown_ValueChanged(object sender, EventArgs e) + { + SelectedSprite.rect.Y = (int)spriteRectYNumUpDown.Value; + RefreshSelectedRect(); + } + + private void spriteRectWNumUpDown_ValueChanged(object sender, EventArgs e) + { + SelectedSprite.rect.Width = (int)spriteRectWNumUpDown.Value; + //spriteOrigPtXNumUpDown.Maximum = SelectedSprite.rect.Width - 1; + RefreshSelectedRect(); + } + + private void spriteRectHNumUpDown_ValueChanged(object sender, EventArgs e) + { + SelectedSprite.rect.Height = (int)spriteRectHNumUpDown.Value; + //spriteOrigPtYNumUpDown.Maximum = SelectedSprite.rect.Height - 1; + RefreshSelectedRect(); + } + + private void spriteOrigPtXNumUpDown_ValueChanged(object sender, EventArgs e) + { + SelectedSprite.orig.X = (int)spriteOrigPtXNumUpDown.Value; + RefreshSelectedRect(); + } + + private void spriteOrigPtYNumUpDown_ValueChanged(object sender, EventArgs e) + { + SelectedSprite.orig.Y = (int)spriteOrigPtYNumUpDown.Value; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapCButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width / 2; + spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height / 2; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapTLButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = 0; + spriteOrigPtYNumUpDown.Value = 0; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapTButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width / 2; + spriteOrigPtYNumUpDown.Value = 0; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapTRButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width - 1; + spriteOrigPtYNumUpDown.Value = 0; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapRButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width - 1; + spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height / 2; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapBRButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width - 1; + spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height - 1; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapBButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width / 2; + spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height - 1; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapBLButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = 0; + spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height - 1; + RefreshSelectedRect(); + } + + private void spriteOrigPtMapLButton_Click(object sender, EventArgs e) + { + spriteOrigPtXNumUpDown.Value = 0; + spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height / 2; + RefreshSelectedRect(); + } + + #endregion + } +} diff --git a/ABStudio/Forms/SpritesheetEditor.resx b/ABStudio/Forms/SpritesheetEditor.resx new file mode 100644 index 0000000..4d0249a --- /dev/null +++ b/ABStudio/Forms/SpritesheetEditor.resx @@ -0,0 +1,3288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + XPLJr9wrL/nB+6KB11eVJxUqAha60boTrhBEIsAHRJwALzNFIE83wNCTUUhaEBKCUI3AFYK09ABwG2Uh + YgD4ZABCpBHweyGiZcJzEOWAriO8/iREuHS73eeM0P6FjoN/rNJID7jHPkF8JT1gz2E24rvkT6vuh8if + UeEHbDtV4udNfoYGyAzyMyLiA5ZvCfJbAYjIbzmbjfyDbtiM/j9M0fvZf+B9HAAAAABJRU5ErkJggigA + AACAAAAAAAEAAAEAIAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAHe5v/B3uc/wd8nf8HfZ7/B32f/wh+ + oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqErP8Kha3/Coau/wuG + r/8Lh7D/C4ix/wuIsv8LibP/DIq0/wyKtf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nuv8Njrv/DY68/w2O + vf8Oj77/DpC+/w6Qv/8OkMD/DpDA/w6Rwf8OkcL/D5LC/w+Sw/8PksP/D5LE/w+SxP8Pk8X/D5PF/w+U + xv8PlMb/D5TG/w+Ux/8PlMf/D5TH/w+Ux/8Qlcj/EJXI/xCVyP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCV + yP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCUx/8PlMf/D5TH/w+Ux/8Pk8b/D5TG/w+Uxv8Pk8X/D5PF/w+T + xf8PksT/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkcH/DpDA/w6QwP8OkL//Do++/w6Pvf8Njr3/DY68/w2N + u/8Njbr/DY25/w2MuP8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIs/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqE + rf8KhKz/CoSr/wqDqv8Jg6n/CYOo/wmCp/8Jgqb/CYGk/wiAo/8If6L/CH6h/wh+oP8Ifp//B32e/wd8 + nf8He5z/B3ub/wd7nP8HfJ3/B32e/wd9n/8IfqD/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgab/CYKn/wmD + qP8Kg6n/CoSq/wqFrP8Kha3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyKtf8Mirb/DIu3/wyL + uP8NjLn/DY26/w2Nuv8Njrv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8OkcL/D5LD/w+S + w/8PksT/D5PF/w+Txf8PlMb/D5TG/w+Uxv8PlMf/D5TH/xCVyP8QlMj/EJXI/xCWyf8Qlsn/EJXJ/xCW + yf8Qlcn/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlcn/EJbJ/xCV + yf8Qlsn/EJXI/xCVyP8Qlcj/EJXI/w+Ux/8PlMf/D5TG/w+Uxv8Pk8X/D5LF/w+SxP8PksT/D5LD/w+S + w/8OkcL/DpHB/w6Rwf8OkMD/DpC//w6Pvv8Oj73/DY69/w2OvP8Njbv/DY26/w2Nuf8Mi7j/DIu3/wyK + tv8MirX/DIq0/wyJs/8LiLL/C4ix/wuHsP8Lhq//C4au/wqFrf8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmB + p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh+oP8Ifp//B32e/wd8nf8He5z/B3yd/wd9nv8HfZ//CH6g/wh+ + of8If6L/CICj/wiApP8JgKX/CYKm/wmCp/8Jg6n/CoSq/wqEq/8KhKz/CoWt/wqFrv8Lhq//C4ew/wuI + sf8LiLL/DImz/wyKtP8MirX/DIq2/wyLt/8MjLj/DY25/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Q + v/8OkMD/DpHB/w6Rwv8PksP/D5LD/w+SxP8Pk8X/D5PF/w+Uxv8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCW + yf8Qlcn/EJXJ/xCWyv8Qlcr/EJbK/xCXy/8Ql8v/EJbL/xCXy/8Ql8v/EJbL/xCWy/8Ql8z/EJfM/xCX + zP8Ql8z/EJfM/xCWy/8Qlsv/EJfL/xCWy/8Qlsv/EJfL/xCWyv8Qlsr/EJbK/xCWyv8Qlsn/EJbJ/xCV + yP8Qlcj/EJXI/w+Ux/8PlMf/D5PG/w+Txf8PksX/D5LE/w+SxP8PksP/DpHC/w6Rwv8OkcH/DpDA/w6Q + v/8OkL7/Do+9/w2Ovf8Njrz/DY27/w2Nuv8NjLn/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuH + sf8Lh7D/C4av/wqFrv8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+ + oP8Ifp//B32e/wd8nf8HfZ7/B32f/wh+oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jg6j/CYOp/wqD + qv8Khav/CoSs/wqFrf8Lhq7/C4av/wuHsf8LiLL/C4mz/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2N + uv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8PksX/D5TG/w+U + xv8PlMf/EJTH/xCUyP8Qlcj/EJXJ/xCVyf8Qlsr/EJbK/xCXy/8Qlsv/EJbL/xCXzP8Qlsz/EJfM/xGX + zP8RmM3/EZfN/xGXzf8RmM3/EZjN/xGXzf8Rl83/EZfN/xGXzf8Rl83/EZjN/xGYzf8Rl83/EZjN/xGY + zf8Ql8z/EJfM/xCWzP8Ql8z/EJfL/xCWy/8Ql8v/EJbK/xCWyv8Qlsn/EJbJ/xCVyP8Qlcj/D5TH/w+U + x/8Pk8b/D5PF/w+Txf8PksT/D5LD/w+Sw/8OkcL/DpHB/w6QwP8OkL//Do++/w6Pvf8Njrz/DY68/w2N + u/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8MibP/C4iy/wuIsf8Lh7D/C4av/wqFrv8KhK3/CoSs/wqF + q/8Kg6n/CYOo/wmBp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd9n/8IfqD/CH6h/wh/ + ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8KhKr/CoSr/wqErP8Kha3/C4av/wuHsP8Lh7H/C4iy/wuJ + s/8MibT/DIq1/wyKtv8Mi7f/DYy4/w2Nuf8Njbv/DY68/w2OvP8Oj73/DpC+/w6Qv/8OkMD/DpHB/w6R + wv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Txv8PlMf/EJXI/xCVyP8Qlcn/EJbK/xCWyv8Ql8v/EJbL/xCX + zP8Qlsz/EJfM/xGYzf8Rl83/EZfN/xGYzv8RmM7/EZjO/xGYzv8Rmc//EZnP/xGYz/8RmM//EZjP/xGY + z/8RmM//EZjP/xGYz/8RmM//EZjP/xGZz/8RmM7/EZjO/xGYzv8RmM7/EZjO/xGXzf8Rl83/EZjN/xCX + zP8Qlsz/EJbL/xCWy/8Qlsr/EJXK/xCVyf8Qlsn/EJXI/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S + w/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mi7f/DIq2/wyK + tf8MibT/C4iz/wuIsv8Lh7D/C4av/wqFrv8KhK3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiA + pP8IgKP/CH+i/wh+oP8Ifp//CH6g/wh+of8If6L/CICj/wmBpP8JgaX/CYKn/wmDqP8Jg6n/CoOq/wqF + q/8KhKz/CoWu/wuGr/8Lh7D/C4ex/wuIsv8MibP/DIq0/wyKtv8Mi7f/DIu4/w2Muf8Njbr/DY27/w2O + vP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Ux/8QlMf/EJXI/xCW + yf8Qlcn/EJbK/xCXy/8Ql8v/EJfM/xCXzP8RmM3/EZfN/xGYzv8RmM7/EZjO/xGYz/8Rmc//EZnP/xGa + 0P8RmdD/EZrQ/xGZ0P8RmdD/EZrR/xGa0f8RmdH/EZnR/xGZ0f8RmdH/EZrR/xGa0f8RmdD/EZnQ/xGZ + 0P8RmdD/EZnQ/xGa0P8Rmc//EZjP/xGZz/8RmM7/EZjO/xGXzf8Rl83/EZjN/xCXzP8Ql8z/EJbL/xCW + yv8Qlsr/EJbJ/xCWyf8QlMj/D5TH/w+Uxv8PlMb/D5PF/w+SxP8PksP/D5LD/w6Rwv8OkcH/DpDA/w6Q + v/8Oj77/DY69/w2OvP8Njbv/DY26/w2MuP8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsv8Lh7H/C4av/wuG + rv8Kha3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8IfqH/CH+i/wiA + o/8IgKT/CYGl/wmCp/8Jg6j/CYOp/wqDqv8KhKv/CoWt/wqFrv8Lhq//C4ew/wuIsf8LiLL/DIm0/wyK + tf8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+S + xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXI/xCVyf8Qlsr/EJbK/xCWy/8Ql8z/EJfM/xGXzf8Rl83/EZjO/xGY + zv8RmM//EZnP/xGZ0P8RmdD/EZnQ/xGZ0f8RmtH/EZrR/xKb0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa + 0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtH/EZrR/xGZ0f8RmtH/EZnQ/xGZ + 0P8RmtD/EZnP/xGZz/8RmM7/EZjO/xGXzf8RmM3/EJfM/xCWy/8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U + x/8Pk8b/D5TG/w+Sxf8PksT/D5LD/w6Swv8OkcH/DpDA/w6Qv/8OkL7/DY69/w2OvP8Njrv/DY26/w2M + uf8Mi7j/DIu3/wyKtv8MirT/C4mz/wuIsv8Lh7H/C4ew/wuGrv8Kha3/CoSs/wqFq/8KhKr/CYOp/wmC + p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqE + rf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyLt/8NjLn/DY26/w2Nu/8Njrz/DY69/w6P + vv8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJXI/xCWyf8Qlcr/EJfL/xCW + y/8Ql8z/EZjN/xGXzf8RmM7/EZjO/xGZz/8RmtD/EZnQ/xGZ0P8RmdH/EZrR/xKa0v8SmtL/EprS/xKa + 0/8SmtP/EpvT/xKb0/8Sm9T/EpvU/xKb1P8Sm9T/EpvU/xKc1P8SnNT/EpvU/xKb1P8Sm9T/EpvU/xKb + 1P8SnNT/EpvT/xKb0/8SmtP/EpvT/xKa0v8SmtL/EpvS/xGa0f8RmdH/EZnQ/xGZ0P8Rmc//EZjP/xGY + zv8RmM7/EZfN/xCXzP8Qlsz/EJbL/xCWyv8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S + w/8OkcL/DpHB/w6QwP8OkL//Do++/w2Ovf8Njrz/DY26/w2Nuf8Mi7j/DIu3/wyKtv8MirX/DImz/wuI + sv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqFq/8Kg6r/CYOp/wmCp/8Jgqb/CYGl/wiApP8If6L/CICj/wiA + pP8JgaX/CYGm/wmDqP8Jg6n/CoOq/wqEq/8KhK3/CoWu/wuGr/8Lh7D/C4iy/wuIs/8MibT/DIq1/wyK + tv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U + x/8Qlcf/EJXI/xCVyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZjP/xGZz/8RmdD/EZnR/xGa + 0f8SmtL/EprS/xKb0/8SmtP/EpvT/xKb1P8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc1f8SnNX/EpzW/xKc + 1v8SnNb/EpzW/xKc1v8SnNb/EpzW/xKc1v8Sndb/EpzV/xKc1f8SnNX/EpzV/xKd1f8SnNT/EpvU/xKb + 1P8Sm9P/EprT/xKa0v8SmtL/EprR/xGZ0f8RmdD/EZnQ/xGZz/8Rmc//EZjO/xGXzf8RmM3/EJbM/xCW + y/8Qlsr/EJbK/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Sw/8PksL/DpHB/w6QwP8OkL//Do++/w2O + vf8Njrz/DY27/w2Nuv8NjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqF + q/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKT/CYGl/wmCpv8Jg6j/CYOp/wqDqv8KhKv/CoSt/wqF + rv8Lhq//C4ew/wuIsv8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Muf8Njbr/DY68/w2Ovf8Oj77/DpC//w6Q + wP8OkcH/DpLC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCWyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGY + zv8RmM7/EZnP/xGZ0P8RmdD/EZnR/xKa0v8SmtL/EprT/xKb0/8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc + 1v8SnNb/Ep3W/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd + 1/8Tndf/E53X/xOd1/8Sndb/Ep3W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKb1P8SmtP/EprT/xKa + 0v8SmtH/EZnR/xGZ0P8RmtD/EZjP/xGYzv8Rl83/EZfN/xCXzP8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U + x/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvf8Njrz/DY27/w2Nuv8NjLn/DIu3/wyK + tv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha3/CoSs/wqFq/8KhKr/CYOo/wmBp/8Jgab/CYGl/wmA + pf8Jgab/CYKn/wmDqf8Kg6r/CoSr/wqFrf8Kha7/C4av/wuHsP8LiLL/C4mz/wyKtP8Mirb/DIu3/wyL + uP8Njbn/DY27/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCW + yf8Qlsr/EJbK/xCXy/8Ql8z/EZfN/xGYzv8Rmc//EZnP/xGZ0P8RmdH/EZrR/xKa0v8SmtP/EpvT/xKb + 1P8SnNT/EpzV/xKc1f8SnNb/Ep3W/xOd1/8Tndf/E53X/xOe2P8Tntj/E57Y/xOe2P8Tntn/E57Z/xOe + 2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntj/E57Y/xOe2P8Tntj/E53X/xOd + 1/8Tndf/E53W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKa0/8SmtL/EprS/xGa0f8RmdD/EZnQ/xGZ + z/8RmM7/EZfN/xGYzf8Ql8z/EJbL/xCWyv8Qlcn/EJXI/w+Ux/8PlMb/D5PF/w+SxP8PksP/DpHC/w6R + wf8OkMD/DpC//w6Pvv8Njrz/DY67/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuG + r/8Kha3/CoSs/wqEq/8KhKr/CYOo/wmCp/8Jgqb/CYKm/wmCp/8Jg6n/CoOq/wqEq/8KhKz/CoWu/wuG + r/8Lh7D/C4iy/wuJs/8MirT/DIq2/wyLt/8Mi7j/DY25/w2Nu/8Njrz/DY69/w6Qvv8OkMD/DpHB/w6R + wv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcn/EJbK/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZnP/xGZ + 0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzV/xKc1v8Sndb/E53X/xOd1/8Tntj/E57Y/xOe + 2f8Tntn/E57Z/xOf2v8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOf2/8Tn9v/E5/b/xOf + 2/8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOe2f8Tntn/E57Z/xOe2P8Tntj/E57Y/xOd1/8Tndf/Ep3W/xKc + 1v8SnNX/EpzV/xKb1P8Sm9P/EprT/xKa0v8RmtH/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Rl8z/EJfM/xCX + y/8Qlsr/EJXJ/xCUyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY27/w2N + uv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuGr/8Kha3/CoSs/wqEq/8Kg6n/CYKo/wmC + p/8Jgqf/CYOo/wqEqv8KhKv/CoSs/wqFrv8Lhq//C4ew/wuIsv8LibP/DIq0/wyKtv8Mi7f/DIy4/w2N + uv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8PlMb/D5TH/xCVyP8Qlsn/EJbK/xCX + y/8Ql8z/EZjN/xGXzf8RmM7/EZnP/xGZ0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzW/xKd + 1v8Tndf/E53X/xOe2P8Tntj/E57Z/xOe2f8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOg2/8UoNz/FKDc/xSg + 3P8UoNz/FKHc/xSh3P8Uodz/FKHc/xSh3P8Uodz/FKHc/xSg3P8UoNz/FKDc/xSg2/8ToNv/E5/b/xOf + 2/8Tn9r/E5/a/xOf2v8Tntn/E57Z/xOe2P8Tntj/E53X/xOd1/8Sndb/EpzW/xKc1f8SnNT/EpvU/xKa + 0/8SmtL/EZrR/xGa0f8RmdD/EZjP/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/xCVyP8PlMf/D5PG/w+T + xf8PksT/D5LD/w6Rwv8OkcH/DpC//w6Pvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuI + sv8Lh7H/C4ew/wuGrv8KhK3/CoSs/wqEqv8Jg6n/CYKo/wmCqP8Kg6n/CoSr/wqErP8Kha3/C4av/wuH + sP8LiLL/C4iz/wyKtP8Mirb/DIu3/wyMuP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S + xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJbM/xGXzf8RmM7/EZjP/xGZ0P8RmdH/EprR/xKa + 0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2P8Tntn/E5/a/xOf2v8Tn9v/E5/b/xOf + 2/8UoNz/FKDb/xSh3f8Uo9//E5/b/xKSyP8OgbL/C2mP/wlVdv8IQ1z/Bz9Y/wc/WP8IQlv/CExp/wpk + i/8Ne6r/EY/G/xOd2f8Uot7/FKHe/xSg3P8Uodz/FKHc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E5/a/xOe + 2f8Tntn/E57Y/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xGa0f8RmdD/EZnP/xGZ + z/8RmM7/EZjN/xCWzP8Ql8v/EJbK/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6Rwv8OkcH/DpDA/w6Q + vv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGrv8KhK3/CoWs/wqE + qv8Jg6n/CYOp/wqFq/8KhKz/CoWt/wuGr/8Lh7D/C4ix/wuIs/8MibT/DIq1/wyLt/8Mi7j/DY26/w2N + u/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJbL/xGX + zP8Rl83/EZjO/xGZz/8RmdD/EZrR/xKa0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe + 2f8Tntn/E5/a/xOf2/8Tn9v/FKDb/xSi3v8SmNH/CmOI/wMpOf8ACg3/AAQF/wALDv8ABAX/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAME/wAJDP8ABAX/AAoO/wEY + Iv8HQlz/EIzB/xSh3v8UoN3/FKHc/xSg3P8UoNv/E5/b/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd + 1/8SnNb/EpzV/xKc1P8Sm9P/EprT/xKa0v8RmdH/EZnQ/xGYz/8RmM7/EZfN/xCWzP8Qlsv/EJbK/xCW + yf8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyK + tv8MirX/DIm0/wuIsv8Lh7H/C4av/wqFrv8KhK3/CoSr/wqDqv8KhKr/CoWs/wqErf8Lhq7/C4ew/wuH + sf8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Nuf8Njbv/DY68/w6Pvv8OkL//DpDA/w6Rwf8PksP/D5LE/w+T + xf8PlMb/EJTH/xCWyf8Qlsr/EJbL/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc + 1P8SnNX/EpzW/xOd1/8Tntj/E57Y/xOe2f8Tn9r/E5/a/xOf2/8UoNz/EpjS/wdCW/8ABwn/AAcI/wAC + Av8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAgL/wAHCf8DJDL/DXmn/xSi + 3v8UoNz/FKDc/xOg2/8Tn9v/E5/a/xOe2f8Tntn/E57Y/xOd1/8Tndf/EpzW/xKc1f8Sm9T/EpvT/xKa + 0v8RmtH/EZnQ/xGZz/8RmM7/EZjO/xGXzP8Qlsv/EJbK/xCWyf8QlMj/D5TH/w+Txv8Pk8X/D5LE/w6R + wv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DImz/wuIsv8Lh7H/C4av/wqF + rv8KhKz/CoSr/wqFq/8KhK3/CoWu/wuGr/8Lh7H/C4iy/wyJtP8MirX/DIu3/wyLuP8Njbn/DY27/w2O + vP8Oj73/DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlcn/EJbK/xCWy/8Qlsz/EZfN/xGY + zv8Rmc//EZnQ/xGa0f8SmtL/EprT/xKb1P8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOf + 2/8Sls7/BDBC/wAEBv8AAgL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/BgYG/wQE + BP8CAgL/BwcH/wgICP8EBAT/AAAA/wAAAP8CAgL/BgYG/wgICP8FBQX/AgIC/wcHB/8DAwP/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAkM/wAICf8JVXb/FKHd/xSg2/8UoNz/E5/b/xOf + 2v8Tntn/E57Z/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpvU/xKa0/8SmtL/EZnR/xGZ0P8RmM//EZjO/xGX + zf8Qlsz/EJfL/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2N + uv8NjLn/DIu3/wyKtv8MirX/C4mz/wuIsv8Lh7D/C4av/wqGrv8KhKz/CoSs/wqFrv8Lhq//C4ex/wuI + sv8MibP/DIq1/wyKtv8Mi7j/DYy5/w2Nu/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+U + x/8Qlcj/EJbJ/xCWyv8Qlsv/EJfM/xGXzf8RmM7/EZnQ/xGZ0f8SmtL/EprT/xKb1P8SnNX/EpzV/xKd + 1v8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOh3f8KWXv/AAgK/wACAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8GBgb/BAQE/w4ODv89PT3/d3d3/5WVlf+dnZ3/np6e/52dnf+cnJz/nJyc/5ycnP+cnJz/nJyc/5yc + nP+cnJz/nJyc/52dnf+dnZ3/n5+f/5ycnP+NjY3/ZmZm/zU1Nf8EBAT/AQEB/wICAv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8ACAr/AAsP/w59rP8Uod3/FKDc/xOf2/8Tn9r/E57Z/xOe2f8Tntj/E53X/xKc + 1v8SnNX/EpzU/xKb0/8SmtL/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Ql8z/EJbL/xCWyv8Qlcj/D5TH/w+U + xv8PksX/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY27/w2Nuv8NjLn/DIu3/wyKtv8MirT/C4iz/wuI + sf8Lh7D/C4av/wqFrf8QiK//C4av/wuHsP8LiLL/C4iz/wyKtf8Mirb/DIu3/w2Muf8Njbr/DY68/w2P + vf8OkL//DpDA/w6Rwf8PksP/D5LE/w+Txf8PlMf/EJTI/xCWyf8Qlsr/EJbL/xGYzf8RmM7/EZjP/xGZ + 0P8RmdH/EprS/xKa0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tntn/E5/a/xOh3f8GOlH/AAYH/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AwMD/wYGBv8xMTH/goKC/52dnf+dnZ3/nJyc/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/5ycnP+dnZ3/m5ub/2tra/8cHBz/AgIC/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAI + Cf8ITWr/FKLe/xSg3P8Tn9v/E5/a/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGa + 0f8Rmc//EZjO/xGYzf8Qlsz/EJfL/xCWyv8Qlsn/D5TH/w+Uxv8PksX/D5LE/w6Rwv8OkcH/DpC//w6P + vv8Njr3/DY67/w2Nuv8NjLj/DIu3/wyKtf8MibT/C4iz/wuIsf8Lh7D/Coau/yaUt/8olbn/G5C3/wqI + sv8MirT/DIq2/wyLt/8NjLn/DY26/w2OvP8Njr3/Do++/w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TH/xCU + yP8Qlsn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8Sm9P/EpzU/xKc1f8Sndb/E53X/xOe + 2P8Tntn/E5/a/xOg2/8ITmv/AAcI/wAAAP8AAAD/AAAA/wAAAP8CAgL/BgYG/05OTv+bm5v/nJyc/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/lJSU/zg4OP8EBAT/AAAA/wAAAP8AAAD/AAAA/wAAAP8ABgf/B0Jc/xSh3f8ToNv/E5/b/xOf + 2v8Tntn/E57Y/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCV + yv8Qlsn/D5TH/w+Uxv8Pk8X/D5LE/w6Swv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuv8Mi7j/DIu3/wyK + tf8MibT/C4iy/wuHsf8Lhq//J5S4/yqXu/8rmLz/LJi+/yiXvv8Li7f/DIy4/w2Nuv8Njrv/DY69/w6P + vv8OkMD/DpHB/w+Sw/8PksT/D5LF/w+Txv8Qlcj/EJbJ/xCWyv8Qlsv/EZfN/xGYzv8RmM//EZnQ/xGa + 0f8SmtL/EpvU/xKc1f8SnNb/E53X/xOe2P8Tntn/E5/a/xOf2v8Qi7//AAkL/wAAAP8AAAD/AAAA/wAA + AP8EBAT/MDAw/5iYmP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+cnJz/nZ2d/56env+fn5//nJyc/5ycnP+Ojo7/FBQU/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAcK/wtjiP8UoNv/E5/b/xOf2v8Tntn/E57Y/xOd1/8Sndb/EpzV/xKc + 1P8SmtP/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJbL/xCVyv8Qlsn/D5TH/w+Uxv8Pk8X/D5LD/w6R + wv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuf8Mi7j/DIq2/wyKtf8MibP/C4iy/wuHsP8plrr/Kpe8/yyY + vf8umb//L5vB/zGdw/8yncT/EpC8/w2OvP8Oj77/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJXI/xCW + yf8Qlsr/EJbL/xGXzf8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb1P8SnNX/EpzW/xOd1/8Tntj/E57Z/xOf + 2v8Tn9v/BCc1/wACAv8AAAD/AAAA/wAAAP8CAgL/VFRU/56env+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/m5ub/52dnf+lpaX/r6+v/7m5uf/BwcH/xMTE/8fH + x//IyMj/yMjI/8jIyP/Hx8f/xMTE/8HBwf+6urr/srKy/6mpqf+goKD/nJyc/4aGhv87Ozv/FxcX/wcH + B/8DAwP/AQEB/wgICP8JCQn/DAwM/wQEBP8DAwP/BAQE/wQEBP8CAgL/CAgI/wMDA/8AAAD/AAAA/wAH + CP8TnNb/FKDb/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1P8Sm9P/EprS/xGZ0f8RmND/EZjP/xGX + zf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Rwv8OkMD/DpC//w6Pvf8Njrz/DY26/w2M + uf8Mi7f/DIq2/wyKtP8LiLP/C4ix/yqXu/8rl73/LZm+/y+bwf8wncP/M57E/zWgxv83osj/OaTK/x6W + w/8NkMD/DpHC/w+Sw/8Pk8X/D5PG/xCVyP8Qlcn/EJXK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EprS/xKa + 0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tn9r/E57a/wAHCf8AAAD/AAAA/wAAAP8BAQH/GRkZ/zU1 + Nf9tbW3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nJyc/52dnf+wsLD/xcXF/8rK + yv/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/IyMj/CAgI/wICAv8CAgL/BwcH/zs7O/9wcHD/mJiY/6ampv+qqqr/qKio/6io + qP+oqKj/qKio/6ioqP+qqqr/pqam/3l5ef8SEhL/BQUF/wAGB/8IVHP/FKDb/xOf2/8Tn9r/E57Z/xOe + 2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+U + xv8PksT/D5LD/w6Rwf8OkMD/Do++/w2Ovf8Njbv/DY26/w2MuP8Mi7f/DIq1/wyJtP8LiLL/Kpi8/yyZ + vv8um8D/MJzB/zKexP80n8X/N6LI/zijyf86pMv/O6XM/z6nzv8wocv/C5DE/w+Uxv8PlMf/EJbJ/xCW + yv8Ql8v/EZjN/xGYzv8RmM//EZnQ/xKa0v8SmtP/EpvU/xKc1f8Sndb/E53X/xOe2P8Tntn/E5/a/xKW + zv8ACAr/AAAA/wAAAP8AAAD/CAgI/zU1Nf81NTX/NTU1/zg4OP+ampr/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+cnJz/pKSk/8PDw//Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/5ycnP8GBgb/paWl/6io + qP+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en + p/+mpqb/CQkJ/wAAAP8BFR3/FKDd/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ + 0f8RmND/EZjP/xGXzf8Qlsz/EJbL/xCVyf8QlMj/D5TH/w+Txf8PksT/D5LD/w6Rwf8OkMD/Do++/w2O + vf8Njbv/DY26/wyLuP8Lirb/HpK6/yeXvP8smL3/LZm//y+bwf8xncP/NJ/F/zWgxv83osj/OaTK/zul + zP89ps3/P6jP/0Gq0P9Dq9L/QKrS/xGWyf8Qlsr/EJbL/xCXzP8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb + 1P8SnNX/Ep3W/xOd1/8Tntn/E5/a/xOf2/8Rkcf/AAYI/wAAAP8AAAD/AQEB/ykpKf81NTX/NTU1/zU1 + Nf81NTX/NTU1/zc3N/+dnZ3/nZ2d/52dnf+dnZ3/vb29/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/IyMj/CQkJ/zQ0NP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io + qP+oqKj/qKio/6ioqP+np6f/p6en/6ioqP+Xl5f/hoaG/6ioqP94eHj/AAAA/wAAAP8ACw//E57Z/xOg + 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCW + yf8QlMj/D5PG/w+Txf8PksT/DpHC/w6Rwf8OkL//Do++/wuNvP8ak77/LZvC/yqZwP8qmb//KJe9/yya + vv8umsD/MJ3C/zOexP80n8b/N6LI/zmjyf87pMv/PKbN/z+ozv9BqdD/Q6vS/0Wt1P9HrtX/SK/W/0qw + 2P8dnM//EZjO/xGYz/8RmdD/EZrR/xKa0/8Sm9T/EpzV/xKd1v8Tndf/E57Z/xOf2v8Tn9v/EpnS/wAH + CP8AAAD/AAAA/wEBAf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ZGRv+fn5//x8fH/8jI + yP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ysrP8HBwf/qKio/6io + qP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+pqan/hoaG/y8vL/8eHh7/JiYm/yUl + Jf+jo6P/qamp/wcHB/8AAAD/AAAA/wAAAP8ABgf/EpXN/xSg2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc + 1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJbK/xCWyf8Qlcj/D5TG/w+Txf8PksP/DZHC/xWT + wv8yoMj/MqDH/zCexv8uncP/LZvB/yqZwP8pmL7/LZm//y+bwf8yncP/NJ/F/zWgx/84osj/OaTL/zum + zP8+p87/QKjP/0Kq0f9ErNP/Rq7V/0iu1v9KsNj/TLLZ/0+z2v9RtNz/MabW/w6Y0f8SmtL/EpvU/xKc + 1f8Sndb/E53X/xOe2f8Tn9r/E5/b/xSg3P8ACg3/AAAA/wAAAP8ICAj/NTU1/zU1Nf81NTX/NTU1/zU1 + Nf81NTX/NTU1/zU1Nf81NTX/Q0ND/3x8fP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/IyMj/DQ0N/yIiIv+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en + p/+ioqL/MzMz/yUlJf8kJCT/JCQk/yQkJP8kJCT/Ghoa/6enp/9eXl7/AAAA/xISEv8BAQH/AAAA/wAA + AP8ABgj/EpPK/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8Rmc//EZjO/xGX + zf8Qlsv/EJbK/xCWyf8QlMf/EJTG/zOizf86ps7/OKTM/zaiyv80oMj/MZ/H/y+exf8tm8L/K5rB/yqZ + v/8umsD/MJ3D/zOexP80n8b/N6LI/zmkyv87pcz/PKbN/z+oz/9BqdD/Q6vS/0at1P9HrtX/SbDX/0ux + 2f9Ostr/ULTb/1G13f9Ttt7/V7jf/0qz3f8OmdT/EpzW/xOd1/8Tntn/E5/a/xOf2/8UoNv/AA4U/wAA + AP8AAAD/CQkJ/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pz8//0RERP9FRUX/RUVF/5CQ + kP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8XFxf8HBwf/oKCg/6io + qP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+hoaH/JCQk/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP9XV1f/p6en/wYGBv8CAgL/RUVF/zk5Of8BAQH/AAAA/wAAAP8ACAn/E5vW/xSg3P8Tn9r/E57Z/xOe + 2P8Tndf/EpzW/xKc1P8SmtP/EprS/xGZ0P8RmM//EZjO/xGXzP8Nlcv/LqLQ/0Kq0/8/qtL/PKfQ/zqn + z/85pc3/N6PL/zWhyf8zoMj/MJ7G/y+exP8tm8L/KpnA/y+cwf8ynsT/NJ/F/zahx/85osn/OqTL/zum + zf8/qM7/QanQ/0Or0v9ErNP/R63V/0iv1v9KsNj/TrPa/1C02/9QtNz/U7be/1W43/9XueD/Wrri/1q7 + 4/9au+P/GqHa/xSf2v8Tn9v/FKDc/wpafP8AAAD/AAAA/wgICP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1 + Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RkZG/5WVlf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/RUVF/wcHB/+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/MTEx/yUl + Jf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/6ampv+fn5//AQEB/ykpKf9FRUX/RUVF/0JC + Qv8CAgL/AAAA/wAAAP8ACg3/FKHd/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzV/xKb1P8SmtP/EpvS/w2X + 0P8koNL/SLDZ/0Wt1/9ErNb/QqvU/0Cq0/89qNH/PKfQ/zqmzv84pc3/NqLK/zShyf8yoMf/L53F/y2c + w/8rm8H/MJ3D/zOfxf81oMb/N6LI/zmky/87pcz/PabO/z+oz/9BqdH/Q6vS/0at1f9Irtb/SrDY/0yy + 2f9Ostr/ULTc/1G13f9VuN//Vrjg/1m64f9au+P/XLvj/1695P9hv+b/Y7/n/y6q3/8Rn93/AAgK/wAA + AP8BAQH/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zo6Ov9ERET/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/4mJif/IyMj/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf8FBQX/YGBg/6io + qP+oqKj/qKio/6ioqP+np6f/fX19/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8aGhr/p6en/zo6Ov8CAgL/RERE/0VFRf9FRUX/RUVF/0JCQv8BAQH/AAAA/wAAAP8ACQv/FKDc/xSg + 2/8Tn9r/E57Z/xOe2P8Tndf/EZzV/xuf1f9Ls93/TrTd/0uy2/9JsNr/SK/Y/0Wt1/9ErNX/QqvU/z+q + 0v88qNH/O6fP/zmmzv83pMz/NaLK/zOhyP8wnsb/Lp3E/y2bwv8ynsT/NJ/G/zahx/84osn/OaTL/zum + zf8/qM//QanQ/0Or0v9ErNP/Rq3V/0iu1v9KsNj/TrLa/1C13P9RtN3/VLfe/1a54P9YueH/Wrri/1y7 + 4/9evOT/YL7l/2K/5/9kwOj/ZcHp/xIlLf8AAAD/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1 + Nf9AQED/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/2RkZP/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/vb29/wkJCf+pqan/qKio/6ioqP+oqKj/qKio/ywsLP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/0xMTP+np6f/BgYG/xcXF/9FRUX/RUVF/0VF + Rf9FRUX/RUVF/z8/P/8CAgL/AAAA/wAAAP8GQlr/FKHd/xOg2/8Un9r/FZ/Z/0m14P9VuOL/U7fh/1G2 + 3/9Ptd7/TbTd/0uy2/9JsNr/R67Y/0St1v9DrNX/QKrT/z6p0v88qND/OqfP/zilzf81osv/NKLJ/zKg + x/8vncX/LZvD/zOfxf80oMf/N6LI/zmjyv86pcz/PafO/z+p0P9BqdH/Q6vT/0at1f9Irtb/SrDY/02z + 2v9PtNv/ULXc/1K13v9VuN//V7ng/1q64v9bu+P/Xbzk/2C+5f9hv+b/Y8Do/2XB6f9mwOb/AQYI/wAA + AP8YGBj/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/1BQUP/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9PT0//BQUF/6en + p/+oqKj/qKio/6ampv8fHx//JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/oKCg/6ampv8FBQX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/y0tLf8AAAD/AAAA/wAE + Bv8SmdP/PrHi/1295v9au+X/WLvk/1e54v9VuOL/Urfg/1C23/9OtN3/TLPc/0mw2v9IsNn/Ra3X/0St + 1v9Cq9T/QKvT/zyn0f87p8//OaTN/zajy/81osr/M6HI/zCfx/8unMT/M5/G/zWhx/84o8n/OaPL/zul + zf8/qM//QanR/0Or0v9FrNT/RqzV/0mv1/9Lsdj/TrLa/1C03P9RtN3/Vbff/1e54P9YuuH/Wrvj/1y7 + 4/9eveX/Yb/m/2PA5/9lwen/ZsPp/xYsNf8AAAD/AgIC/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ND + Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0pK + Sv+2trb/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/yMjI/woKCv9TU1P/qKio/6ioqP+ZmZn/JSUl/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yAgIP+oqKj/aWlp/wMDA/9ERET/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/w4ODv8AAAD/AAAA/wEHCf9gv+f/X77n/1y85v9avOX/V7rj/1a5 + 4v9TtuH/Ubbf/0+13v9Ns93/S7Hb/0mw2v9Hrtj/RK7X/0Kr1f9Aq9T/PqnS/zuo0P86ps//OKXN/zWi + y/8zocn/MqDH/y+dxf80oMf/N6LI/zmjyv86pcz/PafO/z+o0P9BqtH/Q6vT/0at1f9Irtb/SrDY/02y + 2v9PtNv/ULXd/1O23v9Vtt//V7ng/1q64v9cu+P/Xrzk/2C/5v9iv+f/ZMDo/2bD6v9pxOz/AgkM/wAA + AP8gICD/NTU1/zU1Nf81NTX/NTU1/zU1Nf9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0ZGRv9hYWH/ysrK/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Ly8v/DQ0N/6Oj + o/+oqKj/i4uL/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/Kysr/6enp/8YGBj/FxcX/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wIC + Av8AAAD/AAAA/0eOrP9gv+j/Xr7n/1u85f9Zu+T/V7nj/1a44v9StuD/ULXf/06z3f9Mstz/SrHa/0iv + 2f9Grtf/RK3W/0Kr1P9AqtP/PKjR/zqmz/84o83/NqPM/zWiyv8zocj/MJ7G/zWgx/84osn/OaPL/zul + zf8+qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9Lsdj/TrLa/1C03P9RtN3/VLff/1a44P9YuuH/W7vj/128 + 5P9fvuX/YcDn/2PA6P9lwen/aMLq/ztuhf8AAAD/AQEB/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pj4+/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9KSkr/mZmZ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/7W1tf8EBAT/qKio/4KCgv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9ubm7/qKio/wMDA/87Ozv/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Ozs7/wAAAP8AAAD/AggK/2DA6f9fv+j/XL3m/1q8 + 5f9XuuT/Vrni/1S34f9RtuD/T7Xe/02z3f9Lsdv/SbDa/0ev2P9Erdf/QqzV/0Cr1P8+qdL/O6jR/zml + zv83pMz/NaLL/zOhyf8xn8f/N6LI/zmjyv86pMz/PKbO/z+p0P9BqtH/Q6vT/0at1f9Hrdb/SbDY/02x + 2f9Ps9v/ULTd/1O23v9Vt9//V7nh/1q64v9cu+P/Xr3l/2C+5v9iwOf/ZMHp/2bD6v9owun/AgoM/wAA + AP8TExP/NTU1/zU1Nf81NTX/NTU1/zg4OP9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RERE/0JCQv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/SEhI/62t + rf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/VFRU/yIi + Iv+Kior/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/6Kiov+np6f/CQkJ/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9ERET/CQkJ/wAAAP8AAAD/Tpy+/2DA6f9ev+f/W7zm/1m85f9XueP/Vbji/1K34P9Qtd//TrTe/0yy + 3P9Jsdv/R6/Z/0Wv2P9DrNb/QazV/z+q0/88qdH/OqXP/zilzf81osz/NKLK/zKgyP84o8n/OaPL/zul + zf89qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9LsNj/TrHa/1C03P9RtN3/VLff/1a34P9YuuH/W7vj/128 + 5P9fvub/Yb/n/2PB6P9lwun/aMLq/2rF7P8CCQz/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/RERE/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zU1Nf82Njb/NjY2/zU1Nf8/Pz//RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0dHR/+SkpL/ysrK/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9ISEj/CgoK/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/qamp/46Ojv8DAwP/RERE/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9CQkL/AQEB/wAAAP8EDBD/YMDp/1+/ + 6P9dvuf/Wrzl/1e55P9WueP/VLfh/1C24P9PtN7/TbPd/0qx2/9IsNr/Rq/Y/0St1/9CrNX/QKvU/z2p + 0v86p9D/OKTO/zekzP81osv/M6HJ/zijyv85o8v/O6bN/z6o0P9BqtH/Q6vT/0Wt1f9Hrdb/SbDY/0yx + 2f9Ostv/ULTc/1O23v9Vt9//V7jh/1q74v9cvOT/Xr3l/2C/5v9iwej/ZcHp/2bC6v9pw+v/S4yp/wAA + AP8CAgL/NTU1/zU1Nf81NTX/NTU1/0NDQ/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP81NTX/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9ISEj/W1tb/7a2tv/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/0lJ + Sf8AAAD/JCQk/yQkJP8hISH/GRkZ/ykpKf86Ojr/RERE/0hISP9ISEj/SEhI/0ZGRv8/Pz//NjY2/yws + LP8kJCT/Gxsb/xkZGf8AAAD/BAQE/wsLC/8MDAz/ExMT/xoaGv8nJyf/MjIy/zw8PP9BQUH/RERE/0VF + Rf9FRUX/RUVF/0RERP8ICAj/AAAA/wIICv9hwer/YMDp/16/6P9cveb/Wbvl/1e55P9VuOL/Urfh/1C1 + 3/9OtN7/S7Lc/0mx2/9Hr9n/RK7Y/0Os1v9BrNX/P6rT/zuo0f85pc//N6TN/zWjy/8zosr/OaPK/zqk + zP89qM//P6nQ/0Gq0v9ErNT/Rq3V/0iu1/9KsNj/TbHa/0+z2/9RtN3/VLff/1a44P9YuuL/Wrvj/128 + 5P9fvub/Yb/n/2PA6P9lwen/aMPq/2rD6/8XKzX/AAAA/xQUFP81NTX/NTU1/zU1Nf88PDz/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ODg4/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/0ND + Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP88PDz/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0hI + SP9NTU3/h4eH/8DAwP/Ly8v/ycnJ/8jIyP/Jycn/gICA/wAAAP8gICD/sLCw/7u7u/+6urr/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+6urr/urq6/7u7u/+8vLz/vLy8/7q6 + uv+0tLT/paWl/319ff9MTEz/Nzc3/wwMDP8MDAz/BgYG/woKCv8BAQH/AQEB/zk5Of8AAAD/AAAA/zVo + f/9gwOn/X7/o/12+5/9avOb/V7rk/1a54/9TuOH/ULXg/0603v9Ns93/SrHb/0iw2v9Fr9j/RK3X/0Gs + 1f8/qtT/PKjS/zqlz/84pM7/NqPM/zSiyv85o8v/O6XN/z6o0P8/qdH/QqvT/0Ss1P9Grtb/SK/Y/0ux + 2f9Os9v/ULTc/1K13v9Vt9//V7jh/1m74v9bvOT/Xr3l/2C/5/9iwOj/ZMHp/2bC6v9ow+v/a8Xs/wMK + Df8AAAD/MDAw/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP81NTX/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/RERE/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/zY2 + Nv82Njb/Ojo6/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0xMTP9HR0f/SUlJ/1lZ + Wf9ubm7/AwMD/0VFRf+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/7q6 + uv+7u7v/vb29/w0NDf8DAwP/RUVF/wICAv8AAAD/BAwQ/2HA6f9gwOj/Xb/o/1u95v9YuuX/V7rk/1S5 + 4v9Rt+H/T7Xf/0203v9Lstz/SLHb/0ev2f9Ertj/QqzW/0Cr1P89qdL/OqbQ/zmlz/83pM3/NKPL/zmk + zP88ps7/P6nQ/0Cq0v9Dq9P/Ra3V/0eu1/9KsNj/TLLa/06z2/9QtN3/U7be/1W34P9XueL/Wrvj/1y8 + 5P9evub/Yb/n/2PA6P9lwun/Z8Tr/2rE7P9tyPD/AwwP/wICAv82Njb/NTU1/zU1Nf9CQkL/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1 + Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/QUFB/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/Q0ND/zc3N/81NTX/NTU1/zU1Nf81NTX/Ojo6/0NDQ/8NDQ3/Dg4O/7q6uv+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8nJyf/Pz8//CgoK/xcXF/9FRUX/Ghoa/wAA + AP8BBwn/Y8Ps/2DA6f9fv+j/Xb7n/1m75v9XuuT/Vrnj/1O44f9QteD/TrTe/0yz3f9Jstv/R7Da/0Su + 2P9Crdf/QKvV/z6p0/87qNH/OaXP/zekzv81pMz/OaTM/z2nz/8/qdH/QavS/0Ss1P9Frtb/SK7X/0uw + 2f9Nstr/T7Pc/1K13v9Ut9//Vrjh/1i64v9avOT/Xb3l/1+/5/9hv+f/Y8Hp/2XC6v9oxOv/asbt/2rB + 6P8AAwT/AQEB/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9ERET/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/OTk5/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2 + Nv82Njb/NjY2/zY2Nv81NTX/RERE/0VFRf9FRUX/RERE/zk5Of82Njb/NjY2/zY2Nv82Njb/NjY2/zY2 + Nv82Njb/NjY2/zU1Nf8HBwf/uLi4/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8DA + wP/Pz8//0NDQ/5mZmf8CAgL/RERE/0VFRf9BQUH/AAAA/wADA/9guuH/YcHq/1+/6P9dv+j/W73n/1e7 + 5f9WuuT/U7ni/1C24f9Otd//TbTe/0qy3P9Hsdr/Ra/Z/0Ot1/9BrNb/P6rU/z2o0v86ptD/OKXO/zaj + zP87pc3/PafP/z+p0f9Bq9P/RK3V/0au1v9Ir9j/S7La/06z2/9QtN3/Urbe/1W44P9XueH/Wbrj/1y9 + 5P9evub/Tpm4/yM4Qf9kwen/Z8Pr/2nE7P9rxu3/XKjJ/wAAAP8FBQX/NTU1/zU1Nf9DQ0P/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP83Nzf/NjY2/zY2Nv82Njb/NjY2/zU1 + Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VF + Rf8+Pj7/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/yAgIP8bGxv/urq6/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/76+vv/Pz8//0NDQ/9DQ0P/Ly8v/CgoK/0RERP9FRUX/RUVF/0RE + RP8BAQH/AAAA/z9/mv9iwer/YMDp/16+6P9bvef/WLvm/1a65P9VueP/Urjh/0+14P9NtN7/S7Pd/0ix + 2/9GsNn/RK7Y/0Ks1v9Aq9X/PajS/zqm0P84pc//N6TN/zymzv8+qND/QKnR/0Os1P9ErNX/Rq7X/0qw + 2f9Mstr/TrPc/1C03f9Stt//Vbjg/1e54v9avOT/XL3l/16/5/8OExT/EA8P/xcpMf9oxev/asbt/2zG + 7f9BeZH/AAAA/wUFBf8sLCz/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0RERP84ODj/NjY2/zY2Nv81NTX/RUVF/0VFRf9FRUX/RUVF/0RERP82Njb/NjY2/zY2 + Nv82Njb/NjY2/zY2Nv82Njb/NTU1/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv82Njb/KCgo/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf93d3f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8HBwf/Pz8//0NDQ/9DQ + 0P/Q0ND/zc3N/w0NDf9DQ0P/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/Hj1K/2PC6/9gwOr/Xr/o/1y+ + 5/9avOb/V7vl/1a64/9TuOL/ULbg/0613/9Ms93/SbLc/0ew2v9Er9n/Qq3X/0Cr1f89qdP/O6fR/zml + z/83pM7/PKbO/z+p0P9AqtL/RK3U/0Wu1v9Irtf/SrHZ/02z2/9Ps9z/UbXe/1O33/9WueH/WLrj/1q8 + 5P9dvub/LFVn/xAQEP8QEBD/EA8P/xgqMv9qxez/bcfu/ypNXP8AAAD/Ghoa/zU1Nf8hISH/BAQE/ysr + K/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/RUVF/0RE + RP9FRUX/RUVF/0VFRf9FRUX/QUFB/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv81NTX/RUVF/0VF + Rf9DQ0P/NjY2/zY2Nv82Njb/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Xl5e/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/urq6/8bGxv/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8HBwf8LCwv/RERE/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/GRkZ/wAAAP8BBQb/Y8Lr/2HB6v9fv+n/Xb7o/1u95/9XuuX/Vrrk/1O54/9QtuH/TrXf/0y0 + 3v9Kstz/R7Hb/0Wv2f9Drdf/QKvV/z6p0/89qNL/OabQ/zekzv88p8//P6jR/0Gr0/9ErdX/Rq7W/0iw + 2P9Lstr/TbPb/1C03f9St9//VLfg/1e54v9Zu+P/W7zl/16/5/8QEhL/EBAQ/xAQEP8QEBD/EA8P/xgq + Mf9ux+7/JUVT/wAAAP8kJCT/NTU1/0RERP9FRUX/RUVF/zExMf8ICAj/HR0d/0NDQ/9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf89PT3/NjY2/zY2 + Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9FRUX/RUVF/z8/P/82Njb/NjY2/zMzM/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2tra/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/vb29/83Nzf/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8/P + z/+EhIT/CgoK/z4+Pv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf8xMTH/AAAA/wEHCf9kw+z/YsLr/1/A + 6v9dv+j/W73n/1i75f9WuuT/VLnj/1K44v9OtuD/TbXf/0uz3f9Isdv/RbDa/0Ou2P9BrNb/P6rU/z2o + 0v86ptD/OKXP/z2nz/8/qNH/QqzT/0St1f9Grtf/SbHZ/0uy2v9Os9z/ULTd/1K23/9VuOH/V7ni/1q7 + 5P9cveX/W7je/w0TFP8QEBD/EBAQ/xAQEP8QEBD/EBAP/xYnLv8cND//AAAA/ysrK/87Ozv/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/Pz8//xYWFv8AAAD/AAAA/yIiIv9ERET/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/PT09/0VF + Rf9FRUX/PT09/zY2Nv82Njb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/x8fH/8/P + z//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/JSUl/w8PD/81NTX/NjY2/zU1Nf89PT3/RERE/0VF + Rf9FRUX/RUVF/0BAQP8AAAD/AQUG/2XF7v9jw+z/YMHq/16/6f9bvef/Wbvm/1e75f9UueP/Urji/0+3 + 4f9NtN//S7Pd/0iy3P9GsNr/RK/Z/0Kt1/8/qtT/PanT/zqn0f84pc//PajQ/z+p0f9DrNT/RK3W/0au + 1/9JsNn/TLPb/0603P9QtN7/Urfg/1W54f9XuuP/Wrvk/1y85f9fvub/YcDo/0B4j/8LDg//EBAQ/xAQ + EP8QEBD/EBAQ/wIEBP8AAAD/Li4u/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9BQUH/AgIC/wAAAP8AAAD/AAAA/wYGBv8rKyv/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PDw8/zY2 + Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf8+Pj7/NjY2/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP+7u7v/u7u7/7q6uv/Dw8P/z8/P/8/Pz//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//nZ2d/wsL + C/8rKyv/NTU1/zY2Nv82Njb/NjY2/zY2Nv87Ozv/RUVF/0VFRf9FRUX/RERE/wICAv8EDBD/Z8bv/2PD + 7P9hwev/X7/p/1y+6P9avOb/V7rl/1a65P9TueP/ULfh/0214P9MtN7/SbPc/0ew2/9Er9n/Qq3X/0Cr + 1f89qNP/O6fR/zim0P8+p9D/QKrS/0Ot1P9Erdb/R6/Y/0qx2f9Ms9v/T7Td/1C13v9Tt+D/Vbni/1i6 + 4/9au+T/Xb7m/2C/5/9hwOj/ZMLq/2fD6/9fsdb/Gisx/xASEv8QEBD/AgIC/wAAAP8uLi7/RERE/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yEhIf8AAAD/AAAA/wAA + AP8AAAD/AAAA/x8fH/9FRUX/RUVF/0VFRf9BQUH/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/Nzc3/0VF + Rf9FRUX/RUVF/0FBQf8pKSn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/Pz8//z8/P/9DQ0P/Q0ND/0NDQ/9DQ + 0P/Q0ND/0NDQ/9DQ0P/Pz8//xsbG/xMTE/8ICAj/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2 + Nv9ERET/RUVF/0VFRf9FRUX/AwMD/wEHCf9lw+z/ZMLs/2LC6/9fwOr/Xb7o/1q95/9Xu+X/Vrnk/1O5 + 4/9RuOL/TrXg/0yz3v9Ks93/R7Db/0Sv2f9CrNf/QKvV/z6q1P88qNL/OKbQ/z6o0f9Bq9P/Q6zU/0Wu + 1/9IsNj/SrHa/0203P9PtN3/Tq/W/0CKp/8yZnv/JElZ/yFFVP8dO0j/GjQ+/xkwOv8aMTr/HTVA/yJB + Tv8nSVj/LlNj/0BxiP8LFRn/AAAA/zIyMv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf85OTn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DAwM/zo6 + Ov82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xQUFP/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//xcXF/x4eHv8EBAT/AAAA/wIC + Av8mJib/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zc3N/9FRUX/RUVF/0RERP8AAAD/AQUG/2bC + 7P9kw+z/YsLs/1/A6v9dv+n/W73n/1i75v9WuuT/U7nj/1G44v9OtOD/TLPe/0q03f9Hsdv/RK/Z/0Kt + 1/9ArNb/PqrU/zyo0v85p9H/PqjR/0Kr0/9ErNX/Ra3X/0mx2f9Lsdr/TbPc/0+13f8JDxH/EBAQ/xAQ + EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wUFBf8AAAD/LCws/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/yMjI/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/Kysr/zY2Nv82Njb/Pj4+/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5ycnP/Q0ND/0NDQ/8/P + z//R0dH/i4uL/wgICP8NDQ3/dHR0/35+fv81NTX/BwcH/wAAAP8BAQH/MDAw/zY2Nv82Njb/NjY2/zY2 + Nv82Njb/NTU1/0RERP9FRUX/RUVF/wEBAf8BBAX/ZsPs/2TD7f9iwuz/YMHr/12/6f9bvej/Wbzm/1a6 + 5f9TueP/Ubfi/0614P9MtN//SrPd/0ix2/9FsNr/Q67Y/0Gr1v8+qtT/PKnT/zqn0f8/qdH/QqrT/0Os + 1f9Frtf/SbDZ/0uy2/9NtNz/SrLb/wwPDv8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ + EP8QEBD/EBAQ/xAQEP8QEBD/CAgI/wAAAP8dHR3/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ICAg/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkJCf9CQkL/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/1ZWVv8+Pj7/DAwM/w0NDf8MDAz/gYGB/+Pj4//f39//29vb/9zc + 3P/b29v/wMDA/wkJCf8BAQH/KCgo/zY2Nv82Njb/NjY2/zY2Nv82Njb/RUVF/0VFRf9FRUX/AQEB/wAE + Bv9Muun/YcLs/2TC7P9gwev/Xb/q/1u+6P9ZvOf/Vrrl/1S65P9SuOL/T7bg/0203/9LtN7/SLDb/0Ww + 2v9Drtj/QazW/z+q1f89qNP/OqfR/xWWyP8Qlcj/C5PJ/w6Vy/8Rl83/EpnP/xGZ0f8SmtL/EDZC/xAQ + EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8LCwv/AAAA/xUV + Ff9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0FBQf8EBAT/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/GRkZ/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYG + Bv9TU1P/7e3t//7+/v/////////////////+/v7///////X19f/b29v/29vb/ywsLP8BAQH/NDQ0/zY2 + Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf8BAQH/AAcJ/xal5f8VpeT/FqTj/xCh4f8UouD/Iafh/0Cz + 4/9TueX/Vbrk/1K34v9QtuH/TbTf/0u03v9Jstz/RbDa/0Ou2P9Crdf/P6vV/z2p0/87qNL/D5TH/xCW + yf8Qlsr/EJfM/xGYzv8Rmc//EZnR/xKa0/8RdJz/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ + EP8QEBD/EBAQ/xASEf8QHyX/EmKF/w4ODv8AAAD/BAQE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/Kysr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/6enp//7+/v/ExMT/Wlpa/7y8vP/+/v7///////// + ///////////////////r6+v/29vb/yIiIv8GBgb/NTU1/zY2Nv82Njb/NTU1/0RERP9FRUX/RERE/wAA + AP8ACxD/Fqjp/xWl5f8VpOP/FaTi/xSi4P8Uod//FKHd/xSg3P8Un9r/EJ3Y/xKc1/8dodj/Nqva/0Ww + 2/9GsNr/Q67Z/0Gt1/8/q9X/ParU/zuo0v8PlMf/EJXJ/xCXy/8Ql8z/EZjO/xGZ0P8RmtH/EprT/xKb + 1P8QFBX/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBMU/xAgJf8Tir3/FZ3Z/xARD/8QDxD/EBAQ/wAA + AP8CAgL/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8iIiL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP/+/v7/h4eH/wAAAP8AAAD/AAAA/3Nzc//////////////////////////////////t7e3/29vb/wsL + C/81NTX/NjY2/zY2Nv83Nzf/RUVF/0VFRf9FRUX/AwMD/wAGBv8Wp+j/FaXl/xWl5P8VpOL/FaPh/xSi + 3/8Uod7/FKDc/xOf2/8Tntn/E53X/xKc1v8Sm9T/EprS/xKZ0f8Pl87/D5jN/xmazf8qoc//N6bR/xCU + x/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa0v8Sm9P/EpvU/xASD/8QEBD/EBAQ/xAQEP8QFBX/EBkc/xOD + s/8VpeP/FaXk/xE1Qv8QEhP/EBAQ/xAQEP8QEBD/AAAA/wMDA/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PT09/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//7+/v8QEBD/AAAA/wAAAP8AAAD/DAwM//7+ + /v/////////////////////////////////b29v/ERER/y0tLf82Njb/NjY2/0FBQf9FRUX/RUVF/0RE + RP8CAgL/AAcK/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc + 1P8SmtP/EZnR/xGZz/8RmM7/EJbM/xCWyv8Qlsn/EJXI/xCVyf8Ql8v/EZfN/xGZz/8RmdD/EprS/xKc + 1P8SnNX/EV57/xARDv8QLDX/EoW1/xSi3/8Uod7/FKLg/xSZ0/8QFRX/EBAQ/xAQEP8QEBD/EBAQ/xAR + Ev8ACQ3/AAAA/0FBQf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RESP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/xkZGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD//v7+/xAQEP8AAAD/AAAA/wAAAP8ODg7//v7+//////////////////////////////////X1 + 9f9TU1P/ICAg/zY2Nv81NTX/RERE/0VFRf9FRUX/QEBA/wAAAP8ACQz/Fqbm/xam5v8VpeT/FaTj/xWj + 4f8UouD/FKHe/xSh3f8Tn9v/E5/a/xOe2P8Sndb/EpzV/xKa0/8RmtH/EZrQ/xGYzv8Ql8z/EJbK/xCW + yf8Qlcj/EJbK/xCWy/8Rl83/EZjP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh + 3v8SY4T/EBMU/xAQEP8QEBD/EBAQ/xAQEP8QEA//E2GC/wc7Uv8AAAD/KCgo/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/Xl5e/wEBAf8HBwf/Dg4O/+7u + 7v///////////////////////////////////////////1dXV/8kJCT/NjY2/0JCQv9FRUX/RUVF/0VF + Rf8wMDD/AAAA/wY4T/8Wp+f/Fqbm/xWl5P8VpOP/FaTi/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xOe + 1/8SnNX/EpvT/xKa0f8RmdD/EZjO/xCXzP8Ql8v/EJXJ/xCVyP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa + 0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/EV9//xAPD/8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAT + E/8Xqer/EYi9/wAAAP8KCgr/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/2xsbP/+/v7///////////////////////////////////////// + ///+/v7/MDAw/zExMf85OTn/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/DnWj/xan5/8Wpub/FaXl/xWk + 4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCW + y/8Qlsn/EJXI/xCVyv8Ql8z/EZfN/xGZz/8RmdH/EprS/xKc1P8SnNb/E53X/xOe2f8Tn9v/FKHc/xSh + 3v8Uod//EBUV/xAQEP8QEBD/EBAQ/xAQEP8QFRb/Fabn/xep6/8Xqez/AAgL/wEBAf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8zMzP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsL + C/9/f3///v7+//////////////////////////////////7+/v8JCQn/Nzc3/0VFRf9FRUX/RUVF/0VF + Rf9ERET/AgIC/wAEBf8VpeX/Fqfo/xam5v8VpeX/FaTj/xWk4v8UouD/FKHf/xSh3f8UoNz/E5/a/xOe + 2P8Tndf/EpzV/xKc1P8SmtL/EZnQ/xGYzv8RmM3/EJbL/xCWyf8Qlcj/EJbK/xCXzP8RmM7/EZnP/xGZ + 0f8Sm9P/EpzU/xKc1v8Tntj/E57Z/xOf2/8UoNz/FKHe/xSi4P8TgrL/EBAR/xAQEP8QEBD/EBAP/xNg + gf8WqOr/F6nr/xep6/8ACQz/AAAA/0JCQv9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8iIiL/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/QUFB/yEhIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/kJCQ//7+/v////////////// + ////////oKCg/xkZGf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8CAgL/AAME/xan6f8Wp+j/Fqbm/xWl + 5f8VpeT/FaTi/xWj4f8Uod//FKHd/xSg3P8Tn9r/E57Z/xOd1/8SnNX/EpvU/xKa0v8RmdD/EZnP/xGX + zf8Ql8v/EJXJ/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/EpzW/xOe2P8Tntn/E5/b/xSh + 3f8Uod7/FKLg/xWj4f8SWnf/EA8P/xAQEP8QEBD/Fqfo/xao6v8XqOv/F6ns/wY3Tv8AAAD/HBwc/0VF + Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/zMzM/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/xwc + HP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KCgr/AgIC/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DQ0N/56env/+/v7///////X19f8NDQ3/RERE/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/Pj4+/wAAAP8BFyD/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh3/8Uod7/FKDc/xOf + 2v8Tntn/E53X/xKc1f8Sm9T/EpvS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJbJ/xCWyv8Qlsz/EZjO/xGZ + z/8RmtH/EprT/xKc1P8Sndb/E57Y/xOe2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWj4v8RO0v/EBUX/xWl + 5f8WqOn/Fqjq/xeo6/8Xqez/FJnW/wAAAf8DAwP/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/KCgo/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/0VFRf9ERET/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woK + Cv+0tLT/CwsL/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8YGBj/AAAA/w96qv8WqOn/Fqfo/xan + 5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh3v8UoNz/E5/a/xOe2f8Tndf/Ep3W/xKb1P8SmtL/EZnQ/xGZ + z/8Rl83/EJbL/xCWyv8Qlsn/EJbK/xCXzP8RmM7/EZnP/xGa0f8SmtP/Ep3V/xKd1v8Tntj/E57Z/xOf + 2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWk4/8Vntr/Fqfn/xao6f8WqOr/F6nr/xep7P8Xq+//AAYI/wEB + Af9DQ0P/RUVF/0VFRf9FRUX/AAAA/wAAAP8BAQj/ISOo/wAAAP8AAAD/AAAA/wAAAP86Ojr/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf86Ojr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9ERET/RUVF/0VFRf9ERET/ICAg/wEB + Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/Ojo6/0RERP9FRUX/RUVF/0VF + Rf9FRUX/RERE/wICAv8ACg3/F6rs/xao6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg + 3P8Tn9r/E57Z/xOd1/8SnNb/EpvU/xKa0v8RmtH/EZjP/xGYzf8Qlsv/EJbK/xCWyf8Qlsr/EJfM/xGY + zv8Rmc//EZrR/xKa0/8SndX/Ep3W/xOe2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWj4f8VpOP/FaXk/xam + 5v8Wp+f/Fqjp/xao6v8Xqev/F6rt/xeq7v8EKDn/AAAA/xkZGf9FRUX/RUVF/0VFRf8UFBT/AAAA/wAA + AP8fIZ3/KizQ/xgZev8AAAD/AAAA/wAAAP8zMzP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8BAQH/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/BAQE/0FBQf9ERET/RUVF/0VFRf9AQED/AAAA/wESGf8XqOr/Fqfp/xan + 6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSi3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1v8Sm9T/EprS/xGa + 0f8RmM//EZjN/xCWy/8Qlsr/EJbJ/xCWyv8Ql8z/EZjO/xGZz/8RmtH/EprT/xKd1f8Sndb/E57Y/xOe + 2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWk4/8VpeT/Fqbm/xan5/8WqOn/Fqjq/xep6/8Xqu3/F6ru/xSa + 2f8AAAH/AQEB/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8qLND/KizQ/ygqyv8AAAD/AAAA/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/MzMz/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RERE/xQUFP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/woK + Cv9ERET/RERE/w8PD/8AAAD/EYm//xep6/8WqOn/Fqfo/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh + 3v8UoNz/E5/a/xOe2f8Tndf/EpzW/xKb1P8SmtL/EZrR/xGYz/8RmM3/EJbL/xCWyv8Qlsn/EJbK/xCX + zP8RmM7/EZnP/xGa0f8SmtP/EpzU/xKd1v8Tntj/E57Z/xOf2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWl + 5P8Wpub/Fqfn/xao6f8WqOr/F6jr/xep7P8Xqu7/G6zv/wIICf8AAAD/NjY2/0VFRf9FRUX/RUVF/zMz + M/8AAAD/AAAA/yos0P8sLtb/KizR/ykrz/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AwMD/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wEBAf8RERH/PDw8/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zMz + M/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/z09Pf8DAwP/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAv8hISH/AgIC/wAICv8Xqu3/F6nr/xao + 6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg3P8Tn9r/E57Z/xOd1/8Sndb/EpvU/xKa + 0v8RmdD/EZjP/xGXzf8Qlsv/EJbK/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/Ep3W/xOe + 2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWk4f8VpOP/FaXk/xam5v8Wp+f/Fqfo/xao6v8XqOv/Eqjs/2nI + 8/94zvb/O2R3/wAAAP8CAgL/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/FRZo/yst0/8sLtb/KizQ/yIk + rf8AAAD/AAAA/wcHB/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf8WFhb/AAAA/wAAAP8AAAD/AQEB/xAQEP88PDz/RERE/0VFRf9FRUX/RUVF/0VF + Rf9CQkL/IiIi/wcHB/8RERH/MzMz/0VFRf8EBAT/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8MDAz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CVBx/xeq7P8Xqev/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh + 3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJXI/xCW + yv8Ql8z/EZjO/xGZz/8RmdH/EpvT/xKc1P8SnNb/E57Y/xOe2f8Tn9v/FKDc/xSh3v8UouD/FaPh/xWk + 4/8VpeT/Fqbm/xan5/8Wp+j/F6jq/ze07f90zPT/d871/3jP9v980Pf/AwoN/wAAAP8/Pz//RUVF/0VF + Rf9FRUX/AAAA/wAAAP8QEVT/KizQ/ywu1v8sLtb/KizQ/w0OQ/8AAAD/AAAA/zg4OP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8CAgL/FBQU/z09 + Pf9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP84ODj/AwMD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEHCf9Cu/L/GKrs/xap + 6/8Wp+n/Fqfo/xam5v8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3f8UoNz/E5/a/xOe2f8Tndf/EpzV/xKb + 1P8SmtL/EZnQ/xGZz/8Rl83/EJfL/xCVyf8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8Sm9P/EpzU/xKc + 1v8Tndf/E57Z/xOf2/8Uodz/FKHe/xSh3/8Vo+H/FaTi/xWl5P8VpeX/Fqfn/xSm6P9uyfH/csvz/3TM + 9P92zfT/eM/2/3vO9f8dMTv/AAAA/wYGBv9ERET/RUVF/0VFRf8AAAD/AAAA/wICC/8qLND/LC7W/ywu + 1v8qLND/KizQ/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/DAwM/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Kk5d/27K9P9nxvL/Eqbq/xao6f8Wp+j/Fqbm/xWl5f8VpOP/FaTi/xSi + 4P8Uod//FKHd/xSg3P8Tn9r/E57Y/xOd1/8SnNX/EpzU/xKa0v8RmdD/EZjO/xGYzf8Qlsv/EJbJ/xCV + yP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/FKHf/xWj + 4f8VpOL/FaXk/xOk5f9Tvuz/bMjw/27I8f9xy/P/c8z0/3XN9P93zvX/ec/2/3rN8/8CBwj/AAAA/z4+ + Pv9FRUX/RUVF/wAAAP8AAAD/DxBP/yos0P8sLtb/LC7W/yst0v8qLND/HiCY/wAAAP8AAAD/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/yIiIv8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9ERET/NDQ0/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wIJC/9wzPb/bcr0/2zI + 8v9qx/H/Gajp/xan6P8Wpub/FaXl/xWk4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc + 1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCWy/8Qlsn/EJXI/xCWyv8Qlsv/EZjN/xGYz/8RmdD/EprS/xKb + 1P8SnNX/E53X/xOe2f8Tn9r/FKDc/xSh3v8Uod//FaPh/xWk4v8kquX/Z8Xu/2nG7/9rx/D/bsfx/3DJ + 8v9yzPP/dMz0/3fO9f94zvb/e9D2/xIgJ/8AAAD/AQEB/0RERP9FRUX/AAAA/wAAAP8VFmj/KizQ/y0v + 1v8xM9f/Ky3T/yos0f8qLND/AAAA/wAAAP8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/ERER/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsL + C/8AAAD/AAAA/wAAAP8AAAD/Q3qT/3DL9P9tyvT/bMjy/2jG8f9lxvH/RLjr/xem5v8VpeT/FaTj/xWk + 4v8UouD/FKHf/xSh3f8ToNv/E5/a/xOe2P8Tntf/EpzV/xKb0/8Sm9L/EZnQ/xGYzv8Rl8z/EJfL/xCV + yf8Qlcj/EJXJ/xCXy/8Rl83/EZnP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh + 3/8RoeD/XcDr/2TC7P9mxO7/acbv/2vH8P9tyPH/b8ny/3LL8/90zPT/ds31/3fO9v97z/b/es3z/wIH + CP8AAAD/MzMz/0VFRf8AAAD/AAAA/yos0P8qLNL/MTPX/zY42f8sLtb/Ky3U/yos0P8RElX/AAAA/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/QEBA/wAAAP8AAAD/MjIy/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zg4OP8BAQH/AAAA/wIIC/9wyvT/bsr0/23J + 8/9rx/L/aMbx/2XF8P9kxO//YMLt/xGi5P8VpOP/FaPh/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xKd + 1v8SnNX/EprT/xGa0f8RmtD/EZjO/xCXzP8Ql8v/EJbJ/xCUx/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa + 0v8Sm9P/EpzV/xOd1/8Tntj/E5/a/xSg2/8Uod3/O7Hk/17A6v9hwev/Y8Ls/2bE7f9oxu//asfw/23I + 8f9uyfL/ccrz/3LL9P91zfX/d872/3nO9v980Pf/HjQ+/wAAAP8DAwP/Ly8v/wAAAP8AAAD/KizQ/yst + 1f82N9n/NjjZ/ywu1v8tL9b/Ky3U/yos0P8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/DQ0N/wAA + AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RERE/wICAv8CBQf/bcLq/3DL9f9tyvT/bMnz/2rI8v9nxvH/ZcXw/2PE7/9gwu3/XsDs/x6n + 5P8Vo+H/FKLg/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCW + yv8Qlsn/D5TH/xCVyf8Ql8v/EJfM/xGYzv8RmdD/EZrR/xKa0/8SnNX/Ep3W/xOe2P8Tn9r/GKHc/1q8 + 5/9cvuj/XsDq/2DB6/9iwuz/ZMPt/2fF7/9px/D/a8fw/23J8v9wyvP/csvz/3TM9P9Jf5f/CQ8S/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8qLND/LC7W/zY42f82ONn/LC7W/zEz1/8sLtb/KizQ/wAA + AP8AAAD/IiIi/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8ICAj/AAAA/zFZbP9yy/X/b8r0/23K + 9P9syfP/acjy/2bG8f9lxvD/YsPu/1/B7f9dwOz/W7/r/0W25v8Uot//FKHe/xSh3P8Tn9v/E57Z/xOd + 1/8SnNb/EpzU/xKa0v8RmdH/EZnP/xGXzf8Ql8z/EJXK/xCVyP8PlMf/EJbJ/xCWyv8Ql8z/EZjO/xGZ + z/8RmtH/EprT/xKc1P8SnNb/D5zX/0u14v9WuuX/WLvm/1u96P9dv+n/X8Hr/2LC7P9kw+3/ZsXu/2jG + 7/9rx/D/bcjx/2/K8/9xyvP/HDM9/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAE/yos + 0P8tL9b/NjjZ/zY42f8wMtf/NjjZ/zEz1/8qLND/AAAA/wAAAP8GBgb/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8jIyP/AAAA/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9ERET/HBwc/wAAAP8CBQb/csz1/3DL9f9tyvT/bMr0/2rI8v9nxvH/Zcbx/2PF8P9hw+7/X8Ht/13A + 7P9bv+v/WL7p/1S76P8RoN3/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8RmM//EZjN/xCW + y/8Qlsr/EJTI/w+Ux/8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8SmtL/EpvU/yml2f9Qt+L/U7jj/1a7 + 5f9Xu+b/Wr3o/1y/6f9ewOr/YcHr/2PD7f9lxO7/Z8Xv/2nG8P9rx/H/bsny/3DJ8/8AAAD/AAAA/wAA + AP8AAAH/AwMP/wAAAP8AAAD/AAAA/wAAAP8VFmj/Ky3T/zM01/82ONn/NjjZ/zQ22P82ONn/NjjZ/yst + 0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP83Nzf/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zc3N/8AAAD/AggL/3PN9v9zzPb/b8v1/23K + 9P9syfP/acfy/2bF8f9lxPD/Y8Tv/2DC7v9dwOz/XMDr/1q/6/9Xven/Vbzo/1O65v8jpt3/E5/a/xOe + 2P8Tndf/EpzV/xKb0/8SmtL/EZnQ/xGYzv8Rl83/EJfL/xCVyf8Qlcj/D5TG/xCUyP8Qlsr/EJbL/xGY + zf8RmM//EZnQ/xKa0v9LtN7/TbTg/1C34f9TuOP/Vbrk/1e85v9Zvef/W77p/12/6v9gwOv/YsLs/2TE + 7v9mxe//acfw/2rH8f9tyfL/b8nz/wAAAP8AAAD/AAAA/woLNf8rLdT/Ky3T/ywu1v8sLtb/FRZm/xUW + aP8rLdX/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/LC7W/xMUY/8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/zU1Nf8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE + RP9JSUn/AgIC/wIFB/9mtdr/c832/3DM9f9uyvT/bMr0/2rJ8/9pyPL/ZcXx/2TE8P9ixO//X8Ht/13A + 7P9cv+v/Wb/q/1a96f9Uu+f/Urrm/1C45P9BsuH/E57Y/xKd1v8SnNX/EpvT/xKa0f8RmdD/EZjO/xGX + zP8Ql8v/EJXJ/xCUx/8PlMb/EJXI/xCVyf8Qlsv/EZjN/w+Xzv84qdf/SbLc/0u03v9NtN//T7bh/1G4 + 4v9TueT/Vrvl/1i95/9bvej/Xb/q/1/A6/9hwuz/Y8Pt/2XF7/9nxe//acbw/2zJ8f9uyfL/T4+s/wAA + AP8AAAD/AAAA/wAAAP8sLtb/KizP/ywu1v8sLtb/KSvL/ywu1v8xM9f/NjjZ/zEz1/82ONn/NjjZ/zY4 + 2f8sLtb/FRZo/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/w8P + D/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9KSkr/TExM/wICAv8AAAD/SH+Z/3PN9/9zzPb/b8v1/23K + 9P9syvT/asnz/2bF8f9lxPD/Y8Xw/2HD7v9ewe3/XMDs/1q/6/9Yvur/Vbzo/1S75/9SueX/T7jk/0y2 + 4v9KteH/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Uxv8PlMf/EJXJ/xCX + y/8cnM7/Q63Y/0Sv2v9HsNv/SrLd/0y03/9OteD/Ubfi/1O54/9VuuX/V7zm/1m96P9bvun/Xr/q/2DB + 6/9iw+3/ZMTu/2bF7/9px/D/a8fx/23J8v9vyfP/ccr0/xwzPf8AAAD/AAAA/wAAAP8rLdX/Ky3T/ywu + 1v8oKsj/Ky3T/ywu1v82ONn/LC7W/ywu1v82ONn/NjjZ/ywu1v8VFmj/AAAA/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/zQ0NP9FRUX/RUVF/0VFRf9ERET/UFBQ/0xM + TP8CAgL/AAAA/zNcb/9zzPb/c8z2/3HN9v9uy/X/bMn0/2rI8/9px/L/ZcXx/2TE8P9ixO//YMLu/13B + 7f9cv+v/Wb/q/1e96f9VvOj/Urrm/1G55f9Ot+P/S7Xi/0q04P9Hs9//JKPX/xKa0v8RmdH/EZjP/xGX + zf8Ql8z/EJXK/xCVyP8PlMf/D5PF/w+Ux/8Olcj/O6jT/0Cr1v9Crdj/RK7Z/0ev2/9Jsdz/S7Pe/021 + 4P9PtuH/Urjj/1S55P9Wu+b/WL3n/1u+6f9dv+r/X8Dr/2HC7P9jxO7/ZcXv/2fF7/9px/H/a8ny/23J + 8v9wyvP/csv0/1eZt/8AAAD/AAAA/xUWaf8qLM7/LC7W/ygqx/8qLND/LC7W/zQ22P8sLtb/LC7W/zY4 + 2f82ONn/LC7W/xMUYf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAA + AP8AAAD/AAAA/0VFRf9ERET/TU1N/1FRUf9ISEj/AgIC/wAAAP8eNED/dM32/3PN9/9xzPb/b8v1/23J + 9P9syfT/asnz/2fG8v9lxPD/Y8Tw/2HD7/9ewu3/XMDs/1u/6/9Zvur/Vbzp/1S75/9Suub/T7jk/0y2 + 4/9LteH/SbPg/0ax3v9EsNz/PKzZ/xCY0P8Rmc//EZfN/xCWy/8Qlsr/EJTI/w+Uxv8Pk8X/J53L/zuo + 0v89qtT/P6vV/0Ks1/9Drtn/RbDa/0ix3P9Ks97/TLTf/0+24f9Rt+L/U7nk/1W75f9XvOf/Wb7o/1u+ + 6f9dv+r/X8Hs/2LD7f9kxO7/ZsXv/2jG8P9qyPH/bcny/27K8/9wyvT/csz1/wAAAP8AAAD/AAAA/yst + 0v8sLtb/Ky3U/ykrzP8sLtb/LC7W/zI01/8sLtb/NjjZ/zY42f8sLtX/AAAH/wAAAP8AAAD/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/FxcX/1FRUf9RUVH/Nzc3/wIC + Av8AAAD/HzdB/3XO9/9zzff/csz2/3HN9v9tyvT/bMn0/2rI8/9ox/L/ZcXx/2TE8P9ixO//YMPu/13B + 7f9cwOz/Wb7q/1e96f9VvOj/U7vn/1G55f9Ot+T/TLbi/0u04f9ItN//RbHe/0Ow3P9Brtr/P63Z/xKY + zv8Rl8z/EJfL/xCWyf8Qlcf/D5TG/zakzf84ptD/OqjS/zyp0/8+qtX/Qa3X/0Kt2P9Ertr/R7Db/0qy + 3f9MtN//TbXg/1C34v9SueP/VLnl/1a75v9Yvej/W77p/12/6v9ewOv/YcLt/2PE7v9lxe//Z8bw/2nH + 8f9ryPL/bcjy/2/K8/9xy/T/c8z1/wAAAP8AAAD/KCrE/yst0v8sLtb/KCrH/yos0P8sLtb/NjjZ/ywu + 1v82ONn/NjjZ/yst0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wAAAP8AAAD/UVFR/yMjI/8AAAD/AAAA/zNcbv92zvf/dM33/3PM9v9xzPb/bsr0/0WM + pf9artH/acjy/2fG8f9lxfH/Y8Tw/2DD7/9ewu7/XMDs/1q/6/9Yver/Vrzp/1S86P9Suub/ULnl/0y3 + 4/9LteL/SrTg/0ay3/9EsN3/Qq/b/0Cu2v8+rNj/PKvX/yOf0P8Qlsr/EJbJ/w+Ux/8Pk8X/NaPN/zel + z/85p9H/O6nT/z2p1P9ArNb/Qq3Y/0Su2f9FsNv/SLLd/0qz3v9MtOD/T7bh/1G44/9TueT/Vbvm/1e9 + 5/9Zvuj/W77p/13A6/9fwez/YsPt/2XE7v9mxe//aMXw/2nH8f9syPL/bcnz/3DK9P9xy/X/AAAA/wAA + AP8FBRv/KizO/ywu1v8sLtb/KCrH/yst0/8sLs//Ky3S/zY42f82ONn/KizR/wAAAP8AAAD/IiIi/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/R0dH/1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAF + B/9Jf5j/ds/4/3TO+P9zzff/ccz2/3DM9v9tyvX/S5aw/0WOp/9Djaf/QYuj/0mZtv9bt+D/YMTv/13B + 7f9cwOv/Wb7q/1e96f9VvOn/U7vn/1G65v9PuOT/TLbj/0u14f9JtOD/RbLe/0Ow3f9Cr9v/P63Z/z6r + 2P88q9b/OajU/zOm0v8PlMj/D5TG/w+Txf80osz/NqTO/zim0P87qNL/PanU/z6r1v9Brdf/Qq3Z/0Sv + 2v9Isdz/SrPe/0u03/9OtuH/ULji/1K45P9UuuX/Vrzn/1i96P9avun/Xb/q/17A6/9gwu3/YsPu/2XE + 7v9mxfD/Y73l/zVkef8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8rLdX/KizQ/ywu1v8rLdL/KCrJ/ywu + 1v8sLtb/LC7O/zAyyP8pK87/AAAA/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/SUlJ/1FR + Uf9RUVH/UVFR/wAAAP8AAAD/AAAA/wAAAP8ABwn/FZfU/0O99v90zvj/c8z3/3LM9v9wzPb/bcr1/2zJ + 9P9Vpsf/RI2n/0OMpv9Bjab/QIuk/z+LpP8+i6T/PImh/zuJo/9Cl7b/S6jO/1C13/9Suub/ULrm/0y2 + 5P9LteL/SrTg/0ey3v9FsN3/QrDb/0Cu2v8+rNj/PazX/zqq1v84p9T/M5/I/yuLq/8ObYv/DGiF/zSj + zP82o83/N6bQ/zmn0f87qdP/ParV/0Gt1/9Crtj/Q67a/0ax2/9Isd3/SrPf/0y04P9OtuL/Ubjj/1O5 + 5f9Vu+b/V7vn/1m96P9bvun/XcDr/1/B7P8xYXb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wsLN/8qLM//KizQ/ywu1v8pK8z/LC7W/ywu1v8sLtb/LC7W/ywu1v8ICSv/AAAA/wAA + AP8AAAD/AAAA/wAAAP80NDT/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9ERET/TU1N/1FRUf9RUVH/UVFR/1FRUf9QUFD/Dg4O/wAAAP8AAAD/AAgK/xmu + 8/8YrfT/Ga3z/3DL9v9yzPb/ccz2/27M9v9syfT/a8jz/1+33f9Djab/Qo2m/0GMpf8/iqT/Pouk/z2K + o/87iKL/Ooeh/zmGoP84hqD/NoWf/zWFnv8zg53/MoKb/zB/mf8vfpf/LHyW/yx8lv8qfJb/KXuU/yd3 + kf8meZL/JXiS/yR4kf8edZD/QnF//2JiYv+5ubn/MqLL/zSjzf82pM7/OKbR/zup0/88qdT/P6vW/0Gu + 2P9Crtn/RK/b/0iy3P9Jst7/TLTf/0214f9Pt+L/Ubjk/1S65f9WvOf/WLzo/1q+6f8BAgP/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8cHBv/HB0b/xwdG/8cHRv/HB0b/y4wrf8qLM//KizO/yst + 0f8pK8v/KizO/yst0v8sLtb/LC7W/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/IyMj/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9HR0f/UFBQ/1FRUf9RUVH/UVFR/1FR + Uf9QUFD/MzMz/wMDA/8AAAD/AAMF/wc3Tv8ZrvT/GK30/xit8/8YrfL/Eqry/3DL9v9uzPX/aGVl/21n + Zv9mdn7/ZajE/0KNpf9AjKb/QIqj/z+LpP8+i6T/PIqj/zqHof85h6H/OIag/zeFn/82hp//NIOd/zKD + nf8xgZv/MIKb/y6Amf8tfpn/LH2X/yp7lv8pe5T/JXmU/yx5kP9RcXv/YWFg/5ubm//5+fn/+fn5//X1 + 9f8xocr/NKPM/zajzv83ptD/OafR/zuq1P89qtX/QazX/0Kv2f9Dr9r/RrHc/0iz3f9KtN//TLXg/062 + 4v9QuOP/Urnl/1S65f8vZn7/AAAA/wAAAP8AAAD/AAAA/wAAAP8jJCL/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zg5PP8rLdT/KizO/ywu1v8sLtb/KizR/yoszv8qLM7/Ky3U/ywu + 1v8sLtb/LC7W/x4glv8AAAD/AAAA/wAAAP8AAAD/AAAA/yIiIv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/0VF + Rf9OTk7/UVFR/1FRUf9RUVH/UVFR/1FRUf9RUVH/RUVF/wMDA/8AAAD/AAAA/wAKDv8Vnt3/Ga70/xit + 9P8YrfP/GK7z/xis8v8YrPH/LbLx/23K9f9pdnv//v7+//7+/v/8/Pz/zc3N/4eHh/9nZGP/Ymhp/191 + e/9Te4j/R4CT/0CDmf86g5z/N4Se/zSEnf8ygZz/MoKb/zGAmv80f5f/N3yS/z94iv9Rc37/YWxu/2Bf + Xv+BgoH/0NDQ//7+/v/+/v7///////39/f/6+vr/9fX1/zCgyv8zo8z/NaPN/zalz/85ptH/OqnT/z2q + 1f8/rNb/Qa3Y/0Ku2f9Er9v/R7Ld/0my3v9LtOD/TbXh/0+34/9RuOT/ESYv/wAAAP8AAAD/AAAA/xsc + G/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/KizQ/yst0v8sLtb/LC7W/ywu1v8qLM//KizO/yst0v8sLtb/LC7W/ywu1v8mKLz/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/IiIi/zo6Ov9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RkZG/05OTv9RUVH/UVFR/1FRUf9RUVH/UVFR/1FRUf9QUFD/QkJC/wMD + A/8AAAD/AAAA/wAHCv8IQl3/GbD2/xmu9f8YrfT/GK3z/xiu8/8YrPL/GKzx/xir8P8Xq+//YMXz/2mg + uP/v7+////////////////////////7+/v///////v7+//7+/v/z8/P/5eXl/9TU1P/Hx8f/v8DA/7y8 + vP+/v7//xMTE/9HR0f/j4+P/8vLy//7+/v/+/v7//v7+/////////////////////////////f39//n5 + +f/19fX/L6DJ/zGhy/80pM3/NqTO/zel0P85qNL/O6nU/z2r1v9Ardf/Qq7Z/0Ov2v9GsNz/SLLd/0q0 + 3/9MteD/Trbi/xQtOP8AAAD/AAAA/wAAAP85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/y0tK/8sLtb/LC7W/yoszv8qLND/LC7W/ywu + 1v8sLtb/Ky3T/yoszv8qLND/LC7W/ywu1v8sLtb/LC7W/wICC/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yYm + Jv9RUVH/UVFR/1FRUf9RUVH/LS0t/wMDA/8AAAD/AAAA/wADBP8CGib/GK3z/xmv9f8ZrvX/GK30/xit + 8/8YrvP/GKzy/xis8f8YrPD/F6vv/xer7/8Uqe7/acDn/7Ozs/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////f39////////////////////////9/f3/+fn5//X19f8unsj/MKHK/zOjzP80pM7/NqXP/zmm + 0f87qdP/PKrV/z+s1v9Brdj/Qq/a/0Sv2/9Hst3/SLLe/0q14P85iKj/AAAA/wAAAP8MDAz/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/JiYk/ygqsv8wMtf/LjDW/yos0f8qLM7/KizO/yst0v8uMNb/NjjZ/zEz1/8rLdL/KizO/yst + 0v8sLtb/LC7W/ywu1v8WF2v/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAD + Bf8BExz/F6Tn/xmv9f8ZrvX/Ga/1/xit9P8YrfP/GK7z/xis8v8YrPH/GKzw/xis8P8Xq+//F6ru/xeq + 7f8Zq+7/fX+A//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////8AAAD/YGBg//////////////////39 + /f/5+fn/9fX1/y2ex/8voMn/MaHL/zSkzf81pM7/N6bQ/zmo0v87qdT/PavW/z+s1/9Brtn/Qq/a/0Ww + 3P9Ist3/SbPf/wAAAP8AAAD/AAAA/zk6N/85Ojf/OTo3/zk6N/85Ojf/Ozw5/0JDQP9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9CQ0D/PD06/zk6N/85Ojf/OTo3/zk6N/8xMS//Gxsa/x8gTv8zNdj/NjjZ/ywu + 1v8qLNH/KizO/yoszv8qLM7/Ky3U/zEz1/82ONn/LjDW/yos0P8qLM7/Ky3S/ywu1v8sLtb/LC7W/ywu + 1v8sLtb/Ky3S/xcYcv8WF2v/Fhdr/xUWav8SE1r/Cgoz/wYHIv8FBRz/Bwck/woKMv8RElb/FRZq/wQE + Ff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcwRP8ZsPb/Ga71/xmv9f8YrfT/GK3z/xiu + 8/8YrPL/GKzx/xis8P8YrPD/F6vv/xep7v8Xqe3/F6ns/xSo7P9jY2P//v7+//////////////////// + ////////AAAA//////////////////////////////////////////////////////////////////// + ////////AAAA/wAAAP8AAAD/mZmZ/////////////f39//n5+f/19fX/LJ3G/y6eyP8woMr/MqPM/zSk + zv82pM//OabR/zqo0/87qdT/PqzW/0Gt2P9Cr9r/RK/b/0ax3P9Cps7/AAAA/wAAAP8yMzH/OTo3/zk6 + N/85Ojf/Ozw5/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JD + QP85Ojf/OTo3/zk6N/8xMS//ICAf/xsbGv8nKaX/MzXY/zY42f8uMNb/Ky3U/yoszv8qLM7/KizO/yos + 0f8sLtb/NDbY/zM02P8sLtb/KizR/yoszv8qLM7/KizP/yst0v8sLtX/LC7W/ywu1v8sLtb/LC7W/ywu + 1v8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu1v8sLtb/LC7W/zc4Sf85Ojf/JSUk/xUVFP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DFZ6/xit8/8YrvP/GKzy/xis8f8YrPD/GKzw/xer7/8Xqe7/F6nt/xep + 7P8XqOv/F6jp/2RgX/////////////////////////////////8AAAD/AAAA//////////////////// + ////////////////////////////////////////Pz8//wAAAP8AAAD/AAAA/wAAAP8AAAD///////// + ///9/f3/+fn5//T09P8rnMX/LZ7H/y6fyf8xocv/M6PN/zWlz/83ptD/OafS/zup1P88qtX/P6zX/0Gt + 2f9Cr9r/RbHc/yNYbv8AAAD/AAAA/z5dev85Ojf/OTo3/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/80NTL/MDAu/xsb + Gv8bGxr/Jiid/zAy1/82ONn/MzXY/ywu1v8rLdT/KizP/yoszv8qLM7/LC7W/zQ22P82ONn/NjjZ/zEz + 1/8sLtb/Ky3S/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yst + 0v8rLdL/MjOG/zk6N/85Ojf/OTo3/zk6N/85Ojf/LzAt/wkKCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wlC + Xf8YrPH/GKvw/xes8P8Xq+//F6nu/xep7f8Xqez/F6jr/xao6v8Xp+j/aWNi//7+/v////////////// + ////////Pz8//wAAAP8AAAD/AAAA/wAAAP9/f3//////////////////////////////////Pz8//wAA + AP8AAAD/WVlZ//////////////////////////////////z8/P/5+fn/9PT0/ymbxP8sncb/Lp7I/zCh + yv8yosz/NKTO/zakz/83ptH/OafS/zup1P8+q9b/QK3Y/0Gu2f9Cr9v/AAAA/wAAAP8AAAD/RH64/zk6 + N/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6N/85Ojf/MjIw/y8vLf8bGxr/Gxsa/yAhWP8sLtb/MTPX/zY4 + 2f82ONn/MTPX/ywu1v8rLdP/Ky3S/y4w1v82ONn/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/NjjZ/zU3 + 2P8zNdj/MDLX/y0v1v8tL9b/LjDW/y8x1v8rLdP/KizO/ygqx/8dHkD/MjIw/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/8vMC3/AAAA/wAAAP8AAAD/AAAA/wAAAP8Pb5v/F6vv/xeq7v8Xqe3/F6ns/xeo + 6/8WqOr/Fqjp/xao6P9qbGz//v7+//////////////////////8AAAD/AAAA/zMzM/9sbGz/AAAA/wAA + AP8AAAD/AAAA/wAAAP9/f3///////8rKyv8zMzP/c3Nz//////////////////////////////////// + /////////Pz8//n5+f/09PT/KZzE/yucxf8tnsf/Lp7J/zGiy/8zo83/NKTO/zal0P84p9L/OqjT/zup + 1f8+qtb/Qa7Z/0Ku2v8AAAD/AAAA/xoaGf9Hjtb/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf85Ojf/ODk2/zExL/8xMS//JiYk/xsbGv8bGxr/Hh4+/yYonf8sLtb/MTPX/zU32P82ONn/NjjZ/zY4 + 2f82ONn/NjjZ/zY42f82ONn/MTPX/yst0/8qLM7/KizO/yoszv8qLM7/KizO/yoszv8rLdT/Ky3V/yMk + d/8bGxr/Gxsa/y8vLf80NDL/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wwM + C/8AAAD/AAAA/wAAAP8AAAD/F6nt/xep7P8XqOv/Fqjq/xao6f8Wp+j/Fqfn/2dvcf/+/v7///////// + /////////////7a2tv////////////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA + AP9mZmb/8vLy/////////////////xkZGf/////////////////8/Pz/+Pj4//T09P8omsL/KZvE/yyd + xv8tnsj/L6DK/zKizP80pM7/NaXP/zem0f85p9L/OqnU/z2q1f8+rNf/Qa3Z/wAAAP8AAAD/DQ0M/1CR + 0f9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zg5Nv8xMS//MTEv/zEx + L/8mJiX/Gxsa/xsbGv8bGxr/Gxsa/xwcKP8jJHj/IyR3/ygqtf8rLdb/LC7W/ywu1v8sLtb/Ky3V/ygq + sP8jJHf/IyR4/x0dM/8bGxr/Gxsa/xsbGv8lJST/Li4s/zExL/80NDL/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/wAAAP8AAAD/F6nr/xan + 6v8WqOn/Fqfo/xan5/8Wpub/ZHF2//7+/v////////////////////////////////////////////// + ////////Pz8//wAAAP8AAAD///////////9/f3//AgIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//// + //////////////z8/P/4+Pj/9PT0/yeYwf8pnMT/KpzF/yyex/8unsn/MKHL/zKizf80pM7/NqXQ/zem + 0f85qNP/O6nU/z6q1v8/rNf/AAEB/wAAAP8AAAD/Q0RB/1Sn+/9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zs8Of85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//Li4s/yYm + JP8mJiT/JCQj/yIiIP8hIR//JSUj/yYmJP8mJiT/JiYl/zAwLv8xMS//MTEv/zExL/8xMS//MTEv/zU1 + M/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/8SEhL/AAAA/wAAAP8AAAD/Fqfp/xan6P8Wp+f/Fqbm/xam5f9icnj//f39//// + ////////////////////////v7+//wAAAP9/f3//KCgo/wAAAP8AAAD/kJCQ//////////////////// + //////////////////+ZmZn/AAAA/wAAAP8AAAD//////////////////Pz8//j4+P/09PT/JpjA/yeZ + wv8pnMT/K53G/yyeyP8unsn/MaHL/zOjzf80pM//NqXQ/zin0v86qdP/O6nV/z6r1v8kY3z/AAAA/wAA + AP9DREH/Q0NA/1Sn+/9Up/v/T4rF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9AQT7/OTo3/zk6N/85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zEx + L/8xMS//MTEv/zU1M/83ODX/OTo3/zk6N/85Ojf/Pj88/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/QEE+/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8qKyn/AAAA/wAA + AP8AAAD/Fqfn/xam5v8VpeX/FaXk/2Nwdf/9/f3///////////////////////////9dXV3/AAAA/wAA + AP8AAAD/rKys////////////f39//wAAAP8AAAD/AAAA/wAAAP88PDz/////////////////Hh4e/wAA + AP/////////////////8/Pz/+Pj4//Pz8/8lmL//J5jB/yibw/8pnMX/LJ7H/y2fyP8vn8r/MqLN/zOj + zv81pM//NqbR/zmn0v86qNT/O6rV/z6r1/8AAAD/AAAA/wAAAP9DREH/Q0RB/0+Ozf9Up/v/VKf7/0+R + 0v9DQ0D/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf8+Pzz/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/89Pjv/Pj88/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf8+Pzz/OTo3/zk6N/85Ojf/OTo3/zk6N/8kJCL/AAAA/wAAAP8LU3P/FaXl/xWl5P8VpeP/ZW9y//7+ + /v////////////////////////////////8AAAD/AAAA/////////////////wAAAP8AAAD/AAAA/z8/ + P/8/Pz//Pz8//wAAAP////////////////////////////////////////////z8/P/4+Pj/8/Pz/yOX + vv8mmMD/J5nC/ymcxP8qncb/LJ7H/y6eyf8wocv/MqLN/zSkz/81pdD/NqbR/zmn0/86qNT/PKrW/y6A + of8AAAD/AAAA/wAAAP9DREH/Q0RB/0NEQf9Pj8//VKf7/1Sn+/9Up/v/S3We/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/1hZVv/w8PD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/85Ojf/OTo3/zk6 + N/8AAAD/AAAA/wAAAP8VpeT/FaTj/xWj4f9qbW3//v7+/////////////////////////////////wAA + AP9oaGj/////////////////KCgo/6Ghof//////v7+//7+/v/+ioqL//////1NTU/////////////// + /////////////////////////Pz8//j4+P/z8/P/Ipa9/ySXv/8mmMH/J5nC/ymcxf8rncb/LJ7I/y6f + yv8woMv/MqLN/zSkz/81pdD/N6bS/zmo0/86qdX/ParW/w8qNf8AAAD/AAAA/wAAAP8iIiH/Q0RB/0NE + Qf9DREH/Sm2O/1Sn+/9Up/v/VKf7/1Sn+/9HXXD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/cnNw//////90dHL/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/w97qv8VpOL/FqPg/2to + aP/+/v7///////////////////////////////////////////////////////////9/f3//WVlZ/3h4 + eP8AAAD/JCQk/wAAAP+UlJT/AAAA///////////////////////////////////////8/Pz/9/f3//Pz + 8/8hlLv/I5a+/yWYwP8mmMH/KJrD/ymbxf8rncf/LJ7J/y6fyv8xosz/MqLN/zSkz/82ptH/N6fS/zmp + 1P86qdX/PavW/yt4lv8AAAD/AAAA/wAAAP8AAAD/ICAf/0NEQf9DREH/Q0RB/0NEQf9LdZ3/VKf7/1Sn + +/9Up/v/S3Wd/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf////////////////9vcG7/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH///////// + //9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6 + N/85Ojf/OTo3/wAAAP8AAAD/Axki/xWj4f8Wot//amNi//7+/v////////////////////////////// + /////////////////////////////1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/zs7O/+RkZH///////// + //////////////////////////////v7+//39/f/8/Pz/yCTuv8hlLz/I5e//yWYwP8nmcL/KZzE/yqd + xv8snsf/LJ/J/y+gy/8xocz/MqLN/zSl0P82ptH/N6jT/zmp1P87qtX/PavX/z6r2P8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8yMzH/Q0RB/0NEQf9DREH/REpM/1Om+v9Up/v/VKf7/0dcb/9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//Pz8/+goJ//8/Pz//// + ///Pz8//Q0RB/0NEQf9CQ0D/u7u6////////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zk6N/85Ojf/AAAA/wAAAP8AAAD/FKLg/xOh + 3/9mZGP/////////////////////////////////////////////////////////////////8/Pz/wAA + AP8AAAD///////////8AAAD/AAAA/xYWFv8AAAD/SUlJ////////////////////////////+/v7//f3 + 9//z8/P/H5O6/yGTu/8hlL3/JJe//yWYwf8nmcL/KZzF/yqdxv8snsj/LZ/J/y+gy/8yos3/M6PO/zSl + 0P82p9L/N6fT/zmo1P87q9b/PavX/z6r2P9Artn/AgcJ/wAAAP8AAAD/AAAA/wAAAP8AAAD/DQ0M/0JD + QP9DREH/Q0RB/0NDQP9Up/v/VKf7/0+NzP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB///////////////////////+/v7/3Nzb//// + ////////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9CQ0H/OTo3/zxOXv8GDBH/AAAA/wAAAP8Uod//DaDf/15fX//+/v7///////////////////////// + /////////////////////////////wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA + AP8AAAD///////////////////////7+/v/7+/v/9/f3//Pz8/8dkrn/H5K6/yGUvP8ilb3/JZjA/yaZ + wf8nmsP/KZvF/yqdx/8snsj/Lp/K/zCgy/8yos3/M6PO/zWl0P82ptL/N6fT/zmo1P88qtb/PKvX/z6s + 2P8+rdn/EpvS/wlNaf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8uLy3/Q0RB/0NEQf9HX3X/VKf7/0+O + zP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9KS0j/VFVS/1RVUv9LTEn/Q0RB/0NEQf94eHb/Q0RB/6Cg + n///////////////////////rq6t/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/R47W/wAAAP8AAAD/AAAA/xSh + 3f8Nndz/bW9v//7+/v////////////////////////////////////////////////9/f3//AAAA/wAA + AP9MTEz/AAAA/wAAAP+UlJT/BwcH////////////Pz8//39/f////////////////////////v7+//v7 + +//39/f/8vLy/xyQt/8ekrn/IJO7/yGUvP8ilr7/JZjA/yaZwv8nmsP/KZvF/yqdx/8sn8n/LqDK/zCh + zP8xos3/MqPO/zWl0P82p9L/N6jT/zmp1f87qtb/PavX/w+Yz/8RmtH/EprS/xKa0/8Sm9T/BTBC/wAA + AP8AAAD/AAAA/wAAAP8AAAD/MjMx/0NEQf9DR0f/VKf7/0dcb/9DREH/Q0RB/0NEQf9DREH/T1BN/1RV + Uv9UVVL/VFVS/1RVUv9UVVL//v7+/////////////////5+fnv9DREH/Q0RB/1NUUf///////v7+/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/SGaB/02a6P88Tl7/AAAA/wAAAP8KUG7/FKDc/xub0f+JiYn///////////////////////// + //////////////////////////////////8AAAD/////////////////f39//wAAAP////////////// + ///////////////////////////////////+/v7/+/v7//f39//y8vL/G4+2/xyQt/8ek7r/IJS7/yGU + vf8jl7//JZjB/yaZwv8omsT/KZvF/yueyP8sn8n/LqDK/zChzP8yos3/MqPO/zWl0P82ptL/N6fT/zmp + 1f8bnM7/EZjO/xGZz/8RmdD/EprS/xKa0/8Sm9T/EpzV/w11oP8AAAD/AAAA/wAAAP8AAAD/EBAP/0NE + Qf9GW2z/VKf7/0NEQf9DREH/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9XWFX//////4yN + i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf/39/b///////////+ioqH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9IY3z/UJDQ/1Sn+/9Up/v/R15z/yorKP8AAAD/AAAA/xSg + 3P8Tn9v/LIy1/7y8vP///////////////////////////////////////////////////////////+7u + 7v////////////////9/f3//AAAA/2JiYv//////f39//yIiIv8AAAD///////////////////////7+ + /v/7+/v/9/f3//Ly8v8ajrX/G4+2/xyRuP8fk7r/IJS7/yGUvf8kl7//JZjB/yeZwv8omsT/KZzF/yue + yP8sn8n/LqHL/zChzP8xos3/M6TP/zWk0P82ptH/MKXR/xCXzP8Rl83/EZjO/xGZz/8RmdD/EprR/xKa + 0/8Sm9T/EpzV/xKc1v8OdaH/AAAA/wAAAP8AAAD/AAAA/0NEQf9QlNj/RE9W/0NEQf9DREH/T1BN/1RV + Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1NUUf/+/v7/R0hF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf///////////3JycP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/RFBY/0t1nv9Me6n/U6b5/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/VKf7/1Sn + +/9Up/v/THqn/0NEQf9DREH/AAAA/wAAAP8AAAD/E5/a/xOe2f9QfI3/6enp//////////////////// + ////////////////////////////////////////Hh4e/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP+Kior//////////////////v7+//v7+//29vb/8vLy/xmNs/8ajrX/G5C3/x2R + uf8fk7r/IJS8/yGVvf8kmMD/JZnB/yeaw/8omsT/KZzG/yudx/8sn8n/L6HL/zChzP8yos3/M6TP/zWk + 0P8Plcn/EJbK/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZrR/xKa0v8Sm9P/EpzU/xKc1v8Tndf/BCc1/wAA + AP8AAAD/EBEQ/0NEQP9TpPX/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV + Uv9UVVL/Q0RB/42OjP9zdHL/QkNA/0NEQf9DREH/Q0RB/8LCwf//////Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NGRf9RmeH/VKf7/1Sn+/9Up/v/VKf7/1Sn + +/9Up/v/VKf7/1Sn+/9Pjs3/S3Wd/0t0nP9DQ0D/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/AAAA/xOf + 2v8Tntn/E57X/2ducf/+/v7///////////////////////////////////////////////////////// + //8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP////////////// + ///+/v7/+vr6//b29v/y8vL/F4uy/xmNtP8ajrX/HJC3/x6Suf8fk7v/IJS8/yGVvv8kmMD/JZjB/yea + w/8om8T/KZzG/yqeyP8sn8r/LqHL/y+hzP8xos3/EJTH/xCVyP8Qlcn/EJbK/xCXzP8Rl83/EZjO/xGZ + z/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc1f8SnNb/BCc1/wAAAP8AAAD/Q0RB/1Sn+/9DREH/Q0RB/1RV + Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9/gH7////////////39/f//////4yN + i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9Up/v/VKf7/1Sn+/9NgLP/Rldl/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/MzQx/wAAAP8AAAD/AAAA/wAAAP8LZYr/E57Y/xOe2P8Undb/ZmFg//////////////////// + /////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA//////////////////7+/v/6+vr/9vb2//Hx8f8WirD/F4uy/xmO + tP8aj7b/HJC3/x6Tuv8fk7v/IJS8/yGVvv8kmMD/JZnC/yeaw/8om8X/KZzG/yqdyP8sn8r/LqHL/yGb + yf8Pk8X/D5TH/xCVyP8Qlcn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc + 1f8SnNb/AAAA/wAAAP8PDw7/S3Wd/0lqiv9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV + Uv92d3T/////////////////XF1a/8PEw///////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9ESk7/VKf7/1Ol+P9DRED/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9CQ0D/Kysp/yEiIP8hIiD/Hh4d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dnai/xOe + 2P8Tndf/Ep3W/wqa1/9wcXL//v7+//////////////////////////////////////////////////// + ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////// + /////////v7+//r6+v/29vb/8fHx/xaKr/8WirH/GIyy/xmOtf8aj7b/HJC3/x6Suv8fk7v/IJS9/yGV + vv8kmMD/JZnC/yebw/8om8X/KZzG/yqdyP8rnsn/D5LD/w+SxP8Pk8X/D5TH/xCVyP8Qlsn/EJbK/xCW + y/8Ql8z/EZfN/xGYzv8Rmc//EZnQ/xGa0f8SmtL/EpvT/xKc1P8GNUj/AAAA/wAAAP9DREH/VKf7/0NE + Qf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS//////9UVVL/VFVS/87Ozf/c3dz///////// + ////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/1Sn + +/9HXG//Q0RB/0NEQf8iIyH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CU9s/xOe2P8Tndf/E53X/xKc1v8SnNX/H5XF/7u7u/////////////// + //////////////////////////////////////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA///////////////////////+/v7/+vr6//b29v/x8fH/FYqu/xaK + sP8WirH/GI2z/xmOtf8aj7b/HJG4/x6Suv8fk7v/IJS9/yKWvv8kl8D/JZnC/yebw/8om8X/KZzG/w2Q + wP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlsn/EJXK/xCXy/8Ql8z/EZfN/xGYzv8RmM//EZnQ/xGZ + 0f8SmtL/EprT/xKb1P8AAAD/AAAA/zAxL/9Tpvr/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV + Uv/Dw8L/qaqo/1RVUv9UVVL/wMDA//////+goJ//Q0RB/0NEQf+hoaD/QkNA/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/RVJb/0NEQf8ODg7/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAID/wlPbf8Nb5j/E57Z/xOe2P8Tndf/E53X/xKc + 1v8SnNX/EpzU/xKb0/9YeYX//Pz8//////////////////////////////////////////////////// + //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1lZWf////////////// + //////////////39/f/6+vr/9vb2//Hx8f8Uiaz/FYuv/xaKsP8Wi7H/GI2z/xmOtf8bj7f/HJC4/x6T + uv8flLz/IZS9/yKWvv8kl8D/JZnC/yabw/8Vk7//DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U + x/8Qlcj/EJbK/xCXy/8Ql8z/EZjN/xGYzv8RmM//EZnQ/xGZ0P8RmtH/EprS/wAAAP8AAAD/AAAA/0ZW + ZP9Nf7L/S0xJ/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS////////////qaqo//////////////////// + //9VVlP/Q0RB/6Okov+hoaD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/TorG/0py + mP87Ozn/AAAA/wAAAP8AAAD/AAAA/wAAAP8mXHP/NoKi/0u35f9Kt+X/Srbk/0m25P9JteP/R7Xj/zmv + 3/8Tntn/E57Z/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprR/2JfX//+/v7///////// + ////////////////////////////////////////////////////////////////////////jIyM/39/ + f/9/f3//jIyM/////////////////////////////////////////////f39//r6+v/19fX/8fHx/xGG + q/8Uiq3/FYqv/xaKsP8Wi7L/GY20/xmPtf8bkLf/HJG4/x6Suv8flLz/IJS9/yKWvv8kl8D/IZfB/w2O + vP8Oj77/DpC//w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJfM/xGX + zf8RmM7/EZjP/xGZ0P8RmdH/CU1p/wAAAP8AAAD/Q0RB/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV + Uv9UVVL///////////////////////////////////////////+0tbP//////6GhoP9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0ZVYf9TpPb/QkNA/wAAAP8AAAD/AAAA/xUzQP9Lt+X/Srbk/0q2 + 5P9JtuT/SbXj/0m14/9IteP/R7Ti/0az4v9Gs+H/RbPh/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb + 1P8SmtP/EprS/xGa0f8kjrj/xsbG//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////8/Pz/+/v7//Pz8//Cw8P/EYaq/xKHq/8Uia3/FYqv/xaKsP8Wi7L/GI2z/xmP + tf8aj7f/HJC4/x6Suv8flLz/IJW9/yKVvv8Mjbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S + xP8Pk8X/D5TG/w+Ux/8QlMj/EJXJ/xCVyv8Qlsv/EJbM/xGXzf8RmM7/EZjO/xGZz/8RmdD/AAAA/wAA + AP8hIiD/THuq/0dec/9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv////////////////////////////// + ////////////////////////oKGf/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/VKf7/0NE + Qf8AAAD/AAAA/wAAAP9HsN3/Sbbj/0m24/9IteP/SLXj/0e04v9GtOL/RrPh/0Wy4f9Fs+H/RLLg/0Sy + 3/9Csd//EJzW/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xKa0f8RmdH/DpjQ/2ZlZP/+/v7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v7+//7+/v/+/v7//v7+/+zs7P+7vLz/g39+/15jY/9MdoL/IoKg/wmD + qv8QhKj/EYaq/xKHrP8Uiq3/FYuv/xaKsf8Wi7L/GI2z/xmPtv8aj7f/HJC4/x2Suv8flLz/DYy4/wyM + uP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8Qlcf/EJXI/xCW + yf8Qlsr/EJbL/xCWzP8Rl83/EZjO/xGYz/8AAQH/AAAA/wAAAP9DREH/VKf7/0tMSf9UVVL/VFVS/1RV + Uv9UVVL/VFVS//////////////////////////////////////////////////////+FhYP/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/1On+/9ETVL/Dg4N/wAAAP8AAAD/NYep/0e14v9GtOL/RrPi/0az + 4f9FsuH/RbPh/0Sy4P9EsuD/Q7Hf/0Kx3/9Csd//QLDe/0Cv3f8Yntb/EpzU/xKb1P8SmtP/EprS/xKa + 0f8RmdH/EZnQ/xGZz/8kjrj/YWhp/3t1df+dnJz/wMHB/9jY2P/n5+f/7/Dw//j4+P/8/Pz//f39//39 + /f/+/v7//v7+//39/f/9/f3//Pz8//b29v/v7+//5+jo/93e3v/Fxsb/paWl/4eDgv9tbGz/WGNm/013 + g/8ug5//G4uv/wyIsf8Tiq//Eomu/xCHrP8Phar/DoWp/w+Ep/8Qhaj/EYer/xKHrP8Uia3/FYuv/xaK + sf8Wi7L/GI2z/xmPtv8aj7f/HJC4/xaPt/8Mirb/DIu3/wyMuP8Njbn/DY27/w2OvP8Njr3/DpC+/w6Q + v/8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJfL/xCXzP8Ql8z/EZfN/w59 + qf8AAAD/AAAA/z9APf9Soe//R1tt/1RVUv9UVVL/VFVS/1RVUv9UVVL/5OXk//////////////////// + /////////////////////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9OicT/TX6w/zAx + L/8AAAD/AAAA/xEsOP9Fs+H/RbLg/0Sy4P9EsuD/RLLg/0Ox3/9Dsd//QrHf/0Gx3v9AsN7/QK/d/z+v + 3f8/rtz/Pq7c/zCo2P8SmtP/EprS/xGa0f8RmdH/EZnQ/xGZz/8RmM7/EZjO/xGXzf8Rl8z/EpfL/wyV + y/8Klcv/CZLJ/xOVxv8VksH/GY+8/x6Quf8hj7b/I4+1/ySPtP8ijrP/II2z/x2Ms/8Yi7X/FIy2/xKO + uf8MjLj/CIq4/wiKuP8Iibb/GI+3/xiOtv8XjrX/Foy0/xaLsv8Ti7H/Eoqv/xKJrv8Qh6z/D4Wq/w6E + qf8Ng6f/DoOm/w+Ep/8Qhqn/EYer/xKHrP8Uia3/FYuw/xaKsf8Wi7L/GI2z/xmPtv8aj7b/C4iz/wyK + tP8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+T + xf8PlMb/EJXH/xCVyP8Qlsn/EJbK/xCWy/8Ql8z/EZfM/wAAAP8AAAD/AAAA/0NEQP9Up/v/S0xJ/1RV + Uv9UVVL/VFVS/1RVUv9UVVL///////////////////////////////////////////+Jioj/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/R1xv/1Ok9/9DREH/AAAA/wAAAP8AAAD/Q7Hf/0Ox3/9Csd//QrHf/0Gx + 3v9Bsd7/QK/e/0Cv3f8/r93/P6/d/z+u3P8+rtz/Pa7b/z2t2/89rdr/PKza/xGZ0f8RmdD/EZnQ/xGY + z/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6R + wv8OkcH/DpDA/w6Qv/8Oj77/DY68/w2Ou/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyJtP8LibP/Fo61/xaN + tP8Wi7L/E4qx/xKKr/8SiK3/EIes/w+Gq/8Ohan/DYOn/wyCpv8MgaT/DoOm/w+Ep/8QhKj/EYar/xKH + rP8Uiq7/FYyw/xaKsf8Wi7L/F42z/wqHsP8LiLL/C4mz/wyKtP8MirX/DIu3/wyLuP8NjLn/DY26/w2O + u/8Njrz/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcj/EJbJ/xCW + yv8Qlsv/CEtm/wAAAP8AAAD/Q0RB/1Ke6/9Kc5r/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/X2Be/9nZ + 2f//////////////////////aWpn/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NDQP9Up/v/Q0RB/wAA + AP8AAAD/AAAA/0Cw3v9AsN7/QK/d/0Cv3f9Ar93/P6/d/z+v3P8/rtz/Pq7c/z6u2/89rdv/Pa3b/z2t + 2v88rNr/OqvZ/zqr2f85qtj/D5jP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCV + yP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+Sw/8OkcL/DpHB/w6Qv/8OkL7/DY69/w2OvP8Njbv/DY26/w2M + uf8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsf8Lh7D/Fouy/xOKsf8Siq//Eoiu/xCHrP8Phqv/DoWp/w2C + p/8Ngqb/CoGl/wyBo/8MgaT/DoOm/w+Ep/8Qhan/EYar/xKHrP8UiK3/FYyw/xWKsf8OiK//C4av/wuH + sP8LiLL/C4iz/wyJtP8MirX/DIq2/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY+9/w6Qvv8OkL//DpDA/w6R + wf8PksP/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJbJ/xCWyf8Qlsr/AAAA/wAAAP8NDQz/Q0RB/1Sn + +/9DRED/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/VKf7/0NEQf8ODw7/AAAA/wAAAP8vgqX/P67c/z+u3P8/rtz/Pq/c/z6u + 2/89rdv/Pa3b/z2t2v88rdr/PKza/zus2f86q9n/OavZ/ziq2P84qtj/N6rX/zep1v8Vms//EZfN/xGY + zf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCVyP8QlMf/D5TH/w+Uxv8PksX/D5LE/w+Sw/8OkcL/DpHB/w6Q + wP8OkL//Do++/w2Ovf8Njrz/DY27/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuG + r/8PiK//Eomv/xKIrv8Qh6z/D4ar/w6Fqf8Ng6f/DYOm/wqCpf8JgKP/C4Ci/wyBo/8NgqT/DoOm/w+F + qP8Qhan/EYer/xGHrP8TiK3/E4uv/wqErf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyL + t/8NjLj/DY26/w2Nu/8Njrz/DY69/w6Pvv8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5PF/w+U + xv8PlMf/EJXI/xCWyf8GP1X/AAAA/wAAAP9DREH/SnOZ/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV + Uv9UVVL/VFVS/0dIRf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0NA/1Sn+/9FUVr/IyQj/wAA + AP8AAAD/Dys2/z2u2/89rdr/Pa3a/zyt2v88rdr/O6za/zur2f86q9n/OqvZ/zmr2P85qtj/OKrY/zeq + 1/83qdf/N6nW/zao1v81qNX/NafV/yei0f8Ql8z/EJbL/xCWyv8Qlsr/EJbJ/xCVyP8QlMf/D5TH/w+T + xv8Pk8X/D5LE/w+Sw/8PksL/DpHC/w6Rwf8OkL//Do++/w6Pvf8Njrz/DY67/w2Nuv8NjLn/DIu4/wyL + t/8Mirb/DIq1/wyJs/8LiLL/C4ex/wuHsP8Lhq//CoWt/wqErP8RiK3/EIes/w+Gq/8Ohan/DYOn/w2D + pv8LgaX/CoCj/wl/ov8KgKH/C4Ci/wyBo/8MgaT/DoOm/w+FqP8Phan/EIar/xGHrP8JhKr/CoSr/wqF + rf8Kha7/C4av/wuHsP8LiLH/C4iy/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2Nuv8Njrv/DY68/w2P + vf8OkL7/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Txf8PlMb/D5TH/xCVyP8AAAD/AAAA/wAA + AP9DREH/U6Lz/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9TVFH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0ZZaP9Up/v/R1xu/zIzMf8AAAD/AAAA/wAAAP86q9n/OqvZ/zqr2f85q9n/OarY/zmq + 2P85qtj/OKrY/ziq1/83qtf/N6nX/zap1v82qdb/NajV/zWn1f81p9X/NKbU/zOm0/8zptP/MqbS/xCW + yv8Qlcn/EJbJ/xCVyP8PlMf/D5TH/w+Txv8Pk8X/D5LE/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6P + vv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqF + rf8KhKz/CoSr/wqDqv8Phqv/DoSp/w2Dp/8Mgqb/CoKl/wl/o/8Jf6L/CH6g/wh9n/8KgKH/Cn+i/wyB + o/8MgaT/DoOm/w+FqP8Phan/CYKo/wmDqf8Kg6r/CoSr/wqErP8Kha7/C4av/wuHsP8Lh7H/C4iy/wuJ + s/8MirT/DIq1/wyKtv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R + wv8PksP/D5LE/w+Txf8Pk8X/D5TG/wdQa/8AAAD/AAAA/ywtK/9DREH/VKf7/1Sn+/9FVGD/R0hF/1NU + Uf9UVVL/S0xJ/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9PjMj/VKf7/0ZXZf9CQ0D/AAAA/wAA + AP8AAAD/N6rX/zeq1/83qtf/N6rX/zep1/83qtf/N6nW/zap1v82qdb/NafV/zWn1f81p9X/NafU/zSn + 1P8zptP/M6bT/zOm0/8yptL/MaTR/zCk0f8wo9D/D5XI/xCVyP8PlMf/D5PG/w+Uxv8Pk8X/D5LE/w+S + xP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Qvv8Nj73/DY68/w2Ou/8Njbr/DY25/wyLuP8Mi7f/DIq2/wyK + tf8MibT/C4iz/wuIsv8Lh7H/C4av/wuGrv8Kha3/CoSs/wqEq/8KhKr/CYOp/wqDqP8Ng6f/DIKm/wqC + pf8Jf6P/CX+i/wh+of8Ifp//B3ye/wh9n/8JfqD/CoCi/wyBo/8MgaT/DYOm/wyDpv8Jgqf/CYOo/wmD + qf8KhKr/CoSr/wqErP8Kha3/C4au/wuHsP8Lh7H/C4iy/wuIs/8MibT/DIq1/wyKtv8Mi7f/DIu4/w2N + uf8Njbr/DY67/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwf8OkcL/D5LD/w+SxP8PksT/D5PF/wAA + AP8AAAD/AAAA/0JDQP9DREH/Upvk/1Sn+/9Tpvr/RVBY/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9LdZ3/VKf7/1Sn+/9DREH/QUI//wAAAP8AAAD/AAAA/zap1v82qdb/NajV/zWo1f81qNX/NajV/zWn + 1f81p9X/NafU/zSm1P80ptP/M6bT/zOm0/8zptP/MqbS/zKl0f8xpNH/MKPQ/zCi0P8wos//L6LP/y6i + zv8Rlcf/D5TG/w+Txf8Pk8X/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2O + vP8Njbv/DY26/w2Muf8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha7/CoWt/wqE + rP8KhKv/CoSq/wmCqP8Jgqf/CYGm/wyCpf8KgaX/CYCj/wl/ov8IfqH/CH6f/wd9nv8HfJ3/CHye/wh9 + n/8Jf6D/CoCi/wuAo/8MgaT/CYGk/wmBpf8Jgab/CYOo/wmDqf8Kg6r/CoSr/wqErP8KhK3/Coau/wuG + r/8Lh7D/C4ix/wuIsv8MibP/DIq1/wyKtv8Mi7f/DIu4/w2Muf8Njbn/DY26/w2Ou/8Njrz/DY69/w6P + vv8OkL//DpDA/w6Rwf8OkcH/DpHC/w+Sw/8PksP/D5LE/wAAAP8AAAD/AAAA/0NEQf9DREH/R1xv/1Sn + +/9Up/v/VKf7/1Sn+/9Tpvr/U6T2/1Sn+/9Up/v/VKf7/1Sn+/9LdJv/Q0RB/zIzMf8AAAD/AAAA/wAA + AP8xncf/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/MqbS/zKl0v8xpNH/MaTR/zCj + 0P8wo9D/MKPQ/y+iz/8vo8//LaLO/y2izv8soc3/K6DN/x+ayf8PksT/D5LE/w+Sw/8PksP/DpHC/w6R + wf8OkMD/DpC//w6Qv/8Oj77/DY69/w2OvP8Njbv/DY26/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuI + s/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqErf8Khaz/CoSq/wqDqf8Jg6j/CYGn/wmCpv8JgaX/CICk/wl/ + o/8Jf6L/CH6h/wh+n/8HfZ7/B3yd/wd7nP8HfJ3/B3ye/wh9n/8JfqD/CoCi/wh/ov8IgKP/CICk/wmB + pf8Jgqb/CYKn/wmCqP8KhKr/CoWr/wqErP8KhK3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyK + tf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R + wv8PksL/C3Sb/wAAAP8AAAD/AAAA/zIzMP9DREH/Q0RB/0NFQ/9Meqf/VKf7/1Sn+/9Up/v/VKf7/1GZ + 4P9HXG//Q0RB/0NEQf8SEhH/AAAA/wAAAP8AAAD/Koqu/zKl0f8ypdH/MaTR/zGk0f8xpNH/MaTR/zGk + 0f8wpNH/MKPQ/zCj0P8wotD/MKPQ/y+iz/8vo8//LqPP/y2izv8toc7/LKHN/yyhzf8roM3/Kp/M/yqg + zP8pnsr/KJ3K/w+Sw/8OkcL/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2OvP8Njbv/DY26/w2N + uf8NjLj/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqFrf8KhKz/CoSr/wqE + qv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd8nf8HfJz/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAgAAAAAABAAABAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wEFCf8CCg3/CwsL/wMJ + Ff8EExr/ERER/xcYFv8YGBf/EBYY/xAYGv8bGxv/HyAe/yAgH/8HCCT/Bhsj/xgdJ/8LDDj/HR44/wkh + K/8SIyn/BSg3/xIrNv8ZMTz/IyMj/ycoJv8nKCj/Kysr/zAwLv83Nzb/P0A9/0BBPv8ODkT/DxBK/xAR + Tv8RElf/HyBJ/wY1Sf8VN0X/Bz1T/xE+Uf8iPEj/NzhN/yAhWv8VFmf/Fxhy/yIjaP81NmL/IyR3/wdB + Wv8XRFb/KEhW/z1MV/8rUF//CEto/xJMY/8JUG7/ClV2/xJcfP8gTmH/K1Rm/zJZav85XHT/EmB+/yZi + ev81Y3b/RERD/0dIRf9JSkf/QEZK/0RKTP9LS0r/T1BN/1BRTv9ETVP/RVFa/1RVU/9fYF3/YGFe/0ZY + Z/9HXnL/SGB2/0hie/9Cb3v/SG55/1dvef9JcHz/WHJ7/2ZnZv9wcW//anV4/3d3d/+AgH7/GxyH/x0f + kf8eIJb/JieN/zEyhf8mKJb/Jiem/y4wrf8nKLn/C12A/wthhf8MZYv/EmaK/w1slf8SbZP/DXGc/wd8 + nf8IfZ7/EnSY/yVth/86a4H/LXOM/zlziv8jd5H/LnWT/yZ5lP8re5T/JXuc/y1+mf87e5P/Dnek/wh9 + of8Oe6n/EXuq/xF+sP8of6H/SWWA/0lohf9Jaor/SHiK/1F1hP9Idpj/ZXuC/3F+gv9MeKT/THys/0t/ + sv8pK8z/LzHP/zEyzP8rLdP/LjDV/zM12P8tgZ3/M4Od/wmBpP8KhKv/D4iv/xKHrP8LhrD/C4m0/w2N + uv8Vi7P/DpC+/xyRuf8qhaX/OYik/yeNtf8wi7D/JJa8/zOSuP9cgI3/RYKa/3iDh/9oiJX/RIym/0aT + rv9fkab/TYK1/06FvP9Flrb/VJq5/2qbsv9Sob//E47E/w6Sw/8Olcr/DpjP/xCWy/8SnNX/KZvE/zKd + xP8hn9D/FKDc/y2hzP82o8v/KaTW/zOl0f85ptD/NqjV/zyp0/8zqdn/PKza/z6w3/8Vpub/GK3y/xmw + 9v8prOX/Na7j/yuw6/86suf/IrDy/ze38v9NicT/UI7M/0ufw/9Zn8D/UJDP/0iO1v9Qk9b/RaTJ/1Wm + yP9DrNX/V63S/0mx3P9Std3/ZKrK/2Gt0P9ot9v/TZbg/1Ga4/9Snuv/U6Du/0q14v9Xu+T/U6X5/0W+ + 9v9Qv/L/Yr7m/13A6/9awvL/ZMLr/2rI8v9zzPX/e9D3/4aGhv+Qj4//kJGP/4eWm/+bm5v/m5+g/5qh + o/+np6f/urq6/8K/v//AwL//yMjI/9DPz//U1NT/5+fn//39/f8AAAD/AAAA/21tbW5ubm6UlJSUlJSV + lJWVlZWYlZmWmZmZmZmamZqampqampqyspqysrKysrKysrKdtZ21tbW1tbW1tbW1tbW1tbW1tbW1tbW1 + tbOdtbKdsrKzsrKyspyynJyanJqampqampqZmZmZmZmWlpmYlZWVlZWUlZSVlJSUbZRtbW1tbW1ubpRt + lJSUlJWUlZWVlZmVmZWZmJmZmZqZnJmcmpyanJqyspyasrKysrKysrWdtbW1tbW1tbW1tbW1tbW1tbW1 + tbW1tbW1tbW1tbW1tbW1tZ2ysrKyspyysrKcnJqcmpqampqamZmamZmZlpiYlZiVlZWUlJSUlJSUbpRt + bW1tbW1ulJSUlJSUlZSVlZWVlpWWmZmZmZmamZqZmpqampqcspqcsrKysrKds521tbW1tbW1tbW1tbW1 + tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tJ21sp21srKysrKyspyympqampqamZmZmZmZlpiYlZiVlZWV + lJSUlG6UbXxtbW1ulG6UlJSUlZSVlZWVmZWVmZmZmZqampmamZycnJyysrKctbKysrWdtbW1tbW1tbW1 + tbW1tbW1tbW1tbW1tba1tba1tba1tba1tbW1tbW1tbW1tbW1tbW1srKysrKcnJycnJqcmpqampmZmZmZ + mZaWlZWVlZWVlJWUlJSUbpRtbm2UlJSUlJSVlJWVlZWZlpmWmZmZmZmZnJqcnJycspyysrKynJ21tbW1 + tbW1tbW1tbW1tbW1tba1trW2tba1tba1tbW1tba1tba1trW1tbW1tbW1tbW1tbKdtbKysrKysrKcnJqc + mpyZmpqamZmZmZiZmJWYlZWUlZSUlJRubnx8lG6UlJSUlZWVlZmVmZmVmZmZmZqampqcmpycnJycsrKy + s7K1tbW1tbW1tbW1trW1tra2trW2tbW1trW2tba2tba2tra2tba1tba1tba1tbW1tbW1tbW1tbW1tZ2y + tLKysrKcspqcmpyamZmamZmZmZaYmJWVlZWVlJWUlJSUbW6UlJSUlZSVlZWVlZWWmZmZmpmamZqcmpyc + nLKysrKynbKdtbW1tbW1tbW1tbW1trW1tbW1trW2tra2tra2tra2tra2tra2tra2tba2tba2tba1tbW1 + tbW1tbW1tbKdsrKysrKcnJycmpqanJmampmZmZmVmZWVlZWUlZSUlJSUfJSUlJWUlZWVlZmVmZaZmZma + mZqampycnLKcsrKys7K1tbW1tbW1tbW1tbW2trW1tra2tra2tra2tra2tra2tra2tra2tra2tra2trW2 + tbW2tbW2trW1trW1tbW1tbW1tZ2ysrKcnJycnJqampmZmZmZlpmWmJWVlZWVlJWUlJSUlJSVlJWVlZWV + mZaZlpmZmZqampycnJycsrKcnLKdtbW1tbW1tbW1tba2tbW1tra2tra2tra2tra6tra2tra2tra2tra2 + ura2tra2tra2tra2trW1trW1tbW1tbW1tbW1sp21nLWyspycnJqcmpyZmpqZmZaZmJmVlZWVlJWUlJSU + lJWUlZWVlZmWmZmZmpmampqanJycnLKdsrOztbW1tbW1tbW1tra1tbW2tra2tra2tra2trq2tra2trq6 + ura6urq2tra2tra2tra6tra2tra2tra1trW1trW1tbW1tbW1tbW1nLKysrKcnJqamZyZmZmZmZaYlZWV + lZWVlJSUlJWUlZWVlZmVmZmWmZmZmpqanJycnLKynLKynbW1tbW1tbW1trW1tba2tra2tra2tra2trq2 + trq2tra6tra2ura2tsW2tra2trq2ura2ura2tra2tra2tra1tra1tbW1tbW1tbKys7KynLKcnJycmZya + mpmZmZmZlZmVlZSVlJSUlJWVlZWZlZmWmZmZmpqampycnJyysrKzs7W1tbW1tbW2tba1tra2tra2tra2 + tra2tra2trq6trq6xbbFtrq2xbq2trq6xbbFtrq2ura2trq2ura2tra2tra1tba2tbW1tbW1tbWdsrKz + nLKynJycmZqZmZmZmZmVlpWVlZWVlZWUlZWVlZaZmZaZmpmampqcnJyysp2ysp21tbW1tbW1tbW1tba2 + tra2trq2trq2tsW2xbq6urq6tra6trbFtsW2tsW2ura2urq2urq2urq6tra2tra2tra2tra2tbW1tbW1 + tbW1tbWysrKyspycnJycmpqcmpmZmZmYmJiVlZWUlJWVlZWZlZmZmZqZmpqanJycnLKysrOytbW1tbW1 + tbW2tra2tra2tra2tra6trq6ura2tra6urWbfmg6OjY2Nzg6OWtvm7W2usW6urq6trq6urq6trq2tra2 + tra2tra2trW1tbW1tbW1nbKysrKcnJycmpmZmZmZmZmVmJWVlZWVlZWZlZmWmZmZmZqampycnLKynbK1 + nbW1tbW1tbW2tbW2tra2tra2tra2ura6ura2tn46MRUEAQAAAQEAAAEAAAAAAAEAAAQPJThrsbrFtra6 + tra6ura6tra2tra2trW1tra1tbW1tbW1s521spyynJycmpqampmZmZmYmZWVlZWWlZmVmZmZmpmampqc + nJyysrKytbK1tbW1tba1tbW2tra2tra2tra6tsW2urZ+ORUBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEBBSdptbbFura6ura2ura2tra2tra1tba1trW1tbW1srKcspycnJycnJqZmpaZmZaVlZiVlZWWlZaZ + mZmZmpqcnJycsp2ysrKytbW1tbW1tba2tra2tra2trbFtra6tn4xBQAAAAAAAAAAAwEBAwMLGBgYGA0Y + DQgDAAAAAAAAAAAAAAEAFTmxxba6urq2tsW2tra2tra2tbW1tbW1tbW1s7OysrKcnJyanJmampmZmZmY + lZWVlpiZmZmZmpqampqcnJyysrK1srW1tbW1tbW2tba2tra2tra6tra2tTkPAAAAAAAAAAEIHEdYW+/v + 8vXy8/Lz9fL18vLy7llNQhoDAAAAAAAAAAAVara2trq6tra2trq2tra2tra1trW1tbW1nbKcspycnJyc + mpqZmZmZlpiYlZeWlpaZlpqZmpqcnLKcnLKysrK1tbW1tba1trW2tra2trq2tra2tTYDAQAAAAADCEJY + 7/Ly8vPy9fPy8/Lz8vLy8vLz8vL18vPy8vLuTR0DAAAAAAAABDq1urq6urq2tra2tra2tbW1tbW1tbW1 + tbWysrKcnJyampqampmZmZiWoqKdlpqWmpmcmpycnLKysrW1tbW1tbW1trW1ura2trbFtrq6tjgEAAAA + AAELTO7y8vXy8vPy8/Ly8vLy8vLy8vLz8vLz8vLy8/Lz8/Ly8/JbQwgAAAAAAAI2tbq6trq2ura2tra2 + tra1tbW1tbW1srKysrKcnJyampqZmZmZlpiio6Kjop2ampycnLKcsrKysrW1tbW1tba1tra2tra2tra2 + um8PAAAAAQNCW/Xy8/Ly8vLy8vLy8/Lz8/Py8/Pz8/Pz8vLy8/Pz8vLy8vPy8u/uXEwIAAAAAAAEZrbF + tra2tra2tra2tba2tbW1tbW1s7KznbKcnJyampqamZmWmaKiuKK4uKKimpycnLKytbWytbW1tbW2tra1 + ura2tra2urYxAAAAAANJ7/L18vLy8vL18vLz8vPz9fX29vb29/f49/f29vb29fX1W0cdGAYBAwMAAwYI + BgMBAAEAD3+2xbbFtra2tra2tbW2tba1tbW1nbOynLKcnJyampmZmZmWuKOiuLi4uLy8t5yysrKytbW1 + tbW2tbS1tra2tra2xbqbDwAAAAELHFny8/Ly9fLz8vLz9fb2+fn5+fn5+fn5+fr5+fn5+vn5+fkYAQMc + TFiI7/X19fX19fPuWB0BBDm2tra6trq2tra2trW1tbW1tbWytbKyspycnJqampqZmZmiori4uLi81bzV + vLuisrOytbW0tba1tra6tbq6trq2fgQAAAAGHB0dHe7y8vLz8vP19/n5+fn6+fr5+fn5+fr5+fn5+fn5 + +fn57gNc9fX19fX19fX19fX19fX19e4aABa1trq6tra2tra2tra1tbW1tbWytbKynLKcnJycmp2doqK4 + uLi4vLy8wbzB19e8ubW1tbS0tLa1urW6trbFtnwDAAABEB0cHR0dQvLy8vX2+fn5+fn5+fn5+fn5+vn5 + +fn5+fr5+fr5+fkYR/X19fX19fX19fX19fX18lvv9VgAAA+bura6trq2tra2tba2tbW1tbWytbKynJyc + nJ2iuKKiori4uLi8vNW8wdXX19fX17m1trS2tLq0ura6trZ+BAAAAxwdHR0dHB0dTPX3+fn5+fr5+fr5 + +fn5+fn5+fn5+fr5+fn5+fn57gPy9fX19fX19fX19fNZRxsYGO7yBgAAAAR+ura6tra2tra2tbW2tbW0 + s7Wyspycoru4uLi3t6K4uLi4vLzVvNXX1dfY19nY2tm8uba0tra6urq6tQUAAA4cHR0cHR0dHR0q7vn5 + +fn5+fn5+fn5+fr5+fn5+vn5+fn5+fn5+fkcHvX19fX19fX19e5IGBoYGBgd9U0ABgAAAAR+urq2urq2 + tra2trW1tbO1srK5u7+8vLy4uLi4t6K4uLjVvLzBwdfX2Nfa19ra2traxLm6urq6urYVAAAGHR0dHRwd + HR0qQkdC7/n5+vn5+fn6+fn6+fn5+vn5+fn5+fr5+vn59QPu9fX19fX19e5CGBgYGBkYGE71CAFCGwEA + AASXtsW2trq2tra2trS1tLm7wcHVv7y8vLy4uKKiuLi4vLzVvNXV19fX19fa2dra4+Pj59m9urq2OQAB + Ax0dHB0dHR0dQkVCQkJH7/n5+fr5+fn5+fn5+fn5+fn6+fn5+fn5+flMGPX19fX19fJHGBgYGBkYGBgY + 71wBGkdCHQEAAAWxurq6tra2tra1ur7X2dfX18HBwby8vLu4vLe4uLy8vL/B19fX19fa2tra2uPj493j + 5+faxLUCAAMcHR0cHR0cHkJCQkJCR0JF7vn5+fn5+fn5+fn6+fn5+fn5+fr5+fn5+QhN9fX19fVZGxga + GBoYGBoYGB31RwMfQkJCHQEAABW2trq6ura2vcPa2dnZ19fX18G/vLy8vLi3ori4vLzVvMHV19fX2NfZ + 2tra2uPj2ufn6urqMwAAGx0dHR0dHSpCR0JHQkJCR0JFW/n5+fr5+vn5+fn5+fr5+fn5+fn5+fnyAfL1 + 9fXzRxgYGBgYGBgYGBgaTPUGDUVCR0JCHQEAADbFtra9xOPa2tna2dnX2dfXwcHBvLy8uLy3vLy8vLzB + wdfX19fZ2tra2trd493o6urn6q4AAAsdHR0cHR0eQkVCQkJCQkJCQkJHWPb5+fn5+fn5+vn5+fn5+vn5 + +fr5+U4b9fX17x0YGBgYGhgYGhgYGhju7gMdQkNCRUJCGwAAAX7L4+Pj4+Pj49na2dnX19fBwb+8vLy8 + uLe4uNW81dXV19fX19rZ2tra49rj4+fd5+rqMwABHBwdHR0dQkJCR0JCQkdDQkJHQkJCTPP5+fn6+fn5 + +fr5+fn5+fn5+fn5G0z19VwbGBgYGhgYGBgYGRgYGvVOA0JCQkJHQkJCCAAAFufq5+Pj49rZ2tnZ2dfX + 19fXwcG8vLy4vLy8vLzBwdfX19jZ2tjZ2uPj5+Pn5+fq6t0DABAdHR0dHCpCQkJCQkdCQkJDQkNCQkdC + R1v3+fn5+fn5+fn5+fn6+fn5+fcD7vVbGhgYGBoYGBgaGBgYGBhE9R0NRUJCQ0JDQkNCAwABeujj4+Pj + 4+Pj2drZ2dnX18HBv7y8vLy31by81cHV19fX19fa2tra2trj5+fn6urqcQABHRwdHR1CRUJHRUJCQkJC + QkJCQkJCQkJCQknv+fn5+fn5+fr5+fn5+vn57wb1WxgYGBoYGBgYGBgaGBkYGlj1BhxCQ0JCQ0VCQkcc + AAAQ4+fq5+Pj2tna2dnZ19fX18HXvLy8vLy8vLy/wdfX19ja2tra2uPn5+fj5+rq6uoWAAsdHB0dHUJC + QkJCQkJHQkNCKkJCQkdCR0JHQkJN8/n5+fn6+fn5+fn5+flYKlsYGRgYGBgYGhgYGBgYGBgY7u4DHkJD + QkJDQkNCQ0IGAACl6OPj4+Pj49rZ2dnZ2dfXwde8vLy8u7y81cHV19fX19nZ2tra2trj4+fq3erq2AEA + Gx0dHR1CR0JCQkdCQkIqHR0dHSpCQkJFQkJDQkJHTO/3+fn5+fn5+vn5+U4LGhgYGhgaGBgYGBoaGBgZ + GBjzWwZCRUJFQkJCQkJDQh0AABfq6urj4+Pa2eja2dfZ19fXvMS8vLy8vLy819fX19nX2tjZ2uPj5+fn + 6urq6+uEAAMdHRwdQkJCQkJHQkJCQh0dHR0dHUJCQkJDQkJCQ0JCR0dZ8/f6+fr5+fn5TgAYGBgdR0xO + Tk5YTkxMTEUdHRgGAQgLGBobHB0dQh9CQggAAdbj4+Pj4+Pj2dnZ2dnZ19fBwby8wby8v7/V19fX19ra + 2tra2trj2urd6urq6jMACB0dHSpCR0JCQkJCR0IdHR0dHB0dQkNCQkVCHSofQkJCQkJHR1ju9ff5+flb + ABvv9vb49vb29vb29vb2+Pb29vb28+/uWU1KHRgDAQEDDQAAcerq6OPj49rj2trZ2dfE19m8wby8vLy8 + 18HX19jX2dna2uPj5+fq5+rn6t3sFAAaHR0dQkJCQkJHQkJCQh0dHR0dHR0fRUJCQh0dHR0qQkJCR0JC + QkNDRUxOW1gBTPb29vb29vj29vb49vb2+Pb29vb49vb29vb29vb1GwAfAwAX5+jo4+Pj49nZ2dnZ2dfX + wcHBvLy8vMHV19fX19fa2dra49ra6trq6urq690AABwcHUJCQkJDKkdCQkJCHR0dHR0dHUJDQkIdHR0c + HR0fQkJDQkJCHR0dHR0dHwgd9vf29vf29vf29vb49vb29vj29vb49vb29vb2+foQDUIYAALn6ufq4+Po + 4+Pa4tnZ2dfB2bzBvLy8vNfX19fa2tra2trj4+rj6urq6ursrgEDHR0dQkJCQkdCR0JCRyodHR0dHR0d + R0JCKh0cHR0dHR1FR0JCKhwdHR0dHR0dGwDy9vb29vb29vb2+Pb29vj29vb49vb29vj2+fr67gNCQh0A + Aa3q6Ojj4+Pa2dnZ2dnZ18TBvLzBvLzBwdfX19fZ2dra2trn2uqlNerq6+qlAQMdHUJDQkJCQkJCQkJH + Qh0dHR0dHUJCQkIdHR0dHR0dHUJCQh4dHR0dHR0dHR0dDR329vb29vb29vb29vb29vb29vb29vb29/r7 + +vUIHkJFQgABcejq4+jj6Ojj49rZ2dnX19nXwby8vNXX19fX2dra2uPj4+Pn2gsDM+rq61MAAxgdQkJC + Q0JHQkJCRUJCQh4dHSpCQkJCQh0dHR0dHR0dRUJFHR0dHR0YBgMAAAMDA1j39vb39vf29vb39vb29vb2 + 9vb2+fr6+vr1GB5CQkdCBgA86urq4+Pj2trZ2eLZ2dfZwby8wby8wdfX2NfZ2drZ2trn2uhBBgYGM+zq + QQALGxgYGCpCQkJCR0JCQ0VDQkJCRUJDQkIeHR0dHB0dHR1CQh4dHR0cAwAAAAAAAAAAAAhO9fb29vb2 + 9vb29vb29vb4+fn5+vr78hAdQkNCQ0INABfq6uPq4+jj6OPi2tnZ18TZ18HBvMHV2dfX2dra2trj4+Po + 2gYGBgYGM+o+ABgdQkIqGxgYHUJCQkJCQkJDQkNCQkNCQyodHR0dHR0dHUJCQh0dGwAAAAAAAAAAAAAA + AAADWPb29/b29vb29vb5+fr6+/v7+lsIHUJFQ0JCQhsAEOrq6uPo4+PZ2trZ2dnZ2cG8wbzBvMHX19fZ + 2dnZ2trj2uiwFAYGBgYGMzMAGB5CQkJCRUIcEAYGGBwfQkJCQ0JDQkJDHR0dHR0dHR0eQkMdHRwBAAAA + AAAAAAAAAAAAAAAAG/X29vb29vn5+fv5+/v5+vZCCBwdHR1CQ0JCHQAB5+ro6uPj6Oji6OLZ2dfZ2dnB + wbzV19fX19nZ2trj4+Pa5+rahBQFBgYGAAAaQkJCR0JCQkJCQhwIAQADBhseQkNCQkMeHR0dHB0dHUJC + Qh8dAwAAAAAAAAAAAAAAAAAAAAAAB/L29vn5+fv5+/v6+fvuCxgdHR0dHSpCQkUeAAHj6uro6OPj49rZ + 2tni2cTXvLzBwbzB19fZ2drZ2trj6Ojj6Orq6qozBgYDABpDQkJCR0JHQkdCQkIeGAMBAAADGBxCQh4d + HR0dHR0dQ0JFHxgAAAAAAAAAAAAAAAAAAAAAAAAAB/n6+vv7+vv7+fr1HQYbHR0cHR0dHUJCQkIAAdbq + 6ujo6Nro4uPi4tnZ2cTZ18G819fZ19nX2dqpc0A9PTw1NTM8PUE9KQMAG0JCQ0VCQkJCQkJCR0JCQhsG + AAAAAAMLGx0dHR0dHUJCQkJCAwAAAAAAAAAAAAAAAAAAAAAAAAAAHfv6+fr6+/n1QgAABhgdHR0dHR0d + HUJDQgAA0evo6ujj4+ja49nZ2dnZwcG818G8wdfX2dnZ2RcGBgYGAwYGBgYDBgYDAwAbRUJCQkJHRUJH + QkVCRUJCR0IqGwMAAAAAAAcYHR0eQ0JCQx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA7vr7+/dbHQtbW0wL + AAMbHR0dHR0dRUNCAwDW6uro6Oja6Nno49nZ2dnZ18TBvNfV2dnZ2dnEFwYGAwYGBgYGBgYGBgYDABhC + Q0JHQkJCQkJCQkJCQkdCQkJCQh0QAwAAAAAACBxCQkVDCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAALWEwb + Axju+/z8+/vyGQAZHR0dHR1CQkIBALjj6Oro6Ojj6Nni2tnZ2cS82bzBtbe5tbW0tboxBgYGBgYGBgYG + BgYFBgMADUJCQkJFQkdCQkVCR0JCQkVCQkdCQkdCHAgAAAAAAAMNHUMDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAADVj5/f39/f39/fz7RwAbHR0dHUJDQgMAscXFxb3Ky+LZ49rZ2dnZ2dnBwcG1tbW1tba2tj8G + BgMGAwUGBgYGCSYmBQAGQ0JDQkdCQkJCR0JCQkJCR0JCR0JCQkJCRyobAwEBAAAAAwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAb7/fVb9f39/f39/fz8KgYdHR0dQkNCAAK2xcXFxbq6urq6ur3EwNnZvNnBwLW1 + tbW1tLS0nQYGBgYGBgYGKGt+FgYDAANFQkVCQkJCQ0JDQkdCQ0JCQkVCQkdCQkJCR0JCHQ0DAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAHf3uAAADW/39/f39/fz2AxwdHR1DQkIAAcXFusW6usW6ura6tra2 + tra5ubu8tbW1tba2uba2EwYGBgcma7a2MgYGBgYAAEJCQkJCR0JFQkJCRUJCRUJCR0JCQkJCQkdCQkJH + QkIcBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY/R0AAAAb/f39/f39/fwdGh0dH0NCKgAPxcXFxcW6 + urq6ura2tra1tbW1tbW1tbW1tbW2tLY/DDFrtcW6lxQGBgYGBg8AHUJHQkJCQkNFQ0JHQkJHQkJCQkcq + R0VCQkJHKkdCQkdCDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8RwAAAB/9/f39/f39/FgLHR1CQ0Id + ABbFxcXFusW6urq6urq2tra2tbW1tbW1tbW2tra2ura6urq6uj8GBgYGBgZpNgAaQkNCQkJHQkJCQkNC + QkNCQkdCQkJHQkJHQkVCQkJCRUIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZCAQML+f39/f39/f39 + WBgdH0JCQhsANsXFxcXFurq6urq2trS2tba1tbW1tbW1tbW0trW6trq6urppBQMGBgYGFsVrAAhCQkJD + QkNCQkNCQkNCQkJCQkdCQkJCQkJCQkJHQkJCQkIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATPz9 + /f39/f39/f1JGipCQ0JFDQBpxcXFxbrFxbq6trq6trq1tra1tbW1tbW2tLa2tra6tra6xbUHBgYGBgm1 + xbYBA0JDRUNCQkNFQkJCQkNFQ0NFQkJFQkdCQkJHQkJCRUJHQhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAACFz8/f39/f39/QkdQ0NCQkMGALHFxcXFxbq6urq6ura2trW2tbW1tbW1tbW1tLa2trq6urq6 + um8GBgYGP8XGxQ8AHUJCQ0IfGhgdQkVEQkJCQkJCQkJCQkdCQkJHQkJCQkIdGQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAQvv/P39/f3vGEJCQ0JDQgAFxcXFxcW6xbq6ura6trq2trW2tLW1tbW1trW5 + tra2ura6urq6xT8GBhbFxcbGNgAYRUNCQwYAAAADG0JHRUNCQ0dCR0JCRypCQkdCQkdCGAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAEN8v39+QtCQkJDQkIcACXGxcXFxcW6xbq6urq2urW2tba1 + tbW1tbW1tba1tra6urq6urrFujcLtcXFxcV+AANDQkUdAAAAAAAABh1CQkJCQkJCQkJCR0JCQkJCQkMZ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKh0GAAAAAAAAAAAAGe4LHUNCQkVDQxQAa8XFxcXFusW6xbq2 + trq6tra0trW1tbW1tbW2tra2ura6urq6xbrFxbXFxcfFx8UFAB1DQx4AABFdDgAAAB1CRUJDRUJCR0JC + QkVCR0JCRxsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1DQkIYAQAAAAAAAAAAAQMdQkNCQ0JCAwG2xcXF + xcXFurq6urq6urS2tba1tbW1tbW1tba1tra2ura6usW6xcXFxcXFxcXGxTEAC0JDRQ0AAF2PLAAAABtD + QkJHQkJFQkJHQkJCQkJDHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAYqQkJCQkIdAwAAAAAAAAAAAAAGHUNC + Qh0AJcXGxcXFusXFxbq6trq2ura2tra1tbW1tbW2tba2trq2urq6urq6xcXFxcfFx8XGfQEDQkJCQgMA + BI+PYwQAAB1DQkNCQkJCR0JCRypHQkJCAQAAAAAAAAAAAAAAAAAAAAAAAAMcQkJDQkdCRUJCDQAAAAAA + AAAAAAAACB1ECABvxsXFxcXFxbq6urq6ura2trS2tbW1tbW1tbW1trW2trq6urq6xcXFxcXFxcXFxsbL + BQAbRUNCGwAAY4+PYwQAAEJDQkJHQkJCQkJCR0JCQkIGAAAAAAEAAwsbCAAAAQAAAAAAG0JDQkJCQkJC + QkJHHAMAAAAAAAAAAAAAAQ0CBcXFxsXFxcW6xcW6ura6ura2urW6tbW1tbW1tba2tra2ura6urq6usXF + xcXFxcbF6O1TAAZCQkMfAAAtj5CPXgAABkJFQkNCQkJHQkJCQkJCRxABAQEDCBwqR0JCQhwYCAsbKgYB + HUNDQkNCR0JHQkJCKgsBAAAAAAAAAAAAAAA5xcXFxcXFxcW6urq6urq2tra1tbW1tbW1tbW1trW2tra6 + urq6usXFxcXFxcXFy+zs7d0DAB1CQ0MEACOPj5CPIwAAHUJCQkdFQkJFQkJHQkJCHAMLHUJCR0JCR0JC + QkJHQkJCQwYAHUNCRUJCRUJCR0JCQhsDAAAAAAAAAAAABMPHxcbFxcXFusXFurq2ura2ura6tba1tbW1 + tbW2tba2trq2urq6urq6xcXFzOvs7e3s7TUABkJCQgYAEY+Qj4+MBAADQkVCQkJCQkdCQkVCQkdCQkJC + QkJCQkJHKkJCR0JCQkdCHQEDQkJCQ0JCQkdCQkVHQh8IAQAAAAAAAAA97OnFxsXFxcXFurq6urq6ura2 + tbS1tbW1tbW1tba1tra2trq6urrFxcXFxeLr7Ors7O3t2wAAHUVDAwAjj4+Qj4xdAAAcR0JCR0JCQkdC + QkJCRUJCR0JFQkdCQkJHQkJCQkVCR0JDGAADQkJCR0JCQkJCQkNFQkIbAQAAAAAABerr7OnKxcXFxbrF + urq6trq2urW6ubW1tbW1tbW1trW6tbq2urq6urq6xcvo6urs7Ozs7O3tMwAGQkIAACyPkZGPj4wEAAhC + Q0JCQkVCQkJCR0JHQkJCRUJCQkJCRUJCQkdCQkJCQkVCBAALQkNCQkNCQkVHQkJCR0IfCAAAAACE6+vr + 6+vLxcXFxbrFurq6urq0trW2tbW1tbW1tbW2tba2tra6urq6usXi6urr7Ors7Ozs7e3bAgAbHQAAXpCR + kZCPjyMAAUJDQkJCR0JCQkJCQkJCQkJCR0JHQkJHQkJDQkJCR0JCQkIdAAAaQ0JCQkdCQkJCQkJCQkJD + GwMAFuzs6+vr6uvoxbrFurq6ura6trq2tba1tbW1tbW1tba1urS6trq6urrL6Orq6+vq7Ort7O3t7e00 + AAMZAACMj5GRkZGPXgAAHUJCQkdCRUJHQkdCRUJHQkdCQkJCQkJCQkcqR0JCQkJHQkIIAAEdRUNCRUNC + QkdCRUNDRUMeAQLW6+vr6+vr6OnoyrrFurq6trq0urW0trW1tbW1tbW1tbS0tra2urq94ujo6Ovq6uvr + 7Ors7IYzFxYAAAAABI+RkZGRkZCPAAAYQkZCQkJCRUJCQkJCRUJCRUJCR0JCR0JCQkJHQkdCQkVCQh8A + AANCQkNCQkNCQkJCQkNCQgYBQezs7Ovr6uvr6Ojoy8W6urq2ura6trq1trW1tbW1tbW1urW6tLq6xOjo + 6Ojo6urr6+rs7Ow9AAAAAAAAAAAgj5GRkZGRkZEOAAhFQ0JCQkdCQkdCQkdCQkJCQkJFQkJDQkJCR0VC + QkVCQkJHQhgAAAtCQkNCQ0VCR0JDQkUNABbr7Ovr6+vp6+jo6Ojj4sW6urq6urW2tbW1tbW1srW1tbS1 + trS6vdnj2ePj6Ojo6Ovq6+rs6wAADhEREQQAACyQkZGRkZGRjxEABkJCR0JCQkJCQkVCQkJHRUJHQkJH + KkJHQkJCQkJCQkdCQkJCQgMAABxDQkJDQkJDQkNDHAAF3ezt6+vr6+vq6ejo6Ojo4r26urW6tbq1trW1 + tbWzs7W0tbW0udni6OPo6Ojo6Orq6uvr6+vsAQAAI4yPkGUsLY+RkZGRkZGRLAAGQ0JCQkJHQkJCR0JC + R0JCQkJCQkJCR0JCQkJFQkdCQkVCQkJHGwAAAx5CQ0JCQkNCRx0AAa7r7Ovr6+vr6+nq6Ojo5uLj4sS6 + urq0trW1tbW1tbKdtbW0tMLZ2dnZ4uLj4+jo6Ojr6urr6uyGAAAABGWPkI+Pj5GRkZGRkY8sAABCR0JF + QkJHQkNCQkJCQkJHQkJHQkJHRUJHQkdCQkJCQkdCQkJFBgAACEVDQ0JFQ0odAwGG7e3t6+zr6+vq6Ojo + 6Ojo4+bj4sS6tra2urW1tbW1tbW1tbvZ2dnZ2ePj4+Po4+Po6Ojr6+vr6+zbMwAADoyPj4yPj5GQj5GR + kSwAAEJDQkJDQkVCQkVCQkdCR0JFQ0JCQ0JCQkJCQkJCQkdCR0JCQ0IdAAAAG0JCQkRJHQMAQezs6+vr + 6+vo6unp6Ojm4+Lo4uLi2eK9trS1tbW1tbW1tbW9wbzE2dnZ2eLj4uPo6Ojq6ujq6uvr6+zspQAALIyQ + jI+QkZCRkZGQLAADRUNCQkNCQ0JCR0JFQkJCQkJCQ0VCQkdCQ0JCR0JCQkJCQ0JFQ0IGAAADQkNHTB0D + AD3s7Ozt6+vr6+vr6+jo6Ojm6OLo4uLi2dnAtrW1tbW1srK5wcHZ2dnZ2dnZ6Nno6Obj6Ojp6+vr6+vs + 6+zsFwADj4+PjI+QkY+RkZARAAZCQ0JDQkNCQkNCQkJDQ0JDQ0JFQkJDQkJCQkNFQkNFQkJFQkJDQh0A + AAAYSUkdAAE87Ozs6+zr6+vr6+no6Ojo6Oji6OLi4tnE2cHBurW1tbW1vrzAwcHB18TZ2eLZ4+Lj4+jj + 4+jo6urq6+rs7OyoAABej4+MjI+Rj5GRjxEABkVCQ0NCQkJFQ0JDQkJCQkJCQkdCQkNCRUNCQkNCQkdC + QkdCQkJCQgYAAABCGwAAce3s7OzssNbq6+ro6Ojo6Oji6OPi4uLi4tnZxMTBubW1tbK8wcHBwdnB2dnZ + 2eLj2eji6Ojo6Orr6+vq7Ozq7O0FACKQkI+Mj42NkZGMAAAYQkJCQ0VDQ0JCQ0JCQ0VDQkNCQ0JCQ0JC + Q0JDQkNCQ0JCQ0JDQkJHKgAAAAEAAIbs7Ozs7OvWqaWp1djo6Ojo6OPj4uPi4tnZ2cPEwcHAu7W1sry8 + vMHBwcTE2dnZ2eLi4+Pj6OPo6Orq6tqoQTMXDwAAAGWPkIyMj5CMkWUAAAAGHUVCQ0JCQ0JCQ0JDQkJF + Q0JDQkJFQ0JCQ0JCQkNCQkNCQkJKSUlJBgAAAAR/5ezs7Ozr7NaoqaWoqKWprbDV2tra4uLi4sTZ2cTB + wLy3nm9wvL7AwcHX19nZ2dnZ2ejj4uPj6Ojq1kEFAAAAAAAAAAAAIo2MkY+Pj4+PZSMAAAAAAxtCRUNC + Q0RCRUNCQ0JDQkJDRUJDQkNCRUNFQ0NFQ0VHTEhMSUcIAAAVtsbG6+vs5+zr2KipqZ+pk6iTqJOTk5OT + k5Ofn56eknh2cnJWh/W7vLy8wcG819fE2dni4uLj4+Pj1SYAAAAAAAADBgwNDAwNYoyMjIyPj4+Pj4ws + BAAAAAMYQkVFQkJDQkJDQkJDQkJDQ0JDQkNCQ0JCQkdHSUlJTEkcAwABNsbHxsbM7Otb8aeqpZ+on5+o + k5+Tk5OTk5KTknd3dnZ6c1am9fv9/by8vsHBxNfZxNnZ2dni4+Lj40EAAAAABw0cHh4cHhweHB4dNGSN + kJCPj4+Pj4+PXQQAAAAAGB9CRkJCRUJDQkJDQkNCQ0VDRUNCREdHSUxMTEkdBgAAD3/HxsbGxsbN7Kf9 + /fz29e6HV4SEhIalpXOThHOEhFNVpvL2/P39/f39u7y8vLy8xLzXxNnZ2eLZ49omAAAADRwdHR4cHhwe + HR4dHR4cHSqMj5CQj4+Mj4+QkF0RAAAAAAYYGx0fRUVEQ0NFQkVCQkJHR0lLTExMSUkdBgAAATnFx8bG + xsbGxsXlr/r9/f39/f39/Pv5+fb29vb2+fn7/P39/f39/f39/f28u7zAwMHEwcTZxNnZ2eLiMgAAAxwd + HR4cHh0dHh0eHB4dHR0eHJGMjIyQkJCPj4yPkI9jIAAAAAAAAAAAAAAEBgYGBgYGBgYGGR5JSEQbAwAA + ASe2xsbGx8fGxsXGxszb9v39/f39/f39/f39/f39/f39/f39/f1b+/39/f39/Le8u7y8vMHBwdnX2dnZ + 4noAAAcdHR4dHR4dHR4dHR4cHh0eHhwZYJGRj4yMj5GRkY+Pj5CQZSwRAAAAAAAAAAAAAAAAAAAAAAAA + AAADAQAAASWbx8bHx8fGxsbGxsbGxb3y/f39/f39/f39/f39/f39/f39/f399gBY/f39/f39u7u8vMDA + vMTBxMTE2dnZBQABHR0eHR0fHx8fQx9DHx8eHR0dHRwNLo6RkY+MjIyQkZGQjIyMkI+PjGJfLSwsLCwi + ICAhIiwsIAAAAAAAAAAFMZvHx8fGxsXHxsbGxsXGxe79/f39/ftM9v39/f39/f39/f39/fwbAAPy/f39 + /f24u7u8vLzAwcHB2dfE2XcAABseHR0fH0MfQ0MfH0MfQx9CHx4dHhwNFGCRkZGQkIyMjJGRkZCOjY2Q + kI+Qj5CQkI+QkI+Pj5CQLxwNDAMBAAAAAA85usfGx8bFxsXGxcbFWv39/f39+QAd/P39/f39/f39/fxY + AAAAAAv9/f39/be4u7y7wLzAwcHZxNnZOwAEPh0dH0MfH0MfHx9DH0MfQx9CHx8eHRwcDRhgjpGRkJCN + jIyQkZGRkZGOkY2NjIyMkIyMj4+Pj49hHR0dHB0NBwAAAAABNsXGxcbGxsXGxcZa/f39/f1MAAADQu72 + /f39/fxNAANY/P35+/39/f38t7u3vLy8wMG8xMHEwdkWABCGHh9CH0MfH0MfQx9DH0JCQkJCH0IfHR4c + HA0YLmORkZGRkZGRkZGRkZGRkZGRkJCQkJCRkY6QZCQcHh4dHh0dHg0GAAAAAmbGxsbFxsXFxYX9/f39 + +wAATlgbAAAAHVv28kxb/P39/f39/f39/f23t7u7u7y8vMC8wcHZxBYADNNLQh9DH0JDH0JDHx9DHx9D + H0MfQx9CHx4cHBwNDRgrYGWRjpGRkZGRkY6RjZCNjY2NjWViMBINHB0eHRweHR4cHh0cBwAAABW6xcXG + xcbFhfz9/f399vz9/f399u4dAAAAHVj2/P37WP39/f39/Le3u7e7vLzAwMDBw8PXFQAGq9RGQx9DHx9E + H0JCQx9DHx9DH0JDH0MfQh4eHRwcHBkNDQwkKzAwYmRkZGRkYTAwKyQZDQ0bHBwcHR0eHR0dHh0eHB4d + GwMAAAWxxcXFxcWE/P39/f39/f39/ftMA0z8+e9HBgAAGAAA+f39/f39ore3uLu8u7y8wMDBwdkmAANL + 4dRPH0IfQh9DHx9CH0JEH0MfQh8fQkJCH0MfHhwdHBwcHBwcDRsNGQ0NDRkNHBwcHBwcHRweHR0eHR4d + Hh0dHR0dHh0dHgcAAAK1xcXFxYX8/f39/f31TO5MAAbu/P35/P39+/JCABj9/f39/fy3t7e3u7u8vMC8 + wMHBwUAAABxP4eSrS0MfQx8fRB9DHx9CQkJCQkMfH0MfQx9DHx4eHh0cHBwcHBwcHBwcHBwcHBweHB4e + Hx9DH0IfQx9DHx8eHh0dHh0dHg0AABPFxcXFhPz9/f39/VsAAAPy/fzuBwAABlj9/f1CAPz9/f39/aKi + t7e7t7u8vMC8wMHEvAIAAx5Gq+Tkq1AfQkMfQh9CQh9CH0JCH0MfQx9CH0MfQx8fHx8eHR4cHhweHR4e + Hh0fH0MfQx9CH0MfREIfQx8fRB9DHx8dHR4dHQ0AADnFxcWF/P39/f39/QAA+/39CAALEB0bC/n9/f37 + /f39/f38t7e3t7u4u7u7vMC8wMHBcAAABh1CS6vk5OGJS0IfQkIfRB9DH0JCH0MfQx9DH0IfWfgfQkJC + Qh9CQx9DHx9DQx9DH0IfQx9DHx8fH0MfQkQfH0MfQx8dHR4dHQYABLbFxYX8/f39/f39HVv9/f1F7vj5 + 9fn5WP39/f39/f39/f2ioreit7e7vLu8vMDAwMHEMgAAARkfQkqE1OTk1INFQkJCH0JDH0MfQh9DH0Mf + Qx/w/fIfHx9DH0NCSVhDH0MfHx9DH0MfQh9DH0RDH0QfHx9DH0MfH0QfHR0dHAAAacXFVfz9/f39/f39 + /f39/FvuHEcLGO4d/f39/f39/f39/J2it7e7t7e3u7y7vMDAwMHBQAAAAAAYHUJCS4ng5OGGRx9DHx9D + QkJCH0IfQh9DTP39/e5EH0MfH0z8/EMfH0MfQx9CH0JDH0MfHx8fH0MfQ0IfQh9DHx8eHh0dAQAnxbZV + /f39/f39/f39/f32Wx0AAAAATPX8/f39/f39/f39op2ioqK4t7u7u7y8wLzAwcTBoxUAAAAABhsfH0NS + 0OTkUkJCQx8fH0MfQx9DH0NE+PX4/fZJRFn2/f36H0JDH0MfQx9DQkIfQkMfREJEH0MfH0QfQx9DH0Qd + HR0QABW2xVv9/f39/f39/f39/fz5GAD2+wsAR0Lu/f39/f39/fydoqKitbe3u7e7u7u8wLzAwMHB154m + AAAAAAALHB9CT9Lkqx8fQx9DH0JCQkIfH0MfH0JO/Pz8/fr4/P1JH0IfQx9CH0IfH0MfH0IfHx8fQh9D + H0MfQx8fH0IdPhYAFcW2W/39/f39/f39/f35QhoAAPn8AAAGABj9/f39/f39/aKdoqKit7e3t7u7u7y7 + wMDBwcHEwcGbOAUAAAAAAxsfH4bkq0IfQkJDH0lJSUlDTvBZ8vz9+/31Hx9DTh8fQx9CH0JCQkNDH0Mf + RB9DQkRCQkIfQh9CH0QfHzTOBQAlurfv/f39/f39/f39/e4AHVgLC1sd9/1M7v39/f39/f38m6KdoqKi + t7e3u7i7vLy8vMDAwMDBurW6tn4xAgAAAAMcQk/kgkMfH0NJSUlOSUn5/f388kwfWf37TR9CQkJCQx9D + H0MfHx9DH0IfQh8fHx9CH0IfQx9DH0SG3lAAADm6oPP9/f39/f39/f39/Ab7/f1bAPn9/fn5/f39/f39 + /f2dnaKdoqK3t7e3ubu7u7y9vMDAwb21trW1trq1ZxMAAAAIQlLgQh9DRElMTExMSfD99UMfQkJCSfr9 + /fAfQh9CH0MfQh9DHx9DH0JCQkJCQkJCH0NGUIOr4eSDGQAAbLqf9v39/f39/f39/f399f39/VsAWPmI + Rxr8/f39/f38/J2bnaKinZ2it7e3t7u7u7y+vsC9tbW1tra1tbq1umcFAAADH86BQh9JTElMSUxMWflJ + H0IfQkIfHvz9XEIfQx9CQkJCQh9DH0IfQk+ChorPz9Lk5OTk5N+KSx0AAAW6uqX5/f39/f39/f39/f1H + G0IYAAAAAAAAAPL9/f39/f39m6KdnZ2iore3t7e3ubu7vLu8vLWzs7W1tba2trq2urUlAAALT6xCQklJ + TE1JTExMSUxJXO5YQx9C9vwfQx9DH0MfQx8fREJCUazk5OTk5NTQzqyGhlBLQkMcAwAAfrq2hfz9/f39 + /f39/f39/QAAAAAAAAAAAAAAHf39/f39/fybm52dop2iop23t7e3t7u7vLy1nbW1tbW1trW1tra2trYl + AAAd30dCTExJTExMSUxMTPL9/f38W0MfQ0JCQh9DH0IfH0MfS9Lk36iCT0JCQkJCH0JCQx0bBgAAAD+2 + trZa/f39/f39/f39/f35AAAAAAAAAAAAAAAA/f39/f39/ZebnZ2dnZ2iore3t7e3u7u7tbW1tbW1tbW1 + tra1tba2trUCAAuGg0JMTExMSUxMTO77/P3y+f1YHx9CH0IfQkIfQx9DH0/k0lBCQkIfHRwZGBgMBgYA + AAAAAAJourq2tfL9/f39/f39/f39/fYAAAAAAAAAAAAAAEL9/f39/f38nZebm52dop2dop23t7e3u7ey + srW1tbW1tbW1tba2tra2tjEAAEfUQklJTExMTElZ+05Y+fv9+vz2H0MfQx9DH0NCQh9P4YNDHRkHAAAA + AAAAAAAAAAAAAAU4tbq2trae9v39/f39/f39/f39/QMAAAAAAAAAAAAG+f39/f39/fyXm5ugm52doqKd + t7e3t7m3srKysrWytbW1tbW1tbW2tbq1fAAAG85PSExMSUxMTPb1SUz2/fYeH/VZQ0IfQkJDHx8fQ9RS + HQsAAAAAAAAAAAAAFhUlOGeXtrq2tra2toT8/f39/f39/f39/f39+xgAAAAAAAAGWP39/f39/f38/Zeb + m5uXnZudnaKdnZ23t52cnLKcmrW1tbW1tbW1trW2tba2BQAFgahITExMTExJ/fz2/P39/VtC9fNCH0Mf + Qh9CQkKKhh0AAAAAEzx1n7ji4uLivbq6ura6tra6tba2pv39/f39/f39/f39/f39/fny7u7u+P39/f39 + /f39/f38l5eXm6CdoJ2dnaKit7ednJyynLK1srKztbW1tbW1tbW2tbY5AAAe30dMSUxJTFj9/f39/f39 + /fb98h9DH0MfQx9DUs4dAAAAO7zi4uLi4sviy+LEtra2ura2tra2tp/2/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39+/aXl5ebl5ubnZudnZ2dnZyampqcsrKysrKysrW1tbO1tbW1tpsAAA2KgkxMTExJ + XP39/f39/f39/f3zQx9CH0JCH0rfRgMABJ/i4uLL4uLi4uLZ2dm5urq1ura2trW1pv39/f39/f39/f39 + /f39/f39/f39/f39/f38+vbzp4Rzl5SXl5eXm52bop2dnZ2cmpycnJycnLKysrK1srK0s7O1tbW1thUA + A0vfR0xMTExO/f39/f39/f39/fAfRB9DHx9E1E8KAAB14uLL4uLiy9nZxMTE2bq6tba2tbW1tqCk8vX2 + 9/n7+/z7/Pz8/Pv7+/v5+fb19fGkhHeSl5eXl5WXl5eXl5ebm5uXnZ2dnZmZmpqampyympyysrKys521 + tbW1tbW1ZwAAHM6FSUxMTEn5/f39/f39/f39TEMfQ0IfQ4mJGwAAMuLE4uLZxNnZy8TE2cTLvba2urW2 + tra1tbW1tbWgoJ6enp6Sn5KSnp6enpeel5mZnZ2bm52bl5eXl5SUl5eXl5eXm5udm52ZmZqZmZycmpqy + srKysrWytbW1tbW1tbW1BAAGUN9JSUlMTE77/f39/f39/fIfQh8fQx+C0h0AAA/B2cTZxMTExMPZw8TD + w8PAtbW2trW1tbWztLW1tbKytZy1srKaspyanJqZnJmZmZmbnZubl5eXlZSUl26XbpeXl5ebm5edmZaZ + mZmcmZqanJqanJycspyasrWzs7W1tbM2AAAdzolMTExMTEnw+Pv9/flcH0NCH0MfT99FAwACo9nExMTD + xNnExMPDw8PDwdm2trW1tbW1s7Ozs7WytbWatbKcmrKampqamZyZmZmZmZabl5uXl5WXl5eUlJeXl5eX + l5eXnZaYmZmYmZmamZyanJydsrK1srW1srKys7W1tZsAAAZL5E9MSUlMTExMSUlEH0MfHx9DH0/fTwgA + AHDExNnExNnDw8PDw8PDw8PDwrW1tbW1tbW1tZ2ysrWcsrWymrKynJycmpqamZmZmZiWmZaZl5eVl5SU + lJSUbm6XbpeXl5eXlZiYmJmZmZmZmpmampqampqcsrKasrOys7K1tTYAAB2G30tMTExMSUxMRB9DH0JC + Qx9P4VEYAAAyw8PDw8PDwsPDw8HBw8LDwr6+vbW1tLW1tbW1tbWynLWyspqynJqampqdmZmZmZmZmZmV + lZeXlZeUl5SUfHyUl5SXl5eXl5WVlZaYmJmYmZmZmpqampycsrKasrK1nbKysrO1mAEABkLS1EtJTElM + TElCQx9CHx9CUuSCGwAAD7zDw8PDw8PDwcLCw8LAwMC+wr67tbSys7KztbWysrWyspqaspyanJqZmpmZ + mZmZmZWYlZWVlZeXlJeUlHyUbpRulJSUl5eUlZWVlZaWlZmZmZmZmZqampqamrKasrKytbObtZq1NgAA + GEbU4VJESUlHQh8fQkJCSorhUh0AAAG4wcPBwsLCv8LCwMDCvsC+vr68vb61nbWys7KymrWymrKasrKa + mpqampqZmZmZmZWYmZWVlZWUlZSXlJR8lG5ubpSUl26XlJWUlZWVlZiZlpaZlpmZmZqZmpqamrKcmpqy + srKytbW1DwAAHUbO5NKCRh8fQkIfS4ng1E8dAAACoMDCwsLAwL7CvsDAvr6+vb6+vL28u7W1tbWdsrKy + spyymrKcmpyampmamZmZmZmWmZaVlZWVlZWUlZR8lJRtfG1ufHyUlJSUlJWVlJWVlZWYmZmZmZmZmZqa + mpqampqysrKaspyymrV8AgAAHUKC3+Tk1M/Pz9/k4YZDGwAAAIDAvr6+vr6+vr6+vry9vry8vbu9u72+ + tbK1srKysrKyspyympqamZqampmZmZmZlpmYlZWVlZWVlJR8lJR8fHxtbW1tbnyUlJSUlJSVlZWVlZWV + mJiZmZmZmZmZmpqampqamrKcsrKysrJoAAAAG0JCUorP3+DSrIJGHwsAAAF4vr6+vr6+vr6+vr28vby7 + vbu7u7u7u7e3srKysrKcnJqampqampqamZmZmZmZmZWYlZWVlZWVlJSUlJR8fHxtbW0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA + AABAAAAAgAAAAAEAIAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32e/wh+oP8If6L/CICk/wmC + pv8Jgqj/CoSq/wqErP8Lhq7/C4ex/wuIs/8MirT/DIq2/wyLuP8Njbr/DY68/w6Pvf8OkL//DpDA/w6R + wv8PksP/D5LE/w+Sxf8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCWyf8Qlsn/EJXJ/xCVyf8Qlsn/EJbJ/xCV + yP8QlMj/EJXH/w+Ux/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkL//Do++/w2OvP8Njbv/DYy5/wyL + t/8MirX/C4mz/wuIsf8Lhq//CoSt/wqEq/8Jg6n/CYKn/wmBpf8If6L/CH6g/wd9nv8He5z/B32e/wh+ + oP8If6L/CICk/wmCpv8Jg6n/CoSr/wqErf8Lhq//C4ix/wyJtP8Mirb/DIu4/w2Nuv8Njrz/Do+9/w6Q + v/8OkcH/D5LC/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJbJ/xCWyv8Ql8v/EJfL/xCXzP8Ql8z/EJfM/xGX + zP8Rl8z/EJfM/xCXzP8Qlsz/EJbL/xCWy/8Qlsr/EJXJ/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6R + wf8OkMD/Do++/w2OvP8Njbr/DIu4/wyKtv8MirT/C4iy/wuHsP8Kha7/CoWs/wqEqf8Jgqf/CYGl/wiA + o/8IfqD/B32e/wh+oP8If6L/CYGk/wmCp/8Jg6n/CoSr/wqGrv8Lh7D/C4iy/wyKtP8Mi7f/DYy5/w2N + u/8Njr3/DpC//w6Rwf8PksL/D5LE/w+Uxv8PlMf/EJXI/xCWyv8Ql8v/EJfM/xGYzf8Rl83/EZjO/xGZ + z/8Rmc//EZnP/xGZ0P8RmdD/EZnQ/xGZ0P8RmtD/EZnP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCV + yv8Qlsn/EJXH/w+Uxv8Pk8X/D5LD/w6Rwf8OkL//Do+9/w2Ou/8Njbn/DIu3/wyKtf8LiLP/C4ex/wqG + rv8KhKz/CoSq/wmCp/8JgaX/CICj/wh+oP8If6L/CICk/wmCp/8Jg6n/CoSr/wqFrv8Lh7D/C4iz/wyK + tf8Mi7f/DY26/w2OvP8Oj77/DpDA/w6Rwv8PksT/D5TG/w+Ux/8Qlsn/EJbK/xCXzP8Rl83/EZjO/xGY + z/8RmdD/EZnR/xGa0f8SmtL/EprS/xKa0/8Sm9P/EpvT/xKb0/8Sm9P/EprT/xKa0/8SmtL/EpvS/xGZ + 0f8RmdD/EZnP/xGYzv8Rl83/EJbM/xCXy/8Qlcn/EJXI/w+Uxv8PksT/D5LD/w6Rwf8OkL//DY68/w2N + uv8Mi7j/DIq2/wyJs/8Lh7H/C4av/wqErP8Kg6r/CYKn/wmApf8IgKP/CICk/wmCpv8Jg6n/CoSr/wqF + rv8Lh7D/C4iz/wyKtf8Mi7j/DY26/w2OvP8OkL//DpHB/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/xGX + zf8RmM//EZnQ/xGa0f8SmtL/EpvT/xKb1P8SnNX/EpzV/xKc1v8Sndb/E53W/xOd1/8Tndf/E57X/xKd + 1v8SnNb/Ep3W/xKc1f8SnNT/EpvT/xKa0/8SmtH/EZnQ/xGYz/8RmM7/EJfM/xCWy/8Qlsn/EJXH/w+U + xv8PksT/DpHC/w6Qv/8Njr3/DY27/w2Muf8Mirb/DIm0/wuIsf8Lhq//CoSs/wqEqv8Jgqf/CYGl/wmC + pv8Jg6n/CoWr/wqFrv8Lh7D/C4mz/wyKtv8Mi7j/DY27/w2Ovf8OkL//DpHC/w+SxP8PlMb/EJXI/xCV + yv8Ql8z/EZfN/xGYz/8RmdD/EprS/xKb0/8SnNT/EpzV/xKd1v8Tndf/E57Y/xOe2f8Tntn/E57Z/xOf + 2v8Tn9r/E5/a/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb0/8SmtL/EZnR/xGZ + z/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Txf8PksP/DpDA/w6Pvv8Njrv/DYy5/wyKtv8MibT/C4ix/wuG + r/8KhKz/CoOp/wmBp/8Jgqj/CoWr/wqGrv8Lh7D/C4iz/wyKtv8MjLj/DY27/w6Pvf8OkMD/D5LC/w+T + xf8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGZ0P8SmtL/EpvT/xKc1f8Sndb/E53X/xOe2f8Tn9r/E5/a/xOg + 2/8UoNz/FKDc/xSh3f8Uot7/FKLf/xSi3/8Uod3/FKDc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E57Z/xOe + 2P8Tndf/EpzV/xKb1P8SmtL/EZnR/xGYz/8Rl83/EJbL/xCVyf8Qlcf/D5PF/w+Sw/8OkcH/Do++/w2O + vP8NjLn/DIq2/wyJtP8Lh7H/C4au/wqErP8Jg6n/CoSq/wqErf8Lh7D/C4iz/wyKtf8Mi7j/DY27/w6P + vv8OkMD/D5LD/w+Txf8PlMf/EJbK/xCXzP8RmM7/EZnQ/xKa0f8Sm9P/EpzV/xOd1v8Tntj/E57Z/xOf + 2v8UoNz/DHKd/wAJDf8AAwT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAEB/wAF + Bv8ISmb/FKLe/xSg3P8Tn9v/E5/a/xOe2P8Tndf/EpzV/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJbK/xCV + yP8PlMb/D5LD/w6Rwf8OkL7/DY68/w2Muf8Mirb/DImz/wuHsf8Kha7/CoSr/wqErP8Lhq//C4iy/wyK + tf8Mi7j/DY27/w6Pvf8OkMD/D5LD/w+Txf8Qlcj/EJbK/xCXzP8RmM7/EZnQ/xKa0v8SnNT/EpzW/xOe + 2P8Tntn/E57a/wY5Tv8AAQH/AAAA/wAAAP8AAAD/BgYG/wgICP86Ojr/cXFx/46Ojv+VlZX/kJCQ/4WF + hf9DQ0P/DQ0N/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAgK/xSi3v8ToNv/E5/a/xOe2P8Tndf/EpzV/xKa + 0/8RmdH/EZjP/xGYzf8Ql8v/EJXI/w+Uxv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4ew/wqF + rf8jkrb/C4iy/wyKtP8Mi7f/DY26/w2Ovf8OkMD/D5LD/w+Txf8QlMj/EJbK/xGYzf8RmM//EZnR/xKa + 0/8SnNX/E53X/xOe2f8Tn9r/AAcJ/wAAAP8AAAD/BAQE/0RERP+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ycnP+Li4v/BAQE/wAAAP8AAAD/AAMD/xGQ + xf8Tn9v/E57Z/xOe2P8SnNb/EpvU/xKa0v8RmtD/EZfN/xCXy/8Qlsn/D5TG/w+SxP8OkcH/Do++/w2N + u/8MjLj/DIq1/wuIsv8Lhq//KZa6/yyZvv8wnML/C4y5/w2Ovf8OkL//D5LC/w+Txf8Qlcj/EJbK/xGX + zf8RmM//EZrR/xKb1P8SnNb/E57Y/xOf2v8KW33/AAAA/wAAAP8ODg7/nZ2d/52dnf+dnZ3/nZ2d/52d + nf+dnZ3/nZ2d/52dnf+cnJz/m5ub/52dnf+enp7/nZ2d/5ubm/+dnZ3/nZ2d/52dnf+UlJT/Xl5e/zEx + Mf8WFhb/AAAA/wAAAP8AAAD/AAQF/xSh3f8Tn9r/E57Y/xKd1v8SnNT/EprS/xGZ0P8Rl83/EJbL/xCW + yf8PlMb/D5LD/w6QwP8Oj73/DY27/wyLuP8MirX/C4iy/yuYvf8um8D/M57E/zeiyP86pMv/EpPC/w+T + xf8Qlcf/EJbK/xGYzf8RmM//EprS/xKb1P8SnNb/E57Y/xOf2v8ACg7/AAAA/wEBAf81NTX/i4uL/52d + nf+dnZ3/nZ2d/5ycnP++vr7/yMjI/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8jI + yP8EBAT/iIiI/6mpqf+np6f/qKio/6ioqP+oqKj/qKio/6mpqf8HBwf/Ax8s/xOf2/8Tntn/E53X/xKc + 1f8SmtL/EZjQ/xGXzf8Qlsv/EJXI/w+Uxv8PksP/DpDA/w2Ovf8Njbr/DIu3/wyJs/8smb//MJ3D/zSf + xv85pMr/PKbN/0Gp0P9GrNT/MaTR/xCXzP8RmM//EprR/xKb1P8Sndb/E57Z/xOf2/8ABgf/AAAA/zIy + Mv81NTX/NTU1/zU1Nf+cnJz/sLCw/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf9AQED/p6en/6ioqP+oqKj/qKio/6ioqP+oqKj/qamp/0lJSf8TExP/oaGh/wAA + AP8ACQz/E6Db/xOe2f8Tndf/EpzV/xKa0v8RmdD/EZfN/xCWyv8Qlcj/D5PF/w6Rwv8Mj7//L57F/y2b + wv8pmb//L5vB/zOfxf83osj/O6XM/0Coz/9Dq9L/SK7W/0ux2f9QtNv/Urbd/xOc1P8Sndb/E57Z/xOf + 2/8ACg3/AAAA/zU1Nf81NTX/NTU1/zU1Nf84ODj/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/BAQE/6ioqP+oqKj/qKio/6ioqP9fX1//JCQk/yQk + JP8kJCT/paWl/wQEBP8rKyv/AAAA/wAHCP8UoNz/E57Z/xOd1/8SnNT/EprS/xGZz/8RmM3/EJbK/zGj + zv87p8//OKTM/zOgyP8vnsX/KprB/zGew/81oMf/OaTL/z6nzv9CqtH/Rq3V/0qw2P9PtNv/Urbe/1e5 + 4P9au+P/X73k/wyc2v8RjsT/AAAA/zU1Nf81NTX/NTU1/zU1Nf9ERET/RUVF/0VFRf9GRkb/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/vLy8/6enp/+oqKj/qKio/5+f + n/8kJCT/JCQk/yQkJP8kJCT/JCQk/6enp/8ICAj/RUVF/0NDQ/8AAAD/AAoN/xSg3P8Tntn/E53X/xKb + 1P8goNT/SrHa/0au1/9Cq9T/PajR/zmmzv81osr/MZ/H/y2bwv8zn8X/OKLJ/zulzf9AqdD/RKzT/0iu + 1v9Nstr/ULTd/1W43/9auuL/Xrzk/2K/5v9lwen/AAAA/ywsLP81NTX/NTU1/zU1Nf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wcH + B/+oqKj/qKio/yEhIf8kJCT/JCQk/yQkJP8kJCT/JCQk/xoaGv9ERET/RERE/0VFRf9FRUX/Ojo6/wAA + AP8Nb5r/EJ7b/1q65P9VuOL/ULbf/0yz3P9Jsdr/RKzW/0Cr0/87p9D/N6TM/zOhyf8vnsX/NaDH/zmj + y/8+qM//QqrS/0at1f9KsNj/ULTc/1S33v9YuuH/XLvj/2C/5v9lwej/UZm5/wEBAf81NTX/NTU1/zU1 + Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/5CQkP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf8ICAj/qKio/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP+Tk5P/CQkJ/0VF + Rf9FRUX/RUVF/0VFRf8GBgb/AAAA/2C/6P9bvOb/V7nj/1O34f9OtN3/SrHb/0eu2P9CrNX/PajS/zml + zv81osr/MJ/H/zejyf87pc3/QKnQ/0Or0/9Irtb/TrLa/1G03f9VuOD/Wrvi/1695f9jwej/Z8Lq/wIH + Cv8xMTH/NTU1/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9FRUX/RUVF/0VFRf9FRUX/SEhI/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/lZWV/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/p6en/wkJCf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8YMj3/X7/o/1m85f9WuOL/ULbf/0yz + 3P9Ir9n/RK3W/0Cr0/86ptD/NqPM/zOhyf85o8r/PajP/0Gq0v9GrdX/SrDY/0+z2/9Ttt7/WLnh/1y8 + 5P9hv+f/ZcHp/2nD6v8AAAD/NTU1/zU1Nf9ERET/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/SEhI/7CwsP/Jycn/ycnJ/8nJyf/Jycn/y8vL/xoaGv8kJCT/JCQk/ygo + KP8oKCj/KSkp/ycnJ/8lJSX/JCQk/4CAgP8/Pz//RUVF/0VFRf9ERET/RUVF/0VFRf8oKCj/AAAA/2DA + 6f9cvuf/V7nk/1K34f9OtN7/SrHb/0Wu2P9CrNX/PKjS/zilzv80osr/OaTM/z6o0P9Dq9P/R67W/0yy + 2v9QtN3/Vbfg/1q74/9evub/Y8Do/2fC6v9kuN3/AQEB/zU1Nf82Njb/RUVF/0VFRf9FRUX/RUVF/0FB + Qf82Njb/NjY2/zY2Nv9ERET/RUVF/0NDQ/82Njb/Pj4+/0VFRf9FRUX/RUVF/0tLS/9dXV3/tra2/8jI + yP8GBgb/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+7u7v/ubm5/4CA + gP8MDAz/BAQE/wAAAP9iwev/Xr/o/1m85f9WueP/ULbg/0yz3f9HsNn/Q63W/z+q0/85pc//NaPM/zul + zf8/qdH/RK3V/0iv2P9Os9v/UrXe/1e54f9cvOT/YL/n/2TB6f9pxOz/GTA5/x0dHf81NTX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf83Nzf/NjY2/zY2Nv82Njb/RUVF/0RERP82Njb/NjY2/zY2Nv9ERET/RUVF/0RE + RP81NTX/NjY2/zY2Nv81NTX/AQEB/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u//Ozs7/RERE/0RERP8CAgL/GzdD/1/A6f9bvef/V7rk/1K34f9NtN7/SLHb/0Su + 2P9Aq9X/OqbQ/zekzf88ps7/QarS/0Wu1v9LsNn/T7Pc/1S33/9YuuL/Xb7l/xATFP9mwur/asbt/wEG + CP81NTX/Ozs7/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/RUVF/0VFRf87Ozv/NjY2/zY2 + Nv82Njb/PT09/0VFRf82Njb/NjY2/zY2Nv81NTX/Gxsb/zU1Nf9ERET/u7u7/7u7u/+7u7v/u7u7/7u7 + u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8rKyv/Q0ND/zc3N/0RERP9FRUX/NjY2/wIICv9hwer/Xb7o/1e7 + 5f9TueL/TrXf/0qy3P9Fr9n/QazW/zyo0v84pc7/PafP/0Os0/9Grtf/S7La/1C03f9VuOH/Wrvk/1Ws + 0f8QEBD/EA8P/2zG7f8EDRD/NTU1/0VFRf8DAwP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/NTU1/zY2Nv82Njb/NjY2/0FBQf9ERET/NjY2/zU1Nf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP+5ubn/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/z8/P/9DQ0P/Q0ND/ra2t/0RERP9FRUX/RUVF/0VF + Rf8AAAD/Y8Lr/16/6f9avOb/Vbrk/1C34f9Ms93/R7Da/0Kt1/89qdP/OKXP/z+o0f9ErtX/R6/Y/02z + 2/9Rtt//Vrni/1u85P9fvOT/ERUV/xAQEP8QEBD/AAID/zQ0NP9FRUX/RUVF/0VFRf9FRUX/EBAQ/wAA + AP8iIiL/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv9ERET/RUVF/zY2Nv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8TExP/Pz8//0NDQ/9DQ0P/Q0ND/CAgI/zU1 + Nf82Njb/Ojo6/0VFRf9FRUX/AAAA/2TC7P9fwOr/W73n/1a65P9RuOL/TLTe/0ex2/9Crdf/PqrU/zmm + 0P8/qNH/RKzV/0mw2f9OtNz/UbXe/1e75P9dvef/Yb/n/2XC6/9syPH/HTM8/wAAAP9ERET/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/0JCQv81NTX/NjY2/zY2Nv81NTX/RUVF/0RE + RP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9DQ0P/Q0ND/0NDQ/9DQ + 0P95eXn/CwsL/zU1Nf82Njb/NjY2/zY2Nv9FRUX/RUVF/wAAAP9lw+z/YMHr/1u96P9XuuX/Urji/021 + 3/9Jstz/Q67Y/z+r1f86p9H/QKrS/0St1v9JsNr/TrTd/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ + EP8AAAD/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8AAAD/AAAA/wAA + AP8tLS3/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP/R0dH/y8vL/xAQEP8cHBz/3Nzc/83Nzf8ICAj/Kioq/zY2Nv82Njb/PDw8/0VFRf8AAAD/ZcTt/2HB + 6/9dv+n/WLvm/1O44/9NtOD/SrPd/0Su2f9Aq9X/O6jS/xCVyP8Qlsv/EZjO/xKa0v8QEhL/EBAQ/xAQ + EP8QEBD/EBAQ/xAQEP8QEhL/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/IiIi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/+Dg4P/+/v7//v7+////////////4eHh/ysrK/82Njb/NjY2/z09 + Pf9FRUX/AAAA/xWl5f8VpOL/FKLf/wyd3P8tqt3/TrTg/0mx3f9Er9n/QKzW/zup0/8Qlcj/EJfM/xGY + z/8SmtL/EE9n/xAQEP8QEBD/EBQV/xOHuf8Sa5H/EBAQ/wUFBf8nJyf/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/x8fH/AAAA/wEBAf////////////// + ///j4+P/AgIC/zY2Nv9ERET/RUVF/wAAAP8Wpub/FaTj/xSi4P8Uod3/E5/a/xOd1/8Sm9P/EZnQ/xGY + zf8MlMn/EJbJ/xCXzP8Rmc//EprT/xKd1v8Sksj/FKHc/xSh3/8QFBX/EBAQ/xAQEP8Vir7/AwMD/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/29vb/wAA + AP8QEBD//////////////////////wsLC/82Njb/RUVF/0RERP8ABQb/Fqbm/xWl5P8Vo+H/FKHe/xOf + 2v8Tndf/EpvU/xGa0f8RmM3/EJbK/xCVyf8Rl8z/EZnQ/xKb0/8Tndf/E5/a/xSh3f8QEQ7/EBAQ/xAQ + EP8QFRX/F6jq/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/6Ojo//////////////////////8NDQ3/RERE/0VFRf9ERET/AAoN/xan + 5/8VpeT/FaPh/xSh3v8Tn9v/E57Y/xKc1P8RmdH/EZjO/xCWyv8Qlsn/EZjN/xGZ0P8SnNT/E53X/xOf + 2v8Uod3/FKLg/xAPEP8QEBD/Fqfo/xeq7P8AAgP/RERE/0VFRf9FRUX/AAAA/xISEv9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/9vb2///////p6en/RERE/0VF + Rf9FRUX/Dw8P/xKRyf8Wp+f/FaXk/xWj4f8Uod7/E5/b/xOe2P8SndX/EZrR/xGYzv8Qlsr/EJXJ/xGX + zf8RmdD/EpvU/xOd1/8Tn9r/FKHd/xWj4f8VpOP/FZrV/xao6f8Xquz/BCk6/x4eHv9FRUX/AAAA/wAA + AP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9FRUX/DAwM/wAAAP8AAAD/AAAA/wAA + AP8LCwv/RERE/0VFRf9FRUX/RUVF/wAAAP8WqOn/Fqfn/xWl5P8Vo+H/FKHe/xOg2/8Tntj/EpzV/xGa + 0f8RmM7/EJbK/xCVyf8Rl83/EZnQ/xKb1P8Tndf/E5/a/xSh3f8Vo+H/FaXk/xam5v8WqOn/F6rs/xer + 8P8AAAD/RUVF/0VFRf8AAAD/KizQ/x8hnf8AAAD/NjY2/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEREf9FRUX/RUVF/0VF + Rf9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAwP/RERE/0VFRf8ACAr/Fqfq/xan5/8VpeT/FaTi/xSh + 3v8ToNv/E57Y/xKc1f8RmtH/EZjO/xCXy/8Qlcn/EZjN/xGZ0P8SnNT/E53X/xOf2v8Uod3/FaLg/xWl + 5P8Wpub/Fqfp/xeq7P9BuvH/AQQF/0RERP9FRUX/AAAA/wAAAP8sLtb/KSvO/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/xEREf9ERET/MzMz/wAAAP8AAAD/FBQU/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8DAwP/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/FaHh/xao + 6v8Wp+f/FaXk/xWj4f8Uod7/E6Db/xOe2P8SnNX/EZrR/xGYzv8Qlsr/EJbJ/xGYzf8RmdD/EpvT/xOd + 1/8Tn9r/FKHd/xSi4P8VpOP/Fqbm/xKl6P9zzPT/d831/2Glw/8CAgL/RUVF/0VFRf8AAAD/LC7W/yst + 0/8BAQj/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8jIyP/RERE/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8AAAD/AAAA/wAA + AP8AAAD/AAEB/1nB8f8WqOr/Fqfn/xWl5P8VpOH/FKHe/xOf2/8Tntj/EpzU/xGZ0f8RmM7/EJbK/xCW + yf8Ql8z/EZnQ/xKa0/8Sndb/E5/a/xSh3f8UouD/FaTj/2bF7v9tyPH/csvz/3bO9f97z/b/AAAA/0VF + Rf8iIiL/AAAA/ywu1v8sLtb/KizQ/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsLC/8DAwP/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/wICAv8AAAD/AAAA/2rA5/9tyPP/Z8bx/xan5/8VpeT/FaPh/xSh3v8Tn9v/E53X/xKc + 1P8RmdH/EZfN/xCVyv8Qlcj/EJbM/xGZz/8SmtP/EpzW/xOe2f8UoNz/HaXh/2LC7P9nxe7/bMbw/3DK + 8/90zPT/ec/2/1SPqv8BAQH/AAAA/wAAAv8sLtb/MDLX/ywu1v8AAAD/ERER/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/zY2 + Nv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wIJC/9vyvT/bMnz/2bH8f9jxO7/FKTj/xSi + 4P8Uod3/E5/a/xOd1/8Sm9T/EZnQ/xGXzf8Qlsr/EJTI/xCWy/8RmM//EprS/xKc1f8Tntn/WLvm/12/ + 6f9hwev/ZcTu/2rG8P9uyfL/csv0/wAAAP8AAAD/AAAA/wAAAP8qLND/NDbY/zY42f82ONn/Fxh0/wAA + AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0FBQf8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP9yy/X/bcr0/2rH + 8v9lxfD/YcLu/1zA6/9Ruuf/FKHd/xOf2v8Sndb/EpvT/xGZ0P8Rl8z/EJXJ/w+Ux/8Ql8v/EZjO/xKa + 0f9Br93/Ubfi/1a75f9avuj/X8Hr/2PD7f9oxu//bMjx/zhkef8AAAD/Ky3V/yst1f8AAAD/KizQ/zY4 + 2f82ONn/NjjZ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RERE/wIC + Av9wxu7/cMv1/2zK9P9nxvH/Y8Xw/17B7f9bv+v/Vbzo/1G55f8Tntn/EpzW/xKa0v8Rmc//EJbM/xCV + yP8PlMf/EJXK/xCYzv9Hr9v/S7Pe/1C34f9UuuT/WL3n/12/6v9iwuz/Zsbv/2rH8f9uyvP/AAAA/wAA + AP8sLtb/LC7W/yos0P82ONn/MjTX/zY42f8qLND/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/IiIi/0VF + Rf9FRUX/Tk5O/wICAv8+boT/c8z2/23J9P9qyfP/ZcXx/2LE7/9dwOz/Wb7q/1S75/9PuOT/S7Xh/xee + 1v8SmtL/EZjO/xCWy/8Qlcj/D5TG/zyp0/9BrNb/RK/a/0qy3f9OteD/U7nj/1a85v9bvun/X8Dr/2TE + 7v9oxvD/bMjy/3DK9P82YHP/AAAA/yst0v8oKsj/LC7W/ywu1v82ONn/KizQ/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/wAAAP9FRUX/UVFR/wICAv8bLjb/c833/3DM9f9syfT/Z8by/2PE8P9fwu7/W7/r/1a8 + 6f9Suub/Tbfj/0q04P9FsN3/QK3Z/xGYzv8Qlsr/D5TH/zalzv87qNL/P6vW/0Ou2f9Isdz/TLTf/1C3 + 4v9VuuX/WL3o/12/6v9hwu3/ZcTv/2nH8f9tyfL/csz1/wAAAP8rLdP/LC7W/yos0f8zNdf/NjjZ/yUn + vP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8/boT/dM33/3HM9v9qxe7/RIyl/2PD + 7v9hwu7/XcHt/1m+6v9UvOj/ULnl/0u24v9Is9//Q7Dc/z6s2f87q9b/EJXJ/w+Txv81o83/OKbR/z2p + 1P9Crdj/Ra/b/0qy3v9Pt+H/Urnk/1a85/9bvun/X8Hs/2TE7v8AAAD/AAAA/wAAAP8AAAD/AAAA/yos + 0P8qLNH/LC7W/ywu1v8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/1FRUf9RUVH/AAAA/wAAAP8Xpun/Ysf2/3LL + 9v9ty/X/asjz/0OMpv9BjKX/Pouk/zuIov84hZ//Noag/z2XuP9Cpcz/QarU/z6o0/83ncT/KYOh/yN1 + jf9DbXj/NKPM/zalz/87qdP/QKzW/0Ov2v9Ist3/TLTg/1C34/9UuuX/Qo2u/wAAAP8AAAD/AAAA/yor + Kf85Ojf/OTo3/zk6N/8zNHj/KizO/yst0v8qLM7/LC7W/ywu1v8FBRr/AAAA/wAAAP9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9PT0//UVFR/1FRUf9QUFD/AgIC/wAI + C/8ZrvT/GK3z/xit8v9uy/b/19fX/42Ojf9gcnf/Qomf/zuJo/85h6D/N4Sf/zSEnv8xgpz/MICZ/yt+ + mP8se5P/YW1w/6qrq//+/v7/9/f3/zGhyv81pM7/OabR/z2r1f9Crtj/RbDb/0qz3v9NtuH/CRUa/wAA + AP82NzT/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8rLdT/Ky3U/ywu1v8qLM7/Ky3U/ywu + 1v8WF2v/AAAA/wAAAP8AAAD/BQUF/yIiIv8oKCj/RUVF/0VFRf9FRUX/SkpK/1FRUf9RUVH/UVFR/09P + T/8DAwP/AAAA/xKLw/8ZrvX/GK3z/xis8v8Yq/D/F6vu/2FcWv///////////////////////v7+//// + //////////////7+/v////////////////////////////f39/8un8j/M6PM/zal0P87qtT/P6zX/0Ku + 2v9Hst3/S7Xg/wAAAP85Ojf/OTo3/zk6N/85Ojf/QEE+/z9APf85Ojf/OTo3/zk6N/8zNDH/Jymm/zI0 + 1/8qLM7/KizO/zEz1/8wMtf/KizO/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/C1yB/xmv9v8Zr/X/GK3z/xis8v8YrPD/F6vv/xep7f9UfZD///////// + //////////////////////////////////////////////////8AAAD///////7+/v/39/f/LJ3G/zCh + y/80pM7/OafR/zyq1f9Brdj/RLDb/wAAAP8VLEL/OTo3/0BBPv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/OTo3/zIyMP8bGxr/LS/W/zQ22P8rLdT/KizO/yst0v82ONn/LC7W/yoszv8qLM7/KizP/yst + 0v8rLdX/LC7W/ywu1v8sLtb/Ky3V/zk6N/85Ojf/AAAA/wAAAP8AAAD/AAAA/xit8v8YrPD/F6vv/xep + 7f8XqOv/Jp3R/////////////////wAAAP/j4+P//////////////////////wAAAP8AAAD/Xl5e//// + ///+/v7/9/f3/yqcxf8unsj/MqLN/zal0P85qNP/PqvW/0Ku2v8AAAD/QWyX/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zExL/8bGxr/IiJo/y8x1/82ONn/MjTY/zI0 + 1/82ONn/NjjZ/zEz1/8qLM7/KizO/yoszv8oKsj/KizO/xsbGv85Ojf/OTo3/zk6N/85Ojf/OTo3/wAA + AP8AAAD/BSo7/xep7f8XqOv/Fqjp/xmn5f///////////7+/v//X19f//////wAAAP8AAAD/AAAA/39/ + f////////////////////////v7+//b29v8pm8P/LJ7H/y+fyv80pM7/N6bR/zup1P8/rNf/AAAA/0BB + Pv9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zEx + L/8xMS//JiYk/xsbGv8bGxr/Gxsa/xsbGv8bGxr/Gxsa/xsbGv8mJiT/MTEv/zU1M/85Ojf/OTo3/zk6 + N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wAAAP8AAAD/Fqfp/xan5/8So+X///////////////////////// + //8AAAD/AAAA////////////f39//wAAAP8AAAD///////7+/v/29vb/J5jA/ymcxf8tn8j/MqLM/zSk + z/84p9L/O6nV/wAAAP8AAAD/Q0RB/1Sn+/9HW2z/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/QkNA/zk6N/85Ojf/NTUz/zU1M/81NTP/NTUz/zk6N/85Ojf/Pj88/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9BQj//OTo3/zk6N/85Ojf/AAAA/wUpOf8VpeX/E6Pi//// + /////////////0NDQ/8AAAD//////wAAAP8AAAD/AAAA/39/f///////AAAA///////9/f3/9vb2/ySX + v/8nmcL/K53G/y6eyf8yos3/NaXQ/zmn0/89q9b/AAAA/wAAAP9DREH/Rlhn/1Sn+/9Up/v/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf87PDn/OTo3/zk6 + N/8AAAD/FaTj/xug2P//////////////////////////////////////f39//39/f/9/f3////////// + /////////f39//X19f8hlLz/JZjA/yiaw/8rnsf/LqDK/zKizf81ptH/OajU/z2r1/8AAAD/AAAA/wAA + AP9DREH/Q0RB/0+Kxf9Up/v/Q0NA/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf///////////0NE + Qf9DREH/T1BN//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/zs8Of85Ojf/AAAA/xWj4f8rj7r//////////////////////////////////////wAA + AP8DAwP/ra2t//b29v////////////39/f/19fX/H5K6/yKUvf8mmcH/KZvF/yyeyP8wocv/MqPO/zan + 0v85qdT/PavX/0Ct2f8AAAD/AAAA/wAAAP8aGxn/Q0RB/0+OzP9Pjsz/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf//////9vb2/0NEQf/Ly8r/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTk3/wAAAP8Uod7/W3iD//////////////////// + ////////AAAA/wAAAP8AAAD/AAAA/39/f/8AAAD////////////9/f3/9fX1/xyQt/8glLv/IpW+/yaZ + wv8pm8X/LJ/J/zChzP8yo87/NqfS/zmp1f8SmM7/EZnQ/xKa0/8SnNX/AAAA/wAAAP8eHx7/Q0hJ/0NE + Qf9DREH/S0xJ/1RVUv9UVVL/VFVS//////9DREH/Q0RB/0NEQf//////iouJ/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/UZnh/z1WbP8AAAD/FKDc/2pk + Y////////////////////////////////////////////wAAAP//////AAAA/////////////f39//T0 + 9P8ajrX/HJG4/yCUvP8jl7//JprD/ymcxf8sn8n/MKHM/zOkz/80ptH/EJfM/xGYzv8RmdD/EprT/xKc + 1f8Tndf/AAAA/wQEBP9Up/v/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/2pr + af9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/S3ei/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/S3Wd/0NE + Qf8AAAD/AAAA/xOe2f9vcHH///////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA + AP////////////z8/P/09PT/F4uy/xqPtv8ekrn/IJS8/ySYwP8nmsP/KZzG/yyfyv8vocz/D5TH/xCV + yf8Qlsv/EZjO/xGY0P8SmtL/EpvU/xKc1v8AAAD/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS//// + /////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/S3eh/0NEQf9DREH/Q0RB/0NE + Qf9DREH/PDw5/wAAAP8AAAD/AAAA/xOe2P8Tndb/5eXl////////////////////////////AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/goKC///////8/Pz/9PT0/xaLsP8YjLP/G4+2/x6Suv8glL3/JJfA/yeb + w/8pnMb/DZDB/w+SxP8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGa0f8SmtP/AAAA/wEBAf9LdZ3/VFVS/1RV + Uv9UVVL/VFVS/1RVUv9UVVL//////0JDQP+pqaj/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/Q0RB/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/E57Z/xOd1/8SnNX/EZvU//7+/v////////////// + //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/////////////Pz8//Pz8/8Uia3/Foqw/xiM + s/8bj7f/HpK6/yCUvf8jl8D/HJXA/w6Qv/8OkcH/D5LE/w+Txv8Qlcj/EJbK/xGXzP8RmM7/EZnQ/xKa + 0v8AAAD/UJTY/1RVUv9UVVL/VFVS/6ipp/////////////////9xcW///////0NEQf9DREH/Q0RB/0NE + Qf9HXnL/Ojs4/wAAAP8AAAD/S7fl/0q25P9JtuT/SLXj/0a04v8Tntj/E53X/xKc1v8Sm9T/EprS/111 + fv////////////////////////////////////////////////////////////////////////////z8 + /P/y8vL/EYeq/xSJrf8Wi7H/GI2z/xuPt/8dkrr/IJW9/w2Nuv8Njrz/DpC//w6Rwf8PksP/D5TG/xCV + yP8Qlsr/EJbL/xGXzf8RmM//AAAA/0NEQf9DREH/VFVS/1RVUv/w8fD///////////////////////// + //9DREH/Q0RB/0NEQf9DREH/Q0RB/wAAAP9JteP/R7Xj/0az4v9Gs+H/RLPg/0Oy3/9Bsd//EpzV/xKb + 1P8SmtP/EZnR/w6Y0P/y8vL//v7+//7+/v/+/v7///////////////////////7+/v/+/v7///////7+ + /v/Iycn/cG1t/0V8jP8Khq7/D4Wq/w+Ep/8Rhqv/FImt/xaKsf8YjbP/Go+3/wyKtP8Mi7f/DY25/w2O + vP8Oj77/DpDA/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/wQmM/8AAAD/VKf7/1RVUv9UVVL/VFVS//// + //////////////////9qa2j/Q0RB/0NEQf9DREH/T47M/wAAAP8EDA//RLLg/0Ox3/9Csd//QbDe/0Cv + 3f8/rtz/Pa7b/xCZ0v8RmdH/EZrQ/xGYzv8RmM3/EJbL/xCVyf8Qlcf/EJPF/xGTw/8QkcD/EJC+/w6O + vP8Ojbr/DIu4/wyKtf8Xj7b/Foyz/xSLsf8SiK7/D4Wq/w2Dp/8MgaT/D4Sn/xGGq/8Uia3/FYqx/wuH + r/8LiLL/DIm0/wyLt/8NjLn/DY67/w6Pvf8OkMD/DpHC/w+SxP8PlMb/D5TH/xCWyf8Qlsr/AAAA/0NE + Qf9GWmv/VFVS/1RVUv9UVVL/VFVS/6Chn/9DREH/Q0RB/0NEQf9DREH/VKf7/wAAAP8AAAD/QK/d/z+u + 3P8/rtz/Pq7b/z2t2/88rdr/OqvZ/zmq2P8zqNb/EZjO/xCXzP8Qlsv/EJXJ/xCVyP8Pk8b/D5LE/w+S + wv8OkMD/Do++/w2OvP8Njbr/DIu3/wyKtf8LiLL/C4ew/xOKsf8SiK7/D4ar/w2Cp/8KgaX/C4Ci/wyB + pP8Phaj/EYer/xOIrf8KhK3/C4av/wuIsf8MibT/DIq2/wyLuP8Njbr/DY69/w6Qv/8OkcH/D5LD/w+S + xP8PlMb/D5TH/wAAAP8AAAD/T47M/0NEQf9UVVL/VFVS/1RVUv9DREH/Q0RB/0NEQf9DREH/VKf7/zEy + MP8AAAD/PK3a/zus2f86q9n/OqvZ/zmq2P83qtf/N6nX/zWo1f81p9X/M6bT/xCXy/8Qlcn/EJXI/w+T + xv8Pk8X/D5LD/w6Rwf8OkL//DY69/w2Nu/8NjLn/DIu3/wyKtP8LiLL/C4ew/wqFrf8KhKv/D4ar/w2D + p/8KgaX/CX+i/wh9n/8LgKL/DIGk/w+Ep/8Jg6j/CoOq/wqErP8Lhq//C4ex/wuJs/8MirX/DIu3/w2N + uf8Njrv/Do+9/w6Qv/8OkcH/D5LD/w+SxP8PlMb/AAAA/zIzMf9Tpvv/S3We/0NEQf9DREH/Q0RB/0NE + Qf9DQ0D/VKf7/0JCQP8AAAD/N6nW/zap1v82qdb/NqjV/zWn1f81p9X/NKfU/zOm0/8ypdL/MKTR/y+i + z/8PlMf/D5TG/w+Txf8PksP/DpHC/w6QwP8Oj77/DY68/w2Nuv8Mi7j/DIq2/wyJtP8LiLL/C4av/wqE + rf8KhKv/CYKo/wuCpv8KgaX/CX+i/wh+n/8HfJ3/CH2f/wqAov8IgKP/CYGl/wmCp/8KhKr/CoSs/wqF + rv8Lh7D/C4iy/wyKtP8Mirb/DIy4/w2Nuv8Njrz/Do++/w6Qv/8OkcH/DpHC/w+SxP8AAAD/QEE+/0NE + Qf9Up/v/VKf7/1Sn+/9Up/v/Q0RB/zAxL/8AAAD/J3+h/zOm0/8zp9P/MqbS/zKl0f8xpNH/MKPQ/zCj + 0P8uos//LaLO/yyhzf8qn8z/DZHE/w+Sw/8OkcH/DpDA/w6Pvv8Njrz/DY27/w2Muf8Mi7f/DIq1/wuI + s/8Lh7H/C4av/wqFrf8KhKr/CYKo/wmCpv8IgKT/CX+i/wh+n/8HfJ3/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAgAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAEB/wgI + B/8BBAr/AwkM/wsLC/8QEA//BAsT/wgUGP8SEhL/GBkX/xAXGv8QGBv/Gxwc/x8gHv8gIR//CAgn/wMa + JP8MHCP/BB4q/xYeIf8KCzX/BCAt/xQjKv8EKDf/GC02/xYxPf8jIyP/KCgm/ycpKf8rLCv/MDEu/yQk + Nv8lLDD/Kisx/yUlPP8uNTr/Nzc3/z9APf9AQT7/Dg9G/xARTv8RElf/BjJE/ww1Rv8GNkn/BzlO/xM3 + Rv8HPFT/JSVI/yg7SP8mJlX/FRZp/xgZef8nKGT/JSZ3/zIzf/8HQln/GURW/yVBTP88Q0b/JExe/zlL + W/8JSmb/EUlg/xJRbP8LV3f/EVZy/y1Obv8sV2n/N1lu/ztbdP84Znr/RERD/0hJRv9ESUv/S0tK/09R + Tv9QUU7/RExR/0NQWv9LU1j/U1NR/1hZVv9bXFv/YWJf/0ZZaP9HXXH/R2B3/0phdv9IZH3/YmJi/2xs + bP9xcm//c3Nz/3x8fP9/gH7/gYF//xschv8dH5D/HiCT/yMlm/8mJ6T/LzGl/yUnuP8KX4H/DGWL/xJl + iP8NapP/B3yd/wh+n/8gaIT/OWyD/yxwjP86dIr/JnWU/zd7lv8OdaH/CX2h/xJ1ov9KaIT/SmyM/0Z3 + jP9JbpL/TnKT/0N9lv9LdJz/QX+b/0x5pP9Me6j/TX+w/ykryf8vMc//Ky3S/y4w1P8yNNf/N4Ga/wmB + pP8KhKv/GoKi/xGHqv8Sia3/HYiv/wuHsP8LibT/DY27/xCBsf8Ui7L/Goyz/xKEuP8Qir7/HI24/w6Q + vv8akLf/HJK6/y6Jqv89iqf/Jo+6/zKNtP89j7T/JJa9/zSVu/9GgZf/V4aV/3CTnf9Fiqb/WpWs/02B + tP9Ohbz/QJi5/1mauP9vnK7/epym/xGNwf8OksP/D5bL/xOUxv8ZlcP/EJXK/xGYzv8amsz/EpzU/ymb + xP82nML/IZ/R/xSg3P8soMz/NqPL/yCh1f8spNP/J6XZ/y2q3/8zpdH/OabR/zWo1f88qdP/M6rc/zus + 2v8VpuX/GK3y/yir5P8yruT/LbDr/z6y4/8msPD/T4rF/1CPzf9HncD/UJHT/1elxf9DrNX/V63S/0Sw + 3P9Lstv/U7Tc/2Kt0P9htdn/RLLg/0u14f9GuOv/S7rs/1e75P9Gu/H/Yr3l/13B7P9MwPb/V8Dw/2PC + 6/91xuv/asfx/3PM9f+EhIP/i4uK/4+Qjv+RkY//mZmZ/5ikqf+Grbr/kqu1/6Kiov+oqaf/qqqq/6+w + rv+ntbj/ubm5/8DAv/+UssD/qb7G/77Bwf/IyMj/1tbW/+bm5v/09PT//v7+/wAAAP8AAAD/AAAA/2xs + bIiIiIiJiY6Pj4+QkJCQrJCtra2tra+ur7GxsbGxrrGxsa6xsa2vra2tra2srZCQkI+Pj4mJiYmJiIh1 + bWxsbYiIiImJiY+Pj4+QkJCQkK2tra2xrrSxsbGxsbGurrKxrrGusbGxsbGxrK2trZCQkJCQj4+Pj4mJ + iYmIiGxtbYiIiImJjo6Pj4+QkJCsra2tsbGxrKyxrLS0tLS0tLSytLS0tLSxtLGxsbGusa2trZCXkJCQ + j4+PjomJiYiIdYiIiYmOiY+Pj4+XkJCXra2xrrGxtLG0tLS0tLS0tLS0tLS0tLS0tLS0tLGxsayxsa+t + rayQkJCPj4+JiYmIiIiIiIiJi4+Pj4+QkJCtra2xsayxrLS0tLS0tLS0tLS0tLi0uLS0tLS0tLS0tLSx + sbKxsaytrZeQkI+Pj4mJiYmIiImOiY+Pj5CXl62tra+xsbG0tLS0tLS4tLi0uLi0uLi4tLi0tLS0uLS0 + tLS0tLSsrLGxra2XkJCQj46PiYmJiImJiY+Pj4+Xl5etr6+xsay0tLS0tLS0tLS0tLSslHZ2dpGstMW4 + tLS4uLi0tLS0tLSxsa+sra2tkJCQj4+PiYmJiY6Pj4+Xl5evrbGysbS0tLS0uLS4uJRBLxACAAAAAAAA + AAIGKkF2tLS0tLS0tLS0tKy0sa+trJCQkJCPiYuJiY+Pj4+Xl5evra+xrLS0tLS0tLSsPgYCAAIaJEtS + WlpaU00lGwUAAAIvdrS4uLS0tLS0sbGxr62tl5CPj4+Oj5iMko+Xl5etrbGysbS0tLS0uKwsAAIOUV7q + 7urq7uru6u7u6u7q5lohAQAQarS0tLi0tLSxsbGvra2XkJCQj4mfn5+Yl5etra6xsbS0tLS0tEICAiRe + 6urq6uru8PDx8fHx8PDuX1pRSyQGAQASdrS0tLS0tLSxsa+tl62Qj4+Pn7a6urq1r66vsrS0tLS0tBcA + CCFd7uru8PP0+Pj4+Pj4+Pj48yFTX+ru8O7uXiE+tLS0tLS0sbGxr62Ql5eQmJ+2urq6wtG5srK0tLS0 + tBIBDCQkJOnx+Pj4+fj4+Pj4+Pj4+Frn8PDw8O/mWltcABe0tLi0tLSxsq+tr7Cfn7W1urq60dHS1NXT + u7S0tCsBHSQkJCRR8/j4+Pj4+Pj4+Pj4+PQl8O/u7loeGhtdGg4AF7S0tLS0tLG0v7q6urmfoLq6ztHR + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA + IAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32f/wh/ov8JgaT/CYKn/wqEqv8KhK3/C4ew/wuI + s/8MirX/DIu4/w2Nuv8Njrz/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJTH/xCVyP8Qlsn/EJbJ/xCV + yf8Qlcn/EJbJ/xCWyf8Qlcj/EJXI/w+Ux/8PlMb/D5LE/w+Sw/8OkcH/DpC//w2Ovf8Njbv/DIy4/wyK + tv8MibP/C4ex/wqFrv8KhKv/CYKo/wmBpf8If6L/CH6g/wd8nf8HfZ//CH+i/wmBpf8Jgqj/CoSr/wqF + rv8Lh7H/DIm0/wyLt/8Njbn/DY68/w6Qv/8OkcH/D5LD/w+Txf8PlMf/EJXI/xCVyv8Qlsv/EJfM/xGX + zf8Rl83/EZjO/xGYzv8RmM7/EZjO/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/w+Ux/8PlMb/D5LE/w6R + wv8OkL//DY69/w2Nuv8Mi7j/DIq1/wuIsv8Lhq//CoSs/wmDqf8Jgqb/CICj/wh+oP8If6L/CYGl/wmD + qP8KhKv/C4av/wuIsv8MirX/DIu4/w2Nu/8Oj77/DpHB/w+Sw/8Pk8X/EJXI/xCWyv8Qlsv/EZfN/xGY + zv8RmtD/EZnR/xKb0v8SmtL/EpvT/xKa0/8SmtP/EprT/xKa0v8SmtL/EZnR/xGZ0P8RmM//EZfN/xCX + zP8Qlcr/EJXI/w+Txv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4av/wqErP8Jg6n/CYKm/wiA + o/8JgKT/CYOo/wqEq/8Lhq//C4iy/wyKtf8NjLj/DY68/w6Qv/8OkcL/D5LE/w+Ux/8Qlcn/EJbL/xGY + zv8Rmc//EZnR/xKa0v8Sm9T/EpzV/xKc1v8Sndb/E53X/xOd1/8Tndf/E53X/xKd1v8SnNb/EpzV/xKb + 1P8SmtP/EZrR/xGY0P8RmM7/EJfM/xCWyv8Qlcj/D5PF/w6Rwv8OkMD/DY68/w2Muf8Mirb/C4iz/wuG + r/8KhKz/CYOp/wmBpf8Jg6j/CoSr/wuGr/8LiLL/DIq2/w2Muf8Njrz/DpDA/w+Sw/8PlMb/EJXI/xCW + y/8Rl83/EZnQ/xKa0v8Sm9T/EpzV/xOd1/8Tntj/E57Z/xOf2v8Tn9v/E6Db/xSg2/8UoNv/E6Db/xOf + 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJXJ/w+Uxv8PksT/DpDA/w2O + vf8Njbr/DIq2/wuIs/8Lh7D/CoWs/wmDqP8KhKr/CoWu/wuIsv8MirX/DYy5/w2Ovf8OkMD/D5LE/w+U + x/8Qlcn/EJbM/xGYz/8RmtH/EpvU/xKc1v8Tntj/E5/a/xOf2/8Tntr/AAMD/wAEBf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAQH/Dn6t/xSh3P8UoNv/E5/a/xOe2P8SnNb/EpvU/xKa0v8RmdD/EZfN/xCV + yv8Qlcf/D5LE/w6Rwf8Oj77/DY26/wyKtv8LiLP/C4av/wqEq/8KhK3/C4ex/wyKtf8NjLj/DY68/w6Q + wP8PksP/D5TH/xCWyv8Rl83/EZnQ/xKa0/8SnNX/E53X/xOf2v8ToNv/AAEC/wAAAP8AAAD/DAwM/1JS + Uv+bm5v/nJyc/5ycnP+cnJz/nZ2d/4eHh/8CAgL/AAAA/wAAAP8AAAD/AAcK/xSg3P8Tn9r/E57Y/xKc + 1f8SmtP/EZnQ/xGYzv8Qlsv/EJXI/w+SxP8OkcH/DY+9/w2Nuf8Mirb/C4iy/wqFrv8olbn/Eoy1/wyL + uP8Njrz/DpDA/w+SxP8PlMf/EJbK/xGYzv8RmdD/EpvT/xKd1v8Tntn/E5/Z/wAAAP8AAAD/RUVF/52d + nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/AwMD/wAA + AP8ACAv/FKDb/xOe2f8Tndf/EpvU/xGZ0f8RmM7/EJbL/xCVyP8PksT/DpHB/w2Ovf8NjLn/DIq1/wuH + sf8rl73/MJzC/zagxv83osr/D5LD/w+Ux/8Qlcr/EZjO/xGZ0f8Sm9T/E53X/xOf2v8ADhH/AAAA/zQ0 + NP+cnJz/nZ2d/52dnf+dnZ3/tbW1/8jIyP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/IyMj/Dg4O/4aG + hv+oqKj/qKio/6ioqP+oqKj/CwsL/wVEXv8Tn9r/E57Y/xKc1f8SmtL/EZjO/xCWy/8Qlcj/D5LE/w6Q + wP8Njrz/DIu4/wyJtP8tmr//M5/F/zmkyv8+p87/Q6vS/0iw1/8RmM3/EZnQ/xKb1P8Tndf/E5/a/wAE + Bf8AAAD/NTU1/zU1Nf81NTX/oaGh/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf8EBAT/qKio/6ioqP+oqKj/qKio/6SkpP8kJCT/p6en/wAAAP8ACQz/E5/b/xOe2P8SnNX/EZrR/xGY + zv8Qlsr/D5TH/w+Sw/8imcP/L57F/yqZv/8wncP/NqHH/zumzf9BqdH/R63V/02y2f9Rtd3/V7ng/wya + 1/8Tn9r/AyAt/wICAv81NTX/NTU1/zU1Nf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8jIyP+lpaX/qKio/6ioqP83Nzf/JCQk/yQkJP8kJCT/PDw8/0VFRf8AAAD/AAcJ/xOf + 2/8Tntj/EpzU/xGZ0f8RmM3/Q6zU/zyn0P84pc3/M6DH/y2bwv80n8X/OaTL/z+oz/9ErNP/SrDY/1C0 + 3P9WueD/W7vj/2G+5v9mwun/AAAA/zU1Nf81NTX/NjY2/0VFRf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJ + yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/39/f/+oqKj/p6en/yQkJP8kJCT/JCQk/yQkJP8jIyP/AQEB/0VF + Rf9FRUX/AAAA/wdScv8Sntr/V7ni/1C23/9Lsdv/Ra3X/0Cq0/86ps//NaLK/y+dxf82ocj/O6XN/0Gq + 0v9HrdX/TrLa/1O33v9ZuuL/Xr3l/2TA6P8DDRL/NTU1/zU1Nf83Nzf/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wQEBP+pqan/JCQk/yQkJP8kJCT/JCQk/yQk + JP+np6f/RERE/0VFRf9FRUX/RERE/wAAAP9gv+j/Wbzl/1S34f9Os93/SbDa/0Os1f88qNL/N6TM/zKg + x/85o8r/PqjP/0Ss1P9JsNj/ULTc/1e44P9cu+P/YsDn/2jC6v8AAAD/NTU1/zU1Nf9FRUX/RUVF/0VF + Rf9DQ0P/NTU1/0VFRf9FRUX/RUVF/0VFRf/Kysr/ycnJ/8nJyf/Jycn/ycnJ/3Z2dv8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP+qqqr/RUVF/0VFRf9FRUX/RUVF/w8PD/8AAgP/Xb7n/1e54/9RtuD/S7Lc/0Wv + 2P9Aq9T/OaTO/zOiyv85pMz/QKnR/0at1v9Nsdr/U7be/1m64v9evub/ZcHp/2rD6/8BAQH/NTU1/0VF + Rf9FRUX/RUVF/0RERP82Njb/NjY2/0RERP9FRUX/PDw8/0NDQ/9FRUX/RUVF/0NDQ//ExMT/ycnJ/wAA + AP+6urr/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/u7u7/7e3t/9ERET/EBAQ/wMDA/8AAAD/YMDp/1q8 + 5v9UuOL/TrTe/0ew2v9Crdb/O6jR/zakzP88ps7/QqvT/0iv2P9Os9v/Vbjg/1u85P9hwOj/Z8Pq/12s + zf81NTX/QEBA/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/0VFRf9ERET/NjY2/zY2Nv9ERET/RUVF/zY2 + Nv82Njb/NjY2/ysrK/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+5ubn/z8/P/0RE + RP8AAAD/YcHq/1y+5/9WuuT/ULXg/0my2/9Ertj/PajS/zekzv8+qND/RK3V/0uw2f9Qtd3/V7ni/12+ + 5v8QEBD/acTr/wABAf8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf87Ozv/RERE/0VFRf81NTX/NjY2/zY2 + Nv9ERET/ODg4/zY2Nv8AAAD/AAAA/wAAAP8AAAD/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/9DQ + 0P/Pz8//Q0ND/0VFRf8iIiL/Y8Hp/16/6P9XuuX/Urji/0yz3f9Frtn/QKvU/zilz/8/qNH/Ra7W/0yy + 2/9Std//WLrj/1u54P8QEBD/EBAQ/wABAv82Njb/RUVF/0VFRf86Ojr/AAAA/0RERP9FRUX/RUVF/0VF + Rf82Njb/NjY2/zY2Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8/P + z//Q0ND/0NDQ/7+/v/81NTX/NTU1/0VFRf9FRUX/KE9f/2DA6v9avOb/U7nj/0203/9HsNv/QKvV/zqn + 0f8/qdL/Rq3X/02z3P9TuOH/SJS1/zt1jf8/d4//V5+//wAAAP9ERET/RUVF/0VFRf9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wEBAf81NTX/NjY2/zU1Nf9FRUX/NjY2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/0NDQ/9DQ0P/Pz8//AQEB/zY2Nv82Njb/NjY2/z4+Pv9ERET/Dx8m/2HB6/9bvej/Vbrk/020 + 4P9Hsdv/QazW/zuo0v9AqtL/LqTS/xOa0P8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wICAv9ERET/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP9FRUX/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CwsL/yIiIv//////8vLy/9vb2/8CAgL/NjY2/zU1Nf9FRUX/AR0p/yeq + 5f9cv+n/Vrrk/0614P9Jstz/QqzX/zyp0/8Qlsn/EZfN/xKa0v8QGRn/EBAQ/xAQEP8QKjX/EBQT/w8P + D/9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//v7+/wAAAP8FBQX////////////a2tr/NTU1/z09 + Pf9ERET/Cld5/xWk4/8UouD/E6Db/xOd1/8SmtP/EpjO/xqay/8Qlsn/EZjO/xKa0v8TnNb/E57a/xSh + 3/8QEA//EBAQ/xNznP8VFRX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP+BgYH///////// + ////////NjY2/0VFRf9FRUX/Fqfo/xWl5P8UouD/FKDc/xOe2P8SnNT/EZjP/xCWyv8Qlsr/EZjO/xKa + 0/8Tndf/FKDc/xSh4P8QEBD/EBEQ/xep6/8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/ERER/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8ODg7//f39///////+/v7/RUVF/0VFRf8EBAT/Fqfo/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCX + y/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8UmNT/Fqfo/xeq7P8ABAX/RUVF/zk5Of8CAgv/AAAA/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9DQ0P/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/PDw8/wAAAP8AAAD/AAAA/xYWFv9ERET/RUVF/0VFRf8AAAD/Fqjp/xWl5f8Vo+H/FKHd/xOe + 2P8Sm9T/EZrQ/xCWy/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xeq7P8XrPH/MjIy/0VF + Rf8AAAD/KizQ/wAAAP9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/zk5Of9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8AAAD/BQUF/0RERP8ENUr/Fqjp/xWl + 5f8Vo+H/FKHd/xOe2P8Sm9T/EZrQ/xCWy/8Qlsr/EZjO/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xOn + 6/94zvX/AAAA/0VFRf8AAAD/KizQ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/y4u + Lv9FRUX/RUVF/0VFRf9FRUX/RUVF/ycnJ/9FRUX/RUVF/0VFRf9FRUX/JCQk/wAAAP8AAAD/AAAA/wAA + AP8Xqez/Fqjp/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCXy/8Qlcn/EZjO/xKa0/8Tndf/E5/b/xSi + 4P8VpOP/a8fw/3HL8/93zfX/J0JQ/0RERP8ICAj/KizQ/ywu1v8qLND/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wkJCf9DQ0P/RUVF/0VFRf9FRUX/RUVF/0RE + RP8AAAD/AAAA/wULDv9syfP/FKbo/xWl5P8Vo+H/FKHc/xOe2P8Sm9T/EZnP/xCWyv8Qlsn/EZjO/xKa + 0v8Sndb/E5/b/zSv4v9jwuz/acfw/3DJ8v90zPT/e9D3/wAAAP8AAAD/KizQ/zY42f8sLtb/AAAA/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/3DL9f9rx/L/ZMXw/1u/6/8UouD/FKDc/xOd1/8SmtP/EZnP/xCV + yv8Qlcj/EZjN/xGZ0f8Sndb/Vbnk/1u96P9gwev/ZsXv/23H8f8FCw3/AAAA/wAAAP8AAAD/LC7W/zY4 + 2f82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf8FBQX/c833/23K9P9nxfH/Y8Tv/1zA6/9WvOj/E5/b/xOd + 1/8SmtL/EZjO/xCWyf8PlMf/EJbM/0ew2/9Ms97/Urjj/1i85/9ewOr/ZMTu/2rG8P9vyfP/AAAA/ywu + 1v8sLtb/LC7W/zQ22P82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wkJCf9FRUX/RUVF/ykpKf9IgZv/cMz1/2vJ8/9lxPD/X8Lu/1m/ + 6v9Uu+f/Tbbj/w6a1f8RmdH/EZfN/xCVyP8MkcX/PqvV/0Su2f9Kst3/ULfi/1a75v9bvun/YcPt/2fF + 7/9syPL/ccz1/wAAAP8sLtX/KizS/ywu1v82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9QUFD/EhIS/xIgJP9zzPb/bcn0/2jG + 8v9jxfD/XcHs/1e86f9Suub/S7Xi/0Wx3f8/rNn/EJfM/w+Ux/82pc7/O6nT/0Kt2P9Isdz/TbXg/1O5 + 5P9Yvej/XcDr/2XE7v9px/H/bsnz/wAAAP8sLtb/Ky3V/ykrx/81N9j/AAAA/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Tk5O/wAAAP8AAAD/IYOr/3PN + 9/9wzPb/RY6n/0KNpv9Bkaz/Wr7r/1S75/9Ot+T/SbTg/0Ow3P89q9j/N6fT/w6Qwv80o8z/OabR/z+r + 1v9Er9r/SrTf/0+34/9Vu+b/Dh0l/wAAAP8AAAD/CQkJ/zk6N/85Ojf/KizO/yoszv8rLdT/LC7W/wAA + AP8AAAD/OTk5/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf9RUVH/SEhI/wAA + AP8ZrvT/GK7z/3DL9v+bm5z/U4CO/z6Jo/88iqP/OIag/zWFnv8xgpz/LX6Z/yl8lv82dor/l5eX//n5 + +f8xocv/NqXP/zyq1f9Cr9n/SLLd/0y14f8AAAD/FxcW/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/ywu + 1v8qLM//LC7W/yoszv8sLtb/AAAI/wAAAP8AAAD/AAAA/wICAv8LCwv/CwsL/wsLC/8+Pj7/UVFR/0JC + Qv8AAAD/BCs9/xmu9f8YrfP/GKzx/xer7/99fX3///////////////////////////////////////// + //////////////j4+P8unsj/NKPN/zmo0v8+rNb/Qq/b/0KkzP8AAAD/OTo3/z4/PP9DREH/Q0RB/0NE + Qf9AQT7/OTo3/yQkI/8wMtf/LC7W/yoszv8sLtb/LC7W/yoszv8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu + 1v8cHB//AAAA/wAAAP8AAAD/GK70/xiu8/8YrPH/F6vv/xeq7P9sa2v///////////8AAAD///////// + /////////////wAAAP8AAAD///////j4+P8sncX/MaLL/zakz/86qNP/Qa3Y/wAAAP9Hjtb/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf82NjT/Gxsa/ykquf82ONn/LS/W/ywu1v82ONn/NjjZ/zQ2 + 2P8zNdf/LC7W/ygqy/8bHCr/OTo3/zk6N/85Ojf/AQEB/wAAAP8Xq+//F6rs/xao6v9bdn///////9zc + 3P8qKir/AAAA/wAAAP+3t7f/Kioq//////////////////j4+P8pm8P/LZ7I/zOjzf83ptH/PKrV/wAA + AP9DREH/Q0xR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zc4Nf8xMS//Li4s/xsb + Gv8bGxr/Gxsa/xwcG/8tLSz/MTEv/zg4Nv85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/C2CH/xan + 5/9KhJv///////////8pKSn/ExMT/1FRUf///////////wAAAP8AAAD///////f39/8mmMD/KpzF/y6f + yv80pM//OajT/z6s1/8AAAD/Q0RB/1Sn+/9Lc5v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/z4/PP87PDn/Pj88/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6 + N/85Ojf/AAAA/xWl5P9Xe4j///////////8AAAD//////wAAAP+AgID/gICA//////////////////f3 + 9/8hlbz/J5nC/yudx/8wocv/NKXQ/zmo1P8+q9f/AAAA/wQEBP9DREH/UJPX/1Sn+/9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf//////Q0RB/0NEQf9DREH/kpOR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf85Ojf/Njc0/wMaJP9nZWb//////////////////////7Kysv8AAAD/AAAA//// + //////////////b29v8fk7r/JJe//yiaw/8sn8j/MaHM/zWm0f85qNT/PqvY/w+Ar/8AAAD/AAAA/0NE + Qf9GXHD/Q0RB/0NEQf9DREH/UVJP/0NEQf9DREH///////////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/QGmT/wMaJP9mZmf//////////////////////wAA + AP8AAAD/AAAA/wAAAP////////////b29v8ckLf/IJS7/yWYwP8omsT/LJ/J/zGizf81pdD/JZ/Q/xGY + z/8SmtL/EpzV/wAAAP8AAAD/SW6Q/0NEQf9UVVL/VFVS/1RVUv9fYF3/Q0RB/0NEQf//////Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DQ0D/S3We/1Sn+/9TpPb/AAAA/xOf2/+fn5////////// + //////////////////9qamr/AAAA/wAAAP////////////X19f8YjbP/HJC3/yCUvP8lmMH/KJvF/yyf + yv8woc3/EJXI/xCWy/8RmM7/EZrR/xKb1P8Tndb/AAAA/0NEQf9UVVL/VFVS/1RVUv9UVVL///////T0 + 9P9DREH/Q0RB/0NEQf9DREH/Q0RB/0dedP9Tpvr/Q0RB/0NEQf9DREH/Q0RB/zo7OP8AAAD/AQ0R/xOd + 1//+/v7//////////////////////wAAAP8AAAD/AAAA/wAAAP////////////X19f8WirD/GY20/x2R + uP8glL3/JZnC/yibxf8OkcL/D5PF/xCVyP8Qlsv/EZjO/xGZ0f8SmtP/AAAA/1Sn+/9UVVL/VFVS/1RV + Uv9UVVL//////0NEQf9dXlv/Q0RB/0NEQf9DREH/Q0RB/0NEQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wxu + mP8Tntj/EpzW/xKb0////////////////////////////wAAAP8AAAD/AAAA/wcHB/////////////X1 + 9f8Sh6z/Foqw/xmOtf8dkbj/IJS9/wyNu/8Oj77/DpHB/w+Txf8PlMf/EJXK/xGXzf8Rmc//AAAA/0NE + Qf9UVVL/VFVS/29wbv//////////////////////Q0RB/0NEQf9DREH/Q0RB/wAAAP9KtuT/SbXj/0e0 + 4v9FsuH/J6Xa/xKc1v8Sm9T/EprS/2pkZP////////////////////////////////////////////// + ///+/v7/+fn5/2poaf8PhKj/Eois/xaKsf8ZjrX/HJG4/wyLt/8Njbr/Do+9/w6Rwf8PksP/D5TG/xCW + yf8Ql8v/EZfN/wAAAP9To/b/VFVS/1RVUv////////////////9CQ0D/Q0RB/0NEQf9Qldv/AAAA/0Sy + 4P9EsuD/QrHf/0Cw3v8/r93/Pa7b/xKa0f8RmdD/EZjO/xCWy/8Tlsn/CZLH/wOQx/8Dj8X/A4zB/wWK + vP8PjLj/DIq0/xaNtf8Ti7H/EYes/w2EqP8MgaT/EISo/xOIrf8VirH/C4ew/wyJs/8Mirb/DY26/w2O + vf8OkL//D5LC/w+Txf8PlMf/EJbJ/wAAAP9DREH/VFVS/1RVUv9UVVL/VFVS/0NEQf9DREH/Q0RB/1Sn + +/8AAAD/P6/d/z+u3P8+r9z/Pa3b/zyt2v85q9n/N6rX/xGXzf8Qlsz/EJXK/xCVyP8PksX/D5LD/w6Q + wP8Oj73/DY26/wyLt/8MibT/C4ex/xOLsf8Rhqz/DoOp/wqBpf8KgKH/DIGk/w+FqP8KhKn/CoWt/wuH + sP8LiLP/DIq2/w2Muf8Njbv/Do++/w6Rwf8PksP/D5PF/w+Ux/8AAAD/VKf7/0tMSf9UVVL/Q0RB/0NE + Qf9DREH/VKf7/wAAAP8SNkb/OarY/ziq1/83qdf/NqjW/zWn1f8zptP/MqXS/xCVyf8QlMf/D5PF/w+S + w/8OkcH/DpC//w2OvP8NjLn/DIq2/wuJs/8Lh7D/CoWt/wqDqv8NhKj/CoGl/wh+of8HfJ3/CoCh/wqA + o/8Jgab/CYOp/wqErP8Lhq//C4iy/wyJtP8Mi7f/DY26/w2OvP8Oj77/DpDA/w+Sw/8ABAX/AAAA/0NG + Rf9Up/v/VKf7/1Sn+/9EUVr/AAAA/wAAAP8zptP/M6bT/zOn0/8ypdH/MKPQ/zCj0P8uo8//LKHN/xaX + xv8PksP/DpHB/w6Qv/8Njr3/DY26/wyLuP8MirX/C4iy/wuGr/8Kha3/CoSq/wmCp/8IgKT/CH6h/wd9 + nv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAMAAAAGAAAAABAAgAAAAAAAASAAAAAAAAAAAAAAAA + AAAAAAAAAAAA/wUGDP8DCQv/CwsL/w8QD/8QEA//BQoU/wcQE/8LERT/AhQb/wsSHP8REhH/ExcY/xMY + Gv8bGxv/ICEf/wgJK/8HGyT/Fh4i/xgdIP8LCzb/AyAr/w4iK/8WIif/BCg3/xYrNP8SMD7/Jycn/zEy + L/8oKDz/ODg3/z9APf9AQT7/DQ5B/xQVTP8GMkT/CDNH/wY5Tv8NPE//ETNB/xM9Tf8YP0//BztR/w49 + Uf8pKUP/IzpE/ykqVv8mPVT/FBVg/whEXP8UQFL/MkBL/y9FWv8nS1r/MERX/zlGUP87SFP/MEhf/wlN + af8STmf/Gk5j/xZPaf8KUW7/C1V1/zJKYP8rVWj/P1Ji/zlTa/8xWWv/N2R4/0REQ/9HSEX/SUpH/0NJ + TP9MTEz/UFFO/0VQV/9FUlv/U1NS/1hZVv9QWF7/XFxc/0RXZ/9HXnL/QF57/1Bgbf9LYXX/RmN+/0hi + ef9iYmL/bGxr/3R0dP95enf/e3t7/xsdif8dH5H/KCmE/yUmnP8lJ6r/KSu2/wxcgf8MZYv/DWyU/w9s + mP8TbJL/DXaf/wd9nv8IfJ7/KGuI/zpsg/89dYn/K3eW/zp7k/8OdKD/CH6h/w99rP8Rd6T/LX+g/0hm + gv9GaYv/SWyM/0pukP9LcZX/RHyW/0pzm/9MdqD/THqm/018qv8pK8j/Ky3S/y4w0/8zNdf/OoKZ/wmB + pP8KhKv/EIWp/xyFq/8SiKz/C4aw/wuJtP8Njbv/EoS1/xSLsv8ZjbT/EoO5/xKJvP8OkL//HJC3/xaS + vf8dkbn/IYmr/yuJqf86kK7/IpS8/yuYvf86kLT/NJO4/0SDl/9Xi5z/ZJCe/02MqP9Kka//UZGu/02A + sv9El7T/S5Wy/0qat/9BmLn/TJy7/1Gauf9dob7/aqS+/3enuv9/rLr/Eo/F/w6Sw/8TlMX/EJXJ/xGY + zf8cmcj/EpvT/xyc0v8Tntj/KZvF/zGdw/88ncX/IJ/R/xSg3P8tocz/NqPL/yah0f8rpNT/JKTY/yun + 3P8sqN3/M6XR/zqm0P81qNb/PKnT/zKp2f87rNr/FaXl/xis8v8gq+r/NbLp/02fwv9Npsn/VaXG/0Os + 1P9Or9f/Q67Y/0mv2P9EsNz/S7Lb/1K13f9hpMP/dq7H/2Sz2P9Es+L/S7Xh/0u45/9Btun/V7rk/2O9 + 5P9dwOv/WMP0/2PC6/9px/H/c8z1/4KCgv+HiIb/ioqJ/5CQj/+Tk5P/l5iW/5ycnP+Bqrr/mbK9/6Sk + pP+nqKb/qKmn/6qqqv+6urr/gK3A/5+6xf+mws7/scfO/8jIyP/R0dH/29zc/9/g4P/j4+P/6+vr//T0 + 9P/+/v7/AAAA/2pqhYWFhoaKi4yMjJKSr7CurrGusbGxsrGxsbGxsbGxr6+SjIyMi4uLhoaFhYVqampy + hYWKiYuLi4yMkpKur7GxsbKxsrKysrK0sbGxsbGxsbGvkpKMjIyLi4uGhoWFanKFhoaGi4uMjIyvsK6x + sbGysrSytLS0tLS0tLS0tLKxsrGxsbCvkoyMi4uLhoaFhYWGhoqLi5KLr6+wsbGytLK0tLS0tra2tra0 + tra2tLS0srKxsbGur6+MjIuLioaGhYaHhouLi5Kvr7GxsbKytLS2tra2u7a2trS7tru2tra2tLS0srKx + sa+vkoyLi4uGhoaKi4uSkpKvsbGytLK0tra2rmU6GBEGBgYQGCU/c7a2tra0tLKysbGvr4yMi4uKhoeL + i4uSkq+vsbGytLa2tmQVAQscSllaW1paT0YPAQYxjba2trS0srGxr6+SkouLipmTjpKSr7CysrS0tLZo + BgpK5evr6+vr6+7r6+vr5k4MABiNtra0tLGxsa+vjIyLi5qavbezr7KytLS2tCQBD+Xr6+7y8vf39/f3 + 9+kfUVvl5VtJOra2tLS0sbGvkoyLjri9vb3Qxbq0tLa0IwYcHkbu9/f39/j39/f391Hu7vHrW0rlASO0 + tra0tLGvsre3mre9xc7T1tbVx7Y6Ax4eHkZR9/f39/f49/f38Vrx7lEbDxxOHgMatbS0tb/Fzr29t729 + ztDQ1tbe4qkGHh4eRkZGUfL39/f39/f4Wu7mHBsPG1EcRiAGP8vU1dXS0L29t7290NPW1t7f4jUPHh9G + RkZGSUrq9/f39/f3WV0bDxsPG1ocSUYeAc/e3tXT1Ma9vb3O0NPW3t/i2QoeHkZJRh8fRkZGWev39/f3 + HhsbGxsbG1keR0dGD0He3t7V0MbGvb3G0NbW1t/ipQweRkZGRhweIEYfIEZOW+nuG+jv8fHx6+jlW1lO + Ewrf3t7V1dLGvcbR09XW4NbidxseRkZGIB4eRh8eHiBGHh4eG/Hy8vLy8vLy8vfrHAup4N7e1NDGvb3Q + 1d7ezxepRBseRkdGRh9GRx4cHkYfHAwDAx7p8vLy8vL39/EfRhtw3t7e29TGxsbQ1dbepRcNGR5HHh4b + HR5GRh4eHkYeBQAAAAAASvLy9/j45RweRh1F4t7e1dTSvdDV1XBtRUUtAx5GRkZGHg4DDhseHkYbAAAA + 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 + AAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAHfZ7/CH+i/wmBpv8Khav/C4av/wuI + s/8Mi7f/DY27/w6Pvv8OkcH/D5LE/w+Uxv8QlMj/EJbJ/xCWyv8Ql8v/EJfL/xCWyv8Qlcn/EJXI/w+U + xv8PksT/DpHC/w6Qv/8Njrv/DIu4/wyJtP8Lh7D/CoWr/wmCp/8IgKP/B32e/wh/ov8Jgqf/CoSr/wuH + sP8MirX/DYy5/w6Pvf8OkcH/D5PF/xCUyP8Ql8v/EZfN/xGZz/8RmdD/EZnR/xKa0f8Sm9L/EZrR/xGZ + 0P8RmM//EZjN/xCWy/8Qlcj/D5PF/w6Rwv8Oj77/DY26/wyKtf8Lh7H/CoSs/wmCp/8IgKP/CYKm/wqE + q/8Lh7D/DIq1/w2Nuv8OkL//D5LE/xCUx/8Qlsv/EZjO/xGZ0f8Sm9P/EpzV/xOd1/8Tntj/E57Y/xOe + 2P8Tntj/E53X/xKc1f8Sm9T/EZrR/xGZz/8Ql8z/EJXI/w+SxP8OkMD/DY27/wyKtv8LiLH/CoSs/wmC + p/8Khav/C4ew/wyKtv8Njbv/DpDA/w+Sxf8Qlcn/EZjN/xGZ0f8SnNT/E53X/xOf2v8UoNv/Dn6u/wAL + D/8ACQv/AAME/wIdKf8Uot//FKDc/xOf2v8Tndf/EpzV/xKa0f8RmM7/EJXK/w+Uxv8OkcH/DY68/wyK + tv8Lh7H/CoSr/wuGr/8MirX/DY26/w6QwP8Pk8X/EJXK/xGYz/8SmtP/E53X/xOf2v8ABgf/AAAA/woK + Cv+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ubm/8FBQX/AAAA/wIdKP8Tn9r/E53X/xKb0/8Rmc//EJbL/w+U + xv8OkcH/DY67/wyKtv8Lh7D/LJi9/zSexP8OkL//D5PF/xCVyv8RmM//EpvU/xOe2P8BFR3/AAAA/52d + nf+dnZ3/nZ2d/6Ghof/Jycn/ycnJ/8nJyf/Jycn/vr6+/wQEBP81NTX/dHR0/wYGBv8Pfq7/E57Z/xKc + 1P8RmND/EJfL/w+Uxv8OkMD/DY26/wyJtP8wnMH/OaLJ/0Gp0P9Irtb/EJjP/xKb1P8Tntn/AAYH/zU1 + Nf81NTX/NTU1/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9/f3//qKio/6ioqP8nJyf/JCQk/wAA + AP8ABwj/E57Z/xKc1f8RmtD/EJbK/w+Txf81oMj/LJvB/zSfxv88ps3/Ra3U/06y2v9XueD/Xr3k/2C+ + 5/81NTX/NTU1/0RERP9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ioqP9SUlL/JCQk/yQk + JP+lpaX/RUVF/0FBQf8CHSj/E57Z/1K33/9JsNr/QavU/zilzf8wnsb/OKPK/0Gp0f9Jr9f/UbXd/1y7 + 4/9jwOj/AAAA/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf8iIiL/JSUl/yQk + JP8kJCT/JCQk/5SUlP9FRUX/RUVF/wICAv9fv+j/V7nj/06z3f9Frdf/PKnR/zSiyv87pc3/RKvU/06y + 2v9XuOD/X77m/2jD6/80NDT/QUFB/0VFRf9FRUX/NjY2/zY2Nv9FRUX/RERE/0VFRf+tra3/ycnJ/wgI + CP+Tk5P/vLy8/7y8vP+urq7/SkpK/wkJCf8JCQn/Kysr/wIJDP9avOb/Ubfg/0mw2v9AqtT/N6TN/z+p + 0P9Hrtf/ULTd/1q74/9jwOf/a8Xs/zU1Nf9FRUX/RUVF/0VFRf82Njb/RERE/zY2Nv82Njb/RUVF/zY2 + Nv82Njb/NjY2/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8/Pz/9FRUX/AAAA/1+/6P9VuuP/TLPd/0Kt + 1/85pc//QKrS/0qx2f9Tt+D/XLzl/xAQEP9wyfD/RERE/0VFRf8iIiL/RUVF/0VFRf9FRUX/NjY2/zY2 + Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/y8vL/+7u7v/u7u7/9DQ0P/Q0ND/NTU1/0VFRf8EBAT/YsLr/1e6 + 5f9OteD/RK7Z/zyo0v9CrNP/S7Lb/w4NC/8RFhj/EhcY/wsLCv9FRUX/RUVF/0VFRf9FRUX/MTEx/wAA + AP8oKCj/NjY2/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/1FRUf/Q0ND/DQ0N/wICAv82Njb/NjY2/yoq + Kv9jwuz/Wrzn/1C34f9HsNv/PanT/xCWyv8RmdD/EBAQ/xAQEP8QEhL/EBIT/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2lpaf/+/v7//////wgI + CP82Njb/HR0d/xWl5P8Uod7/E57Y/xac0v8/q9X/EJfL/xGa0f8Tntj/FKHe/xAQEP8RKjX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE//// + ////////5+fn/0VFRf8BAQH/FaXl/xSh3/8Tntn/EprS/xCXzP8Ql8v/EprS/xOe2f8Uod//EA8P/xao + 6v8BAQH/RUVF/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/ygoKP9ERET/RUVF/wAKDf8Wpub/FKLg/xOf2v8SmtP/EJfM/xCXy/8SmtL/E57Z/xSh + 3/8VpeX/F6nr/wU1TP9FRUX/AAAA/yos0P9FRUX/RUVF/0VFRf9FRUX/Li4u/wAAAP8AAAD/AAAA/wAA + AP9FRUX/RUVF/0VFRf8CAgL/AAAA/wAAAP85OTn/F6jr/xam5v8UouD/E5/a/xKa0/8Ql8z/EJfL/xKb + 0v8Tntj/FKHf/xWl5f9wyfL/eM/2/yEhIf8AAAD/MTPX/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/zY2Nv9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP9syPL/FaXl/xSi4P8Tntn/EprT/xCW + zP8Qlcr/EZnR/xOd1/9Uuub/ZMPt/23H8f92zfX/AwkM/wAAAP82ONn/KizR/0VFRf9FRUX/RUVF/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RUVF/0VFRf9ERET/cMv1/2fG8f9fwe3/FKHf/xOe + 2P8SmtL/EJbL/xCWyf8Rmc//TrTg/1i85v9gwev/acbw/wAAAP8sLtb/KSvN/zY42f8xM9f/MjIy/0VF + Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RkZG/1WXtf9tyvT/ZcTw/1y/ + 6/9Tuub/EZ3X/xGZ0P8Qlsr/OafR/0Kt2P9Ls97/U7nk/1y+6f9lxO7/bcny/wAAAP8sLtb/MDLX/zEz + 1/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/1BQUP8oR1X/ccz2/2nI + 8/9gw+//WL3p/0+45P9Fst7/PqzY/xCUyP82pM7/PqrV/0ex3P9PtuL/V7zn/wAAAP8AAAD/AAAA/x4f + lP8pK8r/LC7W/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf8CAgL/Ga/2/3PM + 9v9rw+v/QYyl/zyJov82hZ//MYGb/yt8l/8neZL/oaKi/zKiy/86qNP/Qq7Z/0q03/8AAAD/OTo3/zk6 + N/85Ojf/OTo3/yMkdf8qLM7/MDLX/ywu1v8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/AAgM/xmu + 9f8YrPL/F6vv//7+/v/////////////////////////////////7+/v/Lp7I/zakz/89q9b/RbHc/zk6 + N/9DREH/Q0RB/0NEQf9DREH/P0A9/yQkIv8xM9f/Ky3V/zI02P81N9j/Ky3S/yst0v8sLtb/LzAt/zk6 + N/8KCgr/AAAA/xer7/8XqOv/mZqa//////8AAAD/Pz8//7+/v//5+fn///////v7+/8pnMT/MaHK/zen + 0v8/rNf/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JDQP8xMS//MTEv/zExL/8xMS//MTEv/zk6 + N/8+Pzz/QkNA/zk6N/85Ojf/AAAA/xan5/91dnb//////wAAAP//////AAAA//////9/f3//+vr6/ySX + v/8rnsf/MqLN/zmo0/8AAAD/Q0RB/0t1nf9RmuP/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NE + Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/AAAA/5aWlv///////////wkJCf8AAAD/X19f//// + ///6+vr/H5O6/yaZwf8sn8n/M6PO/zmo1P8RmtD/AAAA/wAAAP9GWWn/Q0RB/09QTf9UVVL//////3N0 + cv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NFRP8AAAD//v7+////////////AAAA/wAA + AP////////////n5+f8bjrX/IJS8/yeaw/8sn8r/M6PP/xCXzP8RmdD/EpzU/wAAAP9HXG//VFVS/1RV + Uv9UVVL/4ODg/6Sko/9DREH/Q0RB/0NEQf9Up/v/S3We/0NEQf9DREH/AAAA/xOe2f////////////// + //8AAAD/AAAA/wAAAP//////+Pj4/xaKsP8bj7b/IZS9/yaaw/8OkcL/D5TG/xCWy/8RmM//EprT/0NE + Qf9UVVL/VFVS/1RVUv9NTkv/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/Mn2c/xOe2f8Sndb/EprT//// + //////////////////8AAAD////////////4+Pj/EYer/xaKsf8aj7f/DIu3/w2OvP8OkcH/D5PF/xCV + yf8RmM3/AAAA/1RVUv9UVVL///////////9DREH/Q0RB/0dcb/8udpb/RbLh/0Ox3/9Ar93/EprT/xGZ + 0P8Klc7/WW1z/21ra/94cnL/bGts/1drcP8cj7T/FIqw/w+Gqv8MgaT/EYer/xGJr/8LiLL/DIq2/w2N + u/8OkL//D5LD/w+Ux/8Oibj/Rllq/1RVUv9UVVL/Q0RB/0NEQf9Up/v/AAAA/z2u2/89rdr/OqvZ/zep + 1/8RmM3/EJbK/w+Ux/8PksT/DpDA/w2OvP8Mi7f/C4iy/wqGrv8Phqv/CoGl/wh9n/8MgaT/CYOo/wqE + rP8Lh7H/DIq1/w2Muf8Njr3/DpDA/w+Sw/8AAAD/T4vI/0psjf9DRED/UZfe/wAAAP81qNX/NKfU/zOm + 0/8xpNH/L6LP/yygzf8PksT/DpHB/w2Ovf8Njbn/DIq1/wuIsf8KhK3/CYOo/wqCpf8Ifp//AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAQEB/wwMDP8PDxr/DBIU/xMU + FP8SGRz/HBwc/w8eJf8ZGSv/EhM7/w0kLf8WICX/GyEj/xklKv8LKjf/Eycw/xQpMf8QKjX/HSsw/xYz + P/8cMDn/IyMj/yUnKP8rKyv/Li49/yMxOf80NDT/ODk2/zIyPP87Ozv/QUI//xESR/8SE0j/FBVd/wc3 + S/8MN0z/BzlP/ww5Tv8RNUX/GjVA/xg7SP8HPFL/CD5U/y4vS/8vMEn/LT1M/zE8Rv8uLlP/FBVi/xgZ + df8uL27/JSdw/wlDXP8QRVz/JkJO/ypCUf8qS1z/NUpd/whKZf8KTGj/Eklh/xJQa/8JVXP/HVt3/zVN + Zf8hUmf/KlRm/yxXaP8wV2r/OVJp/yNacf8kX3j/Pmp+/0NEQ/9LS0r/RExQ/1NTU/9ZWlf/Ulha/1tb + W/9GVmL/Q1dp/0FbdP9CXnj/QWB+/0hkff9QY3P/ZGRj/2doZf9sbGv/cHFv/3Nzc/93eHb/fn5+/yAh + lv8qK5T/ISOj/ygqr/8mKLb/Jii6/yoru/8MYYb/DGWK/xZkhP8Ocp3/B32e/wl+n/8paoT/J22I/yl2 + l/8IfqH/D3uo/xp9pf8Qeqr/RWaG/0pqiP9KbY3/TG6O/0J0i/8qLMX/Ky3P/ywu0/8uMNT/MTPW/zM1 + 2P8IgKP/CYGm/wyCpf8Jg6j/CoSr/w+Gq/8PgK//CoWs/w2Hr/8bhKT/EYer/xCIr/8Lh7D/C4ix/wyJ + s/8MirX/DI26/w2OvP8RgrP/FIqw/xqPtv8Rjbz/DpC//xuQt/89i6b/PI6q/yCUvP8lmL//LJm9/0KG + nf9JiKP/Vo+i/16br/9DlrH/U5u7/1uevf8RjsP/DpDB/w+SxP8PlMb/EJLC/xyXw/8Qlsr/EZjO/xKa + 0/8endD/E57Y/yWZwv8qm8T/IpzK/y2fyf8xm8P/FKLf/y2izv81oMb/M6PN/zmkzP8ioNP/LKTT/yWl + 2/8optv/M6bT/zmm0f87qdP/O6zZ/xWk4v8bpuL/F6nr/xus7/8YrfL/JKvm/zux4/9PoML/RabO/1ur + zf9Cq9T/T6nQ/0Ou2P9Fsdz/S7Lb/1K13f9fuN//ZqnA/3i0yP96uM//arbZ/0Wz4f9OtuH/T7jl/0m6 + 7v9Rt+D/VLnj/1q75P9Svev/W77p/2C/5v9dwOz/TsD0/1zC8P9iwev/bcfv/2XF8P9ox/H/bcny/4KC + gf+Li4v/lJST/5ubm/+jo6P/qquq/7S0tP+7u7v/v8C//4O6zf+YuML/hbvQ/5HA1f+ZwtT/mcTY/7DK + 1v+7093/w8PD/8nJyf/Q0ND/1Nrd/9nZ2f/m5ub/6+vr//Ly8v/8/Pz/AAAA/2lugIGFi4yNoqKjpaSn + p6enp6enp6Whjo6OiYmEgH1pfYCEhYyNk6OjpKeoqampqampqainp6enoY6NjImEgX2AgYqMjZOjpaep + qampq6urq6upq6mpqaeno6KOjYuEgIGKjI2TpaepqamrqGg+NCoqO2aPq6upqainpKKOjIuEiIyTk6So + qampbyMISldcXV1bTx0HO6GrqamnpI6OjIqZmaakqKipqToEW+jp6+vs7OxdV1pPS2erq6inp6KOkLC1 + xry3qakqFRtM7ff39/f39lvq509PFySrq6mnrq2ts7XIzc7ZbRUaHklZ9vf39/fo6FcWFUwbFju4vczI + tbC1yMzN2eAZGklJSUlN6ff39+VKFRUWTElJBsXXzMq8tLXJzNjZxwwdSUkbHUkeT+bqTFtdXVtcWE0X + Q9vXzMi7u8rN2Z+bF0pJSRweHRxJHRcV6ezs7Ozt7EkZ4NnMyrXIzNjFBTYaHRwaHkkdGx4VAAAAT+z2 + 9+pJSQzc2NTIvMjMQzg2Ax5JSR4VBgYaSQAAAAAAT+nnHRodFdnZ1Mu8qKgRBSYDG0lKSUpJGgYBAAAA + AAABXfb+Vx0Wvr+4ubenqZKPBTUXSUlJSUlKSRoAAAAAAAAG7P7oSRS+vqupp6epqbE9vhQbAhdJSklJ + FQAAAAAABAEBW0xJPMCxq6mop6ixscDAPx0JMRdJSUkVAAQBAQZJHgQAAAZvvr6rqaeoqam+w93SFgh6 + Hx1KSUlJSUlKFx1JShcBD9bAvqupqKSpscTg5KANCXteGklJSUlKSUlJBElJSReg4tq4q6mnp7bU2ODh + RDBge2QVSUpJSUlJSkkaBkkbdOTi29q5qai0yszY3eDkOHd6YRdJSUlKSUlJSR4EF0jh3ODa1cu3pbS8 + y9XJQhIGM3hjHwweSUlJSklKSg1o3vCcmpWWlZ3vtLzLxgsaHR0bMnp6YSEJCAgIFRUlq8LC9f78/fz7 + 6/6ytMhrLh5JSR4dK193fHt7emQvFwYlp8Dz+lvo6Oft/q20umtAVUkeSUkeHhocLCwcGx4eHRsFofH+ + 5eVa5+j+l620uigZc3RLHh5J6krlSUkeSR5JHhs08v7860zo/v6Xra+0vHAqC1RLSk3n6ehJHkkeSR5L + Uyr0/v7mWeX+/pSXrbKuqKihDlFMTObmWUlJUHNyckALcfn+/kkAAPf+kJSXrKWnqKloN0xb9vZbSUst + JkFGZqGt/v7+6lfn/v2HkJSSjqKlp6cPVlv+/lxJOUbUy8SqqbDR8PDu0M+ehn+HiIqMjY6jpD5FTldY + SVImvb29vKqnpKWijoyLiYd+an+AhIqMjY6ijgpUdXNTELC6urq3rqOijo2MioSAfm4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA + AAAYAAAAMAAAAAEAIAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAHfZ//CYGl/wqEq/8Lh7H/DIq2/w2O + u/8OkMD/D5LE/w+Ux/8Qlcn/EJbL/xCWzP8Qlsz/EJfL/xCWyv8QlMf/D5LE/w6Rwf8Njrz/DIu3/wuH + sf8KhKv/CYKm/wh+oP8JgaX/CoSr/wuIsv8NjLj/Do++/w+SxP8Qlsn/EZfM/xGY0P8SmtL/EpvU/xKc + 1f8SnNX/EpvU/xKa0v8RmdD/EZfN/xCVyf8PksT/DpC//w2Nuf8LiLP/CoSs/wmCpv8KhKv/C4iy/w2M + uf8OkMD/D5TG/xCWy/8RmdD/EpzV/xOe2P8Tn9v/FKHc/xCNwf8Untn/FKHd/xOf2/8Tntj/EpzV/xGZ + 0f8Qlsz/D5TH/w6Rwf8Njbr/C4iz/wqErP8Lh7H/DYy4/w6QwP8PlMf/EZfN/xKa0/8Tntj/AAoM/wAA + AP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/5ycnP8AAAD/C2yV/xOe2f8Sm9T/EZjO/xCVyP8OkcH/DY25/wuI + sv8vm8H/OaTK/xGUxv8Rl83/EpvU/xOf2v8AAAD/NTU1/52dnf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6io + qP+oqKj/qKio/6Kiov8Tn9r/EpzV/xGYzv8PlMf/DpC//ySWvv81oMf/QKnQ/0uw2P9XueD/Yb7m/wAA + AP81NTX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/AwMD/6ioqP8kJCT/JCQk/0JCQv8AAAD/E5/b/w2Y + 0/9Hrtj/O6bQ/zCfx/85pMz/Rq3V/1G03f9evOT/acTs/zU1Nf9FRUX/RUVF/0VFRf9FRUX/ycnJ/8nJ + yf/Jycn/p6en/yQkJP8kJCT/Gxsb/0VFRf9FRUX/AAAA/1m75P9Ns93/QqzV/zajy/8/qdD/S7HZ/1e4 + 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 + K/8cLTX/ES05/x8xOP8hISH/IiQj/yQkJP8nJyr/LCws/yIiOP8uMTL/KDc9/zQ0NP8wNzz/Nzc8/zk5 + Of89Pjv/PT09/z9APf9AQT7/GBlL/xobU/8ZGln/FjVC/xs3RP8fO0z/JTpE/yM6Sf8kPkj/ID1N/yY9 + Tf8zM0T/NT5B/zQ1SP8xMlT/IiN4/xZBVv8XSF7/IkBO/yhIVv82SFD/Mkda/zJJXv8zUFz/DUhh/xJP + av8MUWz/ElBq/wpUdP8LWHn/Dlp5/wtef/80TWT/KlVm/zBVav8/V23/QUJB/0NEQf9ERUL/REVF/0xN + Sv9OTkz/QE9c/0xSVv9FUFj/UVFR/1RUVP9YWVb/Wlpa/11dXP9GVWH/QFhu/0dcbv9GXnT/W2Bh/0hg + df9MZn3/YmJi/2pqav9ubm3/cXFx/3Z2dv96enr/IiOe/yosm/8jJKn/Jym2/ycpv/8pK7//DGGF/w9m + jf8MaI7/EWWL/wh+n/8qaIL/KHKP/z1wh/8/d47/JHKS/zF9nP8JfqD/Dnqm/xF3p/8Sfq3/R3qS/ywu + yv8uMM3/LzHV/zM12P8JgaX/DIOn/wqDqP8KhKv/DoWp/w+Ar/8Khaz/EIWp/xaJrv8fi6//D4Gx/wuI + sv8Ni7b/DIy5/w2Ovf8Qg7T/Fouw/xWNtP8OkL//HJG4/x2TvP8vhaf/MoKi/zeHqf8qkrf/I5a+/yWU + vv8ukbj/LJa8/0yXuP8XjsD/DpDB/w+TxP8PlMb/FJPB/xGQxf8Qlcf/FJXH/xuTwP8Qlsn/FJbI/xCX + zP8RmM3/FZrO/xmbzv8Ul9D/EpvT/xOe2P8hl8D/JZjB/y+cwf8qnMT/JZ/N/yyeyP8on8z/MZ/G/zCc + yP8Uod7/HaXf/zWhx/8woMr/NaLJ/zOjzv82o8z/NqTO/zqlzP8tptj/MaXS/zSl0P8xotb/OqbQ/zWo + 1f85qNP/PajR/z2q1v84q9n/ParY/z+v3f8Wpub/F6rt/zu06v8qs/L/V5/A/1qoy/9Cq9P/Q67Y/1Or + 0P9GsNv/S7Lc/1ix1v9Ttd7/WbXc/0Kz4/9PuOX/T7zr/1O34P9UueP/W7zk/2O84/9dwOv/Y8Pt/2rI + 8v9zy/P/gYGB/4SEgv+Ghob/iYmI/4yMi/+NjY3/kJCQ/5WVlf+bm5v/k7G7/6Ghof+lpaT/qKin/6qq + qv+0tLT/urq6/5G1wP+kwcr/rsfR/63Q3/+61N//tdTi/8PDw//FxcX/yMjI/87Pz//J2t//0NDQ/9ra + 2f/a4eT/3ePl//r6+v//////AAAA/2d3eoKDhZaanp6goKCgoJualoWDgnl3Z3d6goSWl56gpKWlpqWl + paWgnpeWhIN6eHuChIWYoKWlpXBjOjxkhqWlpaGYloSDfYiEiZukpZU2Kldc4eBbTAs6pKWknpaEgqmy + raKlcQRF6+319vboXORZMnGloJuZi7LLz9fBCRZCWvX29vbh3hYWHQqVucG/rLjL0dhrFkNFQk/p9vZL + EBBFHEIx2M/LuMDP2Nk1HUUZGxsbS1lX7Ozr5uAI0tbOuMvPzSQVHBsZRBkbEgABV+317EwWlNfPwb9t + JA0ORUUZEA4WAgAAAE/rXBYZjtXPwKB8NwwKRUVFRUUSAAAAABRM/lsYhqamo6ClpTlkGQUbRUUbAAAA + AAEC4E8UsMWlpaGlsMW8FCAeQkVCARADA0UWAQAvxbGloaGlsdXdNSBiEkVFRUVFGxJFQgPKx7CloZ65 + 19vJB112E0VFRUVFRRAZG3Lc29OmoLvO1NrZQGF1BkVEREVFRUICa9nQ1s/Bi7vMzz8PEixzXx8RFBYW + QiRxyPDv7u7n+7O/jRdCQx0sXnN0YF8tDiFwxvPp7Ovl/aq1jjNVRUNDHB0pKxgaHRoSZPH15Vzp/pGz + u2kiPlJERuriT0NDQ0NFLvL+6Uv1/YqorKuhbyNJTeHfR0NSU0E0PPv+5BBa/YeKp5eeoT1QWfrqQ0gw + aGyBr/7++eP3+H6Hg4SJm4koVO3jSifDzsKhn5GTj4B/e254fYKEhZY4QVZTJZK+urqfloWEgn15bgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAA + AAAAAAAAAAAAAAAAAAAIf6L/CoSr/wyJtP8Njrz/D5LD/xCVyP8Ql8z/EZjO/xGYzv8Ql8z/EJbJ/w+S + xP8Njr3/DIq1/wqErP8IgKP/CoSr/wyKtv8OkMD/EJXI/xGZ0P8SnNX/E57Z/xOg2/8ToNv/E57Z/xKc + 1v8RmdD/EJXJ/w6QwP8Mirb/CoWs/xKMtf8OkMD/EJbK/xKb0/8Tn9r/RUVF/52dnf+dnZ3/nZ2d/52d + nf8DAwP/FKDb/xKb1P8Qlsv/DpHB/wyKtf82ocf/R63V/1e54P8DIS3/NTU1/0VFRf/Jycn/ycnJ/8nJ + yf+oqKj/JCQk/zw8PP8ABwn/EpzU/0Os1P8zoMf/PqjP/1C03P9iwOf/NTU1/0VFRf82Njb/RUVF/8nJ + yf/Jycn/JCQk/yQkJP9FRUX/RUVF/12+5/9Lstz/OaTO/0St1f9XueL/acXs/0VFRf9FRUX/RERE/zY2 + Nv85OTn/AAAA/7u7u/+7u7v/u7u7/0NDQ/9jwer/Urji/0Cr1P8updL/EBAQ/xAQEP9FRUX/RUVF/0VF + Rf8AAAD/AAAA/wAAAP8AAAD/DAwM//Ly8v82Njb/Ah0p/1a65P9CrNf/EZjO/xSg3P8QERH/RUVF/0VF + Rf9FRUX/RUVF/xEREf8AAAD/AAAA/wAAAP/+/v7/RUVF/xan6P8Uod3/EZnP/xGYzv8UoNz/Fqfo/wAA + AP8qLND/RUVF/0VFRf8AAAD/RUVF/0VFRf9FRUX/JCQk/wAAAP8WqOn/FKHd/xGZz/8RmM3/Vbnk/2bF + 7/8AAAD/LC7W/wAAAP9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf90zvj/Y8Tv/xOf2/8RmM7/O6nT/021 + 4P9dwOv/bsnz/yst1f8AAAD/RUVF/0VFRf9FRUX/RUVF/05OTv8jg6z/RY6n/1q/6/9JtOD/N6fT/zSj + zf9Cr9v/OTo3/0NEQf85Ojf/LC7W/ywu1v8sLtb/LC7W/wAAAP8YrvT/F6vv//////////////////// + //8qncX/OajT/0NEQf9DREH/Q0RB/0NEQf9DREH/Pj88/0NEQf9DREH/Q0RB/wAAAP///////////39/ + f///////IJS7/yyfyf8loND/EpzV/0pukv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0t1nf8AAAD///////// + //8AAAD//////xaKsP8glL3/DpHB/xCWyv8AAAD/VFVS//////9DREH/Q0RB/0m24/8npdr/EprS//// + //////////////n5+f8MgaT/CoWt/wyKtv8Oj77/D5PF/1Sn+/9DREH/VKf7/zmq2P82qdb/MqbS/w+T + xf8OkL//DIq2/wqFrf8KgaX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAD/Dw8P/w8UFv8VFRX/FSgw/yMjI/8lJSX/KSkp/yoqKv8rKyv/Jygy/ywwMv8vMTL/LzU3/zIy + Mv8zMzP/MjI0/zA2OP8wMD7/ODg4/zk6Ov86Ojr/Ozs7/zw8PP8+Pzz/Pz8//z9APf9BQj//HjpF/zk6 + SP8cHWz/Jyho/yIjdv8iI3r/GUhc/y9HWP84TFX/NkpZ/zJMXP81TFz/N0xc/z9QXv8SSmT/HU5n/xNS + bf8PXn//ElRx/xdcev8ZXHn/Lkxt/zNWZ/86XW3/NWBy/0BAQP9BQUH/QkJB/0NDQ/9DRkX/RERE/0VF + Rf9GRkb/REhJ/09PT/9JSlb/TFpf/1BQUP9TVFH/VldZ/1hYWP9bXVv/XFxc/11dXf9fX1//RVZl/1lq + eP9gYGD/YmJi/2RlYv9iZ2n/b29v/3Fxcf99fX3/IySE/yYno/8sLaL/Jiis/ykrtv8RYoP/DW+Y/w5x + m/8WcZn/LmmD/zFxjv8gd5z/MXua/wh/ov9AdYz/CICj/wuCpf8NgqX/CoSr/w2Brf8Khaz/C4au/wyG + rf8PgbD/DIq1/w2Ltf8Njrz/Do++/xaLsf8Qh7n/DpC//xySuf8ck7z/IoSt/y6IrP8glLz/Mpe+/0yC + mv91lJ//S5u8/w6QwP8PkcL/D5LD/w+SxP8PlMb/EpLB/xOTyf8Qlcn/EJbK/xCXzP8Rl8z/EZjO/xWZ + zv8RmdD/EprT/xKb1P8SnNX/IJfH/yKXxP8qnMX/LZ/J/zCfx/87msD/FKDc/zeiyP80pM3/OqbP/z6o + z/8hotf/KaLQ/yyj0v8uo9D/IqDZ/yup3v82qNX/N6nW/zmo0/8/q9T/Pa3b/xel5v8rr+r/O6/h/zyw + 4P9EocX/TqDD/02jxP9OpMf/RK3V/0Wt1f9Lstz/U7LY/1C03P9qstD/TbXg/1K44f9eueD/X8Lu/2fF + 7/+AgID/hoaG/46Ojv+SkpL/k5SS/5mZmf+ampr/n5+f/6SkpP+oqKj/s7Oz/7m5uf+8vLz/v7+//5PC + 0f+tyNL/vdvm/8fHx//Jycn/2tra/9/f3//L2+P/yuDq/+Tk5P/g6ez/8PDw/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/YWZqbHyBg4WFhIF9bGpnYWZqeoGHiWlYWW+Kh4J7amZxf4KKLUC0urpIJF2Jg39rkqqgMA9Q + xcbAtUE6LJaYj5WtsQs6GUu7t0Q+RxR5q5SprDQTFxoTEwNPwMBMYLCfmBwENTgOBwMAAEy8N1ujnIWA + LhEQOzsDAAABtkZakYeFkaIzHhI7CAkGNgUCmpGHhqSzMVMfOzs6Owg3d7KbhZ6vpjJWIBU7PDwMXK6o + paeTkA0aHVRVUiEKKqHJv8HHjXYjSTk3Qz8XGxgiyr1Ry3WOjFcnQrhNPUkpK8y+Fs1ucnyCL07IRSZe + c4vEw3jCY2hqbWUoSiV0nZd+cGpnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/ABStudio/Libs/7zip/Common/CRC.cs b/ABStudio/Libs/7zip/Common/CRC.cs new file mode 100644 index 0000000..62bb847 --- /dev/null +++ b/ABStudio/Libs/7zip/Common/CRC.cs @@ -0,0 +1,55 @@ +// Common/CRC.cs + +namespace SevenZip +{ + class CRC + { + public static readonly uint[] Table; + + static CRC() + { + Table = new uint[256]; + const uint kPoly = 0xEDB88320; + for (uint i = 0; i < 256; i++) + { + uint r = i; + for (int j = 0; j < 8; j++) + if ((r & 1) != 0) + r = (r >> 1) ^ kPoly; + else + r >>= 1; + Table[i] = r; + } + } + + uint _value = 0xFFFFFFFF; + + public void Init() { _value = 0xFFFFFFFF; } + + public void UpdateByte(byte b) + { + _value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8); + } + + public void Update(byte[] data, uint offset, uint size) + { + for (uint i = 0; i < size; i++) + _value = Table[(((byte)(_value)) ^ data[offset + i])] ^ (_value >> 8); + } + + public uint GetDigest() { return _value ^ 0xFFFFFFFF; } + + static uint CalculateDigest(byte[] data, uint offset, uint size) + { + CRC crc = new CRC(); + // crc.Init(); + crc.Update(data, offset, size); + return crc.GetDigest(); + } + + static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) + { + return (CalculateDigest(data, offset, size) == digest); + } + } +} diff --git a/ABStudio/Libs/7zip/Common/CommandLineParser.cs b/ABStudio/Libs/7zip/Common/CommandLineParser.cs new file mode 100644 index 0000000..b46f6f2 --- /dev/null +++ b/ABStudio/Libs/7zip/Common/CommandLineParser.cs @@ -0,0 +1,274 @@ +// CommandLineParser.cs + +using System; +using System.Collections; + +namespace SevenZip.CommandLineParser +{ + public enum SwitchType + { + Simple, + PostMinus, + LimitedPostString, + UnLimitedPostString, + PostChar + } + + public class SwitchForm + { + public string IDString; + public SwitchType Type; + public bool Multi; + public int MinLen; + public int MaxLen; + public string PostCharSet; + + public SwitchForm(string idString, SwitchType type, bool multi, + int minLen, int maxLen, string postCharSet) + { + IDString = idString; + Type = type; + Multi = multi; + MinLen = minLen; + MaxLen = maxLen; + PostCharSet = postCharSet; + } + public SwitchForm(string idString, SwitchType type, bool multi, int minLen): + this(idString, type, multi, minLen, 0, "") + { + } + public SwitchForm(string idString, SwitchType type, bool multi): + this(idString, type, multi, 0) + { + } + } + + public class SwitchResult + { + public bool ThereIs; + public bool WithMinus; + public ArrayList PostStrings = new ArrayList(); + public int PostCharIndex; + public SwitchResult() + { + ThereIs = false; + } + } + + public class Parser + { + public ArrayList NonSwitchStrings = new ArrayList(); + SwitchResult[] _switches; + + public Parser(int numSwitches) + { + _switches = new SwitchResult[numSwitches]; + for (int i = 0; i < numSwitches; i++) + _switches[i] = new SwitchResult(); + } + + bool ParseString(string srcString, SwitchForm[] switchForms) + { + int len = srcString.Length; + if (len == 0) + return false; + int pos = 0; + if (!IsItSwitchChar(srcString[pos])) + return false; + while (pos < len) + { + if (IsItSwitchChar(srcString[pos])) + pos++; + const int kNoLen = -1; + int matchedSwitchIndex = 0; + int maxLen = kNoLen; + for (int switchIndex = 0; switchIndex < _switches.Length; switchIndex++) + { + int switchLen = switchForms[switchIndex].IDString.Length; + if (switchLen <= maxLen || pos + switchLen > len) + continue; + if (String.Compare(switchForms[switchIndex].IDString, 0, + srcString, pos, switchLen, true) == 0) + { + matchedSwitchIndex = switchIndex; + maxLen = switchLen; + } + } + if (maxLen == kNoLen) + throw new Exception("maxLen == kNoLen"); + SwitchResult matchedSwitch = _switches[matchedSwitchIndex]; + SwitchForm switchForm = switchForms[matchedSwitchIndex]; + if ((!switchForm.Multi) && matchedSwitch.ThereIs) + throw new Exception("switch must be single"); + matchedSwitch.ThereIs = true; + pos += maxLen; + int tailSize = len - pos; + SwitchType type = switchForm.Type; + switch (type) + { + case SwitchType.PostMinus: + { + if (tailSize == 0) + matchedSwitch.WithMinus = false; + else + { + matchedSwitch.WithMinus = (srcString[pos] == kSwitchMinus); + if (matchedSwitch.WithMinus) + pos++; + } + break; + } + case SwitchType.PostChar: + { + if (tailSize < switchForm.MinLen) + throw new Exception("switch is not full"); + string charSet = switchForm.PostCharSet; + const int kEmptyCharValue = -1; + if (tailSize == 0) + matchedSwitch.PostCharIndex = kEmptyCharValue; + else + { + int index = charSet.IndexOf(srcString[pos]); + if (index < 0) + matchedSwitch.PostCharIndex = kEmptyCharValue; + else + { + matchedSwitch.PostCharIndex = index; + pos++; + } + } + break; + } + case SwitchType.LimitedPostString: + case SwitchType.UnLimitedPostString: + { + int minLen = switchForm.MinLen; + if (tailSize < minLen) + throw new Exception("switch is not full"); + if (type == SwitchType.UnLimitedPostString) + { + matchedSwitch.PostStrings.Add(srcString.Substring(pos)); + return true; + } + String stringSwitch = srcString.Substring(pos, minLen); + pos += minLen; + for (int i = minLen; i < switchForm.MaxLen && pos < len; i++, pos++) + { + char c = srcString[pos]; + if (IsItSwitchChar(c)) + break; + stringSwitch += c; + } + matchedSwitch.PostStrings.Add(stringSwitch); + break; + } + } + } + return true; + + } + + public void ParseStrings(SwitchForm[] switchForms, string[] commandStrings) + { + int numCommandStrings = commandStrings.Length; + bool stopSwitch = false; + for (int i = 0; i < numCommandStrings; i++) + { + string s = commandStrings[i]; + if (stopSwitch) + NonSwitchStrings.Add(s); + else + if (s == kStopSwitchParsing) + stopSwitch = true; + else + if (!ParseString(s, switchForms)) + NonSwitchStrings.Add(s); + } + } + + public SwitchResult this[int index] { get { return _switches[index]; } } + + public static int ParseCommand(CommandForm[] commandForms, string commandString, + out string postString) + { + for (int i = 0; i < commandForms.Length; i++) + { + string id = commandForms[i].IDString; + if (commandForms[i].PostStringMode) + { + if (commandString.IndexOf(id) == 0) + { + postString = commandString.Substring(id.Length); + return i; + } + } + else + if (commandString == id) + { + postString = ""; + return i; + } + } + postString = ""; + return -1; + } + + static bool ParseSubCharsCommand(int numForms, CommandSubCharsSet[] forms, + string commandString, ArrayList indices) + { + indices.Clear(); + int numUsedChars = 0; + for (int i = 0; i < numForms; i++) + { + CommandSubCharsSet charsSet = forms[i]; + int currentIndex = -1; + int len = charsSet.Chars.Length; + for (int j = 0; j < len; j++) + { + char c = charsSet.Chars[j]; + int newIndex = commandString.IndexOf(c); + if (newIndex >= 0) + { + if (currentIndex >= 0) + return false; + if (commandString.IndexOf(c, newIndex + 1) >= 0) + return false; + currentIndex = j; + numUsedChars++; + } + } + if (currentIndex == -1 && !charsSet.EmptyAllowed) + return false; + indices.Add(currentIndex); + } + return (numUsedChars == commandString.Length); + } + const char kSwitchID1 = '-'; + const char kSwitchID2 = '/'; + + const char kSwitchMinus = '-'; + const string kStopSwitchParsing = "--"; + + static bool IsItSwitchChar(char c) + { + return (c == kSwitchID1 || c == kSwitchID2); + } + } + + public class CommandForm + { + public string IDString = ""; + public bool PostStringMode = false; + public CommandForm(string idString, bool postStringMode) + { + IDString = idString; + PostStringMode = postStringMode; + } + } + + class CommandSubCharsSet + { + public string Chars = ""; + public bool EmptyAllowed = false; + } +} diff --git a/ABStudio/Libs/7zip/Common/InBuffer.cs b/ABStudio/Libs/7zip/Common/InBuffer.cs new file mode 100644 index 0000000..9c47c73 --- /dev/null +++ b/ABStudio/Libs/7zip/Common/InBuffer.cs @@ -0,0 +1,72 @@ +// InBuffer.cs + +namespace SevenZip.Buffer +{ + public class InBuffer + { + byte[] m_Buffer; + uint m_Pos; + uint m_Limit; + uint m_BufferSize; + System.IO.Stream m_Stream; + bool m_StreamWasExhausted; + ulong m_ProcessedSize; + + public InBuffer(uint bufferSize) + { + m_Buffer = new byte[bufferSize]; + m_BufferSize = bufferSize; + } + + public void Init(System.IO.Stream stream) + { + m_Stream = stream; + m_ProcessedSize = 0; + m_Limit = 0; + m_Pos = 0; + m_StreamWasExhausted = false; + } + + public bool ReadBlock() + { + if (m_StreamWasExhausted) + return false; + m_ProcessedSize += m_Pos; + int aNumProcessedBytes = m_Stream.Read(m_Buffer, 0, (int)m_BufferSize); + m_Pos = 0; + m_Limit = (uint)aNumProcessedBytes; + m_StreamWasExhausted = (aNumProcessedBytes == 0); + return (!m_StreamWasExhausted); + } + + + public void ReleaseStream() + { + // m_Stream.Close(); + m_Stream = null; + } + + public bool ReadByte(byte b) // check it + { + if (m_Pos >= m_Limit) + if (!ReadBlock()) + return false; + b = m_Buffer[m_Pos++]; + return true; + } + + public byte ReadByte() + { + // return (byte)m_Stream.ReadByte(); + if (m_Pos >= m_Limit) + if (!ReadBlock()) + return 0xFF; + return m_Buffer[m_Pos++]; + } + + public ulong GetProcessedSize() + { + return m_ProcessedSize + m_Pos; + } + } +} diff --git a/ABStudio/Libs/7zip/Common/OutBuffer.cs b/ABStudio/Libs/7zip/Common/OutBuffer.cs new file mode 100644 index 0000000..c205aa6 --- /dev/null +++ b/ABStudio/Libs/7zip/Common/OutBuffer.cs @@ -0,0 +1,47 @@ +// OutBuffer.cs + +namespace SevenZip.Buffer +{ + public class OutBuffer + { + byte[] m_Buffer; + uint m_Pos; + uint m_BufferSize; + System.IO.Stream m_Stream; + ulong m_ProcessedSize; + + public OutBuffer(uint bufferSize) + { + m_Buffer = new byte[bufferSize]; + m_BufferSize = bufferSize; + } + + public void SetStream(System.IO.Stream stream) { m_Stream = stream; } + public void FlushStream() { m_Stream.Flush(); } + public void CloseStream() { m_Stream.Close(); } + public void ReleaseStream() { m_Stream = null; } + + public void Init() + { + m_ProcessedSize = 0; + m_Pos = 0; + } + + public void WriteByte(byte b) + { + m_Buffer[m_Pos++] = b; + if (m_Pos >= m_BufferSize) + FlushData(); + } + + public void FlushData() + { + if (m_Pos == 0) + return; + m_Stream.Write(m_Buffer, 0, (int)m_Pos); + m_Pos = 0; + } + + public ulong GetProcessedSize() { return m_ProcessedSize + m_Pos; } + } +} diff --git a/ABStudio/Libs/7zip/Compress/LZ/IMatchFinder.cs b/ABStudio/Libs/7zip/Compress/LZ/IMatchFinder.cs new file mode 100644 index 0000000..30fab86 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/LZ/IMatchFinder.cs @@ -0,0 +1,24 @@ +// IMatchFinder.cs + +using System; + +namespace SevenZip.Compression.LZ +{ + interface IInWindowStream + { + void SetStream(System.IO.Stream inStream); + void Init(); + void ReleaseStream(); + Byte GetIndexByte(Int32 index); + UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit); + UInt32 GetNumAvailableBytes(); + } + + interface IMatchFinder : IInWindowStream + { + void Create(UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter); + UInt32 GetMatches(UInt32[] distances); + void Skip(UInt32 num); + } +} diff --git a/ABStudio/Libs/7zip/Compress/LZ/LzBinTree.cs b/ABStudio/Libs/7zip/Compress/LZ/LzBinTree.cs new file mode 100644 index 0000000..7a9ca20 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/LZ/LzBinTree.cs @@ -0,0 +1,367 @@ +// LzBinTree.cs + +using System; + +namespace SevenZip.Compression.LZ +{ + public class BinTree : InWindow, IMatchFinder + { + UInt32 _cyclicBufferPos; + UInt32 _cyclicBufferSize = 0; + UInt32 _matchMaxLen; + + UInt32[] _son; + UInt32[] _hash; + + UInt32 _cutValue = 0xFF; + UInt32 _hashMask; + UInt32 _hashSizeSum = 0; + + bool HASH_ARRAY = true; + + const UInt32 kHash2Size = 1 << 10; + const UInt32 kHash3Size = 1 << 16; + const UInt32 kBT2HashSize = 1 << 16; + const UInt32 kStartMaxLen = 1; + const UInt32 kHash3Offset = kHash2Size; + const UInt32 kEmptyHashValue = 0; + const UInt32 kMaxValForNormalize = ((UInt32)1 << 31) - 1; + + UInt32 kNumHashDirectBytes = 0; + UInt32 kMinMatchCheck = 4; + UInt32 kFixHashSize = kHash2Size + kHash3Size; + + public void SetType(int numHashBytes) + { + HASH_ARRAY = (numHashBytes > 2); + if (HASH_ARRAY) + { + kNumHashDirectBytes = 0; + kMinMatchCheck = 4; + kFixHashSize = kHash2Size + kHash3Size; + } + else + { + kNumHashDirectBytes = 2; + kMinMatchCheck = 2 + 1; + kFixHashSize = 0; + } + } + + public new void SetStream(System.IO.Stream stream) { base.SetStream(stream); } + public new void ReleaseStream() { base.ReleaseStream(); } + + public new void Init() + { + base.Init(); + for (UInt32 i = 0; i < _hashSizeSum; i++) + _hash[i] = kEmptyHashValue; + _cyclicBufferPos = 0; + ReduceOffsets(-1); + } + + public new void MovePos() + { + if (++_cyclicBufferPos >= _cyclicBufferSize) + _cyclicBufferPos = 0; + base.MovePos(); + if (_pos == kMaxValForNormalize) + Normalize(); + } + + public new Byte GetIndexByte(Int32 index) { return base.GetIndexByte(index); } + + public new UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) + { return base.GetMatchLen(index, distance, limit); } + + public new UInt32 GetNumAvailableBytes() { return base.GetNumAvailableBytes(); } + + public void Create(UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter) + { + if (historySize > kMaxValForNormalize - 256) + throw new Exception(); + _cutValue = 16 + (matchMaxLen >> 1); + + UInt32 windowReservSize = (historySize + keepAddBufferBefore + + matchMaxLen + keepAddBufferAfter) / 2 + 256; + + base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); + + _matchMaxLen = matchMaxLen; + + UInt32 cyclicBufferSize = historySize + 1; + if (_cyclicBufferSize != cyclicBufferSize) + _son = new UInt32[(_cyclicBufferSize = cyclicBufferSize) * 2]; + + UInt32 hs = kBT2HashSize; + + if (HASH_ARRAY) + { + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + hs |= 0xFFFF; + if (hs > (1 << 24)) + hs >>= 1; + _hashMask = hs; + hs++; + hs += kFixHashSize; + } + if (hs != _hashSizeSum) + _hash = new UInt32[_hashSizeSum = hs]; + } + + public UInt32 GetMatches(UInt32[] distances) + { + UInt32 lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + return 0; + } + } + + UInt32 offset = 0; + UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + UInt32 cur = _bufferOffset + _pos; + UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize; + UInt32 hashValue, hash2Value = 0, hash3Value = 0; + + if (HASH_ARRAY) + { + UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; + hash2Value = temp & (kHash2Size - 1); + temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8); + hash3Value = temp & (kHash3Size - 1); + hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; + } + else + hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8); + + UInt32 curMatch = _hash[kFixHashSize + hashValue]; + if (HASH_ARRAY) + { + UInt32 curMatch2 = _hash[hash2Value]; + UInt32 curMatch3 = _hash[kHash3Offset + hash3Value]; + _hash[hash2Value] = _pos; + _hash[kHash3Offset + hash3Value] = _pos; + if (curMatch2 > matchMinPos) + if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) + { + distances[offset++] = maxLen = 2; + distances[offset++] = _pos - curMatch2 - 1; + } + if (curMatch3 > matchMinPos) + if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) + { + if (curMatch3 == curMatch2) + offset -= 2; + distances[offset++] = maxLen = 3; + distances[offset++] = _pos - curMatch3 - 1; + curMatch2 = curMatch3; + } + if (offset != 0 && curMatch2 == curMatch) + { + offset -= 2; + maxLen = kStartMaxLen; + } + } + + _hash[kFixHashSize + hashValue] = _pos; + + UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; + UInt32 ptr1 = (_cyclicBufferPos << 1); + + UInt32 len0, len1; + len0 = len1 = kNumHashDirectBytes; + + if (kNumHashDirectBytes != 0) + { + if (curMatch > matchMinPos) + { + if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != + _bufferBase[cur + kNumHashDirectBytes]) + { + distances[offset++] = maxLen = kNumHashDirectBytes; + distances[offset++] = _pos - curMatch - 1; + } + } + } + + UInt32 count = _cutValue; + + while(true) + { + if(curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + UInt32 delta = _pos - curMatch; + UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ? + (_cyclicBufferPos - delta) : + (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + + UInt32 pby1 = _bufferOffset + curMatch; + UInt32 len = Math.Min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while(++len != lenLimit) + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + if (maxLen < len) + { + distances[offset++] = maxLen = len; + distances[offset++] = delta - 1; + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + } + if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + return offset; + } + + public void Skip(UInt32 num) + { + do + { + UInt32 lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + continue; + } + } + + UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + UInt32 cur = _bufferOffset + _pos; + + UInt32 hashValue; + + if (HASH_ARRAY) + { + UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; + UInt32 hash2Value = temp & (kHash2Size - 1); + _hash[hash2Value] = _pos; + temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8); + UInt32 hash3Value = temp & (kHash3Size - 1); + _hash[kHash3Offset + hash3Value] = _pos; + hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; + } + else + hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8); + + UInt32 curMatch = _hash[kFixHashSize + hashValue]; + _hash[kFixHashSize + hashValue] = _pos; + + UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; + UInt32 ptr1 = (_cyclicBufferPos << 1); + + UInt32 len0, len1; + len0 = len1 = kNumHashDirectBytes; + + UInt32 count = _cutValue; + while (true) + { + if (curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + + UInt32 delta = _pos - curMatch; + UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ? + (_cyclicBufferPos - delta) : + (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + + UInt32 pby1 = _bufferOffset + curMatch; + UInt32 len = Math.Min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while (++len != lenLimit) + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + } + while (--num != 0); + } + + void NormalizeLinks(UInt32[] items, UInt32 numItems, UInt32 subValue) + { + for (UInt32 i = 0; i < numItems; i++) + { + UInt32 value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } + } + + void Normalize() + { + UInt32 subValue = _pos - _cyclicBufferSize; + NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); + NormalizeLinks(_hash, _hashSizeSum, subValue); + ReduceOffsets((Int32)subValue); + } + + public void SetCutValue(UInt32 cutValue) { _cutValue = cutValue; } + } +} diff --git a/ABStudio/Libs/7zip/Compress/LZ/LzInWindow.cs b/ABStudio/Libs/7zip/Compress/LZ/LzInWindow.cs new file mode 100644 index 0000000..f1974ce --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/LZ/LzInWindow.cs @@ -0,0 +1,132 @@ +// LzInWindow.cs + +using System; + +namespace SevenZip.Compression.LZ +{ + public class InWindow + { + public Byte[] _bufferBase = null; // pointer to buffer with data + System.IO.Stream _stream; + UInt32 _posLimit; // offset (from _buffer) of first byte when new block reading must be done + bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream + + UInt32 _pointerToLastSafePosition; + + public UInt32 _bufferOffset; + + public UInt32 _blockSize; // Size of Allocated memory block + public UInt32 _pos; // offset (from _buffer) of curent byte + UInt32 _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos + UInt32 _keepSizeAfter; // how many BYTEs must be kept buffer after _pos + public UInt32 _streamPos; // offset (from _buffer) of first not read byte from Stream + + public void MoveBlock() + { + UInt32 offset = (UInt32)(_bufferOffset) + _pos - _keepSizeBefore; + // we need one additional byte, since MovePos moves on 1 byte. + if (offset > 0) + offset--; + + UInt32 numBytes = (UInt32)(_bufferOffset) + _streamPos - offset; + + // check negative offset ???? + for (UInt32 i = 0; i < numBytes; i++) + _bufferBase[i] = _bufferBase[offset + i]; + _bufferOffset -= offset; + } + + public virtual void ReadBlock() + { + if (_streamEndWasReached) + return; + while (true) + { + int size = (int)((0 - _bufferOffset) + _blockSize - _streamPos); + if (size == 0) + return; + int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size); + if (numReadBytes == 0) + { + _posLimit = _streamPos; + UInt32 pointerToPostion = _bufferOffset + _posLimit; + if (pointerToPostion > _pointerToLastSafePosition) + _posLimit = (UInt32)(_pointerToLastSafePosition - _bufferOffset); + + _streamEndWasReached = true; + return; + } + _streamPos += (UInt32)numReadBytes; + if (_streamPos >= _pos + _keepSizeAfter) + _posLimit = _streamPos - _keepSizeAfter; + } + } + + void Free() { _bufferBase = null; } + + public void Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv) + { + _keepSizeBefore = keepSizeBefore; + _keepSizeAfter = keepSizeAfter; + UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; + if (_bufferBase == null || _blockSize != blockSize) + { + Free(); + _blockSize = blockSize; + _bufferBase = new Byte[_blockSize]; + } + _pointerToLastSafePosition = _blockSize - keepSizeAfter; + } + + public void SetStream(System.IO.Stream stream) { _stream = stream; } + public void ReleaseStream() { _stream = null; } + + public void Init() + { + _bufferOffset = 0; + _pos = 0; + _streamPos = 0; + _streamEndWasReached = false; + ReadBlock(); + } + + public void MovePos() + { + _pos++; + if (_pos > _posLimit) + { + UInt32 pointerToPostion = _bufferOffset + _pos; + if (pointerToPostion > _pointerToLastSafePosition) + MoveBlock(); + ReadBlock(); + } + } + + public Byte GetIndexByte(Int32 index) { return _bufferBase[_bufferOffset + _pos + index]; } + + // index + limit have not to exceed _keepSizeAfter; + public UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) + { + if (_streamEndWasReached) + if ((_pos + index) + limit > _streamPos) + limit = _streamPos - (UInt32)(_pos + index); + distance++; + // Byte *pby = _buffer + (size_t)_pos + index; + UInt32 pby = _bufferOffset + _pos + (UInt32)index; + + UInt32 i; + for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++); + return i; + } + + public UInt32 GetNumAvailableBytes() { return _streamPos - _pos; } + + public void ReduceOffsets(Int32 subValue) + { + _bufferOffset += (UInt32)subValue; + _posLimit -= (UInt32)subValue; + _pos -= (UInt32)subValue; + _streamPos -= (UInt32)subValue; + } + } +} diff --git a/ABStudio/Libs/7zip/Compress/LZ/LzOutWindow.cs b/ABStudio/Libs/7zip/Compress/LZ/LzOutWindow.cs new file mode 100644 index 0000000..84914f0 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/LZ/LzOutWindow.cs @@ -0,0 +1,110 @@ +// LzOutWindow.cs + +namespace SevenZip.Compression.LZ +{ + public class OutWindow + { + byte[] _buffer = null; + uint _pos; + uint _windowSize = 0; + uint _streamPos; + System.IO.Stream _stream; + + public uint TrainSize = 0; + + public void Create(uint windowSize) + { + if (_windowSize != windowSize) + { + // System.GC.Collect(); + _buffer = new byte[windowSize]; + } + _windowSize = windowSize; + _pos = 0; + _streamPos = 0; + } + + public void Init(System.IO.Stream stream, bool solid) + { + ReleaseStream(); + _stream = stream; + if (!solid) + { + _streamPos = 0; + _pos = 0; + TrainSize = 0; + } + } + + public bool Train(System.IO.Stream stream) + { + long len = stream.Length; + uint size = (len < _windowSize) ? (uint)len : _windowSize; + TrainSize = size; + stream.Position = len - size; + _streamPos = _pos = 0; + while (size > 0) + { + uint curSize = _windowSize - _pos; + if (size < curSize) + curSize = size; + int numReadBytes = stream.Read(_buffer, (int)_pos, (int)curSize); + if (numReadBytes == 0) + return false; + size -= (uint)numReadBytes; + _pos += (uint)numReadBytes; + _streamPos += (uint)numReadBytes; + if (_pos == _windowSize) + _streamPos = _pos = 0; + } + return true; + } + + public void ReleaseStream() + { + Flush(); + _stream = null; + } + + public void Flush() + { + uint size = _pos - _streamPos; + if (size == 0) + return; + _stream.Write(_buffer, (int)_streamPos, (int)size); + if (_pos >= _windowSize) + _pos = 0; + _streamPos = _pos; + } + + public void CopyBlock(uint distance, uint len) + { + uint pos = _pos - distance - 1; + if (pos >= _windowSize) + pos += _windowSize; + for (; len > 0; len--) + { + if (pos >= _windowSize) + pos = 0; + _buffer[_pos++] = _buffer[pos++]; + if (_pos >= _windowSize) + Flush(); + } + } + + public void PutByte(byte b) + { + _buffer[_pos++] = b; + if (_pos >= _windowSize) + Flush(); + } + + public byte GetByte(uint distance) + { + uint pos = _pos - distance - 1; + if (pos >= _windowSize) + pos += _windowSize; + return _buffer[pos]; + } + } +} diff --git a/ABStudio/Libs/7zip/Compress/LZMA/LzmaBase.cs b/ABStudio/Libs/7zip/Compress/LZMA/LzmaBase.cs new file mode 100644 index 0000000..8447a2a --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/LZMA/LzmaBase.cs @@ -0,0 +1,76 @@ +// LzmaBase.cs + +namespace SevenZip.Compression.LZMA +{ + internal abstract class Base + { + public const uint kNumRepDistances = 4; + public const uint kNumStates = 12; + + // static byte []kLiteralNextStates = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; + // static byte []kMatchNextStates = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; + // static byte []kRepNextStates = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; + // static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + + public struct State + { + public uint Index; + public void Init() { Index = 0; } + public void UpdateChar() + { + if (Index < 4) Index = 0; + else if (Index < 10) Index -= 3; + else Index -= 6; + } + public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); } + public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); } + public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); } + public bool IsCharState() { return Index < 7; } + } + + public const int kNumPosSlotBits = 6; + public const int kDicLogSizeMin = 0; + // public const int kDicLogSizeMax = 30; + // public const uint kDistTableSizeMax = kDicLogSizeMax * 2; + + public const int kNumLenToPosStatesBits = 2; // it's for speed optimization + public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits; + + public const uint kMatchMinLen = 2; + + public static uint GetLenToPosState(uint len) + { + len -= kMatchMinLen; + if (len < kNumLenToPosStates) + return len; + return (uint)(kNumLenToPosStates - 1); + } + + public const int kNumAlignBits = 4; + public const uint kAlignTableSize = 1 << kNumAlignBits; + public const uint kAlignMask = (kAlignTableSize - 1); + + public const uint kStartPosModelIndex = 4; + public const uint kEndPosModelIndex = 14; + public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; + + public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2); + + public const uint kNumLitPosStatesBitsEncodingMax = 4; + public const uint kNumLitContextBitsMax = 8; + + public const int kNumPosStatesBitsMax = 4; + public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax); + public const int kNumPosStatesBitsEncodingMax = 4; + public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); + + public const int kNumLowLenBits = 3; + public const int kNumMidLenBits = 3; + public const int kNumHighLenBits = 8; + public const uint kNumLowLenSymbols = 1 << kNumLowLenBits; + public const uint kNumMidLenSymbols = 1 << kNumMidLenBits; + public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + + (1 << kNumHighLenBits); + public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; + } +} diff --git a/ABStudio/Libs/7zip/Compress/LZMA/LzmaDecoder.cs b/ABStudio/Libs/7zip/Compress/LZMA/LzmaDecoder.cs new file mode 100644 index 0000000..00bfe63 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/LZMA/LzmaDecoder.cs @@ -0,0 +1,398 @@ +// LzmaDecoder.cs + +using System; + +namespace SevenZip.Compression.LZMA +{ + using RangeCoder; + + public class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream + { + class LenDecoder + { + BitDecoder m_Choice = new BitDecoder(); + BitDecoder m_Choice2 = new BitDecoder(); + BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits); + uint m_NumPosStates = 0; + + public void Create(uint numPosStates) + { + for (uint posState = m_NumPosStates; posState < numPosStates; posState++) + { + m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits); + m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits); + } + m_NumPosStates = numPosStates; + } + + public void Init() + { + m_Choice.Init(); + for (uint posState = 0; posState < m_NumPosStates; posState++) + { + m_LowCoder[posState].Init(); + m_MidCoder[posState].Init(); + } + m_Choice2.Init(); + m_HighCoder.Init(); + } + + public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState) + { + if (m_Choice.Decode(rangeDecoder) == 0) + return m_LowCoder[posState].Decode(rangeDecoder); + else + { + uint symbol = Base.kNumLowLenSymbols; + if (m_Choice2.Decode(rangeDecoder) == 0) + symbol += m_MidCoder[posState].Decode(rangeDecoder); + else + { + symbol += Base.kNumMidLenSymbols; + symbol += m_HighCoder.Decode(rangeDecoder); + } + return symbol; + } + } + } + + class LiteralDecoder + { + struct Decoder2 + { + BitDecoder[] m_Decoders; + public void Create() { m_Decoders = new BitDecoder[0x300]; } + public void Init() { for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); } + + public byte DecodeNormal(RangeCoder.Decoder rangeDecoder) + { + uint symbol = 1; + do + symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); + while (symbol < 0x100); + return (byte)symbol; + } + + public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) + { + uint symbol = 1; + do + { + uint matchBit = (uint)(matchByte >> 7) & 1; + matchByte <<= 1; + uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder); + symbol = (symbol << 1) | bit; + if (matchBit != bit) + { + while (symbol < 0x100) + symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); + break; + } + } + while (symbol < 0x100); + return (byte)symbol; + } + } + + Decoder2[] m_Coders; + int m_NumPrevBits; + int m_NumPosBits; + uint m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && + m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = ((uint)1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Decoder2[numStates]; + for (uint i = 0; i < numStates; i++) + m_Coders[i].Create(); + } + + public void Init() + { + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + for (uint i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + uint GetState(uint pos, byte prevByte) + { return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); } + + public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte) + { return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); } + + public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte) + { return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); } + }; + + LZ.OutWindow m_OutWindow = new LZ.OutWindow(); + RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder(); + + BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + + BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates]; + BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; + + BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits); + + LenDecoder m_LenDecoder = new LenDecoder(); + LenDecoder m_RepLenDecoder = new LenDecoder(); + + LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); + + uint m_DictionarySize; + uint m_DictionarySizeCheck; + + uint m_PosStateMask; + + public Decoder() + { + m_DictionarySize = 0xFFFFFFFF; + for (int i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits); + } + + void SetDictionarySize(uint dictionarySize) + { + if (m_DictionarySize != dictionarySize) + { + m_DictionarySize = dictionarySize; + m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); + uint blockSize = Math.Max(m_DictionarySizeCheck, (1 << 12)); + m_OutWindow.Create(blockSize); + } + } + + void SetLiteralProperties(int lp, int lc) + { + if (lp > 8) + throw new InvalidParamException(); + if (lc > 8) + throw new InvalidParamException(); + m_LiteralDecoder.Create(lp, lc); + } + + void SetPosBitsProperties(int pb) + { + if (pb > Base.kNumPosStatesBitsMax) + throw new InvalidParamException(); + uint numPosStates = (uint)1 << pb; + m_LenDecoder.Create(numPosStates); + m_RepLenDecoder.Create(numPosStates); + m_PosStateMask = numPosStates - 1; + } + + bool _solid = false; + void Init(System.IO.Stream inStream, System.IO.Stream outStream) + { + m_RangeDecoder.Init(inStream); + m_OutWindow.Init(outStream, _solid); + + uint i; + for (i = 0; i < Base.kNumStates; i++) + { + for (uint j = 0; j <= m_PosStateMask; j++) + { + uint index = (i << Base.kNumPosStatesBitsMax) + j; + m_IsMatchDecoders[index].Init(); + m_IsRep0LongDecoders[index].Init(); + } + m_IsRepDecoders[i].Init(); + m_IsRepG0Decoders[i].Init(); + m_IsRepG1Decoders[i].Init(); + m_IsRepG2Decoders[i].Init(); + } + + m_LiteralDecoder.Init(); + for (i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i].Init(); + // m_PosSpecDecoder.Init(); + for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) + m_PosDecoders[i].Init(); + + m_LenDecoder.Init(); + m_RepLenDecoder.Init(); + m_PosAlignDecoder.Init(); + } + + public void Code(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize, ICodeProgress progress) + { + Init(inStream, outStream); + + Base.State state = new Base.State(); + state.Init(); + uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; + + UInt64 nowPos64 = 0; + UInt64 outSize64 = (UInt64)outSize; + if (nowPos64 < outSize64) + { + if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0) + throw new DataErrorException(); + state.UpdateChar(); + byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0); + m_OutWindow.PutByte(b); + nowPos64++; + } + while (nowPos64 < outSize64) + { + // UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64); + // while(nowPos64 < next) + { + uint posState = (uint)nowPos64 & m_PosStateMask; + if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) + { + byte b; + byte prevByte = m_OutWindow.GetByte(0); + if (!state.IsCharState()) + b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, + (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); + else + b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); + m_OutWindow.PutByte(b); + state.UpdateChar(); + nowPos64++; + } + else + { + uint len; + if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) + { + if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) + { + if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) + { + state.UpdateShortRep(); + m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); + nowPos64++; + continue; + } + } + else + { + UInt32 distance; + if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) + { + distance = rep1; + } + else + { + if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) + distance = rep2; + else + { + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; + state.UpdateRep(); + } + else + { + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); + state.UpdateMatch(); + uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); + if (posSlot >= Base.kStartPosModelIndex) + { + int numDirectBits = (int)((posSlot >> 1) - 1); + rep0 = ((2 | (posSlot & 1)) << numDirectBits); + if (posSlot < Base.kEndPosModelIndex) + rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, + rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); + else + { + rep0 += (m_RangeDecoder.DecodeDirectBits( + numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits); + rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); + } + } + else + rep0 = posSlot; + } + if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) + { + if (rep0 == 0xFFFFFFFF) + break; + throw new DataErrorException(); + } + m_OutWindow.CopyBlock(rep0, len); + nowPos64 += len; + } + } + } + m_OutWindow.Flush(); + m_OutWindow.ReleaseStream(); + m_RangeDecoder.ReleaseStream(); + } + + public void SetDecoderProperties(byte[] properties) + { + if (properties.Length < 5) + throw new InvalidParamException(); + int lc = properties[0] % 9; + int remainder = properties[0] / 9; + int lp = remainder % 5; + int pb = remainder / 5; + if (pb > Base.kNumPosStatesBitsMax) + throw new InvalidParamException(); + UInt32 dictionarySize = 0; + for (int i = 0; i < 4; i++) + dictionarySize += ((UInt32)(properties[1 + i])) << (i * 8); + SetDictionarySize(dictionarySize); + SetLiteralProperties(lp, lc); + SetPosBitsProperties(pb); + } + + public bool Train(System.IO.Stream stream) + { + _solid = true; + return m_OutWindow.Train(stream); + } + + /* + public override bool CanRead { get { return true; }} + public override bool CanWrite { get { return true; }} + public override bool CanSeek { get { return true; }} + public override long Length { get { return 0; }} + public override long Position + { + get { return 0; } + set { } + } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) + { + return 0; + } + public override void Write(byte[] buffer, int offset, int count) + { + } + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + return 0; + } + public override void SetLength(long value) {} + */ + } +} diff --git a/ABStudio/Libs/7zip/Compress/LZMA/LzmaEncoder.cs b/ABStudio/Libs/7zip/Compress/LZMA/LzmaEncoder.cs new file mode 100644 index 0000000..6dc2708 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/LZMA/LzmaEncoder.cs @@ -0,0 +1,1480 @@ +// LzmaEncoder.cs + +using System; + +namespace SevenZip.Compression.LZMA +{ + using RangeCoder; + + public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties + { + enum EMatchFinderType + { + BT2, + BT4, + }; + + const UInt32 kIfinityPrice = 0xFFFFFFF; + + static Byte[] g_FastPos = new Byte[1 << 11]; + + static Encoder() + { + const Byte kFastSlots = 22; + int c = 2; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++) + { + UInt32 k = ((UInt32)1 << ((slotFast >> 1) - 1)); + for (UInt32 j = 0; j < k; j++, c++) + g_FastPos[c] = slotFast; + } + } + + static UInt32 GetPosSlot(UInt32 pos) + { + if (pos < (1 << 11)) + return g_FastPos[pos]; + if (pos < (1 << 21)) + return (UInt32)(g_FastPos[pos >> 10] + 20); + return (UInt32)(g_FastPos[pos >> 20] + 40); + } + + static UInt32 GetPosSlot2(UInt32 pos) + { + if (pos < (1 << 17)) + return (UInt32)(g_FastPos[pos >> 6] + 12); + if (pos < (1 << 27)) + return (UInt32)(g_FastPos[pos >> 16] + 32); + return (UInt32)(g_FastPos[pos >> 26] + 52); + } + + Base.State _state = new Base.State(); + Byte _previousByte; + UInt32[] _repDistances = new UInt32[Base.kNumRepDistances]; + + void BaseInit() + { + _state.Init(); + _previousByte = 0; + for (UInt32 i = 0; i < Base.kNumRepDistances; i++) + _repDistances[i] = 0; + } + + const int kDefaultDictionaryLogSize = 22; + const UInt32 kNumFastBytesDefault = 0x20; + + class LiteralEncoder + { + public struct Encoder2 + { + BitEncoder[] m_Encoders; + + public void Create() { m_Encoders = new BitEncoder[0x300]; } + + public void Init() { for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); } + + public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol) + { + uint context = 1; + for (int i = 7; i >= 0; i--) + { + uint bit = (uint)((symbol >> i) & 1); + m_Encoders[context].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + } + + public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) + { + uint context = 1; + bool same = true; + for (int i = 7; i >= 0; i--) + { + uint bit = (uint)((symbol >> i) & 1); + uint state = context; + if (same) + { + uint matchBit = (uint)((matchByte >> i) & 1); + state += ((1 + matchBit) << 8); + same = (matchBit == bit); + } + m_Encoders[state].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + } + + public uint GetPrice(bool matchMode, byte matchByte, byte symbol) + { + uint price = 0; + uint context = 1; + int i = 7; + if (matchMode) + { + for (; i >= 0; i--) + { + uint matchBit = (uint)(matchByte >> i) & 1; + uint bit = (uint)(symbol >> i) & 1; + price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit); + context = (context << 1) | bit; + if (matchBit != bit) + { + i--; + break; + } + } + } + for (; i >= 0; i--) + { + uint bit = (uint)(symbol >> i) & 1; + price += m_Encoders[context].GetPrice(bit); + context = (context << 1) | bit; + } + return price; + } + } + + Encoder2[] m_Coders; + int m_NumPrevBits; + int m_NumPosBits; + uint m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = ((uint)1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Encoder2[numStates]; + for (uint i = 0; i < numStates; i++) + m_Coders[i].Create(); + } + + public void Init() + { + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + for (uint i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + public Encoder2 GetSubCoder(UInt32 pos, Byte prevByte) + { return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; } + } + + class LenEncoder + { + RangeCoder.BitEncoder _choice = new RangeCoder.BitEncoder(); + RangeCoder.BitEncoder _choice2 = new RangeCoder.BitEncoder(); + RangeCoder.BitTreeEncoder[] _lowCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + RangeCoder.BitTreeEncoder[] _midCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + RangeCoder.BitTreeEncoder _highCoder = new RangeCoder.BitTreeEncoder(Base.kNumHighLenBits); + + public LenEncoder() + { + for (UInt32 posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++) + { + _lowCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumLowLenBits); + _midCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumMidLenBits); + } + } + + public void Init(UInt32 numPosStates) + { + _choice.Init(); + _choice2.Init(); + for (UInt32 posState = 0; posState < numPosStates; posState++) + { + _lowCoder[posState].Init(); + _midCoder[posState].Init(); + } + _highCoder.Init(); + } + + public void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState) + { + if (symbol < Base.kNumLowLenSymbols) + { + _choice.Encode(rangeEncoder, 0); + _lowCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + symbol -= Base.kNumLowLenSymbols; + _choice.Encode(rangeEncoder, 1); + if (symbol < Base.kNumMidLenSymbols) + { + _choice2.Encode(rangeEncoder, 0); + _midCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + _choice2.Encode(rangeEncoder, 1); + _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols); + } + } + } + + public void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32[] prices, UInt32 st) + { + UInt32 a0 = _choice.GetPrice0(); + UInt32 a1 = _choice.GetPrice1(); + UInt32 b0 = a1 + _choice2.GetPrice0(); + UInt32 b1 = a1 + _choice2.GetPrice1(); + UInt32 i = 0; + for (i = 0; i < Base.kNumLowLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); + } + for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols); + } + for (; i < numSymbols; i++) + prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); + } + }; + + const UInt32 kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; + + class LenPriceTableEncoder : LenEncoder + { + UInt32[] _prices = new UInt32[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax]; + UInt32 _tableSize; + UInt32[] _counters = new UInt32[Base.kNumPosStatesEncodingMax]; + + public void SetTableSize(UInt32 tableSize) { _tableSize = tableSize; } + + public UInt32 GetPrice(UInt32 symbol, UInt32 posState) + { + return _prices[posState * Base.kNumLenSymbols + symbol]; + } + + void UpdateTable(UInt32 posState) + { + SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols); + _counters[posState] = _tableSize; + } + + public void UpdateTables(UInt32 numPosStates) + { + for (UInt32 posState = 0; posState < numPosStates; posState++) + UpdateTable(posState); + } + + public new void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState) + { + base.Encode(rangeEncoder, symbol, posState); + if (--_counters[posState] == 0) + UpdateTable(posState); + } + } + + const UInt32 kNumOpts = 1 << 12; + class Optimal + { + public Base.State State; + + public bool Prev1IsChar; + public bool Prev2; + + public UInt32 PosPrev2; + public UInt32 BackPrev2; + + public UInt32 Price; + public UInt32 PosPrev; + public UInt32 BackPrev; + + public UInt32 Backs0; + public UInt32 Backs1; + public UInt32 Backs2; + public UInt32 Backs3; + + public void MakeAsChar() { BackPrev = 0xFFFFFFFF; Prev1IsChar = false; } + public void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; } + public bool IsShortRep() { return (BackPrev == 0); } + }; + Optimal[] _optimum = new Optimal[kNumOpts]; + LZ.IMatchFinder _matchFinder = null; + RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder(); + + RangeCoder.BitEncoder[] _isMatch = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + RangeCoder.BitEncoder[] _isRep = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRepG0 = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRepG1 = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRepG2 = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRep0Long = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + + RangeCoder.BitTreeEncoder[] _posSlotEncoder = new RangeCoder.BitTreeEncoder[Base.kNumLenToPosStates]; + + RangeCoder.BitEncoder[] _posEncoders = new RangeCoder.BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; + RangeCoder.BitTreeEncoder _posAlignEncoder = new RangeCoder.BitTreeEncoder(Base.kNumAlignBits); + + LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); + LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); + + LiteralEncoder _literalEncoder = new LiteralEncoder(); + + UInt32[] _matchDistances = new UInt32[Base.kMatchMaxLen * 2 + 2]; + + UInt32 _numFastBytes = kNumFastBytesDefault; + UInt32 _longestMatchLength; + UInt32 _numDistancePairs; + + UInt32 _additionalOffset; + + UInt32 _optimumEndIndex; + UInt32 _optimumCurrentIndex; + + bool _longestMatchWasFound; + + UInt32[] _posSlotPrices = new UInt32[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)]; + UInt32[] _distancesPrices = new UInt32[Base.kNumFullDistances << Base.kNumLenToPosStatesBits]; + UInt32[] _alignPrices = new UInt32[Base.kAlignTableSize]; + UInt32 _alignPriceCount; + + UInt32 _distTableSize = (kDefaultDictionaryLogSize * 2); + + int _posStateBits = 2; + UInt32 _posStateMask = (4 - 1); + int _numLiteralPosStateBits = 0; + int _numLiteralContextBits = 3; + + UInt32 _dictionarySize = (1 << kDefaultDictionaryLogSize); + UInt32 _dictionarySizePrev = 0xFFFFFFFF; + UInt32 _numFastBytesPrev = 0xFFFFFFFF; + + Int64 nowPos64; + bool _finished; + System.IO.Stream _inStream; + + EMatchFinderType _matchFinderType = EMatchFinderType.BT4; + bool _writeEndMark = false; + + bool _needReleaseMFStream; + + void Create() + { + if (_matchFinder == null) + { + LZ.BinTree bt = new LZ.BinTree(); + int numHashBytes = 4; + if (_matchFinderType == EMatchFinderType.BT2) + numHashBytes = 2; + bt.SetType(numHashBytes); + _matchFinder = bt; + } + _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); + + if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) + return; + _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1); + _dictionarySizePrev = _dictionarySize; + _numFastBytesPrev = _numFastBytes; + } + + public Encoder() + { + for (int i = 0; i < kNumOpts; i++) + _optimum[i] = new Optimal(); + for (int i = 0; i < Base.kNumLenToPosStates; i++) + _posSlotEncoder[i] = new RangeCoder.BitTreeEncoder(Base.kNumPosSlotBits); + } + + void SetWriteEndMarkerMode(bool writeEndMarker) + { + _writeEndMark = writeEndMarker; + } + + void Init() + { + BaseInit(); + _rangeEncoder.Init(); + + uint i; + for (i = 0; i < Base.kNumStates; i++) + { + for (uint j = 0; j <= _posStateMask; j++) + { + uint complexState = (i << Base.kNumPosStatesBitsMax) + j; + _isMatch[complexState].Init(); + _isRep0Long[complexState].Init(); + } + _isRep[i].Init(); + _isRepG0[i].Init(); + _isRepG1[i].Init(); + _isRepG2[i].Init(); + } + _literalEncoder.Init(); + for (i = 0; i < Base.kNumLenToPosStates; i++) + _posSlotEncoder[i].Init(); + for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) + _posEncoders[i].Init(); + + _lenEncoder.Init((UInt32)1 << _posStateBits); + _repMatchLenEncoder.Init((UInt32)1 << _posStateBits); + + _posAlignEncoder.Init(); + + _longestMatchWasFound = false; + _optimumEndIndex = 0; + _optimumCurrentIndex = 0; + _additionalOffset = 0; + } + + void ReadMatchDistances(out UInt32 lenRes, out UInt32 numDistancePairs) + { + lenRes = 0; + numDistancePairs = _matchFinder.GetMatches(_matchDistances); + if (numDistancePairs > 0) + { + lenRes = _matchDistances[numDistancePairs - 2]; + if (lenRes == _numFastBytes) + lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1], + Base.kMatchMaxLen - lenRes); + } + _additionalOffset++; + } + + + void MovePos(UInt32 num) + { + if (num > 0) + { + _matchFinder.Skip(num); + _additionalOffset += num; + } + } + + UInt32 GetRepLen1Price(Base.State state, UInt32 posState) + { + return _isRepG0[state.Index].GetPrice0() + + _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0(); + } + + UInt32 GetPureRepPrice(UInt32 repIndex, Base.State state, UInt32 posState) + { + UInt32 price; + if (repIndex == 0) + { + price = _isRepG0[state.Index].GetPrice0(); + price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + } + else + { + price = _isRepG0[state.Index].GetPrice1(); + if (repIndex == 1) + price += _isRepG1[state.Index].GetPrice0(); + else + { + price += _isRepG1[state.Index].GetPrice1(); + price += _isRepG2[state.Index].GetPrice(repIndex - 2); + } + } + return price; + } + + UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, Base.State state, UInt32 posState) + { + UInt32 price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + return price + GetPureRepPrice(repIndex, state, posState); + } + + UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState) + { + UInt32 price; + UInt32 lenToPosState = Base.GetLenToPosState(len); + if (pos < Base.kNumFullDistances) + price = _distancesPrices[(lenToPosState * Base.kNumFullDistances) + pos]; + else + price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + + _alignPrices[pos & Base.kAlignMask]; + return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + } + + UInt32 Backward(out UInt32 backRes, UInt32 cur) + { + _optimumEndIndex = cur; + UInt32 posMem = _optimum[cur].PosPrev; + UInt32 backMem = _optimum[cur].BackPrev; + do + { + if (_optimum[cur].Prev1IsChar) + { + _optimum[posMem].MakeAsChar(); + _optimum[posMem].PosPrev = posMem - 1; + if (_optimum[cur].Prev2) + { + _optimum[posMem - 1].Prev1IsChar = false; + _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; + _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; + } + } + UInt32 posPrev = posMem; + UInt32 backCur = backMem; + + backMem = _optimum[posPrev].BackPrev; + posMem = _optimum[posPrev].PosPrev; + + _optimum[posPrev].BackPrev = backCur; + _optimum[posPrev].PosPrev = cur; + cur = posPrev; + } + while (cur > 0); + backRes = _optimum[0].BackPrev; + _optimumCurrentIndex = _optimum[0].PosPrev; + return _optimumCurrentIndex; + } + + UInt32[] reps = new UInt32[Base.kNumRepDistances]; + UInt32[] repLens = new UInt32[Base.kNumRepDistances]; + + + UInt32 GetOptimum(UInt32 position, out UInt32 backRes) + { + if (_optimumEndIndex != _optimumCurrentIndex) + { + UInt32 lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; + backRes = _optimum[_optimumCurrentIndex].BackPrev; + _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; + return lenRes; + } + _optimumCurrentIndex = _optimumEndIndex = 0; + + UInt32 lenMain, numDistancePairs; + if (!_longestMatchWasFound) + { + ReadMatchDistances(out lenMain, out numDistancePairs); + } + else + { + lenMain = _longestMatchLength; + numDistancePairs = _numDistancePairs; + _longestMatchWasFound = false; + } + + UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; + if (numAvailableBytes < 2) + { + backRes = 0xFFFFFFFF; + return 1; + } + if (numAvailableBytes > Base.kMatchMaxLen) + numAvailableBytes = Base.kMatchMaxLen; + + UInt32 repMaxIndex = 0; + UInt32 i; + for (i = 0; i < Base.kNumRepDistances; i++) + { + reps[i] = _repDistances[i]; + repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen); + if (repLens[i] > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= _numFastBytes) + { + backRes = repMaxIndex; + UInt32 lenRes = repLens[repMaxIndex]; + MovePos(lenRes - 1); + return lenRes; + } + + if (lenMain >= _numFastBytes) + { + backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances; + MovePos(lenMain - 1); + return lenMain; + } + + Byte currentByte = _matchFinder.GetIndexByte(0 - 1); + Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - 1)); + + if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) + { + backRes = (UInt32)0xFFFFFFFF; + return 1; + } + + _optimum[0].State = _state; + + UInt32 posState = (position & _posStateMask); + + _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!_state.IsCharState(), matchByte, currentByte); + _optimum[1].MakeAsChar(); + + UInt32 matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); + + if (matchByte == currentByte) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); + if (shortRepPrice < _optimum[1].Price) + { + _optimum[1].Price = shortRepPrice; + _optimum[1].MakeAsShortRep(); + } + } + + UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); + + if(lenEnd < 2) + { + backRes = _optimum[1].BackPrev; + return 1; + } + + _optimum[1].PosPrev = 0; + + _optimum[0].Backs0 = reps[0]; + _optimum[0].Backs1 = reps[1]; + _optimum[0].Backs2 = reps[2]; + _optimum[0].Backs3 = reps[3]; + + UInt32 len = lenEnd; + do + _optimum[len--].Price = kIfinityPrice; + while (len >= 2); + + for (i = 0; i < Base.kNumRepDistances; i++) + { + UInt32 repLen = repLens[i]; + if (repLen < 2) + continue; + UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState); + do + { + UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); + Optimal optimum = _optimum[repLen]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = i; + optimum.Prev1IsChar = false; + } + } + while (--repLen >= 2); + } + + UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= lenMain) + { + UInt32 offs = 0; + while (len > _matchDistances[offs]) + offs += 2; + for (; ; len++) + { + UInt32 distance = _matchDistances[offs + 1]; + UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); + Optimal optimum = _optimum[len]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = distance + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + if (len == _matchDistances[offs]) + { + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + + UInt32 cur = 0; + + while (true) + { + cur++; + if (cur == lenEnd) + return Backward(out backRes, cur); + UInt32 newLen; + ReadMatchDistances(out newLen, out numDistancePairs); + if (newLen >= _numFastBytes) + { + _numDistancePairs = numDistancePairs; + _longestMatchLength = newLen; + _longestMatchWasFound = true; + return Backward(out backRes, cur); + } + position++; + UInt32 posPrev = _optimum[cur].PosPrev; + Base.State state; + if (_optimum[cur].Prev1IsChar) + { + posPrev--; + if (_optimum[cur].Prev2) + { + state = _optimum[_optimum[cur].PosPrev2].State; + if (_optimum[cur].BackPrev2 < Base.kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + else + state = _optimum[posPrev].State; + state.UpdateChar(); + } + else + state = _optimum[posPrev].State; + if (posPrev == cur - 1) + { + if (_optimum[cur].IsShortRep()) + state.UpdateShortRep(); + else + state.UpdateChar(); + } + else + { + UInt32 pos; + if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) + { + posPrev = _optimum[cur].PosPrev2; + pos = _optimum[cur].BackPrev2; + state.UpdateRep(); + } + else + { + pos = _optimum[cur].BackPrev; + if (pos < Base.kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + Optimal opt = _optimum[posPrev]; + if (pos < Base.kNumRepDistances) + { + if (pos == 0) + { + reps[0] = opt.Backs0; + reps[1] = opt.Backs1; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 1) + { + reps[0] = opt.Backs1; + reps[1] = opt.Backs0; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 2) + { + reps[0] = opt.Backs2; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs3; + } + else + { + reps[0] = opt.Backs3; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + else + { + reps[0] = (pos - Base.kNumRepDistances); + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + _optimum[cur].State = state; + _optimum[cur].Backs0 = reps[0]; + _optimum[cur].Backs1 = reps[1]; + _optimum[cur].Backs2 = reps[2]; + _optimum[cur].Backs3 = reps[3]; + UInt32 curPrice = _optimum[cur].Price; + + currentByte = _matchFinder.GetIndexByte(0 - 1); + matchByte = _matchFinder.GetIndexByte((Int32)(0 - reps[0] - 1 - 1)); + + posState = (position & _posStateMask); + + UInt32 curAnd1Price = curPrice + + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). + GetPrice(!state.IsCharState(), matchByte, currentByte); + + Optimal nextOptimum = _optimum[cur + 1]; + + bool nextIsChar = false; + if (curAnd1Price < nextOptimum.Price) + { + nextOptimum.Price = curAnd1Price; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsChar(); + nextIsChar = true; + } + + matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); + + if (matchByte == currentByte && + !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); + if (shortRepPrice <= nextOptimum.Price) + { + nextOptimum.Price = shortRepPrice; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsShortRep(); + nextIsChar = true; + } + } + + UInt32 numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; + numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull); + numAvailableBytes = numAvailableBytesFull; + + if (numAvailableBytes < 2) + continue; + if (numAvailableBytes > _numFastBytes) + numAvailableBytes = _numFastBytes; + if (!nextIsChar && matchByte != currentByte) + { + // try Literal + rep0 + UInt32 t = Math.Min(numAvailableBytesFull - 1, _numFastBytes); + UInt32 lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); + if (lenTest2 >= 2) + { + Base.State state2 = state; + state2.UpdateChar(); + UInt32 posStateNext = (position + 1) & _posStateMask; + UInt32 nextRepMatchPrice = curAnd1Price + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1() + + _isRep[state2.Index].GetPrice1(); + { + UInt32 offset = cur + 1 + lenTest2; + while (lenEnd < offset) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( + 0, lenTest2, state2, posStateNext); + Optimal optimum = _optimum[offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = false; + } + } + } + } + + UInt32 startLen = 2; // speed optimization + + for (UInt32 repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++) + { + UInt32 lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); + if (lenTest < 2) + continue; + UInt32 lenTestTemp = lenTest; + do + { + while (lenEnd < cur + lenTest) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); + Optimal optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = repIndex; + optimum.Prev1IsChar = false; + } + } + while(--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + // if (_maxMode) + if (lenTest < numAvailableBytesFull) + { + UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, reps[repIndex], t); + if (lenTest2 >= 2) + { + Base.State state2 = state; + state2.UpdateRep(); + UInt32 posStateNext = (position + lenTest) & _posStateMask; + UInt32 curAndLenCharPrice = + repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)).GetPrice(true, + _matchFinder.GetIndexByte((Int32)((Int32)lenTest - 1 - (Int32)(reps[repIndex] + 1))), + _matchFinder.GetIndexByte((Int32)lenTest - 1)); + state2.UpdateChar(); + posStateNext = (position + lenTest + 1) & _posStateMask; + UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); + UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); + + // for(; lenTest2 >= 2; lenTest2--) + { + UInt32 offset = lenTest + 1 + lenTest2; + while(lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + Optimal optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = repIndex; + } + } + } + } + } + + if (newLen > numAvailableBytes) + { + newLen = numAvailableBytes; + for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; + _matchDistances[numDistancePairs] = newLen; + numDistancePairs += 2; + } + if (newLen >= startLen) + { + normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); + while (lenEnd < cur + newLen) + _optimum[++lenEnd].Price = kIfinityPrice; + + UInt32 offs = 0; + while (startLen > _matchDistances[offs]) + offs += 2; + + for (UInt32 lenTest = startLen; ; lenTest++) + { + UInt32 curBack = _matchDistances[offs + 1]; + UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); + Optimal optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = curBack + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + + if (lenTest == _matchDistances[offs]) + { + if (lenTest < numAvailableBytesFull) + { + UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, curBack, t); + if (lenTest2 >= 2) + { + Base.State state2 = state; + state2.UpdateMatch(); + UInt32 posStateNext = (position + lenTest) & _posStateMask; + UInt32 curAndLenCharPrice = curAndLenPrice + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)). + GetPrice(true, + _matchFinder.GetIndexByte((Int32)lenTest - (Int32)(curBack + 1) - 1), + _matchFinder.GetIndexByte((Int32)lenTest - 1)); + state2.UpdateChar(); + posStateNext = (position + lenTest + 1) & _posStateMask; + UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); + UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); + + UInt32 offset = lenTest + 1 + lenTest2; + while (lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = curBack + Base.kNumRepDistances; + } + } + } + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + } + } + + bool ChangePair(UInt32 smallDist, UInt32 bigDist) + { + const int kDif = 7; + return (smallDist < ((UInt32)(1) << (32 - kDif)) && bigDist >= (smallDist << kDif)); + } + + void WriteEndMarker(UInt32 posState) + { + if (!_writeEndMark) + return; + + _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1); + _isRep[_state.Index].Encode(_rangeEncoder, 0); + _state.UpdateMatch(); + UInt32 len = Base.kMatchMinLen; + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + UInt32 posSlot = (1 << Base.kNumPosSlotBits) - 1; + UInt32 lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + int footerBits = 30; + UInt32 posReduced = (((UInt32)1) << footerBits) - 1; + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + } + + void Flush(UInt32 nowPos) + { + ReleaseMFStream(); + WriteEndMarker(nowPos & _posStateMask); + _rangeEncoder.FlushData(); + _rangeEncoder.FlushStream(); + } + + public void CodeOneBlock(out Int64 inSize, out Int64 outSize, out bool finished) + { + inSize = 0; + outSize = 0; + finished = true; + + if (_inStream != null) + { + _matchFinder.SetStream(_inStream); + _matchFinder.Init(); + _needReleaseMFStream = true; + _inStream = null; + if (_trainSize > 0) + _matchFinder.Skip(_trainSize); + } + + if (_finished) + return; + _finished = true; + + + Int64 progressPosValuePrev = nowPos64; + if (nowPos64 == 0) + { + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((UInt32)nowPos64); + return; + } + UInt32 len, numDistancePairs; // it's not used + ReadMatchDistances(out len, out numDistancePairs); + UInt32 posState = (UInt32)(nowPos64) & _posStateMask; + _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); + _state.UpdateChar(); + Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset)); + _literalEncoder.GetSubCoder((UInt32)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _additionalOffset--; + nowPos64++; + } + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((UInt32)nowPos64); + return; + } + while (true) + { + UInt32 pos; + UInt32 len = GetOptimum((UInt32)nowPos64, out pos); + + UInt32 posState = ((UInt32)nowPos64) & _posStateMask; + UInt32 complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState; + if (len == 1 && pos == 0xFFFFFFFF) + { + _isMatch[complexState].Encode(_rangeEncoder, 0); + Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset)); + LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((UInt32)nowPos64, _previousByte); + if (!_state.IsCharState()) + { + Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - _additionalOffset)); + subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); + } + else + subCoder.Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _state.UpdateChar(); + } + else + { + _isMatch[complexState].Encode(_rangeEncoder, 1); + if (pos < Base.kNumRepDistances) + { + _isRep[_state.Index].Encode(_rangeEncoder, 1); + if (pos == 0) + { + _isRepG0[_state.Index].Encode(_rangeEncoder, 0); + if (len == 1) + _isRep0Long[complexState].Encode(_rangeEncoder, 0); + else + _isRep0Long[complexState].Encode(_rangeEncoder, 1); + } + else + { + _isRepG0[_state.Index].Encode(_rangeEncoder, 1); + if (pos == 1) + _isRepG1[_state.Index].Encode(_rangeEncoder, 0); + else + { + _isRepG1[_state.Index].Encode(_rangeEncoder, 1); + _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2); + } + } + if (len == 1) + _state.UpdateShortRep(); + else + { + _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + _state.UpdateRep(); + } + UInt32 distance = _repDistances[pos]; + if (pos != 0) + { + for (UInt32 i = pos; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + } + } + else + { + _isRep[_state.Index].Encode(_rangeEncoder, 0); + _state.UpdateMatch(); + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + pos -= Base.kNumRepDistances; + UInt32 posSlot = GetPosSlot(pos); + UInt32 lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + + if (posSlot >= Base.kStartPosModelIndex) + { + int footerBits = (int)((posSlot >> 1) - 1); + UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); + UInt32 posReduced = pos - baseVal; + + if (posSlot < Base.kEndPosModelIndex) + RangeCoder.BitTreeEncoder.ReverseEncode(_posEncoders, + baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); + else + { + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + _alignPriceCount++; + } + } + UInt32 distance = pos; + for (UInt32 i = Base.kNumRepDistances - 1; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + _matchPriceCount++; + } + _previousByte = _matchFinder.GetIndexByte((Int32)(len - 1 - _additionalOffset)); + } + _additionalOffset -= len; + nowPos64 += len; + if (_additionalOffset == 0) + { + // if (!_fastMode) + if (_matchPriceCount >= (1 << 7)) + FillDistancesPrices(); + if (_alignPriceCount >= Base.kAlignTableSize) + FillAlignPrices(); + inSize = nowPos64; + outSize = _rangeEncoder.GetProcessedSizeAdd(); + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((UInt32)nowPos64); + return; + } + + if (nowPos64 - progressPosValuePrev >= (1 << 12)) + { + _finished = false; + finished = false; + return; + } + } + } + } + + void ReleaseMFStream() + { + if (_matchFinder != null && _needReleaseMFStream) + { + _matchFinder.ReleaseStream(); + _needReleaseMFStream = false; + } + } + + void SetOutStream(System.IO.Stream outStream) { _rangeEncoder.SetStream(outStream); } + void ReleaseOutStream() { _rangeEncoder.ReleaseStream(); } + + void ReleaseStreams() + { + ReleaseMFStream(); + ReleaseOutStream(); + } + + void SetStreams(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize) + { + _inStream = inStream; + _finished = false; + Create(); + SetOutStream(outStream); + Init(); + + // if (!_fastMode) + { + FillDistancesPrices(); + FillAlignPrices(); + } + + _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _lenEncoder.UpdateTables((UInt32)1 << _posStateBits); + _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _repMatchLenEncoder.UpdateTables((UInt32)1 << _posStateBits); + + nowPos64 = 0; + } + + + public void Code(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize, ICodeProgress progress) + { + _needReleaseMFStream = false; + try + { + SetStreams(inStream, outStream, inSize, outSize); + while (true) + { + Int64 processedInSize; + Int64 processedOutSize; + bool finished; + CodeOneBlock(out processedInSize, out processedOutSize, out finished); + if (finished) + return; + if (progress != null) + { + progress.SetProgress(processedInSize, processedOutSize); + } + } + } + finally + { + ReleaseStreams(); + } + } + + const int kPropSize = 5; + Byte[] properties = new Byte[kPropSize]; + + public void WriteCoderProperties(System.IO.Stream outStream) + { + properties[0] = (Byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); + for (int i = 0; i < 4; i++) + properties[1 + i] = (Byte)((_dictionarySize >> (8 * i)) & 0xFF); + outStream.Write(properties, 0, kPropSize); + } + + UInt32[] tempPrices = new UInt32[Base.kNumFullDistances]; + UInt32 _matchPriceCount; + + void FillDistancesPrices() + { + for (UInt32 i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++) + { + UInt32 posSlot = GetPosSlot(i); + int footerBits = (int)((posSlot >> 1) - 1); + UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, + baseVal - posSlot - 1, footerBits, i - baseVal); + } + + for (UInt32 lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++) + { + UInt32 posSlot; + RangeCoder.BitTreeEncoder encoder = _posSlotEncoder[lenToPosState]; + + UInt32 st = (lenToPosState << Base.kNumPosSlotBits); + for (posSlot = 0; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); + for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << RangeCoder.BitEncoder.kNumBitPriceShiftBits); + + UInt32 st2 = lenToPosState * Base.kNumFullDistances; + UInt32 i; + for (i = 0; i < Base.kStartPosModelIndex; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + i]; + for (; i < Base.kNumFullDistances; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; + } + _matchPriceCount = 0; + } + + void FillAlignPrices() + { + for (UInt32 i = 0; i < Base.kAlignTableSize; i++) + _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); + _alignPriceCount = 0; + } + + + static string[] kMatchFinderIDs = + { + "BT2", + "BT4", + }; + + static int FindMatchFinder(string s) + { + for (int m = 0; m < kMatchFinderIDs.Length; m++) + if (s == kMatchFinderIDs[m]) + return m; + return -1; + } + + public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) + { + for (UInt32 i = 0; i < properties.Length; i++) + { + object prop = properties[i]; + switch (propIDs[i]) + { + case CoderPropID.NumFastBytes: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 numFastBytes = (Int32)prop; + if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen) + throw new InvalidParamException(); + _numFastBytes = (UInt32)numFastBytes; + break; + } + case CoderPropID.Algorithm: + { + /* + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 maximize = (Int32)prop; + _fastMode = (maximize == 0); + _maxMode = (maximize >= 2); + */ + break; + } + case CoderPropID.MatchFinder: + { + if (!(prop is String)) + throw new InvalidParamException(); + EMatchFinderType matchFinderIndexPrev = _matchFinderType; + int m = FindMatchFinder(((string)prop).ToUpper()); + if (m < 0) + throw new InvalidParamException(); + _matchFinderType = (EMatchFinderType)m; + if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) + { + _dictionarySizePrev = 0xFFFFFFFF; + _matchFinder = null; + } + break; + } + case CoderPropID.DictionarySize: + { + const int kDicLogSizeMaxCompress = 30; + if (!(prop is Int32)) + throw new InvalidParamException(); ; + Int32 dictionarySize = (Int32)prop; + if (dictionarySize < (UInt32)(1 << Base.kDicLogSizeMin) || + dictionarySize > (UInt32)(1 << kDicLogSizeMaxCompress)) + throw new InvalidParamException(); + _dictionarySize = (UInt32)dictionarySize; + int dicLogSize; + for (dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++) + if (dictionarySize <= ((UInt32)(1) << dicLogSize)) + break; + _distTableSize = (UInt32)dicLogSize * 2; + break; + } + case CoderPropID.PosStateBits: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 v = (Int32)prop; + if (v < 0 || v > (UInt32)Base.kNumPosStatesBitsEncodingMax) + throw new InvalidParamException(); + _posStateBits = (int)v; + _posStateMask = (((UInt32)1) << (int)_posStateBits) - 1; + break; + } + case CoderPropID.LitPosBits: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 v = (Int32)prop; + if (v < 0 || v > (UInt32)Base.kNumLitPosStatesBitsEncodingMax) + throw new InvalidParamException(); + _numLiteralPosStateBits = (int)v; + break; + } + case CoderPropID.LitContextBits: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 v = (Int32)prop; + if (v < 0 || v > (UInt32)Base.kNumLitContextBitsMax) + throw new InvalidParamException(); ; + _numLiteralContextBits = (int)v; + break; + } + case CoderPropID.EndMarker: + { + if (!(prop is Boolean)) + throw new InvalidParamException(); + SetWriteEndMarkerMode((Boolean)prop); + break; + } + default: + throw new InvalidParamException(); + } + } + } + + uint _trainSize = 0; + public void SetTrainSize(uint trainSize) + { + _trainSize = trainSize; + } + + } +} diff --git a/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoder.cs b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoder.cs new file mode 100644 index 0000000..4ced247 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoder.cs @@ -0,0 +1,234 @@ +using System; + +namespace SevenZip.Compression.RangeCoder +{ + class Encoder + { + public const uint kTopValue = (1 << 24); + + System.IO.Stream Stream; + + public UInt64 Low; + public uint Range; + uint _cacheSize; + byte _cache; + + long StartPosition; + + public void SetStream(System.IO.Stream stream) + { + Stream = stream; + } + + public void ReleaseStream() + { + Stream = null; + } + + public void Init() + { + StartPosition = Stream.Position; + + Low = 0; + Range = 0xFFFFFFFF; + _cacheSize = 1; + _cache = 0; + } + + public void FlushData() + { + for (int i = 0; i < 5; i++) + ShiftLow(); + } + + public void FlushStream() + { + Stream.Flush(); + } + + public void CloseStream() + { + Stream.Close(); + } + + public void Encode(uint start, uint size, uint total) + { + Low += start * (Range /= total); + Range *= size; + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + public void ShiftLow() + { + if ((uint)Low < (uint)0xFF000000 || (uint)(Low >> 32) == 1) + { + byte temp = _cache; + do + { + Stream.WriteByte((byte)(temp + (Low >> 32))); + temp = 0xFF; + } + while (--_cacheSize != 0); + _cache = (byte)(((uint)Low) >> 24); + } + _cacheSize++; + Low = ((uint)Low) << 8; + } + + public void EncodeDirectBits(uint v, int numTotalBits) + { + for (int i = numTotalBits - 1; i >= 0; i--) + { + Range >>= 1; + if (((v >> i) & 1) == 1) + Low += Range; + if (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + } + + public void EncodeBit(uint size0, int numTotalBits, uint symbol) + { + uint newBound = (Range >> numTotalBits) * size0; + if (symbol == 0) + Range = newBound; + else + { + Low += newBound; + Range -= newBound; + } + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + public long GetProcessedSizeAdd() + { + return _cacheSize + + Stream.Position - StartPosition + 4; + // (long)Stream.GetProcessedSize(); + } + } + + class Decoder + { + public const uint kTopValue = (1 << 24); + public uint Range; + public uint Code; + // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16); + public System.IO.Stream Stream; + + public void Init(System.IO.Stream stream) + { + // Stream.Init(stream); + Stream = stream; + + Code = 0; + Range = 0xFFFFFFFF; + for (int i = 0; i < 5; i++) + Code = (Code << 8) | (byte)Stream.ReadByte(); + } + + public void ReleaseStream() + { + // Stream.ReleaseStream(); + Stream = null; + } + + public void CloseStream() + { + Stream.Close(); + } + + public void Normalize() + { + while (Range < kTopValue) + { + Code = (Code << 8) | (byte)Stream.ReadByte(); + Range <<= 8; + } + } + + public void Normalize2() + { + if (Range < kTopValue) + { + Code = (Code << 8) | (byte)Stream.ReadByte(); + Range <<= 8; + } + } + + public uint GetThreshold(uint total) + { + return Code / (Range /= total); + } + + public void Decode(uint start, uint size, uint total) + { + Code -= start * Range; + Range *= size; + Normalize(); + } + + public uint DecodeDirectBits(int numTotalBits) + { + uint range = Range; + uint code = Code; + uint result = 0; + for (int i = numTotalBits; i > 0; i--) + { + range >>= 1; + /* + result <<= 1; + if (code >= range) + { + code -= range; + result |= 1; + } + */ + uint t = (code - range) >> 31; + code -= range & (t - 1); + result = (result << 1) | (1 - t); + + if (range < kTopValue) + { + code = (code << 8) | (byte)Stream.ReadByte(); + range <<= 8; + } + } + Range = range; + Code = code; + return result; + } + + public uint DecodeBit(uint size0, int numTotalBits) + { + uint newBound = (Range >> numTotalBits) * size0; + uint symbol; + if (Code < newBound) + { + symbol = 0; + Range = newBound; + } + else + { + symbol = 1; + Code -= newBound; + Range -= newBound; + } + Normalize(); + return symbol; + } + + // ulong GetProcessedSize() {return Stream.GetProcessedSize(); } + } +} diff --git a/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBit.cs b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBit.cs new file mode 100644 index 0000000..000a5a0 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBit.cs @@ -0,0 +1,117 @@ +using System; + +namespace SevenZip.Compression.RangeCoder +{ + struct BitEncoder + { + public const int kNumBitModelTotalBits = 11; + public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); + const int kNumMoveBits = 5; + const int kNumMoveReducingBits = 2; + public const int kNumBitPriceShiftBits = 6; + + uint Prob; + + public void Init() { Prob = kBitModelTotal >> 1; } + + public void UpdateModel(uint symbol) + { + if (symbol == 0) + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + else + Prob -= (Prob) >> kNumMoveBits; + } + + public void Encode(Encoder encoder, uint symbol) + { + // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol); + // UpdateModel(symbol); + uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob; + if (symbol == 0) + { + encoder.Range = newBound; + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + } + else + { + encoder.Low += newBound; + encoder.Range -= newBound; + Prob -= (Prob) >> kNumMoveBits; + } + if (encoder.Range < Encoder.kTopValue) + { + encoder.Range <<= 8; + encoder.ShiftLow(); + } + } + + private static UInt32[] ProbPrices = new UInt32[kBitModelTotal >> kNumMoveReducingBits]; + + static BitEncoder() + { + const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); + for (int i = kNumBits - 1; i >= 0; i--) + { + UInt32 start = (UInt32)1 << (kNumBits - i - 1); + UInt32 end = (UInt32)1 << (kNumBits - i); + for (UInt32 j = start; j < end; j++) + ProbPrices[j] = ((UInt32)i << kNumBitPriceShiftBits) + + (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); + } + } + + public uint GetPrice(uint symbol) + { + return ProbPrices[(((Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; + } + public uint GetPrice0() { return ProbPrices[Prob >> kNumMoveReducingBits]; } + public uint GetPrice1() { return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; } + } + + struct BitDecoder + { + public const int kNumBitModelTotalBits = 11; + public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); + const int kNumMoveBits = 5; + + uint Prob; + + public void UpdateModel(int numMoveBits, uint symbol) + { + if (symbol == 0) + Prob += (kBitModelTotal - Prob) >> numMoveBits; + else + Prob -= (Prob) >> numMoveBits; + } + + public void Init() { Prob = kBitModelTotal >> 1; } + + public uint Decode(RangeCoder.Decoder rangeDecoder) + { + uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob; + if (rangeDecoder.Code < newBound) + { + rangeDecoder.Range = newBound; + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + if (rangeDecoder.Range < Decoder.kTopValue) + { + rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); + rangeDecoder.Range <<= 8; + } + return 0; + } + else + { + rangeDecoder.Range -= newBound; + rangeDecoder.Code -= newBound; + Prob -= (Prob) >> kNumMoveBits; + if (rangeDecoder.Range < Decoder.kTopValue) + { + rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); + rangeDecoder.Range <<= 8; + } + return 1; + } + } + } +} diff --git a/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBitTree.cs b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBitTree.cs new file mode 100644 index 0000000..3309c14 --- /dev/null +++ b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBitTree.cs @@ -0,0 +1,157 @@ +using System; + +namespace SevenZip.Compression.RangeCoder +{ + struct BitTreeEncoder + { + BitEncoder[] Models; + int NumBitLevels; + + public BitTreeEncoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new BitEncoder[1 << numBitLevels]; + } + + public void Init() + { + for (uint i = 1; i < (1 << NumBitLevels); i++) + Models[i].Init(); + } + + public void Encode(Encoder rangeEncoder, UInt32 symbol) + { + UInt32 m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0; ) + { + bitIndex--; + UInt32 bit = (symbol >> bitIndex) & 1; + Models[m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + } + } + + public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol) + { + UInt32 m = 1; + for (UInt32 i = 0; i < NumBitLevels; i++) + { + UInt32 bit = symbol & 1; + Models[m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } + + public UInt32 GetPrice(UInt32 symbol) + { + UInt32 price = 0; + UInt32 m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0; ) + { + bitIndex--; + UInt32 bit = (symbol >> bitIndex) & 1; + price += Models[m].GetPrice(bit); + m = (m << 1) + bit; + } + return price; + } + + public UInt32 ReverseGetPrice(UInt32 symbol) + { + UInt32 price = 0; + UInt32 m = 1; + for (int i = NumBitLevels; i > 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += Models[m].GetPrice(bit); + m = (m << 1) | bit; + } + return price; + } + + public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex, + int NumBitLevels, UInt32 symbol) + { + UInt32 price = 0; + UInt32 m = 1; + for (int i = NumBitLevels; i > 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += Models[startIndex + m].GetPrice(bit); + m = (m << 1) | bit; + } + return price; + } + + public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex, + Encoder rangeEncoder, int NumBitLevels, UInt32 symbol) + { + UInt32 m = 1; + for (int i = 0; i < NumBitLevels; i++) + { + UInt32 bit = symbol & 1; + Models[startIndex + m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } + } + + struct BitTreeDecoder + { + BitDecoder[] Models; + int NumBitLevels; + + public BitTreeDecoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new BitDecoder[1 << numBitLevels]; + } + + public void Init() + { + for (uint i = 1; i < (1 << NumBitLevels); i++) + Models[i].Init(); + } + + public uint Decode(RangeCoder.Decoder rangeDecoder) + { + uint m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--) + m = (m << 1) + Models[m].Decode(rangeDecoder); + return m - ((uint)1 << NumBitLevels); + } + + public uint ReverseDecode(RangeCoder.Decoder rangeDecoder) + { + uint m = 1; + uint symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + uint bit = Models[m].Decode(rangeDecoder); + m <<= 1; + m += bit; + symbol |= (bit << bitIndex); + } + return symbol; + } + + public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex, + RangeCoder.Decoder rangeDecoder, int NumBitLevels) + { + uint m = 1; + uint symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + uint bit = Models[startIndex + m].Decode(rangeDecoder); + m <<= 1; + m += bit; + symbol |= (bit << bitIndex); + } + return symbol; + } + } +} diff --git a/ABStudio/Libs/7zip/ICoder.cs b/ABStudio/Libs/7zip/ICoder.cs new file mode 100644 index 0000000..875cb27 --- /dev/null +++ b/ABStudio/Libs/7zip/ICoder.cs @@ -0,0 +1,157 @@ +// ICoder.h + +using System; + +namespace SevenZip +{ + /// + /// The exception that is thrown when an error in input stream occurs during decoding. + /// + class DataErrorException : ApplicationException + { + public DataErrorException(): base("Data Error") { } + } + + /// + /// The exception that is thrown when the value of an argument is outside the allowable range. + /// + class InvalidParamException : ApplicationException + { + public InvalidParamException(): base("Invalid Parameter") { } + } + + public interface ICodeProgress + { + /// + /// Callback progress. + /// + /// + /// input size. -1 if unknown. + /// + /// + /// output size. -1 if unknown. + /// + void SetProgress(Int64 inSize, Int64 outSize); + }; + + public interface ICoder + { + /// + /// Codes streams. + /// + /// + /// input Stream. + /// + /// + /// output Stream. + /// + /// + /// input Size. -1 if unknown. + /// + /// + /// output Size. -1 if unknown. + /// + /// + /// callback progress reference. + /// + /// + /// if input stream is not valid + /// + void Code(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize, ICodeProgress progress); + }; + + /* + public interface ICoder2 + { + void Code(ISequentialInStream []inStreams, + const UInt64 []inSizes, + ISequentialOutStream []outStreams, + UInt64 []outSizes, + ICodeProgress progress); + }; + */ + + /// + /// Provides the fields that represent properties idenitifiers for compressing. + /// + public enum CoderPropID + { + /// + /// Specifies default property. + /// + DefaultProp = 0, + /// + /// Specifies size of dictionary. + /// + DictionarySize, + /// + /// Specifies size of memory for PPM*. + /// + UsedMemorySize, + /// + /// Specifies order for PPM methods. + /// + Order, + /// + /// Specifies Block Size. + /// + BlockSize, + /// + /// Specifies number of postion state bits for LZMA (0 <= x <= 4). + /// + PosStateBits, + /// + /// Specifies number of literal context bits for LZMA (0 <= x <= 8). + /// + LitContextBits, + /// + /// Specifies number of literal position bits for LZMA (0 <= x <= 4). + /// + LitPosBits, + /// + /// Specifies number of fast bytes for LZ*. + /// + NumFastBytes, + /// + /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B". + /// + MatchFinder, + /// + /// Specifies the number of match finder cyckes. + /// + MatchFinderCycles, + /// + /// Specifies number of passes. + /// + NumPasses, + /// + /// Specifies number of algorithm. + /// + Algorithm, + /// + /// Specifies the number of threads. + /// + NumThreads, + /// + /// Specifies mode with end marker. + /// + EndMarker + }; + + + public interface ISetCoderProperties + { + void SetCoderProperties(CoderPropID[] propIDs, object[] properties); + }; + + public interface IWriteCoderProperties + { + void WriteCoderProperties(System.IO.Stream outStream); + } + + public interface ISetDecoderProperties + { + void SetDecoderProperties(byte[] properties); + } +} diff --git a/ABStudio/Libs/7zip/Source.txt b/ABStudio/Libs/7zip/Source.txt new file mode 100644 index 0000000..e62c937 --- /dev/null +++ b/ABStudio/Libs/7zip/Source.txt @@ -0,0 +1 @@ +https://7-zip.org/sdk.html \ No newline at end of file diff --git a/ABStudio/Libs/StbRectPackSharp/CRuntime.cs b/ABStudio/Libs/StbRectPackSharp/CRuntime.cs new file mode 100644 index 0000000..e104975 --- /dev/null +++ b/ABStudio/Libs/StbRectPackSharp/CRuntime.cs @@ -0,0 +1,87 @@ +using System; +using System.Runtime.InteropServices; + +namespace StbRectPackSharp +{ + internal static unsafe class CRuntime + { + public static void* malloc(ulong size) + { + return malloc((long)size); + } + + public static void* malloc(long size) + { + var ptr = Marshal.AllocHGlobal((int)size); + + return ptr.ToPointer(); + } + + public static void free(void* a) + { + var ptr = new IntPtr(a); + Marshal.FreeHGlobal(ptr); + } + + public delegate int QSortComparer(void* a, void* b); + + private static void qsortSwap(byte* data, long size, long pos1, long pos2) + { + var a = data + size * pos1; + var b = data + size * pos2; + + for (long k = 0; k < size; ++k) + { + var tmp = *a; + *a = *b; + *b = tmp; + + a++; + b++; + } + } + + private static long qsortPartition(byte* data, long size, QSortComparer comparer, long left, long right) + { + void* pivot = data + size * left; + var i = left - 1; + var j = right + 1; + for (; ; ) + { + do + { + ++i; + } while (comparer(data + size * i, pivot) < 0); + + do + { + --j; + } while (comparer(data + size * j, pivot) > 0); + + if (i >= j) + { + return j; + } + + qsortSwap(data, size, i, j); + } + } + + + private static void qsortInternal(byte* data, long size, QSortComparer comparer, long left, long right) + { + if (left < right) + { + var p = qsortPartition(data, size, comparer, left, right); + + qsortInternal(data, size, comparer, left, p); + qsortInternal(data, size, comparer, p + 1, right); + } + } + + public static void qsort(void* data, ulong count, ulong size, QSortComparer comparer) + { + qsortInternal((byte*)data, (long)size, comparer, 0, (long)count - 1); + } + } +} \ No newline at end of file diff --git a/ABStudio/Libs/StbRectPackSharp/Packer.cs b/ABStudio/Libs/StbRectPackSharp/Packer.cs new file mode 100644 index 0000000..01e90e7 --- /dev/null +++ b/ABStudio/Libs/StbRectPackSharp/Packer.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using static StbRectPackSharp.StbRectPack; + +namespace StbRectPackSharp +{ +#if !STBSHARP_INTERNAL + public +#else + internal +#endif + class PackerRectangle + { + public Rectangle Rectangle { get; private set; } + + public int X => Rectangle.X; + public int Y => Rectangle.Y; + public int Width => Rectangle.Width; + public int Height => Rectangle.Height; + + public object Data { get; private set; } + + public PackerRectangle(Rectangle rect, object data) + { + Rectangle = rect; + Data = data; + } + } + + /// + /// Simple Packer class that doubles size of the atlas if the place runs out + /// +#if !STBSHARP_INTERNAL + public +#else + internal +#endif + unsafe class Packer : IDisposable + { + private readonly stbrp_context _context; + private readonly List _rectangles = new List(); + + public int Width => _context.width; + public int Height => _context.height; + + public List PackRectangles => _rectangles; + + + public Packer(int width = 256, int height = 256) + { + if (width <= 0) + { + throw new ArgumentOutOfRangeException(nameof(width)); + } + + if (height <= 0) + { + throw new ArgumentOutOfRangeException(nameof(height)); + } + + // Initialize the context + var num_nodes = width; + _context = new stbrp_context(num_nodes); + + fixed (stbrp_context* contextPtr = &_context) + { + stbrp_init_target(contextPtr, width, height, _context.all_nodes, num_nodes); + } + } + + public void Dispose() + { + _context.Dispose(); + } + + /// + /// Packs a rect. Returns null, if there's no more place left. + /// + /// + /// + /// + /// + public PackerRectangle PackRect(int width, int height, object userData) + { + var rect = new stbrp_rect + { + id = _rectangles.Count, + w = width, + h = height + }; + + int result; + fixed (stbrp_context* contextPtr = &_context) + { + result = stbrp_pack_rects(contextPtr, &rect, 1); + } + + if (result == 0) + { + return null; + } + + var packRectangle = new PackerRectangle(new Rectangle(rect.x, rect.y, rect.w, rect.h), userData); + _rectangles.Add(packRectangle); + + return packRectangle; + } + + /// + /// Packs a rect. Resizes the entire packer if there's no more space + /// + /// + /// + /// + /// + public static PackerRectangle PackRectForce(ref Packer packer, int width, int height, object userData) + { + PackerRectangle pr = packer.PackRect(width, height, userData); + + // If pr is null, it means there's no place for the new rect + // Double the size of the packer until the new rectangle will fit + while (pr == null) + { + Packer newPacker = new Packer(packer.Width + 256, packer.Height + 256); + + // Place existing rectangles + foreach (PackerRectangle existingRect in packer.PackRectangles) + { + newPacker.PackRect(existingRect.Width, existingRect.Height, existingRect.Data); + } + + // Now dispose old packer and assign new one + packer.Dispose(); + packer = newPacker; + + // Try to fit the rectangle again + pr = packer.PackRect(width, height, userData); + } + + return pr; + } + + } +} diff --git a/ABStudio/Libs/StbRectPackSharp/Source.txt b/ABStudio/Libs/StbRectPackSharp/Source.txt new file mode 100644 index 0000000..43e5170 --- /dev/null +++ b/ABStudio/Libs/StbRectPackSharp/Source.txt @@ -0,0 +1 @@ +https://github.com/StbSharp/StbRectPackSharp \ No newline at end of file diff --git a/ABStudio/Libs/StbRectPackSharp/StbRectPack.Generated.cs b/ABStudio/Libs/StbRectPackSharp/StbRectPack.Generated.cs new file mode 100644 index 0000000..6057bdc --- /dev/null +++ b/ABStudio/Libs/StbRectPackSharp/StbRectPack.Generated.cs @@ -0,0 +1,308 @@ +// Generated by Sichem at 2/18/2021 7:29:26 PM + +using System; +using System.Runtime.InteropServices; + +namespace StbRectPackSharp +{ + unsafe partial class StbRectPack + { + public const int STBRP_HEURISTIC_Skyline_default = 0; + public const int STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default; + public const int STBRP_HEURISTIC_Skyline_BF_sortHeight = 2; + public const int STBRP__INIT_skyline = 1; + + [StructLayout(LayoutKind.Sequential)] + public struct stbrp_rect + { + public int id; + public int w; + public int h; + public int x; + public int y; + public int was_packed; + } + + [StructLayout(LayoutKind.Sequential)] + public struct stbrp_node + { + public int x; + public int y; + public stbrp_node* next; + } + + [StructLayout(LayoutKind.Sequential)] + public struct stbrp__findresult + { + public int x; + public int y; + public stbrp_node** prev_link; + } + + public static void stbrp_setup_heuristic(stbrp_context* context, int heuristic) + { + switch (context->init_mode) + { + case STBRP__INIT_skyline: + ; + context->heuristic = heuristic; + break; + default: + throw new Exception("Mode " + context->init_mode + " is not supported."); + } + } + + public static void stbrp_setup_allow_out_of_mem(stbrp_context* context, int allow_out_of_mem) + { + if (allow_out_of_mem != 0) + context->align = 1; + else + context->align = (context->width + context->num_nodes - 1) / context->num_nodes; + } + + public static void stbrp_init_target(stbrp_context* context, int width, int height, stbrp_node* nodes, + int num_nodes) + { + var i = 0; + for (i = 0; i < num_nodes - 1; ++i) + nodes[i].next = &nodes[i + 1]; + nodes[i].next = null; + context->init_mode = STBRP__INIT_skyline; + context->heuristic = STBRP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + stbrp_setup_allow_out_of_mem(context, 0); + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (int)width; + context->extra[1].y = 65535; + context->extra[1].next = null; + } + + public static int stbrp__skyline_find_min_y(stbrp_context* c, stbrp_node* first, int x0, int width, int* pwaste) + { + var node = first; + var x1 = x0 + width; + var min_y = 0; + var visited_width = 0; + var waste_area = 0; + min_y = 0; + waste_area = 0; + visited_width = 0; + while (node->x < x1) + { + if (node->y > min_y) + { + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + if (node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } + else + { + var under_width = node->next->x - node->x; + if (under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + + node = node->next; + } + + *pwaste = waste_area; + return min_y; + } + + public static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context* c, int width, int height) + { + var best_waste = 1 << 30; + var best_x = 0; + var best_y = 1 << 30; + var fr = new stbrp__findresult(); + stbrp_node** prev; + stbrp_node* node; + stbrp_node* tail; + stbrp_node** best = null; + width = width + c->align - 1; + width -= width % c->align; + if (width > c->width || height > c->height) + { + fr.prev_link = null; + fr.x = fr.y = 0; + return fr; + } + + node = c->active_head; + prev = &c->active_head; + while (node->x + width <= c->width) + { + var y = 0; + var waste = 0; + y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); + if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) + { + if (y < best_y) + { + best_y = y; + best = prev; + } + } + else + { + if (y + height <= c->height) + if (y < best_y || y == best_y && waste < best_waste) + { + best_y = y; + best_waste = waste; + best = prev; + } + } + + prev = &node->next; + node = node->next; + } + + best_x = best == null ? 0 : (*best)->x; + if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) + { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + while (tail->x < width) + tail = tail->next; + while (tail != null) + { + var xpos = tail->x - width; + var y = 0; + var waste = 0; + while (node->next->x <= xpos) + { + prev = &node->next; + node = node->next; + } + + y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); + if (y + height <= c->height) + if (y <= best_y) + if (y < best_y || waste < best_waste || waste == best_waste && xpos < best_x) + { + best_x = xpos; + best_y = y; + best_waste = waste; + best = prev; + } + + tail = tail->next; + } + } + + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; + } + + public static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context* context, int width, int height) + { + var res = stbrp__skyline_find_best_pos(context, width, height); + stbrp_node* node; + stbrp_node* cur; + if (res.prev_link == null || res.y + height > context->height || context->free_head == null) + { + res.prev_link = null; + return res; + } + + node = context->free_head; + node->x = (int)res.x; + node->y = (int)(res.y + height); + context->free_head = node->next; + cur = *res.prev_link; + if (cur->x < res.x) + { + var next = cur->next; + cur->next = node; + cur = next; + } + else + { + *res.prev_link = node; + } + + while (cur->next != null && cur->next->x <= res.x + width) + { + var next = cur->next; + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + + node->next = cur; + if (cur->x < res.x + width) + cur->x = (int)(res.x + width); + return res; + } + + public static int rect_height_compare(void* a, void* b) + { + var p = (stbrp_rect*)a; + var q = (stbrp_rect*)b; + if (p->h > q->h) + return -1; + if (p->h < q->h) + return 1; + return p->w > q->w ? -1 : p->w < q->w ? 1 : 0; + } + + public static int rect_original_order(void* a, void* b) + { + var p = (stbrp_rect*)a; + var q = (stbrp_rect*)b; + return p->was_packed < q->was_packed ? -1 : p->was_packed > q->was_packed ? 1 : 0; + } + + public static int stbrp_pack_rects(stbrp_context* context, stbrp_rect* rects, int num_rects) + { + var i = 0; + var all_rects_packed = 1; + for (i = 0; i < num_rects; ++i) + rects[i].was_packed = i; + CRuntime.qsort(rects, (ulong)num_rects, (ulong)sizeof(stbrp_rect), rect_height_compare); + for (i = 0; i < num_rects; ++i) + if (rects[i].w == 0 || rects[i].h == 0) + { + rects[i].x = rects[i].y = 0; + } + else + { + var fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if (fr.prev_link != null) + { + rects[i].x = (int)fr.x; + rects[i].y = (int)fr.y; + } + else + { + rects[i].x = rects[i].y = 0xffff; + } + } + + CRuntime.qsort(rects, (ulong)num_rects, (ulong)sizeof(stbrp_rect), rect_original_order); + for (i = 0; i < num_rects; ++i) + { + rects[i].was_packed = rects[i].x == 0xffff && rects[i].y == 0xffff ? 0 : 1; + if (rects[i].was_packed == 0) + all_rects_packed = 0; + } + + return all_rects_packed; + } + } +} \ No newline at end of file diff --git a/ABStudio/Libs/StbRectPackSharp/StbRectPack.cs b/ABStudio/Libs/StbRectPackSharp/StbRectPack.cs new file mode 100644 index 0000000..e5c7373 --- /dev/null +++ b/ABStudio/Libs/StbRectPackSharp/StbRectPack.cs @@ -0,0 +1,59 @@ +using System; + +namespace StbRectPackSharp +{ +#if !STBSHARP_INTERNAL + public +#else + internal +#endif + static unsafe partial class StbRectPack + { + public struct stbrp_context: IDisposable + { + public int width; + public int height; + public int align; + public int init_mode; + public int heuristic; + public int num_nodes; + public stbrp_node* active_head; + public stbrp_node* free_head; + public stbrp_node* extra; + public stbrp_node* all_nodes; + + + public stbrp_context(int nodesCount) + { + if (nodesCount <= 0) + { + throw new ArgumentOutOfRangeException(nameof(nodesCount)); + } + + width = height = align = init_mode = heuristic = num_nodes = 0; + active_head = free_head = null; + + // Allocate nodes + all_nodes = (stbrp_node*)CRuntime.malloc(sizeof(stbrp_node) * nodesCount); + + // Allocate extras + extra = (stbrp_node*)CRuntime.malloc(sizeof(stbrp_node) * 2); + } + + public void Dispose() + { + if (all_nodes != null) + { + CRuntime.free(all_nodes); + all_nodes = null; + } + + if (extra != null) + { + CRuntime.free(extra); + extra = null; + } + } + } + } +} diff --git a/ABStudio/Misc/Common.cs b/ABStudio/Misc/Common.cs new file mode 100644 index 0000000..b2ae81a --- /dev/null +++ b/ABStudio/Misc/Common.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ABStudio.FileFormats.DAT; +using ABStudio.FileFormats.ZSTREAM; +using ABStudio.Forms; + +namespace ABStudio.Misc +{ + public static class Common + { + /*********/ + /* Lists */ + /*********/ + + private static readonly string[] typeList = new string[] { "Sprite" }; + private static readonly string[] displayList = new string[] { "Spritesheet" }; + private static readonly Func[] createList = new Func[] { NewSpritesheetFile }; + private static readonly Action[] editorList = new Action[] { NewSpritesheetEditor }; + + public static string[] DisplayNames { get => displayList; } + + + /**************************/ + /* New & Editor functions */ + /**************************/ + + public static DATFile NewSpritesheetFile() + { + return DATFile.NewSpriteData(); + } + + public static void NewSpritesheetEditor(string path, DATFile file) + { + SpritesheetEditor editor = new SpritesheetEditor(path, file); + editor.Show(); + } + + + /*********************/ + /* Utility functions */ + /*********************/ + + public static DATFile OpenFile() { string str = ""; return OpenFile(ref str); } + public static DATFile OpenFile(ref string originalPath) + { + using (OpenFileDialog dialog = new OpenFileDialog()) + { + dialog.Filter = "Angry Birds Classic DAT Files|*.dat|Angry Birds Classic Sheets JSON Files|*.sheet.json|All files (*.*)|*.*"; + dialog.DefaultExt = "dat"; + dialog.FilterIndex = 1; + dialog.RestoreDirectory = true; + if (dialog.ShowDialog() == DialogResult.OK) + { + string path = dialog.FileName; + + DATFile file = null; + try + { + if (path.EndsWith(".sheet.json", StringComparison.OrdinalIgnoreCase)) + { + ZSTREAMFile zs = new ZSTREAMFile(path); + file = zs.associatedDAT; + } + else + file = new DATFile(path); + } + catch (Exception ex) + { + MessageBox.Show("Couldn't load:" + + Environment.NewLine + "\"" + path + "\"" + + Environment.NewLine + + Environment.NewLine + "Error:" + + Environment.NewLine + ex.ToString(), + "Couldn't load DAT file", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + + return null; + } + + originalPath = path; + return file; + } + } + + return null; + } + + public static void OpenFileInNewEditor() + { + string path = ""; + DATFile file = OpenFile(ref path); + + if (file != null) + OpenEditor(path, file); + } + + public static void SaveFile(string path, DATFile file) => SaveFile(ref path, file); + public static void SaveFile(ref string path, DATFile file) + { + if (path == "") + SaveAsFile(ref path, file); + else + File.WriteAllBytes(path, path.EndsWith(".json", StringComparison.OrdinalIgnoreCase) ? file.AsJSONBytes : file.AsBytes); + } + + + public static bool SaveAsFile(DATFile file) { string str = ""; return SaveAsFile(ref str, file); } + public static bool SaveAsFile(ref string originalPath, DATFile file) + { + SaveFileDialog dialog; + dialog = new SaveFileDialog(); + dialog.Filter = "Angry Birds Classic DAT Files|*.dat|Angry Birds Classic Sheets JSON Files|*.sheet.json|All files (*.*)|*.*"; + dialog.DefaultExt = "dat"; + if (dialog.ShowDialog() == DialogResult.OK) + { + originalPath = dialog.FileName; + SaveFile(ref originalPath, file); + + return true; + } + + return false; + } + + public static void OpenEditor(string path, DATFile file) + { + bool success = false; + + for (int i = 0; i < typeList.Length; i++) + { + if (file.Type == typeList[i]) + { + editorList[i].Invoke(path, file); + success = true; + break; + } + } + + if (!success) + MessageBox.Show("No associated editor was found for DAT file type \"" + file.Type + "\".", "Couldn't open editor", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + public static DATFile AskForNew() + { + using (ComboAskForm comboAskForm = new ComboAskForm(displayList, "Choose the type of file you want to create")) + if (comboAskForm.ShowDialog() == DialogResult.OK) + return MakeNew(comboAskForm.ComboIndex); + + return null; + } + + private static DATFile MakeNew(int id) + { + return createList[id].Invoke(); + } + + public static DATFile MakeNew(string displayName) + { + return MakeNew(Array.IndexOf(displayList, displayName)); + } + + [DllImport("user32.dll")] + public static extern short GetAsyncKeyState(int key); + + // https://stackoverflow.com/a/13266776/9399492 + public static string MakeRelativePath(string filePath, string referencePath, bool useWindowsDirChar=true) + { + var fileUri = new Uri(filePath); + var referenceUri = new Uri(referencePath); + string relativePath = Uri.UnescapeDataString(referenceUri.MakeRelativeUri(fileUri).ToString()); + if (useWindowsDirChar) + relativePath = relativePath.Replace('/', Path.DirectorySeparatorChar); + + return relativePath; + } + } +} diff --git a/ABStudio/Misc/FolderPicker.cs b/ABStudio/Misc/FolderPicker.cs new file mode 100644 index 0000000..0929316 --- /dev/null +++ b/ABStudio/Misc/FolderPicker.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Interop; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace ABStudio.Misc +{ + public class FolderPicker + { + private readonly List _resultPaths = new List(); + private readonly List _resultNames = new List(); + + public IReadOnlyList ResultPaths => _resultPaths; + public IReadOnlyList ResultNames => _resultNames; + public string ResultPath => ResultPaths.FirstOrDefault(); + public string ResultName => ResultNames.FirstOrDefault(); + public virtual string InputPath { get; set; } + public virtual bool ForceFileSystem { get; set; } + public virtual bool Multiselect { get; set; } + public virtual string Title { get; set; } + public virtual string OkButtonLabel { get; set; } + public virtual string FileNameLabel { get; set; } + + protected virtual int SetOptions(int options) + { + if (ForceFileSystem) + { + options |= (int)FOS.FOS_FORCEFILESYSTEM; + } + + if (Multiselect) + { + options |= (int)FOS.FOS_ALLOWMULTISELECT; + } + return options; + } + + // for all .NET + public virtual bool? ShowDialog(bool throwOnError = false) => ShowDialog(IntPtr.Zero, throwOnError); + public virtual bool? ShowDialog(IntPtr owner, bool throwOnError = false) + { + var dialog = (IFileOpenDialog)new FileOpenDialog(); + if (!string.IsNullOrEmpty(InputPath)) + { + if (CheckHr(SHCreateItemFromParsingName(InputPath, null, typeof(IShellItem).GUID, out var item), throwOnError) != 0) + return null; + + dialog.SetFolder(item); + } + + var options = FOS.FOS_PICKFOLDERS; + options = (FOS)SetOptions((int)options); + dialog.SetOptions(options); + + if (Title != null) + { + dialog.SetTitle(Title); + } + + if (OkButtonLabel != null) + { + dialog.SetOkButtonLabel(OkButtonLabel); + } + + if (FileNameLabel != null) + { + dialog.SetFileName(FileNameLabel); + } + + if (owner == IntPtr.Zero) + { + owner = Process.GetCurrentProcess().MainWindowHandle; + if (owner == IntPtr.Zero) + { + owner = GetDesktopWindow(); + } + } + + var hr = dialog.Show(owner); + if (hr == ERROR_CANCELLED) + return null; + + if (CheckHr(hr, throwOnError) != 0) + return null; + + if (CheckHr(dialog.GetResults(out var items), throwOnError) != 0) + return null; + + items.GetCount(out var count); + for (var i = 0; i < count; i++) + { + items.GetItemAt(i, out var item); + CheckHr(item.GetDisplayName(SIGDN.SIGDN_DESKTOPABSOLUTEPARSING, out var path), throwOnError); + CheckHr(item.GetDisplayName(SIGDN.SIGDN_DESKTOPABSOLUTEEDITING, out var name), throwOnError); + if (path != null || name != null) + { + _resultPaths.Add(path); + _resultNames.Add(name); + } + } + return true; + } + + private static int CheckHr(int hr, bool throwOnError) + { + if (hr != 0 && throwOnError) Marshal.ThrowExceptionForHR(hr); + return hr; + } + + [DllImport("shell32")] + private static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IBindCtx pbc, [MarshalAs(UnmanagedType.LPStruct)] Guid riid, out IShellItem ppv); + + [DllImport("user32")] + private static extern IntPtr GetDesktopWindow(); + + private const int ERROR_CANCELLED = unchecked((int)0x800704C7); + + [ComImport, Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")] // CLSID_FileOpenDialog + private class FileOpenDialog { } + + [ComImport, Guid("d57c7288-d4ad-4768-be02-9d969532d960"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IFileOpenDialog + { + [PreserveSig] int Show(IntPtr parent); // IModalWindow + [PreserveSig] int SetFileTypes(); // not fully defined + [PreserveSig] int SetFileTypeIndex(int iFileType); + [PreserveSig] int GetFileTypeIndex(out int piFileType); + [PreserveSig] int Advise(); // not fully defined + [PreserveSig] int Unadvise(); + [PreserveSig] int SetOptions(FOS fos); + [PreserveSig] int GetOptions(out FOS pfos); + [PreserveSig] int SetDefaultFolder(IShellItem psi); + [PreserveSig] int SetFolder(IShellItem psi); + [PreserveSig] int GetFolder(out IShellItem ppsi); + [PreserveSig] int GetCurrentSelection(out IShellItem ppsi); + [PreserveSig] int SetFileName([MarshalAs(UnmanagedType.LPWStr)] string pszName); + [PreserveSig] int GetFileName([MarshalAs(UnmanagedType.LPWStr)] out string pszName); + [PreserveSig] int SetTitle([MarshalAs(UnmanagedType.LPWStr)] string pszTitle); + [PreserveSig] int SetOkButtonLabel([MarshalAs(UnmanagedType.LPWStr)] string pszText); + [PreserveSig] int SetFileNameLabel([MarshalAs(UnmanagedType.LPWStr)] string pszLabel); + [PreserveSig] int GetResult(out IShellItem ppsi); + [PreserveSig] int AddPlace(IShellItem psi, int alignment); + [PreserveSig] int SetDefaultExtension([MarshalAs(UnmanagedType.LPWStr)] string pszDefaultExtension); + [PreserveSig] int Close(int hr); + [PreserveSig] int SetClientGuid(); // not fully defined + [PreserveSig] int ClearClientData(); + [PreserveSig] int SetFilter([MarshalAs(UnmanagedType.IUnknown)] object pFilter); + [PreserveSig] int GetResults(out IShellItemArray ppenum); + [PreserveSig] int GetSelectedItems([MarshalAs(UnmanagedType.IUnknown)] out object ppsai); + } + + [ComImport, Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IShellItem + { + [PreserveSig] int BindToHandler(); // not fully defined + [PreserveSig] int GetParent(); // not fully defined + [PreserveSig] int GetDisplayName(SIGDN sigdnName, [MarshalAs(UnmanagedType.LPWStr)] out string ppszName); + [PreserveSig] int GetAttributes(); // not fully defined + [PreserveSig] int Compare(); // not fully defined + } + + [ComImport, Guid("b63ea76d-1f85-456f-a19c-48159efa858b"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IShellItemArray + { + [PreserveSig] int BindToHandler(); // not fully defined + [PreserveSig] int GetPropertyStore(); // not fully defined + [PreserveSig] int GetPropertyDescriptionList(); // not fully defined + [PreserveSig] int GetAttributes(); // not fully defined + [PreserveSig] int GetCount(out int pdwNumItems); + [PreserveSig] int GetItemAt(int dwIndex, out IShellItem ppsi); + [PreserveSig] int EnumItems(); // not fully defined + } + + private enum SIGDN : uint + { + SIGDN_DESKTOPABSOLUTEEDITING = 0x8004c000, + SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000, + SIGDN_FILESYSPATH = 0x80058000, + SIGDN_NORMALDISPLAY = 0, + SIGDN_PARENTRELATIVE = 0x80080001, + SIGDN_PARENTRELATIVEEDITING = 0x80031001, + SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8007c001, + SIGDN_PARENTRELATIVEPARSING = 0x80018001, + SIGDN_URL = 0x80068000 + } + + [Flags] + private enum FOS + { + FOS_OVERWRITEPROMPT = 0x2, + FOS_STRICTFILETYPES = 0x4, + FOS_NOCHANGEDIR = 0x8, + FOS_PICKFOLDERS = 0x20, + FOS_FORCEFILESYSTEM = 0x40, + FOS_ALLNONSTORAGEITEMS = 0x80, + FOS_NOVALIDATE = 0x100, + FOS_ALLOWMULTISELECT = 0x200, + FOS_PATHMUSTEXIST = 0x800, + FOS_FILEMUSTEXIST = 0x1000, + FOS_CREATEPROMPT = 0x2000, + FOS_SHAREAWARE = 0x4000, + FOS_NOREADONLYRETURN = 0x8000, + FOS_NOTESTFILECREATE = 0x10000, + FOS_HIDEMRUPLACES = 0x20000, + FOS_HIDEPINNEDPLACES = 0x40000, + FOS_NODEREFERENCELINKS = 0x100000, + FOS_OKBUTTONNEEDSINTERACTION = 0x200000, + FOS_DONTADDTORECENT = 0x2000000, + FOS_FORCESHOWHIDDEN = 0x10000000, + FOS_DEFAULTNOMINIMODE = 0x20000000, + FOS_FORCEPREVIEWPANEON = 0x40000000, + FOS_SUPPORTSTREAMABLEITEMS = unchecked((int)0x80000000) + } + } +} diff --git a/ABStudio/PVRTexLib.dll b/ABStudio/PVRTexLib.dll new file mode 100644 index 0000000..85da655 Binary files /dev/null and b/ABStudio/PVRTexLib.dll differ diff --git a/ABStudio/Program.cs b/ABStudio/Program.cs new file mode 100644 index 0000000..6a5a64e --- /dev/null +++ b/ABStudio/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ABStudio +{ + static class Program + { + /// + /// Point d'entrée principal de l'application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Forms.Main()); + } + } +} diff --git a/ABStudio/Properties/AssemblyInfo.cs b/ABStudio/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0aa78fa --- /dev/null +++ b/ABStudio/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Les informations générales relatives à un assembly dépendent de +// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations +// associées à un assembly. +[assembly: AssemblyTitle("ABStudio")] +[assembly: AssemblyDescription("A general purpose Angry Birds modding tool")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ABStudio")] +[assembly: AssemblyCopyright("Copyright © 2023 RSM")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly +// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de +// COM, affectez la valeur true à l'attribut ComVisible sur ce type. +[assembly: ComVisible(false)] + +// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM +[assembly: Guid("30adf767-664c-47c5-89c6-60cdc84051b9")] + +// Les informations de version pour un assembly se composent des quatre valeurs suivantes : +// +// Version principale +// Version secondaire +// Numéro de build +// Révision +// +// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut +// en utilisant '*', comme indiqué ci-dessous : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ABStudio/Properties/Resources.Designer.cs b/ABStudio/Properties/Resources.Designer.cs new file mode 100644 index 0000000..c9b3c50 --- /dev/null +++ b/ABStudio/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// Ce code a été généré par un outil. +// Version du runtime :4.0.30319.42000 +// +// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si +// le code est régénéré. +// +//------------------------------------------------------------------------------ + + +namespace ABStudio.Properties +{ + /// + /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. + /// + // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder + // à l'aide d'un outil, tel que ResGen ou Visual Studio. + // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen + // avec l'option /str ou régénérez votre projet VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ABStudio.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Remplace la propriété CurrentUICulture du thread actuel pour toutes + /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/ABStudio/Properties/Resources.resx b/ABStudio/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/ABStudio/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ABStudio/Properties/Settings.Designer.cs b/ABStudio/Properties/Settings.Designer.cs new file mode 100644 index 0000000..9d62b1d --- /dev/null +++ b/ABStudio/Properties/Settings.Designer.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +namespace ABStudio.Properties +{ + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/ABStudio/Properties/Settings.settings b/ABStudio/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/ABStudio/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ABStudio/icon.ico b/ABStudio/icon.ico new file mode 100644 index 0000000..8c6ad6d Binary files /dev/null and b/ABStudio/icon.ico differ diff --git a/ABStudio/packages.config b/ABStudio/packages.config new file mode 100644 index 0000000..f8260c1 --- /dev/null +++ b/ABStudio/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..82acda0 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# AB Studio +A general purpose Angry Birds modding tool + +## What is this? +AB Studio is a WIP tool that aims to be able to edit every single file format used in [Angry Birds](https://wikipedia.org/wiki/Angry_Birds) games. + +For now, it only edits [AB Classic](https://en.wikipedia.org/wiki/Angry_Birds_(video_game)) spritesheets (in both DAT and SHEET.JSON formats). +Hence why windows say "AB Classic Studio" for now. + +But hopefully, it'll one day support: +* Composprites +* Fonts +* Localization files +* More? + +## Building + +In order to build AB Studio, follow the following steps: +* Open the ``ABStudio.sln`` file in [Visual Studio](https://visualstudio.microsoft.com/) (both 2019 and 2022 were tested to work). +* Depending of your usage, either run the tool in debug mode using the play icon the top, or change the building mode from ``Debug`` to ``Release`` in the combo box at the left side of the play button, and open the ``Generate`` toolbox (from the toolbar on the top) and click on ``Generate solution``. +* You will find your built executable in the ``bin`` folder in the project's directory, in the folder that corresponds to your building mode. + +## Code organization + +The tool is split in various editors that can be opened at any time using an input file. + +All editors are independent and can be opened in as many instances as you wish. + +## Contributing + +Feel free to fork the repo and write editors for file formats that aren't supported yet, or to make fixes to existing ones. + +Then, send a pull request. If your changes are of good quality, I'll merge them into the repo. + +However, please be careful to keep the code's organization clean. There's no point in writing new things if it takes twice the amount of time to clean it up afterwards. + +## Licensing +Check the [LICENSE](https://github.com/giroletm/ABStudio/blob/main/LICENSE) file. +