diff --git a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs index 2520f8f04..21d35d949 100644 --- a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs +++ b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs @@ -1,4 +1,5 @@ using BlueWater.Interfaces; +using BlueWater.Tycoons; using BlueWater.Uis; using Sirenix.OdinInspector; using Spine.Unity; @@ -160,7 +161,8 @@ namespace BlueWater.Players.Tycoons private void Die() { - // VisualFeedbackManager.Instance.SetBaseTimeScale(0f); + var saveGold = TycoonManager.Instance.TycoonStatus.CurrentGold / 2; + ES3.Save("Gold", saveGold); } public void TransitionToState(IStateMachine newStateMachine) diff --git a/Assets/02.Scripts/EventManager.cs b/Assets/02.Scripts/EventManager.cs index 274c7be02..7a16ae6a7 100644 --- a/Assets/02.Scripts/EventManager.cs +++ b/Assets/02.Scripts/EventManager.cs @@ -4,6 +4,7 @@ using BlueWater.Npcs.Crews.Bartender; using BlueWater.Npcs.Crews.Cleaner; using BlueWater.Npcs.Crews.Server; using BlueWater.Npcs.Customers; +using BlueWater.Tycoons; using UnityEngine; namespace BlueWater diff --git a/Assets/02.Scripts/ScriptableObject/Item/CocktailDataTable.asset b/Assets/02.Scripts/ScriptableObject/Item/CocktailDataTable.asset index b2105a495..f8d8978fd 100644 --- a/Assets/02.Scripts/ScriptableObject/Item/CocktailDataTable.asset +++ b/Assets/02.Scripts/ScriptableObject/Item/CocktailDataTable.asset @@ -29,6 +29,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 7f08919123d8bb84194bd4be22c0dee8, type: 3} + k__BackingField: [] - k__BackingField: Cocktail001 k__BackingField: k__BackingField: Cocktail001 @@ -45,6 +46,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 0cf23778fd0b2994c9d608fbbf185468, type: 3} + k__BackingField: [] - k__BackingField: Cocktail002 k__BackingField: k__BackingField: Cocktail002 @@ -61,6 +63,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 600806d36167cb140aa40eb51cf58afa, type: 3} + k__BackingField: [] - k__BackingField: Cocktail003 k__BackingField: k__BackingField: Cocktail003 @@ -77,6 +80,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: c55f4b0a55a391d488e54a28dc840509, type: 3} + k__BackingField: [] - k__BackingField: Cocktail004 k__BackingField: k__BackingField: Cocktail004 @@ -93,6 +97,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 576d6ff3856f8ef419586ff12f2742b5, type: 3} + k__BackingField: [] - k__BackingField: Cocktail005 k__BackingField: k__BackingField: Cocktail005 @@ -109,6 +114,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 527440f24542af142a67219f2bcbeec4, type: 3} + k__BackingField: [] - k__BackingField: Cocktail006 k__BackingField: k__BackingField: Cocktail006 @@ -125,6 +131,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 6a4cd8cdf11fe024e8ecac8e3d60e10d, type: 3} + k__BackingField: [] - k__BackingField: Cocktail007 k__BackingField: k__BackingField: Cocktail007 @@ -141,6 +148,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: b38089ff4046ac044ba79dfa5116aa1b, type: 3} + k__BackingField: [] - k__BackingField: Cocktail008 k__BackingField: k__BackingField: Cocktail008 @@ -157,6 +165,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 71954183dfb02424d835d964c2eb3fc6, type: 3} + k__BackingField: [] - k__BackingField: Cocktail009 k__BackingField: k__BackingField: Cocktail009 @@ -173,6 +182,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: d0748411047fc4a41beb1fb8d551e01e, type: 3} + k__BackingField: [] - k__BackingField: Cocktail010 k__BackingField: k__BackingField: Cocktail010 @@ -183,12 +193,13 @@ MonoBehaviour: k__BackingField: LiquidD k__BackingField: 25 k__BackingField: LiquidE - k__BackingField: 100 + k__BackingField: 50 k__BackingField: k__BackingField: 0 k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 335f1df58cd58914f97fe9ccae7f6c8c, type: 3} + k__BackingField: [] - k__BackingField: Cocktail011 k__BackingField: k__BackingField: Cocktail011 @@ -205,6 +216,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 600806d36167cb140aa40eb51cf58afa, type: 3} + k__BackingField: [] - k__BackingField: Cocktail012 k__BackingField: k__BackingField: Cocktail012 @@ -221,6 +233,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: ee344f47787d148448bd3373235281b6, type: 3} + k__BackingField: [] - k__BackingField: Cocktail013 k__BackingField: k__BackingField: Cocktail013 @@ -237,6 +250,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: aef7fd596cbfc854d87f408c14951641, type: 3} + k__BackingField: [] - k__BackingField: Cocktail014 k__BackingField: k__BackingField: Cocktail014 @@ -253,6 +267,7 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 91d99e534e5f3c04094b14ed920bec04, type: 3} + k__BackingField: [] - k__BackingField: Cocktail015 k__BackingField: k__BackingField: Cocktail015 @@ -269,3 +284,4 @@ MonoBehaviour: k__BackingField: k__BackingField: 0 k__BackingField: {fileID: 21300000, guid: 527440f24542af142a67219f2bcbeec4, type: 3} + k__BackingField: [] diff --git a/Assets/02.Scripts/ScriptableObject/SpriteData.asset b/Assets/02.Scripts/ScriptableObject/SpriteData.asset index 8d098b871..3061476f1 100644 --- a/Assets/02.Scripts/ScriptableObject/SpriteData.asset +++ b/Assets/02.Scripts/ScriptableObject/SpriteData.asset @@ -15,4 +15,4 @@ MonoBehaviour: k__BackingField: {fileID: 21300000, guid: 51c11bee66d04f64d8d44afcb9975321, type: 3} k__BackingField: {fileID: 21300000, guid: cda1d961a563b6143a024170ed6f0f44, type: 3} k__BackingField: {fileID: 21300000, guid: 514247b5965aef447b13b5da95f3281a, type: 3} - k__BackingField: {fileID: 21300000, guid: 8ef64d8ac85ff4681987c8b621bef86b, type: 3} + k__BackingField: {fileID: 21300000, guid: c0cab5e7cc9fc5147b3f0aef86b2feab, type: 3} diff --git a/Assets/03.Images/Ui/Tycoon/BillOrderedFailStamp.png b/Assets/03.Images/Ui/Tycoon/BillOrderedFailStamp.png index 4cef713bf..37b27558f 100644 Binary files a/Assets/03.Images/Ui/Tycoon/BillOrderedFailStamp.png and b/Assets/03.Images/Ui/Tycoon/BillOrderedFailStamp.png differ diff --git a/Assets/03.Images/Ui/Tycoon/BillOrderedSucceedStamp.png b/Assets/03.Images/Ui/Tycoon/BillOrderedSucceedStamp.png index b62b853c8..d0ce15f04 100644 Binary files a/Assets/03.Images/Ui/Tycoon/BillOrderedSucceedStamp.png and b/Assets/03.Images/Ui/Tycoon/BillOrderedSucceedStamp.png differ diff --git a/Assets/03.Images/Ui/Tycoon/Check.png b/Assets/03.Images/Ui/Tycoon/Check.png index 71ec7e576..695b038e8 100644 Binary files a/Assets/03.Images/Ui/Tycoon/Check.png and b/Assets/03.Images/Ui/Tycoon/Check.png differ diff --git a/Assets/03.Images/Ui/Tycoon/Lock.png b/Assets/03.Images/Ui/Tycoon/Lock.png index 275e055dd..c05d4ddbb 100644 Binary files a/Assets/03.Images/Ui/Tycoon/Lock.png and b/Assets/03.Images/Ui/Tycoon/Lock.png differ diff --git a/Assets/03.Images/Ui/Tycoon/Lock.png.meta b/Assets/03.Images/Ui/Tycoon/Lock.png.meta index 28f185c8c..bee670487 100644 --- a/Assets/03.Images/Ui/Tycoon/Lock.png.meta +++ b/Assets/03.Images/Ui/Tycoon/Lock.png.meta @@ -46,9 +46,9 @@ TextureImporter: spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 - alignment: 0 + alignment: 7 spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 + spritePixelsToUnits: 1024 spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 @@ -133,6 +133,8 @@ TextureImporter: edges: [] weights: [] secondaryTextures: [] + spriteCustomMetadata: + entries: [] nameFileIdTable: {} mipmapLimitGroupName: pSDRemoveMatte: 0 diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab index a1090dccd..cdcd2d0d0 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab @@ -53,7 +53,7 @@ MonoBehaviour: k__BackingField: {fileID: 3099553823688037663} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} k__BackingField: 1 - k__BackingField: 0.5 + k__BackingField: 0.6 k__BackingField: IsOpened: 0 k__BackingField: 0 @@ -378,7 +378,7 @@ MonoBehaviour: k__BackingField: {fileID: 1675779991655778469} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} k__BackingField: 1 - k__BackingField: 0.5 + k__BackingField: 0.6 k__BackingField: IsOpened: 0 k__BackingField: 0 diff --git a/Assets/05.Prefabs/Uis/Tycoons/Bill.prefab b/Assets/05.Prefabs/Uis/Tycoons/Bill.prefab index 40e90a6ca..ac068d18b 100644 --- a/Assets/05.Prefabs/Uis/Tycoons/Bill.prefab +++ b/Assets/05.Prefabs/Uis/Tycoons/Bill.prefab @@ -274,8 +274,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -60} - m_SizeDelta: {x: -100, y: 60} + m_AnchoredPosition: {x: 2.5, y: -65} + m_SizeDelta: {x: -105, y: 50} m_Pivot: {x: 0.5, y: 1} --- !u!222 &5844400383110585303 CanvasRenderer: diff --git a/Assets/Plugins/Easy Save 3.meta b/Assets/Plugins/Easy Save 3.meta new file mode 100644 index 000000000..42f40ae5a --- /dev/null +++ b/Assets/Plugins/Easy Save 3.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c62843c57c147904b9ebffefca974d04 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Change Log.meta b/Assets/Plugins/Easy Save 3/Change Log.meta new file mode 100644 index 000000000..d3a1e9a71 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Change Log.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3115cc2dd2d49d742b3cfe0b237788ce +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Change Log/Change Log.txt b/Assets/Plugins/Easy Save 3/Change Log/Change Log.txt new file mode 100644 index 000000000..39f662b76 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Change Log/Change Log.txt @@ -0,0 +1,253 @@ +3.5.17 +- Changed referencing so that in most cases it will find any reference manager if it can't find one in the relevant scene and outputting a warning when this happens. + +3.5.16 +- Moved methods in ES3.cs inside of DISABLE_ENCRYPTION define so they are also stripped accordingly. + +3.5.15 +- Resolved issue where a scene not in the build list could cause the Prefabs window to fail to open. + +3.5.14 +- Resolved issue on some versions of Unity where the Editor would throw a harmless MissingReferenceException after removing an Easy Save 3 Manager. + +3.5.13 +- Resolved issue where adding a manager to scene or enabling Auto Save would throw a NullReferenceException. + +3.5.12 +- References in DontDestroyOnLoad are now added to the first available reference manager rather than requiring it's own manager. + +3.5.11 +- GameObjects and Components are now added to their scene's reference manager when using additive scenes. +- Resolved issue where enums were incorrectly generated in ES3Types due to the type list not being initialized intermittently. +- Resolved harmless bug where an ArgumentException is thrown when trying to add scene which has already been added to scene manager. + +3.5.10 +- Resolved issue where loading a value with a dervied type using caching would cause it to be loaded as it's parent type. + +3.5.9 +- Added support for Unity 6. + +3.5.8 +- Separated Add References to Mgr into Add References to Mgr and Add Dependencies to Mgr. +- Resolved issue where references were added to manager when Auto Add References was disabled as Component was created in scene. +- Resolved issue in some cases where Optimize would not remove cached references to deleted objects. +- Resolved issue where creating an ES3Type for an object which has generic collection field with an element of the same type as itself would cause a stack overflow in certain edge cases. + +3.5.7 +- Removed legacy dependency-gathering code which requires the UnityEngine.UI library. +- Resolved issues where ES3UserTypes aren't added to the reference manager on occasion. +- Reference managers are now no longer merged when using additive scenes. +- Worked around bug at Unity's end causing the Auto Save window to throw errors on Unity 2021. +- Resolved issue where ES3Prefab would throw an ArgumentException for writing the same item in the localToGlobal Dictionary. +- Resolved issue where saving primitives using PlayMaker actions with caching would cause a format error. +- Worked around issue with PlayMaker where assigning NULL to a GameObject invalidates the type of the FsmVariable. +- Made a change to ES3Cloud so that an error is manually sent when misconfigured servers reject POST parameters but continue to execute the PHP script. +- Resolved issue where priority of built-in types conflicted with user-generated types. + +3.5.6 +- ES3GameObject Component is now automatically moved to end of Components List to ensure that it's loaded after the Components it references. +- Resolved merge issue where cached data was being stored with it's generic type rather than actual type. +- Resolved issue where private members of inherited types wouldn't be saved in specific circumstances. + +3.5.5 +- References are now gathered when saving a scene and when changes are made in a scene, not when entering playmode. +- Added option to refresh reference managers in all scenes (Tools > Easy Save 3 > Refresh References for All Scenes). +- Added option to exclude references from being added to the manager (right-click > Easy Save 3 > Exclude Reference(s) from Manager). +- Added GetColumnLength and GetRowLength methods to ES3Spreadsheet. +- Resolved issue where enums would cause a FormatException when they were fields of a class with an ES3Type. +- Worked around Unity bug where initialisation events are sometimes not called when importing Easy Save. +- Worked around Unity bug where GetDirectoryName fails to work with a path to a file. +- Auto Saves are now processed in order of their position in the hierarchy. +- Resolved issue where members would be serialized twice when it was marked as ES3Serializable in both concrete and base classes. +- Worked around Unity bug where Unity would throw an error when trying to set a scripting define symbol for Stadia. +- Accounted for change in 2022.3 LTS where Unity have fixed a typo in their Editor API ("ToolbarSeachTextField") + +3.5.4 +- You can now enable Assembly Definition Files for Easy Save by going to Tools > Easy Save 3 > Enable Assembly Definition Files. +- Accounted for edge case where ES3File would be merged rather than overwritten, preventing keys from being deleted from the stored file. +- Resolved issue where reference collection can cause an InvalidOperationException (Collection was modified). +- Worked around bug with Unity Runner Template which prevented Easy Save types from loading. +- overrideSprite is no longer saved when saving UI.Image as Unity now returns the Sprite rather than null when this is unassigned. +- Resolved issue where Auto Save's events sometimes did not update when changing the active scene in the Editor. +- Resolved issue where saving a non-prefab instance GameObject with multiple Components would only save one of those Components. + +3.5.3 +- Attempting to save a Material with a RenderTexture will now throw a warning indicating that the RenderTexture won't be saved. +- Added filtering by tag in the Auto Save window by prefixing 'tag:' to the search query. + +3.5.2 +- Resolved issue where RectTransform was loaded incorrectly as parent is deserialized before anchoredPosition. +- Removed warning regarding Transform parents being set using the accessor rather than the SetParent method. +- ES3.CopyFile now automatically creates the target directory if it doesn't exist. +- Added an option to encrypt/compress raw cached data if the setting is defined for the cached file (postprocessRawCachedData). +- 'Add References to Manager' now permanently adds prefabs to the manager if 'Auto Add Prefabs to Manager' is enabled. +- Assembly names are now in alphabetical order so changes in order aren't registered as a change in version control. +- Using 'Add References to Manager' on a folder now adds all supported assets in that folder to the reference manager. + +3.5.1 +- Reverted changes to LoadRaw methods when using Cache as it caused regression issues. + +3.5.0 +- Added support for NativeArray. +- Managed case where ES3.EncryptBytes/DecryptBytes encountered an encoding issue. +- Worked around Unity bug where invalid assembly list would cause issues when exceptions are disabled. +- Worked around bug at Unity's end where unloaded scenes are returned by their methods. +- Resolved issue where scripting define symbols were overwritten on older versions of Unity. +- Worked around bug where inertia tensor value is rejected even when set as it's default upon loading. +- Most Material properties can now be saved, including custom properties. +- When saving a parent GameObject, children automatically have their parent set to the parent GameObject rather than loading this value by reference. +- Support added for Tuples. +- Added overload for AppendRaw which accepts a string and a filename. +- Worked around Unity bug where EventType.Layout isn't called when moving tabs for first time, causing Types pane recent types to be uninitialised. +- Worked around Unity bug which infrequently prevented Auto Save changes from persisting. +- Added ES3.Compress and ES3.Decompress methods. +- Performing 'Add Reference(s) to Manager' for a Texture2D will also add it's Sprite if one is present. +- Classes without parameterless constructors can now be serialised (note that their constructor will not be called). +- Resolved issue where an unloaded scene warning was thrown when scene is open but manually marked as unloaded in the Editor. + +3.4.2 +- Resolved issue where Unity Visual Scripting defines were not present on some versions of Unity. + +3.4.1 +- Added support for Particle System Bursts +- Resolved issue where Auto Save would sometimes save all Components regardless of settings. +- Resolved issue where Auto Save icon would not highlight when fields are selected. +- Structs with private properties or fields can now be serialized. +- Loading a blank string from a spreadsheet now returns a blank string rather than null. +- The reference manager will only collect references up to 3 levels deep to improve performance. +- System.Random support has been dropped due to Unity's implementation changing, making it non-serializable. +- ES3Ref is no longer stored twice for ScriptableObjects. +- Added support for Numerics.BigInteger. +- Internal fields of the ES3AutoSave Component are no longer displayed in the Editor. +- If a reference ID for a Component exists, it now ignores the GameObject ID so that a new GO instance is not created. +- Added a Get Streaming Assets Path action for Playmaker. +- Added non-generic versions of the ES3Spreadsheet methods to work around issue with Bolt. +- Worked around issue with Bolt where it would crash if you have two methods with the same parameters but one is generic. +- Resolved issue where Components marked as destroyed but not yet destroyed would cause unexpected behaviour. +- Auto Save will now work for additive scenes. +- Resolved issue where reference manager wasn't automatically updated when scene was open additively prior to runtime. +- Support added for Unity Visual Scripting. + +3.4.0 +- Caching now works seamlessly between Cloud and Auto Save. +- Added Save Multiple and Load Multiple actions to enable saving multiple specific variables at once. +- Added extra overloads to the ES3.LoadString method. +- Guids are now natively supported. +- Transform now stores the sibling index. +- Getting a timestamp for a file in cache which doesn't exist now returns a zero timestamp. +- Resolved issues where enums would sometiimes not serialize correctly when creating an ES3Type script for a class. +- Resolved issue where DownloadTimestamp PlayMaker action would download the wrong data. +- Resolved issue where reflection does not recognise a collection of a nested type as a nested type. +- Resolved issue where ES3Cloud was merged with the debug branch. +- Resolved issue where Sprites with atlased Textures would save an incorrect Rect. +- Resolved issue where ES3Spreadsheet was serializing primitives as objects when using PlayMaker actions. + +3.3.2f7 +- Type data is now stored when using ES3.Serialize. +- Worked around issue where Unity would return an incorrect number of assemblies. + +3.3.2f6 +- ES3Spreadsheet now correctly serializes object types into a CSV file. +- Resolved issue where an object[] containing primitive types could not be loaded in some situations. +- Worked around issue where PlayMaker wouldn't initialize variable before it's value was reset. +- Created a workaround for some situations where Unity creates new instances of ScriptableObjects in Assets at runtime. +- Resolved issue where Base-64 encoding option would not work with newline option in PlayMaker SaveRaw action. + +3.3.2f5 +- Resolved issue where scripts were not overwritten by Asset Store importer, causing Easy Save to be unstable. + +3.3.2f4 +- Resolved issue where Save action for PlayMaker could return NullReferenceException due to using the wrong ES3.Save override. +- Worked around IL2CPP bug where reflection would not find particular ES3Types on iOS +- Resolved issue where trying to store an empty/unassigned PlayMaker object would throw a NulReferenceException. +- Keys of a type which no longer exists in the project are now automatically removed +- Abstract types used in an ES3Type will now work as intended + +3.3.2f3 +- Added GameObject variables to Auto Save +- Resolved issue where Sprites would be loaded with the incorrect pivot. +- Resolved issue where Stacks were loaded in reverse. +- Added a 'quality' field to the ES3.SaveImage method to allow the quality to be specified when saving JPEGs. + +3.3.2f2 +- Added method which allows raw bytes to be uploaded via ES3Cloud. +- Worked around issue where File IO was called on platforms which don't support it +- Accounted for situations where Component should evaluate to null but doesn't +- Updated PlayMaker actions to work around issue where global variables sometimes go missing +- Objects with the NotEditable hideFlags can now be stored by reference +- Worked around Unity bug where it fails to deserialize data when Prefab mode is open +- Resolved issue where global 'Save GameObject Children' settings can take precedence over Auto Save settings +- 'Enable Easy Save for Prefab' context menu item now works when multiple objects are selected. + +3.3.2f1 +- Resolved issue where Components on prefabs would sometimes not be added to the reference manager. +- Resolved issue where reference ID was read unnecesserily, causing format exception. +- Resolved issue where child prefabs would not be recognised by manager. + +3.3.1p12 +- Resolved case where certain references would not be added to manager. + +3.3.1f11 +- Fixed issue where using ES3.CacheFile with an encrypted file could fail. +- Fixed issue where Directory.GetFiles cannot process a full path on certain configurations. +- Accounted for case where HideFlags are changed during build process. +- Added a timeout parameter to the ES3Cloud constructor. +- ES3.Serialize and ES3.Deserialize now work with encryption and compression + +3.3.1f10 +- Full support for projects which use multiple scenes at once. +- Added ES3.Encrypt and ES3.Decrypt methods. +- Supported saving the active state and FsmVariables of PlayMaker FSMs. +- Added edge case for SkinnedMeshRenderers which use LODs to ensure that all meshes and Materials are added to the reference manager. +- Ensured that Auto Update References setting is ackowledged when first adding manager to scene. +- Moved menu items into Tools/Easy Save 3 menu. +- Using LoadInto will now assign the loaded reference ID to the object you're loading into. + +3.3.1f9 +- It's not possible to add an ES3ReferenceMgr to your scene directly, ensuring that initialisation code is performed. +- Compressed files can now be cached. +- Ability to only add prefabs directly referenced by your scene to the manager. + +3.3.1f8 +- Caching is now enabled by default for Auto Save, significantly improving performance. +- Added ES3.LoadString method so you do not need to provide all parameters to use the defaultValue overload. +- Resolved case where SaveAll would not correctly save some types of array. +- Resolved case where global references would not be acknowledged. + +3.3.1f7 +- Serialization depth limit has been raised to account for projects with deep hierearchies +- Fixed issue where Easy Save 3 Manager could not be found for scenes which had not been saved. +- Resolved issue where Add Reference(s) to Manager would not dirty scene when Auto Update References was disabled. +- Improved Editor performance by accounting for situations where post-processing events would be called multiple times. + +3.3.1f6 +- Internal fields of the UnityEngine.Object class are hidden in the Types pane as they are not serialisable. +- Accounted for edge case where unassigned script is returned by GameObject.GetComponents(). +- ES3Settings constructor now accepts any settings enum (e.g. ES3.Location). +- No longer throws warning when multiple scenes are open. + +3.3.1f5 +- Updated PlayMaker actions. +- Provided workaround for issue where IL2CPP stripper removes methods which are marked to not be stripped. +- Performance updates. + +3.3.1f4 +- Improved performance when gathering references for reference manager. + +3.3.1f3 +- Added Cache as a storage location, providing a much simpler way of caching data. +- References can now be added by right-clicking the object and going to Easy Save 3 > Add Reference to Manager. +- Floats and doubles are now stored with full precision. +- Assorted bug fixes. + +3.3.1f2 +- Added compression, reducing file size by 85% on average when enabled +- JSON is now pretty printed (formatted) by default +- Added attributes to control serialisation +- Private fields in inherited classes are now stored +- Added search capabilities to the Auto Save window +- The way in which GameObjects is saved is now more flexible +- The reference manager is now updated whenever playmode is entered +- Null values in the global manager are now automatically removed +- Fixed issue where default settings were not applied properly +- Fixed issue where ES3Types would be stored in Easy Save root rather than in Assets/Easy Save 3/ \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Change Log/Change Log.txt.meta b/Assets/Plugins/Easy Save 3/Change Log/Change Log.txt.meta new file mode 100644 index 000000000..3a52013d4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Change Log/Change Log.txt.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 48fdb523e0bb47f479a18f9b236df644 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Change Log/Change Log.txt + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor.meta b/Assets/Plugins/Easy Save 3/Editor.meta new file mode 100644 index 000000000..4ee985caf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 600dbc665993148f7b59ae7356fe862e +folderAsset: yes +timeCreated: 1474041532 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Editor/AddES3Prefab.cs b/Assets/Plugins/Easy Save 3/Editor/AddES3Prefab.cs new file mode 100644 index 000000000..9277e2759 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/AddES3Prefab.cs @@ -0,0 +1,88 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ES3Internal; +using System.Linq; +using UnityEngine.SceneManagement; + +namespace ES3Editor +{ + public class AddES3Prefab : Editor + { + [MenuItem("GameObject/Easy Save 3/Enable Easy Save for Prefab(s)", false, 1001)] + [MenuItem("Assets/Easy Save 3/Enable Easy Save for Prefab(s)", false, 1001)] + public static void Enable() + { + if (Selection.gameObjects == null || Selection.gameObjects.Length == 0) + return; + + foreach (var obj in Selection.gameObjects) + { + // Don't add the Component to a GameObject which already has it. + if (obj == null || (obj.GetComponent() != null)) + continue; + + var go = obj; + + #if UNITY_2018_3_OR_NEWER + if (PrefabUtility.GetPrefabInstanceStatus(go) != PrefabInstanceStatus.NotAPrefab) + { + go = (GameObject)PrefabUtility.GetCorrespondingObjectFromSource(go); + if (go == null) + continue; + } + #else + if(PrefabUtility.GetPrefabType(go) != PrefabType.Prefab) + { + go = (GameObject)PrefabUtility.GetPrefabParent(go); + if(go == null) + continue; + } + #endif + + var es3Prefab = Undo.AddComponent(go); + es3Prefab.GeneratePrefabReferences(); + + var mgr = ES3ReferenceMgr.GetManagerFromScene(SceneManager.GetActiveScene()); + if (mgr != null) + { + mgr.AddPrefab(es3Prefab); + EditorUtility.SetDirty(mgr); + } + } + } + + [MenuItem("GameObject/Easy Save 3/Enable Easy Save for Prefab(s)", true, 1001)] + [MenuItem("Assets/Easy Save 3/Enable Easy Save for Prefab(s)", true, 1001)] + public static bool Validate() + { + return Selection.gameObjects != null && Selection.gameObjects.Length > 0; + } + } + + public class RemoveES3Prefab : Editor + { + [MenuItem("GameObject/Easy Save 3/Disable Easy Save for Prefab(s)", false, 1001)] + [MenuItem("Assets/Easy Save 3/Disable Easy Save for Prefab(s)", false, 1001)] + public static void Enable() + { + if (Selection.gameObjects == null || Selection.gameObjects.Length == 0) + return; + + foreach (var obj in Selection.gameObjects) + { + var es3prefab = obj.GetComponent(); + if (es3prefab != null) + Undo.DestroyObjectImmediate(es3prefab); + } + } + + [MenuItem("GameObject/Easy Save 3/Disable Easy Save for Prefab(s)", true, 1001)] + [MenuItem("Assets/Easy Save 3/Disable Easy Save for Prefab(s)", true, 1001)] + public static bool Validate() + { + return Selection.gameObjects != null && Selection.gameObjects.Length > 0; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/AddES3Prefab.cs.meta b/Assets/Plugins/Easy Save 3/Editor/AddES3Prefab.cs.meta new file mode 100644 index 000000000..163e45b90 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/AddES3Prefab.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 337c3be705d1942b3bf318b5b29aa7cb +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/AddES3Prefab.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/AutoSaveWindow.cs b/Assets/Plugins/Easy Save 3/Editor/AutoSaveWindow.cs new file mode 100644 index 000000000..ffb2ff3b1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/AutoSaveWindow.cs @@ -0,0 +1,369 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ES3Internal; +using UnityEngine.SceneManagement; +using UnityEditor.SceneManagement; + +namespace ES3Editor +{ + [System.Serializable] + public class AutoSaveWindow : SubWindow + { + public bool showAdvancedSettings = false; + + public ES3AutoSaveMgr mgr = null; + + private HierarchyItem[] hierarchy = null; + public HierarchyItem selected = null; + + private Vector2 hierarchyScrollPosition = Vector2.zero; + + private bool sceneOpen = true; + + private string searchTerm = ""; + + public AutoSaveWindow(EditorWindow window) : base("Auto Save", window) + { + EditorSceneManager.activeSceneChangedInEditMode += ChangedActiveScene; + } + + private void ChangedActiveScene(Scene current, Scene next) + { + mgr = null; + Init(); + } + + public override void OnGUI() + { + Init(); + + if(mgr == null) + { + EditorGUILayout.Space(); + if (GUILayout.Button("Enable Auto Save for this scene")) + mgr = ES3Postprocessor.AddManagerToScene().GetComponent(); + else + return; + } + + var style = EditorStyle.Get; + + using (var changeCheck = new EditorGUI.ChangeCheckScope()) + { + using (var vertical = new EditorGUILayout.VerticalScope(style.areaPadded)) + { + //GUILayout.Label("Settings for current scene", style.heading); + mgr.saveEvent = (ES3AutoSaveMgr.SaveEvent)EditorGUILayout.EnumPopup("Save Event", mgr.saveEvent); + mgr.loadEvent = (ES3AutoSaveMgr.LoadEvent)EditorGUILayout.EnumPopup("Load Event", mgr.loadEvent); + + EditorGUILayout.Space(); + + showAdvancedSettings = EditorGUILayout.Foldout(showAdvancedSettings, "Show Advanced Settings"); + if (showAdvancedSettings) + { + EditorGUI.indentLevel++; + mgr.key = EditorGUILayout.TextField("Key", mgr.key); + ES3SettingsEditor.Draw(mgr.settings); + EditorGUI.indentLevel--; + } + } + + // Display the menu. + using (var horizontal = new EditorGUILayout.HorizontalScope()) + { + if (GUILayout.Button("Scene", sceneOpen ? style.menuButtonSelected : style.menuButton)) + { + sceneOpen = true; + OnFocus(); + } + if (GUILayout.Button("Prefabs", sceneOpen ? style.menuButton : style.menuButtonSelected)) + { + sceneOpen = false; + OnFocus(); + } + } + + //EditorGUILayout.HelpBox("Select the Components you want to be saved.\nTo maximise performance, only select the Components with variables which need persisting.", MessageType.None, true); + + if (hierarchy == null || hierarchy.Length == 0) + { + EditorGUILayout.LabelField("Right-click a prefab and select 'Easy Save 3 > Enable Easy Save for Scene' to enable Auto Save for it.\n\nYour scene will also need to reference this prefab for it to be recognised.", style.area); + return; + } + + using (var scrollView = new EditorGUILayout.ScrollViewScope(hierarchyScrollPosition, style.areaPadded)) + { + hierarchyScrollPosition = scrollView.scrollPosition; + + using (new EditorGUILayout.HorizontalScope(GUILayout.Width(200))) + { + var searchTextFieldSkin = GUI.skin.FindStyle("ToolbarSearchTextField"); + if (searchTextFieldSkin == null) + searchTextFieldSkin = GUI.skin.FindStyle("ToolbarSeachTextField"); + + var searchButtonSkin = GUI.skin.FindStyle("ToolbarSearchCancelButton"); + if (searchButtonSkin == null) + searchButtonSkin = GUI.skin.FindStyle("ToolbarSeachCancelButton"); + + searchTerm = GUILayout.TextField(searchTerm, searchTextFieldSkin); + if (GUILayout.Button("", searchButtonSkin)) + { + // Remove focus if cleared + searchTerm = ""; + GUI.FocusControl(null); + } + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + foreach (var go in hierarchy) + if (go != null) + go.DrawHierarchy(searchTerm.ToLowerInvariant()); + } + if (changeCheck.changed) + EditorUtility.SetDirty(mgr); + } + } + + public void Init() + { + if (mgr == null) + foreach (var thisMgr in Resources.FindObjectsOfTypeAll()) + if (thisMgr != null && thisMgr.gameObject.scene == SceneManager.GetActiveScene()) + mgr = thisMgr; + + if (hierarchy == null) + OnFocus(); + } + + public override void OnFocus() + { + + GameObject[] parentObjects; + if (sceneOpen) + parentObjects = UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects(); + else // Prefabs + { + var mgr = ES3ReferenceMgr.GetManagerFromScene(SceneManager.GetActiveScene(), false); + var prefabs = mgr.prefabs; + parentObjects = new GameObject[prefabs.Count]; + for (int i = 0; i < prefabs.Count; i++) + if(prefabs[i] != null) + parentObjects[i] = prefabs[i].gameObject; + } + hierarchy = new HierarchyItem[parentObjects.Length]; + for (int i = 0; i < parentObjects.Length; i++) + if(parentObjects[i] != null) + hierarchy[i] = new HierarchyItem(parentObjects[i].transform, null, this); + } + + public class HierarchyItem + { + private ES3AutoSave autoSave; + private Transform t; + private Component[] components = null; + // Immediate children of this GameObject + private HierarchyItem[] children = new HierarchyItem[0]; + private bool showComponents = false; + //private AutoSaveWindow window; + + public HierarchyItem(Transform t, HierarchyItem parent, AutoSaveWindow window) + { + this.autoSave = t.GetComponent(); + this.t = t; + this.components = t.GetComponents(); + + children = new HierarchyItem[t.childCount]; + for (int i = 0; i < t.childCount; i++) + children[i] = new HierarchyItem(t.GetChild(i), this, window); + + //this.window = window; + } + + public void MergeDown(ES3AutoSave autoSave) + { + if (this.autoSave != autoSave) + { + if (this.autoSave != null) + { + autoSave.componentsToSave.AddRange(autoSave.componentsToSave); + Object.DestroyImmediate(this.autoSave); + } + this.autoSave = autoSave; + } + + foreach (var child in children) + MergeDown(autoSave); + } + + public void DrawHierarchy(string searchTerm) + { + bool containsSearchTerm = false; + + if (t != null) + { + // Filter by tag if it's prefixed by "tag:" + if (searchTerm.StartsWith("tag:") && t.tag.ToLowerInvariant().Contains(searchTerm.Remove(0,4))) + containsSearchTerm = true; + // Else filter by name + else + containsSearchTerm = t.name.ToLowerInvariant().Contains(searchTerm); + + if (containsSearchTerm) + { + GUIContent saveIcon; + EditorGUIUtility.SetIconSize(new Vector2(16, 16)); + + if (HasSelectedComponentsOrFields()) + saveIcon = new GUIContent(t.name, EditorStyle.Get.saveIconSelected, "There are Components on this GameObject which will be saved."); + else + saveIcon = new GUIContent(t.name, EditorStyle.Get.saveIconUnselected, "No Components on this GameObject will be saved"); + + GUIStyle style = GUI.skin.GetStyle("Foldout"); + if (Selection.activeTransform == t) + { + style = new GUIStyle(style); + style.fontStyle = FontStyle.Bold; + } + + var open = EditorGUILayout.Foldout(showComponents, saveIcon, style); + if (open) + { + // Ping the GameObject if this was previously closed + if (showComponents != open) + EditorGUIUtility.PingObject(t.gameObject); + DrawComponents(); + } + showComponents = open; + + EditorGUI.indentLevel += 1; + } + } + + // Draw children + if (children != null) + foreach (var child in children) + if (child != null) + child.DrawHierarchy(searchTerm); + + if (containsSearchTerm) + EditorGUI.indentLevel -= 1; + } + + public void DrawComponents() + { + EditorGUI.indentLevel += 3; + using (var scope = new EditorGUILayout.VerticalScope()) + { + bool toggle; + toggle = EditorGUILayout.ToggleLeft("active", autoSave != null ? autoSave.saveActive : false); + if ((autoSave = (toggle && autoSave == null) ? t.gameObject.AddComponent() : autoSave) != null) + ApplyBool("saveActive", toggle); + + toggle = EditorGUILayout.ToggleLeft("hideFlags", autoSave != null ? autoSave.saveHideFlags : false); + if ((autoSave = (toggle && autoSave == null) ? t.gameObject.AddComponent() : autoSave) != null) + ApplyBool("saveHideFlags", toggle); + + toggle = EditorGUILayout.ToggleLeft("layer", autoSave != null ? autoSave.saveLayer : false); + if ((autoSave = (toggle && autoSave == null) ? t.gameObject.AddComponent() : autoSave) != null) + ApplyBool("saveLayer", toggle); + + toggle = EditorGUILayout.ToggleLeft("name", autoSave != null ? autoSave.saveName : false); + if ((autoSave = (toggle && autoSave == null) ? t.gameObject.AddComponent() : autoSave) != null) + ApplyBool("saveName", toggle); + + toggle = EditorGUILayout.ToggleLeft("tag", autoSave != null ? autoSave.saveTag : false); + if ((autoSave = (toggle && autoSave == null) ? t.gameObject.AddComponent() : autoSave) != null) + ApplyBool("saveTag", toggle); + + foreach (var component in components) + { + if (component == null) + continue; + + using (var horizontalScope = new EditorGUILayout.HorizontalScope()) + { + bool saveComponent = false; + if (autoSave != null) + saveComponent = autoSave.componentsToSave.Contains(component); + + var newValue = EditorGUILayout.ToggleLeft(EditorGUIUtility.ObjectContent(component, component.GetType()), saveComponent); + // If the checkbox has changed, we want to save or not save a Component + if (newValue != saveComponent) + { + if (autoSave == null) + { + autoSave = Undo.AddComponent(t.gameObject); + var so = new SerializedObject(autoSave); + so.FindProperty("saveChildren").boolValue = false; + so.ApplyModifiedProperties(); + } + // If we've unchecked the box, remove the Component from the array. + if (newValue == false) + { + var so = new SerializedObject(autoSave); + var prop = so.FindProperty("componentsToSave"); + var index = autoSave.componentsToSave.IndexOf(component); + prop.DeleteArrayElementAtIndex(index); + so.ApplyModifiedProperties(); + } + // Else, add it to the array. + else + { + var so = new SerializedObject(autoSave); + var prop = so.FindProperty("componentsToSave"); + prop.arraySize++; + prop.GetArrayElementAtIndex(prop.arraySize - 1).objectReferenceValue = component; + so.ApplyModifiedProperties(); + } + } + if (GUILayout.Button(EditorGUIUtility.IconContent("_Popup"), new GUIStyle("Label"))) + ES3Window.InitAndShowTypes(component.GetType()); + } + } + } + + /*if(autoSave != null && isDirty) + { + EditorUtility.SetDirty(autoSave); + if (PrefabUtility.IsPartOfPrefabInstance(autoSave)) + PrefabUtility.RecordPrefabInstancePropertyModifications(autoSave.gameObject); + }*/ + + if (autoSave != null && (autoSave.componentsToSave == null || autoSave.componentsToSave.Count == 0) && !autoSave.saveActive && !autoSave.saveChildren && !autoSave.saveHideFlags && !autoSave.saveLayer && !autoSave.saveName && !autoSave.saveTag) + { + Undo.DestroyObjectImmediate(autoSave); + autoSave = null; + } + EditorGUI.indentLevel -= 3; + } + + public void ApplyBool(string propertyName, bool value) + { + var so = new SerializedObject(autoSave); + so.FindProperty(propertyName).boolValue = value; + so.ApplyModifiedProperties(); + } + + public bool HasSelectedComponentsOrFields() + { + if (autoSave == null) + return false; + + + foreach (var component in components) + if (component != null && autoSave.componentsToSave.Contains(component)) + return true; + + if (autoSave.saveActive || autoSave.saveHideFlags || autoSave.saveLayer || autoSave.saveName || autoSave.saveTag) + return true; + + return false; + } + } + } + +} diff --git a/Assets/Plugins/Easy Save 3/Editor/AutoSaveWindow.cs.meta b/Assets/Plugins/Easy Save 3/Editor/AutoSaveWindow.cs.meta new file mode 100644 index 000000000..57f5d11c6 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/AutoSaveWindow.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 6065cc5492e9f49728674de9a0c1fe84 +timeCreated: 1519132286 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/AutoSaveWindow.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveEditor.cs new file mode 100644 index 000000000..a6786f40a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveEditor.cs @@ -0,0 +1,21 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ES3Internal +{ + [CustomEditor(typeof(ES3AutoSave))] + public class ES3AutoSaveEditor : Editor + { + public override void OnInspectorGUI() + { + if (target == null) + return; + + if (GUILayout.Button("Manage Auto Save Settings")) + ES3Editor.ES3Window.InitAndShowAutoSave(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveEditor.cs.meta new file mode 100644 index 000000000..1af73105d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 54ded3aeb20a94008a877da330bfc45f +timeCreated: 1519132285 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveMgrEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveMgrEditor.cs new file mode 100644 index 000000000..854e218af --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveMgrEditor.cs @@ -0,0 +1,20 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ES3Internal +{ + [CustomEditor(typeof(ES3AutoSaveMgr))] + public class ES3AutoSaveMgrEditor : Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("This manages the saving and loading of GameObjects which have the Auto Save component attached to them.\n\nIf there are no Auto Save components in your scene, this component will do nothing.", MessageType.Info); + if(GUILayout.Button("Settings...")) + ES3Editor.ES3Window.InitAndShowAutoSave(); + } + } + +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveMgrEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveMgrEditor.cs.meta new file mode 100644 index 000000000..fbd7ffdd8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveMgrEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f440317f3fd444daf83c27a3381af17c +timeCreated: 1519132300 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3AutoSaveMgrEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ClassTypeTemplate.txt b/Assets/Plugins/Easy Save 3/Editor/ES3ClassTypeTemplate.txt new file mode 100644 index 000000000..83318c128 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ClassTypeTemplate.txt @@ -0,0 +1,54 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute([propertyNames])] + public class ES3UserType_[es3TypeSuffix] : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3UserType_[es3TypeSuffix]() : base(typeof([fullType])){ Instance = this; priority = 1; } + + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = ([fullType])obj; + [writes] + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = ([fullType])obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + [reads] + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new [fullType](); + ReadObject(reader, instance); + return instance; + } + } + + + public class ES3UserType_[es3TypeSuffix]Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3UserType_[es3TypeSuffix]Array() : base(typeof([fullType][]), ES3UserType_[es3TypeSuffix].Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ClassTypeTemplate.txt.meta b/Assets/Plugins/Easy Save 3/Editor/ES3ClassTypeTemplate.txt.meta new file mode 100644 index 000000000..02080ed30 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ClassTypeTemplate.txt.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: cc3cada215f0d417a8fa879651f22f84 +timeCreated: 1483698819 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3ClassTypeTemplate.txt + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ComponentTypeTemplate.txt b/Assets/Plugins/Easy Save 3/Editor/ES3ComponentTypeTemplate.txt new file mode 100644 index 000000000..9953ea59f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ComponentTypeTemplate.txt @@ -0,0 +1,47 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute([propertyNames])] + public class ES3UserType_[es3TypeSuffix] : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3UserType_[es3TypeSuffix]() : base(typeof([fullType])){ Instance = this; priority = 1;} + + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = ([fullType])obj; + [writes] + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = ([fullType])obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + [reads] + default: + reader.Skip(); + break; + } + } + } + } + + + public class ES3UserType_[es3TypeSuffix]Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3UserType_[es3TypeSuffix]Array() : base(typeof([fullType][]), ES3UserType_[es3TypeSuffix].Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ComponentTypeTemplate.txt.meta b/Assets/Plugins/Easy Save 3/Editor/ES3ComponentTypeTemplate.txt.meta new file mode 100644 index 000000000..863db2043 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ComponentTypeTemplate.txt.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: b74f7ff5e731846249f9e22ab7afedfb +timeCreated: 1483698819 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3ComponentTypeTemplate.txt + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3EditorStyle.cs b/Assets/Plugins/Easy Save 3/Editor/ES3EditorStyle.cs new file mode 100644 index 000000000..fa5e9b4c8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3EditorStyle.cs @@ -0,0 +1,84 @@ +using System.Collections; +using UnityEngine; +using UnityEditor; + +namespace ES3Editor +{ + public class EditorStyle + { + private static EditorStyle style = null; + + public GUIStyle area; + public GUIStyle areaPadded; + + public GUIStyle menuButton; + public GUIStyle menuButtonSelected; + public GUIStyle smallSquareButton; + + public GUIStyle heading; + public GUIStyle subheading; + public GUIStyle subheading2; + + public GUIStyle boldLabelNoStretch; + + public GUIStyle link; + + public GUIStyle toggle; + + public Texture2D saveIconSelected; + public Texture2D saveIconUnselected; + + public static EditorStyle Get { get{ if(style == null) style = new EditorStyle(); return style; } } + + public EditorStyle() + { + // An area with padding. + area = new GUIStyle(); + area.padding = new RectOffset(10, 10, 10, 10); + area.wordWrap = true; + + // An area with more padding. + areaPadded = new GUIStyle(); + areaPadded.padding = new RectOffset(20, 20, 20, 20); + areaPadded.wordWrap = true; + + // Unselected menu button. + menuButton = new GUIStyle(EditorStyles.toolbarButton); + menuButton.fontStyle = FontStyle.Normal; + menuButton.fontSize = 14; + menuButton.fixedHeight = 24; + + // Selected menu button. + menuButtonSelected = new GUIStyle(menuButton); + menuButtonSelected.fontStyle = FontStyle.Bold; + + // Main Headings + heading = new GUIStyle(EditorStyles.label); + heading.fontStyle = FontStyle.Bold; + heading.fontSize = 24; + + subheading = new GUIStyle(heading); + subheading.fontSize = 18; + + subheading2 = new GUIStyle(heading); + subheading2.fontSize = 14; + + boldLabelNoStretch = new GUIStyle(EditorStyles.label); + boldLabelNoStretch.stretchWidth = false; + boldLabelNoStretch.fontStyle = FontStyle.Bold; + + link = new GUIStyle(); + link.fontSize = 16; + if(EditorGUIUtility.isProSkin) + link.normal.textColor = new Color (0.262f, 0.670f, 0.788f); + else + link.normal.textColor = new Color (0.129f, 0.129f, 0.8f); + + toggle = new GUIStyle(EditorStyles.toggle); + toggle.stretchWidth = false; + + saveIconSelected = AssetDatabase.LoadAssetAtPath(ES3Settings.PathToEasySaveFolder() + "Editor/es3Logo16x16.png"); + saveIconUnselected = AssetDatabase.LoadAssetAtPath(ES3Settings.PathToEasySaveFolder() + "Editor/es3Logo16x16-bw.png"); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3EditorStyle.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3EditorStyle.cs.meta new file mode 100644 index 000000000..062eb690c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3EditorStyle.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f556addc6753344019137cbc45d2c4ff +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3EditorStyle.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3EditorUtility.cs b/Assets/Plugins/Easy Save 3/Editor/ES3EditorUtility.cs new file mode 100644 index 000000000..126d4368a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3EditorUtility.cs @@ -0,0 +1,60 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.IO; +using System.Linq; +using ES3Internal; + +public class ES3EditorUtility : Editor +{ + public static void DisplayLink(string label, string url) + { + var style = ES3Editor.EditorStyle.Get; + if(GUILayout.Button(label, style.link)) + Application.OpenURL(url); + + var buttonRect = GUILayoutUtility.GetLastRect(); + buttonRect.width = style.link.CalcSize(new GUIContent(label)).x; + + EditorGUIUtility.AddCursorRect(buttonRect, MouseCursor.Link); + } + + public static bool IsPrefabInAssets(UnityEngine.Object obj) + { + #if UNITY_2018_3_OR_NEWER + return PrefabUtility.IsPartOfPrefabAsset(obj); + #else + return (PrefabUtility.GetPrefabType(obj) == PrefabType.Prefab); + #endif + } + + /* + * Gets all children and components from a GameObject or GameObjects. + * We create our own method for this because EditorUtility.CollectDeepHierarchy isn't thread safe in the Editor. + */ + public static IEnumerable CollectDeepHierarchy(IEnumerable gos) + { + var deepHierarchy = new HashSet(); + foreach (var go in gos) + { + deepHierarchy.Add(go); + deepHierarchy.UnionWith(go.GetComponents()); + foreach (Transform t in go.transform) + deepHierarchy.UnionWith( CollectDeepHierarchy( new GameObject[] { t.gameObject } ) ); + } + return deepHierarchy; + } + + [MenuItem("Tools/Easy Save 3/Getting Started...", false, 0)] + public static void DisplayGettingStarted() + { + Application.OpenURL("https://docs.moodkie.com/easy-save-3/getting-started/"); + } + + [MenuItem("Tools/Easy Save 3/Manual...", false, 0)] + public static void DisplayManual() + { + Application.OpenURL("https://docs.moodkie.com/product/easy-save-3/"); + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3EditorUtility.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3EditorUtility.cs.meta new file mode 100644 index 000000000..a1af25701 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3EditorUtility.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 501719249e8124990973182985feaeb8 +timeCreated: 1519132285 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3EditorUtility.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3GameObjectEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3GameObjectEditor.cs new file mode 100644 index 000000000..08dc8b07c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3GameObjectEditor.cs @@ -0,0 +1,46 @@ +using UnityEditor; +using UnityEngine; + +namespace ES3Internal +{ + [CustomEditor(typeof(ES3GameObject))] + public class ES3GameObjectEditor : Editor + { + public override void OnInspectorGUI() + { + if (target == null) + return; + + var es3Go = (ES3GameObject)target; + + EditorGUILayout.HelpBox("This Component allows you to choose which Components are saved when this GameObject is saved using code.", MessageType.Info); + + if (es3Go.GetComponent() != null) + { + EditorGUILayout.HelpBox("This Component cannot be used on GameObjects which are already managed by Auto Save.", MessageType.Error); + return; + } + + foreach (var component in es3Go.GetComponents()) + { + var markedToBeSaved = es3Go.components.Contains(component); + var newMarkedToBeSaved = EditorGUILayout.Toggle(component.GetType().Name, markedToBeSaved); + + if(markedToBeSaved && !newMarkedToBeSaved) + { + Undo.RecordObject(es3Go, "Marked Component to save"); + es3Go.components.Remove(component); + } + + if (!markedToBeSaved && newMarkedToBeSaved) + { + Undo.RecordObject(es3Go, "Unmarked Component to save"); + es3Go.components.Add(component); + } + } + + if (es3Go.components.RemoveAll(t => t == null) > 0) + Undo.RecordObject(es3Go, "Removed null Component from ES3GameObject"); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3GameObjectEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3GameObjectEditor.cs.meta new file mode 100644 index 000000000..f1fffe351 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3GameObjectEditor.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b7d54ef20554e354eb3c0d40d2a6debe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3GameObjectEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3GlobalReferencesEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3GlobalReferencesEditor.cs new file mode 100644 index 000000000..d11c5c662 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3GlobalReferencesEditor.cs @@ -0,0 +1,91 @@ +#if !ES3GLOBAL_DISABLED +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ES3Internal +{ + [CustomEditor(typeof(ES3Internal.ES3GlobalReferences))] + [System.Serializable] + public class ES3GlobalReferencesEditor : Editor + { + private bool isDraggingOver = false; + private bool openReferences = false; + + private ES3Internal.ES3GlobalReferences _globalRefs = null; + private ES3Internal.ES3GlobalReferences globalRefs + { + get + { + if (_globalRefs == null) + _globalRefs = (ES3Internal.ES3GlobalReferences)serializedObject.targetObject; + return _globalRefs; + } + } + + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("This stores references to objects in Assets, allowing them to be referenced with the same ID between scenes.", MessageType.Info); + + if (EditorGUILayout.Foldout(openReferences, "References") != openReferences) + { + openReferences = !openReferences; + if (openReferences == true) + openReferences = EditorUtility.DisplayDialog("Are you sure?", "Opening this list will display every reference in the manager, which for larger projects can cause the Editor to freeze\n\nIt is strongly recommended that you save your project before continuing.", "Open References", "Cancel"); + } + + // Make foldout drag-and-drop enabled for objects. + if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + Event evt = Event.current; + + switch (evt.type) + { + case EventType.DragUpdated: + case EventType.DragPerform: + isDraggingOver = true; + break; + case EventType.DragExited: + isDraggingOver = false; + break; + } + + if (isDraggingOver) + { + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + + if (evt.type == EventType.DragPerform) + { + DragAndDrop.AcceptDrag(); + Undo.RecordObject(globalRefs, "Add References to Easy Save 3 Reference List"); + foreach (UnityEngine.Object obj in DragAndDrop.objectReferences) + globalRefs.GetOrAdd(obj); + // Return now because otherwise we'll change the GUI during an event which doesn't allow it. + return; + } + } + } + + if (openReferences) + { + EditorGUI.indentLevel++; + + foreach (var kvp in globalRefs.refId) + { + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.ObjectField(kvp.Key, typeof(UnityEngine.Object), true); + EditorGUILayout.LongField(kvp.Value); + + EditorGUILayout.EndHorizontal(); + } + + EditorGUI.indentLevel--; + } + } + } +} +#endif diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3GlobalReferencesEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3GlobalReferencesEditor.cs.meta new file mode 100644 index 000000000..3c0044333 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3GlobalReferencesEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 286fb0c3863779e4d96bc682edb324ce +timeCreated: 1519132283 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3GlobalReferencesEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3InspectorInfoEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3InspectorInfoEditor.cs new file mode 100644 index 000000000..efea1d9d1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3InspectorInfoEditor.cs @@ -0,0 +1,14 @@ +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using System; +using System.Collections; + +[CustomEditor(typeof(ES3InspectorInfo))] +public class ES3InspectorInfoEditor : Editor +{ + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox(((ES3InspectorInfo)target).message, MessageType.Info); + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3InspectorInfoEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3InspectorInfoEditor.cs.meta new file mode 100644 index 000000000..4f95d1d03 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3InspectorInfoEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b344d685b614044aebf5285c5f59f52d +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3InspectorInfoEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3PlayMakerEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3PlayMakerEditor.cs new file mode 100644 index 000000000..f69c850fa --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3PlayMakerEditor.cs @@ -0,0 +1,803 @@ +#if PLAYMAKER_1_8_OR_NEWER + +using UnityEngine; +using UnityEditor; +using HutongGames.PlayMaker; +using HutongGames.PlayMaker.Actions; +using HutongGames.PlayMakerEditor; +using System.Text.RegularExpressions; + +namespace ES3PlayMaker +{ + #region Base Actions + + public abstract class BaseEditor : CustomActionEditor + { + bool showErrorHandling = false; + + public abstract void DrawGUI(); + + public override bool OnGUI() + { + DrawGUI(); + + EditorGUILayout.Separator(); + + showErrorHandling = EditorGUILayout.Foldout(showErrorHandling, "Error Handling"); + if (showErrorHandling) + { + EditorGUI.indentLevel++; + EditField("errorEvent"); + EditField("errorMessage"); + EditorGUI.indentLevel--; + } + + return GUI.changed; + } + + // Displays the FsmVar field without the unnecessary Type field. + protected void FsmVarField(string fieldName) + { + if (target == null || target.State == null) + return; + + var fsmVar = (FsmVar)ES3Internal.ES3Reflection.GetField(target.GetType(), fieldName).GetValue(target); + + if (fsmVar == null) + { + fsmVar = new FsmVar(); + ES3Internal.ES3Reflection.GetField(target.GetType(), fieldName).SetValue(target, fsmVar); + } + + EditorGUILayout.BeginHorizontal(); + var label = Regex.Replace(fieldName, @"\p{Lu}", m => " " + m.Value.ToLowerInvariant()); + EditorGUILayout.PrefixLabel(char.ToUpperInvariant(label[0]) + label.Substring(1)); + + var localVariables = target.Fsm.Variables.GetAllNamedVariablesSorted(); + var globalVariables = FsmVariables.GlobalVariables.GetAllNamedVariablesSorted(); + + var variableNames = new string[localVariables.Length + globalVariables.Length]; + int selected = -1; + + for(int i=0; i= localVariables.Length ? globalVariables[i - localVariables.Length] : localVariables[i]; + variableNames[i] = i >= localVariables.Length ? "Globals/"+variable.Name : variable.Name; + if (fsmVar.NamedVar == variable) + selected = i; + } + + var newSelected = EditorGUILayout.Popup(selected, variableNames); + + + EditorGUILayout.EndHorizontal(); + + if (newSelected == -1) + return; + + if (selected != newSelected) + { + if (newSelected >= localVariables.Length) + fsmVar.NamedVar = globalVariables[newSelected - localVariables.Length]; + else + fsmVar.NamedVar = localVariables[newSelected]; + } + } + } + + public abstract class SettingsEditor : BaseEditor + { + public override bool OnGUI() + { + base.OnGUI(); + return DrawSettingsEditor(); + } + + public bool DrawSettingsEditor() + { + var action = target as ES3PlayMaker.SettingsAction; + if (action == null) + return false; + action.overrideDefaultSettings.Value = EditorGUILayout.ToggleLeft("Override Default Settings", action.overrideDefaultSettings.Value); + + if (action.overrideDefaultSettings.Value) + { + EditorGUI.indentLevel++; + + EditField("path"); + EditField("location"); + EditField("encryptionType"); + EditField("encryptionPassword"); + EditField("compressionType"); + EditField("directory"); + EditField("format"); + EditField("bufferSize"); + + EditorGUI.indentLevel--; + EditorGUILayout.Space(); + } + return GUI.changed; + } + } + + public abstract class KeyValueSettingsEditor : SettingsEditor + { + public override bool OnGUI() + { + EditField("key"); + EditField("value"); + + base.OnGUI(); + + return GUI.changed; + } + + public override void DrawGUI(){} + } + + public abstract class ES3FileActionEditor : BaseEditor + { + public override bool OnGUI() + { + EditField("fsmES3File"); + + base.OnGUI(); + + var action = target as ES3PlayMaker.ES3FileAction; + if (action == null) + return false; + + return GUI.changed; + } + } +#endregion + +#if !PLAYMAKER_1_9_OR_NEWER +#region Save Actions + + /*[CustomActionEditor(typeof(ES3PlayMaker.Save))] + public class SaveEditor : KeyValueSettingsEditor{}*/ + + /*[CustomActionEditor(typeof(ES3PlayMaker.SaveMultiple))] + public class SaveMultipleEditor : SettingsEditor + { + public override bool OnGUI() + { + return base.OnGUI(); + } + + public override void DrawGUI() + { + DrawDefaultInspector(); + } + }*/ + + [CustomActionEditor(typeof(ES3PlayMaker.SaveAll))] + public class SaveAllEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("key"); + EditField("saveFsmVariables"); + EditField("saveGlobalVariables"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.SaveRaw))] + public class SaveRawEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("str"); + EditField("useBase64Encoding"); + EditField("appendNewline"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.AppendRaw))] + public class AppendRawEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("str"); + EditField("useBase64Encoding"); + EditField("appendNewline"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.SaveImage))] + public class SaveImageEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("imagePath"); + EditField("texture2D"); + EditField("quality"); + } + } + +#endregion + +#region Load Actions + + [CustomActionEditor(typeof(ES3PlayMaker.Load))] + public class LoadEditor : KeyValueSettingsEditor + { + public override void DrawGUI() + { + EditorGUILayout.Space(); + EditField("defaultValue"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.LoadInto))] + public class LoadIntoEditor : KeyValueSettingsEditor{} + + [CustomActionEditor(typeof(ES3PlayMaker.LoadAll))] + public class LoadAllEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("key"); + EditField("loadFsmVariables"); + EditField("loadGlobalVariables"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.LoadAudio))] + public class LoadAudioEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("audioFilePath"); + EditField("audioClip"); +#if UNITY_2018_3_OR_NEWER + EditField("audioType"); +#endif + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.LoadImage))] + public class LoadImageEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("imagePath"); + EditField("texture2D"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.LoadRawString))] + public class LoadRawStringEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("str"); + EditField("useBase64Encoding"); + } + } + +#endregion + +#region Exists Actions + + [CustomActionEditor(typeof(ES3PlayMaker.KeyExists))] + public class KeyExistsEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("key"); + EditField("exists"); + EditorGUILayout.Separator(); + EditField("existsEvent"); + EditField("doesNotExistEvent"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.FileExists))] + public class FileExistsEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + EditField("exists"); + EditorGUILayout.Separator(); + EditField("existsEvent"); + EditField("doesNotExistEvent"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.DirectoryExists))] + public class DirectoryExistsEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("directoryPath"); + EditField("exists"); + EditorGUILayout.Separator(); + EditField("existsEvent"); + EditField("doesNotExistEvent"); + } + } + +#endregion + +#region Delete Actions + + [CustomActionEditor(typeof(ES3PlayMaker.DeleteKey))] + public class DeleteKeyEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("key"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.DeleteFile))] + public class DeleteFileEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.DeleteDirectory))] + public class DeleteDirectoryEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("directoryPath"); + } + } + +#endregion + +#region Backup Actions + + [CustomActionEditor(typeof(ES3PlayMaker.CreateBackup))] + public class CreateBackupEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.RestoreBackup))] + public class RestoreBackupEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + EditField("backupWasRestored"); + } + } + +#endregion + +#region Key, File and Directory methods + + [CustomActionEditor(typeof(ES3PlayMaker.RenameFile))] + public class RenameFileEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("oldFilePath"); + EditField("newFilePath"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.CopyFile))] + public class CopyFileEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("oldFilePath"); + EditField("newFilePath"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.CopyDirectory))] + public class CopyDirectoryEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("oldDirectoryPath"); + EditField("newDirectoryPath"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.GetKeys))] + public class GetKeysEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + EditField("keys"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.GetKeyCount))] + public class GetKeyCountEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + EditField("keyCount"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.GetFiles))] + public class GetFilesEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("directoryPath"); + EditField("files"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.GetDirectories))] + public class GetDirectoriesEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("directoryPath"); + EditField("directories"); + } + } + +#endregion + +#region ES3File Actions + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileCreate))] + public class ES3FileCreateEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("fsmES3File"); + EditField("filePath"); + EditField("syncWithFile"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileSync))] + public class ES3FileSyncEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("fsmES3File"); + } + } + + /*[CustomActionEditor(typeof(ES3PlayMaker.ES3FileSave))] + public class ES3FileSaveEditor : SaveEditor + { + public override void DrawGUI() + { + EditField("fsmES3File"); + base.DrawGUI(); + } + }*/ + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileLoad))] + public class ES3FileLoadEditor : LoadEditor + { + public override void DrawGUI() + { + EditField("fsmES3File"); + base.DrawGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileLoadInto))] + public class ES3FileLoadIntoEditor : LoadIntoEditor + { + public override void DrawGUI() + { + base.DrawGUI(); + EditField("fsmES3File"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileDeleteKey))] + public class ES3FileDeleteKeyEditor : DeleteKeyEditor + { + public override void DrawGUI() + { + base.DrawGUI(); + EditField("fsmES3File"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileKeyExists))] + public class ES3FileKeyExistsEditor : KeyExistsEditor + { + public override void DrawGUI() + { + EditField("fsmES3File"); + base.DrawGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileGetKeys))] + public class ES3FileGetKeysEditor : ES3FileActionEditor + { + public override void DrawGUI() + { + EditField("keys"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileClear))] + public class ES3FileClearEditor : BaseEditor + { + public override void DrawGUI() + { + EditField("fsmES3File"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3FileSize))] + public class ES3FileSizeEditor : BaseEditor + { + public override void DrawGUI() + { + EditField("size"); + EditField("fsmES3File"); + } + } + + +#endregion + +#region ES3Cloud Actions +#if !DISABLE_WEB + + public abstract class ES3CloudEditor : SettingsEditor + { + protected abstract void DrawChildGUI(); + + public override void DrawGUI() + { + EditField("url"); + EditField("apiKey"); + EditorGUILayout.Space(); + DrawChildGUI(); + EditorGUILayout.Space(); + EditField("errorCode"); + } + } + + public abstract class ES3CloudUserEditor : ES3CloudEditor + { + public bool showUser = false; + + protected override void DrawChildGUI() + { + if((showUser = EditorGUILayout.Foldout(showUser, "User (optional)"))) + { + EditorGUI.indentLevel++; + EditField("user"); + EditField("password"); + EditorGUI.indentLevel--; + } + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudSync))] + public class ES3CloudSyncEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("path"); + base.DrawChildGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudDownloadFile))] + public class ES3CloudDownloadFileEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("path"); + base.DrawChildGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudDownloadES3File))] + public class ES3CloudDownloadES3FileEditor : BaseEditor + { + public bool showUser = false; + public override void DrawGUI() + { + EditField("fsmES3File"); + EditField("url"); + EditField("apiKey"); + EditField("errorCode"); + if ((showUser = EditorGUILayout.Foldout(showUser, "User (optional)"))) + { + EditorGUI.indentLevel++; + EditField("user"); + EditField("password"); + EditorGUI.indentLevel--; + } + } + } + + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudUploadFile))] + public class ES3CloudUploadFileEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("path"); + base.DrawChildGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudUploadES3File))] + public class ES3CloudUploadES3FileEditor : BaseEditor + { + public bool showUser = false; + public override void DrawGUI() + { + EditField("fsmES3File"); + EditField("url"); + EditField("apiKey"); + EditField("errorCode"); + if((showUser = EditorGUILayout.Foldout(showUser, "User (optional)"))) + { + EditorGUI.indentLevel++; + EditField("user"); + EditField("password"); + EditorGUI.indentLevel--; + } + } + } + + + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudDeleteFile))] + public class ES3CloudDeleteFileEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("path"); + base.DrawChildGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudRenameFile))] + public class ES3CloudRenameFileEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("path"); + EditField("newFilename"); + base.DrawChildGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudDownloadFilenames))] + public class ES3CloudDownloadFilenamesEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("filenames"); + EditField("searchPattern"); + base.DrawChildGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudSearchFilenames))] + public class ES3CloudSearchFilenamesEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("filenames"); + EditField("searchPattern"); + base.DrawChildGUI(); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3CloudDownloadTimestamp))] + public class ES3CloudDownloadTimestampEditor : ES3CloudUserEditor + { + protected override void DrawChildGUI() + { + EditField("path"); + EditField("timestamp"); + base.DrawChildGUI(); + } + } + +#endif + +#endregion + +#region ES3SpreadsheetActions + + + [CustomActionEditor(typeof(ES3PlayMaker.ES3SpreadsheetCreate))] + public class ES3SpreadsheetCreateEditor : BaseEditor + { + public override void DrawGUI() + { + EditField("fsmES3Spreadsheet"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3SpreadsheetSetCell))] + public class ES3SpreadsheetSetCellEditor : BaseEditor + { + public override void DrawGUI() + { + EditField("fsmES3Spreadsheet"); + EditField("col"); + EditField("row"); + EditField("value"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3SpreadsheetGetCell))] + public class ES3SpreadsheetGetCellEditor : BaseEditor + { + public override void DrawGUI() + { + EditField("fsmES3Spreadsheet"); + EditField("col"); + EditField("row"); + EditField("value"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3SpreadsheetLoad))] + public class ES3SpreadsheetLoadEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("fsmES3Spreadsheet"); + EditField("filePath"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.ES3SpreadsheetSave))] + public class ES3SpreadsheetSaveEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("fsmES3Spreadsheet"); + EditField("filePath"); + EditField("append"); + } + } + +#endregion + +#region Caching + + [CustomActionEditor(typeof(ES3PlayMaker.CacheFile))] + public class CacheFileEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + } + } + + [CustomActionEditor(typeof(ES3PlayMaker.StoreCachedFile))] + public class StoreCachedFileEditor : SettingsEditor + { + public override void DrawGUI() + { + EditField("filePath"); + } + } + +#endregion +#endif +} +#endif diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3PlayMakerEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3PlayMakerEditor.cs.meta new file mode 100644 index 000000000..d8179c40e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3PlayMakerEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 61838eb75b8164d699b0f54416e0f0bc +timeCreated: 1497347459 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3PlayMakerEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs new file mode 100644 index 000000000..5788d48c6 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs @@ -0,0 +1,269 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEditor.SceneManagement; +using UnityEngine.SceneManagement; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using ES3Internal; + + +/* + * ---- How Postprocessing works for the reference manager ---- + * - When the manager is first added to the scene, all top-level dependencies are added to the manager (AddManagerToScene). + * - When the manager is first added to the scene, all prefabs with ES3Prefab components are added to the manager (AddManagerToScene). + * - All GameObjects and Components in the scene are added to the reference manager when we enter Playmode or the scene is saved (PlayModeStateChanged, OnWillSaveAssets -> AddGameObjectsAndComponentstoManager). + * - When a UnityEngine.Object field of a Component is modified, the new UnityEngine.Object reference is added to the reference manager (PostProcessModifications) + * - All prefabs with ES3Prefab Components are added to the reference manager when we enter Playmode or the scene is saved (PlayModeStateChanged, OnWillSaveAssets -> AddGameObjectsAndComponentstoManager). + * - Local references for prefabs are processed whenever a prefab with an ES3Prefab Component is deselected (SelectionChanged -> ProcessGameObject) + */ +[InitializeOnLoad] +public class ES3Postprocessor : UnityEditor.AssetModificationProcessor +{ + public static GameObject lastSelected = null; + + + // This constructor is also called once when playmode is activated and whenever recompilation happens + // because we have the [InitializeOnLoad] attribute assigned to the class. + static ES3Postprocessor() + { +#if UNITY_2020_2_OR_NEWER + ObjectChangeEvents.changesPublished += Changed; +#endif + ObjectFactory.componentWasAdded += ComponentWasAdded; + + // Open the Easy Save 3 window the first time ES3 is installed. + //ES3Editor.ES3Window.OpenEditorWindowOnStart(); + + EditorApplication.playModeStateChanged -= PlayModeStateChanged; + EditorApplication.playModeStateChanged += PlayModeStateChanged; + + EditorSceneManager.sceneOpened += OnSceneOpened; + } + + #region Reference Updating + + private static void PlayModeStateChanged(PlayModeStateChange state) + { + if (state == PlayModeStateChange.ExitingEditMode) + UpdateAssembliesContainingES3Types(); + } + + private static void OnSceneOpened(Scene scene, OpenSceneMode mode) + { + if (mode == OpenSceneMode.AdditiveWithoutLoading || Application.isPlaying) + return; + + if (ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences && ES3Settings.defaultSettingsScriptableObject.updateReferencesWhenSceneIsOpened) + RefreshScene(scene); + } + + private static void RefreshReferences(bool isEnteringPlayMode = false) + { + /*if (refreshed) // If we've already refreshed, do nothing. + return;*/ + + if (ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences) + for (int i = 0; i < SceneManager.sceneCount; i++) + RefreshScene(SceneManager.GetSceneAt(i)); + //refreshed = true; + } + + static void RefreshScene(Scene scene, bool isEnteringPlayMode = false) + { + if (scene != null && scene.isLoaded) + { + var mgr = (ES3ReferenceMgr)ES3ReferenceMgr.GetManagerFromScene(scene, false); + if (mgr != null) + mgr.RefreshDependencies(isEnteringPlayMode); + } + } + + static void ComponentWasAdded(Component c) + { + var scene = c.gameObject.scene; + + if (!scene.isLoaded) + return; + + var mgr = (ES3ReferenceMgr)ES3ReferenceMgr.GetManagerFromScene(scene, false); + + if (mgr != null && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences && ES3Settings.defaultSettingsScriptableObject.updateReferencesWhenSceneChanges) + mgr.AddDependencies(c); + } + +#if UNITY_2020_2_OR_NEWER + static void Changed(ref ObjectChangeEventStream stream) + { + if (EditorApplication.isUpdating || Application.isPlaying || !ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences || !ES3Settings.defaultSettingsScriptableObject.updateReferencesWhenSceneChanges) + return; + + for (int i = 0; i < stream.length; i++) + { + var eventType = stream.GetEventType(i); + int[] instanceIds; + Scene scene; + + if (eventType == ObjectChangeKind.ChangeGameObjectOrComponentProperties) + { + ChangeGameObjectOrComponentPropertiesEventArgs evt; + stream.GetChangeGameObjectOrComponentPropertiesEvent(i, out evt); + instanceIds = new int[] { evt.instanceId }; + scene = evt.scene; + } + else if (eventType == ObjectChangeKind.CreateGameObjectHierarchy) + { + CreateGameObjectHierarchyEventArgs evt; + stream.GetCreateGameObjectHierarchyEvent(i, out evt); + instanceIds = new int[] { evt.instanceId }; + scene = evt.scene; + } + /*else if (eventType == ObjectChangeKind.ChangeAssetObjectProperties) + { + ChangeAssetObjectPropertiesEventArgs evt; + stream.GetChangeAssetObjectPropertiesEvent(i, out evt); + instanceIds = new int[] { evt.instanceId }; + }*/ + else if (eventType == ObjectChangeKind.UpdatePrefabInstances) + { + UpdatePrefabInstancesEventArgs evt; + stream.GetUpdatePrefabInstancesEvent(i, out evt); + instanceIds = evt.instanceIds.ToArray(); + scene = evt.scene; + } + else + continue; + + var mgr = (ES3ReferenceMgr)ES3ReferenceMgr.GetManagerFromScene(scene, false); + + if (mgr == null) + return; + + foreach (var id in instanceIds) + { + try + { + var obj = EditorUtility.InstanceIDToObject(id); + + if (obj == null) + continue; + + mgr.AddDependencies(obj); + } + catch { } + } + } + } +#endif + + /*public static void PlayModeStateChanged(PlayModeStateChange state) + { + // Add all GameObjects and Components to the reference manager before we enter play mode. + if (state == PlayModeStateChange.ExitingEditMode && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences) + RefreshReferences(true); + }*/ + + public static string[] OnWillSaveAssets(string[] paths) + { + // Don't refresh references when the application is playing. + if (!EditorApplication.isUpdating && !Application.isPlaying) + { + if(ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences && ES3Settings.defaultSettingsScriptableObject.updateReferencesWhenSceneIsSaved) + RefreshReferences(); + UpdateAssembliesContainingES3Types(); + } + return paths; + } + + #endregion + + + private static void UpdateAssembliesContainingES3Types() + { + var assemblies = UnityEditor.Compilation.CompilationPipeline.GetAssemblies(); + + if (assemblies == null || assemblies.Length == 0) + return; + + var defaults = ES3Settings.defaultSettingsScriptableObject; + var currentAssemblyNames = defaults.settings.assemblyNames; + + var assemblyNames = new List(); + + foreach (var assembly in assemblies) + { + // Don't include Editor assemblies. + if (assembly.flags.HasFlag(UnityEditor.Compilation.AssemblyFlags.EditorAssembly)) + continue; + + // Assemblies beginning with 'com.' are assumed to be internal. + if (assembly.name.StartsWith("com.")) + continue; + + // If this assembly begins with 'Unity', but isn't created from an Assembly Definition File, skip it. + if (assembly.name.StartsWith("Unity")) + { + bool isAssemblyDefinition = true; + + foreach (string sourceFile in assembly.sourceFiles) + { + if (!sourceFile.StartsWith("Assets/")) + { + isAssemblyDefinition = false; + break; + } + } + + if (!isAssemblyDefinition) + continue; + } + + assemblyNames.Add(assembly.name); + } + + // If there are no assembly names, + if (assemblyNames.Count == 0) + return; + + // Sort it alphabetically so that the order isn't constantly changing, which can affect version control. + assemblyNames.Sort(); + + // Only update if the list has changed. + for (int i = 0; i < assemblyNames.Count; i++) + { + if (currentAssemblyNames.Length != assemblyNames.Count || currentAssemblyNames[i] != assemblyNames[i]) + { + defaults.settings.assemblyNames = assemblyNames.ToArray(); + EditorUtility.SetDirty(defaults); + break; + } + } + } + + public static GameObject AddManagerToScene() + { + GameObject mgr = null; + + var mgrComponent = ES3ReferenceMgr.GetManagerFromScene(SceneManager.GetActiveScene(), false); + if (mgrComponent != null) + mgr = mgrComponent.gameObject; + + if (mgr == null) + mgr = new GameObject("Easy Save 3 Manager"); + + if (mgr.GetComponent() == null) + { + var refMgr = mgr.AddComponent(); + + if (!Application.isPlaying && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences) + refMgr.RefreshDependencies(); + } + + if (mgr.GetComponent() == null) + mgr.AddComponent(); + + Undo.RegisterCreatedObjectUndo(mgr, "Enabled Easy Save for Scene"); + return mgr; + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs.meta new file mode 100644 index 000000000..befcecc65 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 4256380692bcb4e57bdc0a5e13956389 +timeCreated: 1474041535 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3PrefabEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3PrefabEditor.cs new file mode 100644 index 000000000..03bed8425 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3PrefabEditor.cs @@ -0,0 +1,50 @@ +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using System; +using System.Collections; +using ES3Internal; + +[CustomEditor(typeof(ES3Prefab))] +[System.Serializable] +public class ES3PrefabEditor : Editor +{ + bool showAdvanced = false; + bool openLocalRefs = false; + + public override void OnInspectorGUI() + { + var es3Prefab = (ES3Prefab)serializedObject.targetObject; + EditorGUILayout.HelpBox("Easy Save is enabled for this prefab, and can be saved and loaded with the ES3 methods.", MessageType.None); + + + showAdvanced = EditorGUILayout.Foldout(showAdvanced, "Advanced Settings"); + if(showAdvanced) + { + EditorGUI.indentLevel++; + es3Prefab.prefabId = EditorGUILayout.LongField("Prefab ID", es3Prefab.prefabId); + EditorGUILayout.LabelField("Reference count", es3Prefab.localRefs.Count.ToString()); + EditorGUI.indentLevel--; + + openLocalRefs = EditorGUILayout.Foldout(openLocalRefs, "localRefs"); + if (openLocalRefs) + { + EditorGUI.indentLevel++; + + EditorGUILayout.LabelField("It is not recommended to manually modify these."); + + foreach (var kvp in es3Prefab.localRefs) + { + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.ObjectField(kvp.Key, typeof(UnityEngine.Object), false); + EditorGUILayout.LongField(kvp.Value); + + EditorGUILayout.EndHorizontal(); + } + + EditorGUI.indentLevel--; + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3PrefabEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3PrefabEditor.cs.meta new file mode 100644 index 000000000..0c521e6d9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3PrefabEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9d25610c9233c4cdfa5a0744c9956f5c +timeCreated: 1519132292 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3PrefabEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ReferenceMgrEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3ReferenceMgrEditor.cs new file mode 100644 index 000000000..d47097915 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ReferenceMgrEditor.cs @@ -0,0 +1,256 @@ +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using System; +using System.Collections; +using System.Collections.Generic; + +[CustomEditor(typeof(ES3ReferenceMgr))] +[System.Serializable] +public class ES3ReferenceMgrEditor : Editor +{ + private bool isDraggingOver = false; + private bool openReferences = false; + + private ES3ReferenceMgr _mgr = null; + private ES3ReferenceMgr mgr + { + get + { + if (_mgr == null) + _mgr = (ES3ReferenceMgr)serializedObject.targetObject; + return _mgr; + } + } + + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("This allows Easy Save to maintain references to objects in your scene.\n\nIt is automatically updated when you enter Playmode or build your project.", MessageType.Info); + + if (EditorGUILayout.Foldout(openReferences, "References") != openReferences) + { + openReferences = !openReferences; + if (openReferences == true) + openReferences = EditorUtility.DisplayDialog("Are you sure?", "Opening this list will display every reference in the manager, which for larger projects can cause the Editor to freeze\n\nIt is strongly recommended that you save your project before continuing.", "Open References", "Cancel"); + } + + // Make foldout drag-and-drop enabled for objects. + if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + Event evt = Event.current; + + switch (evt.type) + { + case EventType.DragUpdated: + case EventType.DragPerform: + isDraggingOver = true; + break; + case EventType.DragExited: + isDraggingOver = false; + break; + } + + if (isDraggingOver) + { + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + + if (evt.type == EventType.DragPerform) + { + DragAndDrop.AcceptDrag(); + Undo.RecordObject(mgr, "Add References to Easy Save 3 Reference List"); + foreach (UnityEngine.Object obj in DragAndDrop.objectReferences) + mgr.Add(obj); + // Return now because otherwise we'll change the GUI during an event which doesn't allow it. + return; + } + } + } + + if (openReferences) + { + EditorGUI.indentLevel++; + + foreach (var kvp in mgr.idRef) + { + EditorGUILayout.BeginHorizontal(); + + var value = EditorGUILayout.ObjectField(kvp.Value, typeof(UnityEngine.Object), true); + var key = EditorGUILayout.LongField(kvp.Key); + + EditorGUILayout.EndHorizontal(); + + if (value != kvp.Value || key != kvp.Key) + { + Undo.RecordObject(mgr, "Change Easy Save 3 References"); + // If we're deleting a value, delete it. + if (value == null) + mgr.Remove(key); + // Else, update the ID. + else + mgr.ChangeId(kvp.Key, key); + // Break, as removing or changing Dictionary items will make the foreach out of sync. + break; + } + } + + EditorGUI.indentLevel--; + } + + mgr.openPrefabs = EditorGUILayout.Foldout(mgr.openPrefabs, "ES3Prefabs"); + if (mgr.openPrefabs) + { + EditorGUI.indentLevel++; + + foreach (var prefab in mgr.prefabs) + { + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.ObjectField(prefab, typeof(UnityEngine.Object), true); + + EditorGUILayout.EndHorizontal(); + } + + EditorGUI.indentLevel--; + } + + var sp = serializedObject.FindProperty("excludeObjects"); + EditorGUILayout.PropertyField(sp); + serializedObject.ApplyModifiedProperties(); + + EditorGUILayout.LabelField("Reference count", mgr.refId.Count.ToString()); + EditorGUILayout.LabelField("Prefab count", mgr.prefabs.Count.ToString()); + + if (GUILayout.Button("Refresh")) + { + mgr.RefreshDependencies(); + } + + if (GUILayout.Button("Optimize")) + { + mgr.Optimize(); + } + } + + [MenuItem("GameObject/Easy Save 3/Add Dependencies to Manager", false, 33)] + [MenuItem("Assets/Easy Save 3/Add Dependencies to Manager", false, 33)] + public static void AddDependenciesToManager() + { + var mgr = ES3ReferenceMgr.GetManagerFromScene(SceneManager.GetActiveScene()); + if (mgr == null) + { + EditorUtility.DisplayDialog("Could not add reference to manager", "This object could not be added to the reference manager because no reference manager exists in this scene. To create one, go to Tools > Easy Save 3 > Add Manager to Scene", "Ok"); + return; + } + + var selected = new HashSet(Selection.GetFiltered(SelectionMode.DeepAssets)); + selected.UnionWith(Selection.GetFiltered(SelectionMode.TopLevel)); + + if (selected == null || selected.Count == 0) + return; + + Undo.RecordObject(mgr, "Update Easy Save 3 Reference Manager"); + + foreach (var obj in selected) + { + if (obj == null) + continue; + + if (obj.GetType() == typeof(GameObject)) + { + var go = (GameObject)obj; + if (ES3EditorUtility.IsPrefabInAssets(go) && go.GetComponent() != null) + mgr.AddPrefab(go.GetComponent()); + } + + ((ES3ReferenceMgr)mgr).AddDependencies(obj); + } + } + + [MenuItem("GameObject/Easy Save 3/Add Reference(s) to Manager", false, 33)] + [MenuItem("Assets/Easy Save 3/Add Reference(s) to Manager", false, 33)] + public static void AddReferencesToManager() + { + var mgr = ES3ReferenceMgr.Current; + if (mgr == null) + { + EditorUtility.DisplayDialog("Could not add reference to manager", "This object could not be added to the reference manager because no reference manager exists in this scene. To create one, go to Tools > Easy Save 3 > Add Manager to Scene", "Ok"); + return; + } + + var selected = Selection.GetFiltered(SelectionMode.TopLevel); + + if (selected == null || selected.Length == 0) + return; + + Undo.RecordObject(mgr, "Update Easy Save 3 Reference Manager"); + + foreach (var obj in selected) + { + if (obj == null) + continue; + + if (obj.GetType() == typeof(GameObject)) + { + var go = (GameObject)obj; + if (ES3EditorUtility.IsPrefabInAssets(go) && go.GetComponent() != null) + mgr.AddPrefab(go.GetComponent()); + } + + ((ES3ReferenceMgr)mgr).Add(obj); + } + } + + [MenuItem("GameObject/Easy Save 3/Add Reference(s) to Manager", true, 33)] + [MenuItem("Assets/Easy Save 3/Add Reference(s) to Manager", true, 33)] + [MenuItem("GameObject/Easy Save 3/Add Dependencies to Manager", true, 33)] + [MenuItem("Assets/Easy Save 3/Add Dependencies to Manager", true, 33)] + private static bool CanAddReferenceToManager() + { + var selected = Selection.GetFiltered(SelectionMode.Deep); + return selected != null && selected.Length > 0 && ES3ReferenceMgr.Current != null; + } + + [MenuItem("GameObject/Easy Save 3/Exclude Reference(s) from Manager", false, 33)] + [MenuItem("Assets/Easy Save 3/Exclude Reference(s) from Manager", false, 33)] + public static void ExcludeReferenceFromManager() + { + var mgr = (ES3ReferenceMgr)ES3ReferenceMgr.Current; + if (mgr == null) + { + EditorUtility.DisplayDialog("Could not exclude reference from manager", "This object could not be excluded from the reference manager because no reference manager exists in this scene. To create one, go to Tools > Easy Save 3 > Add Manager to Scene", "Ok"); + return; + } + + var selected = Selection.GetFiltered(SelectionMode.DeepAssets); + + if (selected == null || selected.Length == 0) + return; + + + Undo.RecordObject(mgr, "Exclude from Easy Save 3 Reference Manager"); + + if (mgr.excludeObjects == null) + mgr.excludeObjects = new List(); + + mgr.excludeObjects.AddRange(EditorUtility.CollectDependencies(selected)); + mgr.RemoveNullOrInvalidValues(); + } + + [MenuItem("GameObject/Easy Save 3/Add Manager to Scene", false, 33)] + [MenuItem("Assets/Easy Save 3/Add Manager to Scene", false, 33)] + [MenuItem("Tools/Easy Save 3/Add Manager to Scene", false, 150)] + public static void EnableForScene() + { + if(!SceneManager.GetActiveScene().isLoaded) + EditorUtility.DisplayDialog("Could not add manager to scene", "Could not add Easy Save 3 Manager to scene because there is not currently a scene open.", "Ok"); + Selection.activeObject = ES3Postprocessor.AddManagerToScene(); + } + + [MenuItem("GameObject/Easy Save 3/Add Manager to Scene", true, 33)] + [MenuItem("Assets/Easy Save 3/Add Manager to Scene", true, 33)] + [MenuItem("Tools/Easy Save 3/Add Manager to Scene", true, 150)] + private static bool CanEnableForScene() + { + return ES3ReferenceMgr.GetManagerFromScene(SceneManager.GetActiveScene(), false) == null; + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ReferenceMgrEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3ReferenceMgrEditor.cs.meta new file mode 100644 index 000000000..6f8b2d8e1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ReferenceMgrEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 3b43d266ed3464dedaa77757645ad61c +timeCreated: 1519132283 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3ReferenceMgrEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ScriptableObjectTypeTemplate.txt b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptableObjectTypeTemplate.txt new file mode 100644 index 000000000..c5d9a4b1d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptableObjectTypeTemplate.txt @@ -0,0 +1,47 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute([propertyNames])] + public class ES3UserType_[es3TypeSuffix] : ES3ScriptableObjectType + { + public static ES3Type Instance = null; + + public ES3UserType_[es3TypeSuffix]() : base(typeof([fullType])){ Instance = this; priority = 1; } + + + protected override void WriteScriptableObject(object obj, ES3Writer writer) + { + var instance = ([fullType])obj; + [writes] + } + + protected override void ReadScriptableObject(ES3Reader reader, object obj) + { + var instance = ([fullType])obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + [reads] + default: + reader.Skip(); + break; + } + } + } + } + + + public class ES3UserType_[es3TypeSuffix]Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3UserType_[es3TypeSuffix]Array() : base(typeof([fullType][]), ES3UserType_[es3TypeSuffix].Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ScriptableObjectTypeTemplate.txt.meta b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptableObjectTypeTemplate.txt.meta new file mode 100644 index 000000000..3c0672d79 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptableObjectTypeTemplate.txt.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 3b4ae594e55834c35b197df04c2e81cb +timeCreated: 1483698819 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3ScriptableObjectTypeTemplate.txt + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ScriptingDefineSymbols.cs b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptingDefineSymbols.cs new file mode 100644 index 000000000..971aa7fbf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptingDefineSymbols.cs @@ -0,0 +1,122 @@ +using UnityEditor; +using UnityEngine; +using UnityEditor.Build; +using System.Collections.Generic; +using UnityEditor.Compilation; +using System.Reflection; +using System.Linq; +using System; + +[InitializeOnLoad] +public class ES3ScriptingDefineSymbols +{ + static ES3ScriptingDefineSymbols() + { + SetDefineSymbols(); + } + + static void SetDefineSymbols() + { + if (Type.GetType("Unity.VisualScripting.IncludeInSettingsAttribute, Unity.VisualScripting.Core") != null) + SetDefineSymbol("UNITY_VISUAL_SCRIPTING"); + + if (Type.GetType("Ludiq.IncludeInSettingsAttribute, Ludiq.Core.Runtime") != null) + SetDefineSymbol("BOLT_VISUAL_SCRIPTING"); + } + + internal static bool HasDefineSymbol(string symbol) + { +#if UNITY_2021_2_OR_NEWER + foreach (var target in GetAllNamedBuildTargets()) + { + string[] defines; + try + { + PlayerSettings.GetScriptingDefineSymbols(target, out defines); + if (defines.Contains(symbol)) + return true; + } + catch { } + } +#else + string definesString = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + var allDefines = new HashSet(definesString.Split(';')); + if (allDefines.Contains(symbol)) + return true; +#endif + return false; + } + + internal static void SetDefineSymbol(string symbol) + { +#if UNITY_2021_2_OR_NEWER + foreach (var target in GetAllNamedBuildTargets()) + { + string[] defines; + try + { + PlayerSettings.GetScriptingDefineSymbols(target, out defines); + if (!defines.Contains(symbol)) + { + ArrayUtility.Add(ref defines, symbol); + PlayerSettings.SetScriptingDefineSymbols(target, defines); + } + } + catch { } + } +#else + string definesString = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + var allDefines = new HashSet(definesString.Split(';')); + if (!allDefines.Contains(symbol)) + PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, string.Join(";", allDefines.Concat(new string[] { symbol }).ToArray())); +#endif + return; + } + + internal static void RemoveDefineSymbol(string symbol) + { +#if UNITY_2021_2_OR_NEWER + foreach (var target in GetAllNamedBuildTargets()) + { + string[] defines; + try + { + PlayerSettings.GetScriptingDefineSymbols(target, out defines); + ArrayUtility.Remove(ref defines, symbol); + PlayerSettings.SetScriptingDefineSymbols(target, defines); + } + catch { } + } +#else + string definesString = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + definesString.Replace(symbol + ";", ""); // With semicolon + definesString.Replace(symbol, ""); // Without semicolon + PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, definesString); +#endif + return; + } + +#if UNITY_2021_2_OR_NEWER + static List GetAllNamedBuildTargets() + { + var staticFields = typeof(NamedBuildTarget).GetFields(BindingFlags.Public | BindingFlags.Static); + var buildTargets = new List(); + + foreach (var staticField in staticFields) + { + // We exclude 'Unknown' because this can throw errors when used with certain methods. + if (staticField.Name == "Unknown") + continue; + + // A bug at Unity's end means that Stadia can throw an error. + if (staticField.Name == "Stadia") + continue; + + if (staticField.FieldType == typeof(NamedBuildTarget)) + buildTargets.Add((NamedBuildTarget)staticField.GetValue(null)); + } + + return buildTargets; + } +#endif +} diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ScriptingDefineSymbols.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptingDefineSymbols.cs.meta new file mode 100644 index 000000000..7f0d0d42e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ScriptingDefineSymbols.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 69b6276384d46d34fb2705f95689e8cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3ScriptingDefineSymbols.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3SettingsEditor.cs b/Assets/Plugins/Easy Save 3/Editor/ES3SettingsEditor.cs new file mode 100644 index 000000000..9eef456aa --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3SettingsEditor.cs @@ -0,0 +1,56 @@ +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using System; +using System.Collections; +using ES3Internal; + +namespace ES3Editor +{ + public static class ES3SettingsEditor + { + public static void Draw(ES3SerializableSettings settings) + { + var style = EditorStyle.Get; + + settings.location = (ES3.Location)EditorGUILayout.EnumPopup("Location", settings.location); + // If the location is File, show the Directory. + if(settings.location == ES3.Location.File) + settings.directory = (ES3.Directory)EditorGUILayout.EnumPopup("Directory", settings.directory); + + settings.path = EditorGUILayout.TextField("Default File Path", settings.path); + + EditorGUILayout.Space(); + + settings.encryptionType = (ES3.EncryptionType)EditorGUILayout.EnumPopup("Encryption", settings.encryptionType); + settings.encryptionPassword = EditorGUILayout.TextField("Encryption Password", settings.encryptionPassword); + + EditorGUILayout.Space(); + + settings.compressionType = (ES3.CompressionType)EditorGUILayout.EnumPopup("Compression", settings.compressionType); + + EditorGUILayout.Space(); + + settings.saveChildren = EditorGUILayout.Toggle("Save GameObject Children", settings.saveChildren); + + EditorGUILayout.Space(); + + if(settings.showAdvancedSettings = EditorGUILayout.Foldout(settings.showAdvancedSettings, "Advanced Settings")) + { + EditorGUILayout.BeginVertical(style.area); + + settings.format = (ES3.Format)EditorGUILayout.EnumPopup("Format", settings.format); + if (settings.format == ES3.Format.JSON) + settings.prettyPrint = EditorGUILayout.Toggle(new GUIContent("Pretty print JSON"), settings.prettyPrint); + settings.bufferSize = EditorGUILayout.IntField("Buffer Size", settings.bufferSize); + settings.memberReferenceMode = (ES3.ReferenceMode)EditorGUILayout.EnumPopup("Serialise Unity Object fields", settings.memberReferenceMode); + settings.serializationDepthLimit = EditorGUILayout.IntField("Serialisation Depth", settings.serializationDepthLimit); + settings.postprocessRawCachedData = EditorGUILayout.Toggle(new GUIContent("Postprocess raw cached data"), settings.postprocessRawCachedData); + + EditorGUILayout.Space(); + + EditorGUILayout.EndVertical(); + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3SettingsEditor.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3SettingsEditor.cs.meta new file mode 100644 index 000000000..80b947ec3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3SettingsEditor.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 35659b9a083a341d7bee216c4b71f4bc +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3SettingsEditor.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3TypeTemplate.txt b/Assets/Plugins/Easy Save 3/Editor/ES3TypeTemplate.txt new file mode 100644 index 000000000..30c17ba59 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3TypeTemplate.txt @@ -0,0 +1,55 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute([propertyNames])] + public class ES3UserType_[es3TypeSuffix] : ES3Type + { + public static ES3Type Instance = null; + + public ES3UserType_[es3TypeSuffix]() : base(typeof([fullType])){ Instance = this; priority = 1;} + + + public override void Write(object obj, ES3Writer writer) + { + var instance = ([fullType])obj; + [writes] + } + + public override object Read(ES3Reader reader) + { + var instance = new [fullType](); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = ([fullType])obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + [reads] + default: + reader.Skip(); + break; + } + } + } + } + + + public class ES3UserType_[es3TypeSuffix]Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3UserType_[es3TypeSuffix]Array() : base(typeof([fullType][]), ES3UserType_[es3TypeSuffix].Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3TypeTemplate.txt.meta b/Assets/Plugins/Easy Save 3/Editor/ES3TypeTemplate.txt.meta new file mode 100644 index 000000000..a37325f2f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3TypeTemplate.txt.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: e84ec2bd739f543b0a5cd3c13741f744 +timeCreated: 1483718243 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3TypeTemplate.txt + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3Type_MaterialTemplate.txt b/Assets/Plugins/Easy Save 3/Editor/ES3Type_MaterialTemplate.txt new file mode 100644 index 000000000..541952ffc --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3Type_MaterialTemplate.txt @@ -0,0 +1,62 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3UserType_Material : ES3UnityObjectType + { + public static ES3Type Instance = null; + + public ES3UserType_Material() : base(typeof(UnityEngine.Material)){ Instance = this; priority = 1; } + + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Material)obj; + + writer.WriteProperty("shader", instance.shader); + writer.WriteProperty("renderQueue", instance.renderQueue, ES3Type_int.Instance); + writer.WriteProperty("shaderKeywords", instance.shaderKeywords); + writer.WriteProperty("globalIlluminationFlags", instance.globalIlluminationFlags); + [writes] + } + + protected override object ReadUnityObject(ES3Reader reader) + { + var obj = new Material(Shader.Find("Diffuse")); + ReadUnityObject(reader, obj); + return obj; + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Material)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + case "name": + instance.name = reader.Read(ES3Type_string.Instance); + break; + case "shader": + instance.shader = reader.Read(ES3Type_Shader.Instance); + break; + case "renderQueue": + instance.renderQueue = reader.Read(ES3Type_int.Instance); + break; + case "shaderKeywords": + instance.shaderKeywords = reader.Read(); + break; + case "globalIlluminationFlags": + instance.globalIlluminationFlags = reader.Read(); + break; + [reads] + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3Type_MaterialTemplate.txt.meta b/Assets/Plugins/Easy Save 3/Editor/ES3Type_MaterialTemplate.txt.meta new file mode 100644 index 000000000..f4dfab2ee --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3Type_MaterialTemplate.txt.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: f90b0399488ef42e5bc804122fd99c58 +timeCreated: 1483698819 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3Type_MaterialTemplate.txt + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ValueTypeTemplate.txt b/Assets/Plugins/Easy Save 3/Editor/ES3ValueTypeTemplate.txt new file mode 100644 index 000000000..5df924ee6 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ValueTypeTemplate.txt @@ -0,0 +1,49 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute([propertyNames])] + public class ES3UserType_[es3TypeSuffix] : ES3Type + { + public static ES3Type Instance = null; + + public ES3UserType_[es3TypeSuffix]() : base(typeof([fullType])){ Instance = this; priority = 1;} + + + public override void Write(object obj, ES3Writer writer) + { + var instance = ([fullType])obj; + [writes] + } + + public override object Read(ES3Reader reader) + { + var instance = new [fullType](); + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + [reads] + default: + reader.Skip(); + break; + } + } + return instance; + } + } + + + public class ES3UserType_[es3TypeSuffix]Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3UserType_[es3TypeSuffix]Array() : base(typeof([fullType][]), ES3UserType_[es3TypeSuffix].Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3ValueTypeTemplate.txt.meta b/Assets/Plugins/Easy Save 3/Editor/ES3ValueTypeTemplate.txt.meta new file mode 100644 index 000000000..459a15926 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3ValueTypeTemplate.txt.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: f67742ea0c50242f8af16c3f807b723b +timeCreated: 1483718243 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3ValueTypeTemplate.txt + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3Window.cs b/Assets/Plugins/Easy Save 3/Editor/ES3Window.cs new file mode 100644 index 000000000..98d6aca65 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3Window.cs @@ -0,0 +1,238 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; + +namespace ES3Editor +{ + public class ES3Window : EditorWindow + { + private SubWindow[] windows = null; + + public SubWindow currentWindow; + + [MenuItem("Window/Easy Save 3", false, 1000)] + [MenuItem("Assets/Easy Save 3/Open Easy Save 3 Window", false, 1000)] + public static void Init() + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if(window != null) + window.Show(); + } + + public static void InitAndShowHome() + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if (window != null) + { + window.Show(); + window.SetCurrentWindow(typeof(HomeWindow)); + } + } + + [MenuItem("Tools/Easy Save 3/Auto Save", false, 100)] + public static void InitAndShowAutoSave() + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if (window != null) + { + window.Show(); + window.SetCurrentWindow(typeof(AutoSaveWindow)); + } + } + + public static void InitAndShowReferences() + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if (window != null) + { + window.Show(); + window.SetCurrentWindow(typeof(ReferencesWindow)); + } + } + + [MenuItem("Tools/Easy Save 3/Types", false, 100)] + public static void InitAndShowTypes() + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if (window != null) + { + window.Show(); + window.SetCurrentWindow(typeof(TypesWindow)); + } + } + + public static void InitAndShowTypes(System.Type type) + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if (window != null) + { + window.Show(); + var typesWindow = (TypesWindow)window.SetCurrentWindow(typeof(TypesWindow)); + typesWindow.SelectType(type); + } + } + + [MenuItem("Tools/Easy Save 3/Settings", false, 100)] + public static void InitAndShowSettings() + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if (window != null) + { + window.Show(); + window.SetCurrentWindow(typeof(SettingsWindow)); + } + } + + [MenuItem("Tools/Easy Save 3/Tools", false, 100)] + public static void InitAndShowTools() + { + // Get existing open window or if none, make a new one: + ES3Window window = (ES3Window)EditorWindow.GetWindow(typeof(ES3Window)); + if (window != null) + { + window.Show(); + window.SetCurrentWindow(typeof(ToolsWindow)); + } + } + + public void InitSubWindows() + { + windows = new SubWindow[]{ + new HomeWindow(this), + new SettingsWindow(this), + new ToolsWindow(this), + new TypesWindow(this), + new AutoSaveWindow(this) + //, new ReferencesWindow(this) + }; + } + + void OnLostFocus() + { + if(currentWindow != null) + currentWindow.OnLostFocus(); + } + + private void OnFocus() + { + if (currentWindow != null) + currentWindow.OnFocus(); + } + + void OnDestroy() + { + if(currentWindow != null) + currentWindow.OnDestroy(); + } + + void OnEnable() + { + if(windows == null) + InitSubWindows(); + // Set the window name and icon. + var icon = AssetDatabase.LoadAssetAtPath(ES3Settings.PathToEasySaveFolder()+"Editor/es3Logo16x16.png"); + titleContent = new GUIContent("Easy Save", icon); + + // Get the last opened window and open it. + if(currentWindow == null) + { + var currentWindowName = EditorPrefs.GetString("ES3Editor.Window.currentWindow", windows[0].name); + for(int i=0; i w.GetType() == type); + EditorPrefs.SetString("ES3Editor.Window.currentWindow", currentWindow.name); + return currentWindow; + } + + // Shows the Easy Save Home window if it's not been disabled. + // This method is called from the Postprocessor. + public static void OpenEditorWindowOnStart() + { + if(EditorPrefs.GetBool("Show ES3 Window on Start", true)) + ES3Window.InitAndShowHome(); + EditorPrefs.SetBool("Show ES3 Window on Start", false); + } + } + + public abstract class SubWindow + { + public string name; + public EditorWindow parent; + public abstract void OnGUI(); + + public SubWindow(string name, EditorWindow parent) + { + this.name = name; + this.parent = parent; + } + + public virtual void OnLostFocus() + { + } + + public virtual void OnFocus() + { + } + + public virtual void OnDestroy() + { + } + + public virtual void OnHierarchyChange() + { + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3Window.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ES3Window.cs.meta new file mode 100644 index 000000000..40c6b61c4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ES3Window.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: a95d98897f1cf4e7288b53b0fd8036c1 +timeCreated: 1519132293 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ES3Window.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/EasySave3.asmdef.disabled b/Assets/Plugins/Easy Save 3/Editor/EasySave3.asmdef.disabled new file mode 100644 index 000000000..b50911df2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/EasySave3.asmdef.disabled @@ -0,0 +1,16 @@ +{ + "name": "EasySave3", + "rootNamespace": "", + "references": [ + "Unity.VisualScripting.Core" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/EasySave3.asmdef.disabled.meta b/Assets/Plugins/Easy Save 3/Editor/EasySave3.asmdef.disabled.meta new file mode 100644 index 000000000..cfca9671f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/EasySave3.asmdef.disabled.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 6eac6c06328c1ab4dacdf5d40907da6b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/EasySave3.asmdef.disabled + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/EasySave3Editor.asmdef.disabled b/Assets/Plugins/Easy Save 3/Editor/EasySave3Editor.asmdef.disabled new file mode 100644 index 000000000..08e43c162 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/EasySave3Editor.asmdef.disabled @@ -0,0 +1,18 @@ +{ + "name": "EasySave3Editor", + "rootNamespace": "", + "references": [ + "EasySave3" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Editor/EasySave3Editor.asmdef.disabled.meta b/Assets/Plugins/Easy Save 3/Editor/EasySave3Editor.asmdef.disabled.meta new file mode 100644 index 000000000..da7c1710a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/EasySave3Editor.asmdef.disabled.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 5c64090e866862f449075dc1f3e5ab06 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/EasySave3Editor.asmdef.disabled + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/EnableES3AssemblyDefinitions.cs b/Assets/Plugins/Easy Save 3/Editor/EnableES3AssemblyDefinitions.cs new file mode 100644 index 000000000..e6be74762 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/EnableES3AssemblyDefinitions.cs @@ -0,0 +1,23 @@ +using UnityEditor; +using System.IO; + +public class EnableES3AssemblyDefinitions : Editor +{ + [MenuItem("Tools/Easy Save 3/Enable Assembly Definition Files", false, 150)] + public static void EnableAsmDef() + { + var pathToEasySaveFolder = ES3Settings.PathToEasySaveFolder(); + File.Delete(pathToEasySaveFolder + "Editor/EasySave3.asmdef.disabled.meta"); + File.Delete(pathToEasySaveFolder + "Editor/EasySave3Editor.asmdef.disabled.meta"); + File.Move(pathToEasySaveFolder + "Editor/EasySave3Editor.asmdef.disabled", pathToEasySaveFolder + "Editor/EasySave3Editor.asmdef"); + File.Move(pathToEasySaveFolder + "Editor/EasySave3.asmdef.disabled", pathToEasySaveFolder + "EasySave3.asmdef"); + AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); + EditorUtility.DisplayDialog("Assembly definition files installed", "Assembly definition files for Easy Save 3 installed.\n\nYou may need to go to 'Assets > Reimport' to apply the changes.", "Done"); + } + + [MenuItem("Tools/Easy Save 3/Enable Assembly Definition Files", true, 150)] + public static bool CanEnableAsmDef() + { + return !File.Exists(ES3Settings.PathToEasySaveFolder() + "EasySave3.asmdef"); + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/EnableES3AssemblyDefinitions.cs.meta b/Assets/Plugins/Easy Save 3/Editor/EnableES3AssemblyDefinitions.cs.meta new file mode 100644 index 000000000..5edb52be7 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/EnableES3AssemblyDefinitions.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f53975dae5ac26947856dd0b0bd3be7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/EnableES3AssemblyDefinitions.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/HomeWindow.cs b/Assets/Plugins/Easy Save 3/Editor/HomeWindow.cs new file mode 100644 index 000000000..5e860542d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/HomeWindow.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace ES3Editor +{ + public class HomeWindow : SubWindow + { + Vector2 scrollPos = Vector2.zero; + + public HomeWindow(EditorWindow window) : base("Home", window){} + + public override void OnGUI() + { + + var style = EditorStyle.Get; + + scrollPos = EditorGUILayout.BeginScrollView(scrollPos); + + EditorGUILayout.BeginVertical(style.area); + + GUILayout.Label("Welcome to Easy Save", style.heading); + + EditorGUILayout.BeginVertical(style.area); + GUILayout.Label("New To Easy Save?", style.subheading); + EditorGUILayout.BeginVertical(style.area); + ES3EditorUtility.DisplayLink("• See our Getting Started guide", "http://docs.moodkie.com/easy-save-3/getting-started/"); + EditorGUILayout.EndVertical(); + + GUILayout.Label("Support", style.subheading); + + EditorGUILayout.BeginVertical(style.area); + + ES3EditorUtility.DisplayLink("• Contact us directly", "http://www.moodkie.com/contact/"); + ES3EditorUtility.DisplayLink("• Ask a question in our Easy Save 3 forums", "http://moodkie.com/forum/viewforum.php?f=12"); + ES3EditorUtility.DisplayLink("• Ask a question in the Unity Forum thread","https://forum.unity3d.com/threads/easy-save-the-complete-save-load-asset-for-unity.91040/"); + EditorGUILayout.EndVertical(); + + GUILayout.Label("Documentation and Guides", style.subheading); + + EditorGUILayout.BeginVertical(style.area); + + ES3EditorUtility.DisplayLink("• Documentation", "http://docs.moodkie.com/product/easy-save-3/"); + ES3EditorUtility.DisplayLink("• Guides", "http://docs.moodkie.com/product/easy-save-3/es3-guides/"); + ES3EditorUtility.DisplayLink("• API Scripting Reference", "http://docs.moodkie.com/product/easy-save-3/es3-api/"); + ES3EditorUtility.DisplayLink("• Supported Types", "http://docs.moodkie.com/easy-save-3/es3-supported-types/"); + + + EditorGUILayout.EndVertical(); + + GUILayout.Label("PlayMaker Documentation", style.subheading); + + EditorGUILayout.BeginVertical(style.area); + + ES3EditorUtility.DisplayLink("• Actions", "http://docs.moodkie.com/product/easy-save-3/es3-playmaker/es3-playmaker-actions/"); + ES3EditorUtility.DisplayLink("• Actions Overview", "http://docs.moodkie.com/easy-save-3/es3-playmaker/playmaker-actions-overview/"); + + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndScrollView(); + + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/HomeWindow.cs.meta b/Assets/Plugins/Easy Save 3/Editor/HomeWindow.cs.meta new file mode 100644 index 000000000..5acabc3b9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/HomeWindow.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 394cc2e77038849709526f44f7efdd22 +timeCreated: 1519132283 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/HomeWindow.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ReferencesWindow.cs b/Assets/Plugins/Easy Save 3/Editor/ReferencesWindow.cs new file mode 100644 index 000000000..57c4441bf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ReferencesWindow.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ES3Internal; + +namespace ES3Editor +{ + public class ReferencesWindow : SubWindow + { + + + public ReferencesWindow(EditorWindow window) : base("References", window){} + + public override void OnGUI() + { + + } + } + +} diff --git a/Assets/Plugins/Easy Save 3/Editor/ReferencesWindow.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ReferencesWindow.cs.meta new file mode 100644 index 000000000..805aa4c03 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ReferencesWindow.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: af2d805793e784eef87fbcdebb11fa35 +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ReferencesWindow.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/SettingsWindow.cs b/Assets/Plugins/Easy Save 3/Editor/SettingsWindow.cs new file mode 100644 index 000000000..f17399704 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/SettingsWindow.cs @@ -0,0 +1,179 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ES3Internal; + +namespace ES3Editor +{ + public class SettingsWindow : SubWindow + { + public ES3Defaults editorSettings = null; + public ES3SerializableSettings settings = null; + public SerializedObject so = null; + public SerializedProperty referenceFoldersProperty = null; + + Vector2 scrollPos = Vector2.zero; + const string disableGlobalDefineName = "ES3GLOBAL_DISABLED"; + + public SettingsWindow(EditorWindow window) : base("Settings", window){} + + public void OnEnable() + { + + } + + public override void OnGUI() + { + if(settings == null || editorSettings == null) + Init(); + + var style = EditorStyle.Get; + + var labelWidth = EditorGUIUtility.labelWidth; + + + EditorGUI.BeginChangeCheck(); + + using (var scrollView = new EditorGUILayout.ScrollViewScope(scrollPos, style.area)) + { + scrollPos = scrollView.scrollPosition; + + EditorGUIUtility.labelWidth = 160; + + GUILayout.Label("Runtime Settings", style.heading); + + using (new EditorGUILayout.VerticalScope(style.area)) + { + ES3SettingsEditor.Draw(settings); + } + + GUILayout.Label("Debug Settings", style.heading); + + using (new EditorGUILayout.VerticalScope(style.area)) + { + EditorGUIUtility.labelWidth = 100; + + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.PrefixLabel("Log Info"); + editorSettings.logDebugInfo = EditorGUILayout.Toggle(editorSettings.logDebugInfo); + } + + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.PrefixLabel("Log Warnings"); + editorSettings.logWarnings = EditorGUILayout.Toggle(editorSettings.logWarnings); + } + + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.PrefixLabel("Log Errors"); + editorSettings.logErrors = EditorGUILayout.Toggle(editorSettings.logErrors); + } + + EditorGUILayout.Space(); + } + + GUILayout.Label("Editor Settings", style.heading); + + using (new EditorGUILayout.VerticalScope(style.area)) + { + EditorGUIUtility.labelWidth = 170; + + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.PrefixLabel("Auto Update References"); + editorSettings.autoUpdateReferences = EditorGUILayout.Toggle(editorSettings.autoUpdateReferences); + } + + if (editorSettings.autoUpdateReferences) + { + using (new EditorGUILayout.HorizontalScope()) + { + var content = new GUIContent("-- When changes are made", "Should Easy Save update the reference manager when objects in your scene changes?"); + editorSettings.updateReferencesWhenSceneChanges = EditorGUILayout.Toggle(content, editorSettings.updateReferencesWhenSceneChanges); + } + + using (new EditorGUILayout.HorizontalScope()) + { + var content = new GUIContent("-- When scene is saved", "Should Easy Save update the reference manager when objects in your scene is saved?"); + editorSettings.updateReferencesWhenSceneIsSaved = EditorGUILayout.Toggle(content, editorSettings.updateReferencesWhenSceneIsSaved); + } + + using (new EditorGUILayout.HorizontalScope()) + { + var content = new GUIContent("-- When scene is opened", "Should Easy Save update the reference manager you open a scene in the Editor?"); + editorSettings.updateReferencesWhenSceneIsOpened = EditorGUILayout.Toggle(content, editorSettings.updateReferencesWhenSceneIsOpened); + } + EditorGUILayout.Space(); + } + + using (new EditorGUILayout.HorizontalScope()) + { + so.Update(); + EditorGUILayout.PropertyField(referenceFoldersProperty, true); + so.ApplyModifiedProperties(); + } + EditorGUILayout.Space(); + + /*using (new EditorGUILayout.HorizontalScope()) + { + var content = new GUIContent("Reference depth", "How deep should Easy Save look when gathering references from an object? Higher means deeper."); + EditorGUILayout.PrefixLabel(content); + editorSettings.collectDependenciesDepth = EditorGUILayout.IntField(editorSettings.collectDependenciesDepth); + }*/ + + using (new EditorGUILayout.HorizontalScope()) + { + var content = new GUIContent("Reference timeout (seconds)", "How many seconds should Easy Save taking collecting references for an object before timing out?"); + EditorGUILayout.PrefixLabel(content); + editorSettings.collectDependenciesTimeout = EditorGUILayout.IntField(editorSettings.collectDependenciesTimeout); + } + + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.PrefixLabel("Use Global References"); + + bool useGlobalReferences = ES3ScriptingDefineSymbols.HasDefineSymbol(disableGlobalDefineName); + if(EditorGUILayout.Toggle(useGlobalReferences) != useGlobalReferences) + { + // If global references is currently enabled, we want to disable it. + if (useGlobalReferences) + { + ES3ScriptingDefineSymbols.RemoveDefineSymbol(disableGlobalDefineName); + EditorUtility.DisplayDialog("Global references disabled for build platform", "This will only disable Global References for this build platform. To disable it for other build platforms, open that platform in the Build Settings and uncheck this box again.", "Ok"); + } + // Else we want to enable it. + else + ES3ScriptingDefineSymbols.SetDefineSymbol(disableGlobalDefineName); + } + } + + using (new EditorGUILayout.HorizontalScope()) + { + var content = new GUIContent("Add All Prefabs to Manager", "Should all prefabs with ES3Prefab Components be added to the manager?"); + EditorGUILayout.PrefixLabel(content); + editorSettings.addAllPrefabsToManager = EditorGUILayout.Toggle(editorSettings.addAllPrefabsToManager); + } + + EditorGUILayout.Space(); + } + } + + if (EditorGUI.EndChangeCheck()) + EditorUtility.SetDirty(editorSettings); + + EditorGUIUtility.labelWidth = labelWidth; // Set the label width back to default + } + + public void Init() + { + editorSettings = ES3Settings.defaultSettingsScriptableObject; + settings = editorSettings.settings; + so = new SerializedObject(editorSettings); + referenceFoldersProperty = so.FindProperty("referenceFolders"); + } + } + +} diff --git a/Assets/Plugins/Easy Save 3/Editor/SettingsWindow.cs.meta b/Assets/Plugins/Easy Save 3/Editor/SettingsWindow.cs.meta new file mode 100644 index 000000000..668139e40 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/SettingsWindow.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 95e7bbc9a5aee44feb088811fb5e7b80 +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/SettingsWindow.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/ToolsWindow.cs b/Assets/Plugins/Easy Save 3/Editor/ToolsWindow.cs new file mode 100644 index 000000000..4518e3755 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ToolsWindow.cs @@ -0,0 +1,155 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.IO; + +namespace ES3Editor +{ + public class ToolsWindow : SubWindow + { + public ToolsWindow(EditorWindow window) : base("Tools", window){} + + public override void OnGUI() + { + var style = EditorStyle.Get; + + EditorGUILayout.BeginHorizontal(style.area); + + if (GUILayout.Button("Open Persistent Data Path")) + OpenPersistentDataPath(); + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(style.area); + + if (GUILayout.Button("Clear Persistent Data Path")) + ClearPersistentDataPath(); + + if (GUILayout.Button("Clear PlayerPrefs")) + ClearPlayerPrefs(); + + EditorGUILayout.EndHorizontal(); + } + + [MenuItem("Tools/Easy Save 3/Open Persistent Data Path", false, 200)] + private static void OpenPersistentDataPath() + { + EditorUtility.RevealInFinder(Application.persistentDataPath); + } + + [MenuItem("Tools/Easy Save 3/Clear Persistent Data Path", false, 200)] + private static void ClearPersistentDataPath() + { + if (EditorUtility.DisplayDialog("Clear Persistent Data Path", "Are you sure you wish to clear the persistent data path?\n This action cannot be reversed.", "Clear", "Cancel")) + { + System.IO.DirectoryInfo di = new DirectoryInfo(Application.persistentDataPath); + + foreach (FileInfo file in di.GetFiles()) + file.Delete(); + foreach (DirectoryInfo dir in di.GetDirectories()) + dir.Delete(true); + } + } + + [MenuItem("Tools/Easy Save 3/Clear PlayerPrefs", false, 200)] + private static void ClearPlayerPrefs() + { + if (EditorUtility.DisplayDialog("Clear PlayerPrefs", "Are you sure you wish to clear PlayerPrefs?\nThis action cannot be reversed.", "Clear", "Cancel")) + PlayerPrefs.DeleteAll(); + } + } + + /*public static class OSFileBrowser + { + public static bool IsInMacOS + { + get + { + return UnityEngine.SystemInfo.operatingSystem.IndexOf("Mac OS") != -1; + } + } + + public static bool IsInWinOS + { + get + { + return UnityEngine.SystemInfo.operatingSystem.IndexOf("Windows") != -1; + } + } + + public static void OpenInMac(string path) + { + bool openInsidesOfFolder = false; + + // try mac + string macPath = path.Replace("\\", "/"); // mac finder doesn't like backward slashes + + if ( System.IO.Directory.Exists(macPath) ) // if path requested is a folder, automatically open insides of that folder + { + openInsidesOfFolder = true; + } + + if ( !macPath.StartsWith("\"") ) + { + macPath = "\"" + macPath; + } + + if ( !macPath.EndsWith("\"") ) + { + macPath = macPath + "\""; + } + + string arguments = (openInsidesOfFolder ? "" : "-R ") + macPath; + + try + { + System.Diagnostics.Process.Start("open", arguments); + } + catch ( System.ComponentModel.Win32Exception e ) + { + // tried to open mac finder in windows + // just silently skip error + // we currently have no platform define for the current OS we are in, so we resort to this + e.HelpLink = ""; // do anything with this variable to silence warning about not using it + } + } + + public static void OpenInWin(string path) + { + bool openInsidesOfFolder = false; + + // try windows + string winPath = path.Replace("/", "\\"); // windows explorer doesn't like forward slashes + + if ( System.IO.Directory.Exists(winPath) ) // if path requested is a folder, automatically open insides of that folder + openInsidesOfFolder = true; + + try + { + System.Diagnostics.Process.Start("explorer.exe", (openInsidesOfFolder ? "/root," : "/select,") + "\"" + winPath + "\""); + } + catch ( System.ComponentModel.Win32Exception e ) + { + e.HelpLink = ""; + } + } + + public static void Open(string path) + { + if ( IsInWinOS ) + { + OpenInWin(path); + } + else if ( IsInMacOS ) + { + OpenInMac(path); + } + else // couldn't determine OS + { + OpenInWin(path); + OpenInMac(path); + } + } + }*/ +} diff --git a/Assets/Plugins/Easy Save 3/Editor/ToolsWindow.cs.meta b/Assets/Plugins/Easy Save 3/Editor/ToolsWindow.cs.meta new file mode 100644 index 000000000..ef3897eac --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/ToolsWindow.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0d6114c1d40624e9e8575e814c45ac1a +timeCreated: 1519132280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/ToolsWindow.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/TypesWindow.cs b/Assets/Plugins/Easy Save 3/Editor/TypesWindow.cs new file mode 100644 index 000000000..9a548b9b0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/TypesWindow.cs @@ -0,0 +1,728 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System; +using System.Reflection; +using System.Linq; +using ES3Types; +using System.IO; +using ES3Internal; +using System.Text.RegularExpressions; + +namespace ES3Editor +{ + public class TypesWindow : SubWindow + { + TypeListItem[] types = null; + const int recentTypeCount = 5; + List recentTypes = null; + + Vector2 typeListScrollPos = Vector2.zero; + Vector2 typePaneScrollPos = Vector2.zero; + int leftPaneWidth = 300; + + string searchFieldValue = ""; + + int selectedType = -1; + private ES3Reflection.ES3ReflectedMember[] fields = new ES3Reflection.ES3ReflectedMember[0]; + private bool[] fieldSelected = new bool[0]; + + private Texture2D checkmark; + //private Texture2D checkmarkSmall; + + private GUIStyle searchBarStyle; + private GUIStyle searchBarCancelButtonStyle; + private GUIStyle leftPaneStyle; + private GUIStyle typeButtonStyle; + private GUIStyle selectedTypeButtonStyle; + private GUIStyle selectAllNoneButtonStyle; + + private string valueTemplateFile; + private string classTemplateFile; + private string componentTemplateFile; + private string scriptableObjectTemplateFile; + + private bool unsavedChanges = false; + + public TypesWindow(EditorWindow window) : base("Types", window){} + + public override void OnGUI() + { + if(types == null) + Init(); + + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.BeginVertical(leftPaneStyle); + SearchBar(); + TypeList(); + EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(); + TypePane(); + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndHorizontal(); + } + + private void SearchBar() + { + var style = EditorStyle.Get; + + GUILayout.Label("Enter a type name in the field below\n* Type names are case-sensitive *", style.subheading2); + + EditorGUILayout.BeginHorizontal(); + + // Set control name so we can force a Focus reset for it. + string currentSearchFieldValue = EditorGUILayout.TextField(searchFieldValue, searchBarStyle); + + if(searchFieldValue != currentSearchFieldValue) + { + searchFieldValue = currentSearchFieldValue; + PerformSearch(currentSearchFieldValue); + } + + GUI.SetNextControlName("Clear"); + + if(GUILayout.Button("x", searchBarCancelButtonStyle)) + { + searchFieldValue = ""; + GUI.FocusControl("Clear"); + PerformSearch(""); + } + + EditorGUILayout.EndHorizontal(); + } + + private void RecentTypeList() + { + if(!string.IsNullOrEmpty(searchFieldValue) || recentTypes.Count == 0) + return; + + for(int i=recentTypes.Count-1; i>-1; i--) + TypeButton(recentTypes[i]); + + EditorGUILayout.TextArea("",GUI.skin.horizontalSlider); + + } + + private void TypeList() + { + if(!string.IsNullOrEmpty(searchFieldValue)) + GUILayout.Label("Search Results", EditorStyles.boldLabel); + + typeListScrollPos = EditorGUILayout.BeginScrollView(typeListScrollPos); + + RecentTypeList(); + + if(!string.IsNullOrEmpty(searchFieldValue)) + for(int i = 0; i < types.Length; i++) + TypeButton(i); + + EditorGUILayout.EndScrollView(); + } + + private void TypePane() + { + if(selectedType < 0) + return; + + var style = EditorStyle.Get; + + var typeListItem = types[selectedType]; + var type = typeListItem.type; + + typePaneScrollPos = EditorGUILayout.BeginScrollView(typePaneScrollPos, style.area); + + GUILayout.Label(typeListItem.name, style.subheading); + GUILayout.Label(typeListItem.namespaceName); + + EditorGUILayout.BeginVertical(style.area); + + bool hasParameterlessConstructor = ES3Reflection.HasParameterlessConstructor(type); + bool isComponent = ES3Reflection.IsAssignableFrom(typeof(Component), type); + + string path = GetOutputPath(types[selectedType].type); + // An ES3Type file already exists. + if(File.Exists(path)) + { + if(hasParameterlessConstructor || isComponent) + { + EditorGUILayout.BeginHorizontal(); + if(GUILayout.Button("Reset to Default")) + { + SelectNone(true, true); + AssetDatabase.MoveAssetToTrash("Assets" + path.Remove(0, Application.dataPath.Length)); + SelectType(selectedType); + } + if(GUILayout.Button("Edit ES3Type Script")) + AssetDatabase.OpenAsset(AssetDatabase.LoadMainAssetAtPath("Assets" + path.Remove(0, Application.dataPath.Length))); + EditorGUILayout.EndHorizontal(); + } + else + { + EditorGUILayout.HelpBox("This type has no public parameterless constructors.\n\nTo support this type you will need to modify the ES3Type script to use a specific constructor instead of the parameterless constructor.", MessageType.Info); + if(GUILayout.Button("Click here to edit the ES3Type script")) + AssetDatabase.OpenAsset(AssetDatabase.LoadMainAssetAtPath("Assets" + path.Remove(0, Application.dataPath.Length))); + if (GUILayout.Button("Reset to Default")) + { + SelectAll(true, true); + File.Delete(path); + AssetDatabase.Refresh(); + } + } + } + // No ES3Type file and no fields. + else if(fields.Length == 0) + { + if(!hasParameterlessConstructor && !isComponent) + EditorGUILayout.HelpBox("This type has no public parameterless constructors.\n\nTo support this type you will need to create an ES3Type script and modify it to use a specific constructor instead of the parameterless constructor.", MessageType.Info); + + if(GUILayout.Button("Create ES3Type Script")) + Generate(); + } + // No ES3Type file, but fields are selectable. + else + { + if(!hasParameterlessConstructor && !isComponent) + { + EditorGUILayout.HelpBox("This type has no public parameterless constructors.\n\nTo support this type you will need to select the fields you wish to serialize below, and then modify the generated ES3Type script to use a specific constructor instead of the parameterless constructor.", MessageType.Info); + if(GUILayout.Button("Select all fields and generate ES3Type script")) + { + SelectAll(true, false); + Generate(); + } + } + else + { + if(GUILayout.Button("Create ES3Type Script")) + Generate(); + } + } + + EditorGUILayout.EndVertical(); + + PropertyPane(); + + EditorGUILayout.EndScrollView(); + } + + private void PropertyPane() + { + var style = EditorStyle.Get; + + EditorGUILayout.BeginVertical(style.area); + + GUILayout.Label("Fields", EditorStyles.boldLabel); + + DisplayFieldsOrProperties(true, false); + EditorGUILayout.Space(); + + GUILayout.Label("Properties", EditorStyles.boldLabel); + + DisplayFieldsOrProperties(false, true); + EditorGUILayout.EndVertical(); + } + + private void DisplayFieldsOrProperties(bool showFields, bool showProperties) + { + // Get field and property counts. + int fieldCount = 0; + int propertyCount = 0; + for(int i=0; i 0 || propertyCount > 0) + { + EditorGUILayout.BeginHorizontal(); + + if(GUILayout.Button("Select All", selectAllNoneButtonStyle)) + { + SelectAll(showFields, showProperties); + Generate(); + } + + if(GUILayout.Button("Select None", selectAllNoneButtonStyle)) + { + SelectNone(showFields, showProperties); + Generate(); + } + EditorGUILayout.EndHorizontal(); + } + + for(int i=0; i item.Name == fields[i].Name); + return; + } + + // Get fields and whether they're selected. + var selectedFields = new List(); + var propertyAttributes = es3Type.GetType().GetCustomAttributes(typeof(ES3PropertiesAttribute), false); + if(propertyAttributes.Length > 0) + selectedFields.AddRange(((ES3PropertiesAttribute)propertyAttributes[0]).members); + + fieldSelected = new bool[fields.Length]; + + for(int i=0; i (); + + var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(assembly => !assembly.FullName.Contains("Editor") && assembly.FullName != "ES3" && !assembly.FullName.Contains("ES3")).OrderBy(assembly => assembly.GetName().Name).ToArray(); + + foreach (var assembly in assemblies) + { + var assemblyTypes = assembly.GetTypes(); + + for(int i = 0; i < assemblyTypes.Length; i++) + { + var type = assemblyTypes [i]; + if(type.IsGenericType || type.IsEnum || type.IsNotPublic || type.IsAbstract || type.IsInterface) + continue; + + var typeName = type.Name; + if(typeName [0] == '$' || typeName [0] == '_' || typeName [0] == '<') + continue; + + var typeNamespace = type.Namespace; + var namespaceName = typeNamespace == null ? "" : typeNamespace.ToString(); + + tempTypes.Add(new TypeListItem (type.Name, namespaceName, type, true, HasExplicitES3Type(type))); + } + + } + types = tempTypes.OrderBy(type => type.name).ToArray(); + + // Load types and recent types. + if (recentTypes == null) + { + recentTypes = new List(); + for (int i = 0; i < recentTypeCount; i++) + { + int typeIndex = LoadTypeIndex("TypesWindowRecentType" + i); + if (typeIndex != -1) + recentTypes.Add(typeIndex); + } + SelectType(LoadTypeIndex("TypesWindowSelectedType")); + } + + + PerformSearch(searchFieldValue); + + // Init Assets. + string es3FolderPath = ES3Settings.PathToEasySaveFolder(); + checkmark = AssetDatabase.LoadAssetAtPath(es3FolderPath + "Editor/checkmark.png"); + //checkmarkSmall = AssetDatabase.LoadAssetAtPath(es3FolderPath + "Editor/checkmarkSmall.png"); + + // Init Styles. + searchBarCancelButtonStyle = new GUIStyle(EditorStyles.miniButton); + var cancelButtonSize = EditorStyles.miniTextField.CalcHeight(new GUIContent(""), 20); + searchBarCancelButtonStyle.fixedWidth = cancelButtonSize; + searchBarCancelButtonStyle.fixedHeight = cancelButtonSize; + searchBarCancelButtonStyle.fontSize = 8; + searchBarCancelButtonStyle.padding = new RectOffset(); + searchBarStyle = new GUIStyle(EditorStyles.toolbarTextField); + searchBarStyle.stretchWidth = true; + + typeButtonStyle = new GUIStyle(EditorStyles.largeLabel); + typeButtonStyle.alignment = TextAnchor.MiddleLeft; + typeButtonStyle.stretchWidth = false; + selectedTypeButtonStyle = new GUIStyle(typeButtonStyle); + selectedTypeButtonStyle.fontStyle = FontStyle.Bold; + + leftPaneStyle = new GUIStyle(); + leftPaneStyle.fixedWidth = leftPaneWidth; + leftPaneStyle.clipping = TextClipping.Clip; + leftPaneStyle.padding = new RectOffset(10, 10, 10, 10); + + selectAllNoneButtonStyle = new GUIStyle(EditorStyles.miniButton); + selectAllNoneButtonStyle.stretchWidth = false; + selectAllNoneButtonStyle.margin = new RectOffset(0,0,0,10); + } + + private void Generate() + { + var type = types[selectedType].type; + if(type == null) + { + EditorUtility.DisplayDialog("Type not selected", "Type not selected. Please ensure you select a type", "Ok"); + return; + } + + unsavedChanges = false; + + // Get the serializable fields of this class. + //var fields = ES3Reflection.GetSerializableES3Fields(type); + + // The string that we suffix to the class name. i.e. UnityEngine_UnityEngine_Transform. + string es3TypeSuffix = type.Name; + // The string for the full C#-safe type name. This name must be suitable for going inside typeof(). + string fullType = GetFullTypeName(type); + // The list of WriteProperty calls to write the properties of this type. + string writes = GenerateWrites(); + // The list of case statements and Read calls to read the properties of this type. + string reads = GenerateReads(); + // A comma-seperated string of fields we've supported in this type. + string propertyNames = ""; + + bool first = true; + for(int i=0; i(), instance);\r\n\t\t\t\t\tbreak;", field.Name, fieldTypeName); + else + reads += String.Format("\r\n\t\t\t\t\tcase \"{0}\":\r\n\t\t\t\t\tinstance = ([fullType])reader.SetPrivateField(\"{0}\", reader.Read<{1}>(), instance);\r\n\t\t\t\t\tbreak;", field.Name, fieldTypeName); + } + else + reads += String.Format("\r\n\t\t\t\t\tcase \"{0}\":\r\n\t\t\t\t\t\t{3}.{0} = reader.Read<{1}>({2});\r\n\t\t\t\t\t\tbreak;", field.Name, fieldTypeName, es3TypeParam, instance); + } + return reads; + } + + private string GetOutputPath(Type type) + { + return Application.dataPath + "/Easy Save 3/Types/ES3UserType_"+type.Name+".cs"; + } + + /* Gets the full Type name, replacing any syntax (such as '+') with a dot to make it a valid type name */ + private static string GetFullTypeName(Type type) + { + string typeName = type.ToString(); + + typeName = typeName.Replace('+','.'); + + // If it's a generic type, replace syntax with angled brackets. + int genericArgumentCount = type.GetGenericArguments().Length; + if(genericArgumentCount > 0) + { + return string.Format("{0}<{1}>", type.ToString().Split('`')[0], string.Join(", ", type.GetGenericArguments().Select(x => GetFullTypeName(x)).ToArray())); + } + + return typeName; + } + + /* Whether this type has an explicit ES3Type. For example, ES3ArrayType would return false, but ES3Vector3ArrayType would return true */ + private static bool HasExplicitES3Type(Type type) + { + var es3Type = ES3TypeMgr.GetES3Type(type); + if(es3Type == null) + return false; + // If this ES3Type has a static Instance property, return true. + if(es3Type.GetType().GetField("Instance", BindingFlags.Public | BindingFlags.Static) != null) + return true; + return false; + } + + private static bool HasExplicitES3Type(ES3Type es3Type) + { + if(es3Type == null) + return false; + // If this ES3Type has a static Instance property, return true. + if(es3Type.GetType().GetField("Instance", BindingFlags.Public | BindingFlags.Static) != null) + return true; + return false; + } + + public class TypeListItem + { + public string name; + public string lowercaseName; + public string namespaceName; + public Type type; + public bool showInList; + public bool hasExplicitES3Type; + + public TypeListItem(string name, string namespaceName, Type type, bool showInList, bool hasExplicitES3Type) + { + this.name = name; + this.lowercaseName = name.ToLowerInvariant(); + this.namespaceName = namespaceName; + this.type = type; + this.showInList = showInList; + this.hasExplicitES3Type = hasExplicitES3Type; + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Editor/TypesWindow.cs.meta b/Assets/Plugins/Easy Save 3/Editor/TypesWindow.cs.meta new file mode 100644 index 000000000..f77a7dad8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/TypesWindow.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 600b987de172f4a82b182077ceb7fffa +timeCreated: 1519132286 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/TypesWindow.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/checkmark.png b/Assets/Plugins/Easy Save 3/Editor/checkmark.png new file mode 100644 index 000000000..cda4c8ddf Binary files /dev/null and b/Assets/Plugins/Easy Save 3/Editor/checkmark.png differ diff --git a/Assets/Plugins/Easy Save 3/Editor/checkmark.png.meta b/Assets/Plugins/Easy Save 3/Editor/checkmark.png.meta new file mode 100644 index 000000000..b3caf5d84 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/checkmark.png.meta @@ -0,0 +1,131 @@ +fileFormatVersion: 2 +guid: 9d92f481545af4a45b06e8fe44778d93 +timeCreated: 1484046036 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Tizen + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Samsung TV + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/checkmark.png + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/checkmarkSmall.png b/Assets/Plugins/Easy Save 3/Editor/checkmarkSmall.png new file mode 100644 index 000000000..46c3c1ff4 Binary files /dev/null and b/Assets/Plugins/Easy Save 3/Editor/checkmarkSmall.png differ diff --git a/Assets/Plugins/Easy Save 3/Editor/checkmarkSmall.png.meta b/Assets/Plugins/Easy Save 3/Editor/checkmarkSmall.png.meta new file mode 100644 index 000000000..bd869cbe0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/checkmarkSmall.png.meta @@ -0,0 +1,131 @@ +fileFormatVersion: 2 +guid: ca44f6eb870d244cfb1c83054a69ffc3 +timeCreated: 1484046036 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Tizen + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Samsung TV + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/checkmarkSmall.png + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16-bw.png b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16-bw.png new file mode 100644 index 000000000..2edf317ba Binary files /dev/null and b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16-bw.png differ diff --git a/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16-bw.png.meta b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16-bw.png.meta new file mode 100644 index 000000000..58034ccc8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16-bw.png.meta @@ -0,0 +1,111 @@ +fileFormatVersion: 2 +guid: 3ae63f85ae558634d83caaf5a332d1ba +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/es3Logo16x16-bw.png + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16.png b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16.png new file mode 100644 index 000000000..ccde04724 Binary files /dev/null and b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16.png differ diff --git a/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16.png.meta b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16.png.meta new file mode 100644 index 000000000..3ace31ad1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Editor/es3Logo16x16.png.meta @@ -0,0 +1,131 @@ +fileFormatVersion: 2 +guid: 4697547d67ec24040b678d7b35835286 +timeCreated: 1495455081 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Tizen + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Samsung TV + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Editor/es3Logo16x16.png + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/PlayMaker.meta b/Assets/Plugins/Easy Save 3/PlayMaker.meta new file mode 100644 index 000000000..3ac7941f3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/PlayMaker.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0a6bee318130749539d0eec8a7b37ccd +folderAsset: yes +timeCreated: 1497259711 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/PlayMaker/ES3PlayMaker.cs b/Assets/Plugins/Easy Save 3/PlayMaker/ES3PlayMaker.cs new file mode 100644 index 000000000..8d478c732 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/PlayMaker/ES3PlayMaker.cs @@ -0,0 +1,1907 @@ +#if PLAYMAKER_1_8_OR_NEWER + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using ES3Internal; +using HutongGames.PlayMaker.Actions; +using HutongGames.PlayMaker; +using System.Linq; +using System; +using Tooltip = HutongGames.PlayMaker.TooltipAttribute; + +public class FsmES3File : ScriptableObject +{ + public ES3File file; +} + +public class FsmES3Spreadsheet : ScriptableObject +{ + public ES3Spreadsheet spreadsheet; +} + +namespace ES3PlayMaker +{ + + #region Base Classes + + public abstract class ActionBase : FsmStateAction + { + [ActionSection("Error handling")] + [Tooltip("This event is triggered if an error occurs.")] + public FsmEvent errorEvent; + [Tooltip("If an error occurs, the error message will be stored in this variable.")] + public FsmString errorMessage; + + public abstract void Enter(); + public abstract void OnReset(); + + public override void OnEnter() + { + try + { + Enter(); + } + catch (System.Exception e) + { + HandleError(e.ToString()); + } + Finish(); + } + + public override void Reset() + { + errorEvent = null; + errorMessage = ""; + OnReset(); + } + + public void HandleError(string msg) + { + errorMessage.Value = msg; + if (errorEvent != null) + Fsm.Event(errorEvent); + else + LogError(msg); + } + } + + public abstract class SettingsAction : ActionBase + { + [ActionSection("Settings")] + public FsmBool overrideDefaultSettings = false; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [Tooltip("The path this ES3Settings object points to, if any.")] + public FsmString path; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [ObjectType(typeof(ES3.Location))] + [Tooltip("The storage location where we wish to store data by default.")] + public FsmEnum location; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [ObjectType(typeof(ES3.EncryptionType))] + [Tooltip("The type of encryption to use when encrypting data, if any.")] + public FsmEnum encryptionType; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [Tooltip("The password to use to encrypt the data if encryption is enabled.")] + public FsmString encryptionPassword; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [ObjectType(typeof(ES3.CompressionType))] + [Tooltip("The type of compression to use when compressing data, if any.")] + public FsmEnum compressionType; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [ObjectType(typeof(ES3.Directory))] + [Tooltip("The default directory in which to store files when using the File save location, and the location which relative paths should be relative to.")] + public FsmEnum directory; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [ObjectType(typeof(ES3.Format))] + [Tooltip("The format we should use when serializing and deserializing data.")] + public FsmEnum format; + [HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")] + [Tooltip("Any stream buffers will be set to this length in bytes.")] + public FsmInt bufferSize; + + public bool DefaultSettingsOverridden() + { + return !overrideDefaultSettings.Value; + } + + public override void Reset() + { + var settings = new ES3Settings(); + path = settings.path; + location = settings.location; + encryptionType = settings.encryptionType; + compressionType = settings.compressionType; + encryptionPassword = settings.encryptionPassword; + directory = settings.directory; + format = settings.format; + bufferSize = settings.bufferSize; + overrideDefaultSettings = false; + base.Reset(); + } + + public ES3Settings GetSettings() + { + var settings = new ES3Settings(); + if (overrideDefaultSettings.Value) + { + settings.path = path.Value; + settings.location = (ES3.Location)location.Value; + settings.encryptionType = (ES3.EncryptionType)encryptionType.Value; + settings.encryptionPassword = encryptionPassword.Value; + settings.compressionType = (ES3.CompressionType)compressionType.Value; + settings.directory = (ES3.Directory)directory.Value; + settings.format = (ES3.Format)format.Value; + settings.bufferSize = bufferSize.Value; + } + return settings; + } + } + + public abstract class ES3FileAction : ActionBase + { + [Tooltip("The ES3 File we are using, created using the Create ES3 File action.")] + [ObjectType(typeof(FsmES3File))] + [Title("ES3 File")] + [RequiredField] + public FsmObject fsmES3File; + + public ES3File es3File { get { return ((FsmES3File)fsmES3File.Value).file; } } + + public override void Reset() + { + fsmES3File = null; + base.Reset(); + } + } + + public abstract class ES3FileSettingsAction : SettingsAction + { + [Tooltip("The ES3File variable we're using.")] + [ObjectType(typeof(FsmES3File))] + [Title("ES3 File")] + [RequiredField] + public FsmObject fsmES3File; + + public ES3File es3File { get { return ((FsmES3File)fsmES3File.Value).file; } } + + public override void Reset() + { + fsmES3File = null; + base.Reset(); + } + } + + public abstract class ES3SpreadsheetAction : ActionBase + { + [Tooltip("The ES3 Spreadsheet we are using, created using the Create ES3 Spreadsheet action.")] + [ObjectType(typeof(FsmES3Spreadsheet))] + [Title("ES3 Spreadsheet")] + [RequiredField] + public FsmObject fsmES3Spreadsheet; + + public ES3Spreadsheet es3Spreadsheet { get { return ((FsmES3Spreadsheet)fsmES3Spreadsheet.Value).spreadsheet; } } + + public override void Reset() + { + fsmES3Spreadsheet = null; + base.Reset(); + } + } + + public abstract class ES3SpreadsheetSettingsAction : SettingsAction + { + [Tooltip("The ES3Spreadsheet variable we're using.")] + [ObjectType(typeof(FsmES3Spreadsheet))] + [Title("ES3 Spreadsheet")] + [RequiredField] + public FsmObject fsmES3Spreadsheet; + + public ES3Spreadsheet es3Spreadsheet { get { return ((FsmES3Spreadsheet)fsmES3Spreadsheet.Value).spreadsheet; } } + + public override void Reset() + { + fsmES3Spreadsheet = null; + base.Reset(); + } + } + + #endregion + + #region Save Actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Saves the value to a file with the given key.")] + public class Save : SettingsAction + { + [Tooltip("The unique key we want to use to identity the data we are saving.")] + public FsmString key; + [Tooltip("The value we want to save.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + + public override void OnReset() + { + key = "key"; + value = null; + } + + public override void Enter() + { + value.UpdateValue(); + + if (value.Type == VariableType.Array) + ES3.Save(key.Value, new PMDataWrapper(value.arrayValue.Values), GetSettings()); + else + ES3.Save(key.Value, value.GetValue(), GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Saves multiple values to a file with the given keys.")] + public class SaveMultiple : SettingsAction + { + [RequiredField] + [CompoundArray("Count", "Key", "Value")] + public FsmString[] keys; + [Tooltip("The value we want to save.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar[] variables; + + public override void OnReset() + { + keys = null; + variables = null; + } + + public override void Enter() + { + for (int i = 0; i < variables.Length; i++) + { + var key = keys[i]; + var value = variables[i]; + value.UpdateValue(); + + if (value.Type == VariableType.Array) + ES3.Save(key.Value, new PMDataWrapper(value.arrayValue.Values), GetSettings()); + else + ES3.Save(key.Value, value.GetValue(), GetSettings()); + } + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Saves all FsmVariables in this FSM to a file with the given key.")] + public class SaveAll : SettingsAction + { + [Tooltip("The unique key we want to use to identity the data we are saving.")] + public FsmString key; + + [Tooltip("Save the local variables accessible in this FSM?")] + public FsmBool saveFsmVariables = true; + [Tooltip("Save the global variables accessible in all FSMs?")] + public FsmBool saveGlobalVariables = true; + + public override void OnReset() + { + key = "key"; + } + + public override void Enter() + { + ES3.Save(key.Value, new PMDataWrapper(Fsm, saveFsmVariables.Value, saveGlobalVariables.Value), GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Saves a byte array as a file, overwriting any existing files.")] + public class SaveRaw : SettingsAction + { + [Tooltip("The string we want to save as a file.")] + public FsmString str; + [Tooltip("Whether to encode this string using Base-64 encoding. This will override any default encoding settings.")] + public FsmBool useBase64Encoding; + [Tooltip("Adds a newline to the end of the file.")] + public FsmBool appendNewline; + + public override void OnReset() + { + str = ""; + useBase64Encoding = false; + appendNewline = false; + } + + public override void Enter() + { + if (useBase64Encoding.Value) + ES3.SaveRaw(System.Convert.FromBase64String(str.Value + (appendNewline.Value ? "\n" : "")), GetSettings()); + else + ES3.SaveRaw(str.Value + (appendNewline.Value ? "\n" : ""), GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Appends a string to the end of a file.")] + public class AppendRaw : SettingsAction + { + [Tooltip("The string we want to append to a file.")] + public FsmString str; + [Tooltip("Whether to encode this string using Base-64 encoding. This will override any default encoding settings.")] + public FsmBool useBase64Encoding; + [Tooltip("If checked, a newline will be added after the data.")] + public FsmBool appendNewline; + + public override void OnReset() + { + str = ""; + useBase64Encoding = false; + appendNewline = false; + } + + public override void Enter() + { + if (useBase64Encoding.Value) + ES3.AppendRaw(System.Convert.FromBase64String(str.Value) + (appendNewline.Value ? "\n" : ""), GetSettings()); + else + ES3.AppendRaw(str.Value + (appendNewline.Value ? "\n" : ""), GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Saves a Texture2D as a PNG or a JPG, depending on the file extension of the supplied image path.")] + public class SaveImage : SettingsAction + { + [Tooltip("The relative or absolute path of the PNG or JPG file we want to store our image to.")] + public FsmString imagePath; + [Tooltip("The Texture2D we want to save as an image.")] + [ObjectType(typeof(Texture2D))] + public FsmTexture texture2D; + [Tooltip("The quality of the image when saving JPGs, from 1 to 100. Default is 75.")] + public FsmInt quality; + + public override void OnReset() + { + imagePath = "image.png"; + texture2D = null; + quality = 75; + } + + public override void Enter() + { + ES3.SaveImage((Texture2D)texture2D.Value, quality.Value, imagePath.Value, GetSettings()); + } + } + + #endregion + + #region Load Actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads a value from a file with the given key.")] + public class Load : SettingsAction + { + [Tooltip("The unique key which identifies the data we're loading.")] + public FsmString key; + [Tooltip("The variable we want to use to store our loaded data.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + [Tooltip("Optional: A value to return if the key does not exist.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar defaultValue; + + public override void OnReset() + { + key = "key"; + value = null; + defaultValue = null; + } + + public override void Enter() + { + defaultValue.UpdateValue(); + bool useDefaultVal = defaultValue.GetValue() != null && !defaultValue.IsNone; + + + if (value.Type == VariableType.Array) + { + if (useDefaultVal) + value.SetValue(ES3.Load(key.Value, new PMDataWrapper(defaultValue.arrayValue.Values), GetSettings()).array); + else + value.SetValue(ES3.Load(key.Value, GetSettings()).array); + } + else + { + if (useDefaultVal) + value.SetValue(ES3.Load(key.Value, defaultValue.GetValue(), GetSettings())); + else + value.SetValue(ES3.Load(key.Value, GetSettings())); + } + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads multiple values from a file with the given keys.")] + public class LoadMultiple : SettingsAction + { + [RequiredField] + [CompoundArray("Count", "Key", "Value")] + public FsmString[] keys; + [Tooltip("The variables we want to load into.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar[] variables; + + public override void OnReset() + { + keys = null; + variables = null; + } + + public override void Enter() + { + for (int i = 0; i < variables.Length; i++) + { + var key = keys[i]; + var value = variables[i]; + + if (value.Type == VariableType.Array) + value.SetValue(ES3.Load(key.Value, GetSettings()).array); + else + value.SetValue(ES3.Load(key.Value, GetSettings())); + } + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads a value from a file with the given key into an existing object, rather than creating a new instance.")] + public class LoadInto : SettingsAction + { + [Tooltip("The unique key which identifies the data we're loading.")] + public FsmString key; + [Tooltip("The object we want to load our data into.")] + [RequiredField] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + + public override void OnReset() + { + key = "key"; + value = null; + } + + public override void Enter() + { + value.UpdateValue(); + if (value.IsNone || value.GetValue() == null) + HandleError("The 'Load Into' action requires an object to load the data into, but none was specified in the 'Value' field."); + else + { + ES3.LoadInto(key.Value, value.GetValue(), GetSettings()); + + if (value.Type == VariableType.Array) + HandleError("It's not possible to use LoadInto with arrays in PlayMaker as they are not strictly typed. Consider using Load instead."); + else + value.SetValue(ES3.Load(key.Value, GetSettings())); + } + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads all FsmVariables in this FSM to a file with the given key.")] + public class LoadAll : SettingsAction + { + [Tooltip("The key we used to save the data we're loading.")] + public FsmString key; + + [Tooltip("Load the local variables accessible in this FSM?")] + public FsmBool loadFsmVariables = true; + [Tooltip("Load the global variables accessible in all FSMs?")] + public FsmBool loadGlobalVariables = true; + + public override void OnReset() + { + key = "key"; + } + + public override void Enter() + { + ES3.Load(key.Value, GetSettings()).ApplyVariables(Fsm, loadFsmVariables.Value, loadGlobalVariables.Value); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads an entire file as a string.")] + public class LoadRawString : SettingsAction + { + [Tooltip("The variable we want to store our loaded string in.")] + public FsmString str; + [Tooltip("Whether or not the data we're loading is Base-64 encoded. Usually this should be left unchecked.")] + public FsmBool useBase64Encoding; + + public override void OnReset() + { + str = null; + useBase64Encoding = false; + } + + public override void Enter() + { + if (useBase64Encoding.Value) + str.Value = System.Convert.ToBase64String(ES3.LoadRawBytes(GetSettings())); + else + str.Value = ES3.LoadRawString(GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads a JPG or PNG image file as a Texture2D.")] + public class LoadImage : SettingsAction + { + [Tooltip("The relative or absolute path of the JPG or PNG image file we want to load.")] + public FsmString imagePath; + [Tooltip("The variable we want to use to store our loaded texture.")] + public FsmTexture texture2D; + + public override void OnReset() + { + imagePath = "image.png"; + texture2D = null; + } + + public override void Enter() + { + texture2D.Value = ES3.LoadImage(imagePath.Value, GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads an audio file as an AudioClip.")] + public class LoadAudio : SettingsAction + { + [Tooltip("The relative or absolute path of the audio file we want to load.")] + public FsmString audioFilePath; + [ObjectType(typeof(AudioClip))] + [Tooltip("The variable we want to use to store our loaded AudioClip.")] + public FsmObject audioClip; + +#if UNITY_2018_3_OR_NEWER + [Tooltip("The type of AudioClip we're loading.")] + [ObjectType(typeof(AudioType))] + public FsmEnum audioType; +#endif + + public override void OnReset() + { + audioFilePath = "audio.wav"; + audioClip = null; +#if UNITY_2018_3_OR_NEWER + audioType = AudioType.MPEG; +#endif + } + + public override void Enter() + { + audioClip.Value = ES3.LoadAudio(audioFilePath.Value, +#if UNITY_2018_3_OR_NEWER + (AudioType)audioType.Value, +#endif + GetSettings()); + } + } + + + #endregion + + #region Exists Actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Checks whether a key exists in a file.")] + public class KeyExists : SettingsAction + { + [Tooltip("The key we want to check the existence of.")] + public FsmString key; + [Tooltip("Whether the key exists. This is set after the action runs.")] + public FsmBool exists; + + [Tooltip("This event is triggered if the key exists.")] + public FsmEvent existsEvent; + [Tooltip("This event is triggered if the key does not exist.")] + public FsmEvent doesNotExistEvent; + + public override void OnReset() + { + key = "key"; + exists = false; + existsEvent = null; + doesNotExistEvent = null; + } + + public override void Enter() + { + exists.Value = ES3.KeyExists(key.Value, GetSettings()); + + Fsm.Event(exists.Value ? existsEvent : doesNotExistEvent); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Checks whether a file exists in a directory.")] + public class FileExists : SettingsAction + { + [Tooltip("The file we want to check the existence of")] + public FsmString filePath; + [Tooltip("Whether the file exists. This is set after the action runs.")] + public FsmBool exists; + + [Tooltip("This event is triggered if the file exists.")] + public FsmEvent existsEvent; + [Tooltip("This event is triggered if the file does not exist.")] + public FsmEvent doesNotExistEvent; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + exists = false; + existsEvent = null; + doesNotExistEvent = null; + } + + public override void Enter() + { + exists.Value = ES3.FileExists(filePath.Value, GetSettings()); + + Fsm.Event(exists.Value ? existsEvent : doesNotExistEvent); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Checks whether a directory exists in another directory")] + public class DirectoryExists : SettingsAction + { + [Tooltip("The directory we want to check the existence of.")] + public FsmString directoryPath; + [Tooltip("Whether the directory exists. This is set after the action runs.")] + public FsmBool exists; + + [Tooltip("This event is triggered if the directory exists.")] + public FsmEvent existsEvent; + [Tooltip("This event is triggered if the directory does not exist.")] + public FsmEvent doesNotExistEvent; + + public override void OnReset() + { + directoryPath = ""; + exists = false; + existsEvent = null; + doesNotExistEvent = null; + } + + public override void Enter() + { + exists.Value = ES3.DirectoryExists(directoryPath.Value, GetSettings()); + + Fsm.Event(exists.Value ? existsEvent : doesNotExistEvent); + } + } + + #endregion + + #region Delete Actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Deletes a key from a file.")] + public class DeleteKey : SettingsAction + { + [Tooltip("The key we want to delete.")] + public FsmString key; + + public override void OnReset() + { + key = "key"; + } + + public override void Enter() + { + ES3.DeleteKey(key.Value, GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Deletes a file.")] + public class DeleteFile : SettingsAction + { + [Tooltip("The relative or absolute path of the file we want to delete.")] + public FsmString filePath; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + } + + public override void Enter() + { + ES3.DeleteFile(filePath.Value, GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Deletes a directory and it's contents.")] + public class DeleteDirectory : SettingsAction + { + [Tooltip("The relative or absolute path of the directory we want to delete.")] + public FsmString directoryPath; + + public override void OnReset() + { + directoryPath = ""; + } + + public override void Enter() + { + ES3.DeleteDirectory(directoryPath.Value, GetSettings()); + } + } + + #endregion + + #region Backup Actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Creates a backup of a file which can be restored using the Restore Backup action.")] + public class CreateBackup : SettingsAction + { + [Tooltip("The relative or absolute path of the file we want to backup.")] + public FsmString filePath; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + } + + public override void Enter() + { + ES3.CreateBackup(filePath.Value, GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Restores a backup of a file created using the Create Backup action.")] + public class RestoreBackup : SettingsAction + { + [Tooltip("The relative or absolute path of the file we want to restore the backup of.")] + public FsmString filePath; + [Tooltip("True if a backup was restored, or False if no backup could be found.")] + public FsmBool backupWasRestored; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + backupWasRestored = false; + } + + public override void Enter() + { + backupWasRestored.Value = ES3.RestoreBackup(filePath.Value, GetSettings()); + } + } + + #endregion + + #region Key, File and Directory Methods + + [ActionCategory("Easy Save 3")] + [Tooltip("Renames a file.")] + public class RenameFile : SettingsAction + { + [Tooltip("The relative or absolute path of the file we want to rename from.")] + public FsmString oldFilePath; + [Tooltip("The relative or absolute path of the file we want to rename to.")] + public FsmString newFilePath; + + public override void OnReset() + { + oldFilePath = "SaveFile.es3"; + newFilePath = ""; + } + + public override void Enter() + { + ES3.RenameFile(oldFilePath.Value, newFilePath.Value, GetSettings(), GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Copies a file.")] + public class CopyFile : SettingsAction + { + [Tooltip("The relative or absolute path of the file we want to copy.")] + public FsmString oldFilePath; + [Tooltip("The relative or absolute path of the file we want to create.")] + public FsmString newFilePath; + + public override void OnReset() + { + oldFilePath = "SaveFile.es3"; + newFilePath = ""; + } + + public override void Enter() + { + ES3.CopyFile(oldFilePath.Value, newFilePath.Value, GetSettings(), GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Copies a directory.")] + public class CopyDirectory : SettingsAction + { + [Tooltip("The relative or absolute path of the directory we want to copy.")] + public FsmString oldDirectoryPath; + [Tooltip("The relative or absolute path of the directory we want to create.")] + public FsmString newDirectoryPath; + + public override void OnReset() + { + oldDirectoryPath = ""; + newDirectoryPath = ""; + } + + public override void Enter() + { + ES3.CopyDirectory(oldDirectoryPath.Value, newDirectoryPath.Value, GetSettings(), GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Gets an array of key names from a file.")] + public class GetKeys : SettingsAction + { + [Tooltip("The relative or absolute path of the file we want to get the keys from.")] + public FsmString filePath; + [Tooltip("The string array variable we want to load our key names into.")] + [ArrayEditor(VariableType.String)] + public FsmArray keys; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + keys = null; + } + + public override void Enter() + { + keys.Values = ES3.GetKeys(filePath.Value, GetSettings()); + keys.SaveChanges(); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Gets how many keys are in a file.")] + public class GetKeyCount : SettingsAction + { + [Tooltip("The relative or absolute path of the file we want to count the keys of.")] + public FsmString filePath; + [Tooltip("The int variable we want to load our count into.")] + public FsmInt keyCount; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + keyCount = null; + } + + public override void Enter() + { + keyCount.Value = ES3.GetKeys(filePath.Value, GetSettings()).Length; + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Gets the names of the files in a given directory.")] + public class GetFiles : SettingsAction + { + [Tooltip("The relative or absolute path of the directory we want to get the file names from.")] + public FsmString directoryPath; + [Tooltip("The string array variable we want to load our file names into.")] + [ArrayEditor(VariableType.String)] + public FsmArray files; + + public override void OnReset() + { + directoryPath = ""; + files = null; + } + + public override void Enter() + { + files.Values = ES3.GetFiles(directoryPath.Value, GetSettings()); + files.SaveChanges(); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Gets the names of any directories in a given directory.")] + public class GetDirectories : SettingsAction + { + [Tooltip("The relative or absolute path of the directory we want to get the directory names from.")] + public FsmString directoryPath; + [Tooltip("The string array variable we want to load our directory names into.")] + [ArrayEditor(VariableType.String)] + public FsmArray directories; + + public override void OnReset() + { + directoryPath = ""; + directories = null; + } + + public override void Enter() + { + directories.Values = ES3.GetDirectories(directoryPath.Value, GetSettings()); + directories.SaveChanges(); + } + } + + #endregion + + #region ES3Spreadsheet Actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Creates a new empty ES3Spreadsheet.")] + public class ES3SpreadsheetCreate : ES3SpreadsheetAction + { + public override void OnReset() + { + } + + public override void Enter() + { + var spreadsheet = ScriptableObject.CreateInstance(); + spreadsheet.spreadsheet = new ES3Spreadsheet(); + fsmES3Spreadsheet.Value = spreadsheet; + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Sets a given cell of the ES3Spreadsheet to the value provided.")] + public class ES3SpreadsheetSetCell : ES3SpreadsheetAction + { + [Tooltip("The column of the cell we want to set the value of.")] + public FsmInt col; + [Tooltip("The row of the cell we want to set the value of.")] + public FsmInt row; + + [Tooltip("The value we want to save.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + + public override void OnReset() + { + value = null; + } + + public override void Enter() + { + value.UpdateValue(); + es3Spreadsheet.SetCell(col.Value, row.Value, value.GetValue()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Gets a given cell of the ES3Spreadsheet and loads it into the value field.")] + public class ES3SpreadsheetGetCell : ES3SpreadsheetAction + { + [Tooltip("The column of the cell we want to set the value of.")] + public FsmInt col; + [Tooltip("The row of the cell we want to set the value of.")] + public FsmInt row; + + [Tooltip("The value we want to save.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + + public override void OnReset() + { + value = null; + } + + public override void Enter() + { + value.SetValue(es3Spreadsheet.GetCell(value.RealType, col.Value, row.Value)); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Saves the ES3Spreadsheet to file.")] + public class ES3SpreadsheetSave : ES3SpreadsheetSettingsAction + { + [Tooltip("The filename or path we want to use to save the spreadsheet.")] + public FsmString filePath; + [Tooltip("Whether we want to append this spreadsheet to an existing spreadsheet if one already exists.")] + public FsmBool append; + + public override void OnReset() + { + filePath = "ES3.csv"; + append = false; + } + + public override void Enter() + { + es3Spreadsheet.Save(filePath.Value, GetSettings(), append.Value); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Loads a a spreadsheet from a file into this ES3Spreadsheet.")] + public class ES3SpreadsheetLoad : ES3SpreadsheetSettingsAction + { + [Tooltip("The filename or path we want to use to save the spreadsheet.")] + public FsmString filePath; + + public override void OnReset() + { + filePath = "ES3.csv"; + + } + + public override void Enter() + { + es3Spreadsheet.Load(filePath.Value, GetSettings()); + } + } + #endregion + + #region ES3File Actions + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Creates a new ES3File, and optionally loads a file from storage into it.")] + public class ES3FileCreate : ES3FileSettingsAction + { + [Tooltip("The relative or absolute path of the file this ES3File represents in storage.")] + public FsmString filePath; + [Tooltip("Whether we should sync this ES3File with the one in storage immediately after creating it.")] + public FsmBool syncWithFile; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + syncWithFile = true; + } + + public override void Enter() + { + var file = ScriptableObject.CreateInstance(); + file.file = new ES3File(filePath.Value, GetSettings(), syncWithFile.Value); + fsmES3File.Value = file; + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Synchronises this ES3File with a file in storage.")] + public class ES3FileSync : ES3FileSettingsAction + { + [Tooltip("The relative or absolute path of the file we want to synchronise with in storage.")] + public FsmString filePath; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + } + + public override void Enter() + { + if (overrideDefaultSettings.Value) + es3File.Sync(GetSettings()); + else + es3File.Sync(); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Saves the value to the ES3File with the given key.")] + public class ES3FileSave : ES3FileAction + { + [Tooltip("The unique key we want to use to identity the data we are saving.")] + public FsmString key; + [Tooltip("The value we want to save.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + + public override void OnReset() + { + key = "key"; + value = null; + } + + public override void Enter() + { + value.UpdateValue(); + es3File.Save(key.Value, value.GetValue()); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Loads a value with the given key from the ES3File")] + public class ES3FileLoad : ES3FileAction + { + [Tooltip("The unique key which identifies the data we're loading.")] + public FsmString key; + [Tooltip("The variable we want to use to store our loaded data.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + [Tooltip("Optional: A value to return if the key does not exist.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar defaultValue; + + public override void OnReset() + { + key = "key"; + value = null; + defaultValue = null; + } + + public override void Enter() + { + defaultValue.UpdateValue(); + if (defaultValue.GetValue() != null && !defaultValue.IsNone) + value.SetValue(es3File.Load(key.Value, defaultValue.GetValue())); + else + value.SetValue(es3File.Load(key.Value)); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Loads a value with the given key from the ES3File into an existing object")] + public class ES3FileLoadInto : ES3FileAction + { + [Tooltip("The unique key which identifies the data we're loading.")] + public FsmString key; + [Tooltip("The variable we want to load our data into.")] + [UIHint(UIHint.Variable)] + [HideTypeFilter] + public FsmVar value; + + public override void OnReset() + { + key = "key"; + value = null; + } + + public override void Enter() + { + value.UpdateValue(); + es3File.LoadInto(key.Value, value.GetValue()); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Loads the entire ES3 File as a string")] + public class ES3FileLoadRawString : ES3FileAction + { + [Tooltip("The FsmArray variable we want to use to store our string representing the file.")] + public FsmString str; + [Tooltip("Whether or not the data we're loading is Base-64 encoded. Usually this should be left unchecked.")] + public FsmBool useBase64Encoding; + + public override void OnReset() + { + str = null; + useBase64Encoding = false; + } + + public override void Enter() + { + if (useBase64Encoding.Value) + str.Value = System.Convert.ToBase64String(es3File.LoadRawBytes()); + else + str.Value = es3File.LoadRawString(); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Deletes a key from an ES3 File.")] + public class ES3FileDeleteKey : ES3FileAction + { + [Tooltip("The key we want to delete.")] + public FsmString key; + + public override void OnReset() + { + key = "key"; + } + + public override void Enter() + { + es3File.DeleteKey(key.Value); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Checks whether a key exists in an ES3File.")] + public class ES3FileKeyExists : ES3FileAction + { + [Tooltip("The key we want to check the existence of.")] + public FsmString key; + [Tooltip("Whether the key exists. This is set after the action runs.")] + public FsmBool exists; + + [Tooltip("This event is triggered if the key exists.")] + public FsmEvent existsEvent; + [Tooltip("This event is triggered if the key does not exist.")] + public FsmEvent doesNotExistEvent; + + public override void OnReset() + { + key = "key"; + exists = false; + existsEvent = null; + doesNotExistEvent = null; + } + + public override void Enter() + { + exists.Value = es3File.KeyExists(key.Value); + + if (exists.Value && existsEvent != null) + Fsm.Event(existsEvent); + else if (doesNotExistEvent != null) + Fsm.Event(doesNotExistEvent); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Gets an array of key names from an ES3File.")] + public class ES3FileGetKeys : ES3FileAction + { + [Tooltip("The string array variable we want to load our key names into.")] + [ArrayEditor(VariableType.String)] + public FsmArray keys; + + public override void OnReset() + { + keys = null; + } + + public override void Enter() + { + keys.Values = es3File.GetKeys(); + keys.SaveChanges(); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Clears all keys from an ES3File.")] + public class ES3FileClear : ES3FileAction + { + public override void OnReset() { } + + public override void Enter() + { + es3File.Clear(); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Gets an array of key names from a file.")] + public class ES3FileSize : ES3FileAction + { + [Tooltip("The variable we want to put the file size into.")] + public FsmInt size; + + public override void OnReset() + { + size = 0; + } + + public override void Enter() + { + size.Value = es3File.Size(); + } + } + + #endregion + + #region ES3Cloud Actions + +#if !DISABLE_WEB + public abstract class ES3CloudAction : SettingsAction + { + [Tooltip("The URL to the ES3Cloud.php file on your server.")] + [RequiredField] + public FsmString url; + [Tooltip("The API key generated when installing ES3 Cloud on your server.")] + [RequiredField] + public FsmString apiKey; + + [Tooltip("The ES3File variable we're using.")] + [ObjectType(typeof(FsmES3File))] + [Title("ES3 File")] + [RequiredField] + public FsmObject fsmES3File; + + public ES3File es3File { get { return ((FsmES3File)fsmES3File.Value).file; } } + + [Tooltip("An error code if an error occurred.")] + public FsmInt errorCode; + + protected ES3Cloud cloud = null; + + public override void OnReset() + { + url = "http://www.myserver.com/ES3Cloud.php"; + errorCode = 0; + cloud = null; + fsmES3File = null; + } + + public override void OnEnter() + { + try + { + CreateES3Cloud(); + Enter(); + } + catch (System.Exception e) + { + HandleError(e.ToString()); + } + } + + public override void OnUpdate() + { + base.OnUpdate(); + if (cloud.isDone) + { + if (cloud.isError) + { + errorCode.Value = (int)cloud.errorCode; + errorMessage.Value = cloud.error; + Log("Error occurred when trying to perform operation with ES3Cloud: [Error " + cloud.errorCode + "] " + cloud.error); + Fsm.Event(errorEvent); + } + else + Finish(); + } + } + + protected void CreateES3Cloud() + { + cloud = new ES3Cloud(url.Value, apiKey.Value); + } + } + + public abstract class ES3CloudUserAction : ES3CloudAction + { + [ActionSection("User (optional)")] + public FsmString user; + public FsmString password; + + public override void OnReset() + { + base.OnReset(); + user = ""; + password = ""; + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Synchronises a file in storage with the server.")] + public class ES3CloudSync : ES3CloudUserAction + { + public override void Enter() + { + var settings = GetSettings(); + StartCoroutine(cloud.Sync(path.Value, settings)); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Uploads a file in storage to the server, overwriting any existing files.")] + public class ES3CloudUploadFile : ES3CloudUserAction + { + public override void Enter() + { + var settings = GetSettings(); + StartCoroutine(cloud.UploadFile(path.Value, user.Value, password.Value, settings)); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Uploads a file in storage to the server, overwriting any existing files.")] + public class ES3CloudUploadES3File : ES3CloudUserAction + { + public override void Enter() + { + var settings = GetSettings(); + StartCoroutine(cloud.UploadFile(es3File, user.Value, password.Value)); + } + } + + [ActionCategory("Deprecated Easy Save 3 actions")] + [Tooltip("Downloads a file from the server, overwriting any existing files, or returning error code 3 if no file exists on the server.")] + public class ES3CloudDownloadES3File : ES3CloudUserAction + { + public override void Enter() + { + var settings = GetSettings(); + StartCoroutine(cloud.DownloadFile(es3File, user.Value, password.Value)); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Downloads a file from the server into an file, or returning error code 3 if no file exists on the server.")] + public class ES3CloudDownloadFile : ES3CloudUserAction + { + public override void Enter() + { + var settings = GetSettings(); + StartCoroutine(cloud.DownloadFile(path.Value, user.Value, password.Value, settings)); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Downloads a file from the server, overwriting any existing files, or returning error code 3 if no file exists on the server.")] + public class ES3CloudDeleteFile : ES3CloudUserAction + { + public override void Enter() + { + var settings = GetSettings(); + StartCoroutine(cloud.DeleteFile(path.Value, user.Value, password.Value, settings)); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Renames a file on the server, overwriting any existing files, or returning error code 3 if no file exists on the server.")] + public class ES3CloudRenameFile : ES3CloudUserAction + { + [Tooltip("The name we want to rename the file to.")] + public FsmString newFilename; + + public override void Enter() + { + var settings = GetSettings(); + StartCoroutine(cloud.RenameFile(path.Value, newFilename.Value, user.Value, password.Value, settings)); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Downloads the names of all of the files on the server for the given user.")] + public class ES3CloudDownloadFilenames : ES3CloudUserAction + { + [Tooltip("The string array variable we want to load our file names into.")] + [ArrayEditor(VariableType.String)] + public FsmArray filenames; + + [Tooltip("An optional search pattern containing '%' or '_' wildcards where '%' represents zero, one, or multiple characters, and '_' represents a single character. See https://www.w3schools.com/sql/sql_like.asp for more info.")] + public FsmString searchPattern; + + public override void OnReset() + { + filenames = null; + searchPattern = ""; + } + + public override void Enter() + { + StartCoroutine(cloud.SearchFilenames(string.IsNullOrEmpty(searchPattern.Value) ? "%" : searchPattern.Value, user.Value, password.Value)); + } + + public override void OnUpdate() + { + if (cloud != null && cloud.isDone) + { + var downloadedFilenames = cloud.filenames; + filenames.Resize(cloud.filenames.Length); + for (int i = 0; i < downloadedFilenames.Length; i++) + filenames.Set(i, downloadedFilenames[i]); + filenames.SaveChanges(); + } + base.OnUpdate(); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Downloads the names of all of the files on the server for the given user.")] + public class ES3CloudSearchFilenames : ES3CloudUserAction + { + [Tooltip("The string array variable we want to load our file names into.")] + [ArrayEditor(VariableType.String)] + public FsmArray filenames; + + [Tooltip("An optional search pattern containing '%' or '_' wildcards where '%' represents zero, one, or multiple characters, and '_' represents a single character. See https://www.w3schools.com/sql/sql_like.asp for more info.")] + public FsmString searchPattern; + + public override void OnReset() + { + filenames = null; + searchPattern = ""; + } + + public override void Enter() + { + StartCoroutine(cloud.SearchFilenames(string.IsNullOrEmpty(searchPattern.Value) ? "%" : searchPattern.Value, user.Value, password.Value)); + } + + public override void OnUpdate() + { + if (cloud != null && cloud.isDone) + { + var downloadedFilenames = cloud.filenames; + filenames.Resize(cloud.filenames.Length); + for (int i = 0; i < downloadedFilenames.Length; i++) + filenames.Set(i, downloadedFilenames[i]); + filenames.SaveChanges(); + } + base.OnUpdate(); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Determines when a file was last updated.")] + public class ES3CloudDownloadTimestamp : ES3CloudUserAction + { + [Tooltip("The Date and time the file was last updated, as a string formatted as yyyy-MM-ddTHH:mm:ss.")] + public FsmString timestamp; + + public override void OnReset() + { + timestamp = ""; + } + + public override void Enter() + { + StartCoroutine(cloud.DownloadTimestamp(path.Value, user.Value, password.Value)); + } + + public override void OnUpdate() + { + if (cloud != null && cloud.isDone) + timestamp.Value = cloud.timestamp.ToString("s"); + base.OnUpdate(); + } + } + +#endif + #endregion + + #region ES3AutoSave actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Triggers Auto Save's Save method.")] + public class ES3AutoSaveSave : FsmStateAction + { + public override void OnEnter() + { + GameObject.Find("Easy Save 3 Manager").GetComponent().Save(); + Finish(); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Triggers Auto Save's Load method.")] + public class ES3AutoSaveLoad : FsmStateAction + { + public override void OnEnter() + { + GameObject.Find("Easy Save 3 Manager").GetComponent().Load(); + Finish(); + } + } + + #endregion + + #region ES3Cache actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Caches a locally-stored file into memory.")] + public class CacheFile : SettingsAction + { + [Tooltip("The filename or file path of the file we want to cache.")] + public FsmString filePath; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + } + + public override void Enter() + { + ES3.CacheFile(filePath.Value, GetSettings()); + } + } + + [ActionCategory("Easy Save 3")] + [Tooltip("Stores a file in the cache to a local file.")] + public class StoreCachedFile : SettingsAction + { + [Tooltip("The filename or file path of the file we want to store.")] + public FsmString filePath; + + public override void OnReset() + { + filePath = "SaveFile.es3"; + } + + public override void Enter() + { + ES3.StoreCachedFile(filePath.Value, GetSettings()); + } + } + + #endregion + + #region Misc actions + + [ActionCategory("Easy Save 3")] + [Tooltip("Gets the Streaming Assets path (see https://docs.unity3d.com/Manual/StreamingAssets.html), and optionally appends onto it. It is strongly recommended to use Easy Save's default of Persistent Data Path instead as this works on all platforms.")] + public class GetStreamingAssetsPath : FsmStateAction + { + [Tooltip("The variable we want to output the Streaming Assets path to.")] + public FsmString output; + [Tooltip("[Optional] A string to append to the path, for example a filename. A forward slash is automatically added for you.")] + public FsmString append; + + public override void Reset() + { + output = null; + append = null; + } + + public override void OnEnter() + { + if (!string.IsNullOrEmpty(append.Value)) + output.Value = Application.streamingAssetsPath + "/" + append.Value; + else + output.Value = Application.streamingAssetsPath; + Finish(); + } + } + + #endregion + + public class PMDataWrapper + { + public Dictionary objs = null; + public Dictionary arrays = null; + + public object obj = null; + public object[] array = null; + + public PMDataWrapper(Fsm fsm, bool fsmVariables, bool globalVariables) + { + objs = new Dictionary(); + arrays = new Dictionary(); + + if (fsm == null) + return; + + // Get FSMVariables objects required based on whether the user wants to save local variables, global variables or both. + var variableLists = new List(); + if (fsmVariables) + variableLists.Add(fsm.Variables); + if (globalVariables) + variableLists.Add(FsmVariables.GlobalVariables); + + foreach (var variableList in variableLists) + { + foreach (var fsmVariable in variableList.GetAllNamedVariables()) + { + if (string.IsNullOrEmpty(fsmVariable.Name)) + continue; + + if (fsmVariable.GetType() == typeof(FsmArray)) + arrays.Add(fsmVariable.Name, ((FsmArray)fsmVariable).Values); + else + objs.Add(fsmVariable.Name, fsmVariable.RawValue); + } + } + } + + public PMDataWrapper(Dictionary objs, Dictionary arrays) + { + this.objs = objs; + this.arrays = arrays; + } + + public PMDataWrapper(object obj) + { + this.obj = obj; + } + + public PMDataWrapper(object[] array) + { + this.array = array; + } + + public PMDataWrapper() { } + + public void ApplyVariables(Fsm fsm, bool fsmVariables, bool globalVariables) + { + // Get FSMVariables objects required based on whether the user wants to save local variables, global variables or both. + var variableLists = new List(); + + if (fsmVariables) + variableLists.Add(fsm.Variables); + if (globalVariables) + variableLists.Add(FsmVariables.GlobalVariables); + + foreach (var variableList in variableLists) + { + foreach (var fsmVariable in variableList.GetAllNamedVariables()) + { + if (fsmVariable.GetType() == typeof(FsmArray)) + { + if (arrays.ContainsKey(fsmVariable.Name)) + ((FsmArray)fsmVariable).Values = arrays[fsmVariable.Name]; + } + else + { + if (objs.ContainsKey(fsmVariable.Name)) + fsmVariable.RawValue = objs[fsmVariable.Name]; + } + } + } + } + } +} + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3Properties("objs", "arrays", "obj", "array")] + public class ES3Type_PMDataWrapper : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_PMDataWrapper() : base(typeof(ES3PlayMaker.PMDataWrapper)) { Instance = this; priority = 1; } + + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (ES3PlayMaker.PMDataWrapper)obj; + + writer.WriteProperty("objs", instance.objs); + writer.WriteProperty("arrays", instance.arrays); + writer.WriteProperty("obj", instance.obj); + writer.WriteProperty("array", instance.array); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (ES3PlayMaker.PMDataWrapper)obj; + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + + case "objs": + instance.objs = reader.Read>(); + break; + case "arrays": + instance.arrays = reader.Read>(); + break; + case "obj": + instance.obj = reader.Read(); + break; + case "array": + instance.array = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new ES3PlayMaker.PMDataWrapper(); + ReadObject(reader, instance); + return instance; + } + } + + [UnityEngine.Scripting.Preserve] + [ES3Properties("ActiveStateName")] + public class ES3Type_Fsm : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_Fsm() : base(typeof(Fsm)) { Instance = this; priority = 1; } + + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (Fsm)obj; + writer.WriteProperty("ActiveStateName", instance.ActiveStateName, ES3Type_string.Instance); + writer.WriteProperty("Variables", new ES3PlayMaker.PMDataWrapper(instance, true, false), ES3Type_PMDataWrapper.Instance); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (Fsm)obj; + if(!instance.Initialized) + { + // Toggle FSM Component twice to trigger initialisation. + instance.FsmComponent.enabled = !instance.FsmComponent.enabled; + instance.FsmComponent.enabled = !instance.FsmComponent.enabled; + } + + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + case "ActiveStateName": + instance.SetState(reader.Read(ES3Type_string.Instance)); + break; + case "Variables": + reader.Read(ES3Type_PMDataWrapper.Instance).ApplyVariables(instance, true, false); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new HutongGames.PlayMaker.Fsm(); + ReadObject(reader, instance); + return instance; + } + } + + /*[UnityEngine.Scripting.Preserve] + [ES3Properties("Fsm")] + public class ES3Type_PlayMakerFSM : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_PlayMakerFSM() : base(typeof(PlayMakerFSM)) + { + Instance = this; + priority = 1; + } + + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (PlayMakerFSM)obj; + + writer.WriteProperty("enabled", instance.enabled); + writer.WriteProperty("Fsm", instance.Fsm, ES3Type_Fsm.Instance); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (PlayMakerFSM)obj; + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "Fsm": + reader.ReadInto(instance.Fsm); + break; + default: + reader.Skip(); + break; + } + } + } + }*/ +} + + +#endif diff --git a/Assets/Plugins/Easy Save 3/PlayMaker/ES3PlayMaker.cs.meta b/Assets/Plugins/Easy Save 3/PlayMaker/ES3PlayMaker.cs.meta new file mode 100644 index 000000000..5de7523b2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/PlayMaker/ES3PlayMaker.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 5989e48214df74e2b9cced724ec2e5c8 +timeCreated: 1497259720 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/PlayMaker/ES3PlayMaker.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Resources.meta b/Assets/Plugins/Easy Save 3/Resources.meta new file mode 100644 index 000000000..18f08ca4b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8e536a56fc5a58a419b5d356d719fcf4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Resources/ES3.meta b/Assets/Plugins/Easy Save 3/Resources/ES3.meta new file mode 100644 index 000000000..910a13095 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Resources/ES3.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac6e24e4f27a8024c8455f49ef647b15 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset new file mode 100644 index 000000000..edc10923d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset @@ -0,0 +1,67 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b340139c9e4d054f904d8b452798652, type: 3} + m_Name: ES3Defaults + m_EditorClassIdentifier: + settings: + _location: 0 + path: SaveFile.es3 + encryptionType: 1 + compressionType: 0 + encryptionPassword: mappy8469! + directory: 0 + format: 0 + prettyPrint: 1 + bufferSize: 2048 + saveChildren: 1 + postprocessRawCachedData: 0 + typeChecking: 1 + safeReflection: 1 + memberReferenceMode: 0 + referenceMode: 2 + serializationDepthLimit: 64 + assemblyNames: + - AllIn1VfxTexDemoAssembly + - Assembly-CSharp + - Assembly-CSharp-firstpass + - Assembly-GraphicMaterialOverride + - AstarPathfindingProject + - Autodesk.Fbx + - Autodesk.Fbx.BuildTestAssets + - Coffee.UIParticle + - DistantLands.Cozy.Runtime + - Drawing + - Febucci.Attributes.Runtime + - Febucci.TextAnimator.Demo.Runtime + - Febucci.TextAnimator.Runtime + - Febucci.TextAnimator.TMP.Runtime + - PackageTools + - sc.stylizedwater2.runtime + - SingularityGroup.HotReload.Runtime + - SingularityGroup.HotReload.Runtime.Public + - spine-csharp + - spine-timeline + - spine-unity + - spine-unity-examples + showAdvancedSettings: 1 + addMgrToSceneAutomatically: 0 + autoUpdateReferences: 1 + addAllPrefabsToManager: 1 + collectDependenciesDepth: 4 + collectDependenciesTimeout: 10 + updateReferencesWhenSceneChanges: 1 + updateReferencesWhenSceneIsSaved: 1 + updateReferencesWhenSceneIsOpened: 1 + referenceFolders: [] + logDebugInfo: 0 + logWarnings: 1 + logErrors: 1 diff --git a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset.meta b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset.meta new file mode 100644 index 000000000..1df212771 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57dbd8e03df688345bcb03c4e2fe4b61 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset new file mode 100644 index 000000000..7cfeede35 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset @@ -0,0 +1,4589 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e6b16dc7c203450459bb86e24305f9ca, type: 3} + m_Name: ES3GlobalReferences + m_EditorClassIdentifier: + refId: + _Keys: + - {fileID: -1774853514, guid: ebe26e22332665d4c8332b2a624e5e8b, type: 3} + - {fileID: 11500000, guid: 72ece51f2901e7445ab60da3685d6b5f, type: 3} + - {fileID: 11500000, guid: a856a42a0bf4a7444a3efb5466fc1d4c, type: 3} + - {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + - {fileID: 8400000, guid: 8e8b4ed6ab8541d44aed8cc8f69d3eff, type: 2} + - {fileID: 4800000, guid: da07703fcc09f8d4799221050659bd55, type: 3} + - {fileID: 2100000, guid: 9fe24a2fb24bf734cb466d3a0d8d9c1e, type: 2} + - {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} + - {fileID: -6465566751694194690, guid: 76f4814e6282a974bb7855c3eeb05744, type: 3} + - {fileID: 11500000, guid: 180ecf9b41d478f468eb3e9083753217, type: 3} + - {fileID: 11500000, guid: 00b2d199b96b516448144ab30fb26aed, type: 3} + - {fileID: 11500000, guid: f9dfa5b682dcd46bda6128250e975f58, type: 3} + - {fileID: 11500000, guid: b7f59e54f2bfd184b9dd451a678d089b, type: 3} + - {fileID: 11500000, guid: 886251e9a18ece04ea8e61686c173e1b, type: 3} + - {fileID: 11400000, guid: 69ce8388f6785dd4c8c39915efece2f4, type: 2} + - {fileID: 11500000, guid: c01700fd266d6914ababb731e09af2eb, type: 3} + - {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3} + - {fileID: 11500000, guid: 572910c10080c0945a0ef731ccedc739, type: 3} + - {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + - {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} + - {fileID: 11500000, guid: b00045f12942b46c698459096c89274e, type: 3} + - {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3} + - {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + - {fileID: 11500000, guid: a1614fc811f8f184697d9bee70ab9fe5, type: 3} + - {fileID: 11500000, guid: d287dbc75fdbb6b44bd97e6d0604b227, type: 3} + - {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} + - {fileID: 2800000, guid: d512512f4af60a442ab3458489412954, type: 3} + - {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + - {fileID: 2800000, guid: 81200413a40918d4d8702e94db29911c, type: 3} + - {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3} + - {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + - {fileID: 4800000, guid: 0f854b35a0cf61a429bd5dcfea30eddd, type: 3} + - {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} + - {fileID: 4800000, guid: 65df88701913c224d95fc554db28381a, type: 3} + - {fileID: 4800000, guid: ec9fec698a3456d4fb18cf8bacb7a2bc, type: 3} + - {fileID: 4800000, guid: e7857e9d0c934dc4f83f270f8447b006, type: 3} + - {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} + - {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + - {fileID: 4800000, guid: 1121bb4e615ca3c48b214e79e841e823, type: 3} + - {fileID: 4800000, guid: 63eaba0ebfb82cc43bde059b4a8c65f6, type: 3} + - {fileID: 4800000, guid: 5e7134d6e63e0bc47a1dd2669cedb379, type: 3} + - {fileID: 4800000, guid: 2aed67ad60045d54ba3a00c91e2d2631, type: 3} + - {fileID: 4800000, guid: 1edcd131364091c46a17cbff0b1de97a, type: 3} + - {fileID: 4800000, guid: a15b78cf8ca26ca4fb2090293153c62c, type: 3} + - {fileID: 4800000, guid: 5f1864addb451f54bae8c86d230f736e, type: 3} + - {fileID: 4800000, guid: 9c70c1a35ff15f340b38ea84842358bf, type: 3} + - {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, type: 3} + - {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, type: 3} + - {fileID: 4800000, guid: e8ee25143a34b8c4388709ea947055d1, type: 3} + - {fileID: 4800000, guid: 562b7ae4f629f144aa97780546fce7c6, type: 3} + - {fileID: 4800000, guid: c49e63ed1bbcb334780a3bd19dfed403, type: 3} + - {fileID: -876546973899608171, guid: 7d78a69be90ba2943972ae067bf105f9, type: 3} + - {fileID: 2800000, guid: e63eef8f54aa9dc4da9a5ac094b503b5, type: 3} + - {fileID: 2800000, guid: b4db8180660810945bf8d55ab44352ad, type: 3} + - {fileID: 2800000, guid: 510a2f57334933e4a8dbabe4c30204e4, type: 3} + - {fileID: 2800000, guid: a2ec5cbf5a9b64345ad3fab0912ddf7b, type: 3} + - {fileID: 2800000, guid: c989e1ed85cf7154caa922fec53e6af6, type: 3} + - {fileID: 2800000, guid: 9930fb4528622b34687b00bbe6883de7, type: 3} + - {fileID: 2800000, guid: 1c3c6d69a645b804fa232004b96b7ad3, type: 3} + - {fileID: 2800000, guid: 654c582f7f8a5a14dbd7d119cbde215d, type: 3} + - {fileID: 2800000, guid: 10b6c6d22e73dea46a8ab36b6eebd629, type: 3} + - {fileID: 2800000, guid: 7ce2118f74614a94aa8a0cdf2e6062c3, type: 3} + - {fileID: 2800000, guid: 2ca97df9d1801e84a8a8f2c53cb744f0, type: 3} + - {fileID: 2800000, guid: 896d9004736809c4fb5973b7c12eb8b9, type: 3} + - {fileID: 2800000, guid: c9bd74624d8070f429e3f46d161f9204, type: 3} + - {fileID: 2800000, guid: ff47e5a0f105eb34883b973e51f4db62, type: 3} + - {fileID: 2800000, guid: d36f0fe53425e08499a2333cf423634c, type: 3} + - {fileID: 2800000, guid: 9d92991794bb5864c8085468b97aa067, type: 3} + - {fileID: 4569807759113227225, guid: a43eba5748c938e45a7379f10a4a00fc, type: 2} + - {fileID: 2800000, guid: 14381521ff11cb74abe3fe65401c23be, type: 3} + - {fileID: 2800000, guid: ed5ea7ce59ca8ec4f9f14bf470a30f35, type: 3} + - {fileID: 2800000, guid: d18a24d7b4ed50f4387993566d9d3ae2, type: 3} + - {fileID: 2800000, guid: fc3fa8f108657e14486697c9a84ccfc5, type: 3} + - {fileID: 2800000, guid: d5c9b274310e5524ebe32a4e4da3df1f, type: 3} + - {fileID: 2800000, guid: f69770e54f2823f43badf77916acad83, type: 3} + - {fileID: 2100000, guid: 78a08787ca30045abb69f6f7dd878e09, type: 2} + - {fileID: -6465566751694194690, guid: fb6390f650ca44a5ba3246d8dda47927, type: 3} + - {fileID: 2800000, guid: 4dcc0502f8586f941b5c4a66717205e8, type: 3} + - {fileID: 3643467854515637935, guid: 29ff4b046e796f249b05a7e81fa48779, type: 3} + - {fileID: 6468678730395126332, guid: 29ff4b046e796f249b05a7e81fa48779, type: 3} + - {fileID: 2800000, guid: d4044ea2490d63b43aa1765f8efbf8a9, type: 3} + - {fileID: 2800000, guid: d50c5e07c9911a74982bddf7f3075e7b, type: 3} + - {fileID: 2800000, guid: 1134690bf9216164dbc75050e35b7900, type: 3} + - {fileID: 11400000, guid: a574bd8f87bbb214789326ff8ebcd547, type: 2} + - {fileID: 6911354475629904369, guid: 29ff4b046e796f249b05a7e81fa48779, type: 3} + - {fileID: 11400000, guid: da9f66a87cd612d4e847d191aa6df602, type: 2} + - {fileID: 1492562680585263202, guid: 29ff4b046e796f249b05a7e81fa48779, type: 3} + - {fileID: 2800000, guid: 96aaab9cc247d0b4c98132159688c1af, type: 3} + - {fileID: 6211218730862871007, guid: a43eba5748c938e45a7379f10a4a00fc, type: 2} + - {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + - {fileID: 2800000, guid: c94ad916058dff743b0f1c969ddbe660, type: 3} + - {fileID: -6465566751694194690, guid: 7d78a69be90ba2943972ae067bf105f9, type: 3} + - {fileID: 2800000, guid: 39451254daebd6d40b52899c1f1c0c1b, type: 3} + - {fileID: 11400000, guid: a43eba5748c938e45a7379f10a4a00fc, type: 2} + - {fileID: 2800000, guid: 071e954febf155243a6c81e48f452644, type: 3} + - {fileID: 2800000, guid: 51eee22c2a633ef4aada830eed57c3fd, type: 3} + - {fileID: 2800000, guid: 5cdee82a77d13994f83b8fdabed7c301, type: 3} + - {fileID: 6507293963593405235, guid: 29ff4b046e796f249b05a7e81fa48779, type: 3} + - {fileID: 2800000, guid: 47a45908f6db0cb44a0d5e961143afec, type: 3} + - {fileID: 2800000, guid: bd9e8c758250ef449a4b4bfaad7a2133, type: 3} + - {fileID: 2800000, guid: f0b67500f7fad3b4c9f2b13e8f41ba6e, type: 3} + - {fileID: 3481486763373117091, guid: 29ff4b046e796f249b05a7e81fa48779, type: 3} + - {fileID: 3736827584947447566, guid: 29ff4b046e796f249b05a7e81fa48779, type: 3} + - {fileID: 2800000, guid: 1097e90e1306e26439701489f391a6c0, type: 3} + - {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} + - {fileID: 2800000, guid: dd77ffd079630404e879388999033049, type: 3} + - {fileID: 2800000, guid: fd2fd78b392986e42a12df2177d3b89c, type: 3} + - {fileID: 2800000, guid: fa042edbfc40fbd4bad0ab9d505b1223, type: 3} + - {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3} + - {fileID: 11400000, guid: 3ca7fde3304d0a74ab996047791cd149, type: 2} + - {fileID: 2800000, guid: d1f1048909d55cd4fa1126ab998f617e, type: 3} + - {fileID: 2800000, guid: 179f794063d2a66478e6e726f84a65bc, type: 3} + - {fileID: 2800000, guid: bfed3e498947fcb4890b7f40f54d85b9, type: 3} + - {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + - {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + - {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3} + - {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} + - {fileID: 11500000, guid: 39fa3d8997a24136984ca6e2c99902bc, type: 3} + - {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + - {fileID: 11500000, guid: 78396926cbbfc4ac3b48fc5fc34a87d1, type: 3} + - {fileID: 2100000, guid: 91035448860ba4e708919485c73f7edc, type: 2} + - {fileID: 4800000, guid: 6c78a6dd468954643a87ebf0014bc305, type: 3} + - {fileID: 4800000, guid: 6dad35c0b62e44c26ab244ad80deee1a, type: 3} + - {fileID: 2100000, guid: 5ce51318bbfb1466188b929a68a6bd3a, type: 2} + - {fileID: 11500000, guid: 3cd3ae36070b87f43897030288198ece, type: 3} + - {fileID: 11500000, guid: 3dd7358ce993836479029d580437bb79, type: 3} + - {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + - {fileID: 11500000, guid: 6d9b8436bda385e42a42700d8993be80, type: 3} + - {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + - {fileID: 11500000, guid: b3db3de35fd9f354fb5b12074c7687b5, type: 3} + - {fileID: 11500000, guid: d85b887af7e6c3f45a2e2d2920d641bc, type: 3} + - {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + - {fileID: 11500000, guid: 389648ab9de94296b8f4a6f6957df101, type: 3} + - {fileID: 11500000, guid: 9fe2ca76abb7767459262e2c596bcebe, type: 3} + - {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + - {fileID: 11500000, guid: ce8b8bf51887c134abe0cc8e8ad942cc, type: 3} + - {fileID: 11500000, guid: 24f3912b25031ab45a327c312819030e, type: 3} + - {fileID: 11500000, guid: a15cfd4ae1a74894087d9cfc7fa83cc6, type: 3} + - {fileID: 11500000, guid: 95a0ff880fd9f5942880892d403f67be, type: 3} + - {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + - {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + - {fileID: 11500000, guid: 10de0d138ea1afc4f9eaf86af55076ff, type: 3} + - {fileID: 11500000, guid: 5628d889f0b759a47a296d5f332cdad5, type: 3} + - {fileID: 11500000, guid: ec7c531f67844491ae84a4f3d1575d01, type: 3} + - {fileID: 11500000, guid: f1b3b4b945939a54ea0b23d3396115fb, type: 3} + - {fileID: 11500000, guid: 0aa6c5437b8592a47a158038ecd836ae, type: 3} + - {fileID: 11500000, guid: 4553fc2fa22627b4e8a8926f8cff668e, type: 3} + - {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + - {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + - {fileID: 11500000, guid: 7424ed33554084b42abf8c1da79ac39c, type: 3} + - {fileID: 11500000, guid: 17488a2bea6f4126a7877ce5d934f865, type: 3} + - {fileID: 11500000, guid: d0082f6fc07879948911f80e5ca1e31f, type: 3} + - {fileID: 11500000, guid: bbb4e96b2ebafc246b85623c547a7d01, type: 3} + - {fileID: 11500000, guid: 7bd1ab91d6987874b990c073d62ad645, type: 3} + - {fileID: 11500000, guid: 9cbe519b68d07ad4285f091528d6a34d, type: 3} + - {fileID: 11500000, guid: 29ee900ba52849b49bfc33631b1e74a0, type: 3} + - {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + - {fileID: 11500000, guid: 9218f5903e52fa446af3c1b35c5ba207, type: 3} + - {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + - {fileID: 11500000, guid: 1e080f1606bf24d4cb31f55f7958812a, type: 3} + - {fileID: 11500000, guid: 411a4d7d5c0d8e549a85968925a3ff66, type: 3} + - {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + - {fileID: 11500000, guid: deeb12332c062954093c24a3fab10b83, type: 3} + - {fileID: 11500000, guid: a6b194f808b1af6499c93410e504af42, type: 3} + - {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + - {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3} + - {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + - {fileID: 11500000, guid: d6cc9dc07f6002a469a3d66a70755ed3, type: 3} + - {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + - {fileID: 11500000, guid: d1c4a04abae2e284384797a0c5044e99, type: 3} + - {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} + - {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + - {fileID: 11500000, guid: e393933351b7da9489595d2aeb25135d, type: 3} + - {fileID: 11500000, guid: 915fa416a9dc9354097548924eabe841, type: 3} + - {fileID: 2800000, guid: 619046f6f725b42f9a2b1575494d7fed, type: 3} + - {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} + - {fileID: 4800000, guid: 36e335017ad71d54fbb10842863188ae, type: 3} + - {fileID: 2800000, guid: 3f2b7a8431f40754f8f61fc1371a2946, type: 3} + - {fileID: 1641716054, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 7400000, guid: 698f07df3b0888942a036325ce82613f, type: 2} + - {fileID: 498530294, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 309354614, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 4191877325789217629, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 5010397983200453369, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 2100000, guid: b66cf7a186d13054989b33a5c90044e4, type: 2} + - {fileID: -1250311534, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 2005495386, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 89991696, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: -906160933, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: -665197882, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 970713790, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 2800000, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 2800000, guid: 48fd4c26301577c49987326c11f8b74b, type: 3} + - {fileID: 4800000, guid: cfbf95ed0fe6c554c8c2ee6c8325937c, type: 3} + - {fileID: 4800000, guid: fa95b0fb6983c0f40a152e6f9aa82bfb, type: 3} + - {fileID: 4800000, guid: 650dd9526735d5b46b79224bc6e94025, type: 3} + - {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} + - {fileID: 2800000, guid: 8df32e9f8bdc0034f9f4fe76cee00612, type: 3} + - {fileID: 4800000, guid: 8bdcdc7ee298e594a9c20c61d25c33b6, type: 3} + - {fileID: 4800000, guid: 53efa1d97f5d9f74285d4330cda14e36, type: 3} + - {fileID: 1212594532, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 4800000, guid: c61244023592f95479fddd71b5067683, type: 3} + - {fileID: 4800000, guid: b77e51f117177954ea863bdb422344fb, type: 3} + - {fileID: 4800000, guid: b2f45941d9f4fe9479ce1aebb9d63fbf, type: 3} + - {fileID: 2100000, guid: 4deba332d47209e4780b3c5fcf0e3745, type: 2} + - {fileID: 2800000, guid: 04a8994fc0ed2404cb76ca609b99e87d, type: 3} + - {fileID: -1162842595, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 2107803503, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 2800000, guid: 9c666bb5cb1ed7141b3a0f75b6384875, type: 3} + - {fileID: 7400000, guid: 8c3b795082b3e5a42b5d946259c864d2, type: 2} + - {fileID: 4800000, guid: 4e8caa36c07aacf4ab270da00784e4d9, type: 3} + - {fileID: 7400000, guid: 4a99889885a7a0b45b1d4e1847054913, type: 2} + - {fileID: 7400000, guid: 8f5867f4a6cf8b441887be6e30eba1f3, type: 2} + - {fileID: 7400000, guid: cd405ad9681636e4f9b08290c5f56f9d, type: 2} + - {fileID: -1554626089, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -115382010, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 1118419203, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 692792605, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 494224027, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -1902274339, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 4800000, guid: 68e6db2ebdc24f95958faec2be5558d6, type: 3} + - {fileID: 2100000, guid: 73f0f46d3177c614baf0fa48d646a9be, type: 2} + - {fileID: 2800000, guid: e408dfe0ac971ec4ba051d5ea5409e2d, type: 3} + - {fileID: 2800000, guid: a6f7d0a5a1f60b5418c0d7b8f72c91e1, type: 3} + - {fileID: 351649321, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 1960962760, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 267286335665872847, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 2800000, guid: 9c75448aaba29644fb4aabe6a37bcec6, type: 3} + - {fileID: 4800000, guid: a1e4ab34b07f81e4e94f0d241c416669, type: 3} + - {fileID: 9100000, guid: 32eb61e61d33c0a4fbd4efd72e1b72d0, type: 2} + - {fileID: 2800000, guid: 0fb3805d12084a546b64a73a987927d4, type: 3} + - {fileID: 2800000, guid: a88ccd5bf0b599945b18be3cd76c3e14, type: 3} + - {fileID: 2800000, guid: 0428eee2db4326547bc5e73d2f65ebf2, type: 3} + - {fileID: -1389002310, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: -852591673, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 2800000, guid: 92ac62b354485784fab7cd4167110ac8, type: 3} + - {fileID: -1449052731, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 2800000, guid: 51c11bee66d04f64d8d44afcb9975321, type: 3} + - {fileID: 2800000, guid: 25b136aa8d2b8f4428a45385c00f8493, type: 3} + - {fileID: 2800000, guid: 7c1f993b6fc12ac479816c733e4a7c12, type: 3} + - {fileID: 3986470523429011170, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: 4457544949394274766, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 1017054934, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 218928095, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 655609821, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 1073405259, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 2800000, guid: b519b8a1ceacfad4c834eb059d4004a7, type: 3} + - {fileID: 7023710827131052678, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: 9100000, guid: d73f9323f07764216b00227f2648356c, type: 2} + - {fileID: 2800000, guid: c7ef1b7221f0b5b4f94a1d2685ff92c2, type: 3} + - {fileID: 2800000, guid: 8de91ee4e8525bb46bb309c15c5207d3, type: 3} + - {fileID: 9100000, guid: f5727253e313a8946aac8bea614798bd, type: 2} + - {fileID: 225037820, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 7400000, guid: 417027f3b22e34a8f803d305c02209a9, type: 2} + - {fileID: 2800000, guid: 96e54b1b19146ab48a5653fcef2157c1, type: 3} + - {fileID: -90327864, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 10906, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10900, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10914, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10916, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10904, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: -1094472428, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: -122489167, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 1811881483, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -57953876, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 2800000, guid: 4e2159443b5aedf43849ec062f4f8016, type: 3} + - {fileID: 1992255983, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: -86020788, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: -655202485, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 755821569, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 235403813, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 2800000, guid: 8f9a3417a71e2a64bb906035f10cb24a, type: 3} + - {fileID: -479921750, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 1073272426, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 97315016, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 120118317, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: -1037889889, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 2800000, guid: 98f18d9519d31f44d898c3b2289ab273, type: 3} + - {fileID: -1801652203, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 1325686823, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 1022534276, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 2800000, guid: 2cf8faf4514a14547b8f056727e0a0f2, type: 3} + - {fileID: 2800000, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 1041362304, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 2800000, guid: 8549b299e8d6b894e9a11c4becb528a3, type: 3} + - {fileID: 1513449738, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 1636382774, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -1976019031, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -147191287, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: -1758643555, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 979630143, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -719164956, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 2800000, guid: ff92fed29107bb94e8011820502e8cb8, type: 3} + - {fileID: -29224999, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 2800000, guid: 63d5ad36e582f2e47bb93f15a1405552, type: 3} + - {fileID: 1430295171, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: -784785393, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 2800000, guid: 03de9c442181996409543cd79d5bfff3, type: 3} + - {fileID: 629622342, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -2105957229, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 1923017234970405295, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: 282528693430034096, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: 5089946160795761770, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: -524898274, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 2800000, guid: 8884154dfe85442a3a3578be807dbcdf, type: 3} + - {fileID: 2800000, guid: 78925fb45c6c09e42a2b053dacc9c696, type: 3} + - {fileID: 2800000, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: -6465566751694194690, guid: 76014f1b89b5d403c8ff1d5bdff04dc8, type: 3} + - {fileID: 2800000, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 1420123527, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 5116175286389725112, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 2800000, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 1893969389, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 1182616395320353421, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 2800000, guid: e7481c4658aa1544fabd8323173e4e6a, type: 3} + - {fileID: -1310341998, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 9181916891259220454, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: -1402590638, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 6664213692802274154, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 9100000, guid: 3b2988dbee1272f49a12a9b19fff3ef3, type: 2} + - {fileID: -1127003578, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 2045973955, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: -1157809890, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 5298106837865694066, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: -113908843, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 4291285538023367731, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 3050633509931874182, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: 6090708670001506049, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 613512721, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 1167838529877992243, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: 1625809349, guid: 222c2fb6de2f8334cbddd99bca1187af, type: 3} + - {fileID: 1454900464561917449, guid: 5d001eb1c848ebd468b622667d90cad8, type: 3} + - {fileID: 1867833522526193987, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 6805624194781434691, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 5042975899005958474, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 2100000, guid: 53bf0ab317d032d418cf1252d68f51df, type: 2} + - {fileID: 700613016, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: 236551299, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: -407860065, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: -660127364, guid: 12d02a5034793fe4e93fd5960d8e0dae, type: 3} + - {fileID: -1420012892, guid: 0edbe90c7b463ec4cbb41f4cff76437a, type: 3} + - {fileID: 2800000, guid: c0cab5e7cc9fc5147b3f0aef86b2feab, type: 3} + - {fileID: 2800000, guid: 976f9e77302ef0b44928c277d512ddad, type: 3} + - {fileID: 2800000, guid: 2d88aaa71c840f643ae9292549f5b217, type: 3} + - {fileID: 3526131180264739386, guid: f9e46dadb5448ee4883f8b114e9c6488, type: 3} + - {fileID: 2800000, guid: 72cbeee7e64220e4797ec9137c6e818f, type: 3} + - {fileID: 2800000, guid: 029718f470538364f90b28022d1bc838, type: 3} + - {fileID: 2800000, guid: 3cd2afc94f47c9c40afdbdc329b36b4c, type: 3} + - {fileID: 11400000, guid: dabfdeb80b25d44b4ace56414d0eb4ad, type: 2} + - {fileID: 2100000, guid: 0e5360dce269ccc42b822a424d66fbd4, type: 2} + - {fileID: 5785355462301107295, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: -1592395243, guid: 8f9a3417a71e2a64bb906035f10cb24a, type: 3} + - {fileID: 5657039867100983486, guid: dabfdeb80b25d44b4ace56414d0eb4ad, type: 2} + - {fileID: -5177388603050735206, guid: 8884154dfe85442a3a3578be807dbcdf, type: 3} + - {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 1678378241, guid: 78925fb45c6c09e42a2b053dacc9c696, type: 3} + - {fileID: 2100000, guid: 2e8245019faeb8c43b75f9ca3ac8ee34, type: 2} + - {fileID: 21300000, guid: 029718f470538364f90b28022d1bc838, type: 3} + - {fileID: 2100000, guid: 2880e34baca6ca04893136786677bf95, type: 2} + - {fileID: 21300000, guid: b519b8a1ceacfad4c834eb059d4004a7, type: 3} + - {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: -1869391695, guid: 92ac62b354485784fab7cd4167110ac8, type: 3} + - {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 21300000, guid: c7ef1b7221f0b5b4f94a1d2685ff92c2, type: 3} + - {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 21300000, guid: 0fb3805d12084a546b64a73a987927d4, type: 3} + - {fileID: 2100000, guid: e74a1f8978a7da348a721508d0d58834, type: 2} + - {fileID: -253798138, guid: 9c75448aaba29644fb4aabe6a37bcec6, type: 3} + - {fileID: 21300000, guid: 72cbeee7e64220e4797ec9137c6e818f, type: 3} + - {fileID: -742300318, guid: 25b136aa8d2b8f4428a45385c00f8493, type: 3} + - {fileID: 2100000, guid: 9c6ec24bca5fc42489fe47358fef0d4a, type: 2} + - {fileID: 5148248962339400161, guid: 9c308e38b5681564fbdbad324594baee, type: 3} + - {fileID: 21300000, guid: a6f7d0a5a1f60b5418c0d7b8f72c91e1, type: 3} + - {fileID: 21300000, guid: 8df32e9f8bdc0034f9f4fe76cee00612, type: 3} + - {fileID: 2100000, guid: bab24c479f34eec45be6ea8595891569, type: 2} + - {fileID: 693104896, guid: 63d5ad36e582f2e47bb93f15a1405552, type: 3} + - {fileID: 21300000, guid: 03de9c442181996409543cd79d5bfff3, type: 3} + - {fileID: -738154133, guid: 8549b299e8d6b894e9a11c4becb528a3, type: 3} + - {fileID: 21300000, guid: 51c11bee66d04f64d8d44afcb9975321, type: 3} + - {fileID: 24053408, guid: e408dfe0ac971ec4ba051d5ea5409e2d, type: 3} + - {fileID: 6803430367898605830, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 11400000, guid: f92d39c8c0ff1414790be3559bcfb1b0, type: 2} + - {fileID: 252613466, guid: 0428eee2db4326547bc5e73d2f65ebf2, type: 3} + - {fileID: 6803430367898605830, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 21300000, guid: 7c1f993b6fc12ac479816c733e4a7c12, type: 3} + - {fileID: 705683947, guid: 48fd4c26301577c49987326c11f8b74b, type: 3} + - {fileID: 5759877438722640172, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 2100000, guid: 19a626476403a2f40b9d0512f80d61d9, type: 2} + - {fileID: 21300000, guid: 976f9e77302ef0b44928c277d512ddad, type: 3} + - {fileID: 21300000, guid: 3f2b7a8431f40754f8f61fc1371a2946, type: 3} + - {fileID: 21300000, guid: 04a8994fc0ed2404cb76ca609b99e87d, type: 3} + - {fileID: 21300000, guid: 2cf8faf4514a14547b8f056727e0a0f2, type: 3} + - {fileID: 3359733629073227380, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 8188883071690808540, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 21300000, guid: a88ccd5bf0b599945b18be3cd76c3e14, type: 3} + - {fileID: 7026391210700039621, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} + - {fileID: 21300000, guid: 4e2159443b5aedf43849ec062f4f8016, type: 3} + - {fileID: 21300000, guid: 8de91ee4e8525bb46bb309c15c5207d3, type: 3} + - {fileID: -5815828137919646633, guid: dabfdeb80b25d44b4ace56414d0eb4ad, type: 2} + - {fileID: 4900000, guid: 0db0e54162d09e4418b99615e805310f, type: 3} + - {fileID: 11400000, guid: 9691d92a66d3a314ebe276a89b16a278, type: 2} + - {fileID: 6540940545668841618, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 8433118801875043656, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 6071652809713426445, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 223540656057325585, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 3625630352399287516, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 1816440787420948145, guid: 9c308e38b5681564fbdbad324594baee, type: 3} + - {fileID: 8902695159634601431, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 3230293767881956811, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 2011150234301735800, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 5472621884890045282, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 5149097851587875321, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 491169346809573176, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 8887727100253185871, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 3758087177579996834, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 7222870553785458360, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 8433118801875043656, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 6071652809713426445, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 223540656057325585, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 3758087177579996834, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 7222870553785458360, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} + - {fileID: 725714798138964366, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 1311751278713342195, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 8433118801875043656, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 6071652809713426445, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 223540656057325585, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 3758087177579996834, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 7222870553785458360, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 4900000, guid: e766c251b86f5284289007c365c5711c, type: 3} + - {fileID: 8197882333532536118, guid: 9c308e38b5681564fbdbad324594baee, type: 3} + - {fileID: 7619189173913017875, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 7001217081995887542, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 7302970204975976092, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 4888250272685488326, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 2071167804784121970, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 2134338451334938886, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 21300000, guid: ff92fed29107bb94e8011820502e8cb8, type: 3} + - {fileID: 5491020201375474307, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 7083250868190644559, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 2789272209311033423, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 1094699508538862306, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 2978111754004746161, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 5106576306180920836, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 2596367034953283962, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 882719813517343284, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 6132398822233404055, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} + - {fileID: 1582184245155240560, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} + - {fileID: 2100000, guid: b5a894fc9a151b344a9c895424eeb9c3, type: 2} + - {fileID: 3706504544906550696, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 21300000, guid: c0cab5e7cc9fc5147b3f0aef86b2feab, type: 3} + - {fileID: 7789239037478010140, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 5076311270583622601, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 5685570007726524012, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 5374833599872650054, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 2071167804784121970, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 2134338451334938886, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 7789239037478010140, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 5076311270583622601, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 5685570007726524012, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 5374833599872650054, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 2842611899938369659, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 2155908598707014642, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 2071167804784121970, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 2134338451334938886, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 5076311270583622601, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 5685570007726524012, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 5374833599872650054, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 7789239037478010140, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 6589613949975249672, guid: 9c308e38b5681564fbdbad324594baee, type: 3} + - {fileID: 1661535404182067004, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 7824403418140734982, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 6645972450045353238, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 4101085107370292335, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 6337954123549054090, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 9221717543066437816, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 8259920586739715282, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 7989580489010594267, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 5335711924286401983, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 3628541221857890036, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 2450872379730654498, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 4911810367816925254, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 3883942027792696304, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 3435787241198268361, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 8961549178773681412, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 776608766868378085, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 8461792016795150690, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 4941728443369462308, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 4212467653893752218, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 3054546740606442343, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 1839875203839790714, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 8712155336118520010, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 5739841026593938405, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 4729266705832386297, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 531444438312304192, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 4598984850650190293, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: -1656092153, guid: 8549b299e8d6b894e9a11c4becb528a3, type: 3} + - {fileID: 2954143415441238988, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 5998049003291468664, guid: 87f21262cc4185343b43e1f62249a4d1, type: 3} + - {fileID: 4853683510948787164, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 1160946019933672463, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 2931407939481811866, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 4089435305627964134, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 518296394508512790, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 9003605852727699106, guid: 5fcdc9afc13ca2e49bc954e4fd607a47, type: 3} + - {fileID: 4853683510948787164, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 1160946019933672463, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 2931407939481811866, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 4089435305627964134, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 518296394508512790, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 9003605852727699106, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} + - {fileID: 6830682350495907633, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 1250835500097346222, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 4200239664524397730, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 951644923240543435, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 4701413917664573218, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 7408726339065734494, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 4853683510948787164, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 1160946019933672463, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 2931407939481811866, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 4089435305627964134, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 518296394508512790, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 9003605852727699106, guid: c1dcd8694a0c4554ab7f60b916d212fc, type: 3} + - {fileID: 7237199766590788570, guid: 9c308e38b5681564fbdbad324594baee, type: 3} + - {fileID: 5844400383110585303, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 359412535063798887, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 21300000, guid: 9c666bb5cb1ed7141b3a0f75b6384875, type: 3} + - {fileID: 21300000, guid: 2d88aaa71c840f643ae9292549f5b217, type: 3} + - {fileID: 4096120251720973767, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 1816397420139864216, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 8523288493677748864, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 1240827510856092693, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 7333115641744115712, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: -2016289844, guid: c0f4fb57990493240b82d65e307a1846, type: 3} + - {fileID: 596334599, guid: 21e4be4a341e655458aa1b8455d3860f, type: 3} + - {fileID: 5557490299732771653, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 5033678235981047717, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 1554072011379340431, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 301908192988068060, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 2155411910842643407, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 2275496072578920733, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 3981473352066336261, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 553588331708226939, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 2953333486680660764, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 6679847304593375419, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 9140966058133963248, guid: 9c308e38b5681564fbdbad324594baee, type: 3} + - {fileID: 3305063903973033772, guid: 9c308e38b5681564fbdbad324594baee, type: 3} + - {fileID: 5233229767190891088, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 7921971957933687573, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 6939558171657399220, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 144498693429315535, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 7359522310736043695, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 5097570944488985431, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 8665516546863895637, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 3904437696116363940, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 6023757579985556140, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 7947080285353656384, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 7824580626068687686, guid: 2116ffd228314c745b8615652b11d19e, type: 3} + - {fileID: 21300000, guid: 619046f6f725b42f9a2b1575494d7fed, type: 3} + - {fileID: 85948947277134488, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 1487526085746003340, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} + - {fileID: 1160244810, guid: e7481c4658aa1544fabd8323173e4e6a, type: 3} + - {fileID: -479173315, guid: 98f18d9519d31f44d898c3b2289ab273, type: 3} + - {fileID: 11500000, guid: 54b5aaa88dea1da42ae7d417eba96d42, type: 3} + - {fileID: 11500000, guid: 4683062e9e9ee89418800940508d474c, type: 3} + - {fileID: 11500000, guid: 0529eda213efaa9429a7095d9516f811, type: 3} + - {fileID: 11400000, guid: 9adcc081767771e4098f523ee1fffa07, type: 2} + - {fileID: 8300000, guid: 757b9f9d3afb0b240a064767538b9e47, type: 3} + - {fileID: 8300000, guid: d1f140d54184dc7449198f540d98d305, type: 3} + - {fileID: 8300000, guid: bdc02245c217c51458d29812cbf59a6a, type: 3} + - {fileID: 24500006, guid: ae14a59e484da75438db3648143481f0, type: 2} + - {fileID: 8300000, guid: 3ba3ebbe3bd52984eb49c0cdb9656ceb, type: 3} + - {fileID: 8300000, guid: b39f9177550643b47a5cf81681fae1b1, type: 3} + - {fileID: 8300000, guid: a7c4714bdbfdb764a8c19b58dbdf4d47, type: 3} + - {fileID: 8300000, guid: 3120a718e36ab39419f53318deed3976, type: 3} + - {fileID: 8300000, guid: 47e3d7492b6075a41b87468bf9801fcf, type: 3} + - {fileID: 67364633892410427, guid: 3fbb4ace392baa04da5f5cb3ad6e12e0, type: 3} + - {fileID: 8300000, guid: ad209d56abe14534ab002d8cc2bbeb6e, type: 3} + - {fileID: 11400000, guid: f5c890c4ba0370e4e9226493ad883bb7, type: 2} + - {fileID: 8300000, guid: 84cab9cfe04fab24c9fa375814a421e4, type: 3} + - {fileID: 8300000, guid: de54536a55703434b8ad53b9a7da3d35, type: 3} + - {fileID: 8300000, guid: a2d3dc594ae8766419bdb9044bc5c9e0, type: 3} + - {fileID: 8300000, guid: 57e09a61748af294aa6010c75327d90e, type: 3} + - {fileID: 8300000, guid: fe650001176ef0b46910e6c831e7a232, type: 3} + - {fileID: 8300000, guid: 9b6504a200c0254409913f789b0d2c52, type: 3} + - {fileID: 24300002, guid: ae14a59e484da75438db3648143481f0, type: 2} + - {fileID: 24100000, guid: ae14a59e484da75438db3648143481f0, type: 2} + - {fileID: 8300000, guid: 558fbfb24c5221245a28e2e788576ae2, type: 3} + - {fileID: 8300000, guid: b957166fc81b93c4f911b3b1dab9abd6, type: 3} + - {fileID: 8300000, guid: bba999e50f96520418edd9d14ad56ad6, type: 3} + - {fileID: 8300000, guid: 080b4e76403b9d34781e34993de1f81b, type: 3} + - {fileID: 8300000, guid: 1190226caf0381c498c12a1498316f76, type: 3} + - {fileID: 8300000, guid: 09f44db4335288b42a4eecdc0ea0c62d, type: 3} + - {fileID: 8300000, guid: 7e5c81f4703b8cf4c89b143917577923, type: 3} + - {fileID: 8300000, guid: 7c619b42e5894ee4db14168ce657a8dd, type: 3} + - {fileID: 8300000, guid: 916b477636e0e544daf41db98f09e3ce, type: 3} + - {fileID: 2675715275340035989, guid: ae14a59e484da75438db3648143481f0, type: 2} + - {fileID: 8300000, guid: 33b70dfe29fa0e74c98f7799d8778a16, type: 3} + - {fileID: 8300000, guid: 1373958964471074798e638e86f93c0d, type: 3} + - {fileID: 8300000, guid: 9f7a05f93cb12c144a00d3f4ca198b91, type: 3} + - {fileID: 8300000, guid: 9eea98e7da25be74f9e8b63f8a9f6f19, type: 3} + - {fileID: 7212275451918744368, guid: 3fbb4ace392baa04da5f5cb3ad6e12e0, type: 3} + - {fileID: 6298833975904028666, guid: 3fbb4ace392baa04da5f5cb3ad6e12e0, type: 3} + - {fileID: -2540351765735581840, guid: ae14a59e484da75438db3648143481f0, type: 2} + - {fileID: 8300000, guid: d856659eaf333ee49b2aa7354bf3796f, type: 3} + - {fileID: 11500000, guid: 43706eeab92a104469481ab6075dde4a, type: 3} + - {fileID: 11500000, guid: 137091cb8deacc14da9ee9469a96cfc8, type: 3} + - {fileID: 2800000, guid: cda1d961a563b6143a024170ed6f0f44, type: 3} + - {fileID: 2800000, guid: 8ef64d8ac85ff4681987c8b621bef86b, type: 3} + - {fileID: 21300000, guid: cda1d961a563b6143a024170ed6f0f44, type: 3} + - {fileID: 21300000, guid: 8ef64d8ac85ff4681987c8b621bef86b, type: 3} + - {fileID: 2800000, guid: 514247b5965aef447b13b5da95f3281a, type: 3} + - {fileID: 21300000, guid: 514247b5965aef447b13b5da95f3281a, type: 3} + - {fileID: 11400000, guid: af2d6c8bcf8dd2047869a9a6fd87ffb9, type: 2} + - {fileID: 618044731825249279, guid: ccb8b4cf4e054704a8bfa9e1334764a7, type: 3} + - {fileID: 4884681451738066898, guid: ccb8b4cf4e054704a8bfa9e1334764a7, type: 3} + - {fileID: 4019578663844880581, guid: ccb8b4cf4e054704a8bfa9e1334764a7, type: 3} + - {fileID: 11500000, guid: 6ff2dc3fa7a6be445bf8e71043f86d2e, type: 3} + - {fileID: 11500000, guid: 4d0390bd8b8ffd640b34fe25065ff1df, type: 3} + - {fileID: 11500000, guid: cadf87e7c55229e4985e5cdc9e7b2b97, type: 3} + - {fileID: 11500000, guid: 77cb3821bc2d2f74b85d8e49b0395064, type: 3} + - {fileID: 11500000, guid: 0096d36771e12834592c1d58bf8358a3, type: 3} + - {fileID: 11500000, guid: 737fbf4a77d2f4842b261bd1b795f5a1, type: 3} + - {fileID: 11500000, guid: a9f120c62f52d5d46bafda26f121a310, type: 3} + - {fileID: 11500000, guid: 5534bdef0c121a34eb71394c0c70fe0c, type: 3} + - {fileID: 11500000, guid: 62899f850307741f2a39c98a8b639597, type: 3} + - {fileID: 11500000, guid: 7faa64a828219b44cb0eb5bfbfa83524, type: 3} + - {fileID: 11500000, guid: c1832000a0f2b5d45b277c98a748c359, type: 3} + - {fileID: 11500000, guid: d7c20927144715848888b335473c5bf0, type: 3} + - {fileID: 11500000, guid: 820a2fd35e41433d82f8272f13473435, type: 3} + - {fileID: 11500000, guid: e10b9e7f73cb07c4e8dd98aa4b10a97d, type: 3} + - {fileID: 11500000, guid: d15d270547a76a547b91e71c596e4fc7, type: 3} + - {fileID: 11500000, guid: 0777d029ed3dffa4692f417d4aba19ca, type: 3} + - {fileID: 8523211495174882546, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 7608738450534251423, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 4202938607248792743, guid: a833011c24a0166499bb1482b1f3b2e5, type: 3} + - {fileID: 8837987156302345275, guid: c2dcf20bc51f1b242961ed33da1867ac, type: 3} + - {fileID: 7400000, guid: e4faf49fc8b0c144d8c2a79fed7c3543, type: 2} + - {fileID: 9133338980149026694, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 5662889510980965141, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -3204992135469483134, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 8652026564429111343, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -5411097385205464217, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -5678076920946459352, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -9073108797845903621, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -2130665544896635304, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 7386425078254453756, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -3075048693740337369, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 211312044542259247, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -7264380394888667038, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 4115920633166267615, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -5953609903805028780, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -9122206709035583997, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -6230190510390866434, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -8423494383954947910, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 877046381003724980, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 97539586369888396, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 2800000, guid: 1f009742488154fcb97d11404bc5a866, type: 3} + - {fileID: -960481538, guid: 1f009742488154fcb97d11404bc5a866, type: 3} + - {fileID: 3808140985359726233, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 7400000, guid: 8225cf4fb8d780f4da74eb343488237a, type: 2} + - {fileID: 7400000, guid: 9f05bb89ed7085e43a607922b7f14ae9, type: 2} + - {fileID: 5522812681064789136, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 2667949614841947897, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 9100000, guid: a853f79841ae4884592d67b4dba300fd, type: 2} + - {fileID: 4800000, guid: 0406db5a14f94604a8c57ccfbc9f3b46, type: 3} + - {fileID: 2800000, guid: 93f8abb6df8f9f348910ec6328660560, type: 3} + - {fileID: 303914191248036739, guid: 3bdcc98283a948542a0b86cc209070d1, type: 3} + - {fileID: 2100000, guid: 35b072e7a7dfe0f429bf5123cfc9a433, type: 2} + - {fileID: 5649266429755611942, guid: 3bdcc98283a948542a0b86cc209070d1, type: 3} + - {fileID: 2800000, guid: a4280d58393322842afb10bcbcfc2a83, type: 3} + - {fileID: 6909896828301235070, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 2800000, guid: d771f7709ddd21f43a8d6ea0573d4f88, type: 3} + - {fileID: 2800000, guid: 75c822b01a637d547abc69e6f1f590b4, type: 3} + - {fileID: 7400000, guid: 8cd6c873f7a755549b544fa90b733869, type: 2} + - {fileID: -6465566751694194690, guid: 9b4e681081e2b4c469111bb649e2f7ee, type: 3} + - {fileID: -3100369314251171874, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 2667949614841947897, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7400000, guid: bc014660364fb1048939b9b3b16053ef, type: 2} + - {fileID: 7400000, guid: abab70d66c74a4d4780dc81a1b5737ed, type: 2} + - {fileID: 7400000, guid: 9e4778555214b4d429df96f3b84b6b10, type: 2} + - {fileID: 7400000, guid: 8cfe37b6beab25c4e8ae55a7575ac32e, type: 2} + - {fileID: -3797204096501760660, guid: c2dcf20bc51f1b242961ed33da1867ac, type: 3} + - {fileID: -6465566751694194690, guid: 2ae669fb2106b9c4c9fe1f07564e3fb5, type: 3} + - {fileID: 8720172026895097594, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 3578158055856138037, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2299165570471671705, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 6500360544332142168, guid: c2dcf20bc51f1b242961ed33da1867ac, type: 3} + - {fileID: 1857411358778313187, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 4957135928800448375, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 6514537981938955338, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 5552900821118767950, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 931525354138686054, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 3975655479270767043, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 9191882928904143614, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 1236259117, guid: 1f009742488154fcb97d11404bc5a866, type: 3} + - {fileID: -1182294553, guid: 1f009742488154fcb97d11404bc5a866, type: 3} + - {fileID: 2588569807151803337, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 2100000, guid: 1bafc7aca6a15ce4a92553883cdf5612, type: 2} + - {fileID: 6903633346656192685, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 7400000, guid: ca3c514e04cb41a48816d372ab1e9071, type: 2} + - {fileID: 2800000, guid: c164f9cd69bbdea4fb535a9e6624bea8, type: 3} + - {fileID: 2800000, guid: 64f13eb4d14d52f45a75c9e741dbbf8e, type: 3} + - {fileID: 3155538962647367913, guid: 1e5a4659704853944abea5a17e13cf6a, type: 3} + - {fileID: 2800000, guid: 7d59ae2be6260054db426fe96a2f217d, type: 3} + - {fileID: -8540832944191789790, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 8842556938668532038, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 2482873589965228132, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -2708405932515165879, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7414131888971756592, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -8491270915927727279, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -3328434381802528436, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 1825319529750142893, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -986075251332770354, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -3660300481513293558, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -7336129006373879803, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 314836917132208407, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -4057824189658882187, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -5676063425892692060, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 1495765941559451746, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 2673277784656510627, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7647125809099135066, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 1829974661663830687, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -7539677618690639295, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -5746243717921055779, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 6450559367394009326, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 1022299056725829792, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -7330508827711092842, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 1587993407618024185, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7125293203650736703, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -1886102513309244554, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -2236658673280625294, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7464747088723063719, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -7053859854731117362, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -246377619162188687, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -8910233782443103351, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 5074171851503986758, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -593530978813535299, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -4665969359783447086, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 3046325850537428308, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 8355407047057278999, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 531808216999434893, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -5238447988111708349, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 3167164698273632755, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -2343593065518401393, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 3281824216133067538, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 1000478860194645677, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -6405820590031011402, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 8450779600869156891, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 2770976869746131170, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: -3100369314251171874, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 2100000, guid: 8c8ec7f6096f3654989f118bd767030d, type: 2} + - {fileID: 3033537662187923395, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -2693056187368311098, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 5184523171927287766, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -8235170841148880371, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -1750194370219178006, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 4756864213286410935, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 4040061753010727598, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 6229803037504010689, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 4010818287206423529, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -4053654354307959872, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 4124850773902862070, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -4366721053727917600, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -3589362433014018674, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 1363422056328517653, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -3862805103302402338, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -643761589136525347, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -8634219885328462433, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 5340048592208790007, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -3785830539903465732, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 6340001065433092570, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -7553988919368407184, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7400000, guid: ab6fed51b6721c54b93fa13229c486d8, type: 2} + - {fileID: 817830973935461002, guid: 1e5a4659704853944abea5a17e13cf6a, type: 3} + - {fileID: 6303706055160295254, guid: a833011c24a0166499bb1482b1f3b2e5, type: 3} + - {fileID: 5649266429755611942, guid: a833011c24a0166499bb1482b1f3b2e5, type: 3} + - {fileID: 7129937038805248097, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 8237639153318220906, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 1041270033902676250, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 3021404074123323282, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 172359321545107054, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 4913157416812608228, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 7400000, guid: 17f2b42253dd3d3469dba4824a446877, type: 2} + - {fileID: 2100000, guid: 15dffb989e1e0f2428eff569b0f2176e, type: 2} + - {fileID: 2800000, guid: ced64313bee1c75418fd571037d8b6e2, type: 3} + - {fileID: 6303706055160295254, guid: 3bdcc98283a948542a0b86cc209070d1, type: 3} + - {fileID: 2100000, guid: e653836c30661fe419b8992e230ca189, type: 2} + - {fileID: 2100000, guid: d05bd487e32791148ab238ebabb0154b, type: 2} + - {fileID: 7400000, guid: 8fe0fe11deca7064aaba73b53537cbb8, type: 2} + - {fileID: 7400000, guid: f0b72fc309aeadd46b19c72f4f21d838, type: 2} + - {fileID: 3463168523754412398, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 4300000, guid: e0e726a0fdbabcf4e9f96b91ac0b43a8, type: 3} + - {fileID: 195447075763637701, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2800000, guid: 28cf82738e24d8446a1c95a26d2815ac, type: 3} + - {fileID: 2100000, guid: c69a36694c3d44847ae1097a253e3d56, type: 2} + - {fileID: 2100000, guid: f49f152fbc313b14b8d4b82329b10a1c, type: 2} + - {fileID: 7400000, guid: 8526f5cf0075aba489ce87145b2c63cc, type: 2} + - {fileID: 3571989582097847120, guid: 15c02fef22ba8d0488bd2517167c117c, type: 3} + - {fileID: 6290149650087484560, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 466568360635751902, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 2100000, guid: c78b5dacb6e1a8343bb1dfe2c4161830, type: 2} + - {fileID: -4387554898721441884, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 5262333800500164290, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -2318313422443197754, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -7005232074561256871, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 7495377549732510922, guid: 1e5a4659704853944abea5a17e13cf6a, type: 3} + - {fileID: 8663005856679327762, guid: 1e5a4659704853944abea5a17e13cf6a, type: 3} + - {fileID: 7266951372888583716, guid: 1e5a4659704853944abea5a17e13cf6a, type: 3} + - {fileID: 11400000, guid: dcdf413967412a640a3ac782eacb0274, type: 2} + - {fileID: 592785132350250237, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 3889238742570113982, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 6458719908533317799, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 5016381395342745780, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 1951754024224882079, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 6401154187219196241, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2495992002276153849, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -6784843102938823166, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -8734568474861324231, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -6598741468600560582, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -1448534508439064450, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 6470166299010896407, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -8842590583836025036, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -3108277205920478454, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -3030634035499231212, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 8193033228689126025, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -8273695093530358050, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -7532279746763670837, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -6690643586923134871, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -364200943543637980, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 5655127320682784782, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -7825454764802691781, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -8967544251284020822, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -3882585022272345765, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 676376719021367935, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7075474257182208009, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -3100369314251171874, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 8979130989535966673, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 106698934443907460, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 4824747399692395738, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 6697035683559506932, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 8540731795983184644, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 4232639908567197356, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 6665537370103338180, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 6066371733532865879, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: -944628639613478452, guid: 4ed6540e2f7ce234888adf8deff1f241, type: 3} + - {fileID: 3031446967001791208, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 3595549026020545614, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 5268425867109018701, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 6951320512859863136, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 9129295631914427799, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 260539324676461127, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 5558898291459354456, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 326920787583948413, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 3677775080446906429, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 1758207864085720564, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2100000, guid: 5c6f6dc6f5c647d4896df9a909d6c27b, type: 2} + - {fileID: 7185106063436424164, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 7940137286573491114, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 5924460052927079761, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 1138361732303759377, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2843044327798540053, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 7805731264604482165, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 371148070849559966, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2816558696095329648, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 522031830802304584, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 181082763061672982, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2668222795840865044, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 7703285855213251677, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 7714032901381169533, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 1438057503697394046, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 2757545352209246517, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 2822332239933845861, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 5277500497718899772, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 1775994428899805634, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 7561472229917000040, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 1689695726710083789, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 1335406244022022339, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 134332083069605836, guid: 15c02fef22ba8d0488bd2517167c117c, type: 3} + - {fileID: 8498857183467131732, guid: 15c02fef22ba8d0488bd2517167c117c, type: 3} + - {fileID: 5216316606707966932, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -2179394121972868036, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -2023734143735051328, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 3236668227237534731, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -5472159978636247889, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -6270372541800257525, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -2048442621677367856, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -8712036087130512418, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 6087372731431999613, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -681468879781609945, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -8577015288507903767, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 1284081814770730683, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -654349129930127435, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 8858935084139627780, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -9154204961782164589, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -3658744280763577496, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -2197278150333076600, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 5445867137363800702, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -8674120543164084762, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 7659963852650702022, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -604151334296838673, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 9051303996272931366, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2} + - {fileID: -8328923581568760697, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 8975283155893490419, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 4202938607248792743, guid: 3bdcc98283a948542a0b86cc209070d1, type: 3} + - {fileID: 2608582141572372013, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 668700138157159316, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: 720105171981244406, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 5248791774366520289, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 6636962609156518995, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 2529266238260754337, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: -8328923581568760697, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 2100000, guid: d386c5d9fb941e845b73fe6da5491ef2, type: 2} + - {fileID: -5869044117486680500, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -322004189133710111, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -7894599878622159676, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: 4417422381666895957, guid: defcc8125c9264ebc9dc3d4026bcb572, type: 3} + - {fileID: -1308681663333604698, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -8328923581568760697, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 2800000, guid: c191bbcd4d376b54b9d57e6a123f8bcc, type: 3} + - {fileID: 303914191248036739, guid: a833011c24a0166499bb1482b1f3b2e5, type: 3} + - {fileID: 1334795410731873908, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 2688124830562386187, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: -2264134398461997840, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 5125986236380728396, guid: 3799083e0fb2447b58c45499eaf37bd0, type: 3} + - {fileID: 1689986941183409899, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 3780603419577646224, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -2794606292626086200, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: -3006075075442775636, guid: 88b84319f88e542e495fc1f6338dc3ab, type: 3} + - {fileID: 4972099471441740458, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 772523062139676571, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 6037295500444404884, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 6067424721370455243, guid: 04437dbea0cb46d46be53d3485123127, type: 3} + - {fileID: 5599672199513990317, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 6973015436857840903, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 1303832589037280572, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 2341278095816243569, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 1163190013876559808, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 5393712549455760630, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 1687744242681369861, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 5628175451341321614, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 5467966265256530379, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 3300320933713496835, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 2210477463040319674, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 872406797510628833, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 117400938292242756, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 8808625293449173486, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 5470484224291366173, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 4849186222139400814, guid: 9a925f0054269ad419a329cc57282256, type: 3} + - {fileID: 5000761949575151087, guid: e413af9ec3215ec489c48e645012001b, type: 3} + - {fileID: 4126124698954513285, guid: 680ce017bd2b7d34a99245242d032120, type: 3} + - {fileID: -886117696, guid: 1f009742488154fcb97d11404bc5a866, type: 3} + - {fileID: 9078792792682551363, guid: 5cf7cd372801c784a9875e0740cf9038, type: 3} + - {fileID: 11500000, guid: 4132c767aaeea7f43b8b894bde7b7351, type: 3} + - {fileID: 11500000, guid: e22dd2055785c2f4dadcf76fb593edf4, type: 3} + - {fileID: 11500000, guid: 9b4027f974cd5234690df1b35ca492ac, type: 3} + - {fileID: 11500000, guid: 9ebe6250da0dfa044937230037499988, type: 3} + - {fileID: 11500000, guid: 03802f3276c69a348aaa2515377b47cc, type: 3} + - {fileID: 11500000, guid: 44b4a96e2c7bdd54fada7ad0fda0d360, type: 3} + - {fileID: 11500000, guid: 619bc0c8098f9a841b08d6cf4d9c1e91, type: 3} + - {fileID: 11500000, guid: f7fe40513dd0a794689cc8a52ddb2f87, type: 3} + - {fileID: 11500000, guid: 1f91e197a0d142b40ae1ec8bd1300fb3, type: 3} + - {fileID: 11500000, guid: e9ef15b6f3b8cbb4183cc1fb292075d1, type: 3} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 4586681201290156434, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 3619548578334970641, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 1538076562463171835, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 2800000, guid: ddde5976023f9be4e83dc3d867c2dc30, type: 3} + - {fileID: 2800000, guid: c1ee8c5dfbcb42f44989195af63be483, type: 3} + - {fileID: 2800000, guid: aef7fd596cbfc854d87f408c14951641, type: 3} + - {fileID: 2800000, guid: 527440f24542af142a67219f2bcbeec4, type: 3} + - {fileID: 2800000, guid: b38089ff4046ac044ba79dfa5116aa1b, type: 3} + - {fileID: 2800000, guid: d0748411047fc4a41beb1fb8d551e01e, type: 3} + - {fileID: 2800000, guid: ee344f47787d148448bd3373235281b6, type: 3} + - {fileID: 4538620355157734178, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 8962037734629874353, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 5230300119859652240, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 8471258236918393110, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 2971245722111912602, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 2641341650102689817, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 2800000, guid: 6a4cd8cdf11fe024e8ecac8e3d60e10d, type: 3} + - {fileID: 2800000, guid: 7f08919123d8bb84194bd4be22c0dee8, type: 3} + - {fileID: 2800000, guid: 600806d36167cb140aa40eb51cf58afa, type: 3} + - {fileID: 7693093380867172793, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 5611097802189151736, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 7139087245191076382, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 1213944631846556705, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 6571627757838084943, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 6797541371746253169, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 1777118904505739796, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 8398256425230104591, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 2892646396809658206, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 7800910912080005402, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 7318945919643335357, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 4118003989274753329, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 6379393736901080379, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 2800000, guid: 0cf23778fd0b2994c9d608fbbf185468, type: 3} + - {fileID: 1142385021392869841, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 21300000, guid: 91d99e534e5f3c04094b14ed920bec04, type: 3} + - {fileID: 7437393363680573610, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 6982527102261555248, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 3378123960707539081, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 5809621762725332659, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 6456374894027647221, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 9204324581217121349, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 2432715703240688563, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 2800000, guid: 006ddfea49149f948a7f39950227d31d, type: 3} + - {fileID: 2800000, guid: c55f4b0a55a391d488e54a28dc840509, type: 3} + - {fileID: 7246700043603192740, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 2289935194962299514, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 55493208507484042, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 5417538234839529700, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 5640860986811951834, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 2800000, guid: 71954183dfb02424d835d964c2eb3fc6, type: 3} + - {fileID: 2800000, guid: 335f1df58cd58914f97fe9ccae7f6c8c, type: 3} + - {fileID: 11400000, guid: d912288eee347ea4b98718ff38ef5d78, type: 2} + - {fileID: 2460885915603615930, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 8185780986250253390, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 1370112280380943697, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 11400000, guid: d7011c71193e95743aa868ca1bea6010, type: 2} + - {fileID: 72705275807094440, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 1780246568786771203, guid: e9c7980309400054090fd241ac425802, type: 3} + - {fileID: 2762223215237867485, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: -1537282960, guid: c1ee8c5dfbcb42f44989195af63be483, type: 3} + - {fileID: 5297442833789713246, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 3593684458396504088, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 627252455323728319, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 6184589903683220238, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 21300000, guid: 527440f24542af142a67219f2bcbeec4, type: 3} + - {fileID: 6756372828448640595, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 21300000, guid: 6a4cd8cdf11fe024e8ecac8e3d60e10d, type: 3} + - {fileID: 1324807197757922518, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 21300000, guid: b38089ff4046ac044ba79dfa5116aa1b, type: 3} + - {fileID: 379906068891137872, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 21300000, guid: 71954183dfb02424d835d964c2eb3fc6, type: 3} + - {fileID: 21300000, guid: d0748411047fc4a41beb1fb8d551e01e, type: 3} + - {fileID: 21300000, guid: 335f1df58cd58914f97fe9ccae7f6c8c, type: 3} + - {fileID: 21300000, guid: 600806d36167cb140aa40eb51cf58afa, type: 3} + - {fileID: 21300000, guid: c55f4b0a55a391d488e54a28dc840509, type: 3} + - {fileID: 7619155687079591265, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 21300000, guid: 576d6ff3856f8ef419586ff12f2742b5, type: 3} + - {fileID: 21300000, guid: 7f08919123d8bb84194bd4be22c0dee8, type: 3} + - {fileID: 21300000, guid: ee344f47787d148448bd3373235281b6, type: 3} + - {fileID: 21300000, guid: 0cf23778fd0b2994c9d608fbbf185468, type: 3} + - {fileID: 6400894162898819538, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 11400000, guid: 9e1384a77106eb845ad86d6834ba9a52, type: 2} + - {fileID: 1513751791682743921, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 11400000, guid: 7b282dfe68d23cd48a8f437ae2cd7dde, type: 2} + - {fileID: 11400000, guid: b28d3497d1f428046bc82469f2056bac, type: 2} + - {fileID: 271498015662217203, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 21300000, guid: a8c45767f0a3ec245a47087c7ada2b50, type: 3} + - {fileID: 2800000, guid: a8c45767f0a3ec245a47087c7ada2b50, type: 3} + - {fileID: 2800000, guid: 216cb30d7010e95499c22161ccfde634, type: 3} + - {fileID: 2800000, guid: 1506abfb2ff26fa4aacdeb4b0efc9663, type: 3} + - {fileID: 2800000, guid: 404e93e2e77f60b49bbcbf1df18904d3, type: 3} + - {fileID: 21300000, guid: aef7fd596cbfc854d87f408c14951641, type: 3} + - {fileID: 21300000, guid: 404e93e2e77f60b49bbcbf1df18904d3, type: 3} + - {fileID: 21300000, guid: 216cb30d7010e95499c22161ccfde634, type: 3} + - {fileID: 2800000, guid: 2fc24dca6ce6ac94da0187dfce24fa3a, type: 3} + - {fileID: 21300000, guid: 2fc24dca6ce6ac94da0187dfce24fa3a, type: 3} + - {fileID: 21300000, guid: 1506abfb2ff26fa4aacdeb4b0efc9663, type: 3} + - {fileID: 115998474870636236, guid: e9c7980309400054090fd241ac425802, type: 3} + - {fileID: 6751494179874491372, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 4648285208244819224, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 21300000, guid: a575a803ef0529e43bcbbe8ccdbb34b2, type: 3} + - {fileID: 2800000, guid: a575a803ef0529e43bcbbe8ccdbb34b2, type: 3} + - {fileID: 1505211282054036597, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 2909533541407981610, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 2173167918881327799, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: -473816185, guid: 006ddfea49149f948a7f39950227d31d, type: 3} + - {fileID: 3361235759547244541, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 7379103909061988499, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 674323407039969650, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 6775969391593346456, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 179937079751348093, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 8218406547424483500, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 2252586209868520252, guid: e9c7980309400054090fd241ac425802, type: 3} + - {fileID: 8764364725249863370, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 2800000, guid: 576d6ff3856f8ef419586ff12f2742b5, type: 3} + - {fileID: 8141102490971775899, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 8043919875794167790, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 1610583026884195458, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 11400000, guid: 1e74e5d3760c6a74c820233d292733c1, type: 2} + - {fileID: 3930562537327335166, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 21300000, guid: ddde5976023f9be4e83dc3d867c2dc30, type: 3} + - {fileID: 2800000, guid: 91d99e534e5f3c04094b14ed920bec04, type: 3} + - {fileID: 7973014042992492397, guid: 28a379482be867746aad889c0f1c3c79, type: 3} + - {fileID: 2829248495233098512, guid: bb0dfd08f3e9d944f808e61d886581e7, type: 3} + - {fileID: 4051362114917035253, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 5028824454365225125, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + - {fileID: 11500000, guid: b12f20c9ea730974d8a9415e88f24e24, type: 3} + - {fileID: 8387747698985620347, guid: 1f1852e60e7132046b79863fb1d23af0, type: 3} + - {fileID: 3904427873695393554, guid: 1f1852e60e7132046b79863fb1d23af0, type: 3} + - {fileID: 2321255064315590360, guid: 1f1852e60e7132046b79863fb1d23af0, type: 3} + - {fileID: 11500000, guid: 7db47b22035146e99a970c69de743a1f, type: 3} + - {fileID: 3078068293865059253, guid: e4f3702d2bd51af41ac161d64cfc9ba5, type: 3} + - {fileID: 4682371864663492182, guid: e4f3702d2bd51af41ac161d64cfc9ba5, type: 3} + - {fileID: 1440274300042700162, guid: e4f3702d2bd51af41ac161d64cfc9ba5, type: 3} + - {fileID: 479823629690914954, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 479823629690914954, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 479823629690914954, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 479823629690914954, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 11500000, guid: 787288dc6b6ba3a47b6deca211317c89, type: 3} + - {fileID: 11500000, guid: 7ab08469541b2aa45818fa36bbcb9cf7, type: 3} + - {fileID: 11500000, guid: 72638ccfaf7778d42808e233d2eb6e8c, type: 3} + - {fileID: 11500000, guid: 373b52eb9bf8c40f785bb6947a1aee66, type: 3} + - {fileID: 11500000, guid: 8d7b55c7ecdb49a4a89fa5e6f9022861, type: 3} + - {fileID: 11500000, guid: f1f3fbad52bf14f4a919767bb32ac24f, type: 3} + - {fileID: 11500000, guid: c2b2766be55cd5143abce97e8c22303b, type: 3} + - {fileID: 11500000, guid: add43bc825f942044b87c758a6832b68, type: 3} + - {fileID: 11500000, guid: f6bfcc5a4ee0dbf4392ae05fd1c81877, type: 3} + - {fileID: 11500000, guid: a64578247383140469c45370654a984a, type: 3} + - {fileID: 11500000, guid: 39a3ea52f4f05d643be41bd78f1f2b9f, type: 3} + - {fileID: 11500000, guid: f6eb1402c17e84a9282a7f0f62eb584f, type: 3} + - {fileID: 11500000, guid: 274b80ab5b659c646ba9338870d14625, type: 3} + - {fileID: 11500000, guid: d247ba06193faa74d9335f5481b2b56c, type: 3} + - {fileID: 11500000, guid: 77f586f285b3847808d79083bd19ef1f, type: 3} + - {fileID: 11500000, guid: 75b48aa4b99043cb9e665a892ec46c75, type: 3} + - {fileID: 11500000, guid: 66fdf8d5019aaec4bab62570407b9cd1, type: 3} + - {fileID: 11500000, guid: 03e84488b3da65549a78d481636713a3, type: 3} + - {fileID: 11500000, guid: be4f815e5e3c0d5459559bdc0b8bbbfb, type: 3} + - {fileID: 11500000, guid: 4291963c8b013de498435ab3a9250323, type: 3} + - {fileID: 11500000, guid: 9dd1d4a57e5f2dc4ba2346bf6359f094, type: 3} + - {fileID: 11500000, guid: 9cf18446a5e200f40b666b079ae87895, type: 3} + - {fileID: 11500000, guid: 005338f1228de6148ac3211b067122cb, type: 3} + - {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3} + - {fileID: 11500000, guid: 935899b62f48ae5498594680ed17d133, type: 3} + - {fileID: 11500000, guid: 7a961f486af9bbe4583b1037d23298cc, type: 3} + - {fileID: 11500000, guid: 35b689d0205d778479b0dac3b159c3b4, type: 3} + - {fileID: 11500000, guid: c593457cd8105e148906690e1707c592, type: 3} + - {fileID: 126151493480433323, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: 1a4f3c20594f16b49ba571734aa21edd, type: 3} + - {fileID: 2800000, guid: b93d1d9adc811a74fb4192ade70fd3cc, type: 3} + - {fileID: 2800000, guid: a327d1fc80d90bd438cfcd1ad2b219c7, type: 3} + - {fileID: 126151493483491779, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493473201319, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493484884023, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 813964778509222274, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 1471674300321268583, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 1693440396389174230, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2781393898199067900, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 1702261025824090784, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 7800018367225963417, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 9027939020919762395, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 17978457728262906, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7555773783659772986, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 7934990094814782445, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 1469338590548789471, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + - {fileID: -1187402735487829229, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2234961990804426782, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 4526462685262723681, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2800000, guid: bb299176ee03f63468d9bb59a8998669, type: 3} + - {fileID: 7260635347182713621, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493473085455, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493484984327, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493484747657, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493483491779, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493473201319, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2800000, guid: d9dbcf5d304083541a40ff4b3cb9048f, type: 3} + - {fileID: 2800000, guid: 45e4676179dde7e42bb09b8d94935f34, type: 3} + - {fileID: 2800000, guid: 58964556f1712324b9d9ac4515f965aa, type: 3} + - {fileID: 2800000, guid: 4708f67b3712d4743af7cb6092edf3c7, type: 3} + - {fileID: 2800000, guid: 70238c4151e9085429d18be7f6f8a2ae, type: 3} + - {fileID: 2800000, guid: 8de251475e5862f4b96ba45c2de88bd5, type: 3} + - {fileID: 5779388445178769873, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 1980321908532173225, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 9114641952602576849, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3349212535167819167, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4214257357730566845, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 1745629821853633206, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2397117528733804567, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 3035760932289101816, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: e7b746bc5bff9d64fb1129b9aa8ccf3e, type: 3} + - {fileID: 126151493483402833, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4695570078806668131, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2865472997366421434, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 1693440396389174230, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 5913499722605887790, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2313114958873670484, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 7800018367225963417, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 9027939020919762395, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 5023560089133695211, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: b7f09c3867e11ae4cb69aeb93463acd6, type: 3} + - {fileID: 2800000, guid: 2c41d544537d6ee4a8ecd487b2ac9724, type: 3} + - {fileID: 126151493473085455, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493484984327, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493484747657, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493483491779, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7400000, guid: 0ba32211bb8ed944392b21a33b101791, type: 2} + - {fileID: 6080095273351670320, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7400000, guid: 853fc541aa274d449b139d19d76a1381, type: 2} + - {fileID: 7293985954889289183, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 3748026497419659573, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2588384133887034894, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493484984327, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2294203980036400646, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3997433578879793141, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 6143040481414904668, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3323121370063268586, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4797239585124274237, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7164452667333806733, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 1180174675498993111, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 3455991743305696554, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 8501950329115254991, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7006898020876140759, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2800000, guid: f2e81a0445323b64f973d2f5b5c56e15, type: 3} + - {fileID: 2800000, guid: 466393baecf741d449a05f3b63317368, type: 3} + - {fileID: 5703157694525971125, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 5775851810944980805, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2800000, guid: 1acb09a93fb040241a17107a288d6f54, type: 3} + - {fileID: 3223831381304380030, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2696847083913771481, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2126300665920959538, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7778607702383981085, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 6477577619473515126, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2781393898199067900, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2615952973387112450, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 8922295334492411225, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 5339802213853544233, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7867425088098090583, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 6606567362296327409, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3571829164687521184, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 5622065931100864621, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2100000, guid: ee61efd036130b847b41f878f20ddf33, type: 2} + - {fileID: 2800000, guid: 21ac4e0eced0c8c4894e7e26f5d13779, type: 3} + - {fileID: 900873228679836253, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: 4d0b5b10aaf1d26438a2f013882ad1f6, type: 3} + - {fileID: 2100000, guid: cc610b9acc31ccb41befa5093f0db428, type: 2} + - {fileID: 3748026497419659573, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: 10aff9c324ace24489de5aa827c664ed, type: 3} + - {fileID: 126151493473085455, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7835622629792856689, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 7192483373850935599, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 10300, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 7438534416270888028, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2800000, guid: b1b88ceef90370a4295ed9f58140349a, type: 3} + - {fileID: 2800000, guid: d0b6eba4ac33ece44bccd11e57e415e8, type: 3} + - {fileID: 2961986041977982893, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: -2302002259734456648, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: 137237bf3c5ec304d940dcb2456b22eb, type: 3} + - {fileID: 1525362837287448682, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 5953080908505751474, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2106642157007834423, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 7122983875714221022, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 957405049979454141, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 17978457728262906, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 5339802213853544233, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 1469338590548789471, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 5279376384905517670, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2961986041977982893, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 900873228679836253, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 944025264553094021, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 957405049979454141, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 3522711200750599228, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 3246820009601671544, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 4695570078806668131, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2865472997366421434, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 1693440396389174230, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 4214257357730566845, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2701686536347770701, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 5779388445178769873, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2126300665920959538, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 7778607702383981085, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 6477577619473515126, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2294203980036400646, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2781393898199067900, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 7164452667333806733, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 3455991743305696554, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 8501950329115254991, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 6143040481414904668, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 7812544424410854405, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 4017910736750065323, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 7968416963393953827, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 7522674838449308991, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 7867425088098090583, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 6606567362296327409, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 6636669882459272717, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 6778029842967471712, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 6949773729929066594, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2800000, guid: 1d6e6fd96eb499f42b79f04f3510af87, type: 3} + - {fileID: 126151493485040859, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7400000, guid: 26b9ff14f098f4247a4857154f0a8264, type: 2} + - {fileID: 126151493485040859, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493484884023, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493484754027, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493483402833, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 126151493480433323, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 3571829164687521184, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 7293985954889289183, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 813964778509222274, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 529038307721658883, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2397117528733804567, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 5913499722605887790, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2615952973387112450, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 3748026497419659573, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2588384133887034894, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 8922295334492411225, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 1965571076280249317, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2800000, guid: 7579ee4fd1c5ed34d939eeef18c625be, type: 3} + - {fileID: 2100000, guid: 4b69878329f04c541838d4c090ad9978, type: 2} + - {fileID: 5448710479845601065, guid: 3e8a6ee872b4e7e4fa263e0623657598, type: 3} + - {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 7778607702383981085, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 6477577619473515126, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 8501950329115254991, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 6143040481414904668, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7812544424410854405, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7968416963393953827, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 1965571076280249317, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 944025264553094021, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 957405049979454141, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 5622065931100864621, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2800000, guid: 400a47b8bcd0a1e4b823160ce9f40232, type: 3} + - {fileID: 126151493484754027, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 17978457728262906, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2100000, guid: 33fe0716974723b4db51774fcb38b8c7, type: 2} + - {fileID: 7400000, guid: 4e723352b8ebe9540a29335860b85a4a, type: 2} + - {fileID: 126151493484754027, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493483402833, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 3571829164687521184, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2397117528733804567, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 6636669882459272717, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 6778029842967471712, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2961986041977982893, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 1333026624613754047, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 900873228679836253, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493483491779, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2701686536347770701, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 5779388445178769873, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7778607702383981085, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 6477577619473515126, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2294203980036400646, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2781393898199067900, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2397117528733804567, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7164452667333806733, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2615952973387112450, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 3455991743305696554, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 8501950329115254991, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 8922295334492411225, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 3226241112093390236, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 5913499722605887790, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 5339802213853544233, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 5279376384905517670, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 6143040481414904668, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7812544424410854405, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 4017910736750065323, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7968416963393953827, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7522674838449308991, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7867425088098090583, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 6606567362296327409, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 6636669882459272717, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 6778029842967471712, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 6949773729929066594, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7800018367225963417, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 9027939020919762395, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2322101151879677010, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2588384133887034894, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 944025264553094021, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4017910736750065323, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7522674838449308991, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7867425088098090583, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 6778029842967471712, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 5279376384905517670, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 126151493485040859, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 126151493473201319, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 9047629830516719732, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2800000, guid: 121ed7da4e55d2a43ba798a00f95a474, type: 3} + - {fileID: 7260635347182713621, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 5622065931100864621, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 17978457728262906, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 3035760932289101816, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 1143287283172291005, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 3035760932289101816, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 4558604739080582945, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 8884531212319162473, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 4214257357730566845, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2701686536347770701, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2126300665920959538, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 8780093359852370517, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} + - {fileID: 3522711200750599228, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3246820009601671544, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 21300000, guid: bb299176ee03f63468d9bb59a8998669, type: 3} + - {fileID: 5913499722605887790, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7812544424410854405, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4017910736750065323, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7968416963393953827, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 9027939020919762395, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: -1187402735487829229, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 1469338590548789471, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 3522711200750599228, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 3246820009601671544, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 3035760932289101816, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: -6465566751694194690, guid: 8daa1b13f763ae74f8630c7a631dd327, type: 3} + - {fileID: 8836230403992314849, guid: 3e8a6ee872b4e7e4fa263e0623657598, type: 3} + - {fileID: 1853779330485108260, guid: 3e8a6ee872b4e7e4fa263e0623657598, type: 3} + - {fileID: 7260635347182713621, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493473085455, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493484984327, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 126151493484747657, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 5622065931100864621, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: -1187402735487829229, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7260635347182713621, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493484747657, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 1188822424991952652, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 126151493485040859, guid: 6c1ef58eadd33b64081c2586a3ac56a8, type: 3} + - {fileID: 2294203980036400646, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 7164452667333806733, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 3455991743305696554, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2253494483373869651, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 5201084102013748843, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3779548209033231211, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 1762902410085267039, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2003013367103612971, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2209729715339278869, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 5334241922927599777, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 813964778509222274, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7293985954889289183, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4034770193240481967, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 451645589626288957, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 5279376384905517670, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2701686536347770701, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 5779388445178769873, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 2615952973387112450, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 566939879778710709, guid: 3e8a6ee872b4e7e4fa263e0623657598, type: 3} + - {fileID: 1965571076280249317, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 8635185869177028421, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: ca9bef724b43e0b489043b7f18d4eddb, type: 3} + - {fileID: 4931792955855104974, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7522674838449308991, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: 284734c4624b35b499152e028f90e6f6, type: 3} + - {fileID: 6949773729929066594, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 7800018367225963417, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 5339802213853544233, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 2973381882573389317, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 5024482427928425524, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 126151493480433323, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 1830317875510668177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + - {fileID: 9100000, guid: 62b8011547f389344ba48f87b2ada51c, type: 2} + - {fileID: 126151493484884023, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4695570078806668131, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2865472997366421434, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 6606567362296327409, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 6636669882459272717, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: 6949773729929066594, guid: b692f61d994a0b94cb92cf0f2d47cfb2, type: 3} + - {fileID: -1187402735487829229, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 8922295334492411225, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 1132331773129038564, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 4474176736289550761, guid: 23195e611c71ad44b8a1ccb2b6e0efe5, type: 3} + - {fileID: 2800000, guid: 02ff51bea8718c447bea8470257b6782, type: 3} + - {fileID: 126151493473201319, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493484884023, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493484754027, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493483402833, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 126151493480433323, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 3571829164687521184, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 7293985954889289183, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 813964778509222274, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 3748026497419659573, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2588384133887034894, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2961986041977982893, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 900873228679836253, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 1965571076280249317, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 944025264553094021, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 957405049979454141, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 1469338590548789471, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 3522711200750599228, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 3246820009601671544, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 4695570078806668131, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2865472997366421434, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 1693440396389174230, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 4214257357730566845, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 2126300665920959538, guid: fb1e288d64b813b4a9929ba9ece44956, type: 3} + - {fileID: 21300000, guid: ca9bef724b43e0b489043b7f18d4eddb, type: 3} + - {fileID: 11400000, guid: bde86f268240d1041a808e449d9cac43, type: 2} + - {fileID: 2100000, guid: 288a49bf884b6fc4bbb57fe5d2f4da06, type: 2} + - {fileID: 21300000, guid: e7b746bc5bff9d64fb1129b9aa8ccf3e, type: 3} + - {fileID: 11400000, guid: 702b1ed0ce71d1b4aa1ddbce67e475a1, type: 2} + - {fileID: 11400000, guid: 4607b374e49ab734da548949f9e10fed, type: 2} + - {fileID: 11400000, guid: 5fd0220da8e388e4c872a9fcc80d2c76, type: 2} + - {fileID: 21300000, guid: d0b6eba4ac33ece44bccd11e57e415e8, type: 3} + - {fileID: 21300000, guid: 466393baecf741d449a05f3b63317368, type: 3} + - {fileID: 21300000, guid: 7579ee4fd1c5ed34d939eeef18c625be, type: 3} + - {fileID: 21300000, guid: b1b88ceef90370a4295ed9f58140349a, type: 3} + - {fileID: 21300000, guid: d9dbcf5d304083541a40ff4b3cb9048f, type: 3} + - {fileID: 21300000, guid: 45e4676179dde7e42bb09b8d94935f34, type: 3} + - {fileID: 21300000, guid: 58964556f1712324b9d9ac4515f965aa, type: 3} + - {fileID: 21300000, guid: 4708f67b3712d4743af7cb6092edf3c7, type: 3} + - {fileID: 21300000, guid: 70238c4151e9085429d18be7f6f8a2ae, type: 3} + - {fileID: 21300000, guid: 284734c4624b35b499152e028f90e6f6, type: 3} + - {fileID: 21300000, guid: 21ac4e0eced0c8c4894e7e26f5d13779, type: 3} + - {fileID: 21300000, guid: 4d0b5b10aaf1d26438a2f013882ad1f6, type: 3} + - {fileID: 21300000, guid: 02ff51bea8718c447bea8470257b6782, type: 3} + - {fileID: 21300000, guid: 8de251475e5862f4b96ba45c2de88bd5, type: 3} + - {fileID: 21300000, guid: 400a47b8bcd0a1e4b823160ce9f40232, type: 3} + - {fileID: 21300000, guid: 121ed7da4e55d2a43ba798a00f95a474, type: 3} + - {fileID: 21300000, guid: 1acb09a93fb040241a17107a288d6f54, type: 3} + - {fileID: 21300000, guid: 1d6e6fd96eb499f42b79f04f3510af87, type: 3} + - {fileID: 203741387490724426, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 8469578238684922817, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 11400000, guid: 7528ceb2f7ed9cc4896ce2c45aa65338, type: 2} + - {fileID: 7264946127367919962, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 11400000, guid: b46524e0380db8a4caaa3000e32b5e04, type: 2} + - {fileID: 2100000, guid: eaf5a1e524cd8ae439ec7b6036090474, type: 2} + - {fileID: 11400000, guid: 700e4713e87b6d146a693ed991e100ae, type: 2} + - {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + - {fileID: 11400000, guid: b0bc839e3f6d6c543a7d5fe737a03747, type: 2} + - {fileID: 11400000, guid: 20060a2c2207f3d46850db03d6cad991, type: 2} + - {fileID: 5927803667513949971, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 5897095096647521783, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 11400000, guid: d96ab46e9aca1d142b153e02ea521a2a, type: 2} + - {fileID: 11400000, guid: 90f596bc1a735a544985584af0b4180a, type: 2} + - {fileID: 6077686033771388879, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 4900000, guid: 2104e4991d2094242aa5a4fb0f96195f, type: 3} + - {fileID: 809828747251277026, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 8857736056138880520, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 11400000, guid: e66e17116e430574581abd6de7ae17c7, type: 2} + - {fileID: 21300000, guid: a327d1fc80d90bd438cfcd1ad2b219c7, type: 3} + - {fileID: 4900000, guid: d1e49c07997c1e24ab298d4ed814d780, type: 3} + - {fileID: 6573029777669831799, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 672328621937310823, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 4900000, guid: 8d96d7ecccc2c5d44b90e2e5139ffe66, type: 3} + - {fileID: 448666238080501561, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 8706977556548979489, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 518127318724380104, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 2031130517716483139, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 5283979766428437608, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 9051734368958672969, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 4900000, guid: 365b60be853946e4f968c1b8721bc730, type: 3} + - {fileID: 4648856348934307791, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 2208202000667084415, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 2329383759875125794, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 3083982375352769699, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 8975593228546502023, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 5524435718143244307, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 8125060520352921212, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 6533109861150454071, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 21300000, guid: b7f09c3867e11ae4cb69aeb93463acd6, type: 3} + - {fileID: 21300000, guid: b93d1d9adc811a74fb4192ade70fd3cc, type: 3} + - {fileID: 1758248222668310114, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 348095166571333313, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 3996022858690271652, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 3877278820156969299, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 9089684746352979517, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 8882126931405454339, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 4449425060840402790, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 5880162929375296893, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 862317723917198843, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 951013978585823788, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 5039804892998841666, guid: d02f28b2bb526af478050f2f027be8e9, type: 3} + - {fileID: 11500000, guid: 8ed3a2b9a6425d147bc79e8a53a4fea1, type: 3} + - {fileID: 11500000, guid: be934bb7ffdbf164a91f2932a3ca12d0, type: 3} + - {fileID: 11500000, guid: 02ad0ead42640754d821166bbeec1306, type: 3} + - {fileID: 11500000, guid: 1057413123c928f4ca0b33940946713e, type: 3} + - {fileID: 11400000, guid: a507c4b54129aae4eb7b26d0d2c00b6c, type: 2} + - {fileID: 11500000, guid: 0ba39e8f5b5e09c48bc162905f6ce8f5, type: 3} + - {fileID: 11500000, guid: 27e68e079d48afa43b19c14dd2dbbeaf, type: 3} + - {fileID: 11500000, guid: e9888f0d13032ad4bb14acdba3472d3a, type: 3} + - {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + - {fileID: 11500000, guid: 62cc181fd85762c43ba3dfb6bf475aca, type: 3} + - {fileID: 11500000, guid: 73ee3d99442035942b6dd1ede25ff7cd, type: 3} + - {fileID: 11500000, guid: 1c6f5c1f45c7c7e428a2b54e01467f5b, type: 3} + - {fileID: 11500000, guid: 77c812308255e374f83c1e475bc0c826, type: 3} + - {fileID: 11500000, guid: 37f9837a261a7d04ab92e117a5389cc2, type: 3} + - {fileID: 11500000, guid: 3636a79541e359942a7e392895f66751, type: 3} + - {fileID: 11500000, guid: 0a44b96aa95563e4dbd81da44328a697, type: 3} + - {fileID: 11500000, guid: 2168d38d221b35c4ba543877f39e93ae, type: 3} + - {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + - {fileID: 11500000, guid: 37afc2e97a9c8aa4aad3a5c306155f36, type: 3} + - {fileID: 11500000, guid: dddab24af7a02a54c9631fd5c532d7c4, type: 3} + - {fileID: 11500000, guid: ab8b685e62a9aeb4a9472b30ec2d86d9, type: 3} + - {fileID: 11500000, guid: e9a9540f98bb79346b296ec5feb51073, type: 3} + - {fileID: 11500000, guid: 06a595362371054409f908a284e235c4, type: 3} + - {fileID: 11500000, guid: 31f62120d7385ae41b003e28625fba63, type: 3} + - {fileID: 11500000, guid: a45f62c4800696843aa9a7e59ecfc0da, type: 3} + - {fileID: 11500000, guid: 004c59bce9a55654e98abb835847385d, type: 3} + - {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + - {fileID: 11500000, guid: 3b24a5606b164c84db0d3ed3ee8256e1, type: 3} + - {fileID: 11500000, guid: cf59e9c601bf0354baa2d3daac7d491e, type: 3} + - {fileID: 11500000, guid: 05399fb241106df4fbea2cb9b72f8a5b, type: 3} + - {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + - {fileID: 11500000, guid: 24796e3cc17ac9148ba0787e8cc26dd0, type: 3} + - {fileID: 11500000, guid: 6c9d27989a5b06848886a48c124164a0, type: 3} + - {fileID: 2800000, guid: 8fbfa1bc77a0388499f83f32b410eea3, type: 3} + - {fileID: 10910, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 2800000, guid: 4de85c90bbe61ed4bb3d67de9ab26f64, type: 3} + - {fileID: 2800000, guid: 23dc4f9bfdcb0984995e1a58909e85d2, type: 3} + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + - {fileID: 101180, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 168688, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 121952, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 162630, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22512050, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22496680, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11424526, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22454582, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22201382, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11421968, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11455538, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22441426, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22224858, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11400498, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22410808, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22221378, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11452156, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11400838, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11457502, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11411984, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 155762, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11458734, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11466480, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11413806, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11411294, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 191022, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22480558, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22413186, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22495498, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11450052, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11404786, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11465558, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11473324, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11432482, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22456466, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22495766, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11482462, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11452756, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11413288, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11487986, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11401308, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11469808, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22451830, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11462688, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11491532, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11481438, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22469798, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11484122, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11421068, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11481080, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11473988, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11493954, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11494650, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11436604, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11485500, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22450706, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11467302, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22272358, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11497068, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22218530, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11473704, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22288868, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22469686, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22223000, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11484472, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22472742, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22257836, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11477048, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 193956, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11428642, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11484772, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11430624, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11495484, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11447230, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11486648, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 159256, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 140558, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22429670, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11405928, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11473894, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11489786, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11415866, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 131212, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 105778, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 136800, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 114678, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 178848, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22487244, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11422712, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11456524, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11445008, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11451356, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22461342, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22418282, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22473690, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22497246, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 183118, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 192326, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 158816, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 21300000, guid: 23dc4f9bfdcb0984995e1a58909e85d2, type: 3} + - {fileID: 126380, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 192068, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 151316, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22295716, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 21300000, guid: 4de85c90bbe61ed4bb3d67de9ab26f64, type: 3} + - {fileID: 22400840, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22451644, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22416348, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 189590, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11486156, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11477322, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 197518, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22476200, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 134804, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11486952, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 195160, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 155778, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11455502, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 124946, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 195742, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 148926, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 195372, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 144792, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11414438, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11406956, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22405738, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 105722, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11442834, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 145072, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11475640, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 108382, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11459826, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 142326, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11454964, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11444152, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11495446, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 105356, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11419926, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 147312, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 111414, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 197542, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11405770, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11403458, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11423302, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 186548, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11420970, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 120300, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11410206, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11467252, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22439828, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22450140, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22402976, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22441626, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 168454, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22493252, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22407088, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22420426, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22483838, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 110286, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22430722, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22462038, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22407546, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22465036, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22402088, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22459188, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22435418, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11461066, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11423052, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11451262, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22253428, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11454220, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 9556136, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11424752, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11483934, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22260226, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22570914, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11429188, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11498324, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11468914, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 9567330, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22222550, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11487422, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22580066, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 9590998, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22262104, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11439330, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22523202, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 9541122, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11458418, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11432276, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22287538, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11408284, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11483732, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22493478, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22274480, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11426762, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11420542, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11417816, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22259886, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22597702, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 9508472, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 147350, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 21300000, guid: 8fbfa1bc77a0388499f83f32b410eea3, type: 3} + - {fileID: 163594, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11411650, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11403010, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 131216, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 164884, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11438236, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11499256, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 131822, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 196152, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11455562, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22498406, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 142408, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 173950, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 2800000, guid: 2af0b3d0c6b321c43b9e73aeb637d776, type: 3} + - {fileID: 2800000, guid: 59a5e9bd0630df84aaa81faa40b8d0ae, type: 3} + - {fileID: 164772, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11437824, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22481992, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22436064, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11450908, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22433532, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 199834, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 137636, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 167038, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22454054, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22423222, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22452586, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22482406, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22410494, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22490548, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22414516, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22431530, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22400310, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22460086, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22460362, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22483514, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22423754, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22422554, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22269882, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22283998, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22224046, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22474240, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22299134, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11422022, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11414880, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22417012, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22291288, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11419322, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11488978, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 168102, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11461846, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11439096, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22253680, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11452594, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11463298, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 140792, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 113818, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22476160, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22429428, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22229878, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11468506, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22426276, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22287680, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11400152, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22269150, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11445082, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11406400, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11455802, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22455066, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22272478, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22247592, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11448924, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11438886, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22234110, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11488086, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11412978, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22499420, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22265250, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11454818, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22204900, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11416870, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11469932, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11441632, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22224188, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11437994, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11432834, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11407766, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22273994, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11428720, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22422838, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22229710, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11479106, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11494868, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22264180, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11479272, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22529778, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 9527512, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22200326, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11415722, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11444728, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11478940, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22280946, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11455794, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22469954, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22284462, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22418836, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22299644, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11456950, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11482686, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11444116, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11438050, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22432542, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22205638, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11454642, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11475138, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11408158, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22224890, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11499428, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11432858, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11487614, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 158652, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 172520, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 114592, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11488726, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 198638, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 168580, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11403056, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 140452, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 194450, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 119650, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11482852, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 194548, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22464092, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 110298, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22433720, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22492402, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22406880, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22496262, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 104370, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22420436, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 187668, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22407934, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22492416, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 108394, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22455308, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22466470, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22493552, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 162124, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22414768, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22413376, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22279188, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11499948, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11405680, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11430224, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11410188, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11426566, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11433550, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22271180, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11417198, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11474474, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22213980, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11444196, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22281074, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11485034, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11438106, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22243452, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11482492, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22445010, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22239856, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11426090, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11462680, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 3994075428067327857, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11448592, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22243540, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11468546, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11446000, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22234934, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11467452, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11408064, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22296534, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11435868, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11400246, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11484188, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 188788, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 100490, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 142926, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 161640, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22489492, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22472254, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 199290, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22454240, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 165426, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22400912, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22424574, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 170186, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 144020, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 154912, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22498666, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22497964, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22219264, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11422758, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11489268, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 11461346, guid: a5c98dfcec76e1847a0aa8d7c8a93459, type: 3} + - {fileID: 22274782, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11417706, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11432460, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 22236054, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11480126, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11485196, guid: 720348da784b8fa49a7c48365da6f1b1, type: 3} + - {fileID: 11415598, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22251914, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11449092, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22285646, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11427206, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11407600, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22230922, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11489698, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11419764, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11436452, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22237540, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11499706, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11459064, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22207540, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11454908, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11438342, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22205872, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11465210, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11495842, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11432672, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22237692, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11416972, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11418844, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22457182, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22255444, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11488222, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22218714, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11427372, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11409764, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22474374, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22233130, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22221994, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11438330, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11453284, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22273912, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11496716, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11444678, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11469012, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11413106, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11470506, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11469572, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 193910, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 194902, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22402904, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22476578, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 140512, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22482552, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22407206, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22485260, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 125564, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 175904, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 189950, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22423904, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 177654, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22435934, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22401766, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22460958, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22510962, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22216216, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22228592, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22227490, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22228422, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11422768, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11458604, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22223450, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11450778, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11417042, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22470088, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22258270, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11457062, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11498042, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22216496, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11461418, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11479346, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11419828, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 9558232, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22257704, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11494592, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22223126, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22267948, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11418480, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 167830, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11435794, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11483786, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 109788, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22400070, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 194316, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 128456, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 182688, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 100110, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 168116, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22201054, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11478334, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11468178, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22211306, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11451562, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11427450, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22258646, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11433896, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11459138, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22290732, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11462008, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22221542, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11414100, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11469552, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11469894, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22290434, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11498076, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 102452, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 165220, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 105602, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 199998, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22431844, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 192054, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22430292, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 199736, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22459650, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 108284, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22497996, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 181040, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 101282, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 162308, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22419024, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 114524, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22281022, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11493008, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11441550, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22250058, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11499922, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11477444, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22221684, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11413662, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11452754, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 114555351785628864, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22225464, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11455540, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11425710, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 114694, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 22255000, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11421820, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22290622, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22273242, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22244532, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11417498, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11491772, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11492404, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22236094, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11411222, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11441886, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22232120, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11446052, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11477214, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22216158, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22283772, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11408754, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22234602, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11410068, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11462546, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22225148, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11430496, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22224580, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 104230, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22447718, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 183820, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22439574, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 112572, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 22281526, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 11400186, guid: 5ba51781a19f8a843abeb2d304d0d26e, type: 3} + - {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 22291704, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11474276, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11414442, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11405564, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 11494582, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 140086, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 144140, guid: f40d1072f56eeb04f9c104b7c4a8811f, type: 3} + - {fileID: 3968797931627039814, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7802726116992026524, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4754778393725211080, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2382818168980100834, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 11500000, guid: 353433a78f14e1b42bef6e12dd1f5700, type: 3} + - {fileID: 11500000, guid: 7489636ad0f8f9f429c6fb58ed56c052, type: 3} + - {fileID: 11500000, guid: 2260638226a46a7449ce75e44fbc33f0, type: 3} + - {fileID: 11500000, guid: a2680665f39463b4aa942cfae231132c, type: 3} + - {fileID: 11500000, guid: 0dbd41efa5688944084c710e7c96b2ad, type: 3} + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + - {fileID: 2412005730841698030, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7286810831673551018, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9066042117827779007, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8466251074060810337, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2423939650945700340, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2425714307504208985, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3039539044441016948, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8981600568517828593, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2427769277271403221, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3041734789311159544, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2691751171824002982, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2909299011334683773, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2433325292870030126, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2812349543582470963, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3725755277872878036, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7685676113815625783, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3899283788639839163, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 372616988475041668, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6352077975763665964, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1056535843830866143, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4220077551263625968, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9148609207601415348, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4226336187088876603, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7294462034967935486, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7845124789487403959, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6286047176011809989, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4232864541200696149, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7382706830754798891, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7341392989669816271, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7204162085841344275, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5417164583851304283, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7938943022242207557, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4237299025220143979, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4245592065139993919, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7926919413132184154, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5312385976081225420, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4252650995293300477, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4267803695837448808, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5311763444684529439, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5296446491536475732, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4304269266440926087, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4304875998671902778, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6077686033771388879, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 3246572212746126634, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 6002212477853164771, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 10552927628938223, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6897448753749313066, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7835622629792856689, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 7192483373850935599, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 8884531212319162473, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 3580758810857167321, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 9047629830516719732, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 3762908284722520729, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5477034992625098239, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9162697990770294701, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3777496320388823774, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8442207976151686599, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6428911476349245842, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3784813534878738812, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4539937648176865105, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7605044532658621140, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3787750674468400992, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8139713843534698788, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7510011867305289777, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3787924782869109888, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4431448331464346152, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5132263271615600687, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5342821642646160291, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3788719945830029232, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7698904033371606844, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3794042562924885547, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8125052473653182575, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7498214862099968378, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4175583473031377650, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4375626360041293647, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7480304060645576817, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3833892703305676170, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4345803076372870894, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4536958060941571259, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5927803667513949971, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 2518308806156803567, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8108532450551557839, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7866019900559448165, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 916306680877561940, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5616977870936432461, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8469578238684922817, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 968956643214265008, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1088724642855905845, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 519081064514960416, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2360744960540317177, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3491958474900310491, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3389074959205472123, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5524435718143244307, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 3996022858690271652, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 8080204312657253144, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 6077686033771388879, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 709662387983997636, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2571974980643003791, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 141889481060659734, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8125060520352921212, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 42197433117306842, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4179002246513346173, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3690134179027300543, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8803651481872260114, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1797572574707912637, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1800639246144374650, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4762136119410183791, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6465414613519523939, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7138026887737158024, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3962579426211040735, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1814306742972805731, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1816355178072562298, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7676710497387441951, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2051994018004772171, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 535721072425912087, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 7411081930205196350, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8218453808976519578, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 580797031024515681, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8088487537296080965, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 600230332284285438, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1209381268959424696, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 448666238080501561, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 6637065974559568074, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2324181370382069895, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 947481559423912367, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 1796875075399045521, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5897095096647521783, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 348095166571333313, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 3877278820156969299, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 7960728408965909300, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1218083428796346716, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5882655367557633605, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1226048695794714320, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1967614696403054893, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1718174409101487051, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1233910271586488284, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8697754653569273504, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8688861165770414157, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 52141476398635840, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4725207864352850949, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2845570306006114524, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1504676008005984245, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4601023397599878154, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1505366469822962396, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5279001041425534570, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4570884656154697072, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3085005797531340644, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6889089958254354936, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1509745594741056166, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3491623535261521477, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2833791886912699843, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 67991979903718750, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1760179361460442136, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 296006667536783405, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 643025970016118696, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 672328621937310823, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 7434285038751458106, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2802661293301717853, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8928911785899145461, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3148749705668934609, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3384847485785411180, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7890852539857886817, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3546013879224606189, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4583431420178420341, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2819149665934173652, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7167892333238850448, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8914741889542300293, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4588165436489567038, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2826752254729020433, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8806354060031887289, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2835254843881129365, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2839658089418290757, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9044314059033755472, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7362433711498072412, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 775015211112041410, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2091639645844673146, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 779026792826463892, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8988799972111360187, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5668185899300982992, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 779795700662468599, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6465767340250839234, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 880172092317797375, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2932392422962429724, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 880947348254344507, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2017146325911231619, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 885419733354875441, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4007169342816014670, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3758085818468290362, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5927803667513949971, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8469578238684922817, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 448666238080501561, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 6573029777669831799, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8469578238684922817, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 198227069326284427, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4865257552464327058, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 199379702121409699, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 215875230779707094, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3043377211119969757, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8469578238684922817, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 7906201053904456624, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8835900111129403446, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8857736056138880520, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5907092384066557450, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 672328621937310823, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 448666238080501561, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 8857736056138880520, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 6573029777669831799, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 4198074026007720926, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6226102888434934213, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 229400555964359284, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5349199330032695445, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5672756513790252911, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8790210038074149536, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7562241826684743494, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5373815113189024199, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5498949209787408858, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7556094006637195865, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5407690139435953638, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6023316089375042720, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5416590361615041678, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6032430592139773384, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5429014125760963755, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9162682730004191129, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6676848450260308663, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8984837819298353460, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5697736279680112052, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8389245015780284660, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6110494906808361116, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7936481360385883296, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7978734454585493859, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5536584047536930283, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6073809892310119696, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5570693267230629588, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7632191139154365777, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3124059050115355034, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 855140257377209588, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6861124321264975466, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1081958492512259972, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6190127373159935981, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 867672969285777731, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3617474731055058411, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5150157160632247159, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 115181444231691962, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5954723746369466714, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 117375158480852515, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6578253131608792886, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3939857914763977653, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8514892081840363795, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5393931113596910682, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4667941869154572801, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 112080237734196469, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3626769539604644930, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8225314152015310938, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4800000, guid: 8d2bb70cbf9db8d4da26e15b26e74248, type: 3} + - {fileID: 3285542710108179201, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4737107501446994202, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1529292669230097479, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5751806870981569874, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6088233497169937246, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1535456694022583806, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7151154310198719441, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1540234770489321880, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4722432605602442847, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4967426491242134625, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4079343703485711786, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8882126931405454339, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 4747314223303068325, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 47151519122408208, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6292464528759217134, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3877278820156969299, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 5070466956107841138, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8793971461844188516, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4658450570358720250, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6312261429479886331, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4669066258722108546, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4702019986778408742, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4979360282921542016, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8448531569197986836, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5284843087128951419, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7151662852752358704, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4708944460506921410, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7144583897099076564, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4717240180753309293, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4984872891436562635, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8433227811242569055, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5287338636256813872, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7135990757866857595, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4723063324498817310, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4999452121011895405, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8781874762253719890, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4733953069320992880, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6426221782827612470, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5148160042854627437, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5205114820333566245, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 687067046061546518, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6420141198868162895, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9138607284799116701, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6676075113060491340, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8937729808597108979, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 814933855581839808, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: 7c9d2d0c0f901a6408eeab5b11971cd3, type: 3} + - {fileID: 8077347779532565087, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4760113469101939252, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6539700992191736609, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 468443139082119197, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6909776819859385971, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1831352236786218256, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4928790974075705016, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2863186710627664185, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1841371405072447805, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1848810267671673427, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2851566417199799334, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1853296298858577521, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5054709928654762932, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5747074825806891517, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1857217556591148581, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4413849802808462022, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1869494361177007982, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4428951252770313101, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1879250202450818442, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2358409408155831009, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 203741387490724426, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 8247933114400812214, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8747002178691774853, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6300932288953767124, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4066497773787460304, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4071889007968276267, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8999485958619150703, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7321163335472959047, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5342009823802115711, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7482893093185604401, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4098693901626137804, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8566339673854973429, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4128450733396227238, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8651370486358021055, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4138085509486239969, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4152098300303905655, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8281178767083817283, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4153729847932579884, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7695634059439945497, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7292232456002016111, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5425599013389432059, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4733774943678405721, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4191159787052319044, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8893797900698822237, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4759738868937239034, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4203241530592843314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4395279714342813618, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2976704376095321137, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5830785361525314781, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1115857063536227833, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 480157052644926846, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1950591304147148921, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2175752984573104032, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3195937970442796296, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5790375573767958760, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1031605920973182729, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9027701632178978768, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4743006309727317901, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5335681610469767241, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7841143369042018664, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6064778378347619053, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 78849904623607293, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7944162101754549707, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6854231608938813375, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4954011788239410526, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1165302738257878053, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2123277721658299589, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7102953070768233004, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7971114974575117062, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1189435177971854895, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1947518877316749314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1832819620914690183, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1204664610427629183, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8370387945539737236, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6041500771514970139, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 174357322651042264, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1943187354381762718, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6205566472785361412, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9011710079018519216, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6290769308529320359, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6294187039640252646, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6319456209457573809, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7167969971339369474, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6334592870911604646, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9108747487008066098, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6424242043421720660, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6433562904804056730, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6437822698674905801, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8263788015775414541, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6667894099126089682, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6511030025456832402, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8193778781750411348, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6540898218533976657, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7097884761594769022, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7588528239335809460, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6754986805552766843, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7663791674173924469, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4233347929081657514, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1016711103509955252, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1018186520613297445, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6991319432922764563, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5927803667513949971, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 149735848435052292, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8817068027950970144, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 152841117909643758, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1910625453010170024, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4798925548635759970, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 31119773994611930, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 858443302544392951, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5880162929375296893, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 862317723917198843, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 951013978585823788, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5039804892998841666, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 4648856348934307791, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 2031130517716483139, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5719776441150710028, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7272068659984017056, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8857736056138880520, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 102338657137447508, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 2320231280208107861, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4366825669518001782, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 2446306471555304037, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2823923757553404536, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2459861025403523279, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3123513898188100523, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2468617857614397666, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4461014229987776297, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2469827462472878591, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2474806511318445296, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8697542847976826341, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7141764424059505641, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2478891072698698995, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3844180736465242098, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6515732913490040216, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2485162868938243342, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9183334526701575846, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8531739056006512952, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6552178081031973749, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2500715720459693609, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8673921860232832828, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7201449582710966576, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2514849709634567293, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1402113424960589398, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1040828090727323014, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5689758786280615712, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1650221185812539770, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1060803273220890314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8703685367703066853, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1063356962452892664, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5730036718683426017, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1063535171800345973, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 57918545695676784, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2859403826871185050, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3256532646373654555, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5610064596225928404, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2208202000667084415, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 8247933114400812214, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 4528843698619752525, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2043806370354208321, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5601075484732984791, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1205405733863509704, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7562957183923721452, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1450928728929975755, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1211145266065331223, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5342813390629248258, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1810475026556224191, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5309751386661631974, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7778904364525805485, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7279571540263924053, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2152858845316769879, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 659765495160113802, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 6493535781353555306, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4062855172287724115, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 2049521352762017007, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3246572212746126634, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 90468693045707137, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8788491999582597818, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 438268361577643159, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6700983011974903170, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 462050297586904176, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6763194994400217678, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 63488150681715547, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2114921738821174876, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2297912269796347563, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8752266548893034047, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 60625341663783398, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 203741387490724426, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 1535324251269375511, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1409204498256804023, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1410355296208288180, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1444295820492278246, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6879446569604731858, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2280502678340439014, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 448666238080501561, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 4090178905240192885, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 248127816344677587, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5899354841691025914, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 6233794347788190354, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2436533702020651076, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3135456559121236378, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7230532264027620368, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7052380446467937511, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 4411916891894562758, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 3996022858690271652, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 8718002841982411133, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 2329383759875125794, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 3368951818250894428, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7313909614243117753, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7532169990359455706, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 384210550554526873, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 869500925129272174, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9182593229863186613, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 6383913593085221228, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3406291917062991511, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 521913216594707077, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 527048680024439768, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7527493265355666414, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6437699112989454746, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6167666895626419436, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6373979881487551315, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 745702072131521867, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4076317521301931624, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1879511197347002468, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6817574259189873408, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5506324081944544526, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 3774058579297377381, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 529622739828575346, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6197673153302173192, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5771648645303367380, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4123459358149593274, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1018313105954842541, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6991471848651927451, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5775576906790645231, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1019328215215441694, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5531838215664890741, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5284558075974146138, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 226197655733482066, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 342170570016781818, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5899113663160612507, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 6616588392288136495, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 916112255754797326, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4365013087311860890, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3067898630019390910, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8269914427080198798, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1758248222668310114, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4480150845174001486, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1043186915559368764, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8674346758378912797, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 761459231299798486, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6128532604565620755, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6694796636538581594, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5880162929375296893, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 6077686033771388879, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 2539515854580790302, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8969852277758405500, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1069284513214205160, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1072193338054235555, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1702083659165028034, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6192531951697765152, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1093420418781210642, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6461458943131799823, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 337553362367369370, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4302154181182106518, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3293445952777691826, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1139226598811190919, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5659822970155180446, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1140457984372890906, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5808454772784779751, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5819831863004694853, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6097559120668913635, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5829587698056484404, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5830731699022025818, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6102439197163762428, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5858367366740890863, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5875588759576235049, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6183613060211354255, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6299760087475286145, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5896826206891185291, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5904224452074168475, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5904609090125391723, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5907427046879054228, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7299179893571764465, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5155718761880016072, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5767648361971620142, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 947448216880082556, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2999696039513856671, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4505310509257863449, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6100785980319710662, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 5426810056585111802, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 2208202000667084415, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 6969629891243040833, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2094235669268993122, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1793912346636301095, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1143034375683744799, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5967286941838591927, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1147809992849305063, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2654422997932273176, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3331837221978085798, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 220421394547700143, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2624604805019780677, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2848549384386315596, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 224246619130471100, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4396403900109823035, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3342274904314191905, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6311786782779888448, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9100218190861758434, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1319839671786241310, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 392219184751596841, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5468215201165402289, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6967186983574418678, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5955935043307570333, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5361893522316342664, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1644129756323381252, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5237674507383388146, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1983081718258436668, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2496704880094507502, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2219902597052219265, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3793977116905011402, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1656563823565723735, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4515711751939637276, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5325193821964456979, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2800000, guid: 311925a002f4447b3a28927169b83ea6, type: 3} + - {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3} + - {fileID: 365884842462529376, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3561285879490360402, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 366388429461637972, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6466478016393612293, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6439497766432830736, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2117152124332899374, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5298230005346936545, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5539906250968986847, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2122268936702807362, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4647433565614190314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2956821127483058167, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4541956006148468435, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2131776508408432297, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4626167543767749151, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3899764076401885445, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2567493555274748689, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6263173879361437069, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2142111453880226459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5127311843348849270, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4950199590604540050, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7954596617158864844, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2151404267747670593, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2500854422848460183, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9217278622735163349, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2521044617125151969, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9218970511471191881, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2525161919204115938, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9081505402053207626, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2537349377826117223, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9095769031772681679, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8635548422957614720, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2541904119056141386, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2544034230754570944, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8765588086213000149, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5355769349801089564, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4759005001651618899, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8818961636042665201, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5726170746171180029, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4769953031283929131, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8968782164273376800, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6163555586978317104, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4796232485361826669, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6896564140071356710, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4809232449647797678, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7298922245090364535, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4814405040378757846, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4816152005870483081, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6506170042296547279, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5060997725309385722, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4837931485181406693, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5150176811491429187, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4850206391810736964, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4857649956467694474, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6626256800479746764, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5019903428180581271, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8953758707007429441, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4861789405096155663, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4891496313610321330, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5474184405747403784, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6429274810747335611, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 833545364007042562, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5855382610254486568, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 849502489728272889, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1393562365995124927, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 867242612611201267, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5927803667513949971, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 6533109861150454071, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 3681672733676805737, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7934003023383199169, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3887259630386818516, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7484668179601874708, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3697182988680824587, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7365809847838143905, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3718542663184757066, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6331244403139033611, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5446930049831590326, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3847045866646988748, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3725611118797570629, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7978364217931702765, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3733086721980120804, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3742682387634229873, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4589981927022218027, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1758248222668310114, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 203741387490724426, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 35522871553401940, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4487694302336913660, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2268810320073599396, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 348095166571333313, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 3877278820156969299, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 9089684746352979517, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 4488568139959492589, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5501838938580883790, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4525315520362566235, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7049973901504011807, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4538160357984897808, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7053032124636268372, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7022992636723386661, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4581893511937897600, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4586645872706816892, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7110016611852937428, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7115181981846087811, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4595591034602525819, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7860033871478238356, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4626816525748614042, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5577016144569253414, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4641617977042094625, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5474198824331352263, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4656294997327560303, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6341802974998527785, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 4449425060840402790, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 5880162929375296893, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 5039804892998841666, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 6077686033771388879, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 3083982375352769699, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 301731921856076827, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6423021454464253875, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 307955849382383583, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4620919169211742619, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2082269957556562857, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 323286539340209170, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1151735692649392703, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 352929351692761553, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6209256821299382607, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6178600683525776299, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9051734368958672969, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 3100873826115101822, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2420587774428678911, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 895294437322425375, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3627073776576704695, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1400307936631261679, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6126708932032161010, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9091636650180372848, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2886945186105269543, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6469486675253099335, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2889108834554048941, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3285994724837316368, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 227697527503049022, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3854821390053104902, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9082789511475660594, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3864442333780485189, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4053257104853021878, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4079028866504507510, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4454166487007950283, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5586312669391160303, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3875918715617980167, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7006462994714308618, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3888883245858964127, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7562888321849434423, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5598859103830481479, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3907699590726977661, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8610341105652461412, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3914125943542349748, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4251499632550023365, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4488861316446365048, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3934204716608148561, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8637334362993144648, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5378285650960091215, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5668868346145579806, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3961171100651928581, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7561361398737966442, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3979208314455936304, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4006762607849909322, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9000863927791384190, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4026721802376585463, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4510944243568878483, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4046338769167507100, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5031822019590120554, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7291811772210861343, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1983567613945508313, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5723654576811311943, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2000654210162511277, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7904601477366385538, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6891943193076055017, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2001928064388410241, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2002507900932167926, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2495399235275895121, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2912212096725370771, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2002866521177197906, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2314405707230041645, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2568564540208531545, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7171119430237050742, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2731929742798861620, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5810506759521950632, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8545955247265571296, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 6533109861150454071, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 3559079232687215637, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7701431609935916997, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7711409943562747324, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7910571684123524513, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8054741276580285522, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7723366712200425414, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7775599612650422117, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7866640464978100088, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7784787736698671306, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8396030455254107051, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8482261922389294654, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8456160468764578508, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8456379788966001895, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8760071181348184999, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8518726558138394414, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8598734079007968532, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8101587677546647256, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8389389125138442744, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8683463549249395065, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8532671653979049887, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8141111608635860787, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8488505595359680975, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2031130517716483139, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 5283979766428437608, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 389671442833276723, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8991539856397157034, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2321412681958054786, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7228709777317703110, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8980027726344625363, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6349381298851410050, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2335587159465569455, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9035764890098585351, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2347797200300319844, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8826680706120740209, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2989209686369071820, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8954010900305073839, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2992331896227772942, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4164421652633521953, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8005899958382543920, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2376073158761765534, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5800280628178446616, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 969821652989856875, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6795693230126744459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2070884809098172272, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 979090482706332792, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8975593228546502023, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 5405811045646625702, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1597217030811058112, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2256771444200209572, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1610642667023081609, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1621462473360172395, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7295072081085779982, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2930483543854900854, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1627160039297397595, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5418446907410933741, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9017550681412264158, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1639700502440473305, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 646451121370306325, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8741374547489868993, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 195408079934626461, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2994201202829482338, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5022846368050523904, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4622716554494968879, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3384913848969517369, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 756841236563993548, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 758881823560468807, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5339832588468188724, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 751286091054284489, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 227898132848237177, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3497536658460640540, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2032258051523608707, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5046893024529382314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1961648936467555992, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6520595296421446017, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1967318262517353304, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3492226179282241703, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6968461438956641540, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1969185890038540588, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5070811616993872516, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1971982276091869294, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7866920072999190081, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6862143157917322794, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7583055535601224757, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3836697707956040371, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5897095096647521783, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 1293673040778070948, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7618823499086811520, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1304425945750998618, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5776045902233640550, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1307663464355492160, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3120685370546936039, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5146461313273957116, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2415574087259303461, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1309517017567699995, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7232041599937569332, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3295164323850482098, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4230584681293406090, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3951402168435681373, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3341568009806072583, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8310111117873621167, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3345633614016231841, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7640582979874672613, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3353106874447722034, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7348537304861355014, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8819254218377905958, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3915973452089640513, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4363263884293811076, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6682510057100706804, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3392498574557339809, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8264798923311330327, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4946219597987754788, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6005806673938897290, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8155934414157571080, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4033048148901287601, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3431882764310661055, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7990683985882030246, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3444270957924993578, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6712432342737646262, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9062523738612586886, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9069230598813002059, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4676394042648932666, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 124093805686766500, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3875072981412071574, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1826238873885645511, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3001426010796873706, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3247234657549583952, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5746374082937515749, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3039517091583593863, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8584521551120756271, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3370014747302266631, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8591383482850852688, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4007732918041893956, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3056464059170350777, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8462565285431798525, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3056671483255599607, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5502038123457070774, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8425592749747350088, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3335712411951786267, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9098297035827571338, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8422171621739987239, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2552408599081521509, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8755099189567314032, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7074901678680143484, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2555740628428165988, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4317605254084481570, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2716869024833360761, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2566058932878588961, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9065631587199199865, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2576164446480604380, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8731346773712819657, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2593040550558260062, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9146956848616192246, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2615788932602118229, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2616989363323346377, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3446989922388782052, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8745350126868921953, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2621539809443225524, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: -8278684978296943735, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 8706977556548979489, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 518127318724380104, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 1061695247072719575, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 528369701346911359, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 923914767764296274, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 269946971942119692, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 3528273811445131563, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4283398995533405958, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7924684119838902915, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7338264684196292296, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7217693855122458746, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3834508507272434420, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4142005617318037775, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3851072144457646742, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3575248769090530864, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4300334538147180000, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3594623896634700006, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7849346498157859662, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3977258960365527287, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3601269043943489579, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3100431588859713891, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3115370766624122519, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3720222473546508241, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5981226236994716355, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6479731406913845788, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6467864827178968835, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3139592169142154399, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3995704242281828704, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7814515093727092036, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7119309096843384713, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8159101602960558122, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6972236145970612305, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4250464051278040426, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8452088250261409450, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4457267976360831918, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7964610069240132555, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7178898725540478387, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7906693004392999617, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3147212294904654991, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3688944513778642377, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6416404241464475096, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6025735605422601984, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3157399262918639935, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7680245305785968166, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3163272821925397734, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6031206506407454363, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6027295893792539511, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8895366749336990015, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6585694944117127307, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 880365193004160097, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 809828747251277026, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 2707335686667938063, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2712730236182753348, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2731252465482393239, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9154971345315737474, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7251842319209431438, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2738212569720183538, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8866679185951897946, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2754206603907726668, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8994618759287419993, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9171075567805963965, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6380477163921613423, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6774318868691107255, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2770456097027330406, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8978213307440781427, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7437202938205992575, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2770875267198289314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7435658285814276795, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2775455887310974712, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2785979451148121940, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8953841912400903745, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2790136447455599711, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8958548182412186954, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7492984687503440710, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8791832092175882252, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2794918760842802995, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6055093674495504837, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5867813052874302459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3250980518356654640, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 296654299612215850, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8958397286910402574, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 300055846875603809, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8963694251563612485, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5464254415335340538, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1758248222668310114, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5372050970504779088, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5701231651917692543, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2146589020749582284, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 385504090191684574, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6895630767544969931, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5207450975276748207, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3464853757246564416, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6080241366608056232, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5200285886018481173, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3481087667247243472, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3494104008308091851, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3499382065839207165, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4768160303723793181, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3502609116778661468, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7225217780014845863, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3511989076825969478, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8921217600215861618, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3513120962540662880, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4271204656484337229, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7912205005126079432, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3762096517965937926, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3527706091668184244, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6574949615032352054, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6904876241252822538, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8067643629896383390, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6669164946626698356, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6675314895700853099, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6725917545676565903, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7380824422238550204, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6828163283493270468, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6839560648684820524, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6876764018096219761, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7008157206299305850, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6889810403370150916, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8416669109072053934, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6934901238915271415, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7421411684742122218, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6952031986223757945, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7719766407301251361, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7578600049565130489, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6974886140349796100, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 747398748118302209, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2132696474734045113, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 748340783921893681, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3772870897679705497, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 748477814448678879, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6300519341688620151, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4648856348934307791, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 1563231940431818611, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2074588141922397207, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1564781111375819009, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8416842180046893459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8962864220570437873, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1577189397108229925, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3638958368891318479, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3559042052791366598, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6167379985984560553, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7682375147631690162, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8315382596739698807, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3958622835900991993, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1587972897610860558, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 391407995352233503, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 48614933525803943, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4008508417876774623, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2722173123660998699, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5804516170916398775, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4658066395385102863, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7446765248214381978, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2056151250331041482, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8947796347670964642, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3979916258295606681, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8177639338037298719, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6165240974935208058, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7442179852200393561, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4337146621511089330, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2072516517471817021, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4296556053847096023, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3548640135555847254, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2073013810158818880, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5057389930774175573, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4035053398560773567, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5623516395497252574, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5022839729795059686, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4743628785203096625, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 683688411931799305, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7897503366415800427, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 10490852698694614, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2594181439290612124, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1121265282217529501, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3955478668021791034, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5949311146971925928, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 728910807797999546, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 735459174890660359, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 934340024623833626, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8975593228546502023, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 907319040999713220, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3890080854384525411, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4555222762400822945, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 908098093105600978, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6913965832181718759, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2927898149417944113, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 292109910879418144, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6413433751706784904, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1125023154836991488, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1005819205264379525, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6440680986739795896, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 361255976413791335, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1473760201118946118, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 285478657047247536, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2940157792244070735, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 528369701346911359, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 269946971942119692, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 1519019258008198363, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 1955666985062967370, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 6444751173523390394, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 325302612112814411, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2808467319498529439, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 809828747251277026, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 6573029777669831799, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 2800000, guid: 174c8a230ccfc2043ab9b5137298a192, type: 3} + - {fileID: 5780145304061011030, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6162114100835570454, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1582116343231843844, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1113265852045699789, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2490313334315299750, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1114298584693086488, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4336860882884431864, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: 20291345993905b44944786d63ee52f7, type: 3} + - {fileID: 2800000, guid: 20291345993905b44944786d63ee52f7, type: 3} + - {fileID: 3032369304281183765, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 921701750247599291, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2863198876009180223, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1471435560111072092, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 936561481652834044, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: 078ce8d0847afe74393a6137ba2afeb2, type: 3} + - {fileID: 2800000, guid: 078ce8d0847afe74393a6137ba2afeb2, type: 3} + - {fileID: 951013978585823788, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 5039804892998841666, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 4648856348934307791, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 8806037134893188019, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: af252e8e96a18af4b8d4658788901bbe, type: 3} + - {fileID: 2800000, guid: af252e8e96a18af4b8d4658788901bbe, type: 3} + - {fileID: 1675779991655778469, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5278073068116459347, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 21300000, guid: 5c4eb3dc818df94479ff187bc42e326b, type: 3} + - {fileID: 2800000, guid: 5c4eb3dc818df94479ff187bc42e326b, type: 3} + - {fileID: 21300000, guid: e559443096a97744eab174b24d76661d, type: 3} + - {fileID: 2800000, guid: e559443096a97744eab174b24d76661d, type: 3} + - {fileID: 6217940001551536735, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5657772245006672714, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1333937010381317242, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1646570532613292764, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1337239341962686115, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5216701447538517942, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6037699376053193146, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1338090946970697731, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1344143715359339666, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7359462573752109151, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 898659042247804675, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7244010573357325111, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 63602399781284641, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1334528780701557425, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 66754431916716827, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4939306929237017951, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5927803667513949971, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 1519019258008198363, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 1955666985062967370, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 809828747251277026, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 5897095096647521783, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 203741387490724426, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 672328621937310823, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8270353981077159664, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7845644234999154194, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3482790608920708510, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2851820576960244662, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8755280712064135939, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3841627608931082958, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7840637715535305485, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3493529094832609409, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2870676326528968392, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8852494147035891040, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2882465591235451822, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2901285088252162355, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3521684063901855861, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3350957530860925230, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8265317261799060840, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2918807923885330885, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3199316757103263420, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8286755305340375814, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4690403302543598445, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6474300971343811192, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2093003411745893276, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2683306274372109450, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4777982968735865480, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 681146143155540791, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9152127533154178328, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5554402306972296563, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 681358465206538062, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1232789968408275926, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1506851550434294732, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 231490896484206100, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7960903776013882773, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7921749789764304753, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5899354841691025914, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 2152858845316769879, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 1657363801102132379, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5335907898392692531, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1664041743164481967, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4245661390413772996, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7327043937132226470, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1664121665093965400, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1673373747874757808, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4234869238885541339, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1688586245730677880, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1696353709829522499, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1698568474860712094, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8060867578213149370, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 786494324052482091, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3772165807386186090, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 518127318724380104, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 923914767764296274, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 7986070582027999988, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 3764902268943045601, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 7438534416270888028, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 8465497525880288504, guid: 06b1e69255a5cf549a66772b84f05858, type: 3} + - {fileID: 410080223774535496, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8577628100432619841, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 416097072873044990, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3899178134964407113, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 426579463432897959, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2800000, guid: 8a17cc1d4bb99d24f9643918915415a3, type: 3} + - {fileID: 1051558879922680291, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 604931394157990528, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3462113968506902411, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5942635195986704404, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 637478077216266694, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 42099258465173796, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6520710084275701809, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4742697786032301629, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2599393724765805369, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: 8c4b435ee4066134f8150ed44ebe72f0, type: 3} + - {fileID: 2800000, guid: 9f7d82fbc664fbb4d98842fc46db319d, type: 3} + - {fileID: 21300000, guid: 3efc550bddc68a345b5400a832fb9a6a, type: 3} + - {fileID: 2800000, guid: 3efc550bddc68a345b5400a832fb9a6a, type: 3} + - {fileID: 6729045435356092274, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: 174c8a230ccfc2043ab9b5137298a192, type: 3} + - {fileID: 21300000, guid: f4c17f53385195f4e98fdf1f0da515d3, type: 3} + - {fileID: 2800000, guid: f4c17f53385195f4e98fdf1f0da515d3, type: 3} + - {fileID: 84854329921563306, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7682408063860488495, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 105842530907227833, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 402103688836415807, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3869019051879175339, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2100000, guid: 470021da37a3b244ab004fb80b151574, type: 2} + - {fileID: 21300000, guid: 702bd7ea217003e47be28d81a79dd99c, type: 3} + - {fileID: 21300000, guid: 8a17cc1d4bb99d24f9643918915415a3, type: 3} + - {fileID: 2031130517716483139, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 3171516694814692186, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8146921357788836082, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3817546385318117370, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3213574012824102535, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3228365194073773904, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4471781179535023656, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3239908615200871308, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3858627355093944086, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6100274519667895078, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6891900559672122425, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3253834524167349647, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8301615832154357050, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4603928975764581623, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8779779083933381253, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3261589570744595319, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3822720369074175737, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6185664341723517221, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3291675813259961027, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8343553684109104452, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6195050223309376570, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1709159363582112384, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5316161917904127350, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7851629523118433155, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1725360451233610494, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3500095213242469652, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3708356633666063901, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1739469524091011598, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1739964328018316858, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1742394890278689791, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4561401876818553877, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3878295577805308564, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7680612560454540790, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1746332676550225837, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2329201014704417446, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6817574259189873408, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 2800000, guid: b65dd40588cdc9f4a99bb99c878ca5ee, type: 3} + - {fileID: 2800000, guid: 8c4b435ee4066134f8150ed44ebe72f0, type: 3} + - {fileID: 21300000, guid: 324c91ab3ca459f4bad7e4187c5fe278, type: 3} + - {fileID: 2800000, guid: 324c91ab3ca459f4bad7e4187c5fe278, type: 3} + - {fileID: 2208202000667084415, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 584111228236352720, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 968234337032767069, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5051988399032589417, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 518127318724380104, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 1061695247072719575, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 6075426784951483330, guid: b3ebd96a054999f449bad045e6334acb, type: 3} + - {fileID: 5897095096647521783, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 3083982375352769699, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 9078487838806749406, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4340468509561534958, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5293598321753544562, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8731825567458179818, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8125060520352921212, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 1132429440884230750, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 490583843286307362, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6639784885230770999, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 498268593081078222, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6622231866331738726, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2800000, guid: 7c9d2d0c0f901a6408eeab5b11971cd3, type: 3} + - {fileID: 21300000, guid: 9e508ffd6f8853c4c8b20b63ad90622d, type: 3} + - {fileID: 672328621937310823, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 21300000, guid: 11d1c47204e2d8b4d94e7b57e388252f, type: 3} + - {fileID: 2800000, guid: 11d1c47204e2d8b4d94e7b57e388252f, type: 3} + - {fileID: 21300000, guid: c7ce7fbf3a68ec040ab6006a84f75785, type: 3} + - {fileID: 2800000, guid: c7ce7fbf3a68ec040ab6006a84f75785, type: 3} + - {fileID: 5946540292641612453, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5947303057626707213, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5954995781907073438, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5958920287279630499, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6149458588773273519, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5974477526394134066, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5978645565771453657, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6242756538747417215, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7388070009044166635, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6552470264327481732, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7741501087148951496, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8608606291139148032, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6015622351619396466, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6021581000267423385, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6148697060659096765, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6025306343922063044, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6025457146125972977, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6596049230071351468, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7778126885046874635, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6025921459592983041, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6031522641227163172, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8634684837151931355, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7877716077580743472, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5073002728576908737, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8709045957414310628, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5846347268194795508, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6887179031691403988, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7790222715213472137, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8422744568650655896, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5134046992787096339, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5137939618932258093, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5143136608342343328, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8288525972566210673, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5723648582854096414, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8770064318620065888, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5785821443116060016, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5184095503744659023, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8326667064918449533, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5192999859831965110, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5679791950286996907, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5194082443084972013, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5803435555178053291, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6851290294871467796, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5201331173845124430, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5202504351826194061, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6977152841107100727, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8669205115470976369, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7354451852815045674, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6980906008572417858, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6982017951162176027, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7022890243061188255, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8785035106115274713, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7321867080170064876, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7024969049189198554, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7475453478987623111, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7660149183583218459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7049746662907501235, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8739618431775972341, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7295713866758559680, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7089061812705710762, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7251632525701190327, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7105117559803193659, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7110511421062082672, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7724183229625286281, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7465184889987422825, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7170601198125230096, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8872074058222594390, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7451550738937767267, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7174602105826587568, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7177607175968708829, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8865085347236059547, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7409487128426079385, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2147223887336074083, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1451254353356775987, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5358454931037312453, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1468205683951429771, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2129883801655164451, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1492002710685271097, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1503472433795186617, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3484207985823861594, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3293905969849505310, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1717150557348410194, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8465953571033007418, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8732671993953558209, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8706637785914220162, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8484196043075322850, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8168723101740446541, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8185088236509072649, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8464451921779920603, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8192389376686010772, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8566478353657067818, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8906190550426820640, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8329900437933331153, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8395632867883851623, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8981613866604845058, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8520222693464251865, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8592593142208309956, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9190384336585382888, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8774943896488958770, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9162898442167289796, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3604593392388079235, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3618984533576957927, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8729782784583461507, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7401624352610905488, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8723900741248103368, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4627751938803119814, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3647582949673138766, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8572611696719399946, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7941805982078057759, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3647761711574370734, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7526875864587894971, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7773686846739688031, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5488649412510422669, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3650340410198298853, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7512913509761407472, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7770470432984888084, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5484389562755174342, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3664926100816589205, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5377693709475691747, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3673521353658434416, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7166879531040646096, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3674837761759765844, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8248469862939418610, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3680124564049697730, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4077216909330197999, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6338408254176047660, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 797673301648385868, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1408782472698586634, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 806534525030859642, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3872484906676281827, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1838973644766016913, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5939834887663553279, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6271301103494977729, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3133175271183704330, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3468161670745503102, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7603562369087513667, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8817492196241686995, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7433002521630041393, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3938523950358381969, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3041403820774368358, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6119054731873048447, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 566587230766097913, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 566846009133047660, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4880510873222867240, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 578023565708706346, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8518505463278110125, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8197909251627916885, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 689116191619637038, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1626475305840988894, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6735615073917939120, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6349826183925399438, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 823510191396405262, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 186639778526777412, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8083448297601390157, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8945267748178857831, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 195119541405343976, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3996022858690271652, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 6581422458203868687, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 4672902311283590078, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4568031951061774081, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5688208303726587536, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5536725489509184598, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7793753703480869649, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8867554807052003479, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5237786953786020925, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5777200152816719227, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5241947127499213418, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5254568157444067592, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8976836339547152954, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5266123461247647273, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5752950600783298100, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5270808892884587185, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5757357031343379116, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5274357886519177690, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5885834281861722268, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5278035328666949760, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7987700029152502054, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7872786501833781653, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8819976830887025171, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8445253972840466228, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6998256017052294909, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5344146955182010454, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5960196083932311824, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5542145685170761803, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8294670532554988959, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5740836049576023866, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1345574347758959865, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5695528588414953551, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4118358283419024213, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1349923167356339331, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3157240795426680100, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5185266350864351039, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1358579873952694880, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} + - {fileID: 8706977556548979489, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 307298465382239448, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1138155749757474980, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1540511243183824065, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 640241727782385397, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3690541232767282570, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3498272028129539070, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8119404262342896849, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 641905115728749263, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5667841919346182699, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2003258373773271291, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4981828634286918756, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 871192931362510884, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2004258297923240348, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 871488799734290144, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2927105525886525955, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 872144014113818626, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 297355777426450409, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 9089684746352979517, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 8882126931405454339, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 862317723917198843, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 59081739613440288, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 60426541199380856, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2120796994297746559, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5773649549535946419, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 21300000, guid: 3f725709282bc034b97fceff5df203cb, type: 3} + - {fileID: 2800000, guid: 702bd7ea217003e47be28d81a79dd99c, type: 3} + - {fileID: 2959178458668959328, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7579749310570862927, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1269501836219052182, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5658072155408366802, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1277873938256247832, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2800000, guid: 3c873d1f63abbb8459c91a67c6e48712, type: 3} + - {fileID: 7243116579515171002, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 8657336043377977537, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5898540932064789969, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5106288782773812620, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 809828747251277026, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 3719164985510592733, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3094855476777851282, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6005372084442931582, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 918752350534418522, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 373565781866642779, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2800000, guid: 3f725709282bc034b97fceff5df203cb, type: 3} + - {fileID: 21300000, guid: 6d5a0df4482d61c46b29b842cf39f755, type: 3} + - {fileID: 8080204312657253144, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8857736056138880520, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 5584299599595477975, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8706977556548979489, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 518127318724380104, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 2208202000667084415, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 2329383759875125794, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 3083982375352769699, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 6077686033771388879, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 4704561420421729055, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 376366026693186741, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 381612314735328240, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7338508161620768871, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6272808858891796197, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 672328621937310823, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 672328621937310823, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 702658965628974520, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 481098296502750950, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 840441668185855293, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 169058924824645819, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: 3c873d1f63abbb8459c91a67c6e48712, type: 3} + - {fileID: 481157360305404010, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6602763583455239106, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 490029608455326010, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8398352603924556971, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8975593228546502023, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 535721072425912087, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 6373979881487551315, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 5524435718143244307, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8125060520352921212, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 6533109861150454071, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 1758248222668310114, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 348095166571333313, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 3996022858690271652, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 3877278820156969299, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 9089684746352979517, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 8882126931405454339, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 4449425060840402790, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 5880162929375296893, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 862317723917198843, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 951013978585823788, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 5039804892998841666, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 4648856348934307791, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 2031130517716483139, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 5283979766428437608, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 9051734368958672969, guid: a46735af9ffe7684fb0f19bc9b351e30, type: 3} + - {fileID: 2805182163242464049, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6552677061066063569, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 335349681972916903, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1089910854981354634, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8247491805333331833, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 58430785492224959, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8318795651983392474, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3796040219549104658, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5108756301773203020, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 983791542096764096, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3875878112247372235, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1005410373037819277, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2794588932994877042, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6277672047717697424, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1012657754380496075, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5007494319682303743, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1016538119855251107, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3743511312082143294, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 2246435041482547015, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2256022080468601324, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3779840177133357587, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2260543491743876851, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3775319308062377228, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8220111813225026930, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5446509223899454266, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5688970143189141764, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4803416058216212558, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2439436855452154371, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2304256798855294243, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4977035121935524918, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6827103914701031994, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2305804805864141376, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4285405687762372259, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2311635047190666635, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8862861521268823198, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3024818687552342819, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8428458137321022643, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2319798532764622564, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 321954324799972663, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4981408414206459311, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4891724370067828449, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5118564466020213650, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4903210275683548238, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5609346220654902441, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4916907646073660677, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5756118886393553045, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5605144846415858678, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6446928456365051993, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6611972905787332782, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4965608288392042262, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8112876963206079524, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4976509059531043253, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5548215186323534494, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6754663982608727273, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4989062116729238738, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8416217344389792386, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4990409991624316522, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4996762012561002670, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8153705978992501660, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6772702054450396459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5004321796546233211, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8883205543522632279, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5960978766218571591, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7479244307151246614, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5039987658134957510, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5041715778900327898, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5054248823769042315, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4509786491799734031, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5467132826912713107, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1687477743756519967, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 21300000, guid: b65dd40588cdc9f4a99bb99c878ca5ee, type: 3} + - {fileID: 5897095096647521783, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 9089684746352979517, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 2100000, guid: 67b65c315e59f5c4999be7c382414bf2, type: 2} + - {fileID: 1817913599366732059, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2563733529349531248, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5026948937590932821, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1822309215585868920, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4919889012430733264, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1825900486698468769, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4881128605107637428, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6346140729685009080, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2277567831727692506, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5483100566805265490, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4368213411598505022, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5154203856015555441, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4819346816371566927, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4508849839812415620, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8687938782894991681, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1829148020791446333, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4449232531499695111, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1407614299244400887, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5657657828065964895, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8247933114400812214, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 448666238080501561, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 2100000, guid: 70aebc98d60422b4fa30aa5da1fe3623, type: 2} + - {fileID: 2800000, guid: 9e508ffd6f8853c4c8b20b63ad90622d, type: 3} + - {fileID: 1154150350893886734, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 561119289500515597, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1905382432084375562, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1786559264549089533, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5990054385980034963, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6216755044103069101, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 563344131288291487, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 686614654864960144, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 964577293298159973, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8897284796930966852, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 687819677624157297, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3629434683551424270, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3595389760720241018, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1452414973812791849, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 808268910254764035, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 4234860345367694753, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2928002607143917491, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6598032962174604577, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7194698389564341314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4570234802697994190, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5008334423276382926, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2956340499699682979, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3574714134137999333, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3442044726477950654, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8601261781479273604, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2984908257173085434, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6002764140371921921, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5531114563669080909, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2985175246840471980, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3598831884086894826, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3283652417236680639, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2990646508807752004, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3415035260140820471, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8706977556548979489, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 5787249065842187424, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1279493188579996233, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3936933855507908003, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4340889407400586018, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7167640175107388480, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1286575312681293499, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7608169886828956831, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1288407841342779506, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1733775187690759898, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8247933114400812214, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 2329383759875125794, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 8705161893377623196, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6547573364171199003, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1542896206624488292, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5216759920175290572, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1545196964564203229, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2231224190840914160, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5223458811619120501, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1549422030566509820, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4456009242819318967, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7453973690728388014, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1550884414748587662, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6602221549203288876, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6573029777669831799, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 2329383759875125794, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5110623351492387882, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1906336394458441499, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5150001101901481139, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2035757659788374197, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1932580613133651147, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5178356422576844643, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2028811791692951417, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6711412744544918905, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6590950917237634874, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1154782954763107121, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1163426344397498727, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1164640950774654912, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3169501700731223231, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2379828986445034984, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6034796422618182625, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2380543228246066717, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4149368736974882651, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2867370196016514560, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2389080449808208453, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3071730809320678504, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8947359898825093613, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2401521741442442086, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6924012588140233855, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2402656958578607089, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7291655936331658677, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9079209489347806368, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2405675122886714727, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8901657735862971506, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2921832876671103951, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9112042267433053103, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 203741387490724426, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 8882126931405454339, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 8995990958000548815, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 4724775134085759924, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 1605405138227580344, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8751133873739947986, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 107275160984545193, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 791046764894114180, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3593952306192112157, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1397497821814154257, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 756232774511799770, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: -6465566751694194690, guid: 97fd64b40784bc24090f74d74b2ebea5, type: 3} + - {fileID: 6077686033771388879, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 8975593228546502023, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 2208202000667084415, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 2329383759875125794, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 3083982375352769699, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 5524435718143244307, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 8125060520352921212, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 6533109861150454071, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 1758248222668310114, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 348095166571333313, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 3996022858690271652, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 3877278820156969299, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 9089684746352979517, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 8882126931405454339, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 4449425060840402790, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 5880162929375296893, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 862317723917198843, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 951013978585823788, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 5039804892998841666, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 4648856348934307791, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 2031130517716483139, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 5283979766428437608, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 9051734368958672969, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 8465986355902259945, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 3543656974406392807, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 726142735904509225, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1142451445448013862, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8237910385409818014, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6186764898940589158, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 46507887509433788, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6507311023535465641, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5506324081944544526, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 2866185542151069841, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7139724635869576632, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 2118957188813578234, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 342277674577482385, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8264398842643813566, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4658650616479130837, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6370381874470098368, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 468760466803084459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 174734985276217743, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4347527692526644519, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 178102685178785314, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1126443768986666349, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5983535168663274044, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1132327121884777696, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3571240608389019720, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4955449247285401300, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1761262132232590680, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6277647266874368514, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8857736056138880520, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 9051734368958672969, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 354575985089928609, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 70679064546925301, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 78610924761060194, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 761120292542195023, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1251039060404571871, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1251876792024008586, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3908261851689922656, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4369561339474747105, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7198636538054967683, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1260971110769541995, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3074315103700359188, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2100000, guid: d5d9120849e43474aaafba12ab84fc47, type: 2} + - {fileID: 1120440934119475733, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 1352874222752200122, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 2800000, guid: 6d5a0df4482d61c46b29b842cf39f755, type: 3} + - {fileID: 690332619114054202, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6095725118666170770, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6110409383993382416, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3354554190433596856, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8199005890906532570, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 251860307607057383, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6455188609935882994, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6485207028344197142, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 664736498336251808, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2409379338989283307, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8919639536195888882, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 665375461963840952, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3669893501866403527, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6760587806483795750, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 665777795662201020, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8247933114400812214, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + - {fileID: 1356178426752869258, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7021050209712576239, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 1758248222668310114, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 6075426784951483330, guid: d4d2c09313763694785f13d2ff8c1303, type: 3} + - {fileID: 348095166571333313, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 448666238080501561, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 7203915904178731977, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7247532808993979413, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8952626959464584177, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7283214633204822160, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7289989836904091899, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7825571432686023851, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8231639666548159934, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7364349890467856893, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7398655786503910462, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8410074442443373325, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9107053665550764972, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7857229715166514340, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9152807095135771439, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9161098725193264001, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8060594065476282443, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7501819705562850765, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8108509935084971147, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7987204526359946704, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7509001724994244292, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8118216465728769922, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8424793791410395088, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8420904339078909595, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7820062044662371583, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7566346021873058542, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 742563831387217534, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5407413928865053031, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 743701097803476519, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5816837066536036146, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2407623190112677336, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2660368912970779493, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4858065503590197825, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3099553823688037663, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8978833113259023876, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5897095096647521783, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 2078430270607085465, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2081985363136888616, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5048276674102588989, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6746481471662676017, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2539945256518133458, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6229991746355710030, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4828574453175618775, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2095775849500008011, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7738512684611115108, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6445610601888753679, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2103880317173392644, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2996823996237857549, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2105161330376411049, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3381612728426886942, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2106392351898207060, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7731099332051322235, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 203741387490724426, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 8857736056138880520, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 21300000, guid: 9f7d82fbc664fbb4d98842fc46db319d, type: 3} + - {fileID: 7322380498448285180, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 559513663552468150, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8470019545563508750, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6265030549479129367, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2819757906813029373, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2496072845583822144, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 879438993591980363, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5994232342494010639, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6573029777669831799, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 1386452352236867646, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1555286560263686306, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5165777933074670138, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4816086146193453060, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4514095265378879951, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5736778303514409055, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 266924105572551422, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4435205480140619350, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5244390492840644810, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7829694146257996256, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8186954834725913512, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8053173812094943987, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7910210667201139594, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7618950849140348410, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8153508722694788284, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8032277801054836199, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7623217474687671946, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7623225186316718039, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8167213598583967377, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8000842231763357642, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7972637146662577768, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7673808546538183174, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7680034979986994463, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8216835706939290713, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7806821092805850370, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7699967712351273712, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7789070812906390253, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5283979766428437608, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 3380419585022665236, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2646576084072463306, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8561089063078217962, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7737717444762402368, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1829851432981001040, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 521158407436562955, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 145589569619660102, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4449425060840402790, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 938470345588079238, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6378893599130502889, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1112279617150556675, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 470351160570083425, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1963355978524818790, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 942892466615784828, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3083982375352769699, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 8125060520352921212, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 4106685360770771008, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4928991341410678139, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5524435718143244307, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5283979766428437608, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 9051734368958672969, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 127504872988269441, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 373467984540800754, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 130143302869903257, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 906004010688049017, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 196684625282919154, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 322380020419799791, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6533109861150454071, guid: cfc8eb86b28d82b46995575cd12e9d09, type: 3} + - {fileID: 6216069646333264488, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8092878378869510367, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 826792277351343686, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3507368378623819065, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3681579000948417357, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 827182529664897162, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 518127318724380104, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 5659227418103888571, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7553770594962921916, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8585578566369851155, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4369350444447353626, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7514890792779672703, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4372830365168742049, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9172720666453936748, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8448799588940163955, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4379121243142241950, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7046185079217937718, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4946273818911867870, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4397356331280603480, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4428369921799691608, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5932311900942472558, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7166216827226396442, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5732757367586804602, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4443236628790154404, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6964073840853382924, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7119420632507635955, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7427901746065155224, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6925489033418262173, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8445623010718763720, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 148532137692801595, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6846422922828302739, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8294670532554988959, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 1568004625905685758, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 146101871106921567, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6407681825502223690, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3141642104928217686, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7052380446467937511, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 6223113647605185635, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 28763862165736126, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6525037323817681835, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8469578238684922817, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 1849714328624769166, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5926827222288357344, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6279982194909840862, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3122577735361575957, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8726377741376933140, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9137212971936032471, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8493198574128357196, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5642315975469054330, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5647246648511282143, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5651877679666918684, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8558279737011070485, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6207449487920469545, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6218990849126335725, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6227480775368028118, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5690210006251662074, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6670793168483771242, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6309133374629745906, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5969162575060141632, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5795249438944202423, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8865521702496022735, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7856618396947560939, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6289964635275706226, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6303590470291264490, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5774789076141223985, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6264275747653014886, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6950518582366871816, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8420754259760497675, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7204524430097739661, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5792528113659095595, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5794649971443916459, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6217888441326681782, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6157809226996123093, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6756710674862240837, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6973257522842872225, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6091746171560042334, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6980923870637661393, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6668009417803354814, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6976041664709345742, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6676408963574304673, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9113668264328071319, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7946144466667731605, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9133170972280918249, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8880418396982982228, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6686364446346223501, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9127746279688109843, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6172394011955204331, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6684768260400095439, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7779329742790502723, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7038919098072553917, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6757648880802994130, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8624316776525779097, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7906393881661035566, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7897060780922505521, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6879621318945477996, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2153233564473412686, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2213478331469245600, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4880506433429491464, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2215605624408819679, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6182587705158344171, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2220079375935172069, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4123157733489656892, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3944871145061236562, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2223937786944234260, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4915298463802026497, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6888783589958370317, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2225243584885236711, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7534713554186724808, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2225678319802526955, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7398360847753049807, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2239179535876435577, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2244871181242224180, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2759655728068913043, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3208662287277920593, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3192468104814269606, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6802708454246840414, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 967559523291916259, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 325667799817755889, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4389816155945753082, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 329083187815500071, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 368000551730514716, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6347743288873117876, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2385769654984940518, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7783482626017362156, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1374224201695919457, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8057480779888453785, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1422767373798670509, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9137694467875893847, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1374472656358526532, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5579381470176639410, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1386150696833130253, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6984804958579419724, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3462033865436362387, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6877970609187392792, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8706977556548979489, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 6581422458203868687, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 4449425060840402790, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 6689230217850552328, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 223172209862223209, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 8094197014817674996, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 501357550785150109, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 153999725375318807, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3917222517127649317, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 164129033800795029, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9064096650201279684, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 258184806820269719, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 384724352008326794, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 862317723917198843, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 951013978585823788, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 2623791495190624887, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9115903836833674082, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3280686737502170335, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6256984977958977612, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2634555133226634397, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5451788949070365867, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8829570025099839199, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2648195923486824401, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3406703526407660028, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8776557206741759097, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2657075482230210230, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2676842514720972843, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7950420442228767263, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7786459965462963072, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3386937347592959633, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6829613387286276259, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3816019697065467793, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4451776312417314528, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2692349299405581462, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3181503599740547058, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2700119933570286611, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2700294535905665279, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9041926907780427371, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4374501888181262139, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3249711671270954515, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 32335667829448968, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 949828935164340712, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8271950999762183937, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8975593228546502023, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 2208202000667084415, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 402843564257913562, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 618081059268276481, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 109001093199101208, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6586683375066723341, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1937771489087565668, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 473600702125318993, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 180195830654520517, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1881599414943157635, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8297147087732080609, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7008066670828516977, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 7591088015737457221, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 5482604286976494414, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 4407289790518480878, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 8301867424420232290, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 9010497164627285669, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 6554312936674324522, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 828198125725463412, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1808930961074797284, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2067338547034352181, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 828630911979075246, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3733160654392465327, guid: 8d99c5b5242b8da41ba9b1410a70cd1d, type: 3} + - {fileID: 809828747251277026, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + - {fileID: 5524435718143244307, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + - {fileID: 8360607061743587349, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 890401268311940436, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3630493736884759036, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1394156650388508836, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 890947506834272134, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8803483148226898345, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 895060111774454676, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2210977944528491525, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 2806428399480865877, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1789650355024444271, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 8315349679164549354, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1795547803945282972, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 7456970027403437426, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 5003269857558164469, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3768709227982997467, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 4130258884429699802, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3409604629951173630, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 961057361480389516, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 3013277661791807343, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 1584768327838830627, guid: 981817fdc4897a34bafc0040f15656b9, type: 3} + - {fileID: 11500000, guid: 2568fe8d4d702ed4698ed46b9c2ad25a, type: 3} + - {fileID: 6379312009059766371, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 11500000, guid: fe62039701799b0468ff96958a2912a6, type: 3} + - {fileID: 11500000, guid: 2bc02c60fe9bf724885e9f5713f900ee, type: 3} + - {fileID: 11500000, guid: 8c56e1830a56e6c47bf5abe1148fc702, type: 3} + - {fileID: 11500000, guid: cb167e66df896c745a538310e5a52f61, type: 3} + - {fileID: -1187402735487829229, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 4764720756731101052, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 1674052485383758547, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 4836489897218844789, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 1384676618250058453, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 1642009094064475822, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 9064323779972017060, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 1938559540975405426, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 5878528957411709766, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2275391276448498687, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2613820100136081536, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2881481211312408308, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 7484035981102291419, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2387062782670326462, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 8119895807138949662, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 3452808590865560956, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2804790299617827642, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 3071781401967411393, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2798544366308408093, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 6662554121718997272, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 6724975521752085365, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 5067444478520249086, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 8047359813230716910, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 8804688619532928159, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 7860912239456808729, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 56698895639349130, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2501272828291218844, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 6825070149872595068, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 569530817952539991, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 6509241874729291456, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 6291957190870502545, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2800000, guid: 204779ef72f790b418c77b89042f080b, type: 3} + - {fileID: 11400000, guid: cac8389b799f32345a01949727c6e2ef, type: 2} + - {fileID: 11400000, guid: 57e95ec929c09d64c9f85a40f849786a, type: 2} + - {fileID: 2100000, guid: 288333d9c9df2d84cadf3b48d918ebdb, type: 2} + - {fileID: 5910700114136101566, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 7125556968546628472, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 862899551417224128, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 909302231676134912, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2768568390039878737, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 5527707380059080408, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 1063431021331126030, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 6925146187533612706, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 2935942385829016914, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 6054159730444663926, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 3359549505901716120, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 1731013725373434356, guid: 9ce588004bafc1e4e9617fdaa2d77c8d, type: 3} + - {fileID: 4900000, guid: 6dad8784adba4844396c490cd4c635f4, type: 3} + - {fileID: 4900000, guid: 5a5a3ee2c5040ac4fa5920bd2a68f19a, type: 3} + - {fileID: 6200000, guid: 98be3277bd162b947a951461d0862c30, type: 2} + - {fileID: 11500000, guid: 3abf680e4b23d8b4f9c511a1ca85eead, type: 3} + - {fileID: 11500000, guid: e46ac8d61dc065848bd5a1aa7cd8c006, type: 3} + - {fileID: 11500000, guid: f725398f0fbd88e43b707a988c2b347a, type: 3} + - {fileID: 2800000, guid: 5a9ee647b3d218d4c8542007b7a75433, type: 3} + - {fileID: 21300000, guid: d39d76f18f907014a9979953fb5d43a0, type: 3} + - {fileID: 2800000, guid: d39d76f18f907014a9979953fb5d43a0, type: 3} + - {fileID: 21300000, guid: 5a9ee647b3d218d4c8542007b7a75433, type: 3} + - {fileID: 2800000, guid: 140fdbe02cd90bf47994129e6be6bafe, type: 3} + - {fileID: 2800000, guid: c6fd44c44ec0c504c9d09e9c3e421708, type: 3} + - {fileID: 21300000, guid: c6fd44c44ec0c504c9d09e9c3e421708, type: 3} + - {fileID: 5803694563079548352, guid: f051d09e1e3043d4285ae8e0ff4c4f12, type: 3} + - {fileID: -7612237390858616641, guid: 231c2f369e2946745a955eb49243702b, type: 3} + - {fileID: 21300000, guid: 140fdbe02cd90bf47994129e6be6bafe, type: 3} + - {fileID: 8577553974540900224, guid: 231c2f369e2946745a955eb49243702b, type: 3} + - {fileID: 3772201455671009312, guid: 231c2f369e2946745a955eb49243702b, type: 3} + - {fileID: 3470010340248184897, guid: 231c2f369e2946745a955eb49243702b, type: 3} + - {fileID: 8577553974540900224, guid: f051d09e1e3043d4285ae8e0ff4c4f12, type: 3} + - {fileID: 3772201455671009312, guid: f051d09e1e3043d4285ae8e0ff4c4f12, type: 3} + - {fileID: 3470010340248184897, guid: f051d09e1e3043d4285ae8e0ff4c4f12, type: 3} + - {fileID: 6150662252133649813, guid: 231c2f369e2946745a955eb49243702b, type: 3} + - {fileID: 7204670366666436681, guid: 231c2f369e2946745a955eb49243702b, type: 3} + - {fileID: 6150662252133649813, guid: f051d09e1e3043d4285ae8e0ff4c4f12, type: 3} + - {fileID: 7204670366666436681, guid: f051d09e1e3043d4285ae8e0ff4c4f12, type: 3} + - {fileID: 11500000, guid: 278ab2f13d3f1e24594035530325c0ac, type: 3} + _Values: ad9e5ede48c70f7e50c9412209bee213c9b539ee7ea42d4f068cae6ece3ba344362248d6d13bb77b0c0dc81f43da440e10fa8f9b2918285c722ceec3f8dc775eca793ab0718efa490b2613177b1da512995d4aadfc42416e1e94df525d8f366489553e254a50a66ecb7f29f6487f53725d788d26de7fc8497381dfa9c1bd8359304ff2adff68d10e37f116cfcf0aa7603fc98a5e6a9fba51abfb6340275b8b309a1ec90d38fe121bf6d77a0f8237a77c2a3fe88a47e2c46f6b5efdfbfb6f192465e669eed3b5983e245aacbee5362c1da2e06a6744167848a5a55c26ffe9e07942aa8a975f6aaf20d82666ed36058934cd1f6124267f964f93dfb7d1a68dc10dc5daff703f3b8238cfb6c19482998155d26fa7207844ac3dedc4d5c0de7e38496659b31004f9736d9d29f2dd412bd107a19effc8195e6a097ac2a3fbeebce94f8288d0d7198eaf28fc39bda1368a7e1769239d8381fe9c3b3b4368bea987815912425ab85af9ed12eed7c4531c0c4011458b65125a6cd17ceb949cd625f17e7c44e84b861bc88d6f358b94aa3a491f2e02570235ed93b37fec293339a2e81302a8b8f1cc3f450a0c19d548e5017bb65d8b922c3110b7704e9e9751f23aeb6e489ff0b23c24667f708d2a50f0441e0e0fb85dfef347b1f720e8668399cda998760275931f04342a644be2b6d17521d97f77bec5221285ff4f172daa421c195d363e380e464dd1eb13799d579b04d955094003220ee376637c89bbc8ce20937f31857f0eae2f1fcd5bd4b2a9752d634b0e82b4811f3c6b1a39d592d0099ab9340b1d892084e703385fd17d3b31ccee4e1206d74b6c115ff51a9b2a7c3e0f290a1a7f9e59a343c62679ece1f0baa74b051944be107204a11c7b81c516427805af587421b22d94abce32fec57f2f6e3b7319cf6a05aee768ea2282dd2408dc69f21831982ec8fe33ae6710228f35deb3154552fc730e0001712449670129f255e5634462623b274bbb350d95a52622ffe72fdaf62b2b209a112889d981b94ac1c758e1d7516364ac4b3f1a76c51b6c7bba47b1ceb003d646bc565139b24ec902ea315cfe444bad84cb79426b11a9d5f6bc0c1f3a6a1871ca2f64e6044c62a066f617736c87953ff90a2dfec9bbbda799d45a8259d070682e3f262da931b2d02d1a2575fa1d417e524c1846981ba70e71bd4ccf0e1b05c8987f44d49e976938a7a32be5e149ad7c92dc2a5a174affb618cb609a811d3eedeba20c859e9220451c1f620a103cd3d7ef2f624e39bd73f1ec620d4860d8e5996a176f266e6c7dad080402ea8d5bbda684f56fae2dcce3fad7786d0cb8284490f8fa6e05004292306428325548366b9e34750319259223e453db239829ca5ead390049325ee8fb190b9e54a8baad264362cf27bedad4949a287658dc65fb069aca8470498039404b7ae90e7ac13460fefe9935cdc6abf729b20a4ad12194f45c95f81db1562bc18fd5994a2f690d8350d6b0163324f2797b7eda2e5d5770951ddf3050712067ad51ecd3310242f9b1af0a22552bf808fef0c94c258f91fa4108e3140c921931c5efa74c5cae3fecdb42dfb952351abf15e82e403a9372c31c19eac61a560543c83ce7457dadabad2fb528676eb4b288dd5cd60a3f5a6b337ce32f43660606843c9bf0164d2bbd3d6b248f0f6a0c55d1cb72a3767f06fcdd58e43e9e7c684636bcada40a3b9b3a081a147663365cc8718e5e78f3567d044197cd6f32131fc104dd5953bc674c9566adac90937c9fec03e433efe110ad20c64e1a5ef62cf80bc72a84be7008f3f5bd37eeba560e6842071e94b11f0d5dea7586e6f47e56736c495f3697085ea4f30fc2ce55dd0d374749a29aea3e46ecb9886f33f6ee007767c38170f7d7004c667ba0a15d3f4cc882bc2d3e21f05eab8f4af01f789253060e3935195e7d2de0b5a8cc90615b7185c4c8494ce3c0567664d5e0ace7e13c0730646ddcf6cc2700e94d897824ce4934d96b5bb0480617d08fac7d345ed9062d933ba002116b70f7a149639636dd526a74532d847a7340294c3c6ca24a5b5ec253b50c5f6e4c45bb239cf0015c7e069201ec40f5547d4d21faca4e4dd8135245eba04281d1f327c1987260dd823f79cb42daa15d1b686ed6672c5a389b931d114936edfcc0873f0dc4008ec6de2b6244afe56f4d4b4f2a7ece93e65b66115b2d8f50944c517c7336e66c67e5255708c435ea764adc305b669f8fd1d35f1b742aa345a9d13f5169d4a65acc4849f057778b22257c9a1150a00b04141eb1b96afe1ec2be1f52c97be580a2a48163134f8fe7485e8241f1706d0ab523bb99787aa03a3598f3518836aa61bf0408933104e2ab7bc996a51743d3adafea62593f7e07e2bb436653bd3ea2ee4bde7d139825d9b004671541104652786ba0007399045fc203da281261359746d757a5c63a401689c3135ea7933a2e8a0e1217e3c214885080bb0fbdfd14eec62f3196465f743d2ab68937ad6248d0375362fcb0e27bf7132009b809af577350da68889e5b182c9a4f419a4c4b354c3773b8ef9fef615755c57dd9a94447d90e16e6d2fac032db3a8d9700231555c9eb56f07d67462c61781032d9de3f2a2068e5579dcdf8517641ddb412586134406f45c40034c441abbd7aa51572a602fa6376973ebdb76a1c579941bb04c109ea230d966785d5145c5cfda4b7629816182046501e350a7db7dba8a89b8386508083bbf265109b7f388af29abb5c217fefaf58db4a12274be670b2bdd2825020e34e2433a6a5b1067b397656d75bc65bb928b8eb2aaa056dac07d9d5c258524ac62d83f67faada6a9fa0a0ee642f8c74a95603a9ca64f5725592889fccdc442b8cc11c05debdda63fddd7534b50b2e7c7c647f195cfc1429dc095d13dec5623d5d747b254b9153138460595826d5d848640c23675c2acf77d64528d55fc7853dc04c27bf70f7cf16116c95fca2bc034d1f59891516366531a603fb90ba29724ae6971873fd97b95bdc3a57f094d2d46db8890c47af65ab09b2596473f35fd11806b4e9f45c6faf795fd1c623208a632dd07126cee3d4647fec0f2556fb2d4e3b0c6ff649bbc8c927c77a597ed431d528f536a38239023431b0961f946afa8b73e0fed06f7f521666c6b2f8978419551de64e4c32d0d0740da5289925a835bd3e06cc5ed30245a8484d0947ebfaccb66a4202ae1bad59a20f763c34a8470e426ff6b99d5078281f2bf7957fda1860087021fb1b59795e6f5f6f6d5dc511ff013e39271f4b96f81d18e4832418dac8f729bb5b78b40c170953d703401a7a1bc30969425d0fbe42261919333dfd838739379c7980938849b420e234dd66c7c76d01b8d17de3d9f918037e6d31bfaaf8294f37f74a0b63a96e4df67e2d8a65bf5251c63c44b109555d6b938411f57a73cb160b8d9cbe12796461c13412a5337161411adff86eb4774574aa4a862068872c6a4a437ed722943f4d291d8ec197fd612023d010596b39cb6cb8d7ec380cbb0647627cef77f03863796154692dfaf8f4585559bcc668792a7bf11471057f88a66ce9b99fe4f216d015936906e82f618d411d6c1b4d00bf2018ad8c792338a20627affc16b398d94a6a2bd259d18012ab525d4ddd135b0c92296878c89a6252230e9e2169d487be26094a79882ce70d674037cbc5ebc5f2cb4571bfb3e0ef50f82850b5cba05629341c8d19a22a6b41ee59ee772dd1e7f12b701351bab98df907668d4f836326f7690e6a5787216a094f4dae0df2772227415f895b8d046e7b8f7a2108b7bac45280090e1e3a3e784ddb1ca1080a7f078f43660e23d9cb69649f1b19fefe9eae6a76008efb6904ec02e63b80706366700f73504d1ec8e82b4c73567e1f257a4f3d6e373d9d4bf90139aa0975511533cda1d4256ebf85cddc6cec42012cd5661e672974682bda366893a845751beea052a2043222e862994553d12fb008f7d56444eb247c899cf97c0a8e25173f57c17e4cf05fd95d78f9363c4644fd0a86609cd2e131d135e423c1025116a5c34e7a546d51644c10f9b5d3e35c08c6a66085ab7dee5a10dde8cf6a43467139fd4e609ce7b457e5d2500c27aefd6b1f5ff219f585d34025ac4ff4afd3844dd6f10b50c4b1a255d9d8275f36a20938dbe0e4009033cc00422a84709d73684f996be1e5931af37d220d21ae9fde4d71806bb5ede18b946d670187347e5f81796b407e21781a784a36c1b479a84cfe1513c3b25856af8d0b7529f07a9aff19562bd17f6c698a8d45e1d7bc24c8579b71ce17ad928e9e68718fc9da01a024a9151ffec52e33803d43ad567e79f374371119dac54a69726c3dc411ff1857fc4514449c8ecf7e62ce21ccd7d5a4e899d63c497e63fa49f729281e2180a1ae6f7a43a1112ed7bb2643090c5e525a0a51842dbf1b547e3adc5460bb76ac6478d67603f68053746e92721e806a93ea645c36489050c40fe4aab43acbd78e01feb02833e4e29ac6b560521e3ab3975b1490aa7aefd02294719b623cebd3dc0002f18f016479c2629afc7434a412ca3936dfad2623f2c32519e161076a000384c52a4d1ec439a6767732c039bedb341924e5ec5305d19b88b684f1786fe5a02941fa52049c677eca8da7df1bf68b0ecc68e7134bea2a263300a1e15ffc3a4e82a2875d7c865ba0cac3099b69222f0f8f4be47425b21de5619fcdf30c3b1d17ec7b8789163453d1b06f29014776e780b8ca91711f92a314247c50814ac91c7fc82f11163d8ebe08a22e61d800596a6c1f8f3b9e689f82c3301d560c7a2be48673563689642ebdb87666ecb10c84ea34ee1b9e45737f1629ac4de5201a357d32ec17b3a8221ef8b1b20cea3074cb2f4af875046936d5060ac0f323e914489e787d30189039e869c21dbe6816050f9cd4383f4d562d0b12651e34464943618cf76d6399bb099d1a35779fbd09046dd51350bd2e576ab305bc3270a9a1576070a4c4c293267df553e3abd465bc6f65216631c8edd65bdf140ba1b91ec1157cc88ba622e3e66d7199f77e20a4e46b58231fe2e2ce035b8b00494bf0ee8153d932ce11345eff580ded6fac153e3268b5cc7168c6c9c0684317fe48437f922a0732e7534433ad70ef48f0d92600ce6fa822bd6aa901685df337544c5c479c72a6bb4cb8da7a52177ae1797dd9e64242c4f449f931e2ea63e92500a116662c4e617890f328510a55b3e11f141df6196cec5f5e61e287927c64514af6df165f1e46946f7f9f14c148c6ab16b2b754a20d0b938c75c58d3027e713577a9c003462820059b165990b299e169b3771dfc546f457ea4c89e9592c5ad38802cc68195596293f4255f2674836873bda2981fc2dcf6dc2532647260ac8cd5edbcb70c00f8397ba00d7a95c408749419bbaeec12828a42dc5d593844e02340a225143143a8cecff38eaf7c27fb351f40acd99b279d1ffa0720ae0956ec1562e209805c77692575e42e8510219fe27d74350d27f276f2cca0e95f0f941d598ef3740db3b03663f724810836222ff468c1cf6ade110d7078fc4cfd50c5e5e1c6d4f62cbd82563dadc115f36160d8fec104f64dc4b27b8de0e476bffd26eceeb59d20f4d7b336f6680d189f26f5ef08152bce55bc37f2eb9677c436f456253b521b57016e2408e221e01a386623b70af38ed528e54285127fe374b078922541d812b2e4511067e74e13f541a006af2d0a57bad7ee87fe2e04a72478bfb7aacef0439c6606d0f4fcd4a0bb731c079201319bf627d721aae36ca7adc303b4338b830418650477e733a237a40efc212d37166eac8c7c02a611e8a9096f2321f9207436f6202ff31cd9b329da1ec5a4073b7a66bc9507a00795ba3a4dbd8147ff8fb17c653ad4f2e7134b764fa5dcb4e3fa931a991e5893090516c65dbb0a05e4a8f152ee91b313655dd6a1b751469134ff355dda9f7581d34c9e9505e8a542558f4ca6fecda592388050290b05a5a7a17a6e917a43d4a42e733f92031e0d820338f7469dfd800284d7956a3f5c86d71246439b8a13c801b37166cceb9fd442eb70e45150ae6764cd5c46f8c50291d4e94a29f852514fc3d963242d7f17d1f0ef81d4a54e44db019e8ad822908505c574bb8e00d365d8c666155604b5a4fa6158ad52883c8b43248806bf3d1ee506a0ab6d3ad4e619f3350cdfdfb151f35151806d55af8a8a7513711caac8f344ccf4b1b7d2150a16c1b63fd60bd807f78714ba07941905d8a37018fca1f465926066665f672d7db82d6170304c56c3c2a30665860efba0b3fee5ab622df6c8c61bc28fcf480ed0e71bc5f7acc5613952e004af1300665337a797c046a467b6dac5458520d1e4898fd685e8322172f5d937455cda044c5ff960558ee28846edb3b4002abdb0375bbbb314a4b3a1bc165c79c71f6f1470ef11a584409c55b6f79fa8241d3c26b2fa79b36515bb817f6c7d78b4d41d1eab483322c6811ee9940365c6d150d97b002776ebc6f49806d24c496f6230e0a6ba55b6ebd56c07fe9a32d1ae064c668f3cea426bd2b63bfa44a5f7ae76f4dcfdc42a88e9f61da5ac2f6585f9c649f2da1a35cd88018b4bff8e5edf84a456886a9a2c16144540754f44963c6d33e5d08ab31d84312744fc48fe995ba732d5cf8712d49055d0072f6abb1ccca7b7a943689e44c186c5367e20f7a0fd2153d38de5ba4c7fe785654543f1e679e577c4915555f318fe14274e23899091d0e611e92851290284d6bbe3239a0588abb05c574cd058349f35802e7e755c8ee9f37bb21002ae6ba147063c1a1fe5640ea0163c12c6bb0f7212b9e2d0fa940f7a354d371e63689911f7f893e6844ebf2ae42d1e8b78a1a0ae83c01d4c813c9bdb15a9b0ad31aa64c882fa3acf4ef5f6616547eccd8573f183923a6ddca4a37f44947113c561fe06c637b60882cc7ffd89c65bf74929696089a7dd1b074c9823df7685d270f6f1ed3022290c4be3ab7bf7539ff823916ffae965f8ca6881d344be228e6287fc9f91dcc5cb02bd9d84d17e97e112f52fb5939075090afe3784be4ee441f6aab70bf54c01e4a2239d47891535c8f062e649ede82202fcf38493953116b1333607073f5a762cb5a44a5288f0e07c5ead3d390b81f61a71647fa6acdb55cc5bdf69ed82f2f6523ebfda68882fa7330e17ecbb6d2735aec0136a3515208015b17961a7a521f0b1a39b0a4ba79d8241cd4c9894fe9a669cfaf4c280773eb750d00ff5fe6eb127c00774e83de316065db5abf251c915144beffe9299f4812594d3bb0bb78380b07e64688c538294800f14dfc9dccee6e7a50445d19fd16224965f5d019e21bde129a38f39de5e98319b715c7aeb48b733c57d495cb250ef52f243f2a2df961e32b9015c7fa1df4a067c14461e84f73950f690cc30d8612ed572e2379a6bf551f56ce64e2613c87e04a75fd8d696fdd7f4f57e569f9da0f4e5d031fccf97af9a86b240bb5b356f64c1ed38767777b7b170ca3c9fca4bf1930411685655c53dac56ea6f98e7a9333a54d3388cd6276c5d87708bf56b1fc03ac0b268c3624a3578d51b42ae38bf66e5f2992b629b8196c484f53129bedcf8895565a66abf8037f5625058450b41db37e761f7f42b22c64254744e677b5f37a213bc039e65c19582d100d4ebe9ebdfc6d606dda32b0ba1dd60abf9bc31508f3e77fa68c73569adb8f7854ad4084dd3cfb4786e8b6e7b78e7e5d64dc9e7d95170719683e444a70c4fb489555a2f222aed37e5f84630e5631c917f2e9458986f2f23b5ad8e361074e284a1c01ad9d1374c41150e323e684ea9067085b58867e72c17748de9849cb727610a5e6d5a82098d47ddacb2696e9263f6f487b6863a6afc8564036e6f20d0edc2193ed74943fc6786e79259eb666a79e2262d6feb0f6ed9653b02c69eab2e26f16a84828d79ad4ae0ff4d7ea811012ef182bf76ec9efd4d55aa8df1aeca272435b6b4bf2e1803878357af25a3128e89b3d1c8115a95138052b8d31d044463d937d938eec5b05d19964915bb103865cce40bd23f8db7812523146c6554f6833ef4785d89d9afc4038131c7919f58702a42f6490882245b7055a20e25e34d917335c939676a00697c3035d0bc0fef85caa43deda14285433fd3d2208462160931204ba4376e286bbca05ab7439c608f99e3dc8e4ed4cd4a34e609839c10edde46436074446c42d723622f0f0831f05c8cb1b597c16ba7fa027160be9b5b20644d8381002bfc4b2da1055aeca3cc5266d656004ddb461cea9b7661d2fcf1628e92954e7b5d0f77770327f953ef34b9b9e0f78b0e9481c07c5f866b6a7587cf406d33b5f18228f6292176c55ca09f363fcfe443f47663fa00d4d22bc69ad1fc9ae74719447137c847fea4200b471d1cfebc946aa13bc3c6c12db6c66444bcc3f3635033f7b87ab0f7ac940a3dcc1136384ad2f61993722944f2158237fe1c9cbb68236168befb48c8baa2eb5846670af37f61f68e3935901ed91105b2ece8f5c920b59a10702276a075d2bf009d819b5910713773d9f17dcd7cb03e300a5a243e52e4890bfcea735ceb4608668480bc5aac537d945e7e00c0b8378d205446a62bae72b3820a97560af49450d0062bbdf293739c692360102b2c47bc4a92bcf75b5023480e2bd19acc4677772d32cf356376757ce0a2ff5f0e82e7b5d2db1b78379cf3cfe69c53d18af1a00d5416fd07a2fda7442d49d80e5f72568eec74381ec4f0c08fc100a128dd5c17d24301faf795d0173092675afdb4f5706445d2cdff29bed79cc982c95da381917961ba41516d5e16ec5cf8912c4bbe44c99efa914fe5e8f3f1d997b118a974e2f0d5d19c0ab42ef6e83425a3ddaffc1797e79fdeb8e051937739acc4faf0d062e7fa5e0dd2a5b085600c568be4733e51e29fd71fc6bc64107bb1ecbbaf1c0e176c5d4447f20605c218e5814ab92278140b4ae78ad7e0399489b2766b7d83db840e3f2831c78653e37a24f8bc3daed9a6c9c8b05424734f7389172e4b839ec05509fd3c8a0a465c84f90bfb03271a2dc763f2de5b2c78a0751fa4a8a058185fe71ab239c5149c5ef37c3b5d207e529a9344f5af766d2b8182925e659a6253c3115bf22dd953f2dc0031d1d757d5c0e362f5fa949d97167610cf58c89d0e16aa200e7e8c507073f737ce6057d10d2697916b029477bf258a4563e2f5f4d5c0fdd4e858a9abb2cc2c962e2390b9315afc575ec8cdf48dcd8f23f8c1bc8d7df26200ae3cb955c04344272f3a95d2b63376b7096169f30cf6b8d5269a5d1ee050e7d44180076e04422792131adc47acae15c3c7ac7920a3aae2577c1bd0ba09cac931bd4e7bc9b52b34b48703fffdd59ed77794995753e7b730a3926ed1e8716d9842342df4fb19df78e2d13db7a7aae03d02b4591e93121d196480f0a8a9b6b3cce694523e0c7c3d7e850f8b7d45f0670742943b6be7b10adfe1389685d6c920c3d29f2eeca74ddf6981c86c5c79502c8be7f804ca64b82ada76825cd502c3455e313875492e85a00b438b12409b51997ef5227dceb4666f2a645b99d6654b93bae2fe2b30fad36d6247f00df995da3f14e44bda25311412a7978fcd82fbc995f7f132dc6683259627702016a46865849a256135468e918621148c6694da259981a60a1527695a57e625a2b5112ab7100d14585792f123896d471274e063d4fe6a469b019d9543fc8036e4a3deb968b424538c66ce32097f8d83727e7bdf4849fa9100a8403a8d982fa4d7d9e5b76826afc69943f02bcc9c50148be5dd2a8f5f0165695daa01045ee124799cf61caabb1466e1bd8763c5d9a25447d4516844faea77379faf5a3f4f2507d514a23fa63369c0de99b72e38525072eff1a6cff2872084776d542a6a7e9620d29f3ea13772be14ce3239cb33bc3ed52f4c6a20e5e50a52142dc838ef4f6652dff800c79101aa62c381fe24b0fbc823ac295996d8c716c79980cd09ba853582676354a45488cbd262176477e32f03079a7b634a0a3085e6fee86121dea41d41ac7bbd4d9713df136298c71fd471553763d4a415e87f8ca7e94ba32cf9edb11205dd2ba113af5141c589587e9699fd727339b5a358232a1310faaba48f5dd6803616da4e5309a4e47cbdbf90d8e1eea0b1ef5fec5cab95c6f74ec20e4b05d1236fd8b88fbfaf1f732155e9558c66c5d0f4050d400205dc61a37ec8ebc85966928ee2f0b1aa7e6060f12ce25d7b14bca0771ef5b9f76edea5f3b91cd187f4b4753c7be45f67777b72756e3ed5138ee687e4969b469c5364e00ba541feae712705e167810f305d38f17a782f65adb3b9728fb4c62e9ffb1186f6f453c2358cc3f43728f3abfde7578762763efb8d257240915b71acc8aa5a1376f807c3f68934072c33acd6a76560770c5d8c39cc2609c396945380fe60cce1830722d5ef2b8df6ddc830a6775466d42b1a907b1e205750d1cbc565133b0a63109e59be98365637d48cf87ba94fc5023d8f6bf901380fa36e83a4136618e392c242690a41ea93a4ab975054e73cf5d206b32783df1151d77e1d1d1bea799df456ba52244730abd7e300ad69d7aacc21824de34d0ea04c438bbf83bb228845c53554bb818f2a29375eff60de63e80fd7394ea9ac8650e5b66e1e9ff6c466fa654ae83482ef3aa263a8e553f1fed54883bfbc746121e25b863a71ff8dba1ffbb5f639ec744c8317f3d11d457ba4d7b5434723a670eb5b97277361b792c4eb5677199df828b1bcc032c478422f37c73b122732d4cdc67c915562c500fadb753ef5a6de5542dfde0503ec16caac624990c57ce9c9f7c0244d83036d44893234f1b65737d6061c7df1f537e8b1afb1f4f323b5e67df1bb3735828f3db07d76842e511870f52a639aa9053440c0572a02cb07b078336bc6f00b119d5732213865d7f7840932f4fc35b840421cacd96b9a07f6d862ec53ca0f0a05e52a7c04b6bfec10289eb4e8fbb51bb64af5be2439860f175f3908e589742d74e0c2e5d95e330902308ca0dcd52efb229ea298e450e5cc54c67c9c20473e56534c29d838df325802114fab39c9140381ebd4891924b6dbf680c5503520c6a6911d1bef44b94dbca0f5550a5f7f09d2158fe1e3d4389088054dd1a994929d32d7f9c3b93afca7c4c6713a03cfac8c8785689a3afd4575265273f4928af7414397d2226922c30d0237a6ba430e8cb858c15a242c085245927115e458f7eac620c272745285ecab3d947803468b3217d5b3bd73e51b6d4bea136fe81cdeb41a4ce0997090e11aeebdf56e4f8fa0f0e8b0f1e17acaa154c3c0467a4f15d4b81c48924655e1b186e498c3e1ea7d2dcc49127757014fe12b01ba92bf38a4a60b7d4281e6fd5756da7288c603ae8f7a46928a211cae8dc6cc677737ef8b8f4076b120a4980b46def1cb9cd4678612638dbfa3d3518c769300744a70863f676ef3385f426dfae24b5bab3f50fe56a1ad86154a50d0ad5dfcd83c5af3b5c758c2643de1202abb3e975e00c0f34bc794b9d29cea649637b06f79a3e565c5e60594426cfcc3c7c1d82143d1bed171cebeff686eeed2ae32976401bf562170a45177fb3ca0d734687200c4b910c487210ed79d2b31d6f742f2850450c57784694e17dcc9235512184c3f2f0068951e3d24dd41d241656d857f37b5e42d152de9951e073891520db9b9a5676106079b9796d73be825b207f8b552486b1af214e8feca84a57226be86ef98189bfdf17b86d34d7b04411610b8ea00121c65829ec7909e723b82e61a8fe74af7625684054c2230c19782e6ea14d9dbcb6204a21e9306af04a070b706569d04d309e1430f8e156e4e9644364a97746d61a72ab364896c546bb78f64d4a4c8f7cb6836102c7933a2a359ac84e73ce98c24ee28a0dbf9a95c6635bec6fd9a39b9dd4c7ad2517449dadacd66b5232882c131fcb012b286242e3126461227faa02d83565233a7cbdd8927f38ba172f4394db2ed94f0ca36fc6360991377a5a40d2a926bb7868ad678fdda393aa0fa72b1156f83c5059fa0f7aa52b5a440df553383f6511f016bdfc2ec64a72680e3b4921cb5d718c1d118650e8bf2cc306ac9dd2f6cce975693afb12f56b17a36c8876961dc7874f7cc61b4fec62d8d570c6d7e453608ebe2542746f9ea0694d282bbd604896a53e24b2a94218c69e3461db5dd06bcdaff316ca4424ade74e24306977171f391d066c1608a1b64ba65e20aad0c44298e25b7a36b5ed243513f3638511af4e861427089bc37e2aae559e24e60456b81366c94bd291e98430e23602143e3039f7109941f9ccdd5b6085291f17c83e30bc3b4f1eb89c840ad45c28477484ea8fdb9bd2296b15b1df4425ab5745f792975bfaba26ee11f19394a41563a596e7db9a9a444c9a68c5a78970da2348dcc6dcc990eb79cac47ded8d65be39ff4e83db0d87f2554cb9cd3b409d4f7ec932258f950dd2135491ed2ae3a84000e068788466388d5c79cd1541f5149139b6a93e861cb04a7b4b553edece9a4154b3f4d0bb766c2a218cc09e58f93dc21b11d415eaad75b8474f9993d353d43d3352e7922227a93260022e54b1c9aa5041f4378d892cb6e16678c8b226d8fcf35719d0e67b3f424a4c0f17fc6b60700176ddba367789c75464fad3650fa4a7c605c50367063b2bfd367f2568bb4db23806c83c491ec57cce517c81826bdc3aa86651f63164d707b207b86cf8635e98164765a1b897a257c0412e477d425296ed4382fe95a97e2bd03f76bd99a67c940d1d94c52f820dbff757b872378f8a70b421804a19a3d1403a39d07821e4bd1ac53d569ad618c66f503cfac29f0e9c9f351972bb25317b6a4b548af6b2949e139a2e38753aef999c5a0f9b569c94df48d66fae3b7102f493c23fe62ba3bc21e5da0ca23129d89ab97f0f15349525ceb674421f42e662a1983934387a0a6df99eed7ecf560d52e0012b0bbb62ecbffd9d71635f1a239b33c25109080bf0eb3c12f74b2214f425c4c723216df1a73fac79362b149132eb3d764d6ea9174ad51140cf31a7c8621656b36067f7012e411b125d7e421cffce44e288543a7a3224ee07cc523f271a8b24b27d37f299f43b480b53458b376c0abffe123c400ddcdc813b7801ce8080422ce8a2709fc7c0ddd6c49d45cf77af2573d7123dc5a9b4e92a5e492dee0a923875eee75c6b045678410fed7b70970d098b528d5a93be7c8233b94602ee121034ce9a2f1f9152bb6f8099fc2a962f58c16b53b9657e38cb336b6a90234c5967531f21490a38d286c768e1262c455814fb9f7a6964a8544ef9999c7425c397232732a80b47889d7666330d035fa10711eda96b7b2ff102accad34f702b47ab89ff054d5f63b2338bfdfcfdce6652ee9aa1ad62cf2d13523730fc417337d3b4512068fd9b54a7ad3a76e07e3212d21378e4b4cf7d558548eda87b709f0c593dd6b75452014f7511b6a462baf16f86495fe9c88e825d31a7a5b1eb44cf18b4b931e2ab15997e12285ac58622b83fc5a2dcceee49bc3645861604074cc431bf61a7e4142be56f4f1f2760cb4329535fe5eb4867012903766727322c9d865dee8c07247ad42b0e884c7ecf225c6a015dc2a421617bca3f8baa6eac04b24312a5854d574a4dce3411f9c01a8359e02dd32990ef42a8bf69a9b865309a81f53b9090299c0f12b70ff4701067bbb0bc1b74632525ddab304dbc49516e17626570048589f32f431e1ae19fe3b2b926240604b543c9a42fa21a5fdc575864252757d681633626c9eb30450a057d8fe3066bdbb5959de1633333d95b6cac1339490638c476c575a4d2335e8bf151cbe0567cd5eb7cae908976724d300e813598447e530b45ca6c41f636e2613f5572e26847b2e981ffb5f79651b2fb87ba69af0239b98d02406474ef6bf545cb2e4a20ff6bc8c6331f1943344b5e698498374f5f6d9c87f2ff1b57533d06ea0a043c3a632d050d7dcf1ddeac043db21c040fa8cb44a539cad113fe861f1a70182f38300f67ceb29d44cc2f8a7acc09c2318ca7b35d1ec65f0270921a06865eb4acc57dcb0d5d4b2e3eb9efef2bc44405093b5592724345ef8d2ff3085f335b34d51bc8c04e3eb58ed7d6f1170db58a3e2b8c10ca3135be11f593a7c36944cf711524c447047c48347939446333a302bc46cdcb14226ffcf626254a1e1a78f71aa5622c3279d142a7d545436b105bdd98966309360ee493a627ce21de30d5e60dcea0f76976d042748a243edc4d6806cb48b287b67dd2d677092ca6b70ddf27ffa0c9639052480f67a67ec133228f0b4037aa69815c9c8aa0776e73a377067e96b3c182e804767900a2200fff0fa4559938e7efb74856a3c2abfcf83f454c215e00d4809f110cbb52dc95db82537650e53bf324a015c74e0a644493006db946ef416effe3230b54d3d362244d322515214cdd7a38703f8b38dd75fba977bbe4244feb40e476933db9b7088b87149c3c8a5ab54c4b33809ffc1d39f95206fe4a8e47489c1e66fa97b9a0c1816835144d4139704ec26e9af0d08b3d02b065154d464202c034385bf1544d05ebf50037c630863a8b774cf3031ec693565c03b8e14af03855c752e7f62180068a975204303dfbcdc85f60c6934ffea16ea50496519524a004c872727c60bb9608b97d648e353c6ca82e7fbf54d55bf9374e569b2515571fbcf308f8b06d4a291af643dad2632fa3e1703d7feb1b0a26dc9357ccb656bb1e119d5865d3bb43c51baa5a5e9134cc9a7efa7d9653d734a1e9e21b1c1515e071b16137360bcbd0262d78656a89546b58394249b1d45271e9d1f94eb7d660da308bcc53d002fe5ab6355c3ccb3d9e2b3d4e7356a8a16ebafb2ddf63ee83e5b03362cb21be019b553ae8927b78153c266f258c04b549cc71e2eda85ddd64b6c6e4f39068717ce83fe9c99040f10dbd1a0f460c130fe9fbe9955a3e55abf9329e9e58606aa7a597ec0dcbee134773802ad071b16957a3b6faf7a7d3173e93e9e3fc2fdf4993d73f4b2106de2428f0cff62597da3848c9f6410f5b624d79af2ba1b5d11076ac356806cd99b85e7f24dd178936c22a92ddd43ad9dea63775f1d272db3c6f561fa65ca4ff1ef91e8355c3eb7d4bc442ed0110d7fdd59c75245f844094d5c6424b78c9d06d99d64fd8f2b8841bbbba282e8f85da2c97580a43d1c75fa33ab253707ec909eb6b4f79d860000a1d185968a65b13044fec151c2f2b73642e8953115af40a657b3ceb672000fd3368b1125b2b3004ff4db7a35d6c19c7e9214b574df3109beddc401c1eb885daaf16b67a1f3fce905e8e525e5d51add19403d4886ca8b4bfa7e9da8114ed19b938220bb9216c1855ad45074045920763d19178e51c0391a9348adef663b2838d8b66d9c55d67f228eb7fdb2651f50416e277b08373cb63ca6f9d7b684af247053e864b216a333ec77c5e2f64214705c07a38ec1362faff3ffcf0a93f1389dddcc6e065d756e4ab15b677ffd263fea82798baee12225b6845870b25792382250d7fad62be1d2d695de301c9da062ddcfa99d1d8ce65cbb92149aa5e6242ce0dcbad0eac496199ba95ae6ed1de24bdb4a5d0d51fad5657a84a668307c731061a15f4fe2cf726265c0116421ff66368b9740a466e93515f7404b7f7b0e56ff463b589e6d3236f438009cede3c66374e1900366c421575ae67948a27402e29be8edd219592836b9705c7c664c4736426c396214f50fc3586d5c8b29852697cb0338d6d1987cd449694cc710adbd972daf8afebd750790f8b129ac0cad0d31691bbe9cec8fab462f752b7e41d6d3f54fb55d89fa37da500ad9cf92b218d0f3a3f4a20b10df45520bdb31dd6f7a1d20652eec574f8337313ea16849a0c1f7b68447ca5d34d8e460f5507a3a96484080bcbf27d105383337242cc38088f45eb6238b5937afcffb81fcb2b36ff28e38765f1862fe65e94ea40b6cde9e639b060660cf98d500f72f035c6a1bad7b3ccb525539d170815050433a0d331c9e99e597b7462f3de8e278b7e6b05df4325ed721517c4929b98575007f459f0e2a4ba1e64fb366350d8d6962c1299721be547594d9fe41f52cf0aeb1cee1316cac8572524dbbbc1a4ae3c1140d39a76001acade52005ebc4064346a0f4a473eeced61f569be963f2a85b59f622d21da967e13c823ca3c3595651a4010db2ea69801dbac34701f404ef5f7274a02e0ecbca62c6e5ef09ede4fd39ffb5baad0fb4ba3c79b5075a6079d5416182ceb156d7bd17b960662fb569c02a39e10e563083a0c8d12357c3d314c330cb32787b164be32808a2e3af4ae9e1e3853184617b8f10ede1f5dfdc708f1521cc556b8d0dd4cf7a2bd64d9da0018de73164b9049924bc5a436579207bbf9897b805645fb18b1a4f8df5da5abe7cb22f8817023ab9ff675856f5c0735baf0e7c3db5c5aa95eda8cc8f0676934a519bd6b3576892bd7dddc8ae1346a75b8dab3d0456979bbdb34a9a40359bb3760a92b89197195ce984413027f30c929450180ca1b66ef3b92784669201b297d22a52937090b72d5bb1bc8fea97ac4f3947fa1fe260fe3066699e36d472bae7d6c9124255a6f203990ab0fff9e111bf24cac2a5f86265bcd76d0615d10201ee6c9456b3a9f6067da6025712ee01ca478b3d6b9f4550efd6ccaa85175f27db64e72d6c9a7592053eb454fff60b576536dd41756c69911c327b6008f08f00ee9e3dbbfa0b7e6021e9328a53aa50d6448aba91c5e24d97c197bec5d0fa76f5b24ab98e47a0a2965782dc91611c1b31ee6ad471ca12b4f0dbd57a724ca88f23a0283808f0c29e93e8144a3305ac26b26d0f5889da0ac4550fba5a0d2b24e2f00e0fceb72bfdbee0f98869ee5cf80677f3d320b40ef6f25553d30936688168b33ec5defa951221a544c605c583afd0a1210175968810bf025915f77f08ed51939d11dc6e3da6df233b2c9cc1d6d47891f4cc30086ae012f1e3de0fb0fc9e1d17746232858c4eded7ef673e5b527f16d26e9963b51d5a0e7301157df4496fd036c9c4464906fe2e3394f806ec4e485092eb2dddacd5a7f5d5a3cf7466d0ea8e70c775219e28cddb634868afeabceddb374b24f0a8b282f391be70acc672850485899623b379febbb2bd95ab7307e4d7419be5abbcfe714ec620c356482e6699a342d82509ee73e3c289a138edb6e5bcd69cebb69e8d8b79f4f9b38fbd5c3d63a659b6a5d9b3bb28449738de9d3dabec622e7564ed4ee0c4d751dfffd51bd999b704ff44103fe322d7f40b35a65a0722a5aff1eee6d87667659482d80c34acd73270d867b19823ddb1983ce943bb1e7d471d6a8af2478f6084b9565b4d44d0e3573580feda21d4faf177e2f841c8907cc7568de04817045863ad0ede1a30c4e795a43ac84c2df6caa0f84419bc88cba383b114384398f8efe13f1354c5219a4bb58797de84c612a464d0adf87ed1b1a9a00a13cf7fb5643f83a96d9ac6eb1fd6b3cd63cadac6bcb451a03c8d050f8ee07299c4bb2ddacbf023586aeb7877ed89c0c744bc358c7476c6b7dee01e1ecb7cc7ce1d6d2654a8e8f69c11dcde67d3267249c233bbc4da00f54e0475b9bc0e3213c84cc5957fac83e1abd5997a97985ee4fabda83ef0c77354039817afccd0b5623fc916b498bbe1e64635600f30965db5a590cf0e560322f0402991e784e424c374f455118e55b3c14bd1e8db6774136615cd455d9fc3c83369d98b4da22694d5b5cc8bcb0480cc04bb7fbd6be5a877244d0801b79ec733b123fe485b3589d0e259317ecc00118554ff704d5bc654dbd47d5349a1caec45303c19cd9c9a8b0724058fccba9d6d8425f64ccf66a9b987b732d5176816f8b9751020d12d1b29102466e6a9a977deb8f03f23b817abbbe9f58e8b20906d90b501d941ca7c9c571ad09ce3dfb30fde4f6413e8c8c55f3edf3439246469a64f7e0631a7c2b999258c97f7288b6074630aa03bcc7436597a511592a635b0bb7486e285c971680b85cae69aaf437835b0575629b43de9db47bcb74962e3d0a4b2bc845f6dfaaae19294a5fe826455c9172012ed9bda7fa270bdc1e345ee91866474a2abc7c8d7c5ac7487208807b253fd7f923d2f1ce727c32e202bbc9e2771363c55f24e5e6f10082765f071af3a690b7df5c65c6eb5715bca67566753f6f1a2fa06aba25b6db4115dc507a6f78972589937357c12326b1e38a1ef44e11aeea49e16424aa83751005e935f7457e74fed43500d0fe654309833809cc6779844f49d951957c3661f644524bbe85ee79e81a962019117de9ae256d608d855656749a19401ecf097b0a96f67553e5fd718d4e0e190265619f393dff4615691083655740249551a5e7eee4e97c1a0895c927fcd23f89c3abf0c686f91e313c9a5f7a8cf0035b26fa200b0af7194ede8531a7361e18692ef4d7fdcf150e5987b6b14a8902590866dcb1080db57ecd913fa50b2ac566a44c09b467e7fa7412ecc7845345cf272021c7f2ed2fde5b7a760b6b8f6f022d3eafa9686d483e119fae5fe3bacfd578c31885ea63d3792b2b642ddef265045eea99c203ee38946860d8919b8fc21648b47b568816e8351229d53d081b601f39a901cd5491d86775841d8a8b42dd9c117a7629760f7c482d302ad23b8a637c3ff8cb4591906ada2314e10c3372c05507714e8da437a92a2db99f2467052bea189bca9377980a811a504d612d7014ba6fd5cbca3cd5d7085ff6734a308e412917f6f3ce3d54cc9f7c3158ab16b803435a1c4b6dc59e51bd72d3f28124c0508b6d7679377d467d1b082b4d6c2e831e170dd010eabd2b9c8747b04010464dc43c2033c173cdc43f5e6798890e1341140a0e0b8ff4d03b489925f2f0cc066dd4bb66efb3053e54b5b76f4f7cdb5d728cfa64360151dcb90c5b7ba566242b8da7063c3258fd0ae6b79c54287a7e4192c34c7eea31d06c83dead04f07f66126e731d59779e2b1a8eef7e1263594bc071e51668b4a215be7772bf100602fb651eaec34ba4db48ce1098f325511d3123d6918a296b303aee76232e0421e4ea740be60c4c97ff1d969d48581ab0f06e5a409c397379d2fbee74d4d47fad43eff5836730372b7e8cd674f48b21d81f3f86b5d4c3411e5eecdde2fbc13d2c9de95a5862974740c8d03eef9c007bb926e9aa6bb1352880ae13e2540e192540caabd60a31c97489f7c77ea402317e5e7023bb1216d2232ded2555b04b0c4f1e0a8146b7297a1510a2cd9c864c327d7d9540c432d437566331fc08a8e0da2c0416609a80ebc678ea39cab4e36eaa79e05c2db9742f7e482dd45517da7d41108306678f1368026ecfc7af6b9fec3a0b8782e8050d93a02b68e837abbe21ac6d0945cf22f8e59a48a064145380ec5619f19e6fa86bc3fd10653c272b3057af0f8be29da6e3e7ec6d1d3064a97f4daa7b6fe264a26eaa2745b74078cbf2398749b404c79d4eb0362774223a64d759701791ac9a12bb517e36f61c115d90de851c58e40b857af3d31fe774e96e1b73e25dcf6039469f748d628691936bc193b75258a844439b096d7a8145d4b897f0e4690091d30fe73443338d92f3f478c11e534469393c47d90626ceb4c6e54946f97776fd6b30c0a86b73ed78d12dfd62f3426528742db7a8222597f940336d5eea47987c7d7b56ed93132a52b030f727d730a7094972bb272e1fe16e663897c7f94b6318c67ae06e98514477a7f6a6ade27021108b6415788c70b2a1a43aab33540d4cfb9310ed521016a19a2d4380377872ae28a558aca19f255ac836c135a15a78344b5654e52d7c30ff75c27a4a48f0161a16e9d3d9acba55a4914adbe4b01f00c04a88347233a823a4d55837df24da12d81fda4c8b2d51799200b153e3a14c5095c23994d1248819913a8750fa0ecb3793a34cfb7593741264fe5d8e7dabc046de575ee315babf4c97c0ba50a6007e5f3317187911b83a01b2d8cf2c3805641a7a402e516caf4d4d629964b4d8236c637ffd5a669346346a925f323cea921463db2a299a2ed30d7bc9cb16785386292abbcc54c99f355233f43b1c331d76c70aadc78e034c069152f6296337cf43e9188a5df7b7e7de020f82a3590d4925a2406edf347408da224b3a01bfc8988a03505204aac07e10237437617e56537bf71b345c350ff08aef513bacf2e89dcaa80861f6a0b22f9d415dbcc03ea75bccf74af8da933b55f35f23f4fb85d21e3ad76bba76f65cda44eb2d626d344e3669526eb5a7e1775de35d54aa3b41cbe890c07e162d111a2965903dc5c19cc228ad5a7557e8e289a6a0f12ae75ef9e97949e90d2fb365647b6d981a391e3d1e80207c03e1cc7400ad37d7763be733cb6ca6c37c29700e24ed410f3b81fcc1c5dd10aa082603f7522b16a06575245f9d5f9b79211d4609f0eea7e923dcb07eb07511982bc3d40e9062e95811d1a99911a1ad9b1983a0a89707ba193313e4d0246aae25638c345f34aa0a840662e53f68bf043b76b567d22a97ffdc7cef42a447ba7c7c7e31026129f3303b791ca2f9ecf982f218e0b8262d7faf057311dc23ecaecbc01a963f653e999a961aa44b4639f9c8767135bc6701554eff1e08d518160d4fca501f21aa45e24b807a4f418a3368cc7a26ad6bde95cd3d8f1a3f8435c382800d0de968e527e2cf71163cecb314c4ccb52b4f3fc2782d5f1e1e6e6f7a987ebb033150971dd1b1a2097c230aa61f7584aa0bc79e8bbd426b20754ac6b97254d89808f1e4c42daee47a0eb8c0aadc47015716c56e5f1d47c0731b8958e488a3842e4a729e0f5a49d7ba1edc82fa7e3fbcd14b1dd0ade6797ac14f59e0b607c902b13bf0f54fe511b15f114cbebe3a3a0a23327966952c28b72e08243f4dd6713e1821ccc991cbf449a330d041cec7c603764dbd838e626c851338c747c1d164899f0da79d6f7078583e2ec4655ce7e8674220caff19eeafb6b446b75904ad88d2cc46a2c021289405d564465f9f07292b4f5ffb5ef89b904ea11017d746e0ac6e590f67e9b9d8bae6743bd54a57b0e852e374f65a5719349829109dcdc094b44aef4c465191ec1ad8e51516423aba080ed83b0c2e16aee9bf24314056c513d92078745b0a6997c1f65a1e8cbdd1882d1be754a6fba0e2609d350676c22c709df9ee0acbc515137870fc028935222bee9c03237070b9d5c05bd541d56321fec9e9817b53234197f92c2316f8a26b96bf61f4123baf1ff24d3b346ef0d4e8dc91fbcb72486180ee2264e2646b30329c3893fe7391f0c786f68c3770a84f7831ebff570c6ede4d5ee006f0616d7ba282922e597cd35c4ba134457b2b98f19572dd144f6b873e2e5a46a093691ed70c8dd146fd29a9f55f8fb4b6d74b5978c5ef707e8359d5c805acff01ca72104a3ff3aef60352f46b1bd374de1f3eea85ff31255b065f54b2629a4ba92958d4126001093406627472fa0463b0e54c18bc3d86fd67b26b519f9ffb9469074abe3d019e81e2cb1d8d62a697560bc25bcd15828e6ca35a6d60f4b06a940ace0b95503d5f4d7c3105875a125f0e4ac25c9e04d18018872161689101896dca4d69cf4dfcfa319cf1494687061190fa5e15ceacf76623b1db0c2fdcc7de7dba7342f4576f3fb237d43a09e4395f71cc0e6dce14a9e53d4b737e2909280e63d0c601fb4904e86a9dc86a28428ff715c5820415cbee96ee71fb581b0e97439f1c6138e3c89cd837dafd6b23ecf27f24956b6479db07671dd0ed764eaccc5b0684cb0b20a825229ea5c31038a58cfd8084cc795dcc4385dc37a912db2526e4a658716120e79ecdbb8e032c18f62f7843eff52d7945b8d2c750e71700ecb88681209521cbd5e197dc65cb143090921af8ce311430f85deb1144292f017833312a83543873afbce62e72f51379a3a237becc1f32baa3b6797e81330f02ee67aa6603c04ce5caa749124ae65d118e9a4a199f11339965ebce3aceb70d7cace81ddaa07a7c64ee52f425d6206fbd5868efe6e8f65e009c120117f2124c81b4cd6562c88370ece21ad5b2e3f26e865b8b9237a7f46cb5891d75b27b9356ff618d8ff745f20b2b082436fd34ee1c575c84449980eb2857c6502754f241667770d6505663773f6a80682f82be6f1588c6e2aa08b0427f4eb53830f5cbb638c7bdc08c5d9ec644d3c4ad1ae91bab67a8c56072f068a23ad1a8fc5fd5b9b56236cf963b021d4716009e7dcd5e5c686861a0d9bb2b29282f9f05a1f964d9e51af2b41ce67b909a747e49728de66f982e1165c07592708d5ff8c69bfc7b4db1267d672456bf7e132ffa9bc68a644aea30948d1700e6907862bd8420bdd4680f3069b4ef81b5bd906caf6e840855fd0551db6a900865b20d0d207967c5a2aaa56e8c95f318396be52afdaa52780c700c44778d1d9627f9341ac2fc613b55cbca0336ea6b140fe1747085650510048519506d224f158c0e467a36f125c932de7f30e14eaef6db215457028d1b8dfe451f47e94e30cc834b884431e54901073da3631bc90faccbf0d34a3108ec010c46840fd3deb3810f4cb42bd8f327c16b555f3f327f723535737b25de846485a078c814613ad3e5f024723116e3d4d8c812df7999d4cd734746ba5f648da38ae72f8a5f2c1223a5284430550d5cdfad615da334a6ebedccaa54cd58f432497ec7fd191a5975adb6ef3950535b877e5cd9973e3fcf281b03bd414b29ba3465a57251e210be3af928f5a6dc6c6566d7cd2dd6ce5df309af9fe1165d653f298edb600a3a0aa46d191490673575fc7862a89682041b6608b168a1432e2c68a197e0ca47325bd532d640434533742cc664a587fa043d2eaa755858d26861c112531030aa5443acbdd363acc3d7533c259468a8d4b362a6d5b220d2da035864c77fcf0dddbc7e7321f9c926a1910e82c81c323d00b96b394949f9a28bea793fd3388bbc589e5e6915dac9cd7d884766c09d09bed01b640e1495c394c2db02f48cf70626e23429d64237d8da106244c10192e1ede0bb6e492c82573c253558c7272bbe797ddf7b8c74df0007f33e1e77d902922ff91413d0884e52658c664ff321ee4d1b5c353f1ff1aa87fe45993b955e31e9d838783fc3c070fd33cd1e000e8f0de605f0031ba4c3b120a49c1216de7542f9a4838844a9ae8a5aeb380b1310aa968e527f405b5a15451586579b2652a52456efe85b6d18523c5766a92f6b4962cfb0cd5e965eca18ab4537613451ee9c546ea29dfc275028a7a5bc98c14ee6d95de9274cf40c0fc6210794a0a5491eea4402fd9e0e559a589e5a490e5e632705a0a2fcb5d5396f9ea023830b6c507da13c58233cb34835f7b03152663c1d2584e18eff034d2c41826ca101152e7115b122582dfac062bae86d0404a3e62a2642b7f71305af7f1297675957abb61fc93f1da043e3ef2a3c802ae96ab7d8639c417cbf5d365e0f02a3469693660b0e334d3cc58645e741ad73cb6cd0661536903542ead1093e6ee20d9fa09d59975d75c6e3470b6215565b3a6cd102cadf68ba7d26c8a8f5df3c74551b8759b85b06f6d61f68b6a2bd0db667baf489f08e162f36e61f32cfb47ee8a7bb617d9caf129773db2baa76b21740e7edbec5144d641ccd4a6f6084c62623a1810ee65c8f184858a2e9ea9c94487b309fe6438dbc03f52045af5240b212adb50909f5a330627605766c72637a479e6d146fdc5295505f841ac517e0c6770ab5959fa59d3d1ea0fd90c1e8b06e586572b140aade1101b5a6558f7794b457cced62bccedaa1002ff60ed9e3573951ea3dd5756ef9dd2c5c6b1501b7515833b2e78dd6122b2675d1b110b4cf371d5e93fc5bc641c1172df1cae7c6105d477e4e428bcae50f6415644aa4bce9295c6c768c9144096e0d102f9f1ab7bb9f9b2ef88e658dac53785e61702b8b66d4161927533c9cee8c881fcc8564ba0a53a63aaf76c45ac3cfc0231332a57a999976034acb21f023c7e37be97aa6ce48cc960d350fc423678e220a1560b0213102b96403978fc0ce49e877a7c0bcc28a71941fc9b34489d4539c2711d4243de83eb619c242d2e05c57dc13274dca274be4945dcd91eae54743394ffb67affa25ab8e1b8929feb8604c3d208f5862868974dc2cc039f686d7649e7df67d233bf929c67b415062de1a230318cf0b749fa5bfd878757d46a05eeb0d12c87cc1e32801276592e7c7dad6ba466437ddb7ccefffd749ab634f888f982655bcb059691a19be3033da318d87b24f2ec5aa6a8033412338540a8d8b50b0f52af3e2e2d99e22b64f631766eb32b53d081420c4e52ea52201d39114108b33df1d2fa3655b2f89705df41be34ba70e6a60347b608e8b24a64c3f1e53cfc93825303848bb8f4fe2d8629122f212c2d65a1efc744306936da854b64de4efc95f6b2c411383f0c9faaf15ac3d0296cd6b7516878e2caa0be163356099ba623938d431b7c5d2ae53695409dca6a5a994ed7821c4fa683a32c1215eb14d90303f4ddc1befccb36cc1dc951d3b23cf653bbaa072df6660c12f65010a5b8c02fa27db367136764537c5f49f199bb5fff00d43dd0aae1e0fa6ad9e4b54cebdc84dde9044155a409bb1ffd83715c647267a6610fc17510858ba1423e02bc1990483bcedf72bfa154a4edf8f092b1805920a3b3a4521bbdffdd6378a003661707398dcbad1264ffa8050c6ae37201383d21ab5eb6678ad1dc26314319c7bea7f51affd5df82d294644bf450aa469181dc4b4b7e680740bfaecbff86e127e97fb3a45ffe71d4b745a0d905959cd5e79594bf76de8c30301235afd8ec7cb46cb39a9beba1597013c0f2811f311ce638fc7c51fb00ea3710fb343a2404eef120e413a26f09596191146512aa14c3e71c26191e91055161f2e633837e7c0bb01ea8e2ca1d3a6495074c618b5c29ae516590114fd21d77e5b4709fbbe1cd50c1e662a637f04018068551e8ab5c39ea26c7e22dee6acbedf3df477a6355474cc49d4374f983766115781ab523f61331e57668e3b3fb4f3ca584b258b8d5b4a1436162c770511c55c16ee789afe935f2340a7b0631c4ff4023903a84d11da83fc3668e4d6ca43e6ba2cea52503c58ccc4554acc350bad30860ad14efc9688b5c3718c2e695076a6033ff53731fca3c6e1316da3c70e4ef088666ae0f9f4ea24a4358fdfc7873614cc5d360afe1b9d7d520a6dca022b7dd2c064a703ba56a0f7292e92fc6dc4fe59fb7e70244558eea30312721179dfde8747431e632d39cf22fd2e342c88a10f8d0c14327b645ee8e7ad0200571b7081b5af1a43b1a59a2bc2ae6ddd8c73e5d35ade00e272519ddc16a50511303978078dad7e7d6d5d5ee771e80c2bd13b745a92d65a791a8e0e64123e2d0b9f89fb89366550dff46866fd80187076bb3852ade59f5c0693ffedff9e196ad1cfadb717137c60378b544ffb3c5806ffe27be0b56f240e3fe5f5f5377750402502c932d22f7762c127e4dd6eaf9e4215fa141ee506e06055600802f78d6851236bd5078ddacb316b19a1dd54027c6fba4cf5ce7390da1edd9778ccc886a634bf93ba03d997b5113aba4c349bfcf357238744bb7cc83b4b45f329f562fe690ec0d69ce8bc7f49500306092edc0eb91f5ddf10b0359d4f77ce05bde66dbfae3b513df47199dc145dc10b468a40f3915453b6aebef0e6bb2278db483dc2d0413eb6447f1a022bb838f46d7140e3d9b824746938246d6d2c3707e907426c29650e36f8c07a8d54a826018a357c8a85c1526d9237a668e22f228e48ece7db89343509620beb183d9636125e22e338afad74ac59d6d9f1bea6533762f62abf70fe77aa007a126f52952efc00b8c705125a2165876dcba0f2d849bcb7227b34c0f55da05472c7d5401b593b58220ff920b249bd178e47ddc91848293056b82f19fa3b0b5a27b09f934b2494ecf807eb18bc236b6c384c4f3d3b689244605a169cd655535d19544863e9509d4c4c0e2feea3401285b23d1e51143220bf43e4f3a63a0816a3b38efe67db325789af02f02c397ee8a14790e999360248e77407a6ce4409134425d2a2313e54a97f93a80017220c7a3a326a11340d7c944ebae90c2b742532460f54f898241adf9ce66a058e01313b9872936426084753a13f547755482a0d478946f832ec1eebe7758bb15c8821b014518b471f3f584f56a79ad77892351bee89b3e8b8d60854ab56834e826a091a1d048ca6d4712b87e2954ed987f66286558f3d2c2ac66815a6c8643744f63314624b0a82e123467e5e2c0523872e245e4603060cd22344e46d77000c0cf442149ec589c413206779d5ba8a57cc8b7378a307f040ef274140072615692339706aea1ac14cb8e8719894801d7351644f07147797fafbfe033bf93734c5ca2e630f2bf442e64dc0404569762a90bb4b6e6c761c7e9bd06b6517e179ac7f4b54633d1cf1b8a2dd96465436519184d4730945a5c84eadb0c71f6aa6d5fb2bec3e05151366adad03117220292c2ddd0316426e6ff12414a31074ab2db003f764e5418ba8838e9239a348b73b6fd6ddf5fc6c43e89664229ce671fd0dfd80adf28444bd14477a795b2a58eec624b0ed18ae5fd6e340f1317fe027710a6d7bc4dd643bb72a1ac9ae82f26112ee52e8c1965f1b609eaac9b293133dcce0147c3759e3352b60f9c3fee4b053f1de031fd1c9e92555ae249d78d1112317dd958e966f9846f6e3ecde6fdde67aef57d9d38ff46b6937c62e1a817f5259b12952dfb1de437f47bd29eedc0ab577c9a9ae20f73d9321722c57cf407dc4766f6c7067cf3ad3339b598dd2cb7d8c2b11b752d8d0316111bc7450dd3613c037f9b25d497b1d4702821d79614f3ea90ca02cbf892aeca65fce81aa5beaf6fd51e63b26e7dfbd4f0c90b0a512543c9f7e35bb839d2db69d0c0dfd18fdc8a2ed73e0d885ebe73ed35c7ccc19db91b8b46d1ed3705986658062d832f4ddd64cd5329d18f22cc28a650ae92621619cc27a544aabdff53193ed7aa8dd3be5cc4ecd375eb38755551ed057397a7160431ec564ad4827812cca6431fa937b1ab17fc236f458c05049cfa9687c37bcb7228d37385d5fc77cd8b4f56c4f554fe89aeb084647c59315a18ae47c0e70039c78e4ac6c5c43bd52b8465e3f6454a09e1e920366bffc0118dfb22618bcbb91984fa60c34ff44bb2256a50172dc2c860ad47c647b6e9d5b75e5c44b0e6ad60e73d8f78f0a9e2b5f25291ef065fe73f40b3930ed38e1f2fa13fd7de5390652477f6972651b628356ff24765a73723e8ba647a8b7653cb86c1a0384f31cef66e129288e0474f32756492512eb56b3917ac3f6737e5e651ebd4ff9b4e8218f3aee8b57839c014300996eff018b4f5d3d988ef5d0da62e63fc40ad1b47a3ec0cb269ffe89522f0b867f0925efa16655f30c43e4a6d460ebae8f69b7592d087ad7ad34dbeb501a6f377c90af2ec20961a1a03a3f41dd1af7c68aad18bbe74ea6887c03622abe695d0d2c53d6bc4f198e6734a60697b838066dc2eb9e5dfe4c502dea26b2bfa6371dc968b392cf0e4b15a41fb18740480ed04308cfeda9080010dfa304a775cc3140023c2fff943535a189ffbc834f2c0fe5dc556fb7d64a39d369a3b22c0aa4757050f1897d780d6488c1d19b55b3835f0db3ea83cb3be8164d765d96f08309532d744c335ea3926d320e0987571a701ee744a5782020a954c8f7290b2a5caa044782363500494250465751bc3161bf32fac15053216fcc4e1ea0fa56cc9e972a6505cfd950a61e2f87f533c8ceed226639f606ebacfe2527b5e8175f4feb831cf07c582c92e5e15fe080da17a2951d0b3e9f713c5b7c2865e0a78e39bd7e7f72794fd95294f6d452ea5933d327c2351f35f46211a3408872ac0db315a9575d5f01b3700d90905f4734e1d84b4f03725dddae04c91b6dcf38c866fea2a9e9fb6cfbd4d3da3242b05b951b468418d3c2579a55f1575b267b6c1bc8b9d56e42611e24bab085d068d51ea09fcbffd9b5e00ca5a73dfeda53c82b5967bf6a89daed29829b9ea1ddc278032a0fb7bb5b7b9366e8ad7a157f60f830f384df37273fa83a4e5d83c2e8c1d067214029ea0b848621d35981db60d7a922a26e9361a2b02a69480df64601aab156831eca40761dc46dffbd0a80c1849a25f85a9aa8abcdf62f946c5d0272bfdf7df627a1815d16673f3201605fbbab2b3c74d13f5b4559014feb062b1c84381f41637774661de6380f3e25895692698b1641217543ff3bc26426526c644184c4051fe103bcc83be159f6b0e1e02f5443549141da63c2dc4227b4108c70539c50469f7cc84f9a30b17cfd30b2b0a61dcb7a6a3e0a7ca0d83705dbd48f2638ad52595f9b41b38cf4ba6071a2a00d700d312d24f9f9ea6d2b593944c373c5a18b44557df3efbea180f8757c5613bd87bb8a16fa42b5ce58c23874f57a6fc980f4be041909759b0310315b0e9091e8e7634e004d8abfe44012ae3fd59b36d9eed10a701618d79131251a0a7410dce953205c6e2b6f7cf634dac407a5ca9060b9f5b5209b01fdff3ae03172a4c95851ee98934cc037faa2b2fe5b10dddeec6695b9507ea4437babe1a3574bc3f6ad957e8de73c5edd21f0f058d263a5ecdc19cc98085e1ad6acab1ce86a1c20519b57530f714ff8af09b8985f8d02ea21fa0a38c2815aff0cb05439925946483ed19fbc7b0f4a5e2b107ca1c0f67a9c506ac11c8aaa5dd04158475f1c156456c270598eee466eed4f969c2d020440fdd54617d867d6426c8b3084dd37147a4075d26431500953f5045193deb8752dba67bbcb9dd3c3429ab2c6191fca4c4ac5e3a348d060f152340cde2ce9bd9c4c1502c9767c48dc6c4e6f021be9dd8d3f509b58c25cbdfe1a580dffaab2ef2c2417792f2194c2c60dc110fa605dd568568061837aeaa15657fc50e290b6cd453d63d9fa8f519354126266826db85e782d765629516bb139482f79dabc20caa90dccbdc437cff8a812f48fe77be116605aca0f070df696a84e614ea02746670d68bc75387523affd6efe3c45fa98b52a4627cb7acf2e49fc34eb8a287ea77f3373827f38564fd57d790e760b33dba3e6158719fe8512c2c606716d8998877ec77ff82e83e8117e69504e00c2b83ec9597090c109717f519f44bac03742a0e9ff74c275c452df01fb06824ed213857e443ac6fa28488738fe5a903fa2d2b6abf036ffc8854c7254af6f42f00b32db4d363c840384593e4813767769e11fa3cebc2e3f0914bcf9f8c8724ab805972ccb7e238a21b14dd8690748dcfbd5097290cc74cd220c2dc785bd7bccf7a4f64eaaa25416416a7de290aa2aff332002dc41ff45ec90644fd8acea0f22d2e730f101697862d6e04b04b6a83c871dd16c9a44607508a01c21f10dd33dd385a3ef5685c702cba7a00660b4415dc75f384524828a66345d39921e8b696f56e1e175a5676c01aa31c8be1a992943e17ae85046186255f0f5dc4b41a6df3f3e305c4295b6032e33c5630d4633b465cc0a8b678c45493d81749a64bb47bd03538981ea3ce6ae6783e9e37e4baaf12355bde8b4ceb9337d85663edfe3608c7b7e99a02f4b615d4db8f2e97628c8882a8376b9792f71d10b4201905cda72b51c775e01b20ac2d849e5ca03233042ab4223eb9ea6e5f9540b386a8eb30e45d8453cccec87c93a343f9e7094656eadda7b532d8039eea3fd7c0bf5ea74508b5829a34860fd2e330c5c21dd087564ef9d19bbf6fac339eecb1f36976e40da567012186bc2254ddd4d1f212318119b88171aa72e45a56e6b0f4c82bf38693b347d369209a206d288342357245cea2a457b5280ac17f663e97e7c7b0ea80d16b65a545eb05b5bd5e2121ffa224e4a0e25213dbc191670e3792d568b2681e13141390e814e748615df836199f8fc419b346d5f31e551fc9fe97028234d30509fce1246e840ca5d9aa85324694af5238a910d56b82211179236ae6822b49b3750cd3d670b43585b690fc427c68a9915206b4c4c5b8609c1df29d94e6e9dc419f3e42c63f371e7b8c74d1357a315aff76267b849674f92d7d6fe4734e35837f82b21e5544a03f76dadfaec0d74b11fc979e1eb061a847ebd89fcc60e47e42a91e9e5d37fcfa551a090b56461c560b577e2ee51016d3013afa0a2de45ca06b591247df7597a6166e0cd736865201d81e9b13df036352bfd1af9831f727d699569950a794796a40dbbaacd31209a79cfbd24c8f707f7ebc6507b11520842f45c3608d1fb2a96c9520d30348b67faddb37252dc964b738e72aa4429cc5809e986498e05e86b75fa54ed1a04372b88d1b5a73b3aa465a3ef5769bb5a903f6b55e9e6442a09003ae119b2cf7b996d57473316df7393438eeca79fae7faf196a1483c51a51e64c25491fe3aba9ca27a916ed8bd8859f083e59a7a77c95ad4532ff48bbf8d352059f190e6aac4f681bde80b63b93c50d104c74fb8b07723646089b4e539ff0d17d980c134088cba310f08bc9fcde71b208f2a6f7933021f22d1e379defffeb8412af39d2a0d94e9918e8f3648357c59869e94661f9f83d4c47004123512eb41124f124b25a60eed05cf42084db79897b5761cb27bab382f571147460e68d15b933e3409333133e0828ea4213e63dd73e75c6cbb2f9dbcbd773e6dcb914711531216851f939f64744602caf5b0a6a24513c37ea20c262bf571696dfe51008e3650075347febdd057f7d78ae32d49032f60a2df54a5c36f38458fae3cfd62d55680f165c9535a4655e30945cc5ef0ed4596318251cec66f73668bad7f1fa35a84f31eabe161337d3506c537bc7d92e954a323d33bf08387ba81edad283338c9b053d5408273315936443d5af40e2bf10964e2324bd02e947f96d16f8ed095783f947768a2d37bc7d4756cf7c33883ac65f15982eaa4fa6f8d90b10ba1d1da55beb504906a7b6c231f5606c14336c1470324f67278dd626565e6e9cc7b889649b03736f1d2dbe91ea2737dcf51b6e3b93086088ce84cce9c2770da7395189ea7ec430ef3f23ce610e1e7c01a905cec50fcc2e30e6fe69e8c87632953b1658999e4c5d30eb7efc6f3afe69ed00cc3fbca8484905805904805b4726c9f13926f8c5e361f663ffb08ec89e09e79456e995b5ef3d7da0ace6bbb7222aa458327e01d8714de52d4a59a997ba311e631ceb045d9013fe045d678d35e33dbe2baa1904e3f40f2308cec30048e71b1a84fae12cf1d047c81f7b0535d8db51b5f3e82bbd2bca3a92f337037132ec45ec79821230c46a335a6351e467efd94ad382f1f39f44a111463f8de0d62c47050cc1f1af5bed81795d1bd05adae5d27f327dcf11bf065a58d871ccf037895c79aa56d8a6fd2aef3f056b51bb14fcec2bedf3ecab04a73b0599667933468d4e187849b0840d2c81088e8f162b58156d247a5f21d589f78203e62dc09b5cdc7a771e39335eac70393e71e41d749010ad51d59eaea5ae23a27fc7ad6a3aed1d646bf772b76eb6332e14995f63a5d90d720925ed3842d12b3606694bd9a6258bd4547fb26b02c81b085f709a3f0d87475845c69fea001bdd6622574128fdf22bc60d8a0f2627a26f410a1c274d9395bb724fa41f6bc476d56f5c198dab86f30a6d64614c98966d80e8351f0b1a0c702c72124c88a62d40fd684a6136f2ea3b45e9266b4dcdb7dc231e24f95f5a94459c1413e6672d844e655b631bb2cac8710206640cbe5fdca044c96f5834ca1e5c2cfb3c23de05d41764d72fa8309c295956b20599417779c2c88c5f9ebedd832f79bf10b78dea5007db7b5918d07a2f1e0c370282c5841bb4827915949bc8a778ab002210538d34949d0241c51e60f24d5d40560920fa0a01243a3513d5bb6c13d4e06dcf583f72996b971fc7c656962187c737a58d62a84f0ade348fc2476a596e550ec30ddd0ae13243617824bdc5315cec73f27bef5ec97642253773005cb3027936e59aa6d19b2de6724b00302a4d190331d6d379dd7ef6454bcbb74155329f1479610c1e6949e4273c6b82eb37b9e72750763232877b57b512aba5f91c136ec055134973a6c8938445044ab6fe1e82fa4e216e339a2d630a0aa9f3425c14f5d7033f6adc8f8b7f781caeec8231a0b6f4285555045ac4d9d750c297b0432a1fa505df45c377a175255f1aaf13be1e26955fe86a07bff07c3f64938bcef4ce34f23292880fe67a6bca21d05abeeb39e7ce6502505cbf17e61561f9a11aea58cf6e1bbde151a6367cd9533629904b3b2a9e79a6cb0c8227cce5789d70edd850e0c801eca3a81a38749b7b89f77611a935da243f94448cc2ecf376c7ca43a669b2a4150d6ec8202c464e313091f92f55d3cf676b36664363c3c100b031e102b842e43c6473fcc49245080746125c31f3c321659aab3c324c61b12ed1378f049ab4861254426c362f6c05242f5e89761ff2f313f084639c80e87702c2cdf45bb5036d0568917acad0a86a2d5ae7fb1227c4f122447c151550e9916bcc69746278aa6e2af2840f8e78294346e5c908971c76d579bf161739ee58b47d00f10199cbf84b04abdafc542c80651a39cefa19f2298741c0115c9e6dcbc366d0918e692adc121282fcbe098dd6593e4f02ffdfa265742987bc2746645268759f62849bf1fbef5cbce798f56b7eb4689564b095331c3b3406b8e26db5ccae2e6cb794d5ae41b34a0ea4647602966a08f7414eff5d2cbe7dd8b06ac6e77d5911c6969eddec76e92918fb888fb7c5326fb2259b09e451733ff816fcfdd7ec6375fe753c993448f47fa9dbe8a64bb2ca61e2d914c2e24f2c74dda11b2a8514ad045ffd914188983b05e6e44e40c5e675541fa2e402275e6d4d5d4e426cd335056cd21bb8b1df77277b1419a7c79e6c3a0ad438f41dd054230090439fd7dba8d91a1544ed1e61d8cc69ca5f16410634eb0f1338989a40e89c7e0847bedce901a9430e3d4ea680e35704947518cf959bf95aa76f15ebbf8ca42da86e26a997a95337b7d333c9e6458e087162d14afe93ec6cb19c7ba7e96afd66e27c4fef0a009b3cc95019c1672f7413fe1d5c215dee2c3ca56c0805d254b121d29ae76af59ffd6fc79581ae7a2b051f118ea8cb0edc082fa98b4a9df8966974a0f7efcd470a1d62e534170c8f2549799816e99f0383d052a417c16a545f7730d4f2f17dc4c7281bab0bb042f314be7c42d1360f7f09772338bed5cfb74df27bbde7e08117c63d2eeecef3f7d38d5e48d63e28832868b0226a144506f159645ee8cb01250abf6b7a9407fd4dfc6ff655a1725b09898a5b5337bdeb2b0c44206a976b2161717cad16d3aeef216b622626f565599c4b91175c70adee4cd33f6e4fe892b7904e94e3233bbac82465c5172c98c537a6eb841f04ac3b0d3b729fbd6d40a039d8ab95d85f8235d7065a3bc234c51bb50e08c7636274b33c8aa21f956403a49bf9000f2801edd724b5ac18a91802beff72aa338a773dd665f7584ebd62608cfc496036cc4af3b32131a3aeb55af5db771bdfdc4631e6db43d555ce56621ac2153914f2783775b67f08eea72b71220aed33c5d9417c46ca6384f2f6f43e0b8417e0987c461753aea6295d3d433f502d099f4475d8407e667f20aa03d57ec1411372be0b095b3b2a788b809426088723d320ff93826a5428a00103993d4f27d797e3d52e7f5b3864da6fee63c015407799862fb47e2d4257e26a95f7a85e13d74ea8d3f522495dd0a89c920da648e9b6c08c00b6202457c5a27d4c15c53f4484a3e8eae7bd35671d1dffa2e540334f65acb347caa136f873510d53a4fc46f4971fe94e70cd0107750de22ce038717a91334d3d867879e26ce05d39cb893e21d6f43a042a822168554543277c9d17c51f771a28b57b6e1ea507e1906fc82eff4bc155ebfe6c5b1454b493cbbca15e09f79819536f1529ae9ca756ce9b4e281e7344dbba472b3c8cd206d401e8a361fc5727672851256d9e14fb775a3dd578058cb03f017d1951dd2b727f96bed73af9455226c3b65133b1298530bc5d694e0472318ac89c9f798e867402215a295dec357d14ebafb54fc682712708166b3996c17c248c4c7169e5cb973c414e125700284387df55634d2981c5452a77715af2ae97e2d64dea395918d1e0e887f1136a36d8cfa50de615da3604f479d3c05dc40db56d49d07e4d3e0adff82643365e91b2b0615040ff1a397df860b60a3f2c26d1e3252e7b353a4bda6e65d2111168ffa5842b8422ad7df164ca3428e16948b6f32eaa9feecf0ce9eb1775d29a47279370a0a370954f03dc9acc364efeed2b45b7afdee366c9118c6fec90c5ddaf73540d5f47be3a274abcce31fadd664215feec311beb69440539b12fdf81e0c901eb59e2419ea56c09709b644e683c110e4efd6d26546b7815ca5981706906cc23fcd01bc8b67c4b5881278b87cd926e0260df6e7c8d5d52552e0788bbdc035f769878b5c7a8253a35b73a598409001c371480ef7568af6961823a0841fbf9cb7b8802f055dca659395bc63aadfc31b32edc4059a4eb16f1461ee8b61dd183cf5007d5fc0610c75a44da291aa174bb65517a26e2c4ad8f987112a973c55d770b2709154b2ed245c1141aeb80eacf6d44627e9a68089a6b0276c3750a99ab6b1852ccbd5676f86bdc3465cdde991083407e122ab73df1fc726314d4f2474f5ac0512dd14a733b45a51141cb5c3373979946b6888681b3db603730ba62237995e50af27293c1c632bd58d0c9fb25a03ff0556f38fdd7e042040733824381e28298285098bffffc28807c35d14e1620c5686f55474abf67f2d634769bf348753e3a529fdb8bc60110ae45b981a30ff3eee76c1ad3d62acd57904170f476971bc9f172f35e88bbc65e9165f69077e996e528657e9f9db6ea9ae047b5b6a8f365e8d5109030025176a23378663c205dcf79d8541ddb197c2b3a88723ecf060fb59eff0dba6778c7e87adb2493daae51867d872e7202efbefdaec455a9909046a8422d04c4d1e7c90d60c269b83e0f06e9d9f83e47d780b88ebe0a68d5319087f5dd322908b38db595be212d3aa7f8416142933068ad72803c196d05c67e9d3ef1495e260de50e9c66add4774bac82183936f816c6c1efa250b36611bb7811e8df1dc30e48d14d46503097167e1635166379c1028a4bfb4dc7ff895880fde1ee9ceb982d168c9ef47bc0980a590525397e4fad4148f1a06cde8ab8485aa6c54e1286b26e7f072df017b57e4ae505f5c1da4fda2f51a0378e8c040b73d45699d5fb49f821b993bb7621bd29019015af1b8086dd557f0a614d42be0579fcbac46d4f53452e02e9f6b96b9bf16d89c90189aa100d5a33ef5305ab4563068e417a67f8bcb13bd1801d6a7d97c11afdced70bbf8f230cc91fa13fa74ad94386f046ac1659654685c2a6d4d1872834b16e01791c6ec601e2916026e48d6b79a8daf16edd6e3055351d86fce84f3a4009930feab3ac9f17d6ba357b07c09e12d1dfd2086945a81f9e57ae3af5c3ea31355fe2ae817e39537a08982238b44e737f74cec82142a93ceaef4b5cfe6521675a98b857220f6e4f19258271decb5853a521b86a91b3530e4a5a668f3569ae20d5ff822e925a6a711de21db83be4e41f6907482353482958bb55f3375620e64f77619cdf4829c04bb7464cae959ad3667547f73db2d1741e28dbe9e84da2c83dc86d40d94804d66ec993db9a95d8ee542959ad9e18230159ed7eb66d3fd8fd157e0ee62859f91e7171890546ad0eb30037c1ef59b098a9136f9aecca4d682e5f92f118a4be16ae22781e0fa128470621cab6a401c757c617b8fab8be0d532308a6592861d8a8402014cce2918907eb48a10dff97c32d971748d0a3473092d034bde70331e05bb7730a3aeb6bc6a85f3fe5011dff548b452d0ec05556b378ae5a63e9b08ff5e3d646aa735f01e7fc210e30e3622f74d0e032a2d522200660bf7e17ba3050a710cb012ad7a8c8eb47140a1e9bd92fea811a6df88112e03e49c00acc21e75ed28d491f1760049d2818465b40e8c15dc5119767d59e472823ab3f7497b3fbc95fb63854e6f8474a85b8950fc96da15687624421b94e88334620fc6c209005741c7dfb0a211678ccca4ce172cca80e6fb269040609e2efefd2fbf106f6b36b16bd0a2c469754ca8e1688a805d0040111d094e0756cf4820092152325db8e28e81f344b3f8337f9f8cc6de36f8cf51fcdfae03660d3f6abc9872cb45389104c78a0401a03b0bf6bf77126be27d9f2749cf5552a443c7744e920eb385015b37e2246a4ef4b25e38246b4d12e07b6d2f095b7175d33e7083c28fb30e3640944f3db5b1e92340329c2d9d771f80d59b3cbb2055c6602aab4c3c19838b056c7e64ef8c50a626941bc928d54835b74102f82affc956965acf6850fe154cd3b25e75f423f0e2d4f5162f2c2eef4572d1037d1c8ba60525c4fb4a4bc90724b13f056b23ce29db41da32effa177d4ab604fb320192595f63a6bfd0d74968f4021ea204eba596bef52ecee258c60b0e57af8bcf5bc6d9bc75a9f872e1b6fbf78326f208a982266b91dc5cd0614bb829b1be4877cd99984b44da60ba61f66f53e2c8a0de2bfd9b3a85d89ed07606a4c6121ddb60108c3ad330bd5d8f217bf9ab7460c328aae9fdb413020e19c7873eb4759aa84fb1cf646f024dad795b2a5bf1d10cb3e936228f03e0175d128a44aac7e166f6793c56165b05223aed4c8468f8a200253bd4d81567e643d036e37906a912d597e433d2b58af6471bfc086e389451a4708a3f7ef30951816d177a109873d47e2588f38b4b20b575ca740bfe8fbb7394989f087c79a3e27ea2b54fdd0506d168178a38bf90d6606eb05ac698eaaff1a193eea9278c50f7d6948de20f8f7d852eba8c190a7d3c0550f088c33b8584a6b2b6f160e3b008e4497d90bbd1478001d2200abc893703d12ff3f836f38dbc43e6db50a761f35e8151b7cf9cdc703417709aa55b80413ff4532040e7b83fe7d729f4a2aca83773d57173e51e88990b50281fa658e860b3a594a3b57dbbc9c661b00882f7dd977f37ee7aca1c5c116bc3d46ee03819bf307558684804820619b4c5c9217ef40cd2307121b5826958b6760086ade555f17480c717a08ab0954a14848ed20542eab7e13120b93b74c2deb061d1f508a3ff0ac72db2460bbd5cf1166435e917c5343715cecca42548391c0438f02c729a52c8838676cd0adf3c6161ee4068c1264904d6092ad770a3200f66c1b5bb52769c5f4172ba61c3febe1af4ce06038891dd2a71fb0d845ac5c6c9465899b36b083c17856055c17428cf18b5001d5146cc67f7649b495d7410ba07342ed483678e8a02f1ee8e284c1ba65935e9b6a51cd7efed30a24edfcede9364b64e8d45443ba126861a5f684e4fbb58e4efe86595eb0593b108cd3ac055bbecb4e6ae0271aefaf5c7702f0278879ef0e6f5fadeb7090aa15421065ce8dbf6dbd643f2db2242357c14e2be261a081c38a7ae21b6409a93bde13f6692a547eea366bce3c38595ecd6d4991c6658df4493b2b11b690252e39f1034f9f2eb92c6dcf40adf5d3458a311c1452e4871c29aee153d101bc37a6efc36c4b350abf9fb41c2309db1f01890a5e20668388ec3ff1d3027f7d74d1d6f8196447c004aad9a28a06ff55edb1701f35385e642edd9929d33cf7f2c1e2d71105113e454636fa4bb83c087d146b207b8c61b3ac2f3b26f6fd716dbf4c191e57d1105cfe732bd9ff3d11540d29e4ea97e47281ddd0d51d351534bd4835c40060e250ad040f210761874d16be19e633e67904a4be994187fbf226e93fe8223402120cd5276f1158f9861e5683bf5f1b2f015cc23968bff924d84f12e939c87965181354f2eef388975456c78514fcc36df546c2731b91942df906004100913f425a0f94534cf1e20a1b2a1bed078bf023747e208075127f56582608180cb9683de97ad5fb988fdffb9c4858f1ab823585f624b67f70bfcc47903efb25f8fb17d49222fb73490b741a601b1cbdba8eaad5f17310316fe7ada9471c8cd68a05f3975f7ca276793ec31450641f55a30f8d029325cc7bf5b7bb852f5a469a68b45a9af04c1d362f214e2f36041ef4f9fcb3a956716bb03978a2a8c01c471ef829ab9b094645eff156d272d6054e06294f81d3f111f1da49aa6077aa3a0ab39892d79f4f45fd3fb7c3b7ff9e22873fc6a8d10f9e1a110a38d1525ee54267d3a079f5962212566f51421b2d590f8693dcde4efe9606ea827d3298810c5c25fa298aa018170f1db4fe4160e0363d654757e53ac491646ba664771455aa2a62f41c2103cf6f6d843304fc032798344844691f270d68168b8df4467d8f24380bd3a355fd574133b7c56107c0956042f2cfcf2f1475fc70a3cc6a8a25d70f13a7c30dcf7cbdc910fdca969e549eaa2012c8ab51400bdc7f30eb4ccf1248f2204ab1507b5dcf4135fa40cdb621a2e340788b785c2bbed24c6173606f8f06014ad87654a24d2ec31f0be158ff3d255d2dcf8d469dc04e4c08849ddbd02fb1c40cc17d7168097971594f97524a66d30e3a16323f1c4d9f0b76294b1eaf52f2ef44599b3f456839c8561bedec58a1966e57ac16e562f0e159607817c141a53ef9418797a3011253a24efc95383a8b63186cdcc7033c0d8c547841debc80fb0afc59e62ddf383a70690047cba279e66b141300561e6c41364e13ec1b43f110234a056e6ede46bdaf596ca3fc7c27d131a153f2d0805028689b1c850ddbaa4ca4ef237e6318abb5a42f50517536ba46d9bd4686101c1f5c65d105d2c1cbca8a03b801f3a759cab6b2f64d60d0004ccd1f295d35decfa33ef07f199212d8f4d965c64d44cb3860800d702ce73181d299e22c0deb2895ac3415c302274038a3d902733b69b2f7fd193723424efb8a707152b275c119f64e30e6e75871c4773ebaecfa16a6bc3b4bd92a274cfcada1c775ad6f2b8dc264f2f9c26b4f994f8c54bfe487620174152e8efe4f690e55ac7cbbe01c1ecc5c4e0878f7e367d7741ad64984f4203603c8e9c39db9708d051b5bea106b47ce92dfe3cc6f2507a982a8e51c87df75a0734e4057f91d2da4dd7c72db887c17df61a3db63d7ed3adfc14140f5d35404da5a43893dd5102c75b140eef3b22b200791c57d2bbbd9769e779d6a4722c7307688b3c934faab09af89afeae823d22b97203a630ed7d96a33baeac538a5e5687970657b66f554003dcfcfa20bef8e3d49c900675c2a3e4d9fe26985f01a2e5491e78e8842a93a5f33c5d8c1f8c8a12248287c6fa57d0c5cafb3dc838bce0f21a27b33f37d167f60725ecc68ad82aa677c7331e668620613db3136f586beea02d5fa6273fc94a05f58231ffbb68af62b0a7500fe00f68a038246ceaf4d75e6304ace3ea7e51e6318d2d23e8c8101c966d89d01044116fd348466f542634fac1ec3104e18b3b1b915ee182e2dcbe97a7d1034d7b074e2ee32d2092c4b13a67b7c2520c871b3b0b3765716f259452bff651588ad67d8a26d5a017e154321fbd76b94ab08aa2009c93f17b2a5a1106a12590bc7378bf814a43873dc8ecd3909675b3f87edf033aa851d52ed7f8b480f6b6b926f395ac34c73574f401dfc97977821e6fe1f68a7fc725f421a390a9419ef638fdcc3362ff2680dec6abf8b387d4a16995f5ab50ffc3c6b0326e756ec973d6830806dbbd442f12799d3abee43016740654fa4f473a5736da05732080b1120552c565bb8108f42566e321c3c504e2801415944c3c4ce232a0d25e583f017e378b356c1eca6af300b6d059d593e504252d1ceb69ba91ce504867a3bca8a39b87a169489fa8c3b5b108a5031ca6b7c685d6837b3216047ce30c4398ddf1505695843e8bc5638b83a0b2bc71259ea1b9909ee229dac7a68e65d63b9bec6c83b267c1927787c40eedb5003570866ca8bba585f7b31c75ce92d55cf1ab9f27601d36612718ced6ceab600bab356dda07f6c28ff66674c095e1f2ff9234b5aa7cdc7042b6e5359fecceb753cce7fefc0f50a4eae91f2dc69206f4b515cf3489e5c587985a5f7f02c39d932860d772722f00f102d9a0839bfa46d4cde9e07a1d8a2d668d9078a9a1304841895dba8a457b8d74294fbe4fbace1461ec954ed72cdc8a6281c1ffed58455db2916f0a3e4fbc9f426393aca2b782eeb454ea96368f2f6e65e81d18837b901bd1729f1ee637ad4e56eb6ebc66d02854f4a0a4387daf272371ff6ba9cd6bf43923a071dab96e3b140793c0b4df9d087a3047ec2d28a851dda494731a6cb8e43d2067e0065e4dab86759fdf1e9023fce106ee968a7038ff74b24f8f4dc14570b0708394777d0ed88de362b2b8e9433d70a772237b4f6ebd595794cbe131a23acfe07060e3507a8c07e71ba22d2447920a72f02acca7040010c62b2fe852e74c4127dd27865bdf2eee01eb7263dc80351ff2be91be6881e7139081b98b9a645ade60bf0aae80d7a9add108de9b919c4445f6001a5e76f55656461c1a35da6cbc62763f3b74751c6f25a4f3dd514072b52cc5f08e55a603a894a754687cd1df884dc3a3ea9f284744ed90eb567ce80afa2c913904260199338d77dff43f4c1dac3a9460726377e9fb81455bf69abd3bbc9c61651e18db623c2a705d27582b8429ae90f4278867794b48c49a94927031b54c7348222ed43afa09636ce3c50153bcd985853bb15344f3dab6354435e6ceaaa2027c448cadf535aa05ee24f44d005a18424b1ceb0603e92e44033af1094bed6b477a288ae0dfc46fa071bb7169f817c684c41c5e346a47e9a306489ada4490ba04704bc2d7df37727093647ba7883ba414ab93cab070c922d21de218f790b61ae0fe8305bc15519bf48eeec7cec3912b31e3408a17a4857ac7271f3a5eaf95eeb680b366fada07f0b5f7c63f5f80e195b356e71ad140328586f84e93249beaa41700214e103a3067d4c1301fde562b36376b02582784e299a1edf00318ab1551e2ddf7b06dc04a12766f5612804253dd12e7a446766d836dd2a50ffda5d2a0d6569202ac3ddb9407b524de96cb0519f445fd1fcef921147ab589edc2d047c849101386edaaffe501746c0b9b4c2a38d7b4e458473d2e22ca8278195846a9280312d8592881d3a6b9f7f1b56ae350491030f9e213f08ef40e065e9fecf6b2a7d273f7879c1effaa2eb261b0b4874828cdc106e8bf64c40c6e23b8c12cac364ccaa62306fad7d53f30a03cbe6121c08931d75dce0dab574747f4d968562e8d728c14e61e6a4f1395a646295fa1726d8ff44202f3f9f45a65fd6450fa0eb26a90d240ca9617eef370eae36453c4b6e8ca526684142b898887ca801f1a11e6690c24777d60acf3a7d33583e122a761d55ba2e4a3aac1a98ab737b25f68001690fb75a7d0b2cbb698a9f190e1685564c0d3aa9358d2bd31b5750344986f544fd31ee2e377b0cd77e89672b273ad77cd9e2d0e730d7c8241c1cc1d945098e1d6aa4e323044c7138e6edd7402600541e7f2ba498490d13d3fa134a533ce51d86188595cc1efb808c70980142520a4a1cc8a25a19630a2c884748e1e8021efb00d05128a06ae0c28553cef61d0cd081035e671bdf4037e90e580d84d5196875ad63ff8dff311478579a2092ce130e7c76c7de899a021bc0996719475d5bed6bba43a4800b5e80cbb5103cbadf5b1bfa4a910d0e3b0f10b07fc027664b33e603524b2774907290e7b956c054c129610ab4e00234b221d054acabff337a1981822b386793336f8abc21f5c792cf4410aaa0e34d95cf4e52317cd3c8e4725b925f29c1d7773e33d8446bbf55a7e96125f1bcaad45d6615ae8518c9e89f586fd1829c9897f293666b6cba91008ea456491aafd628c8870f3ac0ecada18bb4769ddbeed20a51ca32a2aae9bfe707e920203deefcb1d06708fb8d5ed605e5c50821312edc7c776008517d78d3b147f74056f2719c63483a3474e5d87df2f32c7870f29eb6d90da369610853cba86ba84c961d2cf756626c260a06b09db021045dafffbc5b1951e5484f083a5af46f8c208f24e8d4c634222da23a3f2042bee67c0db01ba8af4d32180475475e9cc61b7994d10e8b3930971b21e9fd5491058b0eeeb74d4353e47124a8fe2faf123c6f25e039738e4fa5bc3db9c8793ab021780902554d54135ecc77433333375f462d1a7ad7745792fcbe4905f004e3a1532b367639b16789c3393ffa152e7c270c627164a04b786a2f6301ec69b0dca5172a1008fdae98f794a4499e3451a72b3a7007726cb7bd615c5f462b5085dfeca36611403f74295dca7906bb6b26ca2144294d085795c7a0925064a20a9158f03ba3429a62e76aaf9a643ce6be77cc822a681ad8c8276af2618f5310ef3398a32d0809f1979a7bd46b025d432d51a1f5e31878a177802813384f392d6ba63f98336746b56ddbeb8fed466cc5ca26c50fee5d2d2a4509d3522009474761a83f1242f6776c671478f8d2164bcfec9db6ee75d51bcad416532993f42a89dc5bd1baf9a57c2d50cf89fc29d9562fbe05658252594336c309e65849a0278c150fe489ba6f2bb8df75625ab4e15ffbbf256b8d8ea7358418087e038cd5760e09e9edc64220162e301e62c8bb9d7de1aae1186e0cb51abc4567a1c2ed2e454c14acae350c673c20c3c1a290ba93388575a05292121b02ad31ce7e2581ac1b606316b40fee4712111ef7ab4a128a014ed1e4b2b2234d5d30ae02043de8175e6fdd02f4d1474774bdb241741a6fb741bcd031549df9683b17b88460ec43d40635563b6d1096306be7a7909b9b3e87609abcb692483c3e69463e0a8acca860007ab8c13ccbb6ce51029c3b448904d75541e5faa8f9674f0717d127d18ba69e3e478f145300c42b508a0894e57883f34aeba0344e5cf705119645ab63225f22583c798c19182a5504124b3302fb347f6bdeddbc2bdbec9b3f9526bcba18c82e2be53b20f1100d633f4b2f3c11c40316343be87bbb5d098228eb3350c018f0e2257b5ee73754717b2e868289f5d653fb66c40e0affbb16761042b7f923425dd93bed9e699ae3201f3693b3ca257f72ae3ed1497cd8041d1e63e9d6f59d7758eb2856b21d8b436ab51cd1be6d901f646f4b99c7ac061effc90a44327d45ea425114610d3132abdd043a0099a9c38aaf834db9bec9c0fb0db957e912ce75e7fb06141081f12c95a1f776cbe706b6a88c956cb030ffa80c120f6e3977e4415486de0561422cf35f501d18c752f4140702ae5c7d622517faaf2022915ff21ebcb52245f8feaa99a05ef200b2e88fa1f9db8a3638783b0e9f39f54e210962ff5dff5b11d151f4f952b70224abd99bede081d64ad4bc5535f031e5410a5cbba9c0f25e4c74828db52f7b767f761663c69d076d5c2053d55e55d9de01c9c9100903a69b4884b185a10bdfe550cd2b55f86b54200211a07693e2000966a48b7ff98b7f831c4d54b5b173f09700c6da6ed57b19691e17ed089ccff79a7c59e1ba68a121244c57c7ba40f52e89210875cc079234eb430a621c618819b24512cef6aa55ff5d180144824ca0d7d74489d55abb3b5df17332018cfcc2792a3e147452c4243476082e1af72849c81b1ec69e274d4008f56fc069dd578c59da7a903f9fead6639754a2ae17a9aae542041dabc161a1777e1d6ac1848e12cd952c417cb9896706f429ca83536e0eb33b25d9268bc8e4c4e318407e7feb20f7bd6fbcbb96d1d3466224611469e2dbeff1497aa14a14bd33b70461d24ae98609093ebf3d4eade296ad6d3c99d706d2390b4f8d35717eaca8b1108d64cd596fb45456f4d5dc615ebb991df4ddd9245bb13226c8fa5c51978a921574c2df8136ac02784581fba8166cae483170753030724b24ce596d8aa8fc417f67f2ec9cdc17e760e052dfdab58a105ab4eb7df7ff3cba0289454c22c1882f403d85eff7a6b4db19891510825225da5869c7d5bc7e497f2bc815dade9cf6de57dd60e8c585f7fe0010646eea2c37af5120a48c885eebbf0c05c4bfbb8fb9b57ff367a4f13d15d272c8d5ab1adb95fe00c62cbff76956f9361ff4bfc0384371565211093b6d41ec348801aecc68261770c6bf80bb78ade94aa0242eb7aaeec67a63556bec9e3a6d7c408a806b05c59e07dd4ffa78c2b6de0105ac63b7ecca757739d697ec44d52d735204fb032d544f26862794f9e93e3c528a95180d294a700a00f8332e2eb2c24d8391d94144242c4f5c3d3d135f6e60069a4563aebc1f496374050225877e552c6546765765fa0d646ac86a6787836a6e593995e94e1390634875b64a2752d721e71078a6e5b86c6138ff45f4b5e2dc07918e813eecc08550b7130ff044c23c16f2494e97fc105310a6f6b14fcd9cad649aaeba99d09835576b36a30737a35975c32e026b93440b7f3b7198f50e35831966ab569607a3465815f72dc56c4cd8019e3c8c9e9942d154a33b5f5fff3f4834b489a28c4cc36d1f1755a863e8b9ed12999758d2a9e47f2325fd0c33bb18a72b5006ee1d55b44b26cf6db6efea343d5cd78e3997188975300b7eb24acfa1db015283ed1d342f434c1d81fcc4d26fc75ac697a3d220efec396f42d82b996a092d6d4a6199b8e0d8072e798668724ea17a470d8538fd08e06197b3aff25718b3778a2956870d2ea25a71aba5a76884c61f5fa11a741b2ecf76d53cd0937035a114c60ff39ca5298874b1e0c8526239f912126fad07ccd76d5ca620a4b501c9353a0a90e159902a7a77298f24fbf621d964bc42591f1d561e6283b0097b7b2d8d195472b72da8607e3cea25dd3db3716638fa09724322545860b044dd4033f5f204010ba6836aabbc5cc31c35f779e0af11b62f8b7b5f2fc35636e82313c140902017e13ba8cbe2ce5b3a31f8c075b0266f0c1075fb96895b31cefcb852cecf1d04ac56e097a50746670218496fd87c341a0f921fd1b58bb671860ad9cf297b8d6b13f4131fcf8fca04ca0df97d3feb5852c89e6161eeefba38f4aeef65d188c1788bde5be368144a615e249bc38534b064b186068b1a2b7c243ada127e7e2fd652318d0e9e708a154c53ffbe138a7dbd410275e9a770b26c5f6137a98d01cce37205116d08d9ed0b3c64adc7e5929666431dd17b09462fe21cfb6d00a734a34d791c4c0e790fb567149753f5e285ad0d0763128fcfaf26d42a2e510347eeb37140a0b1fe205b20ac6896985f65db3b5e4c9f06badeeb813643e0c7b5424ee0da493bca7dc953d29d7d4008c5e93991b06ab050a8e8f893541e7bbb0022d5efb64bbf16a1a6b827a03297c2621c43b2f671791ff29e89c24157765e4d98d17aa751ae8558b0cca8dd28f1db7ebaf571622eb1719bf5e155d404d5491c1675390411954c9041a5ba5b30bd366f9bbe03b30505e0189f204d8f03a6a3237c73394d2a216fda571fdf7709156b37abe5384528fd2112952065f01d246b64fd6921437c18ba44d121f5db2497f04b737bc4166d5dfb79954ce24a458042cc4c85856036524b3d5f83e9b507b911d3ef4f9b67177d2da49b65263606fa76ae9b3ed856119014c5c60276f147507f24c4f0a40a1b264b30a81e3b2e7883435afa9751451ebbc15f3ad6a01406c4a2151bb404096180353f76f601cf34433d4946d0ebde02c6fa7f4dfcbb0d3a6137e47c2512c37d3bf97a6112cf27429193f79857ce35508217e2af84565d3abc86e940e2acf156ff397f3599bfeb6ade3d44973c8a1d2e92ca05f1cfec061c9c401e99b968251aa2a197914d6bea3dd3882eb8ed390147a418ae17a7ff8615419b9a59a152b174e8d6c622dd518327e0c71d46bd4e2e2a42653dd1173dc15d1a82d1e80644df2639a2d01773de6952948737dfe1405771353ae8c3ea20a22669dcf7a57f65de631808f3e482e84820d090669e75a13f252b5fb3cb5b1b3b19005680b029f02d05659bf7ea333bf31d8208937a86409b399ed1d1df18aabf33bbf31ad3986808216360041098295910946ab7ac773f6d400e46eca7e0b212105a2a2e3f201f851a018e2218bb542e7379c04cadf312bb04a0a43bad849ebf158ceb943ca766ce4c0f2e5316e2aa7b63746020a1ffc0036d1bcc203aa5cd606131f35b591694e4209098bd2166d1e74a219e21e5be60143319d8a88c78f70e22714b1a10b0ddb3208500cf6882da2c48e5d61906ab7ba26e088f71ef3d7099678b9ab11ab7d79942eb0160be91acb13e539f585e22f8880b5653e7c0b05ca10b9a36dde72911910d3dd71caa1be3dc4a41af9c9e183a447c23bc710abe59f3475d93dba53035eb6430659afa1432263a30317e01c002f32b84a63b926079b01c1b2bf851407e840b3cc8914d5fb598551d53c40f270bf85a6050df7505a7fb494c822116c52a054dad733c8894408b393e91750cb5a0f510339db0905df9106b33b7fd226c7e6f48591262b3ce6fc56024e64c69e2f8011378324a62da96ab4c9e2fab22bc963240dfd24d5dc1bebe3cd74f6c77ada7893b4a166661362ddd0f4250af02e517e244198d47b5455ed546740e3a2a0222fa4447192759cf2ff64ff63d1b700ebb571032b05d205fd3f557ecaced28f3b20c1f576b49fe3f3c131596f8aa837a46554848d6a24c7fe55c73dc2fba84e3e1bc42ce03e65c8da72e6e3c8c7698d68e2331023571ca55599e3c3842dcf07e70cd784c124b88a006455e58cb77f4a40bb54df3777d52900d1227a122234bca3def53a611b23bbd656e0510ed8d761e55674409d502f80c851759da8cd53dd56ed66abcca9ab5bef10a72087842a2809c094cbadf53a040e8602bd7f49ecf6fced05eeaddce160fe2fd17356ffe7a3845263d838882f61a362a5c2bc5deca523b0228b75f74a294dfa3622494952f161a0d1c1bdc53f851c7781ff7d513b5fbcc3b7072273197b9c9d262d41be55034a68d10473e508a17f5291019ab65950ca6a20f2ff95ec2b45a291cb0b62436e128eb6162246ebd7cb0587c02df81f19cc2a979bef5802d044fc41314343ace1a5ff24196c732e837e4937fa1e2c493dc1bb8120dab78eba7bd5d4d177d56b88a759e612e3d789c0a6e4e5d8a00cfe71358f0067b27dac5d8dee9532480feb53b4b091680da9a615de3f77b06299d581189c54172afcb4eb09cc650542477896f99212bf61a98c74271565fe1aa4051bf6fbd654542bd738044991b5f154a7ea47e156c087262f7f1feff01a793d1a522e7f03ce1dcceb15795ab3a4d4b98d3d928455ec0ad5a31d1b55643be4032138c0c064605879cc8af6315723ad8bcc3692d247e4f72e6758dbf6a68cded0ce99d68525853ded861c50d0e22c4cdf8f9f893da139b4f9e000d832b3bf205949c6fff102f8764708a54c3b84065c3b1c0c6717038ec07b0b136aeb4314c62ac355d546d3c22d88d6bddb0412969a263b62d948b648b324f97b0a10634e65d28488f116146ce111c600024e93b3a78b76cb501fc472ab7406f5bfa123bdfc1847f88f89957401de81b782a63511d8b5e37ea9a7e17a68f8eb8ad2e5e37dca87ec060954c32130fadd3e918bf53e56dac306324ae79409b25188652056f7b1ff620a823b179c0d4da251254d27230c561e42471650057f700fcba64b865161c4e090ee0fc3e44cc9070b6769814c9b3e7c1f0214a09b9f677a024ae34248d3f3b2ea2db8110c1a028f102d6b61f60ecc56e4c7a553698a73cfaa8639c0d01b5fdf6b2c7b612ce2800af07a6f81c4057ff1173a27107957196fb9f86675e031af1b7d4acd168ca4d5fdc8659d03fa058ba51638a9a5d27058c235db2b154915fb32197aff06c859747264295813ba1565b46cc16fb788094ddd939f5c67cfeb36ce50df2d74f4926cbcc43731a4479373a4bf208de595b2ca22c8cc9a5703034d771d763d1517f0bfca54b2f350c87679ffe45847609d5133f399403dc1234c40488b474e423088ccbe70b380e769d515adad559d5554231b9155cf51a7cd11626f0cc413e12847c07d1505d156305c99b43a8023d7366a53519d20680138fb147dea001bd207193a2ae9f595960461d10935ad6d32cac65a88e89a71b7603e5bd60eac93c0679444cc35b14ed3f016a2d4a0a12476586748a06a94ca91751e74e7be945b57d20f5f361dc68773e53e78ff3d4668016d4dd1aa0abbd502c9b3415426369284620ab2b141fe6881cfe4c5991db9cec149ac8b039a0a9d662a6c6c6a85235db4310d5137f91953513aa025ca09b41ae024900a89bb8efa5752b3690a7df1f35377115a2b0af6ca62f023c1b5cf989011976c860528c408b008677aba4fb71cc74cc2411b1e35eb2235b799df40b016f5ecc88e35780773b30765dd4c73ffecc7408908fd57850352c857b08ed5d680b7cf8b3268d718a0b44a0bdc57a75151b594711fd9c9144d61c42f022047fd6720e5258ce8cd73f037d7bb58bcaea505d659761336e65a70e3c77bdb57f97f83a76cf2c33311c58ce7a157a22dbb90c326db27893e15cfc575549920295f482157e85eb65e97c707e3e6e477c1f36150a6a8c47ce1f65581a338488e7895539866891a061a4721bea21092e8bea7fc8e15f6492dfc4aeca1b22059965f488f4e858cee48f95b465f86f5ead2894e404b244a688ede8194a163a7ac155f47f2156144532b86457771401658f99fe5e78c10ab456b2fff8ffc018fcc91076baecef7efbc226e942e8642f73ec8389b117dc01ff4aa8d6d3560d45f2d05f21878abb517f17039b52d8c763bce273e5834ac913a612750594c5525a4b1f098d76bc571730320a991440af27824591b6c9f2c93d9a72c79900c0e6456a5de671e155da0175a4ea4aab9cd819c29c87d95708243d17b9d7167c0ee8704bc42eb6593d452d9570bfdaf7816e019aad5b9c48c09c7382245a277ec38566bc7afee76d21bf00e2b544e7494a4567d82683314cb4d874d944cbca1ce251580ad9698e7fa9907812a48102fa7b42336ac1ffa547b6b3705273bfb2ed891c009b130edc4c2b197eb8fc1fa832d6795cfd67cb221d09605326f83b0ceadd8b643e7d62f176e07f3ea8815c43d65ba32913e34b7a42051d6eb3bab654f00c936a777c194fc7942c1d1872856352e3823554121fce2806a644662fc143d5d4b164edf1cc5a42546158116863cf80ba1b683cecffddedc541702b2a4b08a98f0d423fdeafbb4f238700b0c6df916a76c454eba77f3d2b70ae27af5b846d9f6a027ea4dff0a19628471964ff2c26e6b0065ff0a0f4500e4a6e3030880bf39e1960463c9f13757add413da09927d3bc77bf01abdaa3c0a1ad73104d21710d1d537a4a62199e793b8426125fb6b074239a7458470c9e79bd21e771d3fc3d64b1b1a50c157272a3d945c526b49161eafcfeec1895c9c510b4018d7d01104d37c18ac3105dbd60b127d07e722e3bd3b17d2e912d18aa3117146aa71500f0a3c8f78d652932ae72c161c50f6548383defd43ffa2e81e0dfe9a654040eeab54dc7d24985602a551bd45fac7023bb97604ca897e93febd14ad86d4ecf21569c295388b86c014d223a81dcd9312b90435bc24bae497d9f8db2a4935dcd79dbc2d5042a3c54022b5f00855d6862105fe1b7d60cf22958ac540dea95ef6a56f1b3a719032c015310a66813513cdf07efc244b2a5f76c32ed2eb17f4a3e9819ca5695a9c0490d73e20bc5668a1507707506fad2aab8b018e025d22b847df64f3e81dda7d289c83831483066cefa5702cade0bafc6953b7ef8517519e4c70765ec8ad8f7c7a06113c23efd0d17e81925832b9e598db87656465fae8013ae5408af6a85bcdd9fc56ac0e18ffb6db7691e966564f0999e0d3314813d264ee226709305bd826ed50222f10999ac297ae802c9cd15781344a14e77b8d05fddecb92245e1979705184f409dbe0070fb9ff56767c510e307607c2859f405d95a9e0022c3bcf10a127f084f832a24abbccead273e9608e7232ae41b9b91c2eeed891a004222cd476eff8618cd5f66328527e528a12d16f1a6e846682829907f42e59e061124699a0165b83def104a7c6ee85f3d77eb901b9f0ba72a6935709790065b18c05f42a9907f2a06e65301969dc9f93f36ad09d28a4659057d3f31cbf420ad096b62bc0fa6b5ad0a169601f30c3dc732d0509d1d03767107b94726cfb0f5fb07000a2a3b0dea98145b14bdf34465f93e78fe9c45beca0d0b104ba9a17022a60a9308f41767034019b789781733654c1ebf9ab9506dbe3934e9cab4a66bc57a386eb2613c71e1d773bf82fd4843243e7568371d2997aa632c303fd062b166527c03b085e6c68890223cba6d143e0e0e3c8c3f0fa2e2a4cf18168d6cb1b2392525d6794bf3aa253b20a6faeddc3d4eee22cf6b110e8a0aa057809efb54f542d576216d1647a5fd196605ef49dd91ac566383701db8d7e96435260b8cb7df6fea642477fdaa6436c82ead54f5653e3c392c0ca02f7bdbe3610ad34b6eb189d145742651fef756ff384c5811f47d0c000816d25fc37f9e653f07d8077cb0a479b87f6695c113c1bd2a0b2784dc36111b022d445784e994c5133f11f61e4f8287a72ecb7317763ef5556f7631a7e576f60a43054ff3fcfea21360838124b7dc798d602451ff7acc87934dfdeb8c9ce1d13708009eb6cc6b54cf6c78870b422f626d03a446c125f78f77731ebf01ede988815447d247c03c3f0a308292f25392d57c648277c0d76ca3006fd9bd5053ac1d7c000960fb5c1aacc61d52f1a3649d23e047439c6b72c7a9e714d2b7e67eeeb6836010f25cf3d0d97e2d3edd867aff9bd202626769b67610384db9f0769d3ab8d0072d6cf39d7b7b3b44fce00020fb43691ac46032fe58d64218ae0fb922aee63d701901c1be55dd867c63dffa2ddbce6c1704d9d91a493ceb76a16b2581da715c155c6fc503fad7905ee8ae6238d16ff47b842fe12af3dcd95614c8a13ffcf8a82a3c0fd06b08681c246a38339bdab2a4308855faf6ad79f67f966f16c279cf5a10fac88b1ebf9f7c1bee436cd4f08bce602470c752f29fd83ce8af2a66ada55438934395a33dc3ef17d9dee3f0e5ca7022c3891a156853fc666038fa91351d3747f03341acf62b225f7e4fd42e7d36dd4d204ca4248b3ecf3f482e4305c95de109162be0180c1c186999456b47d8d41c69eab78d1787ed444f650165c7e71c9523cf22e7aea93bbe3b650dbdd1a916181bb552107e14076f281a6e83f27d1faf49db8f16fbbcca13258b36836b54ea064d17b682c6d2ebc72a9310953ab8cbbe455f74ac392d13d815c215f7b47424822e68360934a2751c10c7ec8dcc5f4edd4187c1f31fc232e02a726778171c84606d72992d7d3e765d16589c0119a1a5740f0dc7c4c9e75d0f65e9cb3dc502fb0c4c4cfb5ac6215f021163dc775e33f9cc330c97da1bb7d5aa1476386b8dc667eb53aa4d669dff3a30523ecf7a53cb7c7d0c2d676f2f431cc14e270e6439617d72037fbb393f0e15b13491804d526b2e34002dae0318c4311421f3d485261e4892551a38f50931e4c6174ac5613d30911d54bc9a98f07f74384e5ae8ce1d6428ac2613a23832382bce493b9de98e89feba005ab6f7473df8481f919635860e1f4062fc602a4b62baf1189feafa2c1a325e7a8913130fd994a8276765fd25d7b26862047144aa4e95003d41d2927f2f83514b740ce8bc56da3d0cee29fc764c242808b1f44a0e8b47f622671d57e92fb64e14 diff --git a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset.meta b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset.meta new file mode 100644 index 000000000..e34c40c99 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7dbf1c10fe7213948942b7a8eff22ad6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts.meta b/Assets/Plugins/Easy Save 3/Scripts.meta new file mode 100644 index 000000000..9a10374c1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 86ef77fdddf9947f290776206b1f23ab +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Attributes.meta b/Assets/Plugins/Easy Save 3/Scripts/Attributes.meta new file mode 100644 index 000000000..af485a915 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3195251321eef445b65f7c8d345e743 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Attributes/ES3Attributes.cs b/Assets/Plugins/Easy Save 3/Scripts/Attributes/ES3Attributes.cs new file mode 100644 index 000000000..242a7901a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Attributes/ES3Attributes.cs @@ -0,0 +1,7 @@ +using System; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field | AttributeTargets.Property)] +public class ES3Serializable : Attribute{} + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field | AttributeTargets.Property)] +public class ES3NonSerializable : Attribute { } diff --git a/Assets/Plugins/Easy Save 3/Scripts/Attributes/ES3Attributes.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Attributes/ES3Attributes.cs.meta new file mode 100644 index 000000000..52739d65b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Attributes/ES3Attributes.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e29c69181d1dff642b20c218819fe2e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Attributes/ES3Attributes.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Auto Save.meta b/Assets/Plugins/Easy Save 3/Scripts/Auto Save.meta new file mode 100644 index 000000000..cf53efc77 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Auto Save.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a01ff460e5e0b4f58bd28b3520b7ff2c +folderAsset: yes +timeCreated: 1502446431 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSave.cs b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSave.cs new file mode 100644 index 000000000..806914b70 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSave.cs @@ -0,0 +1,55 @@ +using UnityEngine; +using System.Collections.Generic; + +public class ES3AutoSave : MonoBehaviour, ISerializationCallbackReceiver +{ + public bool saveLayer = true; + public bool saveTag = true; + public bool saveName = true; + public bool saveHideFlags = true; + public bool saveActive = true; + public bool saveChildren = false; + + private bool isQuitting = false; + + //[HideInInspector] + public List componentsToSave = new List(); + + public void Reset() + { + // Initialise saveLayer (etc) to false for all new Components. + saveLayer = false; + saveTag = false; + saveName = false; + saveHideFlags = false; + saveActive = false; + saveChildren = false; + } + + public void Awake() + { + if (ES3AutoSaveMgr.Current == null) + ES3Internal.ES3Debug.LogWarning("No GameObjects in this scene will be autosaved because there is no Easy Save 3 Manager. To add a manager to this scene, exit playmode and go to Assets > Easy Save 3 > Add Manager to Scene.", this); + else + ES3AutoSaveMgr.AddAutoSave(this); + } + + public void OnApplicationQuit() + { + isQuitting = true; + } + + public void OnDestroy() + { + // If this is being destroyed, but not because the application is quitting, + // remove the AutoSave from the manager. + if (!isQuitting) + ES3AutoSaveMgr.RemoveAutoSave(this); + } + public void OnBeforeSerialize() { } + public void OnAfterDeserialize() + { + // Remove any null Components + componentsToSave.RemoveAll(c => c == null || c.GetType() == typeof(Component)); + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSave.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSave.cs.meta new file mode 100644 index 000000000..f3d3bcfdf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSave.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9cfcc9ceea0bf419cb3bcaf548c2600d +timeCreated: 1519132292 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSave.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSaveMgr.cs b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSaveMgr.cs new file mode 100644 index 000000000..69b50c24c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSaveMgr.cs @@ -0,0 +1,182 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.SceneManagement; +using System.Linq; + +#if UNITY_VISUAL_SCRIPTING +[Unity.VisualScripting.IncludeInSettings(true)] +#elif BOLT_VISUAL_SCRIPTING +[Ludiq.IncludeInSettings(true)] +#endif +public class ES3AutoSaveMgr : MonoBehaviour +{ + public static ES3AutoSaveMgr _current = null; + public static ES3AutoSaveMgr Current + { + get + { + if (_current == null /*|| _current.gameObject.scene != SceneManager.GetActiveScene()*/) + { + var scene = SceneManager.GetActiveScene(); + var roots = scene.GetRootGameObjects(); + + // First, look for Easy Save 3 Manager in the top-level. + foreach (var root in roots) + if (root.name == "Easy Save 3 Manager") + return _current = root.GetComponent(); + + // If the user has moved or renamed the Easy Save 3 Manager, we need to perform a deep search. + foreach (var root in roots) + if ((_current = root.GetComponentInChildren()) != null) + return _current; + } + return _current; + } + } + + public static Dictionary managers = new Dictionary(); + + // Included for backwards compatibility. + public static ES3AutoSaveMgr Instance + { + get { return Current; } + } + + public enum LoadEvent { None, Awake, Start } + public enum SaveEvent { None, OnApplicationQuit, OnApplicationPause } + + public string key = System.Guid.NewGuid().ToString(); + public SaveEvent saveEvent = SaveEvent.OnApplicationQuit; + public LoadEvent loadEvent = LoadEvent.Start; + public ES3SerializableSettings settings = new ES3SerializableSettings("AutoSave.es3", ES3.Location.Cache); + + public HashSet autoSaves = new HashSet(); + + public void Save() + { + if (autoSaves == null || autoSaves.Count == 0) + return; + + // If we're using caching and we've not already cached this file, cache it. + if (settings.location == ES3.Location.Cache && !ES3.FileExists(settings)) + ES3.CacheFile(settings); + + if (autoSaves == null || autoSaves.Count == 0) + { + ES3.DeleteKey(key, settings); + } + else + { + var gameObjects = new List(); + foreach (var autoSave in autoSaves) + { + // If the ES3AutoSave component is disabled, don't save it. + if (autoSave != null && autoSave.enabled) + gameObjects.Add(autoSave.gameObject); + } + // Save in the same order as their depth in the hierarchy. + ES3.Save(key, gameObjects.OrderBy(x => GetDepth(x.transform)).ToArray(), settings); + } + + if(settings.location == ES3.Location.Cache && ES3.FileExists(settings)) + ES3.StoreCachedFile(settings); + } + + public void Load() + { + try + { + // If we're using caching and we've not already cached this file, cache it. + if (settings.location == ES3.Location.Cache && !ES3.FileExists(settings)) + ES3.CacheFile(settings); + } + catch { } + + + // Ensure that the reference manager for this scene has been initialised. + var mgr = ES3ReferenceMgr.GetManagerFromScene(this.gameObject.scene, false); + mgr.Awake(); + + var gameObjects = ES3.Load(key, new GameObject[0], settings); + } + + void Start() + { + if(loadEvent == LoadEvent.Start) + Load(); + } + + public void Awake() + { + managers[this.gameObject.scene] = this; + GetAutoSaves(); + + if (loadEvent == LoadEvent.Awake) + Load(); + } + + void OnApplicationQuit() + { + if(saveEvent == SaveEvent.OnApplicationQuit) + Save(); + } + + void OnApplicationPause(bool paused) + { + if( (saveEvent == SaveEvent.OnApplicationPause || + (Application.isMobilePlatform && saveEvent == SaveEvent.OnApplicationQuit)) && paused) + Save(); + } + + /* Register an ES3AutoSave with the ES3AutoSaveMgr, if there is one */ + public static void AddAutoSave(ES3AutoSave autoSave) + { + if (autoSave == null) + return; + + ES3AutoSaveMgr mgr; + if (managers.TryGetValue(autoSave.gameObject.scene, out mgr)) + mgr.autoSaves.Add(autoSave); + + /*if(ES3AutoSaveMgr.Current != null) + ES3AutoSaveMgr.Current.autoSaves.Add(autoSave);*/ + } + + /* Remove an ES3AutoSave from the ES3AutoSaveMgr, for example if it's GameObject has been destroyed */ + public static void RemoveAutoSave(ES3AutoSave autoSave) + { + if (autoSave == null) + return; + + ES3AutoSaveMgr mgr; + if (managers.TryGetValue(autoSave.gameObject.scene, out mgr)) + mgr.autoSaves.Remove(autoSave); + + /*if (ES3AutoSaveMgr.Current != null) + ES3AutoSaveMgr.Current.autoSaves.Remove(autoSave);*/ + } + + /* Gathers all of the ES3AutoSave Components in the scene and registers them with the manager */ + public void GetAutoSaves() + { + autoSaves = new HashSet(); + + foreach (var go in this.gameObject.scene.GetRootGameObjects()) + autoSaves.UnionWith(go.GetComponentsInChildren(true)); + } + + // Gets the depth of a Transform in the hierarchy. + static int GetDepth(Transform t) + { + int depth = 0; + + while (t.parent != null) + { + t = t.parent; + depth++; + } + + return depth; + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSaveMgr.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSaveMgr.cs.meta new file mode 100644 index 000000000..635241020 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSaveMgr.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9107aee0ced90422da95f0b31680501f +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Auto Save/ES3AutoSaveMgr.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Debugging.meta b/Assets/Plugins/Easy Save 3/Scripts/Debugging.meta new file mode 100644 index 000000000..7d3f40a7b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Debugging.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c00267afddf624bb19ac24ce8076f9e4 +folderAsset: yes +timeCreated: 1518175259 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Debugging/ES3Debug.cs b/Assets/Plugins/Easy Save 3/Scripts/Debugging/ES3Debug.cs new file mode 100644 index 000000000..b583b5d1e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Debugging/ES3Debug.cs @@ -0,0 +1,52 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace ES3Internal +{ + internal static class ES3Debug + { + private const string disableInfoMsg = "\nTo disable these messages from Easy Save, go to Window > Easy Save 3 > Settings, and uncheck 'Log Info'"; + private const string disableWarningMsg = "\nTo disable warnings from Easy Save, go to Window > Easy Save 3 > Settings, and uncheck 'Log Warnings'"; + private const string disableErrorMsg = "\nTo disable these error messages from Easy Save, go to Window > Easy Save 3 > Settings, and uncheck 'Log Errors'"; + + private const char indentChar = '-'; + + public static void Log(string msg, Object context = null, int indent=0) + { + if (!ES3Settings.defaultSettingsScriptableObject.logDebugInfo) + return; + else if (context != null) + Debug.LogFormat(context, Indent(indent) + msg + disableInfoMsg); + else + Debug.LogFormat(context, Indent(indent) + msg); + } + + public static void LogWarning(string msg, Object context=null, int indent = 0) + { + if (!ES3Settings.defaultSettingsScriptableObject.logWarnings) + return; + else if (context != null) + Debug.LogWarningFormat(context, Indent(indent) + msg + disableWarningMsg); + else + Debug.LogWarningFormat(context, Indent(indent) + msg + disableWarningMsg); + } + + public static void LogError(string msg, Object context = null, int indent = 0) + { + if (!ES3Settings.defaultSettingsScriptableObject.logErrors) + return; + else if (context != null) + Debug.LogErrorFormat(context, Indent(indent) + msg + disableErrorMsg); + else + Debug.LogErrorFormat(context, Indent(indent) + msg + disableErrorMsg); + } + + private static string Indent(int size) + { + if (size < 0) + return ""; + return new string(indentChar, size); + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Debugging/ES3Debug.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Debugging/ES3Debug.cs.meta new file mode 100644 index 000000000..c93c7fb25 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Debugging/ES3Debug.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9f97d288c55524622a117171a19d3225 +timeCreated: 1518175265 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Debugging/ES3Debug.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3.cs new file mode 100644 index 000000000..81cea2cb2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3.cs @@ -0,0 +1,1658 @@ +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; +#if UNITY_2018_3_OR_NEWER +using UnityEngine.Networking; +#endif + +/// +/// The main class for Easy Save methods. All methods in this class are static. +/// +#if UNITY_VISUAL_SCRIPTING +[Unity.VisualScripting.IncludeInSettings(true)] +#elif BOLT_VISUAL_SCRIPTING +[Ludiq.IncludeInSettings(true)] +#endif +public class ES3 +{ + public enum Location { File, PlayerPrefs, InternalMS, Resources, Cache }; + public enum Directory { PersistentDataPath, DataPath } + public enum EncryptionType { None, AES }; + public enum CompressionType { None, Gzip}; + public enum Format { JSON }; + public enum ReferenceMode { ByRef, ByValue, ByRefAndValue}; + public enum ImageType { JPEG, PNG }; + + #region ES3.Save + + // Saves the value to the default file with the given key. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + public static void Save(string key, object value) + { + Save(key, value, new ES3Settings()); + } + + /// Saves the value to a file with the given key. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + /// The relative or absolute path of the file we want to store our value to. + public static void Save(string key, object value, string filePath) + { + Save(key, value, new ES3Settings(filePath)); + } + + /// Saves the value to a file with the given key. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + /// The relative or absolute path of the file we want to store our value to. + /// The settings we want to use to override the default settings. + public static void Save(string key, object value, string filePath, ES3Settings settings) + { + Save(key, value, new ES3Settings(filePath, settings)); + } + + /// Saves the value to a file with the given key. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + /// The settings we want to use to override the default settings. + public static void Save(string key, object value, ES3Settings settings) + { + Save(key, value, settings); + } + + /// Saves the value to the default file with the given key. + /// The type of the data that we want to save. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + public static void Save(string key, T value) + { + Save(key, value, new ES3Settings()); + } + + /// Saves the value to a file with the given key. + /// The type of the data that we want to save. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + /// The relative or absolute path of the file we want to store our value to. + public static void Save(string key, T value, string filePath) + { + Save(key, value, new ES3Settings(filePath)); + } + + /// Saves the value to a file with the given key. + /// The type of the data that we want to save. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + /// The relative or absolute path of the file we want to store our value to. + /// The settings we want to use to override the default settings. + public static void Save(string key, T value, string filePath, ES3Settings settings) + { + Save(key, value, new ES3Settings(filePath, settings)); + } + + /// Saves the value to a file with the given key. + /// The type of the data that we want to save. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + /// The settings we want to use to override the default settings. + public static void Save(string key, T value, ES3Settings settings) + { + if (settings.location == Location.Cache) + { + ES3File.GetOrCreateCachedFile(settings).Save(key, value); + return; + } + + using (var writer = ES3Writer.Create(settings)) + { + writer.Write(key, value); + writer.Save(); + } + } + + /// Creates or overwrites a file with the specified raw bytes. + /// The bytes we want to store. + public static void SaveRaw(byte[] bytes) + { + SaveRaw(bytes, new ES3Settings()); + } + + /// Creates or overwrites a file with the specified raw bytes. + /// The bytes we want to store. + /// The relative or absolute path of the file we want to store our bytes to. + public static void SaveRaw(byte[] bytes, string filePath) + { + SaveRaw(bytes, new ES3Settings(filePath)); + } + + /// Creates or overwrites a file with the specified raw bytes. + /// The bytes we want to store. + /// The relative or absolute path of the file we want to store our bytes to. + /// The settings we want to use to override the default settings. + public static void SaveRaw(byte[] bytes, string filePath, ES3Settings settings) + { + SaveRaw(bytes, new ES3Settings(filePath, settings)); + } + + /// Creates or overwrites a file with the specified raw bytes. + /// The bytes we want to store. + /// The settings we want to use to override the default settings. + public static void SaveRaw(byte[] bytes, ES3Settings settings) + { + if (settings.location == Location.Cache) + { + ES3File.GetOrCreateCachedFile(settings).SaveRaw(bytes, settings); + return; + } + + using (var stream = ES3Stream.CreateStream(settings, ES3FileMode.Write)) + { + stream.Write(bytes, 0, bytes.Length); + } + ES3IO.CommitBackup(settings); + } + + /// Creates or overwrites the default file with the specified raw bytes. + /// The string we want to store. + public static void SaveRaw(string str) + { + SaveRaw(str, new ES3Settings()); + } + + /// Creates or overwrites the default file with the specified raw bytes. + /// The string we want to store. + /// The relative or absolute path of the file we want to store our bytes to. + public static void SaveRaw(string str, string filePath) + { + SaveRaw(str, new ES3Settings(filePath)); + } + + /// Creates or overwrites a file with the specified raw bytes. + /// The string we want to store. + /// The relative or absolute path of the file we want to store our bytes to. + /// The settings we want to use to override the default settings. + public static void SaveRaw(string str, string filePath, ES3Settings settings) + { + SaveRaw(str, new ES3Settings(filePath, settings)); + } + + /// Creates or overwrites a file with the specified raw bytes. + /// The string we want to store. + /// The settings we want to use to override the default settings. + public static void SaveRaw(string str, ES3Settings settings) + { + var bytes = settings.encoding.GetBytes(str); + SaveRaw(bytes, settings); + } + + /// Creates or appends the specified bytes to a file. + /// The bytes we want to append. + public static void AppendRaw(byte[] bytes) + { + AppendRaw(bytes, new ES3Settings()); + } + + /// Creates or appends the specified bytes to a file. + /// The bytes we want to append. + /// The relative or absolute path of the file we want to append our bytes to. + /// The settings we want to use to override the default settings. + public static void AppendRaw(byte[] bytes, string filePath, ES3Settings settings) + { + AppendRaw(bytes, new ES3Settings(filePath, settings)); + } + + /// Creates or appends the specified bytes to a file. + /// The bytes we want to append. + /// The settings we want to use to override the default settings. + public static void AppendRaw(byte[] bytes, ES3Settings settings) + { + if (settings.location == Location.Cache) + { + ES3File.GetOrCreateCachedFile(settings).AppendRaw(bytes); + return; + } + + ES3Settings newSettings = new ES3Settings(settings.path, settings); + newSettings.encryptionType = EncryptionType.None; + newSettings.compressionType = CompressionType.None; + + using (var stream = ES3Stream.CreateStream(newSettings, ES3FileMode.Append)) + stream.Write(bytes, 0, bytes.Length); + } + + /// Creates or appends the specified string to the default file. + /// The string we want to append. + public static void AppendRaw(string str) + { + AppendRaw(str, new ES3Settings()); + } + + /// Creates or appends the specified string to the default file. + /// The string we want to append. + /// The relative or absolute path of the file we want to append our string to. + public static void AppendRaw(string str, string filePath) + { + AppendRaw(str, new ES3Settings(filePath)); + } + + /// Creates or appends the specified string to the default file. + /// The string we want to append. + /// The relative or absolute path of the file we want to append our string to. + /// The settings we want to use to override the default settings. + public static void AppendRaw(string str, string filePath, ES3Settings settings) + { + AppendRaw(str, new ES3Settings(filePath, settings)); + } + + /// Creates or appends the specified string to the default file. + /// The string we want to append. + /// The settings we want to use to override the default settings. + public static void AppendRaw(string str, ES3Settings settings) + { + var bytes = settings.encoding.GetBytes(str); + ES3Settings newSettings = new ES3Settings(settings.path, settings); + newSettings.encryptionType = EncryptionType.None; + newSettings.compressionType = CompressionType.None; + + if (settings.location == Location.Cache) + { + ES3File.GetOrCreateCachedFile(settings).SaveRaw(bytes); + return; + } + + using (var stream = ES3Stream.CreateStream(newSettings, ES3FileMode.Append)) + stream.Write(bytes, 0, bytes.Length); + } + + /// Saves a Texture2D as a PNG or JPG, depending on the file extension used for the filePath. + /// The Texture2D we want to save as a JPG or PNG. + /// The relative or absolute path of the PNG or JPG file we want to create. + public static void SaveImage(Texture2D texture, string imagePath) + { + SaveImage(texture, new ES3Settings(imagePath)); + } + + /// Saves a Texture2D as a PNG or JPG, depending on the file extension used for the filePath. + /// The Texture2D we want to save as a JPG or PNG. + /// The relative or absolute path of the PNG or JPG file we want to create. + public static void SaveImage(Texture2D texture, string imagePath, ES3Settings settings) + { + SaveImage(texture, new ES3Settings(imagePath, settings)); + } + + /// Saves a Texture2D as a PNG or JPG, depending on the file extension used for the filePath. + /// The Texture2D we want to save as a JPG or PNG. + /// The settings we want to use to override the default settings. + public static void SaveImage(Texture2D texture, ES3Settings settings) + { + SaveImage(texture, 75, settings); + } + + /// Saves a Texture2D as a PNG or JPG, depending on the file extension used for the filePath. + /// The Texture2D we want to save as a JPG or PNG. + /// Quality to encode with, where 1 is minimum and 100 is maximum. Note that this only applies to JPGs. + /// The relative or absolute path of the PNG or JPG file we want to create. + public static void SaveImage(Texture2D texture, int quality, string imagePath) + { + SaveImage(texture, quality, new ES3Settings(imagePath)); + } + + /// Saves a Texture2D as a PNG or JPG, depending on the file extension used for the filePath. + /// The Texture2D we want to save as a JPG or PNG. + /// Quality to encode with, where 1 is minimum and 100 is maximum. Note that this only applies to JPGs. + /// The relative or absolute path of the PNG or JPG file we want to create. + public static void SaveImage(Texture2D texture, int quality, string imagePath, ES3Settings settings) + { + SaveImage(texture, quality, new ES3Settings(imagePath, settings)); + } + + /// Saves a Texture2D as a PNG or JPG, depending on the file extension used for the filePath. + /// The Texture2D we want to save as a JPG or PNG. + /// Quality to encode with, where 1 is minimum and 100 is maximum. Note that this only applies to JPGs. + /// The settings we want to use to override the default settings. + public static void SaveImage(Texture2D texture, int quality, ES3Settings settings) + { + // Get the file extension to determine what format we want to save the image as. + string extension = ES3IO.GetExtension(settings.path).ToLower(); + if (string.IsNullOrEmpty(extension)) + throw new System.ArgumentException("File path must have a file extension when using ES3.SaveImage."); + byte[] bytes; + if (extension == ".jpg" || extension == ".jpeg") + bytes = texture.EncodeToJPG(quality); + else if (extension == ".png") + bytes = texture.EncodeToPNG(); + else + throw new System.ArgumentException("File path must have extension of .png, .jpg or .jpeg when using ES3.SaveImage."); + + ES3.SaveRaw(bytes, settings); + } + + + /// Saves a Texture2D as a PNG or JPG, depending on the file extension used for the filePath. + /// The Texture2D we want to save as a JPG or PNG. + /// Quality to encode with, where 1 is minimum and 100 is maximum. Note that this only applies to JPGs. + public static byte[] SaveImageToBytes(Texture2D texture, int quality, ES3.ImageType imageType) + { + if (imageType == ImageType.JPEG) + return texture.EncodeToJPG(quality); + else + return texture.EncodeToPNG(); + } + + #endregion + + #region ES3.Load + + /* Standard load methods */ + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + public static object Load(string key) + { + return Load(key, new ES3Settings()); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + public static object Load(string key, string filePath) + { + return Load(key, new ES3Settings(filePath)); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The settings we want to use to override the default settings. + public static object Load(string key, string filePath, ES3Settings settings) + { + return Load(key, new ES3Settings(filePath, settings)); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The settings we want to use to override the default settings. + public static object Load(string key, ES3Settings settings) + { + return Load(key, settings); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The value we want to return if the file or key does not exist. + public static object Load(string key, object defaultValue) + { + return Load(key, defaultValue, new ES3Settings()); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The value we want to return if the file or key does not exist. + public static object Load(string key, string filePath, object defaultValue) + { + return Load(key, defaultValue, new ES3Settings(filePath)); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The value we want to return if the file or key does not exist. + /// The settings we want to use to override the default settings. + public static object Load(string key, string filePath, object defaultValue, ES3Settings settings) + { + return Load(key, defaultValue, new ES3Settings(filePath, settings)); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The value we want to return if the file or key does not exist. + /// The settings we want to use to override the default settings. + public static object Load(string key, object defaultValue, ES3Settings settings) + { + return Load(key, defaultValue, settings); + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + public static T Load(string key) + { + return Load(key, new ES3Settings()); + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + public static T Load(string key, string filePath) + { + return Load(key, new ES3Settings(filePath)); + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The settings we want to use to override the default settings. + public static T Load(string key, string filePath, ES3Settings settings) + { + if (typeof(T) == typeof(string)) + ES3Debug.LogWarning("Using ES3.Load(string, string) to load a string, but the second parameter is ambiguous between defaultValue and filePath. By default C# will assume that the second parameter is the filePath. If you want the second parameter to be the defaultValue, use a named parameter. E.g. ES3.Load(\"key\", defaultValue: \"myDefaultValue\")"); + + return Load(key, new ES3Settings(filePath, settings)); + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The settings we want to use to override the default settings. + public static T Load(string key, ES3Settings settings) + { + if (settings.location == Location.Cache) + return ES3File.GetOrCreateCachedFile(settings).Load(key); + + using (var reader = ES3Reader.Create(settings)) + { + if (reader == null) + throw new System.IO.FileNotFoundException("File \"" + settings.FullPath + "\" could not be found."); + return reader.Read(key); + } + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The value we want to return if the file or key does not exist. + public static T Load(string key, T defaultValue) + { + return Load(key, defaultValue, new ES3Settings()); + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The value we want to return if the file or key does not exist. + public static T Load(string key, string filePath, T defaultValue) + { + return Load(key, defaultValue, new ES3Settings(filePath)); + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The value we want to return if the file or key does not exist. + /// The settings we want to use to override the default settings. + public static T Load(string key, string filePath, T defaultValue, ES3Settings settings) + { + return Load(key, defaultValue, new ES3Settings(filePath, settings)); + } + + /// Loads the value from a file with the given key. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The value we want to return if the file or key does not exist. + /// The settings we want to use to override the default settings. + public static T Load(string key, T defaultValue, ES3Settings settings) + { + if (settings.location == Location.Cache) + return ES3File.GetOrCreateCachedFile(settings).Load(key, defaultValue); + + using (var reader = ES3Reader.Create(settings)) + { + if (reader == null) + return defaultValue; + return reader.Read(key, defaultValue); + } + } + + /* Self-assigning load methods */ + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The key which identifies the value we want to load. + /// The object we want to load the value into. + public static void LoadInto(string key, object obj) where T : class + { + LoadInto(key, obj, new ES3Settings()); + } + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The object we want to load the value into. + public static void LoadInto(string key, string filePath, object obj) + { + LoadInto(key, obj, new ES3Settings(filePath)); + } + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The object we want to load the value into. + /// The settings we want to use to override the default settings. + public static void LoadInto(string key, string filePath, object obj, ES3Settings settings) + { + LoadInto(key, obj, new ES3Settings(filePath, settings)); + } + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The key which identifies the value we want to load. + /// The object we want to load the value into. + /// The settings we want to use to override the default settings. + public static void LoadInto(string key, object obj, ES3Settings settings) + { + LoadInto(key, obj, settings); + } + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The object we want to load the value into. + public static void LoadInto(string key, T obj) where T : class + { + LoadInto(key, obj, new ES3Settings()); + } + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The object we want to load the value into. + public static void LoadInto(string key, string filePath, T obj) where T : class + { + LoadInto(key, obj, new ES3Settings(filePath)); + } + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The relative or absolute path of the file we want to load from. + /// The object we want to load the value into. + /// The settings we want to use to override the default settings. + public static void LoadInto(string key, string filePath, T obj, ES3Settings settings) where T : class + { + LoadInto(key, obj, new ES3Settings(filePath, settings)); + } + + /// Loads the value from a file with the given key into an existing object, rather than creating a new instance. + /// The type of the data that we want to load. + /// The key which identifies the value we want to load. + /// The object we want to load the value into. + /// The settings we want to use to override the default settings. + public static void LoadInto(string key, T obj, ES3Settings settings) where T : class + { + if (ES3Reflection.IsValueType(obj.GetType())) + throw new InvalidOperationException("ES3.LoadInto can only be used with reference types, but the data you're loading is a value type. Use ES3.Load instead."); + + if (settings.location == Location.Cache) + { + ES3File.GetOrCreateCachedFile(settings).LoadInto(key, obj); + return; + } + + if (settings == null) settings = new ES3Settings(); + using (var reader = ES3Reader.Create(settings)) + { + if (reader == null) + throw new System.IO.FileNotFoundException("File \"" + settings.FullPath + "\" could not be found."); + reader.ReadInto(key, obj); + } + } + + /* LoadString method, as this can be difficult with overloads. */ + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The value we want to return if the file or key does not exist. + /// The settings we want to use to override the default settings. + public static string LoadString(string key, string defaultValue, ES3Settings settings) + { + return Load(key, null, defaultValue, settings); + } + + /// Loads the value from a file with the given key. + /// The key which identifies the value we want to load. + /// The value we want to return if the file or key does not exist. + /// The relative or absolute path of the file we want to load from. + /// The settings we want to use to override the default settings. + public static string LoadString(string key, string defaultValue, string filePath = null, ES3Settings settings = null) + { + return Load(key, filePath, defaultValue, settings); + } + + #endregion + + #region Other ES3.Load Methods + + /// Loads the default file as a byte array. + public static byte[] LoadRawBytes() + { + return LoadRawBytes(new ES3Settings()); + } + + /// Loads a file as a byte array. + /// The relative or absolute path of the file we want to load as a byte array. + public static byte[] LoadRawBytes(string filePath) + { + return LoadRawBytes(new ES3Settings(filePath)); + } + + /// Loads a file as a byte array. + /// The relative or absolute path of the file we want to load as a byte array. + /// The settings we want to use to override the default settings. + public static byte[] LoadRawBytes(string filePath, ES3Settings settings) + { + return LoadRawBytes(new ES3Settings(filePath, settings)); + } + + /// Loads the default file as a byte array. + /// The settings we want to use to override the default settings. + public static byte[] LoadRawBytes(ES3Settings settings) + { + if (settings.location == Location.Cache) + return ES3File.GetOrCreateCachedFile(settings).LoadRawBytes(); + + using (var stream = ES3Stream.CreateStream(settings, ES3FileMode.Read)) + { + if (stream == null) + throw new System.IO.FileNotFoundException("File "+settings.path+" could not be found"); + + if (stream.GetType() == typeof(System.IO.Compression.GZipStream)) + { + var gZipStream = (System.IO.Compression.GZipStream)stream; + using (var ms = new System.IO.MemoryStream()) + { + ES3Stream.CopyTo(gZipStream, ms); + return ms.ToArray(); + } + } + else + { + var bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + } + + /*if(settings.location == Location.File) + return ES3IO.ReadAllBytes(settings.FullPath); + else if(settings.location == Location.PlayerPrefs) + return System.Convert.FromBase64String(PlayerPrefs.GetString(settings.FullPath)); + else if(settings.location == Location.Resources) + { + var textAsset = Resources.Load(settings.FullPath); + return textAsset.bytes; + } + return null;*/ + } + + /// Loads the default file as a byte array. + public static string LoadRawString() + { + return LoadRawString(new ES3Settings()); + } + + /// Loads a file as a byte array. + /// The relative or absolute path of the file we want to load as a byte array. + /// The settings we want to use to override the default settings. + public static string LoadRawString(string filePath) + { + return LoadRawString(new ES3Settings(filePath)); + } + + /// Loads a file as a byte array. + /// The relative or absolute path of the file we want to load as a byte array. + /// The settings we want to use to override the default settings. + public static string LoadRawString(string filePath, ES3Settings settings) + { + return LoadRawString(new ES3Settings(filePath, settings)); + } + + /// Loads the default file as a byte array. + /// The settings we want to use to override the default settings. + public static string LoadRawString(ES3Settings settings) + { + var bytes = ES3.LoadRawBytes(settings); + return settings.encoding.GetString(bytes, 0, bytes.Length); + } + + /// Loads a PNG or JPG as a Texture2D. + /// The relative or absolute path of the PNG or JPG file we want to load as a Texture2D. + /// The settings we want to use to override the default settings. + public static Texture2D LoadImage(string imagePath) + { + return LoadImage(new ES3Settings(imagePath)); + } + + /// Loads a PNG or JPG as a Texture2D. + /// The relative or absolute path of the PNG or JPG file we want to load as a Texture2D. + /// The settings we want to use to override the default settings. + public static Texture2D LoadImage(string imagePath, ES3Settings settings) + { + return LoadImage(new ES3Settings(imagePath, settings)); + } + + /// Loads a PNG or JPG as a Texture2D. + /// The settings we want to use to override the default settings. + public static Texture2D LoadImage(ES3Settings settings) + { + byte[] bytes = ES3.LoadRawBytes(settings); + return LoadImage(bytes); + } + + /// Loads a PNG or JPG as a Texture2D. + /// The raw bytes of the PNG or JPG. + public static Texture2D LoadImage(byte[] bytes) + { + var texture = new Texture2D(1, 1); + texture.LoadImage(bytes); + return texture; + } + + /// Loads an audio file as an AudioClip. Note that MP3 files are not supported on standalone platforms and Ogg Vorbis files are not supported on mobile platforms. + /// The relative or absolute path of the audio file we want to load as an AudioClip. + public static AudioClip LoadAudio(string audioFilePath +#if UNITY_2018_3_OR_NEWER + , AudioType audioType +#endif + ) + { + return LoadAudio(audioFilePath, +#if UNITY_2018_3_OR_NEWER + audioType, +#endif + new ES3Settings()); + } + + /// Loads an audio file as an AudioClip. Note that MP3 files are not supported on standalone platforms and Ogg Vorbis files are not supported on mobile platforms. + /// The relative or absolute path of the audio file we want to load as an AudioClip. + /// The settings we want to use to override the default settings. + public static AudioClip LoadAudio(string audioFilePath, +#if UNITY_2018_3_OR_NEWER + AudioType audioType, +#endif + ES3Settings settings) + { + if (settings.location != Location.File) + throw new InvalidOperationException("ES3.LoadAudio can only be used with the File save location"); + + if (Application.platform == RuntimePlatform.WebGLPlayer) + throw new InvalidOperationException("You cannot use ES3.LoadAudio with WebGL"); + + string extension = ES3IO.GetExtension(audioFilePath).ToLower(); + + if (extension == ".mp3" && (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.OSXPlayer)) + throw new System.InvalidOperationException("You can only load Ogg, WAV, XM, IT, MOD or S3M on Unity Standalone"); + + if (extension == ".ogg" && (Application.platform == RuntimePlatform.IPhonePlayer + || Application.platform == RuntimePlatform.Android + || Application.platform == RuntimePlatform.WSAPlayerARM)) + throw new System.InvalidOperationException("You can only load MP3, WAV, XM, IT, MOD or S3M on Unity Standalone"); + + var newSettings = new ES3Settings(audioFilePath, settings); + +#if UNITY_2018_3_OR_NEWER + using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip("file://" + newSettings.FullPath, audioType)) + { + www.SendWebRequest(); + + while (!www.isDone) + { + // Wait for it to load. + } + + if (ES3WebClass.IsNetworkError(www)) + throw new System.Exception(www.error); + else + return DownloadHandlerAudioClip.GetContent(www); + } +#elif UNITY_2017_1_OR_NEWER + WWW www = new WWW(newSettings.FullPath); + + while(!www.isDone) + { + // Wait for it to load. + } + + if(!string.IsNullOrEmpty(www.error)) + throw new System.Exception(www.error); +#else + WWW www = new WWW("file://"+newSettings.FullPath); + + while(!www.isDone) + { + // Wait for it to load. + } + + if(!string.IsNullOrEmpty(www.error)) + throw new System.Exception(www.error); +#endif + +#if UNITY_2017_3_OR_NEWER && !UNITY_2018_3_OR_NEWER + return www.GetAudioClip(true); +#elif UNITY_5_6_OR_NEWER && !UNITY_2018_3_OR_NEWER + return WWWAudioExtensions.GetAudioClip(www); +#endif + } + + #endregion + + #region Serialize/Deserialize + + public static byte[] Serialize(T value, ES3Settings settings=null) + { + return Serialize(value, ES3TypeMgr.GetOrCreateES3Type(typeof(T)), settings); + } + + internal static byte[] Serialize(object value, ES3Types.ES3Type type, ES3Settings settings = null) + { + if (settings == null) settings = new ES3Settings(); + + using (var ms = new System.IO.MemoryStream()) + { + using (var stream = ES3Stream.CreateStream(ms, settings, ES3FileMode.Write)) + { + using (var baseWriter = ES3Writer.Create(stream, settings, false, false)) + { + // If T is object, use the value to get it's type. Otherwise, use T so that it works with inheritence. + //var type = typeof(T) != typeof(object) ? typeof(T) : (value == null ? typeof(T) : value.GetType()); + baseWriter.Write(value, type, settings.referenceMode); + } + + return ms.ToArray(); + } + } + } + + public static T Deserialize(byte[] bytes, ES3Settings settings=null) + { + return (T)Deserialize(ES3TypeMgr.GetOrCreateES3Type(typeof(T)), bytes, settings); + } + + internal static object Deserialize(ES3Types.ES3Type type, byte[] bytes, ES3Settings settings = null) + { + if (settings == null) + settings = new ES3Settings(); + + using (var ms = new System.IO.MemoryStream(bytes, false)) + using (var stream = ES3Stream.CreateStream(ms, settings, ES3FileMode.Read)) + using (var reader = ES3Reader.Create(stream, settings, false)) + return reader.Read(type); + } + + public static void DeserializeInto(byte[] bytes, T obj, ES3Settings settings = null) where T : class + { + DeserializeInto(ES3TypeMgr.GetOrCreateES3Type(typeof(T)), bytes, obj, settings); + } + + public static void DeserializeInto(ES3Types.ES3Type type, byte[] bytes, T obj, ES3Settings settings = null) where T : class + { + if (settings == null) + settings = new ES3Settings(); + + using (var ms = new System.IO.MemoryStream(bytes, false)) + using (var reader = ES3Reader.Create(ms, settings, false)) + reader.ReadInto(obj, type); + } + + #endregion + + #region Other ES3 Methods + +#if !DISABLE_ENCRYPTION + + public static byte[] EncryptBytes(byte[] bytes, string password=null) + { + if (string.IsNullOrEmpty(password)) + password = ES3Settings.defaultSettings.encryptionPassword; + return new AESEncryptionAlgorithm().Encrypt(bytes, password, ES3Settings.defaultSettings.bufferSize); + } + + public static byte[] DecryptBytes(byte[] bytes, string password=null) + { + if (string.IsNullOrEmpty(password)) + password = ES3Settings.defaultSettings.encryptionPassword; + return new AESEncryptionAlgorithm().Decrypt(bytes, password, ES3Settings.defaultSettings.bufferSize); + } + + public static string EncryptString(string str, string password=null) + { + return Convert.ToBase64String(EncryptBytes(ES3Settings.defaultSettings.encoding.GetBytes(str), password)); + } + + public static string DecryptString(string str, string password=null) + { + return ES3Settings.defaultSettings.encoding.GetString(DecryptBytes(Convert.FromBase64String(str), password)); + } + +#endif + + public static byte[] CompressBytes(byte[] bytes) + { + using (var ms = new System.IO.MemoryStream()) + { + var settings = new ES3Settings(); + settings.location = ES3.Location.InternalMS; + settings.compressionType = ES3.CompressionType.Gzip; + settings.encryptionType = EncryptionType.None; + + using (var stream = ES3Stream.CreateStream(ms, settings, ES3FileMode.Write)) + stream.Write(bytes, 0, bytes.Length); + + return ms.ToArray(); + } + } + + public static byte[] DecompressBytes(byte[] bytes) + { + using (var ms = new System.IO.MemoryStream(bytes)) + { + var settings = new ES3Settings(); + settings.location = ES3.Location.InternalMS; + settings.compressionType = ES3.CompressionType.Gzip; + settings.encryptionType = EncryptionType.None; + + using (var output = new System.IO.MemoryStream()) + { + using (var input = ES3Stream.CreateStream(ms, settings, ES3FileMode.Read)) + ES3Stream.CopyTo(input, output); + return output.ToArray(); + } + } + } + + public static string CompressString(string str) + { + return Convert.ToBase64String(CompressBytes(ES3Settings.defaultSettings.encoding.GetBytes(str))); + } + + public static string DecompressString(string str) + { + return ES3Settings.defaultSettings.encoding.GetString(DecompressBytes(Convert.FromBase64String(str))); + } + + /// Deletes the default file. + public static void DeleteFile() + { + DeleteFile(new ES3Settings()); + } + + /// Deletes the file at the given path using the default settings. + /// The relative or absolute path of the file we wish to delete. + public static void DeleteFile(string filePath) + { + DeleteFile(new ES3Settings(filePath)); + } + + /// Deletes the file at the given path using the settings provided. + /// The relative or absolute path of the file we wish to delete. + /// The settings we want to use to override the default settings. + public static void DeleteFile(string filePath, ES3Settings settings) + { + DeleteFile(new ES3Settings(filePath, settings)); + } + + /// Deletes the file specified by the ES3Settings object provided as a parameter. + /// The settings we want to use to override the default settings. + public static void DeleteFile(ES3Settings settings) + { + if (settings.location == Location.File) + ES3IO.DeleteFile(settings.FullPath); + else if (settings.location == Location.PlayerPrefs) + PlayerPrefs.DeleteKey(settings.FullPath); + else if (settings.location == Location.Cache) + ES3File.RemoveCachedFile(settings); + else if (settings.location == Location.Resources) + throw new System.NotSupportedException("Deleting files from Resources is not possible."); + } + + /// Copies a file from one path to another. + /// The relative or absolute path of the file we want to copy. + /// The relative or absolute path of the copy we want to create. + public static void CopyFile(string oldFilePath, string newFilePath) + { + CopyFile(new ES3Settings(oldFilePath), new ES3Settings(newFilePath)); + } + + /// Copies a file from one location to another, using the ES3Settings provided to override any default settings. + /// The relative or absolute path of the file we want to copy. + /// The relative or absolute path of the copy we want to create. + /// The settings we want to use when copying the old file. + /// The settings we want to use when creating the new file. + public static void CopyFile(string oldFilePath, string newFilePath, ES3Settings oldSettings, ES3Settings newSettings) + { + CopyFile(new ES3Settings(oldFilePath, oldSettings), new ES3Settings(newFilePath, newSettings)); + } + + /// Copies a file from one location to another, using the ES3Settings provided to determine the locations. + /// The settings we want to use when copying the old file. + /// The settings we want to use when creating the new file. + public static void CopyFile(ES3Settings oldSettings, ES3Settings newSettings) + { + if (oldSettings.location != newSettings.location) + throw new InvalidOperationException("Cannot copy file from " + oldSettings.location + " to " + newSettings.location + ". Location must be the same for both source and destination."); + + if (oldSettings.location == Location.File) + { + if (ES3IO.FileExists(oldSettings.FullPath)) + { + // Create the new directory if it doesn't exist. + string newDirectory = ES3IO.GetDirectoryPath(newSettings.FullPath); + if (!ES3IO.DirectoryExists(newDirectory)) + ES3IO.CreateDirectory(newDirectory); + // Otherwise delete the existing file so that we can overwrite it. + else + ES3IO.DeleteFile(newSettings.FullPath); + ES3IO.CopyFile(oldSettings.FullPath, newSettings.FullPath); + } + } + else if (oldSettings.location == Location.PlayerPrefs) + { + PlayerPrefs.SetString(newSettings.FullPath, PlayerPrefs.GetString(oldSettings.FullPath)); + } + else if (oldSettings.location == Location.Cache) + { + ES3File.CopyCachedFile(oldSettings, newSettings); + } + else if (oldSettings.location == Location.Resources) + throw new System.NotSupportedException("Modifying files from Resources is not allowed."); + } + + /// Renames a file. + /// The relative or absolute path of the file we want to rename. + /// The relative or absolute path we want to rename the file to. + public static void RenameFile(string oldFilePath, string newFilePath) + { + RenameFile(new ES3Settings(oldFilePath), new ES3Settings(newFilePath)); + } + + /// Renames a file. + /// The relative or absolute path of the file we want to rename. + /// The relative or absolute path we want to rename the file to. + /// The settings for the file we want to rename. + /// The settings for the file we want our source file to be renamed to. + public static void RenameFile(string oldFilePath, string newFilePath, ES3Settings oldSettings, ES3Settings newSettings) + { + RenameFile(new ES3Settings(oldFilePath, oldSettings), new ES3Settings(newFilePath, newSettings)); + } + + /// Renames a file. + /// The settings for the file we want to rename. + /// The settings for the file we want our source file to be renamed to. + public static void RenameFile(ES3Settings oldSettings, ES3Settings newSettings) + { + if (oldSettings.location != newSettings.location) + throw new InvalidOperationException("Cannot rename file in " + oldSettings.location + " to " + newSettings.location + ". Location must be the same for both source and destination."); + + if (oldSettings.location == Location.File) + { + if (ES3IO.FileExists(oldSettings.FullPath)) + { + ES3IO.DeleteFile(newSettings.FullPath); + ES3IO.MoveFile(oldSettings.FullPath, newSettings.FullPath); + } + } + else if (oldSettings.location == Location.PlayerPrefs) + { + PlayerPrefs.SetString(newSettings.FullPath, PlayerPrefs.GetString(oldSettings.FullPath)); + PlayerPrefs.DeleteKey(oldSettings.FullPath); + } + else if (oldSettings.location == Location.Cache) + { + ES3File.CopyCachedFile(oldSettings, newSettings); + ES3File.RemoveCachedFile(oldSettings); + } + else if (oldSettings.location == Location.Resources) + throw new System.NotSupportedException("Modifying files from Resources is not allowed."); + } + + /// Copies a file from one path to another. + /// The relative or absolute path of the directory we want to copy. + /// The relative or absolute path of the copy we want to create. + public static void CopyDirectory(string oldDirectoryPath, string newDirectoryPath) + { + CopyDirectory(new ES3Settings(oldDirectoryPath), new ES3Settings(newDirectoryPath)); + } + + /// Copies a file from one location to another, using the ES3Settings provided to override any default settings. + /// The relative or absolute path of the directory we want to copy. + /// The relative or absolute path of the copy we want to create. + /// The settings we want to use when copying the old directory. + /// The settings we want to use when creating the new directory. + public static void CopyDirectory(string oldDirectoryPath, string newDirectoryPath, ES3Settings oldSettings, ES3Settings newSettings) + { + CopyDirectory(new ES3Settings(oldDirectoryPath, oldSettings), new ES3Settings(newDirectoryPath, newSettings)); + } + + /// Copies a file from one location to another, using the ES3Settings provided to determine the locations. + /// The settings we want to use when copying the old file. + /// The settings we want to use when creating the new file. + public static void CopyDirectory(ES3Settings oldSettings, ES3Settings newSettings) + { + if (oldSettings.location != Location.File) + throw new InvalidOperationException("ES3.CopyDirectory can only be used when the save location is 'File'"); + + if (!DirectoryExists(oldSettings)) + throw new System.IO.DirectoryNotFoundException("Directory " + oldSettings.FullPath + " not found"); + + if (!DirectoryExists(newSettings)) + ES3IO.CreateDirectory(newSettings.FullPath); + + foreach (var fileName in ES3.GetFiles(oldSettings)) + CopyFile(ES3IO.CombinePathAndFilename(oldSettings.path, fileName), + ES3IO.CombinePathAndFilename(newSettings.path, fileName)); + + foreach (var directoryName in GetDirectories(oldSettings)) + CopyDirectory(ES3IO.CombinePathAndFilename(oldSettings.path, directoryName), + ES3IO.CombinePathAndFilename(newSettings.path, directoryName)); + } + + /// Renames a file. + /// The relative or absolute path of the file we want to rename. + /// The relative or absolute path we want to rename the file to. + public static void RenameDirectory(string oldDirectoryPath, string newDirectoryPath) + { + RenameDirectory(new ES3Settings(oldDirectoryPath), new ES3Settings(newDirectoryPath)); + } + + /// Renames a file. + /// The relative or absolute path of the file we want to rename. + /// The relative or absolute path we want to rename the file to. + /// The settings for the file we want to rename. + /// The settings for the file we want our source file to be renamed to. + public static void RenameDirectory(string oldDirectoryPath, string newDirectoryPath, ES3Settings oldSettings, ES3Settings newSettings) + { + RenameDirectory(new ES3Settings(oldDirectoryPath, oldSettings), new ES3Settings(newDirectoryPath, newSettings)); + } + + /// Renames a file. + /// The settings for the file we want to rename. + /// The settings for the file we want our source file to be renamed to. + public static void RenameDirectory(ES3Settings oldSettings, ES3Settings newSettings) + { + if (oldSettings.location == Location.File) + { + if (ES3IO.DirectoryExists(oldSettings.FullPath)) + { + ES3IO.DeleteDirectory(newSettings.FullPath); + ES3IO.MoveDirectory(oldSettings.FullPath, newSettings.FullPath); + } + } + else if (oldSettings.location == Location.PlayerPrefs || oldSettings.location == Location.Cache) + throw new System.NotSupportedException("Directories cannot be renamed when saving to Cache, PlayerPrefs, tvOS or using WebGL."); + else if (oldSettings.location == Location.Resources) + throw new System.NotSupportedException("Modifying files from Resources is not allowed."); + } + + /// Deletes the directory at the given path using the settings provided. + /// The relative or absolute path of the folder we wish to delete. + public static void DeleteDirectory(string directoryPath) + { + DeleteDirectory(new ES3Settings(directoryPath)); + } + + /// Deletes the directory at the given path using the settings provided. + /// The relative or absolute path of the folder we wish to delete. + /// The settings we want to use to override the default settings. + public static void DeleteDirectory(string directoryPath, ES3Settings settings) + { + DeleteDirectory(new ES3Settings(directoryPath, settings)); + } + + /// Deletes the directory at the given path using the settings provided. + /// The settings we want to use to override the default settings. + public static void DeleteDirectory(ES3Settings settings) + { + if (settings.location == Location.File) + ES3IO.DeleteDirectory(settings.FullPath); + else if (settings.location == Location.PlayerPrefs || settings.location == Location.Cache) + throw new System.NotSupportedException("Deleting Directories using Cache or PlayerPrefs is not supported."); + else if (settings.location == Location.Resources) + throw new System.NotSupportedException("Deleting directories from Resources is not allowed."); + } + + /// Deletes a key in the default file. + /// The key we want to delete. + public static void DeleteKey(string key) + { + DeleteKey(key, new ES3Settings()); + } + + public static void DeleteKey(string key, string filePath) + { + DeleteKey(key, new ES3Settings(filePath)); + } + + /// Deletes a key in the file specified. + /// The key we want to delete. + /// The relative or absolute path of the file we want to delete the key from. + /// The settings we want to use to override the default settings. + public static void DeleteKey(string key, string filePath, ES3Settings settings) + { + DeleteKey(key, new ES3Settings(filePath, settings)); + } + + /// Deletes a key in the file specified by the ES3Settings object. + /// The key we want to delete. + /// The settings we want to use to override the default settings. + public static void DeleteKey(string key, ES3Settings settings) + { + if (settings.location == Location.Resources) + throw new System.NotSupportedException("Modifying files in Resources is not allowed."); + else if (settings.location == Location.Cache) + ES3File.DeleteKey(key, settings); + else if (ES3.FileExists(settings)) + { + using (var writer = ES3Writer.Create(settings)) + { + writer.MarkKeyForDeletion(key); + writer.Save(); + } + } + } + + /// Checks whether a key exists in the default file. + /// The key we want to check the existence of. + /// True if the key exists, otherwise False. + public static bool KeyExists(string key) + { + return KeyExists(key, new ES3Settings()); + } + + /// Checks whether a key exists in the specified file. + /// The key we want to check the existence of. + /// The relative or absolute path of the file we want to search. + /// True if the key exists, otherwise False. + public static bool KeyExists(string key, string filePath) + { + return KeyExists(key, new ES3Settings(filePath)); + } + + /// Checks whether a key exists in the default file. + /// The key we want to check the existence of. + /// The relative or absolute path of the file we want to search. + /// The settings we want to use to override the default settings. + /// True if the key exists, otherwise False. + public static bool KeyExists(string key, string filePath, ES3Settings settings) + { + return KeyExists(key, new ES3Settings(filePath, settings)); + } + + /// Checks whether a key exists in a file. + /// The key we want to check the existence of. + /// The settings we want to use to override the default settings. + /// True if the file exists, otherwise False. + public static bool KeyExists(string key, ES3Settings settings) + { + if (settings.location == Location.Cache) + return ES3File.KeyExists(key, settings); + + using (var reader = ES3Reader.Create(settings)) + { + if (reader == null) + return false; + return reader.Goto(key); + } + } + + /// Checks whether the default file exists. + /// The relative or absolute path of the file we want to check the existence of. + /// True if the file exists, otherwise False. + public static bool FileExists() + { + return FileExists(new ES3Settings()); + } + + /// Checks whether a file exists. + /// The relative or absolute path of the file we want to check the existence of. + /// True if the file exists, otherwise False. + public static bool FileExists(string filePath) + { + return FileExists(new ES3Settings(filePath)); + } + + /// Checks whether a file exists. + /// The relative or absolute path of the file we want to check the existence of. + /// The settings we want to use to override the default settings. + /// True if the file exists, otherwise False. + public static bool FileExists(string filePath, ES3Settings settings) + { + return FileExists(new ES3Settings(filePath, settings)); + } + + /// Checks whether a file exists. + /// The settings we want to use to override the default settings. + /// True if the file exists, otherwise False. + public static bool FileExists(ES3Settings settings) + { + if (settings.location == Location.File) + return ES3IO.FileExists(settings.FullPath); + else if (settings.location == Location.PlayerPrefs) + return PlayerPrefs.HasKey(settings.FullPath); + else if (settings.location == Location.Cache) + return ES3File.FileExists(settings); + else if (settings.location == Location.Resources) + return Resources.Load(settings.FullPath) != null; + return false; + } + + /// Checks whether a folder exists. + /// The relative or absolute path of the folder we want to check the existence of. + /// True if the folder exists, otherwise False. + public static bool DirectoryExists(string folderPath) + { + return DirectoryExists(new ES3Settings(folderPath)); + } + + /// Checks whether a file exists. + /// The relative or absolute path of the folder we want to check the existence of. + /// The settings we want to use to override the default settings. + /// True if the folder exists, otherwise False. + + public static bool DirectoryExists(string folderPath, ES3Settings settings) + { + return DirectoryExists(new ES3Settings(folderPath, settings)); + } + + /// Checks whether a folder exists. + /// The settings we want to use to override the default settings. + /// True if the folder exists, otherwise False. + public static bool DirectoryExists(ES3Settings settings) + { + if (settings.location == Location.File) + return ES3IO.DirectoryExists(settings.FullPath); + else if (settings.location == Location.PlayerPrefs || settings.location == Location.Cache) + throw new System.NotSupportedException("Directories are not supported for the Cache and PlayerPrefs location."); + else if (settings.location == Location.Resources) + throw new System.NotSupportedException("Checking existence of folder in Resources not supported."); + return false; + } + + /// Gets an array of all of the key names in the default file. + public static string[] GetKeys() + { + return GetKeys(new ES3Settings()); + } + + /// Gets an array of all of the key names in a file. + /// The relative or absolute path of the file we want to get the key names from. + public static string[] GetKeys(string filePath) + { + return GetKeys(new ES3Settings(filePath)); + } + + /// Gets an array of all of the key names in a file. + /// The relative or absolute path of the file we want to get the key names from. + /// The settings we want to use to override the default settings. + public static string[] GetKeys(string filePath, ES3Settings settings) + { + return GetKeys(new ES3Settings(filePath, settings)); + } + + /// Gets an array of all of the key names in a file. + /// The settings we want to use to override the default settings. + public static string[] GetKeys(ES3Settings settings) + { + + if (settings.location == Location.Cache) + return ES3File.GetKeys(settings); + + var keys = new List(); + using (var reader = ES3Reader.Create(settings)) + { + if (reader == null) + throw new System.IO.FileNotFoundException("Could not get keys from file "+settings.FullPath+" as file does not exist"); + + foreach (string key in reader.Properties) + { + keys.Add(key); + reader.Skip(); + } + } + return keys.ToArray(); + } + + /// Gets an array of all of the file names in a directory. + public static string[] GetFiles() + { + var settings = new ES3Settings(); + if (settings.location == ES3.Location.File) + { + if (settings.directory == ES3.Directory.PersistentDataPath) + settings.path = ES3IO.persistentDataPath; + else + settings.path = ES3IO.dataPath; + } + return GetFiles(new ES3Settings()); + } + + /// Gets an array of all of the file names in a directory. + /// The relative or absolute path of the directory we want to get the file names from. + public static string[] GetFiles(string directoryPath) + { + return GetFiles(new ES3Settings(directoryPath)); + } + + /// Gets an array of all of the file names in a directory. + /// The relative or absolute path of the directory we want to get the file names from. + /// The settings we want to use to override the default settings. + public static string[] GetFiles(string directoryPath, ES3Settings settings) + { + return GetFiles(new ES3Settings(directoryPath, settings)); + } + + /// Gets an array of all of the file names in a directory. + /// The settings we want to use to override the default settings. + public static string[] GetFiles(ES3Settings settings) + { + if (settings.location == Location.Cache) + return ES3File.GetFiles(); + else if (settings.location != ES3.Location.File) + throw new System.NotSupportedException("ES3.GetFiles can only be used when the location is set to File or Cache."); + return ES3IO.GetFiles(settings.FullPath, false); + } + + /// Gets an array of all of the sub-directory names in a directory. + public static string[] GetDirectories() + { + return GetDirectories(new ES3Settings()); + } + + /// Gets an array of all of the sub-directory names in a directory. + /// The relative or absolute path of the directory we want to get the sub-directory names from. + public static string[] GetDirectories(string directoryPath) + { + return GetDirectories(new ES3Settings(directoryPath)); + } + + /// Gets an array of all of the sub-directory names in a directory. + /// The relative or absolute path of the directory we want to get the sub-directory names from. + /// The settings we want to use to override the default settings. + public static string[] GetDirectories(string directoryPath, ES3Settings settings) + { + return GetDirectories(new ES3Settings(directoryPath, settings)); + } + + /// Gets an array of all of the sub-directory names in a directory. + /// The settings we want to use to override the default settings. + public static string[] GetDirectories(ES3Settings settings) + { + if (settings.location != ES3.Location.File) + throw new System.NotSupportedException("ES3.GetDirectories can only be used when the location is set to File."); + return ES3IO.GetDirectories(settings.FullPath, false); + } + + /// Creates a backup of the default file . + /// A backup is created by copying the file and giving it a .bak extension. + /// If a backup already exists it will be overwritten, so you will need to ensure that the old backup will not be required before calling this method. + public static void CreateBackup() + { + CreateBackup(new ES3Settings()); + } + + /// Creates a backup of a file. + /// A backup is created by copying the file and giving it a .bak extension. + /// If a backup already exists it will be overwritten, so you will need to ensure that the old backup will not be required before calling this method. + /// The relative or absolute path of the file we wish to create a backup of. + public static void CreateBackup(string filePath) + { + CreateBackup(new ES3Settings(filePath)); + } + + /// Creates a backup of a file. + /// A backup is created by copying the file and giving it a .bak extension. + /// If a backup already exists it will be overwritten, so you will need to ensure that the old backup will not be required before calling this method. + /// The relative or absolute path of the file we wish to create a backup of. + /// The settings we want to use to override the default settings. + public static void CreateBackup(string filePath, ES3Settings settings) + { + CreateBackup(new ES3Settings(filePath, settings)); + } + + /// Creates a backup of a file. + /// A backup is created by copying the file and giving it a .bak extension. + /// If a backup already exists it will be overwritten, so you will need to ensure that the old backup will not be required before calling this method. + /// The settings we want to use to override the default settings. + public static void CreateBackup(ES3Settings settings) + { + var backupSettings = new ES3Settings(settings.path + ES3IO.backupFileSuffix, settings); + ES3.CopyFile(settings, backupSettings); + } + + /// Restores a backup of a file. + /// The relative or absolute path of the file we wish to restore the backup of. + /// True if a backup was restored, or False if no backup could be found. + public static bool RestoreBackup(string filePath) + { + return RestoreBackup(new ES3Settings(filePath)); + } + + /// Restores a backup of a file. + /// The relative or absolute path of the file we wish to restore the backup of. + /// The settings we want to use to override the default settings. + /// True if a backup was restored, or False if no backup could be found. + public static bool RestoreBackup(string filePath, ES3Settings settings) + { + return RestoreBackup(new ES3Settings(filePath, settings)); + } + + /// Restores a backup of a file. + /// The settings we want to use to override the default settings. + /// True if a backup was restored, or False if no backup could be found. + public static bool RestoreBackup(ES3Settings settings) + { + var backupSettings = new ES3Settings(settings.path + ES3IO.backupFileSuffix, settings); + + if (!FileExists(backupSettings)) + return false; + + ES3.RenameFile(backupSettings, settings); + + return true; + } + + public static DateTime GetTimestamp() + { + return GetTimestamp(new ES3Settings()); + } + + public static DateTime GetTimestamp(string filePath) + { + return GetTimestamp(new ES3Settings(filePath)); + } + + public static DateTime GetTimestamp(string filePath, ES3Settings settings) + { + return GetTimestamp(new ES3Settings(filePath, settings)); + } + + /// Gets the date and time the file was last updated, in the UTC timezone. + /// The settings we want to use to override the default settings. + /// A DateTime object represeting the UTC date and time the file was last updated. + public static DateTime GetTimestamp(ES3Settings settings) + { + if (settings.location == Location.File) + return ES3IO.GetTimestamp(settings.FullPath); + else if (settings.location == Location.PlayerPrefs) + return new DateTime(long.Parse(PlayerPrefs.GetString("timestamp_" + settings.FullPath, "0")), DateTimeKind.Utc); + else if (settings.location == Location.Cache) + return ES3File.GetTimestamp(settings); + else + return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + } + + /// Stores the default cached file to persistent storage. + /// A backup is created by copying the file and giving it a .bak extension. + /// If a backup already exists it will be overwritten, so you will need to ensure that the old backup will not be required before calling this method. + public static void StoreCachedFile() + { + ES3File.Store(); + } + + /// Stores a cached file to persistent storage. + /// The filename or path of the file we want to store the cached file to. + public static void StoreCachedFile(string filePath) + { + StoreCachedFile(new ES3Settings(filePath)); + } + + /// Creates a backup of a file. + /// The filename or path of the file we want to store the cached file to. + /// The settings of the file we want to store to. + public static void StoreCachedFile(string filePath, ES3Settings settings) + { + StoreCachedFile(new ES3Settings(filePath, settings)); + } + + /// Stores a cached file to persistent storage. + /// The settings of the file we want to store to. + public static void StoreCachedFile(ES3Settings settings) + { + ES3File.Store(settings); + } + + /// Loads the default file in persistent storage into the cache. + /// A backup is created by copying the file and giving it a .bak extension. + /// If a backup already exists it will be overwritten, so you will need to ensure that the old backup will not be required before calling this method. + public static void CacheFile() + { + CacheFile(new ES3Settings()); + } + + /// Loads a file from persistent storage into the cache. + /// The filename or path of the file we want to store the cached file to. + public static void CacheFile(string filePath) + { + CacheFile(new ES3Settings(filePath)); + } + + /// Creates a backup of a file. + /// The filename or path of the file we want to store the cached file to. + /// The settings of the file we want to store to. + public static void CacheFile(string filePath, ES3Settings settings) + { + CacheFile(new ES3Settings(filePath, settings)); + } + + /// Stores a cached file to persistent storage. + /// The settings of the file we want to store to. + public static void CacheFile(ES3Settings settings) + { + ES3File.CacheFile(settings); + } + + /// Initialises Easy Save. This happens automatically when any ES3 methods are called, but is useful if you want to perform initialisation before calling an ES3 method. + public static void Init() + { + var settings = ES3Settings.defaultSettings; + var pdp = ES3IO.persistentDataPath; // Call this to initialise ES3IO for threading purposes. + ES3TypeMgr.Init(); + } + + #endregion +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3.cs.meta new file mode 100644 index 000000000..dc9fa94b9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: ca1cdcde6d39a44b39ee5f5b86ddfd73 +timeCreated: 1499764822 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Crypto.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3Crypto.cs new file mode 100644 index 000000000..b7ef8dce8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Crypto.cs @@ -0,0 +1,208 @@ +#if !DISABLE_ENCRYPTION +using System.IO; +using System.Security.Cryptography; +#if NETFX_CORE +using Windows.Security.Cryptography; +using Windows.Security.Cryptography.Core; +using Windows.Storage.Streams; +using System.Runtime.InteropServices.WindowsRuntime; +#endif + +namespace ES3Internal +{ + public static class ES3Hash + { +#if NETFX_CORE + public static string SHA1Hash(string input) + { + return System.Text.Encoding.UTF8.GetString(UnityEngine.Windows.Crypto.ComputeSHA1Hash(System.Text.Encoding.UTF8.GetBytes(input))); + } +#else + public static string SHA1Hash(string input) + { + using (SHA1Managed sha1 = new SHA1Managed()) + return System.Text.Encoding.UTF8.GetString(sha1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(input))); + } +#endif + } + + public abstract class EncryptionAlgorithm + { + public abstract byte[] Encrypt(byte[] bytes, string password, int bufferSize); + public abstract byte[] Decrypt(byte[] bytes, string password, int bufferSize); + public abstract void Encrypt(Stream input, Stream output, string password, int bufferSize); + public abstract void Decrypt(Stream input, Stream output, string password, int bufferSize); + + protected static void CopyStream(Stream input, Stream output, int bufferSize) + { + byte[] buffer = new byte[bufferSize]; + int read; + while ((read = input.Read(buffer, 0, bufferSize)) > 0) + output.Write(buffer, 0, read); + } + } + + public class AESEncryptionAlgorithm : EncryptionAlgorithm + { + private const int ivSize = 16; + private const int keySize = 16; + private const int pwIterations = 100; + + public override byte[] Encrypt(byte[] bytes, string password, int bufferSize) + { + using (var input = new MemoryStream(bytes)) + { + using (var output = new MemoryStream()) + { + Encrypt(input, output, password, bufferSize); + return output.ToArray(); + } + } + } + + public override byte[] Decrypt(byte[] bytes, string password, int bufferSize) + { + using (var input = new MemoryStream(bytes)) + { + using (var output = new MemoryStream()) + { + Decrypt(input, output, password, bufferSize); + return output.ToArray(); + } + } + } + + public override void Encrypt(Stream input, Stream output, string password, int bufferSize) + { + input.Position = 0; + +#if NETFX_CORE + // Generate an IV and write it to the output. + var iv = CryptographicBuffer.GenerateRandom(ivSize); + output.Write(iv.ToArray(), 0, ivSize); + + var pwBuffer = CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf8); + var keyDerivationProvider = KeyDerivationAlgorithmProvider.OpenAlgorithm("PBKDF2_SHA1"); + KeyDerivationParameters pbkdf2Parms = KeyDerivationParameters.BuildForPbkdf2(iv, pwIterations); + // Create a key based on original key and derivation parmaters + CryptographicKey keyOriginal = keyDerivationProvider.CreateKey(pwBuffer); + IBuffer keyMaterial = CryptographicEngine.DeriveKeyMaterial(keyOriginal, pbkdf2Parms, keySize); + + var provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); + var key = provider.CreateSymmetricKey(keyMaterial); + + // Get the input stream as an IBuffer. + IBuffer msg; + using(var ms = new MemoryStream()) + { + input.CopyTo(ms); + msg = ms.ToArray().AsBuffer(); + } + + var buffEncrypt = CryptographicEngine.Encrypt(key, msg, iv); + + + output.Write(buffEncrypt.ToArray(), 0, (int)buffEncrypt.Length); + output.Dispose(); +#else + using (var alg = Aes.Create()) + { + alg.Mode = CipherMode.CBC; + alg.Padding = PaddingMode.PKCS7; + alg.GenerateIV(); + var key = new Rfc2898DeriveBytes(password, alg.IV, pwIterations); + alg.Key = key.GetBytes(keySize); + // Write the IV to the output stream. + output.Write(alg.IV, 0, ivSize); + using(var encryptor = alg.CreateEncryptor()) + using(var cs = new CryptoStream(output, encryptor, CryptoStreamMode.Write)) + CopyStream(input, cs, bufferSize); + } +#endif + } + + public override void Decrypt(Stream input, Stream output, string password, int bufferSize) + { +#if NETFX_CORE + var thisIV = new byte[ivSize]; + input.Read(thisIV, 0, ivSize); + var iv = thisIV.AsBuffer(); + + var pwBuffer = CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf8); + + var keyDerivationProvider = KeyDerivationAlgorithmProvider.OpenAlgorithm("PBKDF2_SHA1"); + KeyDerivationParameters pbkdf2Parms = KeyDerivationParameters.BuildForPbkdf2(iv, pwIterations); + // Create a key based on original key and derivation parameters. + CryptographicKey keyOriginal = keyDerivationProvider.CreateKey(pwBuffer); + IBuffer keyMaterial = CryptographicEngine.DeriveKeyMaterial(keyOriginal, pbkdf2Parms, keySize); + + var provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); + var key = provider.CreateSymmetricKey(keyMaterial); + + // Get the input stream as an IBuffer. + IBuffer msg; + using(var ms = new MemoryStream()) + { + input.CopyTo(ms); + msg = ms.ToArray().AsBuffer(); + } + + var buffDecrypt = CryptographicEngine.Decrypt(key, msg, iv); + + output.Write(buffDecrypt.ToArray(), 0, (int)buffDecrypt.Length); +#else + using (var alg = Aes.Create()) + { + var thisIV = new byte[ivSize]; + input.Read(thisIV, 0, ivSize); + alg.IV = thisIV; + + var key = new Rfc2898DeriveBytes(password, alg.IV, pwIterations); + alg.Key = key.GetBytes(keySize); + + using(var decryptor = alg.CreateDecryptor()) + using(var cryptoStream = new CryptoStream(input, decryptor, CryptoStreamMode.Read)) + CopyStream(cryptoStream, output, bufferSize); + + } +#endif + output.Position = 0; + } + } + + public class UnbufferedCryptoStream : MemoryStream + { + private readonly Stream stream; + private readonly bool isReadStream; + private string password; + private int bufferSize; + private EncryptionAlgorithm alg; + private bool disposed = false; + + public UnbufferedCryptoStream(Stream stream, bool isReadStream, string password, int bufferSize, EncryptionAlgorithm alg) : base() + { + this.stream = stream; + this.isReadStream = isReadStream; + this.password = password; + this.bufferSize = bufferSize; + this.alg = alg; + + + if (isReadStream) + alg.Decrypt(stream, this, password, bufferSize); + } + + protected override void Dispose(bool disposing) + { + if (disposed) + return; + disposed = true; + + if (!isReadStream) + alg.Encrypt(this, stream, password, bufferSize); + stream.Dispose(); + base.Dispose(disposing); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Crypto.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3Crypto.cs.meta new file mode 100644 index 000000000..796b09e62 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Crypto.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d2b3b6335276042569261b3e6bed694e +timeCreated: 1519132297 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3Crypto.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3File.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3File.cs new file mode 100644 index 000000000..e1db729f4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3File.cs @@ -0,0 +1,524 @@ +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System; +using ES3Types; +using UnityEngine; +using ES3Internal; +using System.Linq; + +/// Represents a cached file which can be saved to and loaded from, and commited to storage when necessary. +public class ES3File +{ + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public static Dictionary cachedFiles = new Dictionary(); + + + + + public ES3Settings settings; + private Dictionary cache = new Dictionary(); + private bool syncWithFile = false; + private DateTime timestamp = DateTime.UtcNow; + + /// Creates a new ES3File and loads the default file into the ES3File if there is data to load. + public ES3File() : this(new ES3Settings(), true) { } + + /// Creates a new ES3File and loads the specified file into the ES3File if there is data to load. + /// The relative or absolute path of the file in storage our ES3File is associated with. + public ES3File(string filePath) : this(new ES3Settings(filePath), true) { } + + /// Creates a new ES3File and loads the specified file into the ES3File if there is data to load. + /// The relative or absolute path of the file in storage our ES3File is associated with. + /// The settings we want to use to override the default settings. + public ES3File(string filePath, ES3Settings settings) : this(new ES3Settings(filePath, settings), true) { } + + /// Creates a new ES3File and loads the specified file into the ES3File if there is data to load. + /// The settings we want to use to override the default settings. + public ES3File(ES3Settings settings) : this(settings, true) { } + + /// Creates a new ES3File and only loads the default file into it if syncWithFile is set to true. + /// Whether we should sync this ES3File with the one in storage immediately after creating it. + public ES3File(bool syncWithFile) : this(new ES3Settings(), syncWithFile) { } + /// Creates a new ES3File and only loads the specified file into it if syncWithFile is set to true. + /// The relative or absolute path of the file in storage our ES3File is associated with. + /// Whether we should sync this ES3File with the one in storage immediately after creating it. + public ES3File(string filePath, bool syncWithFile) : this(new ES3Settings(filePath), syncWithFile) { } + /// Creates a new ES3File and only loads the specified file into it if syncWithFile is set to true. + /// The relative or absolute path of the file in storage our ES3File is associated with. + /// The settings we want to use to override the default settings. + /// Whether we should sync this ES3File with the one in storage immediately after creating it. + public ES3File(string filePath, ES3Settings settings, bool syncWithFile) : this(new ES3Settings(filePath, settings), syncWithFile) { } + + /// Creates a new ES3File and loads the specified file into the ES3File if there is data to load. + /// The settings we want to use to override the default settings. + /// Whether we should sync this ES3File with the one in storage immediately after creating it. + public ES3File(ES3Settings settings, bool syncWithFile) + { + this.settings = settings; + this.syncWithFile = syncWithFile; + if (syncWithFile) + { + // Type checking must be enabled when syncing. + var settingsWithTypeChecking = (ES3Settings)settings.Clone(); + settingsWithTypeChecking.typeChecking = true; + + using (var reader = ES3Reader.Create(settingsWithTypeChecking)) + { + if (reader == null) + return; + foreach (KeyValuePair kvp in reader.RawEnumerator) + cache[kvp.Key] = kvp.Value; + } + + timestamp = ES3.GetTimestamp(settingsWithTypeChecking); + } + } + + /// Creates a new ES3File and loads the bytes into the ES3File. Note the bytes must represent that of a file. + /// The bytes representing our file. + /// The settings we want to use to override the default settings. + /// Whether we should sync this ES3File with the one in storage immediately after creating it. + public ES3File(byte[] bytes, ES3Settings settings = null) + { + if (settings == null) + this.settings = new ES3Settings(); + else + this.settings = settings; + + syncWithFile = true; // This ensures that the file won't be merged, which would prevent deleted keys from being deleted. + + SaveRaw(bytes, settings); + } + + /// Synchronises this ES3File with a file in storage. + public void Sync() + { + Sync(this.settings); + } + + /// Synchronises this ES3File with a file in storage. + /// The relative or absolute path of the file in storage we want to synchronise with. + /// The settings we want to use to override the default settings. + public void Sync(string filePath, ES3Settings settings = null) + { + Sync(new ES3Settings(filePath, settings)); + } + + /// Synchronises this ES3File with a file in storage. + /// The settings we want to use to override the default settings. + public void Sync(ES3Settings settings = null) + { + if (settings == null) + settings = new ES3Settings(); + + if (cache.Count == 0) + { + ES3.DeleteFile(settings); + return; + } + + using (var baseWriter = ES3Writer.Create(settings, true, !syncWithFile, false)) + { + foreach (var kvp in cache) + { + // If we change the name of a type, the type may be null. + // In this case, use System.Object as the type. + Type type; + if (kvp.Value.type == null) + type = typeof(System.Object); + else + type = kvp.Value.type.type; + baseWriter.Write(kvp.Key, type, kvp.Value.bytes); + } + baseWriter.Save(!syncWithFile); + } + } + + /// Removes the data stored in this ES3File. The ES3File will be empty after calling this method. + public void Clear() + { + cache.Clear(); + } + + /// Returns an array of all of the key names in this ES3File. + public string[] GetKeys() + { + var keyCollection = cache.Keys; + var keys = new string[keyCollection.Count]; + keyCollection.CopyTo(keys, 0); + return keys; + } + + #region Save Methods + + /// Saves a value to a key in this ES3File. + /// The key we want to use to identify our value in the file. + /// The value we want to save. + public void Save(string key, T value) + { + var unencryptedSettings = (ES3Settings)settings.Clone(); + unencryptedSettings.encryptionType = ES3.EncryptionType.None; + unencryptedSettings.compressionType = ES3.CompressionType.None; + + // If T is object, use the value to get it's type. Otherwise, use T so that it works with inheritence. + Type type; + if (value == null) + type = typeof(T); + else + type = value.GetType(); + + ES3Type es3Type = ES3TypeMgr.GetOrCreateES3Type(type); + + cache[key] = new ES3Data(es3Type, ES3.Serialize(value, es3Type, unencryptedSettings)); + } + + /// Merges the data specified by the bytes parameter into this ES3File. + /// The bytes we want to merge with this ES3File. + /// The settings we want to use to override the default settings. + public void SaveRaw(byte[] bytes, ES3Settings settings = null) + { + if (settings == null) + settings = new ES3Settings(); + + // Type checking must be enabled when syncing. + var settingsWithTypeChecking = (ES3Settings)settings.Clone(); + settingsWithTypeChecking.typeChecking = true; + + using (var reader = ES3Reader.Create(bytes, settingsWithTypeChecking)) + { + if (reader == null) + return; + foreach (KeyValuePair kvp in reader.RawEnumerator) + cache[kvp.Key] = kvp.Value; + } + } + + /// Merges the data specified by the bytes parameter into this ES3File. + /// The bytes we want to merge with this ES3File. + /// The settings we want to use to override the default settings. + public void AppendRaw(byte[] bytes, ES3Settings settings = null) + { + if (settings == null) + settings = new ES3Settings(); + // AppendRaw just does the same thing as SaveRaw in ES3File. + SaveRaw(bytes, settings); + } + + #endregion + + #region Load Methods + + /* Standard load methods */ + + /// Loads the value from this ES3File with the given key. + /// The key which identifies the value we want to load. + public object Load(string key) + { + return Load(key); + } + + /// Loads the value from this ES3File with the given key. + /// The key which identifies the value we want to load. + /// The value we want to return if the key does not exist in this ES3File. + public object Load(string key, object defaultValue) + { + return Load(key, defaultValue); + } + + /// Loads the value from this ES3File with the given key. + /// The key which identifies the value we want to load. + public T Load(string key) + { + ES3Data es3Data; + + if (!cache.TryGetValue(key, out es3Data)) + throw new KeyNotFoundException("Key \"" + key + "\" was not found in this ES3File. Use Load(key, defaultValue) if you want to return a default value if the key does not exist."); + + var unencryptedSettings = (ES3Settings)this.settings.Clone(); + unencryptedSettings.encryptionType = ES3.EncryptionType.None; + unencryptedSettings.compressionType = ES3.CompressionType.None; + + // If we're loading a derived type using it's parent type, ensure that we use the ES3Type from the ES3Data. + if (typeof(T) != es3Data.type.type && ES3Reflection.IsAssignableFrom(typeof(T), es3Data.type.type)) + return (T)ES3.Deserialize(es3Data.type, es3Data.bytes, unencryptedSettings); + return ES3.Deserialize(es3Data.bytes, unencryptedSettings); + } + + /// Loads the value from this ES3File with the given key. + /// The key which identifies the value we want to load. + /// The value we want to return if the key does not exist in this ES3File. + public T Load(string key, T defaultValue) + { + ES3Data es3Data; + + if (!cache.TryGetValue(key, out es3Data)) + return defaultValue; + var unencryptedSettings = (ES3Settings)this.settings.Clone(); + unencryptedSettings.encryptionType = ES3.EncryptionType.None; + unencryptedSettings.compressionType = ES3.CompressionType.None; + + // If we're loading a derived type using it's parent type, ensure that we use the ES3Type from the ES3Data. + if (typeof(T) != es3Data.type.type && ES3Reflection.IsAssignableFrom(typeof(T), es3Data.type.type)) + return (T)ES3.Deserialize(es3Data.type, es3Data.bytes, unencryptedSettings); + return ES3.Deserialize(es3Data.bytes, unencryptedSettings); + } + + /// Loads the value from this ES3File with the given key into an existing object. + /// The key which identifies the value we want to load. + /// The object we want to load the value into. + public void LoadInto(string key, T obj) where T : class + { + ES3Data es3Data; + + if (!cache.TryGetValue(key, out es3Data)) + throw new KeyNotFoundException("Key \"" + key + "\" was not found in this ES3File. Use Load(key, defaultValue) if you want to return a default value if the key does not exist."); + + var unencryptedSettings = (ES3Settings)this.settings.Clone(); + unencryptedSettings.encryptionType = ES3.EncryptionType.None; + unencryptedSettings.compressionType = ES3.CompressionType.None; + + // If we're loading a derived type using it's parent type, ensure that we use the ES3Type from the ES3Data. + if (typeof(T) != es3Data.type.type && ES3Reflection.IsAssignableFrom(typeof(T), es3Data.type.type)) + ES3.DeserializeInto(es3Data.type, es3Data.bytes, obj, unencryptedSettings); + else + ES3.DeserializeInto(es3Data.bytes, obj, unencryptedSettings); + } + + #endregion + + #region Load Raw Methods + + /// Loads the ES3File as a raw, unencrypted, uncompressed byte array. + public byte[] LoadRawBytes() + { + var newSettings = (ES3Settings)settings.Clone(); + if (!newSettings.postprocessRawCachedData) + { + newSettings.encryptionType = ES3.EncryptionType.None; + newSettings.compressionType = ES3.CompressionType.None; + } + return GetBytes(newSettings); + } + + /// Loads the ES3File as a raw, unencrypted, uncompressed string, using the encoding defined in the ES3File's settings variable. + public string LoadRawString() + { + if (cache.Count == 0) + return ""; + return settings.encoding.GetString(LoadRawBytes()); + } + + /* + * Same as LoadRawString, except it will return an encrypted/compressed file if these are enabled. + */ + internal byte[] GetBytes(ES3Settings settings = null) + { + if (cache.Count == 0) + return new byte[0]; + + if (settings == null) + settings = this.settings; + + using (var ms = new System.IO.MemoryStream()) + { + var memorySettings = (ES3Settings)settings.Clone(); + memorySettings.location = ES3.Location.InternalMS; + // Ensure we return unencrypted bytes. + if (!memorySettings.postprocessRawCachedData) + { + memorySettings.encryptionType = ES3.EncryptionType.None; + memorySettings.compressionType = ES3.CompressionType.None; + } + + using (var baseWriter = ES3Writer.Create(ES3Stream.CreateStream(ms, memorySettings, ES3FileMode.Write), memorySettings, true, false)) + { + foreach (var kvp in cache) + baseWriter.Write(kvp.Key, kvp.Value.type.type, kvp.Value.bytes); + baseWriter.Save(false); + } + + return ms.ToArray(); + } + } + + #endregion + + #region Other ES3 Methods + + /// Deletes a key from this ES3File. + /// The key we want to delete. + public void DeleteKey(string key) + { + cache.Remove(key); + } + + /// Checks whether a key exists in this ES3File. + /// The key we want to check the existence of. + /// True if the key exists, otherwise False. + public bool KeyExists(string key) + { + return cache.ContainsKey(key); + } + + /// Gets the size of the cached data in bytes. + public int Size() + { + int size = 0; + foreach (var kvp in cache) + size += kvp.Value.bytes.Length; + return size; + } + + public Type GetKeyType(string key) + { + ES3Data es3data; + if (!cache.TryGetValue(key, out es3data)) + throw new KeyNotFoundException("Key \"" + key + "\" was not found in this ES3File. Use Load(key, defaultValue) if you want to return a default value if the key does not exist."); + + return es3data.type.type; + } + + #endregion + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static ES3File GetOrCreateCachedFile(ES3Settings settings) + { + ES3File cachedFile; + if (!cachedFiles.TryGetValue(settings.path, out cachedFile)) + { + cachedFile = new ES3File(settings, false); + cachedFiles.Add(settings.path, cachedFile); + cachedFile.syncWithFile = true; // This ensures that the file won't be merged, which would prevent deleted keys from being deleted. + } + // Settings might refer to the same file, but might have changed. + // To account for this, we update the settings of the ES3File each time we access it. + cachedFile.settings = settings; + return cachedFile; + } + + internal static void CacheFile(ES3Settings settings) + { + // If we're still using cached settings, set it to the default location. + if (settings.location == ES3.Location.Cache) + { + settings = (ES3Settings)settings.Clone(); + // If the default settings are also set to cache, assume ES3.Location.File. Otherwise, set it to the default location. + settings.location = ES3Settings.defaultSettings.location == ES3.Location.Cache ? ES3.Location.File : ES3Settings.defaultSettings.location; + } + + if (!ES3.FileExists(settings)) + return; + + // Disable compression and encryption when loading the raw bytes, and the ES3File constructor will expect encrypted/compressed bytes. + var loadSettings = (ES3Settings)settings.Clone(); + loadSettings.compressionType = ES3.CompressionType.None; + loadSettings.encryptionType = ES3.EncryptionType.None; + + cachedFiles[settings.path] = new ES3File(ES3.LoadRawBytes(loadSettings), settings); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static void Store(ES3Settings settings = null) + { + if (settings == null) + settings = new ES3Settings(ES3.Location.File); + // If we're still using cached settings, set it to the default location. + else if (settings.location == ES3.Location.Cache) + { + settings = (ES3Settings)settings.Clone(); + // If the default settings are also set to cache, assume ES3.Location.File. Otherwise, set it to the default location. + settings.location = ES3Settings.defaultSettings.location == ES3.Location.Cache ? ES3.Location.File : ES3Settings.defaultSettings.location; + } + + ES3File cachedFile; + if (!cachedFiles.TryGetValue(settings.path, out cachedFile)) + throw new FileNotFoundException("The file '" + settings.path + "' could not be stored because it could not be found in the cache."); + cachedFile.Sync(settings); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static void RemoveCachedFile(ES3Settings settings) + { + cachedFiles.Remove(settings.path); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static void CopyCachedFile(ES3Settings oldSettings, ES3Settings newSettings) + { + ES3File cachedFile; + if (!cachedFiles.TryGetValue(oldSettings.path, out cachedFile)) + throw new FileNotFoundException("The file '" + oldSettings.path + "' could not be copied because it could not be found in the cache."); + if (cachedFiles.ContainsKey(newSettings.path)) + throw new InvalidOperationException("Cannot copy file '" + oldSettings.path + "' to '" + newSettings.path + "' because '" + newSettings.path + "' already exists"); + + cachedFiles.Add(newSettings.path, (ES3File)cachedFile.MemberwiseClone()); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static void DeleteKey(string key, ES3Settings settings) + { + ES3File cachedFile; + if (cachedFiles.TryGetValue(settings.path, out cachedFile)) + cachedFile.DeleteKey(key); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static bool KeyExists(string key, ES3Settings settings) + { + ES3File cachedFile; + if (cachedFiles.TryGetValue(settings.path, out cachedFile)) + return cachedFile.KeyExists(key); + return false; + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static bool FileExists(ES3Settings settings) + { + return cachedFiles.ContainsKey(settings.path); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static string[] GetKeys(ES3Settings settings) + { + ES3File cachedFile; + if (!cachedFiles.TryGetValue(settings.path, out cachedFile)) + throw new FileNotFoundException("Could not get keys from the file '" + settings.path + "' because it could not be found in the cache."); + return cachedFile.cache.Keys.ToArray(); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal static string[] GetFiles() + { + return cachedFiles.Keys.ToArray(); + } + + internal static DateTime GetTimestamp(ES3Settings settings) + { + ES3File cachedFile; + if (!cachedFiles.TryGetValue(settings.path, out cachedFile)) + return new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); + return cachedFile.timestamp; + } +} + +namespace ES3Internal +{ + public struct ES3Data + { + public ES3Type type; + public byte[] bytes; + + public ES3Data(Type type, byte[] bytes) + { + this.type = type == null ? null : ES3TypeMgr.GetOrCreateES3Type(type); + this.bytes = bytes; + } + + public ES3Data(ES3Type type, byte[] bytes) + { + this.type = type; + this.bytes = bytes; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3File.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3File.cs.meta new file mode 100644 index 000000000..f500a6fe5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3File.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 2cd9723dc51904030be3c30362442d47 +timeCreated: 1499764821 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3File.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3GameObject.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3GameObject.cs new file mode 100644 index 000000000..f340c7f58 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3GameObject.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[ExecuteInEditMode] +public class ES3GameObject : MonoBehaviour +{ + public List components = new List(); + + /* Ensures that this Component is always last in the List to guarantee that it's loaded after any Components it references */ + private void Update() + { + if (Application.isPlaying) + return; + +#if UNITY_EDITOR + UnityEditorInternal.ComponentUtility.MoveComponentDown(this); +#endif + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3GameObject.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3GameObject.cs.meta new file mode 100644 index 000000000..073278ab8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3GameObject.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7e2cacabe81aea8468e08e911727ee97 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3GameObject.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3IO.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3IO.cs new file mode 100644 index 000000000..5003d84a3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3IO.cs @@ -0,0 +1,178 @@ +using System.IO; +using System; +using UnityEngine; + +namespace ES3Internal +{ + public static class ES3IO + { +#if UNITY_SWITCH + internal static readonly string persistentDataPath = ""; + internal static readonly string dataPath = ""; +#else + internal static readonly string persistentDataPath = Application.persistentDataPath; + internal static readonly string dataPath = Application.dataPath; +#endif + + internal const string backupFileSuffix = ".bac"; + internal const string temporaryFileSuffix = ".tmp"; + + public enum ES3FileMode { Read, Write, Append } + + public static DateTime GetTimestamp(string filePath) + { + if (!FileExists(filePath)) + return new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); + return File.GetLastWriteTime(filePath).ToUniversalTime(); + } + + public static string GetExtension(string path) + { + return Path.GetExtension(path); + } + + public static void DeleteFile(string filePath) + { + if (FileExists(filePath)) + File.Delete(filePath); + } + + public static bool FileExists(string filePath) { return File.Exists(filePath); } + public static void MoveFile(string sourcePath, string destPath) { File.Move(sourcePath, destPath); } + public static void CopyFile(string sourcePath, string destPath) { File.Copy(sourcePath, destPath); } + + public static void MoveDirectory(string sourcePath, string destPath) { Directory.Move(sourcePath, destPath); } + public static void CreateDirectory(string directoryPath) { Directory.CreateDirectory(directoryPath); } + public static bool DirectoryExists(string directoryPath) { return Directory.Exists(directoryPath); } + + /* + * Given a path, it returns the directory that path points to. + * eg. "C:/myFolder/thisFolder/myFile.txt" will return "C:/myFolder/thisFolder". + */ + public static string GetDirectoryPath(string path, char seperator = '/') + { + //return Path.GetDirectoryName(path); + // Path.GetDirectoryName turns forward slashes to backslashes in some cases on Windows, which is why + // Substring is used instead. + char slashChar = UsesForwardSlash(path) ? '/' : '\\'; + + int slash = path.LastIndexOf(slashChar); + + // If this path ends in a slash it is assumed to already be a path to a Directory. + if (slash == path.Length - 1) + return path; + + // Ignore trailing slash if necessary. + if (slash == (path.Length - 1)) + slash = path.Substring(0, slash).LastIndexOf(slashChar); + if (slash == -1) + ES3Debug.LogError("Path provided is not a directory path as it contains no slashes."); + return path.Substring(0, slash); + } + + public static bool UsesForwardSlash(string path) + { + if (path.Contains("/")) + return true; + return false; + } + + // Takes a directory path and a file or directory name and combines them into a single path. + public static string CombinePathAndFilename(string directoryPath, string fileOrDirectoryName) + { + if (directoryPath[directoryPath.Length - 1] != '/' && directoryPath[directoryPath.Length - 1] != '\\') + directoryPath += '/'; + return directoryPath + fileOrDirectoryName; + } + + public static string[] GetDirectories(string path, bool getFullPaths = true) + { + var paths = Directory.GetDirectories(path); + for (int i = 0; i < paths.Length; i++) + { + if (!getFullPaths) + paths[i] = Path.GetFileName(paths[i]); + // GetDirectories sometimes returns backslashes, so we need to convert them to + // forward slashes. + paths[i].Replace("\\", "/"); + } + return paths; + } + + public static void DeleteDirectory(string directoryPath) + { + if (DirectoryExists(directoryPath)) + Directory.Delete(directoryPath, true); + } + + // Note: Paths not ending in a slash are assumed to be a path to a file. + // In this case the Directory containing the file will be searched. + public static string[] GetFiles(string path, bool getFullPaths = true) + { + var paths = Directory.GetFiles(GetDirectoryPath(path)); + if (!getFullPaths) + { + for (int i = 0; i < paths.Length; i++) + paths[i] = Path.GetFileName(paths[i]); + } + return paths; + } + + public static byte[] ReadAllBytes(string path) + { + return File.ReadAllBytes(path); + } + + public static void WriteAllBytes(string path, byte[] bytes) + { + File.WriteAllBytes(path, bytes); + } + + public static void CommitBackup(ES3Settings settings) + { + ES3Debug.Log("Committing backup for " + settings.path + " to storage location " + settings.location); + + var temporaryFilePath = settings.FullPath + temporaryFileSuffix; + + if (settings.location == ES3.Location.File) + { + var oldFileBackup = settings.FullPath + temporaryFileSuffix + ".bak"; + + // If there's existing save data to overwrite ... + if (FileExists(settings.FullPath)) + { + // Delete any old backups. + DeleteFile(oldFileBackup); + // Rename the old file so we can restore it if it fails. + CopyFile(settings.FullPath, oldFileBackup); + + try + { + // Delete the old file so that we can move it. + DeleteFile(settings.FullPath); + // Now rename the temporary file to the name of the save file. + MoveFile(temporaryFilePath, settings.FullPath); + } + catch (Exception e) + { + // If any exceptions occur, restore the original save file. + try { DeleteFile(settings.FullPath); } catch { } + MoveFile(oldFileBackup, settings.FullPath); + throw e; + } + + DeleteFile(oldFileBackup); + } + // Else just rename the temporary file to the main file. + else + MoveFile(temporaryFilePath, settings.FullPath); + } + else if (settings.location == ES3.Location.PlayerPrefs) + { + PlayerPrefs.SetString(settings.FullPath, PlayerPrefs.GetString(temporaryFilePath)); + PlayerPrefs.DeleteKey(temporaryFilePath); + PlayerPrefs.Save(); + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3IO.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3IO.cs.meta new file mode 100644 index 000000000..adc155b29 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3IO.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0e3e89d69f37e4fa9b4d60467722ac73 +timeCreated: 1499764821 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3IO.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3InspectorInfo.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3InspectorInfo.cs new file mode 100644 index 000000000..61a94ae56 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3InspectorInfo.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/* + * Displays an info message in the inspector. + * Only available in the Editor. + */ +public class ES3InspectorInfo : MonoBehaviour +{ + #if UNITY_EDITOR + public string message = ""; + + public void SetMessage(string message) + { + this.message = message; + } + #endif +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3InspectorInfo.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3InspectorInfo.cs.meta new file mode 100644 index 000000000..71fe5d13d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3InspectorInfo.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 8714d999c5ae749538494c1347e5a3ca +timeCreated: 1519132290 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3InspectorInfo.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Prefab.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3Prefab.cs new file mode 100644 index 000000000..9d5639589 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Prefab.cs @@ -0,0 +1,218 @@ +using System.Collections.Generic; +using UnityEngine; +using ES3Internal; +#if UNITY_EDITOR +using UnityEditor; +#endif + + +namespace ES3Internal +{ + public class ES3Prefab : MonoBehaviour + { + public long prefabId = GetNewRefID(); + /* + * We need to store references to all dependencies of the prefab because only supported scripts will be serialised. + * This means that although supported scripts have their dependencies added to the reference manager when we load the prefab, + * there will not be any dependencies in the reference manager for scripts which are not supported. So it will not be possible to save any reference to these. + */ + public ES3RefIdDictionary localRefs = new ES3RefIdDictionary(); + + public void Awake() + { + // Add the references to the reference list when this prefab is instantiated. + var mgr = ES3ReferenceMgrBase.Current; + + if (mgr == null) + return; + + foreach (var kvp in localRefs) + if (kvp.Key != null) + mgr.Add(kvp.Key); + } + + public long Get(UnityEngine.Object obj) + { + long id; + if (localRefs.TryGetValue(obj, out id)) + return id; + return -1; + } + + public long Add(UnityEngine.Object obj) + { + long id; + if (localRefs.TryGetValue(obj, out id)) + return id; + + if (!ES3ReferenceMgr.CanBeSaved(obj)) + return -1; + id = GetNewRefID(); + localRefs.Add(obj, id); + return id; + } + + public Dictionary GetReferences() + { + var localToGlobal = new Dictionary(); + + var refMgr = ES3ReferenceMgr.Current; + + if (refMgr == null) + return localToGlobal; + + foreach (var kvp in localRefs) + { + long id = refMgr.Add(kvp.Key); + localToGlobal[kvp.Value.ToString()] = id.ToString(); + } + return localToGlobal; + } + + public void ApplyReferences(Dictionary localToGlobal) + { + if (ES3ReferenceMgrBase.Current == null) + return; + + foreach (var localRef in localRefs) + { + long globalId; + if (localToGlobal.TryGetValue(localRef.Value, out globalId)) + ES3ReferenceMgrBase.Current.Add(localRef.Key, globalId); + } + } + + public static long GetNewRefID() + { + return ES3ReferenceMgrBase.GetNewRefID(); + } +#if UNITY_EDITOR + public void GeneratePrefabReferences() + { +#if UNITY_2021_3_OR_NEWER + if (this.gameObject.scene.name != null || UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage() != null) +#elif UNITY_2018_3_OR_NEWER + if (this.gameObject.scene.name != null || UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage() != null) +#else + if (this.gameObject.scene.name != null) +#endif + return; + + // Create a new reference list so that any objects which are no longer dependencies are removed. + var tempLocalRefs = new ES3RefIdDictionary(); + + // Get dependencies of children also. + var transforms = GetComponentsInChildren(); + var gos = new GameObject[transforms.Length]; + for (int i = 0; i < transforms.Length; i++) + gos[i] = transforms[i].gameObject; + + bool addedNewReference = false; + + // Add the GameObject's dependencies to the reference list. + foreach (var obj in EditorUtility.CollectDependencies(gos)) + { + var dependency = (UnityEngine.Object)obj; + if (obj == null || !ES3ReferenceMgr.CanBeSaved(dependency)) + continue; + + var id = Get(dependency); + // If we're adding a new reference, do an Undo.RecordObject to ensure it persists. + if (id == -1) + { + addedNewReference = true; + Undo.RecordObject(this, "Update Easy Save 3 Prefab"); + EditorUtility.SetDirty(this); + } + tempLocalRefs.Add(dependency, id == -1 ? GetNewRefID() : id); + } + + if (addedNewReference || tempLocalRefs.Count != localRefs.Count) + localRefs = tempLocalRefs; + } +#endif + } +} + +/* + * Create a blank ES3Type for ES3Prefab as it does not require serialising/deserialising when stored as a Component. + */ +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_ES3Prefab : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ES3Prefab() : base(typeof(ES3Prefab)) { Instance = this; } + + public override void Write(object obj, ES3Writer writer) + { + } + + public override object Read(ES3Reader reader) + { + return null; + } + } + + /* + * Use this ES3Type to serialise the . + */ + public class ES3Type_ES3PrefabInternal : ES3Type + { + public static ES3Type Instance = new ES3Type_ES3PrefabInternal(); + + public ES3Type_ES3PrefabInternal() : base(typeof(ES3Type_ES3PrefabInternal)) { Instance = this; } + + public override void Write(object obj, ES3Writer writer) + { + ES3Prefab es3Prefab = (ES3Prefab)obj; + + writer.WriteProperty("prefabId", es3Prefab.prefabId.ToString(), ES3Type_string.Instance); + writer.WriteProperty("refs", es3Prefab.GetReferences()); + } + + public override object Read(ES3Reader reader) + { + var prefabId = reader.ReadRefProperty(); + + if (ES3ReferenceMgrBase.Current == null) + return null; + + var es3Prefab = ES3ReferenceMgrBase.Current.GetPrefab(prefabId); + if (es3Prefab == null) + throw new MissingReferenceException("Prefab with ID " + prefabId + " could not be found.\nPress the 'Refresh References' button on the ES3ReferenceMgr Component of the Easy Save 3 Manager in the scene to refresh prefabs."); + + +#if UNITY_EDITOR + // Use PrefabUtility.InstantiatePrefab if we're saving in the Editor and the application isn't playing. + // This keeps the connection to the prefab, which is useful for Editor scripts saving data outside of runtime. + var instance = Application.isPlaying ? GameObject.Instantiate(es3Prefab.gameObject) : PrefabUtility.InstantiatePrefab(es3Prefab.gameObject); +#else + var instance = GameObject.Instantiate(es3Prefab.gameObject); +#endif + var instanceES3Prefab = ((GameObject)instance).GetComponent(); + if (instanceES3Prefab == null) + throw new MissingReferenceException("Prefab with ID " + prefabId + " was found, but it does not have an ES3Prefab component attached."); + + ReadInto(reader, instance); + + return instanceES3Prefab.gameObject; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + // Load as ES3Refs and convert to longs. + var localToGlobal_refs = reader.ReadProperty>(ES3Type_ES3RefDictionary.Instance); + var localToGlobal = new Dictionary(); + foreach (var kvp in localToGlobal_refs) + localToGlobal.Add(kvp.Key.id, kvp.Value.id); + + if (ES3ReferenceMgrBase.Current == null) + return; + + ((GameObject)obj).GetComponent().ApplyReferences(localToGlobal); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Prefab.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3Prefab.cs.meta new file mode 100644 index 000000000..97b8890d2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Prefab.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: baff8732cd3074ef88b34f9cc487846d +timeCreated: 1519132295 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3Prefab.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgr.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgr.cs new file mode 100644 index 000000000..3626ca887 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgr.cs @@ -0,0 +1,253 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using ES3Internal; +using UnityEngine.SceneManagement; +#if UNITY_EDITOR +using UnityEditor; +using UnityEditor.SceneManagement; +using System.Reflection; +using System; +using System.Linq; +#endif + +#if UNITY_VISUAL_SCRIPTING +using Unity.VisualScripting; +[IncludeInSettings(true)] +#endif +public class ES3ReferenceMgr : ES3ReferenceMgrBase +{ +#if UNITY_EDITOR + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void RefreshDependencies(bool isEnteringPlayMode = false) + { + // Empty the refId so it has to be refreshed. + refId = null; + + ES3ReferenceMgrBase.isEnteringPlayMode = isEnteringPlayMode; + + // This will get the dependencies for all GameObjects and Components from the active scene. + AddDependencies(this.gameObject.scene.GetRootGameObjects()); + AddDependenciesFromFolders(); + AddPrefabsToManager(); + RemoveNullOrInvalidValues(); + + ES3ReferenceMgrBase.isEnteringPlayMode = false; + } + + [MenuItem("Tools/Easy Save 3/Refresh References for All Scenes", false, 150)] + static void RefreshDependenciesInAllScenes() + { + if (!EditorUtility.DisplayDialog("Refresh references in all scenes", "This will open each scene which is enabled in your Build Settings, refresh each reference manager, and save the scene.\n\nWe recommend making a backup of your project before doing this for the first time.", "Ok", "Cancel", DialogOptOutDecisionType.ForThisMachine, "ES3RefreshAllOptOut")) + return; + + // Get a list of loaded scenes so we know whether we need to close them after refreshing references or not. + var loadedScenePaths = new string[SceneManager.sceneCount]; + for (int i = 0; i < SceneManager.sceneCount; i++) + loadedScenePaths[i] = SceneManager.GetSceneAt(i).path; + + var scenes = EditorBuildSettings.scenes; + var sceneNameList = ""; // We use this so we can display a list of scenes at the end. + + for (int i = 0; i < scenes.Length; i++) + { + var buildSettingsScene = scenes[i]; + + if (!buildSettingsScene.enabled) + continue; + + if (EditorUtility.DisplayCancelableProgressBar("Refreshing references", $"Refreshing references for scene {buildSettingsScene.path}.", i / scenes.Length)) + return; + + var sceneWasOpen = loadedScenePaths.Contains(buildSettingsScene.path); + var scene = EditorSceneManager.OpenScene(buildSettingsScene.path, OpenSceneMode.Additive); + + var mgr = ES3ReferenceMgr.GetManagerFromScene(scene, false); + + if (mgr != null) + { + try + { + ((ES3ReferenceMgr)mgr).RefreshDependencies(); + } + catch(Exception e) + { + ES3Debug.LogError($"Couldn't update references for scene {scene.name} as the following exception occurred:\n\n" + e); + } + } + + sceneNameList += $"{scene.name}\n"; + + // If the scene wasn't originally open, save it and close it. + if (!sceneWasOpen) + { + // Temporarily disable refreshing on save so that it doesn't refresh again. + var updateReferencesOnSave = ES3Settings.defaultSettingsScriptableObject.updateReferencesWhenSceneIsSaved; + ES3Settings.defaultSettingsScriptableObject.updateReferencesWhenSceneIsSaved = false; + + EditorSceneManager.SaveScene(scene); + EditorSceneManager.CloseScene(scene, true); + + ES3Settings.defaultSettingsScriptableObject.updateReferencesWhenSceneIsSaved = updateReferencesOnSave; + } + } + EditorUtility.ClearProgressBar(); + + EditorUtility.DisplayDialog("References refreshed", $"Refrences updated for scenes:\n\n{sceneNameList}", "Ok", DialogOptOutDecisionType.ForThisMachine, "ES3RefreshAllCompleteOptOut"); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void Optimize() + { + var dependencies = EditorUtility.CollectDependencies(this.gameObject.scene.GetRootGameObjects().Where(go => go != this.gameObject).ToArray()); + var notDependenciesOfScene = new HashSet(); + + foreach (var kvp in idRef) + if (!dependencies.Contains(kvp.Value)) + notDependenciesOfScene.Add(kvp.Value); + + foreach (var obj in notDependenciesOfScene) + Remove(obj); + } + + /* Adds all dependencies from this scene to the manager */ + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void AddDependencies() + { + var rootGameObjects = gameObject.scene.GetRootGameObjects(); + + for (int j = 0; j < rootGameObjects.Length; j++) + { + var go = rootGameObjects[j]; + + if (EditorUtility.DisplayCancelableProgressBar("Gathering references", "Populating reference manager with your scene dependencies so they can be saved and loaded by reference.", j / rootGameObjects.Length)) + return; + + AddDependencies(go); + } + + EditorUtility.ClearProgressBar(); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void AddDependencies(UnityEngine.Object[] objs) + { + var timeStarted = EditorApplication.timeSinceStartup; + var timeout = ES3Settings.defaultSettingsScriptableObject.collectDependenciesTimeout; + + foreach (var obj in objs) + { + if (obj == null || obj.name == "Easy Save 3 Manager") + continue; + + foreach (var dependency in EditorUtility.CollectDependencies(new UnityEngine.Object[] { obj })) + { + if (EditorApplication.timeSinceStartup - timeStarted > timeout) + { + ES3Debug.LogWarning($"Easy Save cancelled gathering of references for object {obj.name} because it took longer than {timeout} seconds. You can increase the timeout length in Tools > Easy Save 3 > Settings > Reference Gathering Timeout, or adjust the settings so that fewer objects are referenced in your scene."); + return; + } + + Add(dependency); + + if (obj is ES3Prefab prefab) + AddPrefabToManager(prefab); + } + } + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void AddDependenciesFromFolders() + { + var folders = ES3Settings.defaultSettingsScriptableObject.referenceFolders; + + // Remove null or empty values. + ArrayUtility.Remove(ref folders, ""); + ArrayUtility.Remove(ref folders, null); + + if (folders == null || folders.Length == 0) + return; + + var guids = AssetDatabase.FindAssets("t:Object", folders); + + foreach (var guid in guids) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + var obj = AssetDatabase.LoadAssetAtPath(path); + + if(obj != null) + AddDependencies(obj); + } + } + + /*[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void AddDependenciesLegacy(UnityEngine.Object[] objs) + { + for (int i = 0; i < objs.Length; i++) + { + var obj = objs[i]; + + if (obj.name == "Easy Save 3 Manager") + continue; + + var dependencies = CollectDependenciesLegacy(obj); + + foreach (var dependency in dependencies) + { + if (dependency != null) + { + Add(dependency); + + // Add the prefab if it's referenced by this scene. + if (dependency.GetType() == typeof(ES3Prefab)) + AddPrefabToManager((ES3Prefab)dependency); + } + } + } + + Undo.RecordObject(this, "Update Easy Save 3 Reference List"); + }*/ + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void AddDependencies(UnityEngine.Object obj) + { + AddDependencies(new UnityEngine.Object[] { obj }); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void GeneratePrefabReferences() + { + AddPrefabsToManager(); + foreach (var es3Prefab in prefabs) + es3Prefab.GeneratePrefabReferences(); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void AddPrefabsToManager() + { + if (ES3Settings.defaultSettingsScriptableObject.addAllPrefabsToManager) + { + // Clear any null values. This isn't necessary if we're not adding all prefabs to manager as the list is cleared each time. + if (this.prefabs.RemoveAll(item => item == null) > 0) + Undo.RecordObject(this, "Update Easy Save 3 Reference List"); + + foreach (var es3Prefab in Resources.FindObjectsOfTypeAll()) + AddPrefabToManager(es3Prefab); + } + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + private void AddPrefabToManager(ES3Prefab es3Prefab) + { + try + { + if (es3Prefab != null && EditorUtility.IsPersistent(es3Prefab)) + if(AddPrefab(es3Prefab)) + Undo.RecordObject(this, "Update Easy Save 3 Reference List"); + es3Prefab.GeneratePrefabReferences(); + } + catch { } + } +#endif +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgr.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgr.cs.meta new file mode 100644 index 000000000..7eae806a0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgr.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9a83408fcc9044c4fbc7e5d09a369ab6 +timeCreated: 1503395115 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgr.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgrBase.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgrBase.cs new file mode 100644 index 000000000..76f6ceca5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgrBase.cs @@ -0,0 +1,747 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System; +using UnityEngine.SceneManagement; + +namespace ES3Internal +{ + [System.Serializable] + [DisallowMultipleComponent] + public abstract class ES3ReferenceMgrBase : MonoBehaviour + { + internal object _lock = new object(); + + public const string referencePropertyName = "_ES3Ref"; + private static ES3ReferenceMgrBase _current = null; + private static HashSet mgrs = new HashSet(); +#if UNITY_EDITOR + protected static bool isEnteringPlayMode = false; + static readonly HideFlags[] invalidHideFlags = new HideFlags[] { HideFlags.DontSave, HideFlags.DontSaveInBuild, HideFlags.DontSaveInEditor, HideFlags.HideAndDontSave }; +#endif + +#if !UNITY_EDITOR + [NonSerialized] +#endif + public List excludeObjects = new List(); + + private static System.Random rng; + + [HideInInspector] + public bool openPrefabs = false; // Whether the prefab list should be open in the Editor. + + public List prefabs = new List(); + + public static ES3ReferenceMgrBase Current + { + get + { + // If the reference manager hasn't been assigned, or we've got a reference to a manager in a different scene which isn't marked as DontDestroyOnLoad, look for this scene's manager. + if (_current == null /*|| (_current.gameObject.scene.buildIndex != -1 && _current.gameObject.scene != SceneManager.GetActiveScene())*/) + { + ES3ReferenceMgrBase mgr = GetManagerFromScene(SceneManager.GetActiveScene()); + if (mgr != null) + mgrs.Add(_current = mgr); + } + return _current; + } + } + + public static ES3ReferenceMgrBase GetManagerFromScene(Scene scene, bool getAnyManagerIfNotInScene = true) + { + // This has been removed as isLoaded is false during the initial Awake(). + /*if (!scene.isLoaded) + return null;*/ + + // If this is a valid scene, search it for the manager. + if (scene.IsValid()) + { + // Check whether the mgr is already in the mgr list. + foreach (var addedMgr in mgrs) + if (addedMgr != null && addedMgr.gameObject.scene == scene) + return addedMgr; + + GameObject[] roots; + try + { + roots = scene.GetRootGameObjects(); + } + catch + { + return null; + } + + // First, look for Easy Save 3 Manager in the top-level. + foreach (var root in roots) + { + if (root.name == "Easy Save 3 Manager") + { + var mgr = root.GetComponent(); + if(mgr != null) + return mgr; + } + } + + // If the user has moved or renamed the Easy Save 3 Manager, we need to perform a deep search. + foreach (var root in roots) + { + var mgr = root.GetComponentInChildren(); + if(mgr != null) + return mgr; + } + } + + // If we can't find a manager in this scene (for example we're in DontDestroyOnLoad), find a manager in any scene. + if (getAnyManagerIfNotInScene) + { + for (int i = 0; i < SceneManager.sceneCount; i++) + { + var loadedScene = SceneManager.GetSceneAt(i); + + if (loadedScene != null && loadedScene != scene && loadedScene.IsValid()) + { + var mgr = GetManagerFromScene(loadedScene, false); + if (mgr != null) + { + ES3Debug.LogWarning($"The reference you're trying to save does not exist in any scene, or the scene it belongs to does not contain an Easy Save 3 Manager. Using the reference manager from scene {loadedScene.name} instead. This may cause unexpected behaviour or leak memory in some situations."); + return mgr; + } + } + } + } + return null; + } + + public bool IsInitialised { get { return idRef.Count > 0; } } + + [SerializeField] + public ES3IdRefDictionary idRef = new ES3IdRefDictionary(); + private ES3RefIdDictionary _refId = null; + + public ES3RefIdDictionary refId + { + get + { + if (_refId == null) + { + _refId = new ES3RefIdDictionary(); + // Populate the reverse dictionary with the items from the normal dictionary. + foreach (var kvp in idRef) + if (kvp.Value != null) + _refId[kvp.Value] = kvp.Key; + } + return _refId; + } + set + { + _refId = value; + } + } + + public ES3GlobalReferences GlobalReferences + { + get + { + return ES3GlobalReferences.Instance; + } + } + + // Reset static variables to handle disabled domain reloading. + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + private static void Init() + { + _current = null; + mgrs = new HashSet(); +#if UNITY_EDITOR + isEnteringPlayMode = false; +#endif + rng = null; + } + + internal void Awake() + { + if (_current != null && _current != this) + { + var existing = _current; + + /* We intentionally use Current rather than _current here, as _current may contain a reference to a manager in another scene, + * but Current only returns the Manager for the active scene. */ + if (Current != null) + { + RemoveNullValues(); + + //existing.Merge(this); + //Destroy(this); + _current = existing; // Undo the call to Current, which may have set it to NULL. + } + } + else + _current = this; + mgrs.Add(this); + } + + private void OnDestroy() + { + if (_current == this) + _current = null; + mgrs.Remove(this); + } + + // Merges two managers, not allowing any clashes of IDs + public void Merge(ES3ReferenceMgrBase otherMgr) + { + foreach (var kvp in otherMgr.idRef) + Add(kvp.Value, kvp.Key); + } + + public long Get(UnityEngine.Object obj) + { + if (!mgrs.Contains(this)) + mgrs.Add(this); + + foreach (var mgr in mgrs) + { + if (mgr == null) + continue; + + if (obj == null) + return -1; + + long id; + if (mgr.refId.TryGetValue(obj, out id)) + return id; + } + return -1; + } + + internal UnityEngine.Object Get(long id, Type type, bool suppressWarnings = false) + { + if (!mgrs.Contains(this)) + mgrs.Add(this); + + foreach (var mgr in mgrs) + { + if (mgr == null) + continue; + + if (id == -1) + return null; + + UnityEngine.Object obj; + if (mgr.idRef.TryGetValue(id, out obj)) + { + if (obj == null) // If obj has been marked as destroyed but not yet destroyed, don't return it. + return null; + return obj; + } + } + + if (GlobalReferences != null) + { + var globalRef = GlobalReferences.Get(id); + if (globalRef != null) + return globalRef; + } + + if (type != null) + ES3Debug.LogWarning("Reference for " + type + " with ID " + id + " could not be found in Easy Save's reference manager. See the Saving and Loading References guide for more information.", this); + else + ES3Debug.LogWarning("Reference with ID " + id + " could not be found in Easy Save's reference manager. See the Saving and Loading References guide for more information.", this); + + return null; + } + + public UnityEngine.Object Get(long id, bool suppressWarnings = false) + { + return Get(id, null, suppressWarnings); + } + + public ES3Prefab GetPrefab(long id, bool suppressWarnings = false) + { + if (!mgrs.Contains(this)) + mgrs.Add(this); + + foreach (var mgr in mgrs) + { + if (mgr == null) + continue; + + foreach (var prefab in mgr.prefabs) + if (prefab != null && prefab.prefabId == id) + return prefab; + } + if (!suppressWarnings) + ES3Debug.LogWarning("Prefab with ID " + id + " could not be found in Easy Save's reference manager. Try pressing the Refresh References button on the ES3ReferenceMgr Component of the Easy Save 3 Manager in your scene, or exit play mode and right-click the prefab and select Easy Save 3 > Add Reference(s) to Manager.", this); + return null; + } + + public long GetPrefab(ES3Prefab prefabToFind, bool suppressWarnings = false) + { + if (!mgrs.Contains(this)) + mgrs.Add(this); + + foreach (var mgr in mgrs) + { + if (mgr == null) + continue; + + foreach (var prefab in prefabs) + if (prefab == prefabToFind) + return prefab.prefabId; + } + if (!suppressWarnings) + ES3Debug.LogWarning("Prefab with name " + prefabToFind.name + " could not be found in Easy Save's reference manager. Try pressing the Refresh References button on the ES3ReferenceMgr Component of the Easy Save 3 Manager in your scene, or exit play mode and right-click the prefab and select Easy Save 3 > Add Reference(s) to Manager.", prefabToFind); + return -1; + } + + public long Add(UnityEngine.Object obj) + { + if (obj == null) + return -1; + + if (!CanBeSaved(obj)) + return -1; + + long id; + // If it already exists in the list, do nothing. + if (refId.TryGetValue(obj, out id)) + return id; + + if (GlobalReferences != null) + { + id = GlobalReferences.GetOrAdd(obj); + if (id != -1) + { + Add(obj, id); + return id; + } + } + + lock (_lock) + { + // Add the reference to the Dictionary. + id = GetNewRefID(); + return Add(obj, id); + } + } + + public long Add(UnityEngine.Object obj, long id) + { + if (obj == null) + return -1; + + if (!CanBeSaved(obj)) + return -1; + + // If the ID is -1, auto-generate an ID. + if (id == -1) + id = GetNewRefID(); + // Add the reference to the Dictionary. + lock (_lock) + { + idRef[id] = obj; + if (obj != null) + refId[obj] = id; + } + return id; + } + + public bool AddPrefab(ES3Prefab prefab) + { + if (!prefabs.Contains(prefab)) + { + prefabs.Add(prefab); + return true; + } + return false; + } + + public void Remove(UnityEngine.Object obj) + { + if (!mgrs.Contains(this)) + mgrs.Add(this); + + foreach (var mgr in mgrs) + { + if (mgr == null) + continue; + + // Only remove from this manager if we're in the Editor. + if (!Application.isPlaying && mgr != this) + continue; + + lock (mgr._lock) + { + mgr.refId.Remove(obj); + // There may be multiple references with the same ID, so remove them all. + foreach (var item in mgr.idRef.Where(kvp => kvp.Value == obj).ToList()) + mgr.idRef.Remove(item.Key); + } + } + } + + public void Remove(long referenceID) + { + foreach (var mgr in mgrs) + { + if (mgr == null) + continue; + + lock (mgr._lock) + { + mgr.idRef.Remove(referenceID); + // There may be multiple references with the same ID, so remove them all. + foreach (var item in mgr.refId.Where(kvp => kvp.Value == referenceID).ToList()) + mgr.refId.Remove(item.Key); + } + } + } + + public void RemoveNullValues() + { + var nullKeys = idRef.Where(pair => pair.Value == null).Select(pair => pair.Key).ToList(); + foreach (var key in nullKeys) + idRef.Remove(key); + } + + public void RemoveNullOrInvalidValues() + { + var nullKeys = idRef.Where(pair => pair.Value == null || !CanBeSaved(pair.Value) || excludeObjects.Contains(pair.Value)).Select(pair => pair.Key).ToList(); + foreach (var key in nullKeys) + idRef.Remove(key); + + if (GlobalReferences != null) + GlobalReferences.RemoveInvalidKeys(); + } + + public void Clear() + { + lock (_lock) + { + refId.Clear(); + idRef.Clear(); + } + } + + public bool Contains(UnityEngine.Object obj) + { + return refId.ContainsKey(obj); + } + + public bool Contains(long referenceID) + { + return idRef.ContainsKey(referenceID); + } + + public void ChangeId(long oldId, long newId) + { + idRef.ChangeKey(oldId, newId); + // Empty the refId so it has to be refreshed. + refId = null; + } + + internal static long GetNewRefID() + { + if (rng == null) + rng = new System.Random(); + + byte[] buf = new byte[8]; + rng.NextBytes(buf); + long longRand = BitConverter.ToInt64(buf, 0); + + return (System.Math.Abs(longRand % (long.MaxValue - 0)) + 0); + } + + /*#if UNITY_EDITOR + public static HashSet CollectDependenciesLegacy(UnityEngine.Object obj, HashSet dependencies = null, int depth = int.MinValue) + { + return CollectDependenciesLegacy(new UnityEngine.Object[] { obj }, dependencies, depth); + } + + + //Collects all top-level dependencies of an object. + //For GameObjects, it will traverse all children. + //For Components or ScriptableObjects, it will get all serialisable UnityEngine.Object fields/properties as dependencies. + public static HashSet CollectDependenciesLegacy(UnityEngine.Object[] objs, HashSet dependencies = null, int depth = int.MinValue) + { + if (depth == int.MinValue) + depth = ES3Settings.defaultSettingsScriptableObject.collectDependenciesDepth; + + if (depth < 0) + return dependencies; + + if (dependencies == null) + dependencies = new HashSet(); + + foreach (var obj in objs) + { + if (obj == null) + continue; + + var type = obj.GetType(); + + // Skip types which don't need processing + if (type == typeof(ES3ReferenceMgr) || type == typeof(ES3AutoSaveMgr) || type == typeof(ES3AutoSave) || type == typeof(ES3InspectorInfo)) + continue; + + // Add the prefab to the manager but don't process it. We'll use this to work out what prefabs to add to the prefabs list later. + if (type == typeof(ES3Prefab)) + { + dependencies.Add(obj); + continue; + } + + // If it's a GameObject, get the GameObject's Components and collect their dependencies. + if (type == typeof(GameObject)) + { + var go = (GameObject)obj; + // If we've not already processed this GameObject ... + if (dependencies.Add(go)) + { + // Get the dependencies of each Component in the GameObject. + CollectDependenciesLegacy(go.GetComponents(), dependencies, depth - 1); + // Get the dependencies of each child in the GameObject. + foreach (Transform child in go.transform) + CollectDependenciesLegacy(child.gameObject, dependencies, depth); // Don't decrement child, as we consider this a top-level object. + } + } + // Else if it's a Component or ScriptableObject, add the values of any UnityEngine.Object fields as dependencies. + else + CollectDependenciesFromFieldsLegacy(obj, dependencies, depth - 1); + } + + return dependencies; + } + + private static void CollectDependenciesFromFieldsLegacy(UnityEngine.Object obj, HashSet dependencies, int depth) + { + // If we've already collected dependencies for this, do nothing. + if (!dependencies.Add(obj)) + return; + + if (depth == int.MinValue) + depth = ES3Settings.defaultSettingsScriptableObject.collectDependenciesDepth; + + if (depth < 0) + return; + + var type = obj.GetType(); + + if (isEnteringPlayMode && type == typeof(UnityEngine.UI.Text)) + return; + + try + { + // SerializedObject is expensive, so for known classes we manually gather references. + + if (type == typeof(Animator) || obj is Transform || type == typeof(CanvasRenderer) || type == typeof(Mesh) || type == typeof(AudioClip) || type == typeof(Rigidbody) || obj is HorizontalOrVerticalLayoutGroup) + return; + + if(obj is Texture) + { + // This ensures that Sprites which are children of the Texture are also added. In the Editor you would otherwise need to expand the Texture to add the Sprite. + foreach(var dependency in UnityEditor.AssetDatabase.LoadAllAssetsAtPath(UnityEditor.AssetDatabase.GetAssetPath(obj))) + if (dependency != obj) + dependencies.Add(dependency); + } + + if (obj is Graphic) + { + var m = (Graphic)obj; + dependencies.Add(m.material); + dependencies.Add(m.defaultMaterial); + dependencies.Add(m.mainTexture); + + if (type == typeof(Text)) + { + var text = (Text)obj; + dependencies.Add(text.font); + } + else if (type == typeof(Image)) + { + var img = (Image)obj; + dependencies.Add(img.sprite); + } + return; + } + + if (type == typeof(Mesh)) + { + if (UnityEditor.AssetDatabase.Contains(obj)) + dependencies.Add(obj); + return; + } + + if (type == typeof(Material)) + { + var material = (Material)obj; + var shader = material.shader; + if (shader != null) + { + dependencies.Add(material.shader); + + #if UNITY_2019_3_OR_NEWER + for (int i = 0; i < shader.GetPropertyCount(); i++) + if (shader.GetPropertyType(i) == UnityEngine.Rendering.ShaderPropertyType.Texture) + dependencies.Add(material.GetTexture(shader.GetPropertyName(i))); + } + #endif + + return; + } + + if (type == typeof(MeshFilter)) + { + dependencies.Add(((MeshFilter)obj).sharedMesh); + return; + } + + if (type == typeof(MeshCollider)) + { + var mc = (MeshCollider)obj; + dependencies.Add(mc.sharedMesh); + dependencies.Add(mc.sharedMaterial); + dependencies.Add(mc.attachedRigidbody); + return; + } + + if (type == typeof(Camera)) + { + var c = (Camera)obj; + dependencies.Add(c.targetTexture); + return; + } + + if (type == typeof(SkinnedMeshRenderer)) + dependencies.Add(((SkinnedMeshRenderer)obj).sharedMesh); // Don't return. Let this fall through to the if(obj is renderer) call. + else if (type == typeof(SpriteRenderer)) + dependencies.Add(((SpriteRenderer)obj).sprite); // Don't return. Let this fall through to the if(obj is renderer) call. + else if (type == typeof(ParticleSystemRenderer)) + dependencies.Add(((ParticleSystemRenderer)obj).mesh); // Don't return. Let this fall through to the if(obj is renderer) call. + + if (obj is Renderer) + { + var renderer = (Renderer)obj; + foreach (var material in renderer.sharedMaterials) + CollectDependenciesFromFieldsLegacy(material, dependencies, depth - 1); + return; + } + } + catch { } + + var so = new UnityEditor.SerializedObject(obj); + if (so == null) + return; + + var property = so.GetIterator(); + if (property == null) + return; + + // Iterate through each of this object's properties. + while (property.NextVisible(true)) + { + try + { + // If it's an array which contains UnityEngine.Objects, add them as dependencies. + if (property.isArray && property.propertyType != UnityEditor.SerializedPropertyType.String) + { + for (int i = 0; i < property.arraySize; i++) + { + var element = property.GetArrayElementAtIndex(i); + + // If the array contains UnityEngine.Object types, add them to the dependencies. + if (element.propertyType == UnityEditor.SerializedPropertyType.ObjectReference) + { + var elementValue = element.objectReferenceValue; + var elementType = elementValue.GetType(); + + // If it's a GameObject, use CollectDependencies so that Components are also added. + if (elementType == typeof(GameObject)) + CollectDependenciesLegacy(elementValue, dependencies, depth - 1); + else + CollectDependenciesFromFieldsLegacy(elementValue, dependencies, depth - 1); + } + // Otherwise this array does not contain UnityEngine.Object types, so we should stop. + else + break; + } + } + // Else if it's a normal UnityEngine.Object field, add it. + else if (property.propertyType == UnityEditor.SerializedPropertyType.ObjectReference) + { + var propertyValue = property.objectReferenceValue; + if (propertyValue == null) + continue; + + // If it's a GameObject, use CollectDependencies so that Components are also added. + if (propertyValue.GetType() == typeof(GameObject)) + CollectDependenciesLegacy(propertyValue, dependencies, depth - 1); + else + CollectDependenciesFromFieldsLegacy(propertyValue, dependencies, depth - 1); + } + } + catch { } + } + } + + // Called in the Editor when this Component is added. + private void Reset() + { + // Ensure that Component can only be added by going to Assets > Easy Save 3 > Add Manager to Scene. + if (gameObject.name != "Easy Save 3 Manager") + { + UnityEditor.EditorUtility.DisplayDialog("Cannot add ES3ReferenceMgr directly", "Please go to 'Tools > Easy Save 3 > Add Manager to Scene' to add an Easy Save 3 Manager to your scene.", "Ok"); + DestroyImmediate(this); + } + } + #endif*/ + + internal static bool CanBeSaved(UnityEngine.Object obj) + { +#if UNITY_EDITOR + if (obj == null) + return true; + + foreach (var flag in invalidHideFlags) + if ((obj.hideFlags & flag) != 0 && obj.hideFlags != HideFlags.HideInHierarchy && obj.hideFlags != HideFlags.HideInInspector && obj.hideFlags != HideFlags.NotEditable) + if (!(obj is Mesh || obj is Material)) + return false; + + // Exclude the Easy Save 3 Manager, and all components attached to it. + if (obj.name == "Easy Save 3 Manager") + return false; +#endif + return true; + } + } + + [System.Serializable] + public class ES3IdRefDictionary : ES3SerializableDictionary + { + protected override bool KeysAreEqual(long a, long b) + { + return a == b; + } + + protected override bool ValuesAreEqual(UnityEngine.Object a, UnityEngine.Object b) + { + return a == b; + } + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + [System.Serializable] + public class ES3RefIdDictionary : ES3SerializableDictionary + { + protected override bool KeysAreEqual(UnityEngine.Object a, UnityEngine.Object b) + { + return a == b; + } + + protected override bool ValuesAreEqual(long a, long b) + { + return a == b; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgrBase.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgrBase.cs.meta new file mode 100644 index 000000000..6446fca3c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgrBase.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f659e3ad478b6470d9744732042e7515 +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3ReferenceMgrBase.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Reflection.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3Reflection.cs new file mode 100644 index 000000000..0efe48608 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Reflection.cs @@ -0,0 +1,794 @@ +using System.Collections; +using System.Collections.Generic; +using System; +using System.Linq; +using System.Reflection; +using System.ComponentModel; +using UnityEngine; +using ES3Types; + +namespace ES3Internal +{ + public static class ES3Reflection + { + public const string memberFieldPrefix = "m_"; + public const string componentTagFieldName = "tag"; + public const string componentNameFieldName = "name"; + public static readonly string[] excludedPropertyNames = new string[] { "runInEditMode", "useGUILayout", "hideFlags" }; + + public static readonly Type serializableAttributeType = typeof(System.SerializableAttribute); + public static readonly Type serializeFieldAttributeType = typeof(SerializeField); + public static readonly Type obsoleteAttributeType = typeof(System.ObsoleteAttribute); + public static readonly Type nonSerializedAttributeType = typeof(System.NonSerializedAttribute); + public static readonly Type es3SerializableAttributeType = typeof(ES3Serializable); + public static readonly Type es3NonSerializableAttributeType = typeof(ES3NonSerializable); + + public static Type[] EmptyTypes = new Type[0]; + + private static Assembly[] _assemblies = null; + private static Assembly[] Assemblies + { + get + { + + if (_assemblies == null) + { + var assemblyNames = new ES3Settings().assemblyNames; + var assemblyList = new List(); + + /* We only use a try/catch block for UWP because exceptions can be disabled on some other platforms (e.g. WebGL), but the non-try/catch method doesn't work on UWP */ +#if NETFX_CORE + for (int i = 0; i < assemblyNames.Length; i++) + { + try + { + var assembly = Assembly.Load(new AssemblyName(assemblyNames[i])); + if (assembly != null) + assemblyList.Add(assembly); + } + catch { } + } + +#else + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + // This try/catch block is here to catch errors such as assemblies containing double-byte characters in their path. + // This obviously won't work if exceptions are disabled. + try + { + if (assemblyNames.Contains(assembly.GetName().Name)) + { + assemblyList.Add(assembly); + } + } + catch { } + } +#endif + _assemblies = assemblyList.ToArray(); + } + return _assemblies; + } + } + + /* + * Gets the element type of a collection or array. + * Returns null if type is not a collection type. + */ + public static Type[] GetElementTypes(Type type) + { + if (IsGenericType(type)) + return ES3Reflection.GetGenericArguments(type); + else if (type.IsArray) + return new Type[] { ES3Reflection.GetElementType(type) }; + else + return null; + } + + public static List GetSerializableFields(Type type, List serializableFields = null, bool safe = true, string[] memberNames = null, BindingFlags bindings = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly) + { + if (type == null) + return new List(); + + var fields = type.GetFields(bindings); + + if (serializableFields == null) + serializableFields = new List(); + + foreach (var field in fields) + { + var fieldName = field.Name; + + // If a members array was provided as a parameter, only include the field if it's in the array. + if (memberNames != null) + if (!memberNames.Contains(fieldName)) + continue; + + var fieldType = field.FieldType; + + if (AttributeIsDefined(field, es3SerializableAttributeType)) + { + serializableFields.Add(field); + continue; + } + + if (AttributeIsDefined(field, es3NonSerializableAttributeType)) + continue; + + if (safe) + { + // If the field is private, only serialize it if it's explicitly marked as serializable. + if (!field.IsPublic && !AttributeIsDefined(field, serializeFieldAttributeType)) + continue; + } + + // Exclude const or readonly fields. + if (field.IsLiteral || field.IsInitOnly) + continue; + + // Don't store fields whose type is the same as the class the field is housed in unless it's stored by reference (to prevent cyclic references) + if (fieldType == type && !IsAssignableFrom(typeof(UnityEngine.Object), fieldType)) + continue; + + // If property is marked as obsolete or non-serialized, don't serialize it. + if (AttributeIsDefined(field, nonSerializedAttributeType) || AttributeIsDefined(field, obsoleteAttributeType)) + continue; + + if (!TypeIsSerializable(field.FieldType)) + continue; + + // Don't serialize member fields. + if (safe && fieldName.StartsWith(memberFieldPrefix) && field.DeclaringType.Namespace != null && field.DeclaringType.Namespace.Contains("UnityEngine")) + continue; + + serializableFields.Add(field); + } + + var baseType = BaseType(type); + if (baseType != null && baseType != typeof(System.Object) && baseType != typeof(UnityEngine.Object)) + GetSerializableFields(BaseType(type), serializableFields, safe, memberNames); + + return serializableFields; + } + + public static List GetSerializableProperties(Type type, List serializableProperties = null, bool safe = true, string[] memberNames = null, BindingFlags bindings = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly) + { + bool isComponent = IsAssignableFrom(typeof(UnityEngine.Component), type); + + // Only get private properties if we're not getting properties safely. + if (!safe) + bindings = bindings | BindingFlags.NonPublic; + + var properties = type.GetProperties(bindings); + + if (serializableProperties == null) + serializableProperties = new List(); + + foreach (var p in properties) + { + if (AttributeIsDefined(p, es3SerializableAttributeType)) + { + serializableProperties.Add(p); + continue; + } + + if (AttributeIsDefined(p, es3NonSerializableAttributeType)) + continue; + + var propertyName = p.Name; + + if (excludedPropertyNames.Contains(propertyName)) + continue; + + // If a members array was provided as a parameter, only include the property if it's in the array. + if (memberNames != null) + if (!memberNames.Contains(propertyName)) + continue; + + if (safe) + { + // If safe serialization is enabled, only get properties which are explicitly marked as serializable. + if (!AttributeIsDefined(p, serializeFieldAttributeType) && !AttributeIsDefined(p, es3SerializableAttributeType)) + continue; + } + + var propertyType = p.PropertyType; + + // Don't store properties whose type is the same as the class the property is housed in unless it's stored by reference (to prevent cyclic references) + if (propertyType == type && !IsAssignableFrom(typeof(UnityEngine.Object), propertyType)) + continue; + + if (!p.CanRead || !p.CanWrite) + continue; + + // Only support properties with indexing if they're an array. + if (p.GetIndexParameters().Length != 0 && !propertyType.IsArray) + continue; + + // Check that the type of the property is one which we can serialize. + // Also check whether an ES3Type exists for it. + if (!TypeIsSerializable(propertyType)) + continue; + + // Ignore certain properties on components. + if (isComponent) + { + // Ignore properties which are accessors for GameObject fields. + if (propertyName == componentTagFieldName || propertyName == componentNameFieldName) + continue; + } + + // If property is marked as obsolete or non-serialized, don't serialize it. + if (AttributeIsDefined(p, obsoleteAttributeType) || AttributeIsDefined(p, nonSerializedAttributeType)) + continue; + + serializableProperties.Add(p); + } + + var baseType = BaseType(type); + if (baseType != null && baseType != typeof(System.Object)) + GetSerializableProperties(baseType, serializableProperties, safe, memberNames); + + return serializableProperties; + } + + public static bool TypeIsSerializable(Type type) + { + if (type == null) + return false; + + if (AttributeIsDefined(type, es3NonSerializableAttributeType)) + return false; + + if (IsPrimitive(type) || IsValueType(type) || IsAssignableFrom(typeof(UnityEngine.Component), type) || IsAssignableFrom(typeof(UnityEngine.ScriptableObject), type)) + return true; + + var es3Type = ES3TypeMgr.GetOrCreateES3Type(type, false); + + if (es3Type != null && !es3Type.isUnsupported) + return true; + + if (TypeIsArray(type)) + { + if (TypeIsSerializable(type.GetElementType())) + return true; + return false; + } + + var genericArgs = type.GetGenericArguments(); + for (int i = 0; i < genericArgs.Length; i++) + if (!TypeIsSerializable(genericArgs[i])) + return false; + + /*if (HasParameterlessConstructor(type)) + return true;*/ + return false; + } + + public static System.Object CreateInstance(Type type) + { + if (IsAssignableFrom(typeof(UnityEngine.Component), type)) + return ES3ComponentType.CreateComponent(type); + else if (IsAssignableFrom(typeof(ScriptableObject), type)) + return ScriptableObject.CreateInstance(type); + else if (ES3Reflection.HasParameterlessConstructor(type)) + return Activator.CreateInstance(type); + else + { +#if NETFX_CORE + throw new NotSupportedException($"Cannot create an instance of {type} because it does not have a parameterless constructor, which is required on Universal Windows platform."); +#else + return System.Runtime.Serialization.FormatterServices.GetUninitializedObject(type); +#endif + } + } + + public static System.Object CreateInstance(Type type, params object[] args) + { + if (IsAssignableFrom(typeof(UnityEngine.Component), type)) + return ES3ComponentType.CreateComponent(type); + else if (IsAssignableFrom(typeof(ScriptableObject), type)) + return ScriptableObject.CreateInstance(type); + return Activator.CreateInstance(type, args); + } + + public static Array ArrayCreateInstance(Type type, int length) + { + return Array.CreateInstance(type, new int[] { length }); + } + + public static Array ArrayCreateInstance(Type type, int[] dimensions) + { + return Array.CreateInstance(type, dimensions); + } + + public static Type MakeGenericType(Type type, Type genericParam) + { + return type.MakeGenericType(genericParam); + } + + public static ES3ReflectedMember[] GetSerializableMembers(Type type, bool safe = true, string[] memberNames = null) + { + if (type == null) + return new ES3ReflectedMember[0]; + + var fieldInfos = GetSerializableFields(type, new List(), safe, memberNames); + var propertyInfos = GetSerializableProperties(type, new List(), safe, memberNames); + var reflectedFields = new ES3ReflectedMember[fieldInfos.Count + propertyInfos.Count]; + + for (int i = 0; i < fieldInfos.Count; i++) + reflectedFields[i] = new ES3ReflectedMember(fieldInfos[i]); + for (int i = 0; i < propertyInfos.Count; i++) + reflectedFields[i + fieldInfos.Count] = new ES3ReflectedMember(propertyInfos[i]); + + return reflectedFields; + } + + public static ES3ReflectedMember GetES3ReflectedProperty(Type type, string propertyName) + { + var propertyInfo = ES3Reflection.GetProperty(type, propertyName); + return new ES3ReflectedMember(propertyInfo); + } + + public static ES3ReflectedMember GetES3ReflectedMember(Type type, string fieldName) + { + var fieldInfo = ES3Reflection.GetField(type, fieldName); + return new ES3ReflectedMember(fieldInfo); + } + + /* + * Finds all classes of a specific type, and then returns an instance of each. + * Ignores classes which can't be instantiated (i.e. abstract classes, those without parameterless constructors). + */ + public static IList GetInstances() + { + var instances = new List(); + foreach (var assembly in Assemblies) + foreach (var type in assembly.GetTypes()) + if (IsAssignableFrom(typeof(T), type) && ES3Reflection.HasParameterlessConstructor(type) && !ES3Reflection.IsAbstract(type)) + instances.Add((T)Activator.CreateInstance(type)); + return instances; + } + + public static IList GetDerivedTypes(Type derivedType) + { + return + ( + from assembly in Assemblies + from type in assembly.GetTypes() + where IsAssignableFrom(derivedType, type) + select type + ).ToList(); + } + + public static bool IsAssignableFrom(Type a, Type b) + { + return a.IsAssignableFrom(b); + } + + public static Type GetGenericTypeDefinition(Type type) + { + return type.GetGenericTypeDefinition(); + } + + public static Type[] GetGenericArguments(Type type) + { + return type.GetGenericArguments(); + } + + public static int GetArrayRank(Type type) + { + return type.GetArrayRank(); + } + + public static string GetAssemblyQualifiedName(Type type) + { + return type.AssemblyQualifiedName; + } + + public static ES3ReflectedMethod GetMethod(Type type, string methodName, Type[] genericParameters, Type[] parameterTypes) + { + return new ES3ReflectedMethod(type, methodName, genericParameters, parameterTypes); + } + + public static bool TypeIsArray(Type type) + { + return type.IsArray; + } + + public static Type GetElementType(Type type) + { + return type.GetElementType(); + } + +#if NETFX_CORE + public static bool IsAbstract(Type type) + { + return type.GetTypeInfo().IsAbstract; + } + + public static bool IsInterface(Type type) + { + return type.GetTypeInfo().IsInterface; + } + + public static bool IsGenericType(Type type) + { + return type.GetTypeInfo().IsGenericType; + } + + public static bool IsValueType(Type type) + { + return type.GetTypeInfo().IsValueType; + } + + public static bool IsEnum(Type type) + { + return type.GetTypeInfo().IsEnum; + } + + public static bool HasParameterlessConstructor(Type type) + { + return GetParameterlessConstructor(type) != null; + } + + public static ConstructorInfo GetParameterlessConstructor(Type type) + { + foreach (var cInfo in type.GetTypeInfo().DeclaredConstructors) + if (!cInfo.IsStatic && cInfo.GetParameters().Length == 0) + return cInfo; + return null; + } + + public static string GetShortAssemblyQualifiedName(Type type) + { + if (IsPrimitive (type)) + return type.ToString (); + return type.FullName + "," + type.GetTypeInfo().Assembly.GetName().Name; + } + + public static PropertyInfo GetProperty(Type type, string propertyName) + { + var property = type.GetTypeInfo().GetDeclaredProperty(propertyName); + if (property == null && type.BaseType != typeof(object)) + return GetProperty(type.BaseType, propertyName); + return property; + } + + public static FieldInfo GetField(Type type, string fieldName) + { + return type.GetTypeInfo().GetDeclaredField(fieldName); + } + + public static MethodInfo[] GetMethods(Type type, string methodName) + { + return type.GetTypeInfo().GetDeclaredMethods(methodName); + } + + public static bool IsPrimitive(Type type) + { + return (type.GetTypeInfo().IsPrimitive || type == typeof(string) || type == typeof(decimal)); + } + + public static bool AttributeIsDefined(MemberInfo info, Type attributeType) + { + var attributes = info.GetCustomAttributes(attributeType, true); + foreach(var attribute in attributes) + return true; + return false; + } + + public static bool AttributeIsDefined(Type type, Type attributeType) + { + var attributes = type.GetTypeInfo().GetCustomAttributes(attributeType, true); + foreach(var attribute in attributes) + return true; + return false; + } + + public static bool ImplementsInterface(Type type, Type interfaceType) + { + return type.GetTypeInfo().ImplementedInterfaces.Contains(interfaceType); + } + + public static Type BaseType(Type type) + { + return type.GetTypeInfo().BaseType; + } +#else + public static bool IsAbstract(Type type) + { + return type.IsAbstract; + } + + public static bool IsInterface(Type type) + { + return type.IsInterface; + } + + public static bool IsGenericType(Type type) + { + return type.IsGenericType; + } + + public static bool IsValueType(Type type) + { + return type.IsValueType; + } + + public static bool IsEnum(Type type) + { + return type.IsEnum; + } + + public static bool HasParameterlessConstructor(Type type) + { + if (IsValueType(type) || GetParameterlessConstructor(type) != null) + return true; + return false; + } + + public static ConstructorInfo GetParameterlessConstructor(Type type) + { + var constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + + foreach (var constructor in constructors) + if (constructor.GetParameters().Length == 0) + return constructor; + return null; + } + + public static string GetShortAssemblyQualifiedName(Type type) + { + if (IsPrimitive(type)) + return type.ToString(); + return type.FullName + "," + type.Assembly.GetName().Name; + } + + public static PropertyInfo GetProperty(Type type, string propertyName) + { + var property = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (property == null && BaseType(type) != typeof(object)) + return GetProperty(BaseType(type), propertyName); + return property; + } + + public static FieldInfo GetField(Type type, string fieldName) + { + var field = type.GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (field == null && BaseType(type) != typeof(object)) + return GetField(BaseType(type), fieldName); + return field; + } + + public static MethodInfo[] GetMethods(Type type, string methodName) + { + return type.GetMethods().Where(t => t.Name == methodName).ToArray(); + } + + public static bool IsPrimitive(Type type) + { + return (type.IsPrimitive || type == typeof(string) || type == typeof(decimal)); + } + + public static bool AttributeIsDefined(MemberInfo info, Type attributeType) + { + return Attribute.IsDefined(info, attributeType, true); + } + + public static bool AttributeIsDefined(Type type, Type attributeType) + { + return type.IsDefined(attributeType, true); + } + + public static bool ImplementsInterface(Type type, Type interfaceType) + { + return (type.GetInterface(interfaceType.Name) != null); + } + + public static Type BaseType(Type type) + { + return type.BaseType; + } + + public static Type GetType(string typeString) + { + switch (typeString) + { + case "bool": + return typeof(bool); + case "byte": + return typeof(byte); + case "sbyte": + return typeof(sbyte); + case "char": + return typeof(char); + case "decimal": + return typeof(decimal); + case "double": + return typeof(double); + case "float": + return typeof(float); + case "int": + return typeof(int); + case "uint": + return typeof(uint); + case "long": + return typeof(long); + case "ulong": + return typeof(ulong); + case "short": + return typeof(short); + case "ushort": + return typeof(ushort); + case "string": + return typeof(string); + case "Vector2": + return typeof(Vector2); + case "Vector3": + return typeof(Vector3); + case "Vector4": + return typeof(Vector4); + case "Color": + return typeof(Color); + case "Transform": + return typeof(Transform); + case "Component": + return typeof(UnityEngine.Component); + case "GameObject": + return typeof(GameObject); + case "MeshFilter": + return typeof(MeshFilter); + case "Material": + return typeof(Material); + case "Texture2D": + return typeof(Texture2D); + case "UnityEngine.Object": + return typeof(UnityEngine.Object); + case "System.Object": + return typeof(object); + default: + return Type.GetType(typeString); + } + } + + public static string GetTypeString(Type type) + { + if (type == typeof(bool)) + return "bool"; + else if (type == typeof(byte)) + return "byte"; + else if (type == typeof(sbyte)) + return "sbyte"; + else if (type == typeof(char)) + return "char"; + else if (type == typeof(decimal)) + return "decimal"; + else if (type == typeof(double)) + return "double"; + else if (type == typeof(float)) + return "float"; + else if (type == typeof(int)) + return "int"; + else if (type == typeof(uint)) + return "uint"; + else if (type == typeof(long)) + return "long"; + else if (type == typeof(ulong)) + return "ulong"; + else if (type == typeof(short)) + return "short"; + else if (type == typeof(ushort)) + return "ushort"; + else if (type == typeof(string)) + return "string"; + else if (type == typeof(Vector2)) + return "Vector2"; + else if (type == typeof(Vector3)) + return "Vector3"; + else if (type == typeof(Vector4)) + return "Vector4"; + else if (type == typeof(Color)) + return "Color"; + else if (type == typeof(Transform)) + return "Transform"; + else if (type == typeof(UnityEngine.Component)) + return "Component"; + else if (type == typeof(GameObject)) + return "GameObject"; + else if (type == typeof(MeshFilter)) + return "MeshFilter"; + else if (type == typeof(Material)) + return "Material"; + else if (type == typeof(Texture2D)) + return "Texture2D"; + else if (type == typeof(UnityEngine.Object)) + return "UnityEngine.Object"; + else if (type == typeof(object)) + return "System.Object"; + else + return GetShortAssemblyQualifiedName(type); + } +#endif + + /* + * Allows us to use FieldInfo and PropertyInfo interchangably. + */ + public struct ES3ReflectedMember + { + // The FieldInfo or PropertyInfo for this field. + private FieldInfo fieldInfo; + private PropertyInfo propertyInfo; + public bool isProperty; + + public bool IsNull { get { return fieldInfo == null && propertyInfo == null; } } + public string Name { get { return (isProperty ? propertyInfo.Name : fieldInfo.Name); } } + public Type MemberType { get { return (isProperty ? propertyInfo.PropertyType : fieldInfo.FieldType); } } + public bool IsPublic { get { return (isProperty ? (propertyInfo.GetGetMethod(true).IsPublic && propertyInfo.GetSetMethod(true).IsPublic) : fieldInfo.IsPublic); } } + public bool IsProtected { get { return (isProperty ? (propertyInfo.GetGetMethod(true).IsFamily) : fieldInfo.IsFamily); } } + public bool IsStatic { get { return (isProperty ? (propertyInfo.GetGetMethod(true).IsStatic) : fieldInfo.IsStatic); } } + + public ES3ReflectedMember(System.Object fieldPropertyInfo) + { + if (fieldPropertyInfo == null) + { + this.propertyInfo = null; + this.fieldInfo = null; + isProperty = false; + return; + } + + isProperty = ES3Reflection.IsAssignableFrom(typeof(PropertyInfo), fieldPropertyInfo.GetType()); + if (isProperty) + { + this.propertyInfo = (PropertyInfo)fieldPropertyInfo; + this.fieldInfo = null; + } + else + { + this.fieldInfo = (FieldInfo)fieldPropertyInfo; + this.propertyInfo = null; + } + } + + public void SetValue(System.Object obj, System.Object value) + { + if (isProperty) + propertyInfo.SetValue(obj, value, null); + else + fieldInfo.SetValue(obj, value); + } + + public System.Object GetValue(System.Object obj) + { + if (isProperty) + return propertyInfo.GetValue(obj, null); + else + return fieldInfo.GetValue(obj); + } + } + + public class ES3ReflectedMethod + { + private MethodInfo method; + + public ES3ReflectedMethod(Type type, string methodName, Type[] genericParameters, Type[] parameterTypes) + { + MethodInfo nonGenericMethod = type.GetMethod(methodName, parameterTypes); + this.method = nonGenericMethod.MakeGenericMethod(genericParameters); + } + + public ES3ReflectedMethod(Type type, string methodName, Type[] genericParameters, Type[] parameterTypes, BindingFlags bindingAttr) + { + MethodInfo nonGenericMethod = type.GetMethod(methodName, bindingAttr, null, parameterTypes, null); + this.method = nonGenericMethod.MakeGenericMethod(genericParameters); + } + + public object Invoke(object obj, object[] parameters = null) + { + return method.Invoke(obj, parameters); + } + } + + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Reflection.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3Reflection.cs.meta new file mode 100644 index 000000000..467ff5091 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Reflection.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 499c212fb9e3c410dacca179f55ba150 +timeCreated: 1499764821 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3Reflection.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3SerializableDictionary.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3SerializableDictionary.cs new file mode 100644 index 000000000..74a76a845 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3SerializableDictionary.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using System.Linq; + +namespace ES3Internal +{ + [System.Serializable] + public abstract class ES3SerializableDictionary : Dictionary, ISerializationCallbackReceiver + { + [SerializeField] + private List _Keys; + [SerializeField] + private List _Values; + + protected abstract bool KeysAreEqual(TKey a, TKey b); + protected abstract bool ValuesAreEqual(TVal a, TVal b); + + public void OnBeforeSerialize() + { + _Keys = new List(); + _Values = new List(); + foreach(KeyValuePair pair in this) + { + try + { + _Keys.Add(pair.Key); + _Values.Add(pair.Value); + } + catch { } + } + } + + // load dictionary from lists + public void OnAfterDeserialize() + { + // There are some situations where Unity will not get the serialized data correctly, returning null. + // In this case we don't want to change anything, otherwise we'll lose the data entirely. + if (_Keys == null || _Values == null) + return; + + if(_Keys.Count != _Values.Count) + throw new System.Exception(string.Format("Key count is different to value count after deserialising dictionary.")); + + this.Clear(); + + for (int i = 0; i < _Keys.Count; i++) + { + if (_Keys[i] != null) + { + try + { + this.Add(_Keys[i], _Values[i]); + } + catch { } + } + } + + _Keys = null; + _Values = null; + } + + public int RemoveNullValues() + { + var nullKeys = this.Where(pair => pair.Value == null) + .Select(pair => pair.Key) + .ToList(); + foreach (var nullKey in nullKeys) + Remove(nullKey); + return nullKeys.Count; + } + + // Changes the key of a value without changing it's position in the underlying Lists. + // Mainly used in the Editor where position might otherwise change while the user is editing it. + // Returns true if a change was made. + public bool ChangeKey(TKey oldKey, TKey newKey) + { + if(KeysAreEqual(oldKey, newKey)) + return false; + + var val = this [oldKey]; + Remove(oldKey); + this [newKey] = val; + return true; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3SerializableDictionary.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3SerializableDictionary.cs.meta new file mode 100644 index 000000000..a3f964ba0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3SerializableDictionary.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 681896bd0089c4f7296b3ecbd899f44d +timeCreated: 1519132287 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3SerializableDictionary.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Spreadsheet.cs b/Assets/Plugins/Easy Save 3/Scripts/ES3Spreadsheet.cs new file mode 100644 index 000000000..cd3c1cc0c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Spreadsheet.cs @@ -0,0 +1,307 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using System.IO; +using ES3Internal; + +#if UNITY_VISUAL_SCRIPTING +[Unity.VisualScripting.IncludeInSettings(true)] +#elif BOLT_VISUAL_SCRIPTING +[Ludiq.IncludeInSettings(true)] +#endif +public class ES3Spreadsheet +{ + private int cols = 0; + private int rows = 0; + private Dictionary cells = new Dictionary(); + + private const string QUOTE = "\""; + private const char QUOTE_CHAR = '"'; + private const char COMMA_CHAR = ','; + private const char NEWLINE_CHAR = '\n'; + private const string ESCAPED_QUOTE = "\"\""; + private static char[] CHARS_TO_ESCAPE = { ',', '"', '\n', ' ' }; + + public int ColumnCount + { + get{ return cols; } + } + + public int RowCount + { + get{ return rows; } + } + + public int GetColumnLength(int col) + { + if (col >= cols) + return 0; + + int maxRow = -1; + + foreach(var index in cells.Keys) + if (index.col == col && index.row > maxRow) + maxRow = index.row; + + return maxRow+1; + } + + public int GetRowLength(int row) + { + if (row >= rows) + return 0; + + int maxCol = -1; + + foreach (var index in cells.Keys) + if (index.row == row && index.col > maxCol) + maxCol = index.col; + + return maxCol + 1; + } + + public void SetCell(int col, int row, object value) + { + var type = value.GetType(); + + // If we're writing a string, add it without formatting. + if (type == typeof(string)) + { + SetCellString(col, row, (string)value); + return; + } + + var settings = new ES3Settings(); + if (ES3Reflection.IsPrimitive(type)) + SetCellString(col, row, value.ToString()); + else + SetCellString(col, row, settings.encoding.GetString(ES3.Serialize(value, ES3TypeMgr.GetOrCreateES3Type(type)))); + + // Expand the spreadsheet if necessary. + if (col >= cols) + cols = (col + 1); + if (row >= rows) + rows = (row + 1); + } + + private void SetCellString(int col, int row, string value) + { + cells [new Index (col, row)] = value; + + // Expand the spreadsheet if necessary. + if(col >= cols) + cols = (col+1); + if (row >= rows) + rows = (row + 1); + } + + + // Don't create non-generic version of this. Generic parameter is necessary as no type data is stored in the CSV file. + public T GetCell(int col, int row) + { + var val = GetCell(typeof(T), col, row); + + if (val == null) + return default(T); + return (T)val; + } + + public object GetCell(System.Type type, int col, int row) + { + string value; + + if (col >= cols || row >= rows) + throw new System.IndexOutOfRangeException("Cell (" + col + ", " + row + ") is out of bounds of spreadsheet (" + cols + ", " + rows + ")."); + + if (!cells.TryGetValue(new Index(col, row), out value) || value == null) + return null; + + // If we're loading a string, simply return the string value. + if (type == typeof(string)) + { + var str = (object)value; + return str; + } + + var settings = new ES3Settings(); + return ES3.Deserialize(ES3TypeMgr.GetOrCreateES3Type(type, true), settings.encoding.GetBytes(value), settings); + } + + public void Load(string filePath) + { + Load(new ES3Settings (filePath)); + } + + public void Load(string filePath, ES3Settings settings) + { + Load(new ES3Settings (filePath, settings)); + } + + public void Load(ES3Settings settings) + { + Load(ES3Stream.CreateStream(settings, ES3FileMode.Read), settings); + } + + public void LoadRaw(string str) + { + Load(new MemoryStream (((new ES3Settings ()).encoding).GetBytes(str)), new ES3Settings()); + } + + public void LoadRaw(string str, ES3Settings settings) + { + Load(new MemoryStream ((settings.encoding).GetBytes(str)), settings); + } + + private void Load(Stream stream, ES3Settings settings) + { + using (var reader = new StreamReader(stream)) + { + int c_int; + char c; + string value = ""; + int col = 0; + int row = 0; + + // Read until the end of the stream. + while(true) + { + c_int = reader.Read(); + c = (char)c_int; + if(c == QUOTE_CHAR) + { + while (true) + { + c = (char)reader.Read(); + + if(c == QUOTE_CHAR) + { + // If this quote isn't escaped by another, it is the last quote, so we should stop parsing this value. + if(((char)reader.Peek()) != QUOTE_CHAR) + break; + else + c = (char)reader.Read(); + } + value += c; + } + } + // If this is the end of a column, row, or the stream, add the value to the spreadsheet. + else if(c == COMMA_CHAR || c == NEWLINE_CHAR || c_int == -1) + { + SetCell(col, row, value); + value = ""; + if(c == COMMA_CHAR) + col++; + else if(c == NEWLINE_CHAR) + { + col = 0; + row++; + } + else + break; + } + else + value += c; + } + } + } + + public void Save(string filePath) + { + Save(new ES3Settings (filePath), false); + } + + public void Save(string filePath, ES3Settings settings) + { + Save(new ES3Settings (filePath, settings), false); + } + + public void Save(ES3Settings settings) + { + Save(settings, false); + } + + public void Save(string filePath, bool append) + { + Save(new ES3Settings (filePath), append); + } + + public void Save(string filePath, ES3Settings settings, bool append) + { + Save(new ES3Settings (filePath, settings), append); + } + + public void Save(ES3Settings settings, bool append) + { + using (var writer = new StreamWriter(ES3Stream.CreateStream(settings, append ? ES3FileMode.Append : ES3FileMode.Write))) + { + // If data already exists and we're appending, we need to prepend a newline. + if(append && ES3.FileExists(settings)) + writer.Write(NEWLINE_CHAR); + + var array = ToArray(); + for(int row = 0; row < rows; row++) + { + if(row != 0) + writer.Write(NEWLINE_CHAR); + + for(int col = 0; col < cols; col++) + { + if(col != 0) + writer.Write(COMMA_CHAR); + + writer.Write( Escape(array [col, row]) ); + } + } + } + if(!append) + ES3IO.CommitBackup(settings); + } + + private static string Escape(string str, bool isAlreadyWrappedInQuotes=false) + { + if (str == "") + return "\"\""; + else if(str == null) + return null; + + // Now escape any other quotes. + if(str.Contains(QUOTE)) + str = str.Replace(QUOTE, ESCAPED_QUOTE); + + // If there's chars to escape, wrap the value in quotes. + if(str.IndexOfAny(CHARS_TO_ESCAPE) > -1) + str = QUOTE + str + QUOTE; + return str; + } + + private static string Unescape(string str) + { + if(str.StartsWith(QUOTE) && str.EndsWith(QUOTE)) + { + str = str.Substring(1, str.Length-2); + if(str.Contains(ESCAPED_QUOTE)) + str = str.Replace(ESCAPED_QUOTE, QUOTE); + } + return str; + } + + private string[,] ToArray() + { + var array = new string[cols, rows]; + foreach (var cell in cells) + array [cell.Key.col, cell.Key.row] = cell.Value; + return array; + } + + protected struct Index + { + public int col; + public int row; + + public Index(int col, int row) + { + this.col = col; + this.row = row; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/ES3Spreadsheet.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/ES3Spreadsheet.cs.meta new file mode 100644 index 000000000..260db89b4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/ES3Spreadsheet.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: bb1f812633929432dabb61bb8de267ba +timeCreated: 1508838134 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/ES3Spreadsheet.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Readers.meta b/Assets/Plugins/Easy Save 3/Scripts/Readers.meta new file mode 100644 index 000000000..3fce6685a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Readers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 23cb117b6fd3547afa9766976f6dbd18 +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3JSONReader.cs b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3JSONReader.cs new file mode 100644 index 000000000..fb3e06b5d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3JSONReader.cs @@ -0,0 +1,571 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using System.IO; +using System.Text; +using System; +using ES3Types; +using System.Globalization; + +namespace ES3Internal +{ + /* + * Specific ES3Reader for reading JSON data. + * + * Note: Leading & trailing whitespace is ignored whenever + * reading characters which are part of the JSON syntax, + * i.e. { } [ ] , " " : + */ + public class ES3JSONReader : ES3Reader + { + private const char endOfStreamChar = (char)65535; + + public StreamReader baseReader; + + internal ES3JSONReader(Stream stream, ES3Settings settings, bool readHeaderAndFooter = true) : base(settings, readHeaderAndFooter) + { + this.baseReader = new StreamReader(stream); + + // Read opening brace from file if we're loading straight from file. + if(readHeaderAndFooter) + { + try + { + SkipOpeningBraceOfFile(); + } + catch + { + this.Dispose(); + throw new FormatException("Cannot load from file because the data in it is not JSON data, or the data is encrypted.\nIf the save data is encrypted, please ensure that encryption is enabled when you load, and that you are using the same password used to encrypt the data."); + } + } + } + + #region Property/Key Methods + + /* + * Reads the name of a property, and must be positioned (with or without whitespace) either: + * - Before the '"' of a property name. + * - Before the ',' separating properties. + * - Before the '}' or ']' terminating this list of properties. + * Can be used in conjunction with Read(ES3Type) to read a property. + */ + public override string ReadPropertyName() + { + char c = PeekCharIgnoreWhitespace(); + + // Check whether there are any properties left to read. + if(IsTerminator(c)) + return null; + else if(c == ',') + ReadCharIgnoreWhitespace(); + else if(!IsQuotationMark(c)) + throw new FormatException("Expected ',' separating properties or '\"' before property name, found '"+c+"'."); + + var propertyName = Read_string(); + if(propertyName == null) + throw new FormatException("Stream isn't positioned before a property."); + + ES3Debug.Log(""+propertyName+" (reading property)", null, serializationDepth); + + // Skip the ':' seperating property and value. + ReadCharIgnoreWhitespace(':'); + + return propertyName; + } + + /* + * Reads the type data prefixed to this key. + * If ignore is true, it will return null to save the computation of converting + * the string to a Type. + */ + protected override Type ReadKeyPrefix(bool ignoreType=false) + { + StartReadObject(); + + Type dataType = null; + + string propertyName = ReadPropertyName(); + if(propertyName == ES3Type.typeFieldName) + { + string typeString = Read_string(); + dataType = ignoreType ? null : ES3Reflection.GetType(typeString); + propertyName = ReadPropertyName(); + } + + if(propertyName != "value") + throw new FormatException("This data is not Easy Save Key Value data. Expected property name \"value\", found \""+propertyName+"\"."); + + return dataType; + } + + protected override void ReadKeySuffix() + { + EndReadObject(); + } + + + internal override bool StartReadObject() + { + base.StartReadObject(); + return ReadNullOrCharIgnoreWhitespace('{'); + } + + internal override void EndReadObject() + { + ReadCharIgnoreWhitespace('}'); + base.EndReadObject(); + } + + + internal override bool StartReadDictionary() + { + return StartReadObject(); + } + + internal override void EndReadDictionary(){} + + internal override bool StartReadDictionaryKey() + { + // If this is an empty Dictionary, return false. + if(PeekCharIgnoreWhitespace() == '}') + { + ReadCharIgnoreWhitespace(); + return false; + } + return true; + } + + internal override void EndReadDictionaryKey() + { + ReadCharIgnoreWhitespace(':'); + } + + internal override void StartReadDictionaryValue(){} + + internal override bool EndReadDictionaryValue() + { + char c = ReadCharIgnoreWhitespace(); + // If we find a ']', we reached the end of the array. + if(c == '}') + return true; + // Else, we should expect a comma. + else if(c != ',') + throw new FormatException("Expected ',' seperating Dictionary items or '}' terminating Dictionary, found '"+c+"'."); + return false; + } + + + internal override bool StartReadCollection() + { + return ReadNullOrCharIgnoreWhitespace('['); + } + + internal override void EndReadCollection(){} + + internal override bool StartReadCollectionItem() + { + // If this is an empty collection, return false. + if(PeekCharIgnoreWhitespace() == ']') + { + ReadCharIgnoreWhitespace(); + return false; + } + return true; + } + + internal override bool EndReadCollectionItem() + { + char c = ReadCharIgnoreWhitespace(); + // If we find a ']', we reached the end of the array. + if(c == ']') + return true; + // Else, we should expect a comma. + else if(c != ',') + throw new FormatException("Expected ',' seperating collection items or ']' terminating collection, found '"+c+"'."); + return false; + } + + #endregion + + #region Seeking Methods + + /* + * Reads a string value into a StreamWriter. + * Reader should be positioned after the opening quotation mark. + * Will also read the closing quotation mark. + * If the 'skip' parameter is true, data will not be written into a StreamWriter and will return null. + */ + private void ReadString(StreamWriter writer, bool skip=false) + { + bool endOfString = false; + // Read to end of string, or throw error if we reach end of stream. + while(!endOfString) + { + char c = ReadOrSkipChar(writer, skip); + switch(c) + { + case endOfStreamChar: + throw new FormatException("String without closing quotation mark detected."); + case '\\': + ReadOrSkipChar(writer, skip); + break; + default: + if(IsQuotationMark(c)) + endOfString = true; + break; + } + } + } + + /* + * Reads the current object in the stream. + * Stream position should be somewhere before the opening brace for the object. + * When this method successfully exits, it will be on the closing brace for the object. + * If the 'skip' parameter is true, data will not be written into a StreamWriter and will return null. + */ + internal override byte[] ReadElement(bool skip=false) + { + // If 'skip' is enabled, don't create a stream or writer as we'll discard all bytes we read. + StreamWriter writer = skip ? null : new StreamWriter(new MemoryStream(settings.bufferSize)); + + using(writer) + { + int nesting = 0; + char c = (char)baseReader.Peek(); + + // Determine if we're skipping a primitive type. + // First check if it's an opening object or array brace. + if(!IsOpeningBrace(c)) + { + // If we're skipping a string, use SkipString(). + if(c == '\"') + { + // Skip initial quotation mark as SkipString() requires this. + ReadOrSkipChar(writer, skip); + ReadString(writer, skip); + } + // Else we just need to read until we reach a closing brace. + else + // While we've not peeked a closing brace. + while(!IsEndOfValue((char)baseReader.Peek())) + ReadOrSkipChar(writer, skip); + + if(skip) + return null; + writer.Flush(); + return ((MemoryStream)writer.BaseStream).ToArray(); + } + + // Else, we're skipping a type surrounded by braces. + // Iterate through every character, logging nesting. + while(true) + { + c = ReadOrSkipChar(writer, skip); + + if(c == endOfStreamChar) // Detect premature end of stream, which denotes missing closing brace. + throw new FormatException("Missing closing brace detected, as end of stream was reached before finding it."); + + // Handle quoted strings. + // According to the RFC, only '\' and '"' must be escaped in strings. + if(IsQuotationMark(c)) + { + ReadString(writer, skip); + continue; + } + + // Handle braces and other characters. + switch(c) + { + case '{': // Entered another level of nesting. + case '[': + nesting++; + break; + case '}': // Exited a level of nesting. + case ']': + nesting--; + // If nesting < 1, we've come to the end of the object. + if(nesting<1) + { + if(skip) + return null; + writer.Flush(); + return ((MemoryStream)writer.BaseStream).ToArray(); + } + break; + default: + break; + } + } + } + } + + /* + * Reads the next char into a stream, or ignores it if 'skip' is true. + */ + private char ReadOrSkipChar(StreamWriter writer, bool skip) + { + char c = (char)baseReader.Read(); + if(!skip) writer.Write(c); + return c; + } + + #endregion + + #region JSON-specific methods. + + /* + * Reads a char from the stream and ignores leading and trailing whitespace. + */ + private char ReadCharIgnoreWhitespace(bool ignoreTrailingWhitespace=true) + { + char c; + // Skip leading whitespace and read char. + while(IsWhiteSpace(c = (char)baseReader.Read())) + {} + + // Skip trailing whitespace. + if(ignoreTrailingWhitespace) + while(IsWhiteSpace((char)baseReader.Peek())) + baseReader.Read(); + + return c; + } + + /* + * Reads a char, or the NULL value, from the stream and ignores leading and trailing whitespace. + * Returns true if NULL was read. + */ + private bool ReadNullOrCharIgnoreWhitespace(char expectedChar) + { + char c = ReadCharIgnoreWhitespace(); + + // Check for null + if(c == 'n') + { + var chars = new char[3]; + baseReader.ReadBlock(chars, 0, 3); + if((char)chars[0] == 'u' && (char)chars[1] == 'l' && (char)chars[2] == 'l') + return true; + } + + if(c != expectedChar) + { + if(c == endOfStreamChar) + throw new FormatException("End of stream reached when expecting '"+expectedChar+"'."); + else + throw new FormatException("Expected \'"+expectedChar+"\' or \"null\", found \'"+c+"\'."); + } + return false; + } + + /* + * Reads a char from the stream and ignores leading and trailing whitespace. + * Throws an error if the char isn't equal to the one specificed as a parameter, or if it's the end of stream. + */ + private char ReadCharIgnoreWhitespace(char expectedChar) + { + char c = ReadCharIgnoreWhitespace(); + if(c != expectedChar) + { + if(c == endOfStreamChar) + throw new FormatException("End of stream reached when expecting '"+expectedChar+"'."); + else + throw new FormatException("Expected \'"+expectedChar+"\', found \'"+c+"\'."); + } + return c; + } + + private bool ReadQuotationMarkOrNullIgnoreWhitespace() + { + char c = ReadCharIgnoreWhitespace(false); // Don't read trailing whitespace as this is the value. + + if(c == 'n') + { + var chars = new char[3]; + baseReader.ReadBlock(chars, 0, 3); + if((char)chars[0] == 'u' && (char)chars[1] == 'l' && (char)chars[2] == 'l') + return true; + } + else if(!IsQuotationMark(c)) + { + if(c == endOfStreamChar) + throw new FormatException("End of stream reached when expecting quotation mark."); + else + throw new FormatException("Expected quotation mark, found \'"+c+"\'."); + } + return false; + } + + /* + * Peeks the next char in the stream, ignoring leading whitespace, but not trailing whitespace. + */ + private char PeekCharIgnoreWhitespace(char expectedChar) + { + char c = PeekCharIgnoreWhitespace(); + if(c != expectedChar) + { + if(c == endOfStreamChar) + throw new FormatException("End of stream reached while peeking, when expecting '"+expectedChar+"'."); + else + throw new FormatException("Expected \'"+expectedChar+"\', found \'"+c+"\'."); + } + return c; + } + + /* + * Peeks the next char in the stream, ignoring leading whitespace, but not trailing whitespace. + * Throws an error if the char isn't equal to the one specificed as a parameter. + */ + private char PeekCharIgnoreWhitespace() + { + char c; + // Skip leading whitespace and read char. + while(IsWhiteSpace(c = (char)baseReader.Peek())) + baseReader.Read(); + return c; + } + + // Skips all whitespace immediately after the current position. + private void SkipWhiteSpace() + { + while(IsWhiteSpace((char)baseReader.Peek())) + baseReader.Read(); + } + + private void SkipOpeningBraceOfFile() + { + // Skip the whitespace and '{' at the beginning of the JSON file. + char firstChar = ReadCharIgnoreWhitespace(); + if(firstChar != '{') // If first char isn't '{', it's not valid JSON. + throw new FormatException("File is not valid JSON. Expected '{' at beginning of file, but found '"+firstChar+"'."); + } + + private static bool IsWhiteSpace(char c) + { + return (c == ' ' || c == '\t' || c == '\n' || c == '\r'); + } + + private static bool IsOpeningBrace(char c) + { + return (c == '{' || c == '['); + } + + private static bool IsEndOfValue(char c) + { + return (c == '}' || c == ' ' || c == '\t' || c == ']' || c == ',' || c== ':' || c == endOfStreamChar || c == '\n' || c == '\r'); + } + + private static bool IsTerminator(char c) + { + return (c == '}' || c == ']'); + } + + private static bool IsQuotationMark(char c) + { + return c == '\"' || c == '“' || c == '”'; + } + + private static bool IsEndOfStream(char c) + { + return c == endOfStreamChar; + } + + /* + * Reads a value (i.e. non-string, non-object) from the stream as a string. + * Used mostly in Read_[type]() methods. + */ + private string GetValueString() + { + StringBuilder builder = new StringBuilder(); + + while(!IsEndOfValue(PeekCharIgnoreWhitespace())) + builder.Append((char)baseReader.Read()); + + // If it's an empty value, return null. + if(builder.Length == 0) + return null; + return builder.ToString(); + } + + #endregion + + #region Primitive Read() Methods. + + internal override string Read_string() + { + if(ReadQuotationMarkOrNullIgnoreWhitespace()) + return null; + char c; + + StringBuilder sb = new StringBuilder(); + + while(!IsQuotationMark((c = (char)baseReader.Read()))) + { + // If escape mark is found, generate correct escaped character. + if(c == '\\') + { + c = (char)baseReader.Read(); + if(IsEndOfStream(c)) + throw new FormatException("Reached end of stream while trying to read string literal."); + + switch(c) + { + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + default: + break; + } + } + sb.Append(c); + } + return sb.ToString(); + } + + internal override long Read_ref() + { + if (ES3ReferenceMgr.Current == null) + throw new InvalidOperationException("An Easy Save 3 Manager is required to load references. To add one to your scene, exit playmode and go to Tools > Easy Save 3 > Add Manager to Scene"); + if (IsQuotationMark(PeekCharIgnoreWhitespace())) + return long.Parse(Read_string()); + return Read_long(); + } + + internal override char Read_char() { return char.Parse( Read_string()); } + internal override float Read_float() { return float.Parse( GetValueString(), CultureInfo.InvariantCulture); } + internal override int Read_int() { return int.Parse( GetValueString()); } + internal override bool Read_bool() { return bool.Parse( GetValueString()); } + internal override decimal Read_decimal() { return decimal.Parse( GetValueString(), CultureInfo.InvariantCulture); } + internal override double Read_double() { return double.Parse( GetValueString(), CultureInfo.InvariantCulture); } + internal override long Read_long() { return long.Parse( GetValueString()); } + internal override ulong Read_ulong() { return ulong.Parse( GetValueString()); } + internal override uint Read_uint() { return uint.Parse( GetValueString()); } + internal override byte Read_byte() { return (byte)int.Parse( GetValueString()); } + internal override sbyte Read_sbyte() { return (sbyte)int.Parse( GetValueString()); } + internal override short Read_short() { return (short)int.Parse( GetValueString()); } + internal override ushort Read_ushort() { return (ushort)int.Parse( GetValueString()); } + + internal override byte[] Read_byteArray(){ return System.Convert.FromBase64String(Read_string()); } + + #endregion + + + public override void Dispose() + { + baseReader.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3JSONReader.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3JSONReader.cs.meta new file mode 100644 index 000000000..d74b274e0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3JSONReader.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 8757682770a6c4537a3dcbed278277bc +timeCreated: 1499764822 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Readers/ES3JSONReader.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3Reader.cs b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3Reader.cs new file mode 100644 index 000000000..51d96538e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3Reader.cs @@ -0,0 +1,459 @@ +using UnityEngine; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System; +using System.ComponentModel; +using ES3Types; +using ES3Internal; + +public abstract class ES3Reader : System.IDisposable +{ + /// The settings used to create this reader. + public ES3Settings settings; + + protected int serializationDepth = 0; + + #region ES3Reader Abstract Methods + + internal abstract int Read_int(); + internal abstract float Read_float(); + internal abstract bool Read_bool(); + internal abstract char Read_char(); + internal abstract decimal Read_decimal(); + internal abstract double Read_double(); + internal abstract long Read_long(); + internal abstract ulong Read_ulong(); + internal abstract byte Read_byte(); + internal abstract sbyte Read_sbyte(); + internal abstract short Read_short(); + internal abstract ushort Read_ushort(); + internal abstract uint Read_uint(); + internal abstract string Read_string(); + internal abstract byte[] Read_byteArray(); + internal abstract long Read_ref(); + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public abstract string ReadPropertyName(); + + protected abstract Type ReadKeyPrefix(bool ignore = false); + protected abstract void ReadKeySuffix(); + internal abstract byte[] ReadElement(bool skip=false); + + /// Disposes of the reader and it's underlying stream. + public abstract void Dispose(); + + // Seeks to the given key. Note that the stream position will not be reset. + internal virtual bool Goto(string key) + { + if (key == null) + throw new ArgumentNullException("Key cannot be NULL when loading data."); + + string currentKey; + while ((currentKey = ReadPropertyName()) != key) + { + if (currentKey == null) + return false; + Skip(); + } + return true; + } + + internal virtual bool StartReadObject() + { + serializationDepth++; + return false; + } + + internal virtual void EndReadObject() + { + serializationDepth--; + } + + internal abstract bool StartReadDictionary(); + internal abstract void EndReadDictionary(); + internal abstract bool StartReadDictionaryKey(); + internal abstract void EndReadDictionaryKey(); + internal abstract void StartReadDictionaryValue(); + internal abstract bool EndReadDictionaryValue(); + + internal abstract bool StartReadCollection(); + internal abstract void EndReadCollection(); + internal abstract bool StartReadCollectionItem(); + internal abstract bool EndReadCollectionItem(); + + #endregion + + internal ES3Reader(ES3Settings settings, bool readHeaderAndFooter = true) + { + this.settings = settings; + } + + // If this is not null, the next call to the Properties will return this name. + internal string overridePropertiesName = null; + /// Allows you to enumerate over each field name. This should only be used within an ES3Type file. + public virtual ES3ReaderPropertyEnumerator Properties + { + get + { + return new ES3ReaderPropertyEnumerator (this); + } + } + + internal virtual ES3ReaderRawEnumerator RawEnumerator + { + get + { + return new ES3ReaderRawEnumerator (this); + } + } + + /* + * Skips the current object in the stream. + * Stream position should be somewhere before the opening brace for the object. + * When this method successfully exits, it will be on the closing brace for the object. + */ + /// Skips the current object in the stream. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void Skip() + { + ReadElement(true); + } + + /// Reads a value of type T from the reader. + public virtual T Read() + { + return Read(ES3TypeMgr.GetOrCreateES3Type(typeof(T))); + } + + /// Reads a value of type T from the reader into an existing object. + /// The object we want to read our value into. + public virtual void ReadInto(object obj) + { + ReadInto(obj, ES3TypeMgr.GetOrCreateES3Type(typeof(T))); + } + + /// Reads a property (i.e. a property name and value) from the reader, ignoring the property name and only returning the value. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public T ReadProperty() + { + return ReadProperty(ES3TypeMgr.GetOrCreateES3Type(typeof(T))); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public T ReadProperty(ES3Type type) + { + ReadPropertyName(); + return Read(type); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public long ReadRefProperty() + { + ReadPropertyName(); + return Read_ref(); + } + + internal Type ReadType() + { + return ES3Reflection.GetType(Read(ES3Type_string.Instance)); + } + + /// Sets the value of a private property on an object. + /// The name of the property we want to set. + /// The value we want to set the property to. + /// The object containing the property we want to set. + /// The objectContainingProperty object. This is helpful if you're setting a private property on a struct or other immutable type and need to return the boxed value. + public object SetPrivateProperty(string name, object value, object objectContainingProperty) + { + var property = ES3Reflection.GetES3ReflectedProperty(objectContainingProperty.GetType(), name); + if (property.IsNull) + throw new MissingMemberException("A private property named " + name + " does not exist in the type " + objectContainingProperty.GetType()); + property.SetValue(objectContainingProperty, value); + return objectContainingProperty; + } + + /// Sets the value of a private field on an object. + /// The name of the field we want to set. + /// The value we want to set the field to. + /// The object containing the field we want to set. + /// The objectContainingField object. This is helpful if you're setting a private property on a struct or other immutable type and need to return the boxed value. + public object SetPrivateField(string name, object value, object objectContainingField) + { + var field = ES3Reflection.GetES3ReflectedMember(objectContainingField.GetType(), name); + if(field.IsNull) + throw new MissingMemberException("A private field named "+ name + " does not exist in the type "+objectContainingField.GetType()); + field.SetValue(objectContainingField, value); + return objectContainingField; + } + + #region Read(key) & Read(key, obj) methods + + /// Reads a value from the reader with the given key. + /// The key which uniquely identifies our value. + public virtual T Read(string key) + { + if(!Goto(key)) + throw new KeyNotFoundException("Key \"" + key + "\" was not found in file \""+settings.FullPath+"\". Use Load(key, defaultValue) if you want to return a default value if the key does not exist."); + + Type type = ReadTypeFromHeader(); + + T obj = Read(ES3TypeMgr.GetOrCreateES3Type(type)); + + //ReadKeySuffix(); //No need to read key suffix as we're returning. Doing so would throw an error at this point for BinaryReaders. + return obj; + } + + /// Reads a value from the reader with the given key, returning the default value if the key does not exist. + /// The key which uniquely identifies our value. + /// The value we want to return if this key does not exist in the reader. + public virtual T Read(string key, T defaultValue) + { + if(!Goto(key)) + return defaultValue; + + Type type = ReadTypeFromHeader(); + T obj = Read(ES3TypeMgr.GetOrCreateES3Type(type)); + + //ReadKeySuffix(); //No need to read key suffix as we're returning. Doing so would throw an error at this point for BinaryReaders. + return obj; + } + + /// Reads a value from the reader with the given key into the provided object. + /// The key which uniquely identifies our value. + /// The object we want to load the value into. + public virtual void ReadInto(string key, T obj) where T : class + { + if(!Goto(key)) + throw new KeyNotFoundException("Key \"" + key + "\" was not found in file \""+settings.FullPath+"\""); + + Type type = ReadTypeFromHeader(); + + ReadInto(obj, ES3TypeMgr.GetOrCreateES3Type(type)); + + //ReadKeySuffix(); //No need to read key suffix as we're returning. Doing so would throw an error at this point for BinaryReaders. + } + + protected virtual void ReadObject(object obj, ES3Type type) + { + // Check for null. + if(StartReadObject()) + return; + + type.ReadInto(this, obj); + + EndReadObject(); + } + + protected virtual T ReadObject(ES3Type type) + { + if(StartReadObject()) + return default(T); + + object obj = type.Read(this); + + EndReadObject(); + return (T)obj; + } + + + #endregion + + #region Read(ES3Type) & Read(obj,ES3Type) methods + + /* + * Parses the next JSON Object in the stream (i.e. must be between '{' and '}' chars). + * If the first character in the Stream is not a '{', it will throw an error. + * Will also read the terminating '}'. + * If we have reached the end of stream, it will return null. + */ + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual T Read(ES3Type type) + { + if (type == null || type.isUnsupported) + throw new NotSupportedException("Type of " + type + " is not currently supported, and could not be loaded using reflection."); + else if (type.isPrimitive) + return (T)type.Read(this); + else if (type.isCollection) + return (T)((ES3CollectionType)type).Read(this); + else if (type.isDictionary) + return (T)((ES3DictionaryType)type).Read(this); + else + return ReadObject(type); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void ReadInto(object obj, ES3Type type) + { + if(type == null || type.isUnsupported) + throw new NotSupportedException("Type of "+obj.GetType()+" is not currently supported, and could not be loaded using reflection."); + + else if(type.isCollection) + ((ES3CollectionType)type).ReadInto(this, obj); + else if(type.isDictionary) + ((ES3DictionaryType)type).ReadInto(this, obj); + else + ReadObject(obj, type); + } + + + #endregion + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + internal Type ReadTypeFromHeader() + { + // Check whether we need to determine the type by reading the header. + if(typeof(T) == typeof(object)) + return ReadKeyPrefix(); + else if(settings.typeChecking) + { + Type type = ReadKeyPrefix(); + + if(type == null) + throw new TypeLoadException("Trying to load data of type " + typeof(T) + ", but the type of data contained in file no longer exists. This may be because the type has been removed from your project or renamed."); + else if (type != typeof(T)) + throw new InvalidOperationException("Trying to load data of type " + typeof(T) + ", but data contained in file is type of " + type + "."); + + return type; + } + else + { + ReadKeyPrefix(true); + return typeof(T); + } + } + + /// Creates a new ES3Reader and loads the default file into it. + public static ES3Reader Create() + { + return Create(new ES3Settings()); + } + + /// Creates a new ES3Reader and loads a file in storage into it. + /// The relative or absolute path of the file we want to load into the reader. + public static ES3Reader Create(string filePath) + { + return Create(new ES3Settings(filePath)); + } + + /// Creates a new ES3Reader and loads a file in storage into it. + /// The relative or absolute path of the file we want to load into the reader. + /// The settings we want to use to override the default settings. + public static ES3Reader Create(string filePath, ES3Settings settings) + { + return Create(new ES3Settings(filePath, settings)); + } + + /// Creates a new ES3Reader and loads a file in storage into it. + /// The settings we want to use to override the default settings. + public static ES3Reader Create(ES3Settings settings) + { + Stream stream = ES3Stream.CreateStream(settings, ES3FileMode.Read); + if(stream == null) + return null; + + // Get the baseWriter using the given Stream. + if (settings.format == ES3.Format.JSON) + return new ES3JSONReader(stream, settings); + return null; + } + + /// Creates a new ES3Reader and loads the bytes provided into it. + public static ES3Reader Create(byte[] bytes) + { + return Create(bytes, new ES3Settings()); + } + + /// Creates a new ES3Reader and loads the bytes provided into it. + /// The settings we want to use to override the default settings. + public static ES3Reader Create(byte[] bytes, ES3Settings settings) + { + Stream stream = ES3Stream.CreateStream(new MemoryStream(bytes), settings, ES3FileMode.Read); + if(stream == null) + return null; + + // Get the baseWriter using the given Stream. + if(settings.format == ES3.Format.JSON) + return new ES3JSONReader(stream, settings); + return null; + } + + internal static ES3Reader Create(Stream stream, ES3Settings settings) + { + stream = ES3Stream.CreateStream(stream, settings, ES3FileMode.Read); + + // Get the baseWriter using the given Stream. + if(settings.format == ES3.Format.JSON) + return new ES3JSONReader(stream, settings); + return null; + } + + internal static ES3Reader Create(Stream stream, ES3Settings settings, bool readHeaderAndFooter) + { + // Get the baseWriter using the given Stream. + if(settings.format == ES3.Format.JSON) + return new ES3JSONReader(stream, settings, readHeaderAndFooter); + return null; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public class ES3ReaderPropertyEnumerator + { + public ES3Reader reader; + + public ES3ReaderPropertyEnumerator(ES3Reader reader) + { + this.reader = reader; + } + + public IEnumerator GetEnumerator() + { + string propertyName; + while(true) + { + // Allows us to repeat a property name or insert one of our own. + if(reader.overridePropertiesName != null) + { + string tempName = reader.overridePropertiesName; + reader.overridePropertiesName = null; + yield return tempName; + } + else + { + if((propertyName = reader.ReadPropertyName()) == null) + yield break; + yield return propertyName; + } + } + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public class ES3ReaderRawEnumerator + { + public ES3Reader reader; + + public ES3ReaderRawEnumerator(ES3Reader reader) + { + this.reader = reader; + } + + public IEnumerator GetEnumerator() + { + while(true) + { + string key = reader.ReadPropertyName(); + if(key == null) + yield break; + + Type type = reader.ReadTypeFromHeader(); + + byte[] bytes = reader.ReadElement(); + + reader.ReadKeySuffix(); + + if(type != null) + yield return new KeyValuePair(key, new ES3Data(type, bytes)); + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3Reader.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3Reader.cs.meta new file mode 100644 index 000000000..d1c85191c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3Reader.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f511cfa2663a045aeac7dfe13754efba +timeCreated: 1519132300 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Readers/ES3Reader.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3XMLReader.cs b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3XMLReader.cs new file mode 100644 index 000000000..3b736296f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3XMLReader.cs @@ -0,0 +1,5 @@ + +public class ES3XMLReader +{ + // Not Implemented +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3XMLReader.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3XMLReader.cs.meta new file mode 100644 index 000000000..9ad06b62f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Readers/ES3XMLReader.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2ef972c40e0163f4c873b7e18c0e24fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Readers/ES3XMLReader.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Referencing.meta b/Assets/Plugins/Easy Save 3/Scripts/Referencing.meta new file mode 100644 index 000000000..54e00d824 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Referencing.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7aae016e8c4b7924290cd0904f1509b5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Referencing/ES3GlobalReferences.cs b/Assets/Plugins/Easy Save 3/Scripts/Referencing/ES3GlobalReferences.cs new file mode 100644 index 000000000..eb09e31fa --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Referencing/ES3GlobalReferences.cs @@ -0,0 +1,129 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace ES3Internal +{ + public class ES3GlobalReferences : ScriptableObject + { +#if !UNITY_EDITOR || ES3GLOBAL_DISABLED + public static ES3GlobalReferences Instance{ get{ return null; } } + public UnityEngine.Object Get(long id){return null;} + public long GetOrAdd(UnityEngine.Object obj){return -1;} + public void RemoveInvalidKeys(){} +#else + +#if ES3GLOBAL_DISABLED + private static bool useGlobalReferences = false; +#else + private static bool useGlobalReferences = true; +#endif + + private const string globalReferencesPath = "ES3/ES3GlobalReferences"; + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public ES3RefIdDictionary refId = new ES3RefIdDictionary(); + + private static ES3GlobalReferences _globalReferences = null; + public static ES3GlobalReferences Instance + { + get + { + if (Application.isPlaying) + return null; + + if (!useGlobalReferences) + return null; + + if (_globalReferences == null) + { + _globalReferences = Resources.Load(globalReferencesPath); + + if (_globalReferences == null) + { + _globalReferences = ScriptableObject.CreateInstance(); + + // If this is the version being submitted to the Asset Store, don't include ES3Defaults. + if (Application.productName.Contains("ES3 Release")) + { + Debug.Log("This has been identified as a release build as the title contains 'ES3 Release', so ES3GlobalReferences will not be created."); + return _globalReferences; + } + + ES3Settings.CreateDefaultSettingsFolder(); + UnityEditor.AssetDatabase.CreateAsset(_globalReferences, PathToGlobalReferences()); + UnityEditor.AssetDatabase.SaveAssets(); + } + + } + + return _globalReferences; + } + } + + private long Get(UnityEngine.Object obj) + { + if (obj == null) + return -1; + + long id; + if (!refId.TryGetValue(obj, out id)) + return -1; + return id; + } + + public UnityEngine.Object Get(long id) + { + foreach(var kvp in refId) + if (kvp.Value == id) + return kvp.Key; + return null; + } + + public void RemoveInvalidKeys() + { + var newRefId = new ES3RefIdDictionary(); + foreach (var kvp in refId) + { + var obj = kvp.Key; + if (obj == null) + continue; + + if ((((obj.hideFlags & HideFlags.DontSave) == HideFlags.DontSave) || + ((obj.hideFlags & HideFlags.DontSaveInBuild) == HideFlags.DontSaveInBuild) || + ((obj.hideFlags & HideFlags.DontSaveInEditor) == HideFlags.DontSaveInEditor) || + ((obj.hideFlags & HideFlags.HideAndDontSave) == HideFlags.HideAndDontSave))) + { + var type = obj.GetType(); + // Meshes are marked with HideAndDontSave, but shouldn't be ignored. + if (type != typeof(Mesh) && type != typeof(Material)) + continue; + } + newRefId[obj] = kvp.Value; + } + refId = newRefId; + } + + public long GetOrAdd(UnityEngine.Object obj) + { + var id = Get(obj); + + // Only add items to global references when it's not playing. + if (!Application.isPlaying && id == -1 && UnityEditor.AssetDatabase.Contains(obj) && ES3ReferenceMgr.CanBeSaved(obj)) + { + id = ES3ReferenceMgrBase.GetNewRefID(); + refId.Add(obj, id); + + UnityEditor.EditorUtility.SetDirty(this); + } + + return id; + } + + private static string PathToGlobalReferences() + { + return ES3Settings.PathToEasySaveFolder() + "Resources/" + globalReferencesPath +".asset"; + } +#endif + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Referencing/ES3GlobalReferences.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Referencing/ES3GlobalReferences.cs.meta new file mode 100644 index 000000000..6a01920eb --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Referencing/ES3GlobalReferences.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e6b16dc7c203450459bb86e24305f9ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Referencing/ES3GlobalReferences.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Settings.meta b/Assets/Plugins/Easy Save 3/Scripts/Settings.meta new file mode 100644 index 000000000..034ed770d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Settings.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6c350197e0cac40839770b990d43d828 +folderAsset: yes +timeCreated: 1499765763 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3DefaultSettings.cs b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3DefaultSettings.cs new file mode 100644 index 000000000..26e08baff --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3DefaultSettings.cs @@ -0,0 +1,13 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace ES3Internal +{ + public class ES3DefaultSettings : MonoBehaviour + { + [SerializeField] + public ES3SerializableSettings settings = null; + + public bool autoUpdateReferences = true; + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3DefaultSettings.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3DefaultSettings.cs.meta new file mode 100644 index 000000000..75dc8271f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3DefaultSettings.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: c6d233887d0c64d7e8f3ebcb39bc8c82 +timeCreated: 1519132296 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Settings/ES3DefaultSettings.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Defaults.cs b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Defaults.cs new file mode 100644 index 000000000..61e7a1a93 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Defaults.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class ES3Defaults : ScriptableObject +{ + [SerializeField] + public ES3SerializableSettings settings = new ES3SerializableSettings(); + + public bool addMgrToSceneAutomatically = false; + public bool autoUpdateReferences = true; + public bool addAllPrefabsToManager = true; + public int collectDependenciesDepth = 4; + public int collectDependenciesTimeout = 10; + public bool updateReferencesWhenSceneChanges = true; + public bool updateReferencesWhenSceneIsSaved = true; + public bool updateReferencesWhenSceneIsOpened = true; + [Tooltip("Folders listed here will be searched for references every time the reference manager is refreshed. Path should be relative to the project folder.")] + public string[] referenceFolders = new string[0]; + + public bool logDebugInfo = false; + public bool logWarnings = true; + public bool logErrors = true; +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Defaults.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Defaults.cs.meta new file mode 100644 index 000000000..d09e8e99b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Defaults.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7b340139c9e4d054f904d8b452798652 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Defaults.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Settings.cs b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Settings.cs new file mode 100644 index 000000000..beb0f71f0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Settings.cs @@ -0,0 +1,386 @@ +using UnityEngine; +using ES3Internal; +#if UNITY_EDITOR +using UnityEditor; +#endif + +#if UNITY_VISUAL_SCRIPTING +[Unity.VisualScripting.IncludeInSettings(true)] +#elif BOLT_VISUAL_SCRIPTING +[Ludiq.IncludeInSettings(true)] +#endif +public class ES3Settings : System.ICloneable +{ + + #region Default settings + private static ES3Settings _defaults = null; + private static ES3Defaults _defaultSettingsScriptableObject; + private const string defaultSettingsPath = "ES3/ES3Defaults"; + + public static ES3Defaults defaultSettingsScriptableObject + { + get + { + if (_defaultSettingsScriptableObject == null) + { + _defaultSettingsScriptableObject = Resources.Load(defaultSettingsPath); + +#if UNITY_EDITOR + if (_defaultSettingsScriptableObject == null) + { + _defaultSettingsScriptableObject = ScriptableObject.CreateInstance(); + + // If this is the version being submitted to the Asset Store, don't include ES3Defaults. + if (Application.productName.Contains("ES3 Release")) + { + Debug.Log("This has been identified as a release build as the title contains 'ES3 Release', so ES3Defaults will not be created."); + return _defaultSettingsScriptableObject; + } + + // Convert the old settings to the new settings if necessary. + var oldSettings = GetOldSettings(); + if (oldSettings != null) + { + oldSettings.CopyInto(_defaultSettingsScriptableObject.settings); + // Only enable warning logs by default for new installs as this may look like unexpected behaviour to some. + _defaultSettingsScriptableObject.logWarnings = false; + RemoveOldSettings(); + } + + CreateDefaultSettingsFolder(); + AssetDatabase.CreateAsset(_defaultSettingsScriptableObject, PathToDefaultSettings()); + AssetDatabase.SaveAssets(); + } +#endif + } + return _defaultSettingsScriptableObject; + } + } + + public static ES3Settings defaultSettings + { + get + { + if(_defaults == null) + { + if(defaultSettingsScriptableObject != null) + _defaults = defaultSettingsScriptableObject.settings; + } + return _defaults; + } + } + + private static ES3Settings _unencryptedUncompressedSettings = null; + internal static ES3Settings unencryptedUncompressedSettings + { + get + { + if (_unencryptedUncompressedSettings == null) + _unencryptedUncompressedSettings = new ES3Settings(ES3.EncryptionType.None, ES3.CompressionType.None); + return _unencryptedUncompressedSettings; + } + } + + #endregion + + #region Fields + + private static readonly string[] resourcesExtensions = new string[]{".txt", ".htm", ".html", ".xml", ".bytes", ".json", ".csv", ".yaml", ".fnt" }; + + [SerializeField] + private ES3.Location _location; + /// The location where we wish to store data. As it's not possible to save/load from File in WebGL, if the default location is File it will use PlayerPrefs instead. + public ES3.Location location + { + get + { + if(_location == ES3.Location.File && (Application.platform == RuntimePlatform.WebGLPlayer || Application.platform == RuntimePlatform.tvOS)) + return ES3.Location.PlayerPrefs; + return _location; + } + set{ _location = value; } + } + + /// The path associated with this ES3Settings object, if any. + public string path = "SaveFile.es3"; + /// The type of encryption to use when encrypting data, if any. + public ES3.EncryptionType encryptionType = ES3.EncryptionType.None; + /// The type of encryption to use when encrypting data, if any. + public ES3.CompressionType compressionType = ES3.CompressionType.None; + /// The password to use when encrypting data. + public string encryptionPassword = "password"; + /// The default directory in which to store files, and the location which relative paths should be relative to. + public ES3.Directory directory = ES3.Directory.PersistentDataPath; + /// What format to use when serialising and deserialising data. + public ES3.Format format = ES3.Format.JSON; + /// Whether we want to pretty print JSON. + public bool prettyPrint = true; + /// Any stream buffers will be set to this length in bytes. + public int bufferSize = 2048; + /// The text encoding to use for text-based format. Note that changing this may invalidate previous save data. + public System.Text.Encoding encoding = System.Text.Encoding.UTF8; + // Whether we should serialise children when serialising a GameObject. + public bool saveChildren = true; + // Whether we should apply encryption and/or compression to raw cached data if they're specified in the cached data's settings. + public bool postprocessRawCachedData = false; + + /// Whether we should check that the data we are loading from a file matches the method we are using to load it. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public bool typeChecking = true; + + /// Enabling this ensures that only serialisable fields are serialised. Otherwise, possibly unsafe fields and properties will be serialised. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public bool safeReflection = true; + /// Whether UnityEngine.Object members should be stored by value, reference or both. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public ES3.ReferenceMode memberReferenceMode = ES3.ReferenceMode.ByRef; + /// Whether the main save methods should save UnityEngine.Objects by value, reference, or both. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public ES3.ReferenceMode referenceMode = ES3.ReferenceMode.ByRefAndValue; + + /// How many levels of hierarchy Easy Save will serialise. This is used to protect against cyclic references. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public int serializationDepthLimit = 64; + + /// The names of the Assemblies we should try to load our ES3Types from. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public string[] assemblyNames = new string[] { "Assembly-CSharp-firstpass", "Assembly-CSharp"}; + + /// Gets the full, absolute path which this ES3Settings object identifies. + public string FullPath + { + get + { + if (path == null) + throw new System.NullReferenceException("The 'path' field of this ES3Settings is null, indicating that it was not possible to load the default settings from Resources. Please check that the ES3 Default Settings.prefab exists in Assets/Plugins/Resources/ES3/"); + + if(IsAbsolute(path)) + return path; + + if(location == ES3.Location.File) + { + if(directory == ES3.Directory.PersistentDataPath) + return ES3IO.persistentDataPath + "/" + path; + if(directory == ES3.Directory.DataPath) + return Application.dataPath + "/" + path; + throw new System.NotImplementedException("File directory \""+directory+"\" has not been implemented."); + } + if(location == ES3.Location.Resources) + { + // Check that it has valid extension + var extension = System.IO.Path.GetExtension(path); + bool hasValidExtension = false; + foreach (var ext in resourcesExtensions) + { + if (extension == ext) + { + hasValidExtension = true; + break; + } + } + + if(!hasValidExtension) + throw new System.ArgumentException("Extension of file in Resources must be .json, .bytes, .txt, .csv, .htm, .html, .xml, .yaml or .fnt, but path given was \"" + path + "\""); + + // Remove extension + string resourcesPath = path.Replace(extension, ""); + return resourcesPath; + } + return path; + } + } + + #endregion + + #region Constructors + + /// Creates a new ES3Settings object with the given path. + /// The path associated with this ES3Settings object. + /// The settings we want to use to override the default settings. + public ES3Settings(string path = null, ES3Settings settings = null) : this(true) + { + // if there are settings to merge, merge them. + if (settings != null) + settings.CopyInto(this); + + if (path != null) + this.path = path; + } + + /// Creates a new ES3Settings object with the given path. + /// The path associated with this ES3Settings object. + /// Accepts an ES3.EncryptionType, ES3.CompressionType, ES3.Location, ES3.Directory or ES3.ReferenceMode. + public ES3Settings(string path, params System.Enum[] enums) : this(enums) + { + if (path != null) + this.path = path; + } + + + /// Creates a new ES3Settings object with the given path. + /// The path associated with this ES3Settings object. + /// Accepts an ES3.EncryptionType, ES3.CompressionType, ES3.Location, ES3.Directory or ES3.ReferenceMode. + public ES3Settings(params System.Enum[] enums) : this(true) + { + foreach (var setting in enums) + { + if (setting is ES3.EncryptionType) + this.encryptionType = (ES3.EncryptionType)setting; + else if (setting is ES3.Location) + this.location = (ES3.Location)setting; + else if (setting is ES3.CompressionType) + this.compressionType = (ES3.CompressionType)setting; + else if (setting is ES3.ReferenceMode) + this.referenceMode = (ES3.ReferenceMode)setting; + else if (setting is ES3.Format) + this.format = (ES3.Format)setting; + else if (setting is ES3.Directory) + this.directory = (ES3.Directory)setting; + } + } + + /// Creates a new ES3Settings object with the given encryption settings. + /// The type of encryption to use, if any. + /// The password to use when encrypting data. + public ES3Settings(ES3.EncryptionType encryptionType, string encryptionPassword) : this(true) + { + this.encryptionType = encryptionType; + this.encryptionPassword = encryptionPassword; + } + + /// Creates a new ES3Settings object with the given path and encryption settings. + /// The path associated with this ES3Settings object. + /// The type of encryption to use, if any. + /// The password to use when encrypting data. + /// The settings we want to use to override the default settings. + public ES3Settings(string path, ES3.EncryptionType encryptionType, string encryptionPassword, ES3Settings settings = null) : this(path, settings) + { + this.encryptionType = encryptionType; + this.encryptionPassword = encryptionPassword; + } + + /* Base constructor which allows us to bypass defaults so it can be called by Editor serialization */ + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public ES3Settings(bool applyDefaults) + { + if (applyDefaults) + if (defaultSettings != null) + _defaults.CopyInto(this); + } + + #endregion + + #region Editor methods +#if UNITY_EDITOR + public static string pathToEasySaveFolder = null; + + public static string PathToEasySaveFolder() + { + // If the path has not yet been cached, get the path and cache it. + if (string.IsNullOrEmpty(pathToEasySaveFolder)) + { + string[] guids = AssetDatabase.FindAssets("ES3Window"); + if (guids.Length == 0) + ES3Debug.LogError("Could not locate the Easy Save 3 folder because the ES3Window script has been moved or removed."); + if (guids.Length > 1) + ES3Debug.LogError("Could not locate the Easy Save 3 folder because more than one ES3Window script exists in the project, but this needs to be unique to locate the folder."); + + pathToEasySaveFolder = AssetDatabase.GUIDToAssetPath(guids[0]).Split(new string[] { "Editor" }, System.StringSplitOptions.RemoveEmptyEntries)[0]; + } + return pathToEasySaveFolder; + } + + internal static string PathToDefaultSettings() + { + return PathToEasySaveFolder() + "Resources/"+defaultSettingsPath+".asset"; + } + + internal static void CreateDefaultSettingsFolder() + { + if (AssetDatabase.IsValidFolder(PathToEasySaveFolder() + "Resources/ES3")) + return; + // Remove leading slash from PathToEasySaveFolder. + AssetDatabase.CreateFolder(PathToEasySaveFolder().Remove(PathToEasySaveFolder().Length - 1, 1), "Resources"); + AssetDatabase.CreateFolder(PathToEasySaveFolder() + "Resources", "ES3"); + } + + private static ES3SerializableSettings GetOldSettings() + { + var go = Resources.Load(defaultSettingsPath.Replace("ES3Defaults", "ES3 Default Settings")); + if(go != null) + { + var c = go.GetComponent(); + if (c != null && c.settings != null) + return c.settings; + } + return null; + } + + private static void RemoveOldSettings() + { + AssetDatabase.DeleteAsset(PathToDefaultSettings().Replace("ES3Defaults.asset", "ES3 Default Settings.prefab")); + } +#endif + #endregion + + #region Utility methods + + private static bool IsAbsolute(string path) + { + if (path.Length > 0 && (path[0] == '/' || path[0] == '\\')) + return true; + if (path.Length > 1 && path[1] == ':') + return true; + return false; + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public object Clone() + { + var settings = new ES3Settings(); + CopyInto(settings); + return settings; + } + + private void CopyInto(ES3Settings newSettings) + { + newSettings._location = _location; + newSettings.directory = directory; + newSettings.format = format; + newSettings.prettyPrint = prettyPrint; + newSettings.path = path; + newSettings.encryptionType = encryptionType; + newSettings.encryptionPassword = encryptionPassword; + newSettings.compressionType = compressionType; + newSettings.bufferSize = bufferSize; + newSettings.encoding = encoding; + newSettings.typeChecking = typeChecking; + newSettings.safeReflection = safeReflection; + newSettings.referenceMode = referenceMode; + newSettings.memberReferenceMode = memberReferenceMode; + newSettings.assemblyNames = assemblyNames; + newSettings.saveChildren = saveChildren; + newSettings.serializationDepthLimit = serializationDepthLimit; + newSettings.postprocessRawCachedData = postprocessRawCachedData; + } + + #endregion +} + +/* + * A serializable version of the settings we can use as a field in the Editor, which doesn't automatically + * assign defaults to itself, so we get no serialization errors. + */ +[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] +[System.Serializable] +public class ES3SerializableSettings : ES3Settings +{ + public ES3SerializableSettings() : base(false){} + public ES3SerializableSettings(bool applyDefaults) : base(applyDefaults){} + public ES3SerializableSettings(string path) : base(false) { this.path = path; } + public ES3SerializableSettings(string path, ES3.Location location) : base(false) { this.location = location; } + +#if UNITY_EDITOR + public bool showAdvancedSettings = false; +#endif +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Settings.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Settings.cs.meta new file mode 100644 index 000000000..fee6355fc --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Settings.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b7b35a33d52a04187b51d5e2e2e5b0c8 +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Settings/ES3Settings.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams.meta b/Assets/Plugins/Easy Save 3/Scripts/Streams.meta new file mode 100644 index 000000000..327f802ad --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 37ab5860b18cc4976bb573d0554aa453 +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3FileStream.cs b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3FileStream.cs new file mode 100644 index 000000000..43a23b54b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3FileStream.cs @@ -0,0 +1,68 @@ +using System.IO; + +namespace ES3Internal +{ + public enum ES3FileMode {Read, Write, Append} + + public class ES3FileStream : FileStream + { + private bool isDisposed = false; + + public ES3FileStream( string path, ES3FileMode fileMode, int bufferSize, bool useAsync) + : base( GetPath(path, fileMode), GetFileMode(fileMode), GetFileAccess(fileMode), FileShare.None, bufferSize, useAsync) + { + } + + // Gets a temporary path if necessary. + protected static string GetPath(string path, ES3FileMode fileMode) + { + string directoryPath = ES3IO.GetDirectoryPath(path); + // Attempt to create the directory incase it does not exist if we are storing data. + if (fileMode != ES3FileMode.Read && directoryPath != ES3IO.persistentDataPath) + ES3IO.CreateDirectory(directoryPath); + if(fileMode != ES3FileMode.Write || fileMode == ES3FileMode.Append) + return path; + return (fileMode == ES3FileMode.Write) ? path + ES3IO.temporaryFileSuffix : path; + } + + protected static FileMode GetFileMode(ES3FileMode fileMode) + { + if (fileMode == ES3FileMode.Read) + return FileMode.Open; + else if (fileMode == ES3FileMode.Write) + return FileMode.Create; + else + return FileMode.Append; + } + + protected static FileAccess GetFileAccess(ES3FileMode fileMode) + { + if (fileMode == ES3FileMode.Read) + return FileAccess.Read; + else if (fileMode == ES3FileMode.Write) + return FileAccess.Write; + else + return FileAccess.Write; + } + + protected override void Dispose (bool disposing) + { + // Ensure we only perform disposable once. + if(isDisposed) + return; + isDisposed = true; + + base.Dispose(disposing); + + + // If this is a file writer, we need to replace the temp file. + /*if(fileMode == ES3FileMode.Write && fileMode != ES3FileMode.Append) + { + // Delete the old file before overwriting it. + ES3IO.DeleteFile(path); + // Rename temporary file to new file. + ES3IO.MoveFile(path + ES3.temporaryFileSuffix, path); + }*/ + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3FileStream.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3FileStream.cs.meta new file mode 100644 index 000000000..5f24196b0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3FileStream.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0daff17c3279448f994a7a93d305046a +timeCreated: 1499764821 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Streams/ES3FileStream.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3PlayerPrefsStream.cs b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3PlayerPrefsStream.cs new file mode 100644 index 000000000..95606ffb5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3PlayerPrefsStream.cs @@ -0,0 +1,63 @@ +using System.IO; +using UnityEngine; + +namespace ES3Internal +{ + internal class ES3PlayerPrefsStream : MemoryStream + { + private string path; + private bool append; + private bool isWriteStream = false; + private bool isDisposed = false; + + // This constructor should be used for read streams only. + public ES3PlayerPrefsStream(string path) : base(GetData(path,false)) + { + this.path = path; + this.append = false; + } + + // This constructor should be used for write streams only. + public ES3PlayerPrefsStream(string path, int bufferSize, bool append=false) : base(bufferSize) + { + this.path = path; + this.append = append; + this.isWriteStream = true; + } + + private static byte[] GetData(string path, bool isWriteStream) + { + if(!PlayerPrefs.HasKey(path)) + throw new FileNotFoundException("File \""+path+"\" could not be found in PlayerPrefs"); + return System.Convert.FromBase64String(PlayerPrefs.GetString(path)); + } + + protected override void Dispose (bool disposing) + { + if(isDisposed) + return; + isDisposed = true; + if(isWriteStream && this.Length > 0) + { + if (append) + { + // Convert data back to bytes before appending, as appending Base-64 strings directly can corrupt the data. + var sourceBytes = System.Convert.FromBase64String(PlayerPrefs.GetString(path)); + var appendBytes = this.ToArray(); + var finalBytes = new byte[sourceBytes.Length + appendBytes.Length]; + System.Buffer.BlockCopy(sourceBytes, 0, finalBytes, 0, sourceBytes.Length); + System.Buffer.BlockCopy(appendBytes, 0, finalBytes, sourceBytes.Length, appendBytes.Length); + + PlayerPrefs.SetString(path, System.Convert.ToBase64String(finalBytes)); + + PlayerPrefs.Save(); + } + else + PlayerPrefs.SetString(path + ES3IO.temporaryFileSuffix, System.Convert.ToBase64String(this.ToArray())); + // Save the timestamp to a separate key. + PlayerPrefs.SetString("timestamp_" + path, System.DateTime.UtcNow.Ticks.ToString()); + } + base.Dispose(disposing); + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3PlayerPrefsStream.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3PlayerPrefsStream.cs.meta new file mode 100644 index 000000000..26f83a3e9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3PlayerPrefsStream.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: df45161eabf2549c28f00352d4f970dc +timeCreated: 1499764823 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Streams/ES3PlayerPrefsStream.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3ResourcesStream.cs b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3ResourcesStream.cs new file mode 100644 index 000000000..fcbe196fe --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3ResourcesStream.cs @@ -0,0 +1,32 @@ +using System.IO; +using UnityEngine; + +namespace ES3Internal +{ + internal class ES3ResourcesStream : MemoryStream + { + // Check that data exists by checking stream is not empty. + public bool Exists{ get{ return this.Length > 0; } } + + // Used when creating + public ES3ResourcesStream(string path) : base(GetData(path)) + { + } + + private static byte[] GetData(string path) + { + var textAsset = Resources.Load(path) as TextAsset; + + // If data doesn't exist in Resources, return an empty byte array. + if(textAsset == null) + return new byte[0]; + + return textAsset.bytes; + } + + protected override void Dispose (bool disposing) + { + base.Dispose(disposing); + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3ResourcesStream.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3ResourcesStream.cs.meta new file mode 100644 index 000000000..b95615746 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3ResourcesStream.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: fe24380d3aca84a4d97e668349d86d37 +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Streams/ES3ResourcesStream.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3Stream.cs b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3Stream.cs new file mode 100644 index 000000000..99fcb6347 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3Stream.cs @@ -0,0 +1,123 @@ +using System.IO; +using System.IO.Compression; +using UnityEngine; +using System; + +namespace ES3Internal +{ + public static class ES3Stream + { + public static Stream CreateStream(ES3Settings settings, ES3FileMode fileMode) + { + bool isWriteStream = (fileMode != ES3FileMode.Read); + Stream stream = null; + + // If we're using File as our location, check that the path is in a valid format. + if(settings.location == ES3.Location.File) + new FileInfo(settings.FullPath); + + try + { + if (settings.location == ES3.Location.InternalMS) + { + // There's no point in creating an empty MemoryStream if we're only reading from it. + if (!isWriteStream) + return null; + stream = new MemoryStream(settings.bufferSize); + } + else if (settings.location == ES3.Location.File) + { + if (!isWriteStream && !ES3IO.FileExists(settings.FullPath)) + return null; + stream = new ES3FileStream(settings.FullPath, fileMode, settings.bufferSize, false); + } + else if (settings.location == ES3.Location.PlayerPrefs) + { + if (isWriteStream) + stream = new ES3PlayerPrefsStream(settings.FullPath, settings.bufferSize, (fileMode == ES3FileMode.Append)); + else + { + if (!PlayerPrefs.HasKey(settings.FullPath)) + return null; + stream = new ES3PlayerPrefsStream(settings.FullPath); + } + } + else if (settings.location == ES3.Location.Resources) + { + if (!isWriteStream) + { + var resourcesStream = new ES3ResourcesStream(settings.FullPath); + if (resourcesStream.Exists) + stream = resourcesStream; + else + { + resourcesStream.Dispose(); + return null; + } + } + else if (UnityEngine.Application.isEditor) + throw new System.NotSupportedException("Cannot write directly to Resources folder. Try writing to a directory outside of Resources, and then manually move the file there."); + else + throw new System.NotSupportedException("Cannot write to Resources folder at runtime. Use a different save location at runtime instead."); + } + + return CreateStream(stream, settings, fileMode); + } + catch(System.Exception e) + { + if (stream != null) + stream.Dispose(); + throw e; + } + } + + public static Stream CreateStream(Stream stream, ES3Settings settings, ES3FileMode fileMode) + { + try + { + bool isWriteStream = (fileMode != ES3FileMode.Read); + + #if !DISABLE_ENCRYPTION + // Encryption + if(settings.encryptionType != ES3.EncryptionType.None && stream.GetType() != typeof(UnbufferedCryptoStream)) + { + EncryptionAlgorithm alg = null; + if(settings.encryptionType == ES3.EncryptionType.AES) + alg = new AESEncryptionAlgorithm(); + stream = new UnbufferedCryptoStream(stream, !isWriteStream, settings.encryptionPassword, settings.bufferSize, alg); + } + #endif + + // Compression + if (settings.compressionType != ES3.CompressionType.None && stream.GetType() != typeof(GZipStream)) + { + if (settings.compressionType == ES3.CompressionType.Gzip) + stream = isWriteStream ? new GZipStream(stream, CompressionMode.Compress) : new GZipStream(stream, CompressionMode.Decompress); + } + + return stream; + } + catch (System.Exception e) + { + if (stream != null) + stream.Dispose(); + if (e.GetType() == typeof(System.Security.Cryptography.CryptographicException)) + throw new System.Security.Cryptography.CryptographicException("Could not decrypt file. Please ensure that you are using the same password used to encrypt the file."); + else + throw e; + } + } + + public static void CopyTo(Stream source, Stream destination) + { + #if UNITY_2019_1_OR_NEWER + source.CopyTo(destination); + #else + byte[] buffer = new byte[2048]; + int bytesRead; + while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0) + destination.Write(buffer, 0, bytesRead); + #endif + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3Stream.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3Stream.cs.meta new file mode 100644 index 000000000..e15708f7f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Streams/ES3Stream.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b4ec91ea5d66749aca7d5555b767728a +timeCreated: 1499764822 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Streams/ES3Stream.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types.meta b/Assets/Plugins/Easy Save 3/Scripts/Types.meta new file mode 100644 index 000000000..40da695cd --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1b8a01835c8014ce9bef4d4e31eb057b +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types.meta new file mode 100644 index 000000000..092cfa19f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1995368ea5d4c45878840cfba12bd7bd +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES32DArrayType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES32DArrayType.cs new file mode 100644 index 000000000..b3cff18c4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES32DArrayType.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; +using System.Linq; + +namespace ES3Types +{ + public class ES32DArrayType : ES3CollectionType + { + public ES32DArrayType(Type type) : base(type){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode unityObjectType) + { + var array = (System.Array)obj; + + if(elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + //writer.StartWriteCollection(); + + for(int i=0; i < array.GetLength(0); i++) + { + writer.StartWriteCollectionItem(i); + writer.StartWriteCollection(); + for(int j=0; j < array.GetLength(1); j++) + { + writer.StartWriteCollectionItem(j); + writer.Write(array.GetValue(i,j), elementType, unityObjectType); + writer.EndWriteCollectionItem(j); + } + writer.EndWriteCollection(); + writer.EndWriteCollectionItem(i); + } + + //writer.EndWriteCollection(); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + /*if(reader.StartReadCollection()) + return null; + + // Create a List to store the items as a 1D array, which we can work out the positions of by calculating the lengths of the two dimensions. + var items = new List(); + int length1 = 0; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + + ReadICollection(reader, items, elementType); + length1++; + + if(reader.EndReadCollectionItem()) + break; + } + + int length2 = items.Count / length1; + + var array = new T[length1,length2]; + + for(int i=0; i(); + int length1 = 0; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + + ReadICollection(reader, items, elementType); + length1++; + + if(reader.EndReadCollectionItem()) + break; + } + + int length2 = items.Count / length1; + + var array = ES3Reflection.ArrayCreateInstance(elementType.type, new int[]{length1, length2}); + + for(int i=0; i(ES3Reader reader, object obj) + { + ReadInto(reader, obj); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var array = (Array)obj; + + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + bool iHasBeenRead = false; + + for(int i=0; i < array.GetLength(0); i++) + { + bool jHasBeenRead = false; + + if(!reader.StartReadCollectionItem()) + throw new IndexOutOfRangeException("The collection we are loading is smaller than the collection provided as a parameter."); + + reader.StartReadCollection(); + for(int j=0; j < array.GetLength(1); j++) + { + if(!reader.StartReadCollectionItem()) + throw new IndexOutOfRangeException("The collection we are loading is smaller than the collection provided as a parameter."); + reader.ReadInto(array.GetValue(i,j), elementType); + jHasBeenRead = reader.EndReadCollectionItem(); + } + + if(!jHasBeenRead) + throw new IndexOutOfRangeException("The collection we are loading is larger than the collection provided as a parameter."); + + reader.EndReadCollection(); + + iHasBeenRead = reader.EndReadCollectionItem(); + } + + if(!iHasBeenRead) + throw new IndexOutOfRangeException("The collection we are loading is larger than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES32DArrayType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES32DArrayType.cs.meta new file mode 100644 index 000000000..b95aab98c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES32DArrayType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 16f7aabe86b814cc8a059954a1c78d25 +timeCreated: 1519132280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES32DArrayType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES33DArrayType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES33DArrayType.cs new file mode 100644 index 000000000..a424e12d4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES33DArrayType.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types + { + public class ES33DArrayType : ES3CollectionType + { + public ES33DArrayType(Type type) : base(type){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + var array = (System.Array)obj; + + if(elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + //writer.StartWriteCollection(); + + for(int i=0; i < array.GetLength(0); i++) + { + writer.StartWriteCollectionItem(i); + writer.StartWriteCollection(); + + for(int j=0; j < array.GetLength(1); j++) + { + writer.StartWriteCollectionItem(j); + writer.StartWriteCollection(); + + for(int k=0; k < array.GetLength(2); k++) + { + writer.StartWriteCollectionItem(k); + writer.Write(array.GetValue(i,j,k), elementType, memberReferenceMode); + writer.EndWriteCollectionItem(k); + } + writer.EndWriteCollection(); + writer.EndWriteCollectionItem(j); + } + writer.EndWriteCollection(); + writer.EndWriteCollectionItem(i); + } + //writer.EndWriteCollection(); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + } + + public override object Read(ES3Reader reader) + { + if(reader.StartReadCollection()) + return null; + + // Create a List to store the items as a 1D array, which we can work out the positions of by calculating the lengths of the two dimensions. + var items = new List(); + int length1 = 0; + int length2 = 0; + + // Iterate through each sub-array + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + reader.StartReadCollection(); + + length1++; + + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + + ReadICollection(reader, items, elementType); + length2++; + + if(reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + if(reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + + length2 = length2/length1; + int length3 = items.Count / length2 / length1; + + var array = ES3Reflection.ArrayCreateInstance(elementType.type, new int[]{length1,length2,length3}); + + for(int i=0; i(ES3Reader reader, object obj) + { + ReadInto(reader, obj); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var array = (Array)obj; + + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + bool iHasBeenRead = false; + + for(int i=0; i < array.GetLength(0); i++) + { + bool jHasBeenRead = false; + + if(!reader.StartReadCollectionItem()) + throw new IndexOutOfRangeException("The collection we are loading is smaller than the collection provided as a parameter."); + + reader.StartReadCollection(); + + for(int j=0; j < array.GetLength(1); j++) + { + bool kHasBeenRead = false; + + if(!reader.StartReadCollectionItem()) + throw new IndexOutOfRangeException("The collection we are loading is smaller than the collection provided as a parameter."); + + reader.StartReadCollection(); + + for(int k=0; k < array.GetLength(2); k++) + { + if(!reader.StartReadCollectionItem()) + throw new IndexOutOfRangeException("The collection we are loading is smaller than the collection provided as a parameter."); + reader.ReadInto(array.GetValue(i,j,k), elementType); + kHasBeenRead = reader.EndReadCollectionItem(); + } + + if(!kHasBeenRead) + throw new IndexOutOfRangeException("The collection we are loading is larger than the collection provided as a parameter."); + + reader.EndReadCollection(); + + jHasBeenRead = reader.EndReadCollectionItem(); + } + + if(!jHasBeenRead) + throw new IndexOutOfRangeException("The collection we are loading is larger than the collection provided as a parameter."); + + reader.EndReadCollection(); + + iHasBeenRead = reader.EndReadCollectionItem(); + } + + if(!iHasBeenRead) + throw new IndexOutOfRangeException("The collection we are loading is larger than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES33DArrayType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES33DArrayType.cs.meta new file mode 100644 index 000000000..b78bacd88 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES33DArrayType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f60b75065118c4199aeaa2c3c31ecc0f +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES33DArrayType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ArrayType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ArrayType.cs new file mode 100644 index 000000000..d27c2d78d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ArrayType.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3ArrayType : ES3CollectionType + { + public ES3ArrayType(Type type) : base(type){} + public ES3ArrayType(Type type, ES3Type elementType) : base(type, elementType){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + var array = (System.Array)obj; + + if(elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + //writer.StartWriteCollection(); + + for(int i=0; i(); + if (!ReadICollection(reader, list, elementType)) + return null; + + var array = ES3Reflection.ArrayCreateInstance(elementType.type, list.Count); + int i = 0; + foreach (var item in list) + { + array.SetValue(item, i); + i++; + } + + return array; + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + ReadICollectionInto(reader, (ICollection)obj, elementType); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var collection = (IList)obj; + + if (collection.Count == 0) + ES3Debug.LogWarning("LoadInto/ReadInto expects a collection containing instances to load data in to, but the collection is empty."); + + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + int itemsLoaded = 0; + + // Iterate through each item in the collection and try to load it. + foreach(var item in collection) + { + itemsLoaded++; + + if(!reader.StartReadCollectionItem()) + break; + + reader.ReadInto(item, elementType); + + // If we find a ']', we reached the end of the array. + if(reader.EndReadCollectionItem()) + break; + + // If there's still items to load, but we've reached the end of the collection we're loading into, throw an error. + if(itemsLoaded == collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is longer than the collection provided as a parameter."); + } + + // If we loaded fewer items than the parameter collection, throw index out of range exception. + if(itemsLoaded != collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is shorter than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ArrayType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ArrayType.cs.meta new file mode 100644 index 000000000..8e1caf110 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ArrayType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 80139e4c0efc5414caff6bb50527d63d +timeCreated: 1519132289 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ArrayType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3CollectionType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3CollectionType.cs new file mode 100644 index 000000000..ecaa2e53e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3CollectionType.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public abstract class ES3CollectionType : ES3Type + { + public ES3Type elementType; + + /*protected ES3Reflection.ES3ReflectedMethod readMethod = null; + protected ES3Reflection.ES3ReflectedMethod readIntoMethod = null;*/ + + public abstract object Read(ES3Reader reader); + public abstract void ReadInto(ES3Reader reader, object obj); + public abstract void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode); + + public ES3CollectionType(Type type) : base(type) + { + elementType = ES3TypeMgr.GetOrCreateES3Type(ES3Reflection.GetElementTypes(type)[0], false); + isCollection = true; + + // If the element type is null (i.e. unsupported), make this ES3Type null. + if(elementType == null) + isUnsupported = true; + } + + public ES3CollectionType(Type type, ES3Type elementType) : base(type) + { + this.elementType = elementType; + isCollection = true; + } + + [UnityEngine.Scripting.Preserve] + public override void Write(object obj, ES3Writer writer) + { + Write(obj, writer, ES3.ReferenceMode.ByRefAndValue); + } + + protected virtual bool ReadICollection(ES3Reader reader, ICollection collection, ES3Type elementType) + { + if(reader.StartReadCollection()) + return false; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + collection.Add(reader.Read(elementType)); + + if(reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + + return true; + } + + protected virtual void ReadICollectionInto(ES3Reader reader, ICollection collection, ES3Type elementType) + { + ReadICollectionInto(reader, collection, elementType); + } + + [UnityEngine.Scripting.Preserve] + protected virtual void ReadICollectionInto(ES3Reader reader, ICollection collection, ES3Type elementType) + { + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + int itemsLoaded = 0; + + // Iterate through each item in the collection and try to load it. + foreach(var item in collection) + { + itemsLoaded++; + + if(!reader.StartReadCollectionItem()) + break; + + reader.ReadInto(item, elementType); + + // If we find a ']', we reached the end of the array. + if(reader.EndReadCollectionItem()) + break; + + // If there's still items to load, but we've reached the end of the collection we're loading into, throw an error. + if(itemsLoaded == collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is longer than the collection provided as a parameter."); + } + + // If we loaded fewer items than the parameter collection, throw index out of range exception. + if(itemsLoaded != collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is shorter than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + + /* + * Calls the Read method using reflection so we don't need to provide a generic parameter. + */ + /*public virtual object Read(ES3Reader reader) + { + if(readMethod == null) + readMethod = ES3Reflection.GetMethod(this.GetType(), "Read", new Type[]{elementType.type}, new Type[]{typeof(ES3Reader)}); + return readMethod.Invoke(this, new object[]{reader}); + } + + public virtual void ReadInto(ES3Reader reader, object obj) + { + if(readIntoMethod == null) + readIntoMethod = ES3Reflection.GetMethod(this.GetType(), "ReadInto", new Type[]{elementType.type}, new Type[]{typeof(ES3Reader), typeof(object)}); + readIntoMethod.Invoke(this, new object[]{reader, obj}); + }*/ + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3CollectionType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3CollectionType.cs.meta new file mode 100644 index 000000000..f87456fab --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3CollectionType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 4758f55361e6f4485afe7dfdd3a3a372 +timeCreated: 1519132284 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3CollectionType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ConcurrentDictionaryType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ConcurrentDictionaryType.cs new file mode 100644 index 000000000..e7966bd40 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ConcurrentDictionaryType.cs @@ -0,0 +1,142 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3ConcurrentDictionaryType : ES3Type + { + public ES3Type keyType; + public ES3Type valueType; + + protected ES3Reflection.ES3ReflectedMethod readMethod = null; + protected ES3Reflection.ES3ReflectedMethod readIntoMethod = null; + + public ES3ConcurrentDictionaryType(Type type) : base(type) + { + var types = ES3Reflection.GetElementTypes(type); + keyType = ES3TypeMgr.GetOrCreateES3Type(types[0], false); + valueType = ES3TypeMgr.GetOrCreateES3Type(types[1], false); + + // If either the key or value type is unsupported, make this type NULL. + if(keyType == null || valueType == null) + isUnsupported = true;; + + isDictionary = true; + } + + public ES3ConcurrentDictionaryType(Type type, ES3Type keyType, ES3Type valueType) : base(type) + { + this.keyType = keyType; + this.valueType = valueType; + + // If either the key or value type is unsupported, make this type NULL. + if (keyType == null || valueType == null) + isUnsupported = true; ; + + isDictionary = true; + } + + public override void Write(object obj, ES3Writer writer) + { + Write(obj, writer, writer.settings.memberReferenceMode); + } + + public void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + var dict = (IDictionary)obj; + + //writer.StartWriteDictionary(dict.Count); + + int i=0; + foreach(System.Collections.DictionaryEntry kvp in dict) + { + writer.StartWriteDictionaryKey(i); + writer.Write(kvp.Key, keyType, memberReferenceMode); + writer.EndWriteDictionaryKey(i); + writer.StartWriteDictionaryValue(i); + writer.Write(kvp.Value, valueType, memberReferenceMode); + writer.EndWriteDictionaryValue(i); + i++; + } + + //writer.EndWriteDictionary(); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + ReadInto(reader, obj); + } + + /* + * Allows us to call the generic Read method using Reflection so we can define the generic parameter at runtime. + * It also caches the method to improve performance in later calls. + */ + public object Read(ES3Reader reader) + { + if(reader.StartReadDictionary()) + return null; + + var dict = (IDictionary)ES3Reflection.CreateInstance(type); + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadDictionaryKey()) + return dict; + var key = reader.Read(keyType); + reader.EndReadDictionaryKey(); + + reader.StartReadDictionaryValue(); + var value = reader.Read(valueType); + + dict.Add(key,value); + + if(reader.EndReadDictionaryValue()) + break; + } + + reader.EndReadDictionary(); + + return dict; + } + + public void ReadInto(ES3Reader reader, object obj) + { + if(reader.StartReadDictionary()) + throw new NullReferenceException("The Dictionary we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + var dict = (IDictionary)obj; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadDictionaryKey()) + return; + var key = reader.Read(keyType); + + if(!dict.Contains(key)) + throw new KeyNotFoundException("The key \"" + key + "\" in the Dictionary we are loading does not exist in the Dictionary we are loading into"); + var value = dict[key]; + reader.EndReadDictionaryKey(); + + reader.StartReadDictionaryValue(); + + reader.ReadInto(value, valueType); + + if(reader.EndReadDictionaryValue()) + break; + } + + reader.EndReadDictionary(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ConcurrentDictionaryType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ConcurrentDictionaryType.cs.meta new file mode 100644 index 000000000..eadf5246b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ConcurrentDictionaryType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 57aa1763324cfbd4ea9782b0ea036900 +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ConcurrentDictionaryType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3DictionaryType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3DictionaryType.cs new file mode 100644 index 000000000..104755b46 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3DictionaryType.cs @@ -0,0 +1,142 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3DictionaryType : ES3Type + { + public ES3Type keyType; + public ES3Type valueType; + + protected ES3Reflection.ES3ReflectedMethod readMethod = null; + protected ES3Reflection.ES3ReflectedMethod readIntoMethod = null; + + public ES3DictionaryType(Type type) : base(type) + { + var types = ES3Reflection.GetElementTypes(type); + keyType = ES3TypeMgr.GetOrCreateES3Type(types[0], false); + valueType = ES3TypeMgr.GetOrCreateES3Type(types[1], false); + + // If either the key or value type is unsupported, make this type NULL. + if(keyType == null || valueType == null) + isUnsupported = true;; + + isDictionary = true; + } + + public ES3DictionaryType(Type type, ES3Type keyType, ES3Type valueType) : base(type) + { + this.keyType = keyType; + this.valueType = valueType; + + // If either the key or value type is unsupported, make this type NULL. + if (keyType == null || valueType == null) + isUnsupported = true; ; + + isDictionary = true; + } + + public override void Write(object obj, ES3Writer writer) + { + Write(obj, writer, writer.settings.memberReferenceMode); + } + + public void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + var dict = (IDictionary)obj; + + //writer.StartWriteDictionary(dict.Count); + + int i=0; + foreach(System.Collections.DictionaryEntry kvp in dict) + { + writer.StartWriteDictionaryKey(i); + writer.Write(kvp.Key, keyType, memberReferenceMode); + writer.EndWriteDictionaryKey(i); + writer.StartWriteDictionaryValue(i); + writer.Write(kvp.Value, valueType, memberReferenceMode); + writer.EndWriteDictionaryValue(i); + i++; + } + + //writer.EndWriteDictionary(); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + ReadInto(reader, obj); + } + + /* + * Allows us to call the generic Read method using Reflection so we can define the generic parameter at runtime. + * It also caches the method to improve performance in later calls. + */ + public object Read(ES3Reader reader) + { + if(reader.StartReadDictionary()) + return null; + + var dict = (IDictionary)ES3Reflection.CreateInstance(type); + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadDictionaryKey()) + return dict; + var key = reader.Read(keyType); + reader.EndReadDictionaryKey(); + + reader.StartReadDictionaryValue(); + var value = reader.Read(valueType); + + dict.Add(key,value); + + if(reader.EndReadDictionaryValue()) + break; + } + + reader.EndReadDictionary(); + + return dict; + } + + public void ReadInto(ES3Reader reader, object obj) + { + if(reader.StartReadDictionary()) + throw new NullReferenceException("The Dictionary we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + var dict = (IDictionary)obj; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadDictionaryKey()) + return; + var key = reader.Read(keyType); + + if(!dict.Contains(key)) + throw new KeyNotFoundException("The key \"" + key + "\" in the Dictionary we are loading does not exist in the Dictionary we are loading into"); + var value = dict[key]; + reader.EndReadDictionaryKey(); + + reader.StartReadDictionaryValue(); + + reader.ReadInto(value, valueType); + + if(reader.EndReadDictionaryValue()) + break; + } + + reader.EndReadDictionary(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3DictionaryType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3DictionaryType.cs.meta new file mode 100644 index 000000000..92629bc21 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3DictionaryType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 2bc573810521e44bea185a4fa7c415e9 +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3DictionaryType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3HashSetType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3HashSetType.cs new file mode 100644 index 000000000..ebac2d72a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3HashSetType.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; +using System.Linq; +using System.Reflection; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3HashSetType : ES3CollectionType + { + public ES3HashSetType(Type type) : base(type){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + if (obj == null) { writer.WriteNull(); return; }; + + var list = (IEnumerable)obj; + + if (elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + int count = 0; + foreach (var item in list) + count++; + + //writer.StartWriteCollection(count); + + int i = 0; + foreach (object item in list) + { + writer.StartWriteCollectionItem(i); + writer.Write(item, elementType, memberReferenceMode); + writer.EndWriteCollectionItem(i); + i++; + } + + //writer.EndWriteCollection(); + } + + public override object Read(ES3Reader reader) + { + var val = Read(reader); + if (val == null) + return default(T); + return (T)val; + } + + + public override object Read(ES3Reader reader) + { + /*var method = typeof(ES3CollectionType).GetMethod("ReadICollection", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(elementType.type); + if(!(bool)method.Invoke(this, new object[] { reader, list, elementType })) + return null;*/ + + var genericParam = ES3Reflection.GetGenericArguments(type)[0]; + var listType = ES3Reflection.MakeGenericType(typeof(List<>), genericParam); + var list = (IList)ES3Reflection.CreateInstance(listType); + + if (!reader.StartReadCollection()) + { + // Iterate through each character until we reach the end of the array. + while (true) + { + if (!reader.StartReadCollectionItem()) + break; + list.Add(reader.Read(elementType)); + + if (reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + } + + return ES3Reflection.CreateInstance(type, list); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + ReadInto(reader, obj); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + throw new NotImplementedException("Cannot use LoadInto/ReadInto with HashSet because HashSets do not maintain the order of elements"); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3HashSetType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3HashSetType.cs.meta new file mode 100644 index 000000000..915dc17b4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3HashSetType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: e2a5f03b11de242bf9f3c6766875188b +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3HashSetType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs new file mode 100644 index 000000000..931b02fd2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3ListType : ES3CollectionType + { + public ES3ListType(Type type) : base(type){} + public ES3ListType(Type type, ES3Type elementType) : base(type, elementType){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + if(obj == null){ writer.WriteNull(); return; }; + + var list = (IList)obj; + + if(elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + //writer.StartWriteCollection(); + + int i = 0; + foreach(object item in list) + { + writer.StartWriteCollectionItem(i); + writer.Write(item, elementType, memberReferenceMode); + writer.EndWriteCollectionItem(i); + i++; + } + + //writer.EndWriteCollection(); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + + /*var list = new List(); + if(!ReadICollection(reader, list, elementType)) + return null; + return list;*/ + } + + public override void ReadInto(ES3Reader reader, object obj) + { + ReadICollectionInto(reader, (ICollection)obj, elementType); + } + + public override object Read(ES3Reader reader) + { + var instance = (IList)ES3Reflection.CreateInstance(type); + + if(reader.StartReadCollection()) + return null; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + instance.Add(reader.Read(elementType)); + + if(reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var collection = (IList)obj; + + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + int itemsLoaded = 0; + + // Iterate through each item in the collection and try to load it. + foreach(var item in collection) + { + itemsLoaded++; + + if(!reader.StartReadCollectionItem()) + break; + + reader.ReadInto(item, elementType); + + // If we find a ']', we reached the end of the array. + if(reader.EndReadCollectionItem()) + break; + + // If there's still items to load, but we've reached the end of the collection we're loading into, throw an error. + if(itemsLoaded == collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is longer than the collection provided as a parameter."); + } + + // If we loaded fewer items than the parameter collection, throw index out of range exception. + if(itemsLoaded != collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is shorter than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs.meta new file mode 100644 index 000000000..408a399d2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 3502f1923072c49498bb91827fae42eb +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3ListType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3NativeArrayType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3NativeArrayType.cs new file mode 100644 index 000000000..36b3065b1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3NativeArrayType.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; +using System.Linq; +using Unity.Collections; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3NativeArrayType : ES3CollectionType + { + public ES3NativeArrayType(Type type) : base(type){} + public ES3NativeArrayType(Type type, ES3Type elementType) : base(type, elementType){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + if (elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + var enumerable = (IEnumerable)obj; + + int i = 0; + foreach(var item in enumerable) + { + writer.StartWriteCollectionItem(i); + writer.Write(item, elementType, memberReferenceMode); + writer.EndWriteCollectionItem(i); + i++; + } + } + + public override object Read(ES3Reader reader) + { + var array = ReadAsArray(reader); + + return ES3Reflection.CreateInstance(type, new object[] { array, Allocator.Persistent }); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + ReadInto(reader, obj); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var array = ReadAsArray(reader); + var copyFromMethod = ES3Reflection.GetMethods(type, "CopyFrom").First(m => ES3Reflection.TypeIsArray(m.GetParameters()[0].GetType())); + copyFromMethod.Invoke(obj, new object[] { array }); + } + + private System.Array ReadAsArray(ES3Reader reader) + { + var list = new List(); + if (!ReadICollection(reader, list, elementType)) + return null; + + var array = ES3Reflection.ArrayCreateInstance(elementType.type, list.Count); + int i = 0; + foreach (var item in list) + { + array.SetValue(item, i); + i++; + } + + return array; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3NativeArrayType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3NativeArrayType.cs.meta new file mode 100644 index 000000000..0b9d0e977 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3NativeArrayType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0dee780de7e2d074bb6ceff11f18d540 +timeCreated: 1519132289 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3NativeArrayType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3QueueType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3QueueType.cs new file mode 100644 index 000000000..e204a53df --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3QueueType.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3QueueType : ES3CollectionType + { + public ES3QueueType(Type type) : base(type){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + var list = (ICollection)obj; + + if(elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + //writer.StartWriteCollection(); + + int i = 0; + foreach(object item in list) + { + writer.StartWriteCollectionItem(i); + writer.Write(item, elementType, memberReferenceMode); + writer.EndWriteCollectionItem(i); + i++; + } + + //writer.EndWriteCollection(); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + /*if(reader.StartReadCollection()) + return null; + + var queue = new Queue(); + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + queue.Enqueue(reader.Read(elementType)); + if(reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + return queue;*/ + } + + public override void ReadInto(ES3Reader reader, object obj) + { + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + int itemsLoaded = 0; + + var queue = (Queue)obj; + + // Iterate through each item in the collection and try to load it. + foreach(var item in queue) + { + itemsLoaded++; + + if(!reader.StartReadCollectionItem()) + break; + + reader.ReadInto(item, elementType); + + // If we find a ']', we reached the end of the array. + if(reader.EndReadCollectionItem()) + break; + // If there's still items to load, but we've reached the end of the collection we're loading into, throw an error. + if(itemsLoaded == queue.Count) + throw new IndexOutOfRangeException("The collection we are loading is longer than the collection provided as a parameter."); + } + + // If we loaded fewer items than the parameter collection, throw index out of range exception. + if(itemsLoaded != queue.Count) + throw new IndexOutOfRangeException("The collection we are loading is shorter than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + + public override object Read(ES3Reader reader) + { + var instance = (IList)ES3Reflection.CreateInstance(ES3Reflection.MakeGenericType(typeof(List<>), elementType.type)); + + if(reader.StartReadCollection()) + return null; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if (!reader.StartReadCollectionItem()) + break; + instance.Add(reader.Read(elementType)); + + if (reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + + return ES3Reflection.CreateInstance(type, instance); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + int itemsLoaded = 0; + + var collection = (ICollection)obj; + + // Iterate through each item in the collection and try to load it. + foreach(var item in collection) + { + itemsLoaded++; + + if(!reader.StartReadCollectionItem()) + break; + + reader.ReadInto(item, elementType); + + // If we find a ']', we reached the end of the array. + if(reader.EndReadCollectionItem()) + break; + // If there's still items to load, but we've reached the end of the collection we're loading into, throw an error. + if(itemsLoaded == collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is longer than the collection provided as a parameter."); + } + + // If we loaded fewer items than the parameter collection, throw index out of range exception. + if(itemsLoaded != collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is shorter than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3QueueType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3QueueType.cs.meta new file mode 100644 index 000000000..b2cf197ba --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3QueueType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0832bfdeae2dc410db8d4963332335c7 +timeCreated: 1519132279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3QueueType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3StackType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3StackType.cs new file mode 100644 index 000000000..2b20dbfff --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3StackType.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; +using System.Reflection; +using System.Linq; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3StackType : ES3CollectionType + { + public ES3StackType(Type type) : base(type){} + + public override void Write(object obj, ES3Writer writer, ES3.ReferenceMode memberReferenceMode) + { + var list = (ICollection)obj; + + if(elementType == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + + //writer.StartWriteCollection(); + + int i = 0; + foreach(object item in list) + { + writer.StartWriteCollectionItem(i); + writer.Write(item, elementType, memberReferenceMode); + writer.EndWriteCollectionItem(i); + i++; + } + + //writer.EndWriteCollection(); + } + + public override object Read(ES3Reader reader) + { + return Read(reader); + /*if(reader.StartReadCollection()) + return null; + + var stack = new Stack(); + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + stack.Push(reader.Read(elementType)); + if(reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + return stack;*/ + } + + public override void ReadInto(ES3Reader reader, object obj) + { + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + int itemsLoaded = 0; + + var stack = (Stack)obj; + + // Iterate through each item in the collection and try to load it. + foreach(var item in stack) + { + itemsLoaded++; + + if(!reader.StartReadCollectionItem()) + break; + + reader.ReadInto(item, elementType); + + // If we find a ']', we reached the end of the array. + if(reader.EndReadCollectionItem()) + break; + // If there's still items to load, but we've reached the end of the collection we're loading into, throw an error. + if(itemsLoaded == stack.Count) + throw new IndexOutOfRangeException("The collection we are loading is longer than the collection provided as a parameter."); + } + + // If we loaded fewer items than the parameter collection, throw index out of range exception. + if(itemsLoaded != stack.Count) + throw new IndexOutOfRangeException("The collection we are loading is shorter than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + + public override object Read(ES3Reader reader) + { + var instance = (IList)ES3Reflection.CreateInstance(ES3Reflection.MakeGenericType(typeof(List<>), elementType.type)); + + if(reader.StartReadCollection()) + return null; + + // Iterate through each character until we reach the end of the array. + while(true) + { + if(!reader.StartReadCollectionItem()) + break; + instance.Add(reader.Read(elementType)); + + if(reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + + ES3Reflection.GetMethods(instance.GetType(), "Reverse").FirstOrDefault(t => !t.IsStatic).Invoke(instance, new object[]{}); + return ES3Reflection.CreateInstance(type, instance); + + } + + public override void ReadInto(ES3Reader reader, object obj) + { + if(reader.StartReadCollection()) + throw new NullReferenceException("The Collection we are trying to load is stored as null, which is not allowed when using ReadInto methods."); + + int itemsLoaded = 0; + + var collection = (ICollection)obj; + + // Iterate through each item in the collection and try to load it. + foreach(var item in collection) + { + itemsLoaded++; + + if(!reader.StartReadCollectionItem()) + break; + + reader.ReadInto(item, elementType); + + // If we find a ']', we reached the end of the array. + if(reader.EndReadCollectionItem()) + break; + // If there's still items to load, but we've reached the end of the collection we're loading into, throw an error. + if(itemsLoaded == collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is longer than the collection provided as a parameter."); + } + + // If we loaded fewer items than the parameter collection, throw index out of range exception. + if(itemsLoaded != collection.Count) + throw new IndexOutOfRangeException("The collection we are loading is shorter than the collection provided as a parameter."); + + reader.EndReadCollection(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3StackType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3StackType.cs.meta new file mode 100644 index 000000000..df35447a9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3StackType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 45a74cb7ab3d648208c9f89b7be930a7 +timeCreated: 1519132284 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3StackType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3TupleType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3TupleType.cs new file mode 100644 index 000000000..cf53b5a3d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3TupleType.cs @@ -0,0 +1,78 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3TupleType : ES3Type + { + public ES3Type[] es3Types; + public Type[] types; + + protected ES3Reflection.ES3ReflectedMethod readMethod = null; + protected ES3Reflection.ES3ReflectedMethod readIntoMethod = null; + + public ES3TupleType(Type type) : base(type) + { + types = ES3Reflection.GetElementTypes(type); + es3Types = new ES3Type[types.Length]; + + for(int i=0; i(ES3Reader reader) + { + var objects = new object[types.Length]; + + if (reader.StartReadCollection()) + return null; + + for(int i=0; i(es3Types[i]); + reader.EndReadCollectionItem(); + } + + reader.EndReadCollection(); + + var constructor = type.GetConstructor(types); + var instance = constructor.Invoke(objects); + + return instance; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3TupleType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3TupleType.cs.meta new file mode 100644 index 000000000..f97e28b3c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3TupleType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 8d2309c133bf4514784522dda2afb0fc +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3TupleType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3Type_ArrayList.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3Type_ArrayList.cs new file mode 100644 index 000000000..fa97fdbfb --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3Type_ArrayList.cs @@ -0,0 +1,66 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("_items", "_size", "_version")] + public class ES3Type_ArrayList : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_ArrayList() : base(typeof(System.Collections.ArrayList)) { Instance = this; } + + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (System.Collections.ArrayList)obj; + + writer.WritePrivateField("_items", instance); + writer.WritePrivateField("_size", instance); + writer.WritePrivateField("_version", instance); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (System.Collections.ArrayList)obj; + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + + case "_items": + instance = (System.Collections.ArrayList)reader.SetPrivateField("_items", reader.Read(), instance); + break; + case "_size": + instance = (System.Collections.ArrayList)reader.SetPrivateField("_size", reader.Read(), instance); + break; + case "_version": + instance = (System.Collections.ArrayList)reader.SetPrivateField("_version", reader.Read(), instance); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new System.Collections.ArrayList(); + ReadObject(reader, instance); + return instance; + } + } + + + public class ES3UserType_ArrayListArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3UserType_ArrayListArray() : base(typeof(System.Collections.ArrayList[]), ES3Type_ArrayList.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3Type_ArrayList.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3Type_ArrayList.cs.meta new file mode 100644 index 000000000..960df4db9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3Type_ArrayList.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 49ea5f9a0f640d440a9bd514cd7a7ad0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Collection Types/ES3Type_ArrayList.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs new file mode 100644 index 000000000..b63a593e7 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs @@ -0,0 +1,145 @@ +using System; +using UnityEngine; +using System.Collections; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public abstract class ES3ComponentType : ES3UnityObjectType + { + public ES3ComponentType(Type type) : base(type) { } + + protected abstract void WriteComponent(object obj, ES3Writer writer); + protected abstract void ReadComponent(ES3Reader reader, object obj); + + protected const string gameObjectPropertyName = "goID"; + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = obj as Component; + if (obj != null && instance == null) + throw new ArgumentException("Only types of UnityEngine.Component can be written with this method, but argument given is type of " + obj.GetType()); + + var refMgr = ES3ReferenceMgrBase.GetManagerFromScene(instance.gameObject.scene); + + if (refMgr != null) + { + // Write the reference of the GameObject so we know what one to attach it to. + writer.WriteProperty(gameObjectPropertyName, refMgr.Add(instance.gameObject).ToString(), ES3Type_string.Instance); + } + WriteComponent(instance, writer); + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + ReadComponent(reader, obj); + } + + protected override object ReadUnityObject(ES3Reader reader) + { + throw new NotImplementedException(); + } + + /* + * It's IMPORTANT that we override ReadObject in ES3UnityObjectType rather than use ReadUnityObject because otherwise the first IF statement will never be called, + * and we will never get the reference ID for the Component we're loading, so if we create a new Component we cannot assign it's correct reference ID. + */ + protected override object ReadObject(ES3Reader reader) + { + var refMgr = ES3ReferenceMgrBase.Current; + long id = -1; + UnityEngine.Object instance = null; + + foreach (string propertyName in reader.Properties) + { + if (propertyName == ES3ReferenceMgrBase.referencePropertyName) + { + id = reader.Read_ref(); + instance = refMgr.Get(id, true); + + /*if (instance != null) + break;*/ + } + else if (propertyName == gameObjectPropertyName) + { + long goID = reader.Read_ref(); + + // If we already have an instance for this Component, don't attempt to create a new GameObject for it. + if (instance != null) + break; + + var go = (GameObject)refMgr.Get(goID, type); + + if (go == null) + { + go = new GameObject("Easy Save 3 Loaded GameObject"); +#if UNITY_EDITOR + go.AddComponent().SetMessage("This GameObject was created because Easy Save could not find a GameObject in the scene with the same instance ID as the GameObject the Component we are loading is attached to.\nTo prevent this from being created, use the LoadInto methods to tell Easy Save what Component the data should be loaded in to."); +#endif + refMgr.Add(go, goID); + } + instance = GetOrAddComponent(go, type); + refMgr.Add(instance, id); + break; + } + else + { + reader.overridePropertiesName = propertyName; + if (instance == null) + { + var go = new GameObject("Easy Save 3 Loaded GameObject"); +#if UNITY_EDITOR + go.AddComponent().SetMessage("This GameObject was created because Easy Save could not find a GameObject in the scene with the same instance ID as the GameObject the Component we are loading is attached to.\nTo prevent this from being created, use the LoadInto methods to tell Easy Save what Component the data should be loaded in to."); +#endif + instance = GetOrAddComponent(go, type); + refMgr.Add(instance, id); + refMgr.Add(go); + } + break; + } + } + + if(instance != null) + ReadComponent(reader, instance); + + return instance; + } + + private static Component GetOrAddComponent(GameObject go, Type type) + { + var c = go.GetComponent(type); + if (c != null) + return c; + return go.AddComponent(type); + + /*if (type == typeof(Transform)) + return go.GetComponent(type); + // Manage types which can only have a single Component attached. + else if (type == typeof(MeshFilter) || type.Name.ToString().Contains("Renderer") || ES3Reflection.AttributeIsDefined(type, typeof(DisallowMultipleComponent))) + return GetOrCreateComponentIfNotExists(go, type); + return go.AddComponent(type);*/ + } + + public static Component CreateComponent(Type type) + { + GameObject go = new GameObject("Easy Save 3 Loaded Component"); +#if UNITY_EDITOR + // If we're running in the Editor, add a description explaining why this object was created. + go.AddComponent().SetMessage("This GameObject was created because Easy Save tried to load a Component with an instance ID which does not exist in this scene.\nTo prevent this from being created, use the LoadInto methods to tell Easy Save what Component the data should be loaded in to.\nThis can also happen if you load a class which references another object, but that object has not yet been loaded. In this case, you should load the object the class references before loading the class."); +#endif + if (type == typeof(Transform)) + return go.GetComponent(type); + return GetOrAddComponent(go, type); + } + + // Creates a Component if one doesn't exist, or returns the existing instance. + /*public static Component GetOrCreateComponentIfNotExists(GameObject go, Type type) + { + Component mf; + if ((mf = go.GetComponent(type)) != null) + return mf; + return go.AddComponent(type); + }*/ + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs.meta new file mode 100644 index 000000000..7c02fb1bf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 6d82e3d10b49c4028bca528611e53210 +timeCreated: 1499764822 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/ES3ComponentType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ObjectType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ObjectType.cs new file mode 100644 index 000000000..093caade5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ObjectType.cs @@ -0,0 +1,80 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public abstract class ES3ObjectType : ES3Type + { + public ES3ObjectType(Type type) : base(type) {} + + protected abstract void WriteObject(object obj, ES3Writer writer); + protected abstract object ReadObject(ES3Reader reader); + + protected virtual void ReadObject(ES3Reader reader, object obj) + { + throw new NotSupportedException("ReadInto is not supported for type "+type); + } + + public override void Write(object obj, ES3Writer writer) + { + if (!WriteUsingDerivedType(obj, writer)) + { + var baseType = ES3Reflection.BaseType(obj.GetType()); + if (baseType != typeof(object)) + { + var es3Type = ES3TypeMgr.GetOrCreateES3Type(baseType, false); + // If it's a Dictionary or Collection, we need to write it as a field with a property name. + if (es3Type != null && (es3Type.isDictionary || es3Type.isCollection)) + writer.WriteProperty("_Values", obj, es3Type); + } + + WriteObject(obj, writer); + } + } + + public override object Read(ES3Reader reader) + { + string propertyName; + while(true) + { + propertyName = ReadPropertyName(reader); + + if(propertyName == ES3Type.typeFieldName) + return ES3TypeMgr.GetOrCreateES3Type(reader.ReadType()).Read(reader); + else + { + reader.overridePropertiesName = propertyName; + + return ReadObject(reader); + } + } + } + + public override void ReadInto(ES3Reader reader, object obj) + { + string propertyName; + while(true) + { + propertyName = ReadPropertyName(reader); + + if(propertyName == ES3Type.typeFieldName) + { + ES3TypeMgr.GetOrCreateES3Type(reader.ReadType()).ReadInto(reader, obj); + return; + } + // This is important we return if the enumerator returns null, otherwise we will encounter an endless cycle. + else if (propertyName == null) + return; + else + { + reader.overridePropertiesName = propertyName; + ReadObject(reader, obj); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ObjectType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ObjectType.cs.meta new file mode 100644 index 000000000..13f88c1de --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ObjectType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 2becffd8c9d4e4e0db6031d9680eae48 +timeCreated: 1499764821 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/ES3ObjectType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Property.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Property.cs new file mode 100644 index 000000000..26e6369d6 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Property.cs @@ -0,0 +1,30 @@ +using System; +using System.ComponentModel; + +namespace ES3Internal +{ + public class ES3Member + { + public string name; + public Type type; + public bool isProperty; + public ES3Reflection.ES3ReflectedMember reflectedMember; + public bool useReflection = false; + + public ES3Member(string name, Type type, bool isProperty) + { + this.name = name; + this.type = type; + this.isProperty = isProperty; + } + + public ES3Member(ES3Reflection.ES3ReflectedMember reflectedMember) + { + this.reflectedMember = reflectedMember; + this.name = reflectedMember.Name; + this.type = reflectedMember.MemberType; + this.isProperty = reflectedMember.isProperty; + this.useReflection = true; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Property.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Property.cs.meta new file mode 100644 index 000000000..1b59dacac --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Property.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b987e63c8e10f448c8364eaceddd96e5 +timeCreated: 1519132295 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/ES3Property.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs new file mode 100644 index 000000000..d3880559c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs @@ -0,0 +1,75 @@ +using System; +using UnityEngine; +using System.Collections; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public abstract class ES3ScriptableObjectType : ES3UnityObjectType + { + public ES3ScriptableObjectType(Type type) : base(type) {} + + protected abstract void WriteScriptableObject(object obj, ES3Writer writer); + protected abstract void ReadScriptableObject(ES3Reader reader, object obj); + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = obj as ScriptableObject; + if(obj != null && instance == null) + throw new ArgumentException("Only types of UnityEngine.ScriptableObject can be written with this method, but argument given is type of "+obj.GetType()); + + // If this object is in the instance manager, store it's instance ID with it. + /*var refMgr = ES3ReferenceMgrBase.Current; + if(refMgr != null) + writer.WriteRef(instance);*/ + WriteScriptableObject(instance, writer); + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + ReadScriptableObject(reader, obj); + } + + protected override object ReadUnityObject(ES3Reader reader) + { + throw new NotImplementedException(); + } + + + protected override object ReadObject(ES3Reader reader) + { + var refMgr = ES3ReferenceMgrBase.Current; + long id = -1; + UnityEngine.Object instance = null; + + foreach(string propertyName in reader.Properties) + { + if(propertyName == ES3ReferenceMgrBase.referencePropertyName && refMgr != null) + { + id = reader.Read_ref(); + instance = refMgr.Get(id, type); + + if (instance != null) + break; + } + else + { + reader.overridePropertiesName = propertyName; + + if (instance == null) + { + instance = ScriptableObject.CreateInstance(type); + if (refMgr != null) + refMgr.Add(instance, id); + } + + break; + } + } + + ReadScriptableObject(reader, instance); + return instance; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs.meta new file mode 100644 index 000000000..4351d0ae9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: a26529496f04146959460074ab1a9b3f +timeCreated: 1519132293 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/ES3ScriptableObjectType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Type.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Type.cs new file mode 100644 index 000000000..c2d5a3a2b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3Type.cs @@ -0,0 +1,194 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; +using System.Linq; + +namespace ES3Types +{ + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + [UnityEngine.Scripting.Preserve] + public abstract class ES3Type + { + public const string typeFieldName = "__type"; + + public ES3Member[] members; + public Type type; + public bool isPrimitive = false; + public bool isValueType = false; + public bool isCollection = false; + public bool isDictionary = false; + public bool isTuple = false; + public bool isEnum = false; + public bool isES3TypeUnityObject = false; + public bool isReflectedType = false; + public bool isUnsupported = false; + public int priority = 0; + + protected ES3Type(Type type) + { + // It's important the type is added here, otherwise it may cause a StackOverflow if the class has a field of the same type as itself (or collection). + ES3TypeMgr.Add(type, this); + this.type = type; + this.isValueType = ES3Reflection.IsValueType(type); + } + + public abstract void Write(object obj, ES3Writer writer); + public abstract object Read(ES3Reader reader); + + public virtual void ReadInto(ES3Reader reader, object obj) + { + throw new NotImplementedException("Self-assigning Read is not implemented or supported on this type."); + } + + protected bool WriteUsingDerivedType(object obj, ES3Writer writer) + { + var objType = obj.GetType(); + + if(objType != this.type) + { + writer.WriteType(objType); + ES3TypeMgr.GetOrCreateES3Type(objType).Write(obj, writer); + return true; + } + return false; + } + + protected void ReadUsingDerivedType(ES3Reader reader, object obj) + { + ES3TypeMgr.GetOrCreateES3Type(reader.ReadType()).ReadInto(reader, obj); + } + + internal string ReadPropertyName(ES3Reader reader) + { + if(reader.overridePropertiesName != null) + { + string propertyName = reader.overridePropertiesName; + reader.overridePropertiesName = null; + return propertyName; + } + return reader.ReadPropertyName(); + } + + #region Reflection Methods + + protected void WriteProperties(object obj, ES3Writer writer) + { + if(members == null) + GetMembers(writer.settings.safeReflection); + + for(int i=0; i(reader); + foreach (DictionaryEntry kvp in loaded) + dict[kvp.Key] = kvp.Value; + } + else if(baseType.isCollection) + { + var loaded = (IEnumerable)baseType.Read(reader); + + var type = baseType.GetType(); + + if (type == typeof(ES3ListType)) + foreach (var item in loaded) + ((IList)obj).Add(item); + else if (type == typeof(ES3QueueType)) + { + var method = baseType.type.GetMethod("Enqueue"); + foreach (var item in loaded) + method.Invoke(obj, new object[] { item }); + } + else if (type == typeof(ES3StackType)) + { + var method = baseType.type.GetMethod("Push"); + foreach (var item in loaded) + method.Invoke(obj, new object[] { item }); + } + else if (type == typeof(ES3HashSetType)) + { + var method = baseType.type.GetMethod("Add"); + foreach (var item in loaded) + method.Invoke(obj, new object[] { item }); + } + } + } + + if (property == null) + reader.Skip(); + else + { + var type = ES3TypeMgr.GetOrCreateES3Type(property.type); + + if(ES3Reflection.IsAssignableFrom(typeof(ES3DictionaryType), type.GetType())) + property.reflectedMember.SetValue(obj, ((ES3DictionaryType)type).Read(reader)); + else if(ES3Reflection.IsAssignableFrom(typeof(ES3CollectionType), type.GetType())) + property.reflectedMember.SetValue(obj, ((ES3CollectionType)type).Read(reader)); + else + { + object readObj = reader.Read(type); + property.reflectedMember.SetValue(obj, readObj); + } + } + } + return obj; + } + + protected void GetMembers(bool safe) + { + GetMembers(safe, null); + } + + protected void GetMembers(bool safe, string[] memberNames) + { + var serializedMembers = ES3Reflection.GetSerializableMembers(type, safe, memberNames); + + members = new ES3Member[serializedMembers.Length]; + for(int i=0; i types = null; + + // We cache the last accessed type as we quite often use the same type multiple times, + // so this improves performance as another lookup is not required. + private static ES3Type lastAccessedType = null; + + public static ES3Type GetOrCreateES3Type(Type type, bool throwException = true) + { + if(types == null) + Init(); + + if (type != typeof(object) && lastAccessedType != null && lastAccessedType.type == type) + return lastAccessedType; + + // If type doesn't exist, create one. + if(types.TryGetValue(type, out lastAccessedType)) + return lastAccessedType; + return (lastAccessedType = CreateES3Type(type, throwException)); + } + + public static ES3Type GetES3Type(Type type) + { + if(types == null) + Init(); + + if(types.TryGetValue(type, out lastAccessedType)) + return lastAccessedType; + return null; + } + + internal static void Add(Type type, ES3Type es3Type) + { + if(types == null) + Init(); + + var existingType = GetES3Type(type); + if (existingType != null && existingType.priority > es3Type.priority) + return; + + lock (_lock) + { + types[type] = es3Type; + } + } + + internal static ES3Type CreateES3Type(Type type, bool throwException = true) + { + ES3Type es3Type; + + if(ES3Reflection.IsEnum(type)) + return new ES3Type_enum(type); + else if(ES3Reflection.TypeIsArray(type)) + { + int rank = ES3Reflection.GetArrayRank(type); + if(rank == 1) + es3Type = new ES3ArrayType(type); + else if(rank == 2) + es3Type = new ES32DArrayType(type); + else if(rank == 3) + es3Type = new ES33DArrayType(type); + else if(throwException) + throw new NotSupportedException("Only arrays with up to three dimensions are supported by Easy Save."); + else + return null; + } + else if(ES3Reflection.IsGenericType(type) && ES3Reflection.ImplementsInterface(type, typeof(IEnumerable))) + { + Type genericType = ES3Reflection.GetGenericTypeDefinition(type); + if (typeof(List<>).IsAssignableFrom(genericType)) + es3Type = new ES3ListType(type); + else if (typeof(Dictionary<,>).IsAssignableFrom(genericType)) + es3Type = new ES3DictionaryType(type); + else if (genericType == typeof(Queue<>)) + es3Type = new ES3QueueType(type); + else if (genericType == typeof(Stack<>)) + es3Type = new ES3StackType(type); + else if (genericType == typeof(HashSet<>)) + es3Type = new ES3HashSetType(type); + else if (genericType == typeof(Unity.Collections.NativeArray<>)) + es3Type = new ES3NativeArrayType(type); + // Else see if there is an ES3Type with the generic type definition. + else if((es3Type = GetES3Type(genericType)) != null) + { + + } + else if (throwException) + throw new NotSupportedException("Generic type \"" + type.ToString() + "\" is not supported by Easy Save."); + else + return null; + } + else if(ES3Reflection.IsPrimitive(type)) // ERROR: We should not have to create an ES3Type for a primitive. + { + if(types == null || types.Count == 0) // If the type list is not initialised, it is most likely an initialisation error. + throw new TypeLoadException("ES3Type for primitive could not be found, and the type list is empty. Please contact Easy Save developers at http://www.moodkie.com/contact"); + else // Else it's a different error, possibly an error in the specific ES3Type for that type. + throw new TypeLoadException("ES3Type for primitive could not be found, but the type list has been initialised and is not empty. Please contact Easy Save developers on mail@moodkie.com"); + } + else + { + if (ES3Reflection.IsAssignableFrom(typeof(Component), type)) + es3Type = new ES3ReflectedComponentType(type); + else if (ES3Reflection.IsValueType(type)) + es3Type = new ES3ReflectedValueType(type); + else if (ES3Reflection.IsAssignableFrom(typeof(ScriptableObject), type)) + es3Type = new ES3ReflectedScriptableObjectType(type); + else if (ES3Reflection.IsAssignableFrom(typeof(UnityEngine.Object), type)) + es3Type = new ES3ReflectedUnityObjectType(type); + /*else if (ES3Reflection.HasParameterlessConstructor(type) || ES3Reflection.IsAbstract(type) || ES3Reflection.IsInterface(type)) + es3Type = new ES3ReflectedObjectType(type);*/ + else if (type.Name.StartsWith("Tuple`")) + es3Type = new ES3TupleType(type); + /*else if (throwException) + throw new NotSupportedException("Type of " + type + " is not supported as it does not have a parameterless constructor. Only value types, Components or ScriptableObjects are supportable without a parameterless constructor. However, you may be able to create an ES3Type script to add support for it.");*/ + else + es3Type = new ES3ReflectedObjectType(type); + } + + if(es3Type.type == null || es3Type.isUnsupported) + { + if(throwException) + throw new NotSupportedException(string.Format("ES3Type.type is null when trying to create an ES3Type for {0}, possibly because the element type is not supported.", type)); + return null; + } + + Add(type, es3Type); + return es3Type; + } + + internal static void Init() + { + lock (_lock) + { + types = new Dictionary(); + + var instances = ES3Reflection.GetInstances(); // ES3Types add themselves to the manager when instantiated to ensure they don't cause cyclic references if they contain a field which is the same type as themselves. + + /*foreach(var instance in instances) + ES3TypeMgr.Add(instance.type, instance);*/ + + // Check that the type list was initialised correctly. + if (types == null || types.Count == 0) + throw new TypeLoadException("Type list could not be initialised. Please contact Easy Save developers on mail@moodkie.com."); + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3TypeMgr.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3TypeMgr.cs.meta new file mode 100644 index 000000000..31c4e1352 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3TypeMgr.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: ed6202a98cbc545a0842c63cf8894b99 +timeCreated: 1499764823 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/ES3TypeMgr.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs new file mode 100644 index 000000000..03e61bc9d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs @@ -0,0 +1,123 @@ +using System; +using UnityEngine; +using System.Collections; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public abstract class ES3UnityObjectType : ES3ObjectType + { + public ES3UnityObjectType(Type type) : base(type) + { + this.isValueType = false; + isES3TypeUnityObject = true; + } + + protected abstract void WriteUnityObject(object obj, ES3Writer writer); + protected abstract void ReadUnityObject(ES3Reader reader, object obj); + protected abstract object ReadUnityObject(ES3Reader reader); + + protected override void WriteObject(object obj, ES3Writer writer) + { + WriteObject(obj, writer, ES3.ReferenceMode.ByRefAndValue); + } + + public virtual void WriteObject(object obj, ES3Writer writer, ES3.ReferenceMode mode) + { + if(WriteUsingDerivedType(obj, writer, mode)) + return; + var instance = obj as UnityEngine.Object; + if(obj != null && instance == null) + throw new ArgumentException("Only types of UnityEngine.Object can be written with this method, but argument given is type of "+obj.GetType()); + + // If this object is in the instance manager, store it's instance ID with it. + if(mode != ES3.ReferenceMode.ByValue) + { + var refMgr = ES3ReferenceMgrBase.Current; + if (refMgr == null) + throw new InvalidOperationException($"An Easy Save 3 Manager is required to save references. To add one to your scene, exit playmode and go to Tools > Easy Save 3 > Add Manager to Scene. Object being saved by reference is {instance.GetType()} with name {instance.name}."); + writer.WriteRef(instance); + if(mode == ES3.ReferenceMode.ByRef) + return; + } + WriteUnityObject(instance, writer); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var refMgr = ES3ReferenceMgrBase.Current; + if (refMgr != null) + { + foreach (string propertyName in reader.Properties) + { + if (propertyName == ES3ReferenceMgrBase.referencePropertyName) + // If the object we're loading into isn't registered with the reference manager, register it. + refMgr.Add((UnityEngine.Object)obj, reader.Read_ref()); + else + { + reader.overridePropertiesName = propertyName; + break; + } + } + } + ReadUnityObject(reader, obj); + } + + protected override object ReadObject(ES3Reader reader) + { + var refMgr = ES3ReferenceMgrBase.Current; + if(refMgr == null) + return ReadUnityObject(reader); + + long id = -1; + UnityEngine.Object instance = null; + + foreach(string propertyName in reader.Properties) + { + if(propertyName == ES3ReferenceMgrBase.referencePropertyName) + { + if(refMgr == null) + throw new InvalidOperationException($"An Easy Save 3 Manager is required to save references. To add one to your scene, exit playmode and go to Tools > Easy Save 3 > Add Manager to Scene. Object being saved by reference is {instance.GetType()} with name {instance.name}."); + id = reader.Read_ref(); + instance = refMgr.Get(id, type); + + if(instance != null) + break; + } + else + { + reader.overridePropertiesName = propertyName; + if (instance == null) + { + instance = (UnityEngine.Object)ReadUnityObject(reader); + refMgr.Add(instance, id); + } + break; + } + } + + ReadUnityObject(reader, instance); + return instance; + } + + protected bool WriteUsingDerivedType(object obj, ES3Writer writer, ES3.ReferenceMode mode) + { + var objType = obj.GetType(); + + if (objType != this.type) + { + writer.WriteType(objType); + + var es3Type = ES3TypeMgr.GetOrCreateES3Type(objType); + if (es3Type is ES3UnityObjectType) + ((ES3UnityObjectType)es3Type).WriteObject(obj, writer, mode); + else + es3Type.Write(obj, writer); + + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs.meta new file mode 100644 index 000000000..54e3b7874 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 6206e73d6e9414301b5475296e1103a2 +timeCreated: 1519132286 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/ES3UnityObjectType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types.meta new file mode 100644 index 000000000..f2de0321b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 01ada09c8494e744a87f6e4bc52f3235 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_BigInteger.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_BigInteger.cs new file mode 100644 index 000000000..f9fae4079 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_BigInteger.cs @@ -0,0 +1,38 @@ +using System.Numerics; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3Properties("bytes")] + public class ES3Type_BigInteger : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_BigInteger() : base(typeof(BigInteger)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + BigInteger casted = (BigInteger)obj; + writer.WriteProperty("bytes", casted.ToByteArray(), ES3Type_byteArray.Instance); + } + + public override object Read(ES3Reader reader) + { + return new BigInteger(reader.ReadProperty(ES3Type_byteArray.Instance)); + } + } + + public class ES3Type_BigIntegerArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_BigIntegerArray() : base(typeof(BigInteger[]), ES3Type_BigInteger.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_BigInteger.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_BigInteger.cs.meta new file mode 100644 index 000000000..07afcfb61 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_BigInteger.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b3375f14105a7074b92a27519e7a9bb4 +timeCreated: 1538210707 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_BigInteger.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Random.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Random.cs new file mode 100644 index 000000000..1a51b47b7 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Random.cs @@ -0,0 +1,71 @@ +/* + * System.Random is no longer serializable at runtime due to Unity changing the implementation away from .NET. + */ + +using System; +using UnityEngine; + +namespace ES3Types +{ +#if !UNITY_2021_2_OR_NEWER + + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("inext", "inextp", "SeedArray")] + public class ES3Type_Random : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_Random() : base(typeof(System.Random)){ Instance = this; } + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (System.Random)obj; + + writer.WritePrivateField("inext", instance); + writer.WritePrivateField("inextp", instance); + writer.WritePrivateField("SeedArray", instance); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (System.Random)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "inext": + reader.SetPrivateField("inext", reader.Read(), instance); + break; + case "inextp": + reader.SetPrivateField("inextp", reader.Read(), instance); + break; + case "SeedArray": + reader.SetPrivateField("SeedArray", reader.Read(), instance); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new System.Random(); + ReadObject(reader, instance); + return instance; + } + } + + public class ES3Type_RandomArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_RandomArray() : base(typeof(System.Random[]), ES3Type_Random.Instance) + { + Instance = this; + } + } +#endif +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Random.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Random.cs.meta new file mode 100644 index 000000000..4c74eb0e5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Random.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 84232cc4cb5a646249f6ebe5eeee1e97 +timeCreated: 1538210707 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Random.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Type.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Type.cs new file mode 100644 index 000000000..1a3cf7e53 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Type.cs @@ -0,0 +1,27 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3Properties()] + public class ES3Type_Type : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Type() : base(typeof(System.Type)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Type type = (Type)obj; + writer.WriteProperty("assemblyQualifiedName", type.AssemblyQualifiedName); + } + + public override object Read(ES3Reader reader) + { + return Type.GetType(reader.ReadProperty()); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Type.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Type.cs.meta new file mode 100644 index 000000000..fe44fd0ec --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Type.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 1fe3873c075a7c2409980f2e5e400017 +timeCreated: 1538210707 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/NET Types/ES3Type_Type.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types.meta new file mode 100644 index 000000000..ec25ae607 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 045cb4c329b0141ea8d3acd96dff32c2 +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_DateTime.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_DateTime.cs new file mode 100644 index 000000000..0dbd8eb0d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_DateTime.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_DateTime : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_DateTime() : base(typeof(DateTime)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WriteProperty("ticks", ((DateTime)obj).Ticks, ES3Type_long.Instance); + } + + public override object Read(ES3Reader reader) + { + reader.ReadPropertyName(); + return new DateTime(reader.Read(ES3Type_long.Instance)); + } + } + + public class ES3Type_DateTimeArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_DateTimeArray() : base(typeof(DateTime[]), ES3Type_DateTime.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_DateTime.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_DateTime.cs.meta new file mode 100644 index 000000000..ac1ca3e2d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_DateTime.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9c9737ff78c714548af339e220b90303 +timeCreated: 1519132292 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_DateTime.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ES3Ref.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ES3Ref.cs new file mode 100644 index 000000000..9fffa4c89 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ES3Ref.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_ES3Ref : ES3Type + { + public static ES3Type Instance = new ES3Type_ES3Ref(); + + public ES3Type_ES3Ref() : base(typeof(long)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive(((long)obj).ToString()); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)new ES3Ref(reader.Read_ref()); + } + } + + public class ES3Type_ES3RefArray : ES3ArrayType + { + public static ES3Type Instance = new ES3Type_ES3RefArray(); + + public ES3Type_ES3RefArray() : base(typeof(ES3Ref[]), ES3Type_ES3Ref.Instance) + { + Instance = this; + } + } + + public class ES3Type_ES3RefDictionary : ES3DictionaryType + { + public static ES3Type Instance = new ES3Type_ES3RefDictionary(); + + public ES3Type_ES3RefDictionary() : base(typeof(Dictionary), ES3Type_ES3Ref.Instance, ES3Type_ES3Ref.Instance) + { + Instance = this; + } + } +} + +public class ES3Ref +{ + public long id; + public ES3Ref(long id) + { + this.id = id; + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ES3Ref.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ES3Ref.cs.meta new file mode 100644 index 000000000..4cd01c0dd --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ES3Ref.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: ab1dd0b4209f2c144ad424236e639426 +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ES3Ref.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_UIntPtr.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_UIntPtr.cs new file mode 100644 index 000000000..05e8b494c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_UIntPtr.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_UIntPtr : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_UIntPtr() : base(typeof(UIntPtr)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((ulong)obj); + } + + public override object Read(ES3Reader reader) + { + return (object)reader.Read_ulong(); + } + } + + public class ES3Type_UIntPtrArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_UIntPtrArray() : base(typeof(UIntPtr[]), ES3Type_UIntPtr.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_UIntPtr.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_UIntPtr.cs.meta new file mode 100644 index 000000000..a1a0e779a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_UIntPtr.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 6fe9eb4dc6fa54989a516115e34602df +timeCreated: 1519132288 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_UIntPtr.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_bool.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_bool.cs new file mode 100644 index 000000000..3a4dd535f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_bool.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_bool : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_bool() : base(typeof(bool)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((bool)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_bool(); + } + } + + public class ES3Type_boolArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_boolArray() : base(typeof(bool[]), ES3Type_bool.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_bool.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_bool.cs.meta new file mode 100644 index 000000000..658ddc609 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_bool.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 6fa779d8184f649f897074ba540ab1f9 +timeCreated: 1519132288 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_bool.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byte.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byte.cs new file mode 100644 index 000000000..00504ff09 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byte.cs @@ -0,0 +1,27 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_byte : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_byte() : base(typeof(byte)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((byte)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_byte(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byte.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byte.cs.meta new file mode 100644 index 000000000..9248e97ac --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byte.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0c6f8718240d84f40a9d4b3ac41b3398 +timeCreated: 1519132280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byte.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byteArray.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byteArray.cs new file mode 100644 index 000000000..6ea34b3ac --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byteArray.cs @@ -0,0 +1,27 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_byteArray : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_byteArray() : base(typeof(byte[])) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((byte[])obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_byteArray(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byteArray.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byteArray.cs.meta new file mode 100644 index 000000000..aa88bf04f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byteArray.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 59bd4a4624c4a4082bb3b8333a399ee2 +timeCreated: 1519132286 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_byteArray.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_char.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_char.cs new file mode 100644 index 000000000..47c7466d7 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_char.cs @@ -0,0 +1,33 @@ +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_char : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_char() : base(typeof(char)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((char)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_char(); + } + } + public class ES3Type_charArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_charArray() : base(typeof(char[]), ES3Type_char.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_char.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_char.cs.meta new file mode 100644 index 000000000..57d1a19bb --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_char.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: fdc3981e5018244468c97a2bbcbb610a +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_char.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_decimal.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_decimal.cs new file mode 100644 index 000000000..50e9428c3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_decimal.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_decimal : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_decimal() : base(typeof(decimal)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((decimal)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_decimal(); + } + } + + public class ES3Type_decimalArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_decimalArray() : base(typeof(decimal[]), ES3Type_decimal.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_decimal.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_decimal.cs.meta new file mode 100644 index 000000000..bb40cd8cf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_decimal.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 030f062403dc345f78476442992e3c9c +timeCreated: 1519132279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_decimal.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_double.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_double.cs new file mode 100644 index 000000000..6ca2dd3d2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_double.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_double : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_double() : base(typeof(double)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((double)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_double(); + } + } + + public class ES3Type_doubleArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_doubleArray() : base(typeof(double[]), ES3Type_double.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_double.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_double.cs.meta new file mode 100644 index 000000000..0daf396fe --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_double.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: c445261bbbfc24045863aa3c2c097a73 +timeCreated: 1519132296 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_double.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs new file mode 100644 index 000000000..311101a3a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs @@ -0,0 +1,59 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_enum : ES3Type + { + public static ES3Type Instance = null; + private Type underlyingType = null; + + public ES3Type_enum(Type type) : base(type) + { + isPrimitive = true; + isEnum = true; + Instance = this; + underlyingType = Enum.GetUnderlyingType(type); + } + + public override void Write(object obj, ES3Writer writer) + { + if(underlyingType == typeof(int)) writer.WritePrimitive((int)obj); + else if(underlyingType == typeof(bool)) writer.WritePrimitive((bool)obj); + else if(underlyingType == typeof(byte)) writer.WritePrimitive((byte)obj); + else if(underlyingType == typeof(char)) writer.WritePrimitive((char)obj); + else if(underlyingType == typeof(decimal)) writer.WritePrimitive((decimal)obj); + else if(underlyingType == typeof(double)) writer.WritePrimitive((double)obj); + else if(underlyingType == typeof(float)) writer.WritePrimitive((float)obj); + else if(underlyingType == typeof(long)) writer.WritePrimitive((long)obj); + else if(underlyingType == typeof(sbyte)) writer.WritePrimitive((sbyte)obj); + else if(underlyingType == typeof(short)) writer.WritePrimitive((short)obj); + else if(underlyingType == typeof(uint)) writer.WritePrimitive((uint)obj); + else if(underlyingType == typeof(ulong)) writer.WritePrimitive((ulong)obj); + else if(underlyingType == typeof(ushort)) writer.WritePrimitive((ushort)obj); + else + throw new System.InvalidCastException("The underlying type " + underlyingType + " of Enum "+type+" is not supported"); + + } + + public override object Read(ES3Reader reader) + { + if(underlyingType == typeof(int)) return Enum.ToObject (type, reader.Read_int()); + else if(underlyingType == typeof(bool)) return Enum.ToObject (type, reader.Read_bool()); + else if(underlyingType == typeof(byte)) return Enum.ToObject (type, reader.Read_byte()); + else if(underlyingType == typeof(char)) return Enum.ToObject (type, reader.Read_char()); + else if(underlyingType == typeof(decimal)) return Enum.ToObject (type, reader.Read_decimal()); + else if(underlyingType == typeof(double)) return Enum.ToObject (type, reader.Read_double()); + else if(underlyingType == typeof(float)) return Enum.ToObject (type, reader.Read_float()); + else if(underlyingType == typeof(long)) return Enum.ToObject (type, reader.Read_long()); + else if(underlyingType == typeof(sbyte)) return Enum.ToObject (type, reader.Read_sbyte()); + else if(underlyingType == typeof(short)) return Enum.ToObject (type, reader.Read_short()); + else if(underlyingType == typeof(uint)) return Enum.ToObject (type, reader.Read_uint()); + else if(underlyingType == typeof(ulong)) return Enum.ToObject (type, reader.Read_ulong()); + else if(underlyingType == typeof(ushort)) return Enum.ToObject (type, reader.Read_ushort()); + else + throw new System.InvalidCastException("The underlying type " + underlyingType + " of Enum "+type+" is not supported"); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs.meta new file mode 100644 index 000000000..a69f30879 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0bc176cf7e9c84850b4ead41131e66af +timeCreated: 1519132280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_enum.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_float.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_float.cs new file mode 100644 index 000000000..220485d2b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_float.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_float : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_float() : base(typeof(float)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((float)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_float(); + } + } + + public class ES3Type_floatArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_floatArray() : base(typeof(float[]), ES3Type_float.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_float.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_float.cs.meta new file mode 100644 index 000000000..499b9de68 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_float.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f40643b43129b41ff9143c8a23741391 +timeCreated: 1519132300 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_float.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_int.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_int.cs new file mode 100644 index 000000000..6061fac75 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_int.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_int : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_int() : base(typeof(int)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((int)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_int(); + } + } + + public class ES3Type_intArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_intArray() : base(typeof(int[]), ES3Type_int.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_int.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_int.cs.meta new file mode 100644 index 000000000..2d4dff713 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_int.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 13efdffd9de75437f8eb6d09e595e70d +timeCreated: 1519132280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_int.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_intptr.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_intptr.cs new file mode 100644 index 000000000..f2bd8dccb --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_intptr.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_IntPtr : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_IntPtr() : base(typeof(IntPtr)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((long)(IntPtr)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)(IntPtr)reader.Read_long(); + } + } + + public class ES3Type_IntPtrArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_IntPtrArray() : base(typeof(IntPtr[]), ES3Type_IntPtr.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_intptr.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_intptr.cs.meta new file mode 100644 index 000000000..d5e66ec20 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_intptr.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 8fe212a329d2d46a482270d9a93d704f +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_intptr.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_long.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_long.cs new file mode 100644 index 000000000..df2271aed --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_long.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_long : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_long() : base(typeof(long)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((long)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_long(); + } + } + + public class ES3Type_longArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_longArray() : base(typeof(long[]), ES3Type_long.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_long.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_long.cs.meta new file mode 100644 index 000000000..3db5bd323 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_long.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b534e98b9d5dc4219978a5aada0d11b0 +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_long.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_sbyte.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_sbyte.cs new file mode 100644 index 000000000..3e8f21001 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_sbyte.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_sbyte : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_sbyte() : base(typeof(sbyte)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((sbyte)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_sbyte(); + } + } + + public class ES3Type_sbyteArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_sbyteArray() : base(typeof(sbyte[]), ES3Type_sbyte.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_sbyte.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_sbyte.cs.meta new file mode 100644 index 000000000..3f57eeb9e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_sbyte.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 5aaea33736cb64165b06b21ccffb4dde +timeCreated: 1519132286 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_sbyte.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_short.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_short.cs new file mode 100644 index 000000000..391c72ae6 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_short.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_short : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_short() : base(typeof(short)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((short)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_short(); + } + } + + public class ES3Type_shortArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_shortArray() : base(typeof(short[]), ES3Type_short.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_short.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_short.cs.meta new file mode 100644 index 000000000..d66d2620f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_short.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 62ef5aa170d8444eb9613f6733dace9c +timeCreated: 1519132286 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_short.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_string.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_string.cs new file mode 100644 index 000000000..ef8d15952 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_string.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_string : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_string() : base(typeof(string)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((string)obj); + } + + public override object Read(ES3Reader reader) + { + return reader.Read_string(); + } + } + + public class ES3Type_StringArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_StringArray() : base(typeof(string[]), ES3Type_string.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_string.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_string.cs.meta new file mode 100644 index 000000000..c66651258 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_string.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 138987e042d4e4283a967a0958ab0a52 +timeCreated: 1519132280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_string.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_uint.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_uint.cs new file mode 100644 index 000000000..854f5c8a8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_uint.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_uint : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_uint() : base(typeof(uint)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((uint)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_uint(); + } + } + + public class ES3Type_uintArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_uintArray() : base(typeof(uint[]), ES3Type_uint.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_uint.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_uint.cs.meta new file mode 100644 index 000000000..1669cc181 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_uint.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 2c39c4f1168884e94b9e7e6087affd2d +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_uint.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ulong.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ulong.cs new file mode 100644 index 000000000..d18b69282 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ulong.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_ulong : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ulong() : base(typeof(ulong)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((ulong)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_ulong(); + } + } + + public class ES3Type_ulongArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_ulongArray() : base(typeof(ulong[]), ES3Type_ulong.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ulong.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ulong.cs.meta new file mode 100644 index 000000000..60fb70cc2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ulong.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f25dca3f336094cababceb772c7e390b +timeCreated: 1519132300 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ulong.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ushort.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ushort.cs new file mode 100644 index 000000000..11c9e8ed9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ushort.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_ushort : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ushort() : base(typeof(ushort)) + { + isPrimitive = true; + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + writer.WritePrimitive((ushort)obj); + } + + public override object Read(ES3Reader reader) + { + return (T)(object)reader.Read_ushort(); + } + } + + public class ES3Type_ushortArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_ushortArray() : base(typeof(ushort[]), ES3Type_ushort.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ushort.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ushort.cs.meta new file mode 100644 index 000000000..c3ea1fe7f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ushort.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 33d86db06b1954996a48d38a75c76dd9 +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Primitive Types/ES3Type_ushort.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types.meta new file mode 100644 index 000000000..cdc6e252e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4082e405acc0345388494ffa52b63839 +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedComponentType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedComponentType.cs new file mode 100644 index 000000000..a1d1ca096 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedComponentType.cs @@ -0,0 +1,24 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + internal class ES3ReflectedComponentType : ES3ComponentType + { + public ES3ReflectedComponentType(Type type) : base(type) + { + isReflectedType = true; + GetMembers(true); + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + WriteProperties(obj, writer); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + ReadProperties(reader, obj); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedComponentType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedComponentType.cs.meta new file mode 100644 index 000000000..b7d24ebe2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedComponentType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 2b125647af96a4b5494ca82d1da9a9e6 +timeCreated: 1499764821 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedComponentType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedObjectType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedObjectType.cs new file mode 100644 index 000000000..2c57caae4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedObjectType.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + internal class ES3ReflectedObjectType : ES3ObjectType + { + public ES3ReflectedObjectType(Type type) : base(type) + { + isReflectedType = true; + GetMembers(true); + } + + protected override void WriteObject(object obj, ES3Writer writer) + { + WriteProperties(obj, writer); + } + + protected override object ReadObject(ES3Reader reader) + { + var obj = ES3Reflection.CreateInstance(this.type); + ReadProperties(reader, obj); + return obj; + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + ReadProperties(reader, obj); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedObjectType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedObjectType.cs.meta new file mode 100644 index 000000000..904eca352 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedObjectType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d239970ac781b4079bda34e2999dc775 +timeCreated: 1519132297 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedObjectType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedScriptableObjectType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedScriptableObjectType.cs new file mode 100644 index 000000000..b53b487cd --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedScriptableObjectType.cs @@ -0,0 +1,27 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + internal class ES3ReflectedScriptableObjectType : ES3ScriptableObjectType + { + public ES3ReflectedScriptableObjectType(Type type) : base(type) + { + isReflectedType = true; + GetMembers(true); + } + + protected override void WriteScriptableObject(object obj, ES3Writer writer) + { + WriteProperties(obj, writer); + } + + protected override void ReadScriptableObject(ES3Reader reader, object obj) + { + ReadProperties(reader, obj); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedScriptableObjectType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedScriptableObjectType.cs.meta new file mode 100644 index 000000000..ea73fb7b5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedScriptableObjectType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: dd9e88c6e3735412ab2033c284212528 +timeCreated: 1519132298 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedScriptableObjectType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedType.cs new file mode 100644 index 000000000..b195113b4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedType.cs @@ -0,0 +1,119 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + internal class ES3ReflectedType : ES3Type + { + public ES3ReflectedType(Type type) : base(type) + { + isReflectedType = true; + } + + // Constructs a reflected ES3Type, only serializing members which are in the provided members array. + public ES3ReflectedType(Type type, string[] members) : this(type) + { + GetMembers(false, members); + } + + public override void Write(object obj, ES3Writer writer) + { + // Manage NULL values. + if(obj == null){writer.WriteNull(); return;}; + + UnityEngine.Object unityObj = obj as UnityEngine.Object; + bool isUnityEngineObject = (unityObj != null); + + // If this is a derived type, write the type as a property and use it's specific ES3Type. + var objType = obj.GetType(); + if(objType != this.type) + { + writer.WriteType(objType); + ES3TypeMgr.GetOrCreateES3Type(objType).Write(obj, writer); + return; + } + + if(isUnityEngineObject) + writer.WriteRef(unityObj); + + if(members == null) + GetMembers(writer.settings.safeReflection); + for(int i=0; i(ES3Reader reader) + { + if(members == null) + GetMembers(reader.settings.safeReflection); + + object obj; + string propertyName = reader.ReadPropertyName(); + + // If we're loading a derived type, use it's specific ES3Type. + if(propertyName == ES3Type.typeFieldName) + return ES3TypeMgr.GetOrCreateES3Type(reader.ReadType()).Read(reader); + + // If we're loading a reference, load it. Else, create an instance. + if(propertyName == ES3ReferenceMgrBase.referencePropertyName) + { + long id = reader.Read_ref(); + obj = ES3ReferenceMgrBase.Current.Get(id, type); + if(obj == null) + { + // If an instance isn't already registered for this object, create an instance and register the reference. + obj = ES3Reflection.CreateInstance(this.type); + ES3ReferenceMgrBase.Current.Add((UnityEngine.Object)obj, id); + } + } + else + { + reader.overridePropertiesName = propertyName; + obj = ES3Reflection.CreateInstance(this.type); + } + + // Iterate through each property in the file and try to load it using the appropriate + // ES3Property in the members array. + ReadProperties(reader, obj); + + return obj; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + if(members == null) + GetMembers(reader.settings.safeReflection); + + string propertyName = reader.ReadPropertyName(); + + // If we're loading a derived type, use it's specific ES3Type. + if(propertyName == ES3Type.typeFieldName) + { + ES3TypeMgr.GetOrCreateES3Type(reader.ReadType()).ReadInto(reader, obj); + return; + } + else + reader.overridePropertiesName = propertyName; + + // Iterate through each property in the file and try to load it using the appropriate + // ES3Property in the members array. + ReadProperties(reader, obj); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedType.cs.meta new file mode 100644 index 000000000..f21d39592 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d859cda1b74634568a53487bd1651001 +timeCreated: 1499764823 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedUnityObjectType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedUnityObjectType.cs new file mode 100644 index 000000000..946a2f11a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedUnityObjectType.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + internal class ES3ReflectedUnityObjectType : ES3UnityObjectType + { + public ES3ReflectedUnityObjectType(Type type) : base(type) + { + isReflectedType = true; + GetMembers(true); + } + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + WriteProperties(obj, writer); + } + + protected override object ReadUnityObject(ES3Reader reader) + { + var obj = ES3Reflection.CreateInstance(this.type); + ReadProperties(reader, obj); + return obj; + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + ReadProperties(reader, obj); + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedUnityObjectType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedUnityObjectType.cs.meta new file mode 100644 index 000000000..502b6ca03 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedUnityObjectType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f8c48527c8cb247f1be391e0ca112968 +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedUnityObjectType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedValueType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedValueType.cs new file mode 100644 index 000000000..0af9af9b5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedValueType.cs @@ -0,0 +1,38 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + internal class ES3ReflectedValueType : ES3Type + { + public ES3ReflectedValueType(Type type) : base(type) + { + isReflectedType = true; + GetMembers(true); + } + + public override void Write(object obj, ES3Writer writer) + { + WriteProperties(obj, writer); + } + + public override object Read(ES3Reader reader) + { + var obj = ES3Reflection.CreateInstance(this.type); + + if(obj == null) + throw new NotSupportedException("Cannot create an instance of "+this.type+". However, you may be able to add support for it using a custom ES3Type file. For more information see: http://docs.moodkie.com/easy-save-3/es3-guides/controlling-serialization-using-es3types/"); + // Make sure we return the result of ReadProperties as properties aren't assigned by reference. + return ReadProperties(reader, obj); + } + + public override void ReadInto(ES3Reader reader, object obj) + { + throw new NotSupportedException("Cannot perform self-assigning load on a value type."); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedValueType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedValueType.cs.meta new file mode 100644 index 000000000..d9052e268 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedValueType.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f8bc4124377914b60b46b243480f0eb5 +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Reflected Types/ES3ReflectedValueType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types.meta new file mode 100644 index 000000000..738916380 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a14e00d7328764c16803c1a5f854286b +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types.meta new file mode 100644 index 000000000..4873446d0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 96e5384a630b34a90a22b84d95f3dac9 +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider.cs new file mode 100644 index 000000000..51801afb1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider.cs @@ -0,0 +1,66 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("center", "size", "enabled", "isTrigger", "contactOffset", "sharedMaterial")] + public class ES3Type_BoxCollider : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_BoxCollider() : base(typeof(UnityEngine.BoxCollider)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.BoxCollider)obj; + + writer.WriteProperty("center", instance.center); + writer.WriteProperty("size", instance.size); + writer.WriteProperty("enabled", instance.enabled); + writer.WriteProperty("isTrigger", instance.isTrigger); + writer.WriteProperty("contactOffset", instance.contactOffset); + writer.WritePropertyByRef("material", instance.sharedMaterial); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.BoxCollider)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "center": + instance.center = reader.Read(); + break; + case "size": + instance.size = reader.Read(); + break; + case "enabled": + instance.enabled = reader.Read(); + break; + case "isTrigger": + instance.isTrigger = reader.Read(); + break; + case "contactOffset": + instance.contactOffset = reader.Read(); + break; + case "material": +#if UNITY_6000_0_OR_NEWER + + instance.sharedMaterial = reader.Read(); +#else + instance.sharedMaterial = reader.Read(); +#endif + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider.cs.meta new file mode 100644 index 000000000..3b1356d7c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d36ea4342de4546b198eea1405516979 +timeCreated: 1519132297 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider2D.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider2D.cs new file mode 100644 index 000000000..2d42dc4e0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider2D.cs @@ -0,0 +1,66 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("size", "density", "isTrigger", "usedByEffector", "offset", "sharedMaterial", "enabled")] + public class ES3Type_BoxCollider2D : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_BoxCollider2D() : base(typeof(UnityEngine.BoxCollider2D)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.BoxCollider2D)obj; + + writer.WriteProperty("size", instance.size); + if(instance.attachedRigidbody != null && instance.attachedRigidbody.useAutoMass) + writer.WriteProperty("density", instance.density); + writer.WriteProperty("isTrigger", instance.isTrigger); + writer.WriteProperty("usedByEffector", instance.usedByEffector); + writer.WriteProperty("offset", instance.offset); + writer.WritePropertyByRef("sharedMaterial", instance.sharedMaterial); + writer.WriteProperty("enabled", instance.enabled); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.BoxCollider2D)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "size": + instance.size = reader.Read(); + break; + case "density": + instance.density = reader.Read(); + break; + case "isTrigger": + instance.isTrigger = reader.Read(); + break; + case "usedByEffector": + instance.usedByEffector = reader.Read(); + break; + case "offset": + instance.offset = reader.Read(); + break; + case "sharedMaterial": + instance.sharedMaterial = reader.Read(); + break; + case "enabled": + instance.enabled = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider2D.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider2D.cs.meta new file mode 100644 index 000000000..1189f08b9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider2D.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 8ae32677f95cd4f2ba1c34db2a065c9c +timeCreated: 1519132290 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_BoxCollider2D.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Camera.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Camera.cs new file mode 100644 index 000000000..3db142bf3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Camera.cs @@ -0,0 +1,165 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("fieldOfView", "nearClipPlane", "farClipPlane", "renderingPath", "allowHDR", "orthographicSize", "orthographic", "opaqueSortMode", "transparencySortMode", "depth", "aspect", "cullingMask", "eventMask", "backgroundColor", "rect", "pixelRect", "worldToCameraMatrix", "projectionMatrix", "nonJitteredProjectionMatrix", "useJitteredProjectionMatrixForTransparentRendering", "clearFlags", "stereoSeparation", "stereoConvergence", "cameraType", "stereoTargetEye", "targetDisplay", "useOcclusionCulling", "cullingMatrix", "layerCullSpherical", "depthTextureMode", "clearStencilAfterLightingPass", "enabled", "hideFlags")] + public class ES3Type_Camera : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_Camera() : base(typeof(UnityEngine.Camera)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Camera)obj; + + writer.WriteProperty("fieldOfView", instance.fieldOfView); + writer.WriteProperty("nearClipPlane", instance.nearClipPlane); + writer.WriteProperty("farClipPlane", instance.farClipPlane); + writer.WriteProperty("renderingPath", instance.renderingPath); + #if UNITY_5_6_OR_NEWER + writer.WriteProperty("allowHDR", instance.allowHDR); + #endif + writer.WriteProperty("orthographicSize", instance.orthographicSize); + writer.WriteProperty("orthographic", instance.orthographic); + writer.WriteProperty("opaqueSortMode", instance.opaqueSortMode); + writer.WriteProperty("transparencySortMode", instance.transparencySortMode); + writer.WriteProperty("depth", instance.depth); + writer.WriteProperty("aspect", instance.aspect); + writer.WriteProperty("cullingMask", instance.cullingMask); + writer.WriteProperty("eventMask", instance.eventMask); + writer.WriteProperty("backgroundColor", instance.backgroundColor); + writer.WriteProperty("rect", instance.rect); + writer.WriteProperty("pixelRect", instance.pixelRect); + writer.WriteProperty("projectionMatrix", instance.projectionMatrix); + writer.WriteProperty("nonJitteredProjectionMatrix", instance.nonJitteredProjectionMatrix); + writer.WriteProperty("useJitteredProjectionMatrixForTransparentRendering", instance.useJitteredProjectionMatrixForTransparentRendering); + writer.WriteProperty("clearFlags", instance.clearFlags); + writer.WriteProperty("stereoSeparation", instance.stereoSeparation); + writer.WriteProperty("stereoConvergence", instance.stereoConvergence); + writer.WriteProperty("cameraType", instance.cameraType); + writer.WriteProperty("stereoTargetEye", instance.stereoTargetEye); + writer.WriteProperty("targetDisplay", instance.targetDisplay); + writer.WriteProperty("useOcclusionCulling", instance.useOcclusionCulling); + writer.WriteProperty("layerCullSpherical", instance.layerCullSpherical); + writer.WriteProperty("depthTextureMode", instance.depthTextureMode); + writer.WriteProperty("clearStencilAfterLightingPass", instance.clearStencilAfterLightingPass); + writer.WriteProperty("enabled", instance.enabled); + writer.WriteProperty("hideFlags", instance.hideFlags); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Camera)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "fieldOfView": + instance.fieldOfView = reader.Read(); + break; + case "nearClipPlane": + instance.nearClipPlane = reader.Read(); + break; + case "farClipPlane": + instance.farClipPlane = reader.Read(); + break; + case "renderingPath": + instance.renderingPath = reader.Read(); + break; + #if UNITY_5_6_OR_NEWER + case "allowHDR": + instance.allowHDR = reader.Read(); + break; + #endif + case "orthographicSize": + instance.orthographicSize = reader.Read(); + break; + case "orthographic": + instance.orthographic = reader.Read(); + break; + case "opaqueSortMode": + instance.opaqueSortMode = reader.Read(); + break; + case "transparencySortMode": + instance.transparencySortMode = reader.Read(); + break; + case "depth": + instance.depth = reader.Read(); + break; + case "aspect": + instance.aspect = reader.Read(); + break; + case "cullingMask": + instance.cullingMask = reader.Read(); + break; + case "eventMask": + instance.eventMask = reader.Read(); + break; + case "backgroundColor": + instance.backgroundColor = reader.Read(); + break; + case "rect": + instance.rect = reader.Read(); + break; + case "pixelRect": + instance.pixelRect = reader.Read(); + break; + case "projectionMatrix": + instance.projectionMatrix = reader.Read(); + break; + case "nonJitteredProjectionMatrix": + instance.nonJitteredProjectionMatrix = reader.Read(); + break; + case "useJitteredProjectionMatrixForTransparentRendering": + instance.useJitteredProjectionMatrixForTransparentRendering = reader.Read(); + break; + case "clearFlags": + instance.clearFlags = reader.Read(); + break; + case "stereoSeparation": + instance.stereoSeparation = reader.Read(); + break; + case "stereoConvergence": + instance.stereoConvergence = reader.Read(); + break; + case "cameraType": + instance.cameraType = reader.Read(); + break; + case "stereoTargetEye": + instance.stereoTargetEye = reader.Read(); + break; + case "targetDisplay": + instance.targetDisplay = reader.Read(); + break; + case "useOcclusionCulling": + instance.useOcclusionCulling = reader.Read(); + break; + case "layerCullSpherical": + instance.layerCullSpherical = reader.Read(); + break; + case "depthTextureMode": + instance.depthTextureMode = reader.Read(); + break; + case "clearStencilAfterLightingPass": + instance.clearStencilAfterLightingPass = reader.Read(); + break; + case "enabled": + instance.enabled = reader.Read(); + break; + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Camera.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Camera.cs.meta new file mode 100644 index 000000000..6276395ab --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Camera.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: c88c1ce73e1f3462ea1aff5df7935e22 +timeCreated: 1499764822 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Camera.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_CapsuleCollider.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_CapsuleCollider.cs new file mode 100644 index 000000000..245150738 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_CapsuleCollider.cs @@ -0,0 +1,73 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("center", "radius", "height", "direction", "enabled", "isTrigger", "contactOffset", "sharedMaterial")] + public class ES3Type_CapsuleCollider : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_CapsuleCollider() : base(typeof(UnityEngine.CapsuleCollider)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.CapsuleCollider)obj; + + writer.WriteProperty("center", instance.center, ES3Type_Vector3.Instance); + writer.WriteProperty("radius", instance.radius, ES3Type_float.Instance); + writer.WriteProperty("height", instance.height, ES3Type_float.Instance); + writer.WriteProperty("direction", instance.direction, ES3Type_int.Instance); + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("isTrigger", instance.isTrigger, ES3Type_bool.Instance); + writer.WriteProperty("contactOffset", instance.contactOffset, ES3Type_float.Instance); + writer.WritePropertyByRef("material", instance.sharedMaterial); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.CapsuleCollider)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + case "center": + instance.center = reader.Read(ES3Type_Vector3.Instance); + break; + case "radius": + instance.radius = reader.Read(ES3Type_float.Instance); + break; + case "height": + instance.height = reader.Read(ES3Type_float.Instance); + break; + case "direction": + instance.direction = reader.Read(ES3Type_int.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "isTrigger": + instance.isTrigger = reader.Read(ES3Type_bool.Instance); + break; + case "contactOffset": + instance.contactOffset = reader.Read(ES3Type_float.Instance); + break; + case "material": +#if UNITY_6000_0_OR_NEWER + instance.sharedMaterial = reader.Read(); +#else + instance.sharedMaterial = reader.Read(); +#endif + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_CapsuleCollider.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_CapsuleCollider.cs.meta new file mode 100644 index 000000000..4493b0d37 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_CapsuleCollider.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: c523bafd506f04c85b160320b0b6d9dd +timeCreated: 1519132296 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_CapsuleCollider.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_EventSystem.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_EventSystem.cs new file mode 100644 index 000000000..51a469e9a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_EventSystem.cs @@ -0,0 +1,27 @@ +using System; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + public class ES3Type_EventSystem : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_EventSystem() : base(typeof(EventSystem)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + foreach(string propertyName in reader.Properties) + reader.Skip(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_EventSystem.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_EventSystem.cs.meta new file mode 100644 index 000000000..fe1ee607a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_EventSystem.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 02df167b6b77741308bfc8110dae71dd +timeCreated: 1519132279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_EventSystem.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs new file mode 100644 index 000000000..2770f9d5f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs @@ -0,0 +1,133 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("sprite", "overrideSprite", "type", "preserveAspect", "fillCenter", "fillMethod", "fillAmount", "fillClockwise", "fillOrigin", "alphaHitTestMinimumThreshold", "useSpriteMesh", "pixelsPerUnitMultiplier", "material", "onCullStateChanged", "maskable", "color", "raycastTarget", "useLegacyMeshGeneration", "useGUILayout", "enabled", "hideFlags")] + public class ES3Type_Image : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_Image() : base(typeof(UnityEngine.UI.Image)){ Instance = this; } + + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.UI.Image)obj; + + writer.WritePropertyByRef("sprite", instance.sprite); + writer.WriteProperty("type", instance.type); + writer.WriteProperty("preserveAspect", instance.preserveAspect, ES3Type_bool.Instance); + writer.WriteProperty("fillCenter", instance.fillCenter, ES3Type_bool.Instance); + writer.WriteProperty("fillMethod", instance.fillMethod); + writer.WriteProperty("fillAmount", instance.fillAmount, ES3Type_float.Instance); + writer.WriteProperty("fillClockwise", instance.fillClockwise, ES3Type_bool.Instance); + writer.WriteProperty("fillOrigin", instance.fillOrigin, ES3Type_int.Instance); + //alphaHitTestMinimumThreshold is disabled as Unity provides no way to check for crunch compression which is required to set this variable. + //writer.WriteProperty("alphaHitTestMinimumThreshold", instance.alphaHitTestMinimumThreshold, ES3Type_float.Instance); +#if UNITY_2019_1_OR_NEWER + writer.WriteProperty("useSpriteMesh", instance.useSpriteMesh, ES3Type_bool.Instance); +#endif + // Unity automatically sets the default material if it's set to null. + // This prevents missing reference warnings. + if (instance.material.name.Contains("Default")) + writer.WriteProperty("material", null); + else + writer.WriteProperty("material", instance.material); + writer.WriteProperty("onCullStateChanged", instance.onCullStateChanged); + writer.WriteProperty("maskable", instance.maskable, ES3Type_bool.Instance); + writer.WriteProperty("color", instance.color, ES3Type_Color.Instance); + writer.WriteProperty("raycastTarget", instance.raycastTarget, ES3Type_bool.Instance); + writer.WritePrivateProperty("useLegacyMeshGeneration", instance); + writer.WriteProperty("useGUILayout", instance.useGUILayout, ES3Type_bool.Instance); + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("hideFlags", instance.hideFlags, ES3Type_enum.Instance); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.UI.Image)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "sprite": + instance.sprite = reader.Read(ES3Type_Sprite.Instance); + break; + case "type": + instance.type = reader.Read(); + break; + case "preserveAspect": + instance.preserveAspect = reader.Read(ES3Type_bool.Instance); + break; + case "fillCenter": + instance.fillCenter = reader.Read(ES3Type_bool.Instance); + break; + case "fillMethod": + instance.fillMethod = reader.Read(); + break; + case "fillAmount": + instance.fillAmount = reader.Read(ES3Type_float.Instance); + break; + case "fillClockwise": + instance.fillClockwise = reader.Read(ES3Type_bool.Instance); + break; + case "fillOrigin": + instance.fillOrigin = reader.Read(ES3Type_int.Instance); + break; + /*case "alphaHitTestMinimumThreshold": + instance.alphaHitTestMinimumThreshold = reader.Read(ES3Type_float.Instance); + break;*/ +#if UNITY_2019_1_OR_NEWER + case "useSpriteMesh": + instance.useSpriteMesh = reader.Read(ES3Type_bool.Instance); + break; +#endif + case "material": + instance.material = reader.Read(ES3Type_Material.Instance); + break; + case "onCullStateChanged": + instance.onCullStateChanged = reader.Read(); + break; + case "maskable": + instance.maskable = reader.Read(ES3Type_bool.Instance); + break; + case "color": + instance.color = reader.Read(ES3Type_Color.Instance); + break; + case "raycastTarget": + instance.raycastTarget = reader.Read(ES3Type_bool.Instance); + break; + case "useLegacyMeshGeneration": + reader.SetPrivateProperty("useLegacyMeshGeneration", reader.Read(), instance); + break; + case "useGUILayout": + instance.useGUILayout = reader.Read(ES3Type_bool.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "hideFlags": + instance.hideFlags = reader.Read(ES3Type_enum.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } + + + public class ES3Type_ImageArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_ImageArray() : base(typeof(UnityEngine.UI.Image[]), ES3Type_Image.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs.meta new file mode 100644 index 000000000..a43c28cf2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 044e538602955694c90bc8b86d487ac5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Image.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshCollider.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshCollider.cs new file mode 100644 index 000000000..724749389 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshCollider.cs @@ -0,0 +1,84 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("sharedMesh", "convex", "inflateMesh", "skinWidth", "enabled", "isTrigger", "contactOffset", "sharedMaterial")] + public class ES3Type_MeshCollider : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_MeshCollider() : base(typeof(UnityEngine.MeshCollider)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.MeshCollider)obj; + + writer.WritePropertyByRef("sharedMesh", instance.sharedMesh); + writer.WriteProperty("convex", instance.convex, ES3Type_bool.Instance); + /*writer.WriteProperty("inflateMesh", instance.inflateMesh, ES3Type_bool.Instance); + writer.WriteProperty("skinWidth", instance.skinWidth, ES3Type_float.Instance);*/ + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("isTrigger", instance.isTrigger, ES3Type_bool.Instance); + writer.WriteProperty("contactOffset", instance.contactOffset, ES3Type_float.Instance); + writer.WriteProperty("material", instance.sharedMaterial); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.MeshCollider)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "sharedMesh": + instance.sharedMesh = reader.Read(ES3Type_Mesh.Instance); + break; + case "convex": + instance.convex = reader.Read(ES3Type_bool.Instance); + break; + /*case "inflateMesh": + instance.inflateMesh = reader.Read(ES3Type_bool.Instance); + break; + case "skinWidth": + instance.skinWidth = reader.Read(ES3Type_float.Instance); + break;*/ + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "isTrigger": + instance.isTrigger = reader.Read(ES3Type_bool.Instance); + break; + case "contactOffset": + instance.contactOffset = reader.Read(ES3Type_float.Instance); + break; + case "material": +#if UNITY_6000_0_OR_NEWER + instance.sharedMaterial = reader.Read(); +#else + instance.sharedMaterial = reader.Read(); +#endif + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_MeshColliderArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_MeshColliderArray() : base(typeof(UnityEngine.MeshCollider[]), ES3Type_MeshCollider.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshCollider.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshCollider.cs.meta new file mode 100644 index 000000000..30f81b354 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshCollider.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b7825b483b5804bcb95a1a47cb287500 +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshCollider.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshFilter.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshFilter.cs new file mode 100644 index 000000000..b7a28a2d1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshFilter.cs @@ -0,0 +1,51 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("sharedMesh")] + public class ES3Type_MeshFilter : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_MeshFilter() : base(typeof(UnityEngine.MeshFilter)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.MeshFilter)obj; + writer.WritePropertyByRef("sharedMesh", instance.sharedMesh); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.MeshFilter)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "sharedMesh": + instance.sharedMesh = reader.Read(ES3Type_Mesh.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_MeshFilterArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_MeshFilterArray() : base(typeof(UnityEngine.MeshFilter[]), ES3Type_MeshFilter.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshFilter.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshFilter.cs.meta new file mode 100644 index 000000000..fdf699422 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshFilter.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 00364532a712841328836c36da833503 +timeCreated: 1519132279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshFilter.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshRenderer.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshRenderer.cs new file mode 100644 index 000000000..d8b87a934 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshRenderer.cs @@ -0,0 +1,116 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("additionalVertexStreams", "enabled", "shadowCastingMode", "receiveShadows", "sharedMaterials", "lightmapIndex", "realtimeLightmapIndex", "lightmapScaleOffset", "motionVectorGenerationMode", "realtimeLightmapScaleOffset", "lightProbeUsage", "lightProbeProxyVolumeOverride", "probeAnchor", "reflectionProbeUsage", "sortingLayerName", "sortingLayerID", "sortingOrder")] + public class ES3Type_MeshRenderer : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_MeshRenderer() : base(typeof(UnityEngine.MeshRenderer)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.MeshRenderer)obj; + + writer.WriteProperty("additionalVertexStreams", instance.additionalVertexStreams, ES3Type_Mesh.Instance); + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("shadowCastingMode", instance.shadowCastingMode); + writer.WriteProperty("receiveShadows", instance.receiveShadows, ES3Type_bool.Instance); + writer.WriteProperty("sharedMaterials", instance.sharedMaterials, ES3Type_MaterialArray.Instance); + writer.WriteProperty("lightmapIndex", instance.lightmapIndex, ES3Type_int.Instance); + writer.WriteProperty("realtimeLightmapIndex", instance.realtimeLightmapIndex, ES3Type_int.Instance); + writer.WriteProperty("lightmapScaleOffset", instance.lightmapScaleOffset, ES3Type_Vector4.Instance); + writer.WriteProperty("motionVectorGenerationMode", instance.motionVectorGenerationMode); + writer.WriteProperty("realtimeLightmapScaleOffset", instance.realtimeLightmapScaleOffset, ES3Type_Vector4.Instance); + writer.WriteProperty("lightProbeUsage", instance.lightProbeUsage); + writer.WriteProperty("lightProbeProxyVolumeOverride", instance.lightProbeProxyVolumeOverride); + writer.WriteProperty("probeAnchor", instance.probeAnchor, ES3Type_Transform.Instance); + writer.WriteProperty("reflectionProbeUsage", instance.reflectionProbeUsage); + writer.WriteProperty("sortingLayerName", instance.sortingLayerName, ES3Type_string.Instance); + writer.WriteProperty("sortingLayerID", instance.sortingLayerID, ES3Type_int.Instance); + writer.WriteProperty("sortingOrder", instance.sortingOrder, ES3Type_int.Instance); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.MeshRenderer)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "additionalVertexStreams": + instance.additionalVertexStreams = reader.Read(ES3Type_Mesh.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "shadowCastingMode": + instance.shadowCastingMode = reader.Read(); + break; + case "receiveShadows": + instance.receiveShadows = reader.Read(ES3Type_bool.Instance); + break; + case "sharedMaterials": + instance.sharedMaterials = reader.Read(); + break; + case "lightmapIndex": + instance.lightmapIndex = reader.Read(ES3Type_int.Instance); + break; + case "realtimeLightmapIndex": + instance.realtimeLightmapIndex = reader.Read(ES3Type_int.Instance); + break; + case "lightmapScaleOffset": + instance.lightmapScaleOffset = reader.Read(ES3Type_Vector4.Instance); + break; + case "motionVectorGenerationMode": + instance.motionVectorGenerationMode = reader.Read(); + break; + case "realtimeLightmapScaleOffset": + instance.realtimeLightmapScaleOffset = reader.Read(ES3Type_Vector4.Instance); + break; + case "lightProbeUsage": + instance.lightProbeUsage = reader.Read(); + break; + case "lightProbeProxyVolumeOverride": + instance.lightProbeProxyVolumeOverride = reader.Read(ES3Type_GameObject.Instance); + break; + case "probeAnchor": + instance.probeAnchor = reader.Read(ES3Type_Transform.Instance); + break; + case "reflectionProbeUsage": + instance.reflectionProbeUsage = reader.Read(); + break; + case "sortingLayerName": + instance.sortingLayerName = reader.Read(ES3Type_string.Instance); + break; + case "sortingLayerID": + instance.sortingLayerID = reader.Read(ES3Type_int.Instance); + break; + case "sortingOrder": + instance.sortingOrder = reader.Read(ES3Type_int.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_MeshRendererArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_MeshRendererArray() : base(typeof(UnityEngine.MeshRenderer[]), ES3Type_MeshRenderer.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshRenderer.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshRenderer.cs.meta new file mode 100644 index 000000000..855453fbf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshRenderer.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d33e88a8388cf4cf1b47495afc6722a7 +timeCreated: 1519132297 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_MeshRenderer.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_ParticleSystem.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_ParticleSystem.cs new file mode 100644 index 000000000..8295f3348 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_ParticleSystem.cs @@ -0,0 +1,149 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("time", "hideFlags", "collision", "colorBySpeed", "colorOverLifetime", "emission", "externalForces", "forceOverLifetime", "inheritVelocity", + "lights", "limitVelocityOverLifetime", "main", "noise", "rotatonBySpeed", "rotationOverLifetime", "shape", "sizeBySpeed", "sizeOverLifetime", + "subEmitters", "textureSheetAnimation", "trails", "trigger", "useAutoRandomSeed", "velocityOverLifetime", "isPaused", "isPlaying", "isStopped")] + public class ES3Type_ParticleSystem : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_ParticleSystem() : base(typeof(UnityEngine.ParticleSystem)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem)obj; + + writer.WriteProperty("time", instance.time); + writer.WriteProperty("hideFlags", instance.hideFlags); + writer.WriteProperty("collision", instance.collision); + writer.WriteProperty("colorBySpeed", instance.colorBySpeed); + writer.WriteProperty("colorOverLifetime", instance.colorOverLifetime); + writer.WriteProperty("emission", instance.emission); + writer.WriteProperty("externalForces", instance.externalForces); + writer.WriteProperty("forceOverLifetime", instance.forceOverLifetime); + writer.WriteProperty("inheritVelocity", instance.inheritVelocity); + writer.WriteProperty("lights", instance.lights); + writer.WriteProperty("limitVelocityOverLifetime", instance.limitVelocityOverLifetime); + writer.WriteProperty("main", instance.main); + writer.WriteProperty("noise", instance.noise); + writer.WriteProperty("rotationBySpeed", instance.rotationBySpeed); + writer.WriteProperty("rotationOverLifetime", instance.rotationOverLifetime); + writer.WriteProperty("shape", instance.shape); + writer.WriteProperty("sizeBySpeed", instance.sizeBySpeed); + writer.WriteProperty("sizeOverLifetime", instance.sizeOverLifetime); + writer.WriteProperty("subEmitters", instance.subEmitters); + writer.WriteProperty("textureSheetAnimation", instance.textureSheetAnimation); + writer.WriteProperty("trails", instance.trails); + writer.WriteProperty("trigger", instance.trigger); + writer.WriteProperty("useAutoRandomSeed", instance.useAutoRandomSeed); + writer.WriteProperty("velocityOverLifetime", instance.velocityOverLifetime); + writer.WriteProperty("isPaused", instance.isPaused); + writer.WriteProperty("isPlaying", instance.isPlaying); + writer.WriteProperty("isStopped", instance.isStopped); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem)obj; + // Stop particle system as some properties require it to not be playing to be set. + instance.Stop(); + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + case "time": + instance.time = reader.Read(); + break; + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + case "collision": + reader.ReadInto(instance.collision, ES3Type_CollisionModule.Instance); + break; + case "colorBySpeed": + reader.ReadInto(instance.colorBySpeed, ES3Type_ColorBySpeedModule.Instance); + break; + case "colorOverLifetime": + reader.ReadInto(instance.colorOverLifetime, ES3Type_ColorOverLifetimeModule.Instance); + break; + case "sizeOverLifetime": + reader.ReadInto(instance.sizeOverLifetime, ES3Type_SizeOverLifetimeModule.Instance); + break; + case "shape": + reader.ReadInto(instance.shape, ES3Type_ShapeModule.Instance); + break; + case "emission": + reader.ReadInto(instance.emission, ES3Type_EmissionModule.Instance); + break; + case "externalForces": + reader.ReadInto(instance.externalForces, ES3Type_ExternalForcesModule.Instance); + break; + case "forceOverLifetime": + reader.ReadInto(instance.forceOverLifetime, ES3Type_ForceOverLifetimeModule.Instance); + break; + case "inheritVelocity": + reader.ReadInto(instance.inheritVelocity, ES3Type_InheritVelocityModule.Instance); + break; + case "lights": + reader.ReadInto(instance.lights, ES3Type_LightsModule.Instance); + break; + case "limitVelocityOverLifetime": + reader.ReadInto(instance.limitVelocityOverLifetime, ES3Type_LimitVelocityOverLifetimeModule.Instance); + break; + case "main": + reader.ReadInto(instance.main, ES3Type_MainModule.Instance); + break; + case "noise": + reader.ReadInto(instance.noise, ES3Type_NoiseModule.Instance); + break; + case "sizeBySpeed": + reader.ReadInto(instance.sizeBySpeed, ES3Type_SizeBySpeedModule.Instance); + break; + case "rotationBySpeed": + reader.ReadInto(instance.rotationBySpeed, ES3Type_RotationBySpeedModule.Instance); + break; + case "rotationOverLifetime": + reader.ReadInto(instance.rotationOverLifetime, ES3Type_RotationOverLifetimeModule.Instance); + break; + case "subEmitters": + reader.ReadInto(instance.subEmitters, ES3Type_SubEmittersModule.Instance); + break; + case "textureSheetAnimation": + reader.ReadInto(instance.textureSheetAnimation, ES3Type_TextureSheetAnimationModule.Instance); + break; + case "trails": + reader.ReadInto(instance.trails, ES3Type_TrailModule.Instance); + break; + case "trigger": + reader.ReadInto(instance.trigger, ES3Type_TriggerModule.Instance); + break; + case "useAutoRandomSeed": + instance.useAutoRandomSeed = reader.Read(ES3Type_bool.Instance); + break; + case "velocityOverLifetime": + reader.ReadInto(instance.velocityOverLifetime, ES3Type_VelocityOverLifetimeModule.Instance); + break; + case "isPaused": + if (reader.Read(ES3Type_bool.Instance)) instance.Pause(); + break; + case "isPlaying": + if (reader.Read(ES3Type_bool.Instance)) instance.Play(); + break; + case "isStopped": + if (reader.Read(ES3Type_bool.Instance)) instance.Stop(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_ParticleSystem.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_ParticleSystem.cs.meta new file mode 100644 index 000000000..52a357360 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_ParticleSystem.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9484f3e3b46ec4871977550c93381f25 +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_ParticleSystem.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_PolygonCollider2D.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_PolygonCollider2D.cs new file mode 100644 index 000000000..fdc765cbb --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_PolygonCollider2D.cs @@ -0,0 +1,87 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("points", "pathCount", "paths", "density", "isTrigger", "usedByEffector", "offset", "sharedMaterial", "enabled")] + public class ES3Type_PolygonCollider2D : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_PolygonCollider2D() : base(typeof(UnityEngine.PolygonCollider2D)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.PolygonCollider2D)obj; + + writer.WriteProperty("points", instance.points, ES3Type_Vector2Array.Instance); + writer.WriteProperty("pathCount", instance.pathCount, ES3Type_int.Instance); + + for(int i=0; i(ES3Reader reader, object obj) + { + var instance = (UnityEngine.PolygonCollider2D)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "points": + instance.points = reader.Read(ES3Type_Vector2Array.Instance); + break; + case "pathCount": + int pathCount = reader.Read(ES3Type_int.Instance); + for(int i=0; i(ES3Type_Vector2Array.Instance)); + break; + case "density": + instance.density = reader.Read(ES3Type_float.Instance); + break; + case "isTrigger": + instance.isTrigger = reader.Read(ES3Type_bool.Instance); + break; + case "usedByEffector": + instance.usedByEffector = reader.Read(ES3Type_bool.Instance); + break; + case "offset": + instance.offset = reader.Read(ES3Type_Vector2.Instance); + break; + case "sharedMaterial": + instance.sharedMaterial = reader.Read(ES3Type_PhysicsMaterial2D.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_PolygonCollider2DArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_PolygonCollider2DArray() : base(typeof(UnityEngine.PolygonCollider2D[]), ES3Type_PolygonCollider2D.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_PolygonCollider2D.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_PolygonCollider2D.cs.meta new file mode 100644 index 000000000..9b7243caa --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_PolygonCollider2D.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: ec8749737dd724d6a91ac3a9c241ba17 +timeCreated: 1519132300 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_PolygonCollider2D.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_RawImage.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_RawImage.cs new file mode 100644 index 000000000..f6413e7e5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_RawImage.cs @@ -0,0 +1,96 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("texture", "uvRect", "onCullStateChanged", "maskable", "color", "raycastTarget", "useLegacyMeshGeneration", "material", "useGUILayout", "enabled", "hideFlags")] + public class ES3Type_RawImage : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_RawImage() : base(typeof(UnityEngine.UI.RawImage)){ Instance = this;} + + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.UI.RawImage)obj; + + writer.WritePropertyByRef("texture", instance.texture); + writer.WriteProperty("uvRect", instance.uvRect, ES3Type_Rect.Instance); + writer.WriteProperty("onCullStateChanged", instance.onCullStateChanged); + writer.WriteProperty("maskable", instance.maskable, ES3Type_bool.Instance); + writer.WriteProperty("color", instance.color, ES3Type_Color.Instance); + writer.WriteProperty("raycastTarget", instance.raycastTarget, ES3Type_bool.Instance); + writer.WritePrivateProperty("useLegacyMeshGeneration", instance); + // Unity automatically sets the default material if it's set to null. + // This prevents missing reference warnings. + if (instance.material.name.Contains("Default")) + writer.WriteProperty("material", null); + else + writer.WriteProperty("material", instance.material); + writer.WriteProperty("useGUILayout", instance.useGUILayout, ES3Type_bool.Instance); + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("hideFlags", instance.hideFlags); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.UI.RawImage)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "texture": + instance.texture = reader.Read(ES3Type_Texture.Instance); + break; + case "uvRect": + instance.uvRect = reader.Read(ES3Type_Rect.Instance); + break; + case "onCullStateChanged": + instance.onCullStateChanged = reader.Read(); + break; + case "maskable": + instance.maskable = reader.Read(ES3Type_bool.Instance); + break; + case "color": + instance.color = reader.Read(ES3Type_Color.Instance); + break; + case "raycastTarget": + instance.raycastTarget = reader.Read(ES3Type_bool.Instance); + break; + case "useLegacyMeshGeneration": + reader.SetPrivateProperty("useLegacyMeshGeneration", reader.Read(), instance); + break; + case "material": + instance.material = reader.Read(ES3Type_Material.Instance); + break; + case "useGUILayout": + instance.useGUILayout = reader.Read(ES3Type_bool.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } + + + public class ES3Type_RawImageArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_RawImageArray() : base(typeof(UnityEngine.UI.RawImage[]), ES3Type_RawImage.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_RawImage.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_RawImage.cs.meta new file mode 100644 index 000000000..558b1d484 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_RawImage.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d8b1e267b6439604a9854f1876a085b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_RawImage.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Rigidbody.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Rigidbody.cs new file mode 100644 index 000000000..a412c2c70 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Rigidbody.cs @@ -0,0 +1,153 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("velocity", "angularVelocity", "drag", "angularDrag", "mass", "useGravity", "maxDepenetrationVelocity", "isKinematic", "freezeRotation", "constraints", "collisionDetectionMode", "centerOfMass", "inertiaTensorRotation", "inertiaTensor", "detectCollisions", "position", "rotation", "interpolation", "solverIterations", "sleepThreshold", "maxAngularVelocity", "solverVelocityIterations")] + public class ES3Type_Rigidbody : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_Rigidbody() : base(typeof(UnityEngine.Rigidbody)) { Instance = this; } + + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Rigidbody)obj; + +#if UNITY_6000_0_OR_NEWER + writer.WriteProperty("velocity", instance.linearVelocity, ES3Type_Vector3.Instance); + writer.WriteProperty("drag", instance.linearDamping, ES3Type_float.Instance); + writer.WriteProperty("angularDrag", instance.angularDamping, ES3Type_float.Instance); +#else + writer.WriteProperty("velocity", instance.velocity, ES3Type_Vector3.Instance); + writer.WriteProperty("drag", instance.drag, ES3Type_float.Instance); + writer.WriteProperty("angularDrag", instance.angularDrag, ES3Type_float.Instance); +#endif + writer.WriteProperty("angularVelocity", instance.angularVelocity, ES3Type_Vector3.Instance); + writer.WriteProperty("mass", instance.mass, ES3Type_float.Instance); + writer.WriteProperty("useGravity", instance.useGravity, ES3Type_bool.Instance); + writer.WriteProperty("maxDepenetrationVelocity", instance.maxDepenetrationVelocity, ES3Type_float.Instance); + writer.WriteProperty("isKinematic", instance.isKinematic, ES3Type_bool.Instance); + writer.WriteProperty("freezeRotation", instance.freezeRotation, ES3Type_bool.Instance); + writer.WriteProperty("constraints", instance.constraints); + writer.WriteProperty("collisionDetectionMode", instance.collisionDetectionMode); + writer.WriteProperty("centerOfMass", instance.centerOfMass, ES3Type_Vector3.Instance); + writer.WriteProperty("detectCollisions", instance.detectCollisions, ES3Type_bool.Instance); + writer.WriteProperty("position", instance.position, ES3Type_Vector3.Instance); + writer.WriteProperty("rotation", instance.rotation, ES3Type_Quaternion.Instance); + writer.WriteProperty("interpolation", instance.interpolation); + writer.WriteProperty("solverIterations", instance.solverIterations, ES3Type_int.Instance); + writer.WriteProperty("sleepThreshold", instance.sleepThreshold, ES3Type_float.Instance); + writer.WriteProperty("maxAngularVelocity", instance.maxAngularVelocity, ES3Type_float.Instance); + writer.WriteProperty("solverVelocityIterations", instance.solverVelocityIterations, ES3Type_int.Instance); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Rigidbody)obj; + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { +#if UNITY_6000_0_OR_NEWER + case "velocity": + instance.linearVelocity = reader.Read(ES3Type_Vector3.Instance); + break; + case "drag": + instance.linearDamping = reader.Read(ES3Type_float.Instance); + break; + case "angularDrag": + instance.angularDamping = reader.Read(ES3Type_float.Instance); + break; +#else + case "velocity": + instance.velocity = reader.Read(ES3Type_Vector3.Instance); + break; + case "drag": + instance.drag = reader.Read(ES3Type_float.Instance); + break; + case "angularDrag": + instance.angularDrag = reader.Read(ES3Type_float.Instance); + break; +#endif + case "angularVelocity": + instance.angularVelocity = reader.Read(ES3Type_Vector3.Instance); + break; + case "mass": + instance.mass = reader.Read(ES3Type_float.Instance); + break; + case "useGravity": + instance.useGravity = reader.Read(ES3Type_bool.Instance); + break; + case "maxDepenetrationVelocity": + instance.maxDepenetrationVelocity = reader.Read(ES3Type_float.Instance); + break; + case "isKinematic": + instance.isKinematic = reader.Read(ES3Type_bool.Instance); + break; + case "freezeRotation": + instance.freezeRotation = reader.Read(ES3Type_bool.Instance); + break; + case "constraints": + instance.constraints = reader.Read(); + break; + case "collisionDetectionMode": + instance.collisionDetectionMode = reader.Read(); + break; + case "centerOfMass": + instance.centerOfMass = reader.Read(ES3Type_Vector3.Instance); + break; + case "inertiaTensorRotation": + instance.inertiaTensorRotation = reader.Read(ES3Type_Quaternion.Instance); + break; + case "inertiaTensor": + var inertiaTensor = reader.Read(ES3Type_Vector3.Instance); + // Check that the inertia tensor isn't zero, as it will throw an error if we try to set it. + if (inertiaTensor != Vector3.zero) + instance.inertiaTensor = inertiaTensor; + break; + case "detectCollisions": + instance.detectCollisions = reader.Read(ES3Type_bool.Instance); + break; + case "position": + instance.position = reader.Read(ES3Type_Vector3.Instance); + break; + case "rotation": + instance.rotation = reader.Read(ES3Type_Quaternion.Instance); + break; + case "interpolation": + instance.interpolation = reader.Read(); + break; + case "solverIterations": + instance.solverIterations = reader.Read(ES3Type_int.Instance); + break; + case "sleepThreshold": + instance.sleepThreshold = reader.Read(ES3Type_float.Instance); + break; + case "maxAngularVelocity": + instance.maxAngularVelocity = reader.Read(ES3Type_float.Instance); + break; + case "solverVelocityIterations": + instance.solverVelocityIterations = reader.Read(ES3Type_int.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } + + + public class ES3UserType_RigidbodyArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3UserType_RigidbodyArray() : base(typeof(UnityEngine.Rigidbody[]), ES3Type_Rigidbody.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Rigidbody.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Rigidbody.cs.meta new file mode 100644 index 000000000..4ca913cdd --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Rigidbody.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8154830c992ded745b9784a07116b1b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Rigidbody.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_SphereCollider.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_SphereCollider.cs new file mode 100644 index 000000000..4f437e5a5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_SphereCollider.cs @@ -0,0 +1,64 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("center", "radius", "enabled", "isTrigger", "contactOffset", "sharedMaterial")] + public class ES3Type_SphereCollider : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_SphereCollider() : base(typeof(UnityEngine.SphereCollider)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.SphereCollider)obj; + + writer.WriteProperty("center", instance.center, ES3Type_Vector3.Instance); + writer.WriteProperty("radius", instance.radius, ES3Type_float.Instance); + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("isTrigger", instance.isTrigger, ES3Type_bool.Instance); + writer.WriteProperty("contactOffset", instance.contactOffset, ES3Type_float.Instance); + writer.WritePropertyByRef("material", instance.sharedMaterial); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.SphereCollider)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + case "center": + instance.center = reader.Read(ES3Type_Vector3.Instance); + break; + case "radius": + instance.radius = reader.Read(ES3Type_float.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "isTrigger": + instance.isTrigger = reader.Read(ES3Type_bool.Instance); + break; + case "contactOffset": + instance.contactOffset = reader.Read(ES3Type_float.Instance); + break; + case "material": +#if UNITY_6000_0_OR_NEWER + instance.sharedMaterial = reader.Read(); +#else + instance.sharedMaterial = reader.Read(); +#endif + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_SphereCollider.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_SphereCollider.cs.meta new file mode 100644 index 000000000..6b80ba003 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_SphereCollider.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: bb19da8937a274e63ada528bb6215c6d +timeCreated: 1519132295 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_SphereCollider.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Text.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Text.cs new file mode 100644 index 000000000..d0ecdce37 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Text.cs @@ -0,0 +1,144 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("font", "text", "supportRichText", "resizeTextForBestFit", "resizeTextMinSize", "resizeTextMaxSize", "alignment", "alignByGeometry", "fontSize", "horizontalOverflow", "verticalOverflow", "lineSpacing", "fontStyle", "onCullStateChanged", "maskable", "color", "raycastTarget", "material", "useGUILayout", "enabled", "tag", "name", "hideFlags")] + public class ES3Type_Text : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_Text() : base(typeof(UnityEngine.UI.Text)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.UI.Text)obj; + + //writer.WriteProperty("font", instance.font); + writer.WriteProperty("text", instance.text); + writer.WriteProperty("supportRichText", instance.supportRichText); + writer.WriteProperty("resizeTextForBestFit", instance.resizeTextForBestFit); + writer.WriteProperty("resizeTextMinSize", instance.resizeTextMinSize); + writer.WriteProperty("resizeTextMaxSize", instance.resizeTextMaxSize); + writer.WriteProperty("alignment", instance.alignment); + writer.WriteProperty("alignByGeometry", instance.alignByGeometry); + writer.WriteProperty("fontSize", instance.fontSize); + writer.WriteProperty("horizontalOverflow", instance.horizontalOverflow); + writer.WriteProperty("verticalOverflow", instance.verticalOverflow); + writer.WriteProperty("lineSpacing", instance.lineSpacing); + writer.WriteProperty("fontStyle", instance.fontStyle); + writer.WriteProperty("onCullStateChanged", instance.onCullStateChanged); + writer.WriteProperty("maskable", instance.maskable); + writer.WriteProperty("color", instance.color); + writer.WriteProperty("raycastTarget", instance.raycastTarget); + // Unity automatically sets the default material if it's set to null. + // This prevents missing reference warnings. + if (instance.material.name.Contains("Default")) + writer.WriteProperty("material", null); + else + writer.WriteProperty("material", instance.material); + writer.WriteProperty("useGUILayout", instance.useGUILayout); + writer.WriteProperty("enabled", instance.enabled); + writer.WriteProperty("hideFlags", instance.hideFlags); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.UI.Text)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "m_FontData": + reader.SetPrivateField("m_FontData", reader.Read(), instance); + break; + case "m_LastTrackedFont": + reader.SetPrivateField("m_LastTrackedFont", reader.Read(), instance); + break; + case "m_Text": + reader.SetPrivateField("m_Text", reader.Read(), instance); + break; + case "m_TextCache": + reader.SetPrivateField("m_TextCache", reader.Read(), instance); + break; + case "m_TextCacheForLayout": + reader.SetPrivateField("m_TextCacheForLayout", reader.Read(), instance); + break; + case "m_Material": + reader.SetPrivateField("m_Material", reader.Read(), instance); + break; + case "font": + instance.font = reader.Read(); + break; + case "text": + instance.text = reader.Read(); + break; + case "supportRichText": + instance.supportRichText = reader.Read(); + break; + case "resizeTextForBestFit": + instance.resizeTextForBestFit = reader.Read(); + break; + case "resizeTextMinSize": + instance.resizeTextMinSize = reader.Read(); + break; + case "resizeTextMaxSize": + instance.resizeTextMaxSize = reader.Read(); + break; + case "alignment": + instance.alignment = reader.Read(); + break; + case "alignByGeometry": + instance.alignByGeometry = reader.Read(); + break; + case "fontSize": + instance.fontSize = reader.Read(); + break; + case "horizontalOverflow": + instance.horizontalOverflow = reader.Read(); + break; + case "verticalOverflow": + instance.verticalOverflow = reader.Read(); + break; + case "lineSpacing": + instance.lineSpacing = reader.Read(); + break; + case "fontStyle": + instance.fontStyle = reader.Read(); + break; + case "onCullStateChanged": + instance.onCullStateChanged = reader.Read(); + break; + case "maskable": + instance.maskable = reader.Read(); + break; + case "color": + instance.color = reader.Read(); + break; + case "raycastTarget": + instance.raycastTarget = reader.Read(); + break; + case "material": + instance.material = reader.Read(); + break; + case "useGUILayout": + instance.useGUILayout = reader.Read(); + break; + case "enabled": + instance.enabled = reader.Read(); + break; + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Text.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Text.cs.meta new file mode 100644 index 000000000..e3cbd80cc --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Text.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 69268592921476a42b9819cd66b6ea4a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Text.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Transform.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Transform.cs new file mode 100644 index 000000000..6f7e88978 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Transform.cs @@ -0,0 +1,65 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("localPosition","localRotation","localScale","parent","siblingIndex")] + public class ES3Type_Transform : ES3ComponentType + { + public static int countRead = 0; + public static ES3Type Instance = null; + + public ES3Type_Transform() : base(typeof(UnityEngine.Transform)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Transform)obj; + writer.WritePropertyByRef("parent", instance.parent); + writer.WriteProperty("localPosition", instance.localPosition); + writer.WriteProperty("localRotation", instance.localRotation); + writer.WriteProperty("localScale", instance.localScale); + writer.WriteProperty("siblingIndex", instance.GetSiblingIndex()); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (Transform)obj; + + var characterController = instance.gameObject.GetComponent(); + if (characterController != null) + characterController.enabled = false; + + foreach(string propertyName in reader.Properties) + { + switch (propertyName) + { + case "parent": + instance.SetParent(reader.Read()); + break; + case "localPosition": + instance.localPosition = reader.Read(); + break; + case "localRotation": + instance.localRotation = reader.Read(); + break; + case "localScale": + instance.localScale = reader.Read(); + break; + case "siblingIndex": + instance.SetSiblingIndex(reader.Read()); + break; + default: + reader.Skip(); + break; + } + } + + if (characterController != null) + characterController.enabled = false; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Transform.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Transform.cs.meta new file mode 100644 index 000000000..debf1e894 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Transform.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 91cb5bec8da6744608c92304a04462fd +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/Component Types/ES3Type_Transform.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AnimationCurve.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AnimationCurve.cs new file mode 100644 index 000000000..853028d20 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AnimationCurve.cs @@ -0,0 +1,58 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("keys", "preWrapMode", "postWrapMode")] + public class ES3Type_AnimationCurve : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_AnimationCurve() : base(typeof(UnityEngine.AnimationCurve)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.AnimationCurve)obj; + + writer.WriteProperty("keys", instance.keys, ES3Type_KeyframeArray.Instance); + writer.WriteProperty("preWrapMode", instance.preWrapMode); + writer.WriteProperty("postWrapMode", instance.postWrapMode); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.AnimationCurve(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.AnimationCurve)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "keys": + instance.keys = reader.Read(); + break; + case "preWrapMode": + instance.preWrapMode = reader.Read(); + break; + case "postWrapMode": + instance.postWrapMode = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AnimationCurve.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AnimationCurve.cs.meta new file mode 100644 index 000000000..65627c244 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AnimationCurve.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 5939fcd6cf1ac4167b4320111cb9930e +timeCreated: 1519132286 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AnimationCurve.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AudioClip.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AudioClip.cs new file mode 100644 index 000000000..f2971ae04 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AudioClip.cs @@ -0,0 +1,90 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("name", "samples", "channels", "frequency", "sampleData")] + public class ES3Type_AudioClip : ES3UnityObjectType + { + public static ES3Type Instance = null; + + public ES3Type_AudioClip() : base(typeof(UnityEngine.AudioClip)){ Instance = this; } + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var param = (UnityEngine.AudioClip)obj; + float[] samples = new float[param.samples * param.channels]; + param.GetData(samples, 0); + writer.WriteProperty("name", param.name); + writer.WriteProperty("samples", param.samples); + writer.WriteProperty("channels", param.channels); + writer.WriteProperty("frequency", param.frequency); + writer.WriteProperty("sampleData", samples); + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + var clip = (AudioClip)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + case "sampleData": + clip.SetData(reader.Read(ES3Type_floatArray.Instance), 0); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadUnityObject(ES3Reader reader) + { + string name = ""; + int samples = 0; + int channels = 0; + int frequency = 0; + AudioClip clip = null; + + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + case "name": + name = reader.Read(ES3Type_string.Instance); + break; + case "samples": + samples = reader.Read(ES3Type_int.Instance); + break; + case "channels": + channels = reader.Read(ES3Type_int.Instance); + break; + case "frequency": + frequency = reader.Read(ES3Type_int.Instance); + break; + case "sampleData": + clip = AudioClip.Create(name, samples, channels, frequency, false); + clip.SetData(reader.Read(ES3Type_floatArray.Instance), 0); + break; + default: + reader.Skip(); + break; + } + } + + return clip; + } + } + + public class ES3Type_AudioClipArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_AudioClipArray() : base(typeof(UnityEngine.AudioClip[]), ES3Type_AudioClip.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AudioClip.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AudioClip.cs.meta new file mode 100644 index 000000000..f3047fb79 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AudioClip.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9b8f97ab775644e1782f7775c54f891a +timeCreated: 1519132292 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_AudioClip.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_BoneWeight.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_BoneWeight.cs new file mode 100644 index 000000000..ab8b8459f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_BoneWeight.cs @@ -0,0 +1,61 @@ +using System; +using UnityEngine; +using System.Collections.Generic; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("boneIndex0", "boneIndex1", "boneIndex2", "boneIndex3", "weight0", "weight1", "weight2", "weight3")] + public class ES3Type_BoneWeight : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_BoneWeight() : base(typeof(BoneWeight)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + BoneWeight casted = (BoneWeight)obj; + + writer.WriteProperty("boneIndex0", casted.boneIndex0, ES3Type_int.Instance); + writer.WriteProperty("boneIndex1", casted.boneIndex1, ES3Type_int.Instance); + writer.WriteProperty("boneIndex2", casted.boneIndex2, ES3Type_int.Instance); + writer.WriteProperty("boneIndex3", casted.boneIndex3, ES3Type_int.Instance); + + writer.WriteProperty("weight0", casted.weight0, ES3Type_float.Instance); + writer.WriteProperty("weight1", casted.weight1, ES3Type_float.Instance); + writer.WriteProperty("weight2", casted.weight2, ES3Type_float.Instance); + writer.WriteProperty("weight3", casted.weight3, ES3Type_float.Instance); + + } + + public override object Read(ES3Reader reader) + { + var obj = new BoneWeight(); + + obj.boneIndex0 = reader.ReadProperty(ES3Type_int.Instance); + obj.boneIndex1 = reader.ReadProperty(ES3Type_int.Instance); + obj.boneIndex2 = reader.ReadProperty(ES3Type_int.Instance); + obj.boneIndex3 = reader.ReadProperty(ES3Type_int.Instance); + + obj.weight0 = reader.ReadProperty(ES3Type_float.Instance); + obj.weight1 = reader.ReadProperty(ES3Type_float.Instance); + obj.weight2 = reader.ReadProperty(ES3Type_float.Instance); + obj.weight3 = reader.ReadProperty(ES3Type_float.Instance); + + return obj; + } + } + + public class ES3Type_BoneWeightArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_BoneWeightArray() : base(typeof(BoneWeight[]), ES3Type_BoneWeight.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_BoneWeight.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_BoneWeight.cs.meta new file mode 100644 index 000000000..c3913bdff --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_BoneWeight.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 570ee00d71c7c43a5a7e6a68e2c9d96f +timeCreated: 1519132285 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_BoneWeight.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Bounds.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Bounds.cs new file mode 100644 index 000000000..6cfba1f04 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Bounds.cs @@ -0,0 +1,42 @@ +using System; +using UnityEngine; +using System.Collections.Generic; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("center", "size")] + public class ES3Type_Bounds : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Bounds() : base(typeof(Bounds)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Bounds casted = (Bounds)obj; + + writer.WriteProperty("center", casted.center, ES3Type_Vector3.Instance); + writer.WriteProperty("size", casted.size, ES3Type_Vector3.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Bounds( reader.ReadProperty(ES3Type_Vector3.Instance), + reader.ReadProperty(ES3Type_Vector3.Instance)); + } + } + + public class ES3Type_BoundsArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_BoundsArray() : base(typeof(Bounds[]), ES3Type_Bounds.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Bounds.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Bounds.cs.meta new file mode 100644 index 000000000..1557ec301 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Bounds.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 3a9d8a8b9b10b466786d6d39807aa8e0 +timeCreated: 1519132283 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Bounds.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Burst.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Burst.cs new file mode 100644 index 000000000..ce7d17113 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Burst.cs @@ -0,0 +1,77 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("time", "count", "minCount", "maxCount", "cycleCount", "repeatInterval", "probability")] + public class ES3Type_Burst : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Burst() : base(typeof(UnityEngine.ParticleSystem.Burst)){ Instance = this; } + + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.Burst)obj; + + writer.WriteProperty("time", instance.time, ES3Type_float.Instance); + writer.WriteProperty("count", instance.count, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("minCount", instance.minCount, ES3Type_short.Instance); + writer.WriteProperty("maxCount", instance.maxCount, ES3Type_short.Instance); + writer.WriteProperty("cycleCount", instance.cycleCount, ES3Type_int.Instance); + writer.WriteProperty("repeatInterval", instance.repeatInterval, ES3Type_float.Instance); + writer.WriteProperty("probability", instance.probability, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.Burst(); + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "time": + instance.time = reader.Read(ES3Type_float.Instance); + break; + case "count": + instance.count = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "minCount": + instance.minCount = reader.Read(ES3Type_short.Instance); + break; + case "maxCount": + instance.maxCount = reader.Read(ES3Type_short.Instance); + break; + case "cycleCount": + instance.cycleCount = reader.Read(ES3Type_int.Instance); + break; + case "repeatInterval": + instance.repeatInterval = reader.Read(ES3Type_float.Instance); + break; + case "probability": + instance.probability = reader.Read(ES3Type_float.Instance); + break; + default: + reader.Skip(); + break; + } + } + return instance; + } + } + + + public class ES3Type_BurstArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_BurstArray() : base(typeof(UnityEngine.ParticleSystem.Burst[]), ES3Type_Burst.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Burst.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Burst.cs.meta new file mode 100644 index 000000000..c7743c0f4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Burst.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f15f94055e5ae9346969078ad65f3786 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Burst.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_CollisionModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_CollisionModule.cs new file mode 100644 index 000000000..55559451e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_CollisionModule.cs @@ -0,0 +1,117 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "type", "mode", "dampen", "dampenMultiplier", "bounce", "bounceMultiplier", "lifetimeLoss", "lifetimeLossMultiplier", "minKillSpeed", "maxKillSpeed", "collidesWith", "enableDynamicColliders", "maxCollisionShapes", "quality", "voxelSize", "radiusScale", "sendCollisionMessages")] + public class ES3Type_CollisionModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_CollisionModule() : base(typeof(UnityEngine.ParticleSystem.CollisionModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.CollisionModule)obj; + + writer.WriteProperty("enabled", instance.enabled); + writer.WriteProperty("type", instance.type); + writer.WriteProperty("mode", instance.mode); + writer.WriteProperty("dampen", instance.dampen); + writer.WriteProperty("dampenMultiplier", instance.dampenMultiplier); + writer.WriteProperty("bounce", instance.bounce); + writer.WriteProperty("bounceMultiplier", instance.bounceMultiplier); + writer.WriteProperty("lifetimeLoss", instance.lifetimeLoss); + writer.WriteProperty("lifetimeLossMultiplier", instance.lifetimeLossMultiplier); + writer.WriteProperty("minKillSpeed", instance.minKillSpeed); + writer.WriteProperty("maxKillSpeed", instance.maxKillSpeed); + writer.WriteProperty("collidesWith", instance.collidesWith); + writer.WriteProperty("enableDynamicColliders", instance.enableDynamicColliders); + writer.WriteProperty("maxCollisionShapes", instance.maxCollisionShapes); + writer.WriteProperty("quality", instance.quality); + writer.WriteProperty("voxelSize", instance.voxelSize); + writer.WriteProperty("radiusScale", instance.radiusScale); + writer.WriteProperty("sendCollisionMessages", instance.sendCollisionMessages); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.CollisionModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.CollisionModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + case "enabled": + instance.enabled = reader.Read(); + break; + case "type": + instance.type = reader.Read(); + break; + case "mode": + instance.mode = reader.Read(); + break; + case "dampen": + instance.dampen = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "dampenMultiplier": + instance.dampenMultiplier = reader.Read(); + break; + case "bounce": + instance.bounce = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "bounceMultiplier": + instance.bounceMultiplier = reader.Read(); + break; + case "lifetimeLoss": + instance.lifetimeLoss = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "lifetimeLossMultiplier": + instance.lifetimeLossMultiplier = reader.Read(); + break; + case "minKillSpeed": + instance.minKillSpeed = reader.Read(); + break; + case "maxKillSpeed": + instance.maxKillSpeed = reader.Read(); + break; + case "collidesWith": + instance.collidesWith = reader.Read(); + break; + case "enableDynamicColliders": + instance.enableDynamicColliders = reader.Read(); + break; + case "maxCollisionShapes": + instance.maxCollisionShapes = reader.Read(); + break; + case "quality": + instance.quality = reader.Read(); + break; + case "voxelSize": + instance.voxelSize = reader.Read(); + break; + case "radiusScale": + instance.radiusScale = reader.Read(); + break; + case "sendCollisionMessages": + instance.sendCollisionMessages = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_CollisionModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_CollisionModule.cs.meta new file mode 100644 index 000000000..9770e3fe8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_CollisionModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 45f02f0eb77fe4209a290c5928c9ade5 +timeCreated: 1519132284 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_CollisionModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color.cs new file mode 100644 index 000000000..e35b0d9fb --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color.cs @@ -0,0 +1,44 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("r", "g", "b", "a")] + public class ES3Type_Color : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Color() : base(typeof(Color)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Color casted = (Color)obj; + writer.WriteProperty("r", casted.r, ES3Type_float.Instance); + writer.WriteProperty("g", casted.g, ES3Type_float.Instance); + writer.WriteProperty("b", casted.b, ES3Type_float.Instance); + writer.WriteProperty("a", casted.a, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Color( reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } + + public class ES3Type_ColorArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_ColorArray() : base(typeof(Color[]), ES3Type_Color.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color.cs.meta new file mode 100644 index 000000000..64f0daf21 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b97411847937943ab859b0ab7acfb872 +timeCreated: 1519132295 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color32.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color32.cs new file mode 100644 index 000000000..a5ddd20cd --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color32.cs @@ -0,0 +1,51 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("r", "g", "b", "a")] + public class ES3Type_Color32 : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Color32() : base(typeof(Color32)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Color32 casted = (Color32)obj; + writer.WriteProperty("r", casted.r, ES3Type_byte.Instance); + writer.WriteProperty("g", casted.g, ES3Type_byte.Instance); + writer.WriteProperty("b", casted.b, ES3Type_byte.Instance); + writer.WriteProperty("a", casted.a, ES3Type_byte.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Color32( reader.ReadProperty(ES3Type_byte.Instance), + reader.ReadProperty(ES3Type_byte.Instance), + reader.ReadProperty(ES3Type_byte.Instance), + reader.ReadProperty(ES3Type_byte.Instance)); + } + + public static bool Equals(Color32 a, Color32 b) + { + if(a.r != b.r || a.g != b.g || a.b != b.b || a.a != b.a) + return false; + return true; + } + } + + public class ES3Type_Color32Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Color32Array() : base(typeof(Color32[]), ES3Type_Color32.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color32.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color32.cs.meta new file mode 100644 index 000000000..f39535446 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color32.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 3b1b3a09c48c14072a133f5ba4c651e7 +timeCreated: 1519132283 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Color32.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorBySpeedModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorBySpeedModule.cs new file mode 100644 index 000000000..d65b3a013 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorBySpeedModule.cs @@ -0,0 +1,58 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "color", "range")] + public class ES3Type_ColorBySpeedModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ColorBySpeedModule() : base(typeof(UnityEngine.ParticleSystem.ColorBySpeedModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.ColorBySpeedModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("color", instance.color, ES3Type_MinMaxGradient.Instance); + writer.WriteProperty("range", instance.range, ES3Type_Vector2.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.ColorBySpeedModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.ColorBySpeedModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "color": + instance.color = reader.Read(ES3Type_MinMaxGradient.Instance); + break; + case "range": + instance.range = reader.Read(ES3Type_Vector2.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorBySpeedModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorBySpeedModule.cs.meta new file mode 100644 index 000000000..6160cca96 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorBySpeedModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: fb109d087368d4849b6e1222c912ec72 +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorBySpeedModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorOverLifetimeModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorOverLifetimeModule.cs new file mode 100644 index 000000000..9266d6252 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorOverLifetimeModule.cs @@ -0,0 +1,54 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "color")] + public class ES3Type_ColorOverLifetimeModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ColorOverLifetimeModule() : base(typeof(UnityEngine.ParticleSystem.ColorOverLifetimeModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.ColorOverLifetimeModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("color", instance.color, ES3Type_MinMaxGradient.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.ColorOverLifetimeModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.ColorOverLifetimeModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "color": + instance.color = reader.Read(ES3Type_MinMaxGradient.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorOverLifetimeModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorOverLifetimeModule.cs.meta new file mode 100644 index 000000000..de3eb52fe --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorOverLifetimeModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 744909a4693a34ff99f9886d8bddc408 +timeCreated: 1519132288 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ColorOverLifetimeModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_EmissionModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_EmissionModule.cs new file mode 100644 index 000000000..39a024449 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_EmissionModule.cs @@ -0,0 +1,74 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "rateOverTime", "rateOverTimeMultiplier", "rateOverDistance", "rateOverDistanceMultiplier")] + public class ES3Type_EmissionModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_EmissionModule() : base(typeof(UnityEngine.ParticleSystem.EmissionModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.EmissionModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("rateOverTime", instance.rateOverTime, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("rateOverTimeMultiplier", instance.rateOverTimeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("rateOverDistance", instance.rateOverDistance, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("rateOverDistanceMultiplier", instance.rateOverDistanceMultiplier, ES3Type_float.Instance); + + var bursts = new ParticleSystem.Burst[instance.burstCount]; + instance.GetBursts(bursts); + writer.WriteProperty("bursts", bursts, ES3Type_BurstArray.Instance); + } + + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.EmissionModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.EmissionModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "rateOverTime": + instance.rateOverTime = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "rateOverTimeMultiplier": + instance.rateOverTimeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "rateOverDistance": + instance.rateOverDistance = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "rateOverDistanceMultiplier": + instance.rateOverDistanceMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "bursts": + instance.SetBursts(reader.Read(ES3Type_BurstArray.Instance)); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_EmissionModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_EmissionModule.cs.meta new file mode 100644 index 000000000..386473879 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_EmissionModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0601343d0f8fb45d591c1f16dde23330 +timeCreated: 1519132279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_EmissionModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ExternalForcesModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ExternalForcesModule.cs new file mode 100644 index 000000000..06b774e75 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ExternalForcesModule.cs @@ -0,0 +1,54 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "multiplier")] + public class ES3Type_ExternalForcesModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ExternalForcesModule() : base(typeof(UnityEngine.ParticleSystem.ExternalForcesModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.ExternalForcesModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("multiplier", instance.multiplier, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.ExternalForcesModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.ExternalForcesModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "multiplier": + instance.multiplier = reader.Read(ES3Type_float.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ExternalForcesModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ExternalForcesModule.cs.meta new file mode 100644 index 000000000..cf1804427 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ExternalForcesModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 73b0b581a64c54420b1931059384200c +timeCreated: 1519132288 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ExternalForcesModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Flare.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Flare.cs new file mode 100644 index 000000000..3cdb7c48c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Flare.cs @@ -0,0 +1,60 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("hideFlags")] + public class ES3Type_Flare : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Flare() : base(typeof(UnityEngine.Flare)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Flare)obj; + + writer.WriteProperty("hideFlags", instance.hideFlags); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.Flare(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Flare)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_FlareArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_FlareArray() : base(typeof(UnityEngine.Flare[]), ES3Type_Flare.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Flare.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Flare.cs.meta new file mode 100644 index 000000000..f299be267 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Flare.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 32592ed571b254a1ebc1cda3cc03f861 +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Flare.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Font.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Font.cs new file mode 100644 index 000000000..4fc08eca3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Font.cs @@ -0,0 +1,57 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("material", "name")] + public class ES3Type_Font : ES3UnityObjectType + { + public static ES3Type Instance = null; + + public ES3Type_Font() : base(typeof(UnityEngine.Font)){ Instance = this; } + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Font)obj; + + writer.WriteProperty("name", instance.name, ES3Type_string.Instance); + writer.WriteProperty("material", instance.material); + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Font)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + case "material": + instance.material = reader.Read(ES3Type_Material.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadUnityObject(ES3Reader reader) + { + var instance = new UnityEngine.Font(reader.ReadProperty(ES3Type_string.Instance)); + ReadObject(reader, instance); + return instance; + } + } + + public class ES3Type_FontArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_FontArray() : base(typeof(UnityEngine.Font[]), ES3Type_Font.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Font.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Font.cs.meta new file mode 100644 index 000000000..baf7bba28 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Font.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b779410f33269447a8410aa5c60a3366 +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Font.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ForceOverLifetimeModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ForceOverLifetimeModule.cs new file mode 100644 index 000000000..62153921a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ForceOverLifetimeModule.cs @@ -0,0 +1,82 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "x", "y", "z", "xMultiplier", "yMultiplier", "zMultiplier", "space", "randomized")] + public class ES3Type_ForceOverLifetimeModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ForceOverLifetimeModule() : base(typeof(UnityEngine.ParticleSystem.ForceOverLifetimeModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.ForceOverLifetimeModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("x", instance.x, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("y", instance.y, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("z", instance.z, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("xMultiplier", instance.xMultiplier, ES3Type_float.Instance); + writer.WriteProperty("yMultiplier", instance.yMultiplier, ES3Type_float.Instance); + writer.WriteProperty("zMultiplier", instance.zMultiplier, ES3Type_float.Instance); + writer.WriteProperty("space", instance.space); + writer.WriteProperty("randomized", instance.randomized, ES3Type_bool.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.ForceOverLifetimeModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.ForceOverLifetimeModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "x": + instance.x = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "y": + instance.y = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "z": + instance.z = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "xMultiplier": + instance.xMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "yMultiplier": + instance.yMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "zMultiplier": + instance.zMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "space": + instance.space = reader.Read(); + break; + case "randomized": + instance.randomized = reader.Read(ES3Type_bool.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ForceOverLifetimeModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ForceOverLifetimeModule.cs.meta new file mode 100644 index 000000000..3de7f90df --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ForceOverLifetimeModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: fd5844fc025754c5399be113ca40fc39 +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ForceOverLifetimeModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs new file mode 100644 index 000000000..84186a8af --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs @@ -0,0 +1,320 @@ +using System; +using UnityEngine; +using System.Collections.Generic; +using ES3Internal; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("layer", "isStatic", "tag", "name", "hideFlags", "children", "components")] + public class ES3Type_GameObject : ES3UnityObjectType + { + private const string prefabPropertyName = "es3Prefab"; + private const string transformPropertyName = "transformID"; + public static ES3Type Instance = null; + public bool saveChildren = false; + + public ES3Type_GameObject() : base(typeof(UnityEngine.GameObject)) { Instance = this; } + + public override void WriteObject(object obj, ES3Writer writer, ES3.ReferenceMode mode) + { + if (WriteUsingDerivedType(obj, writer)) + return; + var instance = (UnityEngine.GameObject)obj; + + var mgr = ES3ReferenceMgrBase.GetManagerFromScene(instance.scene); + + if (mode != ES3.ReferenceMode.ByValue) + { + writer.WriteRef(instance, ES3ReferenceMgrBase.referencePropertyName, mgr); + + if (mode == ES3.ReferenceMode.ByRef) + return; + + var es3Prefab = instance.GetComponent(); + if (es3Prefab != null) + writer.WriteProperty(prefabPropertyName, es3Prefab, ES3Type_ES3PrefabInternal.Instance); + + // Write the ID of this Transform so we can assign it's ID when we load. + writer.WriteRef(instance.transform, transformPropertyName, mgr); + } + + var es3AutoSave = instance.GetComponent(); + + if(es3AutoSave == null || es3AutoSave.saveLayer) + writer.WriteProperty("layer", instance.layer, ES3Type_int.Instance); + if (es3AutoSave == null || es3AutoSave.saveTag) + writer.WriteProperty("tag", instance.tag, ES3Type_string.Instance); + if (es3AutoSave == null || es3AutoSave.saveName) + writer.WriteProperty("name", instance.name, ES3Type_string.Instance); + if (es3AutoSave == null || es3AutoSave.saveHideFlags) + writer.WriteProperty("hideFlags", instance.hideFlags); + if (es3AutoSave == null || es3AutoSave.saveActive) + writer.WriteProperty("active", instance.activeSelf); + + if ((es3AutoSave == null && saveChildren) || (es3AutoSave != null && es3AutoSave.saveChildren)) + writer.WriteProperty("children", GetChildren(instance), ES3.ReferenceMode.ByRefAndValue); + + List components; + + var es3GameObject = instance.GetComponent(); + + // If there's an ES3AutoSave attached and Components are marked to be saved, save these. + if (es3AutoSave != null) + { + es3AutoSave.componentsToSave.RemoveAll(c => c == null); + components = es3AutoSave.componentsToSave; + } + // If there's an ES3GameObject attached, save these. + else if (es3GameObject != null) + { + es3GameObject.components.RemoveAll(c => c == null); + components = es3GameObject.components; + } + // Otherwise, only save explicitly-supported Components, /*or those explicitly marked as Serializable*/. + else + { + components = new List(); + foreach (var component in instance.GetComponents()) + if (component != null && ES3TypeMgr.GetES3Type(component.GetType()) != null) + components.Add(component); + } + + if(components != null & components.Count > 0) + writer.WriteProperty("components", components, ES3.ReferenceMode.ByRefAndValue); + } + + protected override object ReadObject(ES3Reader reader) + { + UnityEngine.Object obj = null; + var refMgr = ES3ReferenceMgrBase.Current; + long id = 0; + + // Read the intial properties regarding the instance we're loading. + while (true) + { + if (refMgr == null) + throw new InvalidOperationException($"An Easy Save 3 Manager is required to save references. To add one to your scene, exit playmode and go to Tools > Easy Save 3 > Add Manager to Scene. Object being saved by reference is {obj.GetType()} with name {obj.name}."); + + var propertyName = ReadPropertyName(reader); + + if (propertyName == ES3Type.typeFieldName) + return ES3TypeMgr.GetOrCreateES3Type(reader.ReadType()).Read(reader); + else if (propertyName == ES3ReferenceMgrBase.referencePropertyName) + { + id = reader.Read_ref(); + obj = refMgr.Get(id, true); + } + else if (propertyName == transformPropertyName) + { + // Now load the Transform's ID and assign it to the Transform of our object. + long transformID = reader.Read_ref(); + if (obj == null) + obj = CreateNewGameObject(refMgr, id); + refMgr.Add(((GameObject)obj).transform, transformID); + } + else if (propertyName == prefabPropertyName) + { + if (obj != null || ES3ReferenceMgrBase.Current == null) + { + reader.ReadInto(obj); // ReadInto to apply the prefab references. + } + else + { + obj = reader.Read(ES3Type_ES3PrefabInternal.Instance); + ES3ReferenceMgrBase.Current.Add(obj, id); + } + } + else if (propertyName == null) + { + /*if (obj == null) + obj = CreateNewGameObject(refMgr, id);*/ + return obj; + } + else + { + reader.overridePropertiesName = propertyName; + break; + } + } + + if (obj == null) + obj = CreateNewGameObject(refMgr, id); + + ReadInto(reader, obj); + return obj; + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.GameObject)obj; + + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + case ES3ReferenceMgrBase.referencePropertyName: + ES3ReferenceMgr.Current.Add(instance, reader.Read_ref()); + break; + case "prefab": + break; + case "layer": + instance.layer = reader.Read(ES3Type_int.Instance); + break; + case "tag": + instance.tag = reader.Read(ES3Type_string.Instance); + break; + case "name": + instance.name = reader.Read(ES3Type_string.Instance); + break; + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + case "active": + instance.SetActive(reader.Read(ES3Type_bool.Instance)); + break; + case "children": + var children = reader.Read(); + var parent = instance.transform; + // Set the parent of each child to this Transform in case the reference ID of the parent has changed. + foreach (var child in children) + child.transform.SetParent(parent); + break; + case "components": + ReadComponents(reader, instance); + break; + default: + reader.Skip(); + break; + } + } + } + + private void ReadComponents(ES3Reader reader, GameObject go) + { + if (reader.StartReadCollection()) + return; + + var components = new List(go.GetComponents()); + + // Read each Component in Components array + while (true) + { + if (!reader.StartReadCollectionItem()) + break; + + if (reader.StartReadObject()) + // We're reading null, so skip this Component. + continue; + + string typeName = null; + Type type = null; + + string propertyName; + while (true) + { + propertyName = ReadPropertyName(reader); + + if (propertyName == ES3Type.typeFieldName) + { + typeName = reader.Read(ES3Type_string.Instance); + type = ES3Reflection.GetType(typeName); + } + else if (propertyName == ES3ReferenceMgrBase.referencePropertyName) + { + if (type == null) + { + if (string.IsNullOrEmpty(typeName)) + throw new InvalidOperationException("Cannot load Component because no type data has been stored with it, so it's not possible to determine it's type"); + else + Debug.LogWarning($"Cannot load Component of type {typeName} because this type no longer exists in your project. Note that this issue will create an empty GameObject named 'New Game Object' in your scene due to the way in which this Component needs to be skipped."); + + // Read past the Component. + reader.overridePropertiesName = propertyName; + ReadObject(reader); + break; + } + + var componentRef = reader.Read_ref(); + + // Rather than loading by reference, load using the Components list. + var c = components.Find(x => x.GetType() == type); + // If the Component exists in the Component list, load into it and remove it from the list. + if (c != null) + { + if (ES3ReferenceMgrBase.Current != null) + ES3ReferenceMgrBase.Current.Add(c, componentRef); + + ES3TypeMgr.GetOrCreateES3Type(type).ReadInto(reader, c); + components.Remove(c); + } + // Else, create a new Component. + else + { + var component = go.AddComponent(type); + ES3TypeMgr.GetOrCreateES3Type(type).ReadInto(reader, component); + ES3ReferenceMgrBase.Current.Add(component, componentRef); + } + break; + } + else if (propertyName == null) + break; + else + { + reader.overridePropertiesName = propertyName; + ReadObject(reader); + break; + } + } + + reader.EndReadObject(); + + if (reader.EndReadCollectionItem()) + break; + } + + reader.EndReadCollection(); + } + + private GameObject CreateNewGameObject(ES3ReferenceMgrBase refMgr, long id) + { + GameObject go = new GameObject(); + if (id != 0) + refMgr.Add(go, id); + else + refMgr.Add(go); + return go; + } + + /* + * Gets the direct children of this GameObject. + */ + public static List GetChildren(GameObject go) + { + var goTransform = go.transform; + var children = new List(); + + foreach (Transform child in goTransform) + // If a child has an Auto Save component, let it save itself. + //if(child.GetComponent() == null) + children.Add(child.gameObject); + + return children; + } + + // These are not used as we've overridden the ReadObject methods instead. + protected override void WriteUnityObject(object obj, ES3Writer writer) { } + protected override void ReadUnityObject(ES3Reader reader, object obj) { } + protected override object ReadUnityObject(ES3Reader reader) { return null; } + } + + public class ES3Type_GameObjectArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_GameObjectArray() : base(typeof(UnityEngine.GameObject[]), ES3Type_GameObject.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs.meta new file mode 100644 index 000000000..1645261b6 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 1ca7947fbcbec457f89b984a9647a9d7 +timeCreated: 1519132281 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GameObject.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Gradient.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Gradient.cs new file mode 100644 index 000000000..5107de7a4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Gradient.cs @@ -0,0 +1,55 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("colorKeys", "alphaKeys", "mode")] + public class ES3Type_Gradient : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Gradient() : base(typeof(UnityEngine.Gradient)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Gradient)obj; + writer.WriteProperty("colorKeys", instance.colorKeys, ES3Type_GradientColorKeyArray.Instance); + writer.WriteProperty("alphaKeys", instance.alphaKeys, ES3Type_GradientAlphaKeyArray.Instance); + writer.WriteProperty("mode", instance.mode); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.Gradient(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Gradient)obj; + instance.SetKeys( + reader.ReadProperty(ES3Type_GradientColorKeyArray.Instance), + reader.ReadProperty(ES3Type_GradientAlphaKeyArray.Instance) + ); + + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + case "mode": + instance.mode = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Gradient.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Gradient.cs.meta new file mode 100644 index 000000000..ef308f260 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Gradient.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: a509023afeeee4a49965009b6ba4bc44 +timeCreated: 1519132293 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Gradient.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientAlphaKey.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientAlphaKey.cs new file mode 100644 index 000000000..24ce934d2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientAlphaKey.cs @@ -0,0 +1,41 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("alpha", "time")] + public class ES3Type_GradientAlphaKey : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_GradientAlphaKey() : base(typeof(UnityEngine.GradientAlphaKey)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.GradientAlphaKey)obj; + + writer.WriteProperty("alpha", instance.alpha, ES3Type_float.Instance); + writer.WriteProperty("time", instance.time, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new UnityEngine.GradientAlphaKey(reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } + + public class ES3Type_GradientAlphaKeyArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_GradientAlphaKeyArray() : base(typeof(GradientAlphaKey[]), ES3Type_GradientAlphaKey.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientAlphaKey.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientAlphaKey.cs.meta new file mode 100644 index 000000000..b6652d43b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientAlphaKey.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 934a57ef826284a56bb97406bcf373fd +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientAlphaKey.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientColorKey.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientColorKey.cs new file mode 100644 index 000000000..7317e479d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientColorKey.cs @@ -0,0 +1,41 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("color", "time")] + public class ES3Type_GradientColorKey : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_GradientColorKey() : base(typeof(UnityEngine.GradientColorKey)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.GradientColorKey)obj; + + writer.WriteProperty("color", instance.color, ES3Type_Color.Instance); + writer.WriteProperty("time", instance.time, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new UnityEngine.GradientColorKey(reader.ReadProperty(ES3Type_Color.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } + + public class ES3Type_GradientColorKeyArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_GradientColorKeyArray() : base(typeof(GradientColorKey[]), ES3Type_GradientColorKey.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientColorKey.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientColorKey.cs.meta new file mode 100644 index 000000000..5c6156683 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientColorKey.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9dcbf4e7ca28b4bd5a6eb0a9d256c082 +timeCreated: 1519132292 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_GradientColorKey.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Guid.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Guid.cs new file mode 100644 index 000000000..d56e433b5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Guid.cs @@ -0,0 +1,37 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("value")] + public class ES3Type_Guid : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Guid() : base(typeof(Guid)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Guid casted = (Guid)obj; + writer.WriteProperty("value", casted.ToString(), ES3Type_string.Instance); + } + + public override object Read(ES3Reader reader) + { + return Guid.Parse(reader.ReadProperty(ES3Type_string.Instance)); + } + } + + public class ES3Type_GuidArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_GuidArray() : base(typeof(Guid[]), ES3Type_Guid.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Guid.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Guid.cs.meta new file mode 100644 index 000000000..d0f9ba7c2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Guid.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 7e9441d85c177084db4be38cf2cb2aca +timeCreated: 1519132295 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Guid.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_InheritVelocityModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_InheritVelocityModule.cs new file mode 100644 index 000000000..07bb74367 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_InheritVelocityModule.cs @@ -0,0 +1,62 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "mode", "curve", "curveMultiplier")] + public class ES3Type_InheritVelocityModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_InheritVelocityModule() : base(typeof(UnityEngine.ParticleSystem.InheritVelocityModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.InheritVelocityModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("mode", instance.mode); + writer.WriteProperty("curve", instance.curve, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("curveMultiplier", instance.curveMultiplier, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.InheritVelocityModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.InheritVelocityModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "mode": + instance.mode = reader.Read(); + break; + case "curve": + instance.curve = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "curveMultiplier": + instance.curveMultiplier = reader.Read(ES3Type_float.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_InheritVelocityModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_InheritVelocityModule.cs.meta new file mode 100644 index 000000000..1ede7f183 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_InheritVelocityModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: c652805edba024e5c885fa799b3a5775 +timeCreated: 1519132296 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_InheritVelocityModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Keyframe.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Keyframe.cs new file mode 100644 index 000000000..af39e94f8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Keyframe.cs @@ -0,0 +1,45 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("time", "value", "inTangent", "outTangent")] + public class ES3Type_Keyframe : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Keyframe() : base(typeof(UnityEngine.Keyframe)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Keyframe)obj; + + writer.WriteProperty("time", instance.time, ES3Type_float.Instance); + writer.WriteProperty("value", instance.value, ES3Type_float.Instance); + writer.WriteProperty("inTangent", instance.inTangent, ES3Type_float.Instance); + writer.WriteProperty("outTangent", instance.outTangent, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new UnityEngine.Keyframe(reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } + + public class ES3Type_KeyframeArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_KeyframeArray() : base(typeof(Keyframe[]), ES3Type_Keyframe.Instance) + { + Instance = this; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Keyframe.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Keyframe.cs.meta new file mode 100644 index 000000000..8470d4ba0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Keyframe.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 63eb0700074954e23aa09edcc4b81016 +timeCreated: 1519132287 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Keyframe.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LayerMask.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LayerMask.cs new file mode 100644 index 000000000..e829a2043 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LayerMask.cs @@ -0,0 +1,43 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("colorKeys", "alphaKeys", "mode")] + public class ES3Type_LayerMask : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_LayerMask() : base(typeof(UnityEngine.LayerMask)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.LayerMask)obj; + + writer.WriteProperty("value", instance.value, ES3Type_int.Instance); + } + + public override object Read(ES3Reader reader) + { + LayerMask instance = new LayerMask(); + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + case "value": + instance = reader.Read(ES3Type_int.Instance); + break; + default: + reader.Skip(); + break; + } + } + return instance; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LayerMask.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LayerMask.cs.meta new file mode 100644 index 000000000..d28145d01 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LayerMask.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: ad28544641a3c495b8ebbf10c51bf359 +timeCreated: 1519132293 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LayerMask.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Light.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Light.cs new file mode 100644 index 000000000..b8501fdf2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Light.cs @@ -0,0 +1,117 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("type", "color", "intensity", "bounceIntensity", "shadows", "shadowStrength", "shadowResolution", "shadowCustomResolution", "shadowBias", "shadowNormalBias", "shadowNearPlane", "range", "spotAngle", "cookieSize", "cookie", "flare", "renderMode", "cullingMask", "areaSize", "lightmappingMode", "enabled", "hideFlags")] + public class ES3Type_Light : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_Light() : base(typeof(UnityEngine.Light)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Light)obj; + + writer.WriteProperty("type", instance.type); + writer.WriteProperty("color", instance.color, ES3Type_Color.Instance); + writer.WriteProperty("intensity", instance.intensity, ES3Type_float.Instance); + writer.WriteProperty("bounceIntensity", instance.bounceIntensity, ES3Type_float.Instance); + writer.WriteProperty("shadows", instance.shadows); + writer.WriteProperty("shadowStrength", instance.shadowStrength, ES3Type_float.Instance); + writer.WriteProperty("shadowResolution", instance.shadowResolution); + writer.WriteProperty("shadowCustomResolution", instance.shadowCustomResolution, ES3Type_int.Instance); + writer.WriteProperty("shadowBias", instance.shadowBias, ES3Type_float.Instance); + writer.WriteProperty("shadowNormalBias", instance.shadowNormalBias, ES3Type_float.Instance); + writer.WriteProperty("shadowNearPlane", instance.shadowNearPlane, ES3Type_float.Instance); + writer.WriteProperty("range", instance.range, ES3Type_float.Instance); + writer.WriteProperty("spotAngle", instance.spotAngle, ES3Type_float.Instance); + writer.WriteProperty("cookieSize", instance.cookieSize, ES3Type_float.Instance); + writer.WriteProperty("cookie", instance.cookie, ES3Type_Texture2D.Instance); + writer.WriteProperty("flare", instance.flare, ES3Type_Texture2D.Instance); + writer.WriteProperty("renderMode", instance.renderMode); + writer.WriteProperty("cullingMask", instance.cullingMask, ES3Type_int.Instance); + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("hideFlags", instance.hideFlags); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Light)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "type": + instance.type = reader.Read(); + break; + case "color": + instance.color = reader.Read(ES3Type_Color.Instance); + break; + case "intensity": + instance.intensity = reader.Read(ES3Type_float.Instance); + break; + case "bounceIntensity": + instance.bounceIntensity = reader.Read(ES3Type_float.Instance); + break; + case "shadows": + instance.shadows = reader.Read(); + break; + case "shadowStrength": + instance.shadowStrength = reader.Read(ES3Type_float.Instance); + break; + case "shadowResolution": + instance.shadowResolution = reader.Read(); + break; + case "shadowCustomResolution": + instance.shadowCustomResolution = reader.Read(ES3Type_int.Instance); + break; + case "shadowBias": + instance.shadowBias = reader.Read(ES3Type_float.Instance); + break; + case "shadowNormalBias": + instance.shadowNormalBias = reader.Read(ES3Type_float.Instance); + break; + case "shadowNearPlane": + instance.shadowNearPlane = reader.Read(ES3Type_float.Instance); + break; + case "range": + instance.range = reader.Read(ES3Type_float.Instance); + break; + case "spotAngle": + instance.spotAngle = reader.Read(ES3Type_float.Instance); + break; + case "cookieSize": + instance.cookieSize = reader.Read(ES3Type_float.Instance); + break; + case "cookie": + instance.cookie = reader.Read(); + break; + case "flare": + instance.flare = reader.Read(); + break; + case "renderMode": + instance.renderMode = reader.Read(); + break; + case "cullingMask": + instance.cullingMask = reader.Read(ES3Type_int.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Light.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Light.cs.meta new file mode 100644 index 000000000..187c4f13e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Light.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: ed020448eba3f489fafcf36e1bf3b7e0 +timeCreated: 1519132300 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Light.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LightsModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LightsModule.cs new file mode 100644 index 000000000..4af8af8e8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LightsModule.cs @@ -0,0 +1,94 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "ratio", "useRandomDistribution", "light", "useParticleColor", "sizeAffectsRange", "alphaAffectsIntensity", "range", "rangeMultiplier", "intensity", "intensityMultiplier", "maxLights")] + public class ES3Type_LightsModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_LightsModule() : base(typeof(UnityEngine.ParticleSystem.LightsModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.LightsModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("ratio", instance.ratio, ES3Type_float.Instance); + writer.WriteProperty("useRandomDistribution", instance.useRandomDistribution, ES3Type_bool.Instance); + writer.WritePropertyByRef("light", instance.light); + writer.WriteProperty("useParticleColor", instance.useParticleColor, ES3Type_bool.Instance); + writer.WriteProperty("sizeAffectsRange", instance.sizeAffectsRange, ES3Type_bool.Instance); + writer.WriteProperty("alphaAffectsIntensity", instance.alphaAffectsIntensity, ES3Type_bool.Instance); + writer.WriteProperty("range", instance.range, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("rangeMultiplier", instance.rangeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("intensity", instance.intensity, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("intensityMultiplier", instance.intensityMultiplier, ES3Type_float.Instance); + writer.WriteProperty("maxLights", instance.maxLights, ES3Type_int.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.LightsModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.LightsModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "ratio": + instance.ratio = reader.Read(ES3Type_float.Instance); + break; + case "useRandomDistribution": + instance.useRandomDistribution = reader.Read(ES3Type_bool.Instance); + break; + case "light": + instance.light = reader.Read(ES3Type_Light.Instance); + break; + case "useParticleColor": + instance.useParticleColor = reader.Read(ES3Type_bool.Instance); + break; + case "sizeAffectsRange": + instance.sizeAffectsRange = reader.Read(ES3Type_bool.Instance); + break; + case "alphaAffectsIntensity": + instance.alphaAffectsIntensity = reader.Read(ES3Type_bool.Instance); + break; + case "range": + instance.range = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "rangeMultiplier": + instance.rangeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "intensity": + instance.intensity = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "intensityMultiplier": + instance.intensityMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "maxLights": + instance.maxLights = reader.Read(ES3Type_int.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LightsModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LightsModule.cs.meta new file mode 100644 index 000000000..134aa7d6a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LightsModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: ca49590603e164a87a49d3c66013bede +timeCreated: 1519132296 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LightsModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LimitVelocityOverLifetimeModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LimitVelocityOverLifetimeModule.cs new file mode 100644 index 000000000..059a9f676 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LimitVelocityOverLifetimeModule.cs @@ -0,0 +1,94 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "limitX", "limitXMultiplier", "limitY", "limitYMultiplier", "limitZ", "limitZMultiplier", "limit", "limitMultiplier", "dampen", "separateAxes", "space")] + public class ES3Type_LimitVelocityOverLifetimeModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_LimitVelocityOverLifetimeModule() : base(typeof(UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("limitX", instance.limitX, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("limitXMultiplier", instance.limitXMultiplier, ES3Type_float.Instance); + writer.WriteProperty("limitY", instance.limitY, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("limitYMultiplier", instance.limitYMultiplier, ES3Type_float.Instance); + writer.WriteProperty("limitZ", instance.limitZ, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("limitZMultiplier", instance.limitZMultiplier, ES3Type_float.Instance); + writer.WriteProperty("limit", instance.limit, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("limitMultiplier", instance.limitMultiplier, ES3Type_float.Instance); + writer.WriteProperty("dampen", instance.dampen, ES3Type_float.Instance); + writer.WriteProperty("separateAxes", instance.separateAxes, ES3Type_bool.Instance); + writer.WriteProperty("space", instance.space); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "limitX": + instance.limitX = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "limitXMultiplier": + instance.limitXMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "limitY": + instance.limitY = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "limitYMultiplier": + instance.limitYMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "limitZ": + instance.limitZ = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "limitZMultiplier": + instance.limitZMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "limit": + instance.limit = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "limitMultiplier": + instance.limitMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "dampen": + instance.dampen = reader.Read(ES3Type_float.Instance); + break; + case "separateAxes": + instance.separateAxes = reader.Read(ES3Type_bool.Instance); + break; + case "space": + instance.space = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LimitVelocityOverLifetimeModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LimitVelocityOverLifetimeModule.cs.meta new file mode 100644 index 000000000..9961839f5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LimitVelocityOverLifetimeModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 1b26d58c373b9474591275b8c3b33514 +timeCreated: 1519132281 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_LimitVelocityOverLifetimeModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MainModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MainModule.cs new file mode 100644 index 000000000..54cfae8a2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MainModule.cs @@ -0,0 +1,206 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("duration", "loop", "prewarm", "startDelay", "startDelayMultiplier", "startLifetime", "startLifetimeMultiplier", "startSpeed", "startSpeedMultiplier", "startSize3D", "startSize", "startSizeMultiplier", "startSizeX", "startSizeXMultiplier", "startSizeY", "startSizeYMultiplier", "startSizeZ", "startSizeZMultiplier", "startRotation3D", "startRotation", "startRotationMultiplier", "startRotationX", "startRotationXMultiplier", "startRotationY", "startRotationYMultiplier", "startRotationZ", "startRotationZMultiplier", "randomizeRotationDirection", "startColor", "gravityModifier", "gravityModifierMultiplier", "simulationSpace", "customSimulationSpace", "simulationSpeed", "scalingMode", "playOnAwake", "maxParticles")] + public class ES3Type_MainModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_MainModule() : base(typeof(UnityEngine.ParticleSystem.MainModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.MainModule)obj; + + writer.WriteProperty("duration", instance.duration, ES3Type_float.Instance); + writer.WriteProperty("loop", instance.loop, ES3Type_bool.Instance); + writer.WriteProperty("prewarm", instance.prewarm, ES3Type_bool.Instance); + writer.WriteProperty("startDelay", instance.startDelay, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startDelayMultiplier", instance.startDelayMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startLifetime", instance.startLifetime, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startLifetimeMultiplier", instance.startLifetimeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startSpeed", instance.startSpeed, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startSpeedMultiplier", instance.startSpeedMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startSize3D", instance.startSize3D, ES3Type_bool.Instance); + writer.WriteProperty("startSize", instance.startSize, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startSizeMultiplier", instance.startSizeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startSizeX", instance.startSizeX, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startSizeXMultiplier", instance.startSizeXMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startSizeY", instance.startSizeY, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startSizeYMultiplier", instance.startSizeYMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startSizeZ", instance.startSizeZ, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startSizeZMultiplier", instance.startSizeZMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startRotation3D", instance.startRotation3D, ES3Type_bool.Instance); + writer.WriteProperty("startRotation", instance.startRotation, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startRotationMultiplier", instance.startRotationMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startRotationX", instance.startRotationX, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startRotationXMultiplier", instance.startRotationXMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startRotationY", instance.startRotationY, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startRotationYMultiplier", instance.startRotationYMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startRotationZ", instance.startRotationZ, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startRotationZMultiplier", instance.startRotationZMultiplier, ES3Type_float.Instance); + #if UNITY_2018_1_OR_NEWER + writer.WriteProperty("flipRotation", instance.flipRotation, ES3Type_float.Instance); + #else + writer.WriteProperty("randomizeRotationDirection", instance.randomizeRotationDirection, ES3Type_float.Instance); + #endif + writer.WriteProperty("startColor", instance.startColor, ES3Type_MinMaxGradient.Instance); + writer.WriteProperty("gravityModifier", instance.gravityModifier, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("gravityModifierMultiplier", instance.gravityModifierMultiplier, ES3Type_float.Instance); + writer.WriteProperty("simulationSpace", instance.simulationSpace); + writer.WritePropertyByRef("customSimulationSpace", instance.customSimulationSpace); + writer.WriteProperty("simulationSpeed", instance.simulationSpeed, ES3Type_float.Instance); + writer.WriteProperty("scalingMode", instance.scalingMode); + writer.WriteProperty("playOnAwake", instance.playOnAwake, ES3Type_bool.Instance); + writer.WriteProperty("maxParticles", instance.maxParticles, ES3Type_int.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.MainModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.MainModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + case "duration": + instance.duration = reader.Read(ES3Type_float.Instance); + break; + case "loop": + instance.loop = reader.Read(ES3Type_bool.Instance); + break; + case "prewarm": + instance.prewarm = reader.Read(ES3Type_bool.Instance); + break; + case "startDelay": + instance.startDelay = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startDelayMultiplier": + instance.startDelayMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startLifetime": + instance.startLifetime = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startLifetimeMultiplier": + instance.startLifetimeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startSpeed": + instance.startSpeed = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startSpeedMultiplier": + instance.startSpeedMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startSize3D": + instance.startSize3D = reader.Read(ES3Type_bool.Instance); + break; + case "startSize": + instance.startSize = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startSizeMultiplier": + instance.startSizeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startSizeX": + instance.startSizeX = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startSizeXMultiplier": + instance.startSizeXMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startSizeY": + instance.startSizeY = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startSizeYMultiplier": + instance.startSizeYMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startSizeZ": + instance.startSizeZ = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startSizeZMultiplier": + instance.startSizeZMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startRotation3D": + instance.startRotation3D = reader.Read(ES3Type_bool.Instance); + break; + case "startRotation": + instance.startRotation = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startRotationMultiplier": + instance.startRotationMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startRotationX": + instance.startRotationX = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startRotationXMultiplier": + instance.startRotationXMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startRotationY": + instance.startRotationY = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startRotationYMultiplier": + instance.startRotationYMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startRotationZ": + instance.startRotationZ = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startRotationZMultiplier": + instance.startRotationZMultiplier = reader.Read(ES3Type_float.Instance); + break; + #if UNITY_2018_1_OR_NEWER + case "flipRotation": + instance.flipRotation = reader.Read(ES3Type_float.Instance); + break; + case "randomizeRotationDirection": + instance.flipRotation = reader.Read(ES3Type_float.Instance); + break; + #else + case "randomizeRotationDirection": + instance.randomizeRotationDirection = reader.Read(ES3Type_float.Instance); + break; + #endif + case "startColor": + instance.startColor = reader.Read(ES3Type_MinMaxGradient.Instance); + break; + case "gravityModifier": + instance.gravityModifier = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "gravityModifierMultiplier": + instance.gravityModifierMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "simulationSpace": + instance.simulationSpace = reader.Read(); + break; + case "customSimulationSpace": + instance.customSimulationSpace = reader.Read(ES3Type_Transform.Instance); + break; + case "simulationSpeed": + instance.simulationSpeed = reader.Read(ES3Type_float.Instance); + break; + case "scalingMode": + instance.scalingMode = reader.Read(); + break; + case "playOnAwake": + instance.playOnAwake = reader.Read(ES3Type_bool.Instance); + break; + case "maxParticles": + instance.maxParticles = reader.Read(ES3Type_int.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MainModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MainModule.cs.meta new file mode 100644 index 000000000..b874d6768 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MainModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 55fa2d96d06d64809ad226f1874be169 +timeCreated: 1519132285 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MainModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Material.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Material.cs new file mode 100644 index 000000000..e31c7038e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Material.cs @@ -0,0 +1,1304 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("shader", "renderQueue", "shaderKeywords", "globalIlluminationFlags", "properties")] + public class ES3Type_Material : ES3UnityObjectType + { + public static ES3Type Instance = null; + + public ES3Type_Material() : base(typeof(UnityEngine.Material)){ Instance = this; } + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Material)obj; + + // Uncomment if you want "instance" to be removed from the name. + //instance.name = instance.name.Replace(" (Instance)", ""); + + writer.WriteProperty("name", instance.name); + writer.WriteProperty("shader", instance.shader); + writer.WriteProperty("renderQueue", instance.renderQueue, ES3Type_int.Instance); + writer.WriteProperty("shaderKeywords", instance.shaderKeywords); + writer.WriteProperty("globalIlluminationFlags", instance.globalIlluminationFlags); + + var shader = instance.shader; + + if (shader != null) + { +#if UNITY_2019_3_OR_NEWER + for (int i = 0; i < shader.GetPropertyCount(); i++) + { + var name = shader.GetPropertyName(i); + + switch (shader.GetPropertyType(i)) + { + case UnityEngine.Rendering.ShaderPropertyType.Color: + writer.WriteProperty(name, instance.GetColor(name)); + break; + case UnityEngine.Rendering.ShaderPropertyType.Float: + case UnityEngine.Rendering.ShaderPropertyType.Range: + writer.WriteProperty(name, instance.GetFloat(name)); + break; + case UnityEngine.Rendering.ShaderPropertyType.Texture: + var texture = instance.GetTexture(name); + + if (texture != null && texture.GetType() != typeof(Texture2D)) + { + ES3Internal.ES3Debug.LogWarning($"The texture '{name}' of Material '{instance.name}' will not be saved as only Textures of type Texture2D can be saved at runtime, whereas '{name}' is of type '{texture.GetType()}'."); + break; + } + writer.WriteProperty(name, texture); + writer.WriteProperty(name + "_TextureOffset", instance.GetTextureOffset(name)); + writer.WriteProperty(name + "_TextureScale", instance.GetTextureScale(name)); + break; + case UnityEngine.Rendering.ShaderPropertyType.Vector: + writer.WriteProperty(name, instance.GetVector(name)); + break; + } + } + +#else + + if(instance.HasProperty("_Color")) + writer.WriteProperty("_Color", instance.GetColor("_Color")); + if(instance.HasProperty("_SpecColor")) + writer.WriteProperty("_SpecColor", instance.GetColor("_SpecColor")); + if(instance.HasProperty("_Shininess")) + writer.WriteProperty("_Shininess", instance.GetFloat("_Shininess")); + if(instance.HasProperty("_MainTex")) + { + writer.WriteProperty("_MainTex", instance.GetTexture("_MainTex")); + writer.WriteProperty("_MainTex_Scale", instance.GetTextureScale("_MainTex")); + } + if(instance.HasProperty("_MainTex_TextureOffset")) + writer.WriteProperty("_MainTex_TextureOffset", instance.GetTextureOffset("_MainTex_TextureOffset")); + if(instance.HasProperty("_MainTex_TextureScale")) + writer.WriteProperty("_MainTex_TextureScale", instance.GetTextureScale("_MainTex_TextureScale")); + if(instance.HasProperty("_Illum")) + writer.WriteProperty("_Illum", instance.GetTexture("_Illum")); + if(instance.HasProperty("_Illum_TextureOffset")) + writer.WriteProperty("_Illum_TextureOffset", instance.GetTextureOffset("_Illum_TextureOffset")); + if(instance.HasProperty("_Illum_TextureScale")) + writer.WriteProperty("_Illum_TextureScale", instance.GetTextureScale("_Illum_TextureScale")); + if(instance.HasProperty("_BumpMap")) + writer.WriteProperty("_BumpMap", instance.GetTexture("_BumpMap")); + if(instance.HasProperty("_BumpMap_TextureOffset")) + writer.WriteProperty("_BumpMap_TextureOffset", instance.GetTextureOffset("_BumpMap_TextureOffset")); + if(instance.HasProperty("_BumpMap_TextureScale")) + writer.WriteProperty("_BumpMap_TextureScale", instance.GetTextureScale("_BumpMap_TextureScale")); + if(instance.HasProperty("_Emission")) + writer.WriteProperty("_Emission", instance.GetFloat("_Emission")); + if(instance.HasProperty("_Specular")) + writer.WriteProperty("_Specular", instance.GetColor("_Specular")); + if(instance.HasProperty("_MainBump")) + writer.WriteProperty("_MainBump", instance.GetTexture("_MainBump")); + if(instance.HasProperty("_MainBump_TextureOffset")) + writer.WriteProperty("_MainBump_TextureOffset", instance.GetTextureOffset("_MainBump_TextureOffset")); + if(instance.HasProperty("_MainBump_TextureScale")) + writer.WriteProperty("_MainBump_TextureScale", instance.GetTextureScale("_MainBump_TextureScale")); + if(instance.HasProperty("_Mask")) + writer.WriteProperty("_Mask", instance.GetTexture("_Mask")); + if(instance.HasProperty("_Mask_TextureOffset")) + writer.WriteProperty("_Mask_TextureOffset", instance.GetTextureOffset("_Mask_TextureOffset")); + if(instance.HasProperty("_Mask_TextureScale")) + writer.WriteProperty("_Mask_TextureScale", instance.GetTextureScale("_Mask_TextureScale")); + if(instance.HasProperty("_Focus")) + writer.WriteProperty("_Focus", instance.GetFloat("_Focus")); + if(instance.HasProperty("_StencilComp")) + writer.WriteProperty("_StencilComp", instance.GetFloat("_StencilComp")); + if(instance.HasProperty("_Stencil")) + writer.WriteProperty("_Stencil", instance.GetFloat("_Stencil")); + if(instance.HasProperty("_StencilOp")) + writer.WriteProperty("_StencilOp", instance.GetFloat("_StencilOp")); + if(instance.HasProperty("_StencilWriteMask")) + writer.WriteProperty("_StencilWriteMask", instance.GetFloat("_StencilWriteMask")); + if(instance.HasProperty("_StencilReadMask")) + writer.WriteProperty("_StencilReadMask", instance.GetFloat("_StencilReadMask")); + if(instance.HasProperty("_ColorMask")) + writer.WriteProperty("_ColorMask", instance.GetFloat("_ColorMask")); + if(instance.HasProperty("_UseUIAlphaClip")) + writer.WriteProperty("_UseUIAlphaClip", instance.GetFloat("_UseUIAlphaClip")); + if(instance.HasProperty("_SrcBlend")) + writer.WriteProperty("_SrcBlend", instance.GetFloat("_SrcBlend")); + if(instance.HasProperty("_DstBlend")) + writer.WriteProperty("_DstBlend", instance.GetFloat("_DstBlend")); + if(instance.HasProperty("_ReflectColor")) + writer.WriteProperty("_ReflectColor", instance.GetColor("_ReflectColor")); + if(instance.HasProperty("_Cube")) + writer.WriteProperty("_Cube", instance.GetTexture("_Cube")); + if(instance.HasProperty("_Cube_TextureOffset")) + writer.WriteProperty("_Cube_TextureOffset", instance.GetTextureOffset("_Cube_TextureOffset")); + if(instance.HasProperty("_Cube_TextureScale")) + writer.WriteProperty("_Cube_TextureScale", instance.GetTextureScale("_Cube_TextureScale")); + if(instance.HasProperty("_Tint")) + writer.WriteProperty("_Tint", instance.GetColor("_Tint")); + if(instance.HasProperty("_Exposure")) + writer.WriteProperty("_Exposure", instance.GetFloat("_Exposure")); + if(instance.HasProperty("_Rotation")) + writer.WriteProperty("_Rotation", instance.GetFloat("_Rotation")); + if(instance.HasProperty("_Tex")) + writer.WriteProperty("_Tex", instance.GetTexture("_Tex")); + if(instance.HasProperty("_Tex_TextureOffset")) + writer.WriteProperty("_Tex_TextureOffset", instance.GetTextureOffset("_Tex_TextureOffset")); + if(instance.HasProperty("_Tex_TextureScale")) + writer.WriteProperty("_Tex_TextureScale", instance.GetTextureScale("_Tex_TextureScale")); + if(instance.HasProperty("_Control")) + writer.WriteProperty("_Control", instance.GetTexture("_Control")); + if(instance.HasProperty("_Control_TextureOffset")) + writer.WriteProperty("_Control_TextureOffset", instance.GetTextureOffset("_Control_TextureOffset")); + if(instance.HasProperty("_Control_TextureScale")) + writer.WriteProperty("_Control_TextureScale", instance.GetTextureScale("_Control_TextureScale")); + if(instance.HasProperty("_Splat3")) + writer.WriteProperty("_Splat3", instance.GetTexture("_Splat3")); + if(instance.HasProperty("_Splat3_TextureOffset")) + writer.WriteProperty("_Splat3_TextureOffset", instance.GetTextureOffset("_Splat3_TextureOffset")); + if(instance.HasProperty("_Splat3_TextureScale")) + writer.WriteProperty("_Splat3_TextureScale", instance.GetTextureScale("_Splat3_TextureScale")); + if(instance.HasProperty("_Splat2")) + writer.WriteProperty("_Splat2", instance.GetTexture("_Splat2")); + if(instance.HasProperty("_Splat2_TextureOffset")) + writer.WriteProperty("_Splat2_TextureOffset", instance.GetTextureOffset("_Splat2_TextureOffset")); + if(instance.HasProperty("_Splat2_TextureScale")) + writer.WriteProperty("_Splat2_TextureScale", instance.GetTextureScale("_Splat2_TextureScale")); + if(instance.HasProperty("_Splat1")) + writer.WriteProperty("_Splat1", instance.GetTexture("_Splat1")); + if(instance.HasProperty("_Splat1_TextureOffset")) + writer.WriteProperty("_Splat1_TextureOffset", instance.GetTextureOffset("_Splat1_TextureOffset")); + if(instance.HasProperty("_Splat1_TextureScale")) + writer.WriteProperty("_Splat1_TextureScale", instance.GetTextureScale("_Splat1_TextureScale")); + if(instance.HasProperty("_Splat0")) + writer.WriteProperty("_Splat0", instance.GetTexture("_Splat0")); + if(instance.HasProperty("_Splat0_TextureOffset")) + writer.WriteProperty("_Splat0_TextureOffset", instance.GetTextureOffset("_Splat0_TextureOffset")); + if(instance.HasProperty("_Splat0_TextureScale")) + writer.WriteProperty("_Splat0_TextureScale", instance.GetTextureScale("_Splat0_TextureScale")); + if(instance.HasProperty("_Normal3")) + writer.WriteProperty("_Normal3", instance.GetTexture("_Normal3")); + if(instance.HasProperty("_Normal3_TextureOffset")) + writer.WriteProperty("_Normal3_TextureOffset", instance.GetTextureOffset("_Normal3_TextureOffset")); + if(instance.HasProperty("_Normal3_TextureScale")) + writer.WriteProperty("_Normal3_TextureScale", instance.GetTextureScale("_Normal3_TextureScale")); + if(instance.HasProperty("_Normal2")) + writer.WriteProperty("_Normal2", instance.GetTexture("_Normal2")); + if(instance.HasProperty("_Normal2_TextureOffset")) + writer.WriteProperty("_Normal2_TextureOffset", instance.GetTextureOffset("_Normal2_TextureOffset")); + if(instance.HasProperty("_Normal2_TextureScale")) + writer.WriteProperty("_Normal2_TextureScale", instance.GetTextureScale("_Normal2_TextureScale")); + if(instance.HasProperty("_Normal1")) + writer.WriteProperty("_Normal1", instance.GetTexture("_Normal1")); + if(instance.HasProperty("_Normal1_TextureOffset")) + writer.WriteProperty("_Normal1_TextureOffset", instance.GetTextureOffset("_Normal1_TextureOffset")); + if(instance.HasProperty("_Normal1_TextureScale")) + writer.WriteProperty("_Normal1_TextureScale", instance.GetTextureScale("_Normal1_TextureScale")); + if(instance.HasProperty("_Normal0")) + writer.WriteProperty("_Normal0", instance.GetTexture("_Normal0")); + if(instance.HasProperty("_Normal0_TextureOffset")) + writer.WriteProperty("_Normal0_TextureOffset", instance.GetTextureOffset("_Normal0_TextureOffset")); + if(instance.HasProperty("_Normal0_TextureScale")) + writer.WriteProperty("_Normal0_TextureScale", instance.GetTextureScale("_Normal0_TextureScale")); + if(instance.HasProperty("_Cutoff")) + writer.WriteProperty("_Cutoff", instance.GetFloat("_Cutoff")); + if(instance.HasProperty("_BaseLight")) + writer.WriteProperty("_BaseLight", instance.GetFloat("_BaseLight")); + if(instance.HasProperty("_AO")) + writer.WriteProperty("_AO", instance.GetFloat("_AO")); + if(instance.HasProperty("_Occlusion")) + writer.WriteProperty("_Occlusion", instance.GetFloat("_Occlusion")); + if(instance.HasProperty("_TreeInstanceColor")) + writer.WriteProperty("_TreeInstanceColor", instance.GetVector("_TreeInstanceColor")); + if(instance.HasProperty("_TreeInstanceScale")) + writer.WriteProperty("_TreeInstanceScale", instance.GetVector("_TreeInstanceScale")); + if(instance.HasProperty("_SquashAmount")) + writer.WriteProperty("_SquashAmount", instance.GetFloat("_SquashAmount")); + if(instance.HasProperty("_TranslucencyColor")) + writer.WriteProperty("_TranslucencyColor", instance.GetColor("_TranslucencyColor")); + if(instance.HasProperty("_TranslucencyViewDependency")) + writer.WriteProperty("_TranslucencyViewDependency", instance.GetFloat("_TranslucencyViewDependency")); + if(instance.HasProperty("_ShadowStrength")) + writer.WriteProperty("_ShadowStrength", instance.GetFloat("_ShadowStrength")); + if(instance.HasProperty("_ShadowOffsetScale")) + writer.WriteProperty("_ShadowOffsetScale", instance.GetFloat("_ShadowOffsetScale")); + if(instance.HasProperty("_ShadowTex")) + writer.WriteProperty("_ShadowTex", instance.GetTexture("_ShadowTex")); + if(instance.HasProperty("_ShadowTex_TextureOffset")) + writer.WriteProperty("_ShadowTex_TextureOffset", instance.GetTextureOffset("_ShadowTex_TextureOffset")); + if(instance.HasProperty("_ShadowTex_TextureScale")) + writer.WriteProperty("_ShadowTex_TextureScale", instance.GetTextureScale("_ShadowTex_TextureScale")); + if(instance.HasProperty("_BumpSpecMap")) + writer.WriteProperty("_BumpSpecMap", instance.GetTexture("_BumpSpecMap")); + if(instance.HasProperty("_BumpSpecMap_TextureOffset")) + writer.WriteProperty("_BumpSpecMap_TextureOffset", instance.GetTextureOffset("_BumpSpecMap_TextureOffset")); + if(instance.HasProperty("_BumpSpecMap_TextureScale")) + writer.WriteProperty("_BumpSpecMap_TextureScale", instance.GetTextureScale("_BumpSpecMap_TextureScale")); + if(instance.HasProperty("_TranslucencyMap")) + writer.WriteProperty("_TranslucencyMap", instance.GetTexture("_TranslucencyMap")); + if(instance.HasProperty("_TranslucencyMap_TextureOffset")) + writer.WriteProperty("_TranslucencyMap_TextureOffset", instance.GetTextureOffset("_TranslucencyMap_TextureOffset")); + if(instance.HasProperty("_TranslucencyMap_TextureScale")) + writer.WriteProperty("_TranslucencyMap_TextureScale", instance.GetTextureScale("_TranslucencyMap_TextureScale")); + if(instance.HasProperty("_LightMap")) + writer.WriteProperty("_LightMap", instance.GetTexture("_LightMap")); + if(instance.HasProperty("_LightMap_TextureOffset")) + writer.WriteProperty("_LightMap_TextureOffset", instance.GetTextureOffset("_LightMap_TextureOffset")); + if(instance.HasProperty("_LightMap_TextureScale")) + writer.WriteProperty("_LightMap_TextureScale", instance.GetTextureScale("_LightMap_TextureScale")); + if(instance.HasProperty("_DetailTex")) + writer.WriteProperty("_DetailTex", instance.GetTexture("_DetailTex")); + if(instance.HasProperty("_DetailTex_TextureOffset")) + writer.WriteProperty("_DetailTex_TextureOffset", instance.GetTextureOffset("_DetailTex_TextureOffset")); + if(instance.HasProperty("_DetailTex_TextureScale")) + writer.WriteProperty("_DetailTex_TextureScale", instance.GetTextureScale("_DetailTex_TextureScale")); + if(instance.HasProperty("_DetailBump")) + writer.WriteProperty("_DetailBump", instance.GetTexture("_DetailBump")); + if(instance.HasProperty("_DetailBump_TextureOffset")) + writer.WriteProperty("_DetailBump_TextureOffset", instance.GetTextureOffset("_DetailBump_TextureOffset")); + if(instance.HasProperty("_DetailBump_TextureScale")) + writer.WriteProperty("_DetailBump_TextureScale", instance.GetTextureScale("_DetailBump_TextureScale")); + if(instance.HasProperty("_Strength")) + writer.WriteProperty("_Strength", instance.GetFloat("_Strength")); + if(instance.HasProperty("_InvFade")) + writer.WriteProperty("_InvFade", instance.GetFloat("_InvFade")); + if(instance.HasProperty("_EmisColor")) + writer.WriteProperty("_EmisColor", instance.GetColor("_EmisColor")); + if(instance.HasProperty("_Parallax")) + writer.WriteProperty("_Parallax", instance.GetFloat("_Parallax")); + if(instance.HasProperty("_ParallaxMap")) + writer.WriteProperty("_ParallaxMap", instance.GetTexture("_ParallaxMap")); + if(instance.HasProperty("_ParallaxMap_TextureOffset")) + writer.WriteProperty("_ParallaxMap_TextureOffset", instance.GetTextureOffset("_ParallaxMap_TextureOffset")); + if(instance.HasProperty("_ParallaxMap_TextureScale")) + writer.WriteProperty("_ParallaxMap_TextureScale", instance.GetTextureScale("_ParallaxMap_TextureScale")); + if(instance.HasProperty("_DecalTex")) + writer.WriteProperty("_DecalTex", instance.GetTexture("_DecalTex")); + if(instance.HasProperty("_DecalTex_TextureOffset")) + writer.WriteProperty("_DecalTex_TextureOffset", instance.GetTextureOffset("_DecalTex_TextureOffset")); + if(instance.HasProperty("_DecalTex_TextureScale")) + writer.WriteProperty("_DecalTex_TextureScale", instance.GetTextureScale("_DecalTex_TextureScale")); + if(instance.HasProperty("_GlossMap")) + writer.WriteProperty("_GlossMap", instance.GetTexture("_GlossMap")); + if(instance.HasProperty("_GlossMap_TextureOffset")) + writer.WriteProperty("_GlossMap_TextureOffset", instance.GetTextureOffset("_GlossMap_TextureOffset")); + if(instance.HasProperty("_GlossMap_TextureScale")) + writer.WriteProperty("_GlossMap_TextureScale", instance.GetTextureScale("_GlossMap_TextureScale")); + if(instance.HasProperty("_ShadowOffset")) + writer.WriteProperty("_ShadowOffset", instance.GetTexture("_ShadowOffset")); + if(instance.HasProperty("_ShadowOffset_TextureOffset")) + writer.WriteProperty("_ShadowOffset_TextureOffset", instance.GetTextureOffset("_ShadowOffset_TextureOffset")); + if(instance.HasProperty("_ShadowOffset_TextureScale")) + writer.WriteProperty("_ShadowOffset_TextureScale", instance.GetTextureScale("_ShadowOffset_TextureScale")); + if(instance.HasProperty("_SunDisk")) + writer.WriteProperty("_SunDisk", instance.GetFloat("_SunDisk")); + if(instance.HasProperty("_SunSize")) + writer.WriteProperty("_SunSize", instance.GetFloat("_SunSize")); + if(instance.HasProperty("_AtmosphereThickness")) + writer.WriteProperty("_AtmosphereThickness", instance.GetFloat("_AtmosphereThickness")); + if(instance.HasProperty("_SkyTint")) + writer.WriteProperty("_SkyTint", instance.GetColor("_SkyTint")); + if(instance.HasProperty("_GroundColor")) + writer.WriteProperty("_GroundColor", instance.GetColor("_GroundColor")); + if(instance.HasProperty("_WireThickness")) + writer.WriteProperty("_WireThickness", instance.GetFloat("_WireThickness")); + if(instance.HasProperty("_ZWrite")) + writer.WriteProperty("_ZWrite", instance.GetFloat("_ZWrite")); + if(instance.HasProperty("_ZTest")) + writer.WriteProperty("_ZTest", instance.GetFloat("_ZTest")); + if(instance.HasProperty("_Cull")) + writer.WriteProperty("_Cull", instance.GetFloat("_Cull")); + if(instance.HasProperty("_ZBias")) + writer.WriteProperty("_ZBias", instance.GetFloat("_ZBias")); + if(instance.HasProperty("_HueVariation")) + writer.WriteProperty("_HueVariation", instance.GetColor("_HueVariation")); + if(instance.HasProperty("_WindQuality")) + writer.WriteProperty("_WindQuality", instance.GetFloat("_WindQuality")); + if(instance.HasProperty("_DetailMask")) + writer.WriteProperty("_DetailMask", instance.GetTexture("_DetailMask")); + if(instance.HasProperty("_DetailMask_TextureOffset")) + writer.WriteProperty("_DetailMask_TextureOffset", instance.GetTextureOffset("_DetailMask_TextureOffset")); + if(instance.HasProperty("_DetailMask_TextureScale")) + writer.WriteProperty("_DetailMask_TextureScale", instance.GetTextureScale("_DetailMask_TextureScale")); + if(instance.HasProperty("_MetallicTex")) + writer.WriteProperty("_MetallicTex", instance.GetTexture("_MetallicTex")); + if(instance.HasProperty("_MetallicTex_TextureOffset")) + writer.WriteProperty("_MetallicTex_TextureOffset", instance.GetTextureOffset("_MetallicTex_TextureOffset")); + if(instance.HasProperty("_MetallicTex_TextureScale")) + writer.WriteProperty("_MetallicTex_TextureScale", instance.GetTextureScale("_MetallicTex_TextureScale")); + if(instance.HasProperty("_Glossiness")) + writer.WriteProperty("_Glossiness", instance.GetFloat("_Glossiness")); + if(instance.HasProperty("_GlossMapScale")) + writer.WriteProperty("_GlossMapScale", instance.GetFloat("_GlossMapScale")); + if(instance.HasProperty("_SmoothnessTextureChannel")) + writer.WriteProperty("_SmoothnessTextureChannel", instance.GetFloat("_SmoothnessTextureChannel")); + if(instance.HasProperty("_Metallic")) + writer.WriteProperty("_Metallic", instance.GetFloat("_Metallic")); + if(instance.HasProperty("_MetallicGlossMap")) + writer.WriteProperty("_MetallicGlossMap", instance.GetTexture("_MetallicGlossMap")); + if(instance.HasProperty("_MetallicGlossMap_TextureOffset")) + writer.WriteProperty("_MetallicGlossMap_TextureOffset", instance.GetTextureOffset("_MetallicGlossMap_TextureOffset")); + if(instance.HasProperty("_MetallicGlossMap_TextureScale")) + writer.WriteProperty("_MetallicGlossMap_TextureScale", instance.GetTextureScale("_MetallicGlossMap_TextureScale")); + if(instance.HasProperty("_SpecularHighlights")) + writer.WriteProperty("_SpecularHighlights", instance.GetFloat("_SpecularHighlights")); + if(instance.HasProperty("_GlossyReflections")) + writer.WriteProperty("_GlossyReflections", instance.GetFloat("_GlossyReflections")); + if(instance.HasProperty("_BumpScale")) + writer.WriteProperty("_BumpScale", instance.GetFloat("_BumpScale")); + if(instance.HasProperty("_OcclusionStrength")) + writer.WriteProperty("_OcclusionStrength", instance.GetFloat("_OcclusionStrength")); + if(instance.HasProperty("_OcclusionMap")) + writer.WriteProperty("_OcclusionMap", instance.GetTexture("_OcclusionMap")); + if(instance.HasProperty("_OcclusionMap_TextureOffset")) + writer.WriteProperty("_OcclusionMap_TextureOffset", instance.GetTextureOffset("_OcclusionMap_TextureOffset")); + if(instance.HasProperty("_OcclusionMap_TextureScale")) + writer.WriteProperty("_OcclusionMap_TextureScale", instance.GetTextureScale("_OcclusionMap_TextureScale")); + if(instance.HasProperty("_EmissionColor")) + writer.WriteProperty("_EmissionColor", instance.GetColor("_EmissionColor")); + if(instance.HasProperty("_EmissionMap")) + writer.WriteProperty("_EmissionMap", instance.GetTexture("_EmissionMap")); + if(instance.HasProperty("_EmissionMap_TextureOffset")) + writer.WriteProperty("_EmissionMap_TextureOffset", instance.GetTextureOffset("_EmissionMap_TextureOffset")); + if(instance.HasProperty("_EmissionMap_TextureScale")) + writer.WriteProperty("_EmissionMap_TextureScale", instance.GetTextureScale("_EmissionMap_TextureScale")); + if(instance.HasProperty("_DetailAlbedoMap")) + writer.WriteProperty("_DetailAlbedoMap", instance.GetTexture("_DetailAlbedoMap")); + if(instance.HasProperty("_DetailAlbedoMap_TextureOffset")) + writer.WriteProperty("_DetailAlbedoMap_TextureOffset", instance.GetTextureOffset("_DetailAlbedoMap_TextureOffset")); + if(instance.HasProperty("_DetailAlbedoMap_TextureScale")) + writer.WriteProperty("_DetailAlbedoMap_TextureScale", instance.GetTextureScale("_DetailAlbedoMap_TextureScale")); + if(instance.HasProperty("_DetailNormalMapScale")) + writer.WriteProperty("_DetailNormalMapScale", instance.GetFloat("_DetailNormalMapScale")); + if(instance.HasProperty("_DetailNormalMap")) + writer.WriteProperty("_DetailNormalMap", instance.GetTexture("_DetailNormalMap")); + if(instance.HasProperty("_DetailNormalMap_TextureOffset")) + writer.WriteProperty("_DetailNormalMap_TextureOffset", instance.GetTextureOffset("_DetailNormalMap_TextureOffset")); + if(instance.HasProperty("_DetailNormalMap_TextureScale")) + writer.WriteProperty("_DetailNormalMap_TextureScale", instance.GetTextureScale("_DetailNormalMap_TextureScale")); + if(instance.HasProperty("_UVSec")) + writer.WriteProperty("_UVSec", instance.GetFloat("_UVSec")); + if(instance.HasProperty("_Mode")) + writer.WriteProperty("_Mode", instance.GetFloat("_Mode")); + if(instance.HasProperty("_TintColor")) + writer.WriteProperty("_TintColor", instance.GetColor("_TintColor")); + if(instance.HasProperty("_WavingTint")) + writer.WriteProperty("_WavingTint", instance.GetColor("_WavingTint")); + if(instance.HasProperty("_WaveAndDistance")) + writer.WriteProperty("_WaveAndDistance", instance.GetVector("_WaveAndDistance")); + if(instance.HasProperty("_LightTexture0")) + writer.WriteProperty("_LightTexture0", instance.GetTexture("_LightTexture0")); + if(instance.HasProperty("_LightTexture0_TextureOffset")) + writer.WriteProperty("_LightTexture0_TextureOffset", instance.GetTextureOffset("_LightTexture0_TextureOffset")); + if(instance.HasProperty("_LightTexture0_TextureScale")) + writer.WriteProperty("_LightTexture0_TextureScale", instance.GetTextureScale("_LightTexture0_TextureScale")); + if(instance.HasProperty("_LightTextureB0")) + writer.WriteProperty("_LightTextureB0", instance.GetTexture("_LightTextureB0")); + if(instance.HasProperty("_LightTextureB0_TextureOffset")) + writer.WriteProperty("_LightTextureB0_TextureOffset", instance.GetTextureOffset("_LightTextureB0_TextureOffset")); + if(instance.HasProperty("_LightTextureB0_TextureScale")) + writer.WriteProperty("_LightTextureB0_TextureScale", instance.GetTextureScale("_LightTextureB0_TextureScale")); + if(instance.HasProperty("_ShadowMapTexture")) + writer.WriteProperty("_ShadowMapTexture", instance.GetTexture("_ShadowMapTexture")); + if(instance.HasProperty("_ShadowMapTexture_TextureOffset")) + writer.WriteProperty("_ShadowMapTexture_TextureOffset", instance.GetTextureOffset("_ShadowMapTexture_TextureOffset")); + if(instance.HasProperty("_ShadowMapTexture_TextureScale")) + writer.WriteProperty("_ShadowMapTexture_TextureScale", instance.GetTextureScale("_ShadowMapTexture_TextureScale")); + if(instance.HasProperty("_SecondTex")) + writer.WriteProperty("_SecondTex", instance.GetTexture("_SecondTex")); + if(instance.HasProperty("_SecondTex_TextureOffset")) + writer.WriteProperty("_SecondTex_TextureOffset", instance.GetTextureOffset("_SecondTex_TextureOffset")); + if(instance.HasProperty("_SecondTex_TextureScale")) + writer.WriteProperty("_SecondTex_TextureScale", instance.GetTextureScale("_SecondTex_TextureScale")); + if(instance.HasProperty("_ThirdTex")) + writer.WriteProperty("_ThirdTex", instance.GetTexture("_ThirdTex")); + if(instance.HasProperty("_ThirdTex_TextureOffset")) + writer.WriteProperty("_ThirdTex_TextureOffset", instance.GetTextureOffset("_ThirdTex_TextureOffset")); + if(instance.HasProperty("_ThirdTex_TextureScale")) + writer.WriteProperty("_ThirdTex_TextureScale", instance.GetTextureScale("_ThirdTex_TextureScale")); + if(instance.HasProperty("PixelSnap")) + writer.WriteProperty("PixelSnap", instance.GetFloat("PixelSnap")); + if(instance.HasProperty("_RendererColor")) + writer.WriteProperty("_RendererColor", instance.GetColor("_RendererColor")); + if(instance.HasProperty("_Flip")) + writer.WriteProperty("_Flip", instance.GetVector("_Flip")); + if(instance.HasProperty("_AlphaTex")) + writer.WriteProperty("_AlphaTex", instance.GetTexture("_AlphaTex")); + if(instance.HasProperty("_AlphaTex_TextureOffset")) + writer.WriteProperty("_AlphaTex_TextureOffset", instance.GetTextureOffset("_AlphaTex_TextureOffset")); + if(instance.HasProperty("_AlphaTex_TextureScale")) + writer.WriteProperty("_AlphaTex_TextureScale", instance.GetTextureScale("_AlphaTex_TextureScale")); + if(instance.HasProperty("_EnableExternalAlpha")) + writer.WriteProperty("_EnableExternalAlpha", instance.GetFloat("_EnableExternalAlpha")); + if(instance.HasProperty("_Level")) + writer.WriteProperty("_Level", instance.GetFloat("_Level")); + if(instance.HasProperty("_SpecGlossMap")) + writer.WriteProperty("_SpecGlossMap", instance.GetTexture("_SpecGlossMap")); + if(instance.HasProperty("_SpecGlossMap_TextureOffset")) + writer.WriteProperty("_SpecGlossMap_TextureOffset", instance.GetTextureOffset("_SpecGlossMap_TextureOffset")); + if(instance.HasProperty("_SpecGlossMap_TextureScale")) + writer.WriteProperty("_SpecGlossMap_TextureScale", instance.GetTextureScale("_SpecGlossMap_TextureScale")); + if(instance.HasProperty("_FrontTex")) + writer.WriteProperty("_FrontTex", instance.GetTexture("_FrontTex")); + if(instance.HasProperty("_FrontTex_TextureOffset")) + writer.WriteProperty("_FrontTex_TextureOffset", instance.GetTextureOffset("_FrontTex_TextureOffset")); + if(instance.HasProperty("_FrontTex_TextureScale")) + writer.WriteProperty("_FrontTex_TextureScale", instance.GetTextureScale("_FrontTex_TextureScale")); + if(instance.HasProperty("_BackTex")) + writer.WriteProperty("_BackTex", instance.GetTexture("_BackTex")); + if(instance.HasProperty("_BackTex_TextureOffset")) + writer.WriteProperty("_BackTex_TextureOffset", instance.GetTextureOffset("_BackTex_TextureOffset")); + if(instance.HasProperty("_BackTex_TextureScale")) + writer.WriteProperty("_BackTex_TextureScale", instance.GetTextureScale("_BackTex_TextureScale")); + if(instance.HasProperty("_LeftTex")) + writer.WriteProperty("_LeftTex", instance.GetTexture("_LeftTex")); + if(instance.HasProperty("_LeftTex_TextureOffset")) + writer.WriteProperty("_LeftTex_TextureOffset", instance.GetTextureOffset("_LeftTex_TextureOffset")); + if(instance.HasProperty("_LeftTex_TextureScale")) + writer.WriteProperty("_LeftTex_TextureScale", instance.GetTextureScale("_LeftTex_TextureScale")); + if(instance.HasProperty("_RightTex")) + writer.WriteProperty("_RightTex", instance.GetTexture("_RightTex")); + if(instance.HasProperty("_RightTex_TextureOffset")) + writer.WriteProperty("_RightTex_TextureOffset", instance.GetTextureOffset("_RightTex_TextureOffset")); + if(instance.HasProperty("_RightTex_TextureScale")) + writer.WriteProperty("_RightTex_TextureScale", instance.GetTextureScale("_RightTex_TextureScale")); + if(instance.HasProperty("_UpTex")) + writer.WriteProperty("_UpTex", instance.GetTexture("_UpTex")); + if(instance.HasProperty("_UpTex_TextureOffset")) + writer.WriteProperty("_UpTex_TextureOffset", instance.GetTextureOffset("_UpTex_TextureOffset")); + if(instance.HasProperty("_UpTex_TextureScale")) + writer.WriteProperty("_UpTex_TextureScale", instance.GetTextureScale("_UpTex_TextureScale")); + if(instance.HasProperty("_DownTex")) + writer.WriteProperty("_DownTex", instance.GetTexture("_DownTex")); + if(instance.HasProperty("_DownTex_TextureOffset")) + writer.WriteProperty("_DownTex_TextureOffset", instance.GetTextureOffset("_DownTex_TextureOffset")); + if(instance.HasProperty("_DownTex_TextureScale")) + writer.WriteProperty("_DownTex_TextureScale", instance.GetTextureScale("_DownTex_TextureScale")); + if(instance.HasProperty("_Metallic0")) + writer.WriteProperty("_Metallic0", instance.GetFloat("_Metallic0")); + if(instance.HasProperty("_Metallic1")) + writer.WriteProperty("_Metallic1", instance.GetFloat("_Metallic1")); + if(instance.HasProperty("_Metallic2")) + writer.WriteProperty("_Metallic2", instance.GetFloat("_Metallic2")); + if(instance.HasProperty("_Metallic3")) + writer.WriteProperty("_Metallic3", instance.GetFloat("_Metallic3")); + if(instance.HasProperty("_Smoothness0")) + writer.WriteProperty("_Smoothness0", instance.GetFloat("_Smoothness0")); + if(instance.HasProperty("_Smoothness1")) + writer.WriteProperty("_Smoothness1", instance.GetFloat("_Smoothness1")); + if(instance.HasProperty("_Smoothness2")) + writer.WriteProperty("_Smoothness2", instance.GetFloat("_Smoothness2")); + if(instance.HasProperty("_Smoothness3")) + writer.WriteProperty("_Smoothness3", instance.GetFloat("_Smoothness3")); + if(instance.HasProperty("_TexA")) + writer.WriteProperty("_TexA", instance.GetTexture("_TexA")); + if(instance.HasProperty("_TexA_TextureOffset")) + writer.WriteProperty("_TexA_TextureOffset", instance.GetTextureOffset("_TexA_TextureOffset")); + if(instance.HasProperty("_TexA_TextureScale")) + writer.WriteProperty("_TexA_TextureScale", instance.GetTextureScale("_TexA_TextureScale")); + if(instance.HasProperty("_TexB")) + writer.WriteProperty("_TexB", instance.GetTexture("_TexB")); + if(instance.HasProperty("_TexB_TextureOffset")) + writer.WriteProperty("_TexB_TextureOffset", instance.GetTextureOffset("_TexB_TextureOffset")); + if(instance.HasProperty("_TexB_TextureScale")) + writer.WriteProperty("_TexB_TextureScale", instance.GetTextureScale("_TexB_TextureScale")); + if(instance.HasProperty("_value")) + writer.WriteProperty("_value", instance.GetFloat("_value")); + if(instance.HasProperty("_Texel")) + writer.WriteProperty("_Texel", instance.GetFloat("_Texel")); + if(instance.HasProperty("_Detail")) + writer.WriteProperty("_Detail", instance.GetTexture("_Detail")); + if(instance.HasProperty("_Detail_TextureOffset")) + writer.WriteProperty("_Detail_TextureOffset", instance.GetTextureOffset("_Detail_TextureOffset")); + if(instance.HasProperty("_Detail_TextureScale")) + writer.WriteProperty("_Detail_TextureScale", instance.GetTextureScale("_Detail_TextureScale")); + if(instance.HasProperty("_HalfOverCutoff")) + writer.WriteProperty("_HalfOverCutoff", instance.GetFloat("_HalfOverCutoff")); + #endif + } + } + + protected override object ReadUnityObject(ES3Reader reader) + { + var obj = new Material(Shader.Find("Diffuse")); + ReadUnityObject(reader, obj); + return obj; + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Material)obj; + +#if UNITY_2019_3_OR_NEWER + + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + case "name": + instance.name = reader.Read(ES3Type_string.Instance); + break; + case "shader": + instance.shader = reader.Read(ES3Type_Shader.Instance); + break; + case "renderQueue": + instance.renderQueue = reader.Read(ES3Type_int.Instance); + break; + case "shaderKeywords": + var keywords = reader.Read(); + foreach (var keyword in keywords) + instance.EnableKeyword(keyword); + break; + case "globalIlluminationFlags": + instance.globalIlluminationFlags = reader.Read(); + break; + case "_MainTex_Scale": + instance.SetTextureScale("_MainTex", reader.Read()); + break; + default: + var propertyIndex = -1; + if (instance.shader != null && instance.HasProperty(propertyName) && (propertyIndex = instance.shader.FindPropertyIndex(propertyName)) != -1) + { + var propertyType = instance.shader.GetPropertyType(propertyIndex); + + switch (propertyType) + { + case UnityEngine.Rendering.ShaderPropertyType.Color: + instance.SetColor(propertyName, reader.Read()); + break; + case UnityEngine.Rendering.ShaderPropertyType.Float: + case UnityEngine.Rendering.ShaderPropertyType.Range: + instance.SetFloat(propertyName, reader.Read()); + break; + case UnityEngine.Rendering.ShaderPropertyType.Texture: + instance.SetTexture(propertyName, reader.Read()); + break; + case UnityEngine.Rendering.ShaderPropertyType.Vector: + instance.SetColor(propertyName, reader.Read()); + break; + } + } + else if (propertyName.EndsWith("_TextureScale")) + instance.SetTextureScale(propertyName.Split(new string[] { "_TextureScale" }, StringSplitOptions.None)[0], reader.Read()); + else if (propertyName.EndsWith("_TextureOffset")) + instance.SetTextureOffset(propertyName.Split(new string[] { "_TextureOffset" }, StringSplitOptions.None)[0], reader.Read()); + + reader.Skip(); + break; + } + } +#else + + foreach (string propertyName in reader.Properties) + { + switch(propertyName) + { + case "name": + instance.name = reader.Read(ES3Type_string.Instance); + break; + case "shader": + instance.shader = reader.Read(ES3Type_Shader.Instance); + break; + case "renderQueue": + instance.renderQueue = reader.Read(ES3Type_int.Instance); + break; + case "shaderKeywords": + instance.shaderKeywords = reader.Read(); + break; + case "globalIlluminationFlags": + instance.globalIlluminationFlags = reader.Read(); + break; + case "_Color": + instance.SetColor("_Color", reader.Read()); + break; + case "_SpecColor": + instance.SetColor("_SpecColor", reader.Read()); + break; + case "_Shininess": + instance.SetFloat("_Shininess", reader.Read()); + break; + case "_MainTex": + instance.SetTexture("_MainTex", reader.Read()); + break; + case "_MainTex_TextureOffset": + instance.SetTextureOffset("_MainTex_TextureOffset", reader.Read()); + break; + case "_MainTex_TextureScale": + instance.SetTextureScale("_MainTex_TextureScale", reader.Read()); + break; + case "_Illum": + instance.SetTexture("_Illum", reader.Read()); + break; + case "_Illum_TextureOffset": + instance.SetTextureOffset("_Illum_TextureOffset", reader.Read()); + break; + case "_Illum_TextureScale": + instance.SetTextureScale("_Illum_TextureScale", reader.Read()); + break; + case "_BumpMap": + instance.SetTexture("_BumpMap", reader.Read()); + break; + case "_BumpMap_TextureOffset": + instance.SetTextureOffset("_BumpMap_TextureOffset", reader.Read()); + break; + case "_BumpMap_TextureScale": + instance.SetTextureScale("_BumpMap_TextureScale", reader.Read()); + break; + case "_Emission": + instance.SetFloat("_Emission", reader.Read()); + break; + case "_Specular": + instance.SetColor("_Specular", reader.Read()); + break; + case "_MainBump": + instance.SetTexture("_MainBump", reader.Read()); + break; + case "_MainBump_TextureOffset": + instance.SetTextureOffset("_MainBump_TextureOffset", reader.Read()); + break; + case "_MainBump_TextureScale": + instance.SetTextureScale("_MainBump_TextureScale", reader.Read()); + break; + case "_Mask": + instance.SetTexture("_Mask", reader.Read()); + break; + case "_Mask_TextureOffset": + instance.SetTextureOffset("_Mask_TextureOffset", reader.Read()); + break; + case "_Mask_TextureScale": + instance.SetTextureScale("_Mask_TextureScale", reader.Read()); + break; + case "_Focus": + instance.SetFloat("_Focus", reader.Read()); + break; + case "_StencilComp": + instance.SetFloat("_StencilComp", reader.Read()); + break; + case "_Stencil": + instance.SetFloat("_Stencil", reader.Read()); + break; + case "_StencilOp": + instance.SetFloat("_StencilOp", reader.Read()); + break; + case "_StencilWriteMask": + instance.SetFloat("_StencilWriteMask", reader.Read()); + break; + case "_StencilReadMask": + instance.SetFloat("_StencilReadMask", reader.Read()); + break; + case "_ColorMask": + instance.SetFloat("_ColorMask", reader.Read()); + break; + case "_UseUIAlphaClip": + instance.SetFloat("_UseUIAlphaClip", reader.Read()); + break; + case "_SrcBlend": + instance.SetFloat("_SrcBlend", reader.Read()); + break; + case "_DstBlend": + instance.SetFloat("_DstBlend", reader.Read()); + break; + case "_ReflectColor": + instance.SetColor("_ReflectColor", reader.Read()); + break; + case "_Cube": + instance.SetTexture("_Cube", reader.Read()); + break; + case "_Cube_TextureOffset": + instance.SetTextureOffset("_Cube_TextureOffset", reader.Read()); + break; + case "_Cube_TextureScale": + instance.SetTextureScale("_Cube_TextureScale", reader.Read()); + break; + case "_Tint": + instance.SetColor("_Tint", reader.Read()); + break; + case "_Exposure": + instance.SetFloat("_Exposure", reader.Read()); + break; + case "_Rotation": + instance.SetFloat("_Rotation", reader.Read()); + break; + case "_Tex": + instance.SetTexture("_Tex", reader.Read()); + break; + case "_Tex_TextureOffset": + instance.SetTextureOffset("_Tex_TextureOffset", reader.Read()); + break; + case "_Tex_TextureScale": + instance.SetTextureScale("_Tex_TextureScale", reader.Read()); + break; + case "_MainTex_Scale": + instance.SetTextureScale("_MainTex", reader.Read()); + break; + case "_Control": + instance.SetTexture("_Control", reader.Read()); + break; + case "_Control_TextureOffset": + instance.SetTextureOffset("_Control_TextureOffset", reader.Read()); + break; + case "_Control_TextureScale": + instance.SetTextureScale("_Control_TextureScale", reader.Read()); + break; + case "_Splat3": + instance.SetTexture("_Splat3", reader.Read()); + break; + case "_Splat3_TextureOffset": + instance.SetTextureOffset("_Splat3_TextureOffset", reader.Read()); + break; + case "_Splat3_TextureScale": + instance.SetTextureScale("_Splat3_TextureScale", reader.Read()); + break; + case "_Splat2": + instance.SetTexture("_Splat2", reader.Read()); + break; + case "_Splat2_TextureOffset": + instance.SetTextureOffset("_Splat2_TextureOffset", reader.Read()); + break; + case "_Splat2_TextureScale": + instance.SetTextureScale("_Splat2_TextureScale", reader.Read()); + break; + case "_Splat1": + instance.SetTexture("_Splat1", reader.Read()); + break; + case "_Splat1_TextureOffset": + instance.SetTextureOffset("_Splat1_TextureOffset", reader.Read()); + break; + case "_Splat1_TextureScale": + instance.SetTextureScale("_Splat1_TextureScale", reader.Read()); + break; + case "_Splat0": + instance.SetTexture("_Splat0", reader.Read()); + break; + case "_Splat0_TextureOffset": + instance.SetTextureOffset("_Splat0_TextureOffset", reader.Read()); + break; + case "_Splat0_TextureScale": + instance.SetTextureScale("_Splat0_TextureScale", reader.Read()); + break; + case "_Normal3": + instance.SetTexture("_Normal3", reader.Read()); + break; + case "_Normal3_TextureOffset": + instance.SetTextureOffset("_Normal3_TextureOffset", reader.Read()); + break; + case "_Normal3_TextureScale": + instance.SetTextureScale("_Normal3_TextureScale", reader.Read()); + break; + case "_Normal2": + instance.SetTexture("_Normal2", reader.Read()); + break; + case "_Normal2_TextureOffset": + instance.SetTextureOffset("_Normal2_TextureOffset", reader.Read()); + break; + case "_Normal2_TextureScale": + instance.SetTextureScale("_Normal2_TextureScale", reader.Read()); + break; + case "_Normal1": + instance.SetTexture("_Normal1", reader.Read()); + break; + case "_Normal1_TextureOffset": + instance.SetTextureOffset("_Normal1_TextureOffset", reader.Read()); + break; + case "_Normal1_TextureScale": + instance.SetTextureScale("_Normal1_TextureScale", reader.Read()); + break; + case "_Normal0": + instance.SetTexture("_Normal0", reader.Read()); + break; + case "_Normal0_TextureOffset": + instance.SetTextureOffset("_Normal0_TextureOffset", reader.Read()); + break; + case "_Normal0_TextureScale": + instance.SetTextureScale("_Normal0_TextureScale", reader.Read()); + break; + case "_Cutoff": + instance.SetFloat("_Cutoff", reader.Read()); + break; + case "_BaseLight": + instance.SetFloat("_BaseLight", reader.Read()); + break; + case "_AO": + instance.SetFloat("_AO", reader.Read()); + break; + case "_Occlusion": + instance.SetFloat("_Occlusion", reader.Read()); + break; + case "_TreeInstanceColor": + instance.SetVector("_TreeInstanceColor", reader.Read()); + break; + case "_TreeInstanceScale": + instance.SetVector("_TreeInstanceScale", reader.Read()); + break; + case "_SquashAmount": + instance.SetFloat("_SquashAmount", reader.Read()); + break; + case "_TranslucencyColor": + instance.SetColor("_TranslucencyColor", reader.Read()); + break; + case "_TranslucencyViewDependency": + instance.SetFloat("_TranslucencyViewDependency", reader.Read()); + break; + case "_ShadowStrength": + instance.SetFloat("_ShadowStrength", reader.Read()); + break; + case "_ShadowOffsetScale": + instance.SetFloat("_ShadowOffsetScale", reader.Read()); + break; + case "_ShadowTex": + instance.SetTexture("_ShadowTex", reader.Read()); + break; + case "_ShadowTex_TextureOffset": + instance.SetTextureOffset("_ShadowTex_TextureOffset", reader.Read()); + break; + case "_ShadowTex_TextureScale": + instance.SetTextureScale("_ShadowTex_TextureScale", reader.Read()); + break; + case "_BumpSpecMap": + instance.SetTexture("_BumpSpecMap", reader.Read()); + break; + case "_BumpSpecMap_TextureOffset": + instance.SetTextureOffset("_BumpSpecMap_TextureOffset", reader.Read()); + break; + case "_BumpSpecMap_TextureScale": + instance.SetTextureScale("_BumpSpecMap_TextureScale", reader.Read()); + break; + case "_TranslucencyMap": + instance.SetTexture("_TranslucencyMap", reader.Read()); + break; + case "_TranslucencyMap_TextureOffset": + instance.SetTextureOffset("_TranslucencyMap_TextureOffset", reader.Read()); + break; + case "_TranslucencyMap_TextureScale": + instance.SetTextureScale("_TranslucencyMap_TextureScale", reader.Read()); + break; + case "_LightMap": + instance.SetTexture("_LightMap", reader.Read()); + break; + case "_LightMap_TextureOffset": + instance.SetTextureOffset("_LightMap_TextureOffset", reader.Read()); + break; + case "_LightMap_TextureScale": + instance.SetTextureScale("_LightMap_TextureScale", reader.Read()); + break; + case "_DetailTex": + instance.SetTexture("_DetailTex", reader.Read()); + break; + case "_DetailTex_TextureOffset": + instance.SetTextureOffset("_DetailTex_TextureOffset", reader.Read()); + break; + case "_DetailTex_TextureScale": + instance.SetTextureScale("_DetailTex_TextureScale", reader.Read()); + break; + case "_DetailBump": + instance.SetTexture("_DetailBump", reader.Read()); + break; + case "_DetailBump_TextureOffset": + instance.SetTextureOffset("_DetailBump_TextureOffset", reader.Read()); + break; + case "_DetailBump_TextureScale": + instance.SetTextureScale("_DetailBump_TextureScale", reader.Read()); + break; + case "_Strength": + instance.SetFloat("_Strength", reader.Read()); + break; + case "_InvFade": + instance.SetFloat("_InvFade", reader.Read()); + break; + case "_EmisColor": + instance.SetColor("_EmisColor", reader.Read()); + break; + case "_Parallax": + instance.SetFloat("_Parallax", reader.Read()); + break; + case "_ParallaxMap": + instance.SetTexture("_ParallaxMap", reader.Read()); + break; + case "_ParallaxMap_TextureOffset": + instance.SetTextureOffset("_ParallaxMap_TextureOffset", reader.Read()); + break; + case "_ParallaxMap_TextureScale": + instance.SetTextureScale("_ParallaxMap_TextureScale", reader.Read()); + break; + case "_DecalTex": + instance.SetTexture("_DecalTex", reader.Read()); + break; + case "_DecalTex_TextureOffset": + instance.SetTextureOffset("_DecalTex_TextureOffset", reader.Read()); + break; + case "_DecalTex_TextureScale": + instance.SetTextureScale("_DecalTex_TextureScale", reader.Read()); + break; + case "_GlossMap": + instance.SetTexture("_GlossMap", reader.Read()); + break; + case "_GlossMap_TextureOffset": + instance.SetTextureOffset("_GlossMap_TextureOffset", reader.Read()); + break; + case "_GlossMap_TextureScale": + instance.SetTextureScale("_GlossMap_TextureScale", reader.Read()); + break; + case "_ShadowOffset": + instance.SetTexture("_ShadowOffset", reader.Read()); + break; + case "_ShadowOffset_TextureOffset": + instance.SetTextureOffset("_ShadowOffset_TextureOffset", reader.Read()); + break; + case "_ShadowOffset_TextureScale": + instance.SetTextureScale("_ShadowOffset_TextureScale", reader.Read()); + break; + case "_SunDisk": + instance.SetFloat("_SunDisk", reader.Read()); + break; + case "_SunSize": + instance.SetFloat("_SunSize", reader.Read()); + break; + case "_AtmosphereThickness": + instance.SetFloat("_AtmosphereThickness", reader.Read()); + break; + case "_SkyTint": + instance.SetColor("_SkyTint", reader.Read()); + break; + case "_GroundColor": + instance.SetColor("_GroundColor", reader.Read()); + break; + case "_WireThickness": + instance.SetFloat("_WireThickness", reader.Read()); + break; + case "_ZWrite": + instance.SetFloat("_ZWrite", reader.Read()); + break; + case "_ZTest": + instance.SetFloat("_ZTest", reader.Read()); + break; + case "_Cull": + instance.SetFloat("_Cull", reader.Read()); + break; + case "_ZBias": + instance.SetFloat("_ZBias", reader.Read()); + break; + case "_HueVariation": + instance.SetColor("_HueVariation", reader.Read()); + break; + case "_WindQuality": + instance.SetFloat("_WindQuality", reader.Read()); + break; + case "_DetailMask": + instance.SetTexture("_DetailMask", reader.Read()); + break; + case "_DetailMask_TextureOffset": + instance.SetTextureOffset("_DetailMask_TextureOffset", reader.Read()); + break; + case "_DetailMask_TextureScale": + instance.SetTextureScale("_DetailMask_TextureScale", reader.Read()); + break; + case "_MetallicTex": + instance.SetTexture("_MetallicTex", reader.Read()); + break; + case "_MetallicTex_TextureOffset": + instance.SetTextureOffset("_MetallicTex_TextureOffset", reader.Read()); + break; + case "_MetallicTex_TextureScale": + instance.SetTextureScale("_MetallicTex_TextureScale", reader.Read()); + break; + case "_Glossiness": + instance.SetFloat("_Glossiness", reader.Read()); + break; + case "_GlossMapScale": + instance.SetFloat("_GlossMapScale", reader.Read()); + break; + case "_SmoothnessTextureChannel": + instance.SetFloat("_SmoothnessTextureChannel", reader.Read()); + break; + case "_Metallic": + instance.SetFloat("_Metallic", reader.Read()); + break; + case "_MetallicGlossMap": + instance.SetTexture("_MetallicGlossMap", reader.Read()); + break; + case "_MetallicGlossMap_TextureOffset": + instance.SetTextureOffset("_MetallicGlossMap_TextureOffset", reader.Read()); + break; + case "_MetallicGlossMap_TextureScale": + instance.SetTextureScale("_MetallicGlossMap_TextureScale", reader.Read()); + break; + case "_SpecularHighlights": + instance.SetFloat("_SpecularHighlights", reader.Read()); + break; + case "_GlossyReflections": + instance.SetFloat("_GlossyReflections", reader.Read()); + break; + case "_BumpScale": + instance.SetFloat("_BumpScale", reader.Read()); + break; + case "_OcclusionStrength": + instance.SetFloat("_OcclusionStrength", reader.Read()); + break; + case "_OcclusionMap": + instance.SetTexture("_OcclusionMap", reader.Read()); + break; + case "_OcclusionMap_TextureOffset": + instance.SetTextureOffset("_OcclusionMap_TextureOffset", reader.Read()); + break; + case "_OcclusionMap_TextureScale": + instance.SetTextureScale("_OcclusionMap_TextureScale", reader.Read()); + break; + case "_EmissionColor": + instance.SetColor("_EmissionColor", reader.Read()); + break; + case "_EmissionMap": + instance.SetTexture("_EmissionMap", reader.Read()); + break; + case "_EmissionMap_TextureOffset": + instance.SetTextureOffset("_EmissionMap_TextureOffset", reader.Read()); + break; + case "_EmissionMap_TextureScale": + instance.SetTextureScale("_EmissionMap_TextureScale", reader.Read()); + break; + case "_DetailAlbedoMap": + instance.SetTexture("_DetailAlbedoMap", reader.Read()); + break; + case "_DetailAlbedoMap_TextureOffset": + instance.SetTextureOffset("_DetailAlbedoMap_TextureOffset", reader.Read()); + break; + case "_DetailAlbedoMap_TextureScale": + instance.SetTextureScale("_DetailAlbedoMap_TextureScale", reader.Read()); + break; + case "_DetailNormalMapScale": + instance.SetFloat("_DetailNormalMapScale", reader.Read()); + break; + case "_DetailNormalMap": + instance.SetTexture("_DetailNormalMap", reader.Read()); + break; + case "_DetailNormalMap_TextureOffset": + instance.SetTextureOffset("_DetailNormalMap_TextureOffset", reader.Read()); + break; + case "_DetailNormalMap_TextureScale": + instance.SetTextureScale("_DetailNormalMap_TextureScale", reader.Read()); + break; + case "_UVSec": + instance.SetFloat("_UVSec", reader.Read()); + break; + case "_Mode": + instance.SetFloat("_Mode", reader.Read()); + break; + case "_TintColor": + instance.SetColor("_TintColor", reader.Read()); + break; + case "_WavingTint": + instance.SetColor("_WavingTint", reader.Read()); + break; + case "_WaveAndDistance": + instance.SetVector("_WaveAndDistance", reader.Read()); + break; + case "_LightTexture0": + instance.SetTexture("_LightTexture0", reader.Read()); + break; + case "_LightTexture0_TextureOffset": + instance.SetTextureOffset("_LightTexture0_TextureOffset", reader.Read()); + break; + case "_LightTexture0_TextureScale": + instance.SetTextureScale("_LightTexture0_TextureScale", reader.Read()); + break; + case "_LightTextureB0": + instance.SetTexture("_LightTextureB0", reader.Read()); + break; + case "_LightTextureB0_TextureOffset": + instance.SetTextureOffset("_LightTextureB0_TextureOffset", reader.Read()); + break; + case "_LightTextureB0_TextureScale": + instance.SetTextureScale("_LightTextureB0_TextureScale", reader.Read()); + break; + case "_ShadowMapTexture": + instance.SetTexture("_ShadowMapTexture", reader.Read()); + break; + case "_ShadowMapTexture_TextureOffset": + instance.SetTextureOffset("_ShadowMapTexture_TextureOffset", reader.Read()); + break; + case "_ShadowMapTexture_TextureScale": + instance.SetTextureScale("_ShadowMapTexture_TextureScale", reader.Read()); + break; + case "_SecondTex": + instance.SetTexture("_SecondTex", reader.Read()); + break; + case "_SecondTex_TextureOffset": + instance.SetTextureOffset("_SecondTex_TextureOffset", reader.Read()); + break; + case "_SecondTex_TextureScale": + instance.SetTextureScale("_SecondTex_TextureScale", reader.Read()); + break; + case "_ThirdTex": + instance.SetTexture("_ThirdTex", reader.Read()); + break; + case "_ThirdTex_TextureOffset": + instance.SetTextureOffset("_ThirdTex_TextureOffset", reader.Read()); + break; + case "_ThirdTex_TextureScale": + instance.SetTextureScale("_ThirdTex_TextureScale", reader.Read()); + break; + case "PixelSnap": + instance.SetFloat("PixelSnap", reader.Read()); + break; + case "_RendererColor": + instance.SetColor("_RendererColor", reader.Read()); + break; + case "_Flip": + instance.SetVector("_Flip", reader.Read()); + break; + case "_AlphaTex": + instance.SetTexture("_AlphaTex", reader.Read()); + break; + case "_AlphaTex_TextureOffset": + instance.SetTextureOffset("_AlphaTex_TextureOffset", reader.Read()); + break; + case "_AlphaTex_TextureScale": + instance.SetTextureScale("_AlphaTex_TextureScale", reader.Read()); + break; + case "_EnableExternalAlpha": + instance.SetFloat("_EnableExternalAlpha", reader.Read()); + break; + case "_Level": + instance.SetFloat("_Level", reader.Read()); + break; + case "_SpecGlossMap": + instance.SetTexture("_SpecGlossMap", reader.Read()); + break; + case "_SpecGlossMap_TextureOffset": + instance.SetTextureOffset("_SpecGlossMap_TextureOffset", reader.Read()); + break; + case "_SpecGlossMap_TextureScale": + instance.SetTextureScale("_SpecGlossMap_TextureScale", reader.Read()); + break; + case "_FrontTex": + instance.SetTexture("_FrontTex", reader.Read()); + break; + case "_FrontTex_TextureOffset": + instance.SetTextureOffset("_FrontTex_TextureOffset", reader.Read()); + break; + case "_FrontTex_TextureScale": + instance.SetTextureScale("_FrontTex_TextureScale", reader.Read()); + break; + case "_BackTex": + instance.SetTexture("_BackTex", reader.Read()); + break; + case "_BackTex_TextureOffset": + instance.SetTextureOffset("_BackTex_TextureOffset", reader.Read()); + break; + case "_BackTex_TextureScale": + instance.SetTextureScale("_BackTex_TextureScale", reader.Read()); + break; + case "_LeftTex": + instance.SetTexture("_LeftTex", reader.Read()); + break; + case "_LeftTex_TextureOffset": + instance.SetTextureOffset("_LeftTex_TextureOffset", reader.Read()); + break; + case "_LeftTex_TextureScale": + instance.SetTextureScale("_LeftTex_TextureScale", reader.Read()); + break; + case "_RightTex": + instance.SetTexture("_RightTex", reader.Read()); + break; + case "_RightTex_TextureOffset": + instance.SetTextureOffset("_RightTex_TextureOffset", reader.Read()); + break; + case "_RightTex_TextureScale": + instance.SetTextureScale("_RightTex_TextureScale", reader.Read()); + break; + case "_UpTex": + instance.SetTexture("_UpTex", reader.Read()); + break; + case "_UpTex_TextureOffset": + instance.SetTextureOffset("_UpTex_TextureOffset", reader.Read()); + break; + case "_UpTex_TextureScale": + instance.SetTextureScale("_UpTex_TextureScale", reader.Read()); + break; + case "_DownTex": + instance.SetTexture("_DownTex", reader.Read()); + break; + case "_DownTex_TextureOffset": + instance.SetTextureOffset("_DownTex_TextureOffset", reader.Read()); + break; + case "_DownTex_TextureScale": + instance.SetTextureScale("_DownTex_TextureScale", reader.Read()); + break; + case "_Metallic0": + instance.SetFloat("_Metallic0", reader.Read()); + break; + case "_Metallic1": + instance.SetFloat("_Metallic1", reader.Read()); + break; + case "_Metallic2": + instance.SetFloat("_Metallic2", reader.Read()); + break; + case "_Metallic3": + instance.SetFloat("_Metallic3", reader.Read()); + break; + case "_Smoothness0": + instance.SetFloat("_Smoothness0", reader.Read()); + break; + case "_Smoothness1": + instance.SetFloat("_Smoothness1", reader.Read()); + break; + case "_Smoothness2": + instance.SetFloat("_Smoothness2", reader.Read()); + break; + case "_Smoothness3": + instance.SetFloat("_Smoothness3", reader.Read()); + break; + case "_TexA": + instance.SetTexture("_TexA", reader.Read()); + break; + case "_TexA_TextureOffset": + instance.SetTextureOffset("_TexA_TextureOffset", reader.Read()); + break; + case "_TexA_TextureScale": + instance.SetTextureScale("_TexA_TextureScale", reader.Read()); + break; + case "_TexB": + instance.SetTexture("_TexB", reader.Read()); + break; + case "_TexB_TextureOffset": + instance.SetTextureOffset("_TexB_TextureOffset", reader.Read()); + break; + case "_TexB_TextureScale": + instance.SetTextureScale("_TexB_TextureScale", reader.Read()); + break; + case "_value": + instance.SetFloat("_value", reader.Read()); + break; + case "_Texel": + instance.SetFloat("_Texel", reader.Read()); + break; + case "_Detail": + instance.SetTexture("_Detail", reader.Read()); + break; + case "_Detail_TextureOffset": + instance.SetTextureOffset("_Detail_TextureOffset", reader.Read()); + break; + case "_Detail_TextureScale": + instance.SetTextureScale("_Detail_TextureScale", reader.Read()); + break; + case "_HalfOverCutoff": + instance.SetFloat("_HalfOverCutoff", reader.Read()); + break; + + default: + reader.Skip(); + break; + } + } +#endif + } + } + + public class ES3Type_MaterialArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_MaterialArray() : base(typeof(Material[]), ES3Type_Material.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Material.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Material.cs.meta new file mode 100644 index 000000000..1ea5b3107 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Material.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: e2fe9704b49ad41cbb997e2b68befc6e +timeCreated: 1519132298 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Material.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Matrix4x4.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Matrix4x4.cs new file mode 100644 index 000000000..6cef1fc95 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Matrix4x4.cs @@ -0,0 +1,47 @@ +using System; +using UnityEngine; +using System.Collections.Generic; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("col0", "col1", "col2", "col3")] + public class ES3Type_Matrix4x4 : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Matrix4x4() : base(typeof(Matrix4x4)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Matrix4x4 casted = (Matrix4x4)obj; + writer.WriteProperty("col0", casted.GetColumn(0), ES3Type_Vector4.Instance); + writer.WriteProperty("col1", casted.GetColumn(1), ES3Type_Vector4.Instance); + writer.WriteProperty("col2", casted.GetColumn(2), ES3Type_Vector4.Instance); + writer.WriteProperty("col3", casted.GetColumn(3), ES3Type_Vector4.Instance); + } + + public override object Read(ES3Reader reader) + { + var matrix = new Matrix4x4(); + matrix.SetColumn(0, reader.ReadProperty(ES3Type_Vector4.Instance)); + matrix.SetColumn(1, reader.ReadProperty(ES3Type_Vector4.Instance)); + matrix.SetColumn(2, reader.ReadProperty(ES3Type_Vector4.Instance)); + matrix.SetColumn(3, reader.ReadProperty(ES3Type_Vector4.Instance)); + return matrix; + } + } + + public class ES3Type_Matrix4x4Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Matrix4x4Array() : base(typeof(Matrix4x4[]), ES3Type_Matrix4x4.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Matrix4x4.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Matrix4x4.cs.meta new file mode 100644 index 000000000..3b454c2dc --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Matrix4x4.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b08ac351ee185470bb1ccb5150c4082f +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Matrix4x4.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Mesh.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Mesh.cs new file mode 100644 index 000000000..b07a7b725 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Mesh.cs @@ -0,0 +1,169 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("bounds", "subMeshCount", "boneWeights", "bindposes", "vertices", "normals", "tangents", "uv", "uv2", "uv3", "uv4", "colors32", "triangles", "subMeshes")] + public class ES3Type_Mesh : ES3UnityObjectType + { + public static ES3Type Instance = null; + + public ES3Type_Mesh() : base(typeof(UnityEngine.Mesh)) + { + Instance = this; + } + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Mesh)obj; + + if(!instance.isReadable) + { + ES3Internal.ES3Debug.LogWarning("Easy Save cannot save the vertices for this Mesh because it is not marked as readable, so it will be stored by reference. To save the vertex data for this Mesh, check the 'Read/Write Enabled' checkbox in its Import Settings.", instance); + return; + } + + writer.WriteProperty("indexFormat", instance.indexFormat); + writer.WriteProperty("name", instance.name); + writer.WriteProperty("vertices", instance.vertices, ES3Type_Vector3Array.Instance); + writer.WriteProperty("triangles", instance.triangles, ES3Type_intArray.Instance); + writer.WriteProperty("bounds", instance.bounds, ES3Type_Bounds.Instance); + writer.WriteProperty("boneWeights", instance.boneWeights, ES3Type_BoneWeightArray.Instance); + writer.WriteProperty("bindposes", instance.bindposes, ES3Type_Matrix4x4Array.Instance); + writer.WriteProperty("normals", instance.normals, ES3Type_Vector3Array.Instance); + writer.WriteProperty("tangents", instance.tangents, ES3Type_Vector4Array.Instance); + writer.WriteProperty("uv", instance.uv, ES3Type_Vector2Array.Instance); + writer.WriteProperty("uv2", instance.uv2, ES3Type_Vector2Array.Instance); + writer.WriteProperty("uv3", instance.uv3, ES3Type_Vector2Array.Instance); + writer.WriteProperty("uv4", instance.uv4, ES3Type_Vector2Array.Instance); + writer.WriteProperty("colors32", instance.colors32, ES3Type_Color32Array.Instance); + writer.WriteProperty("subMeshCount", instance.subMeshCount, ES3Type_int.Instance); + for(int i=0; i(ES3Reader reader) + { + var obj = new Mesh(); + ReadUnityObject(reader, obj); + return obj; + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Mesh)obj; + if (instance == null) + return; + + if (!instance.isReadable) + ES3Internal.ES3Debug.LogWarning("Easy Save cannot load the vertices for this Mesh because it is not marked as readable, so it will be loaded by reference. To load the vertex data for this Mesh, check the 'Read/Write Enabled' checkbox in its Import Settings.", instance); + + foreach (string propertyName in reader.Properties) + { + // If this Mesh isn't readable, we should skip past all of its properties. + if (!instance.isReadable) + { + reader.Skip(); + continue; + } + + switch (propertyName) + { + case "indexFormat": + instance.indexFormat = reader.Read(); + break; + case "name": + instance.name = reader.Read(ES3Type_string.Instance); + break; + case "bounds": + instance.bounds = reader.Read(ES3Type_Bounds.Instance); + break; + case "boneWeights": + instance.boneWeights = reader.Read(ES3Type_BoneWeightArray.Instance); + break; + case "bindposes": + instance.bindposes = reader.Read(ES3Type_Matrix4x4Array.Instance); + break; + case "vertices": + instance.vertices = reader.Read(ES3Type_Vector3Array.Instance); + break; + case "normals": + instance.normals = reader.Read(ES3Type_Vector3Array.Instance); + break; + case "tangents": + instance.tangents = reader.Read(ES3Type_Vector4Array.Instance); + break; + case "uv": + instance.uv = reader.Read(ES3Type_Vector2Array.Instance); + break; + case "uv2": + instance.uv2 = reader.Read(ES3Type_Vector2Array.Instance); + break; + case "uv3": + instance.uv3 = reader.Read(ES3Type_Vector2Array.Instance); + break; + case "uv4": + instance.uv4 = reader.Read(ES3Type_Vector2Array.Instance); + break; + case "colors32": + instance.colors32 = reader.Read(ES3Type_Color32Array.Instance); + break; + case "triangles": + instance.triangles = reader.Read(ES3Type_intArray.Instance); + break; + case "subMeshCount": + instance.subMeshCount = reader.Read(ES3Type_int.Instance); + for(int i=0; i(ES3Type_intArray.Instance), i); + break; + case "blendShapeCount": + instance.ClearBlendShapes(); + var blendShapeCount = reader.Read(ES3Type_int.Instance); + for (int blendShapeIndex = 0; blendShapeIndex < blendShapeCount; blendShapeIndex++) + { + var shapeName = reader.ReadProperty(); + var frameCount = reader.ReadProperty(); + + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) + { + var deltaVertices = reader.ReadProperty(); + var deltaNormals = reader.ReadProperty(); + var deltaTangents = reader.ReadProperty(); + var frameWeight = reader.ReadProperty(); + + instance.AddBlendShapeFrame(shapeName, frameWeight, deltaVertices, deltaNormals, deltaTangents); + } + } + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Mesh.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Mesh.cs.meta new file mode 100644 index 000000000..eec28e266 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Mesh.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: e39bdb3d7bcae4f1aa682cbc9ff72ce7 +timeCreated: 1519132298 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Mesh.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxCurve.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxCurve.cs new file mode 100644 index 000000000..fdfa78017 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxCurve.cs @@ -0,0 +1,114 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("mode", "curveMultiplier", "curveMax", "curveMin", "constantMax", "constantMin", "constant", "curve")] + public class ES3Type_MinMaxCurve : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_MinMaxCurve() : base(typeof(UnityEngine.ParticleSystem.MinMaxCurve)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.MinMaxCurve)obj; + + writer.WriteProperty("mode", instance.mode); + writer.WriteProperty("curveMultiplier", instance.curveMultiplier, ES3Type_float.Instance); + writer.WriteProperty("curveMax", instance.curveMax, ES3Type_AnimationCurve.Instance); + writer.WriteProperty("curveMin", instance.curveMin, ES3Type_AnimationCurve.Instance); + writer.WriteProperty("constantMax", instance.constantMax, ES3Type_float.Instance); + writer.WriteProperty("constantMin", instance.constantMin, ES3Type_float.Instance); + writer.WriteProperty("constant", instance.constant, ES3Type_float.Instance); + writer.WriteProperty("curve", instance.curve, ES3Type_AnimationCurve.Instance); + } + + [UnityEngine.Scripting.Preserve] + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.MinMaxCurve(); + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "mode": + instance.mode = reader.Read(); + break; + case "curveMultiplier": + instance.curveMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "curveMax": + instance.curveMax = reader.Read(ES3Type_AnimationCurve.Instance); + break; + case "curveMin": + instance.curveMin = reader.Read(ES3Type_AnimationCurve.Instance); + break; + case "constantMax": + instance.constantMax = reader.Read(ES3Type_float.Instance); + break; + case "constantMin": + instance.constantMin = reader.Read(ES3Type_float.Instance); + break; + case "constant": + instance.constant = reader.Read(ES3Type_float.Instance); + break; + case "curve": + instance.curve = reader.Read(ES3Type_AnimationCurve.Instance); + break; + default: + reader.Skip(); + break; + } + } + return instance; + } + + [UnityEngine.Scripting.Preserve] + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.MinMaxCurve)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "mode": + instance.mode = reader.Read(); + break; + case "curveMultiplier": + instance.curveMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "curveMax": + instance.curveMax = reader.Read(ES3Type_AnimationCurve.Instance); + break; + case "curveMin": + instance.curveMin = reader.Read(ES3Type_AnimationCurve.Instance); + break; + case "constantMax": + instance.constantMax = reader.Read(ES3Type_float.Instance); + break; + case "constantMin": + instance.constantMin = reader.Read(ES3Type_float.Instance); + break; + case "constant": + instance.constant = reader.Read(ES3Type_float.Instance); + break; + case "curve": + instance.curve = reader.Read(ES3Type_AnimationCurve.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxCurve.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxCurve.cs.meta new file mode 100644 index 000000000..b5d45fe17 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxCurve.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: b63607ddb964c4897880a99d41c70efd +timeCreated: 1519132294 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxCurve.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxGradient.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxGradient.cs new file mode 100644 index 000000000..120f006d0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxGradient.cs @@ -0,0 +1,68 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("mode", "gradientMax", "gradientMin", "colorMax", "colorMin", "color", "gradient")] + public class ES3Type_MinMaxGradient : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_MinMaxGradient() : base(typeof(UnityEngine.ParticleSystem.MinMaxGradient)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.MinMaxGradient)obj; + + writer.WriteProperty("mode", instance.mode); + writer.WriteProperty("gradientMax", instance.gradientMax, ES3Type_Gradient.Instance); + writer.WriteProperty("gradientMin", instance.gradientMin, ES3Type_Gradient.Instance); + writer.WriteProperty("colorMax", instance.colorMax, ES3Type_Color.Instance); + writer.WriteProperty("colorMin", instance.colorMin, ES3Type_Color.Instance); + writer.WriteProperty("color", instance.color, ES3Type_Color.Instance); + writer.WriteProperty("gradient", instance.gradient, ES3Type_Gradient.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.MinMaxGradient(); + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "mode": + instance.mode = reader.Read(); + break; + case "gradientMax": + instance.gradientMax = reader.Read(ES3Type_Gradient.Instance); + break; + case "gradientMin": + instance.gradientMin = reader.Read(ES3Type_Gradient.Instance); + break; + case "colorMax": + instance.colorMax = reader.Read(ES3Type_Color.Instance); + break; + case "colorMin": + instance.colorMin = reader.Read(ES3Type_Color.Instance); + break; + case "color": + instance.color = reader.Read(ES3Type_Color.Instance); + break; + case "gradient": + instance.gradient = reader.Read(ES3Type_Gradient.Instance); + break; + default: + reader.Skip(); + break; + } + } + return instance; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxGradient.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxGradient.cs.meta new file mode 100644 index 000000000..0c0ca5441 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxGradient.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: c5b12866f2f984f6a822a127d5be1f9c +timeCreated: 1519132296 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_MinMaxGradient.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_NoiseModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_NoiseModule.cs new file mode 100644 index 000000000..d4e5ca4c8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_NoiseModule.cs @@ -0,0 +1,154 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "separateAxes", "strength", "strengthMultiplier", "strengthX", "strengthXMultiplier", "strengthY", "strengthYMultiplier", "strengthZ", "strengthZMultiplier", "frequency", "damping", "octaveCount", "octaveMultiplier", "octaveScale", "quality", "scrollSpeed", "scrollSpeedMultiplier", "remapEnabled", "remap", "remapMultiplier", "remapX", "remapXMultiplier", "remapY", "remapYMultiplier", "remapZ", "remapZMultiplier")] + public class ES3Type_NoiseModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_NoiseModule() : base(typeof(UnityEngine.ParticleSystem.NoiseModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.NoiseModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("separateAxes", instance.separateAxes, ES3Type_bool.Instance); + writer.WriteProperty("strength", instance.strength, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("strengthMultiplier", instance.strengthMultiplier, ES3Type_float.Instance); + writer.WriteProperty("strengthX", instance.strengthX, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("strengthXMultiplier", instance.strengthXMultiplier, ES3Type_float.Instance); + writer.WriteProperty("strengthY", instance.strengthY, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("strengthYMultiplier", instance.strengthYMultiplier, ES3Type_float.Instance); + writer.WriteProperty("strengthZ", instance.strengthZ, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("strengthZMultiplier", instance.strengthZMultiplier, ES3Type_float.Instance); + writer.WriteProperty("frequency", instance.frequency, ES3Type_float.Instance); + writer.WriteProperty("damping", instance.damping, ES3Type_bool.Instance); + writer.WriteProperty("octaveCount", instance.octaveCount, ES3Type_int.Instance); + writer.WriteProperty("octaveMultiplier", instance.octaveMultiplier, ES3Type_float.Instance); + writer.WriteProperty("octaveScale", instance.octaveScale, ES3Type_float.Instance); + writer.WriteProperty("quality", instance.quality); + writer.WriteProperty("scrollSpeed", instance.scrollSpeed, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("scrollSpeedMultiplier", instance.scrollSpeedMultiplier, ES3Type_float.Instance); + writer.WriteProperty("remapEnabled", instance.remapEnabled, ES3Type_bool.Instance); + writer.WriteProperty("remap", instance.remap, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("remapMultiplier", instance.remapMultiplier, ES3Type_float.Instance); + writer.WriteProperty("remapX", instance.remapX, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("remapXMultiplier", instance.remapXMultiplier, ES3Type_float.Instance); + writer.WriteProperty("remapY", instance.remapY, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("remapYMultiplier", instance.remapYMultiplier, ES3Type_float.Instance); + writer.WriteProperty("remapZ", instance.remapZ, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("remapZMultiplier", instance.remapZMultiplier, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.NoiseModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.NoiseModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "separateAxes": + instance.separateAxes = reader.Read(ES3Type_bool.Instance); + break; + case "strength": + instance.strength = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "strengthMultiplier": + instance.strengthMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "strengthX": + instance.strengthX = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "strengthXMultiplier": + instance.strengthXMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "strengthY": + instance.strengthY = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "strengthYMultiplier": + instance.strengthYMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "strengthZ": + instance.strengthZ = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "strengthZMultiplier": + instance.strengthZMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "frequency": + instance.frequency = reader.Read(ES3Type_float.Instance); + break; + case "damping": + instance.damping = reader.Read(ES3Type_bool.Instance); + break; + case "octaveCount": + instance.octaveCount = reader.Read(ES3Type_int.Instance); + break; + case "octaveMultiplier": + instance.octaveMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "octaveScale": + instance.octaveScale = reader.Read(ES3Type_float.Instance); + break; + case "quality": + instance.quality = reader.Read(); + break; + case "scrollSpeed": + instance.scrollSpeed = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "scrollSpeedMultiplier": + instance.scrollSpeedMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "remapEnabled": + instance.remapEnabled = reader.Read(ES3Type_bool.Instance); + break; + case "remap": + instance.remap = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "remapMultiplier": + instance.remapMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "remapX": + instance.remapX = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "remapXMultiplier": + instance.remapXMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "remapY": + instance.remapY = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "remapYMultiplier": + instance.remapYMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "remapZ": + instance.remapZ = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "remapZMultiplier": + instance.remapZMultiplier = reader.Read(ES3Type_float.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_NoiseModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_NoiseModule.cs.meta new file mode 100644 index 000000000..3b13dc3ea --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_NoiseModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 95fd95820c7c942ef96f463a52c3d4ae +timeCreated: 1519132291 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_NoiseModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicMaterial.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicMaterial.cs new file mode 100644 index 000000000..5151333d8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicMaterial.cs @@ -0,0 +1,140 @@ +using System; + +namespace ES3Types +{ +#if UNITY_6000_0_OR_NEWER + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("dynamicFriction", "staticFriction", "bounciness", "frictionCombine", "bounceCombine")] + public class ES3Type_PhysicsMaterial : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_PhysicsMaterial() : base(typeof(UnityEngine.PhysicsMaterial)) { Instance = this; } + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.PhysicsMaterial)obj; + + writer.WriteProperty("dynamicFriction", instance.dynamicFriction, ES3Type_float.Instance); + writer.WriteProperty("staticFriction", instance.staticFriction, ES3Type_float.Instance); + writer.WriteProperty("bounciness", instance.bounciness, ES3Type_float.Instance); + writer.WriteProperty("frictionCombine", instance.frictionCombine); + writer.WriteProperty("bounceCombine", instance.bounceCombine); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.PhysicsMaterial)obj; + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + + case "dynamicFriction": + instance.dynamicFriction = reader.Read(ES3Type_float.Instance); + break; + case "staticFriction": + instance.staticFriction = reader.Read(ES3Type_float.Instance); + break; + case "bounciness": + instance.bounciness = reader.Read(ES3Type_float.Instance); + break; + case "frictionCombine": + instance.frictionCombine = reader.Read(); + break; + case "bounceCombine": + instance.bounceCombine = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new UnityEngine.PhysicsMaterial(); + ReadObject(reader, instance); + return instance; + } + } + + public class ES3Type_PhysicsMaterialArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_PhysicsMaterialArray() : base(typeof(UnityEngine.PhysicsMaterial[]), ES3Type_PhysicsMaterial.Instance) + { + Instance = this; + } + } +#else + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("dynamicFriction", "staticFriction", "bounciness", "frictionCombine", "bounceCombine")] + public class ES3Type_PhysicMaterial : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_PhysicMaterial() : base(typeof(UnityEngine.PhysicMaterial)) { Instance = this; } + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.PhysicMaterial)obj; + + writer.WriteProperty("dynamicFriction", instance.dynamicFriction, ES3Type_float.Instance); + writer.WriteProperty("staticFriction", instance.staticFriction, ES3Type_float.Instance); + writer.WriteProperty("bounciness", instance.bounciness, ES3Type_float.Instance); + writer.WriteProperty("frictionCombine", instance.frictionCombine); + writer.WriteProperty("bounceCombine", instance.bounceCombine); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.PhysicMaterial)obj; + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + + case "dynamicFriction": + instance.dynamicFriction = reader.Read(ES3Type_float.Instance); + break; + case "staticFriction": + instance.staticFriction = reader.Read(ES3Type_float.Instance); + break; + case "bounciness": + instance.bounciness = reader.Read(ES3Type_float.Instance); + break; + case "frictionCombine": + instance.frictionCombine = reader.Read(); + break; + case "bounceCombine": + instance.bounceCombine = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new UnityEngine.PhysicMaterial(); + ReadObject(reader, instance); + return instance; + } + } + + public class ES3Type_PhysicMaterialArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_PhysicMaterialArray() : base(typeof(UnityEngine.PhysicMaterial[]), ES3Type_PhysicMaterial.Instance) + { + Instance = this; + } + } +#endif +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicMaterial.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicMaterial.cs.meta new file mode 100644 index 000000000..8f5d3acca --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicMaterial.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f4b8d9e47b0dc49f48c834a160b6fe55 +timeCreated: 1519132300 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicMaterial.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicsMaterial2D.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicsMaterial2D.cs new file mode 100644 index 000000000..0dc2e43fd --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicsMaterial2D.cs @@ -0,0 +1,59 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("bounciness", "friction")] + public class ES3Type_PhysicsMaterial2D : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_PhysicsMaterial2D() : base(typeof(UnityEngine.PhysicsMaterial2D)){ Instance = this; } + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.PhysicsMaterial2D)obj; + + writer.WriteProperty("bounciness", instance.bounciness, ES3Type_float.Instance); + writer.WriteProperty("friction", instance.friction, ES3Type_float.Instance); + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.PhysicsMaterial2D)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "bounciness": + instance.bounciness = reader.Read(ES3Type_float.Instance); + break; + case "friction": + instance.friction = reader.Read(ES3Type_float.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var instance = new UnityEngine.PhysicsMaterial2D(); + ReadObject(reader, instance); + return instance; + } + } + + public class ES3Type_PhysicsMaterial2DArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_PhysicsMaterial2DArray() : base(typeof(UnityEngine.PhysicsMaterial2D[]), ES3Type_PhysicsMaterial2D.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicsMaterial2D.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicsMaterial2D.cs.meta new file mode 100644 index 000000000..b8486d929 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicsMaterial2D.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 456568556c632458bb73fffbb1be0c84 +timeCreated: 1519132284 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_PhysicsMaterial2D.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Quaternion.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Quaternion.cs new file mode 100644 index 000000000..f2413d076 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Quaternion.cs @@ -0,0 +1,44 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("x", "y", "z", "w")] + public class ES3Type_Quaternion : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Quaternion() : base(typeof(Quaternion)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var casted = (Quaternion)obj; + writer.WriteProperty("x", casted.x, ES3Type_float.Instance); + writer.WriteProperty("y", casted.y, ES3Type_float.Instance); + writer.WriteProperty("z", casted.z, ES3Type_float.Instance); + writer.WriteProperty("w", casted.w, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Quaternion( reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } + + public class ES3Type_QuaternionArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_QuaternionArray() : base(typeof(Quaternion[]), ES3Type_Quaternion.Instance) + { + Instance = this; + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Quaternion.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Quaternion.cs.meta new file mode 100644 index 000000000..4450435db --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Quaternion.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d9975ecdd621d46a285708463dde7816 +timeCreated: 1519132297 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Quaternion.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Rect.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Rect.cs new file mode 100644 index 000000000..163958442 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Rect.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("x", "y", "width", "height")] + public class ES3Type_Rect : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Rect() : base(typeof(UnityEngine.Rect)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Rect)obj; + + writer.WriteProperty("x", instance.x, ES3Type_float.Instance); + writer.WriteProperty("y", instance.y, ES3Type_float.Instance); + writer.WriteProperty("width", instance.width, ES3Type_float.Instance); + writer.WriteProperty("height", instance.height, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Rect(reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Rect.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Rect.cs.meta new file mode 100644 index 000000000..bc6d07a5d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Rect.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d9b9aa6e5759a4a3e857f90a2de74e5f +timeCreated: 1519132297 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Rect.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RectTransform.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RectTransform.cs new file mode 100644 index 000000000..24696f4be --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RectTransform.cs @@ -0,0 +1,96 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("anchorMin", "anchorMax", "anchoredPosition", "sizeDelta", "pivot", "offsetMin", "offsetMax", "localPosition", "localRotation", "localScale", "parent", "hideFlags")] + public class ES3Type_RectTransform : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_RectTransform() : base(typeof(UnityEngine.RectTransform)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.RectTransform)obj; + + writer.WritePropertyByRef("parent", instance.parent); + writer.WriteProperty("anchorMin", instance.anchorMin, ES3Type_Vector2.Instance); + writer.WriteProperty("anchorMax", instance.anchorMax, ES3Type_Vector2.Instance); + writer.WriteProperty("anchoredPosition", instance.anchoredPosition, ES3Type_Vector2.Instance); + writer.WriteProperty("sizeDelta", instance.sizeDelta, ES3Type_Vector2.Instance); + writer.WriteProperty("pivot", instance.pivot, ES3Type_Vector2.Instance); + writer.WriteProperty("offsetMin", instance.offsetMin, ES3Type_Vector2.Instance); + writer.WriteProperty("offsetMax", instance.offsetMax, ES3Type_Vector2.Instance); + writer.WriteProperty("localPosition", instance.localPosition, ES3Type_Vector3.Instance); + writer.WriteProperty("localRotation", instance.localRotation, ES3Type_Quaternion.Instance); + writer.WriteProperty("localScale", instance.localScale, ES3Type_Vector3.Instance); + writer.WriteProperty("hideFlags", instance.hideFlags); + writer.WriteProperty("siblingIndex", instance.GetSiblingIndex()); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + if (obj.GetType() == typeof(UnityEngine.Transform)) + obj = ((Transform)obj).gameObject.AddComponent(); + + var instance = (UnityEngine.RectTransform)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "anchorMin": + instance.anchorMin = reader.Read(ES3Type_Vector2.Instance); + break; + case "anchorMax": + instance.anchorMax = reader.Read(ES3Type_Vector2.Instance); + break; + case "anchoredPosition": + instance.anchoredPosition = reader.Read(ES3Type_Vector2.Instance); + break; + case "sizeDelta": + instance.sizeDelta = reader.Read(ES3Type_Vector2.Instance); + break; + case "pivot": + instance.pivot = reader.Read(ES3Type_Vector2.Instance); + break; + case "offsetMin": + instance.offsetMin = reader.Read(ES3Type_Vector2.Instance); + break; + case "offsetMax": + instance.offsetMax = reader.Read(ES3Type_Vector2.Instance); + break; + case "localPosition": + instance.localPosition = reader.Read(ES3Type_Vector3.Instance); + break; + case "localRotation": + instance.localRotation = reader.Read(ES3Type_Quaternion.Instance); + break; + case "localScale": + instance.localScale = reader.Read(ES3Type_Vector3.Instance); + break; + case "parent": + instance.SetParent(reader.Read(ES3Type_Transform.Instance)); + break; + case "hierarchyCapacity": + instance.hierarchyCapacity = reader.Read(ES3Type_int.Instance); + break; + case "hideFlags": + instance.hideFlags = reader.Read(); + break; + case "siblingIndex": + instance.SetSiblingIndex(reader.Read()); + break; + default: + reader.Skip(); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RectTransform.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RectTransform.cs.meta new file mode 100644 index 000000000..05adf8d68 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RectTransform.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 2f7556a7c1bb04cf5979c7e6e65c5e51 +timeCreated: 1519132282 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RectTransform.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RenderTexture.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RenderTexture.cs new file mode 100644 index 000000000..5959e92f8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RenderTexture.cs @@ -0,0 +1,165 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("width", "height", "dimension", "graphicsFormat", "useMipMap", "vrUsage", "memorylessMode", "format", "stencilFormat", "autoGenerateMips", "volumeDepth", "antiAliasing", "bindTextureMS", "enableRandomWrite", "useDynamicScale", "isPowerOfTwo", "depth", "descriptor", "masterTextureLimit", "anisotropicFiltering", "wrapMode", "wrapModeU", "wrapModeV", "wrapModeW", "filterMode", "anisoLevel", "mipMapBias", "imageContentsHash", "streamingTextureForceLoadAll", "streamingTextureDiscardUnusedMips", "allowThreadedTextureCreation", "name")] + public class ES3Type_RenderTexture : ES3ObjectType + { + public static ES3Type Instance = null; + + public ES3Type_RenderTexture() : base(typeof(UnityEngine.RenderTexture)) { Instance = this; } + + + protected override void WriteObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.RenderTexture)obj; + + writer.WriteProperty("descriptor", instance.descriptor); + writer.WriteProperty("antiAliasing", instance.antiAliasing, ES3Type_int.Instance); + writer.WriteProperty("isPowerOfTwo", instance.isPowerOfTwo, ES3Type_bool.Instance); + writer.WriteProperty("anisotropicFiltering", UnityEngine.RenderTexture.anisotropicFiltering); + writer.WriteProperty("wrapMode", instance.wrapMode); + writer.WriteProperty("wrapModeU", instance.wrapModeU); + writer.WriteProperty("wrapModeV", instance.wrapModeV); + writer.WriteProperty("wrapModeW", instance.wrapModeW); + writer.WriteProperty("filterMode", instance.filterMode); + writer.WriteProperty("anisoLevel", instance.anisoLevel, ES3Type_int.Instance); + writer.WriteProperty("mipMapBias", instance.mipMapBias, ES3Type_float.Instance); + +#if UNITY_2020_1_OR_NEWER + writer.WriteProperty("streamingTextureForceLoadAll", UnityEngine.RenderTexture.streamingTextureForceLoadAll, ES3Type_bool.Instance); + writer.WriteProperty("streamingTextureDiscardUnusedMips", UnityEngine.RenderTexture.streamingTextureDiscardUnusedMips, ES3Type_bool.Instance); + writer.WriteProperty("allowThreadedTextureCreation", UnityEngine.RenderTexture.allowThreadedTextureCreation, ES3Type_bool.Instance); +#endif + } + + protected override void ReadObject(ES3Reader reader, object obj) + { + var instance = (UnityEngine.RenderTexture)obj; + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + case "width": + instance.width = reader.Read(ES3Type_int.Instance); + break; + case "height": + instance.height = reader.Read(ES3Type_int.Instance); + break; + case "dimension": + instance.dimension = reader.Read(); + break; + case "useMipMap": + instance.useMipMap = reader.Read(ES3Type_bool.Instance); + break; + case "memorylessMode": + instance.memorylessMode = reader.Read(); + break; + case "format": + instance.format = reader.Read(); + break; + case "autoGenerateMips": + instance.autoGenerateMips = reader.Read(ES3Type_bool.Instance); + break; + case "volumeDepth": + instance.volumeDepth = reader.Read(ES3Type_int.Instance); + break; + case "antiAliasing": + instance.antiAliasing = reader.Read(ES3Type_int.Instance); + break; + case "enableRandomWrite": + instance.enableRandomWrite = reader.Read(ES3Type_bool.Instance); + break; + case "isPowerOfTwo": + instance.isPowerOfTwo = reader.Read(ES3Type_bool.Instance); + break; + case "depth": + instance.depth = reader.Read(ES3Type_int.Instance); + break; + case "descriptor": + instance.descriptor = reader.Read(); + break; + case "anisotropicFiltering": + UnityEngine.RenderTexture.anisotropicFiltering = reader.Read(); + break; + case "wrapMode": + instance.wrapMode = reader.Read(); + break; + case "wrapModeU": + instance.wrapModeU = reader.Read(); + break; + case "wrapModeV": + instance.wrapModeV = reader.Read(); + break; + case "wrapModeW": + instance.wrapModeW = reader.Read(); + break; + case "filterMode": + instance.filterMode = reader.Read(); + break; + case "anisoLevel": + instance.anisoLevel = reader.Read(ES3Type_int.Instance); + break; + case "mipMapBias": + instance.mipMapBias = reader.Read(ES3Type_float.Instance); + break; + case "name": + instance.name = reader.Read(ES3Type_string.Instance); + break; + +#if UNITY_2020_1_OR_NEWER + case "vrUsage": + instance.vrUsage = reader.Read(); + break; + case "graphicsFormat": + instance.graphicsFormat = reader.Read(); + break; + case "stencilFormat": + instance.stencilFormat = reader.Read(); + break; + case "bindTextureMS": + instance.bindTextureMS = reader.Read(ES3Type_bool.Instance); + break; + case "useDynamicScale": + instance.useDynamicScale = reader.Read(ES3Type_bool.Instance); + break; + case "streamingTextureForceLoadAll": + UnityEngine.RenderTexture.streamingTextureForceLoadAll = reader.Read(ES3Type_bool.Instance); + break; + case "streamingTextureDiscardUnusedMips": + UnityEngine.RenderTexture.streamingTextureDiscardUnusedMips = reader.Read(ES3Type_bool.Instance); + break; + case "allowThreadedTextureCreation": + UnityEngine.RenderTexture.allowThreadedTextureCreation = reader.Read(ES3Type_bool.Instance); + break; +#endif + + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadObject(ES3Reader reader) + { + var descriptor = reader.ReadProperty(); + var instance = new UnityEngine.RenderTexture(descriptor); + ReadObject(reader, instance); + return instance; + } + } + + + public class ES3Type_RenderTextureArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_RenderTextureArray() : base(typeof(UnityEngine.RenderTexture[]), ES3Type_RenderTexture.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RenderTexture.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RenderTexture.cs.meta new file mode 100644 index 000000000..526747b8d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RenderTexture.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 589b7cd3ec938964197a399aa93bff00 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RenderTexture.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationBySpeedModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationBySpeedModule.cs new file mode 100644 index 000000000..80a976802 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationBySpeedModule.cs @@ -0,0 +1,82 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "x", "xMultiplier", "y", "yMultiplier", "z", "zMultiplier", "separateAxes", "range")] + public class ES3Type_RotationBySpeedModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_RotationBySpeedModule() : base(typeof(UnityEngine.ParticleSystem.RotationBySpeedModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.RotationBySpeedModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("x", instance.x, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("xMultiplier", instance.xMultiplier, ES3Type_float.Instance); + writer.WriteProperty("y", instance.y, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("yMultiplier", instance.yMultiplier, ES3Type_float.Instance); + writer.WriteProperty("z", instance.z, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("zMultiplier", instance.zMultiplier, ES3Type_float.Instance); + writer.WriteProperty("separateAxes", instance.separateAxes, ES3Type_bool.Instance); + writer.WriteProperty("range", instance.range, ES3Type_Vector2.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.RotationBySpeedModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.RotationBySpeedModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "x": + instance.x = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "xMultiplier": + instance.xMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "y": + instance.y = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "yMultiplier": + instance.yMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "z": + instance.z = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "zMultiplier": + instance.zMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "separateAxes": + instance.separateAxes = reader.Read(ES3Type_bool.Instance); + break; + case "range": + instance.range = reader.Read(ES3Type_Vector2.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationBySpeedModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationBySpeedModule.cs.meta new file mode 100644 index 000000000..1aee87d18 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationBySpeedModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 0a7279e70f63d4a2787489257b5e3ea9 +timeCreated: 1519132280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationBySpeedModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationOverLifetimeModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationOverLifetimeModule.cs new file mode 100644 index 000000000..11c3648a9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationOverLifetimeModule.cs @@ -0,0 +1,78 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "x", "xMultiplier", "y", "yMultiplier", "z", "zMultiplier", "separateAxes")] + public class ES3Type_RotationOverLifetimeModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_RotationOverLifetimeModule() : base(typeof(UnityEngine.ParticleSystem.RotationOverLifetimeModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.RotationOverLifetimeModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("x", instance.x, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("xMultiplier", instance.xMultiplier, ES3Type_float.Instance); + writer.WriteProperty("y", instance.y, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("yMultiplier", instance.yMultiplier, ES3Type_float.Instance); + writer.WriteProperty("z", instance.z, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("zMultiplier", instance.zMultiplier, ES3Type_float.Instance); + writer.WriteProperty("separateAxes", instance.separateAxes, ES3Type_bool.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.RotationOverLifetimeModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.RotationOverLifetimeModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "x": + instance.x = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "xMultiplier": + instance.xMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "y": + instance.y = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "yMultiplier": + instance.yMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "z": + instance.z = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "zMultiplier": + instance.zMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "separateAxes": + instance.separateAxes = reader.Read(ES3Type_bool.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationOverLifetimeModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationOverLifetimeModule.cs.meta new file mode 100644 index 000000000..5231563bf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationOverLifetimeModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: e54d1e36b07864bc2b7f33a6182d124b +timeCreated: 1519132299 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_RotationOverLifetimeModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Shader.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Shader.cs new file mode 100644 index 000000000..fe0290726 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Shader.cs @@ -0,0 +1,61 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("name","maximumLOD")] + public class ES3Type_Shader : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Shader() : base(typeof(UnityEngine.Shader)){ Instance = this; } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Shader)obj; + + writer.WriteProperty("name", instance.name, ES3Type_string.Instance); + writer.WriteProperty("maximumLOD", instance.maximumLOD, ES3Type_int.Instance); + } + + public override object Read(ES3Reader reader) + { + Shader obj = Shader.Find(reader.ReadProperty(ES3Type_string.Instance)); + if(obj == null) + obj = Shader.Find("Diffuse"); + ReadInto(reader, obj); + return obj; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.Shader)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + case "name": + instance.name = reader.Read(ES3Type_string.Instance); + break; + case "maximumLOD": + instance.maximumLOD = reader.Read(ES3Type_int.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_ShaderArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_ShaderArray() : base(typeof(UnityEngine.Shader[]), ES3Type_Shader.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Shader.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Shader.cs.meta new file mode 100644 index 000000000..4bcbc41e6 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Shader.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 9d42e849fe2364f1b92d805b3fa7f874 +timeCreated: 1519132292 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Shader.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ShapeModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ShapeModule.cs new file mode 100644 index 000000000..d498cbd93 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ShapeModule.cs @@ -0,0 +1,132 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "shapeType", "randomDirectionAmount", "sphericalDirectionAmount", "alignToDirection", "radius", "angle", "length", "box", "meshShapeType", "mesh", "meshRenderer", "skinnedMeshRenderer", "useMeshMaterialIndex", "meshMaterialIndex", "useMeshColors", "normalOffset", "meshScale", "arc")] + public class ES3Type_ShapeModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_ShapeModule() : base(typeof(UnityEngine.ParticleSystem.ShapeModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.ShapeModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("shapeType", instance.shapeType); + writer.WriteProperty("randomDirectionAmount", instance.randomDirectionAmount, ES3Type_float.Instance); + writer.WriteProperty("sphericalDirectionAmount", instance.sphericalDirectionAmount, ES3Type_float.Instance); + writer.WriteProperty("alignToDirection", instance.alignToDirection, ES3Type_bool.Instance); + writer.WriteProperty("radius", instance.radius, ES3Type_float.Instance); + writer.WriteProperty("angle", instance.angle, ES3Type_float.Instance); + writer.WriteProperty("length", instance.length, ES3Type_float.Instance); + #if UNITY_5 + writer.WriteProperty("box", instance.box, ES3Type_Vector3.Instance); + writer.WriteProperty("meshScale", instance.meshScale, ES3Type_float.Instance); + #else + writer.WriteProperty("scale", instance.scale, ES3Type_Vector3.Instance); + #endif + writer.WriteProperty("meshShapeType", instance.meshShapeType); + writer.WritePropertyByRef("mesh", instance.mesh); + writer.WritePropertyByRef("meshRenderer", instance.meshRenderer); + writer.WritePropertyByRef("skinnedMeshRenderer", instance.skinnedMeshRenderer); + writer.WriteProperty("useMeshMaterialIndex", instance.useMeshMaterialIndex, ES3Type_bool.Instance); + writer.WriteProperty("meshMaterialIndex", instance.meshMaterialIndex, ES3Type_int.Instance); + writer.WriteProperty("useMeshColors", instance.useMeshColors, ES3Type_bool.Instance); + writer.WriteProperty("normalOffset", instance.normalOffset, ES3Type_float.Instance); + writer.WriteProperty("arc", instance.arc, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.ShapeModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.ShapeModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "shapeType": + instance.shapeType = reader.Read(); + break; + case "randomDirectionAmount": + instance.randomDirectionAmount = reader.Read(ES3Type_float.Instance); + break; + case "sphericalDirectionAmount": + instance.sphericalDirectionAmount = reader.Read(ES3Type_float.Instance); + break; + case "alignToDirection": + instance.alignToDirection = reader.Read(ES3Type_bool.Instance); + break; + case "radius": + instance.radius = reader.Read(ES3Type_float.Instance); + break; + case "angle": + instance.angle = reader.Read(ES3Type_float.Instance); + break; + case "length": + instance.length = reader.Read(ES3Type_float.Instance); + break; + #if UNITY_5 + case "box": + instance.box = reader.Read(ES3Type_Vector3.Instance); + break; + case "meshScale": + instance.meshScale = reader.Read(ES3Type_float.Instance); + break; + #else + case "scale": + instance.scale = reader.Read(ES3Type_Vector3.Instance); + break; + #endif + case "meshShapeType": + instance.meshShapeType = reader.Read(); + break; + case "mesh": + instance.mesh = reader.Read(); + break; + case "meshRenderer": + instance.meshRenderer = reader.Read(); + break; + case "skinnedMeshRenderer": + instance.skinnedMeshRenderer = reader.Read(); + break; + case "useMeshMaterialIndex": + instance.useMeshMaterialIndex = reader.Read(ES3Type_bool.Instance); + break; + case "meshMaterialIndex": + instance.meshMaterialIndex = reader.Read(ES3Type_int.Instance); + break; + case "useMeshColors": + instance.useMeshColors = reader.Read(ES3Type_bool.Instance); + break; + case "normalOffset": + instance.normalOffset = reader.Read(ES3Type_float.Instance); + break; + case "arc": + instance.arc = reader.Read(ES3Type_float.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ShapeModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ShapeModule.cs.meta new file mode 100644 index 000000000..c02a54c69 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ShapeModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 238b82f3d73ce4b4ebeb3a5c22eff5e9 +timeCreated: 1519132281 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_ShapeModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeBySpeedModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeBySpeedModule.cs new file mode 100644 index 000000000..a37aefc5a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeBySpeedModule.cs @@ -0,0 +1,90 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "size", "sizeMultiplier", "x", "xMultiplier", "y", "yMultiplier", "z", "zMultiplier", "separateAxes", "range")] + public class ES3Type_SizeBySpeedModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_SizeBySpeedModule() : base(typeof(UnityEngine.ParticleSystem.SizeBySpeedModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.SizeBySpeedModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("size", instance.size, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("sizeMultiplier", instance.sizeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("x", instance.x, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("xMultiplier", instance.xMultiplier, ES3Type_float.Instance); + writer.WriteProperty("y", instance.y, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("yMultiplier", instance.yMultiplier, ES3Type_float.Instance); + writer.WriteProperty("z", instance.z, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("zMultiplier", instance.zMultiplier, ES3Type_float.Instance); + writer.WriteProperty("separateAxes", instance.separateAxes, ES3Type_bool.Instance); + writer.WriteProperty("range", instance.range, ES3Type_Vector2.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.SizeBySpeedModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.SizeBySpeedModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "size": + instance.size = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "sizeMultiplier": + instance.sizeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "x": + instance.x = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "xMultiplier": + instance.xMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "y": + instance.y = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "yMultiplier": + instance.yMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "z": + instance.z = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "zMultiplier": + instance.zMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "separateAxes": + instance.separateAxes = reader.Read(ES3Type_bool.Instance); + break; + case "range": + instance.range = reader.Read(ES3Type_Vector2.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeBySpeedModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeBySpeedModule.cs.meta new file mode 100644 index 000000000..edfd15cf4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeBySpeedModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 553dbccc70c984444a8e1e4fb140acaa +timeCreated: 1519132285 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeBySpeedModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeOverLifetimeModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeOverLifetimeModule.cs new file mode 100644 index 000000000..9fa4e3c0d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeOverLifetimeModule.cs @@ -0,0 +1,86 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "size", "sizeMultiplier", "x", "xMultiplier", "y", "yMultiplier", "z", "zMultiplier", "separateAxes")] + public class ES3Type_SizeOverLifetimeModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_SizeOverLifetimeModule() : base(typeof(UnityEngine.ParticleSystem.SizeOverLifetimeModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.SizeOverLifetimeModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("size", instance.size, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("sizeMultiplier", instance.sizeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("x", instance.x, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("xMultiplier", instance.xMultiplier, ES3Type_float.Instance); + writer.WriteProperty("y", instance.y, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("yMultiplier", instance.yMultiplier, ES3Type_float.Instance); + writer.WriteProperty("z", instance.z, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("zMultiplier", instance.zMultiplier, ES3Type_float.Instance); + writer.WriteProperty("separateAxes", instance.separateAxes, ES3Type_bool.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.SizeOverLifetimeModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.SizeOverLifetimeModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "size": + instance.size = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "sizeMultiplier": + instance.sizeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "x": + instance.x = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "xMultiplier": + instance.xMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "y": + instance.y = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "yMultiplier": + instance.yMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "z": + instance.z = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "zMultiplier": + instance.zMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "separateAxes": + instance.separateAxes = reader.Read(ES3Type_bool.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeOverLifetimeModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeOverLifetimeModule.cs.meta new file mode 100644 index 000000000..e637e44f2 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeOverLifetimeModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 414f41e320e5f4be0a7aa4b39344c5e4 +timeCreated: 1519132284 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SizeOverLifetimeModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SkinnedMeshRenderer.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SkinnedMeshRenderer.cs new file mode 100644 index 000000000..6c6d3cac0 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SkinnedMeshRenderer.cs @@ -0,0 +1,157 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("bones", "rootBone", "quality", "sharedMesh", "updateWhenOffscreen", "skinnedMotionVectors", "localBounds", "enabled", "shadowCastingMode", "receiveShadows", "sharedMaterials", "lightmapIndex", "realtimeLightmapIndex", "lightmapScaleOffset", "motionVectorGenerationMode", "realtimeLightmapScaleOffset", "lightProbeUsage", "lightProbeProxyVolumeOverride", "probeAnchor", "reflectionProbeUsage", "sortingLayerName", "sortingLayerID", "sortingOrder")] + public class ES3Type_SkinnedMeshRenderer : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_SkinnedMeshRenderer() : base(typeof(UnityEngine.SkinnedMeshRenderer)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.SkinnedMeshRenderer)obj; + + writer.WriteProperty("bones", instance.bones); + writer.WriteProperty("rootBone", instance.rootBone); + writer.WriteProperty("quality", instance.quality); + writer.WriteProperty("sharedMesh", instance.sharedMesh); + writer.WriteProperty("updateWhenOffscreen", instance.updateWhenOffscreen, ES3Type_bool.Instance); + writer.WriteProperty("skinnedMotionVectors", instance.skinnedMotionVectors, ES3Type_bool.Instance); + writer.WriteProperty("localBounds", instance.localBounds, ES3Type_Bounds.Instance); + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("shadowCastingMode", instance.shadowCastingMode); + writer.WriteProperty("receiveShadows", instance.receiveShadows, ES3Type_bool.Instance); + writer.WriteProperty("sharedMaterials", instance.sharedMaterials); + writer.WriteProperty("lightmapIndex", instance.lightmapIndex, ES3Type_int.Instance); + writer.WriteProperty("realtimeLightmapIndex", instance.realtimeLightmapIndex, ES3Type_int.Instance); + writer.WriteProperty("lightmapScaleOffset", instance.lightmapScaleOffset, ES3Type_Vector4.Instance); + writer.WriteProperty("motionVectorGenerationMode", instance.motionVectorGenerationMode); + writer.WriteProperty("realtimeLightmapScaleOffset", instance.realtimeLightmapScaleOffset, ES3Type_Vector4.Instance); + writer.WriteProperty("lightProbeUsage", instance.lightProbeUsage); + writer.WriteProperty("lightProbeProxyVolumeOverride", instance.lightProbeProxyVolumeOverride); + writer.WriteProperty("probeAnchor", instance.probeAnchor); + writer.WriteProperty("reflectionProbeUsage", instance.reflectionProbeUsage); + writer.WriteProperty("sortingLayerName", instance.sortingLayerName, ES3Type_string.Instance); + writer.WriteProperty("sortingLayerID", instance.sortingLayerID, ES3Type_int.Instance); + writer.WriteProperty("sortingOrder", instance.sortingOrder, ES3Type_int.Instance); + + // Get BlendShapeWeights + if (instance.sharedMesh != null) + { + var blendShapeWeights = new float[instance.sharedMesh.blendShapeCount]; + for (int i = 0; i < blendShapeWeights.Length; i++) + blendShapeWeights[i] = instance.GetBlendShapeWeight(i); + writer.WriteProperty("blendShapeWeights", blendShapeWeights, ES3Type_floatArray.Instance); + } + + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.SkinnedMeshRenderer)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + + case "bones": + instance.bones = reader.Read(); + break; + case "rootBone": + instance.rootBone = reader.Read(ES3Type_Transform.Instance); + break; + case "quality": + instance.quality = reader.Read(); + break; + case "sharedMesh": + instance.sharedMesh = reader.Read(ES3Type_Mesh.Instance); + break; + case "updateWhenOffscreen": + instance.updateWhenOffscreen = reader.Read(ES3Type_bool.Instance); + break; + case "skinnedMotionVectors": + instance.skinnedMotionVectors = reader.Read(ES3Type_bool.Instance); + break; + case "localBounds": + instance.localBounds = reader.Read(ES3Type_Bounds.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "shadowCastingMode": + instance.shadowCastingMode = reader.Read(); + break; + case "receiveShadows": + instance.receiveShadows = reader.Read(ES3Type_bool.Instance); + break; + case "sharedMaterials": + instance.sharedMaterials = reader.Read(); + break; + case "lightmapIndex": + instance.lightmapIndex = reader.Read(ES3Type_int.Instance); + break; + case "realtimeLightmapIndex": + instance.realtimeLightmapIndex = reader.Read(ES3Type_int.Instance); + break; + case "lightmapScaleOffset": + instance.lightmapScaleOffset = reader.Read(ES3Type_Vector4.Instance); + break; + case "motionVectorGenerationMode": + instance.motionVectorGenerationMode = reader.Read(); + break; + case "realtimeLightmapScaleOffset": + instance.realtimeLightmapScaleOffset = reader.Read(ES3Type_Vector4.Instance); + break; + case "lightProbeUsage": + instance.lightProbeUsage = reader.Read(); + break; + case "lightProbeProxyVolumeOverride": + instance.lightProbeProxyVolumeOverride = reader.Read(ES3Type_GameObject.Instance); + break; + case "probeAnchor": + instance.probeAnchor = reader.Read(ES3Type_Transform.Instance); + break; + case "reflectionProbeUsage": + instance.reflectionProbeUsage = reader.Read(); + break; + case "sortingLayerName": + instance.sortingLayerName = reader.Read(ES3Type_string.Instance); + break; + case "sortingLayerID": + instance.sortingLayerID = reader.Read(ES3Type_int.Instance); + break; + case "sortingOrder": + instance.sortingOrder = reader.Read(ES3Type_int.Instance); + break; + case "blendShapeWeights": + var blendShapeWeights = reader.Read(ES3Type_floatArray.Instance); + if (instance.sharedMesh == null) break; + if (blendShapeWeights.Length != instance.sharedMesh.blendShapeCount) + ES3Internal.ES3Debug.LogError("The number of blend shape weights we are loading does not match the number of blend shapes in this SkinnedMeshRenderer's Mesh"); + for (int i = 0; i < blendShapeWeights.Length; i++) + instance.SetBlendShapeWeight(i, blendShapeWeights[i]); + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_SkinnedMeshRendererArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_SkinnedMeshRendererArray() : base(typeof(UnityEngine.SkinnedMeshRenderer[]), ES3Type_SkinnedMeshRenderer.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SkinnedMeshRenderer.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SkinnedMeshRenderer.cs.meta new file mode 100644 index 000000000..906c6cd71 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SkinnedMeshRenderer.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: c60a9d4280a1740059c9784d75d00ad9 +timeCreated: 1519132296 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SkinnedMeshRenderer.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Sprite.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Sprite.cs new file mode 100644 index 000000000..3f8c1d290 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Sprite.cs @@ -0,0 +1,69 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("texture", "rect", "pivot", "pixelsPerUnit", "border")] + public class ES3Type_Sprite : ES3UnityObjectType + { + public static ES3Type Instance = null; + + public ES3Type_Sprite() : base(typeof(UnityEngine.Sprite)) { Instance = this; } + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = (UnityEngine.Sprite)obj; + + writer.WriteProperty("texture", instance.texture, ES3Type_Texture2D.Instance); + writer.WriteProperty("rect", instance.rect, ES3Type_Rect.Instance); + // Pivot value is in pixels, but we require a normalised pivot when using Sprite.Create during loading, so we normalise it here. + writer.WriteProperty("pivot", new Vector2(instance.pivot.x / instance.texture.width, instance.pivot.y / instance.texture.height), ES3Type_Vector2.Instance); + writer.WriteProperty("pixelsPerUnit", instance.pixelsPerUnit, ES3Type_float.Instance); + writer.WriteProperty("border", instance.border, ES3Type_Vector4.Instance); + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + foreach (string propertyName in reader.Properties) + reader.Skip(); + } + + protected override object ReadUnityObject(ES3Reader reader) + { + Texture2D texture = null; + Rect rect = Rect.zero; + Vector2 pivot = Vector2.zero; + float pixelsPerUnit = 0; + Vector4 border = Vector4.zero; + + foreach (string propertyName in reader.Properties) + { + switch (propertyName) + { + case "texture": + texture = reader.Read(ES3Type_Texture2D.Instance); + break; + case "textureRect": + case "rect": + rect = reader.Read(ES3Type_Rect.Instance); + break; + case "pivot": + pivot = reader.Read(ES3Type_Vector2.Instance); + break; + case "pixelsPerUnit": + pixelsPerUnit = reader.Read(ES3Type_float.Instance); + break; + case "border": + border = reader.Read(ES3Type_Vector4.Instance); + break; + default: + reader.Skip(); + break; + } + } + + return Sprite.Create(texture, rect, pivot, pixelsPerUnit, 0, SpriteMeshType.Tight, border); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Sprite.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Sprite.cs.meta new file mode 100644 index 000000000..be2631d78 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Sprite.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: dd9947bd586c04b26ae52e608a032be9 +timeCreated: 1519132298 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Sprite.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SpriteRenderer.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SpriteRenderer.cs new file mode 100644 index 000000000..5b530847e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SpriteRenderer.cs @@ -0,0 +1,126 @@ +using System; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("sprite", "color", "flipX", "flipY", "enabled", "shadowCastingMode", "receiveShadows", "sharedMaterials", "lightmapIndex", "realtimeLightmapIndex", "lightmapScaleOffset", "motionVectorGenerationMode", "realtimeLightmapScaleOffset", "lightProbeUsage", "lightProbeProxyVolumeOverride", "probeAnchor", "reflectionProbeUsage", "sortingLayerName", "sortingLayerID", "sortingOrder")] + public class ES3Type_SpriteRenderer : ES3ComponentType + { + public static ES3Type Instance = null; + + public ES3Type_SpriteRenderer() : base(typeof(UnityEngine.SpriteRenderer)) + { + Instance = this; + } + + protected override void WriteComponent(object obj, ES3Writer writer) + { + var instance = (UnityEngine.SpriteRenderer)obj; + + writer.WriteProperty("sprite", instance.sprite); + writer.WriteProperty("color", instance.color, ES3Type_Color.Instance); + writer.WriteProperty("flipX", instance.flipX, ES3Type_bool.Instance); + writer.WriteProperty("flipY", instance.flipY, ES3Type_bool.Instance); + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("shadowCastingMode", instance.shadowCastingMode); + writer.WriteProperty("receiveShadows", instance.receiveShadows, ES3Type_bool.Instance); + writer.WriteProperty("sharedMaterials", instance.sharedMaterials); + writer.WriteProperty("lightmapIndex", instance.lightmapIndex, ES3Type_int.Instance); + writer.WriteProperty("realtimeLightmapIndex", instance.realtimeLightmapIndex, ES3Type_int.Instance); + writer.WriteProperty("lightmapScaleOffset", instance.lightmapScaleOffset, ES3Type_Vector4.Instance); + writer.WriteProperty("motionVectorGenerationMode", instance.motionVectorGenerationMode); + writer.WriteProperty("realtimeLightmapScaleOffset", instance.realtimeLightmapScaleOffset, ES3Type_Vector4.Instance); + writer.WriteProperty("lightProbeUsage", instance.lightProbeUsage); + writer.WriteProperty("lightProbeProxyVolumeOverride", instance.lightProbeProxyVolumeOverride, ES3Type_GameObject.Instance); + writer.WriteProperty("probeAnchor", instance.probeAnchor, ES3Type_Transform.Instance); + writer.WriteProperty("reflectionProbeUsage", instance.reflectionProbeUsage); + writer.WriteProperty("sortingLayerName", instance.sortingLayerName, ES3Type_string.Instance); + writer.WriteProperty("sortingLayerID", instance.sortingLayerID, ES3Type_int.Instance); + writer.WriteProperty("sortingOrder", instance.sortingOrder, ES3Type_int.Instance); + } + + protected override void ReadComponent(ES3Reader reader, object obj) + { + var instance = (UnityEngine.SpriteRenderer)obj; + foreach(string propertyName in reader.Properties) + { + switch(propertyName) + { + case "sprite": + instance.sprite = reader.Read(ES3Type_Sprite.Instance); + break; + case "color": + instance.color = reader.Read(ES3Type_Color.Instance); + break; + case "flipX": + instance.flipX = reader.Read(ES3Type_bool.Instance); + break; + case "flipY": + instance.flipY = reader.Read(ES3Type_bool.Instance); + break; + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "shadowCastingMode": + instance.shadowCastingMode = reader.Read(); + break; + case "receiveShadows": + instance.receiveShadows = reader.Read(ES3Type_bool.Instance); + break; + case "sharedMaterials": + instance.sharedMaterials = reader.Read(); + break; + case "lightmapIndex": + instance.lightmapIndex = reader.Read(ES3Type_int.Instance); + break; + case "realtimeLightmapIndex": + instance.realtimeLightmapIndex = reader.Read(ES3Type_int.Instance); + break; + case "lightmapScaleOffset": + instance.lightmapScaleOffset = reader.Read(ES3Type_Vector4.Instance); + break; + case "motionVectorGenerationMode": + instance.motionVectorGenerationMode = reader.Read(); + break; + case "realtimeLightmapScaleOffset": + instance.realtimeLightmapScaleOffset = reader.Read(ES3Type_Vector4.Instance); + break; + case "lightProbeUsage": + instance.lightProbeUsage = reader.Read(); + break; + case "lightProbeProxyVolumeOverride": + instance.lightProbeProxyVolumeOverride = reader.Read(ES3Type_GameObject.Instance); + break; + case "probeAnchor": + instance.probeAnchor = reader.Read(ES3Type_Transform.Instance); + break; + case "reflectionProbeUsage": + instance.reflectionProbeUsage = reader.Read(); + break; + case "sortingLayerName": + instance.sortingLayerName = reader.Read(ES3Type_string.Instance); + break; + case "sortingLayerID": + instance.sortingLayerID = reader.Read(ES3Type_int.Instance); + break; + case "sortingOrder": + instance.sortingOrder = reader.Read(ES3Type_int.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } + + public class ES3Type_SpriteRendererArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_SpriteRendererArray() : base(typeof(UnityEngine.SpriteRenderer[]), ES3Type_SpriteRenderer.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SpriteRenderer.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SpriteRenderer.cs.meta new file mode 100644 index 000000000..bf5ee740e --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SpriteRenderer.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f9f81f5e14f124e78877586f0b733864 +timeCreated: 1519132301 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SpriteRenderer.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SubEmittersModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SubEmittersModule.cs new file mode 100644 index 000000000..5b5a085e7 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_SubEmittersModule.cs @@ -0,0 +1,86 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("properties", "systems", "types")] + public class ES3Type_SubEmittersModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_SubEmittersModule() : base(typeof(UnityEngine.ParticleSystem.SubEmittersModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.SubEmittersModule)obj; + + var seProperties = new ParticleSystemSubEmitterProperties[instance.subEmittersCount]; + var seSystems = new ParticleSystem[instance.subEmittersCount]; + var seTypes = new ParticleSystemSubEmitterType[instance.subEmittersCount]; + + for(int i=0; i(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.SubEmittersModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.SubEmittersModule)obj; + + ParticleSystemSubEmitterProperties[] seProperties = null; + ParticleSystem[] seSystems = null; + ParticleSystemSubEmitterType[] seTypes = null; + + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "properties": + seProperties = reader.Read(new ES3ArrayType(typeof(ParticleSystemSubEmitterProperties[]))); + break; + case "systems": + seSystems = reader.Read(); + break; + case "types": + seTypes = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + + if(seProperties != null) + { + for(int i=0; i(ES3Reader reader, object obj) + { + if (obj.GetType () == typeof(Texture2D)) + ES3Type_Texture2D.Instance.ReadInto(reader, obj); + else + throw new NotSupportedException ("Textures of type "+obj.GetType()+" are not currently supported."); + } + + public override object Read(ES3Reader reader) + { + return ES3Type_Texture2D.Instance.Read(reader); + } + } + + public class ES3Type_TextureArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_TextureArray() : base(typeof(UnityEngine.Texture[]), ES3Type_Texture.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture.cs.meta new file mode 100644 index 000000000..33e723a9a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 615cb2cf345144f858b56b5ff6690a9f +timeCreated: 1536306115 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture2D.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture2D.cs new file mode 100644 index 000000000..1a06a8c6d --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture2D.cs @@ -0,0 +1,132 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("filterMode", "anisoLevel", "wrapMode", "mipMapBias", "rawTextureData")] + public class ES3Type_Texture2D : ES3UnityObjectType + { + public static ES3Type Instance = null; + + public ES3Type_Texture2D() : base(typeof(Texture2D)){ Instance = this; } + + protected override void WriteUnityObject(object obj, ES3Writer writer) + { + var instance = (Texture2D)obj; + + if (!IsReadable(instance)) + { + ES3Internal.ES3Debug.LogWarning("Easy Save cannot save the pixels or properties of this Texture because it is not read/write enabled, so Easy Save will store it by reference instead. To save the pixel data, check the 'Read/Write Enabled' checkbox in the Texture's import settings. Clicking this warning will take you to the Texture, assuming it is not generated at runtime.", instance); + return; + } + + writer.WriteProperty("width", instance.width, ES3Type_int.Instance); + writer.WriteProperty("height", instance.height, ES3Type_int.Instance); + writer.WriteProperty("format", instance.format); + writer.WriteProperty("mipmapCount", instance.mipmapCount, ES3Type_int.Instance); + writer.WriteProperty("filterMode", instance.filterMode); + writer.WriteProperty("anisoLevel", instance.anisoLevel, ES3Type_int.Instance); + writer.WriteProperty("wrapMode", instance.wrapMode); + writer.WriteProperty("mipMapBias", instance.mipMapBias, ES3Type_float.Instance); + writer.WriteProperty("rawTextureData", instance.GetRawTextureData(), ES3Type_byteArray.Instance); + } + + protected override void ReadUnityObject(ES3Reader reader, object obj) + { + if (obj == null) + return; + + if (obj.GetType() == typeof(RenderTexture)) + { + ES3Type_RenderTexture.Instance.ReadInto(reader, obj); + return; + } + + var instance = (Texture2D)obj; + + if (!IsReadable(instance)) + ES3Internal.ES3Debug.LogWarning($"Easy Save cannot load the properties or pixels for this Texture {instance.name} because it is not read/write enabled, so it will be loaded by reference. To load the properties and pixels for this Texture, check the 'Read/Write Enabled' checkbox in its Import Settings.", instance); + + foreach (string propertyName in reader.Properties) + { + // If this Texture isn't readable, we should skip past all of its properties. + if (!IsReadable(instance)) + { + reader.Skip(); + continue; + } + + switch (propertyName) + { + case "filterMode": + instance.filterMode = reader.Read(); + break; + case "anisoLevel": + instance.anisoLevel = reader.Read(ES3Type_int.Instance); + break; + case "wrapMode": + instance.wrapMode = reader.Read(); + break; + case "mipMapBias": + instance.mipMapBias = reader.Read(ES3Type_float.Instance); + break; + case "rawTextureData": + // LoadRawTextureData requires that the correct width, height, TextureFormat and mipMaps are set before being called. + // If an error occurs here, it's likely that we're using LoadInto to load into a Texture which differs in these values. + // In this case, LoadInto should be avoided and Load should be used instead. + if (!IsReadable(instance)) + { + ES3Internal.ES3Debug.LogWarning("Easy Save cannot load the pixels of this Texture because it is not read/write enabled, so Easy Save will ignore the pixel data. To load the pixel data, check the 'Read/Write Enabled' checkbox in the Texture's import settings. Clicking this warning will take you to the Texture, assuming it is not generated at runtime.", instance); + reader.Skip(); + } + else + { + try + { + instance.LoadRawTextureData(reader.Read(ES3Type_byteArray.Instance)); + instance.Apply(); + } + catch(Exception e) + { + ES3Internal.ES3Debug.LogError("Easy Save encountered an error when trying to load this Texture, please see the end of this messasge for the error. This is most likely because the Texture format of the instance we are loading into is different to the Texture we saved.\n"+e.ToString(), instance); + } + } + break; + default: + reader.Skip(); + break; + } + } + } + + protected override object ReadUnityObject(ES3Reader reader) + { + var instance = new Texture2D( reader.Read(ES3Type_int.Instance), // Property name has already been read in ES3UnityObjectType, so we only need to read the value. + reader.ReadProperty(ES3Type_int.Instance), + reader.ReadProperty(), + (reader.ReadProperty(ES3Type_int.Instance) > 1)); + ReadObject(reader, instance); + return instance; + } + + protected bool IsReadable(Texture2D instance) + { + #if UNITY_2018_3_OR_NEWER + return instance != null && instance.isReadable; + #else + return true; + #endif + } + } + + public class ES3Type_Texture2DArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Texture2DArray() : base(typeof(Texture2D[]), ES3Type_Texture2D.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture2D.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture2D.cs.meta new file mode 100644 index 000000000..4057758c4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture2D.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 86d4ce7d016c24d0489778178716fa3d +timeCreated: 1519132290 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Texture2D.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TextureSheetAnimationModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TextureSheetAnimationModule.cs new file mode 100644 index 000000000..2a4608d74 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TextureSheetAnimationModule.cs @@ -0,0 +1,112 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "numTilesX", "numTilesY", "animation", "useRandomRow", "frameOverTime", "frameOverTimeMultiplier", "startFrame", "startFrameMultiplier", "cycleCount", "rowIndex", "uvChannelMask", "flipU", "flipV")] + public class ES3Type_TextureSheetAnimationModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_TextureSheetAnimationModule() : base(typeof(UnityEngine.ParticleSystem.TextureSheetAnimationModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.TextureSheetAnimationModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("numTilesX", instance.numTilesX, ES3Type_int.Instance); + writer.WriteProperty("numTilesY", instance.numTilesY, ES3Type_int.Instance); + writer.WriteProperty("animation", instance.animation); +#if UNITY_2019_1_OR_NEWER + writer.WriteProperty("useRandomRow", instance.rowMode); +#else + writer.WriteProperty("useRandomRow", instance.useRandomRow, ES3Type_bool.Instance); +#endif + writer.WriteProperty("frameOverTime", instance.frameOverTime, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("frameOverTimeMultiplier", instance.frameOverTimeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("startFrame", instance.startFrame, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("startFrameMultiplier", instance.startFrameMultiplier, ES3Type_float.Instance); + writer.WriteProperty("cycleCount", instance.cycleCount, ES3Type_int.Instance); + writer.WriteProperty("rowIndex", instance.rowIndex, ES3Type_int.Instance); + writer.WriteProperty("uvChannelMask", instance.uvChannelMask); + //writer.WriteProperty("flipU", instance.flipU, ES3Type_float.Instance); + //writer.WriteProperty("flipV", instance.flipV, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.TextureSheetAnimationModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.TextureSheetAnimationModule)obj; + string propertyName; + while ((propertyName = reader.ReadPropertyName()) != null) + { + switch (propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "numTilesX": + instance.numTilesX = reader.Read(ES3Type_int.Instance); + break; + case "numTilesY": + instance.numTilesY = reader.Read(ES3Type_int.Instance); + break; + case "animation": + instance.animation = reader.Read(); + break; +#if UNITY_2019_1_OR_NEWER + case "rowMode": + instance.rowMode = reader.Read(); + break; +#else + case "useRandomRow": + instance.useRandomRow = reader.Read(ES3Type_bool.Instance); + break; +#endif + case "frameOverTime": + instance.frameOverTime = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "frameOverTimeMultiplier": + instance.frameOverTimeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "startFrame": + instance.startFrame = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "startFrameMultiplier": + instance.startFrameMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "cycleCount": + instance.cycleCount = reader.Read(ES3Type_int.Instance); + break; + case "rowIndex": + instance.rowIndex = reader.Read(ES3Type_int.Instance); + break; + case "uvChannelMask": + instance.uvChannelMask = reader.Read(); + break; + /*case "flipU": + instance.flipU = reader.Read(ES3Type_float.Instance); + break; + case "flipV": + instance.flipV = reader.Read(ES3Type_float.Instance); + break;*/ + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TextureSheetAnimationModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TextureSheetAnimationModule.cs.meta new file mode 100644 index 000000000..2b7c6c701 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TextureSheetAnimationModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 059be233c84494c01be9f48a8be8e89e +timeCreated: 1519132279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TextureSheetAnimationModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TrailModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TrailModule.cs new file mode 100644 index 000000000..4009e68a3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TrailModule.cs @@ -0,0 +1,106 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "ratio", "lifetime", "lifetimeMultiplier", "minVertexDistance", "textureMode", "worldSpace", "dieWithParticles", "sizeAffectsWidth", "sizeAffectsLifetime", "inheritParticleColor", "colorOverLifetime", "widthOverTrail", "widthOverTrailMultiplier", "colorOverTrail")] + public class ES3Type_TrailModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_TrailModule() : base(typeof(UnityEngine.ParticleSystem.TrailModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.TrailModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("ratio", instance.ratio, ES3Type_float.Instance); + writer.WriteProperty("lifetime", instance.lifetime, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("lifetimeMultiplier", instance.lifetimeMultiplier, ES3Type_float.Instance); + writer.WriteProperty("minVertexDistance", instance.minVertexDistance, ES3Type_float.Instance); + writer.WriteProperty("textureMode", instance.textureMode); + writer.WriteProperty("worldSpace", instance.worldSpace, ES3Type_bool.Instance); + writer.WriteProperty("dieWithParticles", instance.dieWithParticles, ES3Type_bool.Instance); + writer.WriteProperty("sizeAffectsWidth", instance.sizeAffectsWidth, ES3Type_bool.Instance); + writer.WriteProperty("sizeAffectsLifetime", instance.sizeAffectsLifetime, ES3Type_bool.Instance); + writer.WriteProperty("inheritParticleColor", instance.inheritParticleColor, ES3Type_bool.Instance); + writer.WriteProperty("colorOverLifetime", instance.colorOverLifetime, ES3Type_MinMaxGradient.Instance); + writer.WriteProperty("widthOverTrail", instance.widthOverTrail, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("widthOverTrailMultiplier", instance.widthOverTrailMultiplier, ES3Type_float.Instance); + writer.WriteProperty("colorOverTrail", instance.colorOverTrail, ES3Type_MinMaxGradient.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.TrailModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.TrailModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "ratio": + instance.ratio = reader.Read(ES3Type_float.Instance); + break; + case "lifetime": + instance.lifetime = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "lifetimeMultiplier": + instance.lifetimeMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "minVertexDistance": + instance.minVertexDistance = reader.Read(ES3Type_float.Instance); + break; + case "textureMode": + instance.textureMode = reader.Read(); + break; + case "worldSpace": + instance.worldSpace = reader.Read(ES3Type_bool.Instance); + break; + case "dieWithParticles": + instance.dieWithParticles = reader.Read(ES3Type_bool.Instance); + break; + case "sizeAffectsWidth": + instance.sizeAffectsWidth = reader.Read(ES3Type_bool.Instance); + break; + case "sizeAffectsLifetime": + instance.sizeAffectsLifetime = reader.Read(ES3Type_bool.Instance); + break; + case "inheritParticleColor": + instance.inheritParticleColor = reader.Read(ES3Type_bool.Instance); + break; + case "colorOverLifetime": + instance.colorOverLifetime = reader.Read(ES3Type_MinMaxGradient.Instance); + break; + case "widthOverTrail": + instance.widthOverTrail = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "widthOverTrailMultiplier": + instance.widthOverTrailMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "colorOverTrail": + instance.colorOverTrail = reader.Read(ES3Type_MinMaxGradient.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TrailModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TrailModule.cs.meta new file mode 100644 index 000000000..85a605609 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TrailModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 56ad47761f46a452b84d1efde61de80c +timeCreated: 1519132285 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TrailModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TriggerModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TriggerModule.cs new file mode 100644 index 000000000..20a4a5b74 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TriggerModule.cs @@ -0,0 +1,70 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "inside", "outside", "enter", "exit", "radiusScale")] + public class ES3Type_TriggerModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_TriggerModule() : base(typeof(UnityEngine.ParticleSystem.TriggerModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.TriggerModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("inside", instance.inside); + writer.WriteProperty("outside", instance.outside); + writer.WriteProperty("enter", instance.enter); + writer.WriteProperty("exit", instance.exit); + writer.WriteProperty("radiusScale", instance.radiusScale, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.TriggerModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.TriggerModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "inside": + instance.inside = reader.Read(); + break; + case "outside": + instance.outside = reader.Read(); + break; + case "enter": + instance.enter = reader.Read(); + break; + case "exit": + instance.exit = reader.Read(); + break; + case "radiusScale": + instance.radiusScale = reader.Read(ES3Type_float.Instance); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TriggerModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TriggerModule.cs.meta new file mode 100644 index 000000000..ac45aa076 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TriggerModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 7cf3d6f533d04498fb0601796570f998 +timeCreated: 1519132289 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_TriggerModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2.cs new file mode 100644 index 000000000..3ba779dc1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2.cs @@ -0,0 +1,40 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("x", "y")] + public class ES3Type_Vector2 : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Vector2() : base(typeof(Vector2)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Vector2 casted = (Vector2)obj; + writer.WriteProperty("x", casted.x, ES3Type_float.Instance); + writer.WriteProperty("y", casted.y, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Vector2( reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } + + public class ES3Type_Vector2Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Vector2Array() : base(typeof(Vector2[]), ES3Type_Vector2.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2.cs.meta new file mode 100644 index 000000000..6f7086813 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 6cdccaf6dcab94e45931bf15d2a90640 +timeCreated: 1519132287 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2Int.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2Int.cs new file mode 100644 index 000000000..79f8e0307 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2Int.cs @@ -0,0 +1,42 @@ +#if UNITY_2017_2_OR_NEWER +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("x", "y")] + public class ES3Type_Vector2Int : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Vector2Int() : base(typeof(Vector2Int)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Vector2Int casted = (Vector2Int)obj; + writer.WriteProperty("x", casted.x, ES3Type_int.Instance); + writer.WriteProperty("y", casted.y, ES3Type_int.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Vector2Int( reader.ReadProperty(ES3Type_int.Instance), + reader.ReadProperty(ES3Type_int.Instance)); + } + } + + public class ES3Type_Vector2IntArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Vector2IntArray() : base(typeof(Vector2Int[]), ES3Type_Vector2Int.Instance) + { + Instance = this; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2Int.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2Int.cs.meta new file mode 100644 index 000000000..a809a5a33 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2Int.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d4ce5526a479a4cdab37fa9c10dc3964 +timeCreated: 1519132287 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector2Int.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3.cs new file mode 100644 index 000000000..dd4da364c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3.cs @@ -0,0 +1,42 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3Properties("x", "y", "z")] + public class ES3Type_Vector3 : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Vector3() : base(typeof(Vector3)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Vector3 casted = (Vector3)obj; + writer.WriteProperty("x", casted.x, ES3Type_float.Instance); + writer.WriteProperty("y", casted.y, ES3Type_float.Instance); + writer.WriteProperty("z", casted.z, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Vector3( reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + } + + public class ES3Type_Vector3Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Vector3Array() : base(typeof(Vector3[]), ES3Type_Vector3.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3.cs.meta new file mode 100644 index 000000000..2a2600b5b --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 65ba0614942de49678702985ca4ca357 +timeCreated: 1519132287 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3Int.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3Int.cs new file mode 100644 index 000000000..552a81732 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3Int.cs @@ -0,0 +1,44 @@ +#if UNITY_2017_2_OR_NEWER +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("x", "y", "z")] + public class ES3Type_Vector3Int : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Vector3Int() : base(typeof(Vector3Int)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Vector3Int casted = (Vector3Int)obj; + writer.WriteProperty("x", casted.x, ES3Type_int.Instance); + writer.WriteProperty("y", casted.y, ES3Type_int.Instance); + writer.WriteProperty("z", casted.z, ES3Type_int.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Vector3Int( reader.ReadProperty(ES3Type_int.Instance), + reader.ReadProperty(ES3Type_int.Instance), + reader.ReadProperty(ES3Type_int.Instance)); + } + } + + public class ES3Type_Vector3IntArray : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Vector3IntArray() : base(typeof(Vector3Int[]), ES3Type_Vector3Int.Instance) + { + Instance = this; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3Int.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3Int.cs.meta new file mode 100644 index 000000000..67645a84a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3Int.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 7e3a1d8e6e8144f71a61562fc86b2b2c +timeCreated: 1519132287 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector3Int.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector4.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector4.cs new file mode 100644 index 000000000..5782c438a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector4.cs @@ -0,0 +1,50 @@ +using System; +using UnityEngine; +using System.Collections.Generic; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("x", "y", "z", "w")] + public class ES3Type_Vector4 : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_Vector4() : base(typeof(Vector4)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + Vector4 casted = (Vector4)obj; + writer.WriteProperty("x", casted.x, ES3Type_float.Instance); + writer.WriteProperty("y", casted.y, ES3Type_float.Instance); + writer.WriteProperty("z", casted.z, ES3Type_float.Instance); + writer.WriteProperty("w", casted.w, ES3Type_float.Instance); + } + + public override object Read(ES3Reader reader) + { + return new Vector4( reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance), + reader.ReadProperty(ES3Type_float.Instance)); + } + + public static bool Equals(Vector4 a, Vector4 b) + { + return (Mathf.Approximately(a.x,b.x) && Mathf.Approximately(a.y,b.y) && Mathf.Approximately(a.z,b.z) && Mathf.Approximately(a.w,b.w)); + } + } + + public class ES3Type_Vector4Array : ES3ArrayType + { + public static ES3Type Instance; + + public ES3Type_Vector4Array() : base(typeof(Vector4[]), ES3Type_Vector4.Instance) + { + Instance = this; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector4.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector4.cs.meta new file mode 100644 index 000000000..32460c2a1 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector4.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 970684b89a8e24102a42f02a5ed59a66 +timeCreated: 1519132292 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_Vector4.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_VelocityOverLifetimeModule.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_VelocityOverLifetimeModule.cs new file mode 100644 index 000000000..c72cd72be --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_VelocityOverLifetimeModule.cs @@ -0,0 +1,77 @@ +using System; +using UnityEngine; + +namespace ES3Types +{ + [UnityEngine.Scripting.Preserve] + [ES3PropertiesAttribute("enabled", "x", "y", "z", "xMultiplier", "yMultiplier", "zMultiplier", "space")] + public class ES3Type_VelocityOverLifetimeModule : ES3Type + { + public static ES3Type Instance = null; + + public ES3Type_VelocityOverLifetimeModule() : base(typeof(UnityEngine.ParticleSystem.VelocityOverLifetimeModule)) + { + Instance = this; + } + + public override void Write(object obj, ES3Writer writer) + { + var instance = (UnityEngine.ParticleSystem.VelocityOverLifetimeModule)obj; + + writer.WriteProperty("enabled", instance.enabled, ES3Type_bool.Instance); + writer.WriteProperty("x", instance.x, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("y", instance.y, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("z", instance.z, ES3Type_MinMaxCurve.Instance); + writer.WriteProperty("xMultiplier", instance.xMultiplier, ES3Type_float.Instance); + writer.WriteProperty("yMultiplier", instance.yMultiplier, ES3Type_float.Instance); + writer.WriteProperty("zMultiplier", instance.zMultiplier, ES3Type_float.Instance); + writer.WriteProperty("space", instance.space); + } + + public override object Read(ES3Reader reader) + { + var instance = new UnityEngine.ParticleSystem.VelocityOverLifetimeModule(); + ReadInto(reader, instance); + return instance; + } + + public override void ReadInto(ES3Reader reader, object obj) + { + var instance = (UnityEngine.ParticleSystem.VelocityOverLifetimeModule)obj; + string propertyName; + while((propertyName = reader.ReadPropertyName()) != null) + { + switch(propertyName) + { + case "enabled": + instance.enabled = reader.Read(ES3Type_bool.Instance); + break; + case "x": + instance.x = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "y": + instance.y = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "z": + instance.z = reader.Read(ES3Type_MinMaxCurve.Instance); + break; + case "xMultiplier": + instance.xMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "yMultiplier": + instance.yMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "zMultiplier": + instance.zMultiplier = reader.Read(ES3Type_float.Instance); + break; + case "space": + instance.space = reader.Read(); + break; + default: + reader.Skip(); + break; + } + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_VelocityOverLifetimeModule.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_VelocityOverLifetimeModule.cs.meta new file mode 100644 index 000000000..ffba771c4 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_VelocityOverLifetimeModule.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: a4884364ae36a4916a8bc2bd6e5e9683 +timeCreated: 1519132293 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/ES3Type_VelocityOverLifetimeModule.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/UnityObjectType.cs b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/UnityObjectType.cs new file mode 100644 index 000000000..976750e8a --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/UnityObjectType.cs @@ -0,0 +1,18 @@ +using UnityEngine; +using System.Collections.Generic; + +public class UnityObjectType : MonoBehaviour +{ + public List objs; // Assign to this in the Editor + + void Start() + { + if(!ES3.KeyExists("this")) + ES3.Save("this", this); + else + ES3.LoadInto("this", this); + + foreach(var obj in objs) + Debug.Log(obj); + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/UnityObjectType.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/UnityObjectType.cs.meta new file mode 100644 index 000000000..a26023ecb --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/UnityObjectType.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 871617aa2d4bcfe428d9625de50b8f65 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Types/Unity Types/UnityObjectType.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Web.meta b/Assets/Plugins/Easy Save 3/Scripts/Web.meta new file mode 100644 index 000000000..454424f35 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Web.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a31790717a932467d825f30d95c413bb +folderAsset: yes +timeCreated: 1500448038 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Web/ES3Cloud.cs b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3Cloud.cs new file mode 100644 index 000000000..7f7fac299 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3Cloud.cs @@ -0,0 +1,757 @@ +#if !DISABLE_WEB +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using UnityEngine.Networking; +using System; +using ES3Internal; + +#if UNITY_VISUAL_SCRIPTING +[Unity.VisualScripting.IncludeInSettings(true)] +#elif BOLT_VISUAL_SCRIPTING +[Ludiq.IncludeInSettings(true)] +#endif +public class ES3Cloud : ES3WebClass +{ + int timeout = 20; + + /// Constructs an new ES3Cloud object with the given URL to an ES3.php file. + /// The URL of the ES3.php file on your server you want to use. + public ES3Cloud(string url, string apiKey) : base(url, apiKey) + { + } + + public ES3Cloud(string url, string apiKey, int timeout) : base(url, apiKey) + { + this.timeout = timeout; + } + + #region Downloaded Data Handling + + /// The encoding to use when encoding and decoding data as strings. + public System.Text.Encoding encoding = System.Text.Encoding.UTF8; + + + private byte[] _data = null; + /// Any downloaded data, if applicable. This may also contain an error message, so you should check the 'ifError' variable before reading data. + public byte[] data + { + get{ return _data; } + } + + /// The downloaded data as text, decoded using the encoding specified by the 'encoding' variable. + public string text + { + get + { + if(data == null) + return null; + return encoding.GetString(data); + } + } + + /// An array of filenames downloaded from the server. This must only be accessed after calling the 'DownloadFilenames' routine. + public string[] filenames + { + get + { + if(data == null || data.Length == 0) + return new string[0]; + return text.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries); + } + + } + + /// A UTC DateTime object representing the date and time a file on the server was last updated. This should only be called after calling the 'DownloadTimestamp' routine. + public DateTime timestamp + { + get + { + if(data == null || data.Length == 0) + return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + + double timestamp; + if(!double.TryParse(text, out timestamp)) + throw new FormatException("Could not convert downloaded data to a timestamp. Data downloaded was: " + text); + + return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(timestamp); + } + } + + #endregion + + #region Sync + + /// Synchronises the default file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + public IEnumerator Sync() + { + return Sync(new ES3Settings(), "", ""); + } + + /// Synchronises a local file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + /// The relative or absolute path of the local file we want to synchronise. + public IEnumerator Sync(string filePath) + { + return Sync(new ES3Settings(filePath), "", ""); + } + + /// Synchronises a local file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + /// The relative or absolute path of the local file we want to synchronise. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator Sync(string filePath, string user) + { + return Sync(new ES3Settings(filePath), user, ""); + } + + /// Synchronises a local file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + /// The relative or absolute path of the local file we want to synchronise. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator Sync(string filePath, string user, string password) + { + return Sync(new ES3Settings(filePath), user, password); + } + + /// Synchronises a local file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + /// The relative or absolute path of the local file we want to synchronise. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + /// The settings we want to use to override the default settings. + public IEnumerator Sync(string filePath, ES3Settings settings) + { + return Sync(new ES3Settings(filePath, settings), "", ""); + } + + /// Synchronises a local file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + /// The relative or absolute path of the file we want to use. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The settings we want to use to override the default settings. + public IEnumerator Sync(string filePath, string user, ES3Settings settings) + { + return Sync(new ES3Settings(filePath, settings), user, ""); + } + + /// Synchronises a local file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + /// The relative or absolute path of the local file we want to synchronise. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + /// The settings we want to use to override the default settings. + public IEnumerator Sync(string filePath, string user, string password, ES3Settings settings) + { + return Sync(new ES3Settings(filePath, settings), user, password); + } + + /// Synchronises a local file with a file on the server. If the file on the server is newer than the local copy, the local file will be overwritten by the file on the server. Otherwise, the file on the server will be overwritten. + /// The settings we want to use to override the default settings. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + private IEnumerator Sync(ES3Settings settings, string user, string password) + { + Reset(); + + yield return DownloadFile(settings, user, password, GetFileTimestamp(settings)); + + if(errorCode == 3) + { + // Clear the error. + Reset(); + + // File does not exist on server, or is older than locally stored data, so upload the local file to the server if it exists. + if(ES3.FileExists(settings)) + yield return UploadFile(settings, user, password); + } + + isDone = true; + } + + #endregion + + #region UploadFile + + /// Uploads the default file to the server, overwriting any existing file. + public IEnumerator UploadFile() + { + return UploadFile(new ES3Settings(), "", ""); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// The relative or absolute path of the file we want to use. + public IEnumerator UploadFile(string filePath) + { + return UploadFile(new ES3Settings(filePath), "", ""); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// The relative or absolute path of the file we want to use. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator UploadFile(string filePath, string user) + { + return UploadFile(new ES3Settings(filePath), user, ""); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// The relative or absolute path of the file we want to use. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator UploadFile(string filePath, string user, string password) + { + return UploadFile(new ES3Settings(filePath), user, password); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// The relative or absolute path of the file we want to use. + /// The settings we want to use to override the default settings. + public IEnumerator UploadFile(string filePath, ES3Settings settings) + { + return UploadFile(new ES3Settings(filePath, settings), "", ""); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// The relative or absolute path of the file we want to use. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The settings we want to use to override the default settings. + public IEnumerator UploadFile(string filePath, string user, ES3Settings settings) + { + return UploadFile(new ES3Settings(filePath, settings), user, ""); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// The relative or absolute path of the file we want to use. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + /// The settings we want to use to override the default settings. + public IEnumerator UploadFile(string filePath, string user, string password, ES3Settings settings) + { + return UploadFile(new ES3Settings(filePath, settings), user, password); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// An ES3File containing the data we want to upload. + public IEnumerator UploadFile(ES3File es3File) + { + return UploadFile(es3File.GetBytes(), es3File.settings, "", "", DateTimeToUnixTimestamp(DateTime.Now)); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// An ES3File containing the data we want to upload. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator UploadFile(ES3File es3File, string user) + { + return UploadFile(es3File.GetBytes(), es3File.settings, user, "", DateTimeToUnixTimestamp(DateTime.Now)); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// An ES3File containing the data we want to upload. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator UploadFile(ES3File es3File, string user, string password) + { + return UploadFile(es3File.GetBytes(), es3File.settings, user, password, DateTimeToUnixTimestamp(DateTime.Now)); + } + + /// Uploads a local file to the server, overwriting any existing file. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator UploadFile(ES3Settings settings, string user, string password) + { + return UploadFile(ES3.LoadRawBytes(settings), settings, user, password); + } + + public IEnumerator UploadFile(byte[] bytes, ES3Settings settings, string user, string password) + { + return UploadFile(bytes, settings, user, password, DateTimeToUnixTimestamp(ES3.GetTimestamp(settings))); + } + + private IEnumerator UploadFile(byte[] bytes, ES3Settings settings, string user, string password, long fileTimestamp) + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("putFile", settings.path); + form.AddField("timestamp", fileTimestamp.ToString()); + form.AddField("user", GetUser(user, password)); + form.AddBinaryData("data", bytes, "data.dat", "multipart/form-data"); + + using(var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + yield return SendWebRequest(webRequest); + HandleError(webRequest, true); + } + + isDone = true; + } + + #endregion + + #region DownloadFile + + /// Downloads the default file from the server and saves it locally, overwriting the existing local default file. An error is returned if the file does not exist. + public IEnumerator DownloadFile() + { + return DownloadFile(new ES3Settings(), "", "", 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The relative or absolute path of the file we want to download. + public IEnumerator DownloadFile(string filePath) + { + return DownloadFile(new ES3Settings(filePath), "", "", 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The relative or absolute path of the file we want to download. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator DownloadFile(string filePath, string user) + { + return DownloadFile(new ES3Settings(filePath), user, "", 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The relative or absolute path of the file we want to download. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator DownloadFile(string filePath, string user, string password) + { + return DownloadFile(new ES3Settings(filePath), user, password, 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The relative or absolute path of the file we want to download. + /// The settings we want to use to override the default settings. + public IEnumerator DownloadFile(string filePath, ES3Settings settings) + { + return DownloadFile(new ES3Settings(filePath, settings), "", "", 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The relative or absolute path of the file we want to download. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The settings we want to use to override the default settings. + public IEnumerator DownloadFile(string filePath, string user, ES3Settings settings) + { + return DownloadFile(new ES3Settings(filePath, settings), user, "", 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The relative or absolute path of the file we want to download. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + /// The settings we want to use to override the default settings. + public IEnumerator DownloadFile(string filePath, string user, string password, ES3Settings settings) + { + return DownloadFile(new ES3Settings(filePath, settings), user, password, 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The ES3File we want to load our data into. The filename in the settings of the ES3File will be used when downloading. + public IEnumerator DownloadFile(ES3File es3File) + { + return DownloadFile(es3File, "", "", 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The ES3File we want to load our data into. The filename in the settings of the ES3File will be used when downloading. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator DownloadFile(ES3File es3File, string user) + { + return DownloadFile(es3File, user, "", 0); + } + + /// Downloads a file from the server and saves it locally, overwriting any existing local file. An error is returned if the file does not exist. + /// The ES3File we want to load our data into. The filename in the settings of the ES3File will be used when downloading. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator DownloadFile(ES3File es3File, string user, string password) + { + return DownloadFile(es3File, user, password, 0); + } + + private IEnumerator DownloadFile(ES3File es3File, string user, string password, long timestamp) + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("getFile", es3File.settings.path); + form.AddField("user", GetUser(user, password)); + if(timestamp > 0) + form.AddField("timestamp", timestamp.ToString()); + + using(var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + + yield return SendWebRequest(webRequest); + + if(!HandleError(webRequest, false)) + { + if(webRequest.downloadedBytes > 0) + { + es3File.Clear(); + es3File.SaveRaw(webRequest.downloadHandler.data); + } + else + { + error = string.Format("File {0} was not found on the server.", es3File.settings.path); + errorCode = 3; + } + } + } + + isDone = true; + } + + private IEnumerator DownloadFile(ES3Settings settings, string user, string password, long timestamp) + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("getFile", settings.path); + form.AddField("user", GetUser(user, password)); + if(timestamp > 0) + form.AddField("timestamp", timestamp.ToString()); + + using(var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + + yield return SendWebRequest(webRequest); + if(!HandleError(webRequest, false)) + { + if(webRequest.downloadedBytes > 0) + { + ES3.SaveRaw(webRequest.downloadHandler.data, settings); + } + else + { + error = string.Format("File {0} was not found on the server.", settings.path); + errorCode = 3; + } + } + } + + isDone = true; + } + + #endregion + + #region DeleteFile + + /// Deletes the default file from the server. An error is *not* returned if the file does not exist. + public IEnumerator DeleteFile() + { + return DeleteFile(new ES3Settings(), "", ""); + } + + /// Deletes a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + public IEnumerator DeleteFile(string filePath) + { + return DeleteFile(new ES3Settings(filePath), "", ""); + } + + /// Deletes a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator DeleteFile(string filePath, string user) + { + return DeleteFile(new ES3Settings(filePath), user, ""); + } + + /// Deletes a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator DeleteFile(string filePath, string user, string password) + { + return DeleteFile(new ES3Settings(filePath), user, password); + } + + /// Deletes a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The settings we want to use to override the default settings. + public IEnumerator DeleteFile(string filePath, ES3Settings settings) + { + return DeleteFile(new ES3Settings(filePath, settings), "", ""); + } + + /// Deletes a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The settings we want to use to override the default settings. + public IEnumerator DeleteFile(string filePath, string user, ES3Settings settings) + { + return DeleteFile(new ES3Settings(filePath, settings), user, ""); + } + + /// Deletes a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + /// The settings we want to use to override the default settings. + public IEnumerator DeleteFile(string filePath, string user, string password, ES3Settings settings) + { + return DeleteFile(new ES3Settings(filePath, settings), user, password); + } + + private IEnumerator DeleteFile(ES3Settings settings, string user, string password) + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("deleteFile", settings.path); + form.AddField("user", GetUser(user, password)); + + using(var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + + yield return SendWebRequest(webRequest); + HandleError(webRequest, true); + } + + isDone = true; + } + + #endregion + + #region RenameFile + + /// Renames a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + public IEnumerator RenameFile(string filePath, string newFilePath) + { + return RenameFile(new ES3Settings(filePath), new ES3Settings(newFilePath), "", ""); + } + + /// Renames a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator RenameFile(string filePath, string newFilePath, string user) + { + return RenameFile(new ES3Settings(filePath), new ES3Settings(newFilePath), user, ""); + } + + /// Renames a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator RenameFile(string filePath, string newFilePath, string user, string password) + { + return RenameFile(new ES3Settings(filePath), new ES3Settings(newFilePath), user, password); + } + + /// Renames a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The settings we want to use to override the default settings. + public IEnumerator RenameFile(string filePath, string newFilePath, ES3Settings settings) + { + return RenameFile(new ES3Settings(filePath, settings), new ES3Settings(newFilePath, settings), "", ""); + } + + /// Renames a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The settings we want to use to override the default settings. + public IEnumerator RenameFile(string filePath, string newFilePath, string user, ES3Settings settings) + { + return RenameFile(new ES3Settings(filePath, settings), new ES3Settings(newFilePath, settings), user, ""); + } + + /// Renames a file from the server. An error is *not* returned if the file does not exist. + /// The relative or absolute path of the file we want to delete. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + /// The settings we want to use to override the default settings. + public IEnumerator RenameFile(string filePath, string newFilePath, string user, string password, ES3Settings settings) + { + return RenameFile(new ES3Settings(filePath, settings), new ES3Settings(newFilePath, settings), user, password); + } + + private IEnumerator RenameFile(ES3Settings settings, ES3Settings newSettings, string user, string password) + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("renameFile", settings.path); + form.AddField("newFilename", newSettings.path); + form.AddField("user", GetUser(user, password)); + + using(var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + + yield return SendWebRequest(webRequest); + HandleError(webRequest, true); + } + + isDone = true; + } + + #endregion + + #region DownloadFilenames + + /// Downloads the names of all of the files on the server. Downloaded filenames are stored in the 'filenames' variable of the ES3Cloud object. + /// The unique name of the user we want to find the filenames of. + /// The password of the user we want to find the filenames of. + public IEnumerator DownloadFilenames(string user="", string password="") + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("getFilenames", ""); + form.AddField("user", GetUser(user, password)); + + using(var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + + yield return SendWebRequest(webRequest); + if(!HandleError(webRequest, false)) + _data = webRequest.downloadHandler.data; + } + + isDone = true; + } + + /// Downloads the names of all of the files on the server. Downloaded filenames are stored in the 'filenames' variable of the ES3Cloud object. + /// The unique name of the user we want to find the filenames of. + /// The password of the user we want to find the filenames of. + /// A search pattern containing '%' or '_' wildcards where '%' represents zero, one, or multiple characters, and '_' represents a single character. + public IEnumerator SearchFilenames(string searchPattern, string user="", string password="") + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("getFilenames", ""); + form.AddField("user", GetUser(user, password)); + if (!string.IsNullOrEmpty(searchPattern)) + form.AddField("pattern", searchPattern); + + using (var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + + yield return SendWebRequest(webRequest); + if (!HandleError(webRequest, false)) + _data = webRequest.downloadHandler.data; + } + + isDone = true; + } + + #endregion + + #region DownloadTimestamp + + /// Downloads the timestamp representing when the server file was last updated. The downloaded timestamp is stored in the 'timestamp' variable of the ES3Cloud object. + public IEnumerator DownloadTimestamp() + { + return DownloadTimestamp(new ES3Settings(), "", ""); + } + + /// Downloads the timestamp representing when the server file was last updated. The downloaded timestamp is stored in the 'timestamp' variable of the ES3Cloud object. + /// The relative or absolute path of the file we want to get the timestamp of. + public IEnumerator DownloadTimestamp(string filePath) + { + return DownloadTimestamp(new ES3Settings(filePath), "", ""); + } + + /// Downloads the timestamp representing when the server file was last updated. The downloaded timestamp is stored in the 'timestamp' variable of the ES3Cloud object. + /// The relative or absolute path of the file we want to get the timestamp of. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + public IEnumerator DownloadTimestamp(string filePath, string user) + { + return DownloadTimestamp(new ES3Settings(filePath), user, ""); + } + + /// Downloads the timestamp representing when the server file was last updated. The downloaded timestamp is stored in the 'timestamp' variable of the ES3Cloud object. + /// The relative or absolute path of the file we want to get the timestamp of. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + public IEnumerator DownloadTimestamp(string filePath, string user, string password) + { + return DownloadTimestamp(new ES3Settings(filePath), user, password); + } + + /// Downloads the timestamp representing when the server file was last updated. The downloaded timestamp is stored in the 'timestamp' variable of the ES3Cloud object. + /// The relative or absolute path of the file we want to get the timestamp of. + /// The settings we want to use to override the default settings. + public IEnumerator DownloadTimestamp(string filePath, ES3Settings settings) + { + return DownloadTimestamp(new ES3Settings(filePath, settings), "", ""); + } + + /// Downloads the timestamp representing when the server file was last updated. The downloaded timestamp is stored in the 'timestamp' variable of the ES3Cloud object. + /// The relative or absolute path of the file we want to get the timestamp of. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The settings we want to use to override the default settings. + public IEnumerator DownloadTimestamp(string filePath, string user, ES3Settings settings) + { + return DownloadTimestamp(new ES3Settings(filePath, settings), user, ""); + } + + /// Downloads the timestamp representing when the server file was last updated. The downloaded timestamp is stored in the 'timestamp' variable of the ES3Cloud object. + /// The relative or absolute path of the file we want to get the timestamp of. + /// The unique name of the user this file belongs to, if the file isn't globally accessible. + /// The password of the user this file belongs to. + /// The settings we want to use to override the default settings. + public IEnumerator DownloadTimestamp(string filePath, string user, string password, ES3Settings settings) + { + return DownloadTimestamp(new ES3Settings(filePath, settings), user, password); + } + + private IEnumerator DownloadTimestamp(ES3Settings settings, string user, string password) + { + Reset(); + + var form = CreateWWWForm(); + form.AddField("apiKey", apiKey); + form.AddField("getTimestamp", settings.path); + form.AddField("user", GetUser(user, password)); + + using(var webRequest = UnityWebRequest.Post(url, form)) + { + webRequest.timeout = timeout; + + yield return SendWebRequest(webRequest); + if(!HandleError(webRequest, false)) + _data = webRequest.downloadHandler.data; + } + + isDone = true; + } + + #endregion + + #region Internal Methods + + private long DateTimeToUnixTimestamp(DateTime dt) + { + return Convert.ToInt64((dt.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds); + } + + private long GetFileTimestamp(ES3Settings settings) + { + return DateTimeToUnixTimestamp(ES3.GetTimestamp(settings)); + } + + protected override void Reset() + { + _data = null; + base.Reset(); + } + + #endregion +} + +#endif \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Scripts/Web/ES3Cloud.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3Cloud.cs.meta new file mode 100644 index 000000000..dcf859056 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3Cloud.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: e639a3698613946f0951d104a492f138 +timeCreated: 1500448165 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Web/ES3Cloud.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs new file mode 100644 index 000000000..b9d8465f8 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs @@ -0,0 +1,148 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Networking; + +namespace ES3Internal +{ + public class ES3WebClass + { + protected string url; + protected string apiKey; + + protected List> formData = new List>(); + protected UnityWebRequest _webRequest = null; + + + public bool isDone = false; + public float uploadProgress + { + get + { + if(_webRequest == null) + return 0; + else + return _webRequest.uploadProgress; + } + } + + public float downloadProgress + { + get + { + if(_webRequest == null) + return 0; + else + return _webRequest.downloadProgress; + } + } + + #region Error Handling + + /// An error message, if an error occurred. + public string error = null; + /// This is set to true if an error occurred while performing an operation. + public bool isError{ get{ return !string.IsNullOrEmpty(error) || errorCode > 0; } } + /// The error code relating to the error, if one occurred. If it's a server error, this will return the HTTP error code. + public long errorCode = 0; + + public static bool IsNetworkError(UnityWebRequest www) + { +#if UNITY_2020_1_OR_NEWER + return www.result == UnityWebRequest.Result.ConnectionError; +#else + return www.isNetworkError; +#endif + } + +#endregion + + protected ES3WebClass(string url, string apiKey) + { + this.url = url; + this.apiKey = apiKey; + } + +#region Other Methods + + /// Adds POST data to any requests sent by this ES3Cloud object. Use this if you are sending data to a custom script on your server. + /// The name of the POST field we want to add. + /// The string value of the POST field we want to add. + public void AddPOSTField(string fieldName, string value) + { + formData.Add(new KeyValuePair(fieldName, value)); + } + +#endregion + +#region Internal Methods + + protected string GetUser(string user, string password) + { + if(string.IsNullOrEmpty(user)) + return ""; + // Final user string is a combination of the username and password, and hashed if encryption is enabled. + if(!string.IsNullOrEmpty(password)) + user += password; + +#if !DISABLE_ENCRYPTION && !DISABLE_HASHING + user = ES3Internal.ES3Hash.SHA1Hash(user); +#endif + return user; + } + + protected WWWForm CreateWWWForm() + { + var form = new WWWForm(); + foreach(var kvp in formData) + form.AddField(kvp.Key, kvp.Value); + return form; + } + + /* Checks if an error occurred and sets relevant details, and returns true if an error did occur */ + protected bool HandleError(UnityWebRequest webRequest, bool errorIfDataIsDownloaded) + { + if(IsNetworkError(webRequest)) + { + errorCode = 1; + error = "Error: " + webRequest.error; + } + else if(webRequest.responseCode >= 400) + { + errorCode = webRequest.responseCode; + if(string.IsNullOrEmpty(webRequest.downloadHandler.text)) + error = string.Format("Server returned {0} error with no message", webRequest.responseCode); + else + error = webRequest.downloadHandler.text; + } + else if(errorIfDataIsDownloaded && webRequest.downloadedBytes > 0) + { + errorCode = 2; + error = "Server error: '" + webRequest.downloadHandler.text + "'"; + } + else + return false; + return true; + } + + protected IEnumerator SendWebRequest(UnityWebRequest webRequest) + { + _webRequest = webRequest; +#if !UNITY_2017_2_OR_NEWER + yield return webRequest.Send(); +#else + yield return webRequest.SendWebRequest(); +#endif + } + + protected virtual void Reset() + { + error = null; + errorCode = 0; + isDone = false; + } + + +#endregion + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs.meta new file mode 100644 index 000000000..4acbc6591 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 338b6919533e14c37afa52e7b0a91a6d +timeCreated: 1502349814 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers.meta b/Assets/Plugins/Easy Save 3/Scripts/Writers.meta new file mode 100644 index 000000000..e86772167 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f81e45d5acda04835b484a483f4aa7e0 +folderAsset: yes +timeCreated: 1499764821 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Binary.cs b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Binary.cs new file mode 100644 index 000000000..cadd1e7cc --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Binary.cs @@ -0,0 +1,121 @@ +using System.Collections; +using System.Collections.Generic; +using System; + +namespace ES3Internal +{ + internal enum ES3SpecialByte : byte + { + Null = 0, + Bool = 1, + Byte = 2, + Sbyte = 3, + Char = 4, + Decimal = 5, + Double = 6, + Float = 7, + Int = 8, + Uint = 9, + Long = 10, + Ulong = 11, + Short = 12, + Ushort = 13, + String = 14, + ByteArray = 15, + Collection = 128, + Dictionary = 129, + CollectionItem = 130, + Object = 254, + Terminator = 255 + } + + internal static class ES3Binary + { + internal const string ObjectTerminator = "."; + + internal static readonly Dictionary IdToType = new Dictionary() + { + { ES3SpecialByte.Null, null }, + { ES3SpecialByte.Bool, typeof(bool)}, + { ES3SpecialByte.Byte, typeof(byte)}, + { ES3SpecialByte.Sbyte, typeof(sbyte)}, + { ES3SpecialByte.Char, typeof(char)}, + { ES3SpecialByte.Decimal, typeof(decimal)}, + { ES3SpecialByte.Double, typeof(double)}, + { ES3SpecialByte.Float, typeof(float)}, + { ES3SpecialByte.Int, typeof(int)}, + { ES3SpecialByte.Uint, typeof(uint)}, + { ES3SpecialByte.Long, typeof(long)}, + { ES3SpecialByte.Ulong, typeof(ulong)}, + { ES3SpecialByte.Short, typeof(short)}, + { ES3SpecialByte.Ushort, typeof(ushort)}, + { ES3SpecialByte.String, typeof(string)}, + { ES3SpecialByte.ByteArray, typeof(byte[])} + }; + + internal static readonly Dictionary TypeToId = new Dictionary() + { + { typeof(bool), ES3SpecialByte.Bool}, + { typeof(byte), ES3SpecialByte.Byte}, + { typeof(sbyte), ES3SpecialByte.Sbyte}, + { typeof(char), ES3SpecialByte.Char}, + { typeof(decimal), ES3SpecialByte.Decimal}, + { typeof(double), ES3SpecialByte.Double}, + { typeof(float), ES3SpecialByte.Float}, + { typeof(int), ES3SpecialByte.Int}, + { typeof(uint), ES3SpecialByte.Uint}, + { typeof(long), ES3SpecialByte.Long}, + { typeof(ulong), ES3SpecialByte.Ulong}, + { typeof(short), ES3SpecialByte.Short}, + { typeof(ushort), ES3SpecialByte.Ushort}, + { typeof(string), ES3SpecialByte.String}, + { typeof(byte[]), ES3SpecialByte.ByteArray} + }; + + internal static ES3SpecialByte TypeToByte(Type type) + { + ES3SpecialByte b; + if (TypeToId.TryGetValue(type, out b)) + return b; + return ES3SpecialByte.Object; + } + + internal static Type ByteToType(ES3SpecialByte b) + { + return ByteToType((byte)b); + } + + internal static Type ByteToType(byte b) + { + Type type; + if (IdToType.TryGetValue((ES3SpecialByte)b, out type)) + return type; + return typeof(object); + } + + internal static bool IsPrimitive(ES3SpecialByte b) + { + switch(b) + { + case ES3SpecialByte.Bool: + case ES3SpecialByte.Byte: + case ES3SpecialByte.Sbyte: + case ES3SpecialByte.Char: + case ES3SpecialByte.Decimal: + case ES3SpecialByte.Double: + case ES3SpecialByte.Float: + case ES3SpecialByte.Int: + case ES3SpecialByte.Uint: + case ES3SpecialByte.Long: + case ES3SpecialByte.Ulong: + case ES3SpecialByte.Short: + case ES3SpecialByte.Ushort: + case ES3SpecialByte.String: + case ES3SpecialByte.ByteArray: + return true; + default: + return false; + } + } + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Binary.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Binary.cs.meta new file mode 100644 index 000000000..989ab9d3f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Binary.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9398c7a61f9679e41af5e48cac61f763 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Binary.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3BinaryWriter.cs b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3BinaryWriter.cs new file mode 100644 index 000000000..3850d284c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3BinaryWriter.cs @@ -0,0 +1,4 @@ +/* + * BinaryWriter is not implemented. + * See this post for more info: https://moodkie.com/forum/viewtopic.php?p=7478#p7478 + */ diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3BinaryWriter.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3BinaryWriter.cs.meta new file mode 100644 index 000000000..6da484f97 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3BinaryWriter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 890d1774e6bacdc43bf99692dfc5360a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Writers/ES3BinaryWriter.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3CacheWriter.cs b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3CacheWriter.cs new file mode 100644 index 000000000..537480ab5 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3CacheWriter.cs @@ -0,0 +1,157 @@ +using System.Collections.Generic; +using System.Collections; +using System.IO; +using System; +using UnityEngine; +using System.Text; +using System.Globalization; + +namespace ES3Internal +{ + internal class ES3CacheWriter : ES3Writer + { + ES3File es3File; + + internal ES3CacheWriter(ES3Settings settings, bool writeHeaderAndFooter, bool mergeKeys) : base(settings, writeHeaderAndFooter, mergeKeys) + { + es3File = new ES3File(settings); + } + + /* User-facing methods used when writing randomly-accessible Key-Value pairs. */ + #region Write(key, value) Methods + + /// Writes a value to the writer with the given key. + /// The key which uniquely identifies this value. + /// The value we want to write. + public override void Write(string key, object value) + { + es3File.Save(key, (T)value); + } + + internal override void Write(string key, Type type, byte[] value) + { + ES3Debug.LogError("Not implemented"); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public override void Write(Type type, string key, object value) + { + es3File.Save(key, value); + } + + #endregion + + + #region WritePrimitive(value) methods. + + internal override void WritePrimitive(int value) { } + internal override void WritePrimitive(float value) { } + internal override void WritePrimitive(bool value) { } + internal override void WritePrimitive(decimal value) { } + internal override void WritePrimitive(double value) { } + internal override void WritePrimitive(long value) { } + internal override void WritePrimitive(ulong value) { } + internal override void WritePrimitive(uint value) { } + internal override void WritePrimitive(byte value) { } + internal override void WritePrimitive(sbyte value) { } + internal override void WritePrimitive(short value) { } + internal override void WritePrimitive(ushort value) { } + internal override void WritePrimitive(char value) { } + internal override void WritePrimitive(byte[] value) { } + + + internal override void WritePrimitive(string value) + { + } + + internal override void WriteNull() + { + } + + #endregion + + #region Format-specific methods + + private static bool CharacterRequiresEscaping(char c) + { + return false; + } + + private void WriteCommaIfRequired() + { + } + + internal override void WriteRawProperty(string name, byte[] value) + { + } + + internal override void StartWriteFile() + { + } + + internal override void EndWriteFile() + { + } + + internal override void StartWriteProperty(string name) + { + base.StartWriteProperty(name); + } + + internal override void EndWriteProperty(string name) + { + } + + internal override void StartWriteObject(string name) + { + } + + internal override void EndWriteObject(string name) + { + } + + internal override void StartWriteCollection() + { + } + + internal override void EndWriteCollection() + { + } + + internal override void StartWriteCollectionItem(int index) + { + } + + internal override void EndWriteCollectionItem(int index) + { + } + + internal override void StartWriteDictionary() + { + } + + internal override void EndWriteDictionary() + { + } + + internal override void StartWriteDictionaryKey(int index) + { + } + + internal override void EndWriteDictionaryKey(int index) + { + } + + internal override void StartWriteDictionaryValue(int index) + { + } + + internal override void EndWriteDictionaryValue(int index) + { + } + + #endregion + + public override void Dispose(){} + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3CacheWriter.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3CacheWriter.cs.meta new file mode 100644 index 000000000..4bec21b6c --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3CacheWriter.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 52e4ba456dd1422409a95cdc6bf43f6b +timeCreated: 1499764822 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Writers/ES3CacheWriter.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3JSONWriter.cs b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3JSONWriter.cs new file mode 100644 index 000000000..9e2fc2bd3 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3JSONWriter.cs @@ -0,0 +1,233 @@ +using System.Collections.Generic; +using System.Collections; +using System.IO; +using System; +using UnityEngine; +using System.Text; +using System.Globalization; + +namespace ES3Internal +{ + internal class ES3JSONWriter : ES3Writer + { + internal StreamWriter baseWriter; + + private bool isFirstProperty = true; + + public ES3JSONWriter(Stream stream, ES3Settings settings) : this(stream, settings, true, true){} + + internal ES3JSONWriter(Stream stream, ES3Settings settings, bool writeHeaderAndFooter, bool mergeKeys) : base(settings, writeHeaderAndFooter, mergeKeys) + { + baseWriter = new StreamWriter(stream); + StartWriteFile(); + } + + #region WritePrimitive(value) methods. + + internal override void WritePrimitive(int value) { baseWriter.Write(value); } + internal override void WritePrimitive(float value) { baseWriter.Write(value.ToString("R", CultureInfo.InvariantCulture)); } + internal override void WritePrimitive(bool value) { baseWriter.Write(value ? "true" : "false"); } + internal override void WritePrimitive(decimal value) { baseWriter.Write(value.ToString(CultureInfo.InvariantCulture)); } + internal override void WritePrimitive(double value) { baseWriter.Write(value.ToString("R", CultureInfo.InvariantCulture)); } + internal override void WritePrimitive(long value) { baseWriter.Write(value); } + internal override void WritePrimitive(ulong value) { baseWriter.Write(value); } + internal override void WritePrimitive(uint value) { baseWriter.Write(value); } + internal override void WritePrimitive(byte value) { baseWriter.Write(System.Convert.ToInt32(value)); } + internal override void WritePrimitive(sbyte value) { baseWriter.Write(System.Convert.ToInt32(value)); } + internal override void WritePrimitive(short value) { baseWriter.Write(System.Convert.ToInt32(value)); } + internal override void WritePrimitive(ushort value) { baseWriter.Write(System.Convert.ToInt32(value)); } + internal override void WritePrimitive(char value) { WritePrimitive( value.ToString() ); } + internal override void WritePrimitive(byte[] value) { WritePrimitive( System.Convert.ToBase64String(value) ); } + + + internal override void WritePrimitive(string value) + { + baseWriter.Write("\""); + + // Escape any quotation marks within the string. + for(int i = 0; i keysToDelete = new HashSet(); + + internal bool writeHeaderAndFooter = true; + internal bool overwriteKeys = true; + + protected int serializationDepth = 0; + + #region ES3Writer Abstract Methods + + internal abstract void WriteNull(); + + internal virtual void StartWriteFile() + { + serializationDepth++; + } + + internal virtual void EndWriteFile() + { + serializationDepth--; + } + + internal virtual void StartWriteObject(string name) + { + serializationDepth++; + } + + internal virtual void EndWriteObject(string name) + { + serializationDepth--; + } + + internal virtual void StartWriteProperty(string name) + { + if (name == null) + throw new ArgumentNullException("Key or field name cannot be NULL when saving data."); + ES3Debug.Log(""+name +" (writing property)", null, serializationDepth); + } + + internal virtual void EndWriteProperty(string name) + { + } + + internal virtual void StartWriteCollection() + { + serializationDepth++; + } + + internal virtual void EndWriteCollection() + { + serializationDepth--; + } + + internal abstract void StartWriteCollectionItem(int index); + internal abstract void EndWriteCollectionItem(int index); + + internal abstract void StartWriteDictionary(); + internal abstract void EndWriteDictionary(); + internal abstract void StartWriteDictionaryKey(int index); + internal abstract void EndWriteDictionaryKey(int index); + internal abstract void StartWriteDictionaryValue(int index); + internal abstract void EndWriteDictionaryValue(int index); + + public abstract void Dispose(); + + #endregion + + #region ES3Writer Interface abstract methods + + internal abstract void WriteRawProperty(string name, byte[] bytes); + + internal abstract void WritePrimitive(int value); + internal abstract void WritePrimitive(float value); + internal abstract void WritePrimitive(bool value); + internal abstract void WritePrimitive(decimal value); + internal abstract void WritePrimitive(double value); + internal abstract void WritePrimitive(long value); + internal abstract void WritePrimitive(ulong value); + internal abstract void WritePrimitive(uint value); + internal abstract void WritePrimitive(byte value); + internal abstract void WritePrimitive(sbyte value); + internal abstract void WritePrimitive(short value); + internal abstract void WritePrimitive(ushort value); + internal abstract void WritePrimitive(char value); + internal abstract void WritePrimitive(string value); + internal abstract void WritePrimitive(byte[] value); + + #endregion + + protected ES3Writer(ES3Settings settings, bool writeHeaderAndFooter, bool overwriteKeys) + { + this.settings = settings; + this.writeHeaderAndFooter = writeHeaderAndFooter; + this.overwriteKeys = overwriteKeys; + } + + /* User-facing methods used when writing randomly-accessible Key-Value pairs. */ + #region Write(key, value) Methods + + internal virtual void Write(string key, Type type, byte[] value) + { + StartWriteProperty(key); + StartWriteObject(key); + WriteType(type); + WriteRawProperty("value", value); + EndWriteObject(key); + EndWriteProperty(key); + MarkKeyForDeletion(key); + } + + /// Writes a value to the writer with the given key. + /// The key which uniquely identifies this value. + /// The value we want to write. + public virtual void Write(string key, object value) + { + if (typeof(T) == typeof(object)) + { + if (value == null) + Write(typeof(System.Object), key, null); + else + Write(value.GetType(), key, value); + } + else + Write(typeof(T), key, value); + } + + /// Writes a value to the writer with the given key, using the given type rather than the generic parameter. + /// The key which uniquely identifies this value. + /// The value we want to write. + /// The type we want to use for the header, and to retrieve an ES3Type. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void Write(Type type, string key, object value) + { + StartWriteProperty(key); + StartWriteObject(key); + WriteType(type); + WriteProperty("value", value, ES3TypeMgr.GetOrCreateES3Type(type), settings.referenceMode); + EndWriteObject(key); + EndWriteProperty(key); + MarkKeyForDeletion(key); + } + + #endregion + + #region Write(value) & Write(value, ES3Type) Methods + + /// Writes a value to the writer. Note that this should only be called within an ES3Type. + /// The value we want to write. + /// Whether we want to write UnityEngine.Object fields and properties by reference, by value, or both. + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void Write(object value, ES3.ReferenceMode memberReferenceMode = ES3.ReferenceMode.ByRef) + { + if(value == null){ WriteNull(); return; } + + var type = ES3TypeMgr.GetOrCreateES3Type(value.GetType()); + Write(value, type, memberReferenceMode); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void Write(object value, ES3Type type, ES3.ReferenceMode memberReferenceMode = ES3.ReferenceMode.ByRef) + { + // Note that we have to check UnityEngine.Object types for null by casting it first, otherwise + // it will always return false. + if (value == null || (ES3Reflection.IsAssignableFrom(typeof(UnityEngine.Object), value.GetType()) && value as UnityEngine.Object == null)) + { + WriteNull(); + return; + } + + // Deal with System.Objects + if (type == null || type.type == typeof(object)) + { + var valueType = value.GetType(); + type = ES3TypeMgr.GetOrCreateES3Type(valueType); + + if(type == null) + throw new NotSupportedException("Types of " + valueType + " are not supported. Please see the Supported Types guide for more information: https://docs.moodkie.com/easy-save-3/es3-supported-types/"); + + if (!type.isCollection && !type.isDictionary) + { + StartWriteObject(null); + WriteType(valueType); + + type.Write(value, this); + + EndWriteObject(null); + return; + } + } + + if(type == null) + throw new ArgumentNullException("ES3Type argument cannot be null."); + if (type.isUnsupported) + { + if(type.isCollection || type.isDictionary) + throw new NotSupportedException(type.type + " is not supported because it's element type is not supported. Please see the Supported Types guide for more information: https://docs.moodkie.com/easy-save-3/es3-supported-types/"); + else + throw new NotSupportedException("Types of " + type.type + " are not supported. Please see the Supported Types guide for more information: https://docs.moodkie.com/easy-save-3/es3-supported-types/"); + } + + if (type.isPrimitive || type.isEnum) + type.Write(value, this); + else if (type.isCollection) + { + StartWriteCollection(); + ((ES3CollectionType)type).Write(value, this, memberReferenceMode); + EndWriteCollection(); + } + else if (type.isDictionary) + { + StartWriteDictionary(); + ((ES3DictionaryType)type).Write(value, this, memberReferenceMode); + EndWriteDictionary(); + } + else + { + if (type.type == typeof(GameObject)) + ((ES3Type_GameObject)type).saveChildren = settings.saveChildren; + + StartWriteObject(null); + + if (type.isES3TypeUnityObject) + ((ES3UnityObjectType)type).WriteObject(value, this, memberReferenceMode); + else + type.Write(value, this); + EndWriteObject(null); + } + } + + internal virtual void WriteRef(UnityEngine.Object obj) + { + WriteRef(obj, ES3ReferenceMgrBase.referencePropertyName); + } + + internal virtual void WriteRef(UnityEngine.Object obj, string propertyName) + { + WriteRef(obj, ES3ReferenceMgrBase.referencePropertyName, ES3ReferenceMgrBase.Current); + } + + internal virtual void WriteRef(UnityEngine.Object obj, string propertyName, ES3ReferenceMgrBase refMgr) + { + if (refMgr == null) + throw new InvalidOperationException($"An Easy Save 3 Manager is required to save references. To add one to your scene, exit playmode and go to Tools > Easy Save 3 > Add Manager to Scene. Object being saved by reference is {obj.GetType()} with name {obj.name}."); + + // Get the reference ID, if it exists, and store it. + long id = refMgr.Get(obj); + // If reference ID doesn't exist, create reference. + if (id == -1) + id = refMgr.Add(obj); + WriteProperty(propertyName, id.ToString()); + } + + #endregion + + /* Writes a property as a name value pair. */ + #region WriteProperty(name, value) methods + + /// Writes a field or property to the writer. Note that this should only be called within an ES3Type. + /// The name of the field or property. + /// The value we want to write. + public virtual void WriteProperty(string name, object value) + { + WriteProperty(name, value, settings.memberReferenceMode); + } + + /// Writes a field or property to the writer. Note that this should only be called within an ES3Type. + /// The name of the field or property. + /// The value we want to write. + /// Whether we want to write the property by reference, by value, or both. + public virtual void WriteProperty(string name, object value, ES3.ReferenceMode memberReferenceMode) + { + if (SerializationDepthLimitExceeded()) + return; + + StartWriteProperty(name); + Write(value, memberReferenceMode); + EndWriteProperty(name); + } + + /// Writes a field or property to the writer. Note that this should only be called within an ES3Type. + /// The name of the field or property. + /// The value we want to write. + public virtual void WriteProperty(string name, object value) + { + WriteProperty(name, value, ES3TypeMgr.GetOrCreateES3Type(typeof(T)), settings.memberReferenceMode); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void WriteProperty(string name, object value, ES3Type type) + { + WriteProperty(name, value, type, settings.memberReferenceMode); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void WriteProperty(string name, object value, ES3Type type, ES3.ReferenceMode memberReferenceMode) + { + if (SerializationDepthLimitExceeded()) + return; + + StartWriteProperty(name); + Write(value, type, memberReferenceMode); + EndWriteProperty(name); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void WritePropertyByRef(string name, UnityEngine.Object value) + { + if (SerializationDepthLimitExceeded()) + return; + + StartWriteProperty(name); + if(value == null) + { + WriteNull(); + return; }; + StartWriteObject(name); + WriteRef(value); + EndWriteObject(name); + EndWriteProperty(name); + } + + /// Writes a private property to the writer. Note that this should only be called within an ES3Type. + /// The name of the property. + /// The object containing the property we want to write. + public void WritePrivateProperty(string name, object objectContainingProperty) + { + var property = ES3Reflection.GetES3ReflectedProperty(objectContainingProperty.GetType(), name); + if(property.IsNull) + throw new MissingMemberException("A private property named "+ name + " does not exist in the type "+objectContainingProperty.GetType()); + WriteProperty(name, property.GetValue(objectContainingProperty), ES3TypeMgr.GetOrCreateES3Type(property.MemberType)); + } + + /// Writes a private field to the writer. Note that this should only be called within an ES3Type. + /// The name of the field. + /// The object containing the property we want to write. + public void WritePrivateField(string name, object objectContainingField) + { + var field = ES3Reflection.GetES3ReflectedMember(objectContainingField.GetType(), name); + if(field.IsNull) + throw new MissingMemberException("A private field named "+ name + " does not exist in the type "+objectContainingField.GetType()); + WriteProperty(name,field.GetValue(objectContainingField), ES3TypeMgr.GetOrCreateES3Type(field.MemberType)); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void WritePrivateProperty(string name, object objectContainingProperty, ES3Type type) + { + var property = ES3Reflection.GetES3ReflectedProperty(objectContainingProperty.GetType(), name); + if(property.IsNull) + throw new MissingMemberException("A private property named "+ name + " does not exist in the type "+objectContainingProperty.GetType()); + WriteProperty(name, property.GetValue(objectContainingProperty), type); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void WritePrivateField(string name, object objectContainingField, ES3Type type) + { + var field = ES3Reflection.GetES3ReflectedMember(objectContainingField.GetType(), name); + if(field.IsNull) + throw new MissingMemberException("A private field named "+ name + " does not exist in the type "+objectContainingField.GetType()); + WriteProperty(name,field.GetValue(objectContainingField), type); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void WritePrivatePropertyByRef(string name, object objectContainingProperty) + { + var property = ES3Reflection.GetES3ReflectedProperty(objectContainingProperty.GetType(), name); + if(property.IsNull) + throw new MissingMemberException("A private property named "+ name + " does not exist in the type "+objectContainingProperty.GetType()); + WritePropertyByRef(name, (UnityEngine.Object)property.GetValue(objectContainingProperty)); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void WritePrivateFieldByRef(string name, object objectContainingField) + { + var field = ES3Reflection.GetES3ReflectedMember(objectContainingField.GetType(), name); + if(field.IsNull) + throw new MissingMemberException("A private field named "+ name + " does not exist in the type "+objectContainingField.GetType()); + WritePropertyByRef(name, (UnityEngine.Object)field.GetValue(objectContainingField)); + } + + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public void WriteType(Type type) + { + WriteProperty(ES3Type.typeFieldName, ES3Reflection.GetTypeString(type)); + } + + #endregion + + #region Create methods + + /// Creates a new ES3Writer. + /// The relative or absolute path of the file we want to write to. + /// The settings we want to use to override the default settings. + public static ES3Writer Create(string filePath, ES3Settings settings) + { + return Create(new ES3Settings(filePath, settings)); + } + + /// Creates a new ES3Writer. + /// The settings we want to use to override the default settings. + public static ES3Writer Create(ES3Settings settings) + { + return Create(settings, true, true, false); + } + + // Implicit Stream Methods. + internal static ES3Writer Create(ES3Settings settings, bool writeHeaderAndFooter, bool overwriteKeys, bool append) + { + var stream = ES3Stream.CreateStream(settings, (append ? ES3FileMode.Append : ES3FileMode.Write)); + if(stream == null) + return null; + return Create(stream, settings, writeHeaderAndFooter, overwriteKeys); + } + + // Explicit Stream Methods. + + internal static ES3Writer Create(Stream stream, ES3Settings settings, bool writeHeaderAndFooter, bool overwriteKeys) + { + if(stream.GetType() == typeof(MemoryStream)) + { + settings = (ES3Settings)settings.Clone(); + settings.location = ES3.Location.InternalMS; + } + + // Get the baseWriter using the given Stream. + if(settings.format == ES3.Format.JSON) + return new ES3JSONWriter(stream, settings, writeHeaderAndFooter, overwriteKeys); + else + return null; + } + + #endregion + + /* + * Checks whether serialization depth limit has been exceeded + */ + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + protected bool SerializationDepthLimitExceeded() + { + if (serializationDepth > settings.serializationDepthLimit) + { + ES3Debug.LogWarning("Serialization depth limit of " + settings.serializationDepthLimit + " has been exceeded, indicating that there may be a circular reference.\nIf this is not a circular reference, you can increase the depth by going to Window > Easy Save 3 > Settings > Advanced Settings > Serialization Depth Limit"); + return true; + } + return false; + } + + /* + * Marks a key for deletion. + * When merging files, keys marked for deletion will not be included. + */ + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + public virtual void MarkKeyForDeletion(string key) + { + keysToDelete.Add(key); + } + + /* + * Merges the contents of the non-temporary file with this ES3Writer, + * ignoring any keys which are marked for deletion. + */ + protected void Merge() + { + using(var reader = ES3Reader.Create(settings)) + { + if(reader == null) + return; + Merge(reader); + } + } + + /* + * Merges the contents of the ES3Reader with this ES3Writer, + * ignoring any keys which are marked for deletion. + */ + protected void Merge(ES3Reader reader) + { + foreach(KeyValuePair kvp in reader.RawEnumerator) + if(!keysToDelete.Contains(kvp.Key) || kvp.Value.type == null) // Don't add keys whose data is of a type which no longer exists in the project. + Write(kvp.Key, kvp.Value.type.type, kvp.Value.bytes); + } + + /// Stores the contents of the writer and overwrites any existing keys if overwriting is enabled. + public virtual void Save() + { + Save(overwriteKeys); + } + + /// Stores the contents of the writer and overwrites any existing keys if overwriting is enabled. + /// Whether we should overwrite existing keys. + public virtual void Save(bool overwriteKeys) + { + if(overwriteKeys) + Merge(); + EndWriteFile(); + Dispose(); + + // If we're writing to a location which can become corrupted, rename the backup file to the file we want. + // This prevents corrupt data. + if(settings.location == ES3.Location.File || settings.location == ES3.Location.PlayerPrefs) + ES3IO.CommitBackup(settings); + } +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs.meta new file mode 100644 index 000000000..7ff410ce9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 09319508912db4c13bd924c6dc89f661 +timeCreated: 1499764821 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Writers/ES3Writer.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3XMLWriter.cs b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3XMLWriter.cs new file mode 100644 index 000000000..15561343f --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3XMLWriter.cs @@ -0,0 +1,4 @@ +public class ES3XMLWriter +{ + // Not implemented +} diff --git a/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3XMLWriter.cs.meta b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3XMLWriter.cs.meta new file mode 100644 index 000000000..e09f4abdf --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Scripts/Writers/ES3XMLWriter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3bac03a64f52fa94ea3bdcafecad8788 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Scripts/Writers/ES3XMLWriter.cs + uploadId: 689041 diff --git a/Assets/Plugins/Easy Save 3/Web.meta b/Assets/Plugins/Easy Save 3/Web.meta new file mode 100644 index 000000000..814186ea9 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Web.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b6fb14c673b174696ac55b1a7869f3a9 +folderAsset: yes +timeCreated: 1501844154 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Web/ES3Cloud.php b/Assets/Plugins/Easy Save 3/Web/ES3Cloud.php new file mode 100644 index 000000000..303071ece --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Web/ES3Cloud.php @@ -0,0 +1,307 @@ + PDO::ERRMODE_EXCEPTION)); +} +catch(PDOException $e) +{ + Error("Could not connect to database.", $e->getMessage(), 501); +} + +if(!isset($_POST["apiKey"])) + // Throw this message as an error so that if this is encountered via ES3Cloud it is put into an error state. + Error("ES3Cloud is functioning correctly.", "ES3Cloud is functioning correctly.", 403); + +if($_POST["apiKey"] != $api_key) + Error("Incorrect API Key", "Incorrect API Key", 403); + +// ----- GET FILE ----- +if(isset($_POST["getFile"])) +{ + $stmt = $db->prepare("SELECT $fileDataField FROM $tableName WHERE $filenameField = :filename AND $userField = :user AND $lastUpdatedField > :timestamp LIMIT 1"); + $stmt->bindParam(":filename", $_POST["getFile"]); + $postUser = GetPOSTUser(); + $stmt->bindParam(":user", $postUser); + $postTimestamp = GetPOSTTimestamp(); + $stmt->bindParam(":timestamp", $postTimestamp); + $stmt->execute(); + if($stmt->rowCount() > 0) + { + $data = $stmt->fetchColumn(); + // Manually set the content length so WWW.progress works. + header($_SERVER["SERVER_PROTOCOL"] . " 200 OK"); + header("Cache-Control: public"); + header("Content-Type: application/octet-stream"); + header("Content-Transfer-Encoding: Binary"); + header("Content-Length:".strlen($data)); + echo $data; + } +} + +// ----- PUT FILE ----- +else if(isset($_POST["putFile"])) +{ + // Get uploaded data. + $filePath = $_FILES["data"]["tmp_name"]; + + // If file doesn't exist or it contains no data, throw an error. + if(!file_exists($filePath)) + Error("Uploaded file does not exist.", "Uploaded file does not exist.", 400); + + // If file doesn't exist or it contains no data, throw an error. + if(filesize($filePath) == 0) + Error("Uploaded file is empty.", "Uploaded file is empty.", 400); + + $fp = fopen($filePath, 'rb'); + + $stmt = $db->prepare("INSERT INTO $tableName ($filenameField, $fileDataField, $userField, $lastUpdatedField) VALUES (:filename, :data, :user, :timestamp) ON DUPLICATE KEY UPDATE $fileDataField = VALUES($fileDataField), $lastUpdatedField = VALUES($lastUpdatedField)"); + $stmt->bindParam(":filename", $_POST["putFile"]); + $stmt->bindParam(":data", $fp, PDO::PARAM_LOB); + $postUser = GetPOSTUser(); + $stmt->bindParam(":user", $postUser); + $postTimestamp = GetPOSTTimestamp(); + $stmt->bindParam(":timestamp", $postTimestamp); + + $stmt->execute(); +} + +// ----- RENAME FILE ----- +else if(isset($_POST["renameFile"])) +{ + $stmt = $db->prepare("UPDATE $tableName SET $filenameField = :newFilename WHERE $filenameField = :filename AND $userField = :user"); + $stmt->bindParam(":filename", $_POST["renameFile"]); + $stmt->bindParam(":newFilename", $_POST["newFilename"]); + $postUser = GetPOSTUser(); + $stmt->bindParam(":user", $postUser); + $stmt->execute(); +} + +// ----- DELETE FILE ----- +else if(isset($_POST["deleteFile"])) +{ + + $stmt = $db->prepare("DELETE FROM $tableName WHERE $filenameField = :filename AND $userField = :user"); + $stmt->bindParam(":filename", $_POST["deleteFile"]); + $postUser = GetPOSTUser(); + $stmt->bindParam(":user", $postUser); + $stmt->execute(); +} + +// ----- GET FILENAMES WITH PATTERN ----- +else if(isset($_POST["getFilenames"]) && isset($_POST["pattern"])) +{ + echo "Here"; + $stmt = $db->prepare("SELECT $filenameField FROM $tableName WHERE $userField = :user AND $filenameField LIKE :pattern"); + $postUser = GetPOSTUser(); + $stmt->bindParam(":user", $postUser); + $stmt->bindParam(":pattern", $_POST["pattern"]); + $stmt->execute(); + $rows = $stmt->fetchAll(); + foreach($rows as $row) + echo $row[$filenameField] . ";"; +} + +// ----- GET FILENAMES ----- +else if(isset($_POST["getFilenames"])) +{ + $stmt = $db->prepare("SELECT $filenameField FROM $tableName WHERE $userField = :user"); + $postUser = GetPOSTUser(); + $stmt->bindParam(":user", $postUser); + $stmt->execute(); + $rows = $stmt->fetchAll(); + foreach($rows as $row) + echo $row[$filenameField] . ";"; +} + +// ----- GET TIMESTAMP ----- +else if(isset($_POST["getTimestamp"])) +{ + $stmt = $db->prepare("SELECT $lastUpdatedField FROM $tableName WHERE $filenameField = :filename AND $userField = :user LIMIT 1"); + $stmt->bindParam(":filename", $_POST["getTimestamp"]); + $postUser = GetPOSTUser(); + $stmt->bindParam(":user", $postUser); + $stmt->execute(); + if($stmt->rowCount() > 0) + echo $stmt->fetchColumn(); + else + Error("Could not get timestamp as file does not exist.", "Could not get timestamp as file does not exist.", 400); +} + +else + Error("No valid operation was specified", "No valid operation was specified", 400); + +// Close the connection to the database by nullifying the variable. +$db = null; + +function GetPOSTUser() +{ + return isset($_POST["user"]) ? $_POST["user"] : ""; +} + +function GetPOSTTimestamp() +{ + return isset($_POST["timestamp"]) ? $_POST["timestamp"] : 0; +} + +function Error($headerMsg, $msg, $code) +{ + header($headerMsg, true, $code); + print_r($msg); + if(isset($GLOBALS['db'])) + $GLOBALS['db'] = null; + exit(); +} + +// ------- INSTALL METHODS ------- + +function PreInstall() +{ + echo '
+

ES3 Cloud Installation

+

This will install the ES3 Cloud tables on your MySQL database, and add the required ES3Variables.php file to your server.

+

Please enter your database details below:

+

+

+ Database Host:
+ +
+
+ Database User:
+ +
+
+ Database Password:
+ +
+
+ Database Name:
+ +
+
+ +
+

+
'; +} + +function Install($dbHost, $dbUser, $dbPassword, $dbName, $tableName, $filenameField, $fileDataField, $userField, $lastUpdatedField) +{ + try + { + $db = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5)); + + $tableExists = $db->query("SELECT * FROM information_schema.tables WHERE table_schema = '$dbName' AND table_name = '$tableName' LIMIT 1;"); + if($tableExists->rowCount() == 0) + { + + // Create the table if it doesn't already exist. + try + { + $createTableQuery = +"CREATE TABLE IF NOT EXISTS `$tableName` ( +`$filenameField` varchar(200) NOT NULL, +`$fileDataField` longblob NOT NULL, +`$userField` varchar(64) NOT NULL, +`$lastUpdatedField` int(11) unsigned NOT NULL DEFAULT '0', +PRIMARY KEY (`$filenameField`,`$userField`) +) ENGINE=InnoDB COLLATE=utf8_unicode_ci CHARSET=utf8;"; + $db->query($createTableQuery); + } + catch (PDOException $e) + { + echo "

Could not create tables on database. Database threw error:

".$e->getMessage()."

+

To manually install the MySQL tables, please run the following SQL code on your database:

+
$createTableQuery
"; + exit(); + } + } + + + try + { + $apiKey = substr(md5(microtime()),rand(0,26),12); + $phpScript = +""; + + // Check that path is writable or file_put_contents is supported. + if(!function_exists("file_put_contents")) + { + ManuallyInstall($phpScript); + exit(); + } + else + { + file_put_contents("ES3Variables.php", $phpScript); + } + } + catch(Exception $e) + { + ManuallyInstall($phpScript); + exit(); + } + + if(!file_exists("ES3Variables.php")) + { + ManuallyInstall($phpScript); + exit(); + } + + echo + " +
+

Successfully installed ES3Cloud

+

IMPORTANT:
Please take note of your API key below. You will need to use it whenever using the API.

+

Your API key can also be found in the ES3Variables.php file which has just been installed.

+

API Key: $apiKey

+
+ "; + } + catch(PDOException $e) + { + echo "

Database could not be accessed with these details. The database returned the following error:

" . $e->getMessage() . "

"; + PreInstall(); + exit(); + } +} + +function ManuallyInstall($phpScript) +{ + echo "

Couldn't create PHP file on your server. This could be because file_put_contents is not supported on your server, or you do not have permission to write files to this folder on your server.

+

To manually install the PHP file, please create a file named ES3Variables.php in the same directory as your ES3.php file with the following contents:

+
$phpScript
+

After creating this file, installation will be complete.

"; +} + +?> \ No newline at end of file diff --git a/Assets/Plugins/Easy Save 3/Web/ES3Cloud.php.meta b/Assets/Plugins/Easy Save 3/Web/ES3Cloud.php.meta new file mode 100644 index 000000000..a18095e64 --- /dev/null +++ b/Assets/Plugins/Easy Save 3/Web/ES3Cloud.php.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 5b891e253fd1a40e999dd9064b8a0d6f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 768 + packageName: Easy Save - The Complete Save Data & Serializer System + packageVersion: 3.5.17 + assetPath: Assets/Plugins/Easy Save 3/Web/ES3Cloud.php + uploadId: 689041 diff --git a/Assets/Resources/Excel/CocktailDataTable.xlsx b/Assets/Resources/Excel/CocktailDataTable.xlsx index 30561422c..c6c4b275f 100644 Binary files a/Assets/Resources/Excel/CocktailDataTable.xlsx and b/Assets/Resources/Excel/CocktailDataTable.xlsx differ diff --git a/Assets/Resources/JSON/CocktailDataTable.json b/Assets/Resources/JSON/CocktailDataTable.json index 8844e9f3f..d3853999a 100644 --- a/Assets/Resources/JSON/CocktailDataTable.json +++ b/Assets/Resources/JSON/CocktailDataTable.json @@ -158,7 +158,7 @@ "IngredientIdx2": "LiquidD", "IngredientRatio2": 25, "IngredientIdx3": "LiquidE", - "IngredientRatio3": 100, + "IngredientRatio3": 50, "IngredientIdx4": "", "IngredientRatio4": 0, "IngredientIdx5": "", diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 3e10dcba7..3ec2a6d3f 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -13,7 +13,7 @@ PlayerSettings: useOnDemandResources: 0 accelerometerFrequency: 60 companyName: CapersUnity - productName: ActionHustle + productName: NewBlueWater defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} @@ -140,7 +140,7 @@ PlayerSettings: loadStoreDebugModeEnabled: 0 visionOSBundleVersion: 1.0 tvOSBundleVersion: 1.0 - bundleVersion: 0.3.2.5 + bundleVersion: 0.3.2.8 preloadedAssets: - {fileID: -944628639613478452, guid: 4ed6540e2f7ce234888adf8deff1f241, type: 3} metroInputSource: 0 @@ -747,23 +747,24 @@ PlayerSettings: webGLCloseOnQuit: 0 webWasm2023: 0 scriptingDefineSymbols: - Android: UNITY_POST_PROCESSING_STACK_V2;USE_NEW_INPUT;USE_CINEMACHINE;DOTWEEN - EmbeddedLinux: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN + Android: UNITY_POST_PROCESSING_STACK_V2;USE_NEW_INPUT;USE_CINEMACHINE;DOTWEEN;UNITY_VISUAL_SCRIPTING + EmbeddedLinux: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING GameCoreScarlett: DOTWEEN GameCoreXboxOne: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN - LinuxHeadlessSimulation: DOTWEEN - Nintendo Switch: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN - PS4: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN - PS5: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN - QNX: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN + LinuxHeadlessSimulation: DOTWEEN;UNITY_VISUAL_SCRIPTING + Nintendo Switch: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING + PS4: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING + PS5: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING + QNX: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING ReservedCFE: DOTWEEN;UNITY_POST_PROCESSING_STACK_V2 - Standalone: COZY_WEATHER;COZY_3_AND_UP;COZY_URP;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3;UNITY_POST_PROCESSING_STACK_V2;TMP_PRESENT;USE_NEW_INPUT;USE_CINEMACHINE;DOTWEEN - VisionOS: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN - WebGL: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN - Windows Store Apps: COZY_WEATHER;COZY_3_AND_UP;COZY_URP;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3;USE_NEW_INPUT;USE_CINEMACHINE;DOTWEEN - XboxOne: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN - iPhone: DOTWEEN - tvOS: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN + Server: UNITY_VISUAL_SCRIPTING + Standalone: COZY_WEATHER;COZY_3_AND_UP;COZY_URP;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3;UNITY_POST_PROCESSING_STACK_V2;TMP_PRESENT;USE_NEW_INPUT;USE_CINEMACHINE;DOTWEEN;UNITY_VISUAL_SCRIPTING + VisionOS: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING + WebGL: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING + Windows Store Apps: COZY_WEATHER;COZY_3_AND_UP;COZY_URP;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3;USE_NEW_INPUT;USE_CINEMACHINE;DOTWEEN;UNITY_VISUAL_SCRIPTING + XboxOne: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING + iPhone: DOTWEEN;UNITY_VISUAL_SCRIPTING + tvOS: UNITY_POST_PROCESSING_STACK_V2;DOTWEEN;UNITY_VISUAL_SCRIPTING additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: