├── .gitignore
├── Properties
├── Settings.settings
├── Settings.Designer.cs
├── AssemblyInfo.cs
├── Resources.Designer.cs
└── Resources.resx
├── FileFormats
├── MashedFile.cs
└── PIZ
│ ├── MagicNumbers.cs
│ ├── FileHeader.cs
│ ├── PIZFile.cs
│ └── FileSignature.cs
├── App.xaml
├── App.xaml.cs
├── .github
└── FUNDING.yml
├── MainWindow.xaml
├── MainWindow.xaml.cs
└── SciLors Mashed File Extractor.csproj
/.gitignore:
--------------------------------------------------------------------------------
1 | bin/**
2 | obj/**
--------------------------------------------------------------------------------
/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/FileFormats/MashedFile.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.IO;
6 |
7 | namespace SciLors_Mashed_File_Extractor.FileFormats {
8 | public class MashedFile {
9 |
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/App.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Windows;
7 |
8 | namespace SciLors_Mashed_File_Extractor {
9 | ///
10 | /// Interaction logic for App.xaml
11 | ///
12 | public partial class App : Application {
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: SciLor # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/FileFormats/PIZ/MagicNumbers.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ {
7 | public class MagicNumbers {
8 | public static readonly byte[] FILE_SIGNATURE = new byte[] { 0x50, 0x49, 0x5A }; //PIZ
9 | public static readonly byte[] FILE_SIGNATURE_APPENDIX = new byte[] { 0x00, 0x03, 0x00, 0x00, 0x00 };
10 |
11 | public const int FILE_SIGNATURE_APPENDIX2_LENGTH = 4;
12 |
13 | public const int OFFSET_FILE_COUNT = 0x08;
14 | public const int OFFSET_SECOND_FILE_SIGNATURE_APPENDIX = 0x0D; //0x00 or 0xCC
15 | public const int OFFSET_FILE_HEADER = 0x800;
16 | public const int OFFSET_FILE_HEADER_SIZE = 0x80;
17 |
18 | public const int OFFSET_FILE_HEADER_FILE_NAME_MAX_SIZE = 0x73;
19 | public const int OFFSET_FILE_HEADER_FILE_OFFSET = 0x74;
20 | public const int OFFSET_FILE_HEADER_FILE_SIZE = 0x78;
21 | public const int OFFSET_FILE_HEADER_FILE_UNKNOWN = 0x7C;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace SciLors_Mashed_File_Extractor.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // General Information about an assembly is controlled through the following
8 | // set of attributes. Change these attribute values to modify the information
9 | // associated with an assembly.
10 | [assembly: AssemblyTitle("SciLors Mashed File Extractor")]
11 | [assembly: AssemblyDescription("")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("")]
14 | [assembly: AssemblyProduct("SciLors Mashed File Extractor")]
15 | [assembly: AssemblyCopyright("Copyright © 2016")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Setting ComVisible to false makes the types in this assembly not visible
20 | // to COM components. If you need to access a type in this assembly from
21 | // COM, set the ComVisible attribute to true on that type.
22 | [assembly: ComVisible(false)]
23 |
24 | //In order to begin building localizable applications, set
25 | //CultureYouAreCodingWith in your .csproj file
26 | //inside a . For example, if you are using US english
27 | //in your source files, set the to en-US. Then uncomment
28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
29 | //the line below to match the UICulture setting in the project file.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
36 | //(used if a resource is not found in the page,
37 | // or application resource dictionaries)
38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
39 | //(used if a resource is not found in the page,
40 | // app, or any theme specific resource dictionaries)
41 | )]
42 |
43 |
44 | // Version information for an assembly consists of the following four values:
45 | //
46 | // Major Version
47 | // Minor Version
48 | // Build Number
49 | // Revision
50 | //
51 | // You can specify all the values or you can default the Build and Revision Numbers
52 | // by using the '*' as shown below:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.0.0.0")]
55 | [assembly: AssemblyFileVersion("1.0.0.0")]
56 |
--------------------------------------------------------------------------------
/FileFormats/PIZ/FileHeader.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ {
7 | public class FileHeader {
8 | public String fileName { get; set; }
9 | public int fileOffset { get; set; }
10 | public int fileSize { get; set; }
11 | public int fileUnknown { get; set; }
12 |
13 | public FileHeader(byte[] header) {
14 | if (header.Length != MagicNumbers.OFFSET_FILE_HEADER_SIZE)
15 | throw new IndexOutOfRangeException("File header must be " + MagicNumbers.OFFSET_FILE_HEADER_SIZE + "bytes long");
16 | fileName = extractFileName(header);
17 | fileOffset = extractFileOffset(header);
18 | fileSize = extractFileSize(header);
19 | fileUnknown = extractFileUnknown(header);
20 | }
21 | private String extractFileName(byte[] header) {
22 | StringBuilder fileNameBuilder = new StringBuilder();
23 | for (int i = 0; i < MagicNumbers.OFFSET_FILE_HEADER_FILE_NAME_MAX_SIZE; i++) {
24 | if (header[i] != 0x00) {
25 | fileNameBuilder.Append(Convert.ToChar(header[i]));
26 | } else {
27 | break;
28 | }
29 | }
30 | return fileNameBuilder.ToString();
31 | }
32 |
33 | private int extractFileOffset(byte[] header) {
34 | int offset = header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 0] << 0;
35 | offset += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 1] << 8;
36 | offset += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 2] << 16;
37 | offset += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 3] << 24;
38 | return offset;
39 | }
40 |
41 | private int extractFileSize(byte[] header) {
42 | int size = header[MagicNumbers.OFFSET_FILE_HEADER_FILE_SIZE + 0] << 0;
43 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_SIZE + 1] << 8;
44 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_SIZE + 2] << 16;
45 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 3] << 24;
46 | return size;
47 | }
48 |
49 | private int extractFileUnknown(byte[] header) {
50 | int size = header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 0] << 0;
51 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 1] << 8;
52 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 2] << 16;
53 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 3] << 24;
54 | return size;
55 | }
56 |
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/FileFormats/PIZ/PIZFile.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.IO;
6 |
7 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ {
8 | public class PIZFile : MashedFile {
9 | public string filePath { get; set; }
10 | public string fileName { get; set; }
11 | public FileSignature fileSignature { get; set; }
12 | public List files { get; set; }
13 | public PIZFile(string path) {
14 | filePath = path;
15 | fileName = Path.GetFileName(path);
16 |
17 | using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read)) {
18 | byte[] signatureBytes = new byte[FileSignature.Length];
19 |
20 | readBytesSafe(stream, signatureBytes);
21 | fileSignature = new FileSignature(signatureBytes);
22 |
23 | stream.Position = MagicNumbers.OFFSET_FILE_HEADER; //Jump to File Table
24 | byte[] headerBytes = new byte[MagicNumbers.OFFSET_FILE_HEADER_SIZE];
25 | files = new List();
26 | for (int i = 0; i 0) {
40 | n = stream.Read(target, bytesRead, bytesToRead);
41 | if (n == 0)
42 | throw new FileFormatException("File too small");
43 | bytesRead += n;
44 | bytesToRead -= n;
45 | }
46 | }
47 |
48 | public void extractFile(FileHeader fileHeader, string targetPath) {
49 | using (FileStream streamRead = new FileStream(filePath, FileMode.Open, FileAccess.Read)) {
50 | using (FileStream streamWrite = new FileStream(targetPath, FileMode.Create, FileAccess.Write)) {
51 | streamRead.Position = fileHeader.fileOffset;
52 | copyStream(streamRead, streamWrite, fileHeader.fileSize);
53 | }
54 | }
55 | }
56 | private void copyStream(Stream input, Stream output, int bytes) {
57 | byte[] buffer = new byte[32768];
58 | int read;
59 | while (bytes > 0 && (read = input.Read(buffer, 0, Math.Min(buffer.Length, bytes))) > 0) {
60 | output.Write(buffer, 0, read);
61 | bytes -= read;
62 | }
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace SciLors_Mashed_File_Extractor.Properties {
12 |
13 |
14 | ///
15 | /// A strongly-typed resource class, for looking up localized strings, etc.
16 | ///
17 | // This class was auto-generated by the StronglyTypedResourceBuilder
18 | // class via a tool like ResGen or Visual Studio.
19 | // To add or remove a member, edit your .ResX file then rerun ResGen
20 | // with the /str option, or rebuild your VS project.
21 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
22 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
23 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
24 | internal class Resources {
25 |
26 | private static global::System.Resources.ResourceManager resourceMan;
27 |
28 | private static global::System.Globalization.CultureInfo resourceCulture;
29 |
30 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
31 | internal Resources() {
32 | }
33 |
34 | ///
35 | /// Returns the cached ResourceManager instance used by this class.
36 | ///
37 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
38 | internal static global::System.Resources.ResourceManager ResourceManager {
39 | get {
40 | if ((resourceMan == null)) {
41 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SciLors_Mashed_File_Extractor.Properties.Resources", typeof(Resources).Assembly);
42 | resourceMan = temp;
43 | }
44 | return resourceMan;
45 | }
46 | }
47 |
48 | ///
49 | /// Overrides the current thread's CurrentUICulture property for all
50 | /// resource lookups using this strongly typed resource class.
51 | ///
52 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
53 | internal static global::System.Globalization.CultureInfo Culture {
54 | get {
55 | return resourceCulture;
56 | }
57 | set {
58 | resourceCulture = value;
59 | }
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/FileFormats/PIZ/FileSignature.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.IO;
6 |
7 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ {
8 | public class FileSignature {
9 | public static int Length { get {
10 | return MagicNumbers.OFFSET_SECOND_FILE_SIGNATURE_APPENDIX + MagicNumbers.FILE_SIGNATURE_APPENDIX2_LENGTH;
11 | }
12 | }
13 | public byte fileCount { get; set; }
14 | public Appendix2Enum appendix2 { get; set; }
15 |
16 | private byte[] signature;
17 |
18 | public enum Appendix2Enum {
19 | TYPE_4x00 = 0x00,
20 | TYPE_4xCC = 0xCC,
21 | NONE = 0xFF
22 | }
23 |
24 | public FileSignature(byte[] signature) {
25 | if (signature.Length != Length)
26 | throw new FileFormatException(String.Format("File header length is {0}, but it should be {1}bytes long", signature.Length, Length));
27 |
28 | this.signature = signature;
29 |
30 | int pos = 0;
31 | pos = checkSignature(pos);
32 | pos = checkSignatureAppendix(pos);
33 | extraxtUnknownInfo();
34 | checkAndExtractSecondAppendix();
35 |
36 | }
37 |
38 | private int checkSignature(int start) {
39 | int pos = start;
40 | for (int i = 0; i < MagicNumbers.FILE_SIGNATURE.Length; i++) {
41 | if (signature[i + start] != MagicNumbers.FILE_SIGNATURE[i])
42 | throw new FileFormatException(String.Format("File signature wrong"));
43 | pos = i;
44 | }
45 | return pos + 1;
46 | }
47 | private int checkSignatureAppendix(int start) {
48 | int pos = start;
49 | for (int i = 0; i < MagicNumbers.FILE_SIGNATURE_APPENDIX.Length; i++) {
50 | if (signature[i + start] != MagicNumbers.FILE_SIGNATURE_APPENDIX[i])
51 | throw new FileFormatException(String.Format("File signature appendix wrong"));
52 | pos = i;
53 | }
54 | return pos + 1;
55 | }
56 | private void extraxtUnknownInfo() {
57 | fileCount = signature[MagicNumbers.OFFSET_FILE_COUNT];
58 | }
59 | private void checkAndExtractSecondAppendix() {
60 | appendix2 = Appendix2Enum.NONE;
61 | int pos = MagicNumbers.OFFSET_SECOND_FILE_SIGNATURE_APPENDIX;
62 | IEnumerable secApps = Enum.GetValues(typeof(Appendix2Enum)).Cast();
63 | foreach (Appendix2Enum app in secApps) {
64 | if (signature[pos + 0] == (int)app && signature[pos + 0] == (int)app && signature[pos + 0] == (int)app && signature[pos + 0] == (int)app) {
65 | appendix2 = (Appendix2Enum)signature[pos];
66 | break;
67 | }
68 |
69 | if (app == Appendix2Enum.NONE)
70 | throw new FileFormatException(
71 | String.Format("File signature second appendix is unknown: #{0:X}{1:X}{2:X}{3:X}",
72 | signature[pos + 0], signature[pos + 1], signature[pos + 2], signature[pos + 3])
73 | );
74 | }
75 | }
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.IO;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 | using System.Windows.Data;
9 | using System.Windows.Documents;
10 | using System.Windows.Input;
11 | using System.Windows.Media;
12 | using System.Windows.Media.Imaging;
13 | using System.Windows.Navigation;
14 | using System.Windows.Shapes;
15 | using Microsoft.Win32;
16 | using SciLors_Mashed_File_Extractor.FileFormats.PIZ;
17 |
18 | namespace SciLors_Mashed_File_Extractor {
19 | ///
20 | /// Interaction logic for MainWindow.xaml
21 | ///
22 | public partial class MainWindow : Window {
23 | private List files = new List();
24 | public MainWindow() {
25 | InitializeComponent();
26 | }
27 |
28 | private void mniOpen_Click(object sender, RoutedEventArgs e) {
29 | OpenFileDialog openFileDialog = new OpenFileDialog();
30 | openFileDialog.Multiselect = true;
31 | openFileDialog.Filter = "PIZ files (*.piz)|*.piz";//|RWS files (*.RWS)|*.rws|";
32 | if (openFileDialog.ShowDialog() == true) {
33 | tvwContent.Items.Clear();
34 | foreach (string filePath in openFileDialog.FileNames) {
35 | PIZFile file = new PIZFile(filePath);
36 | TreeViewItem baseItem = new TreeViewItem();
37 | baseItem.Tag = file;
38 | baseItem.Header = file.fileName + " ["
39 | + String.Format("Appendix2=0x{0:X2}", (byte)file.fileSignature.appendix2)
40 | + "]";
41 |
42 | TreeViewItem baseInfoItem = new TreeViewItem();
43 | baseInfoItem.Header = "Files [" + file.files.Count + "]";
44 | foreach (FileHeader fileHeader in file.files) {
45 | TreeViewItem fileInfoItem = new TreeViewItem();
46 | fileInfoItem.Tag = fileHeader;
47 | fileInfoItem.Header = fileHeader.fileName;
48 | fileInfoItem.ItemsSource = new string[] {
49 | String.Format("Offset=0x{0:X8}", fileHeader.fileOffset),
50 | "Size=" + fileHeader.fileSize,
51 | String.Format("Unknown=0x{0:X8}", fileHeader.fileUnknown),
52 | };
53 | ContextMenu ctxFile = new ContextMenu();
54 | MenuItem extractMenu = new MenuItem();
55 | extractMenu.Header = "Extract File";
56 | extractMenu.Click += new RoutedEventHandler(tvwContext_ExtractFile);
57 |
58 | ctxFile.Items.Add(extractMenu);
59 | fileInfoItem.ContextMenu = ctxFile;
60 | baseInfoItem.Items.Add(fileInfoItem);
61 | }
62 |
63 | baseItem.Items.Add(baseInfoItem);
64 | tvwContent.Items.Add(baseItem);
65 | }
66 | }
67 |
68 | }
69 |
70 | private void tvwContext_ExtractFile(object sender, RoutedEventArgs e) {
71 | TreeViewItem parent = (TreeViewItem)((ContextMenu)((MenuItem)sender).Parent).PlacementTarget;
72 | PIZFile pizFile = (PIZFile)((TreeViewItem)((TreeViewItem)parent.Parent).Parent).Tag;
73 | FileHeader fileHeader = (FileHeader)parent.Tag;
74 | SaveFileDialog saveFileDialog = new SaveFileDialog();
75 | saveFileDialog.FileName = fileHeader.fileName;
76 | saveFileDialog.ShowDialog();
77 |
78 | pizFile.extractFile(fileHeader, saveFileDialog.FileName);
79 |
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/SciLors Mashed File Extractor.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | x86
6 | 8.0.30703
7 | 2.0
8 | {BB7F7B34-206C-4E05-B0DD-C720FE9480C5}
9 | WinExe
10 | Properties
11 | SciLors_Mashed_File_Extractor
12 | SciLors Mashed File Extractor
13 | v4.0
14 | Client
15 | 512
16 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
17 | 4
18 |
19 |
20 | x86
21 | true
22 | full
23 | false
24 | bin\Debug\
25 | DEBUG;TRACE
26 | prompt
27 | 4
28 |
29 |
30 | x86
31 | pdbonly
32 | true
33 | bin\Release\
34 | TRACE
35 | prompt
36 | 4
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | 4.0
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | MSBuild:Compile
56 | Designer
57 |
58 |
59 | MSBuild:Compile
60 | Designer
61 |
62 |
63 | App.xaml
64 | Code
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | MainWindow.xaml
73 | Code
74 |
75 |
76 |
77 |
78 | Code
79 |
80 |
81 | True
82 | True
83 | Resources.resx
84 |
85 |
86 | True
87 | Settings.settings
88 | True
89 |
90 |
91 | ResXFileCodeGenerator
92 | Resources.Designer.cs
93 |
94 |
95 | SettingsSingleFileGenerator
96 | Settings.Designer.cs
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
111 |
--------------------------------------------------------------------------------
/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------