static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("GGXrdRevelator v0.2 by gdkchan/Labryz");
            Console.ResetColor();

            Console.WriteLine("Guilty Gear XRD -REVELATOR- UPK/Steam AH3 PAC decrypter");

            Console.WriteLine(string.Empty);

            uint OutVal  = 0;
            bool encrypt = false;

            if (args.Length > 0)
            {
                encrypt = args[0].Equals("-e");
                if (!encrypt)
                {
                    switch (args[0].ToLower())
                    {
                    case "-revel": OutVal = 0x72642a6f; break;

                    case "-sign": OutVal = 0x43415046; break;
                    }
                }
                else
                {
                    switch (args[1].ToLower())
                    {
                    case "-revel": OutVal = 0x72642a6f; break;

                    case "-sign": OutVal = 0x43415046; break;
                    }
                }
            }

            if (args.Length < 2 || OutVal == 0)
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("Usage:");
                Console.ResetColor();

                Console.WriteLine("GGXrdRevelator [-e] (-revel|-sign) infile");
                Console.WriteLine("-revel  Decrypts GG Xrd REVELATOR files");
                Console.WriteLine("-sign  Decrypts GG Xrd SIGN files");

                Console.WriteLine("-e, when added, encrypts the input file. Otherwise, the program decrypts the file.");

                Console.WriteLine(string.Empty);

                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("Examples:");
                Console.ResetColor();

                Console.WriteLine("GGXrdRevelator -revel ELP_VOICE_JPN_A_SF.upk");
                Console.WriteLine("GGXrdRevelator -e -sign chara_split_28.pac");

                Console.WriteLine(string.Empty);

                Console.WriteLine("The output file name is the input name with .dec or .enc extension\ndepending on if you used the -e flag.");

                return;
            }
            string FileName = encrypt ? args[2] : args[1];
            string Name     = Path.GetFileName(FileName).ToUpper();

            if (Name.EndsWith(".dec") || Name.EndsWith(".enc"))
            {
                Name = Name.Substring(0, Name.Length - 4);
            }

            uint Seed = 0;

            foreach (char Chr in Name)
            {
                Seed *= 137;
                Seed += Chr;
            }

            MersenneTwister MT = new MersenneTwister(Seed);

            using (FileStream Input = new FileStream(FileName, FileMode.Open))
            {
                string ext = encrypt ? ".enc" : ".dec";
                using (FileStream Output = new FileStream(FileName + ext, FileMode.Create))
                {
                    BinaryReader Reader = new BinaryReader(Input);
                    BinaryWriter Writer = new BinaryWriter(Output);
                    if (!encrypt)
                    {
                        while (Input.Position + 4 <= Input.Length)
                        {
                            Writer.Write(OutVal ^= Reader.ReadUInt32() ^ MT.GenRandomNumber());
                        }
                    }
                    else
                    {
                        uint OldOut = OutVal;
                        while (Input.Position + 4 <= Input.Length)
                        {
                            uint NewOut = Reader.ReadUInt32();
                            Writer.Write(OldOut ^ NewOut ^ MT.GenRandomNumber());
                            OldOut = NewOut;
                        }
                    }
                }
            }
            Console.WriteLine("Finished!");
        }