diff --git a/popcorn/Assets/AvoEx.meta b/popcorn/Assets/AvoEx.meta
new file mode 100644
index 00000000..ee2b03ef
--- /dev/null
+++ b/popcorn/Assets/AvoEx.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 21da618b2c134430bbb478790b783125
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/popcorn/Assets/AvoEx/AesEncryptor.meta b/popcorn/Assets/AvoEx/AesEncryptor.meta
new file mode 100644
index 00000000..d346ce01
--- /dev/null
+++ b/popcorn/Assets/AvoEx/AesEncryptor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: af53094c81e804edda05f2f45319f21b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/popcorn/Assets/AvoEx/AesEncryptor/AesEncryptor.cs b/popcorn/Assets/AvoEx/AesEncryptor/AesEncryptor.cs
new file mode 100644
index 00000000..997f710d
--- /dev/null
+++ b/popcorn/Assets/AvoEx/AesEncryptor/AesEncryptor.cs
@@ -0,0 +1,296 @@
+using UnityEngine;
+using System;
+using System.Text;
+using System.Security.Cryptography;
+using System.Linq;
+
+/* See the "http://avoex.com/avoex/default-license/" for the full license governing this code. */
+
+namespace AvoEx
+{
+ // based on http://stackoverflow.com/questions/165808/simple-two-way-encryption-for-c-sharp
+ public static class AesEncryptor
+ {
+ // only the 128, 192, and 256-bit key sizes are specified in the AES standard. https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
+ const int keySize = 16; // keySize must be 16, 24 or 32 bytes.
+ const string keyString = "defaultKeyString"; // EDIT 'keyString' BEFORE RELEASE. keyString must be longer than keySize.
+ // DO NOT EDIT 'keySize, keyString' AFTER RELEASE YOUR PROJECT.
+ // if you change keyString, you can not decrypt saved data encrypted by old keyString.
+
+ // The size of the IV property must be the same as the BlockSize property divided by 8.
+ // https://msdn.microsoft.com/ko-kr/library/system.security.cryptography.symmetricalgorithm.iv(v=vs.110).aspx
+ const int IvLength = 16;
+
+ static readonly UTF8Encoding encoder;
+ static readonly AesManaged aes;
+
+ static AesEncryptor()
+ {
+ encoder = new UTF8Encoding();
+ aes = new AesManaged { Key = encoder.GetBytes(keyString).Take(keySize).ToArray() };
+ aes.BlockSize = IvLength * 8; // only the 128-bit block size is specified in the AES standard.
+ }
+
+ public static byte[] GenerateIV()
+ {
+ aes.GenerateIV();
+ return aes.IV;
+ }
+
+ #region PREPEND_VECTOR
+ ///
+ /// encrypt bytes with random vector. prepend vector to result.
+ ///
+ public static byte[] Encrypt(byte[] buffer)
+ {
+ aes.GenerateIV();
+ using (ICryptoTransform encryptor = aes.CreateEncryptor())
+ {
+ byte[] inputBuffer = encryptor.TransformFinalBlock(buffer, 0, buffer.Length);
+ return aes.IV.Concat(inputBuffer).ToArray();
+ }
+ }
+
+ ///
+ /// decrypt bytes, encrypted by Encrypt(byte[]).
+ ///
+ public static byte[] Decrypt(byte[] buffer)
+ {
+ byte[] iv = buffer.Take(IvLength).ToArray();
+ using (ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, iv))
+ {
+ return decryptor.TransformFinalBlock(buffer, IvLength, buffer.Length - IvLength);
+ }
+ }
+ #endregion PREPEND_VECTOR
+
+ #region CUSTOM_KEY
+ ///
+ /// not prepend vector to result. you must use DecryptIV(byte[], byte[]) to decrypt.
+ ///
+ public static byte[] EncryptIV(byte[] buffer, byte[] IV)
+ {
+ return EncryptKeyIV(buffer, aes.Key, IV);
+ }
+
+ ///
+ /// decrypt bytes, encrypted by EncryptIV(byte[], byte[]).
+ ///
+ public static byte[] DecryptIV(byte[] buffer, byte[] IV)
+ {
+ return DecryptKeyIV(buffer, aes.Key, IV);
+ }
+
+ public static byte[] EncryptKeyIV(byte[] buffer, byte[] key, byte[] IV)
+ {
+ using (ICryptoTransform encryptor = aes.CreateEncryptor(key, IV))
+ {
+ return encryptor.TransformFinalBlock(buffer, 0, buffer.Length);
+ }
+ }
+
+ public static byte[] DecryptKeyIV(byte[] buffer, byte[] key, byte[] IV)
+ {
+ using (ICryptoTransform decryptor = aes.CreateDecryptor(key, IV))
+ {
+ return decryptor.TransformFinalBlock(buffer, 0, buffer.Length);
+ }
+ }
+ #endregion CUSTOM_KEY
+
+ #region ENCRYPT_TO_STRING
+ // string
+ ///
+ /// encrypt string with random vector. prepend vector to result.
+ ///
+ public static string Encrypt(string unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(encoder.GetBytes(unencrypted)));
+ }
+
+ ///
+ /// decrypt string, encrypted by Encrypt(string).
+ ///
+ [Obsolete("Decrypt(string) has been made obsolete. Please use the DecryptString(string).")]
+ public static string Decrypt(string encrypted)
+ {
+ return DecryptString(encrypted);
+ }
+ public static string DecryptString(string encrypted)
+ {
+ return DecryptString(Convert.FromBase64String(encrypted));
+ }
+ public static string DecryptString(byte[] encrypted)
+ {
+ byte[] bytesDecrypted = Decrypt(encrypted);
+ return encoder.GetString(bytesDecrypted, 0, bytesDecrypted.Length);
+ }
+
+ ///
+ /// not prepend vector to result. you must use DecryptIV(string, byte[]) to decrypt.
+ ///
+ public static string EncryptIV(string unencrypted, byte[] vector)
+ {
+ return Convert.ToBase64String(EncryptIV(encoder.GetBytes(unencrypted), vector));
+ }
+
+ ///
+ /// decrypt string, encrypted by EncryptIV(string, byte[]).
+ ///
+ public static string DecryptIV(string encrypted, byte[] vector)
+ {
+ byte[] bytesDecrypted = DecryptIV(Convert.FromBase64String(encrypted), vector);
+ return encoder.GetString(bytesDecrypted, 0, bytesDecrypted.Length);
+ }
+
+ // bool
+ public static string Encrypt(bool unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static bool DecryptBool(string encrypted)
+ {
+ return DecryptBool(Convert.FromBase64String(encrypted));
+ }
+ public static bool DecryptBool(byte[] encrypted)
+ {
+ return BitConverter.ToBoolean(Decrypt(encrypted), 0);
+ }
+
+ // char
+ public static string Encrypt(char unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static char DecryptChar(string encrypted)
+ {
+ return DecryptChar(Convert.FromBase64String(encrypted));
+ }
+ public static char DecryptChar(byte[] encrypted)
+ {
+ return BitConverter.ToChar(Decrypt(encrypted), 0);
+ }
+
+ // double
+ public static string Encrypt(double unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static double DecryptDouble(string encrypted)
+ {
+ return DecryptDouble(Convert.FromBase64String(encrypted));
+ }
+ public static double DecryptDouble(byte[] encrypted)
+ {
+ return BitConverter.ToDouble(Decrypt(encrypted), 0);
+ }
+
+ // float
+ public static string Encrypt(float unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static float DecryptFloat(string encrypted)
+ {
+ return DecryptFloat(Convert.FromBase64String(encrypted));
+ }
+ public static float DecryptFloat(byte[] encrypted)
+ {
+ return BitConverter.ToSingle(Decrypt(encrypted), 0);
+ }
+
+ // int
+ public static string Encrypt(int unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+ public static int DecryptInt(string encrypted)
+ {
+ return DecryptInt(Convert.FromBase64String(encrypted));
+ }
+ public static int DecryptInt(byte[] encrypted)
+ {
+ return BitConverter.ToInt32(Decrypt(encrypted), 0);
+ }
+
+ // long
+ public static string Encrypt(long unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static long DecryptLong(string encrypted)
+ {
+ return DecryptLong(Convert.FromBase64String(encrypted));
+ }
+ public static long DecryptLong(byte[] encrypted)
+ {
+ return BitConverter.ToInt64(Decrypt(encrypted), 0);
+ }
+
+ // short
+ public static string Encrypt(short unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static short DecryptShort(string encrypted)
+ {
+ return DecryptShort(Convert.FromBase64String(encrypted));
+ }
+ public static short DecryptShort(byte[] encrypted)
+ {
+ return BitConverter.ToInt16(Decrypt(encrypted), 0);
+ }
+
+ // uint
+ public static string Encrypt(uint unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static uint DecryptUInt(string encrypted)
+ {
+ return DecryptUInt(Convert.FromBase64String(encrypted));
+ }
+ public static uint DecryptUInt(byte[] encrypted)
+ {
+ return BitConverter.ToUInt32(Decrypt(encrypted), 0);
+ }
+
+ // ulong
+ public static string Encrypt(ulong unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static ulong DecryptULong(string encrypted)
+ {
+ return DecryptULong(Convert.FromBase64String(encrypted));
+ }
+ public static ulong DecryptULong(byte[] encrypted)
+ {
+ return BitConverter.ToUInt64(Decrypt(encrypted), 0);
+ }
+
+ // ushort
+ public static string Encrypt(ushort unencrypted)
+ {
+ return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(unencrypted)));
+ }
+
+ public static ushort DecryptUShort(string encrypted)
+ {
+ return DecryptUShort(Convert.FromBase64String(encrypted));
+ }
+ public static ushort DecryptUShort(byte[] encrypted)
+ {
+ return BitConverter.ToUInt16(Decrypt(encrypted), 0);
+ }
+ #endregion ENCRYPT_TO_STRING
+ }
+}
\ No newline at end of file
diff --git a/popcorn/Assets/AvoEx/AesEncryptor/AesEncryptor.cs.meta b/popcorn/Assets/AvoEx/AesEncryptor/AesEncryptor.cs.meta
new file mode 100644
index 00000000..cbc924e4
--- /dev/null
+++ b/popcorn/Assets/AvoEx/AesEncryptor/AesEncryptor.cs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 92b113322c1491f489e01b2f786f85a2
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
diff --git a/popcorn/Assets/AvoEx/AesEncryptor/readme.txt b/popcorn/Assets/AvoEx/AesEncryptor/readme.txt
new file mode 100644
index 00000000..39e4f57f
--- /dev/null
+++ b/popcorn/Assets/AvoEx/AesEncryptor/readme.txt
@@ -0,0 +1,63 @@
+----------------------------------------------------------------
+AesEncryptor
+
+simple AES encryptor C#.
+you can edit a key and key size to 128, 192 or 256 bits in AesEncrypt.cs
+default key size is 128 bits(16 bytes).
+
+ - encrypt/decrypt a byte array to a byte array.
+ - encrypt a supported data type to a string.
+ - decrypt a string to a supported data type.
+
+more informations:
+http://avoex.com
+https://www.facebook.com/avoexgames
+
+----------------------------------------------------------------
+How to use AesEncryptor
+
+Just one line to encrypt/decrypt.
+
+Encrypt
+ - call AvoEx.AesEncryptor.Encrypt(...) function returns a encrypted string or byte.
+
+Decrypt
+ - call AvoEx.AesEncryptor.Decrypt...(...) function returns a decrypted data.
+
+
+watch video tutorial.
+http://youtu.be/g4jzSald9Oo
+
+----------------------------------------------------------------
+supported data type
+
+ - byte[]
+ - bool
+ - char
+ - double
+ - float
+ - int
+ - long
+ - short
+ - uint
+ - ulong
+ - ushort
+
+
+-------------------------------------------------------
+version history
+
+1.0.44
+ - supporting Window phone 8.
+
+1.0.39
+ - added Decrypt...(byte[]) functions.
+
+1.0.25
+ - added readme.txt
+
+1.0.20
+ - added EncryptKeyIV, DecryptKeyIV function.
+
+1.0.15
+ - added ExampleAesEncryptor.
diff --git a/popcorn/Assets/AvoEx/AesEncryptor/readme.txt.meta b/popcorn/Assets/AvoEx/AesEncryptor/readme.txt.meta
new file mode 100644
index 00000000..4b7eb5f6
--- /dev/null
+++ b/popcorn/Assets/AvoEx/AesEncryptor/readme.txt.meta
@@ -0,0 +1,4 @@
+fileFormatVersion: 2
+guid: 023ac4f8a0fcdd644a7a43581e93d66e
+TextScriptImporter:
+ userData: