Added Unreal Engine plugin and editor for Windows Forms

This commit is contained in:
Michael Becker 2014-07-08 15:21:03 -04:00
parent 939736e0c2
commit fc6f525631
24 changed files with 2782 additions and 234 deletions

View File

@ -0,0 +1,529 @@
namespace UniversalEditor.Editors.UnrealEngine
{
partial class UnrealPackageEditor
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tv = new System.Windows.Forms.TreeView();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.pnlExportTable = new System.Windows.Forms.Panel();
this.button5 = new System.Windows.Forms.Button();
this.button6 = new System.Windows.Forms.Button();
this.button7 = new System.Windows.Forms.Button();
this.button8 = new System.Windows.Forms.Button();
this.lvExportTable = new System.Windows.Forms.ListView();
this.chExportObjectName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chExportObjectParent = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chExportObjectClass = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chExportObjectFlags = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chExportObjectOffset = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chExportObjectSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.pnlHeritageTable = new System.Windows.Forms.Panel();
this.button9 = new System.Windows.Forms.Button();
this.button10 = new System.Windows.Forms.Button();
this.button11 = new System.Windows.Forms.Button();
this.button12 = new System.Windows.Forms.Button();
this.lvHeritageTable = new System.Windows.Forms.ListView();
this.chHeritageGUID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.pnlImportTable = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.lvImportTable = new System.Windows.Forms.ListView();
this.chImportPackageName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chImportObjectName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chImportClassName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.pnlNameTable = new System.Windows.Forms.Panel();
this.cmdNameClear = new System.Windows.Forms.Button();
this.cmdNameRemove = new System.Windows.Forms.Button();
this.cmdNameModify = new System.Windows.Forms.Button();
this.cmdNameAdd = new System.Windows.Forms.Button();
this.lvNameTable = new System.Windows.Forms.ListView();
this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chFlags = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.pnlExportTable.SuspendLayout();
this.pnlHeritageTable.SuspendLayout();
this.pnlImportTable.SuspendLayout();
this.pnlNameTable.SuspendLayout();
this.SuspendLayout();
//
// tv
//
this.tv.Dock = System.Windows.Forms.DockStyle.Fill;
this.tv.HideSelection = false;
this.tv.Location = new System.Drawing.Point(0, 0);
this.tv.Name = "tv";
this.tv.Size = new System.Drawing.Size(170, 267);
this.tv.TabIndex = 0;
this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect);
this.tv.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDown);
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.tv);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.pnlExportTable);
this.splitContainer1.Panel2.Controls.Add(this.pnlHeritageTable);
this.splitContainer1.Panel2.Controls.Add(this.pnlImportTable);
this.splitContainer1.Panel2.Controls.Add(this.pnlNameTable);
this.splitContainer1.Size = new System.Drawing.Size(558, 267);
this.splitContainer1.SplitterDistance = 170;
this.splitContainer1.TabIndex = 1;
//
// pnlExportTable
//
this.pnlExportTable.Controls.Add(this.button5);
this.pnlExportTable.Controls.Add(this.button6);
this.pnlExportTable.Controls.Add(this.button7);
this.pnlExportTable.Controls.Add(this.button8);
this.pnlExportTable.Controls.Add(this.lvExportTable);
this.pnlExportTable.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlExportTable.Enabled = false;
this.pnlExportTable.Location = new System.Drawing.Point(0, 0);
this.pnlExportTable.Name = "pnlExportTable";
this.pnlExportTable.Size = new System.Drawing.Size(384, 267);
this.pnlExportTable.TabIndex = 2;
this.pnlExportTable.Visible = false;
//
// button5
//
this.button5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.button5.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button5.Location = new System.Drawing.Point(306, 3);
this.button5.Name = "button5";
this.button5.Size = new System.Drawing.Size(75, 23);
this.button5.TabIndex = 1;
this.button5.Text = "&Clear";
this.button5.UseVisualStyleBackColor = true;
//
// button6
//
this.button6.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button6.Location = new System.Drawing.Point(165, 3);
this.button6.Name = "button6";
this.button6.Size = new System.Drawing.Size(75, 23);
this.button6.TabIndex = 1;
this.button6.Text = "&Remove...";
this.button6.UseVisualStyleBackColor = true;
//
// button7
//
this.button7.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button7.Location = new System.Drawing.Point(84, 3);
this.button7.Name = "button7";
this.button7.Size = new System.Drawing.Size(75, 23);
this.button7.TabIndex = 1;
this.button7.Text = "&Modify...";
this.button7.UseVisualStyleBackColor = true;
//
// button8
//
this.button8.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button8.Location = new System.Drawing.Point(3, 3);
this.button8.Name = "button8";
this.button8.Size = new System.Drawing.Size(75, 23);
this.button8.TabIndex = 1;
this.button8.Text = "&Add...";
this.button8.UseVisualStyleBackColor = true;
//
// lvExportTable
//
this.lvExportTable.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.lvExportTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.chExportObjectName,
this.chExportObjectParent,
this.chExportObjectClass,
this.chExportObjectFlags,
this.chExportObjectOffset,
this.chExportObjectSize});
this.lvExportTable.FullRowSelect = true;
this.lvExportTable.GridLines = true;
this.lvExportTable.HideSelection = false;
this.lvExportTable.Location = new System.Drawing.Point(3, 32);
this.lvExportTable.Name = "lvExportTable";
this.lvExportTable.Size = new System.Drawing.Size(378, 232);
this.lvExportTable.TabIndex = 0;
this.lvExportTable.UseCompatibleStateImageBehavior = false;
this.lvExportTable.View = System.Windows.Forms.View.Details;
this.lvExportTable.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.lvExportTable_ItemDrag);
//
// chExportObjectName
//
this.chExportObjectName.Text = "Object";
this.chExportObjectName.Width = 84;
//
// chExportObjectParent
//
this.chExportObjectParent.Text = "Parent";
this.chExportObjectParent.Width = 53;
//
// chExportObjectClass
//
this.chExportObjectClass.Text = "Class";
this.chExportObjectClass.Width = 81;
//
// chExportObjectFlags
//
this.chExportObjectFlags.Text = "Flags";
this.chExportObjectFlags.Width = 49;
//
// chExportObjectOffset
//
this.chExportObjectOffset.Text = "Offset";
this.chExportObjectOffset.Width = 45;
//
// chExportObjectSize
//
this.chExportObjectSize.Text = "Size";
//
// pnlHeritageTable
//
this.pnlHeritageTable.Controls.Add(this.button9);
this.pnlHeritageTable.Controls.Add(this.button10);
this.pnlHeritageTable.Controls.Add(this.button11);
this.pnlHeritageTable.Controls.Add(this.button12);
this.pnlHeritageTable.Controls.Add(this.lvHeritageTable);
this.pnlHeritageTable.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlHeritageTable.Enabled = false;
this.pnlHeritageTable.Location = new System.Drawing.Point(0, 0);
this.pnlHeritageTable.Name = "pnlHeritageTable";
this.pnlHeritageTable.Size = new System.Drawing.Size(384, 267);
this.pnlHeritageTable.TabIndex = 3;
this.pnlHeritageTable.Visible = false;
//
// button9
//
this.button9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.button9.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button9.Location = new System.Drawing.Point(306, 3);
this.button9.Name = "button9";
this.button9.Size = new System.Drawing.Size(75, 23);
this.button9.TabIndex = 1;
this.button9.Text = "&Clear";
this.button9.UseVisualStyleBackColor = true;
//
// button10
//
this.button10.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button10.Location = new System.Drawing.Point(165, 3);
this.button10.Name = "button10";
this.button10.Size = new System.Drawing.Size(75, 23);
this.button10.TabIndex = 1;
this.button10.Text = "&Remove...";
this.button10.UseVisualStyleBackColor = true;
//
// button11
//
this.button11.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button11.Location = new System.Drawing.Point(84, 3);
this.button11.Name = "button11";
this.button11.Size = new System.Drawing.Size(75, 23);
this.button11.TabIndex = 1;
this.button11.Text = "&Modify...";
this.button11.UseVisualStyleBackColor = true;
//
// button12
//
this.button12.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button12.Location = new System.Drawing.Point(3, 3);
this.button12.Name = "button12";
this.button12.Size = new System.Drawing.Size(75, 23);
this.button12.TabIndex = 1;
this.button12.Text = "&Add...";
this.button12.UseVisualStyleBackColor = true;
//
// lvHeritageTable
//
this.lvHeritageTable.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.lvHeritageTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.chHeritageGUID});
this.lvHeritageTable.FullRowSelect = true;
this.lvHeritageTable.GridLines = true;
this.lvHeritageTable.HideSelection = false;
this.lvHeritageTable.Location = new System.Drawing.Point(3, 32);
this.lvHeritageTable.Name = "lvHeritageTable";
this.lvHeritageTable.Size = new System.Drawing.Size(378, 232);
this.lvHeritageTable.TabIndex = 0;
this.lvHeritageTable.UseCompatibleStateImageBehavior = false;
this.lvHeritageTable.View = System.Windows.Forms.View.Details;
//
// chHeritageGUID
//
this.chHeritageGUID.Text = "GUID";
this.chHeritageGUID.Width = 354;
//
// pnlImportTable
//
this.pnlImportTable.Controls.Add(this.button1);
this.pnlImportTable.Controls.Add(this.button2);
this.pnlImportTable.Controls.Add(this.button3);
this.pnlImportTable.Controls.Add(this.button4);
this.pnlImportTable.Controls.Add(this.lvImportTable);
this.pnlImportTable.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlImportTable.Enabled = false;
this.pnlImportTable.Location = new System.Drawing.Point(0, 0);
this.pnlImportTable.Name = "pnlImportTable";
this.pnlImportTable.Size = new System.Drawing.Size(384, 267);
this.pnlImportTable.TabIndex = 1;
this.pnlImportTable.Visible = false;
//
// button1
//
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button1.Location = new System.Drawing.Point(306, 3);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 1;
this.button1.Text = "&Clear";
this.button1.UseVisualStyleBackColor = true;
//
// button2
//
this.button2.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button2.Location = new System.Drawing.Point(165, 3);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 1;
this.button2.Text = "&Remove...";
this.button2.UseVisualStyleBackColor = true;
//
// button3
//
this.button3.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button3.Location = new System.Drawing.Point(84, 3);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(75, 23);
this.button3.TabIndex = 1;
this.button3.Text = "&Modify...";
this.button3.UseVisualStyleBackColor = true;
//
// button4
//
this.button4.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.button4.Location = new System.Drawing.Point(3, 3);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(75, 23);
this.button4.TabIndex = 1;
this.button4.Text = "&Add...";
this.button4.UseVisualStyleBackColor = true;
//
// lvImportTable
//
this.lvImportTable.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.lvImportTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.chImportPackageName,
this.chImportObjectName,
this.chImportClassName});
this.lvImportTable.FullRowSelect = true;
this.lvImportTable.GridLines = true;
this.lvImportTable.HideSelection = false;
this.lvImportTable.Location = new System.Drawing.Point(3, 32);
this.lvImportTable.Name = "lvImportTable";
this.lvImportTable.Size = new System.Drawing.Size(378, 232);
this.lvImportTable.TabIndex = 0;
this.lvImportTable.UseCompatibleStateImageBehavior = false;
this.lvImportTable.View = System.Windows.Forms.View.Details;
//
// chImportPackageName
//
this.chImportPackageName.Text = "Package";
this.chImportPackageName.Width = 97;
//
// chImportObjectName
//
this.chImportObjectName.Text = "Object";
this.chImportObjectName.Width = 134;
//
// chImportClassName
//
this.chImportClassName.Text = "Class";
this.chImportClassName.Width = 140;
//
// pnlNameTable
//
this.pnlNameTable.Controls.Add(this.cmdNameClear);
this.pnlNameTable.Controls.Add(this.cmdNameRemove);
this.pnlNameTable.Controls.Add(this.cmdNameModify);
this.pnlNameTable.Controls.Add(this.cmdNameAdd);
this.pnlNameTable.Controls.Add(this.lvNameTable);
this.pnlNameTable.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlNameTable.Enabled = false;
this.pnlNameTable.Location = new System.Drawing.Point(0, 0);
this.pnlNameTable.Name = "pnlNameTable";
this.pnlNameTable.Size = new System.Drawing.Size(384, 267);
this.pnlNameTable.TabIndex = 0;
this.pnlNameTable.Visible = false;
//
// cmdNameClear
//
this.cmdNameClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cmdNameClear.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.cmdNameClear.Location = new System.Drawing.Point(306, 3);
this.cmdNameClear.Name = "cmdNameClear";
this.cmdNameClear.Size = new System.Drawing.Size(75, 23);
this.cmdNameClear.TabIndex = 1;
this.cmdNameClear.Text = "&Clear";
this.cmdNameClear.UseVisualStyleBackColor = true;
//
// cmdNameRemove
//
this.cmdNameRemove.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.cmdNameRemove.Location = new System.Drawing.Point(165, 3);
this.cmdNameRemove.Name = "cmdNameRemove";
this.cmdNameRemove.Size = new System.Drawing.Size(75, 23);
this.cmdNameRemove.TabIndex = 1;
this.cmdNameRemove.Text = "&Remove...";
this.cmdNameRemove.UseVisualStyleBackColor = true;
//
// cmdNameModify
//
this.cmdNameModify.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.cmdNameModify.Location = new System.Drawing.Point(84, 3);
this.cmdNameModify.Name = "cmdNameModify";
this.cmdNameModify.Size = new System.Drawing.Size(75, 23);
this.cmdNameModify.TabIndex = 1;
this.cmdNameModify.Text = "&Modify...";
this.cmdNameModify.UseVisualStyleBackColor = true;
//
// cmdNameAdd
//
this.cmdNameAdd.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.cmdNameAdd.Location = new System.Drawing.Point(3, 3);
this.cmdNameAdd.Name = "cmdNameAdd";
this.cmdNameAdd.Size = new System.Drawing.Size(75, 23);
this.cmdNameAdd.TabIndex = 1;
this.cmdNameAdd.Text = "&Add...";
this.cmdNameAdd.UseVisualStyleBackColor = true;
//
// lvNameTable
//
this.lvNameTable.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.lvNameTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.chName,
this.chFlags});
this.lvNameTable.FullRowSelect = true;
this.lvNameTable.GridLines = true;
this.lvNameTable.HideSelection = false;
this.lvNameTable.Location = new System.Drawing.Point(3, 32);
this.lvNameTable.Name = "lvNameTable";
this.lvNameTable.Size = new System.Drawing.Size(378, 232);
this.lvNameTable.TabIndex = 0;
this.lvNameTable.UseCompatibleStateImageBehavior = false;
this.lvNameTable.View = System.Windows.Forms.View.Details;
//
// chName
//
this.chName.Text = "Name";
this.chName.Width = 231;
//
// chFlags
//
this.chFlags.Text = "Flags";
this.chFlags.Width = 134;
//
// UnrealPackageEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.splitContainer1);
this.Name = "UnrealPackageEditor";
this.Size = new System.Drawing.Size(558, 267);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
this.splitContainer1.ResumeLayout(false);
this.pnlExportTable.ResumeLayout(false);
this.pnlHeritageTable.ResumeLayout(false);
this.pnlImportTable.ResumeLayout(false);
this.pnlNameTable.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TreeView tv;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Panel pnlNameTable;
private System.Windows.Forms.ListView lvNameTable;
private System.Windows.Forms.ColumnHeader chName;
private System.Windows.Forms.ColumnHeader chFlags;
private System.Windows.Forms.Button cmdNameClear;
private System.Windows.Forms.Button cmdNameRemove;
private System.Windows.Forms.Button cmdNameModify;
private System.Windows.Forms.Button cmdNameAdd;
private System.Windows.Forms.Panel pnlImportTable;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.ListView lvImportTable;
private System.Windows.Forms.ColumnHeader chImportPackageName;
private System.Windows.Forms.ColumnHeader chImportObjectName;
private System.Windows.Forms.ColumnHeader chImportClassName;
private System.Windows.Forms.Panel pnlExportTable;
private System.Windows.Forms.Button button5;
private System.Windows.Forms.Button button6;
private System.Windows.Forms.Button button7;
private System.Windows.Forms.Button button8;
private System.Windows.Forms.ListView lvExportTable;
private System.Windows.Forms.ColumnHeader chExportObjectParent;
private System.Windows.Forms.ColumnHeader chExportObjectClass;
private System.Windows.Forms.ColumnHeader chExportObjectName;
private System.Windows.Forms.ColumnHeader chExportObjectFlags;
private System.Windows.Forms.ColumnHeader chExportObjectOffset;
private System.Windows.Forms.ColumnHeader chExportObjectSize;
private System.Windows.Forms.Panel pnlHeritageTable;
private System.Windows.Forms.Button button9;
private System.Windows.Forms.Button button10;
private System.Windows.Forms.Button button11;
private System.Windows.Forms.Button button12;
private System.Windows.Forms.ListView lvHeritageTable;
private System.Windows.Forms.ColumnHeader chHeritageGUID;
}
}

View File

@ -0,0 +1,222 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using UniversalEditor.Accessors;
using UniversalEditor.ObjectModels.UnrealEngine;
using UniversalEditor.UserInterface.WindowsForms;
namespace UniversalEditor.Editors.UnrealEngine
{
public partial class UnrealPackageEditor : Editor
{
public UnrealPackageEditor()
{
InitializeComponent();
Font = SystemFonts.MenuFont;
base.SupportedObjectModels.Add(typeof(UnrealPackageObjectModel));
}
protected override void OnObjectModelChanged(EventArgs e)
{
base.OnObjectModelChanged(e);
tv.Nodes.Clear();
UnrealPackageObjectModel upk = (ObjectModel as UnrealPackageObjectModel);
if (upk == null) return;
TreeNode tnToplevel = new TreeNode();
if (upk.Accessor is FileAccessor) tnToplevel.Text = System.IO.Path.GetFileName((upk.Accessor as FileAccessor).FileName);
if (String.IsNullOrEmpty(tnToplevel.Text)) tnToplevel.Text = "<ROOT>";
#region Name Table
{
TreeNode tn = new TreeNode();
tn.Name = "nodeNameTable";
tn.Text = "Name Table";
tnToplevel.Nodes.Add(tn);
foreach (NameTableEntry entry in upk.NameTableEntries)
{
ListViewItem lvi = new ListViewItem();
lvi.Tag = entry;
lvi.Text = entry.Name;
lvi.SubItems.Add(entry.Flags.ToString());
lvNameTable.Items.Add(lvi);
}
lvNameTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
#endregion
#region Export Table
{
TreeNode tn = new TreeNode();
tn.Name = "nodeExportTable";
tn.Text = "Export Table";
tnToplevel.Nodes.Add(tn);
foreach (ExportTableEntry entry in upk.ExportTableEntries)
{
ListViewItem lvi = new ListViewItem();
lvi.Tag = entry;
if (entry.Name == null)
{
lvi.Text = String.Empty;
}
else
{
lvi.Text = entry.Name.ToString(false);
}
if (entry.ObjectParent == null)
{
lvi.SubItems.Add(String.Empty);
}
else
{
lvi.SubItems.Add(entry.ObjectParent.ToString());
}
if (entry.ObjectClass == null)
{
lvi.SubItems.Add(String.Empty);
}
else
{
lvi.SubItems.Add(entry.ObjectClass.ToString());
}
lvi.SubItems.Add(entry.Flags.ToString());
lvi.SubItems.Add(entry.Offset.ToString());
lvi.SubItems.Add(entry.Size.ToString());
lvExportTable.Items.Add(lvi);
}
lvExportTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
#endregion
#region Import Table
{
TreeNode tn = new TreeNode();
tn.Name = "nodeImportTable";
tn.Text = "Import Table";
tnToplevel.Nodes.Add(tn);
foreach (ImportTableEntry entry in upk.ImportTableEntries)
{
ListViewItem lvi = new ListViewItem();
lvi.Tag = entry;
if (entry.PackageName != null)
{
lvi.Text = entry.PackageName.ToString(false);
}
else
{
lvi.Text = "(invalid)";
}
if (entry.ObjectName != null)
{
lvi.SubItems.Add(entry.ObjectName.ToString(false));
}
else
{
lvi.SubItems.Add("(invalid)");
}
if (entry.ClassName != null)
{
lvi.SubItems.Add(entry.ClassName.ToString(false));
}
else
{
lvi.SubItems.Add("(invalid)");
}
lvImportTable.Items.Add(lvi);
}
lvImportTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
#endregion
#region Heritage Table
{
TreeNode tn = new TreeNode();
tn.Name = "nodeHeritageTable";
tn.Text = "Heritage Table";
tnToplevel.Nodes.Add(tn);
foreach (Guid guid in upk.PackageGUIDs)
{
ListViewItem lvi = new ListViewItem();
lvi.Tag = guid;
lvi.Text = guid.ToString("B");
lvHeritageTable.Items.Add(lvi);
}
lvHeritageTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
#endregion
tv.Nodes.Add(tnToplevel);
}
private void tv_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node == null) return;
if (e.Node.Name.StartsWith("node"))
{
string name = e.Node.Name.Substring(4);
SwitchPanel("pnl" + name);
}
}
private void SwitchPanel(Panel panel)
{
foreach (Control ctl in splitContainer1.Panel2.Controls)
{
if (ctl == panel)
{
ctl.Enabled = true;
ctl.Visible = true;
}
else
{
ctl.Visible = false;
ctl.Enabled = false;
}
}
}
private void SwitchPanel(string panelName)
{
foreach (Control ctl in splitContainer1.Panel2.Controls)
{
if (ctl is Panel && ctl.Name == panelName)
{
ctl.Enabled = true;
ctl.Visible = true;
}
else
{
ctl.Visible = false;
ctl.Enabled = false;
}
}
}
private void tv_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right) tv.SelectedNode = tv.HitTest(e.Location).Node;
}
private void lvExportTable_ItemDrag(object sender, ItemDragEventArgs e)
{
ListViewItem lvi = (e.Item as ListViewItem);
if (lvi == null) return;
ExportTableEntry ete = (lvi.Tag as ExportTableEntry);
if (ete == null) return;
string FileName = TemporaryFileManager.CreateTemporaryFile(ete.Name.Name, ete.GetData());
DataObject dobj = new DataObject("FileDrop", new string[] { FileName });
lvExportTable.DoDragDrop(dobj, DragDropEffects.Copy);
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("City of Orlando")]
[assembly: AssemblyProduct("UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms")]
[assembly: AssemblyCopyright("Copyright © City of Orlando 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("66c42923-4b27-4f1e-a5d0-82426f58071c")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,63 @@
using System;
internal static class TemporaryFileManager
{
private static Random rand = new Random();
private static System.Collections.Specialized.StringCollection mvarTemporaryFileNames = new System.Collections.Specialized.StringCollection();
private static string mvarTemporaryFilePath = null;
public static string CreateTemporaryFile(string FileName, byte[] FileData)
{
if (mvarTemporaryFilePath == null) throw new InvalidOperationException();
if (!System.IO.Directory.Exists(mvarTemporaryFilePath))
{
System.IO.Directory.CreateDirectory(mvarTemporaryFilePath);
}
FileName = System.IO.Path.GetFileName(FileName);
if (FileData == null) FileData = new byte[0];
string filePath = mvarTemporaryFilePath + System.IO.Path.DirectorySeparatorChar.ToString() + FileName;
System.IO.File.WriteAllBytes(filePath, FileData);
mvarTemporaryFileNames.Add(filePath);
return filePath;
}
public static bool RegisterTemporaryDirectory(string prefix, int maxNameLength)
{
if (mvarTemporaryFilePath != null)
{
return false;
}
string name = String.Empty;
do
{
name = prefix + rand.Next(0, (maxNameLength * 10) - 1).ToString().PadLeft(maxNameLength - prefix.Length, '0');
}
while (System.IO.Directory.Exists(name));
string pathName = System.IO.Path.GetTempPath() + System.IO.Path.DirectorySeparatorChar.ToString() + name;
System.IO.Directory.CreateDirectory(pathName);
mvarTemporaryFilePath = pathName;
return true;
}
public static bool UnregisterTemporaryDirectory()
{
if (mvarTemporaryFilePath == null) return false;
foreach (string fileName in mvarTemporaryFileNames)
{
if (System.IO.File.Exists(fileName))
{
System.IO.File.Delete(fileName);
}
}
if (System.IO.Directory.Exists(mvarTemporaryFilePath))
{
System.IO.Directory.Delete(mvarTemporaryFilePath, true);
}
return true;
}
}

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>UniversalEditor</RootNamespace>
<AssemblyName>UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\..\..\Output\Debug\Plugins\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\..\..\Output\Release\Plugins\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<Compile Include="Editors\UnrealEngine\UnrealPackageEditor.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Editors\UnrealEngine\UnrealPackageEditor.Designer.cs">
<DependentUpon>UnrealPackageEditor.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TemporaryFileManager.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\UniversalEditor.Core\UniversalEditor.Core.csproj">
<Project>{2d4737e6-6d95-408a-90db-8dff38147e85}</Project>
<Name>UniversalEditor.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\UniversalEditor.UserInterface.WindowsForms\UniversalEditor.UserInterface.WindowsForms.csproj">
<Project>{bcbb72bd-0ecb-4ff2-8d91-e466361fb6f9}</Project>
<Name>UniversalEditor.UserInterface.WindowsForms</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\UniversalEditor.UserInterface\UniversalEditor.UserInterface.csproj">
<Project>{8622ebc4-8e20-476e-b284-33d472081f5c}</Project>
<Name>UniversalEditor.UserInterface</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Plugins\UniversalEditor.Essential\UniversalEditor.Essential.csproj">
<Project>{30467e5c-05bc-4856-aadc-13906ef4cadd}</Project>
<Name>UniversalEditor.Essential</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Plugins\UniversalEditor.Plugins.UnrealEngine\UniversalEditor.Plugins.UnrealEngine.csproj">
<Project>{df96f24e-fed9-4bac-8389-63590125dc61}</Project>
<Name>UniversalEditor.Plugins.UnrealEngine</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Editors\UnrealEngine\UnrealPackageEditor.resx">
<DependentUpon>UnrealPackageEditor.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,185 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.Accessors;
using UniversalEditor.IO;
using UniversalEditor.ObjectModels.FileSystem;
using UniversalEditor.Plugins.UnrealEngine;
namespace UniversalEditor.DataFormats.UnrealEngine.Installer
{
public class UMODDataFormat : DataFormat
{
private static DataFormatReference _dfr = null;
public override DataFormatReference MakeReference()
{
if (_dfr == null)
{
_dfr = base.MakeReference();
_dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All);
_dfr.Filters.Add("Unreal Tournament UMOD installer", new byte?[][] { new byte?[] { 0xA3, 0xC5, 0xE3, 0x9F } }, new string[] { "*.umod" });
_dfr.Filters[0].MagicByteOffsets = new int[] { -20 };
_dfr.Sources.Add("http://wiki.beyondunreal.com/Legacy:UMOD/File_Format");
}
return _dfr;
}
protected override void LoadInternal(ref ObjectModel objectModel)
{
Reader br = base.Accessor.Reader;
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
// The UMOD file "header" is 20 bytes long. The header is stored in the last 20 bytes of
// the file (hence the quotes around the term "header").
br.Accessor.Seek(-20, SeekOrigin.End);
// Magic number. Used to verify this file as a UMOD installer. Always 0x9FE3C5A3.
uint magic = br.ReadUInt32();
if (magic != 0x9FE3C5A3) throw new InvalidDataFormatException("Footer does not begin with 0x9FE3C5A3");
// Byte offset of file directory in the UMOD file. (See below.)
uint fileDirectoryOffset = br.ReadUInt32();
// Total byte size of the UMOD file.
uint fileSize = br.ReadUInt32();
// UMOD file version.
uint formatVersion = br.ReadUInt32();
// CRC32 checksum over the file content.
uint checksum = br.ReadUInt32();
// The file directory describes the files stored in the first part of the UMOD file. Its
// byte offset in the UMOD file is given in the file "header" (see above).
br.Accessor.Seek(fileDirectoryOffset, SeekOrigin.Begin);
// The directory consists of an index-type file count (the index data type is described
// below), followed by variable-size records, each describing one file in the UMOD
// installer.
int fileCount = br.ReadINDEX();
for (int i = 0; i < fileCount; i++)
{
// Length of file name (including trailing null byte).
int fileNameLength = br.ReadINDEX();
// File name, with trailing null byte.
string fileName = br.ReadNullTerminatedString();
// Byte offset of file in UMOD file.
uint offset = br.ReadUInt32();
// Byte length of file.
uint length = br.ReadUInt32();
// Bit field describing file flags.
// Mychaeel: Feel free to investigate and contribute information about the file flags.
// (I know that they have to be set to 0x03 for Manifest.ini and Manifest.int to
// prevent those files from being copied to the user's System directory, and set to
// 0x00 for all other files.)
UMODFileFlags flags = (UMODFileFlags)br.ReadUInt32();
File file = new File();
file.Name = fileName;
file.Size = length;
file.Properties.Add("offset", offset);
file.Properties.Add("length", length);
fsom.Files.Add(file);
}
}
protected override void SaveInternal(ObjectModel objectModel)
{
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
Writer bw = null;
#region File data
MemoryAccessor msData = new MemoryAccessor();
bw = new Writer(msData);
foreach (File file in fsom.Files)
{
bw.WriteBytes(file.GetDataAsByteArray());
}
bw.Close();
byte[] data = msData.ToArray();
#endregion
#region File records
uint fileOffset = 0;
MemoryAccessor msDirectory = new MemoryAccessor();
bw = new Writer(msDirectory);
// The directory consists of an index-type file count (the index data type is described
// below), followed by variable-size records, each describing one file in the UMOD
// installer.
bw.WriteINDEX(fsom.Files.Count);
foreach (File file in fsom.Files)
{
// Length of file name (including trailing null byte).
bw.WriteINDEX(file.Name.Length);
// File name, with trailing null byte.
bw.WriteNullTerminatedString(file.Name);
// Byte offset of file in UMOD file.
bw.WriteUInt32(fileOffset);
// Byte length of file.
bw.WriteUInt32((uint)file.Size);
// Bit field describing file flags.
// Mychaeel: Feel free to investigate and contribute information about the file flags.
// (I know that they have to be set to 0x03 for Manifest.ini and Manifest.int to
// prevent those files from being copied to the user's System directory, and set to
// 0x00 for all other files.)
UMODFileFlags flags = UMODFileFlags.None;
bw.WriteUInt32((uint)flags);
fileOffset += (uint)file.Size;
}
bw.Close();
byte[] directoryData = msDirectory.ToArray();
#endregion
#region Header data
// The UMOD file "header" is 20 bytes long. The header is stored in the last 20 bytes of
// the file (hence the quotes around the term "header").
MemoryAccessor msHeader = new MemoryAccessor();
bw = new Writer(msHeader);
// Magic number. Used to verify this file as a UMOD installer. Always 0x9FE3C5A3.
bw.WriteUInt32((uint)0x9FE3C5A3);
// Byte offset of file directory in the UMOD file. (See below.)
uint fileDirectoryOffset = (uint)data.Length;
bw.WriteUInt32(fileDirectoryOffset);
// Total byte size of the UMOD file.
uint fileSize = 20;
bw.WriteUInt32(fileSize);
// UMOD file version.
uint formatVersion = 0;
bw.WriteUInt32(formatVersion);
// CRC32 checksum over the file content.
uint checksum = 0;
bw.WriteUInt32(checksum);
bw.Flush();
bw.Close();
byte[] headerData = msHeader.ToArray();
#endregion
bw = base.Accessor.Writer;
bw.WriteBytes(data);
bw.WriteBytes(directoryData);
bw.WriteBytes(headerData);
bw.Flush();
}
}
}

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.DataFormats.UnrealEngine.Installer
{
public enum UMODFileFlags
{
None = 0x00,
PreventCopyToSystem = 0x03
}
}

View File

@ -0,0 +1,427 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.IO;
using UniversalEditor.ObjectModels.UnrealEngine;
using UniversalEditor.Plugins.UnrealEngine;
namespace UniversalEditor.DataFormats.UnrealEngine.Package
{
public class UnrealPackageDataFormat : DataFormat
{
private static DataFormatReference _dfr = null;
public override DataFormatReference MakeReference()
{
if (_dfr == null)
{
_dfr = base.MakeReference();
_dfr.Capabilities.Add(typeof(UnrealPackageObjectModel), DataFormatCapabilities.All);
_dfr.Filters.Add("Unreal Engine package", new byte?[][] { new byte?[] { 0xC1, 0x83, 0x2A, 0x9E } }, new string[] { "*.u", "*.utx", "*.upk" });
_dfr.ExportOptions.Add(new CustomOptionText("PackageName", "Package &name:"));
_dfr.ExportOptions.Add(new CustomOptionNumber("PackageVersion", "Package &version:", 0, UInt16.MinValue, UInt16.MaxValue));
_dfr.Sources.Add("http://wiki.beyondunreal.com/Legacy:Package_File_Format");
}
return _dfr;
}
private ushort mvarPackageVersion = 0;
/// <summary>
/// Version of the file-format; Unreal1 uses mostly 61-63, UT 67-69; However, note that
/// quite a few packages are in use with UT that have Unreal1 versions.
/// </summary>
public ushort PackageVersion { get { return mvarPackageVersion; } set { mvarPackageVersion = value; } }
private string mvarPackageName = String.Empty;
public string PackageName { get { return mvarPackageName; } set { mvarPackageName = value; } }
protected override void LoadInternal(ref ObjectModel objectModel)
{
Reader br = base.Accessor.Reader;
UnrealPackageObjectModel upk = (objectModel as UnrealPackageObjectModel);
#region Header
// Always "0x9E2A83C1"; use this to verify that you indeed try to read an Unreal-Package
uint signature = br.ReadUInt32();
if (signature != 0x9E2A83C1) throw new InvalidDataFormatException("File does not begin with 0x9E2A83C1");
mvarPackageVersion = br.ReadUInt16();
upk.LicenseeNumber = br.ReadUInt16();
upk.PackageFlags = (PackageFlags)br.ReadUInt32(); // 1949392
if (mvarPackageVersion >= 512)
{
uint valueLength = br.ReadUInt32();
mvarPackageName = br.ReadFixedLengthString(valueLength);
mvarPackageName = mvarPackageName.TrimNull();
uint unknown1 = br.ReadUInt32();
uint unknown2 = br.ReadUInt32();
}
// Number of entries in name-table
uint nameTableEntryCount = br.ReadUInt32();
// Offset of name-table within the file
uint nameTableOffset = br.ReadUInt32();
// Number of entries in export-table
uint exportTableEntryCount = br.ReadUInt32();
// Offset of export-table within the file
uint exportTableOffset = br.ReadUInt32();
// Number of entries in import-table
uint importTableEntryCount = br.ReadUInt32();
// Offset of import-table within the file
uint importTableOffset = br.ReadUInt32();
// After the ImportOffset, the header differs between the versions. The only interesting
// fact, though, is that for fileformat versions => 68, a GUID has been introduced. It can
// be found right after the ImportOffset:
if (mvarPackageVersion < 68)
{
// number of values in the Heritage Table
uint heritageTableEntryCount = br.ReadUInt32();
// offset of the Heritage Table from the beginning of the file
uint heritageTableOffset = br.ReadUInt32();
long pos = br.Accessor.Position;
br.Accessor.Position = heritageTableOffset;
for (uint i = 0; i < heritageTableEntryCount; i++)
{
upk.PackageGUIDs.Add(br.ReadGuid());
}
br.Accessor.Position = pos;
}
else if (mvarPackageVersion >= 68)
{
upk.PackageGUIDs.Add(br.ReadGuid());
if (mvarPackageVersion < 512)
{
uint generationCount = br.ReadUInt32();
for (uint i = 0; i < generationCount; i++)
{
Generation generation = new Generation();
generation.ExportCount = br.ReadUInt32();
generation.NameCount = br.ReadUInt32();
upk.Generations.Add(generation);
}
}
}
#endregion
#region Name table
{
// The Unreal-Engine introduces two new variable-types. The first one is a rather simple
// string type, called NAME from now on. The second one is a bit more tricky, these
// CompactIndices, or INDEX later on, compresses ordinary DWORDs downto one to five BYTEs.
// The first and most simple one of the three tables is the name-table. The name-table can
// be considered an index of all unique names used for objects and references within the
// file. Later on, you'll often find indexes into this table instead of a string
// containing the object-name.
br.Accessor.Position = nameTableOffset;
for (uint i = 0; i < nameTableEntryCount; i++)
{
string name = br.ReadNAME(mvarPackageVersion);
if (mvarPackageVersion >= 512)
{
uint unknown = br.ReadUInt32();
}
NameTableEntryFlags flags = (NameTableEntryFlags)br.ReadInt32();
upk.NameTableEntries.Add(name, flags);
}
}
#endregion
#region Export table
{
// The export-table is an index for all objects within the package. Every object in
// the body of the file has a corresponding entry in this table, with information like
// offset within the file etc.
br.Accessor.Position = exportTableOffset;
for (uint i = 0; i < exportTableEntryCount; i++)
{
ExportTableEntry entry = new ExportTableEntry();
// Class of the object, i.e. "Texture" or "Palette" etc; stored as a
// ObjectReference
int classIndex = br.ReadINDEX();
if (classIndex != 0) entry.ObjectClass = new ObjectReference(classIndex, upk);
// Object Parent; again a ObjectReference
int objectParentIndex = br.ReadINDEX();
if (objectParentIndex != 0) entry.ObjectParent = new ObjectReference(objectParentIndex, upk);
// Internal package/group of the object, i.e. Floor for floor-textures;
// ObjectReference
int groupIndex = br.ReadInt32();
if (groupIndex != 0) entry.Group = new ObjectReference(groupIndex, upk);
// The name of the object; an index into the name-table
int objectNameIndex = br.ReadINDEX();
if (objectNameIndex >= 0 && objectNameIndex < upk.NameTableEntries.Count)
{
entry.Name = upk.NameTableEntries[objectNameIndex];
}
// Flags for the object; described in the appendix
entry.Flags = (ObjectFlags)br.ReadInt32();
// Total size of the object
entry.Size = br.ReadINDEX();
if (entry.Size != 0)
{
// Offset of the object; this field only exists if the SerialSize is larger 0
entry.Offset = br.ReadINDEX();
}
upk.ExportTableEntries.Add(entry);
}
}
#endregion
#region Import table
{
br.Accessor.Position = importTableOffset;
for (uint i = 0; i < importTableEntryCount; i++)
{
// The third table holds references to objects in external packages. For example, a
// texture might have a DetailTexture (which makes for the nice structure if have a
// very close look at a texture). Now, these DetailTextures are all stored in a
// single package (as they are used by many different textures in different package
// files). The property of the texture object only needs to store an index into the
// import-table then as the entry in the import-table already points to the
// DetailTexture in the other package.
ImportTableEntry entry = new ImportTableEntry();
int classPackageIndex = br.ReadINDEX();
if (classPackageIndex >= 0 && classPackageIndex < upk.NameTableEntries.Count)
{
entry.PackageName = upk.NameTableEntries[classPackageIndex];
}
int classNameIndex = br.ReadINDEX();
if (classNameIndex >= 0 && classNameIndex < upk.NameTableEntries.Count)
{
entry.ClassName = upk.NameTableEntries[classNameIndex];
}
int packageReference = br.ReadInt32();
entry.Package = new ObjectReference(packageReference, upk);
int objectNameIndex = br.ReadINDEX();
if (objectNameIndex >= 0 && objectNameIndex < upk.NameTableEntries.Count)
{
entry.ObjectName = upk.NameTableEntries[objectNameIndex];
}
upk.ImportTableEntries.Add(entry);
}
}
#endregion
}
protected override void SaveInternal(ObjectModel objectModel)
{
Writer bw = base.Accessor.Writer;
UnrealPackageObjectModel upk = (objectModel as UnrealPackageObjectModel);
#region Header
// Always "0x9E2A83C1"; use this to verify that you indeed try to read an Unreal-Package
bw.WriteUInt32((uint)0x9E2A83C1);
bw.WriteUInt16(mvarPackageVersion);
bw.WriteUInt16(upk.LicenseeNumber);
bw.WriteUInt32((uint)upk.PackageFlags); // 1949392
if (mvarPackageVersion >= 512)
{
bw.WriteUInt32((uint)mvarPackageName.Length);
bw.WriteFixedLengthString(mvarPackageName);
uint unknown1 = 0;
bw.WriteUInt32(unknown1);
uint unknown2 = 0;
bw.WriteUInt32(unknown2);
}
// Number of entries in name-table
bw.WriteUInt32((uint)upk.NameTableEntries.Count);
// Offset of name-table within the file
uint nameTableOffset = 0;
bw.WriteUInt32(nameTableOffset);
// Number of entries in export-table
bw.WriteUInt32((uint)upk.ExportTableEntries.Count);
// Offset of export-table within the file
uint exportTableOffset = 0;
bw.WriteUInt32(exportTableOffset);
// Number of entries in import-table
bw.WriteUInt32((uint)upk.ImportTableEntries.Count);
// Offset of import-table within the file
uint importTableOffset = 0;
bw.WriteUInt32(importTableOffset);
// After the ImportOffset, the header differs between the versions. The only interesting
// fact, though, is that for fileformat versions => 68, a GUID has been introduced. It can
// be found right after the ImportOffset:
if (mvarPackageVersion < 68)
{
// number of values in the Heritage Table
bw.WriteUInt32((uint)upk.PackageGUIDs.Count);
// offset of the Heritage Table from the beginning of the file
uint heritageTableOffset = 0;
bw.WriteUInt32(heritageTableOffset);
// TODO: navigate to the heritageTableOffset to write the data
for (uint i = 0; i < (uint)upk.PackageGUIDs.Count; i++)
{
bw.WriteGuid(upk.PackageGUIDs[(int)i]);
}
}
else if (mvarPackageVersion >= 68)
{
if (upk.PackageGUIDs.Count > 0)
{
bw.WriteGuid(upk.PackageGUIDs[0]);
}
else
{
Guid guid = Guid.NewGuid();
upk.PackageGUIDs.Add(guid);
bw.WriteGuid(guid);
}
if (mvarPackageVersion < 512)
{
bw.WriteUInt32((uint)upk.Generations.Count);
for (uint i = 0; i < upk.Generations.Count; i++)
{
Generation generation = upk.Generations[(int)i];
bw.WriteUInt32(generation.ExportCount);
bw.WriteUInt32(generation.NameCount);
}
}
}
#endregion
#region Name table
{
// The Unreal-Engine introduces two new variable-types. The first one is a rather simple
// string type, called NAME from now on. The second one is a bit more tricky, these
// CompactIndices, or INDEX later on, compresses ordinary DWORDs downto one to five BYTEs.
// The first and most simple one of the three tables is the name-table. The name-table can
// be considered an index of all unique names used for objects and references within the
// file. Later on, you'll often find indexes into this table instead of a string
// containing the object-name.
// TODO: navigate to the name table offset
// br.BaseStream.Position = nameTableOffset;
for (uint i = 0; i < upk.NameTableEntries.Count; i++)
{
bw.WriteNAME(upk.NameTableEntries[(int)i].Name, mvarPackageVersion);
if (mvarPackageVersion >= 512)
{
uint unknown = 0;
bw.WriteUInt32(unknown);
}
bw.WriteInt32((int)upk.NameTableEntries[(int)i].Flags);
}
}
#endregion
#region Export table
{
// The export-table is an index for all objects within the package. Every object in
// the body of the file has a corresponding entry in this table, with information like
// offset within the file etc.
// br.BaseStream.Position = exportTableOffset;
// TODO: navigate to export table offset
for (uint i = 0; i < upk.ExportTableEntries.Count; i++)
{
ExportTableEntry entry = upk.ExportTableEntries[(int)i];
// Class of the object, i.e. "Texture" or "Palette" etc; stored as a
// ObjectReference
if (entry.ObjectClass != null)
{
bw.WriteINDEX(entry.ObjectClass.IndexValue);
}
else
{
bw.WriteINDEX(0);
}
// Object Parent; again a ObjectReference
if (entry.ObjectParent != null)
{
bw.WriteINDEX(entry.ObjectParent.IndexValue);
}
else
{
bw.WriteINDEX(0);
}
// Internal package/group of the object, i.e. Floor for floor-textures;
// ObjectReference
if (entry.Group != null)
{
bw.WriteInt32(entry.Group.IndexValue);
}
else
{
bw.WriteInt32((int)0);
}
// The name of the object; an index into the name-table
bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.Name));
// Flags for the object; described in the appendix
bw.WriteInt32((int)entry.Flags);
// Total size of the object
bw.WriteINDEX(entry.Size);
if (entry.Size != 0)
{
// Offset of the object; this field only exists if the SerialSize is larger 0
bw.WriteINDEX(entry.Offset);
}
}
}
#endregion
#region Import table
{
for (uint i = 0; i < upk.ImportTableEntries.Count; i++)
{
// The third table holds references to objects in external packages. For example, a
// texture might have a DetailTexture (which makes for the nice structure if have a
// very close look at a texture). Now, these DetailTextures are all stored in a
// single package (as they are used by many different textures in different package
// files). The property of the texture object only needs to store an index into the
// import-table then as the entry in the import-table already points to the
// DetailTexture in the other package.
ImportTableEntry entry = upk.ImportTableEntries[(int)i];
bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.PackageName));
bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.ClassName));
bw.WriteInt32(entry.Package.IndexValue);
bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.ObjectName));
}
}
#endregion
bw.Flush();
}
}
}

View File

@ -0,0 +1,129 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.IO;
namespace UniversalEditor.Plugins.UnrealEngine
{
public static class ExtensionMethods
{
/// <summary>
/// The Name type is a simple string type. The format does, although, differ between the
/// package versions.
/// </summary>
/// <param name="br"></param>
/// <returns></returns>
public static string ReadNAME(this Reader br, int packageVersion)
{
string value = String.Empty;
// Older package versions (<64, original Unreal engine) store the Name type as a
// zero-terminated ASCII string; "UT2k3", for example would be stored as:
// "U" "T" "2" "k" "3" 0x00
if (packageVersion < 64)
{
value = br.ReadNullTerminatedString();
}
else if (packageVersion >= 512)
{
uint length = br.ReadUInt32();
value = br.ReadNullTerminatedString();
}
else
{
// Newer packages (>=64, UT engine) prepend the length of the string plus the trailing
// zero. Again, "UT2k3" would be now stored as: 0x06 "U" "T" "2" "k" "3" 0x00
value = br.ReadLengthPrefixedString();
if (value.EndsWith("\0"))
{
value = value.TrimNull();
}
else
{
// do we need this sanity check?
throw new InvalidOperationException();
}
}
return value;
}
public static void WriteNAME(this Writer bw, string value, int packageVersion)
{
// Older package versions (<64, original Unreal engine) store the Name type as a
// zero-terminated ASCII string; "UT2k3", for example would be stored as:
// "U" "T" "2" "k" "3" 0x00
if (packageVersion < 64)
{
bw.WriteNullTerminatedString(value);
}
else
{
// Newer packages (>=64, UT engine) prepend the length of the string plus the trailing
// zero. Again, "UT2k3" would be now stored as: 0x06 "U" "T" "2" "k" "3" 0x00
bw.WriteLengthPrefixedString(value);
bw.WriteInt32((byte)0);
}
}
/// <summary>
/// Reads a compact integer from the FileReader. Bytes read differs, so do not make
/// assumptions about physical data being read from the stream. (If you have to, get the
/// difference of FileReader.BaseStream.Position before and after this is executed.)
/// </summary>
/// <returns>An "uncompacted" signed integer.</returns>
/// <remarks>There may be better ways to implement this, but this is fast, and it works.</remarks>
public static int ReadINDEX(this Reader br)
{
int output = 0;
bool signed = false;
for (int i = 0; i < 5; i++)
{
byte x = br.ReadByte();
// First byte
if (i == 0)
{
// Bit: X0000000
if ((x & 0x80) > 0)
{
signed = true;
}
// Bits: 00XXXXXX
output |= (x & 0x3F);
// Bit: 0X000000
if ((x & 0x40) == 0)
{
break;
}
}
// Last byte
else if (i == 4)
{
// Bits: 000XXXXX -- the 0 bits are ignored
// (hits the 32 bit boundary)
output |= (x & 0x1F) << (6 + (3 * 7));
}
// Middle bytes
else
{
// Bits: 0XXXXXXX
output |= (x & 0x7F) << (6 + ((i - 1) * 7));
// Bit: X0000000
if ((x & 0x80) == 0)
{
break;
}
}
}
// multiply by negative one here, since the first 6+ bits could be 0
if (signed)
{
output *= -1;
}
return (output);
}
public static void WriteINDEX(this Writer bw, int value)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
public class ExportTableEntry : ICloneable
{
public class ExportTableEntryCollection
: System.Collections.ObjectModel.Collection<ExportTableEntry>
{
}
public event UniversalEditor.ObjectModels.FileSystem.DataRequestEventHandler DataRequest;
protected virtual void OnDataRequest(UniversalEditor.ObjectModels.FileSystem.DataRequestEventArgs e)
{
if (DataRequest != null)
{
DataRequest(this, e);
}
}
public byte[] GetData()
{
UniversalEditor.ObjectModels.FileSystem.DataRequestEventArgs e = new FileSystem.DataRequestEventArgs();
OnDataRequest(e);
return e.Data;
}
private NameTableEntry mvarName = null;
public NameTableEntry Name { get { return mvarName; } set { mvarName = value; } }
private ObjectReference mvarObjectClass = null;
public ObjectReference ObjectClass { get { return mvarObjectClass; } set { mvarObjectClass = value; } }
private ObjectReference mvarObjectParent = null;
public ObjectReference ObjectParent { get { return mvarObjectParent; } set { mvarObjectParent = value; } }
private ObjectReference mvarGroup = null;
public ObjectReference Group { get { return mvarGroup; } set { mvarGroup = value; } }
private ObjectFlags mvarFlags = ObjectFlags.None;
public ObjectFlags Flags { get { return mvarFlags; } set { mvarFlags = value; } }
private int mvarSize = 0;
public int Size { get { return mvarSize; } set { mvarSize = value; } }
private int mvarOffset = 0;
public int Offset { get { return mvarOffset; } set { mvarOffset = value; } }
public object Clone()
{
ExportTableEntry clone = new ExportTableEntry();
return clone;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
if (mvarGroup != null)
{
sb.Append(mvarGroup.ToString());
sb.Append('.');
}
if (mvarName == null)
{
sb.Append("(invalid name)");
}
else
{
sb.Append(mvarName.ToString(false));
}
if (mvarObjectClass != null)
{
sb.Append(" (");
sb.Append(mvarObjectClass.ToString());
sb.Append(")");
}
if (mvarObjectParent != null)
{
sb.Append(" extends ");
sb.Append(mvarObjectParent.ToString());
}
sb.Append(" : ");
sb.Append(mvarFlags.ToString());
return sb.ToString();
}
}
}

View File

@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
public enum FunctionFlags
{
None = 0x00000000,
/// <summary>
/// Function is final (prebindable, non-overridable function).
/// </summary>
Final = 0x00000001,
/// <summary>
/// Function has been defined (not just declared). Not used in source code.
/// </summary>
Defined = 0x00000002,
/// <summary>
/// Function is an iterator.
/// </summary>
Iterator = 0x00000004,
/// <summary>
/// Function is a latent state function.
/// </summary>
Latent = 0x00000008,
/// <summary>
/// Unary operator is a prefix operator.
/// </summary>
PrefixOperator = 0x00000010,
/// <summary>
/// Function cannot be reentered.
/// </summary>
Singular = 0x00000020,
/// <summary>
/// Function is network-replicated. Not used in source code.
/// </summary>
NetworkReplicated = 0x00000040,
/// <summary>
/// Function should be sent reliably on the network. Not used in source code.
/// </summary>
NetworkReliable = 0x00000080,
/// <summary>
/// Function executed on the client side.
/// </summary>
Simulated = 0x00000100,
/// <summary>
/// Executable from command line.
/// </summary>
CommandLine = 0x00000200,
/// <summary>
/// Native function.
/// </summary>
Native = 0x00000400,
/// <summary>
/// Event function.
/// </summary>
Event = 0x00000800,
/// <summary>
/// Operator function.
/// </summary>
Operator = 0x00001000,
/// <summary>
/// Static function.
/// </summary>
Static = 0x00002000,
/// <summary>
/// Don't export intrinsic function to C++.
/// </summary>
DoNotExport = 0x00004000,
/// <summary>
/// Function doesn't modify this object.
/// </summary>
Constant = 0x00008000,
/// <summary>
/// Return value is purely dependent on parameters; no state dependencies or internal state changes.
/// </summary>
Invariant = 0x00010000
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
public class Generation
{
public class GenerationCollection
: System.Collections.ObjectModel.Collection<Generation>
{
}
private uint mvarExportCount = 0;
public uint ExportCount { get { return mvarExportCount; } set { mvarExportCount = value; } }
private uint mvarNameCount = 0;
public uint NameCount { get { return mvarNameCount; } set { mvarNameCount = value; } }
public override string ToString()
{
return mvarExportCount.ToString() + " exports, " + mvarNameCount.ToString() + " names";
}
}
}

View File

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
public class ImportTableEntry : ICloneable
{
public class ImportTableEntryCollection
: System.Collections.ObjectModel.Collection<ImportTableEntry>
{
}
public object Clone()
{
ImportTableEntry clone = new ImportTableEntry();
return clone;
}
private NameTableEntry mvarPackageName = null;
/// <summary>
/// Package file in which the class of the object is defined
/// </summary>
public NameTableEntry PackageName { get { return mvarPackageName; } set { mvarPackageName = value; } }
private NameTableEntry mvarClassName = null;
/// <summary>
/// Class of the object, i.e. "Texture", "Palette", "Package", etc.
/// </summary>
public NameTableEntry ClassName { get { return mvarClassName; } set { mvarClassName = value; } }
private ObjectReference mvarPackage = null;
/// <summary>
/// Reference where the object resides
/// </summary>
public ObjectReference Package { get { return mvarPackage; } set { mvarPackage = value; } }
private NameTableEntry mvarObjectName = null;
/// <summary>
/// The name of the object
/// </summary>
public NameTableEntry ObjectName { get { return mvarObjectName; } set { mvarObjectName = value; } }
public override string ToString()
{
StringBuilder sb = new StringBuilder();
if (mvarPackageName != null)
{
sb.Append(mvarPackageName.ToString(false));
sb.Append(".");
}
if (mvarObjectName == null)
{
sb.Append("(invalid name)");
}
else
{
sb.Append(mvarObjectName.ToString(false));
}
if (mvarClassName != null)
{
sb.Append(" (");
sb.Append(mvarClassName.ToString(false));
sb.Append(")");
}
return sb.ToString();
}
}
}

View File

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
[Flags()]
public enum NameTableEntryFlags
{
None = 0
}
public class NameTableEntry : ICloneable
{
public class NameTableEntryCollection
: System.Collections.ObjectModel.Collection<NameTableEntry>
{
public NameTableEntry Add(string name, NameTableEntryFlags flags = NameTableEntryFlags.None)
{
NameTableEntry entry = new NameTableEntry();
entry.Name = name;
entry.Flags = flags;
Add(entry);
return entry;
}
}
private string mvarName = String.Empty;
public string Name { get { return mvarName; } set { mvarName = value; } }
private NameTableEntryFlags mvarFlags = NameTableEntryFlags.None;
public NameTableEntryFlags Flags { get { return mvarFlags; } set { mvarFlags = value; } }
public object Clone()
{
NameTableEntry entry = new NameTableEntry();
entry.Name = (mvarName.Clone() as string);
entry.Flags = mvarFlags;
return entry;
}
public override string ToString()
{
return ToString(true);
}
public string ToString(bool includeFlags)
{
StringBuilder sb = new StringBuilder();
sb.Append(mvarName);
if (includeFlags)
{
sb.Append(" : ");
sb.Append(mvarFlags.ToString());
}
return sb.ToString();
}
}
}

View File

@ -0,0 +1,140 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
[Flags()]
public enum ObjectFlags : uint
{
None = 0,
/// <summary>
/// Object must be tracked in the editor by the Undo/Redo tracking system.
/// </summary>
Transactional = 0x00000001,
/// <summary>
/// Object is not reachable on the object graph.
/// </summary>
Unreachable = 0x00000002,
/// <summary>
/// Object may be imported by other package files.
/// </summary>
Public = 0x00000004,
/// <summary>
/// Temporary import tag in load/save.
/// </summary>
Importing = 0x00000008,
/// <summary>
/// Temporary export tag in load/save.
/// </summary>
Exporting = 0x00000010,
/// <summary>
/// The external data source corresponding to this object has been modified.
/// </summary>
SourceModified = 0x00000020,
/// <summary>
/// Check during garbage collection.
/// </summary>
GarbageCollect = 0x00000040,
/// <summary>
/// During load, indicates object needs loading.
/// </summary>
RequireLoad = 0x00000200,
/// <summary>
/// A hardcoded name which should be syntax-highlighted.
/// </summary>
HighlightedName = 0x00000400,
EliminateObject = 0x00000400,
RemappedName = 0x00000800,
/// <summary>
/// In a singular function.
/// </summary>
SingularFunction = 0x00000800,
/// <summary>
/// Suppressed log name.
/// </summary>
Suppressed = 0x00001000,
StateChanged = 0x00001000,
/// <summary>
/// Within an EndState call.
/// </summary>
EndState = 0x00002000,
/// <summary>
/// Do not save the object.
/// </summary>
Transient = 0x00004000,
/// <summary>
/// Data is being preloaded from the file.
/// </summary>
Preloading = 0x00008000,
/// <summary>
/// Must be loaded for game client.
/// </summary>
LoadForClient = 0x00010000,
/// <summary>
/// Must be loaded for game server.
/// </summary>
LoadForServer = 0x00020000,
/// <summary>
/// Must be loaded for editor.
/// </summary>
LoadForEditor = 0x00040000,
/// <summary>
/// Keep object around (don't garbage collect) for editor even if unreferenced.
/// </summary>
Standalone = 0x00080000,
/// <summary>
/// Don't load this object for the game client.
/// </summary>
NotForClient = 0x00100000,
/// <summary>
/// Don't load this object for the game server.
/// </summary>
NotForServer = 0x00200000,
/// <summary>
/// Don't load this object for the editor.
/// </summary>
NotForEdit = 0x00400000,
/// <summary>
/// Object Destroy has already been called
/// </summary>
Destroyed = 0x00800000,
/// <summary>
/// Object needs to be postloaded.
/// </summary>
RequirePostLoad = 0x01000000,
/// <summary>
/// This object has an execution stack allocated and is ready to execute UnrealScript code.
/// </summary>
HasStack = 0x02000000,
/// <summary>
/// Class or name is defined in C++ code and must be bound at load-time. (UClass only)
/// </summary>
Intrinsic = 0x04000000,
/// <summary>
/// Class or name is defined in C++ code and must be bound at load-time. (UClass only)
/// </summary>
Native = 0x04000000,
/// <summary>
/// Marked (for debugging)
/// </summary>
Marked = 0x08000000,
/// <summary>
/// ShutdownAfterError called.
/// </summary>
ErrorShutdown = 0x10000000,
/// <summary>
/// For debugging Serialize calls
/// </summary>
DebugPostLoad = 0x20000000,
/// <summary>
/// For debugging Serialize calls
/// </summary>
DebugSerialize = 0x40000000,
/// <summary>
/// For debugging Destroy calls
/// </summary>
DebugDestroy = 0x80000000
}
}

View File

@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
public class ObjectReference
{
private UnrealPackageObjectModel mvarParent = null;
public UnrealPackageObjectModel Parent { get { return mvarParent; } }
private int mvarIndexValue = 0;
public int IndexValue { get { return mvarIndexValue; } set { mvarIndexValue = value; } }
public static readonly ObjectReference Empty = new ObjectReference(0, null);
public ObjectReference(int indexValue = 0, UnrealPackageObjectModel parent = null)
{
mvarParent = parent;
mvarIndexValue = indexValue;
}
public object Value
{
get
{
if (mvarParent != null)
{
if (mvarIndexValue < 0)
{
// pointer to an entry of the ImportTable
int index = -mvarIndexValue - 1;
if (index >= 0 && index < mvarParent.ImportTableEntries.Count)
{
return mvarParent.ImportTableEntries[index].ToString();
}
}
else if (mvarIndexValue > 0)
{
// pointer to an entry in the ExportTable
int index = mvarIndexValue - 1;
if (index >= 0 && index < mvarParent.ExportTableEntries.Count)
{
return mvarParent.ExportTableEntries[index].ToString();
}
}
}
return null;
}
}
public override string ToString()
{
if (mvarIndexValue == 0) return "(null)";
if (mvarParent != null)
{
if (mvarIndexValue < 0)
{
// pointer to an entry of the ImportTable
int index = -mvarIndexValue - 1;
if (index >= 0 && index < mvarParent.ImportTableEntries.Count)
{
return mvarParent.ImportTableEntries[index].ToString();
}
return "(unknown: " + mvarIndexValue.ToString() + ")";
}
else if (mvarIndexValue > 0)
{
// pointer to an entry in the ExportTable
int index = mvarIndexValue - 1;
if (index >= 0 && index < mvarParent.ExportTableEntries.Count)
{
return mvarParent.ExportTableEntries[index].ToString();
}
return "(unknown: " + mvarIndexValue.ToString() + ")";
}
}
return "(unknown: " + mvarIndexValue.ToString() + ")";
}
}
}

View File

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
[Flags()]
public enum PackageFlags
{
None = 0,
/// <summary>
/// The package is allowed to be downloaded to clients freely.
/// </summary>
AllowDownload = 0x0001,
/// <summary>
/// All objects in the package are optional (i.e. skins, textures) and it's up to the client whether he wants
/// to download them or not. Not yet implemented; currently ignored.
/// </summary>
ClientOptional = 0x0002,
/// <summary>
/// This package is only needed on the server side, and the client shouldn't be informed of its presence. This
/// is used with packages like IpDrv so that it can be updated frequently on the server side without requiring
/// downloading stuff to the client.
/// </summary>
ServerSideOnly = 0x0004,
/// <summary>
/// Loaded from linker with broken import links
/// </summary>
BrokenLinks = 0x0008,
/// <summary>
/// Not trusted
/// </summary>
Untrusted = 0x0010,
/// <summary>
/// Client needs to download this package
/// </summary>
Required = 0x8000
}
}

View File

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
[Flags()]
public enum PropertyFlags
{
None = 0x00000000,
/// <summary>
/// Property is user-settable in the editor.
/// </summary>
Editable = 0x00000001,
/// <summary>
/// Actor's property always matches class's default actor property.
/// </summary>
Constant = 0x00000002,
/// <summary>
/// Variable is writable by the input system.
/// </summary>
InputWritable = 0x00000004,
/// <summary>
/// Object can be exported with actor.
/// </summary>
Exportable = 0x00000008,
/// <summary>
/// Optional parameter (if CPF_Param is set).
/// </summary>
OptionalParameter = 0x00000010,
/// <summary>
/// Property is relevant to network replication (not specified in source code)
/// </summary>
NetworkReplication = 0x00000020,
/// <summary>
/// Reference to a constant object.
/// </summary>
ConstantReference = 0x00000040,
/// <summary>
/// Function/When call parameter
/// </summary>
Parameter = 0x00000080,
/// <summary>
/// Value is copied out after function call.
/// </summary>
OutParameter = 0x00000100,
/// <summary>
/// Property is a short-circuitable evaluation function parm.
/// </summary>
SkipParameter = 0x00000200,
/// <summary>
/// Return value.
/// </summary>
ReturnParameter = 0x00000400,
/// <summary>
/// Coerce args into this function parameter
/// </summary>
CoerceParameter = 0x00000800,
/// <summary>
/// Property is native: C++ code is responsible for serializing it.
/// </summary>
Native = 0x00001000,
/// <summary>
/// Property is transient: shouldn't be saved, zero-filled at load time.
/// </summary>
Transient = 0x00002000,
/// <summary>
/// Property should be loaded/saved as permanent profile.
/// </summary>
Configuration = 0x00004000,
/// <summary>
/// Property should be loaded as localizable text
/// </summary>
Localized = 0x00008000,
/// <summary>
/// Property travels across levels/servers.
/// </summary>
Travel = 0x00010000,
/// <summary>
/// Property is uneditable in the editor
/// </summary>
PreventEdit = 0x00020000,
/// <summary>
/// Load config from base class, not subclass.
/// </summary>
GlobalConfiguration = 0x00040000,
/// <summary>
/// Object or dynamic array loaded on demand only.
/// </summary>
Demand = 0x00100000,
/// <summary>
/// Automatically create inner object
/// </summary>
AutoCreate = 0x00200000,
/// <summary>
/// Fields need construction/destruction (not specified in source code)
/// </summary>
ConstructionRequired = 0x00400000
}
}

View File

@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
public enum PropertyType
{
Byte = 1,
Integer = 2,
Boolean = 3,
Float = 4,
Object = 5,
Name = 6,
String = 7,
Class = 8,
Array = 9,
Struct = 10,
Vector = 11,
Rotator = 12,
Str = 13,
Map = 14,
FixedArray = 15
}
/*
* Property size values:
0 = 1 byte
1 = 2 bytes
2 = 4 bytes
3 = 12 bytes
4 = 16 bytes
5 = a byte follows with real size
6 = a word follows with real size
7 = an integer follows with real size
*
*
* Property value layout:
* 0x01 (ByteProperty) Value Format
0x02 (IntegerProperty) BYTE
0x03 (BooleanProperty) DWORD
0x04 (FloatProperty) DWORD
0x05 (ObjectProperty) INDEX
0x06 (NameProperty) INDEX
0x07 (StringProperty) Unknown
0x08 (ClassProperty)
0x09 (ArrayProperty) Unknown
0x0A (StructProperty)
0x0B (VectorProperty) Unknown
0x0C (RotatorProperty) Unknown
0x0D (StrProperty) INDEX length
ASCIIZ text
Unknown
Unknown
0x0E (MapProperty)
0x0F (FixedArrayProperty)
Comments
The real value is in bit 7 of
the info byte.
A 4-byte float.
Object Reference value.
See Object References.
Name Reference value.
Index in to the Name
Table.
See below for some known
classes.
See below for some known
structs.
Length field includes null
terminator.
*/
}

View File

@ -0,0 +1,95 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.UnrealEngine
{
public class UnrealPackageObjectModel : ObjectModel
{
private static ObjectModelReference _omr = null;
public override ObjectModelReference MakeReference()
{
if (_omr == null)
{
_omr = base.MakeReference();
_omr.Title = "Unreal Engine package";
_omr.Path = new string[] { "Game development", "Unreal Engine", "Package" };
}
return _omr;
}
private List<Guid> mvarPackageGUIDs = new List<Guid>();
/// <summary>
/// Unique identifiers used for package downloading from servers.
/// </summary>
public List<Guid> PackageGUIDs { get { return mvarPackageGUIDs; } set { mvarPackageGUIDs = value; } }
private ushort mvarLicenseeNumber = 0;
/// <summary>
/// This is the licensee number, different for each game.
/// </summary>
public ushort LicenseeNumber { get { return mvarLicenseeNumber; } set { mvarLicenseeNumber = value; } }
private PackageFlags mvarPackageFlags = PackageFlags.None;
/// <summary>
/// Global package flags; i.e., if a package may be downloaded from a game server, etc.
/// </summary>
public PackageFlags PackageFlags { get { return mvarPackageFlags; } set { mvarPackageFlags = value; } }
private NameTableEntry.NameTableEntryCollection mvarNameTableEntries = new NameTableEntry.NameTableEntryCollection();
/// <summary>
/// The name-table can be considered an index of all unique names used for objects and
/// references within the file. Later on, you'll often find indexes into this table instead of
/// a string containing the object-name.
/// </summary>
public NameTableEntry.NameTableEntryCollection NameTableEntries { get { return mvarNameTableEntries; } }
private ExportTableEntry.ExportTableEntryCollection mvarExportTableEntries = new ExportTableEntry.ExportTableEntryCollection();
/// <summary>
/// The export-table is an index for all objects within the package. Every object in the body
/// of the file has a corresponding entry in this table, with information like offset within
/// the file etc.
/// </summary>
public ExportTableEntry.ExportTableEntryCollection ExportTableEntries { get { return mvarExportTableEntries; } }
private ImportTableEntry.ImportTableEntryCollection mvarImportTableEntries = new ImportTableEntry.ImportTableEntryCollection();
public ImportTableEntry.ImportTableEntryCollection ImportTableEntries { get { return mvarImportTableEntries; } }
private Generation.GenerationCollection mvarGenerations = new Generation.GenerationCollection();
public Generation.GenerationCollection Generations { get { return mvarGenerations; } }
public override void Clear()
{
mvarLicenseeNumber = 0;
mvarPackageFlags = UnrealEngine.PackageFlags.None;
mvarPackageGUIDs.Clear();
mvarNameTableEntries.Clear();
mvarExportTableEntries.Clear();
mvarImportTableEntries.Clear();
}
public override void CopyTo(ObjectModel where)
{
UnrealPackageObjectModel clone = (where as UnrealPackageObjectModel);
clone.LicenseeNumber = mvarLicenseeNumber;
clone.PackageFlags = mvarPackageFlags;
foreach (Guid guid in mvarPackageGUIDs)
{
clone.PackageGUIDs.Add(guid);
}
foreach (NameTableEntry entry in mvarNameTableEntries)
{
clone.NameTableEntries.Add(entry.Clone() as NameTableEntry);
}
foreach (ExportTableEntry entry in mvarExportTableEntries)
{
clone.ExportTableEntries.Add(entry.Clone() as ExportTableEntry);
}
foreach (ImportTableEntry entry in mvarImportTableEntries)
{
clone.ImportTableEntries.Add(entry.Clone() as ImportTableEntry);
}
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Unreal Engine plugin for Universal Editor")]
[assembly: AssemblyDescription("Provides data formats to interact with Epic Games' Unreal game engine assets.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Mike Becker's Software")]
[assembly: AssemblyProduct("Universal Editor Plugin Pack")]
[assembly: AssemblyCopyright("Copyright ©2013 Mike Becker's Software")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("d54c55f4-4359-4af2-8f27-7908c7002f35")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{DF96F24E-FED9-4BAC-8389-63590125DC61}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>UniversalEditor</RootNamespace>
<AssemblyName>UniversalEditor.Plugins.UnrealEngine</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\Output\Debug\Plugins\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\Output\Release\Plugins\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="DataFormats\UnrealEngine\Installer\UMODDataFormat.cs" />
<Compile Include="DataFormats\UnrealEngine\Installer\UMODFileFlags.cs" />
<Compile Include="DataFormats\UnrealEngine\Package\UnrealPackageDataFormat.cs" />
<Compile Include="ExtensionMethods.cs" />
<Compile Include="ObjectModels\UnrealEngine\ExportTableEntry.cs" />
<Compile Include="ObjectModels\UnrealEngine\FunctionFlags.cs" />
<Compile Include="ObjectModels\UnrealEngine\Generation.cs" />
<Compile Include="ObjectModels\UnrealEngine\ImportTableEntry.cs" />
<Compile Include="ObjectModels\UnrealEngine\NameTableEntry.cs" />
<Compile Include="ObjectModels\UnrealEngine\ObjectFlags.cs" />
<Compile Include="ObjectModels\UnrealEngine\ObjectReference.cs" />
<Compile Include="ObjectModels\UnrealEngine\PackageFlags.cs" />
<Compile Include="ObjectModels\UnrealEngine\PropertyFlags.cs" />
<Compile Include="ObjectModels\UnrealEngine\PropertyType.cs" />
<Compile Include="ObjectModels\UnrealEngine\UnrealPackageObjectModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Libraries\UniversalEditor.Core\UniversalEditor.Core.csproj">
<Project>{2d4737e6-6d95-408a-90db-8dff38147e85}</Project>
<Name>UniversalEditor.Core</Name>
</ProjectReference>
<ProjectReference Include="..\UniversalEditor.Essential\UniversalEditor.Essential.csproj">
<Project>{30467e5c-05bc-4856-aadc-13906ef4cadd}</Project>
<Name>UniversalEditor.Essential</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -97,398 +97,176 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Mul
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanjigen", "..\..\Sanjigen\Sanjigen\Sanjigen.csproj", "{ED627DF7-3E78-4428-AB31-810BA1586E62}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.UnrealEngine", "Plugins\UniversalEditor.Plugins.UnrealEngine\UniversalEditor.Plugins.UnrealEngine.csproj", "{DF96F24E-FED9-4BAC-8389-63590125DC61}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms", "Environments\WindowsForms\Plugins\UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms\UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj", "{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|x86.ActiveCfg = Debug|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Any CPU.Build.0 = Release|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|x86.ActiveCfg = Release|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|x86.ActiveCfg = Debug|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Any CPU.Build.0 = Release|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|x86.ActiveCfg = Release|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|x86.ActiveCfg = Debug|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Any CPU.Build.0 = Release|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|x86.ActiveCfg = Release|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|x86.ActiveCfg = Debug|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Any CPU.Build.0 = Release|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|x86.ActiveCfg = Release|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|x86.ActiveCfg = Debug|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Any CPU.Build.0 = Release|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|x86.ActiveCfg = Release|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|x86.ActiveCfg = Debug|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Any CPU.Build.0 = Release|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|x86.ActiveCfg = Release|Any CPU
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Mixed Platforms.Build.0 = Debug|x86
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|x86.ActiveCfg = Debug|x86
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|x86.Build.0 = Debug|x86
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Any CPU.Build.0 = Release|Any CPU
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Mixed Platforms.ActiveCfg = Release|x86
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Mixed Platforms.Build.0 = Release|x86
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|x86.ActiveCfg = Release|x86
{617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|x86.Build.0 = Release|x86
{8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|x86.ActiveCfg = Debug|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Any CPU.Build.0 = Release|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8622EBC4-8E20-476E-B284-33D472081F5C}.Release|x86.ActiveCfg = Release|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|x86.ActiveCfg = Debug|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Any CPU.Build.0 = Release|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|x86.ActiveCfg = Release|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|x86.ActiveCfg = Debug|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Any CPU.Build.0 = Release|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|x86.ActiveCfg = Release|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Any CPU.Build.0 = Debug|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|x86.ActiveCfg = Debug|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Any CPU.ActiveCfg = Release|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Any CPU.Build.0 = Release|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|x86.ActiveCfg = Release|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Any CPU.Build.0 = Debug|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|x86.ActiveCfg = Debug|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Any CPU.ActiveCfg = Release|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Any CPU.Build.0 = Release|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|x86.ActiveCfg = Release|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|x86.ActiveCfg = Debug|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Any CPU.Build.0 = Release|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|x86.ActiveCfg = Release|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|x86.ActiveCfg = Debug|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Any CPU.Build.0 = Release|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|x86.ActiveCfg = Release|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|x86.ActiveCfg = Debug|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Any CPU.Build.0 = Release|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|x86.ActiveCfg = Release|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|x86.ActiveCfg = Debug|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Any CPU.Build.0 = Release|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|x86.ActiveCfg = Release|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|x86.ActiveCfg = Debug|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Any CPU.Build.0 = Release|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|x86.ActiveCfg = Release|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|x86.ActiveCfg = Debug|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Any CPU.Build.0 = Release|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|x86.ActiveCfg = Release|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Any CPU.Build.0 = Debug|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|x86.ActiveCfg = Debug|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Any CPU.ActiveCfg = Release|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Any CPU.Build.0 = Release|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|x86.ActiveCfg = Release|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|x86.ActiveCfg = Debug|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Any CPU.Build.0 = Release|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|x86.ActiveCfg = Release|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|x86.ActiveCfg = Debug|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Any CPU.Build.0 = Release|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|x86.ActiveCfg = Release|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|x86.ActiveCfg = Debug|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Any CPU.Build.0 = Release|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|x86.ActiveCfg = Release|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|x86.ActiveCfg = Debug|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Any CPU.Build.0 = Release|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|x86.ActiveCfg = Release|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|x86.ActiveCfg = Debug|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Any CPU.Build.0 = Release|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|x86.ActiveCfg = Release|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|x86.ActiveCfg = Debug|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Any CPU.Build.0 = Release|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|x86.ActiveCfg = Release|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Any CPU.Build.0 = Debug|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|x86.ActiveCfg = Debug|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Any CPU.ActiveCfg = Release|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Any CPU.Build.0 = Release|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|x86.ActiveCfg = Release|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|x86.ActiveCfg = Debug|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Any CPU.Build.0 = Release|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|x86.ActiveCfg = Release|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|x86.ActiveCfg = Debug|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Any CPU.Build.0 = Release|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|x86.ActiveCfg = Release|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|x86.ActiveCfg = Debug|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Any CPU.Build.0 = Release|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|x86.ActiveCfg = Release|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|x86.ActiveCfg = Debug|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Any CPU.Build.0 = Release|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|x86.ActiveCfg = Release|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|x86.ActiveCfg = Debug|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Any CPU.Build.0 = Release|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|x86.ActiveCfg = Release|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|x86.ActiveCfg = Debug|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Any CPU.Build.0 = Release|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|x86.ActiveCfg = Release|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|x86.ActiveCfg = Debug|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Any CPU.Build.0 = Release|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|x86.ActiveCfg = Release|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|x86.ActiveCfg = Debug|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Any CPU.Build.0 = Release|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|x86.ActiveCfg = Release|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|x86.ActiveCfg = Debug|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Any CPU.Build.0 = Release|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|x86.ActiveCfg = Release|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|x86.ActiveCfg = Debug|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Any CPU.Build.0 = Release|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|x86.ActiveCfg = Release|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|x86.ActiveCfg = Debug|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Any CPU.Build.0 = Release|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|x86.ActiveCfg = Release|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|x86.ActiveCfg = Debug|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Any CPU.Build.0 = Release|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|x86.ActiveCfg = Release|Any CPU
{DF96F24E-FED9-4BAC-8389-63590125DC61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF96F24E-FED9-4BAC-8389-63590125DC61}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF96F24E-FED9-4BAC-8389-63590125DC61}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF96F24E-FED9-4BAC-8389-63590125DC61}.Release|Any CPU.Build.0 = Release|Any CPU
{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -523,6 +301,7 @@ Global
{BED1EEAF-9ADD-46F6-92D0-53957858E25B} = {71CFF024-26F7-4626-A526-B435FDF8D64E}
{9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D} = {71CFF024-26F7-4626-A526-B435FDF8D64E}
{E6C9A73D-4556-4220-9BC7-302A7EE64C1A} = {71CFF024-26F7-4626-A526-B435FDF8D64E}
{DF96F24E-FED9-4BAC-8389-63590125DC61} = {71CFF024-26F7-4626-A526-B435FDF8D64E}
{FE016EA3-DC31-4A92-8B0A-8C746EC117E1} = {46041F27-7C1C-4209-B72B-251EDB5D4C61}
{ED627DF7-3E78-4428-AB31-810BA1586E62} = {46041F27-7C1C-4209-B72B-251EDB5D4C61}
{C1F34183-7A2F-41A6-9958-F6F329099654} = {A846CA33-9CAA-4237-B14F-8721DBA89442}
@ -536,6 +315,7 @@ Global
{4250B20B-2DC9-432F-B0C2-BD20B80B4970} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1}
{D8E59ADD-B591-49AF-B18E-6E0D4581700C} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1}
{9B5ABDC3-ADF7-42B7-ADE9-8DC715310492} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1}
{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1}
{118E40C4-323E-4B4B-8EF4-38EED6CC5E83} = {54990D5E-CE09-459F-916E-AF13101765B4}
EndGlobalSection
EndGlobal