From 025827dd1f757e1e1a72f9b3629b372627dc0654 Mon Sep 17 00:00:00 2001 From: yzx <ifeijia@qq.com> Date: Mon, 27 May 2024 17:55:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Framework.meta | 8 + Assets/Framework/GameLauncher.cs | 83 + Assets/Framework/GameLauncher.cs.meta | 11 + Assets/Framework/Scripts.meta | 8 + Assets/Framework/Scripts/Editor.meta | 8 + Assets/Framework/Scripts/Runtime.meta | 8 + Assets/Framework/Scripts/Runtime/Engine.meta | 8 + .../Scripts/Runtime/Engine/Core.meta | 8 + .../Scripts/Runtime/Engine/Core/ELogLevel.cs | 30 + .../Runtime/Engine/Core/ELogLevel.cs.meta | 11 + .../Runtime/Engine/Core/IActivatorServices.cs | 17 + .../Engine/Core/IActivatorServices.cs.meta | 11 + .../Scripts/Runtime/Engine/Core/IModule.cs | 27 + .../Runtime/Engine/Core/IModule.cs.meta | 11 + .../Engine/Core/MainThreadSyncContext.cs | 39 + .../Engine/Core/MainThreadSyncContext.cs.meta | 11 + .../Runtime/Engine/Core/ModuleSingleton.cs | 29 + .../Engine/Core/ModuleSingleton.cs.meta | 11 + .../Runtime/Engine/Core/MotionEngine.cs | 267 ++ .../Runtime/Engine/Core/MotionEngine.cs.meta | 11 + .../Scripts/Runtime/Engine/Core/MotionLog.cs | 49 + .../Runtime/Engine/Core/MotionLog.cs.meta | 11 + .../Runtime/Engine/Engine.Animation.meta | 8 + .../Engine/Engine.Animation/AnimBehaviour.cs | 161 ++ .../Engine.Animation/AnimBehaviour.cs.meta | 11 + .../Engine/Engine.Animation/AnimMixer.cs | 196 ++ .../Engine/Engine.Animation/AnimMixer.cs.meta | 11 + .../Engine/Engine.Animation/AnimNode.cs | 221 ++ .../Engine/Engine.Animation/AnimNode.cs.meta | 11 + .../Engine/Engine.Animation/AnimPlayable.cs | 228 ++ .../Engine.Animation/AnimPlayable.cs.meta | 11 + .../Engine/Engine.Animation/AnimState.cs | 99 + .../Engine/Engine.Animation/AnimState.cs.meta | 11 + .../Engine/Engine.Animation/EAnimStates.cs | 12 + .../Engine.Animation/EAnimStates.cs.meta | 11 + .../Scripts/Runtime/Engine/Engine.Camera.meta | 3 + .../Engine/Engine.Camera/CameraControl.meta | 3 + .../CameraControl/CameraControlComponent.cs | 236 ++ .../CameraControlComponent.cs.meta | 3 + .../CameraControl/ICameraController.cs | 4 + .../CameraControl/ICameraController.cs.meta | 3 + .../Runtime/Engine/Engine.Camera/Raycast.meta | 3 + .../Raycast/CameraRaycastComponent.cs | 37 + .../Raycast/CameraRaycastComponent.cs.meta | 3 + .../Engine.Camera/Raycast/IRaycastable.cs | 11 + .../Raycast/IRaycastable.cs.meta | 3 + .../Runtime/Engine/Engine.Console.meta | 8 + .../Engine/Engine.Console/ConsoleAttribute.cs | 25 + .../Engine.Console/ConsoleAttribute.cs.meta | 11 + .../Engine/Engine.Console/ConsoleGUI.cs | 139 + .../Engine/Engine.Console/ConsoleGUI.cs.meta | 11 + .../Engine/Engine.Console/DeveloperConsole.cs | 170 ++ .../Engine.Console/DeveloperConsole.cs.meta | 11 + .../Engine/Engine.Console/FPSCounter.cs | 42 + .../Engine/Engine.Console/FPSCounter.cs.meta | 11 + .../Engine/Engine.Console/IConsoleWindow.cs | 9 + .../Engine.Console/IConsoleWindow.cs.meta | 11 + .../Runtime/Engine/Engine.Network.meta | 8 + .../Runtime/Engine/Engine.Reference.meta | 8 + .../Engine/Engine.Reference/IReference.cs | 9 + .../Engine.Reference/IReference.cs.meta | 11 + .../Engine.Reference/ReferenceCollector.cs | 90 + .../ReferenceCollector.cs.meta | 11 + .../Engine/Engine.Reference/ReferencePool.cs | 115 + .../Engine.Reference/ReferencePool.cs.meta | 11 + .../Runtime/Engine/Engine.Utility.meta | 8 + .../Engine/Engine.Utility/AssemblyUtility.cs | 141 + .../Engine.Utility/AssemblyUtility.cs.meta | 11 + .../Engine/Engine.Utility/FileUtility.cs | 71 + .../Engine/Engine.Utility/FileUtility.cs.meta | 11 + .../Engine/Engine.Utility/HashUtility.cs | 170 ++ .../Engine/Engine.Utility/HashUtility.cs.meta | 11 + .../Runtime/Engine/Engine.Utility/Misc.meta | 8 + .../Engine/Engine.Utility/Misc/BitMask32.cs | 70 + .../Engine.Utility/Misc/BitMask32.cs.meta | 11 + .../Engine/Engine.Utility/Misc/BitMask64.cs | 74 + .../Engine.Utility/Misc/BitMask64.cs.meta | 11 + .../Engine.Utility/Misc/CRC32Algorithm.cs | 247 ++ .../Misc/CRC32Algorithm.cs.meta | 11 + .../Engine.Utility/Misc/ObfuscateDouble.cs | 110 + .../Misc/ObfuscateDouble.cs.meta | 11 + .../Engine.Utility/Misc/ObfuscateFloat.cs | 106 + .../Misc/ObfuscateFloat.cs.meta | 11 + .../Engine.Utility/Misc/ObfuscateInt.cs | 110 + .../Engine.Utility/Misc/ObfuscateInt.cs.meta | 11 + .../Engine.Utility/Misc/ObfuscateLong.cs | 102 + .../Engine.Utility/Misc/ObfuscateLong.cs.meta | 11 + .../Engine/Engine.Utility/Misc/Timer.cs | 203 ++ .../Engine/Engine.Utility/Misc/Timer.cs.meta | 11 + .../Engine/Engine.Utility/ProfilerUtility.cs | 56 + .../Engine.Utility/ProfilerUtility.cs.meta | 11 + Assets/Framework/Scripts/Runtime/Module.meta | 8 + .../Scripts/Runtime/Module/Extension.meta | 8 + .../Extension/UnityEngine_Object_Extension.cs | 12 + .../UnityEngine_Object_Extension.cs.meta | 11 + .../UnityEngine_RectTransform_Extension.cs | 39 + ...nityEngine_RectTransform_Extension.cs.meta | 11 + .../UnityEngine_Transform_Extension.cs | 97 + .../UnityEngine_Transform_Extension.cs.meta | 11 + .../Scripts/Runtime/Module/Module.Camera.meta | 3 + .../Module/Module.Camera/CameraManager.cs | 98 + .../Module.Camera/CameraManager.cs.meta | 11 + .../Runtime/Module/Module.Console.meta | 8 + .../Module.Console/ApplicationWindow.cs | 141 + .../Module.Console/ApplicationWindow.cs.meta | 11 + .../Module/Module.Console/GameLogWindow.cs | 136 + .../Module.Console/GameLogWindow.cs.meta | 11 + .../Module/Module.Console/GameModuleWindow.cs | 21 + .../Module.Console/GameModuleWindow.cs.meta | 11 + .../Module.Console/ReferencePoolWindow.cs | 29 + .../ReferencePoolWindow.cs.meta | 11 + .../Scripts/Runtime/Module/Module.Event.meta | 8 + .../Runtime/Module/Module.Event/EventGroup.cs | 49 + .../Module/Module.Event/EventGroup.cs.meta | 11 + .../Module/Module.Event/EventManager.cs | 198 ++ .../Module/Module.Event/EventManager.cs.meta | 11 + .../Module/Module.Event/IEventMessage.cs | 8 + .../Module/Module.Event/IEventMessage.cs.meta | 11 + .../Runtime/Module/Module.Network.meta | 8 + .../Runtime/Module/Module.Network/Modbus.meta | 3 + .../Module/Module.Network/WebRequest.meta | 8 + .../WebRequest/WebRequestManager.cs | 275 ++ .../WebRequest/WebRequestManager.cs.meta | 11 + .../Scripts/Runtime/MotionFramework.asmdef | 17 + .../Runtime/MotionFramework.asmdef.meta | 7 + Assets/Framework/ThirdParty.meta | 8 + .../ThirdParty/NaughtyAttributes.meta | 8 + .../ThirdParty/NaughtyAttributes/README.html | 1648 +++++++++++ .../NaughtyAttributes/README.html.meta | 7 + .../ThirdParty/NaughtyAttributes/Samples.meta | 8 + .../NaughtyAttributes/Samples/DemoScene.meta | 10 + .../Samples/DemoScene/DemoScene.unity | 2415 +++++++++++++++++ .../Samples/DemoScene/DemoScene.unity.meta | 9 + .../DemoScene/DemoSceneSettings.lighting | 63 + .../DemoScene/DemoSceneSettings.lighting.meta | 8 + .../Samples/DemoScene/TestAssets.meta | 10 + .../Samples/DemoScene/TestAssets/Cube.prefab | 93 + .../DemoScene/TestAssets/Cube.prefab.meta | 10 + .../DemoScene/TestAssets/DummyAnimation.anim | 169 ++ .../TestAssets/DummyAnimation.anim.meta | 8 + .../DummyAnimatorController.controller | 120 + .../DummyAnimatorController.controller.meta | 8 + .../TestAssets/NaughtyScriptableObject.asset | 17 + .../NaughtyScriptableObject.asset.meta | 10 + .../TestAssets/TestScriptableObjectA.asset | 17 + .../TestScriptableObjectA.asset.meta | 8 + .../TestAssets/TestScriptableObjectB.asset | 15 + .../TestScriptableObjectB.asset.meta | 8 + .../DemoScene/TestAssets/icon-github.png | Bin 0 -> 29968 bytes .../DemoScene/TestAssets/icon-github.png.meta | 127 + .../ThirdParty/NaughtyAttributes/Scripts.meta | 10 + .../NaughtyAttributes/Scripts/Core.meta | 10 + .../Scripts/Core/DrawerAttributes.meta | 8 + .../DrawerAttributes/AllowNestingAttribute.cs | 9 + .../AllowNestingAttribute.cs.meta | 11 + .../AnimatorParamAttribute.cs | 24 + .../AnimatorParamAttribute.cs.meta | 11 + .../DrawerAttributes/CurveRangeAttribute.cs | 30 + .../CurveRangeAttribute.cs.meta | 11 + .../Core/DrawerAttributes/DrawerAttribute.cs | 11 + .../DrawerAttributes/DrawerAttribute.cs.meta | 11 + .../DrawerAttributes/DropdownAttribute.cs | 57 + .../DropdownAttribute.cs.meta | 11 + .../DrawerAttributes/EnumFlagsAttribute.cs | 9 + .../EnumFlagsAttribute.cs.meta | 11 + .../Core/DrawerAttributes/Expandable.cs | 9 + .../Core/DrawerAttributes/Expandable.cs.meta | 11 + .../HorizontalLineAttribute.cs | 20 + .../HorizontalLineAttribute.cs.meta | 11 + .../Core/DrawerAttributes/InfoBoxAttribute.cs | 24 + .../DrawerAttributes/InfoBoxAttribute.cs.meta | 11 + .../DrawerAttributes/InputAxisAttribute.cs | 9 + .../InputAxisAttribute.cs.meta | 11 + .../Core/DrawerAttributes/LayerAttribute.cs | 9 + .../DrawerAttributes/LayerAttribute.cs.meta | 11 + .../DrawerAttributes/MinMaxSliderAttribute.cs | 17 + .../MinMaxSliderAttribute.cs.meta | 11 + .../DrawerAttributes/ProgressBarAttribute.cs | 37 + .../ProgressBarAttribute.cs.meta | 11 + .../ResizableTextAreaAttribute.cs | 9 + .../ResizableTextAreaAttribute.cs.meta | 11 + .../Core/DrawerAttributes/SceneAttribute.cs | 9 + .../DrawerAttributes/SceneAttribute.cs.meta | 11 + .../ShowAssetPreviewAttribute.cs | 20 + .../ShowAssetPreviewAttribute.cs.meta | 11 + .../DrawerAttributes/SortingLayerAttribute.cs | 9 + .../SortingLayerAttribute.cs.meta | 11 + .../Core/DrawerAttributes/TagAttribute.cs | 9 + .../DrawerAttributes/TagAttribute.cs.meta | 11 + .../Core/DrawerAttributes_SpecialCase.meta | 8 + .../ButtonAttribute.cs | 33 + .../ButtonAttribute.cs.meta | 11 + .../ReorderableListAttribute.cs | 9 + .../ReorderableListAttribute.cs.meta | 11 + .../ShowNativePropertyAttribute.cs | 9 + .../ShowNativePropertyAttribute.cs.meta | 11 + .../ShowNonSerializedFieldAttribute.cs | 9 + .../ShowNonSerializedFieldAttribute.cs.meta | 11 + .../SpecialCaseDrawerAttribute.cs | 8 + .../SpecialCaseDrawerAttribute.cs.meta | 11 + .../Scripts/Core/INaughtyAttribute.cs | 8 + .../Scripts/Core/INaughtyAttribute.cs.meta | 11 + .../Scripts/Core/MetaAttributes.meta | 8 + .../Core/MetaAttributes/BoxGroupAttribute.cs | 15 + .../MetaAttributes/BoxGroupAttribute.cs.meta | 11 + .../Core/MetaAttributes/DisableIfAttribute.cs | 26 + .../MetaAttributes/DisableIfAttribute.cs.meta | 11 + .../Core/MetaAttributes/EnableIfAttribute.cs | 26 + .../MetaAttributes/EnableIfAttribute.cs.meta | 11 + .../MetaAttributes/EnableIfAttributeBase.cs | 39 + .../EnableIfAttributeBase.cs.meta | 11 + .../Core/MetaAttributes/FoldoutAttribute.cs | 15 + .../MetaAttributes/FoldoutAttribute.cs.meta | 11 + .../Core/MetaAttributes/HideIfAttribute.cs | 26 + .../MetaAttributes/HideIfAttribute.cs.meta | 11 + .../Core/MetaAttributes/IGroupAttribute.cs | 8 + .../MetaAttributes/IGroupAttribute.cs.meta | 11 + .../Core/MetaAttributes/LabelAttribute.cs | 15 + .../MetaAttributes/LabelAttribute.cs.meta | 11 + .../Core/MetaAttributes/MetaAttribute.cs | 8 + .../Core/MetaAttributes/MetaAttribute.cs.meta | 11 + .../MetaAttributes/OnValueChangedAttribute.cs | 15 + .../OnValueChangedAttribute.cs.meta | 11 + .../Core/MetaAttributes/ReadOnlyAttribute.cs | 10 + .../MetaAttributes/ReadOnlyAttribute.cs.meta | 11 + .../Core/MetaAttributes/ShowIfAttribute.cs | 26 + .../MetaAttributes/ShowIfAttribute.cs.meta | 11 + .../MetaAttributes/ShowIfAttributeBase.cs | 39 + .../ShowIfAttributeBase.cs.meta | 11 + .../Core/NaughtyAttributes.Core.asmdef | 12 + .../Core/NaughtyAttributes.Core.asmdef.meta | 7 + .../Scripts/Core/Utility.meta | 8 + .../Scripts/Core/Utility/EColor.cs | 56 + .../Scripts/Core/Utility/EColor.cs.meta | 11 + .../Core/Utility/EConditionOperator.cs | 10 + .../Core/Utility/EConditionOperator.cs.meta | 11 + .../Scripts/Core/ValidatorAttributes.meta | 8 + .../ValidatorAttributes/MaxValueAttribute.cs | 20 + .../MaxValueAttribute.cs.meta | 11 + .../ValidatorAttributes/MinValueAttribute.cs | 20 + .../MinValueAttribute.cs.meta | 11 + .../ValidatorAttributes/RequiredAttribute.cs | 15 + .../RequiredAttribute.cs.meta | 11 + .../ValidateInputAttribute.cs | 17 + .../ValidateInputAttribute.cs.meta | 11 + .../ValidatorAttributes/ValidatorAttribute.cs | 8 + .../ValidatorAttribute.cs.meta | 11 + .../NaughtyAttributes/Scripts/Editor.meta | 10 + .../Scripts/Editor/DecoratorDrawers.meta | 8 + .../HorizontalLineDecoratorDrawer.cs | 23 + .../HorizontalLineDecoratorDrawer.cs.meta | 11 + .../InfoBoxDecoratorDrawer.cs | 59 + .../InfoBoxDecoratorDrawer.cs.meta | 11 + .../Editor/NaughtyAttributes.Editor.asmdef | 16 + .../NaughtyAttributes.Editor.asmdef.meta | 7 + .../Scripts/Editor/NaughtyInspector.cs | 221 ++ .../Scripts/Editor/NaughtyInspector.cs.meta | 11 + .../Scripts/Editor/PropertyDrawers.meta | 8 + .../AllowNestingPropertyDrawer.cs | 16 + .../AllowNestingPropertyDrawer.cs.meta | 11 + .../AnimatorParamPropertyDrawer.cs | 173 ++ .../AnimatorParamPropertyDrawer.cs.meta | 11 + .../CurveRangePropertyDrawer.cs | 47 + .../CurveRangePropertyDrawer.cs.meta | 11 + .../PropertyDrawers/DropdownPropertyDrawer.cs | 177 ++ .../DropdownPropertyDrawer.cs.meta | 11 + .../EnumFlagsPropertyDrawer.cs | 38 + .../EnumFlagsPropertyDrawer.cs.meta | 11 + .../ExpandablePropertyDrawer.cs | 195 ++ .../ExpandablePropertyDrawer.cs.meta | 11 + .../InputAxisPropertyDrawer.cs | 77 + .../InputAxisPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/LayerPropertyDrawer.cs | 88 + .../LayerPropertyDrawer.cs.meta | 11 + .../MinMaxSliderPropertyDrawer.cs | 108 + .../MinMaxSliderPropertyDrawer.cs.meta | 11 + .../ProgressBarPropertyDrawer.cs | 154 ++ .../ProgressBarPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/PropertyDrawerBase.cs | 94 + .../PropertyDrawerBase.cs.meta | 11 + .../ResizableTextAreaPropertyDrawer.cs | 80 + .../ResizableTextAreaPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/ScenePropertyDrawer.cs | 99 + .../ScenePropertyDrawer.cs.meta | 11 + .../ShowAssetPreviewPropertyDrawer.cs | 110 + .../ShowAssetPreviewPropertyDrawer.cs.meta | 11 + .../SortingLayerPropertyDrawer.cs | 91 + .../SortingLayerPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/TagPropertyDrawer.cs | 62 + .../PropertyDrawers/TagPropertyDrawer.cs.meta | 11 + .../Editor/PropertyDrawers_SpecialCase.meta | 8 + .../ReorderableListPropertyDrawer.cs | 205 ++ .../ReorderableListPropertyDrawer.cs.meta | 11 + .../SpecialCasePropertyDrawerBase.cs | 74 + .../SpecialCasePropertyDrawerBase.cs.meta | 11 + .../Scripts/Editor/PropertyValidators.meta | 8 + .../MaxValuePropertyValidator.cs | 53 + .../MaxValuePropertyValidator.cs.meta | 11 + .../MinValuePropertyValidator.cs | 53 + .../MinValuePropertyValidator.cs.meta | 11 + .../PropertyValidatorBase.cs | 38 + .../PropertyValidatorBase.cs.meta | 11 + .../RequiredPropertyValidator.cs | 31 + .../RequiredPropertyValidator.cs.meta | 11 + .../ValidateInputPropertyValidator.cs | 76 + .../ValidateInputPropertyValidator.cs.meta | 11 + .../Scripts/Editor/Utility.meta | 10 + .../Scripts/Editor/Utility/ButtonUtility.cs | 55 + .../Editor/Utility/ButtonUtility.cs.meta | 11 + .../Editor/Utility/NaughtyEditorGUI.cs | 380 +++ .../Editor/Utility/NaughtyEditorGUI.cs.meta | 13 + .../Scripts/Editor/Utility/PropertyUtility.cs | 374 +++ .../Editor/Utility/PropertyUtility.cs.meta | 11 + .../Editor/Utility/ReflectionUtility.cs | 128 + .../Editor/Utility/ReflectionUtility.cs.meta | 13 + .../Scripts/Editor/Utility/SavedBool.cs | 34 + .../Scripts/Editor/Utility/SavedBool.cs.meta | 11 + .../NaughtyAttributes/Scripts/Test.meta | 8 + .../Scripts/Test/AnimatorParamTest.cs | 53 + .../Scripts/Test/AnimatorParamTest.cs.meta | 11 + .../Scripts/Test/BoxGroupTest.cs | 32 + .../Scripts/Test/BoxGroupTest.cs.meta | 11 + .../Scripts/Test/ButtonTest.cs | 39 + .../Scripts/Test/ButtonTest.cs.meta | 11 + .../Scripts/Test/CurveRangeTest.cs | 37 + .../Scripts/Test/CurveRangeTest.cs.meta | 11 + .../Scripts/Test/DisableIfTest.cs | 120 + .../Scripts/Test/DisableIfTest.cs.meta | 11 + .../Scripts/Test/DropdownTest.cs | 45 + .../Scripts/Test/DropdownTest.cs.meta | 11 + .../Scripts/Test/EnableIfTest.cs | 120 + .../Scripts/Test/EnableIfTest.cs.meta | 11 + .../Scripts/Test/EnumFlagsTest.cs | 39 + .../Scripts/Test/EnumFlagsTest.cs.meta | 11 + .../Scripts/Test/ExpandableTest.cs | 31 + .../Scripts/Test/ExpandableTest.cs.meta | 11 + .../Scripts/Test/FoldoutTest.cs | 32 + .../Scripts/Test/FoldoutTest.cs.meta | 11 + .../Scripts/Test/HideIfTest.cs | 119 + .../Scripts/Test/HideIfTest.cs.meta | 11 + .../Scripts/Test/HorizontalLineTest.cs | 51 + .../Scripts/Test/HorizontalLineTest.cs.meta | 11 + .../Scripts/Test/InfoBoxTest.cs | 28 + .../Scripts/Test/InfoBoxTest.cs.meta | 11 + .../Scripts/Test/InputAxisTest.cs | 34 + .../Scripts/Test/InputAxisTest.cs.meta | 11 + .../Scripts/Test/LabelTest.cs | 30 + .../Scripts/Test/LabelTest.cs.meta | 11 + .../Scripts/Test/LayerTest.cs | 46 + .../Scripts/Test/LayerTest.cs.meta | 11 + .../Scripts/Test/MinMaxSliderTest.cs | 28 + .../Scripts/Test/MinMaxSliderTest.cs.meta | 11 + .../Scripts/Test/MinMaxValueTest.cs | 129 + .../Scripts/Test/MinMaxValueTest.cs.meta | 11 + .../Test/NaughtyAttributes.Test.asmdef | 14 + .../Test/NaughtyAttributes.Test.asmdef.meta | 7 + .../Scripts/Test/OnValueChangedTest.cs | 51 + .../Scripts/Test/OnValueChangedTest.cs.meta | 11 + .../Scripts/Test/ProgressBarTest.cs | 35 + .../Scripts/Test/ProgressBarTest.cs.meta | 11 + .../Scripts/Test/ReadOnlyTest.cs | 30 + .../Scripts/Test/ReadOnlyTest.cs.meta | 11 + .../Scripts/Test/ReorderableListTest.cs | 34 + .../Scripts/Test/ReorderableListTest.cs.meta | 11 + .../Scripts/Test/RequiredTest.cs | 30 + .../Scripts/Test/RequiredTest.cs.meta | 11 + .../Scripts/Test/ResizableTextAreaTest.cs | 28 + .../Test/ResizableTextAreaTest.cs.meta | 11 + .../Scripts/Test/SceneTest.cs | 28 + .../Scripts/Test/SceneTest.cs.meta | 11 + .../Scripts/Test/ShowAssetPreviewTest.cs | 37 + .../Scripts/Test/ShowAssetPreviewTest.cs.meta | 11 + .../Scripts/Test/ShowIfTest.cs | 119 + .../Scripts/Test/ShowIfTest.cs.meta | 11 + .../Scripts/Test/ShowNativePropertyTest.cs | 79 + .../Test/ShowNativePropertyTest.cs.meta | 11 + .../Test/ShowNonSerializedFieldTest.cs | 33 + .../Test/ShowNonSerializedFieldTest.cs.meta | 11 + .../Scripts/Test/SortingLayerTest.cs | 46 + .../Scripts/Test/SortingLayerTest.cs.meta | 11 + .../NaughtyAttributes/Scripts/Test/TagTest.cs | 34 + .../Scripts/Test/TagTest.cs.meta | 11 + .../Scripts/Test/ValidateInputTest.cs | 52 + .../Scripts/Test/ValidateInputTest.cs.meta | 11 + .../Scripts/Test/_NaughtyComponent.cs | 19 + .../Scripts/Test/_NaughtyComponent.cs.meta | 13 + .../Scripts/Test/_NaughtyScriptableObject.cs | 12 + .../Test/_NaughtyScriptableObject.cs.meta | 13 + .../Scripts/Test/_TestScriptableObjectA.cs | 12 + .../Test/_TestScriptableObjectA.cs.meta | 11 + .../Scripts/Test/_TestScriptableObjectB.cs | 12 + .../Test/_TestScriptableObjectB.cs.meta | 11 + .../ThirdParty/NaughtyAttributes/package.json | 21 + .../NaughtyAttributes/package.json.meta | 7 + Assets/Plugins.meta | 8 + Assets/Resources.meta | 8 + Assets/TestScripts.meta | 8 + 397 files changed, 17805 insertions(+) create mode 100644 Assets/Framework.meta create mode 100644 Assets/Framework/GameLauncher.cs create mode 100644 Assets/Framework/GameLauncher.cs.meta create mode 100644 Assets/Framework/Scripts.meta create mode 100644 Assets/Framework/Scripts/Editor.meta create mode 100644 Assets/Framework/Scripts/Runtime.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Network.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Reference.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs create mode 100644 Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Extension.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Camera.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Event.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Network.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Network/Modbus.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest.meta create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs create mode 100644 Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs.meta create mode 100644 Assets/Framework/Scripts/Runtime/MotionFramework.asmdef create mode 100644 Assets/Framework/Scripts/Runtime/MotionFramework.asmdef.meta create mode 100644 Assets/Framework/ThirdParty.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/README.html create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/README.html.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/icon-github.png create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/icon-github.png.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs.meta create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/package.json create mode 100644 Assets/Framework/ThirdParty/NaughtyAttributes/package.json.meta create mode 100644 Assets/Plugins.meta create mode 100644 Assets/Resources.meta create mode 100644 Assets/TestScripts.meta diff --git a/Assets/Framework.meta b/Assets/Framework.meta new file mode 100644 index 0000000..a73ac7c --- /dev/null +++ b/Assets/Framework.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2503af1b9165311458e5bb89cb59df6f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/GameLauncher.cs b/Assets/Framework/GameLauncher.cs new file mode 100644 index 0000000..53d3027 --- /dev/null +++ b/Assets/Framework/GameLauncher.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Framework.Scripts.Runtime.Engine.Engine.Camera; +using UnityEngine; + +// ������Ϸ�����г��õ���Ϸģ��������ռ� +using MotionFramework; +using MotionFramework.Console; +using MotionFramework.Event; +using MotionFramework.Scripts.Runtime.Engine.Engine.Network.WebRequest; +using MotionFramework.Utility; + +public class GameLauncher : MonoBehaviour +{ + [Tooltip("�ڱ༭����ģ������")] + public bool SimulationOnEditor = true; + + void Awake() + { +#if !UNITY_EDITOR + SimulationOnEditor = false; +#endif + + // ��ʼ������̨ + if (Application.isEditor || Debug.isDebugBuild) + DeveloperConsole.Initialize(); + + + // ��ʼ����� + MotionEngine.Initialize(this, HandleMotionFrameworkLog); + } + void Start() + { + // ������Ϸģ�� + CreateGameModules(); + } + void Update() + { + // ���¿�� + MotionEngine.Update(); + } + void OnGUI() + { + // ���ƿ���̨ + if (Application.isEditor || Debug.isDebugBuild) + DeveloperConsole.Draw(); + } + + private void CreateGameModules() + { + // �����¼������� + MotionEngine.CreateModule<EventManager>(); + + //webrequest������ + MotionEngine.CreateModule<WebRequestManager>(); + + } + + private void HandleMotionFrameworkLog(ELogLevel logLevel, string log) + { + if (logLevel == ELogLevel.Log) + { + UnityEngine.Debug.Log(log); + } + else if (logLevel == ELogLevel.Error) + { + UnityEngine.Debug.LogError(log); + } + else if (logLevel == ELogLevel.Warning) + { + UnityEngine.Debug.LogWarning(log); + } + else if (logLevel == ELogLevel.Exception) + { + UnityEngine.Debug.LogError(log); + } + else + { + throw new NotImplementedException($"{logLevel}"); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/GameLauncher.cs.meta b/Assets/Framework/GameLauncher.cs.meta new file mode 100644 index 0000000..8b740b0 --- /dev/null +++ b/Assets/Framework/GameLauncher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9285dff9c8040aa4488bf8974674f237 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts.meta b/Assets/Framework/Scripts.meta new file mode 100644 index 0000000..3fb96b5 --- /dev/null +++ b/Assets/Framework/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2f4cf2a58e574d74aac5310ccd75525a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Editor.meta b/Assets/Framework/Scripts/Editor.meta new file mode 100644 index 0000000..7d166ef --- /dev/null +++ b/Assets/Framework/Scripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 388029185fa707340a861f57cd175df2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime.meta b/Assets/Framework/Scripts/Runtime.meta new file mode 100644 index 0000000..746fedf --- /dev/null +++ b/Assets/Framework/Scripts/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5ef71c752c838c459544a86dd58463c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine.meta b/Assets/Framework/Scripts/Runtime/Engine.meta new file mode 100644 index 0000000..76fe192 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 427646cfb10656d498f5e8d094a680f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core.meta b/Assets/Framework/Scripts/Runtime/Engine/Core.meta new file mode 100644 index 0000000..1f58903 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03ce8fe28e97d2f40b814dcae8cad75d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs b/Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs new file mode 100644 index 0000000..9306816 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs @@ -0,0 +1,30 @@ + + +namespace MotionFramework +{ + /// <summary> + /// 日志等级 + /// </summary> + public enum ELogLevel + { + /// <summary> + /// 信息 + /// </summary> + Log, + + /// <summary> + /// 警告 + /// </summary> + Warning, + + /// <summary> + /// 错误 + /// </summary> + Error, + + /// <summary> + /// 异常 + /// </summary> + Exception, + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs.meta new file mode 100644 index 0000000..3801df5 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/ELogLevel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae9a7933bf5cb574ab1fa7b757931fcc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs b/Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs new file mode 100644 index 0000000..cc5ad0d --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs @@ -0,0 +1,17 @@ +using System; + +namespace MotionFramework +{ + public interface IActivatorServices + { + /// <summary> + /// 创建实例 + /// </summary> + object CreateInstance(Type classType); + + /// <summary> + /// 获取特性 + /// </summary> + Attribute GetAttribute(Type classType); + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs.meta new file mode 100644 index 0000000..262fc76 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/IActivatorServices.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: beee09ffd49d7ef49a983e15cca8fe5e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs b/Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs new file mode 100644 index 0000000..23750f5 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs @@ -0,0 +1,27 @@ + + +namespace MotionFramework +{ + public interface IModule + { + /// <summary> + /// 创建模块 + /// </summary> + void OnCreate(System.Object createParam); + + /// <summary> + /// 轮询模块 + /// </summary> + void OnUpdate(); + + /// <summary> + /// 销毁模块 + /// </summary> + void OnDestroy(); + + /// <summary> + /// GUI绘制 + /// </summary> + void OnGUI(); + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs.meta new file mode 100644 index 0000000..74cdaad --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/IModule.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f4757101f8553d49ad6da27c94c50c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs b/Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs new file mode 100644 index 0000000..fdc973a --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs @@ -0,0 +1,39 @@ + +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Threading; + +namespace MotionFramework +{ + /// <summary> + /// 同步其它线程里的回调到主线程里 + /// 注意:Unity3D中需要设置Scripting Runtime Version为.NET4.6 + /// </summary> + public sealed class MainThreadSyncContext : SynchronizationContext + { + private readonly ConcurrentQueue<Action> _safeQueue = new ConcurrentQueue<Action>(); + + /// <summary> + /// 更新同步队列 + /// </summary> + public void Update() + { + while (true) + { + if (_safeQueue.TryDequeue(out Action action) == false) + return; + action.Invoke(); + } + } + + /// <summary> + /// 向同步队列里投递一个回调方法 + /// </summary> + public override void Post(SendOrPostCallback callback, object state) + { + Action action = new Action(() => { callback(state); }); + _safeQueue.Enqueue(action); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs.meta new file mode 100644 index 0000000..2ff67ea --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/MainThreadSyncContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8dc088445ce08dc4e81bfe04a381b449 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs b/Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs new file mode 100644 index 0000000..5316cc0 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs @@ -0,0 +1,29 @@ + + +namespace MotionFramework +{ + public abstract class ModuleSingleton<T> where T : class, IModule + { + private static T _instance; + public static T Instance + { + get + { + if (_instance == null) + MotionLog.Error($"{typeof(T)} is not create. Use {nameof(MotionEngine)}.{nameof(MotionEngine.CreateModule)} create."); + return _instance; + } + } + + protected ModuleSingleton() + { + if (_instance != null) + throw new System.Exception($"{typeof(T)} instance already created."); + _instance = this as T; + } + protected void DestroySingleton() + { + _instance = null; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs.meta new file mode 100644 index 0000000..1638ca2 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/ModuleSingleton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6c8230c0d097534e950f4e84ce01e96 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs new file mode 100644 index 0000000..77de5fb --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs @@ -0,0 +1,267 @@ + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MotionFramework +{ + public static class MotionEngine + { + private class ModuleWrapper + { + public int Priority { private set; get; } + public IModule Module { private set; get; } + + public ModuleWrapper(IModule module, int priority) + { + Module = module; + Priority = priority; + } + } + + private static readonly List<ModuleWrapper> _coms = new List<ModuleWrapper>(100); + private static MonoBehaviour _behaviour; + private static bool _isDirty = false; + private static long _frame = 0; + + /// <summary> + /// 初始化框架 + /// </summary> + public static void Initialize(MonoBehaviour behaviour, Action<ELogLevel, string> logCallback) + { + if (behaviour == null) + throw new Exception("MotionFramework behaviour is null."); + if (_behaviour != null) + throw new Exception($"{nameof(MotionEngine)} is already initialized."); + + UnityEngine.Object.DontDestroyOnLoad(behaviour.gameObject); + _behaviour = behaviour; + + // 注册日志回调 + if (logCallback != null) + MotionLog.RegisterCallback(logCallback); + + behaviour.StartCoroutine(CheckFrame()); + } + + /// <summary> + /// 检测MotionEngine更新方法 + /// </summary> + private static IEnumerator CheckFrame() + { + var wait = new WaitForSeconds(1f); + yield return wait; + + // 说明:初始化之后,如果忘记更新MotionEngine,这里会抛出异常 + if (_frame == 0) + throw new Exception($"Please call update method : MotionEngine.Update"); + } + + /// <summary> + /// 更新框架 + /// </summary> + public static void Update() + { + _frame++; + + // 如果有新模块需要重新排序 + if (_isDirty) + { + _isDirty = false; + _coms.Sort((left, right) => + { + if (left.Priority > right.Priority) + return -1; + else if (left.Priority == right.Priority) + return 0; + else + return 1; + }); + } + + // 轮询所有模块 + for (int i = 0; i < _coms.Count; i++) + { + _coms[i].Module.OnUpdate(); + } + } + + /// <summary> + /// 绘制所有模块的GUI内容 + /// </summary> + internal static void DrawModulesGUIContent() + { + for (int i = 0; i < _coms.Count; i++) + { + _coms[i].Module.OnGUI(); + } + } + + /// <summary> + /// 查询游戏模块是否存在 + /// </summary> + public static bool Contains<T>() where T : class, IModule + { + System.Type type = typeof(T); + return Contains(type); + } + + /// <summary> + /// 查询游戏模块是否存在 + /// </summary> + public static bool Contains(System.Type moduleType) + { + for (int i = 0; i < _coms.Count; i++) + { + if (_coms[i].Module.GetType() == moduleType) + return true; + } + return false; + } + + /// <summary> + /// 创建游戏模块 + /// </summary> + /// <typeparam name="T">模块类</typeparam> + /// <param name="priority">运行时的优先级,优先级越大越早执行。如果没有设置优先级,那么会按照添加顺序执行</param> + public static T CreateModule<T>(int priority = 0) where T : class, IModule + { + return CreateModule<T>(null, priority); + } + + /// <summary> + /// 创建游戏模块 + /// </summary> + /// <typeparam name="T">模块类</typeparam> + /// <param name="createParam">创建参数</param> + /// <param name="priority">运行时的优先级,优先级越大越早执行。如果没有设置优先级,那么会按照添加顺序执行</param> + public static T CreateModule<T>(System.Object createParam, int priority = 0) where T : class, IModule + { + if (priority < 0) + throw new Exception("The priority can not be negative"); + + if (Contains(typeof(T))) + throw new Exception($"Game module {typeof(T)} is already existed"); + + // 如果没有设置优先级 + if (priority == 0) + { + int minPriority = GetMinPriority(); + priority = --minPriority; + } + + MotionLog.Log($"Create game module : {typeof(T)}"); + T module = Activator.CreateInstance<T>(); + ModuleWrapper wrapper = new ModuleWrapper(module, priority); + wrapper.Module.OnCreate(createParam); + _coms.Add(wrapper); + _isDirty = true; + return module; + } + + /// <summary> + /// 销毁模块 + /// </summary> + /// <typeparam name="T">模块类</typeparam> + public static bool DestroyModule<T>() + { + var moduleType = typeof(T); + for (int i = 0; i < _coms.Count; i++) + { + if (_coms[i].Module.GetType() == moduleType) + { + _coms[i].Module.OnDestroy(); + _coms.RemoveAt(i); + return true; + } + } + return false; + } + + /// <summary> + /// 获取游戏模块 + /// </summary> + /// <typeparam name="T">模块类</typeparam> + public static T GetModule<T>() where T : class, IModule + { + System.Type type = typeof(T); + for (int i = 0; i < _coms.Count; i++) + { + if (_coms[i].Module.GetType() == type) + return _coms[i].Module as T; + } + + MotionLog.Warning($"Not found game module {type}"); + return null; + } + + /// <summary> + /// 获取当前模块里最小的优先级 + /// </summary> + private static int GetMinPriority() + { + int minPriority = 0; + for (int i = 0; i < _coms.Count; i++) + { + if (_coms[i].Priority < minPriority) + minPriority = _coms[i].Priority; + } + return minPriority; //小于等于零 + } + + #region 协程相关 + /// <summary> + /// 开启一个协程 + /// </summary> + public static Coroutine StartCoroutine(IEnumerator coroutine) + { + if (_behaviour == null) + throw new Exception($"{nameof(MotionEngine)} is not initialize. Use MotionEngine.Initialize"); + return _behaviour.StartCoroutine(coroutine); + } + + /// <summary> + /// 停止一个协程 + /// </summary> + public static void StopCoroutine(Coroutine coroutine) + { + if (_behaviour == null) + throw new Exception($"{nameof(MotionEngine)} is not initialize. Use MotionEngine.Initialize"); + _behaviour.StopCoroutine(coroutine); + } + + + /// <summary> + /// 开启一个协程 + /// </summary> + public static void StartCoroutine(string methodName) + { + if (_behaviour == null) + throw new Exception($"{nameof(MotionEngine)} is not initialize. Use MotionEngine.Initialize"); + _behaviour.StartCoroutine(methodName); + } + + /// <summary> + /// 停止一个协程 + /// </summary> + public static void StopCoroutine(string methodName) + { + if (_behaviour == null) + throw new Exception($"{nameof(MotionEngine)} is not initialize. Use MotionEngine.Initialize"); + _behaviour.StopCoroutine(methodName); + } + + + /// <summary> + /// 停止所有协程 + /// </summary> + public static void StopAllCoroutines() + { + if (_behaviour == null) + throw new Exception($"{nameof(MotionEngine)} is not initialize. Use MotionEngine.Initialize"); + _behaviour.StopAllCoroutines(); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs.meta new file mode 100644 index 0000000..0ef990c --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionEngine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b799b83d73a9cb543b2504ccb1cf796a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs new file mode 100644 index 0000000..9786722 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs @@ -0,0 +1,49 @@ + + +namespace MotionFramework +{ + internal static class MotionLog + { + private static System.Action<ELogLevel, string> _callback; + + /// <summary> + /// 监听日志 + /// </summary> + public static void RegisterCallback(System.Action<ELogLevel, string> callback) + { + _callback += callback; + } + + /// <summary> + /// 日志 + /// </summary> + public static void Log(string info) + { + _callback?.Invoke(ELogLevel.Log, $"[MotionLog] {info}"); + } + + /// <summary> + /// 警告 + /// </summary> + public static void Warning(string info) + { + _callback?.Invoke(ELogLevel.Warning, $"[MotionLog] {info}"); + } + + /// <summary> + /// 错误 + /// </summary> + public static void Error(string info) + { + _callback?.Invoke(ELogLevel.Error, $"[MotionLog] {info}"); + } + + /// <summary> + /// 异常 + /// </summary> + public static void Exception(string info) + { + _callback?.Invoke(ELogLevel.Exception, $"[MotionLog] {info}"); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs.meta new file mode 100644 index 0000000..b066e9e --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Core/MotionLog.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dbad3cd04905bab4fb6391f5184bcfa0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation.meta new file mode 100644 index 0000000..cb82e93 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d31ab63c6e8982469ffce74914f4a4b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs new file mode 100644 index 0000000..faba5eb --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MotionFramework.Experimental.Animation; + +[RequireComponent(typeof(Animator))] +public class AnimBehaviour : MonoBehaviour +{ + [Serializable] + public class AnimationWrapper + { + public int Layer; + public WrapMode Mode; + public AnimationClip Clip; + } + + private AnimPlayable _animPlayable; + private Animator _animator; + + [SerializeField] + protected AnimationWrapper[] _animations; + + [SerializeField] + protected bool _playAutomatically = true; + + [SerializeField] + protected bool _animatePhysics = false; + + /// <summary> + /// 自动播放动画 + /// </summary> + public bool PlayAutomatically + { + get + { + return _playAutomatically; + } + set + { + _playAutomatically = value; + } + } + + /// <summary> + /// 物理更新模式 + /// </summary> + public bool AnimatePhysics + { + get + { + return _animatePhysics; + } + set + { + _animatePhysics = value; + _animator.updateMode = _animatePhysics ? AnimatorUpdateMode.AnimatePhysics : AnimatorUpdateMode.Normal; + } + } + + + public void Awake() + { + _animator = GetComponent<Animator>(); + _animator.updateMode = _animatePhysics ? AnimatorUpdateMode.AnimatePhysics : AnimatorUpdateMode.Normal; + + _animPlayable = new AnimPlayable(); + _animPlayable.Create(_animator); + + // 添加列表动作 + for (int i = 0; i < _animations.Length; i++) + { + var wrapper = _animations[i]; + if (wrapper == null || wrapper.Clip == null) + continue; + + wrapper.Clip.wrapMode = wrapper.Mode; + _animPlayable.AddAnimation(wrapper.Clip.name, wrapper.Clip, wrapper.Layer); + } + } + public void OnEnable() + { + _animPlayable.PlayGraph(); + + if (PlayAutomatically) + { + var wrapper = GetDefaultWrapper(); + if (wrapper != null) + { + Play(wrapper.Clip.name, 0f); + } + } + + _animPlayable.Update(float.MaxValue); + } + public void OnDisable() + { + _animPlayable.StopGraph(); + } + public void OnDestroy() + { + _animPlayable.Destroy(); + } + public void Update() + { + _animPlayable.Update(Time.deltaTime); + } + + /// <summary> + /// 获取动画状态 + /// </summary> + public AnimState GetState(string name) + { + return _animPlayable.GetAnimState(name); + } + + /// <summary> + /// 动画是否在播放中 + /// </summary> + public bool IsPlaying(string name) + { + return _animPlayable.IsPlaying(name); + } + + /// <summary> + /// 是否包含动画片段 + /// </summary> + public bool IsContains(string name) + { + return _animPlayable.IsContains(name); + } + + /// <summary> + /// 播放动画 + /// </summary> + public void Play(string name, float fadeLength = 0.25f) + { + _animPlayable.Play(name, fadeLength); + } + + /// <summary> + /// 停止动画 + /// </summary> + public void Stop(string name) + { + _animPlayable.Stop(name); + } + + private AnimationWrapper GetDefaultWrapper() + { + for (int i = 0; i < _animations.Length; i++) + { + var wrapper = _animations[i]; + if (wrapper == null || wrapper.Clip == null) + continue; + + return wrapper; + } + return null; + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs.meta new file mode 100644 index 0000000..18eabca --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef52174816df6104587b15c5b250201a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs new file mode 100644 index 0000000..4ee3b0d --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs @@ -0,0 +1,196 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Animations; + +namespace MotionFramework.Experimental.Animation +{ + public sealed class AnimMixer : AnimNode + { + private const float HIDE_DURATION = 0.25f; + private readonly List<AnimState> _states = new List<AnimState>(10); + private AnimationMixerPlayable _mixer; + private bool _isQuiting = false; + + /// <summary> + /// 动画层级 + /// </summary> + public int Layer { private set; get; } + + + public AnimMixer(PlayableGraph graph, int layer) : base(graph) + { + Layer = layer; + + _mixer = AnimationMixerPlayable.Create(graph); + SetSourcePlayable(_mixer); + } + public override void Update(float deltaTime) + { + base.Update(deltaTime); + + for (int i = 0; i < _states.Count; i++) + { + var state = _states[i]; + if (state != null) + state.Update(deltaTime); + } + + bool isAllDone = true; + for (int i = 0; i < _states.Count; i++) + { + var state = _states[i]; + if (state != null) + { + if (state.IsDone == false) + isAllDone = false; + } + } + + // 当子节点都已经完成的时候断开连接 + if (isAllDone && _isQuiting == false) + { + _isQuiting = true; + StartWeightFade(0, HIDE_DURATION); + } + if (_isQuiting) + { + if (Mathf.Approximately(Weight, 0f)) + DisconnectMixer(); + } + } + + /// <summary> + /// 播放指定动画 + /// </summary> + public void Play(AnimState animState, float fadeDuration) + { + // 重新激活混合器 + _isQuiting = false; + StartWeightFade(1f, 0); + + if (IsContains(animState) == false) + { + // 优先插入到一个空位 + int index = _states.FindIndex(s => s == null); + if (index == -1) + { + // Increase input count + int inputCount = _mixer.GetInputCount(); + _mixer.SetInputCount(inputCount + 1); + + animState.Connect(_mixer, inputCount); + _states.Add(animState); + } + else + { + animState.Connect(_mixer, index); + _states[index] = animState; + } + } + + for (int i = 0; i < _states.Count; i++) + { + var state = _states[i]; + if (state == null) + continue; + + if (state == animState) + { + state.StartWeightFade(1f, fadeDuration); + state.PlayNode(); + } + else + { + state.StartWeightFade(0f, fadeDuration); + state.PauseNode(); + } + } + } + + /// <summary> + /// 停止指定动画,恢复为初始状态 + /// </summary> + public void Stop(string name) + { + AnimState state = FindState(name); + if (state == null) + return; + + state.PauseNode(); + state.ResetNode(); + } + + /// <summary> + /// 暂停所有动画 + /// </summary> + public void PauseAll() + { + for (int i = 0; i < _states.Count; i++) + { + var state = _states[i]; + if (state == null) + continue; + state.PauseNode(); + } + } + + /// <summary> + /// 是否包含该动画 + /// </summary> + public bool IsContains(AnimNode node) + { + foreach (var state in _states) + { + if (state == node) + return true; + } + return false; + } + + /// <summary> + /// 移除一个动画 + /// </summary> + public void RemoveState(string name) + { + var state = FindState(name); + if (state == null) + return; + + _states[state.InputPort] = null; + state.Destroy(); + } + + /// <summary> + /// 获取指定的动画 + /// </summary> + /// <returns>如果没有返回NULL</returns> + private AnimState FindState(string name) + { + foreach (var state in _states) + { + if (state != null && state.Name == name) + return state; + } + + MotionLog.Warning($"Animation state doesn't exist : {name}"); + return null; + } + + private void DisconnectMixer() + { + for (int i = 0; i < _states.Count; i++) + { + var state = _states[i]; + if (state == null) + continue; + + state.Disconnect(); + _states[i] = null; + } + + Disconnect(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs.meta new file mode 100644 index 0000000..7842188 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimMixer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b33204afd07c00c4f8b425276778b8bf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs new file mode 100644 index 0000000..5be232b --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs @@ -0,0 +1,221 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Animations; + +namespace MotionFramework.Experimental.Animation +{ + public abstract class AnimNode + { + private readonly PlayableGraph _graph; + private Playable _source; + private Playable _parent; + + private float _fadeSpeed = 0f; + private float _fadeWeight = 0f; + private bool _isFading = false; + + + /// <summary> + /// 是否已经连接 + /// </summary> + public bool IsConnect { get; private set; } = false; + + /// <summary> + /// 输入端口 + /// </summary> + public int InputPort { private set; get; } + + /// <summary> + /// 是否已经完成 + /// If the duration of the playable is set, when the time of the playable reaches its duration during playback this flag will be set to true. + /// </summary> + public bool IsDone + { + get + { + return _source.IsDone(); + } + } + + /// <summary> + /// 是否有效 + /// if the Playable is properly constructed by the PlayableGraph and has not been destroyed, false otherwise. + /// </summary> + public bool IsValid + { + get + { + return _source.IsValid(); + } + } + + /// <summary> + /// 是否正在播放中 + /// </summary> + public bool IsPlaying + { + get + { + return _source.GetPlayState() == PlayState.Playing; + } + } + + /// <summary> + /// 时间轴 + /// </summary> + public float Time + { + set + { + _source.SetTime(value); + } + get + { + return (float)_source.GetTime(); + } + } + + /// <summary> + /// 播放速度 + /// </summary> + public float Speed + { + set + { + _source.SetSpeed(value); + } + get + { + return (float)_source.GetSpeed(); + } + } + + /// <summary> + /// 权重值 + /// </summary> + public float Weight + { + set + { + _parent.SetInputWeight(InputPort, value); + } + get + { + return _parent.GetInputWeight(InputPort); + } + } + + + public AnimNode(PlayableGraph graph) + { + _graph = graph; + } + public virtual void Update(float deltaTime) + { + if (_isFading) + { + Weight = Mathf.MoveTowards(Weight, _fadeWeight, _fadeSpeed * deltaTime); + if (Mathf.Approximately(Weight, _fadeWeight)) + { + _isFading = false; + } + } + } + public virtual void Destroy() + { + if (IsValid) + { + _graph.DestroySubgraph(_source); + } + } + public virtual void PlayNode() + { + // NOTE : When playing, the local time of this Playable will be updated during the evaluation of the PlayableGraph. + _source.Play(); + + // NOTE : Changes a flag indicating that a playable has completed its operation. + // Playable that reach the end of their duration are automatically marked as done. + _source.SetDone(false); + } + public virtual void PauseNode() + { + // NOTE : When paused, the local time of this Playable will not be updated during the evaluation of the PlayableGraph. + _source.Pause(); + + // NOTE : Changes a flag indicating that a playable has completed its operation. + // Playable that reach the end of their duration are automatically marked as done. + _source.SetDone(true); + } + public virtual void ResetNode() + { + _fadeSpeed = 0; + _fadeWeight = 0; + _isFading = false; + + Time = 0; + Speed = 1; + Weight = 0; + } + + /// <summary> + /// 连接到父节点 + /// </summary> + /// <param name="parent">父节点对象</param> + /// <param name="inputPort">父节点上的输入端口</param> + public void Connect(Playable parent, int parentInputPort) + { + if (IsConnect) + throw new System.Exception("AnimNode is connected."); + + _parent = parent; + InputPort = parentInputPort; + + // 重置节点 + ResetNode(); + + // 连接 + _graph.Connect(_source, 0, parent, parentInputPort); + IsConnect = true; + } + + /// <summary> + /// 同父节点断开连接 + /// </summary> + public void Disconnect() + { + if (IsConnect == false) + throw new System.Exception("AnimNode is disconnected."); + + // 断开 + _graph.Disconnect(_parent, InputPort); + IsConnect = false; + } + + /// <summary> + /// 开始权重值过渡 + /// </summary> + /// <param name="destWeight">目标权重值</param> + /// <param name="fadeDuration">过渡时间</param> + public void StartWeightFade(float destWeight, float fadeDuration) + { + if (fadeDuration <= 0) + { + Weight = destWeight; + _isFading = false; + return; + } + + //注意:保持统一的渐变速度 + _fadeSpeed = 1f / fadeDuration; + _fadeWeight = destWeight; + _isFading = true; + } + + protected void SetSourcePlayable(Playable playable) + { + _source = playable; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs.meta new file mode 100644 index 0000000..1f91ab9 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimNode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6928afd60ab2ed489e492e00d9ddaba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs new file mode 100644 index 0000000..19a3280 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs @@ -0,0 +1,228 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Animations; + +namespace MotionFramework.Experimental.Animation +{ + public class AnimPlayable + { + private readonly List<AnimState> _states = new List<AnimState>(10); + private readonly List<AnimMixer> _mixers = new List<AnimMixer>(10); + + private PlayableGraph _graph; + private AnimationPlayableOutput _output; + private AnimationLayerMixerPlayable _mixerRoot; + + public void Create(Animator animator) + { + string name = animator.gameObject.name; + _graph = PlayableGraph.Create(name); + _graph.SetTimeUpdateMode(DirectorUpdateMode.Manual); + + _mixerRoot = AnimationLayerMixerPlayable.Create(_graph); + _output = AnimationPlayableOutput.Create(_graph, name, animator); + _output.SetSourcePlayable(_mixerRoot); + } + public void Update(float deltaTime) + { + _graph.Evaluate(deltaTime); + + // 更新所有层级 + for (int i = 0; i < _mixers.Count; i++) + { + var mixer = _mixers[i]; + if(mixer.IsConnect) + mixer.Update(deltaTime); + } + } + public void Destroy() + { + _graph.Destroy(); + } + + /// <summary> + /// Play the graph + /// </summary> + public void PlayGraph() + { + _graph.Play(); + } + + /// <summary> + /// Stop the graph + /// </summary> + public void StopGraph() + { + _graph.Stop(); + } + + /// <summary> + /// 检测动画是否正在播放 + /// </summary> + /// <param name="name">动画名称</param> + public bool IsPlaying(string name) + { + AnimState state = GetAnimState(name); + if (state == null) + return false; + + return state.IsConnect && state.IsPlaying; + } + + /// <summary> + /// 播放一个动画 + /// </summary> + /// <param name="name">动画名称</param> + /// <param name="fadeLength">融合时间</param> + public void Play(string name, float fadeLength) + { + var animState = GetAnimState(name); + if (animState == null) + { + MotionLog.Warning($"Not found animation {name}"); + return; + } + + int layer = animState.Layer; + var animMixer = GetAnimMixer(layer); + if (animMixer == null) + animMixer = CreateAnimMixer(layer); + + if(animMixer.IsConnect == false) + animMixer.Connect(_mixerRoot, animMixer.Layer); + + animMixer.Play(animState, fadeLength); + } + + /// <summary> + /// 停止一个动画 + /// </summary> + /// <param name="name">动画名称</param> + public void Stop(string name) + { + var animState = GetAnimState(name); + if (animState == null) + { + MotionLog.Warning($"Not found animation {name}"); + return; + } + + if (animState.IsConnect == false) + return; + + var animMixer = GetAnimMixer(animState.Layer); + if (animMixer == null) + throw new System.Exception("Should never get here."); + + animMixer.Stop(animState.Name); + } + + /// <summary> + /// 添加一个动画片段 + /// </summary> + /// <param name="name">动画名称</param> + /// <param name="clip">动画片段</param> + /// <param name="layer">动画层级</param> + public bool AddAnimation(string name, AnimationClip clip, int layer = 0) + { + if (string.IsNullOrEmpty(name)) + throw new System.ArgumentException("Name is null or empty."); + if (clip == null) + throw new System.ArgumentNullException(); + if (layer < 0) + throw new System.Exception("Layer must be greater than zero."); + + if (IsContains(name)) + { + MotionLog.Warning($"Animation already exists : {name}"); + return false; + } + + AnimState stateNode = new AnimState(_graph, clip, name, layer); + _states.Add(stateNode); + return true; + } + + /// <summary> + /// 移除一个动画片段 + /// </summary> + /// <param name="name">动画名称</param> + public bool RemoveAnimation(string name) + { + if (IsContains(name) == false) + { + MotionLog.Warning($"Not found Animation : {name}"); + return false; + } + + AnimState animState = GetAnimState(name); + AnimMixer animMixer = GetAnimMixer(animState.Layer); + if(animMixer != null) + animMixer.RemoveState(animState.Name); + + animState.Destroy(); + _states.Remove(animState); + return true; + } + + /// <summary> + /// 获取一个动画状态 + /// </summary> + /// <param name="name">动画名称</param> + public AnimState GetAnimState(string name) + { + for (int i = 0; i < _states.Count; i++) + { + if (_states[i].Name == name) + return _states[i]; + } + return null; + } + + /// <summary> + /// 是否包含一个动画状态 + /// </summary> + /// <param name="name">动画名称</param> + public bool IsContains(string name) + { + for (int i = 0; i < _states.Count; i++) + { + if (_states[i].Name == name) + return true; + } + return false; + } + + private AnimMixer GetAnimMixer(int layer) + { + for (int i = 0; i < _mixers.Count; i++) + { + if (_mixers[i].Layer == layer) + return _mixers[i]; + } + return null; + } + private AnimMixer CreateAnimMixer(int layer) + { + // Increase input count + int inputCount = _mixerRoot.GetInputCount(); + if(layer == 0 && inputCount == 0) + { + _mixerRoot.SetInputCount(1); + } + else + { + if (layer > inputCount - 1) + { + _mixerRoot.SetInputCount(layer + 1); + } + } + + var animMixer = new AnimMixer(_graph, layer); + _mixers.Add(animMixer); + return animMixer; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs.meta new file mode 100644 index 0000000..36714b0 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimPlayable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 772b8a9edd8466646bab12d6f5ba1084 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs new file mode 100644 index 0000000..6da393a --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs @@ -0,0 +1,99 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Animations; + +namespace MotionFramework.Experimental.Animation +{ + public sealed class AnimState : AnimNode + { + public readonly string Name; + private readonly AnimationClip _clip; + public AnimationClipPlayable _clipPlayable; + + /// <summary> + /// 动画层级 + /// </summary> + public int Layer = 0; + + /// <summary> + /// 动画长度 + /// </summary> + public float ClipLength + { + get + { + if (_clip == null) + return 0f; + if (Speed == 0f) + return Mathf.Infinity; + return _clip.length / Speed; + } + } + + /// <summary> + /// 归一化时间轴 + /// </summary> + public float NormalizedTime + { + set + { + if (_clip == null) + return; + Time = _clip.length * value; + } + + get + { + if (_clip == null) + return 1f; + return Time / _clip.length; + } + } + + /// <summary> + /// 动画模式 + /// </summary> + public WrapMode WrapMode + { + set + { + if (_clip != null) + _clip.wrapMode = value; + } + get + { + if (_clip == null) + return WrapMode.Default; + return _clip.wrapMode; + } + } + + public AnimState(PlayableGraph graph, AnimationClip clip, string name, int layer) : base(graph) + { + _clip = clip; + Name = name; + Layer = layer; + + _clipPlayable = AnimationClipPlayable.Create(graph, clip); + _clipPlayable.SetApplyFootIK(false); + _clipPlayable.SetApplyPlayableIK(false); + SetSourcePlayable(_clipPlayable); + + if (clip.wrapMode == WrapMode.Once) + { + _clipPlayable.SetDuration(clip.length); + } + } + public override void PlayNode() + { + if (_clip.wrapMode == WrapMode.Once || _clip.wrapMode == WrapMode.ClampForever) + { + Time = 0; + } + + base.PlayNode(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs.meta new file mode 100644 index 0000000..71a052f --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/AnimState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 606e5729d04cc8742a38f58e595c02f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs new file mode 100644 index 0000000..bec94d9 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs @@ -0,0 +1,12 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MotionFramework.Experimental.Animation +{ + public enum EAnimStates + { + Playing, + Paused, + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs.meta new file mode 100644 index 0000000..3b2e4c8 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Animation/EAnimStates.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5660d9e37e5c2a44f818506c9fe76624 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera.meta new file mode 100644 index 0000000..bdaf9de --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 27404a5600794902a08f7d7710e766b3 +timeCreated: 1716521294 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl.meta new file mode 100644 index 0000000..eb2e9f7 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 436369bf8c5b45a084984e639d160e1d +timeCreated: 1716536171 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs new file mode 100644 index 0000000..c0f2526 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs @@ -0,0 +1,236 @@ +using DG.Tweening; +using UnityEngine; +using NaughtyAttributes; +using UnityEngine.EventSystems; + +namespace Framework.Scripts.Runtime.Engine.Engine.Camera.CameraControl +{ + public class CameraControlComponent : ICameraController + { + public enum CameraEnum + { + TopView, + FrontView + } + + //相机跟随的目标物体,一般是一个空物体 + [SerializeField] private GameObject target; + + [HorizontalLine(color: EColor.Blue)] [SerializeField] [Label("启用旋转")] + private bool enableMouseFunctions = true; + + [SerializeField] [Label("启用鼠标碰到UI禁用脚本")] + private bool enableMouseOverUI = true; + + [SerializeField] private CameraEnum cameraEnum; + + private float middleSpeed = 2; + + private int MouseWheelSensitivity = 1; //滚轮灵敏度设置 + + private int MouseZoomMin = 10; //相机距离最小值 + + private int MouseZoomMax = 9999; //相机距离最大值 + + private float xSpeed = 250.0f; //旋转视角时相机x轴转速 + + private float ySpeed = 120.0f; //旋转视角时相机y轴转速 + + private float Distance = 20; //相机和target之间的距离,因为相机的Z轴总是指向target,也就是相机z轴方向上的距离 + + //[BoxGroup("参数")][SerializeField][Label("角度最小限制")] private int yMinLimit = -360; + //[BoxGroup("参数")][SerializeField][Label("角度最大限制")] private int yMaxLimit = 360; + + private Vector2 minMaxSlider; + + private float x = 0.0f; //存储相机的euler角 + private float y = 0.0f; //存储相机的euler角 + private Vector3 targetOnScreenPosition; //目标的屏幕坐标,第三个值为z轴距离 + + private Quaternion storeRotation; //存储相机的姿态四元数 + private Vector3 CameraTargetPosition; //target的位置 + private Vector3 initPosition; //平移时用于存储平移的起点位置 + private Vector3 cameraX; //相机的x轴方向向量 + private Vector3 cameraY; //相机的y轴方向向量 + private Vector3 cameraZ; //相机的z轴方向向量 + + private Vector3 initScreenPos; //中键刚按下时鼠标的屏幕坐标(第三个值其实没什么用) + private Vector3 curScreenPos; //当前鼠标的屏幕坐标(第三个值其实没什么用) + + + private Vector2 jilu; + + private Transform cameraTransform; + + public void Init(Transform cam, Transform target) + { + cameraTransform = cam; + this.target = target.gameObject; + + cameraEnum = CameraEnum.FrontView; + Vector3 angles = cameraTransform.eulerAngles; + x = angles.y; + y = angles.x; + CameraTargetPosition = target.transform.position; + + Distance = Vector3.Distance(cameraTransform.position, target.transform.position); + + // 给摄像机一个初始的位置和角度 + SetCameraPositionAndRotation(); + } + + public void MoveTargetTo(Vector3 newPosition, float newfloat) + { + target.transform.DOMove(newPosition, 2).OnUpdate(() => + { + Vector3 mPosition = storeRotation * new Vector3(0.0F, 0.0F, -Distance) + target.transform.position; + cameraTransform.position = mPosition; + CameraTargetPosition = target.transform.position; + } + ); + } + + void SetCameraPositionAndRotation() + { + //Vector3 position = rotation * new Vector3(0.0f, 0.0f, -11) + target.transform.position; + + x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; + y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; + + y = ClampAngle(y, minMaxSlider.x, minMaxSlider.y); + + storeRotation = Quaternion.Euler(y, x, 0); + var position = storeRotation * new Vector3(0.0f, 0.0f, -Distance) + CameraTargetPosition; + + cameraTransform.rotation = storeRotation; + cameraTransform.position = position; + } + + + //将angle限制在min~max之间 + static float ClampAngle(float angle, float min, float max) + { + if (angle < -360) + angle += 360; + if (angle > 360) + angle -= 360; + return Mathf.Clamp(angle, min, max); + } + + + public GameObject GetTarget() + { + return target; + } + + public void UpdateValue(Vector2 minMax) + { + minMaxSlider = minMax; + } + + + public void ControlCamera() + { + if (enableMouseOverUI) + { + if (EventSystem.current.IsPointerOverGameObject()) + { + return; + } + } + + if (enableMouseFunctions) + { + //鼠标右键旋转功能 + if (Input.GetMouseButton(1)) + { + //如果是顶视图,只能左右旋转,不能上下 + if (cameraEnum == CameraEnum.FrontView) + { + x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; + y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; + + y = ClampAngle(y, minMaxSlider.x, minMaxSlider.y); + + storeRotation = Quaternion.Euler(y, x, 0); + var position = storeRotation * new Vector3(0.0f, 0.0f, -Distance) + CameraTargetPosition; + + Debug.Log(storeRotation); + cameraTransform.rotation = storeRotation; + cameraTransform.position = position; + } + else + { + x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; + //y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; + + //y = ClampAngle(y, minMaxSlider.x, minMaxSlider.y); + + storeRotation = Quaternion.Euler(90, x, 0); + var position = storeRotation * new Vector3(0.0f, 0.0f, -Distance) + CameraTargetPosition; + + cameraTransform.rotation = storeRotation; + cameraTransform.position = position; + } + } + else if (Input.GetAxis("Mouse ScrollWheel") != 0) //鼠标滚轮缩放功能 + { + if (Distance >= MouseZoomMin && Distance <= MouseZoomMax) + { + Distance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity; + } + + if (Distance < MouseZoomMin) + { + Distance = MouseZoomMin; + } + + if (Distance > MouseZoomMax) + { + Distance = MouseZoomMax; + } + + cameraTransform.position = storeRotation * new Vector3(0.0F, 0.0F, -Distance) + CameraTargetPosition; + } + + //鼠标中键平移 + if (Input.GetMouseButtonDown(2)) + { + cameraX = cameraTransform.right; + cameraY = cameraTransform.up; + cameraZ = cameraTransform.forward; + + initScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z); + Debug.Log("downOnce"); + + //targetOnScreenPosition.z为目标物体到相机xmidbuttonDownPositiony平面的法线距离 + if (UnityEngine.Camera.main != null) targetOnScreenPosition = UnityEngine.Camera.main.WorldToScreenPoint(CameraTargetPosition); + initPosition = CameraTargetPosition; + } + + if (Input.GetMouseButton(2)) + { + curScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z); + //0.01这个系数是控制平移的速度,要根据相机和目标物体的distance来灵活选择 + Vector3 vv = initPosition - (0.01f * middleSpeed) * ((curScreenPos.x - initScreenPos.x) * cameraX + + (curScreenPos.y - initScreenPos.y) * cameraY); + target.transform.position = new Vector3(vv.x, vv.y, vv.z); + + //重新计算位置 + Vector3 mPosition = storeRotation * new Vector3(0.0F, 0.0F, -Distance) + target.transform.position; + cameraTransform.position = mPosition; + + // //用这个会让相机的平移变得更平滑,但是可能在你buttonup时未使相机移动到应到的位置,导致再进行旋转与缩放操作时出现短暂抖动 + //transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*moveSpeed); + } + + if (Input.GetMouseButtonUp(2)) + { + Debug.Log("upOnce"); + //平移结束把cameraTargetPosition的位置更新一下,不然会影响缩放与旋转功能 + CameraTargetPosition = target.transform.position; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs.meta new file mode 100644 index 0000000..32c640f --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/CameraControlComponent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f83adf796757446ba4c3b2d84fc9012e +timeCreated: 1716536226 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs new file mode 100644 index 0000000..6bc10dc --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs @@ -0,0 +1,4 @@ +public interface ICameraController +{ + void ControlCamera(); +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs.meta new file mode 100644 index 0000000..85f8039 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/CameraControl/ICameraController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 117f0a495e484ef0b45eb7155a72b5ef +timeCreated: 1716536177 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast.meta new file mode 100644 index 0000000..fe7db5b --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fde27b4e1f5e4fa3ab0b3e7f1249b66a +timeCreated: 1716536117 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs new file mode 100644 index 0000000..02b0ea4 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs @@ -0,0 +1,37 @@ +using System; +using MotionFramework; +using UnityEngine; + +namespace Framework.Scripts.Runtime.Engine.Engine.Camera +{ + + public class CameraRaycastComponent : IRaycastable + { + public LayerMask RaycastLayerMask = ~0; + public float RaycastDistance = 100f; + + public event Action<RaycastHit> OnRaycastHit; + private UnityEngine.Camera camera; + + public void Init() + { + camera=UnityEngine.Camera.main; + } + + public void PerformRaycast() + { + + if (camera == null) + { + Debug.LogError("没有找到主摄像机"); + return; + } + + Ray ray = camera.ScreenPointToRay(Input.mousePosition); + if (Physics.Raycast(ray, out RaycastHit hit, RaycastDistance, RaycastLayerMask)) + { + OnRaycastHit?.Invoke(hit); + } + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs.meta new file mode 100644 index 0000000..9cfa49f --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/CameraRaycastComponent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e00183c47e5a46dbb1eafcfd793004f2 +timeCreated: 1716530957 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs new file mode 100644 index 0000000..75954df --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs @@ -0,0 +1,11 @@ +using System; +using UnityEngine; + +public interface IRaycastable +{ + + + event Action<RaycastHit> OnRaycastHit; + + void PerformRaycast(); +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs.meta new file mode 100644 index 0000000..9c75210 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Camera/Raycast/IRaycastable.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5ff7acc217c44ea0adf9478b454b7e1d +timeCreated: 1716536124 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console.meta new file mode 100644 index 0000000..516553d --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e64000d37ca5cca4eb4908b53f9be554 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs new file mode 100644 index 0000000..957b41c --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs @@ -0,0 +1,25 @@ + +using System; + +namespace MotionFramework.Console +{ + [AttributeUsage(AttributeTargets.Class)] + public class ConsoleAttribute : Attribute + { + /// <summary> + /// 标题名称 + /// </summary> + public string Title; + + /// <summary> + /// 显示顺序 + /// </summary> + public int Order; + + public ConsoleAttribute(string title, int order) + { + Title = title; + Order = order; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs.meta new file mode 100644 index 0000000..fb8d1d2 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f02d224d0e39bf24db2e41f0f982b510 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs new file mode 100644 index 0000000..f42fc44 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs @@ -0,0 +1,139 @@ + +using System; +using System.Collections; +using System.Collections.Generic; +using MotionFramework.Utility; +using UnityEngine; + +namespace MotionFramework.Console +{ + public static class ConsoleGUI + { + private static bool _initGlobalStyle = false; + + public static GUIStyle HorizontalScrollbarStyle { private set; get; } + public static GUIStyle HorizontalScrollbarThumbStyle { private set; get; } + public static GUIStyle VerticalScrollbarStyle { private set; get; } + public static GUIStyle VerticalScrollbarThumbStyle { private set; get; } + public static GUIStyle XStyle { private set; get; } + public static GUIStyle ToolbarStyle { private set; get; } + public static GUIStyle ButtonStyle { private set; get; } + public static GUIStyle ToogleStyle1 { private set; get; } + public static GUIStyle ToogleStyle2 { private set; get; } + public static GUIStyle TextFieldStyle { private set; get; } + public static GUIStyle LableStyle { private set; get; } + public static GUIStyle RichLabelStyle { private set; get; } + public static int RichLabelFontSize { private set; get; } + + private static GUIStyle _cachedHorizontalScrollbarThumb; + private static GUIStyle _cachedVerticalScrollbarThumb; + + /// <summary> + /// 创建一些高度和字体大小固定的控件样式 + /// 控制台的标准分辨率为 : 1920X1080 + /// </summary> + internal static void InitGlobalStyle() + { + if (_initGlobalStyle == false) + { + _initGlobalStyle = true; + + float scale; + if (Screen.height > Screen.width) + { + // 竖屏Portrait + scale = Screen.width / 1080f; + } + else + { + // 横屏Landscape + scale = Screen.width / 1920f; + } + + HorizontalScrollbarStyle = new GUIStyle(GUI.skin.horizontalScrollbar); + HorizontalScrollbarStyle.fixedHeight = (int)(30 * scale); + HorizontalScrollbarThumbStyle = new GUIStyle(GUI.skin.horizontalScrollbarThumb); + HorizontalScrollbarThumbStyle.fixedHeight = (int)(30 * scale); + + VerticalScrollbarStyle = new GUIStyle(GUI.skin.verticalScrollbar); + VerticalScrollbarStyle.fixedWidth = (int)(30 * scale); + VerticalScrollbarThumbStyle = new GUIStyle(GUI.skin.verticalScrollbarThumb); + VerticalScrollbarThumbStyle.fixedWidth = (int)(30 * scale); + + XStyle = new GUIStyle(GUI.skin.button); + XStyle.fontSize = (int)(38 * scale); + XStyle.fixedWidth = (int)(40 * scale); + XStyle.fixedHeight = (int)(40 * scale); + + ToolbarStyle = new GUIStyle(GUI.skin.button); + ToolbarStyle.fontSize = (int)(28 * scale); + ToolbarStyle.fixedHeight = (int)(40 * scale); + + ButtonStyle = new GUIStyle(GUI.skin.button); + ButtonStyle.fontSize = (int)(28 * scale); + ButtonStyle.fixedHeight = (int)(40 * scale); + + ToogleStyle1 = new GUIStyle(GUI.skin.button); + ToogleStyle1.fontSize = (int)(26 * scale); + ToogleStyle1.fixedHeight = (int)(35 * scale); + + ToogleStyle2 = new GUIStyle(GUI.skin.box); + ToogleStyle2.fontSize = (int)(26 * scale); + ToogleStyle2.fixedHeight = (int)(35 * scale); + + TextFieldStyle = new GUIStyle(GUI.skin.textField); + TextFieldStyle.fontSize = (int)(22 * scale); + TextFieldStyle.fixedHeight = (int)(30 * scale); + + LableStyle = new GUIStyle(GUI.skin.label); + LableStyle.fontSize = (int)(24 * scale); + + RichLabelStyle = GUIStyle.none; + RichLabelStyle.richText = true; + RichLabelFontSize = (int)(24 * scale); + } + } + + public static Vector2 BeginScrollView(Vector2 pos, float offset = 0f) + { + // 设置滑动条皮肤 + _cachedHorizontalScrollbarThumb = GUI.skin.horizontalScrollbarThumb; + _cachedVerticalScrollbarThumb = GUI.skin.verticalScrollbarThumb; + GUI.skin.horizontalScrollbarThumb = HorizontalScrollbarThumbStyle; + GUI.skin.verticalScrollbarThumb = VerticalScrollbarThumbStyle; + + float scrollWidth = Screen.safeArea.width - VerticalScrollbarStyle.fixedWidth; + float scrollHeight = Screen.safeArea.height - ToolbarStyle.fixedHeight * 2 - offset; + return GUILayout.BeginScrollView(pos, HorizontalScrollbarStyle, VerticalScrollbarStyle, GUILayout.Width(scrollWidth), GUILayout.Height(scrollHeight)); + } + public static void EndScrollView() + { + GUILayout.EndScrollView(); + + // 还原滑动条皮肤 + GUI.skin.horizontalScrollbarThumb = _cachedHorizontalScrollbarThumb; + GUI.skin.verticalScrollbarThumb = _cachedVerticalScrollbarThumb; + } + public static bool Toggle(string name, bool checkFlag) + { + GUIStyle style = checkFlag ? ToogleStyle1 : ToogleStyle2; + if (GUILayout.Button(name, style)) + { + checkFlag = !checkFlag; + } + return checkFlag; + } + public static void Lable(string text) + { + GUILayout.Label($"<size={RichLabelFontSize}><color=white>{text}</color></size>", RichLabelStyle); + } + public static void RedLable(string text) + { + GUILayout.Label($"<size={RichLabelFontSize}><color=red>{text}</color></size>", RichLabelStyle); + } + public static void YellowLable(string text) + { + GUILayout.Label($"<size={RichLabelFontSize}><color=yellow>{text}</color></size>", RichLabelStyle); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs.meta new file mode 100644 index 0000000..3711222 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/ConsoleGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5fd3df705aafda04ba9590b482ab54a4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs new file mode 100644 index 0000000..35e96a7 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs @@ -0,0 +1,170 @@ + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MotionFramework.Utility; + +namespace MotionFramework.Console +{ + /// <summary> + /// 控制台 + /// </summary> + public static class DeveloperConsole + { + private class WindowWrapper : IComparer<WindowWrapper>, IComparable<WindowWrapper> + { + public Type ClassType; + public string Title; + public int Priority; + public IConsoleWindow Instance; + + public int CompareTo(WindowWrapper other) + { + return Compare(this, other); + } + public int Compare(WindowWrapper a, WindowWrapper b) + { + return a.Priority.CompareTo(b.Priority); + } + } + + /// <summary> + /// 控制台节点列表 + /// </summary> + private readonly static List<WindowWrapper> _wrappers = new List<WindowWrapper>(); + + // FPS相关 + private static FPSCounter _fpsCounter = null; + private static int _lastFrame = 0; + + // GUI相关 + private static bool _visible = false; + private static int _showIndex = 0; + private static Texture _bgTexture; + private static string[] _toolbarTitles; + + /// <summary> + /// 初始化控制台 + /// </summary> + /// <param name="assemblyName">扩展的控制台窗口所在的程序集</param> + public static void Initialize(bool showFPS = true, string assemblyName = AssemblyUtility.UnityDefaultAssemblyName) + { + if (showFPS) + { + _fpsCounter = new FPSCounter(); + } + + // 加载背景纹理 + string textureName = "console_background"; + _bgTexture = Resources.Load<Texture>(textureName); + if (_bgTexture == null) + UnityEngine.Debug.LogWarning($"Not found {textureName} texture in Resources folder."); + + // 获取所有控制台窗口类 + List<Type> types = AssemblyUtility.GetAssignableAttributeTypes(AssemblyUtility.MotionFrameworkAssemblyName, typeof(IConsoleWindow), typeof(ConsoleAttribute)); + List<Type> temps = AssemblyUtility.GetAssignableAttributeTypes(assemblyName, typeof(IConsoleWindow), typeof(ConsoleAttribute)); + types.AddRange(temps); + for (int i = 0; i < types.Count; i++) + { + ConsoleAttribute attribute = (ConsoleAttribute)Attribute.GetCustomAttribute(types[i], typeof(ConsoleAttribute)); + WindowWrapper wrapper = new WindowWrapper() + { + ClassType = types[i], + Title = attribute.Title, + Priority = attribute.Order, + }; + _wrappers.Add(wrapper); + } + + // 根据优先级排序 + _wrappers.Sort(); + + // 创建实例类 + for (int i = 0; i < _wrappers.Count; i++) + { + WindowWrapper wrapper = _wrappers[i]; + wrapper.Instance = (IConsoleWindow)Activator.CreateInstance(wrapper.ClassType); + } + + // 标题列表 + List<string> titles = new List<string>(); + for (int i = 0; i < _wrappers.Count; i++) + { + titles.Add(_wrappers[i].Title); + } + _toolbarTitles = titles.ToArray(); + } + + /// <summary> + /// 绘制控制台 + /// 注意:该接口必须在OnGUI函数内调用 + /// </summary> + public static void Draw() + { + if (_fpsCounter != null) + { + if (_lastFrame != Time.frameCount) + { + _lastFrame = Time.frameCount; + _fpsCounter.Update(); + } + } + + // 注意:GUI接口只能在OnGUI内部使用 + ConsoleGUI.InitGlobalStyle(); + + float posX = Screen.safeArea.x; + float posY = Screen.height - Screen.safeArea.height - Screen.safeArea.y; + + if (_visible == false) + { + float wdith = ConsoleGUI.XStyle.fixedWidth; + float height = ConsoleGUI.XStyle.fixedHeight; + + // 显示按钮 + if (GUI.Button(new Rect(posX + 10, posY + 10, wdith, height), "X", ConsoleGUI.XStyle)) + _visible = true; + + // FPS + if (_fpsCounter != null) + { + int fps = _fpsCounter.GetFPS(); + string text = $"<size={ConsoleGUI.RichLabelFontSize * 2}><color=red>{fps}</color></size>"; + GUI.Label(new Rect(posX + wdith * 1.5f, posY + 5, wdith * 2, height * 2), text, ConsoleGUI.RichLabelStyle); + } + } + else + { + Rect windowRect = new Rect(posX, posY, Screen.safeArea.width, Screen.safeArea.height); + GUI.Window(0, windowRect, DrawWindow, string.Empty); + } + } + private static void DrawWindow(int windowID) + { + // 绘制背景 + if (_visible && _bgTexture != null) + GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), _bgTexture, ScaleMode.StretchToFill, true); + + GUILayout.BeginHorizontal(); + { + // 隐藏按钮 + if (GUILayout.Button("X", ConsoleGUI.ButtonStyle, GUILayout.Width(ConsoleGUI.ButtonStyle.fixedHeight))) + _visible = false; + + // 绘制按钮栏 + _showIndex = GUILayout.Toolbar(_showIndex, _toolbarTitles, ConsoleGUI.ToolbarStyle); + } + GUILayout.EndHorizontal(); + + // 绘制选中窗口 + for (int i = 0; i < _wrappers.Count; i++) + { + if (_showIndex != i) + continue; + WindowWrapper wrapper = _wrappers[i]; + wrapper.Instance.OnGUI(); + } + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs.meta new file mode 100644 index 0000000..893a338 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/DeveloperConsole.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 08697fd1e8d875c4888cba0db1280b60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs new file mode 100644 index 0000000..caffd26 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs @@ -0,0 +1,42 @@ +using UnityEngine; + +namespace MotionFramework.Console +{ + public class FPSCounter + { + private const float UpdateInterval = 1.0f; + + private bool _isStart = false; + private float _lastInterval; + private int _frames; + private float _ms; + private float _fps; + + public void Update() + { + if (_isStart == false) + { + _isStart = true; + _lastInterval = Time.realtimeSinceStartup; + } + + ++_frames; + float timeNow = Time.realtimeSinceStartup; + if (timeNow > _lastInterval + UpdateInterval) + { + _fps = _frames / (timeNow - _lastInterval); + _ms = 1000.0f / Mathf.Max(_fps, 0.00001f); + _frames = 0; + _lastInterval = timeNow; + } + } + public int GetFPS() + { + return Mathf.CeilToInt(_fps); + } + public float GetMS() + { + return _ms; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs.meta new file mode 100644 index 0000000..73007d6 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/FPSCounter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 269834f2912e01245a28761bc1787ffc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs new file mode 100644 index 0000000..23bcdd5 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs @@ -0,0 +1,9 @@ + + +namespace MotionFramework.Console +{ + public interface IConsoleWindow + { + void OnGUI(); + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs.meta new file mode 100644 index 0000000..85d5c50 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Console/IConsoleWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e825e215c03a3a54d9ee86a64d99c51a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Network.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Network.meta new file mode 100644 index 0000000..bbca743 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Network.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5df74ec92889b640bf662d3a2991bb2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference.meta new file mode 100644 index 0000000..8336da5 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8fe81b14a1faa17408f8bcc7b18f11f6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs new file mode 100644 index 0000000..8ccc922 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs @@ -0,0 +1,9 @@ + + +namespace MotionFramework.Reference +{ + public interface IReference + { + void OnRelease(); + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs.meta new file mode 100644 index 0000000..8aa5c26 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/IReference.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b7a4e9d2f217d14fa3fd2c5a2de2f8c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs new file mode 100644 index 0000000..f2ba97f --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs @@ -0,0 +1,90 @@ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace MotionFramework.Reference +{ + internal class ReferenceCollector + { + private readonly Stack<IReference> _collector; + + /// <summary> + /// 引用类型 + /// </summary> + public Type ClassType { private set; get; } + + /// <summary> + /// 内部缓存总数 + /// </summary> + public int Count + { + get { return _collector.Count; } + } + + /// <summary> + /// 外部使用总数 + /// </summary> + public int SpawnCount { private set; get; } + + + public ReferenceCollector(Type type, int capacity) + { + ClassType = type; + + // 创建缓存池 + _collector = new Stack<IReference>(capacity); + + // 检测是否继承了专属接口 + Type temp = type.GetInterface(nameof(IReference)); + if (temp == null) + throw new Exception($"{type.Name} must inherit from {nameof(IReference)}"); + } + + /// <summary> + /// 申请引用对象 + /// </summary> + public IReference Spawn() + { + IReference item; + if (_collector.Count > 0) + { + item = _collector.Pop(); + } + else + { + item = Activator.CreateInstance(ClassType) as IReference; + } + SpawnCount++; + return item; + } + + /// <summary> + /// 回收引用对象 + /// </summary> + public void Release(IReference item) + { + if (item == null) + return; + + if (item.GetType() != ClassType) + throw new Exception($"Invalid type {item.GetType()}"); + + if (_collector.Contains(item)) + throw new Exception($"The item {item.GetType()} already exists."); + + SpawnCount--; + item.OnRelease(); + _collector.Push(item); + } + + /// <summary> + /// 清空集合 + /// </summary> + public void Clear() + { + _collector.Clear(); + SpawnCount = 0; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs.meta new file mode 100644 index 0000000..685ef11 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferenceCollector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c5b53630547ac94d9281a9abb0814c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs new file mode 100644 index 0000000..53aeddf --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs @@ -0,0 +1,115 @@ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace MotionFramework.Reference +{ + /// <summary> + /// 引用池 + /// </summary> + public static class ReferencePool + { + private static readonly Dictionary<Type, ReferenceCollector> _collectors = new Dictionary<Type, ReferenceCollector>(); + + /// <summary> + /// 对象池初始容量 + /// </summary> + public static int InitCapacity { get; set; } = 100; + + /// <summary> + /// 对象池的数量 + /// </summary> + public static int Count + { + get + { + return _collectors.Count; + } + } + + + /// <summary> + /// 清除所有对象池 + /// </summary> + public static void ClearAll() + { + _collectors.Clear(); + } + + /// <summary> + /// 申请引用对象 + /// </summary> + public static IReference Spawn(Type type) + { + if (_collectors.ContainsKey(type) == false) + { + _collectors.Add(type, new ReferenceCollector(type, InitCapacity)); + } + return _collectors[type].Spawn(); + } + + /// <summary> + /// 申请引用对象 + /// </summary> + public static T Spawn<T>() where T : class, IReference, new() + { + Type type = typeof(T); + return Spawn(type) as T; + } + + /// <summary> + /// 回收引用对象 + /// </summary> + public static void Release(IReference item) + { + Type type = item.GetType(); + if (_collectors.ContainsKey(type) == false) + { + _collectors.Add(type, new ReferenceCollector(type, InitCapacity)); + } + _collectors[type].Release(item); + } + + /// <summary> + /// 批量回收列表集合 + /// </summary> + public static void Release<T>(List<T> items) where T : class, IReference, new() + { + Type type = typeof(T); + if (_collectors.ContainsKey(type) == false) + { + _collectors.Add(type, new ReferenceCollector(type, InitCapacity)); + } + + for (int i = 0; i < items.Count; i++) + { + _collectors[type].Release(items[i]); + } + } + + /// <summary> + /// 批量回收数组集合 + /// </summary> + public static void Release<T>(T[] items) where T : class, IReference, new() + { + Type type = typeof(T); + if (_collectors.ContainsKey(type) == false) + { + _collectors.Add(type, new ReferenceCollector(type, InitCapacity)); + } + + for (int i = 0; i < items.Length; i++) + { + _collectors[type].Release(items[i]); + } + } + + #region 调试专属方法 + internal static Dictionary<Type, ReferenceCollector> GetAllCollectors + { + get { return _collectors; } + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs.meta new file mode 100644 index 0000000..f73181e --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f4f4ee7b0e49ee459b54961143b5847 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility.meta new file mode 100644 index 0000000..a1d45cb --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f00e9242af88e04b905a41cfdf8c50d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs new file mode 100644 index 0000000..022f5af --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs @@ -0,0 +1,141 @@ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; + +namespace MotionFramework.Utility +{ + public static class AssemblyUtility + { + public const string MotionFrameworkAssemblyName = "MotionFramework"; + public const string MotionFrameworkAssemblyEditorName = "MotionFramework.Editor"; + public const string UnityDefaultAssemblyName = "Assembly-CSharp"; + public const string UnityDefaultAssemblyEditorName = "Assembly-CSharp-Editor"; + + + private static readonly Dictionary<string, List<Type>> _cache = new Dictionary<string, List<Type>>(); + + static AssemblyUtility() + { + _cache.Clear(); + } + + /// <summary> + /// 获取程序集 + /// </summary> + public static Assembly GetAssembly(string assemblyName) + { + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (Assembly assembly in assemblies) + { + if (assembly.GetName().Name == assemblyName) + return assembly; + } + return null; + } + + /// <summary> + /// 获取程序集里的所有类型 + /// </summary> + private static List<Type> GetTypes(string assemblyName) + { + if (_cache.ContainsKey(assemblyName)) + return _cache[assemblyName]; + + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (Assembly assembly in assemblies) + { + if (assembly.GetName().Name == assemblyName) + { + List<Type> types = assembly.GetTypes().ToList(); + _cache.Add(assemblyName, types); + return types; + } + } + + // 注意:如果没有找到程序集返回空列表 + UnityEngine.Debug.LogWarning($"Not found assembly : {assemblyName}"); + return new List<Type>(); + } + + /// <summary> + /// 获取带继承关系的所有类的类型 + /// <param name="parentType">父类类型</param> + /// </summary> + public static List<Type> GetAssignableTypes(string assemblyName, System.Type parentType) + { + List<Type> result = new List<Type>(); + List<Type> cacheTypes = GetTypes(assemblyName); + for (int i = 0; i < cacheTypes.Count; i++) + { + Type type = cacheTypes[i]; + + // 判断继承关系 + if (parentType.IsAssignableFrom(type)) + { + if (type.Name == parentType.Name) + continue; + result.Add(type); + } + } + return result; + } + + /// <summary> + /// 获取带属性标签的所有类的类型 + /// <param name="attributeType">属性类型</param> + /// </summary> + public static List<Type> GetAttributeTypes(string assemblyName, System.Type attributeType) + { + List<Type> result = new List<Type>(); + List<Type> cacheTypes = GetTypes(assemblyName); + for (int i = 0; i < cacheTypes.Count; i++) + { + System.Type type = cacheTypes[i]; + + // 判断属性标签 + if (Attribute.IsDefined(type, attributeType)) + { + result.Add(type); + } + } + return result; + } + + /// <summary> + /// 获取带继承关系和属性标签的所有类的类型 + /// </summary> + /// <param name="parentType">父类类型</param> + /// <param name="attributeType">属性类型</param> + public static List<Type> GetAssignableAttributeTypes(string assemblyName, System.Type parentType, System.Type attributeType, bool checkError = true) + { + List<Type> result = new List<Type>(); + List<Type> cacheTypes = GetTypes(assemblyName); + for (int i = 0; i < cacheTypes.Count; i++) + { + Type type = cacheTypes[i]; + + // 判断属性标签 + if (Attribute.IsDefined(type, attributeType)) + { + // 判断继承关系 + if (parentType.IsAssignableFrom(type)) + { + if (type.Name == parentType.Name) + continue; + result.Add(type); + } + else + { + if(checkError) + throw new Exception($"class {type} must inherit from {parentType}."); + } + } + } + return result; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs.meta new file mode 100644 index 0000000..dfba33a --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/AssemblyUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f5e6f29b65bf0449a7d33dbe1c04380 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs new file mode 100644 index 0000000..2c7e6f2 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs @@ -0,0 +1,71 @@ + +using System; +using System.Text; +using System.IO; + +namespace MotionFramework.Utility +{ + public static class FileUtility + { + /// <summary> + /// 读取文件 + /// </summary> + public static string ReadFile(string filePath) + { + if (File.Exists(filePath) == false) + return string.Empty; + return File.ReadAllText(filePath, Encoding.UTF8); + } + + /// <summary> + /// 创建文件 + /// </summary> + public static void CreateFile(string filePath, string content) + { + // 删除旧文件 + if (File.Exists(filePath)) + File.Delete(filePath); + + // 创建文件夹路径 + CreateFileDirectory(filePath); + + // 创建新文件 + byte[] bytes = Encoding.UTF8.GetBytes(content); + using (FileStream fs = File.Create(filePath)) + { + fs.Write(bytes, 0, bytes.Length); + fs.Flush(); + fs.Close(); + } + } + + /// <summary> + /// 创建文件的文件夹路径 + /// </summary> + public static void CreateFileDirectory(string filePath) + { + // 获取文件的文件夹路径 + string directory = Path.GetDirectoryName(filePath); + CreateDirectory(directory); + } + + /// <summary> + /// 创建文件夹路径 + /// </summary> + public static void CreateDirectory(string directory) + { + // If the directory doesn't exist, create it. + if (Directory.Exists(directory) == false) + Directory.CreateDirectory(directory); + } + + /// <summary> + /// 获取文件大小(字节数) + /// </summary> + public static long GetFileSize(string filePath) + { + FileInfo fileInfo = new FileInfo(filePath); + return fileInfo.Length; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs.meta new file mode 100644 index 0000000..32d5c5d --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/FileUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b11b6a7c3e2ac3b42934279f2611bd51 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs new file mode 100644 index 0000000..73669e3 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs @@ -0,0 +1,170 @@ + +using System; +using System.Text; +using System.IO; +using System.Security.Cryptography; + +namespace MotionFramework.Utility +{ + public static class HashUtility + { + private static string ToString(byte[] hashBytes) + { + string result = BitConverter.ToString(hashBytes); + result = result.Replace("-", ""); + return result.ToLower(); + } + + #region SHA1 + /// <summary> + /// 获取字符串的Hash值 + /// </summary> + public static string StringSHA1(string str) + { + byte[] buffer = Encoding.UTF8.GetBytes(str); + return BytesSHA1(buffer); + } + + /// <summary> + /// 获取文件的Hash值 + /// </summary> + public static string FileSHA1(string filePath) + { + try + { + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + return StreamSHA1(fs); + } + } + catch (Exception e) + { + MotionLog.Exception(e.ToString()); + return string.Empty; + } + } + + /// <summary> + /// 获取数据流的Hash值 + /// </summary> + public static string StreamSHA1(Stream stream) + { + // 说明:创建的是SHA1类的实例,生成的是160位的散列码 + HashAlgorithm hash = HashAlgorithm.Create(); + byte[] hashBytes = hash.ComputeHash(stream); + return ToString(hashBytes); + } + + /// <summary> + /// 获取字节数组的Hash值 + /// </summary> + public static string BytesSHA1(byte[] buffer) + { + // 说明:创建的是SHA1类的实例,生成的是160位的散列码 + HashAlgorithm hash = HashAlgorithm.Create(); + byte[] hashBytes = hash.ComputeHash(buffer); + return ToString(hashBytes); + } + #endregion + + #region MD5 + /// <summary> + /// 获取字符串的MD5 + /// </summary> + public static string StringMD5(string str) + { + byte[] buffer = Encoding.UTF8.GetBytes(str); + return BytesMD5(buffer); + } + + /// <summary> + /// 获取文件的MD5 + /// </summary> + public static string FileMD5(string filePath) + { + try + { + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + return StreamMD5(fs); + } + } + catch (Exception e) + { + MotionLog.Exception(e.ToString()); + return string.Empty; + } + } + + /// <summary> + /// 获取数据流的MD5 + /// </summary> + public static string StreamMD5(Stream stream) + { + MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); + byte[] hashBytes = provider.ComputeHash(stream); + return ToString(hashBytes); + } + + /// <summary> + /// 获取字节数组的MD5 + /// </summary> + public static string BytesMD5(byte[] buffer) + { + MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); + byte[] hashBytes = provider.ComputeHash(buffer); + return ToString(hashBytes); + } + #endregion + + #region CRC32 + /// <summary> + /// 获取字符串的CRC32 + /// </summary> + public static string StringCRC32(string str) + { + byte[] buffer = Encoding.UTF8.GetBytes(str); + return BytesCRC32(buffer); + } + + /// <summary> + /// 获取文件的CRC32 + /// </summary> + public static string FileCRC32(string filePath) + { + try + { + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + return StreamCRC32(fs); + } + } + catch (Exception e) + { + MotionLog.Exception(e.ToString()); + return string.Empty; + } + } + + /// <summary> + /// 获取数据流的CRC32 + /// </summary> + public static string StreamCRC32(Stream stream) + { + CRC32Algorithm hash = new CRC32Algorithm(); + byte[] hashBytes = hash.ComputeHash(stream); + return ToString(hashBytes); + } + + /// <summary> + /// 获取字节数组的CRC32 + /// </summary> + public static string BytesCRC32(byte[] buffer) + { + CRC32Algorithm hash = new CRC32Algorithm(); + byte[] hashBytes = hash.ComputeHash(buffer); + return ToString(hashBytes); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs.meta new file mode 100644 index 0000000..418d44e --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/HashUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24be65499552d3e46a4b8611ae81b9f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc.meta new file mode 100644 index 0000000..034f325 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3123d2179297db341a92247c7ed04a4d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs new file mode 100644 index 0000000..2f14121 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs @@ -0,0 +1,70 @@ + +using System; + +namespace MotionFramework.Utility +{ + public struct BitMask32 + { + private int _mask; + + public static implicit operator int(BitMask32 mask) { return mask._mask; } + public static implicit operator BitMask32(int mask) { return new BitMask32(mask); } + + public BitMask32(int mask) + { + _mask = mask; + } + + /// <summary> + /// 打开位 + /// </summary> + public void Open(int bit) + { + if (bit < 0 || bit > 31) + throw new ArgumentOutOfRangeException(); + else + _mask |= 1 << bit; + } + + /// <summary> + /// 关闭位 + /// </summary> + public void Close(int bit) + { + if (bit < 0 || bit > 31) + throw new ArgumentOutOfRangeException(); + else + _mask &= ~(1 << bit); + } + + /// <summary> + /// 位取反 + /// </summary> + public void Reverse(int bit) + { + if (bit < 0 || bit > 31) + throw new ArgumentOutOfRangeException(); + else + _mask ^= 1 << bit; + } + + /// <summary> + /// 所有位取反 + /// </summary> + public void Inverse() + { + _mask = ~_mask; + } + + /// <summary> + /// 比对位值 + /// </summary> + public bool Test(int bit) + { + if (bit < 0 || bit > 31) + throw new ArgumentOutOfRangeException(); + else + return (_mask & (1 << bit)) != 0; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs.meta new file mode 100644 index 0000000..05ee12f --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask32.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 229afadde794cc744a32a2ec829a67f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs new file mode 100644 index 0000000..3649afc --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs @@ -0,0 +1,74 @@ +//-------------------------------------------------- +// Motion Framework +// Copyright©2020-2020 何冠峰 +// Licensed under the MIT license +//-------------------------------------------------- +using System; + +namespace MotionFramework.Utility +{ + public struct BitMask64 + { + private long _mask; + + public static implicit operator long(BitMask64 mask) { return mask._mask; } + public static implicit operator BitMask64(long mask) { return new BitMask64(mask); } + + public BitMask64(long mask) + { + _mask = mask; + } + + /// <summary> + /// 打开位 + /// </summary> + public void Open(int bit) + { + if (bit < 0 || bit > 63) + throw new ArgumentOutOfRangeException(); + else + _mask |= 1L << bit; + } + + /// <summary> + /// 关闭位 + /// </summary> + public void Close(int bit) + { + if (bit < 0 || bit > 63) + throw new ArgumentOutOfRangeException(); + else + _mask &= ~(1L << bit); + } + + /// <summary> + /// 位取反 + /// </summary> + public void Reverse(int bit) + { + if (bit < 0 || bit > 63) + throw new ArgumentOutOfRangeException(); + else + _mask ^= 1L << bit; + } + + /// <summary> + /// 所有位取反 + /// </summary> + public void Inverse() + { + _mask = ~_mask; + } + + /// <summary> + /// 比对位值 + /// </summary> + public bool Test(int bit) + { + if (bit < 0 || bit > 63) + throw new ArgumentOutOfRangeException(); + else + return (_mask & (1L << bit)) != 0; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs.meta new file mode 100644 index 0000000..3ea476a --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/BitMask64.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 292cc03e5ad0d724188fbfa83506e5e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs new file mode 100644 index 0000000..eacad0b --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs @@ -0,0 +1,247 @@ +//-------------------------------------------------- +// This is .NET safe implementation of Crc32 algorithm. +// Copyright©2016-2017 Max Vysokikh +// Copyright©2020-2020 何冠峰 +// Licensed under the MIT license +//-------------------------------------------------- +using System; +using System.Security.Cryptography; + +namespace MotionFramework.Utility +{ + internal class SafeProxy + { + private const uint Poly = 0xedb88320u; + private readonly uint[] _table = new uint[16 * 256]; + + internal SafeProxy() + { + Init(Poly); + } + public void Init(uint poly) + { + var table = _table; + for (uint i = 0; i < 256; i++) + { + uint res = i; + for (int t = 0; t < 16; t++) + { + for (int k = 0; k < 8; k++) res = (res & 1) == 1 ? poly ^ (res >> 1) : (res >> 1); + table[(t * 256) + i] = res; + } + } + } + public uint Append(uint crc, byte[] input, int offset, int length) + { + uint crcLocal = uint.MaxValue ^ crc; + + uint[] table = _table; + while (length >= 16) + { + var a = table[(3 * 256) + input[offset + 12]] + ^ table[(2 * 256) + input[offset + 13]] + ^ table[(1 * 256) + input[offset + 14]] + ^ table[(0 * 256) + input[offset + 15]]; + + var b = table[(7 * 256) + input[offset + 8]] + ^ table[(6 * 256) + input[offset + 9]] + ^ table[(5 * 256) + input[offset + 10]] + ^ table[(4 * 256) + input[offset + 11]]; + + var c = table[(11 * 256) + input[offset + 4]] + ^ table[(10 * 256) + input[offset + 5]] + ^ table[(9 * 256) + input[offset + 6]] + ^ table[(8 * 256) + input[offset + 7]]; + + var d = table[(15 * 256) + ((byte)crcLocal ^ input[offset])] + ^ table[(14 * 256) + ((byte)(crcLocal >> 8) ^ input[offset + 1])] + ^ table[(13 * 256) + ((byte)(crcLocal >> 16) ^ input[offset + 2])] + ^ table[(12 * 256) + ((crcLocal >> 24) ^ input[offset + 3])]; + + crcLocal = d ^ c ^ b ^ a; + offset += 16; + length -= 16; + } + + while (--length >= 0) + crcLocal = table[(byte)(crcLocal ^ input[offset++])] ^ crcLocal >> 8; + + return crcLocal ^ uint.MaxValue; + } + } + + /// <summary> + /// Implementation of CRC-32. + /// This class supports several convenient static methods returning the CRC as UInt32. + /// </summary> + public class CRC32Algorithm : HashAlgorithm + { + private uint _currentCrc; + + /// <summary> + /// Initializes a new instance of the <see cref="CRC32Algorithm"/> class. + /// </summary> + public CRC32Algorithm() + { +#if !NETCORE13 + HashSizeValue = 32; +#endif + } + + /// <summary> + /// Resets internal state of the algorithm. Used internally. + /// </summary> + public override void Initialize() + { + _currentCrc = 0; + } + + /// <summary> + /// Appends CRC-32 from given buffer + /// </summary> + protected override void HashCore(byte[] input, int offset, int length) + { + _currentCrc = AppendInternal(_currentCrc, input, offset, length); + } + + /// <summary> + /// Computes CRC-32 from <see cref="HashCore"/> + /// </summary> + protected override byte[] HashFinal() + { + if(BitConverter.IsLittleEndian) + return new[] { (byte)_currentCrc, (byte)(_currentCrc >> 8), (byte)(_currentCrc >> 16), (byte)(_currentCrc >> 24) }; + else + return new[] { (byte)(_currentCrc >> 24), (byte)(_currentCrc >> 16), (byte)(_currentCrc >> 8), (byte)_currentCrc }; + } + + + /// <summary> + /// Computes CRC-32 from multiple buffers. + /// Call this method multiple times to chain multiple buffers. + /// </summary> + /// <param name="initial"> + /// Initial CRC value for the algorithm. It is zero for the first buffer. + /// Subsequent buffers should have their initial value set to CRC value returned by previous call to this method. + /// </param> + /// <param name="input">Input buffer with data to be checksummed.</param> + /// <param name="offset">Offset of the input data within the buffer.</param> + /// <param name="length">Length of the input data in the buffer.</param> + /// <returns>Accumulated CRC-32 of all buffers processed so far.</returns> + public static uint Append(uint initial, byte[] input, int offset, int length) + { + if (input == null) + throw new ArgumentNullException("input"); + if (offset < 0 || length < 0 || offset + length > input.Length) + throw new ArgumentOutOfRangeException("length"); + return AppendInternal(initial, input, offset, length); + } + + /// <summary> + /// Computes CRC-32 from multiple buffers. + /// Call this method multiple times to chain multiple buffers. + /// </summary> + /// <param name="initial"> + /// Initial CRC value for the algorithm. It is zero for the first buffer. + /// Subsequent buffers should have their initial value set to CRC value returned by previous call to this method. + /// </param> + /// <param name="input">Input buffer containing data to be checksummed.</param> + /// <returns>Accumulated CRC-32 of all buffers processed so far.</returns> + public static uint Append(uint initial, byte[] input) + { + if (input == null) + throw new ArgumentNullException(); + return AppendInternal(initial, input, 0, input.Length); + } + + /// <summary> + /// Computes CRC-32 from input buffer. + /// </summary> + /// <param name="input">Input buffer with data to be checksummed.</param> + /// <param name="offset">Offset of the input data within the buffer.</param> + /// <param name="length">Length of the input data in the buffer.</param> + /// <returns>CRC-32 of the data in the buffer.</returns> + public static uint Compute(byte[] input, int offset, int length) + { + return Append(0, input, offset, length); + } + + /// <summary> + /// Computes CRC-32 from input buffer. + /// </summary> + /// <param name="input">Input buffer containing data to be checksummed.</param> + /// <returns>CRC-32 of the buffer.</returns> + public static uint Compute(byte[] input) + { + return Append(0, input); + } + + /// <summary> + /// Computes CRC-32 from input buffer and writes it after end of data (buffer should have 4 bytes reserved space for it). Can be used in conjunction with <see cref="IsValidWithCrcAtEnd(byte[],int,int)"/> + /// </summary> + /// <param name="input">Input buffer with data to be checksummed.</param> + /// <param name="offset">Offset of the input data within the buffer.</param> + /// <param name="length">Length of the input data in the buffer.</param> + /// <returns>CRC-32 of the data in the buffer.</returns> + public static uint ComputeAndWriteToEnd(byte[] input, int offset, int length) + { + if (length + 4 > input.Length) + throw new ArgumentOutOfRangeException("length", "Length of data should be less than array length - 4 bytes of CRC data"); + var crc = Append(0, input, offset, length); + var r = offset + length; + input[r] = (byte)crc; + input[r + 1] = (byte)(crc >> 8); + input[r + 2] = (byte)(crc >> 16); + input[r + 3] = (byte)(crc >> 24); + return crc; + } + + /// <summary> + /// Computes CRC-32 from input buffer - 4 bytes and writes it as last 4 bytes of buffer. Can be used in conjunction with <see cref="IsValidWithCrcAtEnd(byte[])"/> + /// </summary> + /// <param name="input">Input buffer with data to be checksummed.</param> + /// <returns>CRC-32 of the data in the buffer.</returns> + public static uint ComputeAndWriteToEnd(byte[] input) + { + if (input.Length < 4) + throw new ArgumentOutOfRangeException("input", "Input array should be 4 bytes at least"); + return ComputeAndWriteToEnd(input, 0, input.Length - 4); + } + + /// <summary> + /// Validates correctness of CRC-32 data in source buffer with assumption that CRC-32 data located at end of buffer in reverse bytes order. Can be used in conjunction with <see cref="ComputeAndWriteToEnd(byte[],int,int)"/> + /// </summary> + /// <param name="input">Input buffer with data to be checksummed.</param> + /// <param name="offset">Offset of the input data within the buffer.</param> + /// <param name="lengthWithCrc">Length of the input data in the buffer with CRC-32 bytes.</param> + /// <returns>Is checksum valid.</returns> + public static bool IsValidWithCrcAtEnd(byte[] input, int offset, int lengthWithCrc) + { + return Append(0, input, offset, lengthWithCrc) == 0x2144DF1C; + } + + /// <summary> + /// Validates correctness of CRC-32 data in source buffer with assumption that CRC-32 data located at end of buffer in reverse bytes order. Can be used in conjunction with <see cref="ComputeAndWriteToEnd(byte[],int,int)"/> + /// </summary> + /// <param name="input">Input buffer with data to be checksummed.</param> + /// <returns>Is checksum valid.</returns> + public static bool IsValidWithCrcAtEnd(byte[] input) + { + if (input.Length < 4) + throw new ArgumentOutOfRangeException("input", "Input array should be 4 bytes at least"); + return Append(0, input, 0, input.Length) == 0x2144DF1C; + } + + + private static readonly SafeProxy _proxy = new SafeProxy(); + private static uint AppendInternal(uint initial, byte[] input, int offset, int length) + { + if (length > 0) + { + return _proxy.Append(initial, input, offset, length); + } + else + return initial; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs.meta new file mode 100644 index 0000000..943b229 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/CRC32Algorithm.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b096abda3d32ea44b9870c8fa2a6560 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs new file mode 100644 index 0000000..1b9de2c --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs @@ -0,0 +1,110 @@ +//-------------------------------------------------- +// Motion Framework +// Copyright©2020-2020 何冠峰 +// Licensed under the MIT license +//-------------------------------------------------- +using System; +using UnityEngine; + +namespace MotionFramework.Utility +{ + [Serializable] + public struct ObfuscateDouble : IFormattable, IEquatable<ObfuscateDouble>, IComparable<ObfuscateDouble>, IComparable<double>, IComparable + { + private static long GlobalSeed = DateTime.Now.Ticks; + + [SerializeField] + private long _seed; + [SerializeField] + private long _data; + + public ObfuscateDouble(double value) + { + _seed = GlobalSeed++; + _data = 0; + Value = value; + } + internal double Value + { + get + { + var v = _data ^ _seed; + return ConvertValue(v); + } + set + { + var v = ConvertValue(value); + _data = v ^ _seed; + } + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + public override string ToString() + { + return Value.ToString(); + } + public override bool Equals(object obj) + { + return obj is ObfuscateDouble && Equals((ObfuscateDouble)obj); + } + + public string ToString(string format) + { + return Value.ToString(format); + } + public string ToString(IFormatProvider provider) + { + return Value.ToString(provider); + } + public string ToString(string format, IFormatProvider provider) + { + return Value.ToString(format, provider); + } + + public bool Equals(ObfuscateDouble obj) + { + return obj.Value.Equals(Value); + } + public int CompareTo(ObfuscateDouble other) + { + return Value.CompareTo(other.Value); + } + public int CompareTo(double other) + { + return Value.CompareTo(other); + } + public int CompareTo(object obj) + { + return Value.CompareTo(obj); + } + + #region 运算符重载 + public static implicit operator double(ObfuscateDouble value) + { + return value.Value; + } + public static implicit operator ObfuscateDouble(double value) + { + return new ObfuscateDouble(value); + } + public static explicit operator ObfuscateDouble(ObfuscateFloat value) + { + return (float)value; + } + #endregion + + unsafe static long ConvertValue(double value) + { + double* ptr = &value; + return *((long*)ptr); + } + unsafe static double ConvertValue(long value) + { + long* ptr = &value; + return *((double*)ptr); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs.meta new file mode 100644 index 0000000..6c11a0f --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateDouble.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b8a64fba6ba07a45b9c3f5355dd76bc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs new file mode 100644 index 0000000..d65215b --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs @@ -0,0 +1,106 @@ +//-------------------------------------------------- +// Motion Framework +// Copyright©2020-2020 何冠峰 +// Licensed under the MIT license +//-------------------------------------------------- +using System; +using UnityEngine; + +namespace MotionFramework.Utility +{ + [Serializable] + public struct ObfuscateFloat : IFormattable, IEquatable<ObfuscateFloat>, IComparable<ObfuscateFloat>, IComparable<float>, IComparable + { + private static int GlobalSeed = (int)DateTime.Now.Ticks; + + [SerializeField] + private int _seed; + [SerializeField] + private int _data; + + public ObfuscateFloat(float value) + { + _seed = GlobalSeed++; + _data = 0; + Value = value; + } + internal float Value + { + get + { + var v = _data ^ _seed; + return ConvertValue(v); + } + set + { + var v = ConvertValue(value); + _data = v ^ _seed; + } + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + public override string ToString() + { + return Value.ToString(); + } + public override bool Equals(object obj) + { + return obj is ObfuscateFloat && Equals((ObfuscateFloat)obj); + } + + public string ToString(string format) + { + return Value.ToString(format); + } + public string ToString(IFormatProvider provider) + { + return Value.ToString(provider); + } + public string ToString(string format, IFormatProvider provider) + { + return Value.ToString(format, provider); + } + + public bool Equals(ObfuscateFloat obj) + { + return obj.Value.Equals(Value); + } + public int CompareTo(ObfuscateFloat other) + { + return Value.CompareTo(other.Value); + } + public int CompareTo(float other) + { + return Value.CompareTo(other); + } + public int CompareTo(object obj) + { + return Value.CompareTo(obj); + } + + #region 运算符重载 + public static implicit operator float(ObfuscateFloat value) + { + return value.Value; + } + public static implicit operator ObfuscateFloat(float value) + { + return new ObfuscateFloat(value); + } + #endregion + + unsafe static int ConvertValue(float value) + { + float* ptr = &value; + return *((int*)ptr); + } + unsafe static float ConvertValue(int value) + { + int* ptr = &value; + return *((float*)ptr); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs.meta new file mode 100644 index 0000000..d858503 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateFloat.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b3ab743f82f4314587e8def6386768f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs new file mode 100644 index 0000000..ab1c1be --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs @@ -0,0 +1,110 @@ +//-------------------------------------------------- +// Motion Framework +// Copyright©2020-2020 何冠峰 +// Licensed under the MIT license +//-------------------------------------------------- +using System; +using UnityEngine; + +namespace MotionFramework.Utility +{ + [Serializable] + public struct ObfuscateInt : IFormattable, IEquatable<ObfuscateInt>, IComparable<ObfuscateInt>, IComparable<int>, IComparable + { + private static int GlobalSeed = (int)DateTime.Now.Ticks; + + [SerializeField] + private int _seed; + [SerializeField] + private int _data; + + public ObfuscateInt(int value) + { + _seed = GlobalSeed++; + _data = 0; + Value = value; + } + internal int Value + { + get + { + var v = _data ^ _seed; + return v; + } + set + { + _data = value ^ _seed; + } + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + public override string ToString() + { + return Value.ToString(); + } + public override bool Equals(object obj) + { + return obj is ObfuscateInt && Equals((ObfuscateInt)obj); + } + + public string ToString(string format) + { + return Value.ToString(format); + } + public string ToString(IFormatProvider provider) + { + return Value.ToString(provider); + } + public string ToString(string format, IFormatProvider provider) + { + return Value.ToString(format, provider); + } + + public bool Equals(ObfuscateInt obj) + { + return Value.Equals(obj.Value); + } + public int CompareTo(ObfuscateInt other) + { + return Value.CompareTo(other.Value); + } + public int CompareTo(int other) + { + return Value.CompareTo(other); + } + public int CompareTo(object obj) + { + return Value.CompareTo(obj); + } + + #region 运算符重载 + public static implicit operator int(ObfuscateInt value) + { + return value.Value; + } + public static implicit operator ObfuscateInt(int value) + { + return new ObfuscateInt(value); + } + public static implicit operator ObfuscateFloat(ObfuscateInt value) + { + return value.Value; + } + public static implicit operator ObfuscateDouble(ObfuscateInt value) + { + return value.Value; + } + public static ObfuscateInt operator ++(ObfuscateInt value) + { + return value.Value + 1; + } + public static ObfuscateInt operator --(ObfuscateInt value) + { + return value.Value - 1; + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs.meta new file mode 100644 index 0000000..476707b --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateInt.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 490fab43fb3ac0749afa102b9ba57dc8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs new file mode 100644 index 0000000..d6d50fb --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs @@ -0,0 +1,102 @@ +//-------------------------------------------------- +// Motion Framework +// Copyright©2020-2020 何冠峰 +// Licensed under the MIT license +//-------------------------------------------------- +using System; +using UnityEngine; + +namespace MotionFramework.Utility +{ + [Serializable] + public struct ObfuscateLong : IFormattable, IEquatable<ObfuscateLong>, IComparable<ObfuscateLong>, IComparable<long>, IComparable + { + private static long GlobalSeed = DateTime.Now.Ticks; + + [SerializeField] + private long _seed; + [SerializeField] + private long _data; + + public ObfuscateLong(long value) + { + _seed = GlobalSeed++; + _data = 0; + Value = value; + } + internal long Value + { + get + { + var v = _data ^ _seed; + return v; + } + set + { + _data = value ^ _seed; + } + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + public override string ToString() + { + return Value.ToString(); + } + public override bool Equals(object obj) + { + return obj is ObfuscateLong && Equals((ObfuscateLong)obj); + } + + public string ToString(string format) + { + return Value.ToString(format); + } + public string ToString(IFormatProvider provider) + { + return Value.ToString(provider); + } + public string ToString(string format, IFormatProvider provider) + { + return Value.ToString(format, provider); + } + + public bool Equals(ObfuscateLong obj) + { + return Value.Equals(obj.Value); + } + public int CompareTo(ObfuscateLong other) + { + return Value.CompareTo(other.Value); + } + public int CompareTo(long other) + { + return Value.CompareTo(other); + } + public int CompareTo(object obj) + { + return Value.CompareTo(obj); + } + + #region 运算符重载 + public static implicit operator long(ObfuscateLong value) + { + return value.Value; + } + public static implicit operator ObfuscateLong(long value) + { + return new ObfuscateLong(value); + } + public static ObfuscateLong operator ++(ObfuscateLong value) + { + return value.Value + 1; + } + public static ObfuscateLong operator --(ObfuscateLong value) + { + return value.Value - 1; + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs.meta new file mode 100644 index 0000000..a185a9a --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/ObfuscateLong.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64d0fb04b6975a44180f9068d44b7973 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs new file mode 100644 index 0000000..87ac739 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs @@ -0,0 +1,203 @@ + + +namespace MotionFramework.Utility +{ + /// <summary> + /// 综合计时器 + /// </summary> + public sealed class Timer + { + /// <summary> + /// 延迟后,触发一次 + /// </summary> + public static Timer CreateOnceTimer(float delay) + { + return new Timer(delay, -1, -1, 1); + } + + /// <summary> + /// 延迟后,永久性的间隔触发 + /// </summary> + /// <param name="delay">延迟时间</param> + /// <param name="interval">间隔时间</param> + public static Timer CreatePepeatTimer(float delay, float interval) + { + return new Timer(delay, interval, -1, -1); + } + + /// <summary> + /// 延迟后,在一段时间内间隔触发 + /// </summary> + /// <param name="delay">延迟时间</param> + /// <param name="interval">间隔时间</param> + /// <param name="duration">触发周期</param> + public static Timer CreatePepeatTimer(float delay, float interval, float duration) + { + return new Timer(delay, interval, duration, -1); + } + + /// <summary> + /// 延迟后,间隔触发一定次数 + /// </summary> + /// <param name="delay">延迟时间</param> + /// <param name="interval">间隔时间</param> + /// <param name="maxTriggerCount">最大触发次数</param> + public static Timer CreatePepeatTimer(float delay, float interval, long maxTriggerCount) + { + return new Timer(delay, interval, -1, maxTriggerCount); + } + + /// <summary> + /// 延迟后,在一段时间内触发 + /// </summary> + /// <param name="delay">延迟时间</param> + /// <param name="duration">触发周期</param> + public static Timer CreateDurationTimer(float delay, float duration) + { + return new Timer(delay, -1, duration, -1); + } + + /// <summary> + /// 延迟后,永久触发 + /// </summary> + public static Timer CreateForeverTimer(float delay) + { + return new Timer(delay, -1, -1, -1); + } + + + private readonly float _intervalTime; + private readonly float _durationTime; + private readonly long _maxTriggerCount; + + // 需要重置的变量 + private float _delayTimer = 0; + private float _durationTimer = 0; + private float _intervalTimer = 0; + private long _triggerCount = 0; + + /// <summary> + /// 延迟时间 + /// </summary> + public float DelayTime { private set; get; } + + /// <summary> + /// 是否已经结束 + /// </summary> + public bool IsOver { private set; get; } + + /// <summary> + /// 是否已经暂停 + /// </summary> + public bool IsPause { private set; get; } + + /// <summary> + /// 延迟剩余时间 + /// </summary> + public float Remaining + { + get + { + if (IsOver) + return 0f; + else + return System.Math.Max(0f, DelayTime - _delayTimer); + } + } + + /// <summary> + /// 计时器 + /// </summary> + /// <param name="delay">延迟时间</param> + /// <param name="interval">间隔时间</param> + /// <param name="duration">运行时间</param> + /// <param name="maxTriggerTimes">最大触发次数</param> + public Timer(float delay, float interval, float duration, long maxTriggerCount) + { + DelayTime = delay; + _intervalTime = interval; + _durationTime = duration; + _maxTriggerCount = maxTriggerCount; + } + + /// <summary> + /// 暂停计时器 + /// </summary> + public void Pause() + { + IsPause = true; + } + + /// <summary> + /// 恢复计时器 + /// </summary> + public void Resume() + { + IsPause = false; + } + + /// <summary> + /// 结束计时器 + /// </summary> + public void Kill() + { + IsOver = true; + } + + /// <summary> + /// 重置计时器 + /// </summary> + public void Reset() + { + _delayTimer = 0; + _durationTimer = 0; + _intervalTimer = 0; + _triggerCount = 0; + IsOver = false; + IsPause = false; + } + + /// <summary> + /// 更新计时器 + /// </summary> + public bool Update(float deltaTime) + { + if (IsOver || IsPause) + return false; + + _delayTimer += deltaTime; + if (_delayTimer < DelayTime) + return false; + + if(_intervalTime > 0) + _intervalTimer += deltaTime; + if (_durationTime > 0) + _durationTimer += deltaTime; + + // 检测间隔执行 + if (_intervalTime > 0) + { + if (_intervalTimer < _intervalTime) + return false; + _intervalTimer = 0; + } + + // 检测结束条件 + if (_durationTime > 0) + { + if (_durationTimer >= _durationTime) + Kill(); + } + + // 检测结束条件 + if (_maxTriggerCount > 0) + { + _triggerCount++; + if (_triggerCount >= _maxTriggerCount) + Kill(); + } + + return true; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs.meta new file mode 100644 index 0000000..0131730 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/Misc/Timer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c8072e60d9a07e4ba0634322357d446 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs new file mode 100644 index 0000000..75607d8 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs @@ -0,0 +1,56 @@ +//-------------------------------------------------- +// Motion Framework +// Copyright©2021-2021 何冠峰 +// Licensed under the MIT license +//-------------------------------------------------- +using System; +using System.Text; +using System.Diagnostics; + +namespace MotionFramework.Utility +{ + public static class ProfilerUtility + { + private static string _watchName; + private static long _limitMilliseconds; + private static Stopwatch _watch; + + /// <summary> + /// 开启性能测试 + /// </summary> + /// <param name="name">测试名称</param> + /// <param name="limitMilliseconds">极限毫秒数</param> + [Conditional("DEBUG")] + public static void BeginWatch(string name, long limitMilliseconds = long.MaxValue) + { + if (_watch != null) + { + UnityEngine.Debug.LogError($"Last watch is not end : {_watchName}"); + } + + _watchName = name; + _limitMilliseconds = limitMilliseconds; + _watch = new Stopwatch(); + _watch.Start(); + } + + /// <summary> + /// 结束性能测试 + /// 说明:当耗费的毫秒数超过极限值则输出为警告 + /// </summary> + [Conditional("DEBUG")] + public static void EndWatch() + { + if (_watch != null) + { + _watch.Stop(); + string logInfo = $"[Profiler] {_watchName} took {_watch.ElapsedMilliseconds} ms"; + if (_watch.ElapsedMilliseconds > _limitMilliseconds) + UnityEngine.Debug.LogWarning(logInfo); + else + UnityEngine.Debug.Log(logInfo); + _watch = null; + } + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs.meta b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs.meta new file mode 100644 index 0000000..f42bfa3 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Engine/Engine.Utility/ProfilerUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ec9a246cc4236d4e83d331746929371 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module.meta b/Assets/Framework/Scripts/Runtime/Module.meta new file mode 100644 index 0000000..45619d2 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af1f88536c0900042ae072d86f818806 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Extension.meta b/Assets/Framework/Scripts/Runtime/Module/Extension.meta new file mode 100644 index 0000000..13113d9 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Extension.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e19b500d8bb26ff4d9a183fd9bc8074d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs new file mode 100644 index 0000000..e6b3f08 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs @@ -0,0 +1,12 @@ + + +namespace UnityEngine +{ + public static partial class UnityEngine_Object_Extension + { + public static bool IsDestroyed(this UnityEngine.Object o) + { + return o == null; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs.meta new file mode 100644 index 0000000..0b71066 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Object_Extension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3170b32d0ce75e42b20609930ba11d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs new file mode 100644 index 0000000..13de7ef --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs @@ -0,0 +1,39 @@ + + +namespace UnityEngine +{ + public static partial class UnityEngine_RectTransform_Extension + { + public static void SetSizeDeltaWidth(this RectTransform thisObj, float width) + { + Vector2 size = thisObj.sizeDelta; + size.x = width; + thisObj.sizeDelta = size; + } + public static void SetSizeDeltaHeight(this RectTransform thisObj, float height) + { + Vector2 size = thisObj.sizeDelta; + size.y = height; + thisObj.sizeDelta = size; + } + + public static void SetAnchoredPositionX(this RectTransform thisObj, float pos) + { + Vector3 temp = thisObj.anchoredPosition; + temp.x = pos; + thisObj.anchoredPosition = temp; + } + public static void SetAnchoredPositionY(this RectTransform thisObj, float pos) + { + Vector3 temp = thisObj.anchoredPosition; + temp.y = pos; + thisObj.anchoredPosition = temp; + } + public static void SetAnchoredPositionZ(this RectTransform thisObj, float pos) + { + Vector3 temp = thisObj.anchoredPosition; + temp.z = pos; + thisObj.anchoredPosition = temp; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs.meta new file mode 100644 index 0000000..809f9cf --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_RectTransform_Extension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c25fcc6e8919cf47863078ddf756562 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs new file mode 100644 index 0000000..7bbf1b6 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs @@ -0,0 +1,97 @@ + +using System.Collections; +using System.Collections.Generic; + +namespace UnityEngine +{ + public static partial class UnityEngine_Transform_Extension + { + private static readonly Queue<Transform> _childStack = new Queue<Transform>(1000); + + /// <summary> + /// 获取第一个子物体 + /// </summary> + /// <param name="findActiveObject">激活条件</param> + public static Transform GetFirstChild(this Transform root, bool findActiveObject = true) + { + if (root == null || root.childCount == 0) + return null; + + if(findActiveObject == false) + return root.GetChild(0); + + for (int i = 0; i < root.childCount; i++) + { + Transform target = root.GetChild(i); + if (target.gameObject.activeSelf) + return target; + } + return null; + } + + /// <summary> + /// 获取最后一个子物体 + /// </summary> + /// <param name="findActiveObject">激活条件</param> + public static Transform GetLastChild(this Transform root, bool findActiveObject = true) + { + if (root == null || root.childCount == 0) + return null; + + if (findActiveObject == false) + return root.GetChild(root.childCount - 1); + + for (int i = root.childCount - 1; i >= 0; i--) + { + Transform target = root.GetChild(i); + if (target.gameObject.activeSelf) + return target; + } + return null; + } + + /// <summary> + /// 广度优先搜索查找子物体 + /// </summary> + public static Transform BFSearch(this Transform root, string childName) + { + if (root == null) return null; + + _childStack.Clear(); + _childStack.Enqueue(root); + + while (_childStack.Count != 0) + { + root = _childStack.Dequeue(); + for (int i = 0; i < root.childCount; i++) + { + Transform child = root.GetChild(i); + if (child.name == childName) + { + return child; + } + else + { + if (child.childCount != 0) + _childStack.Enqueue(child); + } + } + } + + // 没有发现返回空 + return null; + } + + /// <summary> + /// 广度优先搜索查找子物体的组件 + /// </summary> + public static T BFSearch<T>(this Transform root, string childName) where T : UnityEngine.Component + { + Transform trans = root.BFSearch(childName); + if (trans == null) + return null; + + return trans.GetComponent<T>(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs.meta new file mode 100644 index 0000000..89c09bf --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Extension/UnityEngine_Transform_Extension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c1aa7402103ca844392136411ac36564 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Camera.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Camera.meta new file mode 100644 index 0000000..2a4ecce --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Camera.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dbb1c5e121a54b458a7eb19a04f06766 +timeCreated: 1716788984 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs new file mode 100644 index 0000000..f485507 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs @@ -0,0 +1,98 @@ +using System; +using Framework.Scripts.Runtime.Engine.Engine.Camera; +using Framework.Scripts.Runtime.Engine.Engine.Camera.CameraControl; +using MotionFramework; +using MotionFramework.Event; +using NaughtyAttributes; +using UnityEngine; + +namespace Framework.Scripts.Runtime.Module.Module.Camera +{ + public class CameraManager : MonoBehaviour + { + private CameraRaycastComponent _raycastComponent; + private CameraControlComponent _cameraControlComponent; + + + [SerializeField] [Label("摄像头控制")] public bool showCamControl; + [SerializeField] [Label("射线")] public bool showCamRay; + + [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("鼠标中间移动速度")] + private float middleSpeed = 2; + + [ShowIf("showCamControl")] [MinMaxSlider(-90, 90)] [BoxGroup("参数")] [SerializeField] [Label("角度最大限制")] + private Vector2 minMaxSlider; + + [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("滚轮灵敏度设置")] + private int MouseWheelSensitivity = 1; //滚轮灵敏度设置 + + [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("相机距离最小值")] + private int MouseZoomMin = 10; //相机距离最小值 + + [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("相机距离最大值")] + private int MouseZoomMax = 9999; //相机距离最大值 + + [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("旋转视角时相机x轴转速")] + private float xSpeed = 250.0f; //旋转视角时相机x轴转速 + + [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("旋转视角时相机y轴转速")] + private float ySpeed = 120.0f; //旋转视角时相机y轴转速 + + [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("相机和target之间的距离")] + private float Distance = 20; //相机和target之间的距离,因为相机的Z轴总是指向target,也就是相机z轴方向上的距离 + + [SerializeField] private Transform MainCam; + [SerializeField] private Transform MainCamTarget; + + void Awake() + { + // 为组件赋值,可以通过查找对象或者直接赋值的方式 + _raycastComponent = new CameraRaycastComponent(); + _cameraControlComponent = new CameraControlComponent(); + + if (_raycastComponent == null || _cameraControlComponent == null) + { + Debug.LogError("缺少必要的组件"); + } + } + + private void OnEnable() + { + _raycastComponent.OnRaycastHit += HandleRaycastHit; + } + + private void Start() + { + _cameraControlComponent.Init(MainCam, MainCamTarget); + _raycastComponent.Init(); + } + + private void OnDisable() + { + _raycastComponent.OnRaycastHit -= HandleRaycastHit; + } + + // 处理射线命中事件并打印物体名称 + void HandleRaycastHit(RaycastHit hit) + { + Debug.Log("射线检测到物体--->" + hit.collider.name); + } + void Update() + { + // 调用射线功能 + if (showCamRay) + { + if (Input.GetMouseButtonDown(0)) // 比如当按下鼠标左键时 + { + _raycastComponent?.PerformRaycast(); + } + } + + + + _cameraControlComponent.UpdateValue(minMaxSlider); + // 调用镜头控制功能 + _cameraControlComponent?.ControlCamera(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs.meta new file mode 100644 index 0000000..574f9da --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Camera/CameraManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 464bdf08dc492614ca26cb9f6e6e5bf7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Console.meta new file mode 100644 index 0000000..8b4905e --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: feec152563c6ce5438d22c11c0a66856 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs new file mode 100644 index 0000000..a206175 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs @@ -0,0 +1,141 @@ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Profiling; + +namespace MotionFramework.Console +{ + [ConsoleAttribute("应用详情", 102)] + internal class ApplicationWindow : IConsoleWindow + { + // GUI相关 + private Vector2 _scrollPos = Vector2.zero; + private int _timeScaleLevel = 5; + + void IConsoleWindow.OnGUI() + { + int space = 15; + + _scrollPos = ConsoleGUI.BeginScrollView(_scrollPos); + + // 时间缩放相关 + GUILayout.Space(space); + GUILayout.BeginHorizontal(); + if (GUILayout.Button("Reset", ConsoleGUI.ButtonStyle, GUILayout.Width(100))) + { + _timeScaleLevel = 5; + SetTimeScale(_timeScaleLevel); + } + if (GUILayout.Button("+", ConsoleGUI.ButtonStyle, GUILayout.Width(100))) + { + _timeScaleLevel++; + _timeScaleLevel = Mathf.Clamp(_timeScaleLevel, 0, 9); + SetTimeScale(_timeScaleLevel); + } + if (GUILayout.Button("-", ConsoleGUI.ButtonStyle, GUILayout.Width(100))) + { + _timeScaleLevel--; + _timeScaleLevel = Mathf.Clamp(_timeScaleLevel, 0, 9); + SetTimeScale(_timeScaleLevel); + } + GUILayout.EndHorizontal(); + + GUILayout.Space(space); + ConsoleGUI.Lable($"Elapse Time : {GetElapseTime()}"); + ConsoleGUI.Lable($"Time Scale : {Time.timeScale}"); + + GUILayout.Space(space); + ConsoleGUI.Lable($"Unity Version : {Application.unityVersion}"); + ConsoleGUI.Lable($"Unity Pro License : {Application.HasProLicense()}"); + ConsoleGUI.Lable($"Application Version : {Application.version}"); + ConsoleGUI.Lable($"Application Install Path : {Application.dataPath}"); + ConsoleGUI.Lable($"Application Persistent Path : {Application.persistentDataPath}"); + + GUILayout.Space(space); + ConsoleGUI.Lable($"OS : {SystemInfo.operatingSystem}"); + ConsoleGUI.Lable($"OS Memory : {SystemInfo.systemMemorySize / 1024f:f1}GB"); + ConsoleGUI.Lable($"CPU : {SystemInfo.processorType}"); + ConsoleGUI.Lable($"CPU Core : {SystemInfo.processorCount}"); + + GUILayout.Space(space); + ConsoleGUI.Lable($"Device UID : {SystemInfo.deviceUniqueIdentifier}"); + ConsoleGUI.Lable($"Device Model : {SystemInfo.deviceModel}"); + ConsoleGUI.Lable($"Device Name : {SystemInfo.deviceName}"); + ConsoleGUI.Lable($"Device Type : {SystemInfo.deviceType}"); + + GUILayout.Space(space); + ConsoleGUI.Lable($"Graphics Device Name : {SystemInfo.graphicsDeviceName}"); + ConsoleGUI.Lable($"Graphics Device Type : {SystemInfo.graphicsDeviceType}"); + ConsoleGUI.Lable($"Graphics Memory : {SystemInfo.graphicsMemorySize / 1024f:f1}GB"); + ConsoleGUI.Lable($"Graphics Shader Level : {SystemInfo.graphicsShaderLevel}"); + ConsoleGUI.Lable($"Multi-threaded Rendering : {SystemInfo.graphicsMultiThreaded}"); + ConsoleGUI.Lable($"Max Cubemap Size : {SystemInfo.maxCubemapSize}"); + ConsoleGUI.Lable($"Max Texture Size : {SystemInfo.maxTextureSize}"); + + GUILayout.Space(space); + ConsoleGUI.Lable($"Supports Accelerometer : {SystemInfo.supportsAccelerometer}"); //加速计硬件 + ConsoleGUI.Lable($"Supports Gyroscope : {SystemInfo.supportsGyroscope}"); //陀螺仪硬件 + ConsoleGUI.Lable($"Supports Audio : {SystemInfo.supportsAudio}"); //音频硬件 + ConsoleGUI.Lable($"Supports GPS : {SystemInfo.supportsLocationService}"); //GPS硬件 + + GUILayout.Space(space); + ConsoleGUI.Lable($"Screen DPI : {Screen.dpi}"); + ConsoleGUI.Lable($"Game Resolution : {Screen.width} x {Screen.height}"); + ConsoleGUI.Lable($"Device Resolution : {Screen.currentResolution.width} x {Screen.currentResolution.height}"); + ConsoleGUI.Lable($"Graphics Quality : {QualitySettings.names[QualitySettings.GetQualityLevel()]}"); + + GUILayout.Space(space); + ConsoleGUI.Lable($"Total Memory : {GetTotalMemory() / 1048576}MB"); + ConsoleGUI.Lable($" - Unity Memory : {Profiler.GetTotalReservedMemoryLong() / 1048576}MB"); + ConsoleGUI.Lable($" - Mono Memory : {Profiler.GetMonoHeapSizeLong() / 1048576}MB"); + ConsoleGUI.Lable($" - GfxDriver Memory : {Profiler.GetAllocatedMemoryForGraphicsDriver() / 1048576}MB"); + + GUILayout.Space(space); + ConsoleGUI.Lable($"Battery Level : {SystemInfo.batteryLevel}"); + ConsoleGUI.Lable($"Battery Status : {SystemInfo.batteryStatus}"); + ConsoleGUI.Lable($"Network Status : {GetNetworkState()}"); + + ConsoleGUI.EndScrollView(); + } + + private long GetTotalMemory() + { + // Total: Unity+Mono+GfxDriver(未包含Audio+Video) + return Profiler.GetTotalReservedMemoryLong() + Profiler.GetMonoHeapSizeLong() + Profiler.GetAllocatedMemoryForGraphicsDriver(); + } + private string GetNetworkState() + { + string internetState = string.Empty; + if (Application.internetReachability == NetworkReachability.NotReachable) + internetState = "not reachable"; + else if (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork) + internetState = "carrier data network"; + else if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork) + internetState = "local area network"; + return internetState; + } + private string GetElapseTime() + { + int day = (int)(Time.realtimeSinceStartup / 86400f); + int hour = (int)((Time.realtimeSinceStartup % 86400f) / 3600f); + int sec = (int)(((Time.realtimeSinceStartup % 86400f) % 3600f) / 60f); + return $"{day}天{hour}小时{sec}分"; + } + private void SetTimeScale(int timeScaleLevel) + { + if (timeScaleLevel == 5) + { + Time.timeScale = 1f; + } + else if (timeScaleLevel > 5) + { + Time.timeScale = timeScaleLevel - 4; + } + else + { + Time.timeScale = timeScaleLevel / 5f; + } + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs.meta new file mode 100644 index 0000000..c127a56 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ApplicationWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f845ed2fd036eb14b83b46b3054946b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs new file mode 100644 index 0000000..1e214c6 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs @@ -0,0 +1,136 @@ + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MotionFramework.Reference; + +namespace MotionFramework.Console +{ + [ConsoleAttribute("游戏日志", 101)] + internal class GameLogWindow : IConsoleWindow + { + private class LogWrapper : IReference + { + public LogType Type; + public string Log; + public void OnRelease() + { + Log = string.Empty; + } + } + + /// <summary> + /// 日志最大显示数量 + /// </summary> + private const int LOG_MAX_COUNT = 2000; + + /// <summary> + /// 日志集合 + /// </summary> + private List<LogWrapper> _logs = new List<LogWrapper>(); + + private int _totalCount = 0; + private int _logCount = 0; + private int _warningCount = 0; + private int _errorCount = 0; + + // GUI相关 + private bool _showLog = true; + private bool _showWarning = true; + private bool _showError = true; + private Vector2 _scrollPos = Vector2.zero; + + // 过滤的关键字 + private string _filterKey = string.Empty; + + + public GameLogWindow() + { + // 注册UnityEngine日志系统 + Application.logMessageReceived += HandleUnityEngineLog; + } + void IConsoleWindow.OnGUI() + { + GUILayout.BeginHorizontal(); + if (GUILayout.Button("Clear", ConsoleGUI.ButtonStyle, GUILayout.Width(100))) + { + _totalCount = 0; + _logCount = 0; + _warningCount = 0; + _errorCount = 0; + _logs.Clear(); + } + _showLog = ConsoleGUI.Toggle($"Log ({_logCount})", _showLog); + _showWarning = ConsoleGUI.Toggle($"Warning ({_warningCount})", _showWarning); + _showError = ConsoleGUI.Toggle($"Error ({_errorCount})", _showError); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + { + GUILayout.Label("搜索关键字 : ", ConsoleGUI.LableStyle, GUILayout.Width(200)); + _filterKey = GUILayout.TextField(_filterKey, ConsoleGUI.TextFieldStyle, GUILayout.Width(500)); + } + GUILayout.EndHorizontal(); + + float offset = ConsoleGUI.ToolbarStyle.fixedHeight * 3; + _scrollPos = ConsoleGUI.BeginScrollView(_scrollPos, offset); + for (int i = 0; i < _logs.Count; i++) + { + LogWrapper wrapper = _logs[i]; + + // 只搜索关键字 + if (string.IsNullOrEmpty(_filterKey) == false) + { + if (wrapper.Log.Contains(_filterKey) == false) + continue; + } + + if (wrapper.Type == LogType.Log) + { + if (_showLog) + ConsoleGUI.Lable(wrapper.Log); + } + else if (wrapper.Type == LogType.Warning) + { + if (_showWarning) + ConsoleGUI.YellowLable(wrapper.Log); + } + else if (wrapper.Type == LogType.Assert || wrapper.Type == LogType.Error || wrapper.Type == LogType.Exception) + { + if (_showError) + ConsoleGUI.RedLable(wrapper.Log); + } + } + ConsoleGUI.EndScrollView(); + } + + private void HandleUnityEngineLog(string logString, string stackTrace, LogType type) + { + LogWrapper wrapper = ReferencePool.Spawn<LogWrapper>(); + wrapper.Type = type; + + _totalCount++; + if (type == LogType.Assert || type == LogType.Error || type == LogType.Exception) + wrapper.Log = $"[{_totalCount}] " + logString + "\n" + stackTrace; + else + wrapper.Log = $"[{_totalCount}] " + logString; + + if (type == LogType.Log) + _logCount++; + else if (type == LogType.Warning) + _warningCount++; + else if (type == LogType.Assert || type == LogType.Error || type == LogType.Exception) + _errorCount++; + else + throw new NotImplementedException(type.ToString()); + + _logs.Add(wrapper); + if (_logs.Count > LOG_MAX_COUNT) + { + ReferencePool.Release(_logs[0]); + _logs.RemoveAt(0); + } + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs.meta new file mode 100644 index 0000000..f82d748 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameLogWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e2a9baee29a8494597fadc3354720c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs new file mode 100644 index 0000000..edf1316 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs @@ -0,0 +1,21 @@ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MotionFramework.Console +{ + [ConsoleAttribute("游戏模块", 100)] + internal class GameModuleWindow : IConsoleWindow + { + // GUI相关 + private Vector2 _scrollPos = Vector2.zero; + + void IConsoleWindow.OnGUI() + { + _scrollPos = ConsoleGUI.BeginScrollView(_scrollPos); + MotionEngine.DrawModulesGUIContent(); + ConsoleGUI.EndScrollView(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs.meta new file mode 100644 index 0000000..dcdcf61 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/GameModuleWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e7131d9ae7fe6fd488878a650f1e4dd9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs new file mode 100644 index 0000000..c1a5f4a --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs @@ -0,0 +1,29 @@ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MotionFramework.Reference; + +namespace MotionFramework.Console +{ + [ConsoleAttribute("引用池", 103)] + internal class ReferencePoolWindow : IConsoleWindow + { + // GUI相关 + private Vector2 _scrollPos = Vector2.zero; + + void IConsoleWindow.OnGUI() + { + var pools = ReferencePool.GetAllCollectors; + ConsoleGUI.Lable($"池总数:{pools.Count}"); + + float offset = ConsoleGUI.LableStyle.fontSize; + _scrollPos = ConsoleGUI.BeginScrollView(_scrollPos, offset); + foreach (var pair in pools) + { + ConsoleGUI.Lable($"[{pair.Value.ClassType.FullName}] CacheCount = {pair.Value.Count} SpwanCount = {pair.Value.SpawnCount}"); + } + ConsoleGUI.EndScrollView(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs.meta new file mode 100644 index 0000000..9a3e9a2 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Console/ReferencePoolWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eca1ecc037913874781860f709eb6b58 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Event.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Event.meta new file mode 100644 index 0000000..68f66a4 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Event.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9e413da6ee0aaba4ea399ba2cc2ed42a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs new file mode 100644 index 0000000..0676062 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs @@ -0,0 +1,49 @@ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace MotionFramework.Event +{ + public class EventGroup + { + private readonly Dictionary<System.Type, List<Action<IEventMessage>>> _cachedListener = new Dictionary<System.Type, List<Action<IEventMessage>>>(); + + /// <summary> + /// 添加一个监听 + /// </summary> + public void AddListener<TEvent>(System.Action<IEventMessage> listener) where TEvent : IEventMessage + { + System.Type eventType = typeof(TEvent); + if (_cachedListener.ContainsKey(eventType) == false) + _cachedListener.Add(eventType, new List<Action<IEventMessage>>()); + + if (_cachedListener[eventType].Contains(listener) == false) + { + _cachedListener[eventType].Add(listener); + EventManager.Instance.AddListener(eventType, listener); + } + else + { + MotionLog.Warning($"Event listener is exist : {eventType}"); + } + } + + /// <summary> + /// 移除所有缓存的监听 + /// </summary> + public void RemoveAllListener() + { + foreach (var pair in _cachedListener) + { + System.Type eventType = pair.Key; + for (int i = 0; i < pair.Value.Count; i++) + { + EventManager.Instance.RemoveListener(eventType, pair.Value[i]); + } + pair.Value.Clear(); + } + _cachedListener.Clear(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs.meta new file mode 100644 index 0000000..977a481 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventGroup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dcc5e4008d087434eb5db1390d8e4e6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs new file mode 100644 index 0000000..88f2ead --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs @@ -0,0 +1,198 @@ + +using System; +using System.Collections; +using System.Collections.Generic; +using MotionFramework.Console; +using MotionFramework.Reference; + +namespace MotionFramework.Event +{ + /// <summary> + /// 事件管理器 + /// </summary> + public sealed class EventManager : ModuleSingleton<EventManager>, IModule + { + private class PostWrapper : IReference + { + public int PostFrame; + public int EventID; + public IEventMessage Message; + + public void OnRelease() + { + PostFrame = 0; + EventID = 0; + Message = null; + } + } + + private readonly Dictionary<int, LinkedList<Action<IEventMessage>>> _listeners = new Dictionary<int, LinkedList<Action<IEventMessage>>>(1000); + private readonly List<PostWrapper> _postWrappers = new List<PostWrapper>(1000); + + void IModule.OnCreate(System.Object param) + { + } + void IModule.OnUpdate() + { + for (int i = _postWrappers.Count - 1; i >= 0; i--) + { + var wrapper = _postWrappers[i]; + if (UnityEngine.Time.frameCount > wrapper.PostFrame) + { + SendMessage(wrapper.EventID, wrapper.Message); + _postWrappers.RemoveAt(i); + ReferencePool.Release(wrapper); + } + } + } + void IModule.OnDestroy() + { + DestroySingleton(); + } + void IModule.OnGUI() + { + ConsoleGUI.Lable($"[{nameof(EventManager)}] Listener total count : {GetAllListenerCount()}"); + } + + + /// <summary> + /// 添加监听 + /// </summary> + public void AddListener<TEvent>(System.Action<IEventMessage> listener) where TEvent : IEventMessage + { + AddListener(typeof(TEvent), listener); + } + + /// <summary> + /// 添加监听 + /// </summary> + public void AddListener(System.Type eventType, System.Action<IEventMessage> listener) + { + int eventId = eventType.GetHashCode(); + AddListener(eventId, listener); + } + + /// <summary> + /// 添加监听 + /// </summary> + public void AddListener(int eventId, System.Action<IEventMessage> listener) + { + if (_listeners.ContainsKey(eventId) == false) + _listeners.Add(eventId, new LinkedList<Action<IEventMessage>>()); + if (_listeners[eventId].Contains(listener) == false) + _listeners[eventId].AddLast(listener); + } + + + /// <summary> + /// 移除监听 + /// </summary> + public void RemoveListener<TEvent>(System.Action<IEventMessage> listener) where TEvent : IEventMessage + { + RemoveListener(typeof(TEvent), listener); + } + + /// <summary> + /// 移除监听 + /// </summary> + public void RemoveListener(System.Type eventType, System.Action<IEventMessage> listener) + { + int eventId = eventType.GetHashCode(); + RemoveListener(eventId, listener); + } + + /// <summary> + /// 移除监听 + /// </summary> + public void RemoveListener(int eventId, System.Action<IEventMessage> listener) + { + if (_listeners.ContainsKey(eventId)) + { + if (_listeners[eventId].Contains(listener)) + _listeners[eventId].Remove(listener); + } + } + + + /// <summary> + /// 实时广播事件 + /// </summary> + public void SendMessage(IEventMessage message) + { + int eventId = message.GetType().GetHashCode(); + SendMessage(eventId, message); + } + + /// <summary> + /// 实时广播事件 + /// </summary> + public void SendMessage(int eventId, IEventMessage message) + { + if (_listeners.ContainsKey(eventId) == false) + return; + + LinkedList<Action<IEventMessage>> listeners = _listeners[eventId]; + if (listeners.Count > 0) + { + var currentNode = listeners.Last; + while (currentNode != null) + { + currentNode.Value.Invoke(message); + currentNode = currentNode.Previous; + } + } + + // 回收引用对象 + IReference refClass = message as IReference; + if (refClass != null) + ReferencePool.Release(refClass); + } + + /// <summary> + /// 延迟广播事件 + /// </summary> + public void PostMessage(IEventMessage message) + { + int eventId = message.GetType().GetHashCode(); + PostMessage(eventId, message); + } + + /// <summary> + /// 延迟广播事件 + /// </summary> + public void PostMessage(int eventId, IEventMessage message) + { + var wrapper = ReferencePool.Spawn<PostWrapper>(); + wrapper.PostFrame = UnityEngine.Time.frameCount; + wrapper.EventID = eventId; + wrapper.Message = message; + _postWrappers.Add(wrapper); + } + + + /// <summary> + /// 清空所有监听 + /// </summary> + public void ClearListeners() + { + foreach (int eventId in _listeners.Keys) + { + _listeners[eventId].Clear(); + } + _listeners.Clear(); + } + + /// <summary> + /// 获取监听者总数 + /// </summary> + private int GetAllListenerCount() + { + int count = 0; + foreach (var list in _listeners) + { + count += list.Value.Count; + } + return count; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs.meta new file mode 100644 index 0000000..94f7a3c --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Event/EventManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a2a39e0393e22c44b8416d1445c9bb2c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs new file mode 100644 index 0000000..539df73 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs @@ -0,0 +1,8 @@ + + +namespace MotionFramework.Event +{ + public interface IEventMessage + { + } +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs.meta new file mode 100644 index 0000000..794ffc4 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Event/IEventMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7dcd12aabf986c6468f748911b1af65a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Network.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Network.meta new file mode 100644 index 0000000..90c17e4 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Network.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c5ceeac7fb64f545b513c267da9847f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Network/Modbus.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Network/Modbus.meta new file mode 100644 index 0000000..2a6e3c7 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Network/Modbus.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e8a64ba3ed244e69bebc5f482f2e842f +timeCreated: 1716534367 \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest.meta new file mode 100644 index 0000000..653a0ef --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b17e44baf4e346b47b8686607fa1d3e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs b/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs new file mode 100644 index 0000000..9d9202a --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs @@ -0,0 +1,275 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using Cysharp.Threading.Tasks; +using UnityEngine; +using UnityEngine.Networking; + +namespace MotionFramework.Scripts.Runtime.Engine.Engine.Network.WebRequest +{ + /// <summary> + /// WebRequest ������ + /// </summary> + public sealed class WebRequestManager : ModuleSingleton<WebRequestManager>, IModule + { + /// <summary> + /// Get��ȡ���� + /// </summary>- + /// <param name="url"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<string> GetTextAsync(string url, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = UnityWebRequest.Get(url)) + { + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + return request.downloadHandler.text; + } + } + + /// <summary> + /// ��ȡͼƬ + /// </summary> + /// <param name="url"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<Texture2D> GetImageAsync(string url, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = UnityWebRequestTexture.GetTexture(url)) + { + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + return DownloadHandlerTexture.GetContent(request); + } + } + + /// <summary> + /// ��ȡ��Ƶ + /// </summary> + /// <param name="url"></param> + /// <param name="localPath"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<string> GetVideoAsync(string url, string localPath, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = UnityWebRequest.Get(url)) + { + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + File.WriteAllBytes(localPath, request.downloadHandler.data); + return localPath; + } + } + + /// <summary> + /// ��ȡ�ļ� + /// </summary> + /// <param name="url"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<byte[]> GetFileAsync(string url, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = UnityWebRequest.Get(url)) + { + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + return request.downloadHandler.data; + } + } + + /// <summary> + /// ��ȡ���� + /// </summary> + /// <param name="url"></param> + /// <param name="jsonData"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<string> PostTextAsync(string url, string jsonData, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST)) + { + byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(jsonData); + request.uploadHandler = new UploadHandlerRaw(bodyRaw); + request.downloadHandler = new DownloadHandlerBuffer(); + request.SetRequestHeader("Content-Type", "application/json"); + + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + return request.downloadHandler.text; + } + } + + /// <summary> + /// ��ȡͼƬ + /// </summary> + /// <param name="url"></param> + /// <param name="jsonData"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<Texture2D> PostImageAsync(string url, string jsonData, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST)) + { + byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(jsonData); + request.uploadHandler = new UploadHandlerRaw(bodyRaw); + request.downloadHandler = new DownloadHandlerTexture(); + request.SetRequestHeader("Content-Type", "application/json"); + + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + return DownloadHandlerTexture.GetContent(request); + } + } + + /// <summary> + /// ��ȡ��Ƶ + /// </summary> + /// <param name="url"></param> + /// <param name="jsonData"></param> + /// <param name="localPath"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<string> PostVideoAsync(string url, string jsonData, string localPath, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST)) + { + byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(jsonData); + request.uploadHandler = new UploadHandlerRaw(bodyRaw); + request.downloadHandler = new DownloadHandlerBuffer(); + request.SetRequestHeader("Content-Type", "application/json"); + + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + File.WriteAllBytes(localPath, request.downloadHandler.data); + return localPath; + } + } + + /// <summary> + /// ��ȡ�ļ� + /// </summary> + /// <param name="url"></param> + /// <param name="jsonData"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<byte[]> PostFileAsync(string url, string jsonData, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST)) + { + byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(jsonData); + request.uploadHandler = new UploadHandlerRaw(bodyRaw); + request.downloadHandler = new DownloadHandlerBuffer(); + request.SetRequestHeader("Content-Type", "application/json"); + + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + return request.downloadHandler.data; + } + } + + /// <summary> + /// �ύ���� + /// </summary> + /// <param name="url"></param> + /// <param name="formFields"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async UniTask<string> PostFormAsync(string url, Dictionary<string, string> formFields, Action<float> onProgress = null, CancellationToken cancellationToken = default) + { + using (UnityWebRequest request = UnityWebRequest.Post(url, formFields)) + { + await SendRequestWithProgress(request, onProgress, cancellationToken); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) + { + Debug.LogError($"�쳣�� {request.error}"); + return null; + } + return request.downloadHandler.text; + } + } + + /// <summary> + /// ���� + /// </summary> + /// <param name="request"></param> + /// <param name="onProgress"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + private async UniTask SendRequestWithProgress(UnityWebRequest request, Action<float> onProgress, CancellationToken cancellationToken) + { + // ��ȷʹ��await�������첽���� + var operation = request.SendWebRequest(); + + // ѭ����������Ƿ���ɣ������½��� + while (!operation.isDone) + { + onProgress?.Invoke(request.downloadProgress); + + //Debug.Log($"Progress: {request.downloadProgress * 100:F2}%"); + await UniTask.Delay(100, cancellationToken: cancellationToken); // ÿ100�������һ�ν��� + } + onProgress?.Invoke(1.0f); + // ���һ�ν��ȸ��£�ȷ��������ʾΪ100% + Debug.Log("Progress: 100%"); + } + + public void OnCreate(object createParam) + { + } + + public void OnUpdate() + { + } + + public void OnDestroy() + { + } + + public void OnGUI() + { + } + } +} diff --git a/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs.meta b/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs.meta new file mode 100644 index 0000000..4b92f49 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/Module/Module.Network/WebRequest/WebRequestManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa2cd41eb7446a9459bcb7936a3ffc0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Scripts/Runtime/MotionFramework.asmdef b/Assets/Framework/Scripts/Runtime/MotionFramework.asmdef new file mode 100644 index 0000000..55ac0cc --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/MotionFramework.asmdef @@ -0,0 +1,17 @@ +{ + "name": "MotionFramework", + "references": [ + "GUID:e34a5702dd353724aa315fb8011f08c3", + "GUID:f51ebe6a0ceec4240a699833d6309b23", + "GUID:776d03a35f1b52c4a9aed9f56d7b4229" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Framework/Scripts/Runtime/MotionFramework.asmdef.meta b/Assets/Framework/Scripts/Runtime/MotionFramework.asmdef.meta new file mode 100644 index 0000000..54a5436 --- /dev/null +++ b/Assets/Framework/Scripts/Runtime/MotionFramework.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c58e12c45b50087489b06b9aa0148fe7 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty.meta b/Assets/Framework/ThirdParty.meta new file mode 100644 index 0000000..069ed10 --- /dev/null +++ b/Assets/Framework/ThirdParty.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07ea96dc00e098546ae77cd28d3ae981 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes.meta b/Assets/Framework/ThirdParty/NaughtyAttributes.meta new file mode 100644 index 0000000..678100d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a34e0186d3442384c924bd8c6ecfbada +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/README.html b/Assets/Framework/ThirdParty/NaughtyAttributes/README.html new file mode 100644 index 0000000..5df2d2d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/README.html @@ -0,0 +1,1648 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8" /> + <title>README.md - Grip</title> + <link rel="icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAKCgr/FRUX/xYWGP8YGBr/GRkb/xsbHP8dHR7/Hh4f/x4eIP8fHyD/ICAh/yMjJP8kJCX/JiYo/ygoKv8pKSr/LCwu/y0tLv80NDT/QUFC/0ZGR/9MTE7/UFBR/1JSUv9bW1v/XFxc/2BgYP9hYWP/aGhp/2xsbP9ycnL/d3d3/3l5e/98fHz/f3+A/2dn/P9z3a//cNX8/4CAgP+Xl5f/nZ2e/56en/+fn5//n5+h/6amp/+rq6v/rKys/7CvsP+zs7T/uLi5/7u7u/+8vLz/wMDA/8fHx//Kysr/zc3N/9HR0f/d3d3/3t7e/+Xl5f/q6ur/6+vr/+3t7f/z8/P/9fX1//b29v/39/f/+Pj4//n5+f/6+vr/+/v7//z8/P/9/f3//v7+//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/NCYmJiYmJiYmJiYmJiYmNCZKSkpKSkpKSkpKSkpKSiYmSkpKRisdRkMbMklKSkomJkpKSSEiNUhEEQwpSUpKJiZKSi8LHhhAPAwBDDZKSiYmSkoWACA7SEc6HAEaSkomJkpKBxI/SkpKSj4ICkpKJiZKSgUTR0pKSkpGDwZKSiYmSkoTED1KSkpKOQQVSkomJkpKKgowMy4sNycIMUpKJiZKSkEZDgkDAgsNH0VKSiYmSkpKQigUBgkXLUhKSkomJkpKSkpKSkpKSkpKSkpKJiYmJiYmJiYmJiYmJiYmJiYmIyUkNDQ0NDQ0NDQ0NDQmOCYmJiYmJiYmJiYmJiYmOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" /> + <link rel="stylesheet" href="/__/grip/static/octicons/octicons.css" /> + <style> + /*! + * GitHub Light v0.4.1 + * Copyright (c) 2012 - 2017 GitHub, Inc. + * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE) + */.pl-c{color:#6a737d}.pl-c1, +.pl-s .pl-v{color:#005cc5}.pl-e, +.pl-en{color:#6f42c1}.pl-smi, +.pl-s .pl-s1{color:#24292e}.pl-ent{color:#22863a}.pl-k{color:#d73a49}.pl-s, +.pl-pds, +.pl-s .pl-pse .pl-s1, +.pl-sr, +.pl-sr .pl-cce, +.pl-sr .pl-sre, +.pl-sr .pl-sra{color:#032f62}.pl-v, +.pl-smw{color:#e36209}.pl-bu{color:#b31d28}.pl-ii{color:#fafbfc;background-color:#b31d28}.pl-c2{color:#fafbfc;background-color:#d73a49}.pl-c2::before{content:"^M"}.pl-sr .pl-cce{font-weight:bold;color:#22863a}.pl-ml{color:#735c0f}.pl-mh, +.pl-mh .pl-en, +.pl-ms{font-weight:bold;color:#005cc5}.pl-mi{font-style:italic;color:#24292e}.pl-mb{font-weight:bold;color:#24292e}.pl-md{color:#b31d28;background-color:#ffeef0}.pl-mi1{color:#22863a;background-color:#f0fff4}.pl-mc{color:#e36209;background-color:#ffebda}.pl-mi2{color:#f6f8fa;background-color:#005cc5}.pl-mdr{font-weight:bold;color:#6f42c1}.pl-ba{color:#586069}.pl-sg{color:#959da5}.pl-corl{text-decoration:underline;color:#032f62}.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,0.5);animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header, .cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3, .cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,0.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:0.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber{box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection{background:#d7d4f0}.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,0.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none}.CodeMirror-dialog{position:absolute;left:0;right:0;background:inherit;z-index:15;padding:.1em .8em;overflow:hidden;color:inherit}.CodeMirror-dialog-top{border-bottom:1px solid #eee;top:0}.CodeMirror-dialog-bottom{border-top:1px solid #eee;bottom:0}.CodeMirror-dialog input{border:none;outline:none;background:transparent;width:20em;color:inherit;font-family:monospace}.CodeMirror-dialog button{font-size:70%}.CodeMirror-merge{position:relative;border:1px solid #ddd;white-space:pre}.CodeMirror-merge, .CodeMirror-merge .CodeMirror{height:350px}.CodeMirror-merge-2pane .CodeMirror-merge-pane{width:47%}.CodeMirror-merge-2pane .CodeMirror-merge-gap{width:6%}.CodeMirror-merge-3pane .CodeMirror-merge-pane{width:31%}.CodeMirror-merge-3pane .CodeMirror-merge-gap{width:3.5%}.CodeMirror-merge-pane{display:inline-block;white-space:normal;vertical-align:top}.CodeMirror-merge-pane-rightmost{position:absolute;right:0px;z-index:1}.CodeMirror-merge-gap{z-index:2;display:inline-block;height:100%;box-sizing:border-box;overflow:hidden;border-left:1px solid #ddd;border-right:1px solid #ddd;position:relative;background:#f8f8f8}.CodeMirror-merge-scrolllock-wrap{position:absolute;bottom:0;left:50%}.CodeMirror-merge-scrolllock{position:relative;left:-50%;cursor:pointer;color:#555;line-height:1}.CodeMirror-merge-scrolllock:after{content:"\21db\00a0\00a0\21da"}.CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after{content:"\21db\21da"}.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right{position:absolute;left:0;top:0;right:0;bottom:0;line-height:1}.CodeMirror-merge-copy{position:absolute;cursor:pointer;color:#44c;z-index:3}.CodeMirror-merge-copy-reverse{position:absolute;cursor:pointer;color:#44c}.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy{left:2px}.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy{right:2px}.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.CodeMirror-merge-r-chunk{background:#ffffe0}.CodeMirror-merge-r-chunk-start{border-top:1px solid #ee8}.CodeMirror-merge-r-chunk-end{border-bottom:1px solid #ee8}.CodeMirror-merge-r-connect{fill:#ffffe0;stroke:#ee8;stroke-width:1px}.CodeMirror-merge-l-chunk{background:#eef}.CodeMirror-merge-l-chunk-start{border-top:1px solid #88e}.CodeMirror-merge-l-chunk-end{border-bottom:1px solid #88e}.CodeMirror-merge-l-connect{fill:#eef;stroke:#88e;stroke-width:1px}.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk{background:#dfd}.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start{border-top:1px solid #4e4}.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end{border-bottom:1px solid #4e4}.CodeMirror-merge-collapsed-widget:before{content:"(...)"}.CodeMirror-merge-collapsed-widget{cursor:pointer;color:#88b;background:#eef;border:1px solid #ddf;font-size:90%;padding:0 3px;border-radius:4px}.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt{display:none} + +/*! + * GitHub Light v0.4.2 + * Copyright (c) 2012 - 2017 GitHub, Inc. + * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE) + */.cm-s-github-light.CodeMirror{background:#fff;color:#24292e}.cm-s-github-light .CodeMirror-gutters{background:#fff;border-right-width:0}.cm-s-github-light .CodeMirror-guttermarker{color:#fff}.cm-s-github-light .CodeMirror-guttermarker-subtle{color:#d0d0d0}.cm-s-github-light .CodeMirror-linenumber{color:#959da5;padding:0 16px 0 16px}.cm-s-github-light .CodeMirror-cursor{border-left:1px solid #24292e}.cm-s-github-light div.CodeMirror-selected, +.cm-s-github-light .CodeMirror-line::-moz-selection, +.cm-s-github-light .CodeMirror-line > span::-moz-selection, +.cm-s-github-light .CodeMirror-line > span > span::-moz-selection, +.cm-s-github-light .CodeMirror-line::-moz-selection, +.cm-s-github-light .CodeMirror-line > span::-moz-selection, +.cm-s-github-light .CodeMirror-line > span > span::-moz-selection{background:#c8c8fa}.cm-s-github-light div.CodeMirror-selected, +.cm-s-github-light .CodeMirror-line::selection, +.cm-s-github-light .CodeMirror-line > span::selection, +.cm-s-github-light .CodeMirror-line > span > span::selection, +.cm-s-github-light .CodeMirror-line::-moz-selection, +.cm-s-github-light .CodeMirror-line > span::-moz-selection, +.cm-s-github-light .CodeMirror-line > span > span::-moz-selection{background:#c8c8fa}.cm-s-github-light .CodeMirror-activeline-background{background:#fafbfc}.cm-s-github-light .CodeMirror-matchingbracket{text-decoration:underline;color:#24292e!important}.cm-s-github-light .CodeMirror-lines{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;background:#fff;line-height:1.5}.cm-s-github-light .cm-comment{color:#6a737d}.cm-s-github-light .cm-constant{color:#005cc5}.cm-s-github-light .cm-entity{font-weight:normal;font-style:normal;text-decoration:none;color:#6f42c1}.cm-s-github-light .cm-keyword{font-weight:normal;font-style:normal;text-decoration:none;color:#d73a49}.cm-s-github-light .cm-storage{color:#d73a49}.cm-s-github-light .cm-string{font-weight:normal;font-style:normal;text-decoration:none;color:#032f62}.cm-s-github-light .cm-support{font-weight:normal;font-style:normal;text-decoration:none;color:#005cc5}.cm-s-github-light .cm-variable{font-weight:normal;font-style:normal;text-decoration:none;color:#e36209}details-dialog{position:fixed;margin:10vh auto;top:0;left:50%;transform:translateX(-50%);z-index:999;max-height:80vh;max-width:90vw;width:448px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}body.intent-mouse [role="button"]:focus, +body.intent-mouse button:focus, +body.intent-mouse summary:focus{outline:none}.CodeMirror{height:calc(100vh - 1px)}.file-editor-textarea{width:100%;padding:5px 4px;font:12px "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;resize:vertical;border:0;border-radius:0;outline:none}.container-preview .tabnav-tabs{margin:-6px 0 -6px -11px}.container-preview .tabnav-tabs .tabnav-tab{padding:12px 15px;border-radius:0}.container-preview .tabnav-tabs > .selected:first-child{border-top-left-radius:3px}.container-preview .tabnav-tabs .selected{font-weight:600}.container-preview.template-editor .commit-create, +.container-preview.template-editor .file-actions{display:block}.container-preview.template-editor .show-code, +.container-preview.template-editor .commit-preview, +.container-preview.template-editor .loading-preview-msg, +.container-preview.template-editor .no-changes-preview-msg, +.container-preview.template-editor .error-preview-msg{display:none}.container-preview.render-editor .commit-create, +.container-preview.render-editor .file-actions{display:block}.container-preview.render-editor .template-editor, +.container-preview.render-editor .show-code, +.container-preview.render-editor .commit-preview, +.container-preview.render-editor .loading-preview-msg, +.container-preview.render-editor .no-changes-preview-msg, +.container-preview.render-editor .error-preview-msg{display:none}.container-preview.show-code .commit-create, +.container-preview.show-code .file-actions{display:block}.container-preview.show-code .template-editor, +.container-preview.show-code .render-editor, +.container-preview.show-code .commit-preview, +.container-preview.show-code .loading-preview-msg, +.container-preview.show-code .no-changes-preview-msg, +.container-preview.show-code .error-preview-msg{display:none}.container-preview:not(.show-code) .commit-create, +.container-preview:not(.show-code) .file-actions{display:none}.container-preview.loading-preview .loading-preview-msg{display:block}.container-preview.loading-preview .template-editor, +.container-preview.loading-preview .render-editor, +.container-preview.loading-preview .no-changes-preview-msg, +.container-preview.loading-preview .error-preview-msg, +.container-preview.loading-preview .commit-preview{display:none}.container-preview.show-preview .commit-preview{display:block}.container-preview.show-preview .template-editor, +.container-preview.show-preview .render-editor, +.container-preview.show-preview .loading-preview-msg, +.container-preview.show-preview .no-changes-preview-msg, +.container-preview.show-preview .error-preview-msg{display:none}.container-preview.no-changes-preview .no-changes-preview-msg{display:block}.container-preview.no-changes-preview .template-editor, +.container-preview.no-changes-preview .render-editor, +.container-preview.no-changes-preview .loading-preview-msg, +.container-preview.no-changes-preview .error-preview-msg, +.container-preview.no-changes-preview .commit-preview{display:none}.container-preview.error-preview .error-preview-msg{display:block}.container-preview.error-preview .template-editor, +.container-preview.error-preview .render-editor, +.container-preview.error-preview .loading-preview-msg, +.container-preview.error-preview .no-changes-preview-msg, +.container-preview.error-preview .commit-preview{display:none}.container-preview p.preview-msg{padding:30px;font-size:16px}.CodeMirror-merge-header{height:30px}.CodeMirror-merge-header .CodeMirror-merge-pane{height:30px;line-height:30px}.cm-s-github-light .merge-gutter{width:14px}.conflict-background + .CodeMirror-gutter-wrapper .CodeMirror-linenumber{background-color:#fffbdd}.conflict-gutter-marker{background-color:#fffbdd}.conflict-gutter-marker::after, .conflict-gutter-marker::before{position:absolute;left:-1px;content:"";background-color:#d73a49}.conflict-gutter-marker-start::after, +.conflict-gutter-marker-end::after{width:1px;height:10px}.conflict-gutter-marker-start::before, +.conflict-gutter-marker-middle::before, +.conflict-gutter-marker-end::before{width:10px;height:1px}.conflict-gutter-marker-start::after{bottom:0}.conflict-gutter-marker-end::after{top:0}.conflict-gutter-marker-start::before{top:7px}.conflict-gutter-marker-end::before{bottom:7px}.conflict-gutter-marker-line::after, +.conflict-gutter-marker-middle::after{width:1px;height:18px}.conflict-gutter-marker-middle::before{top:9px}.form-group .draggable-box{height:20px;opacity:0}.form-group .draggable-box:hover{cursor:move}.form-group .edit-action{opacity:0.6}.form-group .draggable-box-icon{margin-left:-4px}.form-group .form-field-hover{background-color:none;border:1px solid rgba(149,157,165,0)}.form-group:hover{cursor:pointer}.form-group:hover .draggable-box{opacity:0.2}.form-group:hover .edit-action{opacity:0.7}.form-group:hover .form-field-hover{border:1px solid #959da5}.placeholder-box{border:1px solid #959da5}.template-previews{max-width:768px}.template-previews .Box .expand-group{display:none;height:0}.template-previews .Box .dismiss-preview-button{display:none}.template-previews .Box.expand-preview .expand-group{display:block;height:100%;transition:height 3s}.template-previews .Box.expand-preview .preview-button{display:none}.template-previews .Box.expand-preview .dismiss-preview-button{display:inline}.additional-options{display:none}.edit-labels{display:none}.preview-section{display:block}.edit-section{display:none}.Box .section-focus .preview-section{display:none}.Box .section-focus .edit-section{display:block}.user-select-contain{-ms-user-select:element;-ms-user-select:contain;-webkit-user-select:contain;-moz-user-select:contain;user-select:contain}.zeroclipboard-link{padding:0;margin:0;color:#0366d6;cursor:pointer;background:none;border:0}.zeroclipboard-link .octicon{display:block}image-crop{display:block}image-crop.nesw{cursor:nesw-resize}image-crop.nwse{cursor:nwse-resize}image-crop.nesw .crop-box, +image-crop.nwse .crop-box{cursor:inherit}image-crop[loaded] .crop-image{display:block}image-crop[loaded] [data-loading-slot], +image-crop .crop-image{display:none}image-crop .crop-wrapper{position:relative;font-size:0}image-crop .crop-container{user-select:none;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;position:absolute;overflow:hidden;z-index:1;top:0;width:100%;height:100%}image-crop .crop-box{position:absolute;border:1px dashed #fff;box-sizing:border-box;cursor:move}image-crop .crop-outline{position:absolute;top:0;bottom:0;left:0;right:0;outline:600px solid rgba(0,0,0,0.3)}image-crop .handle{position:absolute}image-crop .handle:before{position:absolute;display:block;padding:4px;transform:translate(-50%,-50%);content:' ';background:#fff;border:1px solid #767676}image-crop .ne{top:0;right:0;cursor:nesw-resize}image-crop .nw{top:0;left:0;cursor:nwse-resize}image-crop .se{bottom:0;right:0;cursor:nwse-resize}image-crop .sw{bottom:0;left:0;cursor:nesw-resize} + +/*! + * Primer-core + * http://primer.github.io + * + * Released under MIT license. Copyright (c) 2018 GitHub Inc. + */ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section{display:block}summary{display:list-item}audio, +canvas, +progress, +video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template, +[hidden]{display:none}a{background-color:transparent}a:active, +a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b, +strong{font-weight:inherit}b, +strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub, +sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}code, +kbd, +pre, +samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button, +input, +select, +textarea{font:inherit;margin:0}optgroup{font-weight:bold}button, +input{overflow:visible}button, +select{text-transform:none}button, +html [type="button"], +[type="reset"], +[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type="checkbox"], +[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:0.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}*{box-sizing:border-box}input, +select, +textarea, +button{font-family:inherit;font-size:inherit;line-height:inherit}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;line-height:1.5;color:#24292e;background-color:#fff}a{color:#0366d6;text-decoration:none}a:hover{text-decoration:underline}b, +strong{font-weight:600}hr, +.rule{height:0;margin:15px 0;overflow:hidden;background:transparent;border:0;border-bottom:1px solid #dfe2e5}hr::before, +.rule::before{display:table;content:""}hr::after, +.rule::after{display:table;clear:both;content:""}table{border-spacing:0;border-collapse:collapse}td, +th{padding:0}button{cursor:pointer;border-radius:0}details summary{cursor:pointer}details:not([open]) > *:not(summary){display:none!important}h1, +h2, +h3, +h4, +h5, +h6{margin-top:0;margin-bottom:0}h1{font-size:32px;font-weight:600}h2{font-size:24px;font-weight:600}h3{font-size:20px;font-weight:600}h4{font-size:16px;font-weight:600}h5{font-size:14px;font-weight:600}h6{font-size:12px;font-weight:600}p{margin-top:0;margin-bottom:10px}small{font-size:90%}blockquote{margin:0}ul, +ol{padding-left:0;margin-top:0;margin-bottom:0}ol ol, +ul ol{list-style-type:lower-roman}ul ul ol, +ul ol ol, +ol ul ol, +ol ol ol{list-style-type:lower-alpha}dd{margin-left:0}tt, +code{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}pre{margin-top:0;margin-bottom:0;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}.octicon{vertical-align:text-bottom}.Box{background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.Box--condensed{line-height:1.25}.Box--condensed .Box-header{padding:8px 16px}.Box--condensed .Box-body{padding:8px 16px}.Box--condensed .Box-footer{padding:8px 16px}.Box--condensed .Box-btn-octicon.btn-octicon{padding:8px 16px;margin:-8px -16px;line-height:1.25}.Box--condensed .Box-row{padding:8px 16px}.Box--spacious .Box-header{padding:24px;line-height:1.25}.Box--spacious .Box-title{font-size:20px}.Box--spacious .Box-body{padding:24px}.Box--spacious .Box-footer{padding:24px}.Box--spacious .Box-btn-octicon.btn-octicon{padding:24px;margin:-24px -24px}.Box--spacious .Box-row{padding:24px}.Box-header{padding:16px;margin:-1px -1px 0 -1px;background-color:#f6f8fa;border-color:#d1d5da;border-style:solid;border-width:1px;border-top-left-radius:3px;border-top-right-radius:3px}.Box-title{font-size:14px;font-weight:600}.Box-body{padding:16px;border-bottom:1px solid #e1e4e8}.Box-body:last-of-type{margin-bottom:-1px;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.Box-row{padding:16px;margin-top:-1px;list-style-type:none;border-top:1px solid #e1e4e8}.Box-row:first-of-type{border-top-color:transparent;border-top-left-radius:2px;border-top-right-radius:2px}.Box-row:last-of-type{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.Box-row.Box-row--unread, .Box-row.unread{box-shadow:2px 0 0 #0366d6 inset}.Box-row.navigation-focus .Box-row--drag-button{color:#0366d6;cursor:-webkit-grab;cursor:grab;opacity:100}.Box-row.navigation-focus.is-dragging .Box-row--drag-button{cursor:-webkit-grabbing;cursor:grabbing}.Box-row.navigation-focus.sortable-chosen{background-color:#fafbfc}.Box-row.navigation-focus.sortable-ghost{background-color:#f6f8fa}.Box-row.navigation-focus.sortable-ghost .Box-row--drag-hide{opacity:0}.Box-row--focus-gray.navigation-focus{background-color:#f6f8fa}.Box-row--focus-blue.navigation-focus{background-color:#f1f8ff}.Box-row--hover-gray:hover{background-color:#f6f8fa}.Box-row--hover-blue:hover{background-color:#f1f8ff}@media (min-width: 768px){.Box-row-link{color:#24292e;text-decoration:none}.Box-row-link:hover{color:#0366d6;text-decoration:none}}.Box-row--drag-button{opacity:0}.Box-footer{padding:16px;margin-top:-1px;border-top:1px solid #e1e4e8}.Box--scrollable{max-height:324px;overflow:scroll}.Box--blue{border-color:#c8e1ff}.Box--blue .Box-header{background-color:#f1f8ff;border-color:#c8e1ff}.Box--blue .Box-body{border-color:#c8e1ff}.Box--blue .Box-row{border-color:#c8e1ff}.Box--blue .Box-footer{border-color:#c8e1ff}.Box--danger{border-color:#d73a49}.Box--danger .Box-row:first-of-type{border-color:#d73a49}.Box--danger .Box-body:last-of-type{border-color:#d73a49}.Box-header--blue{background-color:#f1f8ff;border-color:#c8e1ff}.Box-row--yellow{background-color:#fffbdd}.Box-row--blue{background-color:#f1f8ff}.Box-row--gray{background-color:#f6f8fa}.Box-btn-octicon.btn-octicon{padding:16px 16px;margin:-16px -16px;line-height:1.5}.breadcrumb-item{display:inline-block;margin-left:-0.35em;white-space:nowrap;list-style:none}.breadcrumb-item::after{padding-right:0.5em;padding-left:0.5em;color:#e1e4e8;content:"/"}.breadcrumb-item:first-child{margin-left:0}.breadcrumb-item-selected::after{content:none}.btn{position:relative;display:inline-block;padding:6px 12px;font-size:14px;font-weight:600;line-height:20px;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid rgba(27,31,35,0.2);border-radius:0.25em;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn i{font-style:normal;font-weight:500;opacity:0.75}.btn .octicon{vertical-align:text-top}.btn .Counter{color:#586069;text-shadow:none;background-color:rgba(27,31,35,0.1)}.btn:hover{text-decoration:none;background-repeat:repeat-x}.btn:focus{outline:0}.btn:disabled, .btn.disabled{cursor:default;background-position:0 0}.btn:active, .btn.selected{background-image:none}.btn{color:#24292e;background-color:#eff3f6;background-image:linear-gradient(-180deg,#fafbfc 0%,#eff3f6 90%)}.btn:focus, .btn.focus{box-shadow:0 0 0 0.2em rgba(3,102,214,0.3)}.btn:hover, .btn.hover{background-color:#e6ebf1;background-image:linear-gradient(-180deg,#f0f3f6 0%,#e6ebf1 90%);background-position:-0.5em;border-color:rgba(27,31,35,0.35)}.btn:active, .btn.selected, +[open] > .btn{background-color:#e9ecef;background-image:none;border-color:rgba(27,31,35,0.35);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn:disabled, .btn.disabled{color:rgba(36,41,46,0.4);background-color:#eff3f6;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-primary{color:#fff;background-color:#28a745;background-image:linear-gradient(-180deg,#34d058 0%,#28a745 90%)}.btn-primary:focus, .btn-primary.focus{box-shadow:0 0 0 0.2em rgba(52,208,88,0.4)}.btn-primary:hover, .btn-primary.hover{background-color:#269f42;background-image:linear-gradient(-180deg,#2fcb53 0%,#269f42 90%);background-position:-0.5em;border-color:rgba(27,31,35,0.5)}.btn-primary:active, .btn-primary.selected, +[open] > .btn-primary{background-color:#279f43;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-primary:disabled, .btn-primary.disabled{color:hsla(0,0%,100%,0.75);background-color:#94d3a2;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-primary .Counter{color:#29b249;background-color:#fff}.btn-purple{color:#fff;background-color:#643ab0;background-image:linear-gradient(-180deg,#7e55c7 0%,#643ab0 90%)}.btn-purple:focus, .btn-purple.focus{box-shadow:0 0 0 0.2em rgba(126,85,199,0.4)}.btn-purple:hover, .btn-purple.hover{background-color:#5f37a8;background-image:linear-gradient(-180deg,#784ec5 0%,#5f37a8 90%);background-position:-0.5em;border-color:rgba(27,31,35,0.5)}.btn-purple:active, .btn-purple.selected, +[open] > .btn-purple{background-color:#613ca4;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-purple:disabled, .btn-purple.disabled{color:hsla(0,0%,100%,0.75);background-color:#b19cd7;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-purple .Counter{color:#683cb8;background-color:#fff}.btn-blue{color:#fff;background-color:#0361cc;background-image:linear-gradient(-180deg,#0679fc 0%,#0361cc 90%)}.btn-blue:focus, .btn-blue.focus{box-shadow:0 0 0 0.2em rgba(6,121,252,0.4)}.btn-blue:hover, .btn-blue.hover{background-color:#035cc2;background-image:linear-gradient(-180deg,#0374f4 0%,#035cc2 90%);background-position:-0.5em;border-color:rgba(27,31,35,0.5)}.btn-blue:active, .btn-blue.selected, +[open] > .btn-blue{background-color:#045cc1;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-blue:disabled, .btn-blue.disabled{color:hsla(0,0%,100%,0.75);background-color:#81b0e5;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-blue .Counter{color:#0366d6;background-color:#fff}.btn-danger{color:#cb2431;background-color:#fafbfc;background-image:linear-gradient(-180deg,#fafbfc 0%,#eff3f6 90%)}.btn-danger:focus{box-shadow:0 0 0 0.2em rgba(203,36,49,0.4)}.btn-danger:hover{color:#fff;background-color:#cb2431;background-image:linear-gradient(-180deg,#de4450 0%,#cb2431 90%);border-color:rgba(27,31,35,0.5)}.btn-danger:hover .Counter{color:#fff}.btn-danger:active, .btn-danger.selected, +[open] > .btn-danger{color:#fff;background-color:#b5202c;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-danger:disabled, .btn-danger.disabled{color:rgba(203,36,49,0.4);background-color:#eff3f6;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-outline{color:#0366d6;background-color:#fff;background-image:none}.btn-outline .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline:hover, .btn-outline:active, .btn-outline.selected, +[open] > .btn-outline{color:#fff;background-color:#0366d6;background-image:none;border-color:#0366d6}.btn-outline:hover .Counter, .btn-outline:active .Counter, .btn-outline.selected .Counter, +[open] > .btn-outline .Counter{color:#0366d6;background-color:#fff}.btn-outline:focus{border-color:#0366d6;box-shadow:0 0 0 0.2em rgba(3,102,214,0.4)}.btn-outline:disabled, .btn-outline.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-with-count{float:left;border-top-right-radius:0;border-bottom-right-radius:0}.btn-sm{padding:3px 10px;font-size:12px;line-height:20px}.btn-large{padding:0.75em 1.25em;font-size:inherit;border-radius:6px}.hidden-text-expander{display:block}.hidden-text-expander.inline{position:relative;top:-1px;display:inline-block;margin-left:5px;line-height:0}.hidden-text-expander a, +.ellipsis-expander{display:inline-block;height:12px;padding:0 5px 5px;font-size:12px;font-weight:600;line-height:6px;color:#444d56;text-decoration:none;vertical-align:middle;background:#dfe2e5;border:0;border-radius:1px}.hidden-text-expander a:hover, +.ellipsis-expander:hover{text-decoration:none;background-color:#c6cbd1}.hidden-text-expander a:active, +.ellipsis-expander:active{color:#fff;background-color:#2188ff}.social-count{float:left;padding:3px 10px;font-size:12px;font-weight:600;line-height:20px;color:#24292e;vertical-align:middle;background-color:#fff;border:1px solid rgba(27,31,35,0.2);border-left:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.social-count:hover, .social-count:active{text-decoration:none}.social-count:hover{color:#0366d6;cursor:pointer}.btn-block{display:block;width:100%;text-align:center}.btn-link{display:inline-block;padding:0;font-size:inherit;color:#0366d6;text-decoration:none;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn-link:hover{text-decoration:underline}.btn-link:disabled, .btn-link:disabled:hover{color:rgba(88,96,105,0.5);cursor:default}.details-reset > summary{list-style:none}.details-reset > summary::before{display:none}.details-reset > summary::-webkit-details-marker{display:none}.BtnGroup{display:inline-block;vertical-align:middle}.BtnGroup::before{display:table;content:""}.BtnGroup::after{display:table;clear:both;content:""}.BtnGroup + .BtnGroup, +.BtnGroup + .btn{margin-left:5px}.BtnGroup-item{position:relative;float:left;border-right-width:0;border-radius:0}.BtnGroup-item:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.BtnGroup-item:last-child{border-right-width:1px;border-top-right-radius:3px;border-bottom-right-radius:3px}.BtnGroup-item.selected, .BtnGroup-item:focus, .BtnGroup-item:active, .BtnGroup-item:hover{border-right-width:1px}.BtnGroup-item.selected + .BtnGroup-item, +.BtnGroup-item.selected + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-item.selected + .BtnGroup-form .BtnGroup-item, .BtnGroup-item:focus + .BtnGroup-item, +.BtnGroup-item:focus + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-item:focus + .BtnGroup-form .BtnGroup-item, .BtnGroup-item:active + .BtnGroup-item, +.BtnGroup-item:active + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-item:active + .BtnGroup-form .BtnGroup-item, .BtnGroup-item:hover + .BtnGroup-item, +.BtnGroup-item:hover + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-item:hover + .BtnGroup-form .BtnGroup-item{border-left-width:0}.BtnGroup-parent, +.BtnGroup-form{float:left}.BtnGroup-parent:first-child .BtnGroup-item, +.BtnGroup-form:first-child .BtnGroup-item{border-top-left-radius:3px;border-bottom-left-radius:3px}.BtnGroup-parent:last-child .BtnGroup-item, +.BtnGroup-form:last-child .BtnGroup-item{border-right-width:1px;border-top-right-radius:3px;border-bottom-right-radius:3px}.BtnGroup-parent .BtnGroup-item, +.BtnGroup-form .BtnGroup-item{border-right-width:0;border-radius:0}.BtnGroup-parent.selected .BtnGroup-item, .BtnGroup-parent:focus .BtnGroup-item, .BtnGroup-parent:active .BtnGroup-item, .BtnGroup-parent:hover .BtnGroup-item, +.BtnGroup-form.selected .BtnGroup-item, +.BtnGroup-form:focus .BtnGroup-item, +.BtnGroup-form:active .BtnGroup-item, +.BtnGroup-form:hover .BtnGroup-item{border-right-width:1px}.BtnGroup-parent.selected + .BtnGroup-item, +.BtnGroup-parent.selected + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-parent.selected + .BtnGroup-form .BtnGroup-item, .BtnGroup-parent:focus + .BtnGroup-item, +.BtnGroup-parent:focus + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-parent:focus + .BtnGroup-form .BtnGroup-item, .BtnGroup-parent:active + .BtnGroup-item, +.BtnGroup-parent:active + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-parent:active + .BtnGroup-form .BtnGroup-item, .BtnGroup-parent:hover + .BtnGroup-item, +.BtnGroup-parent:hover + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-parent:hover + .BtnGroup-form .BtnGroup-item, +.BtnGroup-form.selected + .BtnGroup-item, +.BtnGroup-form.selected + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-form.selected + .BtnGroup-form .BtnGroup-item, +.BtnGroup-form:focus + .BtnGroup-item, +.BtnGroup-form:focus + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-form:focus + .BtnGroup-form .BtnGroup-item, +.BtnGroup-form:active + .BtnGroup-item, +.BtnGroup-form:active + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-form:active + .BtnGroup-form .BtnGroup-item, +.BtnGroup-form:hover + .BtnGroup-item, +.BtnGroup-form:hover + .BtnGroup-parent .BtnGroup-item, +.BtnGroup-form:hover + .BtnGroup-form .BtnGroup-item{border-left-width:0}.TableObject{display:table}.TableObject-item{display:table-cell;width:1%;white-space:nowrap;vertical-align:middle}.TableObject-item--primary{width:99%}fieldset{padding:0;margin:0;border:0}label{font-weight:600}.form-control, +.form-select{min-height:34px;padding:6px 8px;font-size:16px;line-height:20px;color:#24292e;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #d1d5da;border-radius:3px;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075)}.form-control.focus, .form-control:focus, +.form-select.focus, +.form-select:focus{border-color:#2188ff;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075),0 0 0 0.2em rgba(3,102,214,0.3)}@media (min-width: 768px){.form-control, + .form-select{font-size:14px}}.input-contrast{background-color:#fafbfc}.input-contrast:focus{background-color:#fff}:-ms-input-placeholder{color:#6a737d}::-ms-input-placeholder{color:#6a737d}::placeholder{color:#6a737d}.input-sm{min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px;line-height:20px}.input-lg{padding:4px 10px;font-size:16px}.input-block{display:block;width:100%}.input-monospace{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.input-hide-webkit-autofill::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none!important;pointer-events:none;visibility:hidden}.form-checkbox{padding-left:20px;margin:15px 0;vertical-align:middle}.form-checkbox label em.highlight{position:relative;left:-4px;padding:2px 4px;font-style:normal;background:#fffbdd;border-radius:3px}.form-checkbox input[type=checkbox], +.form-checkbox input[type=radio]{float:left;margin:5px 0 0 -20px;vertical-align:middle}.form-checkbox .note{display:block;margin:0;font-size:12px;font-weight:400;color:#586069}.form-checkbox-details{display:none}.form-checkbox-details-trigger:checked ~ * .form-checkbox-details, +.form-checkbox-details-trigger:checked ~ .form-checkbox-details{display:block}.hfields{margin:15px 0}.hfields::before{display:table;content:""}.hfields::after{display:table;clear:both;content:""}.hfields .form-group{float:left;margin:0 30px 0 0}.hfields .form-group dt label{display:inline-block;margin:5px 0 0;color:#586069}.hfields .form-group dt img{position:relative;top:-2px}.hfields .btn{float:left;margin:28px 25px 0 -20px}.hfields .form-select{margin-top:5px}input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;appearance:none}.form-actions::before{display:table;content:""}.form-actions::after{display:table;clear:both;content:""}.form-actions .btn{float:right}.form-actions .btn + .btn{margin-right:5px}.form-warning{padding:8px 10px;margin:10px 0;font-size:14px;color:#735c0f;background:#fffbdd;border:1px solid #d9d0a5;border-radius:3px}.form-warning p{margin:0;line-height:1.5}.form-warning a{font-weight:600}.form-select{display:inline-block;max-width:100%;height:34px;padding-right:24px;padding-right:8px\9;background:#fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC") no-repeat right 8px center;background-image:none\9;background-size:8px 10px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select::-ms-expand{opacity:0}.form-select[multiple]{height:auto}.select-sm{height:28px;min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px}.select-sm[multiple]{height:auto;min-height:0}.form-group{margin:15px 0}.form-group .form-control{width:440px;max-width:100%;margin-right:5px;background-color:#fafbfc}.form-group .form-control:focus{background-color:#fff}.form-group .form-control.shorter{width:130px}.form-group .form-control.short{width:250px}.form-group .form-control.long{width:100%}.form-group textarea.form-control{width:100%;height:200px;min-height:200px}.form-group textarea.form-control.short{height:50px;min-height:50px}.form-group dt{margin:0 0 6px}.form-group label{position:relative}.form-group.flattened dt{float:left;margin:0;line-height:32px}.form-group.flattened dd{line-height:32px}.form-group dd h4{margin:4px 0 0}.form-group dd h4.is-error{color:#cb2431}.form-group dd h4.is-success{color:#28a745}.form-group dd h4 + .note{margin-top:0}.form-group.required dt label::after{padding-left:5px;color:#cb2431;content:"*"}.form-group .success, +.form-group .error, +.form-group .indicator{display:none;font-size:12px;font-weight:600}.form-group.loading{opacity:0.5}.form-group.loading .indicator{display:inline}.form-group.loading .spinner{display:inline-block;vertical-align:middle}.form-group.successful .success{display:inline;color:#28a745}.form-group.warn .warning, +.form-group.warn .error, .form-group.errored .warning, +.form-group.errored .error{position:absolute;z-index:10;display:block;max-width:450px;padding:5px 8px;margin:4px 0 0;font-size:13px;font-weight:400;border-style:solid;border-width:1px;border-radius:3px}.form-group.warn .warning::after, .form-group.warn .warning::before, +.form-group.warn .error::after, +.form-group.warn .error::before, .form-group.errored .warning::after, .form-group.errored .warning::before, +.form-group.errored .error::after, +.form-group.errored .error::before{position:absolute;bottom:100%;left:10px;z-index:15;width:0;height:0;pointer-events:none;content:" ";border:solid transparent}.form-group.warn .warning::after, +.form-group.warn .error::after, .form-group.errored .warning::after, +.form-group.errored .error::after{border-width:5px}.form-group.warn .warning::before, +.form-group.warn .error::before, .form-group.errored .warning::before, +.form-group.errored .error::before{margin-left:-1px;border-width:6px}.form-group.warn .warning{color:#735c0f;background-color:#fffbdd;border-color:#d9d0a5}.form-group.warn .warning::after{border-bottom-color:#fffbdd}.form-group.warn .warning::before{border-bottom-color:#d9d0a5}.form-group.errored label{color:#cb2431}.form-group.errored .error{color:#86181d;background-color:#ffdce0;border-color:#cea0a5}.form-group.errored .error::after{border-bottom-color:#ffdce0}.form-group.errored .error::before{border-bottom-color:#cea0a5}.note{min-height:17px;margin:4px 0 2px;font-size:12px;color:#586069}.note .spinner{margin-right:3px;vertical-align:middle}dl.form-group > dd .form-control.is-autocheck-loading, dl.form-group > dd .form-control.is-autocheck-successful, dl.form-group > dd .form-control.is-autocheck-errored{padding-right:30px}dl.form-group > dd .form-control.is-autocheck-loading{background-image:url("/images/spinners/octocat-spinner-16px.gif")}dl.form-group > dd .form-control.is-autocheck-successful{background-image:url("/images/modules/ajax/success.png")}dl.form-group > dd .form-control.is-autocheck-errored{background-image:url("/images/modules/ajax/error.png")}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){dl.form-group > dd .form-control.is-autocheck-loading, dl.form-group > dd .form-control.is-autocheck-successful, dl.form-group > dd .form-control.is-autocheck-errored{background-size:16px 16px}dl.form-group > dd .form-control.is-autocheck-loading{background-image:url("/images/spinners/octocat-spinner-32.gif")}dl.form-group > dd .form-control.is-autocheck-successful{background-image:url("/images/modules/ajax/success@2x.png")}dl.form-group > dd .form-control.is-autocheck-errored{background-image:url("/images/modules/ajax/error@2x.png")}}.status-indicator{display:inline-block;width:16px;height:16px;margin-left:5px}.status-indicator .octicon{display:none}.status-indicator-success::before{content:""}.status-indicator-success .octicon-check{display:inline-block;color:#28a745;fill:#28a745}.status-indicator-success .octicon-x{display:none}.status-indicator-failed::before{content:""}.status-indicator-failed .octicon-check{display:none}.status-indicator-failed .octicon-x{display:inline-block;color:#cb2431;fill:#d73a49}.status-indicator-loading{width:16px;background:url("/images/spinners/octocat-spinner-32-EAF2F5.gif") 0 0 no-repeat;background-size:16px}.inline-form{display:inline-block}.inline-form .btn-plain{background-color:transparent;border:0}.drag-and-drop{padding:7px 10px;margin:0;font-size:13px;line-height:16px;color:#586069;background-color:#fafbfc;border:1px solid #c3c8cf;border-top:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.drag-and-drop .default, +.drag-and-drop .loading, +.drag-and-drop .error{display:none}.drag-and-drop .error{color:#cb2431}.drag-and-drop img{vertical-align:top}.is-default .drag-and-drop .default{display:inline-block}.is-uploading .drag-and-drop .loading{display:inline-block}.is-bad-file .drag-and-drop .bad-file{display:inline-block}.is-duplicate-filename .drag-and-drop .duplicate-filename{display:inline-block}.is-too-big .drag-and-drop .too-big{display:inline-block}.is-hidden-file .drag-and-drop .hidden-file{display:inline-block}.is-empty .drag-and-drop .empty{display:inline-block}.is-bad-permissions .drag-and-drop .bad-permissions{display:inline-block}.is-repository-required .drag-and-drop .repository-required{display:inline-block}.drag-and-drop-error-info{font-weight:400;color:#586069}.drag-and-drop-error-info a{color:#0366d6}.is-failed .drag-and-drop .failed-request{display:inline-block}.manual-file-chooser{position:absolute;width:240px;padding:5px;margin-left:-80px;cursor:pointer;opacity:0.0001}.manual-file-chooser:hover + .manual-file-chooser-text{text-decoration:underline}.btn .manual-file-chooser{top:0;padding:0;line-height:34px}.upload-enabled textarea{display:block;border-bottom:1px dashed #dfe2e5;border-bottom-right-radius:0;border-bottom-left-radius:0}.upload-enabled.focused{border-radius:3px;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075),0 0 0 0.2em rgba(3,102,214,0.3)}.upload-enabled.focused .form-control{box-shadow:none}.upload-enabled.focused .drag-and-drop{border-color:#4a9eff}.dragover textarea, +.dragover .drag-and-drop{box-shadow:#c9ff00 0 0 3px}.write-content{position:relative}.previewable-comment-form{position:relative}.previewable-comment-form .tabnav{position:relative;padding:8px 8px 0}.previewable-comment-form .comment{border:1px solid #c3c8cf}.previewable-comment-form .comment-form-error{margin-bottom:8px}.previewable-comment-form .write-content, +.previewable-comment-form .preview-content{display:none;margin:0 8px 8px}.previewable-comment-form.write-selected .write-content, +.previewable-comment-form.preview-selected .preview-content{display:block}.previewable-comment-form textarea{display:block;width:100%;min-height:100px;max-height:500px;padding:8px;resize:vertical}.form-action-spacious{margin-top:10px}div.composer{margin-top:0;border:0}.composer .comment-form-textarea{height:200px;min-height:200px}.composer .tabnav{margin:0 0 10px}h2.account{margin:15px 0 0;font-size:18px;font-weight:400;color:#586069}p.explain{position:relative;font-size:12px;color:#586069}p.explain strong{color:#24292e}p.explain .octicon{margin-right:5px;color:#959da5}p.explain .minibutton{top:-4px;float:right}.form-group label{position:static}.input-group{display:table}.input-group .form-control{position:relative;width:100%}.input-group .form-control:focus{z-index:2}.input-group .form-control + .btn{margin-left:0}.input-group.inline{display:inline-table}.input-group .form-control, +.input-group-button{display:table-cell}.input-group-button{width:1%;vertical-align:middle}.input-group .form-control:first-child, +.input-group-button:first-child .btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-button:first-child .btn{margin-right:-1px}.input-group .form-control:last-child, +.input-group-button:last-child .btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-button:last-child .btn{margin-left:-1px}.container{width:980px;margin-right:auto;margin-left:auto}.container::before{display:table;content:""}.container::after{display:table;clear:both;content:""}.container-md{max-width:768px;margin-right:auto;margin-left:auto}.container-lg{max-width:1012px;margin-right:auto;margin-left:auto}.container-xl{max-width:1280px;margin-right:auto;margin-left:auto}.columns{margin-right:-10px;margin-left:-10px}.columns::before{display:table;content:""}.columns::after{display:table;clear:both;content:""}.column{float:left;padding-right:10px;padding-left:10px}.one-third{width:33.333333%}.two-thirds{width:66.666667%}.one-fourth{width:25%}.one-half{width:50%}.three-fourths{width:75%}.one-fifth{width:20%}.four-fifths{width:80%}.centered{display:block;float:none;margin-right:auto;margin-left:auto}.col-1{width:8.33333%}.col-2{width:16.66667%}.col-3{width:25%}.col-4{width:33.33333%}.col-5{width:41.66667%}.col-6{width:50%}.col-7{width:58.33333%}.col-8{width:66.66667%}.col-9{width:75%}.col-10{width:83.33333%}.col-11{width:91.66667%}.col-12{width:100%}@media (min-width: 544px){.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}}@media (min-width: 768px){.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}}@media (min-width: 1012px){.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}}@media (min-width: 1280px){.col-xl-1{width:8.33333%}.col-xl-2{width:16.66667%}.col-xl-3{width:25%}.col-xl-4{width:33.33333%}.col-xl-5{width:41.66667%}.col-xl-6{width:50%}.col-xl-7{width:58.33333%}.col-xl-8{width:66.66667%}.col-xl-9{width:75%}.col-xl-10{width:83.33333%}.col-xl-11{width:91.66667%}.col-xl-12{width:100%}}.gutter{margin-right:-16px;margin-left:-16px}.gutter > [class*="col-"]{padding-right:16px!important;padding-left:16px!important}.gutter-condensed{margin-right:-8px;margin-left:-8px}.gutter-condensed > [class*="col-"]{padding-right:8px!important;padding-left:8px!important}.gutter-spacious{margin-right:-24px;margin-left:-24px}.gutter-spacious > [class*="col-"]{padding-right:24px!important;padding-left:24px!important}@media (min-width: 544px){.gutter-sm{margin-right:-16px;margin-left:-16px}.gutter-sm > [class*="col-"]{padding-right:16px!important;padding-left:16px!important}.gutter-sm-condensed{margin-right:-8px;margin-left:-8px}.gutter-sm-condensed > [class*="col-"]{padding-right:8px!important;padding-left:8px!important}.gutter-sm-spacious{margin-right:-24px;margin-left:-24px}.gutter-sm-spacious > [class*="col-"]{padding-right:24px!important;padding-left:24px!important}}@media (min-width: 768px){.gutter-md{margin-right:-16px;margin-left:-16px}.gutter-md > [class*="col-"]{padding-right:16px!important;padding-left:16px!important}.gutter-md-condensed{margin-right:-8px;margin-left:-8px}.gutter-md-condensed > [class*="col-"]{padding-right:8px!important;padding-left:8px!important}.gutter-md-spacious{margin-right:-24px;margin-left:-24px}.gutter-md-spacious > [class*="col-"]{padding-right:24px!important;padding-left:24px!important}}@media (min-width: 1012px){.gutter-lg{margin-right:-16px;margin-left:-16px}.gutter-lg > [class*="col-"]{padding-right:16px!important;padding-left:16px!important}.gutter-lg-condensed{margin-right:-8px;margin-left:-8px}.gutter-lg-condensed > [class*="col-"]{padding-right:8px!important;padding-left:8px!important}.gutter-lg-spacious{margin-right:-24px;margin-left:-24px}.gutter-lg-spacious > [class*="col-"]{padding-right:24px!important;padding-left:24px!important}}@media (min-width: 1280px){.gutter-xl{margin-right:-16px;margin-left:-16px}.gutter-xl > [class*="col-"]{padding-right:16px!important;padding-left:16px!important}.gutter-xl-condensed{margin-right:-8px;margin-left:-8px}.gutter-xl-condensed > [class*="col-"]{padding-right:8px!important;padding-left:8px!important}.gutter-xl-spacious{margin-right:-24px;margin-left:-24px}.gutter-xl-spacious > [class*="col-"]{padding-right:24px!important;padding-left:24px!important}}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width: 544px){.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width: 768px){.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width: 1012px){.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width: 1280px){.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.menu{margin-bottom:15px;list-style:none;background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.menu-item{position:relative;display:block;padding:8px 10px;border-bottom:1px solid #e1e4e8}.menu-item:first-child{border-top:0;border-top-left-radius:2px;border-top-right-radius:2px}.menu-item:first-child::before{border-top-left-radius:2px}.menu-item:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.menu-item:last-child::before{border-bottom-left-radius:2px}.menu-item:hover{text-decoration:none;background-color:#f6f8fa}.menu-item.selected{font-weight:600;color:#24292e;cursor:default;background-color:#fff}.menu-item.selected::before{position:absolute;top:0;bottom:0;left:0;width:2px;content:"";background-color:#e36209}.menu-item .octicon{width:16px;margin-right:5px;color:#24292e;text-align:center}.menu-item .Counter{float:right;margin-left:5px}.menu-item .menu-warning{float:right;color:#86181d}.menu-item .avatar{float:left;margin-right:5px}.menu-item.alert .Counter{color:#cb2431}.menu-heading{display:block;padding:8px 10px;margin-top:0;margin-bottom:0;font-size:13px;font-weight:600;line-height:20px;color:#586069;background-color:#f3f5f8;border-bottom:1px solid #e1e4e8}.menu-heading:hover{text-decoration:none}.menu-heading:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.menu-heading:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.tabnav{margin-top:0;margin-bottom:15px;border-bottom:1px solid #d1d5da}.tabnav .Counter{margin-left:5px}.tabnav-tabs{margin-bottom:-1px}.tabnav-tab{display:inline-block;padding:8px 12px;font-size:14px;line-height:20px;color:#586069;text-decoration:none;background-color:transparent;border:1px solid transparent;border-bottom:0}.tabnav-tab.selected{color:#24292e;background-color:#fff;border-color:#d1d5da;border-radius:3px 3px 0 0}.tabnav-tab:hover, .tabnav-tab:focus{color:#24292e;text-decoration:none}.tabnav-extra{display:inline-block;padding-top:10px;margin-left:10px;font-size:12px;color:#586069}.tabnav-extra > .octicon{margin-right:2px}a.tabnav-extra:hover{color:#0366d6;text-decoration:none}.tabnav-btn{margin-left:10px}.filter-list{list-style-type:none}.filter-list.small .filter-item{padding:4px 10px;margin:0 0 2px;font-size:12px}.filter-list.pjax-active .filter-item{color:#586069;background-color:transparent}.filter-list.pjax-active .filter-item.pjax-active{color:#fff;background-color:#0366d6}.filter-item{position:relative;display:block;padding:8px 10px;margin-bottom:5px;overflow:hidden;font-size:14px;color:#586069;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border-radius:3px}.filter-item:hover{text-decoration:none;background-color:#eaecef}.filter-item.selected{color:#fff;background-color:#0366d6}.filter-item .count{float:right;font-weight:600}.filter-item .bar{position:absolute;top:2px;right:0;bottom:2px;z-index:-1;display:inline-block;background-color:#eff3f6}.subnav{margin-bottom:20px}.subnav::before{display:table;content:""}.subnav::after{display:table;clear:both;content:""}.subnav-bordered{padding-bottom:20px;border-bottom:1px solid #eaecef}.subnav-flush{margin-bottom:0}.subnav-item{position:relative;float:left;padding:6px 14px;font-weight:600;line-height:20px;color:#586069;border:1px solid #e1e4e8}.subnav-item + .subnav-item{margin-left:-1px}.subnav-item:hover, .subnav-item:focus{text-decoration:none;background-color:#f6f8fa}.subnav-item.selected, .subnav-item.selected:hover, .subnav-item.selected:focus{z-index:2;color:#fff;background-color:#0366d6;border-color:#0366d6}.subnav-item:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.subnav-item:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.subnav-search{position:relative;margin-left:10px}.subnav-search-input{width:320px;padding-left:30px;color:#586069}.subnav-search-input-wide{width:500px}.subnav-search-icon{position:absolute;top:9px;left:8px;display:block;color:#c6cbd1;text-align:center;pointer-events:none}.subnav-search-context .btn{color:#444d56;border-top-right-radius:0;border-bottom-right-radius:0}.subnav-search-context .btn:hover, .subnav-search-context .btn:focus, .subnav-search-context .btn:active, .subnav-search-context .btn.selected{z-index:2}.subnav-search-context + .subnav-search{margin-left:-1px}.subnav-search-context + .subnav-search .subnav-search-input{border-top-left-radius:0;border-bottom-left-radius:0}.subnav-search-context .select-menu-modal-holder{z-index:30}.subnav-search-context .select-menu-modal{width:220px}.subnav-search-context .select-menu-item-icon{color:inherit}.subnav-spacer-right{padding-right:10px}.UnderlineNav{display:flex;justify-content:space-between;border-bottom:1px solid #e1e4e8}.UnderlineNav-body{display:flex;margin-bottom:-1px}.UnderlineNav-item{padding:16px 8px;margin-right:16px;font-size:14px;line-height:1.5;color:#586069;text-align:center;border-bottom:2px solid transparent}.UnderlineNav-item:hover, .UnderlineNav-item:focus{color:#24292e;text-decoration:none;border-bottom-color:#d1d5da;transition:0.2s ease}.UnderlineNav-item:hover .UnderlineNav-octicon, .UnderlineNav-item:focus .UnderlineNav-octicon{color:#6a737d}.UnderlineNav-item.selected{font-weight:600;color:#24292e;border-bottom-color:#e36209}.UnderlineNav-item.selected .UnderlineNav-octicon{color:#6a737d}.UnderlineNav--right{justify-content:flex-end}.UnderlineNav--right .UnderlineNav-item{margin-right:0;margin-left:16px}.UnderlineNav--right .UnderlineNav-actions{flex:1 1 auto}.UnderlineNav-actions{align-self:center}.UnderlineNav--full{display:block}.UnderlineNav-octicon{color:#959da5}.UnderlineNav-container{display:flex;justify-content:space-between}.pagination::before{display:table;content:""}.pagination::after{display:table;clear:both;content:""}.pagination a, +.pagination span, +.pagination em{position:relative;float:left;padding:7px 12px;margin-left:-1px;font-size:13px;font-style:normal;font-weight:600;color:#0366d6;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff;border:1px solid #e1e4e8}.pagination a:first-child, +.pagination span:first-child, +.pagination em:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination a:last-child, +.pagination span:last-child, +.pagination em:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.pagination a:hover, .pagination a:focus, +.pagination span:hover, +.pagination span:focus, +.pagination em:hover, +.pagination em:focus{z-index:2;text-decoration:none;background-color:#eff3f6;border-color:#e1e4e8}.pagination .selected{z-index:3}.pagination .current, +.pagination .current:hover{z-index:3;color:#fff;background-color:#0366d6;border-color:#0366d6}.pagination .gap, +.pagination .disabled, +.pagination .gap:hover, +.pagination .disabled:hover{color:#d1d5da;cursor:default;background-color:#fafbfc}.paginate-container{margin-top:20px;margin-bottom:15px;text-align:center}.paginate-container .pagination{display:inline-block}.tooltipped{position:relative}.tooltipped::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";-webkit-font-smoothing:subpixel-antialiased;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:#1b1f23;border-radius:3px;opacity:0}.tooltipped::before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:#1b1f23;pointer-events:none;content:"";border:6px solid transparent;opacity:0}@keyframes tooltip-appear{from{opacity:0}to{opacity:1}}.tooltipped:hover::before, .tooltipped:hover::after, +.tooltipped:active::before, +.tooltipped:active::after, +.tooltipped:focus::before, +.tooltipped:focus::after{display:inline-block;text-decoration:none;animation-name:tooltip-appear;animation-duration:0.1s;animation-fill-mode:forwards;animation-timing-function:ease-in;animation-delay:0.4s}.tooltipped-no-delay:hover::before, .tooltipped-no-delay:hover::after, +.tooltipped-no-delay:active::before, +.tooltipped-no-delay:active::after, +.tooltipped-no-delay:focus::before, +.tooltipped-no-delay:focus::after{animation-delay:0s}.tooltipped-multiline:hover::after, +.tooltipped-multiline:active::after, +.tooltipped-multiline:focus::after{display:table-cell}.tooltipped-s::after, +.tooltipped-se::after, +.tooltipped-sw::after{top:100%;right:50%;margin-top:6px}.tooltipped-s::before, +.tooltipped-se::before, +.tooltipped-sw::before{top:auto;right:50%;bottom:-7px;margin-right:-6px;border-bottom-color:#1b1f23}.tooltipped-se::after{right:auto;left:50%;margin-left:-16px}.tooltipped-sw::after{margin-right:-16px}.tooltipped-n::after, +.tooltipped-ne::after, +.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px}.tooltipped-n::before, +.tooltipped-ne::before, +.tooltipped-nw::before{top:-7px;right:50%;bottom:auto;margin-right:-6px;border-top-color:#1b1f23}.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px}.tooltipped-nw::after{margin-right:-16px}.tooltipped-s::after, +.tooltipped-n::after{transform:translateX(50%)}.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;transform:translateY(50%)}.tooltipped-w::before{top:50%;bottom:50%;left:-7px;margin-top:-6px;border-left-color:#1b1f23}.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;transform:translateY(50%)}.tooltipped-e::before{top:50%;right:-7px;bottom:50%;margin-top:-6px;border-right-color:#1b1f23}.tooltipped-align-right-1::after, +.tooltipped-align-right-2::after{right:0;margin-right:0}.tooltipped-align-right-1::before{right:10px}.tooltipped-align-right-2::before{right:15px}.tooltipped-align-left-1::after, +.tooltipped-align-left-2::after{left:0;margin-left:0}.tooltipped-align-left-1::before{left:5px}.tooltipped-align-left-2::before{left:10px}.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate}.tooltipped-multiline.tooltipped-s::after, .tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;transform:translateX(-50%)}.tooltipped-multiline.tooltipped-w::after, .tooltipped-multiline.tooltipped-e::after{right:100%}@media screen and (min-width: 0\0){.tooltipped-multiline::after{width:250px}}.tooltipped-sticky::before, .tooltipped-sticky::after{display:inline-block}.tooltipped-sticky.tooltipped-multiline::after{display:table-cell}.css-truncate.css-truncate-target, +.css-truncate .css-truncate-target{display:inline-block;max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}.css-truncate.expandable.zeroclipboard-is-hover .css-truncate-target, .css-truncate.expandable.zeroclipboard-is-hover.css-truncate-target, +.css-truncate.expandable:hover .css-truncate-target, .css-truncate.expandable:hover.css-truncate-target{max-width:10000px!important}.anim-fade-in{animation-name:fade-in;animation-duration:1s;animation-timing-function:ease-in-out}.anim-fade-in.fast{animation-duration:300ms}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.anim-fade-out{animation-name:fade-out;animation-duration:1s;animation-timing-function:ease-out}.anim-fade-out.fast{animation-duration:0.3s}@keyframes fade-out{0%{opacity:1}100%{opacity:0}}.anim-fade-up{opacity:0;animation-name:fade-up;animation-duration:0.3s;animation-fill-mode:forwards;animation-timing-function:ease-out;animation-delay:1s}@keyframes fade-up{0%{opacity:0.8;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}.anim-fade-down{animation-name:fade-down;animation-duration:0.3s;animation-fill-mode:forwards;animation-timing-function:ease-in}@keyframes fade-down{0%{opacity:1;transform:translateY(0)}100%{opacity:0.5;transform:translateY(100%)}}.anim-grow-x{width:0%;animation-name:grow-x;animation-duration:0.3s;animation-fill-mode:forwards;animation-timing-function:ease;animation-delay:0.5s}@keyframes grow-x{to{width:100%}}.anim-shrink-x{animation-name:shrink-x;animation-duration:0.3s;animation-fill-mode:forwards;animation-timing-function:ease-in-out;animation-delay:0.5s}@keyframes shrink-x{to{width:0%}}.anim-scale-in{animation-name:scale-in;animation-duration:0.15s;animation-timing-function:cubic-bezier(0.2,0,0.13,1.5)}@keyframes scale-in{0%{opacity:0;transform:scale(0.5)}100%{opacity:1;transform:scale(1)}}.anim-pulse{animation-name:pulse;animation-duration:2s;animation-timing-function:linear;animation-iteration-count:infinite}@keyframes pulse{0%{opacity:0.3}10%{opacity:1}100%{opacity:0.3}}.anim-pulse-in{animation-name:pulse-in;animation-duration:0.5s}@keyframes pulse-in{0%{transform:scale3d(1,1,1)}50%{transform:scale3d(1.1,1.1,1.1)}100%{transform:scale3d(1,1,1)}}.hover-grow{transition:transform 0.3s;-webkit-backface-visibility:hidden;backface-visibility:hidden}.hover-grow:hover{transform:scale(1.025)}.border{border:1px #e1e4e8 solid!important}.border-top{border-top:1px #e1e4e8 solid!important}.border-right{border-right:1px #e1e4e8 solid!important}.border-bottom{border-bottom:1px #e1e4e8 solid!important}.border-left{border-left:1px #e1e4e8 solid!important}.border-y{border-top:1px #e1e4e8 solid!important;border-bottom:1px #e1e4e8 solid!important}.border-dashed{border-style:dashed!important}.border-blue{border-color:#0366d6!important}.border-blue-light{border-color:#c8e1ff!important}.border-green{border-color:#34d058!important}.border-green-light{border-color:#a2cbac!important}.border-red{border-color:#d73a49!important}.border-red-light{border-color:#cea0a5!important}.border-purple{border-color:#6f42c1!important}.border-yellow{border-color:#d9d0a5!important}.border-gray-light{border-color:#eaecef!important}.border-gray-dark{border-color:#d1d5da!important}.border-black-fade{border-color:rgba(27,31,35,0.15)!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:3px!important}.rounded-2{border-radius:6px!important}.circle{border-radius:50%!important}.box-shadow{box-shadow:0 1px 1px rgba(27,31,35,0.1)!important}.box-shadow-medium{box-shadow:0 1px 5px rgba(27,31,35,0.15)!important}.box-shadow-large{box-shadow:0 1px 15px rgba(27,31,35,0.15)!important}.box-shadow-extra-large{box-shadow:0 10px 50px rgba(27,31,35,0.07)!important}.box-shadow-none{box-shadow:none!important}.bg-white{background-color:#fff!important}.bg-blue{background-color:#0366d6!important}.bg-blue-light{background-color:#f1f8ff!important}.bg-gray-dark{background-color:#24292e!important}.bg-gray{background-color:#f6f8fa!important}.bg-gray-light{background-color:#fafbfc!important}.bg-green{background-color:#28a745!important}.bg-green-light{background-color:#dcffe4!important}.bg-red{background-color:#d73a49!important}.bg-red-light{background-color:#ffdce0!important}.bg-yellow{background-color:#ffd33d!important}.bg-yellow-light{background-color:#fff5b1!important}.bg-purple{background-color:#6f42c1!important}.bg-purple-light{background-color:#f5f0ff!important}.bg-shade-gradient{background-image:linear-gradient(180deg,rgba(27,31,35,0.065),rgba(27,31,35,0))!important;background-repeat:no-repeat!important;background-size:100% 200px!important}.text-blue{color:#0366d6!important}.text-red{color:#cb2431!important}.text-gray-light{color:#6a737d!important}.text-gray{color:#586069!important}.text-gray-dark{color:#24292e!important}.text-green{color:#28a745!important}.text-orange{color:#a04100!important}.text-orange-light{color:#e36209!important}.text-purple{color:#6f42c1!important}.text-white{color:#fff!important}.text-inherit{color:inherit!important}.text-pending{color:#b08800!important}.bg-pending{color:#dbab09!important}.link-gray{color:#586069!important}.link-gray:hover{color:#0366d6!important}.link-gray-dark{color:#24292e!important}.link-gray-dark:hover{color:#0366d6!important}.link-hover-blue:hover{color:#0366d6!important}.muted-link{color:#586069!important}.muted-link:hover{color:#0366d6!important;text-decoration:none}.details-overlay[open] > summary::before{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;display:block;cursor:default;content:" ";background:transparent}.details-overlay-dark[open] > summary::before{z-index:99;background:rgba(27,31,35,0.5)}.flex-row{flex-direction:row!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column{flex-direction:column!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-justify-start{justify-content:flex-start!important}.flex-justify-end{justify-content:flex-end!important}.flex-justify-center{justify-content:center!important}.flex-justify-between{justify-content:space-between!important}.flex-justify-around{justify-content:space-around!important}.flex-items-start{align-items:flex-start!important}.flex-items-end{align-items:flex-end!important}.flex-items-center{align-items:center!important}.flex-items-baseline{align-items:baseline!important}.flex-items-stretch{align-items:stretch!important}.flex-content-start{align-content:flex-start!important}.flex-content-end{align-content:flex-end!important}.flex-content-center{align-content:center!important}.flex-content-between{align-content:space-between!important}.flex-content-around{align-content:space-around!important}.flex-content-stretch{align-content:stretch!important}.flex-auto{flex:1 1 auto!important}.flex-shrink-0{flex-shrink:0!important}.flex-self-auto{align-self:auto!important}.flex-self-start{align-self:flex-start!important}.flex-self-end{align-self:flex-end!important}.flex-self-center{align-self:center!important}.flex-self-baseline{align-self:baseline!important}.flex-self-stretch{align-self:stretch!important}.flex-item-equal{flex-grow:1;flex-basis:0}@media (min-width: 544px){.flex-sm-row{flex-direction:row!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column{flex-direction:column!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-justify-start{justify-content:flex-start!important}.flex-sm-justify-end{justify-content:flex-end!important}.flex-sm-justify-center{justify-content:center!important}.flex-sm-justify-between{justify-content:space-between!important}.flex-sm-justify-around{justify-content:space-around!important}.flex-sm-items-start{align-items:flex-start!important}.flex-sm-items-end{align-items:flex-end!important}.flex-sm-items-center{align-items:center!important}.flex-sm-items-baseline{align-items:baseline!important}.flex-sm-items-stretch{align-items:stretch!important}.flex-sm-content-start{align-content:flex-start!important}.flex-sm-content-end{align-content:flex-end!important}.flex-sm-content-center{align-content:center!important}.flex-sm-content-between{align-content:space-between!important}.flex-sm-content-around{align-content:space-around!important}.flex-sm-content-stretch{align-content:stretch!important}.flex-sm-auto{flex:1 1 auto!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-self-auto{align-self:auto!important}.flex-sm-self-start{align-self:flex-start!important}.flex-sm-self-end{align-self:flex-end!important}.flex-sm-self-center{align-self:center!important}.flex-sm-self-baseline{align-self:baseline!important}.flex-sm-self-stretch{align-self:stretch!important}.flex-sm-item-equal{flex-grow:1;flex-basis:0}}@media (min-width: 768px){.flex-md-row{flex-direction:row!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column{flex-direction:column!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-justify-start{justify-content:flex-start!important}.flex-md-justify-end{justify-content:flex-end!important}.flex-md-justify-center{justify-content:center!important}.flex-md-justify-between{justify-content:space-between!important}.flex-md-justify-around{justify-content:space-around!important}.flex-md-items-start{align-items:flex-start!important}.flex-md-items-end{align-items:flex-end!important}.flex-md-items-center{align-items:center!important}.flex-md-items-baseline{align-items:baseline!important}.flex-md-items-stretch{align-items:stretch!important}.flex-md-content-start{align-content:flex-start!important}.flex-md-content-end{align-content:flex-end!important}.flex-md-content-center{align-content:center!important}.flex-md-content-between{align-content:space-between!important}.flex-md-content-around{align-content:space-around!important}.flex-md-content-stretch{align-content:stretch!important}.flex-md-auto{flex:1 1 auto!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-self-auto{align-self:auto!important}.flex-md-self-start{align-self:flex-start!important}.flex-md-self-end{align-self:flex-end!important}.flex-md-self-center{align-self:center!important}.flex-md-self-baseline{align-self:baseline!important}.flex-md-self-stretch{align-self:stretch!important}.flex-md-item-equal{flex-grow:1;flex-basis:0}}@media (min-width: 1012px){.flex-lg-row{flex-direction:row!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column{flex-direction:column!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-justify-start{justify-content:flex-start!important}.flex-lg-justify-end{justify-content:flex-end!important}.flex-lg-justify-center{justify-content:center!important}.flex-lg-justify-between{justify-content:space-between!important}.flex-lg-justify-around{justify-content:space-around!important}.flex-lg-items-start{align-items:flex-start!important}.flex-lg-items-end{align-items:flex-end!important}.flex-lg-items-center{align-items:center!important}.flex-lg-items-baseline{align-items:baseline!important}.flex-lg-items-stretch{align-items:stretch!important}.flex-lg-content-start{align-content:flex-start!important}.flex-lg-content-end{align-content:flex-end!important}.flex-lg-content-center{align-content:center!important}.flex-lg-content-between{align-content:space-between!important}.flex-lg-content-around{align-content:space-around!important}.flex-lg-content-stretch{align-content:stretch!important}.flex-lg-auto{flex:1 1 auto!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-self-auto{align-self:auto!important}.flex-lg-self-start{align-self:flex-start!important}.flex-lg-self-end{align-self:flex-end!important}.flex-lg-self-center{align-self:center!important}.flex-lg-self-baseline{align-self:baseline!important}.flex-lg-self-stretch{align-self:stretch!important}.flex-lg-item-equal{flex-grow:1;flex-basis:0}}@media (min-width: 1280px){.flex-xl-row{flex-direction:row!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column{flex-direction:column!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-justify-start{justify-content:flex-start!important}.flex-xl-justify-end{justify-content:flex-end!important}.flex-xl-justify-center{justify-content:center!important}.flex-xl-justify-between{justify-content:space-between!important}.flex-xl-justify-around{justify-content:space-around!important}.flex-xl-items-start{align-items:flex-start!important}.flex-xl-items-end{align-items:flex-end!important}.flex-xl-items-center{align-items:center!important}.flex-xl-items-baseline{align-items:baseline!important}.flex-xl-items-stretch{align-items:stretch!important}.flex-xl-content-start{align-content:flex-start!important}.flex-xl-content-end{align-content:flex-end!important}.flex-xl-content-center{align-content:center!important}.flex-xl-content-between{align-content:space-between!important}.flex-xl-content-around{align-content:space-around!important}.flex-xl-content-stretch{align-content:stretch!important}.flex-xl-auto{flex:1 1 auto!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-self-auto{align-self:auto!important}.flex-xl-self-start{align-self:flex-start!important}.flex-xl-self-end{align-self:flex-end!important}.flex-xl-self-center{align-self:center!important}.flex-xl-self-baseline{align-self:baseline!important}.flex-xl-self-stretch{align-self:stretch!important}.flex-xl-item-equal{flex-grow:1;flex-basis:0}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.top-0{top:0!important}.right-0{right:0!important}.bottom-0{bottom:0!important}.left-0{left:0!important}.v-align-middle{vertical-align:middle!important}.v-align-top{vertical-align:top!important}.v-align-bottom{vertical-align:bottom!important}.v-align-text-top{vertical-align:text-top!important}.v-align-text-bottom{vertical-align:text-bottom!important}.v-align-baseline{vertical-align:baseline!important}.overflow-hidden{overflow:hidden!important}.overflow-scroll{overflow:scroll!important}.overflow-auto{overflow:auto!important}.clearfix::before{display:table;content:""}.clearfix::after{display:table;clear:both;content:""}.float-right{float:right!important}.float-left{float:left!important}.float-none{float:none!important}@media (min-width: 544px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width: 768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width: 1012px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width: 1280px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.width-fit{max-width:100%!important}.width-full{width:100%!important}.height-fit{max-height:100%!important}.height-full{height:100%!important}.min-width-0{min-width:0!important}.direction-rtl{direction:rtl!important}.direction-ltr{direction:ltr!important}@media (min-width: 544px){.direction-sm-rtl{direction:rtl!important}.direction-sm-ltr{direction:ltr!important}}@media (min-width: 768px){.direction-md-rtl{direction:rtl!important}.direction-md-ltr{direction:ltr!important}}@media (min-width: 1012px){.direction-lg-rtl{direction:rtl!important}.direction-lg-ltr{direction:ltr!important}}@media (min-width: 1280px){.direction-xl-rtl{direction:rtl!important}.direction-xl-ltr{direction:ltr!important}}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mt-n0{margin-top:-0!important}.mr-n0{margin-right:-0!important}.mb-n0{margin-bottom:-0!important}.ml-n0{margin-left:-0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:4px!important}.mt-1{margin-top:4px!important}.mr-1{margin-right:4px!important}.mb-1{margin-bottom:4px!important}.ml-1{margin-left:4px!important}.mt-n1{margin-top:-4px!important}.mr-n1{margin-right:-4px!important}.mb-n1{margin-bottom:-4px!important}.ml-n1{margin-left:-4px!important}.mx-1{margin-right:4px!important;margin-left:4px!important}.my-1{margin-top:4px!important;margin-bottom:4px!important}.m-2{margin:8px!important}.mt-2{margin-top:8px!important}.mr-2{margin-right:8px!important}.mb-2{margin-bottom:8px!important}.ml-2{margin-left:8px!important}.mt-n2{margin-top:-8px!important}.mr-n2{margin-right:-8px!important}.mb-n2{margin-bottom:-8px!important}.ml-n2{margin-left:-8px!important}.mx-2{margin-right:8px!important;margin-left:8px!important}.my-2{margin-top:8px!important;margin-bottom:8px!important}.m-3{margin:16px!important}.mt-3{margin-top:16px!important}.mr-3{margin-right:16px!important}.mb-3{margin-bottom:16px!important}.ml-3{margin-left:16px!important}.mt-n3{margin-top:-16px!important}.mr-n3{margin-right:-16px!important}.mb-n3{margin-bottom:-16px!important}.ml-n3{margin-left:-16px!important}.mx-3{margin-right:16px!important;margin-left:16px!important}.my-3{margin-top:16px!important;margin-bottom:16px!important}.m-4{margin:24px!important}.mt-4{margin-top:24px!important}.mr-4{margin-right:24px!important}.mb-4{margin-bottom:24px!important}.ml-4{margin-left:24px!important}.mt-n4{margin-top:-24px!important}.mr-n4{margin-right:-24px!important}.mb-n4{margin-bottom:-24px!important}.ml-n4{margin-left:-24px!important}.mx-4{margin-right:24px!important;margin-left:24px!important}.my-4{margin-top:24px!important;margin-bottom:24px!important}.m-5{margin:32px!important}.mt-5{margin-top:32px!important}.mr-5{margin-right:32px!important}.mb-5{margin-bottom:32px!important}.ml-5{margin-left:32px!important}.mt-n5{margin-top:-32px!important}.mr-n5{margin-right:-32px!important}.mb-n5{margin-bottom:-32px!important}.ml-n5{margin-left:-32px!important}.mx-5{margin-right:32px!important;margin-left:32px!important}.my-5{margin-top:32px!important;margin-bottom:32px!important}.m-6{margin:40px!important}.mt-6{margin-top:40px!important}.mr-6{margin-right:40px!important}.mb-6{margin-bottom:40px!important}.ml-6{margin-left:40px!important}.mt-n6{margin-top:-40px!important}.mr-n6{margin-right:-40px!important}.mb-n6{margin-bottom:-40px!important}.ml-n6{margin-left:-40px!important}.mx-6{margin-right:40px!important;margin-left:40px!important}.my-6{margin-top:40px!important;margin-bottom:40px!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}@media (min-width: 544px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mt-sm-n0{margin-top:-0!important}.mr-sm-n0{margin-right:-0!important}.mb-sm-n0{margin-bottom:-0!important}.ml-sm-n0{margin-left:-0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}}@media (min-width: 544px){.m-sm-1{margin:4px!important}.mt-sm-1{margin-top:4px!important}.mr-sm-1{margin-right:4px!important}.mb-sm-1{margin-bottom:4px!important}.ml-sm-1{margin-left:4px!important}.mt-sm-n1{margin-top:-4px!important}.mr-sm-n1{margin-right:-4px!important}.mb-sm-n1{margin-bottom:-4px!important}.ml-sm-n1{margin-left:-4px!important}.mx-sm-1{margin-right:4px!important;margin-left:4px!important}.my-sm-1{margin-top:4px!important;margin-bottom:4px!important}}@media (min-width: 544px){.m-sm-2{margin:8px!important}.mt-sm-2{margin-top:8px!important}.mr-sm-2{margin-right:8px!important}.mb-sm-2{margin-bottom:8px!important}.ml-sm-2{margin-left:8px!important}.mt-sm-n2{margin-top:-8px!important}.mr-sm-n2{margin-right:-8px!important}.mb-sm-n2{margin-bottom:-8px!important}.ml-sm-n2{margin-left:-8px!important}.mx-sm-2{margin-right:8px!important;margin-left:8px!important}.my-sm-2{margin-top:8px!important;margin-bottom:8px!important}}@media (min-width: 544px){.m-sm-3{margin:16px!important}.mt-sm-3{margin-top:16px!important}.mr-sm-3{margin-right:16px!important}.mb-sm-3{margin-bottom:16px!important}.ml-sm-3{margin-left:16px!important}.mt-sm-n3{margin-top:-16px!important}.mr-sm-n3{margin-right:-16px!important}.mb-sm-n3{margin-bottom:-16px!important}.ml-sm-n3{margin-left:-16px!important}.mx-sm-3{margin-right:16px!important;margin-left:16px!important}.my-sm-3{margin-top:16px!important;margin-bottom:16px!important}}@media (min-width: 544px){.m-sm-4{margin:24px!important}.mt-sm-4{margin-top:24px!important}.mr-sm-4{margin-right:24px!important}.mb-sm-4{margin-bottom:24px!important}.ml-sm-4{margin-left:24px!important}.mt-sm-n4{margin-top:-24px!important}.mr-sm-n4{margin-right:-24px!important}.mb-sm-n4{margin-bottom:-24px!important}.ml-sm-n4{margin-left:-24px!important}.mx-sm-4{margin-right:24px!important;margin-left:24px!important}.my-sm-4{margin-top:24px!important;margin-bottom:24px!important}}@media (min-width: 544px){.m-sm-5{margin:32px!important}.mt-sm-5{margin-top:32px!important}.mr-sm-5{margin-right:32px!important}.mb-sm-5{margin-bottom:32px!important}.ml-sm-5{margin-left:32px!important}.mt-sm-n5{margin-top:-32px!important}.mr-sm-n5{margin-right:-32px!important}.mb-sm-n5{margin-bottom:-32px!important}.ml-sm-n5{margin-left:-32px!important}.mx-sm-5{margin-right:32px!important;margin-left:32px!important}.my-sm-5{margin-top:32px!important;margin-bottom:32px!important}}@media (min-width: 544px){.m-sm-6{margin:40px!important}.mt-sm-6{margin-top:40px!important}.mr-sm-6{margin-right:40px!important}.mb-sm-6{margin-bottom:40px!important}.ml-sm-6{margin-left:40px!important}.mt-sm-n6{margin-top:-40px!important}.mr-sm-n6{margin-right:-40px!important}.mb-sm-n6{margin-bottom:-40px!important}.ml-sm-n6{margin-left:-40px!important}.mx-sm-6{margin-right:40px!important;margin-left:40px!important}.my-sm-6{margin-top:40px!important;margin-bottom:40px!important}}@media (min-width: 768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mt-md-n0{margin-top:-0!important}.mr-md-n0{margin-right:-0!important}.mb-md-n0{margin-bottom:-0!important}.ml-md-n0{margin-left:-0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}}@media (min-width: 768px){.m-md-1{margin:4px!important}.mt-md-1{margin-top:4px!important}.mr-md-1{margin-right:4px!important}.mb-md-1{margin-bottom:4px!important}.ml-md-1{margin-left:4px!important}.mt-md-n1{margin-top:-4px!important}.mr-md-n1{margin-right:-4px!important}.mb-md-n1{margin-bottom:-4px!important}.ml-md-n1{margin-left:-4px!important}.mx-md-1{margin-right:4px!important;margin-left:4px!important}.my-md-1{margin-top:4px!important;margin-bottom:4px!important}}@media (min-width: 768px){.m-md-2{margin:8px!important}.mt-md-2{margin-top:8px!important}.mr-md-2{margin-right:8px!important}.mb-md-2{margin-bottom:8px!important}.ml-md-2{margin-left:8px!important}.mt-md-n2{margin-top:-8px!important}.mr-md-n2{margin-right:-8px!important}.mb-md-n2{margin-bottom:-8px!important}.ml-md-n2{margin-left:-8px!important}.mx-md-2{margin-right:8px!important;margin-left:8px!important}.my-md-2{margin-top:8px!important;margin-bottom:8px!important}}@media (min-width: 768px){.m-md-3{margin:16px!important}.mt-md-3{margin-top:16px!important}.mr-md-3{margin-right:16px!important}.mb-md-3{margin-bottom:16px!important}.ml-md-3{margin-left:16px!important}.mt-md-n3{margin-top:-16px!important}.mr-md-n3{margin-right:-16px!important}.mb-md-n3{margin-bottom:-16px!important}.ml-md-n3{margin-left:-16px!important}.mx-md-3{margin-right:16px!important;margin-left:16px!important}.my-md-3{margin-top:16px!important;margin-bottom:16px!important}}@media (min-width: 768px){.m-md-4{margin:24px!important}.mt-md-4{margin-top:24px!important}.mr-md-4{margin-right:24px!important}.mb-md-4{margin-bottom:24px!important}.ml-md-4{margin-left:24px!important}.mt-md-n4{margin-top:-24px!important}.mr-md-n4{margin-right:-24px!important}.mb-md-n4{margin-bottom:-24px!important}.ml-md-n4{margin-left:-24px!important}.mx-md-4{margin-right:24px!important;margin-left:24px!important}.my-md-4{margin-top:24px!important;margin-bottom:24px!important}}@media (min-width: 768px){.m-md-5{margin:32px!important}.mt-md-5{margin-top:32px!important}.mr-md-5{margin-right:32px!important}.mb-md-5{margin-bottom:32px!important}.ml-md-5{margin-left:32px!important}.mt-md-n5{margin-top:-32px!important}.mr-md-n5{margin-right:-32px!important}.mb-md-n5{margin-bottom:-32px!important}.ml-md-n5{margin-left:-32px!important}.mx-md-5{margin-right:32px!important;margin-left:32px!important}.my-md-5{margin-top:32px!important;margin-bottom:32px!important}}@media (min-width: 768px){.m-md-6{margin:40px!important}.mt-md-6{margin-top:40px!important}.mr-md-6{margin-right:40px!important}.mb-md-6{margin-bottom:40px!important}.ml-md-6{margin-left:40px!important}.mt-md-n6{margin-top:-40px!important}.mr-md-n6{margin-right:-40px!important}.mb-md-n6{margin-bottom:-40px!important}.ml-md-n6{margin-left:-40px!important}.mx-md-6{margin-right:40px!important;margin-left:40px!important}.my-md-6{margin-top:40px!important;margin-bottom:40px!important}}@media (min-width: 1012px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mt-lg-n0{margin-top:-0!important}.mr-lg-n0{margin-right:-0!important}.mb-lg-n0{margin-bottom:-0!important}.ml-lg-n0{margin-left:-0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}}@media (min-width: 1012px){.m-lg-1{margin:4px!important}.mt-lg-1{margin-top:4px!important}.mr-lg-1{margin-right:4px!important}.mb-lg-1{margin-bottom:4px!important}.ml-lg-1{margin-left:4px!important}.mt-lg-n1{margin-top:-4px!important}.mr-lg-n1{margin-right:-4px!important}.mb-lg-n1{margin-bottom:-4px!important}.ml-lg-n1{margin-left:-4px!important}.mx-lg-1{margin-right:4px!important;margin-left:4px!important}.my-lg-1{margin-top:4px!important;margin-bottom:4px!important}}@media (min-width: 1012px){.m-lg-2{margin:8px!important}.mt-lg-2{margin-top:8px!important}.mr-lg-2{margin-right:8px!important}.mb-lg-2{margin-bottom:8px!important}.ml-lg-2{margin-left:8px!important}.mt-lg-n2{margin-top:-8px!important}.mr-lg-n2{margin-right:-8px!important}.mb-lg-n2{margin-bottom:-8px!important}.ml-lg-n2{margin-left:-8px!important}.mx-lg-2{margin-right:8px!important;margin-left:8px!important}.my-lg-2{margin-top:8px!important;margin-bottom:8px!important}}@media (min-width: 1012px){.m-lg-3{margin:16px!important}.mt-lg-3{margin-top:16px!important}.mr-lg-3{margin-right:16px!important}.mb-lg-3{margin-bottom:16px!important}.ml-lg-3{margin-left:16px!important}.mt-lg-n3{margin-top:-16px!important}.mr-lg-n3{margin-right:-16px!important}.mb-lg-n3{margin-bottom:-16px!important}.ml-lg-n3{margin-left:-16px!important}.mx-lg-3{margin-right:16px!important;margin-left:16px!important}.my-lg-3{margin-top:16px!important;margin-bottom:16px!important}}@media (min-width: 1012px){.m-lg-4{margin:24px!important}.mt-lg-4{margin-top:24px!important}.mr-lg-4{margin-right:24px!important}.mb-lg-4{margin-bottom:24px!important}.ml-lg-4{margin-left:24px!important}.mt-lg-n4{margin-top:-24px!important}.mr-lg-n4{margin-right:-24px!important}.mb-lg-n4{margin-bottom:-24px!important}.ml-lg-n4{margin-left:-24px!important}.mx-lg-4{margin-right:24px!important;margin-left:24px!important}.my-lg-4{margin-top:24px!important;margin-bottom:24px!important}}@media (min-width: 1012px){.m-lg-5{margin:32px!important}.mt-lg-5{margin-top:32px!important}.mr-lg-5{margin-right:32px!important}.mb-lg-5{margin-bottom:32px!important}.ml-lg-5{margin-left:32px!important}.mt-lg-n5{margin-top:-32px!important}.mr-lg-n5{margin-right:-32px!important}.mb-lg-n5{margin-bottom:-32px!important}.ml-lg-n5{margin-left:-32px!important}.mx-lg-5{margin-right:32px!important;margin-left:32px!important}.my-lg-5{margin-top:32px!important;margin-bottom:32px!important}}@media (min-width: 1012px){.m-lg-6{margin:40px!important}.mt-lg-6{margin-top:40px!important}.mr-lg-6{margin-right:40px!important}.mb-lg-6{margin-bottom:40px!important}.ml-lg-6{margin-left:40px!important}.mt-lg-n6{margin-top:-40px!important}.mr-lg-n6{margin-right:-40px!important}.mb-lg-n6{margin-bottom:-40px!important}.ml-lg-n6{margin-left:-40px!important}.mx-lg-6{margin-right:40px!important;margin-left:40px!important}.my-lg-6{margin-top:40px!important;margin-bottom:40px!important}}@media (min-width: 1280px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mt-xl-n0{margin-top:-0!important}.mr-xl-n0{margin-right:-0!important}.mb-xl-n0{margin-bottom:-0!important}.ml-xl-n0{margin-left:-0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}}@media (min-width: 1280px){.m-xl-1{margin:4px!important}.mt-xl-1{margin-top:4px!important}.mr-xl-1{margin-right:4px!important}.mb-xl-1{margin-bottom:4px!important}.ml-xl-1{margin-left:4px!important}.mt-xl-n1{margin-top:-4px!important}.mr-xl-n1{margin-right:-4px!important}.mb-xl-n1{margin-bottom:-4px!important}.ml-xl-n1{margin-left:-4px!important}.mx-xl-1{margin-right:4px!important;margin-left:4px!important}.my-xl-1{margin-top:4px!important;margin-bottom:4px!important}}@media (min-width: 1280px){.m-xl-2{margin:8px!important}.mt-xl-2{margin-top:8px!important}.mr-xl-2{margin-right:8px!important}.mb-xl-2{margin-bottom:8px!important}.ml-xl-2{margin-left:8px!important}.mt-xl-n2{margin-top:-8px!important}.mr-xl-n2{margin-right:-8px!important}.mb-xl-n2{margin-bottom:-8px!important}.ml-xl-n2{margin-left:-8px!important}.mx-xl-2{margin-right:8px!important;margin-left:8px!important}.my-xl-2{margin-top:8px!important;margin-bottom:8px!important}}@media (min-width: 1280px){.m-xl-3{margin:16px!important}.mt-xl-3{margin-top:16px!important}.mr-xl-3{margin-right:16px!important}.mb-xl-3{margin-bottom:16px!important}.ml-xl-3{margin-left:16px!important}.mt-xl-n3{margin-top:-16px!important}.mr-xl-n3{margin-right:-16px!important}.mb-xl-n3{margin-bottom:-16px!important}.ml-xl-n3{margin-left:-16px!important}.mx-xl-3{margin-right:16px!important;margin-left:16px!important}.my-xl-3{margin-top:16px!important;margin-bottom:16px!important}}@media (min-width: 1280px){.m-xl-4{margin:24px!important}.mt-xl-4{margin-top:24px!important}.mr-xl-4{margin-right:24px!important}.mb-xl-4{margin-bottom:24px!important}.ml-xl-4{margin-left:24px!important}.mt-xl-n4{margin-top:-24px!important}.mr-xl-n4{margin-right:-24px!important}.mb-xl-n4{margin-bottom:-24px!important}.ml-xl-n4{margin-left:-24px!important}.mx-xl-4{margin-right:24px!important;margin-left:24px!important}.my-xl-4{margin-top:24px!important;margin-bottom:24px!important}}@media (min-width: 1280px){.m-xl-5{margin:32px!important}.mt-xl-5{margin-top:32px!important}.mr-xl-5{margin-right:32px!important}.mb-xl-5{margin-bottom:32px!important}.ml-xl-5{margin-left:32px!important}.mt-xl-n5{margin-top:-32px!important}.mr-xl-n5{margin-right:-32px!important}.mb-xl-n5{margin-bottom:-32px!important}.ml-xl-n5{margin-left:-32px!important}.mx-xl-5{margin-right:32px!important;margin-left:32px!important}.my-xl-5{margin-top:32px!important;margin-bottom:32px!important}}@media (min-width: 1280px){.m-xl-6{margin:40px!important}.mt-xl-6{margin-top:40px!important}.mr-xl-6{margin-right:40px!important}.mb-xl-6{margin-bottom:40px!important}.ml-xl-6{margin-left:40px!important}.mt-xl-n6{margin-top:-40px!important}.mr-xl-n6{margin-right:-40px!important}.mb-xl-n6{margin-bottom:-40px!important}.ml-xl-n6{margin-left:-40px!important}.mx-xl-6{margin-right:40px!important;margin-left:40px!important}.my-xl-6{margin-top:40px!important;margin-bottom:40px!important}}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:4px!important}.pt-1{padding-top:4px!important}.pr-1{padding-right:4px!important}.pb-1{padding-bottom:4px!important}.pl-1{padding-left:4px!important}.px-1{padding-right:4px!important;padding-left:4px!important}.py-1{padding-top:4px!important;padding-bottom:4px!important}.p-2{padding:8px!important}.pt-2{padding-top:8px!important}.pr-2{padding-right:8px!important}.pb-2{padding-bottom:8px!important}.pl-2{padding-left:8px!important}.px-2{padding-right:8px!important;padding-left:8px!important}.py-2{padding-top:8px!important;padding-bottom:8px!important}.p-3{padding:16px!important}.pt-3{padding-top:16px!important}.pr-3{padding-right:16px!important}.pb-3{padding-bottom:16px!important}.pl-3{padding-left:16px!important}.px-3{padding-right:16px!important;padding-left:16px!important}.py-3{padding-top:16px!important;padding-bottom:16px!important}.p-4{padding:24px!important}.pt-4{padding-top:24px!important}.pr-4{padding-right:24px!important}.pb-4{padding-bottom:24px!important}.pl-4{padding-left:24px!important}.px-4{padding-right:24px!important;padding-left:24px!important}.py-4{padding-top:24px!important;padding-bottom:24px!important}.p-5{padding:32px!important}.pt-5{padding-top:32px!important}.pr-5{padding-right:32px!important}.pb-5{padding-bottom:32px!important}.pl-5{padding-left:32px!important}.px-5{padding-right:32px!important;padding-left:32px!important}.py-5{padding-top:32px!important;padding-bottom:32px!important}.p-6{padding:40px!important}.pt-6{padding-top:40px!important}.pr-6{padding-right:40px!important}.pb-6{padding-bottom:40px!important}.pl-6{padding-left:40px!important}.px-6{padding-right:40px!important;padding-left:40px!important}.py-6{padding-top:40px!important;padding-bottom:40px!important}@media (min-width: 544px){.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}}@media (min-width: 544px){.p-sm-1{padding:4px!important}.pt-sm-1{padding-top:4px!important}.pr-sm-1{padding-right:4px!important}.pb-sm-1{padding-bottom:4px!important}.pl-sm-1{padding-left:4px!important}.px-sm-1{padding-right:4px!important;padding-left:4px!important}.py-sm-1{padding-top:4px!important;padding-bottom:4px!important}}@media (min-width: 544px){.p-sm-2{padding:8px!important}.pt-sm-2{padding-top:8px!important}.pr-sm-2{padding-right:8px!important}.pb-sm-2{padding-bottom:8px!important}.pl-sm-2{padding-left:8px!important}.px-sm-2{padding-right:8px!important;padding-left:8px!important}.py-sm-2{padding-top:8px!important;padding-bottom:8px!important}}@media (min-width: 544px){.p-sm-3{padding:16px!important}.pt-sm-3{padding-top:16px!important}.pr-sm-3{padding-right:16px!important}.pb-sm-3{padding-bottom:16px!important}.pl-sm-3{padding-left:16px!important}.px-sm-3{padding-right:16px!important;padding-left:16px!important}.py-sm-3{padding-top:16px!important;padding-bottom:16px!important}}@media (min-width: 544px){.p-sm-4{padding:24px!important}.pt-sm-4{padding-top:24px!important}.pr-sm-4{padding-right:24px!important}.pb-sm-4{padding-bottom:24px!important}.pl-sm-4{padding-left:24px!important}.px-sm-4{padding-right:24px!important;padding-left:24px!important}.py-sm-4{padding-top:24px!important;padding-bottom:24px!important}}@media (min-width: 544px){.p-sm-5{padding:32px!important}.pt-sm-5{padding-top:32px!important}.pr-sm-5{padding-right:32px!important}.pb-sm-5{padding-bottom:32px!important}.pl-sm-5{padding-left:32px!important}.px-sm-5{padding-right:32px!important;padding-left:32px!important}.py-sm-5{padding-top:32px!important;padding-bottom:32px!important}}@media (min-width: 544px){.p-sm-6{padding:40px!important}.pt-sm-6{padding-top:40px!important}.pr-sm-6{padding-right:40px!important}.pb-sm-6{padding-bottom:40px!important}.pl-sm-6{padding-left:40px!important}.px-sm-6{padding-right:40px!important;padding-left:40px!important}.py-sm-6{padding-top:40px!important;padding-bottom:40px!important}}@media (min-width: 768px){.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}}@media (min-width: 768px){.p-md-1{padding:4px!important}.pt-md-1{padding-top:4px!important}.pr-md-1{padding-right:4px!important}.pb-md-1{padding-bottom:4px!important}.pl-md-1{padding-left:4px!important}.px-md-1{padding-right:4px!important;padding-left:4px!important}.py-md-1{padding-top:4px!important;padding-bottom:4px!important}}@media (min-width: 768px){.p-md-2{padding:8px!important}.pt-md-2{padding-top:8px!important}.pr-md-2{padding-right:8px!important}.pb-md-2{padding-bottom:8px!important}.pl-md-2{padding-left:8px!important}.px-md-2{padding-right:8px!important;padding-left:8px!important}.py-md-2{padding-top:8px!important;padding-bottom:8px!important}}@media (min-width: 768px){.p-md-3{padding:16px!important}.pt-md-3{padding-top:16px!important}.pr-md-3{padding-right:16px!important}.pb-md-3{padding-bottom:16px!important}.pl-md-3{padding-left:16px!important}.px-md-3{padding-right:16px!important;padding-left:16px!important}.py-md-3{padding-top:16px!important;padding-bottom:16px!important}}@media (min-width: 768px){.p-md-4{padding:24px!important}.pt-md-4{padding-top:24px!important}.pr-md-4{padding-right:24px!important}.pb-md-4{padding-bottom:24px!important}.pl-md-4{padding-left:24px!important}.px-md-4{padding-right:24px!important;padding-left:24px!important}.py-md-4{padding-top:24px!important;padding-bottom:24px!important}}@media (min-width: 768px){.p-md-5{padding:32px!important}.pt-md-5{padding-top:32px!important}.pr-md-5{padding-right:32px!important}.pb-md-5{padding-bottom:32px!important}.pl-md-5{padding-left:32px!important}.px-md-5{padding-right:32px!important;padding-left:32px!important}.py-md-5{padding-top:32px!important;padding-bottom:32px!important}}@media (min-width: 768px){.p-md-6{padding:40px!important}.pt-md-6{padding-top:40px!important}.pr-md-6{padding-right:40px!important}.pb-md-6{padding-bottom:40px!important}.pl-md-6{padding-left:40px!important}.px-md-6{padding-right:40px!important;padding-left:40px!important}.py-md-6{padding-top:40px!important;padding-bottom:40px!important}}@media (min-width: 1012px){.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}}@media (min-width: 1012px){.p-lg-1{padding:4px!important}.pt-lg-1{padding-top:4px!important}.pr-lg-1{padding-right:4px!important}.pb-lg-1{padding-bottom:4px!important}.pl-lg-1{padding-left:4px!important}.px-lg-1{padding-right:4px!important;padding-left:4px!important}.py-lg-1{padding-top:4px!important;padding-bottom:4px!important}}@media (min-width: 1012px){.p-lg-2{padding:8px!important}.pt-lg-2{padding-top:8px!important}.pr-lg-2{padding-right:8px!important}.pb-lg-2{padding-bottom:8px!important}.pl-lg-2{padding-left:8px!important}.px-lg-2{padding-right:8px!important;padding-left:8px!important}.py-lg-2{padding-top:8px!important;padding-bottom:8px!important}}@media (min-width: 1012px){.p-lg-3{padding:16px!important}.pt-lg-3{padding-top:16px!important}.pr-lg-3{padding-right:16px!important}.pb-lg-3{padding-bottom:16px!important}.pl-lg-3{padding-left:16px!important}.px-lg-3{padding-right:16px!important;padding-left:16px!important}.py-lg-3{padding-top:16px!important;padding-bottom:16px!important}}@media (min-width: 1012px){.p-lg-4{padding:24px!important}.pt-lg-4{padding-top:24px!important}.pr-lg-4{padding-right:24px!important}.pb-lg-4{padding-bottom:24px!important}.pl-lg-4{padding-left:24px!important}.px-lg-4{padding-right:24px!important;padding-left:24px!important}.py-lg-4{padding-top:24px!important;padding-bottom:24px!important}}@media (min-width: 1012px){.p-lg-5{padding:32px!important}.pt-lg-5{padding-top:32px!important}.pr-lg-5{padding-right:32px!important}.pb-lg-5{padding-bottom:32px!important}.pl-lg-5{padding-left:32px!important}.px-lg-5{padding-right:32px!important;padding-left:32px!important}.py-lg-5{padding-top:32px!important;padding-bottom:32px!important}}@media (min-width: 1012px){.p-lg-6{padding:40px!important}.pt-lg-6{padding-top:40px!important}.pr-lg-6{padding-right:40px!important}.pb-lg-6{padding-bottom:40px!important}.pl-lg-6{padding-left:40px!important}.px-lg-6{padding-right:40px!important;padding-left:40px!important}.py-lg-6{padding-top:40px!important;padding-bottom:40px!important}}@media (min-width: 1280px){.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}}@media (min-width: 1280px){.p-xl-1{padding:4px!important}.pt-xl-1{padding-top:4px!important}.pr-xl-1{padding-right:4px!important}.pb-xl-1{padding-bottom:4px!important}.pl-xl-1{padding-left:4px!important}.px-xl-1{padding-right:4px!important;padding-left:4px!important}.py-xl-1{padding-top:4px!important;padding-bottom:4px!important}}@media (min-width: 1280px){.p-xl-2{padding:8px!important}.pt-xl-2{padding-top:8px!important}.pr-xl-2{padding-right:8px!important}.pb-xl-2{padding-bottom:8px!important}.pl-xl-2{padding-left:8px!important}.px-xl-2{padding-right:8px!important;padding-left:8px!important}.py-xl-2{padding-top:8px!important;padding-bottom:8px!important}}@media (min-width: 1280px){.p-xl-3{padding:16px!important}.pt-xl-3{padding-top:16px!important}.pr-xl-3{padding-right:16px!important}.pb-xl-3{padding-bottom:16px!important}.pl-xl-3{padding-left:16px!important}.px-xl-3{padding-right:16px!important;padding-left:16px!important}.py-xl-3{padding-top:16px!important;padding-bottom:16px!important}}@media (min-width: 1280px){.p-xl-4{padding:24px!important}.pt-xl-4{padding-top:24px!important}.pr-xl-4{padding-right:24px!important}.pb-xl-4{padding-bottom:24px!important}.pl-xl-4{padding-left:24px!important}.px-xl-4{padding-right:24px!important;padding-left:24px!important}.py-xl-4{padding-top:24px!important;padding-bottom:24px!important}}@media (min-width: 1280px){.p-xl-5{padding:32px!important}.pt-xl-5{padding-top:32px!important}.pr-xl-5{padding-right:32px!important}.pb-xl-5{padding-bottom:32px!important}.pl-xl-5{padding-left:32px!important}.px-xl-5{padding-right:32px!important;padding-left:32px!important}.py-xl-5{padding-top:32px!important;padding-bottom:32px!important}}@media (min-width: 1280px){.p-xl-6{padding:40px!important}.pt-xl-6{padding-top:40px!important}.pr-xl-6{padding-right:40px!important}.pb-xl-6{padding-bottom:40px!important}.pl-xl-6{padding-left:40px!important}.px-xl-6{padding-right:40px!important;padding-left:40px!important}.py-xl-6{padding-top:40px!important;padding-bottom:40px!important}}.p-responsive{padding-right:16px!important;padding-left:16px!important}@media (min-width: 544px){.p-responsive{padding-right:40px!important;padding-left:40px!important}}@media (min-width: 1012px){.p-responsive{padding-right:16px!important;padding-left:16px!important}}.h1{font-size:26px!important}@media (min-width: 768px){.h1{font-size:32px!important}}.h2{font-size:22px!important}@media (min-width: 768px){.h2{font-size:24px!important}}.h3{font-size:18px!important}@media (min-width: 768px){.h3{font-size:20px!important}}.h4{font-size:16px!important}.h5{font-size:14px!important}.h6{font-size:12px!important}.h1, .h2, .h3, .h4, .h5, .h6{font-weight:600!important}.f1{font-size:26px!important}@media (min-width: 768px){.f1{font-size:32px!important}}.f2{font-size:22px!important}@media (min-width: 768px){.f2{font-size:24px!important}}.f3{font-size:18px!important}@media (min-width: 768px){.f3{font-size:20px!important}}.f4{font-size:16px!important}@media (min-width: 768px){.f4{font-size:16px!important}}.f5{font-size:14px!important}.f6{font-size:12px!important}.f00-light{font-size:40px!important;font-weight:300!important}@media (min-width: 768px){.f00-light{font-size:48px!important}}.f0-light{font-size:32px!important;font-weight:300!important}@media (min-width: 768px){.f0-light{font-size:40px!important}}.f1-light{font-size:26px!important;font-weight:300!important}@media (min-width: 768px){.f1-light{font-size:32px!important}}.f2-light{font-size:22px!important;font-weight:300!important}@media (min-width: 768px){.f2-light{font-size:24px!important}}.f3-light{font-size:18px!important;font-weight:300!important}@media (min-width: 768px){.f3-light{font-size:20px!important}}.text-small{font-size:12px!important}.lead{margin-bottom:30px;font-size:20px;font-weight:300;color:#586069}.lh-condensed-ultra{line-height:1!important}.lh-condensed{line-height:1.25!important}.lh-default{line-height:1.5!important}.lh-0{line-height:0!important}.text-right{text-align:right!important}.text-left{text-align:left!important}.text-center{text-align:center!important}@media (min-width: 544px){.text-sm-right{text-align:right!important}.text-sm-left{text-align:left!important}.text-sm-center{text-align:center!important}}@media (min-width: 768px){.text-md-right{text-align:right!important}.text-md-left{text-align:left!important}.text-md-center{text-align:center!important}}@media (min-width: 1012px){.text-lg-right{text-align:right!important}.text-lg-left{text-align:left!important}.text-lg-center{text-align:center!important}}@media (min-width: 1280px){.text-xl-right{text-align:right!important}.text-xl-left{text-align:left!important}.text-xl-center{text-align:center!important}}.text-normal{font-weight:400!important}.text-bold{font-weight:600!important}.text-italic{font-style:italic!important}.text-uppercase{text-transform:uppercase!important}.text-underline{text-decoration:underline!important}.no-underline{text-decoration:none!important}.no-wrap{white-space:nowrap!important}.ws-normal{white-space:normal!important}.wb-break-all{word-break:break-all!important}.text-emphasized{font-weight:600;color:#24292e}.list-style-none{list-style:none!important}.text-shadow-dark{text-shadow:0 1px 1px rgba(27,31,35,0.25),0 1px 25px rgba(27,31,35,0.75)}.text-shadow-light{text-shadow:0 1px 0 hsla(0,0%,100%,0.5)}.text-mono{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.v-hidden{visibility:hidden!important}.v-visible{visibility:visible!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.table-fixed{table-layout:fixed!important}.d-block{display:block!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}@media (min-width: 544px){.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-block{display:block!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}}@media (min-width: 768px){.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-block{display:block!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}}@media (min-width: 1012px){.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-block{display:block!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}}@media (min-width: 1280px){.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-block{display:block!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}}@media (max-width: 544px){.hide-sm{display:none!important}}@media (min-width: 544px) and (max-width: 768px){.hide-md{display:none!important}}@media (min-width: 768px) and (max-width: 1012px){.hide-lg{display:none!important}}@media (min-width: 1012px){.hide-xl{display:none!important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);word-wrap:normal;border:0}.show-on-focus{position:absolute;width:1px;height:1px;margin:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}.show-on-focus:focus{z-index:20;width:auto;height:auto;clip:auto} +/*# sourceMappingURL=frameworks-df973073d880f28fbbae0263fb1ef62b.css.map */ + /*! + * Primer-product + * http://primer.github.io + * + * Released under MIT license. Copyright (c) 2018 GitHub Inc. + */.flash{position:relative;padding:16px;color:#032f62;background-color:#dbedff;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.flash p:last-child{margin-bottom:0}.flash-messages{margin-bottom:24px}.flash-close{float:right;padding:16px;margin:-16px;color:inherit;text-align:center;cursor:pointer;background:none;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0.6}.flash-close:hover{opacity:1}.flash-action{float:right;margin-top:-3px;margin-left:24px}.flash-warn{color:#735c0f;background-color:#fffbdd;border-color:rgba(27,31,35,0.15)}.flash-error{color:#86181d;background-color:#ffdce0;border-color:rgba(27,31,35,0.15)}.flash-success{color:#165c26;background-color:#dcffe4;border-color:rgba(27,31,35,0.15)}.flash-full{margin-top:-1px;border-width:1px 0;border-radius:0}.warning{padding:0.5em;margin-bottom:0.8em;font-weight:600;background-color:#fffbdd}.avatar{display:inline-block;overflow:hidden;line-height:1;vertical-align:middle;border-radius:3px}.avatar-small{border-radius:2px}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-parent-child{position:relative}.avatar-child{position:absolute;right:-15%;bottom:-9%;background-color:#fff;border-radius:2px;box-shadow:-2px -2px 0 hsla(0,0%,100%,0.8)}.avatar-stack{display:inline-block;white-space:nowrap}.avatar-stack .avatar{position:relative;z-index:2;display:inline-block;width:20px;height:20px;box-sizing:content-box;margin-right:-15px;background-color:#fff;border-right:1px solid #fff;border-radius:2px;transition:margin 0.1s ease-in-out}.avatar-stack .avatar:only-child{background-color:transparent}.avatar-stack .avatar:first-child{z-index:3}.avatar-stack .avatar:last-child{z-index:1;margin-right:0;border-right:0}.avatar-stack:hover .avatar{margin-right:3px}.avatar-stack:hover .avatar:last-child{margin-right:0}.AvatarStack{position:relative;min-width:26px;height:20px}.AvatarStack .AvatarStack-body{position:absolute}.AvatarStack.AvatarStack--two{min-width:36px}.AvatarStack.AvatarStack--three-plus{min-width:46px}.AvatarStack-body{display:flex;background:#fff}.AvatarStack-body .avatar{position:relative;z-index:2;display:flex;width:20px;height:20px;box-sizing:content-box;margin-right:-11px;background-color:#fff;border-right:1px solid #fff;border-radius:2px;transition:margin 0.1s ease-in-out}.AvatarStack-body .avatar:first-child{z-index:3}.AvatarStack-body .avatar:last-child{z-index:1;border-right:0}.AvatarStack-body .avatar img{border-radius:2px}.AvatarStack-body .avatar:nth-child(n+4){display:none;opacity:0}.AvatarStack-body:hover .avatar{margin-right:3px}.AvatarStack-body:hover .avatar:nth-child(n+4){display:flex;opacity:1}.AvatarStack-body:hover .avatar-more{display:none!important}.avatar.avatar-more{z-index:1;margin-right:0;background:#f6f8fa}.avatar.avatar-more::before, .avatar.avatar-more::after{position:absolute;display:block;height:20px;content:"";border-radius:2px;outline:1px solid #fff}.avatar.avatar-more::before{width:17px;background:#e1e4e8}.avatar.avatar-more::after{width:14px;background:#d1d5da}.AvatarStack--right .AvatarStack-body{right:0;flex-direction:row-reverse}.AvatarStack--right .AvatarStack-body:hover .avatar{margin-right:0;margin-left:3px}.AvatarStack--right .avatar.avatar-more{background:#d1d5da}.AvatarStack--right .avatar.avatar-more::before{width:5px}.AvatarStack--right .avatar.avatar-more::after{width:2px;background:#f6f8fa}.AvatarStack--right .avatar{margin-right:0;margin-left:-11px;border-right:0;border-left:1px solid #fff}.CircleBadge{display:flex;align-items:center;justify-content:center;background-color:#fff;border-radius:50%;box-shadow:0 1px 5px rgba(27,31,35,0.15)}.CircleBadge-icon{max-width:60%!important;height:auto!important;max-height:55%!important}.CircleBadge--small{width:56px;height:56px}.CircleBadge--medium{width:96px;height:96px}.CircleBadge--large{width:128px;height:128px}.DashedConnection{position:relative}.DashedConnection::before{position:absolute;top:50%;left:0;width:100%;content:"";border-bottom:2px dashed #e1e4e8}.DashedConnection .CircleBadge{position:relative}.blankslate{position:relative;padding:32px;text-align:center;background-color:#fafbfc;border:1px solid #e1e4e8;border-radius:3px;box-shadow:inset 0 0 10px rgba(27,31,35,0.05)}.blankslate code{padding:2px 5px 3px;font-size:14px;background:#fff;border:1px solid #eaecef;border-radius:3px}.blankslate-icon{margin-right:4px;margin-bottom:8px;margin-left:4px;color:#a3aab1}.blankslate-capped{border-radius:0 0 3px 3px}.blankslate-spacious{padding:80px 40px}.blankslate-narrow{width:485px;margin:0 auto}.blankslate-large h3{margin:16px 0;font-size:20px}.blankslate-large p{font-size:16px}.blankslate-clean-background{background:none;border:0;box-shadow:none}.branch-name{display:inline-block;padding:2px 6px;font:12px "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(27,31,35,0.6);background-color:#eaf5ff;border-radius:3px}.branch-name .octicon{margin:1px -2px 0 0;color:#a8bbd0}a.branch-name{color:#0366d6}.labels{position:relative}.label, +.Label{display:inline-block;padding:3px 4px;font-size:12px;font-weight:600;line-height:1;color:#fff;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(27,31,35,0.12)}.label:hover, +.Label:hover{text-decoration:none}.Label--gray{color:#586069;background-color:#eaecef}.Label--outline{margin-top:-1px;margin-bottom:-1px;font-weight:400;color:#586069;background-color:transparent;border:1px solid rgba(27,31,35,0.15);box-shadow:none}.Label--outline-green{color:#28a745;border:1px solid #34d058}.Label--gray-darker{background-color:#6a737d}.Label--orange{background-color:#d15704}.state, +.State{display:inline-block;padding:4px 8px;font-weight:600;line-height:20px;color:#fff;text-align:center;background-color:#6a737d;border-radius:3px}.State--green{background-color:#2cbe4e}.State--purple{background-color:#6f42c1}.State--red{background-color:#cb2431}.State--small{padding:0.125em 4px;font-size:12px}.State--small .octicon{width:1em}.Counter{display:inline-block;padding:2px 5px;font-size:12px;font-weight:600;line-height:1;color:#586069;background-color:rgba(27,31,35,0.08);border-radius:20px}.Counter--gray-light{color:#24292e;background-color:rgba(27,31,35,0.15)}.Counter--gray{color:#fff;background-color:#6a737d}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body > *:first-child{margin-top:0!important}.markdown-body > *:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cb2431}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre{margin-top:0;margin-bottom:16px}.markdown-body hr{height:0.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:0.25em solid #dfe2e5}.markdown-body blockquote > :first-child{margin-top:0}.markdown-body blockquote > :last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt, +.markdown-body h1 code, +.markdown-body h2 tt, +.markdown-body h2 code, +.markdown-body h3 tt, +.markdown-body h3 code, +.markdown-body h4 tt, +.markdown-body h4 code, +.markdown-body h5 tt, +.markdown-body h5 code, +.markdown-body h6 tt, +.markdown-body h6 code{font-size:inherit}.markdown-body h1{padding-bottom:0.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:0.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:0.875em}.markdown-body h6{font-size:0.85em;color:#6a737d}.markdown-body ul, +.markdown-body ol{padding-left:2em}.markdown-body ul.no-list, +.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li{word-wrap:break-all}.markdown-body li > p{margin-top:16px}.markdown-body li + li{margin-top:0.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table th, +.markdown-body table td{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame > span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #dfe2e5}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292e}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center > span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right > span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right > span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code, +.markdown-body tt{padding:0.2em 0.4em;margin:0;font-size:85%;background-color:rgba(27,31,35,0.05);border-radius:3px}.markdown-body code br, +.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre > code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre, +.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code, +.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td, +.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}.Popover{position:absolute;z-index:100}.Popover-message{position:relative;width:232px;margin-right:auto;margin-left:auto}.Popover-message::before, .Popover-message::after{position:absolute;left:50%;display:inline-block;content:""}.Popover-message::before{top:-16px;margin-left:-9px;border:8px solid transparent;border-bottom-color:rgba(27,31,35,0.15)}.Popover-message::after{top:-14px;margin-left:-8px;border:7px solid transparent;border-bottom-color:#fff}.Popover-message--bottom::before, .Popover-message--bottom::after, +.Popover-message--bottom-right::before, +.Popover-message--bottom-right::after, +.Popover-message--bottom-left::before, +.Popover-message--bottom-left::after{top:auto;border-bottom-color:transparent}.Popover-message--bottom::before, +.Popover-message--bottom-right::before, +.Popover-message--bottom-left::before{bottom:-16px;border-top-color:rgba(27,31,35,0.15)}.Popover-message--bottom::after, +.Popover-message--bottom-right::after, +.Popover-message--bottom-left::after{bottom:-14px;border-top-color:#fff}.Popover-message--top-right, +.Popover-message--bottom-right{right:-9px;margin-right:0}.Popover-message--top-right::before, .Popover-message--top-right::after, +.Popover-message--bottom-right::before, +.Popover-message--bottom-right::after{left:auto;margin-left:0}.Popover-message--top-right::before, +.Popover-message--bottom-right::before{right:20px}.Popover-message--top-right::after, +.Popover-message--bottom-right::after{right:21px}.Popover-message--top-left, +.Popover-message--bottom-left{left:-9px;margin-left:0}.Popover-message--top-left::before, .Popover-message--top-left::after, +.Popover-message--bottom-left::before, +.Popover-message--bottom-left::after{left:24px;margin-left:0}.Popover-message--top-left::after, +.Popover-message--bottom-left::after{left:25px}.Popover-message--right::before, .Popover-message--right::after, +.Popover-message--right-top::before, +.Popover-message--right-top::after, +.Popover-message--right-bottom::before, +.Popover-message--right-bottom::after, +.Popover-message--left::before, +.Popover-message--left::after, +.Popover-message--left-top::before, +.Popover-message--left-top::after, +.Popover-message--left-bottom::before, +.Popover-message--left-bottom::after{top:50%;left:auto;margin-left:0;border-bottom-color:transparent}.Popover-message--right::before, +.Popover-message--right-top::before, +.Popover-message--right-bottom::before, +.Popover-message--left::before, +.Popover-message--left-top::before, +.Popover-message--left-bottom::before{margin-top:-9px}.Popover-message--right::after, +.Popover-message--right-top::after, +.Popover-message--right-bottom::after, +.Popover-message--left::after, +.Popover-message--left-top::after, +.Popover-message--left-bottom::after{margin-top:-8px}.Popover-message--right::before, +.Popover-message--right-top::before, +.Popover-message--right-bottom::before{right:-16px;border-left-color:rgba(27,31,35,0.15)}.Popover-message--right::after, +.Popover-message--right-top::after, +.Popover-message--right-bottom::after{right:-14px;border-left-color:#fff}.Popover-message--left::before, +.Popover-message--left-top::before, +.Popover-message--left-bottom::before{left:-16px;border-right-color:rgba(27,31,35,0.15)}.Popover-message--left::after, +.Popover-message--left-top::after, +.Popover-message--left-bottom::after{left:-14px;border-right-color:#fff}.Popover-message--right-top::before, .Popover-message--right-top::after, +.Popover-message--left-top::before, +.Popover-message--left-top::after{top:24px}.Popover-message--right-bottom::before, .Popover-message--right-bottom::after, +.Popover-message--left-bottom::before, +.Popover-message--left-bottom::after{top:auto}.Popover-message--right-bottom::before, +.Popover-message--left-bottom::before{bottom:16px}.Popover-message--right-bottom::after, +.Popover-message--left-bottom::after{bottom:17px}@media (min-width: 544px){.Popover-message--large{min-width:320px}}.Subhead{display:flex;padding-bottom:8px;margin-bottom:16px;border-bottom:1px #e1e4e8 solid;flex-flow:row wrap}.Subhead--spacious{margin-top:40px}.Subhead-heading{font-size:24px;font-weight:normal;flex:1 1 auto}.Subhead-heading--danger{font-weight:600;color:#cb2431}.Subhead-description{font-size:14px;color:#586069;flex:1 100%}.Subhead-actions{align-self:center;justify-content:flex-end}.table-list{display:table;width:100%;color:#6a737d;table-layout:fixed;border-bottom:1px solid #e1e4e8}.table-list ol{list-style-type:decimal}.table-list-bordered{border-bottom-color:#eaecef}.table-list-bordered .table-list-cell:first-child{border-left:1px solid #eaecef}.table-list-bordered .table-list-cell:last-child{border-right:1px solid #eaecef}.table-list-item{position:relative;display:table-row;list-style:none}.table-list-item.unread .table-list-cell:first-child{box-shadow:2px 0 0 #0366d6 inset}.table-list-cell{position:relative;display:table-cell;padding:8px 10px;font-size:12px;vertical-align:top;border-top:1px solid #eaecef}.table-list-cell.flush-left{padding-left:0}.table-list-cell.flush-right{padding-right:0}.table-list-cell-checkbox{width:30px;padding-right:0;padding-left:0;text-align:center}.table-list-header{position:relative;margin-top:20px;background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:3px 3px 0 0}.table-list-header::before{display:table;content:""}.table-list-header::after{display:table;clear:both;content:""}.table-list-header .btn-link{position:relative;display:inline-block;padding-top:13px;padding-bottom:13px;font-weight:400}.table-list-heading{margin-left:10px}.table-list-header-select-all{float:left;width:30px;padding:12px 10px;margin-right:5px;margin-left:-1px;text-align:center}.table-list-header-meta{display:inline-block;padding-top:13px;padding-bottom:13px;color:#586069}.table-list-header-toggle h4{padding:12px 0}.table-list-filters:first-child .table-list-header-toggle:first-child{padding-left:16px}.table-list-header-toggle.states .selected{font-weight:600}.table-list-header-toggle .btn-link{color:#586069}.table-list-header-toggle .btn-link .octicon{margin-right:2px}.table-list-header-toggle .btn-link:hover{color:#24292e;text-decoration:none}.table-list-header-toggle .btn-link.selected, .table-list-header-toggle .btn-link.selected:hover{color:#24292e}.table-list-header-toggle .btn-link + .btn-link{margin-left:10px}.table-list-header-toggle .btn-link:disabled, .table-list-header-toggle .btn-link.disabled{pointer-events:none;opacity:0.5}.table-list-header-toggle .select-menu{position:relative}.table-list-header-toggle .select-menu-item[aria-checked="true"], +.table-list-header-toggle .select-menu-item.selected{font-weight:600}.table-list-header-toggle .select-menu-button{padding-right:15px;padding-left:15px}.table-list-header-toggle .select-menu-button:hover, .table-list-header-toggle .select-menu-button.selected, .table-list-header-toggle .select-menu-button.selected:hover{color:#24292e}.table-list-header-toggle .select-menu-modal-holder{right:10px}.table-list-header-toggle .select-menu-modal-holder .select-menu-modal{margin-top:-1px}.table-list-header-next{margin-top:20px;margin-bottom:-1px}.table-list-header-next .table-list-header-select-all{padding-left:14px}.table-list-header-next .select-all-dropdown{padding-top:10px;padding-bottom:10px}.bulk-actions-header{position:-webkit-sticky;position:sticky;top:0;z-index:32;height:50px}.table-list-triage{display:none}.triage-mode .table-list-filters{display:none}.triage-mode .table-list-triage{display:block}.ajax-pagination-form .ajax-pagination-btn{width:100%;padding:6px;margin-top:20px;font-weight:600;color:#0366d6;background:#fff;border:1px solid #e1e4e8;border-radius:3px}.ajax-pagination-form .ajax-pagination-btn:hover, .ajax-pagination-form .ajax-pagination-btn:focus{background-color:#f6f8fa}.ajax-pagination-form.loading .ajax-pagination-btn{text-indent:-3000px;background-color:#f6f8fa;background-image:url("/images/spinners/octocat-spinner-16px-EAF2F5.gif");background-repeat:no-repeat;background-position:center center;border-color:#d1d5da}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.ajax-pagination-form.loading .ajax-pagination-btn{background-image:url("/images/spinners/octocat-spinner-32-EAF2F5.gif");background-size:16px auto}}.autocomplete-results{position:absolute;z-index:99;width:100%;max-height:20em;overflow-y:auto;font-size:13px;list-style:none;background:#fff;border-radius:3px;box-shadow:0 0 5px rgba(27,31,35,0.3)}.autocomplete-item{display:block;padding:5px;overflow:hidden;font-weight:600;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.autocomplete-item:hover, .autocomplete-item[aria-selected="true"], .autocomplete-item.selected, .autocomplete-item.navigation-focus{color:#fff;text-decoration:none;background-color:#0366d6}.autocomplete-item:hover .organization-member, +.autocomplete-item:hover .ldap-group-dn, .autocomplete-item[aria-selected="true"] .organization-member, +.autocomplete-item[aria-selected="true"] .ldap-group-dn, .autocomplete-item.selected .organization-member, +.autocomplete-item.selected .ldap-group-dn, .autocomplete-item.navigation-focus .organization-member, +.autocomplete-item.navigation-focus .ldap-group-dn{color:#f6f8fa}.autocomplete-item .secondary-label{font-weight:400}.autocomplete-item .organization-member{float:right;padding-top:1px;color:#6a737d}.is-auto-complete-loading .form-control{padding-right:30px;background-image:url("/images/spinners/octocat-spinner-32.gif");background-size:16px}.suggester-container{position:absolute;top:0;left:0;z-index:30;transform:translateZ(0)}.suggester{position:relative;top:0;left:0;min-width:180px;margin-top:20px;cursor:pointer;background:#fff;border:1px solid #dfe2e5;border-radius:3px;box-shadow:0 0 5px rgba(27,31,35,0.1)}.suggester ul{padding:0;margin:0;list-style:none}.suggester li{display:block;padding:5px 10px;font-weight:600;border-bottom:1px solid #dfe2e5}.suggester li small{font-weight:400;color:#586069}.suggester li:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.suggester li:first-child a{border-top-left-radius:3px;border-top-right-radius:3px}.suggester li:hover, .suggester li[aria-selected="true"], .suggester li.navigation-focus{color:#fff;text-decoration:none;background:#0366d6}.suggester li:hover small, .suggester li[aria-selected="true"] small, .suggester li.navigation-focus small{color:#fff}.Box--overlay{width:448px;margin-right:auto;margin-left:auto;background-color:#fff;background-clip:padding-box;border-color:#444d56;box-shadow:0 0 18px rgba(0,0,0,0.4)}.Box--overlay .Box-header{margin:0;border-width:0;border-bottom-width:1px;border-top-left-radius:2px;border-top-right-radius:2px}.Box-overlay--narrow{width:320px}.Box-overlay--wide{width:640px}.Overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99;overflow-y:auto}.bg-transparent-dark{background-color:rgba(0,0,0,0.5)}.transition-in-out{transition:opacity 0.2s ease-in-out}.transition-in-out[hidden]{opacity:0}.Box-body.scrollable-overlay{max-height:400px;overflow-y:scroll}.Box-body .help{padding-top:8px;margin:0;color:#586069;text-align:center}.boxed-group{position:relative;margin-bottom:30px;border-radius:3px}.boxed-group .Counter{color:#fff;background-color:rgba(47,54,61,0.5)}.boxed-group.flush .boxed-group-inner{padding:0}.boxed-group.condensed .boxed-group-inner{padding:0;font-size:12px}.boxed-group > h3, +.boxed-group .heading{display:block;padding:9px 10px 10px;margin:0;font-size:14px;line-height:17px;background-color:#f6f8fa;border:1px solid rgba(27,31,35,0.15);border-bottom:0;border-radius:3px 3px 0 0}.boxed-group > h3 a, +.boxed-group .heading a{color:inherit}.boxed-group > h3 a.boxed-group-breadcrumb, +.boxed-group .heading a.boxed-group-breadcrumb{font-weight:400;color:#586069;text-decoration:none}.boxed-group > h3 .avatar, +.boxed-group .heading .avatar{margin-top:-4px}.boxed-group .tabnav.heading{padding:0}.boxed-group .tabnav.heading .tabnav-tab.selected{border-top:0}.boxed-group .tabnav.heading li:first-child .selected{border-left-color:#fff;border-top-left-radius:3px}.boxed-group .tabnav-tab{border-top:0;border-radius:0}.boxed-group code.heading{font-size:12px}.boxed-group.dangerzone > h3{color:#fff;background-color:#d73a49;border:1px solid #9e1c23}.boxed-group.dangerzone .boxed-group-inner{border-top:0}.boxed-group.condensed > h3{padding:6px 6px 7px;font-size:12px}.boxed-group.condensed > h3 .octicon{padding:0 6px 0 2px}.one-half .boxed-group, +.dashboard-sidebar .boxed-group{margin-bottom:20px}.boxed-group .bleed-flush{width:100%;padding:0 10px;margin-left:-10px}.boxed-group .compact{margin-top:10px;margin-bottom:10px}.boxed-group-inner{padding:10px;color:#586069;background:#fff;border:1px solid #d1d5da;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.boxed-group-inner .markdown-body{padding:20px 10px 10px;font-size:13px}.boxed-group-inner.markdown-body{padding-top:10px;padding-bottom:10px}.boxed-group-inner.seamless{padding:0}.boxed-group-inner .tabnav{padding-right:10px;padding-left:10px;margin-right:-10px;margin-left:-10px}.boxed-group-inner .tabnav-tab.selected{border-top:1px solid #dfe2e5}.boxed-group-inner .help{padding:1em 10px 1em 35px;margin:1em -10px -10px;clear:both;color:#586069;border-top:1px solid #dfe2e5}.boxed-group-inner .help .octicon{margin-right:5px;margin-left:-25px}.boxed-group-inner .boxed-group-list + .help{margin-top:0}.boxed-action{float:right;margin-left:10px}.boxed-group-action{position:relative;z-index:2;float:right;margin:5px 10px 0 0}.boxed-group-action.flush{margin-top:0;margin-right:0}.field-with-errors{display:inline}.compact-options{margin:-6px 0 13px}.compact-options > li{display:inline-block;margin:0 12px 0 0;font-weight:600;list-style-type:none}.compact-options > li label{float:left}.compact-options > li .spinner{display:block;float:left;width:16px;height:16px;margin-left:5px}.boxed-group-list{margin:0;list-style:none}.boxed-group-list:first-child > li:first-child{border-top:0}.boxed-group-list > li{display:block;padding:5px 10px;margin-right:-10px;margin-left:-10px;line-height:23px;border-bottom:1px solid #e1e4e8}.boxed-group-list > li:first-child{border-top:1px solid #dfe2e5}.boxed-group-list > li:last-of-type{border-bottom:0}.boxed-group-list > li.selected{background:#dcffe4}.boxed-group-list > li.approved .btn-sm, +.boxed-group-list > li.rejected .btn-sm{display:none}.boxed-group-list > li.rejected a{text-decoration:line-through}.boxed-group-list > li .avatar{margin-top:-2px;margin-right:4px}.boxed-group-list > li .octicon{width:24px;margin-right:4px}.boxed-group-list > li .btn-sm{float:right;margin:-1px 0 0 10px}.boxed-group-list > li .BtnGroup{float:right}.boxed-group-list > li .BtnGroup .btn-sm{float:left}.boxed-group.flush .boxed-group-list li{width:auto;padding-right:0;padding-left:0;margin-left:0}.boxed-group-list.standalone{margin-top:-1px}.boxed-group-list.standalone > li:first-child{border-top:0}.boxed-group-standalone{margin-top:-10px;margin-bottom:-10px}.boxed-group-standalone > li:last-child{border-radius:0 0 2px 2px}.boxed-group-table{width:100%;text-align:left}.boxed-group-table tr:last-child td{border-bottom:0}.boxed-group-table th{padding:9px;background-color:#fafbfc;border-bottom:1px solid #eaecef}.boxed-group-table td{padding:9px;vertical-align:top;border-bottom:1px solid #eaecef}.ajax-error-message{position:fixed;top:-200px;left:50%;z-index:9999;display:none;width:974px;margin:0 3px;margin-left:-487px;transition:top 0.5s ease-in-out}.ajax-error-message.visible{top:0;display:block}.ajax-error-message > .octicon-alert{vertical-align:text-top}.boxed-group-warning{padding:10px 15px;margin:-10px -10px 10px;color:rgba(27,31,35,0.85);background-color:#fffbdd;border-color:rgba(27,31,35,0.15);border-style:solid;border-width:1px 0}.boxed-group-warning .btn-sm{margin:-5px 0}.boxed-group-warning:first-child{border-top:0}.breadcrumb{margin-bottom:10px;font-size:18px;color:#586069}.breadcrumb .separator::before, .breadcrumb .separator::after{content:" "}.breadcrumb strong.final-path{color:#24292e}.breadcrumb .zeroclipboard-button{display:inline-block;margin-left:5px}.breadcrumb .repo-root{font-weight:600}.breadcrumb .octicon{vertical-align:-2px}.editor-license-template, +.editor-code-of-conduct-template, +.editor-flow-template, +.editor-gitignore-template{position:relative;top:3px;display:block;float:right;font-size:14px}.editor-license-template .select-menu-git-ignore, +.editor-code-of-conduct-template .select-menu-git-ignore, +.editor-flow-template .select-menu-git-ignore, +.editor-gitignore-template .select-menu-git-ignore{right:0}.starring-container .unstarred, +.starring-container.on .starred{display:block}.starring-container.on .unstarred, +.starring-container .starred{display:none}.starring-container.loading{opacity:0.5}.user-following-container .follow, +.user-following-container.on .unfollow{display:inline-block}.user-following-container.on .follow, +.user-following-container .unfollow{display:none}.user-following-container.loading{opacity:0.5}.members .user-following-container{float:right}.close-button{padding:0;background:transparent;border:0;outline:none}.btn-invisible{color:#0366d6;background-color:#fff;background-image:none;border:0}.btn-invisible:hover, .btn-invisible:active, .btn-invisible:focus, .btn-invisible.selected, .btn-invisible.zeroclipboard-is-hover, .btn-invisible.zeroclipboard-is-active{color:#0366d6;background:none;outline:none;box-shadow:none}.btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#586069;vertical-align:middle;background:transparent;border:0}.btn-octicon:hover{color:#0366d6}.btn-octicon.disabled{color:#959da5;cursor:default}.btn-octicon.disabled:hover{color:#959da5}.btn-octicon-danger:hover{color:#cb2431}.btn-states .btn-state-alternate{display:none}.btn-states:hover .btn-state-default{display:none}.btn-states:hover .btn-state-alternate{display:inline-block}.commit-ref{position:relative;display:inline-block;padding:0 5px;font:0.75em/2 "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;color:#274466;white-space:nowrap;background-color:#eff7ff;border-radius:3px}.commit-ref .user{color:#044289}a.commit-ref:hover{text-decoration:none;background-color:#dbedff}.capped-cards{list-style:none}.capped-cards .capped-card{float:left;width:450px}.capped-card{margin:10px;list-style:none;border:1px solid #dfe2e5;border-radius:2px}.capped-card::before{display:table;content:""}.capped-card::after{display:table;clear:both;content:""}.capped-card:nth-child(odd){margin-left:0}.capped-card:nth-child(even){margin-right:0}.capped-card h3{padding:10px;margin:0;line-height:100%;border-bottom:1px solid #eaecef}.capped-card > p{display:block;padding:0 10px 10px;margin:0;font-size:15px;line-height:100%;color:#586069;border-bottom:1px solid #eaecef}.capped-card-content{display:block;background:#f6f8fa}.capped-card-content::before{display:table;content:""}.capped-card-content::after{display:table;clear:both;content:""}.details-collapse .collapse{position:relative;display:none;height:0;overflow:hidden;transition:height 0.35s ease-in-out}.details-collapse.open .collapse{display:block;height:auto;overflow:visible}.comment .email-format{line-height:1.5}.previewable-edit .previewable-comment-form{display:none}.previewable-edit .previewable-comment-form::before{display:table;content:""}.previewable-edit .previewable-comment-form::after{display:table;clear:both;content:""}.previewable-edit .previewable-comment-form .tabnav-tabs{display:inline-block}.previewable-edit .previewable-comment-form .form-actions{float:right;margin-right:10px;margin-bottom:10px}.previewable-edit.is-comment-editing .timeline-comment-header{display:none}.is-comment-editing .previewable-comment-form{display:block}.is-comment-editing .timeline-comment-actions, +.is-comment-editing .edit-comment-hide{display:none}.is-comment-loading .previewable-comment-form{opacity:0.5}.is-comment-stale .comment-form-stale{display:block}.comment-body{width:100%;padding:15px;overflow:visible;font-size:14px}.comment-body .highlight{overflow:visible!important;background-color:transparent}.comment-form-textarea{width:100%;max-width:100%;height:100px;min-height:100px;margin:0;line-height:1.6}.comment-form-textarea.dragover{border:solid 1px #0366d6}.discussion-topic-header{position:relative;padding:10px;word-wrap:break-word}.comment-form-error, +.comment-form-stale{display:none;padding:15px 10px;margin:10px;color:#86181d;background-color:#ffdce0;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.comment-form-error.comment-form-bottom, +.comment-form-stale.comment-form-bottom{margin-bottom:10px}.email-format{line-height:1.5em!important}.email-format div{white-space:pre-wrap}.email-format .email-hidden-reply{display:none;white-space:pre-wrap}.email-format .email-hidden-reply.expanded{display:block}.email-format .email-quoted-reply, +.email-format .email-signature-reply{padding:0 15px;margin:15px 0;color:#586069;border-left:4px solid #dfe2e5}.email-format .email-hidden-toggle a{display:inline-block;height:12px;padding:0 9px;font-size:12px;font-weight:600;line-height:6px;color:#444d56;text-decoration:none;vertical-align:middle;background:#dfe2e5;border-radius:1px}.email-format .email-hidden-toggle a:hover{background-color:#c6cbd1}.email-format .email-hidden-toggle a:active{color:#fff;background-color:#0366d6}.comment-email-format div{white-space:normal}.comment-email-format .email-hidden-reply{display:none;white-space:normal}.comment-email-format .email-hidden-reply.expanded{display:block}.comment-email-format blockquote, +.comment-email-format p{margin:0}.blankslate.conversation-limited{padding:20px 0 10px;margin:15px}.locked-conversation .write-tab, +.locked-conversation .preview-tab{color:#c6cbd1}.related-issues-display-link{cursor:pointer}.commit-form{position:relative;padding:15px;border:1px solid #dfe2e5;border-radius:3px}.commit-form::after, .commit-form::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:" ";border-color:transparent;border-style:solid solid outset}.commit-form::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.commit-form::before{border-width:8px;border-right-color:#dfe2e5}.commit-form .input-block{margin-top:10px;margin-bottom:10px}.commit-form-avatar{float:left;margin-left:-64px;border-radius:3px}.commit-form-actions::before{display:table;content:""}.commit-form-actions::after{display:table;clear:both;content:""}.commit-form-actions .BtnGroup{margin-right:5px}.commit-form-actions .check-for-fork{line-height:34px}.merge-commit-message{resize:vertical}.commit-sha{padding:0.2em 0.4em;font-size:90%;font-weight:400;background-color:#f6f8fa;border:1px solid #eaecef;border-radius:0.2em}.commit-partial-notice{margin-top:20px;margin-bottom:20px}.commit-paginate-container{float:right;margin:-5px 0 0;text-align:inherit}.commit .commit-title, +.commit .commit-title a{color:#444d56}.commit .commit-title.blank, +.commit .commit-title.blank a{color:rgba(27,31,35,0.3)}.commit .commit-title .issue-link{font-weight:600;color:#0366d6}.commit .sha-block, +.commit .sha{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}.commit.open .commit-desc{display:block}.commit-link{font-weight:400;color:#0366d6}.commit-email-flash{display:inline}.commit-desc{display:none}.commit-desc pre{max-width:700px;margin-top:10px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:11px;line-height:1.45;color:#444d56;white-space:pre-wrap}.commit-desc + .commit-branches{padding-top:8px;margin-top:2px;border-top:solid 1px rgba(27,31,35,0.15)}.commit-author-section{color:#24292e}.commit-author-section span.user-mention{font-weight:400}.commit-tease{position:relative;padding:10px;margin-bottom:-1px;font-size:13px;line-height:20px;color:#586069;background-color:#f1f8ff;border:1px solid #c8e1ff;border-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.commit-tease .muted-link{color:inherit}.commit-tease .loader{float:left;margin:2px 5px 0 2px}.commit-tease .message{color:inherit}.commit-tease .avatar{margin-top:-1px}.commit-tease.open .commit-desc{display:block}.branch-infobar + .commit-tease{border-top-left-radius:0;border-top-right-radius:0}.commit-tease-comments{margin-right:15px}.commit-tease-sha{display:inline-block;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:90%;color:#444d56}.commit-tease-contributors{padding:5px 10px;margin:10px -10px -10px;background-color:#fff;border-top:1px solid #bedfff;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.commit-tease-contributors::before{display:table;content:""}.commit-tease-contributors::after{display:table;clear:both;content:""}.commit-tease-contributors .avatar-link{float:left;margin-right:3px}.commit-tease-contributors .loader-loading{margin:2px 5px 2px 0}.commit-tease-contributors.error .loader-loading{display:none}.commit-tease-contributors.error .loader-error{display:block}.commits-listing{position:relative;padding-bottom:20px;margin-bottom:15px}.commits-listing::before{position:absolute;top:0;bottom:0;left:14px;z-index:-1;display:block;width:2px;content:"";background-color:#eff1f3}.commits-listing .discussion-item-icon{margin-right:5px;margin-left:-1px}.commits-listing .timeline-commits{padding-left:8px;margin-bottom:20px}.commits-listing .timeline-commits:last-child{margin-bottom:0}.commits-listing-padded{padding-left:39px}.commit-group{margin-top:10px;list-style-type:none}.commit-group-title{margin-top:15px;margin-left:-31px;color:#586069}.commit-group-title .octicon-git-commit{margin-right:17px;color:#c6cbd1;background:#fff}.commits-list-item[aria-selected="true"], .commits-list-item.navigation-focus{background:#f6fbff}.commits-list-item .commit-title{margin:0;font-size:15px;font-weight:600;color:#24292e}.commits-list-item .commit-meta{margin-top:1px;font-weight:400;color:#586069}.commits-list-item .status .octicon{height:14px;line-height:14px}.commits-list-item .commit-author{color:#586069}.commits-list-item .octicon-arrow-right{margin:0 3px}.commits-list-item .btn-outline{margin-top:2px}.commits-list-item .commit-desc pre{margin-top:5px;margin-bottom:10px;color:#586069}.commits-list-item .commit-desc pre a{word-break:break-word}.commits-list-item em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,247,140,0.5);border-radius:3px}.commit-indicator{margin-left:4px}.commit-links-cell{width:335px;text-align:right}.commit-links-group{margin-right:5px}.commits-list-item + .commits-list-item{border-top:1px solid #e1e4e8}.timeline-commits{width:100%;margin-top:5px;border-collapse:separate}.timeline-commits + .timeline-commits{margin-top:15px}.timeline-commits td{padding-top:4px;padding-right:8px;padding-bottom:4px;font-size:12px;line-height:16px;vertical-align:top;background-color:transparent}.discussion-item .timeline-commits .commit-author{display:none}.timeline-commits .author{font-weight:600;color:#444d56}.timeline-commits .commit-message{max-width:550px;min-height:0;flex-grow:2;white-space:normal}.timeline-commits .commit-message > code a{color:#444d56}.timeline-commits .commit-message > code a:hover{color:#0366d6}.timeline-commits .commit-desc pre{overflow:visible;color:#586069}.timeline-commits .hidden-text-expander .ellipsis-expander{height:13px;background-color:#eaecef}.timeline-commits .hidden-text-expander .ellipsis-expander:hover{color:#fff;background-color:#0366d6}.timeline-commits .commit-sig-status{width:60px;margin-left:auto}.timeline-commits .commit-ci-status{width:16px}.timeline-commits .commit-ci-status .octicon-primitive-dot{width:9px;margin-right:3px;margin-left:2px}.timeline-commits .commit-meta{width:50px}.commit-icon{color:#d1d5da}.commit-icon .octicon{background-color:#fff}.commit-id{color:#959da5}.commit-id:hover{color:#0366d6}.full-commit{padding:8px 8px 0;margin:10px 0;font-size:14px;background:#eaf5ff;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.full-commit:first-child{margin-top:0}.full-commit .btn-outline, .full-commit .btn-outline:disabled{background-color:transparent;border-color:rgba(27,31,35,0.15)}.full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.full-commit p.commit-title{margin:0 0 8px;font-size:18px;font-weight:600;color:#05264c}.full-commit .branches-list{display:inline;margin-right:10px;margin-left:2px;vertical-align:middle;list-style:none}.full-commit .branches-list li{display:inline-block;padding-left:3px;font-weight:600;color:#444d56}.full-commit .branches-list li::before{padding-right:6px;font-weight:400;content:"+"}.full-commit .branches-list li:first-child{padding-left:0}.full-commit .branches-list li:first-child::before{padding-right:0;content:""}.full-commit .branches-list li.loading{font-weight:400;color:#6a737d}.full-commit .branches-list li.pull-request{font-weight:400;color:#6a737d}.full-commit .branches-list li.pull-request::before{margin-left:-8px;content:""}.full-commit .branches-list li.pull-request-error{margin-bottom:-1px}.full-commit .branches-list li a{color:inherit}.full-commit .commit-meta{padding:8px;margin-right:-8px;margin-left:-8px;background:#fff;border-top:1px solid rgba(27,31,35,0.15);border-bottom-right-radius:3px;border-bottom-left-radius:3px}.full-commit .sha-block{margin-left:16px;font-size:12px;line-height:24px;color:#586069}.full-commit .sha-block > .sha{color:#444d56}.full-commit .sha-block > a{color:#444d56;text-decoration:none;border-bottom:1px dotted #c6cbd1}.full-commit .sha-block > a:hover{border-bottom:1px solid #444d56}.full-commit .commit-desc{display:block;margin:-5px 0 10px}.full-commit .commit-desc pre{max-width:100%;overflow:visible;font-size:13px;word-wrap:break-word}.branches-tag-list{display:inline;margin-right:10px;margin-left:2px;vertical-align:middle;list-style:none}.branches-tag-list .more-commit-details, +.branches-tag-list.open .hidden-text-expander{display:none}.branches-tag-list.open .more-commit-details{display:inline-block}.branches-tag-list li{display:inline-block;padding-left:3px}.branches-tag-list li:first-child{padding-left:0;font-weight:600;color:#444d56}.branches-tag-list li.loading{font-weight:400;color:#6a737d}.branches-tag-list li.abbrev-tags{cursor:pointer}.branches-tag-list li a, +.branches-tag-list li .ellipsis-expander{color:inherit}.branches-tag-list li .ellipsis-expander{background-color:#d3e2f4}.branches-tag-list li .ellipsis-expander:hover{background-color:#d6e2f1}.commit-branches{min-height:18px;margin-top:-6px;margin-bottom:8px;font-size:12px;color:#6a737d;vertical-align:middle}.commit-branches .octicon{vertical-align:middle}.commit-loader .loader-error{display:none;margin:0;font-size:12px;font-weight:600;color:#cb2431}.commit-loader.is-error .loader-loading{display:none}.commit-loader.is-error .loader-error{display:block}.commit-comments-heading{max-width:780px;margin-bottom:15px}.commit-comment-count{display:inline-block;margin-right:15px;margin-bottom:0}.commit-build-statuses{position:relative;display:inline-block;text-align:left}.commit-build-statuses .octicon-primitive-dot{width:10px}.commit-build-statuses.active .dropdown-menu-content{display:block}.commit-build-statuses.active .tooltipped::before, +.commit-build-statuses.active .tooltipped::after{display:none}.commit-build-statuses .dropdown-menu{min-width:400px;max-width:500px;padding-top:0;padding-bottom:0}.commit-build-statuses .dropdown-menu .merge-status-list{max-height:170px;border-bottom:0}.commit-build-statuses .dropdown-menu-w, +.commit-build-statuses .dropdown-menu-e{top:-11px}.commit-build-statuses .merge-status-item:last-child{border-radius:0 0 2px 2px}.dropdown-signed-commit .dropdown-menu{width:260px;margin-top:8px;font-size:13px;line-height:1.4}.dropdown-signed-commit .dropdown-menu::after{border-bottom-color:#f6f8fa}.dropdown-signed-commit .dropdown-menu-w{top:-28px;margin-top:0}.dropdown-signed-commit .dropdown-menu-w::after{border-bottom-color:transparent;border-left-color:#f6f8fa}.signed-commit-header{padding:12px;line-height:1.3;white-space:normal;border-collapse:separate;background-color:#f6f8fa;border-bottom:solid 1px #e1e4e8;border-top-left-radius:3px;border-top-right-radius:3px}.signed-commit-header .octicon-verified{color:#28a745}.signed-commit-header .octicon-unverified{color:#959da5}.signed-commit-signer{padding-right:12px;padding-left:12px;margin-top:12px;border-collapse:separate}.signed-commit-footer{padding:12px;font-size:12px;line-height:1.5}.signed-commit-cert-info{margin-bottom:6px}.signed-commit-cert-info td{vertical-align:top}.signed-commit-cert-info td:first-child{width:44px;padding-right:12px}.signed-commit-badge{display:inline-block;padding:1px 4px;font-size:10px;color:#586069;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:none;border:solid 1px #e1e4e8;border-radius:2px}.signed-commit-badge:hover{text-decoration:none;border-color:#c6cbd1}.signed-commit-badge.verified{color:#22863a}.signed-commit-badge.verified:hover{border-color:#28a745}.signed-commit-badge-small{margin-top:-2px;margin-right:3px}.signed-commit-badge-medium{padding:3px 8px;font-size:12px;border-radius:3px}.signed-commit-badge-large{padding:6px 12px;margin-top:2px;margin-right:9px;font-size:13px;line-height:20px;border-radius:3px}.signed-commit-verified-label{color:#1e7e34;white-space:nowrap}.signed-commit-signer-name{font-size:14px;text-align:left}.signed-commit-signer-name .signer{display:block;font-weight:600;color:#24292e}.table-of-contents{margin:15px 0}.table-of-contents li{padding:7px 0;list-style-type:none}.table-of-contents li + li{border-top:1px solid #eaecef}.table-of-contents li > .octicon{margin-right:3px}.table-of-contents .toc-diff-stats{padding-left:20px;line-height:26px}.table-of-contents .toc-diff-stats .octicon{float:left;margin-top:3px;margin-left:-20px;color:#c6cbd1}.table-of-contents .toc-diff-stats .btn-link{font-weight:600}.table-of-contents .toc-diff-stats + .content{padding-top:5px}.table-of-contents .octicon-diff-removed{color:#cb2431}.table-of-contents .octicon-diff-renamed{color:#6a737d}.table-of-contents .octicon-diff-modified{color:#dbab09}.table-of-contents .octicon-diff-added{color:#28a745}.toc-select .select-menu-modal{width:420px}.toc-select .select-menu-item .css-truncate{max-width:290px}.toc-select .select-menu-item-heading, +.toc-select .select-menu-item-text{color:#24292e}.toc-select .select-menu-item-icon.octicon-diff-removed{color:#cb2431}.toc-select .select-menu-item-icon.octicon-diff-renamed{color:#6a737d}.toc-select .select-menu-item-icon.octicon-diff-modified{color:#dbab09}.toc-select .select-menu-item-icon.octicon-diff-added{color:#28a745}.toc-select[aria-selected="true"] .select-menu-item-heading, +.toc-select[aria-selected="true"] .select-menu-item-text, +.toc-select[aria-selected="true"] .text-green, +.toc-select[aria-selected="true"] .text-red, +.toc-select[aria-selected="true"] .text-gray-light, +.toc-select[aria-selected="true"] .octicon-diff-removed, +.toc-select[aria-selected="true"] .octicon-diff-renamed, +.toc-select[aria-selected="true"] .octicon-diff-modified, +.toc-select[aria-selected="true"] .octicon-diff-added, +.toc-select[aria-selected="true"] .diffstat, +.toc-select .navigation-focus .select-menu-item-heading, +.toc-select .navigation-focus .select-menu-item-text, +.toc-select .navigation-focus .text-green, +.toc-select .navigation-focus .text-red, +.toc-select .navigation-focus .text-gray-light, +.toc-select .navigation-focus .octicon-diff-removed, +.toc-select .navigation-focus .octicon-diff-renamed, +.toc-select .navigation-focus .octicon-diff-modified, +.toc-select .navigation-focus .octicon-diff-added, +.toc-select .navigation-focus .diffstat{color:#fff!important}.select-menu-item + .semantic-toc-file, +.semantic-toc-symbol:not(.last-visible){overflow:visible!important}.semantic-toc-symbol:not(.last-visible)::after, +.select-menu-item + .semantic-toc-file::after{position:absolute;left:0;width:100%;height:16px;pointer-events:none;content:" ";background-color:#f6f8fa;border-color:#e1e4e8;border-style:solid;border-width:1px 0}.semantic-toc-symbol:not(.last-visible){margin-bottom:16px}.semantic-toc-symbol:not(.last-visible)::after{bottom:-18px}.select-menu-item + .semantic-toc-file{margin-top:16px}.select-menu-item + .semantic-toc-file::after{top:-18px}.filterable-active .select-menu-item-nested{padding-left:16px!important;margin-left:0}.filterable-active .semantic-toc-symbol{margin-bottom:0}.filterable-active .semantic-toc-file{margin-top:0}.filterable-active .semantic-toc-symbol::after, +.filterable-active .semantic-toc-file::after{display:none}.conversation-list-heading{height:0;margin:35px 0 10px;font-size:16px;font-weight:400;color:#6a737d;text-align:center;border-bottom:1px solid #dfe2e5}.conversation-list-heading .inner{position:relative;top:-10px;display:inline-block;padding:0 5px;background:#fff}.simple-conversation-list{margin:15px 0;font-size:13px;color:#6a737d}.simple-conversation-list > li{padding:11px 0 8px;margin:0;list-style-type:none;border-top:1px solid #f6f8fa}.simple-conversation-list > li:first-child{border-top:0}.simple-conversation-list > li .title{font-weight:600}.simple-conversation-list > li .num{color:#6a737d}.simple-conversation-list > li .state{padding-top:2px;padding-bottom:2px;margin-top:-3px;margin-right:3px}.simple-conversation-list > li .meta{float:right;margin-left:10px}.simple-conversation-list.varied-states > li .state{float:left;width:80px;margin-left:-90px}.copyable-terminal{position:relative;padding:10px 55px 10px 10px;background-color:#f6f8fa;border-radius:3px}.copyable-terminal-content{overflow:auto}.copyable-terminal-button{position:absolute;top:5px;right:5px}.copyable-terminal-button .zeroclipboard-button{float:right}.copyable-terminal-button .zeroclipboard-button .octicon{padding-left:1px;margin:0 auto}.Details--on .Details-content--shown{display:none!important}.Details:not(.Details--on) .Details-content--hidden{display:none!important}.Details-element[open] > summary .Details-content--closed{display:none!important}.Details-element:not([open]) > summary .Details-content--open{display:none!important}.details-overlay[open] > .dropdown-item:hover{color:inherit;background:#fff}details-menu{display:block}.blob-wrapper{overflow-x:auto;overflow-y:hidden;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.blob-wrapper-embedded{max-height:240px;overflow-y:auto}.diff-table{width:100%;border-collapse:separate}.diff-table .line-comments{padding:10px;vertical-align:top;border-top:1px solid #e1e4e8}.diff-table .line-comments:first-child + .empty-cell{border-left-width:1px}.diff-table tr:not(:last-child) .line-comments{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8}.blob-num{width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;line-height:20px;color:rgba(27,31,35,0.3);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.blob-num:hover{color:rgba(27,31,35,0.6)}.blob-num::before{content:attr(data-line-number)}.blob-num.non-expandable{cursor:default}.blob-num.non-expandable:hover{color:rgba(27,31,35,0.3)}.blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}.blob-code-inner{overflow:visible;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;color:#24292e;word-wrap:normal;white-space:pre}.blob-code-inner .x-first{border-top-left-radius:0.2em;border-bottom-left-radius:0.2em}.blob-code-inner .x-last{border-top-right-radius:0.2em;border-bottom-right-radius:0.2em}.blob-code-inner::before{content:" "}.blob-code-inner.highlighted{background-color:#fffbdd}.blob-code-marker-addition::before{content:"+ "}.blob-code-marker-deletion::before{content:"- "}.blob-code-marker-context::before{content:" "}.soft-wrap .diff-table{table-layout:fixed}.soft-wrap .blob-code{padding-left:18px;text-indent:-7px}.soft-wrap .blob-code-inner{word-wrap:break-word;white-space:pre-wrap}.soft-wrap .no-nl-marker{display:none}.soft-wrap .add-line-comment{margin-left:-28px}.blob-num-hunk, +.blob-code-hunk, +.blob-num-expandable, +.blob-code-expandable{color:rgba(27,31,35,0.5);vertical-align:middle}.blob-num-hunk, +.blob-num-expandable{background-color:#dbedff}.blob-code-hunk, +.blob-code-expandable{padding-top:4px;padding-bottom:4px;background-color:#f1f8ff;border-width:1px 0}.blob-expanded .blob-num, +.blob-expanded .blob-code{background-color:#fafbfc}.blob-expanded + tr:not(.blob-expanded) .blob-num, +.blob-expanded + tr:not(.blob-expanded) .blob-code{border-top:1px solid #eaecef}.blob-expanded .blob-num-hunk{border-top:1px solid #eaecef}tr:not(.blob-expanded) + .blob-expanded .blob-num, +tr:not(.blob-expanded) + .blob-expanded .blob-code{border-top:1px solid #eaecef}.blob-num-expandable{padding:0;font-size:12px;text-align:center}.blob-num-expandable .octicon{vertical-align:top}.blob-num-expandable .diff-expander{display:block;width:auto;height:auto;padding:4px 11px 4px 10px;margin-right:-1px;color:#586069;cursor:pointer}.blob-num-expandable .diff-expander:hover{color:#fff;text-shadow:none;background-color:#0366d6;border-color:#0366d6}.blob-code-addition{background-color:#e6ffed}.blob-code-addition .x{color:#24292e;background-color:#acf2bd}.blob-num-addition{background-color:#cdffd8;border-color:#bef5cb}.blob-code-deletion{background-color:#ffeef0}.blob-code-deletion .x{color:#24292e;background-color:#fdb8c0}.blob-num-deletion{background-color:#ffdce0;border-color:#fdaeb7}.selected-line.blob-code{background-color:#fffbdd}.selected-line.blob-code .x{background-color:transparent}.selected-line.blob-num{background-color:#fff5b1;border-color:#ffea7f}.add-line-comment{position:relative;z-index:5;float:left;width:22px;height:22px;margin:-2px -10px -2px -20px;line-height:21px;color:#fff;text-align:center;text-indent:0;cursor:pointer;background-color:#0366d6;background-image:linear-gradient(#0372ef,#0366d6);border-radius:3px;box-shadow:0 1px 4px rgba(27,31,35,0.15);opacity:0;transition:transform 0.1s ease-in-out;transform:scale(0.8,0.8)}.add-line-comment:hover{transform:scale(1,1)}.is-hovered .add-line-comment, .add-line-comment:focus{opacity:1}.add-line-comment .octicon{vertical-align:text-top;pointer-events:none}.add-line-comment.octicon-check{background:#333;opacity:1}.inline-comment-form{border:1px solid #dfe2e5;border-radius:3px}.inline-review-comment{margin-top:0!important;margin-bottom:10px!important}.inline-review-comment .gc:first-child + tr .blob-num, +.inline-review-comment .gc:first-child + tr .blob-code{padding-top:5px}.inline-review-comment tr:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.inline-review-comment tr:last-child .blob-num, +.inline-review-comment tr:last-child .blob-code{padding-bottom:8px}.inline-review-comment tr:last-child .blob-num:first-child, +.inline-review-comment tr:last-child .blob-code:first-child{border-bottom-left-radius:2px}.inline-review-comment tr:last-child .blob-num:last-child, +.inline-review-comment tr:last-child .blob-code:last-child{border-bottom-right-radius:2px}.timeline-inline-comments{width:100%;table-layout:fixed}.timeline-inline-comments .inline-comments, +.show-inline-notes .inline-comments{display:table-row}.inline-comments{display:none}.inline-comments.is-collapsed{display:none}.inline-comments .line-comments.is-collapsed{visibility:hidden}.inline-comments .line-comments + .blob-num{border-left-width:1px}.inline-comments .timeline-comment{margin-bottom:10px}.inline-comments .inline-comment-form, +.inline-comments .inline-comment-form-container{max-width:780px}.comment-holder{max-width:780px}.line-comments + .line-comments, +.empty-cell + .line-comments{border-left:1px solid #eaecef}.inline-comment-form-container .inline-comment-form, +.inline-comment-form-container.open .inline-comment-form-actions{display:none}.inline-comment-form-container .inline-comment-form-actions, +.inline-comment-form-container.open .inline-comment-form{display:block}body.split-diff .container, +body.split-diff .container-lg, +body.full-width .container, +body.full-width .container-lg{width:100%;max-width:none;padding-right:20px;padding-left:20px}body.split-diff .repository-content, +body.full-width .repository-content{width:100%}body.split-diff .new-pr-form, +body.full-width .new-pr-form{max-width:980px}body.split-diff .new-pr-form .discussion-sidebar, +body.full-width .new-pr-form .discussion-sidebar{width:200px}.file-diff-split{table-layout:fixed}.file-diff-split .blob-code + .blob-num{border-left:1px solid #f6f8fa}.file-diff-split .blob-code-inner{word-wrap:break-word;white-space:pre-wrap}.file-diff-split .empty-cell{cursor:default;background-color:#fafbfc;border-right-color:#eaecef}.submodule-diff-stats .octicon-diff-removed{color:#cb2431}.submodule-diff-stats .octicon-diff-renamed{color:#677a85}.submodule-diff-stats .octicon-diff-modified{color:#d0b44c}.submodule-diff-stats .octicon-diff-added{color:#28a745}.BlobToolbar{left:-17px}.BlobToolbar-dropdown{margin-left:-2px}.diffstat{font-size:12px;font-weight:600;color:#586069;white-space:nowrap;cursor:default}.block-diff-deleted, +.block-diff-added, +.block-diff-neutral{display:inline-block;width:8px;height:8px;margin-left:1px}.block-diff-deleted, +.text-red .block-diff-neutral{background-color:#cb2431}.block-diff-added, +.block-diff-neutral{background-color:#2cbe4e}.block-diff-neutral{background-color:#d1d5da}.discussion-timeline{position:relative;float:left;width:760px}.discussion-timeline::before{position:absolute;top:0;bottom:0;left:79px;z-index:-1;display:block;width:2px;content:"";background-color:#e6ebf1}.discussion-timeline.team-discussion-timeline::before{bottom:24px;left:20px;z-index:auto;background-color:#e1e4e8}.discussion-timeline.team-discussion-timeline .blankslate{background:#fff}.discussion-sidebar{top:0;z-index:21;float:right;width:200px}.discussion-sidebar-item{padding-top:15px;font-size:12px;color:#586069}.discussion-sidebar-item .btn .octicon{margin-right:0}.discussion-sidebar-item + .discussion-sidebar-item{margin-top:15px;border-top:1px solid #e6ebf1}.discussion-sidebar-item .select-menu{position:relative}.discussion-sidebar-item .select-menu-modal-holder{top:25px;right:-1px;left:auto}.discussion-sidebar-heading{margin-bottom:10px;font-size:12px;line-height:16px;color:#586069}.discussion-sidebar-toggle{padding:5px 0;margin:-5px 0 5px}.discussion-sidebar-toggle .octicon{float:right;color:#c3c8cf}.discussion-sidebar-toggle:hover{color:#0366d6;text-decoration:none;cursor:pointer}.discussion-sidebar-toggle:hover .octicon{color:inherit}button.discussion-sidebar-toggle{display:block;width:100%;font-weight:600;text-align:left;background:none;border:0}.sidebar-milestone .progress-bar, +.sidebar-projects .progress-bar{height:8px;margin-bottom:2px;border-radius:2px}.milestone-name{display:block;margin-top:5px;font-weight:600;color:#586069}.milestone-name .css-truncate-target{max-width:100%}.milestone-name:hover{color:#0366d6;text-decoration:none}.sidebar-assignee .css-truncate-target{max-width:110px}.sidebar-assignee .assignee{font-weight:600;color:#586069;vertical-align:middle}.sidebar-assignee .assignee:hover{color:#0366d6;text-decoration:none}.sidebar-assignee .reviewers-status-icon{width:14px}.sidebar-assignee .octicon{margin-top:2px}.sidebar-notifications{position:relative}.sidebar-notifications .thread-subscription-status{padding:0;margin:0;border:0}.sidebar-notifications .thread-subscription-status .thread-subscribe-form{display:block}.sidebar-notifications .thread-subscription-status .octicon-radio-tower{display:none}.sidebar-notifications .thread-subscription-status .reason{padding:0;margin:5px 0 0}.sidebar-notifications .thread-subscription-status .btn-sm{display:block;width:100%}.participation .participant-avatar{float:left;margin:3px 0 0 3px}.participation a{color:#586069}.participation a:hover{color:#0366d6;text-decoration:none}.participation-avatars{margin-left:-3px}.participation-avatars::before{display:table;content:""}.participation-avatars::after{display:table;clear:both;content:""}.participation-more{float:left;margin:6px 0 0;line-height:14px}.inline-comment-form .form-actions, +.timeline-new-comment .form-actions{padding:0 10px 10px}.inline-comment-form::before{display:table;content:""}.inline-comment-form::after{display:table;clear:both;content:""}.inline-comment-form .tabnav-tabs{display:inline-block}.inline-comment-form .form-actions{float:right}.gh-header-actions{float:right;margin-top:3px}.gh-header-actions .btn-sm{float:left;margin-left:5px}.gh-header-actions .btn-sm .octicon{margin-right:0}.gh-header .gh-header-edit{display:none}.gh-header .gh-header-meta .base-ref{display:inline-block}.gh-header .gh-header-meta .commit-ref-dropdown{display:none}.gh-header.open .gh-header-show{display:none}.gh-header.open .gh-header-edit{display:block}.gh-header.open .gh-header-meta .base-ref{display:none}.gh-header.open .gh-header-meta .commit-ref-dropdown{display:inline-block;margin-top:-3px;margin-bottom:-1px;vertical-align:top}.gh-header-title{margin-right:150px;margin-bottom:0;font-weight:400;line-height:1.125;word-wrap:break-word}.gh-header-no-access .gh-header-title{margin-right:0}.gh-header-number{font-weight:300;color:#a3aab1;letter-spacing:-1px}.gh-header-edit::before{display:table;content:""}.gh-header-edit::after{display:table;clear:both;content:""}.gh-header-edit .edit-issue-title{float:left;width:760px;padding:7px 10px;margin-right:10px;font-size:16px;background-color:#fafbfc}.gh-header-edit .edit-issue-title:focus{background-color:#fff}.gh-header-edit .btn{float:left;padding:7px 15px}.gh-header-edit .btn-link{float:left;margin:7px 10px}.gh-header-meta{padding-bottom:20px;margin-top:8px;font-size:14px;line-height:20px;color:#586069;border-bottom:1px solid #e6ebf1}.gh-header.issue .gh-header-meta{margin-bottom:15px}.gh-header.pull .gh-header-meta{padding-bottom:0;border-bottom:0}.gh-header-meta .TableObject-item--primary{word-wrap:break-word;white-space:normal}.gh-header-meta .TableObject-item--primary .commit-ref .css-truncate-target, +.gh-header-meta .TableObject-item--primary .commit-ref:hover .css-truncate-target{max-width:780px!important}.gh-header-meta .State{margin-right:8px}.gh-header-meta .avatar{float:left;margin-top:-3px;margin-right:5px}.gh-header-meta .author{font-weight:600;color:#586069}.gh-header-meta .noun{text-transform:lowercase}.tabnav-pr{margin:15px 0 20px;border-color:#e1e4e8}.tabnav-pr .tabnav-tab{position:relative;padding:9px 14px;font-size:13px;color:#586069}.tabnav-pr .tabnav-tab.selected{color:#24292e;border-color:#e1e4e8}.timeline-comment-wrapper > .timeline-comment::after, .timeline-comment-wrapper > .timeline-comment::before, +.timeline-new-comment .timeline-comment::after, +.timeline-new-comment .timeline-comment::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:" ";border-color:transparent;border-style:solid solid outset}.timeline-comment-wrapper > .timeline-comment::after, +.timeline-new-comment .timeline-comment::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#f6f8fa}.timeline-comment-wrapper > .timeline-comment::before, +.timeline-new-comment .timeline-comment::before{border-width:8px;border-right-color:#d1d5da}.timeline-comment-wrapper{position:relative;padding-left:60px;margin-top:15px;margin-bottom:15px;border-top:2px solid #fff;border-bottom:2px solid #fff}.timeline-comment-wrapper .timeline-comment.current-user::after, .timeline-comment-wrapper .timeline-comment.current-user::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:" ";border-color:transparent;border-style:solid solid outset}.timeline-comment-wrapper .timeline-comment.current-user::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#f1f8ff}.timeline-comment-wrapper .timeline-comment.current-user::before{border-width:8px;border-right-color:#c0d3eb}.timeline-comment-wrapper .timeline-comment.unread-item::after, .timeline-comment-wrapper .timeline-comment.unread-item::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:" ";border-color:transparent;border-style:solid solid outset}.timeline-comment-wrapper .timeline-comment.unread-item::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fffdef}.timeline-comment-wrapper .timeline-comment.unread-item::before{border-width:8px;border-right-color:#e5d999}.timeline-comment-avatar{float:left;margin-left:-60px;border-radius:3px}.timeline-comment{position:relative;background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.timeline-comment.will-transition-once{transition:border-color 0.65s ease-in-out}.timeline-comment.will-transition-once .timeline-comment-header{transition:background-color 0.65s ease,border-bottom-color 0.65s ease-in-out}.timeline-comment.will-transition-once .timeline-comment-label{transition:border-color 0.65s ease-in-out}.timeline-comment.will-transition-once::before, .timeline-comment.will-transition-once::after{transition:border-right-color 0.65s ease-in-out}.timeline-comment.current-user{border-color:#c0d3eb}.timeline-comment.current-user .timeline-comment-header{background-color:#f1f8ff;border-bottom-color:#c0d3eb}.timeline-comment.current-user .timeline-comment-label{border-color:#c0d3eb}.timeline-comment.current-user .previewable-comment-form .comment-form-head.tabnav{color:#c0d3eb;background-color:#f1f8ff;border-bottom-color:#c0d3eb}.timeline-comment.unread-item{border-color:#e5d999}.timeline-comment.unread-item .timeline-comment-header{background-color:#fffdef;border-bottom-color:#e5d999}.timeline-comment.unread-item .timeline-comment-label{border-color:#e5d999}.timeline-comment.unread-item .previewable-comment-form .comment-form-head.tabnav{color:#e5d999;background-color:#fffdef;border-bottom-color:#e5d999}.timeline-comment:empty{display:none}.timeline-comment .comment + .comment{border-top:1px solid #e1e4e8}.timeline-comment .comment + .comment::before, .timeline-comment .comment + .comment::after{display:none}.timeline-comment .comment + .comment .timeline-comment-header{border-top-left-radius:0;border-top-right-radius:0}.timeline-comment-group:target .timeline-comment{border-color:#2188ff;box-shadow:0 0 0 0.2em #c8e1ff}.timeline-comment-group:target .timeline-comment::before{filter:drop-shadow(-0.25em 0 0 #c8e1ff);border-right-color:#2188ff}.review-comment:target{border:1px solid #2188ff;border-radius:3px;box-shadow:0 0 0 0.2em #c8e1ff}.timeline-comment:target .review-summary{box-shadow:0 0 0 0.2em #c8e1ff}.timeline-comment:target .review-summary::before{filter:drop-shadow(0 -0.28em 0 #c8e1ff);border-bottom-color:#2188ff}.timeline-comment:target .review-summary .comment-body{border:1px solid #2188ff;border-radius:3px}.timeline-comment-header{padding-right:15px;padding-left:15px;color:#586069;background-color:#f6f8fa;border-bottom:1px solid #d1d5da;border-top-left-radius:3px;border-top-right-radius:3px}.timeline-comment-header:only-child{border-bottom:0;border-radius:3px}.timeline-comment-header .author{color:#586069}.timeline-comment-header .timestamp{color:inherit;white-space:nowrap}.timeline-comment-header .timestamp.timestamp-edited{cursor:default}.timeline-comment-header code{word-break:break-all}.comment-type-icon{color:inherit}.timeline-comment-label{float:right;padding:2px 5px;margin:8px 0 0 10px;font-size:12px;cursor:default;border:1px solid rgba(27,31,35,0.1);border-radius:3px}.timeline-comment-label-spammy{color:#cb2431;border-color:#d73a49}.timeline-comment-header-text{max-width:78%;padding-top:10px;padding-bottom:10px}.timeline-comment-header-text code a{color:#586069}.timeline-comment-actions{float:right;margin-right:-5px;margin-left:10px}.timeline-comment-actions .show-more-popover.dropdown-menu-sw{right:-6px;margin-top:-5px}.timeline-comment-action{display:inline-block;padding:10px 5px;color:inherit;opacity:0.5}.timeline-comment-action:hover, .timeline-comment-action:focus{color:#0366d6;text-decoration:none;opacity:1}.timeline-comment-action .octicon-check{height:16px;font-size:18px}.timeline-comment-action.disabled{color:#b1b7bc;cursor:default}.timeline-comment-action.disabled:hover{color:#b1b7bc}.compare-tab-comments .timeline-comment-actions{display:none}.timeline-new-comment{max-width:780px;margin-bottom:0}.timeline-new-comment .comment-form-head{margin-bottom:10px}.timeline-new-comment .previewable-comment-form .comment-body{padding:5px 5px 15px;border-bottom:1px solid #e1e4e8}.discussion-item + .discussion-item, +.discussion-item-review + .discussion-item{padding-top:15px;border-top:1px solid #e6ebf1}.discussion-item + .discussion-item-review{padding-top:8px;border-top:1px solid #e6ebf1}.discussion-item{position:relative;padding-left:25px;margin:15px 0 15px 79px}.discussion-item .author{font-weight:600;color:#586069}.discussion-item .timestamp{color:inherit;white-space:nowrap}.discussion-item.open .discussion-item-details{display:block}.discussion-item.open .discussion-item-toggler-opened{display:inline}.discussion-item.open .discussion-item-toggler-closed{display:none}.discussion-item .code-owner{color:inherit}.discussion-item-details{display:none}.discussion-item-deployed{padding-top:15px;border-top:1px solid #e6ebf1}.discussion-item-toggler-opened{display:none}.discussion-item-icon{float:left;width:32px;height:32px;margin-top:-7px;margin-left:-40px;line-height:28px;color:#586069;text-align:center;background-color:#e6ebf1;border:2px solid #fff;border-radius:50%}.discussion-item-icon .octicon-pencil{font-size:14px}.discussion-item-header{min-height:30px;padding-top:5px;padding-bottom:5px;line-height:22px;color:#586069;word-wrap:break-word}.discussion-item-header .avatar{width:16px;height:16px}.discussion-item-header .discussion-item-private{vertical-align:-1px}.discussion-item-header:last-child{padding-bottom:0}.discussion-item-header .commit-ref{font-size:85%;vertical-align:baseline}.discussion-item-header .btn-outline{float:right;padding:4px 8px;margin-top:-5px;margin-left:10px}.discussion-item-body{margin-top:5px}.discussion-item-footer{font-size:12px}.discussion-item-link{color:#586069}.discussion-item-link:hover{color:#0366d6}.discussion-item-entity{font-weight:600;color:#24292e}.discussion-item-entity:hover{color:#0366d6;text-decoration:none}.discussion-item-ref-title .issue-num{font-weight:400;color:#586069}.discussion-item-ref-title .title-link{color:#24292e}.discussion-item-ref-title .title-link:hover{color:#0366d6;text-decoration:none}.discussion-item-ref-title .title-link:hover .issue-num{color:inherit}.discussion-item-context-icon{display:inline-block;margin-left:10px;line-height:22px}.discussion-item-help{color:#586069}.discussion-item-help:hover{color:#0366d6}.discussion-item-private{color:rgba(27,31,35,0.7)}.discussion-item-rollup-ref .State{margin-top:2px}.discussion-item-rollup-ref .discussion-item-context-icon{margin-top:2px}.discussion-item-reopened .discussion-item-icon, +.discussion-item-review.is-approved.is-writer .discussion-item-icon{color:#fff;background-color:#2cbe4e}.discussion-item-closed .discussion-item-icon, +.discussion-item-review.is-rejected.is-writer .discussion-item-icon{color:#fff;background-color:#cb2431}.discussion-item-head_ref_deleted .discussion-item-icon{padding-left:1px;color:#fff;background-color:#6a737d}.discussion-item-locked .discussion-item-icon, +.discussion-item-unlocked .discussion-item-icon{color:#fff;background-color:#24292e}.discussion-item-integrations-callout .discussion-item-icon{color:#fff;background-color:#428ade}.discussion-item-integrations-callout .pull-request-integrations-dismiss{padding:4px 8px;margin:-3px 0 0 10px;color:#586069}.pull-request-integrations-title{margin:0;font-size:15px;color:#24292e}.pull-request-integrations-body{margin-top:5px;color:#586069}.discussion-item .renamed-was, +.discussion-item .renamed-is{font-weight:600;color:#24292e}.discussion-commits .discussion-item-icon{padding-top:1px}.discussion-commits .discussion-item-body{margin-top:0;margin-left:-31px}.discussion-item-changes-marker{margin-bottom:0}.discussion-item-changes-marker .discussion-item-icon{color:#fff;background-color:#0366d6}.discussion-item-changes-marker + .discussion-commits{padding-top:0;margin-top:0;border-top:0}.discussion-item-changes-marker + .discussion-commits .discussion-item-icon{display:none}.new-discussion-timeline .previewable-comment-form .comment-form-head.tabnav{padding:6px 10px 0;background:#f6f8fa;border-radius:3px 3px 0 0}.new-discussion-timeline .previewable-comment-form .comment{border:0}.new-discussion-timeline .previewable-comment-form .comment-body{padding:5px 5px 15px;background-color:transparent;border-bottom:1px solid #e1e4e8}.new-discussion-timeline .previewable-comment-form .timeline-comment .timeline-comment-actions{display:none}.new-discussion-timeline .closed-banner{position:relative;height:19px;margin:15px 0 -15px;overflow:visible;background:#e6ebf1;border-bottom:15px solid #fff;border-radius:0}.new-discussion-timeline .composer .timeline-comment{margin-bottom:10px}.new-discussion-timeline .composer .timeline-comment::after{border-right-color:#fff}.new-discussion-timeline .composer .comment-form-head.tabnav{padding-top:0;background-color:#fff}.discussion-timeline-actions{background-color:#fff;border-top:2px solid #e6ebf1}.discussion-timeline-actions .merge-pr{padding-top:0;border-top:0}.discussion-timeline-actions .thread-subscription-status{margin-top:20px}.discussion-timeline-actions .thread-subscription-status .octicon-radio-tower{display:none}.discussion-item-merged .discussion-item-icon{padding-left:1px;color:#fff;background-color:#6f42c1}.discussion-item-merged.open .discussion-item-footer{display:none}.discussion-item-merged.open .discussion-item-details{margin-top:5px;margin-bottom:10px;border:1px solid #d1d5da;border-radius:3px}.discussion-item-merged.open .discussion-item-details-header{padding:12px 15px;margin-top:0;margin-bottom:0;font-size:inherit;border-top:1px solid #d1d5da}.discussion-item-merged.open .discussion-item-details-header:first-child{border-top:0}.discussion-item-merged.open .merge-status-list{max-height:370px;margin:0;border-top-color:#d1d5da}.discussion-item-merged.open .merge-status-item{padding-left:15px}.pagination-loader-container{background-color:#fff;background-image:url("/images/modules/pulls/progressive-disclosure-line@2x.png");background-repeat:repeat-x;background-position:left center;background-size:32px}.progressive-timeline-loader-container{padding-left:64px}.deployment-icon .octicon-rocket{position:relative;bottom:-1px;left:-1px}.environment-name{color:#586069}.deployment-meta{font-size:12px;color:#586069}.deployment-meta .octicon{color:#c3c8cf}.deployment-status-label{display:inline-block;padding:1px 4px;margin-top:-2px;margin-right:3px;font-size:10px;line-height:16px;color:#6a737d;vertical-align:middle;background:none;border:solid 1px #e1e4e8;border-radius:2px}.deployment-status-label.is-error, .deployment-status-label.is-failure{color:#cb2431;text-align:center}.deployment-status-label.is-active{color:#28a745}.deployment-status-label.is-pending, .deployment-status-label.is-queued, .deployment-status-label.is-in_progress{color:#b08800}.discussion-item-review{padding-left:0;margin:20px 0 20px 80px;border:0}.discussion-item-review .discussion-item{margin-left:-30px}.discussion-item-review .discussion-item-copy{max-width:460px}.discussion-item-review .discussion-item-body{margin-left:25px}.discussion-item-review .file-header{padding:2px 12px;background-color:#fafbfc;border-bottom:1px solid #d1d5da;border-top-left-radius:3px;border-top-right-radius:3px}.discussion-item-review .blob-wrapper{border-bottom-right-radius:0;border-bottom-left-radius:0}.discussion-item-review .timeline-comment{background-color:transparent;border:0}.discussion-item-review .timeline-comment::before, .discussion-item-review .timeline-comment::after{display:none}.discussion-item-review .timeline-comment .timeline-comment-header{padding-right:5px;background-color:inherit;border:0}.discussion-item-review .timeline-comment .discussion-item-icon{margin-right:8px;margin-left:-11px}.discussion-item-review .timeline-comment-avatar{margin-top:-7px;margin-left:-80px}.discussion-item-review.is-pending .form-actions{margin-right:10px;margin-bottom:5px}.discussion-item-review.is-pending .file, +.discussion-item-review.is-pending .file-header, +.discussion-item-review.is-pending .tabnav-tab.selected, +.discussion-item-review.is-pending .comment-form-head.tabnav{border-color:#d9d0a5}.discussion-item-review.is-pending .file-header, +.discussion-item-review.is-pending .comment-form-head.tabnav{background-color:#fffdef}.discussion-item-review-comment{border-bottom:1px solid #e1e4e8}.discussion-item-review-comment:last-child{border-bottom:0}.review-summary{position:relative;margin-left:-20px}.review-summary::after, .review-summary::before{position:absolute;left:11px;content:" ";border-color:transparent transparent #fff;border-style:solid;border-width:8px}.review-summary::after{top:-15px;border-bottom-color:#fff}.review-summary::before{top:-16px;border-bottom-color:#d1d5da}.discussion-item-icon-gray{background-color:#e6ebf1!important}.dropdown{position:relative}.dropdown.active .dropdown-menu-content{display:block;pointer-events:all}.dropdown-caret{display:inline-block;width:0;height:0;vertical-align:middle;content:"";border:4px solid;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.dropdown-menu{position:absolute;top:100%;left:0;z-index:100;width:160px;padding-top:5px;padding-bottom:5px;margin-top:2px;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(27,31,35,0.15);border-radius:4px;box-shadow:0 3px 12px rgba(27,31,35,0.15)}.dropdown-menu::before, .dropdown-menu::after{position:absolute;display:inline-block;content:""}.dropdown-menu::before{border:8px solid transparent;border-bottom-color:rgba(27,31,35,0.15)}.dropdown-menu::after{border:7px solid transparent;border-bottom-color:#fff}.dropdown-menu > ul{list-style:none}.dropdown-menu-no-overflow{width:auto}.dropdown-menu-no-overflow .dropdown-item{padding:4px 15px;overflow:visible;text-overflow:inherit}.dropdown-item{display:block;padding:4px 10px 4px 15px;overflow:hidden;color:#24292e;text-overflow:ellipsis;white-space:nowrap}.dropdown-item:focus, .dropdown-item:hover, .dropdown-item.zeroclipboard-is-hover{color:#fff;text-decoration:none;background-color:#0366d6;outline:none}.dropdown-item:focus > .octicon, .dropdown-item:hover > .octicon, .dropdown-item.zeroclipboard-is-hover > .octicon{color:inherit;opacity:1}.dropdown-item.btn-link{width:100%;text-align:left}.dropdown-signout{width:100%;text-align:left;background:none;border:0}.dropdown-divider{height:1px;margin:8px 1px;background-color:#e1e4e8}.dropdown-header{padding:4px 15px;font-size:12px;color:#586069}.dropdown-menu-content{display:none}.dropdown-menu-content.anim-scale-in{position:relative;z-index:100;pointer-events:none}.dropdown-menu-w{top:0;right:100%;left:auto;width:auto;margin-top:0;margin-right:10px}.dropdown-menu-w::before{top:10px;right:-16px;left:auto;border-color:transparent;border-left-color:rgba(27,31,35,0.15)}.dropdown-menu-w::after{top:11px;right:-14px;left:auto;border-color:transparent;border-left-color:#fff}.dropdown-menu-e{top:0;left:100%;width:auto;margin-top:0;margin-left:10px}.dropdown-menu-e::before{top:10px;left:-16px;border-color:transparent;border-right-color:rgba(27,31,35,0.15)}.dropdown-menu-e::after{top:11px;left:-14px;border-color:transparent;border-right-color:#fff}.dropdown-menu-ne{top:auto;bottom:100%;left:0;margin-bottom:3px}.dropdown-menu-ne::before, .dropdown-menu-ne::after{top:auto;right:auto}.dropdown-menu-ne::before{bottom:-8px;left:9px;border-top:8px solid rgba(27,31,35,0.15);border-right:8px solid transparent;border-bottom:0;border-left:8px solid transparent}.dropdown-menu-ne::after{bottom:-7px;left:10px;border-top:7px solid #fff;border-right:7px solid transparent;border-bottom:0;border-left:7px solid transparent}.dropdown-menu-s{right:50%;left:auto;transform:translateX(50%)}.dropdown-menu-s::before{top:-16px;right:50%;transform:translateX(50%)}.dropdown-menu-s::after{top:-14px;right:50%;transform:translateX(50%)}.dropdown-menu-sw{right:0;left:auto}.dropdown-menu-sw::before{top:-16px;right:9px;left:auto}.dropdown-menu-sw::after{top:-14px;right:10px;left:auto}.dropdown-menu-se::before{top:-16px;left:9px}.dropdown-menu-se::after{top:-14px;left:10px}g-emoji{font-family:"Apple Color Emoji","Segoe UI","Segoe UI Emoji","Segoe UI Symbol";font-size:1.2em;font-weight:400;line-height:20px;vertical-align:middle}g-emoji img{width:1em;height:1em}body.emoji-size-boost g-emoji{margin-right:3px}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){body.emoji-size-boost g-emoji{margin-right:0;font-size:1.4em}}.emoji-icon{display:inline-block;width:20px;height:20px;vertical-align:middle;background-repeat:no-repeat;background-size:20px 20px}.emoji-result{display:inline-block;height:20px;font-size:18px;font-weight:400;vertical-align:middle}.facebox{position:absolute;top:0;left:0;z-index:100;padding-bottom:40px}.facebox ul{margin-bottom:15px;margin-left:25px}.facebox .suggester ul{margin:0}.facebox-popup{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid rgba(27,31,35,0.25);border-radius:5px;box-shadow:0 0 18px rgba(27,31,35,0.4)}.facebox-content{width:455px;padding:15px}.facebox-content::before{display:table;content:""}.facebox-content::after{display:table;clear:both;content:""}.facebox-close{position:absolute;top:8px;right:5px;padding:10px;cursor:pointer;background-color:transparent;border:0;opacity:0.25;-webkit-appearance:none;-moz-appearance:none;appearance:none}.facebox-close:hover{opacity:1}.facebox-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.facebox-overlay-hide{z-index:-100}.facebox-overlay-active{z-index:99}.facebox-header{padding:15px;margin:-15px -15px 15px;font-size:18px;font-weight:400;border-bottom:1px solid #e1e4e8}.facebox-header:focus{outline:none}.facebox-footer{padding:10px 15px;margin:0 -15px -15px;text-align:right;background:#fafbfc;border-top:1px solid #e1e4e8;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.facebox-footer .help{margin:0;color:#586069;text-align:center}.facebox-alert{padding:10px 15px;margin:-16px -15px 15px;color:#735c0f;background-color:#ffea7f;border-color:rgba(176,136,0,0.3);border-style:solid;border-width:1px 0}.keyboard-shortcuts{float:right}.keyboard-mappings{font-size:12px;color:#444d56}.keyboard-mappings th{padding-top:25px;font-size:14px;line-height:1.5;color:#24292e;text-align:left}.keyboard-mappings tbody:first-child tr:first-child th{padding-top:0}.keyboard-mappings td{padding-top:3px;padding-bottom:3px;line-height:20px;vertical-align:top}.keyboard-mappings .keys{padding-right:10px;color:#586069;text-align:right;white-space:nowrap}.linejump .linejump-input{width:340px;background-color:#fafbfc}.linejump .linejump-input, +.linejump .btn{padding:10px 15px;font-size:16px}.linejump + .facebox-close{top:18px}.repo-transfer-tip{margin-bottom:0}.flash-banner{position:fixed;top:0;z-index:90;width:100%;border-top:0;border-right:0;border-left:0;border-radius:0}.signed-in-tab-flash, +.signed-out-tab-flash{display:none}.stale-session-flash.is-signed-in .signed-in-tab-flash{display:inline}.stale-session-flash.is-signed-out .signed-out-tab-flash{display:inline}.org-privileges-tour-dismiss{padding:4px 8px;margin:-3px 0 0 10px;color:#586069}.footer-octicon{color:#c6cbd1}.footer-octicon:hover{color:#959da5}.page-responsive .footer .footer-octicon{display:none}@media (min-width: 1012px){.page-responsive .footer .footer-octicon{display:block}}.gollum-editor .comment-form-head.tabnav{border:1px solid #dfe2e5}.gollum-editor .gollum-editor-body{height:390px;resize:vertical}.active .gollum-editor-function-buttons{display:block!important}include-fragment, +poll-include-fragment{display:block}kbd{display:inline-block;padding:3px 5px;font:11px "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1}.badmono{font-family:sans-serif;font-weight:600}.IssueLabel{height:20px;padding:0.15em 4px;font-size:12px;font-weight:600;line-height:15px;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(27,31,35,0.12)}.IssueLabel .g-emoji{position:relative;top:-0.05em;display:inline-block;font-size:1em;line-height:1}.IssueLabel:hover{text-decoration:none}.IssueLabel--big{padding:0 8px;font-size:16px;font-weight:600;line-height:2;border-radius:3px;transition:opacity 0.2s linear}.IssueLabel--big .g-emoji{display:inline-block;margin-top:-1px}.IssueLabel--big:hover{opacity:0.85}.list-group-item{position:relative;display:block;padding:8px 10px 10px 40px;margin-bottom:-1px;border:1px solid #e1e4e8}.list-group-item::before{display:table;content:""}.list-group-item::after{display:table;clear:both;content:""}.list-group-item a:hover{text-decoration:none}.list-group-item:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.list-group-item.closed{background-color:#fafbfc}.list-group-item.selectable{padding-left:60px}.list-group-item.selected{background-color:#fffdef}.list-group-item[aria-selected="true"], .list-group-item.navigation-focus{background-color:#f1f8ff}.list-group-item .list-group-item-summary a{color:#586069}.list-group-item .list-group-item-summary a.quiet{color:#6a737d}.list-group-item .status{position:relative;top:2px;float:right;margin-right:-9px}.list-group-item .type-icon{position:relative;top:1px;width:16px;text-align:center;vertical-align:middle}.list-group-item .assignee{float:right}.list-group-item .assignee img{display:block;border-radius:2px}.list-group-item .labels{top:-2px;display:inline-block;margin-bottom:-2px;margin-left:4px}.list-group-item-name{margin:0 60px 2px 0;font-size:15px;line-height:1.3;word-wrap:break-word}.list-group-item-name .type-icon{float:left;margin-top:1px;margin-left:-24px}.list-group-item-link{color:#24292e}.closed.octicon, +.reverted.octicon{color:#cb2431}.open.octicon{color:#28a745}.merged.octicon{color:#6f42c1}.list-group-item-summary{margin-top:2px}.list-group-item-summary p{margin:0 0 5px}.standalone .list-group-item-summary p{margin-bottom:0}.animated-ellipsis-container{display:inline-block;width:12px;height:12px;overflow:hidden;transform:translateZ(0)}.animated-ellipsis-container > .animated-ellipsis{display:inline-block;overflow:hidden;vertical-align:bottom;animation:ellipsis 1s infinite}.large-loading-area{padding:100px 0;text-align:center}.user-mention, +.team-mention{font-weight:600;color:#24292e;white-space:nowrap}.pagehead{position:relative;padding-top:20px;padding-bottom:20px;margin-bottom:20px}@media (min-width: 1012px){.pagehead{border-bottom:1px solid #e1e4e8}}.pagehead.admin{background:url("/images/modules/pagehead/background-yellowhatch-v3.png") 0 0 repeat-x}.pagehead ul.pagehead-actions{position:relative;z-index:31;float:right;margin:0}.pagehead .path-divider{margin:0 0.25em}.pagehead h1{margin-top:0;margin-bottom:0;font-size:20px;font-weight:400;line-height:28px}.pagehead h1 .avatar{margin-top:-2px;margin-right:9px;margin-bottom:-2px}.pagehead .account-switcher{margin-top:-3px;margin-bottom:-3px}.pagehead .underline-nav{height:69px;margin-top:-20px;margin-bottom:-20px}.pagehead-heading{color:inherit}.pagehead-actions > li{float:left;margin:0 10px 0 0;font-size:11px;color:#24292e;list-style-type:none}.pagehead-actions > li:last-child{margin-right:0}.pagehead-actions .octicon-mute{color:#cb2431}.pagehead-actions .select-menu{position:relative}.pagehead-actions .select-menu::before{display:table;content:""}.pagehead-actions .select-menu::after{display:table;clear:both;content:""}.pagehead-actions .select-menu-modal-holder{top:100%}.pagehead-tabs-item{float:left;padding:8px 15px 11px;color:#586069;white-space:nowrap;border:solid transparent;border-width:3px 1px 1px;border-radius:3px 3px 0 0}.pagehead-tabs-item .octicon{color:rgba(27,31,35,0.3)}.pagehead-tabs-item .Counter{color:#444d56}.pagehead-tabs-item:hover{color:#24292e;text-decoration:none}.pagehead-tabs-item.selected{font-weight:600;color:#24292e;background-color:#fff;border-color:#e36209 #e1e4e8 transparent}.pagehead-tabs-item.selected > .octicon{color:inherit}.repohead.experiment-repo-nav{padding-bottom:0;background-color:#fafbfc}.repohead .repohead-details-container{margin-bottom:20px}.repohead.mirror h1, +.repohead.fork h1{height:auto;margin-top:-5px;margin-bottom:15px}.repohead h1{position:relative;float:left;max-width:635px;padding-left:18px;font-size:18px;line-height:26px;color:#586069}.repohead h1.private .octicon{color:rgba(27,31,35,0.5)}.repohead h1 .octicon{position:absolute;top:0;left:0;margin-top:5px;color:#959da5}.repohead .octicon-mirror{left:-3px}.repohead .octicon-lock{top:10px}.repohead .fork-flag, +.repohead .mirror-flag{display:block;font-size:11px;line-height:10px;white-space:nowrap}.reponav{position:relative;top:1px;margin-top:-5px}.reponav::before{display:table;content:""}.reponav::after{display:table;clear:both;content:""}.reponav-dropdown{position:relative;float:left}.reponav-dropdown.active .dropdown-menu-content{display:block}.reponav-item{float:left;padding:7px 15px 8px;color:#586069;white-space:nowrap;border:solid transparent;border-width:3px 1px 1px;border-radius:3px 3px 0 0}.reponav-item .octicon{color:rgba(27,31,35,0.3)}.reponav-item .Counter{color:#444d56}.reponav-item:hover, .reponav-item:focus{color:#24292e;text-decoration:none}.reponav-item.selected{color:#24292e;background-color:#fff;border-color:#e36209 #e1e4e8 transparent}.reponav-item.selected > .octicon{color:inherit}.reponav-wrapper{position:relative;z-index:2;overflow-y:hidden;background-color:#24292e}.reponav-wrapper .reponav{top:0;padding-right:8px;padding-left:8px;margin-top:0;-webkit-overflow-scrolling:touch;overflow-x:auto;color:hsla(0,0%,100%,0.75)}.reponav-wrapper .reponav-item{display:inline-block;float:none;padding:4px 8px 16px;color:hsla(0,0%,100%,0.75);border:0}.reponav-wrapper .reponav-item .Counter{color:inherit;background-color:hsla(0,0%,100%,0.15)}.reponav-wrapper .reponav-item.selected{font-weight:600;color:#fff;background-color:transparent;border:0}.progress-bar{display:block;height:15px;overflow:hidden;background-color:#eaecef;border-radius:3px}.progress-bar .progress{display:block;height:100%;background-color:#2cbe4e}.reverse-progress-container{position:relative;height:3px;background-color:#e1e4e8;background-image:linear-gradient(to right,#28a745,#005cc5,#3a1d6e,#cb2431,#f66a0a);background-size:100% 3px}.reverse-progress-bar{position:absolute;right:0;height:100%;background-color:#e1e4e8}.progress-bar-small{height:10px}.progress-bar-inline .progress-bar{width:100%;border-color:#e1e4e8;border-style:solid;border-width:1px;border-top:0;border-radius:0}.steps{display:table;width:100%;padding:0;margin:30px auto 0;overflow:hidden;list-style:none;border:1px solid #dfe2e5;border-radius:3px;box-shadow:0 1px 3px rgba(27,31,35,0.05)}.steps li{display:table-cell;width:33.3%;padding:10px 15px;color:#c6cbd1;cursor:default;background-color:#fafbfc;border-left:1px solid #dfe2e5}.steps li.current{color:#24292e;background-color:#fff}.steps li.current .octicon{color:#0366d6}.steps li .octicon{float:left;margin-right:15px;margin-bottom:5px}.steps li .step{display:block}.steps li:first-child{border-left:0}.steps .complete{color:#586069}.steps .complete .octicon{color:#28a745}.prose-diff .anchor{display:none}.prose-diff .show-rich-diff{color:#0366d6;text-decoration:none;cursor:pointer}.prose-diff .show-rich-diff:hover{text-decoration:underline}.prose-diff.collapsed .rich-diff-level-zero.expandable{cursor:pointer}.prose-diff.collapsed .rich-diff-level-zero.expandable .vicinity{display:block}.prose-diff.collapsed .rich-diff-level-zero.expandable .unchanged:not(.vicinity){display:none}.prose-diff.collapsed .rich-diff-level-zero.expandable .octicon{display:block;margin:20px auto;color:#d1d5da}.prose-diff.collapsed .rich-diff-level-zero.expandable:hover .octicon{color:#24292e}.prose-diff.collapsed .rich-diff-level-zero.expandable:only-child::before{font-size:18px;color:#d1d5da;content:"Sorry, no visible changes to display."}.prose-diff.collapsed .rich-diff-level-zero.expandable:only-child:hover::before{color:#24292e}.prose-diff.collapsed .rich-diff-level-zero.expandable > .removed, +.prose-diff.collapsed .rich-diff-level-zero.expandable > del{display:none;text-decoration:none}.prose-diff .markdown-body{padding:30px;padding-left:15px}.prose-diff .markdown-body > ins{box-shadow:inset 4px 0 0 #2cbe4e}.prose-diff .markdown-body > del{text-decoration:none;box-shadow:inset 4px 0 0 #cb2431}.prose-diff .markdown-body > ins, +.prose-diff .markdown-body > del{display:block;border-radius:0}.prose-diff .markdown-body > ins > .rich-diff-level-zero, +.prose-diff .markdown-body > ins > .rich-diff-level-one, +.prose-diff .markdown-body > del > .rich-diff-level-zero, +.prose-diff .markdown-body > del > .rich-diff-level-one{margin-left:15px}.prose-diff .markdown-body > ins:first-child *, +.prose-diff .markdown-body > del:first-child *{margin-top:0}.prose-diff .rich-diff-level-zero.added{box-shadow:inset 4px 0 0 #2cbe4e}.prose-diff .rich-diff-level-zero.removed{box-shadow:inset 4px 0 0 #cb2431}.prose-diff .rich-diff-level-zero.changed{box-shadow:inset 4px 0 0 #f9c513}.prose-diff .rich-diff-level-zero.unchanged, +.prose-diff .rich-diff-level-zero.vicinity{margin-left:15px}.prose-diff .rich-diff-level-zero.added, +.prose-diff .rich-diff-level-zero.removed, +.prose-diff .rich-diff-level-zero.changed{display:block;border-radius:0}.prose-diff .rich-diff-level-zero.added > .rich-diff-level-one, +.prose-diff .rich-diff-level-zero.removed > .rich-diff-level-one, +.prose-diff .rich-diff-level-zero.changed > .rich-diff-level-one{margin-left:15px}.prose-diff .rich-diff-level-zero.added:first-child *, +.prose-diff .rich-diff-level-zero.removed:first-child *, +.prose-diff .rich-diff-level-zero.changed:first-child *{margin-top:0}.prose-diff :not(.changed) > :not(.github-user-ins):not(.github-user-del) > .removed, +.prose-diff :not(.changed) > :not(.github-user-ins):not(.github-user-del) > del{text-decoration:none}.prose-diff .changed del, +.prose-diff .changed del pre, +.prose-diff .changed del code, +.prose-diff .changed del > div, +.prose-diff .changed .removed, +.prose-diff .changed .removed pre, +.prose-diff .changed .removed code, +.prose-diff .changed .removed > div{color:#cb2431;text-decoration:line-through;background:#ffdce0}.prose-diff .changed ins, +.prose-diff .changed ins code, +.prose-diff .changed ins pre, +.prose-diff .changed .added{background:#e6ffed;border-bottom:1px solid #2cbe4e}.prose-diff > .markdown-body .github-user-ins{text-decoration:underline}.prose-diff > .markdown-body .github-user-del{text-decoration:line-through}.prose-diff > .markdown-body li ul.added{background:#e6ffed}.prose-diff > .markdown-body li ul.removed{color:#cb2431;background:#ffeef0}.prose-diff > .markdown-body li ul.removed:not(.github-user-ins){text-decoration:line-through}.prose-diff > .markdown-body li.added.moved-up .octicon, +.prose-diff > .markdown-body li.added.moved-down .octicon{margin-right:5px;margin-left:5px;color:#d1d5da}.prose-diff > .markdown-body li.added.moved{background:#fffdef}.prose-diff > .markdown-body li.removed.moved{display:none}.prose-diff > .markdown-body pre{padding:10px 20px}.prose-diff > .markdown-body th.changed, +.prose-diff > .markdown-body td.changed{background:#fffdef;border-left-color:#dfe2e5}.prose-diff > .markdown-body :not(li.moved).removed{color:#cb2431;text-decoration:line-through;background:#ffeef0}.prose-diff > .markdown-body :not(.github-user-ins):not(li.moved).removed{text-decoration:line-through}.prose-diff > .markdown-body :not(li.moved).added, +.prose-diff > .markdown-body li:not(.moved).added{background:#e6ffed}.prose-diff > .markdown-body :not(.github-user-del):not(li.moved).added +li:not(.moved):not(.github-user-del).added{text-decoration:none}.prose-diff > .markdown-body li:not(.moved).removed{color:#cb2431;background:#ffeef0}.prose-diff > .markdown-body li:not(.moved):not(.github-user-ins).removed{text-decoration:line-through}.prose-diff > .markdown-body .added, +.prose-diff > .markdown-body ins + .added, +.prose-diff > .markdown-body ins{border-top:0;border-bottom:0}.prose-diff > .markdown-body .added:not(.github-user-del):not(.github-user-ins), +.prose-diff > .markdown-body ins + .added:not(.github-user-del):not(.github-user-ins), +.prose-diff > .markdown-body ins:not(.github-user-del):not(.github-user-ins){text-decoration:none}.prose-diff > .markdown-body img.added, +.prose-diff > .markdown-body img.removed{border-style:solid;border-width:1px}.prose-diff > .markdown-body ins pre:not(.github-user-del):not(.github-user-ins), +.prose-diff > .markdown-body ins code:not(.github-user-del):not(.github-user-ins), +.prose-diff > .markdown-body ins > div:not(.github-user-del):not(.github-user-ins){text-decoration:none}.prose-diff > .markdown-body ul > ins, +.prose-diff > .markdown-body ul > del{display:block;padding:0}.prose-diff > .markdown-body .added > li, +.prose-diff > .markdown-body .removed > li{margin-top:0;margin-bottom:0}span.changed_tag, +em.changed_tag, +strong.changed_tag, +b.changed_tag, +i.changed_tag, +code.changed_tag{border-bottom:1px dotted #6a737d;border-radius:0}a.added_href, +a.changed_href, +span.removed_href{border-bottom:1px dotted #6a737d;border-radius:0}.diff-view .file-type-prose .rich-diff{display:none}.diff-view .display-rich-diff .rich-diff{display:block}.diff-view .display-rich-diff .file-diff{display:none}.diff-view .display-rich-diff.has-inline-notes .show-file-notes{display:none}.protip{margin-top:20px;text-align:center}.protip code{padding:2px;background-color:#f6f8fa;border-radius:3px}.protip-callout{padding:8px 10px;margin-bottom:20px;color:#444d56;text-align:left;border:solid 1px #eaecef;border-radius:3px}.radio-group::before{display:table;content:""}.radio-group::after{display:table;clear:both;content:""}.radio-label{float:left;padding:8px 10px 8px 35px;margin-left:-1px;color:#24292e;cursor:pointer;border:1px solid #d1d5da}:checked + .radio-label{position:relative;z-index:1;border-color:#0366d6}.radio-label .octicon{padding-right:5px}.radio-label:first-of-type{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.radio-label:last-of-type{padding-right:16px;border-top-right-radius:3px;border-bottom-right-radius:3px}.radio-input{z-index:3;float:left;margin:14px -35px 0 14px}.add-reaction-btn{opacity:0;transition:opacity 0.1s ease-in-out}.add-reaction-plus-icon{margin-right:-1px}.reaction-popover-container{display:inline-block}.reaction-popover-container[open] .add-reaction-btn{opacity:1}.add-reaction-popover.dropdown-menu{width:220px}.add-reaction-popover.dropdown-menu-ne{bottom:100%;left:6px;margin-bottom:3px}.reaction-popover-form .loading-spinner{display:none;float:right}.reaction-popover-form.loading .loading-spinner{display:inline}.add-reactions-options::before{display:table;content:""}.add-reactions-options::after{display:table;clear:both;content:""}.add-reactions-options-item{float:left;width:34px;line-height:29px;transition:transform 0.15s cubic-bezier(0.2,0,0.13,2);transform:scale(1)}.add-reactions-options-item:hover, .add-reactions-options-item:focus{text-decoration:none;transform:scale(1.2)}.add-reactions-options-item:active{background-color:#dbedff}.comment-reactions::before{display:table;content:""}.comment-reactions::after{display:table;clear:both;content:""}.comment-reactions .reaction-popover-container{z-index:100}.comment-reactions.has-reactions{border-top:1px solid #e1e4e8}.comment-reactions.has-reactions:hover .add-reaction-btn{opacity:1}.comment-reactions .user-has-reacted{background-color:#f1f8ff}.comment-reactions .add-reaction-btn{border-right:0}.reaction-summary-item{float:left;padding:9px 15px 7px;line-height:18px;border-right:1px solid #e1e4e8}.reaction-summary-item:hover, .reaction-summary-item:focus{text-decoration:none}.comment-reactions-options .reaction-summary-item:first-child{border-bottom-left-radius:2px}.render-container{padding:30px;line-height:0;text-align:center;background:#dfe2e5}.render-container .render-viewer{display:none;width:100%;height:100%;border:0}.render-container .octospinner{display:none}.render-container .render-viewer-error, +.render-container .render-viewer-fatal, +.render-container .render-viewer-invalid{display:none}.render-container.is-render-automatic .octospinner{display:inline-block}.render-container.is-render-requested .octospinner{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer-error{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer, +.render-container.is-render-requested.is-render-failed .render-viewer-fatal, +.render-container.is-render-requested.is-render-failed .render-viewer-invalid, +.render-container.is-render-requested.is-render-failed .octospinner{display:none}.render-container.is-render-requested.is-render-failed-fatal .render-viewer-fatal{display:inline-block}.render-container.is-render-requested.is-render-failed-fatal .render-viewer, +.render-container.is-render-requested.is-render-failed-fatal .render-viewer-error, +.render-container.is-render-requested.is-render-failed-fatal .render-viewer-invalid, +.render-container.is-render-requested.is-render-failed-fatal .octospinner{display:none}.render-container.is-render-requested.is-render-failed-invalid .render-viewer-invalid{display:inline-block}.render-container.is-render-requested.is-render-failed-invalid .render-viewer, +.render-container.is-render-requested.is-render-failed-invalid .render-viewer-error, +.render-container.is-render-requested.is-render-failed-invalid .render-viewer-fatal, +.render-container.is-render-requested.is-render-failed-invalid .octospinner{display:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed){height:500px;padding:0;background:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer{display:block}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-error, +.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-fatal, +.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .octospinner{display:none}.render-notice{padding:20px 15px;font-size:14px;color:#444d56;background-color:#f6f8fa;border-color:rgba(27,31,35,0.15)}.select-menu-button::after{display:inline-block;width:0;height:0;vertical-align:-2px;content:"";border:4px solid;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.select-menu-button.icon-only{padding-left:7px}.select-menu-button.primary::after{border-top-color:#fff}.select-menu-button.primary::after:active{background-color:#28a745}.select-menu-button-large::after{margin-left:0.25em;border-width:0.33em}.select-menu .spinner{float:left;margin:4px 0 0 -24px}.select-menu.active .select-menu-modal-holder{display:block}.select-menu.select-menu-modal-right{position:relative}.select-menu.select-menu-modal-right .select-menu-modal-holder{right:0}.select-menu .select-menu-clear-item{display:block}.select-menu .select-menu-clear-item .octicon{color:inherit}.select-menu .select-menu-clear-item + .select-menu-no-results{display:none!important}.select-menu.is-loading .select-menu-loading-overlay{display:block}.select-menu.is-loading .select-menu-modal{min-height:200px}.select-menu.has-error .select-menu-error{display:block}.select-menu-error{display:none}.select-menu-loading-overlay{position:absolute;top:0;z-index:5;display:none;width:100%;height:100%;background-color:hsla(0,0%,100%,0.8);border:1px solid transparent;border-radius:5px}.select-menu-loading-overlay .octicon-octoface{position:absolute;top:50%;left:50%;margin:-16px 0 0 -16px}.select-menu-modal-holder{position:absolute;z-index:30;display:none}.select-menu-modal{position:relative;width:300px;margin-top:4px;margin-bottom:20px;overflow:hidden;font-size:12px;color:#586069;background-color:#fff;background-clip:padding-box;border:1px solid rgba(27,31,35,0.15);border-radius:3px;box-shadow:0 3px 12px rgba(27,31,35,0.15)}.select-menu-modal-narrow{width:200px}.select-menu-header, +.select-menu-divider{padding:8px 10px;line-height:16px;background:#f6f8fa;border-bottom:1px solid #e1e4e8}.select-menu-header .select-menu-title, +.select-menu-divider{font-weight:600;color:#24292e}.select-menu-divider{margin-top:-1px;border-top:1px solid #e1e4e8}.select-menu-header .close-button, +.select-menu-header .octicon{display:block;float:right;color:#c6cbd1;cursor:pointer}.select-menu-header .close-button:hover, +.select-menu-header .octicon:hover{color:#444d56}.select-menu-header:focus{outline:none}.select-menu-filters{background-color:#f6f8fa}.select-menu-text-filter{padding:10px 10px 0}.select-menu-text-filter:first-child:last-child{padding-bottom:10px;border-bottom:1px solid #dfe2e5}.select-menu-text-filter input{display:block;width:100%;max-width:100%;padding:5px;border:1px solid #dfe2e5;border-radius:3px}.select-menu-text-filter input:-ms-input-placeholder{color:#a3aab1}.select-menu-text-filter input::-ms-input-placeholder{color:#a3aab1}.select-menu-text-filter input::placeholder{color:#a3aab1}.select-menu-tabs{padding:10px 10px 0;border-bottom:1px solid #dfe2e5}.select-menu-tabs ul{position:relative;bottom:-1px}.select-menu-tabs .select-menu-tab{display:inline-block}.select-menu-tabs a, +.select-menu-tabs .select-menu-tab-nav{display:inline-block;padding:4px 8px 2px;font-size:11px;font-weight:600;color:#6a737d;text-decoration:none;cursor:pointer;background:transparent;border:1px solid transparent;border-radius:3px 3px 0 0}.select-menu-tabs a:hover, +.select-menu-tabs .select-menu-tab-nav:hover{color:#24292e}.select-menu-tabs a[aria-selected="true"], .select-menu-tabs a.selected, +.select-menu-tabs .select-menu-tab-nav[aria-selected="true"], +.select-menu-tabs .select-menu-tab-nav.selected{color:#24292e;background-color:#fff;border-color:#dfe2e5;border-bottom-color:#fff}.select-menu-list{position:relative;max-height:400px;overflow:auto}.select-menu-list.select-menu-tab-bucket{display:none}.select-menu-list.select-menu-tab-bucket.selected{display:block}.select-menu-list.is-showing-new-item-form .select-menu-new-item-form{display:block}.select-menu-list.is-showing-new-item-form .select-menu-no-results, +.select-menu-list.is-showing-new-item-form .select-menu-clear-item{display:none}.select-menu-blankslate{padding:16px;text-align:center}.select-menu-blankslate svg{display:block;margin-right:auto;margin-bottom:9px;margin-left:auto;fill:#879099}.select-menu-blankslate h3{font-size:14px;color:#24292e}.select-menu-blankslate p{width:195px;margin-right:auto;margin-bottom:0;margin-left:auto}.select-menu-item{display:block;padding:8px 8px 8px 30px;overflow:hidden;color:inherit;cursor:pointer;border-bottom:1px solid #eaecef}.select-menu-item .select-menu-item-text .octicon-x{display:none;float:right;margin:1px 10px 0 0;opacity:0.6}.select-menu-item:hover{text-decoration:none}.select-menu-item.select-menu-item-template{display:none}.select-menu-item.disabled, .select-menu-item.disabled.selected{color:#6a737d;cursor:default}.select-menu-item.disabled .description, .select-menu-item.disabled.selected .description{color:#6a737d}.select-menu-item.disabled.opaque, .select-menu-item.disabled.selected.opaque{opacity:0.7}.select-menu-item.disabled .select-menu-item-gravatar, .select-menu-item.disabled.selected .select-menu-item-gravatar{opacity:0.5}.select-menu-item .octicon{vertical-align:middle}.select-menu-item .octicon-check, +.select-menu-item input[type="radio"]:not(:checked) + .octicon-check{visibility:hidden}.select-menu-item input[type="radio"]{display:none}.select-menu-item:focus{outline:none}.select-menu-item:hover, .select-menu-item:hover.selected, .select-menu-item:hover.select-menu-action, +.select-menu-item:hover .description-inline, .select-menu-item:focus, .select-menu-item:focus.selected, .select-menu-item:focus.select-menu-action, +.select-menu-item:focus .description-inline, .select-menu-item.navigation-focus, .select-menu-item.navigation-focus.selected, .select-menu-item.navigation-focus.select-menu-action, +.select-menu-item.navigation-focus .description-inline, .select-menu-item[aria-checked="true"]:focus, .select-menu-item[aria-checked="true"]:hover, .select-menu-item[aria-selected="true"], .select-menu-item[aria-selected="true"].selected, .select-menu-item[aria-selected="true"].select-menu-action, +.select-menu-item[aria-selected="true"] .description-inline{color:#fff;background-color:#0366d6}.select-menu-item:hover > .octicon, .select-menu-item:hover.selected > .octicon, .select-menu-item:hover.select-menu-action > .octicon, +.select-menu-item:hover .description-inline > .octicon, .select-menu-item:focus > .octicon, .select-menu-item:focus.selected > .octicon, .select-menu-item:focus.select-menu-action > .octicon, +.select-menu-item:focus .description-inline > .octicon, .select-menu-item.navigation-focus > .octicon, .select-menu-item.navigation-focus.selected > .octicon, .select-menu-item.navigation-focus.select-menu-action > .octicon, +.select-menu-item.navigation-focus .description-inline > .octicon, .select-menu-item[aria-checked="true"]:focus > .octicon, .select-menu-item[aria-checked="true"]:hover > .octicon, .select-menu-item[aria-selected="true"] > .octicon, .select-menu-item[aria-selected="true"].selected > .octicon, .select-menu-item[aria-selected="true"].select-menu-action > .octicon, +.select-menu-item[aria-selected="true"] .description-inline > .octicon{color:#fff}.select-menu-item:hover .description, +.select-menu-item:hover .description-warning, .select-menu-item:hover.selected .description, +.select-menu-item:hover.selected .description-warning, .select-menu-item:hover.select-menu-action .description, +.select-menu-item:hover.select-menu-action .description-warning, +.select-menu-item:hover .description-inline .description, +.select-menu-item:hover .description-inline .description-warning, .select-menu-item:focus .description, +.select-menu-item:focus .description-warning, .select-menu-item:focus.selected .description, +.select-menu-item:focus.selected .description-warning, .select-menu-item:focus.select-menu-action .description, +.select-menu-item:focus.select-menu-action .description-warning, +.select-menu-item:focus .description-inline .description, +.select-menu-item:focus .description-inline .description-warning, .select-menu-item.navigation-focus .description, +.select-menu-item.navigation-focus .description-warning, .select-menu-item.navigation-focus.selected .description, +.select-menu-item.navigation-focus.selected .description-warning, .select-menu-item.navigation-focus.select-menu-action .description, +.select-menu-item.navigation-focus.select-menu-action .description-warning, +.select-menu-item.navigation-focus .description-inline .description, +.select-menu-item.navigation-focus .description-inline .description-warning, .select-menu-item[aria-checked="true"]:focus .description, +.select-menu-item[aria-checked="true"]:focus .description-warning, .select-menu-item[aria-checked="true"]:hover .description, +.select-menu-item[aria-checked="true"]:hover .description-warning, .select-menu-item[aria-selected="true"] .description, +.select-menu-item[aria-selected="true"] .description-warning, .select-menu-item[aria-selected="true"].selected .description, +.select-menu-item[aria-selected="true"].selected .description-warning, .select-menu-item[aria-selected="true"].select-menu-action .description, +.select-menu-item[aria-selected="true"].select-menu-action .description-warning, +.select-menu-item[aria-selected="true"] .description-inline .description, +.select-menu-item[aria-selected="true"] .description-inline .description-warning{color:#fff}.select-menu-item[aria-selected="true"].disabled, .select-menu-item.navigation-focus.disabled{color:hsla(0,0%,100%,0.5)}.select-menu-item[aria-selected="true"].disabled .description, .select-menu-item.navigation-focus.disabled .description{color:hsla(0,0%,100%,0.6)}.select-menu-item > .octicon-dash{display:none}.select-menu-item.indeterminate > .octicon-check{display:none}.select-menu-item.indeterminate > .octicon-dash{display:block}.select-menu-item input:checked + .octicon-check{color:inherit;visibility:visible}.select-menu-item[aria-checked="true"], .select-menu-item.selected{color:#24292e}.select-menu-item[aria-checked="true"] .description, .select-menu-item.selected .description{color:#586069}.select-menu-item[aria-checked="true"] > .octicon, .select-menu-item.selected > .octicon{color:#24292e}.select-menu-item[aria-checked="true"] .octicon-check, .select-menu-item.selected .octicon-check{color:inherit;visibility:visible}.select-menu-item[aria-checked="true"] .select-menu-item-text .octicon-x, .select-menu-item.selected .select-menu-item-text .octicon-x{display:block;color:inherit}.select-menu.label-select-menu .select-menu-item:active{background-color:transparent!important}.select-menu-item a{color:inherit;text-decoration:none}.select-menu-item .hidden-select-button-text{display:none}.select-menu-item .css-truncate-target{max-width:100%}.select-menu-item-parent{pointer-events:none}.select-menu-item-parent:hover{cursor:default}.select-menu-item-parent.navigation-focus, .select-menu-item-parent.navigation-focus.selected, .select-menu-item-parent[aria-selected="true"], .select-menu-item-parent[aria-selected="true"].selected{color:#24292e;background-color:#f1f8ff}.select-menu-item-parent.navigation-focus .octicon-check, .select-menu-item-parent.navigation-focus.selected .octicon-check, .select-menu-item-parent[aria-selected="true"] .octicon-check, .select-menu-item-parent[aria-selected="true"].selected .octicon-check{color:#24292e}.select-menu-item-icon{float:left;margin-left:-20px}form.select-menu-item > div:first-child{display:none!important}.select-menu-list:last-child .select-menu-item:last-child, +.select-menu-item.last-visible{border-bottom:0;border-radius:0 0 3px 3px}.select-menu-action{font-weight:400;color:#444d56}.select-menu-action > .octicon{color:inherit}.select-menu-action:hover{color:#0366d6}.select-menu-no-results{display:none;padding:9px;color:#586069;cursor:auto}.select-menu-list.filterable-empty .select-menu-no-results, .select-menu-no-results:only-child{display:block}.select-menu-button-gravatar, +.select-menu-item-gravatar{width:20px;overflow:hidden;line-height:0}.select-menu-button-gravatar img, +.select-menu-item-gravatar img{display:inline-block;width:20px;height:20px;border-radius:3px}.select-menu-item-gravatar{float:left;width:20px;height:20px;margin-right:8px;border-radius:2px}.select-menu-button-gravatar{float:left;margin-right:5px}.select-menu-item-text{display:block;text-align:left}.select-menu-item-text .description{display:block;max-width:265px;font-size:12px;color:#586069}.select-menu-item-text .description-inline{font-size:10px;color:#586069}.select-menu-item-text .description-warning{color:#cb2431}.select-menu-item-heading{display:block;margin-top:0;margin-bottom:0;font-size:14px;font-weight:600}.select-menu-item-heading .description{display:inline;font-weight:400}.select-menu-new-item-form{display:none}.select-menu-new-item-form .octicon{color:#0366d6}.modal-backdrop{display:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.menu-active .modal-backdrop{position:fixed;top:0;left:0;z-index:20;display:block;width:100vw;height:100vh}.authors-2 .AvatarStack{min-width:36px!important}.authors-3 .AvatarStack{min-width:46px!important}[aria-selected="true"] .AvatarStack-body, +.navigation-focus .AvatarStack-body{background:#f6fbff}.commit-tease .AvatarStack-body{background:#f1f8ff}.blame-commit .AvatarStack{margin-top:3px}.unfurl{padding:0 1em;border-left:0.25em solid #d1d5da}.unfurl-icon{width:15px;height:15px}.hide-unfurl{display:none}.editable-comment .hide-unfurl{display:block}body{min-width:1012px;word-wrap:break-word}.page-content{padding-top:20px}.container-sm{max-width:544px}.marketing .pagehead h1{font-size:30px}.marketing .pagehead p{margin-top:4px;margin-bottom:0;font-size:14px;color:#586069}.marketing .pagehead ul.actions{margin-top:10px}.marketing h2 .secure{float:right;padding:1px 0;font-size:11px;font-weight:600;color:#28a745;text-transform:uppercase}.marketing .questions p{font-size:14px}.marketing-section{position:relative;padding-top:80px;padding-bottom:80px;font-size:16px;line-height:1.5;text-align:center;border-bottom:1px solid #e5e5e5}.marketing-section::before{display:table;content:""}.marketing-section::after{display:table;clear:both;content:""}.marketing-section h3{font-size:21px;font-weight:400}.marketing-hero-octicon{position:relative;width:100px;height:100px;margin:0 auto 15px;text-align:center;border:solid 1px #e5e5e5;border-radius:50px}.marketing-hero-octicon .octicon{margin-top:22px;color:#0366d6}.marketing-hero-octicon .octicon-checklist{position:relative;right:-3px}.hanging-icon-list li{padding-left:25px;margin:10px 0;font-size:14px;list-style-type:none}.hanging-icon-list .octicon{float:left;margin-top:3px;margin-left:-25px;color:#586069}.hanging-icon-list .octicon-check{color:#28a745}.hanging-icon-list .octicon-x{color:#cb2431}.nonprofit-head{padding:100px 0 120px}.heart{position:absolute;top:40%;left:50%;width:12px;height:12px;margin-left:400px;background:#83d6c0;box-shadow:140px 30px 0 #efa,120px -120px 0 #aded84,220px -60px 0 #ded,30px 240px 0 #ada,60px -60px 0 #d76666,60px -30px 0 #ff846f,60px 0 0 #f9a7a7,60px 30px 0 #ffc8c8,60px 60px 0 #ffd8d8,30px 60px 0 #baf2ca,30px 30px 0 #98eaac,30px 0 0 #80d896,30px -30px 0 #6dd085,30px -60px 0 #55be6f,0 -60px 0 #4cc2a7,0 -30px 0 #73d3b9,0 30px 0 #93e3cd,0 60px 0 #adf9e4,-30px 60px 0 #ffe1b9,-30px 30px 0 #ffd194,-30px 0 0 #ffc86f,-60px 0 0 #fd9ff0,-60px 30px 0 #ffbaf7,-60px 60px 0 #fccdf7,-180px 60px 0 #9df;transform:rotate(45deg)}.heart:first-child{margin-left:-400px;transform:rotate(-45deg),scaleX(-1)}.octo-earth{position:absolute;bottom:-150px;left:50%;margin-left:-120px;animation:rotate 20s infinite linear}@keyframes rotate{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}}.btn-blurple{color:#fff;background-color:#3b41af;background-image:linear-gradient(-180deg,#6570e2 0%,#3b41af 90%)}.btn-blurple:focus, .btn-blurple.focus{box-shadow:0 0 0 0.2em rgba(101,112,226,0.4)}.btn-blurple:hover, .btn-blurple.hover{background-color:#383ea7;background-image:linear-gradient(-180deg,#5c68e0 0%,#383ea7 90%);background-position:-0.5em;border-color:rgba(27,31,35,0.5)}.btn-blurple:active, .btn-blurple.selected, +[open] > .btn-blurple{background-color:#3a43bb;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-blurple:disabled, .btn-blurple.disabled{color:hsla(0,0%,100%,0.75);background-color:#9da0d7;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-blurple .Counter{color:#4350dc;background-color:#fff}.integrations-hero-octicon.marketing-hero-octicon{width:75px;height:75px;border-width:5px}.integrations-hero-octicon.marketing-hero-octicon .octicon{margin-top:15px}.marketing-blue-octicon{color:#34acbf;border-color:#34acbf}.marketing-blue-octicon .octicon{color:#34acbf}.marketing-turquoise-octicon{color:#75bbb6;border-color:#75bbb6}.marketing-turquoise-octicon .octicon{color:#75bbb6}.marketing-purple-octicon{color:#b086b7;border-color:#b086b7}.marketing-purple-octicon .octicon{color:#b086b7}.marketing-graphic{position:relative}.intgrs-dir .marketing-graphic{padding-right:0;margin:0}.intgrs-dir .footer{margin-top:40px}.intgrs-dir-section h2{margin-top:0;margin-bottom:20px;font-size:26px;font-weight:300}.intgrs-dir-intro{padding:40px 0;margin:0;text-align:left;background-image:linear-gradient(-110deg,#48227d 0%,#2f569c 100%);border-bottom:0}.pagehead + .intgrs-dir-intro{margin-top:-20px}.intgrs-dir-intro .directory-header-back{margin-top:10px;font-size:18px;color:#fff}.intgrs-dir-intro .directory-header-back:hover{color:#d7def1;text-decoration:none}.intgrs-dir-intro .directory-header-back .octicon{vertical-align:middle}.intgrs-dir-intro .directory-header-back .header-link{color:#96dad9}.intgrs-dir-intro .column{padding-right:40px;padding-left:0}.intgrs-dir-intro .directory-tag-line{margin-bottom:0;font-size:28px;font-weight:400;color:#fff}.intgrs-dir-intro .lead{margin-top:10px;margin-bottom:6px;font-size:18px;font-weight:400;color:#d7def1}.intgrs-lstng-search{display:inline-block;width:33%;margin-left:20px}.intgrs-lstng-search .subnav-search-input{width:100%}.intgrs-lstng-categories-container{display:inline-block;float:left;width:20%}.intgrs-lstng-categories-container .intgrs-lstng-categories{top:0}.intgrs-lstng-categories-container .filter-item{padding:6px 10px;margin-right:-10px;margin-left:-10px}.intgrs-lstng-container{display:inline-block;width:80%;text-align:left}.intgrs-lstng-item{position:relative;display:inline-flex;width:30.8%;font-size:14px;border:1px solid #ededed;border-radius:4px;transition:border-color 0.15s ease 0s,transform 0.15s ease 0s,box-shadow 0.15s ease 0s,color 0.15s ease 0s}.intgrs-lstng-item:hover{border-color:#51a7e8;box-shadow:0 0 5px rgba(81,167,232,0.5);transform:scale(1.05)}.intgrs-lstng-item .intgrs-lstng-logo{display:block;margin:0 auto 10px}.intgrs-lstng-item .draft-tag{position:absolute;top:-1px;left:10px}.intgrs-lstng-item-link{display:block;width:100%;height:181px;padding-top:20px}.intgrs-lstng-item-link:hover{text-decoration:none}.intgrs-lstng-item-link:hover .intgrs-lstng-item-header{color:#0366d6}.intgrs-lstng-item-header{margin:15px 10px 0;font-size:14px;font-weight:600;color:#333}.intgrs-lstng-item-description{position:relative;height:2.8em;padding:0 10px;margin-top:5px;overflow:hidden;font-size:13px;color:#586069}.intgrs-lstng-item-description::after{position:absolute;right:0;bottom:0;padding:0 15px 0 20px;color:transparent;content:"\00a0";background-image:linear-gradient(to right,hsla(0,0%,100%,0),#fff 80%)}.intgr-admin-link{position:relative;display:inline-block;height:25px;padding-left:23px;font-size:13px;vertical-align:middle;border:1px solid #ededed;border-radius:3px}.intgr-admin-link.draft-tag{padding-left:25px;border:0}.intgr-admin-link.draft-tag .octicon, +.intgr-admin-link.draft-tag:hover .octicon{color:#fff}.intgr-admin-link.draft-tag:hover{text-decoration:none;background-color:#000}.intgr-admin-link:hover .octicon{color:#0366d6}.intgr-admin-link .octicon{position:absolute;top:3px;left:5px;color:#586069}.intgr-feat-header{position:relative;width:85%;padding:0 65px 10px;color:#d7def1}.intgr-feat-header .intgr-admin-link{border-color:rgba(215,222,241,0.6)}.intgr-feat-header .intgr-admin-link .octicon{color:#d7def1}.intgr-feat-header .intgr-admin-link:hover .octicon{color:#fff}.intgr-feat-header .marketing-hero-octicon{position:absolute;top:0;left:5px;width:50px;height:50px;border-width:3px}.intgr-feat-header .marketing-hero-octicon .octicon{margin-top:11px}.intgr-feat-header h2{margin:0;font-size:25px;line-height:50px;color:#fff}.intgr-feat-header p{max-width:580px;margin:0;font-size:18px}.integrations-breadcrumb{display:inline-block;font-weight:400;color:#8296cc}.integrations-breadcrumb-link{line-height:0;color:#d7def1}.integrations-breadcrumb-link:hover{color:#fff;text-decoration:none}.integrations-auth-wrapper{width:511px;margin:60px auto}.integrations-auth-header{font-size:20px;text-align:center}.integrations-permissions-group dt{font-size:18px;font-weight:400}.integrations-permissions-group .integrations-permission{position:relative;padding-left:22px;margin-bottom:10px;list-style-type:none}.integrations-permissions-group .integrations-permission .octicon{position:absolute;top:1px;left:0;margin-right:10px}.integrations-install-target .select-menu{vertical-align:middle}.integrations-install-target input[type=radio]{margin-right:10px}.integrations-install-target .flash{background-color:transparent}.integrations-install-target .flash-error{background-color:transparent;border:0}.integrations-install-target .octicon-lock, +.integrations-install-target .octicon-repo{margin-right:3px}.integrations-install-target .octicon-lock{color:rgba(27,31,35,0.7)}.integrations-install-target .private{background-color:#fff9ea}.integrations-install-target [aria-selected="true"].private, +.integrations-install-target .navigation-focus.private{background-color:#4078c0}.integrations-install-target [aria-selected="true"].octicon-lock, +.integrations-install-target .navigation-focus .octicon-lock{color:inherit}.integrations-setup-note{margin:10px 0}.listgroup-item{line-height:inherit}.listgroup-item.disabled{background-color:#fafbfc}.listgroup-item.disabled .listgroup-item-title{color:#333}.integration-key-management-wrapper .integration-key-downloading{display:none}.integration-key-management-wrapper .integration-key-list{display:none}.integration-key-management-wrapper .flash-error{display:none}.integration-key-management-wrapper .blankslate{margin-bottom:30px}.integration-key-management-wrapper .action .deletable{display:none}.integration-key-management-wrapper .action .undeletable{display:block}.integration-key-management-wrapper.multi-keys .action .deletable{display:block}.integration-key-management-wrapper.multi-keys .action .undeletable{display:none}.integration-key-management-wrapper.error .flash-error{display:block}.integration-key-management-wrapper.error .integration-key{opacity:0.5}.integration-key-management-wrapper.error .action .deletable{display:none}.integration-key-management-wrapper.error .action .undeletable{display:block}.integration-key-management-wrapper.downloading .blankslate{display:none}.integration-key-management-wrapper.downloading .integration-key-downloading{display:block}.integration-key-management-wrapper.downloading .integration-key-list{display:block}.integration-key-management-wrapper.downloading .integration-key-management{display:none}.integration-key-management-wrapper.has-keys .blankslate{display:none}.integration-key-management-wrapper.has-keys .integration-key-list{display:block}.link-small{color:#767676;transition:color 500ms ease}.listgroup-item:hover .link-small{color:#0366d6}.manifest-errors{border-left:3px solid #d73a49;border-radius:0 3px 3px 0}.social-callout-twitter:hover .social-callout-twitter-logo{background-image:url("/images/icons/twitter-white.png")}.social-callout-twitter-logo{display:inline-block;width:32px;height:32px;vertical-align:middle;background:url("/images/icons/twitter.png") 0 0 no-repeat;background-size:32px auto}.accessibility-error{outline:10px solid #d73a49!important}.account-membership-form .become-a-member, +.account-membership-form .already-a-member{display:none}.account-membership-form.is-member .already-a-member{display:block}.account-membership-form.is-not-member .become-a-member{display:block}.billing-plans tbody td{width:25%;vertical-align:middle}.billing-plans .current{background-color:#f2ffed}.billing-plans .name{font-size:14px;font-weight:600;color:#333}.billing-plans .coupon{font-size:12px}.billing-plans .coupon td{color:#fff;background-color:#28a745}.billing-plans .coupon .text-right{white-space:nowrap}.billing-plans .coupon.expiring td{background-color:#df6e00}.billing-plans .coupon.expiring .coupon-label::after{border-bottom-color:#df6e00}.billing-plans tbody > .selected{background-color:#fdffce}.coupon-label{position:relative;padding:9px;margin:-9px}.coupon-label::after{position:absolute;bottom:100%;left:15px;width:0;height:0;pointer-events:none;content:" ";border:solid transparent;border-width:5px;border-bottom-color:#28a745}.boxed-group-table .toggle-currency{font-size:11px;font-weight:400}.has-removed-contents{display:none}.currency-notice{margin-bottom:10px}.org-login{margin-top:-30px;margin-bottom:30px}.org-login img{width:450px;padding:1px;margin:10px -25px;border:1px solid #ccc}.plan-notice{padding:10px;margin-bottom:0;border-top:1px solid #eee}.member-list-item .member-username{display:inline}.member-list-item .member-link{display:inline}.actor-and-action{font-weight:600}.vertical-separator{margin-right:8px;margin-left:5px;border-left:1px solid grey}.audit-log-search .audit-search-form{margin-bottom:10px}.audit-log-search .audit-results-actions{margin:15px 0}.audit-log-search .audit-search-clear{margin-bottom:0}.auth-form{width:340px;margin:0 auto}.auth-form .form-group.warn .warning, +.auth-form .form-group.warn .error, .auth-form .form-group.errored .warning, +.auth-form .form-group.errored .error{max-width:274px}.auth-form-header{padding:10px 20px;margin:0;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.3);background-color:#829aa8;border:1px solid #768995;border-radius:3px 3px 0 0}.auth-form-header h1{font-size:16px}.auth-form-header h1 a{color:#fff}.auth-form-header .octicon{position:absolute;top:10px;right:20px;color:rgba(0,0,0,0.4);text-shadow:0 1px 0 hsla(0,0%,100%,0.1)}.auth-form-message{max-height:140px;padding:20px 20px 10px;overflow-y:scroll;border:1px solid #d8dee2;border-radius:3px}.auth-form-message ol, +.auth-form-message ul{padding-left:inherit;margin-bottom:inherit}.auth-form-body{padding:20px;font-size:14px;background-color:#fff;border:1px solid #d8dee2;border-top:0;border-radius:0 0 3px 3px}.auth-form-body .input-block{margin-top:5px;margin-bottom:15px}.auth-form-body p{margin:10px 0}.auth-form-body ol, +.auth-form-body ul{padding-left:inherit;margin-bottom:inherit}.two-factor-help{position:relative;padding:10px 10px 10px 36px;margin:60px 0 auto auto;border:1px solid #eaeaea;border-radius:3px}.two-factor-help h4{margin-top:0;margin-bottom:5px}.two-factor-help .octicon-device-mobile{position:absolute;top:10px;left:10px}.two-factor-help .octicon-key{position:absolute;left:10px}.two-factor-help ul{list-style-type:none}.u2f-send-code-spinner{position:relative;bottom:2px;display:none;vertical-align:bottom}.loading .u2f-send-code-spinner{display:inline}.u2f-login-spinner{top:2px}.u2f-auth-header{padding-bottom:10px;margin-bottom:20px;border-bottom:1px solid #eaeaea}.auth-form-body .u2f-auth-form-body{padding:0}.u2f-auth-form-body{padding:30px 30px 20px;text-align:center}.u2f-auth-form-body button{margin-top:20px}.u2f-auth-form-body .u2f-enabled{display:block}.u2f-auth-form-body .u2f-disabled{display:none}.u2f-auth-form-body.unavailable .u2f-enabled{display:none}.u2f-auth-form-body.unavailable .u2f-disabled{display:block}.u2f-auth-icon{color:#aaa}.flash.sms-error, +.flash.sms-success{display:none;margin:0 0 10px}.is-sent .sms-success{display:block}.is-sent .sms-error{display:none}.is-not-sent .sms-success{display:none}.is-not-sent .sms-error{display:block}.session-authentication{background-color:#f9f9f9}.session-authentication .header-logged-out{background-color:transparent;border-bottom:0}.session-authentication .header-logo{color:#333}.session-authentication .flash{padding:15px 20px;margin:0 auto;margin-bottom:10px;font-size:13px;border-style:solid;border-width:1px;border-radius:5px}.session-authentication .flash .container{width:auto}.session-authentication .flash .flash-close{height:40px}.session-authentication .flash.is-signed-in, .session-authentication .flash.is-signed-out{width:100%;border-top:0;border-right:0;border-left:0;border-radius:0}.session-authentication .auth-form label{display:block;margin-bottom:7px}.session-authentication .auth-form .btn{margin-top:20px}.session-authentication .auth-form .u2f-error{margin-bottom:0}.session-authentication .label-link{float:right;font-size:12px}.session-authentication .auth-form-header{margin-bottom:15px;color:#333;text-align:center;text-shadow:none;background-color:transparent;border:0}.session-authentication .auth-form-header h1{font-size:24px;font-weight:300;letter-spacing:-0.5px}.session-authentication .auth-form-body{border-top:1px solid #d8dee2;border-radius:5px}.session-authentication .auth-form-body.u2f-auth-form-body{padding:20px}.session-authentication .create-account-callout{padding:15px 20px;text-align:center;border:1px solid #d8dee2;border-radius:5px}.session-authentication .two-factor-help{padding:0 0 0 20px;margin-top:20px;border:0}.session-authentication .two-factor-help .octicon-device-mobile{top:3px;left:0}.session-authentication .two-factor-help .octicon-key{top:0;left:0}.session-authentication.enterprise .header-logged-out{padding:48px 0 28px;background-color:transparent}.session-authentication.hosted .header-logged-out{padding:40px 0 20px;background-color:transparent}.cvv-hint{position:relative}.cvv-hint:hover .cvv-hint-tooltip{display:block}.cvv-hint-tooltip{position:absolute;left:-115px;z-index:1000;display:none;padding:15px;background-color:#fff;border:1px solid #d0d0d0;border-radius:3px;transform:translateX(-100%) translateY(-50%)}.credit-card{position:relative;width:250px;height:150px;padding:20px;margin-top:5px;background-color:#f5f5f5;border-radius:10px}.credit-card.amex{margin-top:15px}.credit-card.amex .title{position:relative;top:-5px;z-index:1;font-family:"Arial Black","Arial Bold",Gadget,sans-serif;color:#6a737d;text-align:center;letter-spacing:1px;transform:scale(1.3,1)}.credit-card.amex .card-number{position:relative;display:inline-block;margin-top:40px;font-size:15px;white-space:nowrap}.credit-card.amex .gladiator{position:absolute;top:50px;left:50%;width:70px;height:80px;margin-left:-35px;background-color:#f5f5f5;border:3px solid #fff;border-radius:50%;box-shadow:0 0 1px #aaa}.credit-card.normal .strap{height:20px;margin:-5px -20px 15px;background-color:#555}.credit-card.normal .signature{display:inline-block;width:150px;height:30px;font-family:"Brush Script MT",cursive;font-size:17px;line-height:33px;color:#767676;text-indent:10px;letter-spacing:-1px;white-space:nowrap;background-color:#fff}.credit-card .cvv{position:relative;top:-10px;left:-7px;display:inline-block;padding:2px 5px;font-family:monospace;font-size:10px;line-height:1;text-align:center;border:2px solid red;border-top-left-radius:20px 10px;border-top-right-radius:20px 10px;border-bottom-right-radius:20px 10px;border-bottom-left-radius:20px 10px}.credit-card .cvv span{position:absolute;right:100%;margin-right:5px;color:#586069}.credit-card .text{display:block;font-family:monospace;font-size:7px;font-weight:600;line-height:1.1;text-transform:uppercase}.billing-addon-items table input{width:5em}.billing-addon-items td{vertical-align:middle;border-bottom:0}.billing-addon-items td.fixed{width:150px}.billing-addon-items td.black{color:#000}.billing-addon-items tr{border-bottom:1px solid #eee}.billing-addon-items tr:last-child{border-bottom-width:0}.billing-addon-items tr:nth-child(even){background-color:#fafbfc}.billing-addon-items tr.total-row{color:#cb2431;background-color:#fff}.billing-addon-items .new-addon-items{margin-left:5px}.billing-addon-items .addon-cost{color:#6a737d}.billing-addon-items .discounted-original-price{color:#666}.billing-addon-items .form-submit, +.billing-addon-items .payment-method{margin-left:8px}.billing-addon-items .payment-summary{margin-right:8px;margin-left:8px}.billing-credit-card .javascript-disabled-overlay{position:absolute;top:0;left:0;z-index:1;display:none;width:100%;height:100%;background-color:#fff;opacity:0.5}.billing-credit-card.disabled .javascript-disabled-overlay, .billing-credit-card.unsupported .javascript-disabled-overlay{display:block}.billing-actions{padding-bottom:10px}.billing-heres-what-appears{margin:0 0 10px}.billing-extra-box{padding-left:10px;margin:10px 0;border-left:3px solid #eee}.billing-vat-box{padding-left:10px;margin:10px 0;border-left:3px solid #eee}.billing-section .action-button{float:right;margin-bottom:5px;margin-left:10px}.billing-section .section-label{position:absolute;width:85px;font-weight:400;color:#586069;text-align:right}.billing-section .section-title{width:100px}.billing-section .section-content{margin-left:100px;color:#333}.billing-section:last-child{border-bottom:0}.billing-section .usage-bar{max-width:304px}.usage-bar{width:100%;margin:5px 0 0;background:#eee;border-radius:20px}.usage-bar.exceeded .progress{background:#d73a49}.usage-bar .progress{position:relative;max-width:100%;height:5px;background:#67d07c;border-radius:20px;transition:width 0.3s}.usage-bar .progress.no-highlight{background:#959da5}.live-update-seats-usage{margin:10px 0 5px}.billing-per-seat-callout{position:relative}.lfs-data-pack-field{margin:-6px 0}.packs-table .desc{width:1%;white-space:nowrap}.lfs-data-icon{color:#586069;text-align:center}.lfs-data-icon.dark{color:#333}.lfs-data-icon.octicon-database{margin-right:3px;margin-left:2px}.setup-wrapper .paypal-container{margin-bottom:30px}.setup-wrapper .paypal-logged-in .paypal-container{margin-bottom:10px}.payment-methods{position:relative}.payment-methods .selected-payment-method{display:none}.payment-methods .selected-payment-method::before{display:table;content:""}.payment-methods .selected-payment-method::after{display:table;clear:both;content:""}.payment-methods .selected-payment-method.active{display:block}.payment-methods .form-group dd .card-select-number{width:300px}.payment-methods .form-group dd .form-control.short.input-vat{width:300px}.payment-methods .pay-with-header{margin:5px 0}.payment-methods .pay-with-paypal .setup-creditcard-form, +.payment-methods .pay-with-paypal .paypal-form-actions, +.payment-methods .pay-with-paypal .terms, +.payment-methods .pay-with-paypal .paypal-signed-in, +.payment-methods .pay-with-paypal .paypal-down-flash, +.payment-methods .pay-with-paypal .loading-paypal-spinner{display:none}.payment-methods.paypal-loading .loading-paypal-spinner{display:block}.payment-methods.paypal-down .paypal-down-flash{display:block}.payment-methods.paypal-logged-in .paypal-sign-in{display:none}.payment-methods.paypal-logged-in .setup-creditcard-form, +.payment-methods.paypal-logged-in .paypal-form-actions, +.payment-methods.paypal-logged-in .terms, +.payment-methods.paypal-logged-in .paypal-signed-in{display:block}.payment-methods.has-paypal-account .paypal-sign-in{display:none}.payment-methods.has-paypal-account .paypal-signed-in{display:block}.paypal-label{margin:15px 0 10px;font-weight:600}.paypal-container{display:inline-block;margin-bottom:15px;vertical-align:top;background-color:#f9f9f9;border-radius:4px}.braintree-paypal-loggedin{padding:11px 16px!important;background-position:12px 50%!important;border:1px solid #ddd!important;border-radius:4px}.bt-pp-name{margin-left:20px!important}.bt-pp-email{margin-left:15px!important}.bt-pp-cancel{font-size:0!important;line-height:1!important;color:#a00!important;text-decoration:none!important}.payment-history .id, +.payment-history .date, +.payment-history .receipt, +.payment-history .status, +.payment-history .amount{white-space:nowrap}.payment-history .break-all{word-break:break-all}.payment-history .receipt{text-align:center}.payment-history .currency, +.payment-history .status{color:#586069}.payment-history .status-icon{width:14px;text-align:center}.payment-history .succeeded .status{color:#28a745}.payment-history .refunded, +.payment-history .failed{background:#f6f8fa}.payment-history .refunded td, +.payment-history .failed td{opacity:0.5}.payment-history .refunded .receipt, +.payment-history .refunded .status, +.payment-history .failed .receipt, +.payment-history .failed .status{opacity:1}.payment-history .refunded .status{color:#6a737d}.payment-history .failed .status{color:#cb2431}.paypal-icon{margin:0 2px 0 1px;vertical-align:middle}.inline-form-action{display:inline}.boxed-group .boxed-group-content{margin:10px}.currency-container .local-currency, +.currency-container .local-currency-block{display:none}.currency-container.open .local-currency{display:inline}.currency-container.open .local-currency-block{display:block}.currency-container.open .default-currency{display:none}.strong-label{display:inline-block;margin-bottom:5px;font-weight:600}.discounted-original-price{font-weight:400;color:#586069;text-decoration:line-through}.billing-manager-input{width:500px}.billing-manager-banner{padding:30px 20px;margin-bottom:30px;overflow:hidden;background:#f9f9f9;border-bottom:1px solid #eee}.billing-manager-banner .container{position:relative}.billing-manager-banner-text{margin-left:210px;font-size:14px;color:#555}.billing-manager-banner-text .btn{margin-top:8px;margin-right:8px}.billing-manager-banner-title{font-size:12px;font-weight:600;color:#586069}.billing-manager-icon{position:absolute;top:-35px;left:0;width:180px;height:180px;font-size:180px;color:#e0e0e0}.golden-ticket-banner{margin-top:30px;margin-bottom:15px;text-align:center;border-top:1px solid #e6d445}.golden-ticket{height:60px;margin-top:-30px}.golden-ticket-button{float:left;width:50%;padding:30px 20px;font-size:18px;font-weight:400}.golden-ticket-button .octicon{margin-right:10px;vertical-align:middle}.golden-ticket-button:first-child{border-radius:3px 0 0 3px}.golden-ticket-button:last-child{border-left:0;border-radius:0 3px 3px 0}.golden-ticket-confirm .setup-header{text-align:center;border:0}.seats-change-arrow{margin:0 10px}.billing-note-block{margin:15px 0}.plan-choice{position:relative;display:block;padding:15px;padding-left:40px;font-weight:400;background-color:#fafbfc;border:1px solid #e0e0e0}.plan-choice.open, .plan-choice.selected{background-color:#fff}.plan-choice--experiment{cursor:pointer;transition:transform 0.3s,box-shadow 0.3s,border-color 0.3s}.plan-choice--experiment.open, .plan-choice--experiment.selected{border-color:#d1d5da;box-shadow:0 1px 15px rgba(27,31,35,0.15);transform:scale(1.025)}.plan-choice--experiment.open .plan-choice-icon, .plan-choice--experiment.selected .plan-choice-icon{background-color:#28a745;box-shadow:0 1px 1px rgba(27,31,35,0.1)}.plan-choice--experiment.open .plan-choice-icon .octicon, .plan-choice--experiment.selected .plan-choice-icon .octicon{transform:scale(1)}.plan-choice--experiment.plan-choice--blue.open, .plan-choice--experiment.plan-choice--blue.selected{border-color:#2188ff}.plan-choice--experiment.plan-choice--blue.open .plan-choice-icon, .plan-choice--experiment.plan-choice--blue.selected .plan-choice-icon{background-color:#0366d6}.plan-choice--experiment.plan-choice--green.open, .plan-choice--experiment.plan-choice--green.selected{border-color:#34d058}.plan-choice--experiment.plan-choice--green.open .plan-choice-icon, .plan-choice--experiment.plan-choice--green.selected .plan-choice-icon{background-color:#28a745}.plan-choice--experiment.plan-choice--purple.open, .plan-choice--experiment.plan-choice--purple.selected{border-color:#8a63d2}.plan-choice--experiment.plan-choice--purple.open .plan-choice-icon, .plan-choice--experiment.plan-choice--purple.selected .plan-choice-icon{background-color:#6f42c1}.plan-choice-icon{transition:box-shadow 0.3s}.plan-choice-icon .octicon{transition:transform 0.2s;transform:scale(0.5)}.plan-choice-radio{position:absolute;top:18px;left:15px}.plan-choice-exp{margin-top:5px;font-size:12px;color:#6a737d}.seat-field{width:50px;margin-right:5px}.billing-form-title{font-size:16px}.billing-line-items{margin-top:10px}.billing-line-item{padding:10px 0;font-size:12px;list-style:none;border-top:1px solid #e0e0e0}.billing-line-item::before{display:table;content:""}.billing-line-item::after{display:table;clear:both;content:""}.billing-line-item-last{font-weight:600;border-top-width:3px}.line-item-value{float:right}.condensed-payment-methods .vat-field, +.condensed-payment-methods .cc-field, +.condensed-payment-methods .expiration-field, +.condensed-payment-methods .country-field, +.condensed-payment-methods .vat-field{margin-top:15px}.condensed-payment-methods .vat-field{width:100%;margin-bottom:0}.condensed-payment-methods .cc-field{width:42%}.condensed-payment-methods .expiration-field, +.condensed-payment-methods .state-field{width:30%}.condensed-payment-methods .expiration-field{white-space:nowrap}.condensed-payment-methods .expiration-field .select{width:40%}.condensed-payment-methods .expiration-divider{width:20%;line-height:30px;text-align:center}.condensed-payment-methods .cvv-field, +.condensed-payment-methods .postcode-field{width:28%;margin-top:15px;margin-bottom:0}.condensed-payment-methods .state-field.column, +.condensed-payment-methods .postcode-field.column{margin-top:15px;margin-bottom:0}.condensed-payment-methods .country-field{width:42%}.condensed-payment-methods .state-field{width:30%}.condensed-payment-methods .is-international .country-field{width:72%}.condensed-payment-methods .is-international.no-postcodes .country-field{width:100%}.zuora-billing-section.PaymentMethod--creditcard:not(.has-removed-contents) ~ .SignUpContinueActions{display:none}.zuora-billing-section.PaymentMethod--creditcard-added ~ .SignUpContinueActions{display:block}.zuora-billing-section.PaymentMethod--paypal ~ .SignUpContinueActions{display:block}.blame-commit{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.blame-commit[data-heat="1"]{border-right:2px solid #f66a0a}.blame-commit[data-heat="2"]{border-right:2px solid rgba(246,106,10,0.9)}.blame-commit[data-heat="3"]{border-right:2px solid rgba(246,106,10,0.8)}.blame-commit[data-heat="4"]{border-right:2px solid rgba(246,106,10,0.7)}.blame-commit[data-heat="5"]{border-right:2px solid rgba(246,106,10,0.6)}.blame-commit[data-heat="6"]{border-right:2px solid rgba(246,106,10,0.5)}.blame-commit[data-heat="7"]{border-right:2px solid rgba(246,106,10,0.4)}.blame-commit[data-heat="8"]{border-right:2px solid rgba(246,106,10,0.3)}.blame-commit[data-heat="9"]{border-right:2px solid rgba(246,106,10,0.2)}.blame-commit[data-heat="10"]{border-right:2px solid rgba(246,106,10,0.1)}.heat[data-heat="1"]{background:#f66a0a}.heat[data-heat="2"]{background:rgba(246,106,10,0.9)}.heat[data-heat="3"]{background:rgba(246,106,10,0.8)}.heat[data-heat="4"]{background:rgba(246,106,10,0.7)}.heat[data-heat="5"]{background:rgba(246,106,10,0.6)}.heat[data-heat="6"]{background:rgba(246,106,10,0.5)}.heat[data-heat="7"]{background:rgba(246,106,10,0.4)}.heat[data-heat="8"]{background:rgba(246,106,10,0.3)}.heat[data-heat="9"]{background:rgba(246,106,10,0.2)}.heat[data-heat="10"]{background:rgba(246,106,10,0.1)}.blame-commit-date{font-size:11px;line-height:25px;flex-shrink:0}.blame-commit-date[data-heat="1"]{color:#c24e00}.blame-commit-date[data-heat="2"]{color:#ac571f}.blame-commit-date[data-heat="3"]{color:#a35b2c}.blame-commit-date[data-heat="4"]{color:#9a5f38}.blame-commit-date[data-heat="5"]{color:#926245}.blame-commit-date[data-heat="6"]{color:#896651}.blame-commit-date[data-heat="7"]{color:#806a5e}.blame-commit-date[data-heat="8"]{color:#776d6a}.blame-commit-date[data-heat="9"]{color:#6e7177}.blame-commit-date[data-heat="10"]{color:#6a737d}.line-age-legend .heat{width:2px;height:10px;margin:2px 1px 0}.blame-breadcrumb .css-truncate-target{max-width:680px}.blame-commit-info{width:450px;height:26px}.blame-commit-content{flex-grow:2;overflow:hidden}.blame-commit-message{text-overflow:ellipsis}.blame-commit-message .message.blank{color:rgba(27,31,35,0.3)}.blob-reblame{min-width:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reblame-link{padding-top:2px;color:#d1d5da}.blame-hunk g-emoji{font-size:14px!important}.blame-hunk:hover .reblame-link{color:#6a737d}.blame-container .blame-blob-num, +.blame-container .blob-code-inner{padding-top:3px;padding-bottom:3px}.blame-container .blob-code-inner{flex-grow:1}.editor-abort{display:inline;font-size:14px}.blob-interaction-bar{position:relative;background-color:#f2f2f2;border-bottom:1px solid #e5e5e5}.blob-interaction-bar::before{display:table;content:""}.blob-interaction-bar::after{display:table;clear:both;content:""}.blob-interaction-bar .octicon-search{position:absolute;top:10px;left:10px;font-size:12px;color:#586069}.blob-filter{width:100%;padding:4px 20px 5px 30px;font-size:12px;border:0;border-radius:0;outline:none}.blob-filter:focus{outline:none}.html-blob{margin-bottom:15px}.TagsearchPopover-content{width:inherit;max-width:600px}.license-summary-octicon{color:#959da5}.rule-type-permissions{color:#28a745}.rule-type-conditions{color:#0366d6}.rule-type-limitations{color:#d73a49}.check-for-fork.is-error .check-for-fork-loading{display:none}.check-for-fork.is-error .check-for-fork-error{display:inline-block}.check-for-fork-error{display:none}.commit-form-avatar{margin-left:-64px}.file-commit-form{padding-left:64px}.file-commit-form--full{position:absolute;top:0;right:0;z-index:2;margin-top:16px}.file-commit-form--full .commit-form{padding:0;margin-bottom:24px;border:0}.file-commit-form--full .commit-form::before{display:none}.commit-form::after, .commit-form::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:" ";border-color:transparent;border-style:solid solid outset}.commit-form::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.commit-form::before{border-width:8px;border-right-color:#ddd}.quick-pull-new-branch-icon{top:9px;left:10px}.code-formatting-menu{width:260px}.merge-pr{padding-top:10px;margin:20px 0 0;border-top:1px solid #d1d5da}.merge-pr.open .merge-branch-form{display:block}.merge-pr.open .branch-action{display:none}.status-heading{margin-bottom:1px}.merge-status-list{max-height:0;padding:0;margin:15px -15px -16px -55px;overflow-y:auto;border:solid #e1e4e8;border-width:1px 0 0;transition:max-height 0.25s ease-in-out}.statuses-toggle-opened{display:none}.merge-status-item{position:relative;padding:10px 15px;background-color:#fafbfc;border-bottom:1px solid #e1e4e8}.merge-status-item:last-child{border-bottom:0}.merge-status-item .css-truncate-target{max-width:100%}.merge-status-item .dismiss-review-form{display:none}.merge-status-item.open .review-status-item{display:none!important}.merge-status-item.open .dismiss-review-form{display:block}.status-meta{color:#586069}.status-meta-file-name{padding:0.2em 0.4em;margin:0;font-size:85%;background-color:rgba(27,31,35,0.05);border-radius:3px}.status-actions{margin-left:auto}.branch-action-item-icon{float:left;margin-left:-40px}.merge-status-icon{width:30px;margin-right:12px}.merge-pr-more-commits{margin-top:10px;margin-bottom:10px;margin-left:60px;font-size:12px;color:#586069}.branch-action{padding-left:60px;margin-top:15px;margin-bottom:15px}.branch-action .merge-branch-heading{margin-bottom:4px}.branch-action-icon{float:left;width:44px;height:44px;padding:6px;margin-left:-60px;color:#fff;text-align:center;border-radius:3px}.branch-action-body{position:relative;background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.branch-action-body::after, .branch-action-body::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:" ";border-color:transparent;border-style:solid solid outset}.branch-action-body::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.branch-action-body::before{border-width:8px;border-right-color:#d1d5da}.branch-action-body .spinner{display:block;float:left;width:32px;height:32px;margin-right:15px;background:url("/images/spinners/octocat-spinner-32.gif") no-repeat}.branch-action-body .merge-message, +.branch-action-body .merge-branch-form{padding:15px;background-color:#fafbfc;border-top:1px solid #e1e4e8;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.post-merge-message{padding:15px}.branch-action-item{padding:15px 15px 15px 55px;font-size:13px;line-height:1.4}.branch-action-item + .branch-action-item, +.branch-action-item + .mergeability-details{border-top:1px solid #e1e4e8}.branch-action-item.open > .merge-status-list{max-height:215px;margin-bottom:-15px}.branch-action-item.open .statuses-toggle-opened{display:inline}.branch-action-item.open .statuses-toggle-closed{display:none}.branch-action-btn{margin-left:15px}.branch-action-item-simple{padding-left:15px}.branch-action-item-simple .merge-status-list{margin-left:-15px}.branch-action-item-simple .merge-status-item{padding-left:12px}.branch-action-state-clean .branch-action-icon{background-color:#2cbe4e}.branch-action-state-clean .branch-action-body{border-color:#34d058}.branch-action-state-clean .branch-action-body::before{border-right-color:#34d058}.branch-action-state-unknown .branch-action-icon, +.branch-action-state-unstable .branch-action-icon{background-color:#dbab09}.branch-action-state-unknown .branch-action-body, +.branch-action-state-unstable .branch-action-body{border-color:#e2cc7a}.branch-action-state-unknown .branch-action-body::before, +.branch-action-state-unstable .branch-action-body::before{border-right-color:#e2cc7a}.branch-action-state-merged .branch-action-icon{background-color:#6f42c1}.branch-action-state-merged .branch-action-body{border-color:#d5c8ed}.branch-action-state-merged .branch-action-body::before{border-right-color:#d5c8ed}.branch-action-state-dirty .branch-action-icon, +.branch-action-state-closed-dirty .branch-action-icon, +.is-rebasing .branch-action-state-dirty-if-rebasing .branch-action-icon{background-color:#6a737d}.branch-action-state-dirty .branch-action-body, +.branch-action-state-closed-dirty .branch-action-body, +.is-rebasing .branch-action-state-dirty-if-rebasing .branch-action-body{border-color:#d1d5da}.branch-action-state-dirty .branch-action-body::before, +.branch-action-state-closed-dirty .branch-action-body::before, +.is-rebasing .branch-action-state-dirty-if-rebasing .branch-action-body::before{border-right-color:#d1d5da}.branch-action-state-error .branch-action-icon{background-color:#d73a49}.branch-action-state-error .branch-action-body{border-color:#f97583}.branch-action-state-error .branch-action-body::before{border-right-color:#f97583}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.branch-action-body .spinner{background-image:url("/images/spinners/octocat-spinner-64.gif");background-size:32px 32px}}.merge-branch-form{display:none;margin:15px 0}.merge-branch-form .commit-form{border-color:#85e89d}.merge-branch-form .commit-form::before{border-right-color:#e1e4e8}.merge-branch-form.error .commit-form, +.merge-branch-form.danger .commit-form{border-color:#f97583}.merge-branch-form.error .commit-form::before, +.merge-branch-form.danger .commit-form::before{border-right-color:#f97583}.merge-button-matrix-merge-form .merge-branch-form{display:block}.completeness-indicator{width:30px;height:30px;text-align:center}.completeness-indicator .octicon{display:block;margin-top:7px;margin-right:auto;margin-left:auto}.completeness-indicator .octicon-alert{margin-top:6px}.completeness-indicator-success{color:#fff;background-color:#2cbe4e;border-radius:50%}.completeness-indicator-error{color:#fff;background-color:#cb2431;border-radius:50%}.completeness-indicator-problem{color:#fff;background-color:#6a737d;border-radius:50%}.pull-merging .pull-merging-error{display:none}.pull-merging.is-error .pull-merging-error{display:block}.pull-merging.is-error .merge-pr{display:none}.RecentBranches{background-color:#fffbdd;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.RecentBranches-item{line-height:28px;color:#735c0f}.RecentBranches-item + .RecentBranches-item{border-top:1px solid rgba(27,31,35,0.05)}.RecentBranches-item-link{color:#735c0f}.RecentBranches-item-link.css-truncate-target{max-width:400px}.range-editor{position:relative;padding:5px 15px 5px 40px;margin-top:15px;margin-bottom:15px;background-color:#fafbfc;border:1px solid #e1e4e8;border-radius:3px}.range-editor .dots{font-size:16px}.range-editor .select-menu{position:relative;display:inline-block}.range-editor .select-menu.fork-suggester{display:none}.range-editor .branch-name{line-height:22px}.range-editor .branch .css-truncate-target, +.range-editor .fork-suggester .css-truncate-target{max-width:180px}.range-editor .pre-mergability{display:inline-block;padding:5px;line-height:26px;vertical-align:middle}.range-editor .pre-mergability .octicon{vertical-align:text-bottom}.range-editor.is-cross-repo .select-menu.fork-suggester{display:inline-block}.range-editor-icon{float:left;margin-top:10px;margin-left:-25px;color:#586069}.gh-header-new-pr{margin-bottom:15px}.gh-header-new-pr .gh-header-meta{padding-bottom:0;margin-top:5px;border-bottom:0}.gh-header-new-pr .branch-name{display:inline}.compare-pr-header{display:none}.is-pr-composer-expanded .compare-show-header{display:none}.is-pr-composer-expanded .compare-pr-header{display:block}.range-cross-repo-pair{display:inline-block;padding:5px;white-space:nowrap}ul.comparison-list{width:350px;margin:25px auto 15px;font-size:14px;text-align:left;background:#fff;border:1px solid #dfe2e5;border-radius:3px}ul.comparison-list > li{padding:7px 10px;list-style-type:none;border-top:1px solid #eaecef}ul.comparison-list > li a{font-weight:600}ul.comparison-list > li em{float:right;font-style:normal;color:#586069}ul.comparison-list > li .octicon{position:relative;top:1px;color:#a3aab1}ul.comparison-list > li .css-truncate-target{max-width:200px}ul.comparison-list > li.title{font-size:12px;font-weight:600;color:#6a737d;text-transform:uppercase;background:#fafbfc;border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.branches .page-header{margin-bottom:20px}.branches .clear-search{display:none}.branches .loading-overlay{position:absolute;top:0;z-index:20;display:none;width:100%;height:100%;padding-top:50px;text-align:center;background-color:hsla(0,0%,100%,0.7)}.branches .loading-overlay .spinner{display:inline-block}.branches.is-search-mode .clear-search{display:inline-block}.branches.is-loading .loading-overlay{display:block}.branches .status{display:inline-block;width:16px;text-align:center}.branches .status .octicon{position:relative}.branches .status .octicon-primitive-dot{width:10px}.branches .branch-actions{position:relative;top:-4px;right:-4px;float:right}.branches .branch-actions form{display:inline}.branches .branch-actions .octicon{width:16px;text-align:center}.branch-groups{position:relative}.branch-group{width:100%;margin-bottom:20px;border-radius:3px}.branch-group::before{display:table;content:""}.branch-group::after{display:table;clear:both;content:""}.branch-group-heading{padding:6px 12px;background:#f6f8fa;border:1px solid #dfe2e5;border-bottom:0}.branch-group-heading + .branch-summary{border-top:1px solid #dfe2e5}.branch-group-heading .branch-name{color:#fff;background:#6a737d}.branch-group-name{font-weight:600;color:#586069}.branch-group-heading:first-child, +.branch-summary:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.branch-group-heading:last-child, +.branch-summary:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.branches-view-switcher{display:inline-block;vertical-align:middle}.branch-search{position:relative;float:right;vertical-align:middle}.branch-search .clear-search{position:absolute;top:9px;right:12px;color:#6a737d}.branch-search-field{width:250px;padding-right:25px}.no-results-message{padding:12px;color:rgba(27,31,35,0.5);text-align:center;border:1px solid #dfe2e5;border-radius:0 0 3px 3px}.branch-summary{padding:12px;color:rgba(27,31,35,0.5);border:1px solid #dfe2e5;border-bottom:0}.branch-summary:last-child{border-bottom:1px solid #dfe2e5}.branch-summary .branch-spinner{display:none;vertical-align:text-bottom}.branch-summary.loading .branch-delete-icon{display:none}.branch-summary.loading .branch-spinner{display:inline-block}.branch-summary.is-deleted .existing-branch-summary{display:none}.branch-summary.is-deleted .deleted-branch-summary{display:block}.deleted-branch-summary{display:none}.deleted-branch-summary .css-truncate-target{max-width:500px}.deleted-branch-summary .branch-name{text-decoration:line-through;opacity:0.5}.deleted-branch-summary .branch-spinner{position:relative;top:4px;right:5px;float:right}.branch-delete{display:inline-block;margin:4px 2px 0 8px;color:#cb2431}.branch-delete.disabled{color:#dfe2e5}.more-branches{display:block;width:100%;padding:6px;color:#0366d6;text-align:center;text-decoration:none;background:#eaf5ff;border:1px solid rgba(27,31,35,0.05);border-radius:0 0 3px 3px}.more-branches:hover{background:#dbedff}.more-branches .octicon{position:relative;top:1px;margin-left:5px}.branch-details{display:inline-block;width:490px;margin-right:10px}.branch-details .css-truncate-target{max-width:240px}.branch-details .octicon-shield{margin-right:2px}.branch-meta{font-size:12px;line-height:20px;color:#6a737d}.default-label{display:inline-block;width:150px;text-align:center;vertical-align:top}.default-label .sha{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.default-label .sha .ellipses{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";color:inherit}.default-label .sha .octicon{padding-right:4px}.branch-a-b-count{display:inline-block;vertical-align:middle}.branch-a-b-count .count-half{position:relative;float:left;width:90px;padding-bottom:6px;text-align:right}.branch-a-b-count .count-half:last-child{text-align:left;border-left:1px solid #959da5}.branch-a-b-count .count-value{position:relative;top:-1px;display:block;padding:0 3px;font-size:10px}.branch-a-b-count .bar{position:absolute;min-width:3px;height:4px}.branch-a-b-count .meter{position:absolute;height:4px;background-color:#c6cbd1}.branch-a-b-count .meter.zero{background-color:transparent}.branch-a-b-count .bar-behind{right:0;border-radius:3px 0 0 3px}.branch-a-b-count .bar-behind .meter{right:0;border-radius:3px 0 0 3px}.branch-a-b-count .bar-ahead{left:0;border-radius:0 3px 3px 0}.branch-a-b-count .bar-ahead .meter{border-radius:0 3px 3px 0}.branch-a-b-count .bar-ahead.even, +.branch-a-b-count .bar-behind.even{min-width:2px;background:#eaecef}.businesses-toolbar .subnav-search{width:240px;margin-right:20px}.custom-messages .add-message{flex:1}.custom-messages .add-message .Subhead-heading{flex:0 0 auto}.custom-messages .add-message p{flex:1;line-height:21px}.custom-messages .tabnav{height:23px;padding:0;border:0}.custom-messages .write-content{margin-right:0;margin-left:0}.custom-messages .timeline-comment{margin-top:-25px;background-color:inherit;border:0}.custom-messages .comment-form-textarea{min-height:200px}.custom-messages .flash{margin-bottom:10px;overflow-y:hidden}.admin-options-block .admin-option-button{margin-top:8px}.admin-options-block .policy-enforcement{display:inline;margin-left:8px;color:#586069}.admin-options-block .policy-enforcement label{font-size:13px}.admin-options-block .disabled{color:#6a737d}.admin-options-block .disabled .note{color:#6a737d}body.full-width-p-0 .new-discussion-timeline{padding:0!important;border-bottom:1px #e1e4e8 solid}body.full-width-p-0 .footer .mt-6{margin-top:0!important;border-top:0!important}body.full-width-p-0 .tabnav-pr .tabnav-extra{margin-right:24px}body.full-width-p-0 .tabnav-pr .tabnav-tabs{margin-left:16px}.checks-toolbar-commit-message.css-truncate{max-width:300px}.checks-index-group .octicon{vertical-align:text-top}.checks-index-item:first-child::before{position:absolute;top:0;left:0;z-index:1;width:100%;height:5px;content:" ";background-image:linear-gradient(to bottom,rgba(47,54,61,0.1) 0%,hsla(0,0%,100%,0) 100%)}.checks-index-item:hover{background-color:#fff!important}.checks-index-item.selected{background-color:#fff!important}.checks-index-item.selected::after{position:absolute;top:0;bottom:0;left:0;display:block;width:3px;content:" ";background-color:#e36209}.checks-index-item .css-truncate-target{max-width:220px}.checks-index-item-icon{width:16px}.selected .checks-index-label{font-weight:600;color:#24292e}.checks-summary-meta .octicon{width:16px}.checks-results-items .octicon-fold{display:none}.checks-results-items .Details--on .octicon-fold{display:inline-block}.checks-results-items .Details--on .octicon-unfold{display:none}.check-annotation{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.check-annotation::after{position:absolute;top:-1px;bottom:-1px;left:0;display:block;width:4px;content:" "}.check-annotation .annotation-actions{top:4px;right:8px}.check-annotation .annotation-octicon{width:16px}.check-annotation.Details--on .Details-content--hidden{display:block!important}.diff-table .check-annotation{max-width:962px}.annotation-title{word-break:break-all}.check-annotation-failure::after{background-color:#d73a49}.check-annotation-failure .annotation-title{color:#d73a49}.check-annotation-warning::after{background-color:#ffd33d}.check-annotation-warning .octicon-alert{color:#dbab09}.check-annotation-warning .annotation-title{color:#b08800}.check-annotation-notice::after{background-color:#6a737d}.check-annotation-notice .annotation-title{color:#6a737d}.neutral-check{color:#959da5}.code-frequency .addition{fill:#2cbe4e;fill-opacity:1}.code-frequency .deletion{fill:#cb2431;fill-opacity:1}.cadd{font-weight:600;color:#28a745}.cdel{font-weight:600;color:#cb2431}.code-list .file-box{border:1px #e1e4e8 solid;border-radius:3px}.code-list em{padding:2px;margin:0 -2px;font-style:normal;font-weight:600;color:#24292e;background-color:rgba(255,255,140,0.5);border-radius:3px}.code-list .title{min-height:24px;margin:-3px 0 10px 38px;font-weight:600;line-height:1.2}.code-list .repo-specific .title, +.code-list .repo-specific .full-path{margin-left:0}.code-list .match-count, +.code-list .updated-at{margin:0;font-weight:400}.code-list .language{float:right;margin-left:10px;font-size:12px;color:rgba(51,51,51,0.75)}.code-list .avatar{float:left}.code-list .code-list-item + .code-list-item{border-top:1px solid #eee}.code-list .blob-num{padding:0}.code-list .blob-num::before{content:normal}.code-list .blob-num a{padding:0 10px;color:inherit}.code-list .blob-num a:hover{color:#0366d6}.code-list .blob-code{white-space:pre-wrap}.code-list .divider .blob-num, +.code-list .divider .blob-code{padding-top:0;padding-bottom:0;cursor:default;background-color:#f8fafd}.code-list .divider .blob-num{height:18px;padding:0 10px;line-height:15px;background-color:#f0f5fa}.code-list .full-path{margin:0 0 0 40px}.code-list .full-path .octicon-repo{color:#586069}.code-list .full-path .octicon-lock{color:#e9dba4}.code-list .full-path a{color:#6a737d}.code-list-item-private .file-box{border:1px solid #fadda5}.code-list-item-private .blob-num{background-color:#fffdef;border-right:1px solid #fadda5}.code-list-item-private .blob-num a{color:rgba(27,31,35,0.7)}.code-list-item-private .divider .blob-num, +.code-list-item-private .divider .blob-code{color:rgba(27,31,35,0.7);background-color:#fffdef}.codesearch-head.pagehead h1{width:250px;line-height:33px}.search-autocomplete-dropdown{min-width:240px}.search-autocomplete-dropdown .autocomplete-category-heading::after{position:absolute;width:100%;height:1px;margin-top:8px;content:"";background-color:#e1e4e8}.search-autocomplete-dropdown .autocomplete-keyword-only{background:#f6f8fa}.search-autocomplete-dropdown .autocomplete-text{color:#24292e}.search-autocomplete-dropdown .navigation-item{cursor:pointer}.search-autocomplete-dropdown .navigation-item[aria-selected="true"], .search-autocomplete-dropdown .navigation-item.navigation-focus{color:#fff;background-color:#0366d6;border-radius:3px}.search-autocomplete-dropdown .navigation-item[aria-selected="true"] .autocomplete-text, .search-autocomplete-dropdown .navigation-item.navigation-focus .autocomplete-text{color:#fff}@media (min-width: 768px){.advanced-search-form .flattened dt{width:230px}.advanced-search-form .flattened dt label{font-weight:400}.advanced-search-form .flattened dd{margin-left:250px}.advanced-search-form .form-checkbox{margin-left:250px}}.codesearch-results .code-list .title a{word-wrap:break-word}.codesearch-results .repo-list-item{border-bottom:0}.codesearch-results .repo-list-item + .repo-list-item{border-top:1px #e1e4e8 solid}.search-form-fluid .TableObject-item--primary{position:relative;padding-right:8px}.search-form-fluid .completed-query{position:absolute;top:7px;right:8px;left:8px;z-index:1;margin:0;overflow:hidden;white-space:nowrap}.search-form-fluid .completed-query span{opacity:0}.search-form-fluid .search-page-label{position:relative;display:block;font-weight:400;cursor:text}.search-form-fluid .search-page-label.focus .completed-query{opacity:0.6}.search-form-fluid .search-page-input{position:relative;z-index:2;min-height:0;padding:0;margin:0;background:none;border:0;box-shadow:none}.search-form-fluid .search-page-input:focus{box-shadow:none}.sort-bar{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid #f1f1f1}.sort-bar .sort-label{padding-right:5px;font-size:13px;font-weight:200;color:#666}.sort-bar .select-menu{float:right}.topics-row-container{height:30px;overflow:hidden}@media (max-width: 544px){.codesearch-pagination-container a:not(.next_page):not(.previous_page), + .codesearch-pagination-container .gap{display:none}.codesearch-pagination-container .previous_page, + .codesearch-pagination-container .next_page{width:100%}.codesearch-pagination-container .current{color:#586069;background:#fff;border-color:#e1e4e8}.codesearch-pagination-container .current::after{content:" of " attr(data-total-pages)}}.comment-apps-container{border-top-width:0}.comment-apps-container .comment-app-details[open] > .comment-app{color:#fff;background-color:#0366d6}.comment-apps .select-menu{bottom:36px}.comment-apps .select-menu .select-menu-button{background-color:#e1e4e8;box-shadow:0 0 0 4px #fafbfc}.comment-apps .select-menu .select-menu-button.selected{color:#fff;background-color:#0366d6}.comment-apps .select-menu .select-menu-button::after{display:none}.comment-apps .select-menu-modal{z-index:90}.write-content.focused .select-menu-button{box-shadow:0 0 0 4px #fff}.commit-activity-graphs .dots{display:none}.commit-activity-master{margin-top:20px}.is-graph-loading .commit-activity-master{display:none}rect{shape-rendering:crispedges}rect.max{fill:#f9c513}g.bar{fill:#28a745}g.mini{fill:#fb8532}g.active rect{fill:#b31d28}circle.focus{fill:#444d56}.dot text{fill:#444d56;stroke:none}.CommunityTemplate-header{height:40px}.CommunityTemplate-markdown{height:800px;overflow-y:scroll;font-size:14px}.CommunityTemplate-highlight{padding:2px 4px;margin:0;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-style:normal;font-weight:600;color:#24292e;cursor:pointer;background-color:#ffd33d;border-radius:3px}.CommunityTemplate-highlight--focus{color:#fff;background-color:#0366d6}.community-checklist .progress-bar{background:linear-gradient(to right,#ffd33d,#c5e300,#28a745);background-color:transparent}.community-checklist .progress{float:right;background-color:#f6f8fa}.community-checklist .checklist-dot{color:#dbab09}body.full-width-p0 .container{width:100%;padding-right:20px;padding-left:20px}body.full-width-p0 .container.new-discussion-timeline{padding-right:0;padding-left:0}.compare-cutoff, +.diff-cutoff{padding:8px 0;margin:5px 0;font-weight:600;color:#4c4a42;text-align:center;background-color:#fff9ea;border:solid 1px #dfd8c2;border-radius:3px}span.no-nl-marker{position:relative;color:#cb2431;vertical-align:middle}.symlink .no-nl-marker{display:none}.existing-pull{margin:10px 0}.existing-pull .list-group-item::before{display:table;content:""}.existing-pull .list-group-item::after{display:table;clear:both;content:""}.existing-pull .existing-pull-contents{float:left;width:680px}.existing-pull .existing-pull-button{float:right;margin-top:3px}.existing-pull .existing-pull-number{font-weight:400;color:#aaa}.existing-pull .css-truncate{max-width:700px}.existing-pull .css-truncate p{display:inline}.compare-pr-placeholder{padding:15px;margin:15px 0;font-size:14px;color:#4c4a42;background-color:#fff9ea;border:solid 1px #dfd8c2;border-radius:3px}.compare-pr-placeholder p{margin:7px 0;color:#6d6c60}.compare-pr-placeholder .btn{margin-right:10px;margin-bottom:-2px}.compare-pr-placeholder .help-link{padding:3px;margin-top:5px;margin-right:-3px;color:#9c997d;text-decoration:none}.compare-pr .new-pr-form{display:none}.compare-pr .contributing{display:none}.compare-pr.open .compare-pr-placeholder{display:none}.compare-pr.open .new-pr-form{display:block}.compare-pr.open .contributing{display:block}.contact-github textarea{height:100px;resize:vertical}.contact-github .contact-checklist > li{margin:5px 0 5px 18px;list-style-position:outside}.documentation-results-wrapper{position:relative;top:-19px}.documentation-results{position:absolute;top:0;z-index:2;width:400px;margin-top:5px;box-shadow:0 0 5px rgba(0,0,0,0.2)}.documentation-results ul{width:100%}.documentation-results ul li:first-child a{border-top-left-radius:3px;border-top-right-radius:3px}.documentation-results .documentation-results-footer a{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.documentation-results a{display:block;padding:5px 10px;font-weight:600;color:#333;text-decoration:none;cursor:pointer;background-color:#fff;border:solid #ddd;border-width:0 1px 1px;outline:none}.documentation-results a:hover{color:#fff;background-color:#3586c3}.documentation-results a.selected{color:#fff;background-color:#3586c3}ul.documentation-results-group{list-style-type:none}.contact-form-extras{display:none}.select-menu-item{text-align:left;background-color:#fff;border-top:0;border-right:0;border-left:0}.timeline-jump-to-menu{left:-85px;z-index:80}.contributions-setting-menu{z-index:80;width:330px}.calendar-graph{height:126px;padding:5px 0 0;text-align:center}.calendar-graph.days-selected rect.day{opacity:0.5}.calendar-graph.days-selected rect.day.active{opacity:1}.calendar-graph .dots{width:64px;height:64px;margin:20px auto 0}.calendar-graph text.month{font-size:10px;fill:#767676}.calendar-graph text.wday{font-size:9px;fill:#767676}.graph-before-activity-overview{border-top-left-radius:3px;border-top-right-radius:3px}.activity-overview-box{border-top-left-radius:0;border-top-right-radius:0}.contrib-footer{padding:0 10px 12px;font-size:11px}.contrib-legend{float:right}.contrib-legend .legend{position:relative;bottom:-1px;display:inline-block;margin:0 5px;list-style:none}.contrib-legend .legend li{display:inline-block;width:10px;height:10px}.contrib-square{font-size:22px;line-height:0.9;color:#cce888}.contribution-activity h2{margin:30px 0 15px;font-size:18px;font-weight:400}.contribution-activity .select-menu-button{position:relative;top:-4px}.contribution-activity.loading .contribution-activity-listing{display:none}.contribution-activity.loading .contribution-activity-show-more{display:none}.contribution-activity.loading .contribution-activity-spinner{display:block}.contribution-activity-spinner{display:none;width:64px;height:64px;margin:20px auto 0}.contribution-activity-spinner.next{margin:0 auto}ul.simple-conversation-list a.meta{color:#586069}li.contribution{padding:10px 0;list-style:none}li.contribution h3{display:inline-block;margin:0;font-size:14px}li.contribution .cmeta{display:block;font-size:12px}li.contribution .d{color:#c00}li.contribution .a{color:#8cac29}li.contribution .num{color:#586069}.activity-overview-axis, +.activity-overview-point{stroke:#6cb267}.halloween-activity-overview .activity-overview-axis, +.halloween-activity-overview .activity-overview-point{stroke:#fe9600}.activity-overview-label{fill:#586069}.activity-overview-percentage{font-size:10px;fill:#959da5}.tint-box{position:relative;margin-bottom:10px;background:#f6f8fa;border-radius:6px}.tint-box.transparent{background:#fff}.tint-box .activity{padding-top:100px;margin-top:0}.contrib-person path{fill:#fb8532}.contrib-person .midlabel{fill:#959da5}.coupons .setup-plans td img{margin-top:-2px;vertical-align:middle}.coupons .coupon-form-body{width:270px;padding:20px;margin:100px auto 60px;font-size:14px;text-align:center;background-color:#fff;background-image:linear-gradient(#fefefe,#fafafa);border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.075),inset 1px 0 #fff}.coupons .coupon-form-body .input-block{margin-bottom:15px}.coupons .coupon-form-body .btn{display:block;width:100%}.coupon-icon{width:80px;height:80px;margin:0 auto 15px;color:#0366d6;border:1px solid #dedede;border-radius:40px}.coupon-icon .octicon{margin-top:15px;margin-right:2px}.coupons-list-options{margin-bottom:15px}.coupons-list-options .select-menu, +.coupons-list-options .BtnGroup{display:inline-block;margin-right:10px}.coupons-list-options .pagination{float:right;margin:0}.user-repos .mini-repo-list-item{padding-right:6px}.user-repos .mini-repo-list-item .repo-and-owner{max-width:100%}.user-repos .mini-repo-list-item .owner{max-width:145px}.repo-private-icon{fill:#dbab09}.dashboard-rollup-items > .dashboard-rollup-item{border-top:1px solid #e1e4e8}@keyframes broadCastMaskFade{0%{opacity:0}30%{opacity:1}70%{opacity:1}100%{opacity:0}}.github-jobs-logo:hover{text-decoration:none}.github-jobs-logo strong{display:inline-block;width:62px;height:12px;text-indent:-9999px;vertical-align:middle;background:url("/images/modules/jobs/logo.png") 0 0 no-repeat;background-size:62px auto}.dashboard h1{margin-bottom:0.5em;font-size:160%}.dashboard h1 a{font-size:70%;font-weight:400}.dashboard .notice{padding:15px;margin-top:0;margin-bottom:0;text-align:center}.news-full, +.page-profile .news{float:none;width:auto}.dashboard-break-word{-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-break:break-word}.news .error-message{display:none}.news .is-error .loading-message{display:none}.news .is-error .error-message{display:block}.news .bio g-emoji, +.news .repo-description g-emoji{display:inline-block}.account-switcher-truncate-override{width:calc(100% - 36px);max-width:100%!important}.dashboard-underlined-link:hover, +.dashboard-underlined-link:hover *{text-decoration:underline}.dashboard-notice{position:relative;padding:15px 15px 15px 55px;margin-bottom:20px;font-size:14px;background-color:#fafbfc;border:solid 1px #d1d5da;border-radius:3px}.dashboard-notice .dismiss{position:absolute;top:10px;right:10px;width:16px;height:16px;color:#959da5;cursor:pointer}.dashboard-notice .dismiss:hover{color:#586069}.dashboard-notice .notice-icon{position:absolute;top:15px;left:15px}.dashboard-notice .octicon-organization{color:#0366d6}.dashboard-notice h2{margin-top:9px;margin-bottom:16px;font-size:18px;font-weight:400;color:#24292e}.dashboard-notice p.no-title{padding-right:5px}.dashboard-notice .inset-figure{float:right;margin-bottom:15px;margin-left:20px}.dashboard-notice ul{margin-left:18px}.dashboard-notice li{padding-bottom:15px}.dashboard-notice .coupon{padding:10px;margin:15px 0;font-size:20px;font-weight:600;text-align:center;background:#fff;border:1px dashed #dbedff}.dashboards-overview-lead{width:700px}.dashboards-overview-cards .boxed-group{width:100%;margin:10px 0}.dashboards-overview-cards .boxed-group .graph-canvas path{stroke-opacity:0.5}.dashboards-overview-cards .is-no-activity .blankslate{display:block}.dashboards-overview-cards .is-no-activity .dashboards-overview-graph{display:none}.dashboards-overview-cards .blankslate{display:none;padding-top:47px;background-color:#fff;border:0;box-shadow:none}.dashboards-overview-cards .octicon-arrow-down, +.dashboards-overview-cards .octicon-arrow-up{display:none}.dashboards-overview-cards .is-increase .octicon-arrow-up{display:inline-block}.dashboards-overview-cards .is-decrease .octicon-arrow-down{display:inline-block}.dashboards-overview-cards .octicon-arrow-down{color:#cb2431}.dashboards-overview-cards .octicon-arrow-up{color:#1db34f}.dashboards-overview-cards .graph-canvas .dots{padding:43px 0}.dashboards-overview-cards .summary-stats{height:78px}.dashboards-overview-cards .summary-stats .metric-0{color:#1db34f}.dashboards-overview-cards .summary-stats .metric-1{color:#0366d6}.dashboards-overview-cards .summary-stats .totals-num{margin:0 7px}.dashboards-overview-cards .summary-stats .single{width:100%}.dashboards-overview-cards .dashboards-overview-graph{height:160px}.dashboards-overview-cards .dashboards-overview-graph path{fill:none;stroke-width:2}.dashboards-overview-cards .dashboards-overview-graph path.metric-0{stroke:#1db34f}.dashboards-overview-cards .dashboards-overview-graph path.metric-1{stroke:#1d7fb3}.dashboards-overview-cards .dashboards-overview-graph .y line{stroke:#1db34f}.dashboards-overview-cards .dashboards-overview-graph .y.unique line{stroke:#1d7fb3}.dashboards-overview-cards .dashboards-overview-graph .overlay{fill-opacity:0}.dashboards-overview-cards .metric-0 circle{fill:#1db34f;stroke:#fff;stroke-width:2}.dashboards-overview-cards .dots.metric-1 circle{fill:#1d7fb3;stroke:#fff;stroke-width:2}dl.form.developer-select-account{margin-top:0}.developer-wrapper .setup-info-module .features-list{margin-left:16px}.developer-wrapper .setup-info-module .features-list .octicon{margin-left:-17px}.developer-thanks h2{font-size:38px;font-weight:400}.developer-thanks .hook{margin-top:2px;margin-bottom:30px;font-size:18px;font-weight:300;color:#666}.developer-thanks-image{position:relative;bottom:-45px;float:left;width:400px}.developer-thanks-section{margin:130px 0 0 470px}.developer-next-steps{font-size:18px;font-weight:300;list-style:none}.developer-next-steps li{margin-top:10px}.developer-next-steps li:first-child{margin-top:0}.developer-next-steps .octicon{margin-right:10px;color:#28a745;vertical-align:middle}.deployments-timeline{border-bottom:solid 2px #e6ebf1}.deployments-timeline-item{border-left:solid 2px #e6ebf1}.deployments-timeline-icon{left:-1px}.deployments-timeline-icon.is-error, .deployments-timeline-icon.is-failure{color:#cb2431}.deployments-timeline-icon.is-active{color:#28a745}.deployments-timeline-icon.is-inactive{color:#6a737d}.deployments-timeline-icon.is-pending, .deployments-timeline-icon.is-queued, .deployments-timeline-icon.is-in_progress{color:#b08800}.donut-chart > .error, +.donut-chart > .cancelled, +.donut-chart > .action_required, +.donut-chart > .timed_out, +.donut-chart > .failure{fill:#cb2431}.donut-chart > .expected, +.donut-chart > .queued, +.donut-chart > .in_progress, +.donut-chart > .pending{fill:#dbab09}.donut-chart > .success{fill:#2cbe4e}.donut-chart > .neutral{fill:#959da5}.survey-question-form .other-text-form, +.survey-question-form .other-text-form-block{display:none;margin-top:0}.survey-question-form.is-other-selected .other-text-form{display:inline-block}.survey-question-form.is-other-selected .other-text-form-block{display:block}.setup-header .large-file-storage-header{font-size:44px}.early-acccess-setup-form .form-group{margin-top:0;margin-bottom:30px}.early-acccess-setup-form select{display:block;width:200px}.early-access-setup-list{padding:0 15px 15px;margin:0;font-size:14px}.early-access-setup-list .early-access-setup-list-item{margin-top:10px;margin-left:20px}.early-access-setup-list .early-access-setup-list-item:first-child{margin-top:0}.early-access-thanks-wrapper{position:relative;z-index:1;height:80vh;margin-bottom:-41px;background-color:#fcfcfc;border-bottom:1px solid #ddd}.early-access-thanks-content{position:relative;top:50%;width:500px;margin:0 auto;transform:translateY(-50%)}.early-access-thanks-title{margin-top:0;font-weight:400}.early-access-thanks-lead{margin-top:0;margin-bottom:0}.eap-error-state-title{margin-top:0}.ghe-license-status{padding:40px 0;font-size:16px;text-align:center}.ghe-license-status .octocat{width:225px;margin-bottom:20px}.ghe-license-status h1{margin-bottom:10px}.ghe-license-status p{margin-bottom:5px;color:#586069}.ghe-license-expiry-icon{margin:5px 10px 0 0;color:#ddb38a}.explore-content{margin-top:-15px}.explore-content .blankslate{margin-top:15px}.explore-pjax-container{position:relative}.repo-snipit{display:inline-block;margin-top:7px}.repo-snipit:hover{text-decoration:none}.repo-snipit .octicon{font-size:14px;color:#586069}.repo-snipit-name{max-width:200px;color:#666}.repo-snipit-description{max-width:300px;color:#586069}.repo-snipit:hover .repo-snipit-name, +.repo-snipit:hover .repo-snipit-description{color:#0366d6}.newsletter-frequency-choice{font-weight:400;cursor:pointer;border:1px solid #eee;border-radius:4px}.newsletter-frequency-choice .notice{position:absolute;right:0;bottom:1em;left:0;z-index:-1;font-weight:600;color:#28a745;text-align:center;opacity:0}.newsletter-frequency-choice .notice.visible{bottom:-2em;opacity:1;transition:opacity 0.15s ease-in-out}.newsletter-frequency-choice h3{padding:10px;margin:0;font-weight:400;text-align:center;background-color:#fafbfc;border-bottom:1px solid #eee}.newsletter-frequency-choice h3 input{position:relative;top:-2px;margin:0 3px 0 -19px}.newsletter-frequency-choice p{margin:15px}.newsletter-frequency-choice:hover{border-color:#0366d6}.newsletter-frequency-choice:hover h3{color:#fff;background-color:#0366d6;border-color:#0366d6}.newsletter-frequency-choice.selected{border-color:#28a745;box-shadow:0 0 5px rgba(0,0,0,0.2)}.newsletter-frequency-choice.selected h3{color:#fff;background-color:#28a745;border-color:#28a745}@media (min-width: 1012px){.col-lg-9 .Collection{max-width:744px}}@media (min-width: 1012px){.Spotlight{margin-top:100px}}.Spotlight-text{z-index:1}.Spotlight-blur{z-index:0;opacity:0.9}@media (min-width: 1012px){.Spotlight-blur{opacity:1;-webkit-mask-image:linear-gradient(0deg,#000,#000 75%,transparent);mask-image:linear-gradient(0deg,#000,#000 75%,transparent)}}@media (min-width: 1280px){.Spotlight-blur--toleft{-webkit-mask-image:linear-gradient(to left,#000,#000 75%,transparent);mask-image:linear-gradient(to left,#000,#000 75%,transparent)}}@media (min-width: 1012px){.width-lg-auto{width:auto!important}}@media (min-width: 1280px){.width-xl-full{width:100%!important}}@media (min-width: 1012px){.height-lg-full{height:100%!important}}@media (min-width: 1280px){.height-xl-auto{height:auto!important}}.exploregrid{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;list-style:none}.exploregrid-item-wrap{display:flex;flex-direction:column}.exploregrid-item{flex:1;position:relative;display:block;height:100%;padding-top:24px;padding-bottom:64px;font-size:14px;color:#555;border:1px solid rgba(0,0,0,0.075);border-bottom-color:rgba(0,0,0,0.125);border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,0.05),0 5px 10px rgba(0,0,0,0.05);transition:border-color 0.1s ease-in-out,box-shadow 0.1s ease-in-out}.exploregrid-item:hover{text-decoration:none;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.15);box-shadow:0 1px 3px rgba(0,0,0,0.05),0 8px 15px rgba(0,0,0,0.1)}.exploregrid-item:hover .exploregrid-item-title{color:#0366d6}.exploregrid-item:hover .exploregrid-item-header{opacity:1}.exploregrid-item-mini{float:left;width:100%;height:auto;margin:0 0 15px}.exploregrid-item-mini .exploregrid-item-header{height:10px}.exploregrid-item-mini .exploregrid-item-title{font-size:16px}.exploregrid-item-header{position:absolute;top:0;left:0;width:100%;height:18px;background-color:#f5f5f5;border:1px solid rgba(0,0,0,0.1);border-top-left-radius:4px;border-top-right-radius:4px;opacity:0.8;transition:opacity 0.1s ease-in-out}.exploregrid-item-title{margin-top:0;margin-bottom:5px;font-size:20px;font-weight:400;line-height:1.2;color:#24292e}.fakelogin{position:fixed;top:0;z-index:1000;width:100%;font-size:14px;line-height:34px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(153,0,0,0.25);background-image:linear-gradient(#dc5f59,#b33630);border-bottom:1px solid #900}.fakelogin + .Header{margin-top:35px}.fakelogin + .server-stats{margin-top:35px}.fakelogin .cancel-impersonation{color:#fff;text-decoration:underline}.file{position:relative;margin-top:16px;margin-bottom:16px;border:1px solid #ddd;border-radius:3px}.file .data.empty{padding:5px 10px;color:#586069}.file:not(.open) .file-header.file-header--expandable{border-bottom:0}.file .data.suppressed, +.file.open .image{display:none}.file.open .data.suppressed{display:block}.file .image{position:relative;padding:30px;text-align:center;background-color:#ddd}.file .image table{margin:0 auto}.file .image td{padding:0 5px;color:#888;text-align:center;vertical-align:top}.file .image td img{max-width:100%}.file .image .border-wrap{position:relative;display:inline-block;line-height:0;background-color:#fff;border:1px solid #6a737d}.file .image a{display:inline-block;line-height:0}.file .image img, +.file .image canvas{max-width:600px;background:url("/images/modules/commit/trans_bg.gif") right bottom #eee;border:1px solid #fff}.file .image .view img, +.file .image .view canvas{position:relative;top:0;right:0;max-width:inherit;background:url("/images/modules/commit/trans_bg.gif") right bottom #eee}.file .image .view > span{vertical-align:middle}.file .empty{background:none}.file-header{padding:5px 10px;background-color:#fafbfc;border-bottom:1px solid #e1e4e8;border-top-left-radius:2px;border-top-right-radius:2px}.file-header::before{display:table;content:""}.file-header::after{display:table;clear:both;content:""}.file-actions{float:right;padding-top:2px;font-size:13px}.file-actions select{margin-left:5px}.file-info{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;line-height:32px}.file-info .octicon{vertical-align:text-bottom}.file-info-divider{display:inline-block;width:1px;height:18px;margin-right:3px;margin-left:3px;vertical-align:middle;background-color:#ddd}.file-mode{text-transform:capitalize}.show-file-notes{display:none}.comments-indicator{display:none}.has-inline-notes .show-file-notes{display:inline-block;margin-right:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.has-inline-notes.hide-file-notes-toggle .show-file-notes{display:none!important}.has-inline-notes.hide-file-notes-toggle .comments-indicator{display:inline-block}.file-blankslate{border:0;border-radius:0 0 2px 2px}.diff-progressive-loader{min-height:150px}.load-diff-button, +.load-diff-retry{z-index:1;min-height:32px}.diff-placeholder-svg{clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%)}.hidden-diff-reason{z-index:2}.graphs h2.ghead::after{display:block;height:0;clear:both;visibility:hidden;content:"."}.graphs.wheader h2{padding:1px}.graphs .area{fill:#28a745;fill-opacity:0.5}.graphs .path{fill:none;stroke:#28a745;stroke-opacity:1;stroke-width:2px}.graphs .dot{fill:#28a745;stroke:#1e7e34;stroke-width:2px}.graphs .dot.padded{stroke:#fff;stroke-width:1px}.graphs .dot.padded circle:hover{fill:#0366d6}.graphs .d3-tip{fill:#24292e}.graphs .d3-tip text{font-size:11px;fill:#fff}.graphs .dir{float:right;padding-top:5px;font-size:12px;font-weight:400;line-height:100%;color:#6a737d}.graphs .selection .overlay{visibility:none}.graphs .selection .selection{fill:#24292e;fill-opacity:0.1;stroke:#24292e;stroke-dasharray:3 3;stroke-opacity:0.4;stroke-width:1px;shape-rendering:crispedges}.graph-filter h3{display:inline-block;font-size:24px;font-weight:300}.graph-filter .info{margin-bottom:20px;color:#586069}.graph-canvas .activity{width:400px;padding:10px;margin:100px auto 0;color:#2f363d;text-align:center;border-radius:3px}.graph-canvas .dots{margin:0 auto}.graph-canvas > .activity{display:none}.graph-canvas .axis{font-size:10px}.graph-canvas .axis line{stroke:rgba(27,31,35,0.1);shape-rendering:crispedges}.graph-canvas .axis path{display:none}.graph-canvas .axis .zero line{stroke:#0366d6;stroke-dasharray:3 3;stroke-width:1.5}.graph-canvas .graph-loading, +.graph-canvas .graph-error, +.graph-canvas .graph-no-usable-data, +.graph-canvas .graph-empty{display:none}.graph-canvas.is-graph-loading > .activity, +.graph-canvas.is-graph-without-usable-data > .activity, +.graph-canvas.is-graph-empty > .activity{display:block}.graph-canvas.is-graph-loading .graph-loading, +.graph-canvas.is-graph-empty .graph-empty, +.graph-canvas.is-graph-without-usable-data .graph-no-usable-data, +.graph-canvas.is-graph-load-error .graph-error{display:block}.svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,0.8);border-radius:3px}.svg-tip strong{color:#dfe2e5}.svg-tip.is-visible{display:block}.svg-tip::after{position:absolute;bottom:-10px;left:50%;width:5px;height:5px;box-sizing:border-box;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,0.8)}.svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.svg-tip.comparison li{display:inline-block;padding:10px}.svg-tip.comparison .metric-0{border-top:3px solid #28a745;border-right:1px solid #24292e}.svg-tip.comparison .metric-1{border-top:3px solid #2188ff}.svg-tip-one-line{white-space:nowrap}.LoadingDependencies{position:absolute;left:0;width:100%;animation:fadeOut;animation-duration:0.6s;animation-fill-mode:forwards;animation-timing-function:ease-in}.LoadingDependencies--loading{position:relative}.LoadingDependencies--loading .octicon{opacity:0;animation:dropBox;animation-duration:1.25s;animation-fill-mode:forwards;animation-timing-function:linear;animation-delay:1s;animation-iteration-count:infinite}.LoadingDependencies--loading .octicon:nth-child(2){position:absolute;left:calc(50% - 27px);animation-delay:1.61s}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes dropBox{0%{opacity:1;transform:translateY(-110%)}7%{opacity:1;transform:translateY(20%);transform:translateX(0)}80%{opacity:1}100%{opacity:0;transform:translateX(-250%)}}.getting-started .main-content .container{width:420px}.getting-started .list-group-item{background:#fff}.getting-started .list-group-item .octicon{color:#bbb}.getting-started .list-group-item .octicon-lead{width:30px}.getting-started .list-group-item:hover, .getting-started .list-group-item:focus{background:#fafbfc}.getting-started .link-text{color:#24292e}.getting-started .link-text strong{color:#0366d6}.topic-tag{display:inline-block;padding:0.3em 0.9em;margin:0 0.5em 0.5em 0;white-space:nowrap;background-color:#f1f8ff;border-radius:3px}.topic-tag-link:hover{text-decoration:none;background-color:#def}.delete-topic-button{display:inline-block;width:26px;color:#6a737d;background-color:#f1f8ff;border-top:0;border-right:0;border-bottom:0;border-left:1px solid #b4d9ff;border-top-right-radius:3px;border-bottom-right-radius:3px}.delete-topic-button:hover{background-color:#def}.invalid-topic .delete-topic-button{color:#86181d;background-color:#ffdce0;border-left-color:#cea0a5}.invalid-topic .delete-topic-button:hover{background-color:#ffc8ce}.topic-tag-action{display:inline-flex;align-items:center;padding-left:0.8em;margin:0.4em 0.4em 0 0;background-color:#f1f8ff;border-radius:3px}.topic-tag-action.invalid-topic{color:#86181d;background-color:#ffdce0;border-color:#cea0a5}.topic-tag-action .add-topic-button, +.topic-tag-action .remove-topic-button{display:inline-block;width:26px;font-size:15px;color:#6a737d;background-color:#f1f8ff;border-top:0;border-right:0;border-bottom:0;border-left:1px solid #b4d9ff}.topic-tag-action .add-topic-button:hover, +.topic-tag-action .remove-topic-button:hover{color:#fff}.topic-tag-action .add-topic-button:hover{background-color:#28a745}.topic-tag-action .remove-topic-button{border-right:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.topic-tag-action .remove-topic-button:hover{background-color:#d73a49}.topic-input-container .tag-input{width:908px;cursor:text}.topic-input-container .tag-input.org-repo-tag-input{width:100%}.topic-input-container .tag-input .tag-input-inner{min-height:26px;background-image:none}.topic-input-container .topic-tag{margin-top:2px}.repository-topics-container .list-topics-container{display:inline-flex;flex-wrap:wrap;align-items:baseline}.topic .css-truncate-target{max-width:75%}.topic-list .topic-list-item + .topic-list-item{border-top:1px #e1e4e8 solid}.team-breadcrumb .team-breadcrumb-item{display:inline-block}.team-breadcrumb .team-breadcrumb-item::after{padding-right:0.5em;padding-left:0.5em;color:#e1e4e8;content:"/"}.team-breadcrumb .team-breadcrumb-item-selected::after{content:none}.team-discussions-container{min-height:100vh}.team-left-column{max-width:100%}@media (min-width: 768px){.team-left-column{max-width:350px}}.team-left-column .team-avatar{width:80px;height:80px}@media (min-width: 768px){.team-left-column .team-avatar{width:140px;height:140px}}.team-discussions{max-width:768px}.team-discussions .previewable-comment-form .comment{border:0}.discussion-post{opacity:1;transition:opacity 400ms}.discussion-post .timeline-comment::after, +.discussion-post .timeline-comment::before{display:none}.discussion-post .post-author{margin-top:-6px}.discussion-post .post-author-timestamp{margin-top:-3px}.discussion-post.fade-out{opacity:0}.discussion-post .timeline-inline-comments{background:#fafbfc}.discussion-post .team-discussion-timeline::before{bottom:20px}.discussion-post .reply-comment:first-child{border-top:1px solid #e1e4e8}.discussion-post .reply-comment:first-child .review-comment{padding-top:16px}.discussion-post .reply-comment .review-comment{padding:8px 16px}.discussion-post .reply-comment .review-comment.is-comment-editing{padding:0;background:#fafbfc}.discussion-post .comment .comment-reactions{margin-left:16px;border-top:0}.discussion-post .comment .reaction-summary-item{margin-bottom:16px}.discussion-post .reaction-summary-item:not(.add-reaction-btn){padding:0 8px;font-size:12px;line-height:26px;border:1px solid #d2dff0;border-radius:3px}.discussion-post .reaction-summary-item:not(.add-reaction-btn) .emoji{font-size:16px;vertical-align:sub}.discussion-post .reaction-summary-item:not(.add-reaction-btn) + .reaction-summary-item{margin-left:8px}.discussion-post .reply-comments-holder{position:relative}.discussion-post .reply-comments-holder::before{position:absolute;top:51px;bottom:0;left:29px;width:2px;content:"";background-color:#e1e4e8}.discussion-post .add-reaction-btn{padding:4px 10px}.discussion-post .pin-btn:disabled{pointer-events:none}.discussion-post .pinned{color:#f66a0a;opacity:1}.discussion-post .loading-spinner{display:none;float:left;margin-top:12px}.discussion-post .loading .loading-spinner{display:block}.discussion-post ~ .blankslate{display:none}.team-discussion-new-post .review-thread-reply-button:disabled{cursor:inherit;background-color:#f6f8fa;border:0;box-shadow:none}.team-project-suggestion-number{font-weight:300;color:#a3aab1}.team-discussion-nav-disabled{pointer-events:none}.header-search-wrapper{display:table;width:100%;max-width:100%;min-height:0;padding:0;font-weight:400;vertical-align:middle}.header-search-wrapper.header-search-wrapper-jump-to .header-search-scope{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.header-search-input{display:table-cell;width:100%;min-height:26px;padding-top:0;padding-bottom:0;background:none;border:0;box-shadow:none}.header-search-input:focus{border:0;box-shadow:none}.header-search-input:focus ~ .header-search-key-slash{display:none!important}.header-search-input::-ms-clear{display:none}.header-search-scope{display:none;width:1%;padding-right:8px;padding-left:8px;font-size:12px;color:#586069;white-space:nowrap;vertical-align:middle;border-right:1px solid #eaecef;border-top-left-radius:3px;border-bottom-left-radius:3px}.header-search-scope:empty + .header-search-input{width:100%}.header-search-scope:hover{color:#fff;background-color:hsla(0,0%,100%,0.12)}.scoped-search .header-search-scope{display:table-cell}.scoped-search .form-control.focus .header-search-scope{color:#0366d6;background-color:#c0ddfe;border-color:#8ec2fd}.jump-to-field-active{color:#24292e!important;background-color:#fafbfc}.jump-to-field-active:-ms-input-placeholder{color:#586069!important}.jump-to-field-active::-ms-input-placeholder{color:#586069!important}.jump-to-field-active::placeholder{color:#586069!important}.jump-to-field-active ~ .header-search-key-slash{display:none}.jump-to-field-active.jump-to-dropdown-visible{border-bottom-right-radius:0;border-bottom-left-radius:0}.jump-to-suggestions{top:30px;left:0;z-index:35;width:100%;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;box-shadow:0 4px 10px rgba(0,0,0,0.1)}.jump-to-suggestions-path{min-width:0;min-height:44px;color:#1b1f23}.jump-to-suggestions-path .jump-to-octicon{width:28px;color:#6a737d}.jump-to-suggestions-path .jump-to-suggestion-name{max-width:none}.jump-to-suggestions-path mark{font-weight:600;background-color:transparent}.jump-to-suggestions-results-container .navigation-item{border-bottom:1px solid #e1e4e8}.jump-to-suggestions-results-container .navigation-item:last-child{border-bottom:0}.jump-to-suggestions-results-container .d-on-nav-focus{display:none}.jump-to-suggestions-results-container [aria-selected="true"] .jump-to-octicon, +.jump-to-suggestions-results-container .navigation-focus .jump-to-octicon{color:#fff}.jump-to-suggestions-results-container [aria-selected="true"] .jump-to-suggestions-path, +.jump-to-suggestions-results-container .navigation-focus .jump-to-suggestions-path{color:#fff;background:#0366d6}.jump-to-suggestions-results-container [aria-selected="true"] mark, +.jump-to-suggestions-results-container .navigation-focus mark{color:#fff}.jump-to-suggestions-results-container [aria-selected="true"] .d-on-nav-focus, +.jump-to-suggestions-results-container .navigation-focus .d-on-nav-focus{display:block}.Header{z-index:32;padding-top:12px;padding-bottom:12px;color:hsla(0,0%,100%,0.75);background-color:#24292e}.server-stats + .Header{box-shadow:inset 0 1px 0 hsla(0,0%,100%,0.075)}.Header .header-search-scope{font-size:inherit;line-height:28px;color:hsla(0,0%,100%,0.75);border-right-color:#282e34}.Header .header-search-wrapper{min-height:30px;font-size:inherit;color:#fff;background-color:hsla(0,0%,100%,0.125);border:0;box-shadow:none}.Header .header-search-wrapper .truncate-repo-scope{max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Header .header-search-wrapper.focus{background-color:hsla(0,0%,100%,0.175);box-shadow:none}.Header .header-search-wrapper.focus .header-search-scope{color:#fff;background-color:hsla(0,0%,100%,0.075);border-right-color:#282e34}.Header .header-search-input{min-height:30px;font-size:16px;color:inherit}@media (min-width: 1012px){.Header .header-search-input{font-size:inherit}}.Header .header-search-input:-ms-input-placeholder{color:hsla(0,0%,100%,0.75)}.Header .header-search-input::-ms-input-placeholder{color:hsla(0,0%,100%,0.75)}.Header .header-search-input::placeholder{color:hsla(0,0%,100%,0.75)}.Header .dropdown-menu{width:300px}.Header .notification-indicator:hover::after{content:none}@media (min-width: 1012px){.Header .notification-indicator:hover::after{content:attr(aria-label)}}.page-responsive .HeaderMenu{display:none;clear:both}@media (min-width: 1012px){.page-responsive .HeaderMenu{display:block;clear:none}}.page-responsive .HeaderMenu .header-search{float:none;width:auto;max-width:none;padding-top:16px;padding-bottom:16px;margin-right:0;border-top:1px solid #444d56}@media (min-width: 1012px){.page-responsive .HeaderMenu .header-search{float:left;width:300px;padding-top:4px;padding-bottom:4px;border-top:0}}.open .HeaderMenu{display:block}.HeaderMenu .header-search{width:300px;padding-top:3px;padding-bottom:3px;font-size:13px}.read-only-mode-banner{text-align:center;background-color:#f8e45f;border-bottom-color:#f6dc2e}.header-logo-invertocat{margin:-1px 15px -1px -2px;color:#fff;white-space:nowrap}.header-logo-invertocat .octicon-mark-github{float:left}.header-logo-invertocat:hover{color:#fff;text-decoration:none}.header-logo-subbrand{float:left;margin-left:6px;font-size:16px;font-weight:600;line-height:30px}.header-logo-wordmark{position:relative;float:left;height:26px;margin-right:15px;color:#fff}.header-logo-wordmark .octicon{float:left}.header-logo-wordmark:hover{color:#fff}.header-actions{float:right;margin-top:-3px;margin-bottom:-3px}.header-actions .btn{margin-left:5px}.notification-indicator{color:hsla(0,0%,100%,0.75)}.notification-indicator .mail-status{position:absolute;top:-6px;left:6px;z-index:2;display:none;width:14px;height:14px;color:#fff;background-image:linear-gradient(#54a3ff,#006eed);background-clip:padding-box;border:2px solid #24292e;border-radius:50%}.notification-indicator .mail-status.unread{display:inline-block}.notification-indicator:hover .mail-status{text-decoration:none;background-color:#0366d6}.HeaderNavlink{display:block;color:#fff}.page-responsive .HeaderNavlink{border-top:1px solid #444d56}@media (min-width: 1012px){.page-responsive .HeaderNavlink{border-top:0}}.HeaderNavlink:hover, .HeaderNavlink:focus{color:hsla(0,0%,100%,0.75);text-decoration:none}.HeaderNavlink:hover .dropdown-caret, .HeaderNavlink:focus .dropdown-caret{border-top-color:hsla(0,0%,100%,0.75)}.HeaderNavlink.selected{color:#fff}.HeaderNavlink.selected.js-menu-target{border-bottom-color:transparent}.HeaderNavlink.selected.tooltipped::before, .HeaderNavlink.selected.tooltipped::after{display:none}.user-nav .octicon{width:16px}.user-nav .octicon-plus{margin-right:1px}.user-nav .dropdown-menu{width:180px;margin-top:8px}.header-nav-current-user{padding-bottom:0;font-size:inherit}.header-nav-current-user .css-truncate-target{max-width:100%}.header-nav-current-user .user-profile-link{color:#24292e}.unsupported-browser{color:#211e14;background-image:linear-gradient(#feefae,#fae692);border-bottom:1px solid #b3a569}.mobile-banner button.switch-to-mobile{display:block;width:100%;padding:30px 0 45px;font-size:60px;font-weight:600;color:#eaeaea;text-align:center;background-color:#444;border:0}.hooks-listing .boxed-group-action.select-menu{z-index:auto}.hooks-listing .boxed-group-inner{padding:0 10px;margin-bottom:10px}.hook-item a:hover{text-decoration:none}.hook-item .item-status{float:left;width:16px;margin-right:8px;text-align:center}.hook-item .description{color:#6a737d}.hook-item .description .css-truncate-target{max-width:160px}.hook-item .icon-for-success, +.hook-item .icon-for-failure, +.hook-item .icon-for-pending, +.hook-item .icon-for-mute, +.hook-item .icon-for-inactive{display:none}.hook-item.success .icon-for-success{display:inline-block;color:#28a745}.hook-item.failure .icon-for-failure{display:inline-block;color:#cb2431}.hook-item.pending .icon-for-pending{display:inline-block;color:#6a737d}.hook-item.inactive .icon-for-inactive{display:inline-block;color:#6a737d}.hook-item.mute .icon-for-mute{display:inline-block;color:#6a737d}.hook-item .icon-for-enabled, +.hook-item .icon-for-disabled{display:none}.hook-item.enabled .icon-for-enabled{display:inline-block;color:#28a745}.hook-item.disabled .icon-for-disabled{display:inline-block;color:#ccc}.hook-item .hook-error-message{margin-left:24px;color:#cb2431}.hook-url.css-truncate-target{max-width:360px}.hook-events-field .hook-event-selector{display:none}.hook-events-field.is-custom .hook-event-selector{display:block}.hook-event-selector{margin-left:10px}.hook-event{display:inline-block;width:310px;padding:5px 0 5px 30px;margin:0}.hook-event p{font-weight:400}.hook-event-choice{font-weight:400}.hooks-oap-warning{margin-top:0}.hooks-oap-warning ul{margin:10px 0}.hooks-oap-warning ul li{margin-left:16px}.hook-secret .hook-secret-standin{display:block}.hook-secret .hook-secret-field{display:none}.hook-secret.open .hook-secret-standin{display:none}.hook-secret.open .hook-secret-field{display:block}.hook-deliveries-list .error-message{padding:7px 4px;margin:10px 0}.hook-deliveries-list .error-message .octicon{position:relative;top:1px}.hook-deliveries-list .spinner{display:inline-block;margin:0;vertical-align:top}.hook-deliveries-list .hook-delivery-item:hover{background-color:transparent}.hook-deliveries-list .item-status{display:inline-block;width:16px;margin-right:5px;text-align:center}.hook-deliveries-list .item-status .icon-for-success, +.hook-deliveries-list .item-status .icon-for-failure, +.hook-deliveries-list .item-status .icon-for-pending{display:none}.hook-deliveries-list .item-status.success{color:#28a745;visibility:visible}.hook-deliveries-list .item-status.success .icon-for-success{display:inline-block}.hook-deliveries-list .item-status.failure{color:#cb2431}.hook-deliveries-list .item-status.failure .icon-for-failure{display:inline-block}.hook-deliveries-list .item-status.pending{color:#6a737d}.hook-deliveries-list .item-status.pending .icon-for-pending{display:inline-block}.boxed-group-list li.hook-delivery-item{padding:10px}.hook-deliveries-list .error-message, +.hook-delivery-loader .error-message{display:none}.hook-deliveries-list.is-error .loading-message, +.hook-delivery-loader.is-error .loading-message{display:none}.hook-deliveries-list.is-error .error-message, +.hook-delivery-loader.is-error .error-message{display:block}.hook-delivery-time{float:right;margin-right:10px;font-size:10px;color:#6a737d}.hook-delivery-guid{display:inline-block;padding:2px 6px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;color:rgba(0,0,0,0.5);background-color:rgba(209,227,237,0.5);border-radius:3px}.hook-delivery-guid .octicon{margin:1px -2px 0 0;color:#b0c4ce}.hook-delivery-actions{padding-top:1px}.boxed-group-list > li.hook-delivery-item .btn-sm{margin:0}.boxed-group span.animated-ellipsis-container, +.boxed-group span.animated-ellipsis{padding:0}.boxed-group .animated-ellipsis-container{line-height:1.3}.hook-delivery-container .tabnav-tabcontent{display:none}.hook-delivery-container .tabnav-tabcontent.selected{display:block}.hook-delivery-container hr{margin:10px 0}.hook-delivery-container pre{padding:7px 12px;margin:10px 0;overflow:auto;font-size:13px;line-height:1.5;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px}.hook-delivery-container .tabnav{margin:10px 0}.hook-delivery-container h4.remote-call-header{margin:20px 0 10px;border-bottom:1px solid #959da5}.hook-delivery-response-status{display:inline-block;padding:4px 6px 3px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px;line-height:1.1;color:#fff;background-color:#d73a49;border-radius:3px}.hook-delivery-response-status[data-response-status^="2"]{background-color:#28a745}.redelivery-dialog .pending-message{display:block}.redelivery-dialog .failure-message{display:none}.redelivery-dialog.failed{color:#9c2400;background-image:linear-gradient(#f8d8d8,#efd0d0);border-color:#da9797}.redelivery-dialog.failed .pending-message{display:none}.redelivery-dialog.failed .failure-message{display:block}.test-hook-message .success-message, +.test-hook-message .error-message{display:none;margin-top:10px}.test-hook-message.success .success-message{display:block}.test-hook-message.error .error-message{display:block}.item-name{float:left;font-weight:600}.integration-meta-head{font-size:16px;color:#586069}.integrations-select-repos{max-height:138px;overflow-y:scroll;border-radius:3px}.integrations-select-repos .mini-repo-list-item{padding:8px 64px 8px 30px}.integrations-select-repos .mini-repo-list-item:hover .repo, +.integrations-select-repos .mini-repo-list-item:hover .owner{text-decoration:none}.integrations-select-repos .mini-repo-list-item .css-truncate-target{max-width:345px}.integrations-select-repos::-webkit-scrollbar{width:10px}.integrations-select-repos::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.5);border:solid #fff 2px;border-radius:6px;box-shadow:0 0 1px hsla(0,0%,100%,0.5)}.integrations-select-repos::-webkit-scrollbar-track-piece{background:transparent}.integrations-repository-picker{position:relative;top:-5px;width:440px}.integrations-repository-picker .select-menu-modal{width:440px}.integrations-repository-picker .autocomplete-results{border:0}.integrations-repository-picker .select-menu .search-status{display:none}.integrations-repository-picker .select-menu.is-loading .search-status{display:block}.integrations-repository-picker .subnav-search{margin-bottom:5px;margin-left:0}.integrations-repository-picker .flash{padding:10px;margin-bottom:10px}dl.form-group > dd .integrations-repository-picker .form-control{margin-right:0}.integrations-repository-picker .octicon-x{position:absolute;top:8px;right:10px;cursor:pointer}.target-avatar{position:relative;top:-2px}.issue-list em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,255,140,0.5);border-radius:3px}.issue-list .title{min-height:24px;padding:0;margin:0 80px 10px 0;font-size:18px;font-weight:400;line-height:24px;word-wrap:break-word}.issue-list .title .octicon{position:absolute;top:-4px;left:0;color:#888}.issue-list .title .closed.octicon{color:#cb2431}.issue-list .title .open.octicon{color:#28a745}.issue-list .title .merged.octicon{color:#6f42c1}.issue-list .description{margin:0 0 10px;overflow:hidden;line-height:20px}.issue-list-item + .issue-list-item{border-top:1px #e1e4e8 solid}.issues-reset-query-wrapper{margin-bottom:20px}.label-link:hover{text-decoration:none}.issues-reset-query{font-weight:600;color:#586069}.issues-reset-query:hover{color:#0366d6;text-decoration:none}.issues-reset-query:hover .issues-reset-query-icon{background-color:#0366d6}.issues-reset-query-icon{width:18px;height:18px;padding:1px;margin-right:3px;color:#fff;text-align:center;background-color:#6a737d;border-radius:3px}.table-list-milestones .table-list-cell{padding:15px 20px}.table-list-milestones .stat{display:inline-block;font-size:14px;font-weight:600;line-height:1.2;color:#555;white-space:nowrap}.table-list-milestones .stat a{color:inherit}.table-list-milestones .stat + .stat{margin-left:15px}.table-list-milestones .stat-label{font-weight:400;color:#586069}.milestone-title{width:500px}.milestone-title-link{margin-top:0;margin-bottom:5px;font-size:24px;font-weight:400;line-height:1.2}.milestone-title-link a{color:#333}.milestone-title-link a:hover{color:#0366d6}.milestone-progress{width:420px}.milestone-progress .progress-bar{margin-top:7px;margin-bottom:12px}.milestone-meta{font-size:14px}.milestone-meta-item{display:inline-block;margin-right:10px}.milestone-meta-item .octicon{width:16px;text-align:center}.milestone-description-html{display:none}.milestone-description{margin-top:5px}.milestone-description .expand-more{color:#0366d6;cursor:pointer}.milestone-description .expand-more:hover{text-decoration:underline}.milestone-description.open .milestone-description-plaintext{display:none}.milestone-description.open .milestone-description-html{display:block}.issue-reorder-warning{z-index:110}.task-progress{color:#586069;text-decoration:none;vertical-align:top}.task-progress .octicon{margin-right:5px;color:#999;vertical-align:bottom}.task-progress .progress-bar{display:inline-block;width:80px;height:5px;vertical-align:2px;background-color:#eee}.task-progress .progress-bar .progress{background-color:#ccc}.task-progress-counts{display:inline-block;margin-right:6px;margin-left:-2px;font-size:12px}a.task-progress:hover{color:#0366d6}a.task-progress:hover .octicon{color:inherit}a.task-progress:hover .progress-bar .progress{background-color:#0366d6}.issues-listing{position:relative}.issues-listing .octocat-search{position:absolute;right:0;height:250px;margin:-132px -4px;transform:scaleX(-1)}.issue-meta-section .octicon{color:#ccc;vertical-align:bottom}.issue-milestone{max-width:240px}.issue-milestone .css-truncate-target{max-width:100px}.milestone-link .octicon{font-size:14px}.milestone-link:hover .octicon{color:inherit}.new-issue-form{padding-top:20px;margin-top:15px;border-top:1px solid #ddd}.new-issue-form::before{display:table;content:""}.new-issue-form::after{display:table;clear:both;content:""}.new-issue-form .discussion-timeline::before{display:none}.new-pr-form{margin-top:15px;margin-bottom:20px}.new-pr-form::before{display:table;content:""}.new-pr-form::after{display:table;clear:both;content:""}.new-pr-form .discussion-timeline::before{display:none}.new-pr-form .discussion-sidebar{position:relative}.label-select-menu .description{margin-left:19px}.label-select-menu .color{display:inline-block;width:14px;height:14px;margin-top:-1px;margin-right:2px;vertical-align:middle;border-radius:3px}.label-select-menu .selected .select-menu-item-icon{color:inherit!important}.label-select-menu .selected:active{background-color:transparent!important}.label-select-menu .select-menu-item{position:relative}.label-select-menu .select-menu-item:hover, .label-select-menu .select-menu-item:focus, .label-select-menu .select-menu-item[aria-selected="true"], .label-select-menu .select-menu-item.navigation-focus{color:inherit;background-color:#f4f4f4}.label-select-menu .select-menu-item:hover .select-menu-item-icon, .label-select-menu .select-menu-item:focus .select-menu-item-icon, .label-select-menu .select-menu-item[aria-selected="true"] .select-menu-item-icon, .label-select-menu .select-menu-item.navigation-focus .select-menu-item-icon{color:transparent}.label-select-menu > form{position:relative}.closed-banner{height:7px;margin:15px 0 15px 60px;overflow:hidden;background:url("/images/modules/comments/closed_pattern.gif");border-radius:3px}.subnav .btn + .issues-search{padding-right:10px;border-right:1px solid #eee}.reaction-sort-item{float:left;width:39px;padding:5px;margin-top:5px;text-align:center;pointer-events:all;border:solid 1px transparent;border-radius:3px;opacity:0.7}.reaction-sort-item:focus, .reaction-sort-item:hover{text-decoration:none;background-color:#0366d6;opacity:1}.reaction-sort-item[aria-checked="true"]{background-color:#f1f8ff;border-color:#0366d6;opacity:1}body.emoji-size-boost .reaction-sort-item g-emoji{margin-left:-3px}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){body.emoji-size-boost .reaction-sort-item g-emoji{margin-left:0}}.issue-keyword{border-bottom:1px dotted #959da5}.issue-keyword:hover{border-bottom:0}.new-label-color-dimensions{width:24px;height:24px}.select-menu-item[aria-selected="true"] > .octicon.label-options-icon, +.select-menu-item.navigation-focus > .octicon.label-options-icon{color:#24292e}.new-label-color-input:invalid{color:#cb2431}.repository-lang-stats{position:relative}.repository-lang-stats ol.repository-lang-stats-numbers li{display:table-cell;width:1%;padding:10px 5px;text-align:center;white-space:nowrap;border-bottom:0}.repository-lang-stats ol.repository-lang-stats-numbers li span.percent{float:none}.repository-lang-stats ol.repository-lang-stats-numbers li > a, +.repository-lang-stats ol.repository-lang-stats-numbers li > span{font-weight:600;color:#6a737d;text-decoration:none}.repository-lang-stats ol.repository-lang-stats-numbers li .lang{color:#24292e}.repository-lang-stats ol.repository-lang-stats-numbers li .language-color{display:inline-block;width:10px;height:10px;border-radius:50%}.repository-lang-stats ol.repository-lang-stats-numbers li a:hover{background:transparent}.stats-switcher-viewport{height:41px;overflow:hidden}.stats-switcher-viewport .stats-switcher-wrapper{position:relative;top:0;transition:top 0.25s ease-in-out}.stats-switcher-viewport.is-revealing-lang-stats .stats-switcher-wrapper{top:-41px}.stats-switcher-viewport.is-revealing-overview .stats-switcher-wrapper{top:41px}.repository-lang-stats-graph{width:100%;overflow:hidden;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #ddd;border-top:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.repository-lang-stats-graph .language-color{line-height:8px;text-indent:-9999px}.repository-lang-stats-graph .language-color:first-child{border-bottom-left-radius:2px}.repository-lang-stats-graph .language-color:last-child{border-bottom-right-radius:2px}.facebox-loading, +.octocat-spinner{min-height:64px;background-image:url("/images/spinners/octocat-spinner-64.gif");background-repeat:no-repeat;background-position:center center}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.facebox-loading, + .octocat-spinner{background-image:url("/images/spinners/octocat-spinner-128.gif");background-size:64px 64px}}.MarketplaceJumbotron{background-color:#2f363d;background-image:url("/images/modules/marketplace/bg-hero.svg");background-repeat:repeat-y;background-position:center top;background-size:150% auto}@media (min-width: 768px){.MarketplaceJumbotron{background-repeat:no-repeat;background-size:cover}}.CircleBadge--feature{position:relative;top:0;transition:top 0.15s ease-in,box-shadow 0.12s ease-in}.MarketplaceFeature-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}.MarketplaceFeature{min-width:250px}.MarketplaceFeature-text{opacity:0.7;transition:opacity 0.12s ease-in}.MarketplaceFeature-link:hover .CircleBadge--feature{top:-3px;box-shadow:0 3px 8px 0 rgba(0,0,0,0.2)}.MarketplaceFeature-link:hover .MarketplaceFeature-text{opacity:1}.MarketplaceFeature-link:active .CircleBadge--feature{top:0;box-shadow:0}.MarketplaceSideNav{-webkit-overflow-scrolling:touch;background-color:#f6f8fa}@media (min-width: 768px){.MarketplaceSideNav{background-color:#fff;border-right:1px #e1e4e8 solid}}.ScreenshotCarousel{border:1px #e1e4e8 solid;border-radius:3px}.ScreenshotCarousel-screenshot{display:none;padding:16px}.ScreenshotCarousel-screenshot.active{display:block}.ScreenshotCarousel-nav{display:flex;overflow-x:auto;align-items:top;box-shadow:inset 0 1px 0 #e1e4e8}.ScreenshotCarousel-navitem{width:20%;min-width:120px;padding:16px;cursor:pointer;border-right:1px #e1e4e8 solid}.ScreenshotCarousel-navitem:last-child{border-right:0}.ScreenshotCarousel-navitem.selected{background-color:#f6f8fa;box-shadow:inset 0 0 4px rgba(36,41,46,0.15)}.marketplace-plan-edit-unit, +.marketplace-plan-edit-unit-label, +.marketplace-plan-edit-price{display:none}.marketplace-plan-enable-free-trial{display:none}.marketplace-plan-editor[data-model="FLAT_RATE"] .marketplace-plan-edit-price{display:block}.marketplace-plan-editor[data-model="FLAT_RATE"] .marketplace-plan-enable-free-trial{display:block}.marketplace-plan-editor[data-model="PER_UNIT"] .marketplace-plan-edit-price, +.marketplace-plan-editor[data-model="PER_UNIT"] .marketplace-plan-edit-unit{display:block}.marketplace-plan-editor[data-model="PER_UNIT"] .marketplace-plan-edit-unit-label{display:inline}.marketplace-plan-editor[data-model="PER_UNIT"] .marketplace-plan-enable-free-trial{display:block}.marketplace-listing-screenshot-container{width:175px;min-height:175px;background-repeat:no-repeat;background-position:center center;background-size:cover}.marketplace-listing-screenshot-container .marketplace-listing-screenshot{min-width:100%;min-height:100%;opacity:0}.marketplace-listing-screenshot-zoom{display:none;cursor:move}.marketplace-listing-details-sidebar{order:2}@media (min-width: 768px){.marketplace-listing-details-sidebar{order:1}}.marketplace-listing-details-description{order:1}@media (min-width: 768px){.marketplace-listing-details-description{order:2}}.marketplace-listing-screenshot-link{height:100px;cursor:move}.marketplace-listing-screenshot-link:hover .marketplace-listing-screenshot-zoom, .marketplace-listing-screenshot-link:focus .marketplace-listing-screenshot-zoom{top:0;left:0;display:block;width:100%;height:100%;padding-top:28px;background-color:hsla(0,0%,100%,0.75)}.marketplace-integratable-logo{width:40px;height:40px}.marketplace-listing-save-notice, +.marketplace-listing-save-error{display:none;opacity:0;transition:opacity 0.15s linear}.marketplace-listing-save-notice.visible, +.marketplace-listing-save-error.visible{display:inline-block;opacity:1}.marketplace-listing-screenshot-delete-form{position:absolute;bottom:-24px;width:100%;text-align:center}.marketplace-plan-dollar-field-container .price-note{display:none}.marketplace-plan-dollar-field-container.is-errored .price-note{display:block}.marketplace-plan-dollar-field-container.is-errored .form-control{border-color:#d73a49}.marketplace-plan-emphasis{color:#24292e}.selected .marketplace-plan-emphasis{color:#fff}.marketplace-plan-unit-name-preview::before{content:"per "}.marketplace-plan-per-time{clear:right}.marketplace-billing-modal{width:540px;max-height:90vh}.marketplace-listing-markdown, +.marketplace-url-link{word-wrap:break-word;white-space:pre-wrap}.marketplace-listing-markdown{line-height:1.4}.integrations-promo-bg{background-image:url("/images/modules/works-with/build-your-own.svg");background-repeat:no-repeat;background-size:0 0}@media (min-width: 544px){.integrations-promo-bg{background-position:top right;background-size:auto 100%}}.marketplace-product-callout{border-color:#d1d5da!important}.marketplace-product-callout::before, .marketplace-product-callout::after{display:none}.marketplace-product-callout .branch-action-item-icon{color:#586069;background-color:#e1e4e8}.filter-item.selected .Label--outline-white{color:#fff;border-color:#fff}.MarketplaceEdit-body{min-height:570px}.MarketplaceEdit-body .pricing-model-selector{width:calc(100% - 12px);max-width:100%!important}.MarketplaceEdit-body .Box-row--pending{box-shadow:2px 0 0 #f9c513 inset}.MarketplaceEdit-body .menu{border-right:0;border-left:0;border-radius:0}.MarketplaceEdit-body .menu-item{padding:12px 16px;background:#fafbfc}.MarketplaceEdit-body .menu-item.selected{background:#fff}.MarketplaceEdit-body .menu-item:hover{background:#f6f8fa}.MarketplaceEdit-body .menu-item.selected::before{position:absolute;top:0;bottom:0;left:0;width:3px;content:"";background-color:#f66a0a}.MarketplaceEdit-body .menu-item:first-child::before{border-top-left-radius:0}.MarketplaceEdit-body .CircleIcon{display:inline-block;width:32px;height:32px;font-weight:bold;line-height:32px;color:#586069;text-align:center;background:#e6ebf1;border-radius:100%}.MarketplaceEdit-body .CircleIcon .octicon{display:inline-block}.MarketplaceEdit-body .CircleIcon--success{color:#fff;background:#28a745}.MarketplaceInsights-graph .insights-month .tick:nth-child(2n){visibility:hidden}.CircleBadge--tiny{width:32px;height:32px}.CircleBadge--github{position:relative}.CircleBadge--github.CircleBadge--large::after{right:5px;bottom:5px}.CircleBadge--github.CircleBadge--small::after{right:-5px;bottom:-5px}.CircleBadge--github::after{position:absolute;right:0;bottom:0;display:block;width:22px;height:22px;padding:3px;line-height:0;content:"";background:#fff url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyMnB4IiBoZWlnaHQ9IjIycHgiIHZpZXdCb3g9IjAgMCAyMiAyMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5TaGFwZSBDb3B5PC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IktpdGNoZW4tc2luayIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+ICAgICAgICA8ZyBpZD0iT2N0aWNvbnMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNzAuMDAwMDAwLCAtMTU4NC4wMDAwMDApIiBmaWxsPSIjMUIxRjIzIj4gICAgICAgICAgICA8cGF0aCBkPSJNMzgxLDE1ODQgQzM3NC45MjI1LDE1ODQgMzcwLDE1ODguOTIyNSAzNzAsMTU5NSBDMzcwLDE1OTkuODY3NSAzNzMuMTQ4NzUsMTYwMy45Nzg3NSAzNzcuNTIxMjUsMTYwNS40MzYyNSBDMzc4LjA3MTI1LDE2MDUuNTMyNSAzNzguMjc3NSwxNjA1LjIwMjUgMzc4LjI3NzUsMTYwNC45MTM3NSBDMzc4LjI3NzUsMTYwNC42NTI1IDM3OC4yNjM3NSwxNjAzLjc4NjI1IDM3OC4yNjM3NSwxNjAyLjg2NSBDMzc1LjUsMTYwMy4zNzM3NSAzNzQuNzg1LDE2MDIuMTkxMjUgMzc0LjU2NSwxNjAxLjU3MjUgQzM3NC40NDEyNSwxNjAxLjI1NjI1IDM3My45MDUsMTYwMC4yOCAzNzMuNDM3NSwxNjAwLjAxODc1IEMzNzMuMDUyNSwxNTk5LjgxMjUgMzcyLjUwMjUsMTU5OS4zMDM3NSAzNzMuNDIzNzUsMTU5OS4yOSBDMzc0LjI5LDE1OTkuMjc2MjUgMzc0LjkwODc1LDE2MDAuMDg3NSAzNzUuMTE1LDE2MDAuNDE3NSBDMzc2LjEwNSwxNjAyLjA4MTI1IDM3Ny42ODYyNSwxNjAxLjYxMzc1IDM3OC4zMTg3NSwxNjAxLjMyNSBDMzc4LjQxNSwxNjAwLjYxIDM3OC43MDM3NSwxNjAwLjEyODc1IDM3OS4wMiwxNTk5Ljg1Mzc1IEMzNzYuNTcyNSwxNTk5LjU3ODc1IDM3NC4wMTUsMTU5OC42MyAzNzQuMDE1LDE1OTQuNDIyNSBDMzc0LjAxNSwxNTkzLjIyNjI1IDM3NC40NDEyNSwxNTkyLjIzNjI1IDM3NS4xNDI1LDE1OTEuNDY2MjUgQzM3NS4wMzI1LDE1OTEuMTkxMjUgMzc0LjY0NzUsMTU5MC4wNjM3NSAzNzUuMjUyNSwxNTg4LjU1MTI1IEMzNzUuMjUyNSwxNTg4LjU1MTI1IDM3Ni4xNzM3NSwxNTg4LjI2MjUgMzc4LjI3NzUsMTU4OS42Nzg3NSBDMzc5LjE1NzUsMTU4OS40MzEyNSAzODAuMDkyNSwxNTg5LjMwNzUgMzgxLjAyNzUsMTU4OS4zMDc1IEMzODEuOTYyNSwxNTg5LjMwNzUgMzgyLjg5NzUsMTU4OS40MzEyNSAzODMuNzc3NSwxNTg5LjY3ODc1IEMzODUuODgxMjUsMTU4OC4yNDg3NSAzODYuODAyNSwxNTg4LjU1MTI1IDM4Ni44MDI1LDE1ODguNTUxMjUgQzM4Ny40MDc1LDE1OTAuMDYzNzUgMzg3LjAyMjUsMTU5MS4xOTEyNSAzODYuOTEyNSwxNTkxLjQ2NjI1IEMzODcuNjEzNzUsMTU5Mi4yMzYyNSAzODguMDQsMTU5My4yMTI1IDM4OC4wNCwxNTk0LjQyMjUgQzM4OC4wNCwxNTk4LjY0Mzc1IDM4NS40Njg3NSwxNTk5LjU3ODc1IDM4My4wMjEyNSwxNTk5Ljg1Mzc1IEMzODMuNDIsMTYwMC4xOTc1IDM4My43NjM3NSwxNjAwLjg1NzUgMzgzLjc2Mzc1LDE2MDEuODg4NzUgQzM4My43NjM3NSwxNjAzLjM2IDM4My43NSwxNjA0LjU0MjUgMzgzLjc1LDE2MDQuOTEzNzUgQzM4My43NSwxNjA1LjIwMjUgMzgzLjk1NjI1LDE2MDUuNTQ2MjUgMzg0LjUwNjI1LDE2MDUuNDM2MjUgQzM4OC44NTEyNSwxNjAzLjk3ODc1IDM5MiwxNTk5Ljg1Mzc1IDM5MiwxNTk1IEMzOTIsMTU4OC45MjI1IDM4Ny4wNzc1LDE1ODQgMzgxLDE1ODQgTDM4MSwxNTg0IFoiIGlkPSJTaGFwZS1Db3B5Ij48L3BhdGg+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=") center no-repeat;border-radius:100px}.select-search-icon{position:absolute;top:19px;left:18px}body.min-width-0.page-responsive .flash-full .container{width:100%;max-width:980px}.ClipboardButton{position:relative}.ClipboardButton.ClipboardButton--success{border-color:#28a745;box-shadow:0 0 0 0.2em rgba(52,208,88,0.4)}.ClipboardButton.ClipboardButton--success:focus{box-shadow:0 0 0 0.2em rgba(52,208,88,0.4)}.ClipboardButton.ClipboardButton--success::after{content:"Copied!"}.member-list-item .table-list-cell-checkbox{width:30px}.member-list-item.adminable .member-info{padding-left:5px}.member-list-item .member-avatar-cell{width:58px}.member-list-item .dropdown-menu-content{text-align:left}.member-info{width:450px}.member-info .css-truncate-target{max-width:430px}.member-meta .select-menu-modal{width:310px}.member-meta .select-menu-modal-holder{right:0;text-align:left}.triage-mode .none-selected{display:none}.member-role-menu .select-menu-item-text{padding-right:8px}.merge-branch-heading{margin:0;line-height:1;color:#24292e}.merge-branch-description{margin-right:160px;margin-bottom:-5px;line-height:1.6em;color:#586069}.merge-branch-description .zeroclipboard-link .octicon{top:2px}.alt-merge-options{display:inline-block;margin-bottom:0;margin-left:4px;vertical-align:middle}.merged .merge-branch-description .commit-ref .css-truncate-target{max-width:180px}.merge-branch-prh-output{margin-top:10px}.merge-branch-form{display:none;padding-left:60px}.merge-branch.open .merge-branch-form{display:block}.merge-branch.open .merge-message{display:none}.merge-branch-manually{display:none;padding-top:15px;margin-top:14px;background-color:transparent;border-top:1px solid #ddd}.merge-branch-manually p{margin-bottom:0}.merge-branch-manually h3{margin-bottom:10px}.merge-branch-manually .intro{padding-bottom:10px;margin-top:0}.merge-branch-manually .step{margin:15px 0 5px}.merge-branch-manually .url-box{padding:0;margin-left:0;border:0}.merge-branch-manually .copyable-terminal{background-color:#f2f2f2}.open .merge-branch-manually{display:block}.select-menu-merge-method{width:310px}.merge-pr.is-rebasing .commit-form-fields{margin-top:-110px;opacity:0;transition:opacity 0.15s linear 0s,margin-top 0.25s ease 0.1s}.merge-pr .btn-group-merge, +.merge-pr.is-squashing .btn-group-squash, +.merge-pr.is-rebasing .btn-group-rebase{display:inline-block}.merge-pr .merging-body, +.merge-pr .rebasing-body, +.merge-pr .squashing-body{display:none}.merge-pr.is-merging .merging-body, +.merge-pr.is-rebasing .rebasing-body, +.merge-pr.is-squashing .squashing-body{display:block}.merge-pr .btn-group-squash, +.merge-pr .btn-group-rebase, +.merge-pr.is-squashing .btn-group-merge, +.merge-pr.is-rebasing .btn-group-merge{display:none;margin-left:0}.commit-form-fields{transition:opacity 0.15s linear 0.1s,margin-top 0.25s ease 0s}.unavailable-merge-method{display:block;margin-top:6px;color:#a04100}[aria-selected="true"].disabled .unavailable-merge-method, +.navigation-focus.disabled .unavailable-merge-method{color:#fff}.network .network-tree{vertical-align:middle}.network .gravatar{margin-right:4px;vertical-align:middle;border-radius:3px}.network .octicon{display:inline-block;width:16px;margin-left:2px;text-align:center;vertical-align:middle}.network .current-repository{background-color:#fff5b1}.page-new-repo .octicon-repo{color:#959da5}.page-new-repo .octicon-lock{color:rgba(115,92,15,0.5)}.page-new-repo ul.repo-templates{margin:10px 0}.page-new-repo ul.repo-templates > li{display:inline-block;margin:0 10px 0 0;list-style-type:none}.page-new-repo ul.repo-templates .select-menu{float:left}.page-new-repo .form-checkbox .octicon{float:left;margin-right:5px}.page-new-repo .form-checkbox.disabled{color:#6a737d}.page-new-repo .license-info{float:left;margin-top:5px;margin-left:10px;color:#0366d6}.new-repo-container{width:700px;margin:40px auto 0}.new-repo-container .Subhead{margin-bottom:30px}.owner-reponame dl.form-group{margin-top:5px;margin-bottom:0}.owner-reponame .slash{float:left;padding-top:32px;margin:0 8px;font-size:21px;color:#586069}.reponame-suggestion{color:#34631a;cursor:pointer}.upgrade-upsell{padding-left:33px}.cc-upgrade{padding-left:20px}.featured-license{font-weight:600}.license-container{padding-left:15px;border-left:1px solid #ccc}.news .account-switcher{margin-bottom:20px}.news .release{margin-top:0;margin-bottom:0}.news blockquote{color:#586069}.news h1{margin-bottom:0}.news .alert{position:relative;padding:0 0 1em 45px;overflow:hidden;border-top:1px solid #eff3f6}.news .alert .commits{padding-left:40px}.news .alert .css-truncate.css-truncate-target, +.news .alert .css-truncate .css-truncate-target{max-width:180px}.news .alert p{margin:0}.news .alert .markdown-body blockquote{padding:0 0 0 40px;border:0 none}.news .alert .octicon{color:#959da5}.news .alert .dashboard-event-icon{position:absolute;top:18px;left:22px;transform:translateX(-50%)}.news .alert .body{padding:1em 0 0;overflow:hidden;font-size:14px;border-bottom:0}.news .alert .time{font-size:12px;color:#959da5}.news .alert .title{padding:0;font-weight:600}.news .alert .title .subtle{color:#959da5}.news .alert .gravatar{float:left;margin-right:0.6em;line-height:0;background-color:#fff;border-radius:3px}.news .alert .simple .title{display:inline-block;font-size:13px;font-weight:400;color:#586069}.news .alert .simple .time{display:inline-block}.news .alert .branch-link{position:relative;top:-2px;margin:0;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;color:#4183c4}.news .alert .branch-link .octicon{display:none}.news .alert:first-child{border-top:0}.news .alert:first-child .body{padding-top:0}.news .alert:first-child .dashboard-event-icon{top:0}.news .github-welcome .done{color:#586069;text-decoration:line-through}.news .commits li{margin-top:0.15em;list-style-type:none}.news .commits li.more{padding-top:2px;font-size:11px}.news .commits li .committer{display:none;padding-left:0.5em}.news .commits li img{margin:0 1px 0 0;vertical-align:middle;background-color:#fff;border-radius:2px}.news .commits li img.emoji{padding:0;margin:0;border:0}.news .commits li .message{display:inline-block;max-width:390px;margin-top:2px;overflow:hidden;font-size:13px;line-height:1.3;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}.news div.message, +.news li blockquote{display:inline;font-size:13px;color:#586069}.notification-routing .notification-email .edit-link{margin-right:10px;font-weight:600}.notification-routing .notification-email .btn-sm{float:none;margin:-2px 0 0}.notification-routing .notification-email .edit-form{display:none}.notification-routing .notification-email.open .edit-form{display:block}.notification-routing .notification-email.open .email-display{display:none}.notifications .list-group-item{padding-top:8px;padding-bottom:8px;padding-left:35px;border-width:1px 0 0}.notifications .list-group-item:first-child{border:0}.notifications .list-group-item-name{display:block;max-width:400px;font-size:14px;line-height:1.5em}.notifications .list-group-item-name a{display:block;max-width:460px}.notifications .notifications-more{padding:0}.notifications .notifications-more > a{display:block;padding:10px 15px;font-weight:600;color:#0366d6;text-align:center}.notifications .notifications-more > a:hover{text-decoration:underline}.notifications .read .type-icon{color:#586069}.notifications .read .list-group-item-name > a{color:#586069}.notifications .read .notification-actions{color:#586069}.notifications .read .avatar-stack{opacity:0.5}.notifications .read .undo{display:block}.notifications .read .delete{visibility:hidden}.notifications .read[aria-selected="true"], .notifications .read.navigation-focus{background-color:#f5f9fc}.notifications .muted .unmute{display:block}.notifications .muted .mute{display:none}.notifications .unmute{display:none}.notifications-sso-prompt{padding:0}.notifications-sso-prompt[aria-selected="true"], .notifications-sso-prompt.navigation-focus{background-color:#f5f9fc}.notifications-sso-prompt a{display:block;padding:10px 15px;color:#586069;text-align:center;background:none;border:0;outline:none}.notifications-sso-prompt a:hover{text-decoration:none}.notifications-sso-prompt em{font-style:normal;color:#0366d6}.notifications-sso-prompt a:hover em{text-decoration:underline}.notifications-sso-prompt strong{font-weight:bold}.type-icon-state-none{color:#586069}.type-icon-state-open{color:#28a745}.type-icon-state-closed{color:#cb2431}.type-icon-state-merged{color:#6f42c1}.notifications-list{float:left;width:100%}.notifications-list .notifications-repo-link{max-width:500px}.notifications-list .boxed-group .notification-success{position:absolute;right:3px;width:220px;margin-top:4px;font-size:13px;color:#28a745;text-align:right;visibility:hidden;opacity:0;transition:opacity 0.35s ease-in-out,transform 0.35s ease-in-out;transform:translateX(10px)}.notifications-list .mark-all-as-read{padding:2px 6px 5px 10px;margin-top:0;margin-right:0;line-height:20px;color:#586069;background-color:transparent;border:0}.notifications-list .mark-all-as-read-confirmed .notification-success{visibility:visible;opacity:1;transform:translateX(0)}.notifications-list .mark-all-as-read-confirmed .mark-all-as-read{visibility:hidden}.notifications-list .confirmation{max-height:0;padding:0;overflow:hidden;color:#666;text-align:center;opacity:0;transition:opacity 0.4s ease-in-out,max-height 0.4s ease-in-out,padding 0.4s ease-in-out}.notifications-list .confirmation + .list-group-item{margin-top:-1px;border-top-color:#d5d5d5}.notifications-list .confirmation.mark-all-as-read-confirmed{max-height:300px;padding:10px 0;opacity:1}.notification-actions{position:absolute;top:8px;right:10px;list-style:none}.notification-actions li{float:right;margin-left:10px;font-size:16px;line-height:20px}.notification-actions .age{width:120px;font-size:12px;color:#586069}.notification-actions .undo{position:absolute;top:0;display:none}.notification-actions .btn-link{padding-right:5px;padding-left:5px;line-height:inherit;color:#586069}.notification-actions .btn-link:hover{color:#0366d6;text-decoration:none}.repo-subscription-container{width:600px;margin-right:auto;margin-left:auto}.repo-subscription-container .spinner{float:right}.repo-subscription-container h2{margin-top:24px;margin-bottom:16px;font-size:22px;font-weight:400}.repo-subscription-container .intro{font-size:14px;color:#666}.repo-subscription-label{display:inline-block}.subscriptions-content .repo-icon{margin-right:5px;color:#666;vertical-align:middle}.subscriptions-content .repo-list form{display:inline}.subscriptions-content .repo-list .only-loading{display:none}.subscriptions-content .repo-list .loading .only-loading{display:inline-block}.subscriptions-content .repo-list .only-unsubed{display:none}.subscriptions-content .repo-list .unsubscribed .only-unsubed{display:inline}.subscriptions-content .repo-list .unsubscribed .only-subed{display:none}.subscriptions-content .repo-list .only-unignored{display:none}.subscriptions-content .repo-list .unsubscribed .only-unignored{display:inline}.subscriptions-content .repo-list .unsubscribed .only-ignored{display:none}.thread-subscription-status{padding:10px;margin:40px 0 20px;color:#586069;background-color:#fff;border:1px solid #eee;border-radius:3px}.thread-subscription-status .octicon-radio-tower{margin-right:10px;margin-left:4px;color:#ccc;vertical-align:middle}.thread-subscription-status .btn-sm > .octicon{margin-right:1px}.thread-subscription-status .reason{display:inline-block;margin:0 10px;vertical-align:middle}.thread-subscription-status .thread-subscribe-form{display:inline-block;vertical-align:middle}.subscription .loading{opacity:0.5}.oauth-permissions-details{position:relative;padding:15px;margin:0;list-style:none;border-bottom:1px solid #f2f2f2}.oauth-permissions-details:first-child{border-radius:3px 3px 0 0}.oauth-permissions-details:last-child{border:0;border-radius:0 0 3px 3px}.oauth-permissions-details.oauth-public-data-only{border-radius:3px}.oauth-permissions-details .markdown-body{font-size:13px}.oauth-permissions-details .content{display:none;margin-left:45px}.oauth-permissions-details .content .form-checkbox{margin-left:0}.oauth-permissions-details .content .form-checkbox:last-child{margin-bottom:0}.oauth-permissions-details .octicon{float:left;color:#586069;text-align:center}.oauth-permissions-details .permission-help{font-size:13px}.oauth-permissions-details .permission-help ul{padding-left:20px;margin:1em 0}.oauth-permissions-details .permission-summary{margin-left:45px}.oauth-permissions-details .permission-summary .access-details{position:relative;color:#586069}.oauth-permissions-details .permission-summary em.highlight{position:relative;padding:2px 3px;margin-right:-2px;margin-left:-3px;font-style:normal;color:#4c4a42;background:#fff9ea;border-radius:3px}.oauth-permissions-details .permission-title{display:block;color:#000}.oauth-permissions-details a.btn-sm{float:right;margin-top:4px}.oauth-permissions-details.open a.btn-sm{background-color:#dcdcdc;background-image:none;border-color:#b5b5b5;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15)}.oauth-permissions-details.open .content{display:block}.oauth-permissions-details.default:not(.delete) .no-access, +.oauth-permissions-details.default:not(.delete) .default-access, .oauth-permissions-details.none .no-access, +.oauth-permissions-details.none .default-access{display:inline}.oauth-permissions-details.default:not(.delete) .access-details, +.oauth-permissions-details.default:not(.delete) .permission-title, .oauth-permissions-details.none .access-details, +.oauth-permissions-details.none .permission-title{color:#6a737d}.oauth-permissions-details.default:not(.delete) .octicon, .oauth-permissions-details.none .octicon{color:#ccc}.oauth-permissions-details.default .default-access{display:inline}.oauth-permissions-details.full .full-access{display:inline}.oauth-details-toggle{position:absolute;top:0;right:0;padding:20px 15px}.oauth-details-toggle .octicon-chevron-up{display:none}.open .oauth-details-toggle .octicon-chevron-down{display:none}.open .oauth-details-toggle .octicon-chevron-up{display:block}.oauth-user-permissions .full-access, +.oauth-user-permissions .limited-access, +.oauth-user-permissions .limited-access-emails-followers, +.oauth-user-permissions .limited-access-emails-profile, +.oauth-user-permissions .limited-access-followers-profile, +.oauth-user-permissions .limited-access-profile, +.oauth-user-permissions .limited-access-followers, +.oauth-user-permissions .limited-access-emails, +.oauth-user-permissions .no-access{display:none}.oauth-user-permissions.limited.limited-email .limited-access-emails{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails, +.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails-profile{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails, +.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-profile, +.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers, +.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-profile, +.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-followers, +.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access{display:inline}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails, +.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-followers{display:none}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails-followers{display:inline}.oauth-user-permissions.limited.limited-follow .limited-access-followers{display:inline}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers, +.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers-profile{display:inline}.oauth-user-permissions.limited.limited-profile .limited-access-profile{display:inline}.oauth-repo-permissions .default-access, +.oauth-repo-permissions .public-access, +.oauth-repo-permissions .limited-repo-invite-access, +.oauth-repo-permissions .full-access{display:none}.oauth-repo-permissions.public .public-access{display:inline}.oauth-delete-repo-permissions .octicon-alert{color:#cb2431}.oauth-repo-status-permissions .no-access, +.oauth-repo-status-permissions .full-access, +.oauth-repo-deployment-permissions .no-access, +.oauth-repo-deployment-permissions .full-access{display:none}.oauth-notifications-permissions .no-access, +.oauth-notifications-permissions .read-access, +.oauth-notifications-permissions .via-public-access, +.oauth-notifications-permissions .via-full-access{display:none}.oauth-notifications-permissions.read .read-access{display:inline}.oauth-notifications-permissions.via-public .via-public-access{display:inline}.oauth-notifications-permissions.via-public .octicon{display:none}.oauth-notifications-permissions.via-full .via-full-access{display:inline}.oauth-gist-permissions .no-access, +.oauth-gist-permissions .full-access{display:none}.oauth-granular-permissions .no-access, +.oauth-granular-permissions .read-access, +.oauth-granular-permissions .write-access, +.oauth-granular-permissions .full-access{display:none}.oauth-granular-permissions.none .no-access{display:inline}.oauth-granular-permissions.read .read-access{display:inline}.oauth-granular-permissions.write .write-access{display:inline}.oauth-granular-permissions.full .full-access{display:inline}.oauth-no-description{color:#586069}.oauth-org-access-details a:hover{text-decoration:none}.oauth-org-access-details .boxed-group-inner{border:0;border-radius:3px}.oauth-org-access-details .oauth-org-item{line-height:24px}.oauth-org-access-details .oauth-org-item:first-child{border-radius:3px 3px 0 0}.oauth-org-access-details .oauth-org-item .loading-indicator{display:none;margin:4px}.oauth-org-access-details .oauth-org-item.on{background:#fff}.oauth-org-access-details .oauth-org-item.on:hover{background:#ffe}.oauth-org-access-details .oauth-org-item.on .authorized-tools{display:block}.oauth-org-access-details .oauth-org-item.on .unauthorized-tools{display:none}.oauth-org-access-details .oauth-org-item.on strong{color:#24292e}.oauth-org-access-details .oauth-org-item.on .octicon-check{display:inline}.oauth-org-access-details .oauth-org-item.on .octicon-x{display:none}.oauth-org-access-details .oauth-org-item.revoked{background:#fff}.oauth-org-access-details .oauth-org-item.revoked .unauthorized-tools, +.oauth-org-access-details .oauth-org-item.revoked .authorized-tools{display:none}.oauth-org-access-details .oauth-org-item.revoked .octicon-x{color:#cb2431}.oauth-org-access-details .oauth-org-item.loading .unauthorized-tools, +.oauth-org-access-details .oauth-org-item.loading .authorized-tools{display:none}.oauth-org-access-details .oauth-org-item.loading .loading-indicator{display:block}.oauth-org-access-details .oauth-org-item .authorized-tools{display:none}.oauth-org-access-details .oauth-org-item .unauthorized-tools{display:block}.oauth-org-access-details .btn{line-height:1.5em}.oauth-org-access-details .octicon{color:#979797}.oauth-org-access-details .octicon-check{display:none;color:#28a745}.oauth-org-access-details .octicon-x{display:inline}.oauth-org-access-details .octicon-x.org-access-denied{color:#cb2431}.permission-title{margin-top:0}.oauth-application-whitelist h2{display:inline-block}.oauth-application-whitelist .request-info{display:block}.oauth-application-whitelist .request-info strong{display:inline-block;color:#24292e}.oauth-application-whitelist .request-info .application-description{display:none}.oauth-application-whitelist .request-info.open .application-description{display:block}.oauth-application-whitelist .avatar{margin-top:0}.oauth-application-whitelist .requestor{font-weight:600}.oauth-application-whitelist .octicon-alert{color:#a04100}.oauth-application-whitelist .octicon-check, +.oauth-application-whitelist .approved-request{color:#28a745}.oauth-application-whitelist .denied-request{color:#cb2431}.oauth-application-whitelist .request-indicator{margin-left:10px}.oauth-application-whitelist .edit-link{color:#6a737d}.oauth-application-whitelist .edit-link:hover{color:#0366d6}.oauth-application-whitelist .boxed-group-list{margin-top:1em}.oauth-application-whitelist .boxed-group-list li{padding:10px}.boxed-group-inner .oauth-application-info{margin-bottom:10px}.oauth-application-info .application-title{font-size:30px;color:#24292e}.oauth-application-info .application-description{margin-top:3px;margin-bottom:0}.oauth-application-info .app-info{display:inline-block;margin-right:10px;color:#6a737d}.oauth-application-info .app-info .octicon{margin-right:5px}.oauth-application-info .listgroup-item{line-height:inherit}.oauth-application-info .app-denied, +.oauth-application-info .app-approved{margin-left:10px;font-size:13px;font-weight:400;white-space:nowrap}.oauth-application-info .app-approved, +.oauth-application-info .octicon-check{color:#28a745}.oauth-application-info .app-denied, +.oauth-application-info .octicon-x{color:#a04100}.restrict-oauth-access-button{margin-right:20px}.restrict-oauth-access-info{margin-bottom:40px;font-size:15px}.restrict-oauth-access-list{padding-left:25px}.restrict-oauth-access-list li{margin-bottom:10px}.restrict-oauth-access-list li:last-child{margin-bottom:0}.app-transfer-actions form{display:inline}.oauth-border{border-bottom:1px solid #e5e5e5}.oauth-border:last-child{border:0}.developer-app-item .developer-app-avatar-cell{width:60px}.developer-app-item .developer-app-name{font-size:15px;font-weight:600;line-height:1.2;color:#24292e}.developer-app-item .developer-app-name:hover{color:#0366d6;text-decoration:none}.developer-app-item .developer-app-info-cell{padding-left:0}.developer-app-item .developer-app-list-meta{margin-top:3px;margin-bottom:2px;font-weight:400;color:#6a737d}.org-transfer-requests{margin:10px 0 20px}.octocaptcha-element{height:310px}.octocaptcha-frame{height:340px}.zero-height{height:0!important}.zero-height .octocaptcha-frame{height:0!important}.org-insights-graph-canvas .activity{width:400px;padding:10px;margin:100px auto 0;color:#2f363d;text-align:center;border-radius:3px}.org-insights-graph-canvas .dots{margin:0 auto}.org-insights-graph-canvas > .activity{display:none}.org-insights-graph-canvas .axis{font-size:10px}.org-insights-graph-canvas .axis line{stroke:rgba(27,31,35,0.1);shape-rendering:crispedges}.org-insights-graph-canvas .axis text{font-size:12px;font-weight:300;fill:#959da5}.org-insights-graph-canvas .axis path{display:none}.org-insights-graph-canvas .axis .zero line{stroke:#0366d6;stroke-dasharray:3 3;stroke-width:1.5}.org-insights-graph-canvas path{fill:none;stroke-width:2}.org-insights-graph-canvas .y line{display:none}.org-insights-graph-canvas .y.unique line{stroke:#1d7fb3}.org-insights-graph-canvas .overlay{fill-opacity:0}.org-insights-graph-canvas .graph-loading{padding:110px 0}.org-insights-graph-canvas .graph-loading, +.org-insights-graph-canvas .graph-error, +.org-insights-graph-canvas .graph-no-usable-data, +.org-insights-graph-canvas .graph-empty{display:none}.org-insights-graph-canvas.is-graph-loading > .activity, +.org-insights-graph-canvas.is-graph-without-usable-data > .activity, +.org-insights-graph-canvas.is-graph-empty > .activity{display:block}.org-insights-graph-canvas.is-graph-loading .graph-loading, +.org-insights-graph-canvas.is-graph-empty .graph-empty, +.org-insights-graph-canvas.is-graph-without-usable-data .graph-no-usable-data, +.org-insights-graph-canvas.is-graph-load-error .graph-error{display:block}.org-insights-svg-tip{position:absolute;z-index:99999;padding:10px;pointer-events:none}.org-insights-svg-tip.is-visible{display:block}.org-insights-svg-tip::after, .org-insights-svg-tip::before{position:absolute;top:100%;left:50%;width:0;height:0;pointer-events:none;content:" ";border:solid transparent}.org-insights-svg-tip::after{margin-left:-5px;border-color:hsla(0,0%,100%,0);border-width:5px;border-top-color:#fff}.org-insights-svg-tip::before{margin-left:-6px;border-color:transparent;border-width:6px;border-top-color:#e1e4e8}.org-insights-svg-tip.comparison{padding:10px;text-align:left;pointer-events:none}.org-insights-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.org-insights-svg-tip.comparison li{position:relative}.org-insights-svg-tip.comparison li .legend{width:7px;height:7px;border-radius:50%}.org-insights-card-legend .metric-0{color:#0366d6}.org-insights-card-legend .metric-1{color:#28a745}.org-insights-card-legend .metric-2{color:#e36209}.org-insights-card-legend .metric-3{color:#6f42c1}.org-insights-svg-tip .metric-0 .legend, +.org-insights-graph-canvas path.metric-0, +.org-insights-graph-canvas .metric-0 circle{stroke:#0366d6;background-color:#0366d6}.org-insights-svg-tip .metric-1 .legend, +.org-insights-graph-canvas path.metric-1, +.org-insights-graph-canvas .metric-1 circle{stroke:#28a745;background-color:#28a745}.org-insights-svg-tip .metric-2 .legend, +.org-insights-graph-canvas path.metric-2, +.org-insights-graph-canvas .metric-2 circle{stroke:#e36209;background-color:#e36209}.org-insights-svg-tip .metric-3 .legend, +.org-insights-graph-canvas path.metric-3, +.org-insights-graph-canvas .metric-3 circle{stroke:#6f42c1;background-color:#6f42c1}.org-insights-header{background:linear-gradient(180deg,#fff 0%,#fafbfc 100%)}.org-insights-cards .tabnav-tabcontent{display:none}.org-insights-cards .tabnav-tabcontent.selected{display:block}.org-insights-cards .boxed-group{width:100%;margin:10px 0}.org-insights-cards .is-no-activity .blankslate{display:block}.org-insights-cards .is-no-activity .org-insights-graph-canvas{display:none}.org-insights-cards .blankslate{display:none;padding-top:47px;background-color:#fff;border:0;box-shadow:none}.org-insights-cards .org-insights-card-header{display:none}.org-insights-cards .org-insights-card-legend{display:none;color:#959da5}.org-insights-cards .is-rendered .org-insights-card-legend{display:flex}.org-insights-cards .is-rendered .org-insights-card-header{display:flex}.org-insights-cards .octicon-arrow-down, +.org-insights-cards .octicon-arrow-up{display:none}.org-insights-cards .is-increase .octicon-arrow-up{display:inline-block}.org-insights-cards .is-decrease .octicon-arrow-down{display:inline-block}.org-insights-cards .graph-canvas .dots{padding:43px 0}.invitation-2fa-banner{margin-right:-24px;margin-left:-24px}.sign-up-via-invitation .bleed-flush{width:100%;padding:0 20px;margin-left:-20px;border-color:#d8dee2}.sign-up-via-invitation label{font-size:13px}.orghead{padding-top:20px;padding-bottom:0;margin-bottom:20px;color:#666;background-color:#fafbfc;border-bottom:1px solid #eee}.orghead .edit-org{position:relative;top:-6px;display:inline-block;padding:3px 5px;font-size:14px;color:#aaa;border:1px solid #e5e5e5;border-radius:3px}.orghead .edit-org:hover{color:#0366d6;background-color:#fff}.orghead .edit-org .octicon{font-size:14px}.orghead .orgnav{position:relative;top:1px;margin-top:10px}.org-header-wrapper .TableObject-item--primary, +.org-repos .TableObject-item--primary{white-space:normal}.org-header-wrapper .avatar{display:block;width:100px}.org-header-wrapper .TableObject-item--primary{padding-left:20px}.org-name{font-weight:400;color:#333}.org-description{margin-top:0;margin-bottom:8px;font-size:16px;line-height:1.25}.org-header-meta{font-size:12px;line-height:1.5;list-style:none}.org-header-meta .meta-item{display:inline-block;max-width:100%;padding-right:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.org-header-meta .octicon{position:relative;top:1px;margin-right:2px;color:#ccc;vertical-align:text-bottom}.org-header-meta.has-email.has-blog .meta-item, .org-header-meta.has-email.has-location .meta-item, .org-header-meta.has-blog.has-location .meta-item{max-width:278px}.org-header-meta.has-email.has-blog.has-location .meta-item{max-width:186px}.org-profile .member-badge{display:block;padding-top:0;padding-bottom:0;border-top:0}.audit-log-map-container{position:relative;margin-bottom:20px}.audit-log-map-container .activity{position:absolute;top:120px;left:340px;z-index:99999;display:none;text-align:center}.audit-log-map-container .is-graph-loading .activity{display:block}.audit-search-form{position:relative;margin-bottom:20px}.audit-search-form::before{display:table;content:""}.audit-search-form::after{display:table;clear:both;content:""}.audit-search-form .subnav-search-input{width:250px}.audit-log-map{height:277px;overflow:hidden;background-color:#0366d6;border-radius:3px;box-shadow:inset 1px 1px 0 rgba(0,0,0,0.2)}.map-background{pointer-events:all;fill:#0366d6;cursor:-webkit-grab;cursor:grab}.land{fill:none;stroke:#256aae;stroke-width:2;shape-rendering:crispedges}.country{fill:#d7c7ad;shape-rendering:crispedges;cursor:pointer}.country.hk{stroke:#a5967e}.country:hover{fill:#c8b28e}.country.active{fill:#f6e5ca}.borders{fill:none;stroke:#a5967e;shape-rendering:crispedges}.graticule{pointer-events:none;fill:none;stroke:#fff;stroke-opacity:0.2;shape-rendering:crispedges}.graticule :nth-child(2n){stroke-dasharray:2,2}.security-map-legend circle{fill-opacity:0;stroke:#fff;stroke-width:1.5}.security-map-legend text{font-size:10px;fill:#fff;text-anchor:end}.security-map-legend .link{stroke:#fff;stroke-width:1.5}.audit-point{pointer-events:none;fill:#d73a49;fill-opacity:0.8;stroke:#d73a49}.country-info{position:absolute;top:10px;right:10px;padding:10px;pointer-events:none;background:hsla(0,0%,100%,0.9);border-radius:2px;opacity:0}.audit-log-search .member-info{width:300px}.audit-log-search .member-info .member-avatar{float:left;margin-right:15px}.audit-log-search .member-info .member-link{display:block}.audit-log-search .member-info .member-list-avatar{margin-right:0}.audit-log-search .member-info .ghost{display:inline-block;color:#586069}.audit-log-search .blankslate{border-top-left-radius:0;border-top-right-radius:0}.audit-log-search .export-phrase{margin:5px 0}.audit-results-actions{overflow:auto}.audit-search-clear{float:left;margin-bottom:20px;border:0}.audit-search-clear .issues-reset-query{margin-bottom:0}.audit-type{width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audit-type .octicon{margin-right:3px;font-weight:400;vertical-align:bottom}.audit-type .repo{color:#a04100}.audit-type .team{color:#28a745}.audit-type .user{color:#6f42c1}.audit-type .oauth_access{color:#cb2431}.audit-type .hook{color:#e1bf4e}.export-actions{display:inline-block;margin-left:10px}.export-actions a{margin-top:-3px;color:#6a737d}.export-actions a:hover{color:#0366d6;text-decoration:none}.export-actions .select-menu-button::after{position:absolute;top:50%;right:15px;margin-top:-2px}.export-actions .select-menu-modal{width:111px}.export-actions .select-menu-item-text{text-align:center}.export-phrase{margin-top:5px}.export-phrase pre{padding-left:10px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;white-space:pre-wrap;border-left:1px solid #eee}.audit-log-export-button{width:110px;height:30px;transition:0.25s width ease-in-out}.audit-log-export-button .loader{position:absolute;top:50%;left:11px;display:none;margin-top:-9px}.audit-log-export-button .octicon{position:absolute;top:50%;left:11px;margin-top:-9px}.audit-log-export-button .audit-log-export-status{position:absolute;top:4px;left:35px}.audit-log-export-button.disabled{width:125px}.audit-log-export-button.disabled::after{display:none}.audit-log-export-button.disabled .octicon{display:none}.audit-log-export-button.disabled .loader{display:block}.two-factor-enforcement-form .loading-spinner{float:left;margin:0 0 0 -20px;vertical-align:middle}.saml-enabled-banner-container{background-image:linear-gradient(-1deg,#fff 0%,#f5f5f5 100%)}.saml-settings-form .test-status-indicator{width:30px;height:30px;margin-top:-4px;border-radius:50%}.saml-settings-form .test-status-indicator .octicon{display:block;margin-top:7px;margin-right:auto;margin-left:auto}.saml-settings-form .form-group.errored{margin-bottom:40px}.saml-settings-form .test-status-indicator-error{color:#fff;background-color:#cb2431}.saml-settings-form .test-status-indicator-success{color:#fff;background-color:#28a745}.saml-settings-form .details-container .method-field{display:none}.saml-settings-form .details-container .method-label{font-weight:400}.saml-settings-form .details-container .details-target{cursor:pointer}.saml-settings-form .details-container.open .method-value, +.saml-settings-form .details-container.open .details-target{display:none}.saml-settings-form .details-container.open .method-field{display:inline-block}.saml-settings-form .saml-enforcement-disabled{opacity:0.5}.form-group .form-control.saml-certificate-field{width:440px;height:150px;min-height:0}.member-avatar-group{margin:-1px}.member-avatar-group::before{display:table;content:""}.member-avatar-group::after{display:table;clear:both;content:""}.member-avatar{float:left;margin:1px}.member-row{width:100%;min-height:40px;padding-bottom:15px;margin-top:15px;font-size:14px;color:#333;border-bottom:1px solid #eee}.member-row::before{display:table;content:""}.member-row::after{display:table;clear:both;content:""}.member-row a:hover{color:#0366d6;text-decoration:none}.member-row:last-child{padding-bottom:0;border-bottom:0}.member-row .member-name{display:block;padding-left:50px}.member-row .member-fullname{display:block;padding-left:50px;word-wrap:break-word}.member-fullname{color:#586069}.org-toolbar.disabled{pointer-events:none}.org-toolbar .subnav-search{width:320px;margin-right:20px;margin-left:0}.org-toolbar .subnav-search-context + .subnav-search{margin-left:-1px}.org-toolbar .subnav-search-input{width:100%}.org-toolbar-next{margin-bottom:24px}.org-toolbar-next .subnav-search{width:240px}.auto-search-group{position:relative}.auto-search-group .auto-search-input{padding-left:30px}.auto-search-group .spinner, +.auto-search-group > .octicon{position:absolute;left:10px;z-index:5;width:16px;height:16px}.auto-search-group .spinner{top:9px;background-color:#fff}.auto-search-group > .octicon{top:10px;font-size:14px;color:#bbb;text-align:center}.org-list .list-item{position:relative;padding-top:15px;padding-bottom:15px;border-bottom:1px solid #eee}.org-list .list-item::before{display:table;content:""}.org-list .list-item::after{display:table;clear:both;content:""}.org-repos .blankslate{margin-top:15px}.org-repos-mini{padding:0;margin:0}.org-repos-mini .org-repo-mini-item:first-child .org-repo-mini-cell{border-top:0}.org-repos-mini .org-repo-name{margin-top:0;margin-bottom:0;font-size:14px;word-wrap:break-word}.org-repos-mini .org-repo-name .octicon-repo{color:#586069}.org-repos-mini .org-repo-name .octicon-lock{color:rgba(115,92,15,0.5)}.org-repos-mini .org-repo-name .repo-prefix{font-weight:400}.org-repos-mini .org-repo-name .repo-slash{display:inline-block;margin-right:-4px;margin-left:-4px}.org-repo-mini-cell{padding-top:15px;padding-bottom:15px;vertical-align:middle}.org-repo-meta{width:165px}.org-repo-meta .access-level{cursor:default}.org-repo-access-level{text-align:center}.org-repo-manage{width:270px}.with-higher-access .table-list-cell-checkbox{vertical-align:top}.permission-level-cell .select-menu-button{width:78px;text-align:left}.permission-level-cell .select-menu-button::after{position:absolute;top:10px;right:10px}.permission-level-cell .spinner, +.permission-level-cell .permission-success-icon{float:none;opacity:0;transition:opacity 0.2s ease-in-out}.permission-level-cell .permission-success-icon{color:#28a745}.permission-level-cell .is-loading .spinner, +.permission-level-cell .was-successful .permission-success-icon{opacity:1}.select-menu-option-title{margin-top:0;margin-bottom:0}.reinstate-org-member{position:relative;width:500px;margin:40px auto}.reinstate-org-member .reinstate-lead{margin-bottom:30px;font-size:16px}.reinstate-org-member label{cursor:pointer}.reinstate-org-member .reinstate-detail-container{margin:15px 0}.reinstate-org-member .reinstate-title{color:#333}.reinstate-org-member .reinstate-title .octicon{width:16px;margin-right:10px;color:#999}.add-member-wrapper{position:relative;width:500px;margin:40px auto}.add-member-wrapper .available-seats{color:#586069}.add-member-wrapper .buy-more-link{margin-right:5px}.cancel-invitation-form{margin-top:-34px}.add-member-lead{font-size:16px}.add-member-roles{margin:30px 0}.add-member-roles .role-make-member{display:block;margin-bottom:10px}.add-member-team-list{display:block;margin-bottom:30px;list-style:none}.add-member-team-list .team-row-header{padding:10px 20px 10px 0;font-size:12px;text-align:right;background:#fafafa;border-top-left-radius:3px;border-top-right-radius:3px}.add-member-team-list .team-row-header .team-row-teams{margin-right:245px}.add-member-team-list .team-row-header .team-row-members{margin-right:35px}.add-member-team-list .team{display:block;font-weight:400;cursor:pointer}.add-member-team-list .team:first-child{border-top:1px solid #f2f2f2}.add-member-team-list .team .btn-sm{float:right}.add-member-team-list .team-info{max-width:80%;color:#000;text-decoration:none}.add-member-team-list .team-meta{margin-top:2px;margin-bottom:2px;color:#586069}.add-member-team-list .team-description{width:260px;margin-top:2px;margin-bottom:2px}.add-member-team-list .team-toggler .turn-on{display:inline-block}.add-member-team-list .team-toggler.on .turn-off{display:inline-block}.add-member-team-list .team-toggler .turn-off{display:none}.add-member-team-list .team-toggler.on .turn-on{display:none}.team-list-footer{padding:10px 0;text-align:center;border-top:1px solid #e5e5e5}.team-list-footer .show-all-link .octicon{margin-left:5px;color:#586069}.invite-team-member-list .team{cursor:default}.invite-team-member-list .team:first-child .table-list-cell{border-top:0}.invite-team-member-list .table-list-cell-checkbox{width:42px}.invite-team-member-list .team-toggler{padding-top:12px;padding-right:3px}.invite-team-member-list .team-info{width:260px;padding:10px 15px 10px 0}.invite-team-member-list .team-description{display:block;padding-top:0;padding-bottom:0;font-weight:400}.invite-team-member-list .team-meta{width:100px;text-align:left;vertical-align:middle}.invite-team-member-list .team-link{color:#0366d6;text-align:right}.migration-jumbotron{height:70vh;min-height:450px;max-height:650px}.migration-jumbotron, +.migration-sub-header{position:relative;margin-top:-1px;background-color:#3f4851;background-image:linear-gradient(#3f4851 0,#282d33 100%)}.migration-jumbotron::after, +.migration-sub-header::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:" ";background-image:url("/images/modules/orgs/dots-bg.png");background-repeat:repeat;background-size:80%;opacity:0.75}.migration-jumbotron-content{position:relative;top:50%;z-index:2;width:980px;padding:100px 60px;margin:0 auto;text-align:center;transform:translateY(-50%)}.migration-jumbotron-octicons{height:60px;margin-bottom:20px;text-align:center}.migration-jumbotron-octicon-item{position:relative;display:inline-block;width:60px;height:60px;margin-right:10px;margin-left:10px;background-image:linear-gradient(-45deg,#6f42c1 30%,#f66a0a 100%);border-radius:50px}.migration-jumbotron-octicon-item::after{position:absolute;top:1px;right:1px;bottom:1px;left:1px;content:"";background-color:#383f47;border-radius:50px}.migration-jumbotron-octicon-item .octicon{position:relative;z-index:2;margin-top:16px;color:hsla(0,0%,100%,0.9)}.migration-jumbotron-title, +.migration-jumbotron-lead, +.migration-sub-title, +.migration-sub-lead{color:#fff;text-shadow:0 1px 1px rgba(0,0,0,0.05)}.migration-jumbotron-title, +.migration-section-title{margin-bottom:10px;font-weight:300}.migration-jumbotron-title{font-size:40px}.migration-section-title{margin-top:0;font-size:30px}.migration-jumbotron-lead{margin-top:0;font-size:24px;opacity:0.85}.migration-section-lead{margin-top:20px;margin-bottom:20px}.migration-jumbotron-btn{padding:12px 18px;font-size:16px;color:#6f42c1;background-color:#fff;border-width:0;box-shadow:0 3px 3px rgba(0,0,0,0.05)}.migration-jumbotron-btn:hover{color:#6f42c1;background-color:#eee}.migration-section{padding-top:100px;padding-bottom:100px;overflow:hidden;border-bottom:1px solid #ddd}.migration-feature-list{margin-top:30px;margin-bottom:20px;overflow:hidden;font-size:14px;color:#586069;list-style:none}.migration-feature-list::before{display:block;width:100px;margin-bottom:30px;content:"";border-top:1px solid #ddd}.migration-feature-list .octicon{width:22px;margin-left:-3px;color:#586069;text-align:center}.migration-feature-list-item{float:left;width:50%;margin-bottom:15px}.migration-section-grey{background-color:#fcfcfc}.migration-illustration-wrapper::before{display:table;content:""}.migration-illustration-wrapper::after{display:table;clear:both;content:""}.migration-illustration{width:700px;margin-top:-30px;margin-bottom:-50px;border:1px solid #ddd;border-radius:3px;box-shadow:0 0 15px rgba(0,0,0,0.05)}.migration-illustration-left{float:right;margin-right:50px}.migration-illustration-right{float:left;margin-left:50px}.migration-section-privileges{padding-top:80px;padding-bottom:80px}.migration-footer{position:relative;z-index:1;padding-top:60px;padding-bottom:60px;margin-bottom:-41px;border-bottom:1px solid #ddd}.migration-footer-content{width:800px;margin:0 auto;text-align:center}.migration-footer-title, +.migration-footer-lead{margin-bottom:0}.migration-footer-lead{margin-top:10px}.migration-footer-btn{margin-top:20px}.migration-sub-header{padding-top:40px;padding-bottom:40px;margin-bottom:40px}.org-settings-updating{padding:15px;margin-top:0;margin-bottom:30px;background-color:#fff;border:1px solid #ddd;border-radius:3px}.org-settings-updating .spinner{display:inline-block;margin-top:-2px;vertical-align:middle}.org-disabled-settings{pointer-events:none;opacity:0.5}.migration-sub-header-content{width:68%}.migration-sub-title{margin-bottom:0}.migration-sub-lead{margin-top:10px;margin-bottom:0}.migration-org-avatar{margin-top:6px;margin-right:72px;border:3px solid #fff;border-radius:3px}.org-migration-settings-sidebar{position:-webkit-sticky;position:sticky;top:20px}.org-migration-settings-sidebar .migrate-org-roles{margin-top:0;margin-bottom:10px}.org-migration-settings-sidebar .preserve-member-privileges-btn{display:none}.org-migration-settings-sidebar .member-privilege-radios-preserved .preserve-member-privileges-btn{display:block}.org-migration-settings-sidebar .member-privilege-radios-preserved .save-member-privileges-btn{display:none}.org-migration-settings-section{position:relative;padding-bottom:50px;margin-right:60px;margin-bottom:50px;border-bottom:1px solid #ddd}.org-migration-settings-section:last-child{padding-bottom:0;margin-bottom:0;border-bottom:0}.org-migration-settings-section .disabled{pointer-events:none;opacity:0.5}.org-migration-settings-section .spinner{display:inline-block;margin-bottom:-3px}.org-migration-settings-icon{position:absolute;left:-45px;color:#ccc}.org-migration-settings-title{margin-bottom:0;font-size:22px;font-weight:400}.org-migration-settings-info{margin-top:5px;margin-bottom:30px;font-size:16px;color:#586069}.migrate-owners-wrapper{position:relative;min-height:550px}.migrate-owners-content-about{position:absolute;top:0;left:50%;width:700px;margin:30px auto 0;text-align:center;transition:opacity 0.2s ease-in-out,transform 0.3s ease-in-out;transform:translate(-50%,0)}.migrate-owners-title{font-size:35px;font-weight:400}.migrate-owners-lead{margin-top:0;margin-bottom:20px}.migrate-owners-content-rename{width:520px;margin:auto}.delete-owners-button{color:#586069}.delete-owners-button:hover{color:#cb2431}.migrate-org-roles{display:table;width:100%;margin-top:-20px;border:1px solid #ddd;border-radius:3px}.migrate-org-roles .tooltipped::after{width:150px;white-space:normal}.no-avatars-roles-matrix .migrate-org-roles{margin-top:5px}.migrate-org-roles-item{display:table-cell;width:33.33%;border-right:1px solid #ddd}.migrate-org-roles-item:last-child{border-right:0}.migrate-ability-list{margin:15px 0;list-style:none}.migrate-ability-list-item{padding-top:5px;padding-bottom:5px;margin:0 20px;font-size:14px}.migrate-ability-list-item:first-child{border-top:0}.migrate-ability-list-item .octicon-check, +.migrate-ability-list-item .octicon-x{width:15px}.migrate-ability-list-item .octicon-check{color:#28a745}.migrate-ability-list-item .octicon-x{color:#aaa}.migrate-ability-list-item .octicon-question{font-size:12px;color:#555}.migrate-ability-not-possible{color:#586069}.default-repository-permission .octicon-x, +.members-can-create-repositories .octicon-x, +.team-privacy .octicon-x{display:none}.default-repository-permission.migrate-ability-not-possible .octicon-x, +.members-can-create-repositories.migrate-ability-not-possible .octicon-x, +.team-privacy.migrate-ability-not-possible .octicon-x{display:inline-block}.default-repository-permission.migrate-ability-not-possible .octicon-check, +.members-can-create-repositories.migrate-ability-not-possible .octicon-check, +.team-privacy.migrate-ability-not-possible .octicon-check{display:none}.migrate-org-roles-header{padding:15px 20px;border-bottom:1px solid #ddd}.migrate-org-roles-title{margin-top:0;margin-bottom:0;font-size:18px;font-weight:400}.migrate-org-roles-lead{margin-top:4px;margin-bottom:0;font-size:14px;color:#586069}.migrate-org-roles-count{padding:10px 20px;color:#586069;border-top:1px solid #ddd}.migrate-org-avatar-list{margin-top:5px;margin-bottom:10px}.migrate-org-avatar-list::before{display:table;content:""}.migrate-org-avatar-list::after{display:table;clear:both;content:""}.migrate-org-avatar-list .migrate-org-avatar, +.migrate-org-avatar-list .migrate-org-avatar-empty{float:left;margin-left:2px}.migrate-org-avatar-list .migrate-org-avatar:first-child, +.migrate-org-avatar-list .migrate-org-avatar-empty:first-child{margin-left:0}.migrate-org-avatar-list .migrate-org-avatar-empty{width:30px;height:30px;border-radius:3px}.migrate-org-avatar-list .migrate-org-more-ellipsis, +.migrate-org-avatar-list .migrate-org-zero{font-size:18px;line-height:30px;color:#586069;text-align:center}.migrate-org-avatar-list .migrate-org-more-ellipsis{font-weight:600;line-height:20px;background-color:#f5f5f5}.migrate-org-avatar-list .migrate-org-zero{color:#586069;border:1px dashed #ddd}.migrate-org-avatar-list .migrate-org-more-ellipsis:hover{text-decoration:none}.migrate-org-avatar-list .tooltipped::after{width:auto;white-space:nowrap}.menu-item .org-avatar, +.menu-item .org-octicon-credit-card{position:absolute}.menu-item .org-octicon-credit-card{right:0}.org-settings-link{display:block;padding:0 30px;word-wrap:break-word}.team-stats{padding-right:15px;padding-left:15px;margin-right:-15px;margin-bottom:-15px;margin-left:-15px;border-top:1px solid #eee}.stats-group{display:table;width:100%;table-layout:fixed}.stats-group-stat{display:table-cell;padding-top:10px;padding-bottom:10px;padding-left:15px;font-size:12px;color:#586069;text-transform:uppercase}.stats-group-stat:first-child{padding-left:0;border-right:1px solid #eee}.stats-group-stat:hover, +.stats-group-stat:hover .stat-number{color:#0366d6;text-decoration:none}.stats-group-stat.no-link:hover{color:#586069;text-decoration:none}.stats-group-stat.no-link:hover .stat-number{color:#333}.stat-number{display:block;font-size:16px;color:#333}.permission-title{margin-top:0}.add-to-org-wrapper{width:500px}.invite-member-results ul{margin:0}.invite-member-header{text-align:center}.add-to-org-title{font-size:21px;font-weight:400;line-height:normal}.team-member-list{list-style:none}.team-member-list .table-list-cell{padding-top:15px;padding-bottom:15px}.team-member-list .team-member-content{margin-left:50px}.team-member-list .team-member-username{margin:0;font-size:14px;font-weight:600;line-height:20px}.team-member-list .Label--gray, +.team-member-list .Label--outline{cursor:default}.team-member-list .invite-icon{width:28px;color:#959da5}.menu-item-danger, +.menu-item-danger.selected{color:#cb2431}.menu-item-danger:hover, .menu-item-danger[aria-selected="true"], .menu-item-danger.navigation-focus, +.menu-item-danger.selected:hover, +.menu-item-danger.selected[aria-selected="true"], +.menu-item-danger.selected.navigation-focus{color:#fff;background:#d73a49}.team-member-list-avatar{float:left;margin-right:10px}.team-member-list-avatar .octicon{width:40px;color:#959da5}.org-team-form .disabled{opacity:0.5}.org-team-form .css-truncate-target{max-width:250px}.confirm-removal-container .private-fork-count{margin-top:0;font-size:12px;font-weight:400;color:#586069}.confirm-removal-container .deleting-private-forks-warning{position:relative;padding-left:26px}.confirm-removal-container .deleting-private-forks-warning .octicon{position:absolute;top:2px;left:0;color:#cb2431}.confirm-removal-list-container{margin-bottom:15px;border:1px solid #eaeaea;border-radius:3px}.confirm-removal-list-item{padding:10px;margin:0;font-size:14px;font-weight:600;border-top:1px solid #eaeaea}.confirm-removal-list-item:first-child{border-top:0}.confirm-removal-team .octicon, +.confirm-removal-repo .octicon{margin-right:3px;color:#586069}.team-repo-access-list{max-height:245px}.manage-member-meta{list-style:none}.manage-member-meta-item{margin-top:12px;color:#586069}.manage-member-meta-item:first-child{margin-top:0}.manage-member-meta-item .btn-link{color:#586069}.manage-member-meta-item > .octicon{width:14px;margin-right:5px;color:#586069;text-align:center}.manage-member-meta-item > .octicon-alert{color:#a04100}.member-two-factor-disabled{color:#cb2431}.manage-member-button{margin-bottom:10px}.org-person-repo-header{margin-top:0}.org-person-repo-search{margin-top:5px;margin-right:5px}.org-user-notice-title{margin-top:0;margin-bottom:0}.org-user-notice-content{margin-top:10px;margin-bottom:10px;font-size:14px}.org-user-notice-content strong{color:#333}.org-user-notice-content:last-child{margin-bottom:0}.org-user-notice-content .octicon{color:#586069}.org-user-notice-icon{float:right;margin:10px 10px 20px;font-size:45px;color:#ccc}.manage-repo-access-header{margin-top:30px;margin-bottom:30px}.manage-repo-access-header::before{display:table;content:""}.manage-repo-access-header::after{display:table;clear:both;content:""}.manage-repo-access-header .btn{margin-top:8px}.manage-repo-access-header .tooltipped::after{width:250px;white-space:normal}.manage-repo-access-heading{margin-top:-2px;margin-bottom:0;font-size:24px;font-weight:400}.manage-repo-access-lead{margin-top:3px;margin-bottom:0;font-size:16px;color:#586069}.manage-repo-access-group{background-color:#fff;border:1px solid #ddd;border-radius:3px}.manage-repo-access-title{padding:12px 15px;margin-top:0;margin-bottom:0;font-size:14px;background-color:#f8f8f8;border-bottom:1px solid #ddd;border-radius:3px 3px 0 0}.manage-repo-access-wrapper{position:relative;padding-left:25px}.manage-repo-access-wrapper::before{position:absolute;top:15px;bottom:15px;left:20px;z-index:1;display:block;width:2px;content:"";background-color:#eee}.manage-repo-access-icon{position:relative;z-index:2;float:left;padding-top:2px;padding-bottom:2px;margin-top:-3px;margin-left:-25px;background:#fff}.manage-repo-access-icon .octicon{font-size:14px;color:#ccc}.manage-repo-access-list{list-style:none}.manage-repo-access-list-item{padding:15px}.manage-repo-access-list-item:last-child{border-bottom:0;border-radius:0 0 3px 3px}.manage-repo-access-teams-group{margin-top:-20px;list-style:none;border:1px solid #ddd;border-radius:3px}.manage-repo-access-team-item{border-top:1px solid #eee}.manage-repo-access-team-item:first-child{border-top:0}.manage-repo-access-description{margin-top:3px;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;white-space:nowrap}.manage-repo-access-not-active{color:#24292e;background-color:#fafbfc}.manage-repo-access-not-active .manage-repo-access-icon{background:#f9f9f9}.manage-access-remove-footer{padding:15px;border-top:1px solid #ddd}.manage-access-remove-footer .tooltipped::after{width:250px;white-space:normal}.manage-access-none{margin:20px 50px;text-align:center}.ldap-group-dn{display:block;font-weight:400;color:#aaa}.ldap-import-groups-container .blankslate{display:none}.ldap-import-groups-container.is-empty .blankslate{display:block}.ldap-import-groups-container.is-empty .ldap-memberships-list{display:none}.ldap-memberships-list{margin-bottom:30px}.ldap-memberships-list .table-list-cell{padding-top:10px;padding-bottom:10px;font-size:13px;vertical-align:middle}.ldap-memberships-list .table-list-cell:last-child{width:92px}.ldap-memberships-list .ldap-list-team-name{width:380px}.ldap-memberships-list .ldap-group-dn{font-size:11px}.ldap-memberships-list .ldap-mention-as{width:260px}.ldap-memberships-list .edit{position:absolute;padding:10px;margin-left:-33px;color:#0366d6;cursor:pointer}.ldap-memberships-list .edit-fields{display:none}.ldap-memberships-list .is-editing .edit-hide{display:none}.ldap-memberships-list .is-editing .edit-fields{display:block}.ldap-memberships-list .is-editing .spinner{margin-left:15px;vertical-align:middle}.ldap-memberships-list .is-removing{opacity:0.25}.ldap-memberships-list .is-removing .edit{opacity:0.5}.team-name-field{height:33px}.ldap-import-form-actions{margin-top:30px}.invited .team-member-list{margin:-20px 0}.invited .team-member-list .list-item{padding:10px 0;border-bottom:1px solid #eee}.invited .team-member-list .list-item::before{display:table;content:""}.invited .team-member-list .list-item::after{display:table;clear:both;content:""}.invited .team-member-list .list-item:last-of-type{border:0}.invited .team-member-list .list-item .edit-invitation{float:right;margin-top:6px}.invited-banner{margin-bottom:20px}.invited-banner::before{display:table;content:""}.invited-banner::after{display:table;clear:both;content:""}.invited-banner .btn-sm{float:right;margin-left:5px}.invited-banner p{font-size:15px;line-height:1.6}.invited-banner .inviter-link{font-weight:600}.manage-member-sso-sessions.has-active-sessions .blankslate{display:none}.manage-memberships-nav{position:relative;top:1px;margin-top:10px}.manage-memberships-tabs-item{color:#586069;white-space:nowrap;cursor:pointer;border:solid transparent;border-width:3px 1px 1px;border-radius:3px 3px 0 0}.manage-memberships-tabs-item:hover{color:#333}.manage-memberships-tabs-item.selected{font-weight:600;color:#24292e;background-color:#fff;border-bottom:2px solid #d26911}.owner-select-grid{margin-left:-8px}.owner-select-grid::before{display:table;content:""}.owner-select-grid::after{display:table;clear:both;content:""}.owner-select-target{float:left;padding:10px;margin:0 10px 20px;font-weight:600;text-align:center;cursor:pointer;background-color:#f2f2f2;border:0;border-radius:3px}.owner-select-target:hover, .owner-select-target:focus{color:#fff;background-color:#0366d6}.owner-select-target:active{color:#fff;background-color:#024ea4}.owner-select-target .css-truncate-target{max-width:90px}.owner-select-target.disabled{color:#6a737d;cursor:not-allowed}.owner-select-target.disabled .user-mention{color:#6a737d}.owner-select-target.disabled .owner-select-avatar{opacity:0.3}.owner-select-avatar{display:block;margin-bottom:9px}.theme-picker{margin-bottom:-1px;background-color:#fff;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.1);box-shadow:0 5px 10px rgba(0,0,0,0.1)}.theme-picker > .container{position:relative;overflow:hidden;text-align:center}.theme-picker-thumbs{border-bottom:1px solid #eee}.theme-toggle{width:32px;height:32px;padding:0;color:#ccc;background:none;border:0}.theme-toggle:hover{color:#0084c8;text-decoration:none}.theme-toggle.disabled, .theme-toggle.disabled:hover{color:#ccc;cursor:not-allowed;opacity:0.3}.theme-toggle-full-left, +.theme-toggle-full-right{position:absolute;top:50px;overflow:hidden}.theme-toggle-full-left{left:4px}.theme-toggle-full-right{right:4px}.theme-selector{height:102px;margin:15px 46px}.theme-selector-thumbnail{padding:2px;border:1px solid #ddd}.theme-selector-thumbnail:hover{text-decoration:none;background-color:#f5f5f5}.theme-selector-thumbnail.selected{padding:3px;background-color:#0366d6;border:0}.theme-selector-thumbnail.selected .theme-selector-img{border:1px solid #fff}.theme-selector-img{width:126px;height:96px;border-radius:1px}.theme-picker-spinner{position:absolute;top:16px;left:50%;margin-left:-16px;background-color:#fff;opacity:0;transition:0.2s,opacity ease-in-out}.theme-picker-spinner.visible{opacity:1}.theme-picker-spinner.visible ~ .theme-picker-controls .theme-name{opacity:0}.theme-picker-view-toggle{float:left}.theme-picker-view-toggle .for-hiding{display:none}.theme-picker-view-toggle.open .for-hiding{display:inline}.theme-picker-view-toggle.open .for-showing{display:none}.theme-picker-controls{position:absolute;top:15px;left:50%;width:220px;margin-left:-110px;line-height:34px;text-align:center}.theme-picker-controls .theme-toggle{vertical-align:middle}.theme-name{display:inline-block;margin-right:10px;margin-left:10px;font-size:20px;line-height:1;vertical-align:middle}.page-preview{z-index:-100;display:block;width:100%;height:6000px;padding:0;background-color:#fff;border:0}.pinned-repos-spinner{position:relative;top:2px;left:6px}.pinned-repos-reorder-error{padding-left:6px;font-size:12px;font-weight:400;color:#86181d}.pinned-repos-setting-link{font-size:13px;font-weight:400}.pinned-repo-name{color:#6a737d}.pinned-repo-checkbox:checked + .pinned-repo-name{color:#24292e;background-color:#f1f8ff}.org-pinned-repos-list.pinned-repos-list{justify-content:flex-start}.org-pinned-repo-item.pinned-repo-item{width:319px;margin-right:11px}.org-pinned-repo-item.pinned-repo-item + .org-pinned-repo-item + .org-pinned-repo-item + .org-pinned-repo-item{margin-right:11px}.org-pinned-repo-item.pinned-repo-item + .org-pinned-repo-item + .org-pinned-repo-item{margin-right:0}.org-pinned-repo-item.pinned-repo-item + .org-pinned-repo-item + .org-pinned-repo-item + .org-pinned-repo-item + .org-pinned-repo-item + .org-pinned-repo-item{margin-right:0}@media print{#serverstats, + .Header, + .header-search, + .site-search, + .reponav, + .comment::before, + .comment::after, + .footer, + .pagehead-actions, + .discussion-timeline-actions, + .timeline-comment-actions, + .timeline-new-comment, + .thread-subscription-status, + .lock-toggle-link, + .header, + .pr-review-tools, + .file-actions, + .js-expandable-line, + .pr-toolbar-shadow, + .pr-toolbar.is-placeholder, + .language-color{display:none!important}.repository-lang-stats-graph{height:0}.btn:not(.btn-outline){color:#24292e!important;background:none}p, + .comment +h2{page-break-inside:avoid}.markdown-body h2{page-break-after:avoid}.topic-tag{padding:0}.topic-tag::before{content:"#";margin-right:-2px}.blob-num{border-right:2px solid #e1e4e8}.blob-num-deletion{border-right-color:#d73a49}.blob-num-addition{border-right-color:#28a745}.blob-code-addition .x{border-bottom:2px solid #28a745;border-radius:0px}.blob-code-deletion .x{border-bottom:2px solid #d73a49;border-radius:0px}.pr-toolbar.is-stuck{position:static!important;width:100%!important}.block-diff-neutral{border:4px solid #d1d5da}.block-diff-deleted{border:4px solid #d73a49}.block-diff-added{border:4px solid #28a745}.State{border:1px #e1e4e8 solid;color:#1b1f23;border-color:none;background:none}.State--green{border:1px solid #2cbe4e;color:#28a745}.State--purple{border:1px solid #6f42c1;color:#6f42c1}.State--red{border:1px solid #cb2431;color:#cb2431}.markdown-body pre > code{white-space:pre-wrap}}.pjax-loader-bar{position:fixed;top:0;left:0;z-index:40;opacity:0;transition:opacity 0.4s linear 0.4s}.pjax-loader-bar .progress{position:fixed;top:0;left:0;height:2px;background:#77b6ff;box-shadow:0 0 10px rgba(119,182,255,0.7);transition:width 0.4s ease}.pjax-loader-bar.is-loading{opacity:1;transition:none}.project-full-screen .pagehead, +.project-full-screen .Header{display:block}@media (min-width: 544px){.project-full-screen .pagehead, + .project-full-screen .Header{display:none}}.project-full-screen .project-header{padding-top:10px;padding-bottom:10px;color:hsla(0,0%,100%,0.75)}@media (min-width: 544px){.project-full-screen .project-header{background-color:#24292e}}.project-full-screen .project-header .project-header-link{color:hsla(0,0%,100%,0.75)!important}.project-full-screen .project-header .project-header-link:hover{color:#fff!important}.project-full-screen .project-header .pending-cards-status{border-color:#24292e}@media (min-width: 544px){.project-full-screen .card-filter-input{color:#fff;background-color:hsla(0,0%,100%,0.125);border:0;outline:none;box-shadow:none}.project-full-screen .card-filter-input:-ms-input-placeholder{color:hsla(0,0%,100%,0.7)}.project-full-screen .card-filter-input::-ms-input-placeholder{color:hsla(0,0%,100%,0.7)}.project-full-screen .card-filter-input::placeholder{color:hsla(0,0%,100%,0.7)}.project-full-screen .card-filter-input:focus{background-color:hsla(0,0%,100%,0.175)}}.project-header{background-color:#eff1f3}@media (min-width: 544px){.project-header{background-color:#fff}}.project-header .select-menu-modal-holder{z-index:500}.project-updated-message{top:6px;left:50%;z-index:50;transform:translate(-50%,0)}.pending-cards-status{top:-2px;right:-9px;z-index:2;width:14px;height:14px;background-image:linear-gradient(#54a3ff,#006eed);background-clip:padding-box;border:2px solid #fff}.project-columns{overflow-x:auto}@media (min-width: 544px){.project-columns-container{height:0;overflow-x:visible!important}}.project-column{min-width:100%;max-width:100%;background-color:#eff1f3;border-width:0!important;border-radius:0!important}.project-column:focus{outline:none}@media (min-width: 544px){.project-column{min-width:355px;max-width:355px;border-width:1px!important;border-radius:6px!important}.project-column:focus{border-color:#2188ff!important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3)}}.project-column.moving{background-color:#f1f8ff!important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3);transform:translateX(4px) translateY(-4px)}.project-column .automation-summary-tooltip::after{max-width:190px!important}.new-project-column{width:315px;border-color:#959da5!important}.project-search-form .loading-indicator{top:21px;right:21px;display:none}.project-search-form.loading .loading-indicator{display:inline-block}.sortable-ghost{background-color:#f6f8fa;opacity:0.5}.project-card .project-reference-markdown > p, .project-card:last-child{margin-bottom:0!important}.project-card:first-child{margin-top:8px!important}@media (min-width: 544px){.project-card:first-child{margin-top:3px!important}}.project-card ul, +.project-card ol{margin-bottom:8px;margin-left:16px}.project-card .contains-task-list{margin-left:24px}.project-card:hover{border-color:#d1d5da!important;box-shadow:0 1px 3px rgba(106,115,125,0.3)!important}.project-card:focus{outline:none}@media (min-width: 544px){.project-card:focus{border-color:#2188ff!important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3)!important}}.project-card.moving{background-color:#f1f8ff!important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3)!important;transform:translateX(4px) translateY(0)}.archived-project-cards-pane .project-card .archived-header{display:flex!important;color:#735c0f}.archived-project-cards-pane .project-card .archive-dropdown-item{display:none}.issue-card.draggable{cursor:move}.issue-card .issue-card-label{max-width:50%}.issue-card .issue-card-label::after{max-width:150px}.issue-card .avatar-stack:hover .from-avatar{margin-right:-4px}.issue-card pre{word-wrap:break-word;white-space:pre-wrap}@keyframes show-pane{0%{transform:translateX(390px)}100%{transform:translateX(0)}}.project-pane{z-index:30;background-clip:padding-box;box-shadow:-3px 0 5px rgba(36,41,46,0.05)}@media (min-width: 544px){.project-pane{position:absolute!important;width:360px!important;height:auto!important;animation:show-pane 0.2s cubic-bezier(0,0,0,1)}}.project-pane .redacted-activity{cursor:help;border-bottom:1px dotted #959da5}.project-pane .project-body-markdown p:last-child, +.project-pane .project-body-markdown ul:last-child, +.project-pane .project-body-markdown ol:last-child{margin-bottom:0}.project-pane-close{color:rgba(27,31,35,0.5)}.project-pane-close:hover{color:rgba(27,31,35,0.7)}.project-note-form textarea{resize:vertical}.card-menu-container .dropdown-menu, +.column-menu-container .dropdown-menu{min-width:180px}.card-octicon{top:6px;left:10px}.card-note-octicon{top:8px}.is-sending .auto-search-group .chooser-spinner{top:15px;right:21px;left:auto}.card-filter-input{width:0}@media (min-width: 544px){.card-filter-input{width:290px}}.card-filter-autocomplete-dropdown{z-index:500;float:none;min-width:240px;max-height:240px;cursor:pointer}.card-filter-autocomplete-dropdown [aria-selected="true"], +.card-filter-autocomplete-dropdown .navigation-focus{color:#fff!important;background-color:#0366d6;border-radius:3px}.card-filter-autocomplete-dropdown [aria-selected="true"] .autocomplete-text-qualifier, +.card-filter-autocomplete-dropdown .navigation-focus .autocomplete-text-qualifier{color:#fff!important}.projects-reset-query:hover .projects-reset-query-icon{background-color:#0366d6}.projects-reset-query-icon{width:18px;height:18px;padding:1px;background-color:#6a737d}.project-small-menu-dropdown::before, +.project-small-menu-dropdown::after{display:none}.project-header-controls, +.project-header-search{flex-grow:1}@media (min-width: 1012px){.project-header-controls, + .project-header-search{flex-grow:0}}.project-header-subnav-search{flex-grow:1}@media (min-width: 544px){.project-header-subnav-search{flex-grow:0}}.project-page .application-main{flex-shrink:0!important}@media (min-width: 544px){.project-page .application-main{flex-shrink:1!important}}.project-page .reponav-small{display:none!important}@media (min-width: 544px){.project-page .reponav-small{display:block!important}}@media (min-width: 1012px){.project-page .reponav-small{display:none!important}}.project-edit-mode .column-menu-container, +.project-edit-mode .column-menu-item{display:none!important}.project-edit-mode .project-move-actions{display:flex!important}.push-board-over{padding-right:0!important;transition:all 0.2s ease}@media (min-width: 544px){.push-board-over{padding-right:360px!important}}.project-touch-scrolling{-webkit-overflow-scrolling:touch}.project-page.menu-active .project-touch-scrolling{-webkit-overflow-scrolling:auto}.projects-comment-form .comment-md-support-link{float:none;width:100%;text-align:center}.projects-comment-form .comment-form-actions{width:100%;padding:8px 16px;margin:4px 0!important}.projects-comment-form .comment-form-actions button{width:100%;margin:4px 0!important}.projects-comment-form .comment-form-head{padding:0!important;margin:0!important;border-bottom:0}.projects-comment-form .comment-form-head .tabnav-tabs{padding:8px 8px 0}.projects-comment-form .comment-form-head .toolbar-commenting{width:100%;background-color:#fff;border-top:1px solid #d1d5da}.projects-comment-form .comment-form-head .toolbar-commenting .toolbar-group{margin:10px 7px 5px!important}.projects-comment-form .comment-form-head::after{display:block;clear:both;content:" "}.projects-comment-form .comment-form-textarea{height:250px!important}.projects-comment-form .preview-content{margin:0;border-top:1px solid #d1d5da}.projects-comment-form .preview-content .comment-body{padding:16px}.project-issue-body-wrapper{max-height:200px;overflow:hidden}.Details--on .project-issue-body-wrapper{max-height:none;overflow:visible}.project-issue-body-blur{height:32px;background:linear-gradient(to top,#fff,hsla(0,0%,100%,0))}.Details--on .project-issue-body-blur{height:0}.project-comment-title-hover .comment-action, +.project-comment-body-hover .comment-action{opacity:0}.project-comment-title-hover:hover .comment-action, +.project-comment-body-hover:hover .comment-action{opacity:1}.project-comment-title-hover .octicon-pencil, +.project-comment-body-hover .octicon-pencil{color:rgba(27,31,35,0.5)}.project-comment-title-hover .octicon-pencil:hover, +.project-comment-body-hover .octicon-pencil:hover{color:#0366d6}.project-comment-body-reaction .timeline-comment-action{padding:4px 8px}.project-comment-reactions .reaction-summary-item{padding:8px}.project-comment-reactions .reaction-summary-item g-emoji{margin:0!important}.vcard-names{line-height:1}.vcard-fullname{font-size:26px;line-height:30px}.vcard-username{font-size:20px;font-style:normal;font-weight:300;line-height:24px;color:#666}.vcard-details{list-style:none}.vcard-details .css-truncate.css-truncate-target{width:100%;max-width:100%}.vcard-details .css-truncate.css-truncate-target div{overflow:hidden;text-overflow:ellipsis}.vcard-detail{padding-left:24px;font-size:14px}.vcard-detail:first-child{padding-top:16px!important;border-top:1px solid #eaecef!important}.vcard-detail:last-child{padding-bottom:16px!important}.vcard-detail .octicon{float:left;width:16px;margin-top:3px;margin-left:-24px;color:#6a737d;text-align:center}.member-badge{padding-left:24px;font-size:14px;color:#0366d6}.member-badge .octicon{float:left;width:16px;margin-left:-24px;color:#6a737d;text-align:center}.member-badge + .member-badge{padding-top:0;margin-top:-3px;border-top:0}.new-user-avatar-cta{font-size:14px;color:#244f79;background-color:#f1f6fb;border:solid 1px #d0e5f8;border-radius:3px}.user-profile-bio{margin-bottom:12px;overflow:hidden;font-size:14px;color:#6a737d}.form-group .form-control.user-profile-bio-field{width:440px;height:5.35em;min-height:0}.user-profile-bio-field-container, +.user-profile-company-field-container{position:relative}.user-profile-bio-message{margin:5px 0 0;font-size:12px;color:#86181d}.vcard-detail{padding-left:22px}.vcard-detail .octicon{margin-left:-22px}.member-badge{font-size:13px}.user-profile-sticky-bar{position:fixed;top:0;z-index:90;width:233px;word-break:break-all;pointer-events:none;opacity:0;transition:0.2s}.user-profile-sticky-bar::after{position:fixed;top:0;right:0;left:0;z-index:100;display:none;height:54px;content:"";background-color:#fff;border-bottom:solid 1px #d1d5da;box-shadow:0 1px 2px rgba(0,0,0,0.075);opacity:0;transition:0.2s}.user-profile-sticky-bar.is-stuck{pointer-events:auto;opacity:1}.user-profile-sticky-bar.is-stuck::after{display:block;opacity:1}.user-profile-mini-vcard{position:relative;top:1px;z-index:110;height:54px}.user-profile-mini-avatar{width:32px}.mini-follow-button{padding:0 8px;line-height:1.5;opacity:0;transition:0.2s}.is-follow-stuck .mini-follow-button{opacity:1}.user-profile-following-container .user-following-container.on .follow, +.user-profile-following-container .user-following-container .unfollow{display:none}.user-profile-following-container .user-following-container .follow, +.user-profile-following-container .user-following-container.on .unfollow{display:block}.vcard-names-container{top:0}.vcard-names-container.is-stuck{pointer-events:none}.vcard-names-container.is-stuck .vcard-names{opacity:0}.vcard-names-container.is-stuck::after{opacity:1}.blocked-user-notice{width:100%;padding:8px 16px;color:#cb2431;text-align:center;border:solid 1px #d73a49;border-radius:3px}.user-profile-nav{background-color:#fff;border-bottom:solid 1px #d1d5da}.user-profile-nav.is-stuck{z-index:90}.pinned-repos-list{display:flex;list-style:none;flex-wrap:wrap;justify-content:space-between}.pinned-repo-item{display:flex;width:359px}.pinned-repo-item .pinned-repository-handle{padding-top:1px;color:#586069}.pinned-repo-item .pinned-repository-handle:hover{cursor:-webkit-grab;cursor:grab}.pinned-repo-item.is-dragging, +.pinned-repo-item.is-dragging .pinned-repository-handle{cursor:-webkit-grabbing;cursor:grabbing}.pinned-repo-item.is-dragging{background-color:#f1f8ff}.pinned-repo-item.sortable-ghost{background-color:#f1f8ff;opacity:0}.pinned-repo-item.empty{border-style:dashed;border-width:1px;align-items:center;justify-content:center}.pinned-repo-item-content{display:flex;width:100%;flex-direction:column}.pinned-repo-desc{flex:1 0 auto}.pinned-repo-meta{display:inline-block}.pinned-repo-meta + .pinned-repo-meta{margin-left:16px}.user-repo-search-results-summary{white-space:normal}.profile-timeline.discussion-timeline{float:none}.profile-timeline.discussion-timeline .profile-timeline-month-heading::after{position:absolute;top:12px;z-index:-1;width:100%;height:1px;content:"";background-color:#eaecef}.profile-timeline.discussion-timeline::before{left:15px;background-color:#eaecef}.profile-timeline.discussion-timeline .contribution-joined-github, +.profile-timeline.discussion-timeline .contribution-first-pull-request, +.profile-timeline.discussion-timeline .contribution-first-repository, +.profile-timeline.discussion-timeline .contribution-first-issue{margin-top:-16px}.profile-break-word{-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-break:break-word}.profile-timeline-year-list{top:74px}.profile-timeline-card-wrapper{border-top:solid 2px #fff;border-bottom:solid 2px #fff}.profile-timeline-card .issue-meta-section .progress-bar{width:40px}.profile-timeline-card .issue-meta-section .octicon{color:#6a737d;vertical-align:middle}.profile-rollup-wrapper .css-truncate-target{max-width:85%}.profile-rollup-wrapper .progress-bar{height:8px;border-radius:2px}.profile-rollup-wrapper + .profile-rollup-wrapper{border-top:1px solid #eaecef}.profile-timeline-card-wrapper + .profile-timeline-card-wrapper{margin-top:24px}.profile-rollup-wrapper + .profile-timeline-card-wrapper{margin-top:0}.profile-timeline-month-heading + .profile-timeline-card-wrapper{margin-top:24px}.profile-rollup-summarized + .profile-rollup-summarized{border-top:1px solid #eaecef}.profile-rollup-icon{display:inline-block;width:16px;text-align:center}.profile-rollup-content{display:none}.profile-rollup-content .content-title:hover .link-gray-dark-underline{text-decoration:underline}.vertical-text-bottom{vertical-align:text-bottom}.profile-rollup-summarized.open > .profile-rollup-content, +.profile-rollup-summarized.open .profile-rollup-toggle-closed, +.profile-rollup-wrapper.open > .profile-rollup-content, +.profile-rollup-wrapper.open .profile-rollup-toggle-closed{display:block}.profile-rollup-summarized.open .profile-rollup-toggle-open, +.profile-rollup-wrapper.open .profile-rollup-toggle-open{display:none}.profile-rollup-toggle-closed{display:none}.profile-rollup-toggle{color:#6a737d;cursor:pointer}.profile-rollup-toggle:hover{color:#0366d6}.pull-request-tab-content{display:none}.pull-request-tab-content.is-visible{display:block}.discussion-timeline p.explain{margin:0;font-size:12px}.pull-request-ref-restore{display:none}.pull-request-ref-restore .animated-ellipsis-container{line-height:16px}.pull-request-ref-restore-text{display:block}.pull-discussion-timeline.is-pull-restorable .pull-request-ref-restore.last{display:block}.stale-files-tab{margin-bottom:10px}.files-bucket{margin-bottom:15px}.full-width .diffbar .container, +.split-diff .diffbar .container{padding-right:0;padding-left:0}.pr-toolbar{position:-webkit-sticky;position:sticky;top:0;z-index:29;height:60px;padding:0 20px;margin:-20px -20px 0;background-color:#fff}.pr-toolbar .stale-files-tab{float:left;padding:5px 10px;margin-top:-5px;margin-bottom:-5px;color:#a04100;background-color:#fff8f2;border-radius:3px}.pr-toolbar .subset-files-tab{float:left;padding:5px 10px;margin-top:-5px;margin-bottom:-5px;font-size:13px;color:#0366d6;background-color:#e6f1f6;border-radius:3px}.pr-toolbar .stale-files-tab-link{font-weight:600;color:inherit}.pr-toolbar.is-stuck + .pr-toolbar-shadow{position:fixed;top:60px;right:0;left:0;z-index:28;display:block;height:5px;content:"";background:linear-gradient(rgba(0,0,0,0.075),rgba(0,0,0,0.001)) repeat-x 0 0;border-top:1px solid rgba(0,0,0,0.15)}.pr-toolbar .float-right .diffbar-item{margin-right:0}.pr-toolbar .float-right .diffbar-item + .diffbar-item{margin-left:20px}.files-next-bucket .file, +.files-next-bucket .full-commit{margin-top:0;margin-bottom:20px}.diffbar{height:20px;padding-top:20px;padding-bottom:20px;background-color:#fff}.diffbar::before{display:table;content:""}.diffbar::after{display:table;clear:both;content:""}.diffbar .container{width:auto}.diffbar .table-of-contents{margin-bottom:0}.diffbar .table-of-contents ol{margin-bottom:-15px}.diffbar .table-of-contents li{border-top:1px solid #eee}.diffbar .table-of-contents li:first-child{border-top:0}.diffbar [aria-selected="true"] .text-emphasized, +.diffbar .navigation-focus .text-emphasized{color:#fff}.diffbar-range-menu .select-menu-modal{width:380px}.diffbar-range-menu .css-truncate-target{max-width:280px}.diffbar-range-menu .select-menu-item:not(.select-menu-action){padding:8px 10px}.diffbar-range-menu .emoji{vertical-align:bottom}.diffbar-range-menu .in-range:not([aria-selected="true"]):not(.is-range-selected), +.diffbar-range-menu .in-range:not(.navigation-focus):not(.is-range-selected){background-color:#f1f8ff;border-bottom-color:rgba(27,31,35,0.15)}.diffbar-range-menu .is-range-selected{color:#735c0f;cursor:default;background-color:#fffbdd;border-bottom-color:rgba(38,44,49,0.15);outline:none}.diffbar-range-menu .is-range-selected .text-emphasized{color:#776521}.diffbar-range-menu .is-range-selected .description{color:inherit}.diffbar-range-menu .is-last-in-range{cursor:pointer;background-color:#fff5b1}.diffbar-item{float:left;margin-right:20px;font-size:13px;line-height:20px;vertical-align:middle}.fork-collab-tip{width:270px;margin-top:-30px}.fork-collab-tip.dropdown-menu-s{margin-top:10px}.fork-collab-link{margin-left:15px}.conflict-resolver .conflict-loader, +.conflict-resolver.loading .resolve-file-form{display:none}.conflict-resolver .resolve-file-form, +.conflict-resolver.loading .conflict-loader{display:block}.conflict-resolver.loading{position:relative;height:calc(100vh + 51px);padding-top:50px;border:1px #e1e4e8 solid}.conflict-resolver .file-header{padding:9px 10px}.conflicts-nav{height:100vh;-ms-overflow-style:-ms-autohiding-scrollbar;border-width:0 0 1px}.conflict-nav-item .discussion-item-icon{display:none}.conflict-nav-item.resolved .discussion-item-icon{display:block;margin-left:-5px}.conflict-nav-item.resolved .octicon-file-code{display:none}.conflict-nav-item.selected::before{border-radius:0}.conflict-nav-item .octicon{width:22px}.conflict-nav-item .css-truncate-target{max-width:100%}.is-resolved .file-actions{display:none}.is-resolved .resolved-notice{display:block}.resolved-notice{display:none}.finish-review-label, +.add-comment-label, +.review-cancel-button, +.is-review-pending .start-review-label{display:none}.start-review-label, +.is-review-pending .finish-review-label, +.is-review-pending .add-comment-label{display:inline-block}.is-review-pending .review-simple-reply-button{display:none}.is-review-pending .review-cancel-button{display:block}.is-review-pending .review-title-with-count{display:block}.review-title-with-count{display:none}.pr-review-tools{margin-top:-4px}.pr-review-tools .Counter{display:none}.is-review-pending .pr-review-tools .Counter{display:inline-block}.pull-request-review-menu{top:30px;left:initial;z-index:99;width:700px;margin:0;border:1px solid rgba(27,31,35,0.15);transform:initial}.pull-request-review-menu::after, .pull-request-review-menu::before{display:none}.pull-request-review-menu .select-menu-header{border-radius:3px 3px 0 0}.pull-request-review-menu .form-actions{border-radius:0 0 3px 3px}.pull-request-review-menu .preview-content{max-height:365px}.pull-request-review-menu .comment-body{border-bottom:0!important}.review-thread{border:1px #e1e4e8 solid;border-radius:3px}.review-thread:not(:last-child){margin-bottom:16px}.last-review-thread{padding:10px 10px 0;margin:10px -10px 0;border-top:1px solid #e1e4e8}.review-comment-contents{margin-left:44px}.review-comment-contents .timestamp{color:inherit;white-space:nowrap}.review-comment::after, +.review-comment-loader::after, +.review-comment.is-comment-editing::after{position:absolute;top:31px;left:29px;z-index:-1;width:3px;height:100%;content:"";background-color:#f6f8fa}.review-comment{position:relative;padding:8px 16px}.review-comment:first-child{padding-top:16px}.review-comment:last-child{padding-bottom:16px}.review-comment .comment-body, +.review-comment .comment-reactions{padding:0}.review-comment .comment-body{padding-top:4px}.review-comment .comment-body .suggested-change-form-container:nth-last-of-type(2){margin-bottom:0!important}.review-comment .comment-reactions{margin-top:5px;border-top:0}.review-comment .comment-reactions .add-reaction-btn{padding:4px 10px}.review-comment .comment-reactions.has-reactions{margin-top:12px}.review-comment .add-reaction-popover.dropdown-menu-sw, +.review-comment .show-more-popover.dropdown-menu-sw{right:-5px;margin-top:5px}.review-comment .add-reaction-popover.dropdown-menu-ne{left:9px}.review-comment .reaction-summary-item:not(.add-reaction-btn){padding:0 8px;font-size:12px;line-height:26px;border:1px solid #d2dff0;border-radius:3px}.review-comment .reaction-summary-item:not(.add-reaction-btn) .emoji{font-size:16px;vertical-align:sub}.review-comment .reaction-summary-item:not(.add-reaction-btn) + .reaction-summary-item{margin-left:8px}.review-comment:last-child::after, +.review-comment:last-child .review-comment-contents::after{display:none}.review-comment .timeline-comment-actions{opacity:0}.review-comment:hover .timeline-comment-actions, +.review-comment.is-reacting .timeline-comment-actions{opacity:1}.review-comment .timeline-comment-action{padding:0 5px}.review-comment .timeline-comment-label{float:none;margin-top:0}.review-comment .is-comment-editing{position:relative;background-color:#fff;border:1px #e1e4e8 solid;border-radius:3px}.review-comment .is-comment-editing::after{top:100%;bottom:0;left:19px;height:20px}.review-comment .is-comment-editing .timeline-comment-actions, +.review-comment .is-comment-editing .edit-comment-hide{display:none}.review-comment .is-comment-editing .previewable-comment-form{display:block}.review-comment.is-comment-loading .previewable-comment-form{opacity:0.5}.review-comment.is-comment-stale .comment-form-stale{display:block}.timeline-comment.is-comment-editing .discussion-item-header{display:none}.discussion-item-body .outdated-comment .hide-outdated-button{display:none}.discussion-item-body .outdated-comment.file{margin:4px 0}.discussion-item-body .outdated-comment .file-header{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.discussion-item-body .outdated-comment[open] .hide-outdated-button{display:block}.discussion-item-body .outdated-comment[open] .show-outdated-button{display:none}.discussion-item-body .outdated-comment[open] .file-header{border-bottom:1px #e1e4e8 solid;border-bottom-right-radius:0;border-bottom-left-radius:0}.discussion-item-body .outdated-comment .blob-code{position:static}.discussion-item-body .outdated-comment-label{height:26px;margin-top:3px;line-height:25px}.discussion-item-body .outdated-comment-label .octicon{top:1px}.review-thread-reply{padding:8px 16px;background-color:#f6f8fa;border-top:1px #e1e4e8 solid;border-radius:0 0 3px 3px}.discussion-item-review .review-thread-reply{margin-bottom:0;border-width:1px 0 0}.review-thread-reply .inline-comment-form{margin:-8px -16px;background-color:#fff;border:0}.review-thread-reply-button{display:inline-block;min-height:28px;padding:3px 8px;margin-left:8px;cursor:text}.review-summary-form-wrapper{display:none;margin-bottom:24px;margin-left:-20px;background-color:#fff;border:1px #e1e4e8 solid;border-radius:3px}.is-pending .review-summary-form-wrapper, +.is-comment-editing .review-summary-form-wrapper{display:block}.is-pending .review-summary-form-wrapper{border-color:#d9d0a5}.tooltipped-left::after{right:auto;left:0}.tooltipped-left::before{right:auto;left:0}.discussion-item-review .edit-review{opacity:0;transition:opacity 0.15s ease 0s}.discussion-item-review:hover .edit-review{opacity:1}.diffstat-summary{padding:0 20px 0 0;font-size:16px;line-height:1.8;color:#586069;text-align:left;vertical-align:middle;border-radius:3px}.diffstat-summary a{color:#555}.diffstat-summary strong{color:#333}.authors-and-code .insertions{color:#28a745}.authors-and-code .deletions{color:#cb2431}.authors-and-code .section{display:table-cell;width:459px;height:150px}.pulse-authors-graph{position:relative;height:150px}.pulse-authors-graph > svg{width:100%}.pulse-authors-graph .dots{position:absolute;top:40px;right:0;left:0;width:64px;height:64px;margin:0 auto}.pulse-authors-graph .bar rect{fill:#f66a0a;fill-opacity:0.7}.pulse-authors-graph .bar rect:hover{fill-opacity:1}.summary-stats{display:table;width:100%;table-layout:fixed}.summary-stats li{display:table-cell;color:#586069;text-align:center;border-left:1px solid #e1e4e8}.summary-stats li a{display:block;padding-bottom:10px;color:#586069;text-decoration:none}.summary-stats li a:hover{background:#fafafa}.summary-stats li .octicon-git-pull-request{color:#6f42c1}.summary-stats li .octicon-git-branch{color:#28a745}.summary-stats li .octicon-issue-closed{color:#cb2431}.summary-stats li .octicon-issue-opened{color:#28a745}.summary-stats li:first-child{border-left:0;border-bottom-left-radius:3px}.summary-stats li .num{display:block;padding-top:10px;font-size:16px;font-weight:600;color:#000}.pulse-sections{margin-top:20px;clear:both}.pulse-section{padding:0;clear:both;font-size:14px;color:#666}.pulse-section p{margin-top:20px}.readme.contributing > div{max-height:250px;overflow:auto}.readme .markdown-body, +.readme .plain{padding:45px;word-wrap:break-word;background-color:#fff;border:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.readme .plain pre{font-size:15px;white-space:pre-wrap}.file .readme .markdown-body{padding:45px;border:0;border-radius:0}.file .readme table[data-table-type="yaml-metadata"]{font-size:12px;line-height:1}.file .readme table[data-table-type="yaml-metadata"] table{margin:0}.release-timeline-tags .tag-timeline-date::after{position:absolute;top:50%;right:-7px;z-index:10;display:block;width:12px;height:12px;box-sizing:border-box;margin-top:-6px;content:" ";background-color:#e1e4e8;border:2px solid #fff;border-radius:6px}.release-timeline-tags.is-collapsed .expander{display:block!important}.release-timeline-tags.is-collapsed > .collapsable{display:none}.Label--draft{color:#cb2431;border-color:#d73a49}.Label--prerelease{color:#f66a0a;border-color:#f66a0a}.uploaded-files{border-top-left-radius:3px;border-top-right-radius:3px}.uploaded-files.not-populated + .drop-target p{border-top:1px #c3c8cf;border-top-left-radius:3px;border-top-right-radius:3px}.uploaded-files.is-populated{border:1px solid #ddd;border-bottom-color:#e5e5e5}.uploaded-files.is-populated + .drop-target p{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.uploaded-files > li.delete{background:#f9f9f9}.uploaded-files > li.delete:nth-child(2){border-top-left-radius:3px;border-top-right-radius:3px}.uploaded-files > li.delete .delete-pending{display:block!important}.uploaded-files > li.delete .live{display:none!important}.uploaded-files > li:nth-child(2){border-top:0!important}.uploaded-files .remove:hover{color:#cb2431!important}.upload-progress{height:3px;margin-top:3px;border-radius:30px;box-shadow:0 1px 1px #fff,inset 0 1px 1px hsla(0,0%,100%,0.5)}.upload-progress .upload-meter{background-image:linear-gradient(#8dd2f7,#58b8f4);border-radius:30px}.release-entry{border-bottom:1px #e1e4e8 solid}.release-entry:last-child{border-bottom:0}@media (min-width: 768px){.release-tag-field{width:130px!important}.release-main-section{border-left:2px solid #e1e4e8}.release-entry{border-bottom:0}}.repo-file-upload-progress{position:relative;height:0;overflow:hidden;color:#246;background:#f7fbfe;border-bottom-right-radius:3px;border-bottom-left-radius:3px;box-shadow:0 0 0 1px #d0dbe7 inset;transition:height 0.2s ease-out}.repo-file-upload-progress.active{height:50px}.repo-file-upload-progress.is-file-list{border-bottom-right-radius:0;border-bottom-left-radius:0}.repo-file-upload-progress .repo-file-upload-meter{position:absolute;top:1px;left:1px;width:0;height:48px;background:#d8e8f7}.repo-file-upload-progress .repo-file-upload-meter-text{position:absolute;top:7px;left:10px}.repo-file-upload-progress .repo-file-upload-meter-text .repo-file-upload-info{display:block;font-weight:600}.repo-file-upload-progress .repo-file-upload-meter-text .repo-file-upload-meter-filename{display:block;margin:0}.manifest-commit-form{margin-top:20px}.repo-file-upload-outline{width:100%;height:100%}.repo-file-upload-target{position:relative;padding-top:100px;padding-bottom:80px;color:#666}.repo-file-upload-target.is-progress-bar, .repo-file-upload-target.is-uploading{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.repo-file-upload-target.is-file-list{border-bottom-right-radius:0;border-bottom-left-radius:0}.repo-file-upload-target.is-uploading .repo-file-upload-text.initial-text, .repo-file-upload-target.is-failed .repo-file-upload-text.initial-text, .repo-file-upload-target.is-default .repo-file-upload-text.initial-text{display:none}.repo-file-upload-target.is-uploading .repo-file-upload-text.alternate-text, .repo-file-upload-target.is-failed .repo-file-upload-text.alternate-text, .repo-file-upload-target.is-default .repo-file-upload-text.alternate-text{display:block}.repo-file-upload-target.is-uploading.dragover .repo-file-upload-text, .repo-file-upload-target.is-failed.dragover .repo-file-upload-text, .repo-file-upload-target.is-default.dragover .repo-file-upload-text{display:none}.repo-file-upload-target .repo-file-upload-text.initial-text{display:block}.repo-file-upload-target .repo-file-upload-text.alternate-text{display:none}.repo-file-upload-target .repo-file-upload-text, +.repo-file-upload-target .repo-file-upload-drop-text{margin-bottom:5px}.repo-file-upload-target .repo-file-upload-choose{display:inline-block;margin-top:0;font-size:18px}.repo-file-upload-target .manual-file-chooser{margin-left:0}.repo-file-upload-target .repo-file-upload-outline{position:absolute;top:3%;left:1%;width:98%;height:94%}.repo-file-upload-target.is-failed .repo-file-upload-outline, +.repo-file-upload-target.is-bad-file .repo-file-upload-outline, +.repo-file-upload-target.is-too-big .repo-file-upload-outline, +.repo-file-upload-target.is-too-many .repo-file-upload-outline, +.repo-file-upload-target.is-empty .repo-file-upload-outline{height:85%}.repo-file-upload-target.dragover .repo-file-upload-text{display:none}.repo-file-upload-target.dragover .repo-file-upload-choose{visibility:hidden}.repo-file-upload-target.dragover .repo-file-upload-drop-text{display:block}.repo-file-upload-target.dragover .repo-file-upload-outline{border:6px #ddd dashed;border-radius:5px}.repo-file-upload-target .repo-file-upload-drop-text{display:none}.repo-file-upload-errors{display:none}.repo-file-upload-errors .error{display:none}.is-failed .repo-file-upload-errors, +.is-bad-file .repo-file-upload-errors, +.is-too-big .repo-file-upload-errors, +.is-too-many .repo-file-upload-errors, +.is-hidden-file .repo-file-upload-errors, +.is-empty .repo-file-upload-errors{position:absolute;right:0;bottom:0;left:0;display:block;padding:5px 8px;line-height:1.5;text-align:left;background-color:#fff;border-top:1px solid #e5e5e5;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.is-file-list .repo-file-upload-errors{border-bottom-right-radius:0;border-bottom-left-radius:0}.is-failed .repo-file-upload-errors .failed-request, +.is-bad-file .repo-file-upload-errors .failed-request{display:inline-block}.is-too-big .repo-file-upload-errors .too-big{display:inline-block}.is-hidden-file .repo-file-upload-errors .hidden-file{display:inline-block}.is-too-many .repo-file-upload-errors .too-many{display:inline-block}.is-empty .repo-file-upload-errors .empty{display:inline-block}.repo-file-upload-tree-target{position:fixed;top:0;left:0;z-index:1000;width:100%;height:100%;padding:12px;color:#666;visibility:hidden;background:radial-gradient(ellipse at center,#fff 0%,hsla(0,0%,100%,0.85) 65%,hsla(0,0%,100%,0.85) 100%);opacity:0;transition:visibility 0.2s,opacity 0.2s}.repo-file-upload-tree-target .repo-file-upload-outline{border:6px #ddd dashed;border-radius:5px}.dragover .repo-file-upload-tree-target{visibility:visible;opacity:1}.dragover .repo-file-upload-tree-target .repo-file-upload-slate{top:50%;opacity:1}.dragover .repo-file-upload-tree-target .files-lg > .file-graph{opacity:1;transform:translateX(4px)}.dragover .repo-file-upload-tree-target .files-lg > .file-zip{opacity:1;transform:translateX(9px)}.dragover .repo-file-upload-tree-target .files-lg > .file-generic{opacity:1;transform:translateX(-4px)}.dragover .repo-file-upload-tree-target .files-lg > .file-acrobat{opacity:1;transform:translateX(-9px)}.repo-file-upload-slate{position:absolute;top:50%;width:100%;text-align:center;transform:translateY(-50%)}.repo-file-upload-slate h2{margin-top:5px}.repo-file-upload-slate .file-graph{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275),transform 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275);transform:translateX(50px)}.repo-file-upload-slate .file-zip{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275),transform 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275);transform:translateX(90px)}.repo-file-upload-slate .file-generic{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275),transform 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275);transform:translateX(-50px)}.repo-file-upload-slate .file-acrobat{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275),transform 0.2s 0.12s cubic-bezier(0.175,0.885,0.32,1.275);transform:translateX(-90px)}.repo-file-upload-file-wrap .name{color:#888}.repo-file-upload-file-wrap .actions{width:50px;padding-right:10px;text-align:right}.repo-file-upload-file-wrap .remove-file{color:#888}.repo-file-upload-file-wrap .remove-file:hover{color:#666}.repo-upload-breadcrumb{margin-bottom:18px}.labels-list .blankslate{display:none}.labels-list .table-list-header{display:block}.labels-list.is-empty .blankslate{display:block}.labels-list.is-empty .table-list-header{display:none}.labels-list-item .table-list-cell{width:100%}.label-description{padding:8px 16px}.label-delete-confirmation{line-height:34px}.labels-list-action{display:block;float:left;padding:8px 10px;color:#586069}.labels-list-action .octicon{margin-right:2px}.labels-list-action .octicon-pencil{font-size:14px}.sidebar-labels .sidebar-labels-style{margin-top:3px}.label-select-menu-item .g-emoji{font-size:12px;line-height:1;vertical-align:baseline}.new-label{padding:10px;margin-bottom:15px;background-color:#fafbfc;border:1px solid #e5e5e5;border-radius:3px}.new-label .label-edit::before{display:table;content:""}.new-label .label-edit::after{display:table;clear:both;content:""}.label-edit::before{display:table;content:""}.label-edit::after{display:table;clear:both;content:""}.label-edit label{display:block;margin-bottom:8px}.label-edit .error{float:left;margin-top:8px;margin-left:10px;color:red}.label-edit.is-valid .octicon-check{display:block}.label-edit.loading{display:block}.label-delete-form{display:inline}.label-delete-form.loading .label-delete-spinner{display:block}.label-delete-spinner{display:none;float:left;margin-top:10px;margin-right:10px}.label-characters-remaining{color:#586069}.emoji-size-boost .IssueLabel .g-emoji{top:0;font-size:1.15em;line-height:1.1}.repo-list{position:relative}.repo-list-item{position:relative;padding-top:30px;padding-bottom:30px;list-style:none;border-bottom:1px solid #eee}.repo-list-item-with-avatar{padding-left:42px}.repo-list-item-hanging-avatar{float:left;margin-left:-42px}.mini-repo-list-item{position:relative;display:block;padding:6px 64px 6px 30px;font-size:14px;border-top:1px solid #d1d5da}.mini-repo-list-item:hover{text-decoration:none}.mini-repo-list-item:hover .repo, +.mini-repo-list-item:hover .owner{text-decoration:underline}.mini-repo-list-item .repo-icon{float:left;margin-top:2px;margin-left:-20px;color:#666}.mini-repo-list-item .repo-and-owner{max-width:220px}.mini-repo-list-item .owner{max-width:110px}.mini-repo-list-item .repo{font-weight:600}.mini-repo-list-item .stars{position:absolute;top:0;right:10px;margin-top:6px;font-size:12px;color:#6a737d}.mini-repo-list-item .repo-description{display:block;max-width:100%;font-size:12px;line-height:21px;color:#586069}.private .mini-repo-list-item{background-color:#fffdef}.private .mini-repo-list-item .repo-icon{color:rgba(27,31,35,0.7)}.filter-bar{padding:10px;background-color:#fafbfc;border-bottom:1px solid #e5e5e5}.filter-bar::before{display:table;content:""}.filter-bar::after{display:table;clear:both;content:""}.user-repos .filter-bar{text-align:center}.url-box{width:100%;height:26px;padding:10px 10px 0;margin-top:10px;margin-left:-10px;border-top:1px solid #ddd}.url-box p{float:left;height:26px;margin:0 0 0 5px;line-height:26px}.url-box p strong{color:#000}.clone-url-button{display:table-cell;width:1%;vertical-align:top}.clone-url-button:first-child .clone-url-link{border-top-left-radius:3px;border-bottom-left-radius:3px}.clone-url-button > .clone-url-link{position:relative;display:block;padding:0 9px;margin-right:-1px;font-size:11px;font-weight:600;line-height:26px;color:#333;text-decoration:none;white-space:nowrap;cursor:pointer;background-image:linear-gradient(#fafafa,#eaeaea);border:1px solid #ccc}.clone-url-button > .clone-url-link:hover, .clone-url-button > .clone-url-link:active{z-index:3;color:#fff;text-decoration:none;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-image:linear-gradient(#599bcd,#3072b3);border-color:#2a65a0}.clone-url-button > .clone-url-link:active{background-color:#3072b3;background-image:none;border-color:#25588c;box-shadow:inset 0 3px 5px rgba(0,0,0,0.15)}.clone-url-button > .clone-url-link:focus{outline:0}.clone-url-button + .clone-url-button > .clone-url-link{box-shadow:inset 1px 0 0 #fff}.clone-url-button + .clone-url-button > .clone-url-link:hover{box-shadow:none}.clone-url-button + .clone-url-button > .clone-url-link:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.15)}.clone-url-button.selected > .clone-url-link, +.clone-url-button.selected > .clone-url-link:hover{z-index:2;color:#333;text-shadow:0 1px 0 hsla(0,0%,100%,0.6);background-color:#ccc;background-image:linear-gradient(#ccc,#d5d5d5);border-color:#bbb;box-shadow:inset 0 2px 3px rgba(0,0,0,0.075)}.url-box-clippy .zeroclipboard-button{margin-left:0!important;border-left:0;border-radius:0 3px 3px 0}.repository-import .repository-import-label{display:block;margin-bottom:8px;font-size:18px;font-weight:400}.repository-import .state-header{font-size:16px}.text-yellow{color:rgba(115,92,15,0.5)}.timeout{width:auto;height:300px;padding:0;margin:20px 0;background-color:transparent;border:0}.timeout h3{padding-top:100px;color:#586069}.overall-summary{position:relative;margin-bottom:10px;border:1px solid #dfe2e5;border-radius:3px}.overall-summary-bottomless{margin-bottom:0;border-bottom:0;border-radius:3px 3px 0 0}.numbers-summary{display:table;width:100%;table-layout:fixed}.numbers-summary li{display:table-cell;padding:0;text-align:center;white-space:nowrap}.numbers-summary a, +.numbers-summary .nolink{display:block;padding:10px 0;color:#586069;text-decoration:none}.numbers-summary .octicon{color:#6a737d}.numbers-summary a:hover{color:#0366d6}.numbers-summary a:hover .num{color:inherit}.repo-language-color{position:relative;top:1px;display:inline-block;width:12px;height:12px;border-radius:50%}.experiment-repo-nav .capped-cards .capped-card{width:480px}.experiment-repo-nav .new-issue-form{padding-top:0;border-top:0}.experiment-repo-nav.repohead .repo-mirror{padding-left:20px}.iconbutton .octicon{margin-right:0}.file-navigation::before{display:table;content:""}.file-navigation::after{display:table;clear:both;content:""}.file-navigation.in-mid-page{margin-top:15px}.file-navigation .select-menu-button .css-truncate-target{max-width:200px}.file-navigation .branch-select-menu{margin-right:6px;margin-bottom:10px}.file-navigation .new-pull-request-btn{float:left}.file-navigation .breadcrumb{float:left;margin-top:0;margin-left:5px;font-size:16px;line-height:26px}.file-navigation + .breadcrumb{margin-bottom:10px}.file-navigation .BtnGroup{margin-bottom:10px;margin-left:10px}.file-navigation .get-repo-select-menu{margin-left:6px}.file-navigation .get-repo-modal{top:6px;width:352px}.file-navigation .get-repo-modal .https-clone-options{display:block}.file-navigation .get-repo-modal .ssh-clone-options{display:none}.file-navigation .get-repo-modal.on .https-clone-options{display:none}.file-navigation .get-repo-modal.on .ssh-clone-options{display:block}.file-navigation .get-repo-modal .get-repo-modal-options{display:block}.file-navigation .get-repo-modal.is-downloading .get-repo-modal-options{display:none}.file-navigation .get-repo-modal .animated-ellipsis-container{width:16px;height:16px}.file-navigation .get-repo-modal .animated-ellipsis-container > .animated-ellipsis{animation:ellipsis 1s infinite}@keyframes ellipsis{from{width:2px}to{width:16px}}.file-navigation .btn-change-protocol{font-size:12px}.file-navigation .get-repo-decription-text{font-size:13px}.file-navigation .get-repo-btn{float:left;width:50%;padding:10px 0;text-align:center;border:0;border-top:1px solid #e1e4e8;border-radius:0}.file-navigation .get-repo-btn:first-child{border-right:1px solid #e1e4e8;border-bottom-left-radius:3px}.file-navigation .get-repo-btn:nth-child(1):nth-last-child(3){border-radius:0}.file-navigation .get-repo-btn:last-child{border-bottom-right-radius:3px}.file-navigation .get-repo-btn.btn-block, .file-navigation .get-repo-btn:only-child{width:100%;border-right:0;border-radius:0 0 3px 3px}.file-navigation .clone-options{padding:8px 16px 16px}.file-wrap{margin-bottom:10px;border:1px solid #dfe2e5;border-top:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.file-wrap .include-fragment-error{display:none}.file-wrap.is-error .include-fragment-error{display:table-row}table.files{width:100%;background:#fff;border-radius:2px}table.files tr[aria-selected="true"] td, +table.files tr.navigation-focus td{background:#f6f8fa}table.files td{padding:6px 3px;line-height:20px;border-top:1px solid #eaecef}table.files td.icon{width:17px;padding-right:2px;padding-left:10px;color:rgba(3,47,98,0.55)}table.files td.icon .octicon-file-directory{color:rgba(3,47,98,0.5)}table.files td.icon .spinner{position:relative;top:3px;display:none;margin-top:-3px;margin-left:-2px}table.files td .simplified-path{color:#6a737d}table.files td .css-truncate{max-width:100%}table.files td.content{max-width:180px}table.files td.message{max-width:442px;padding-left:10px;overflow:hidden;color:#6a737d}table.files td.message .emoji{vertical-align:top}table.files td.message a{color:#6a737d}table.files td.message a:hover{color:#0366d6}table.files td.age{width:125px;padding-right:10px;color:#6a737d;text-align:right;white-space:nowrap}table.files .message .tooltipped::before, +table.files .message .tooltipped::after{display:none}table.files tr.is-loading td.icon .octicon{display:none}table.files tr.is-loading td.icon .spinner{display:inline-block}table.files tr.up-tree{border-top:1px solid #eaecef;border-bottom:1px solid #eaecef}table.files tr.up-tree a{padding:3px 6px;margin-left:-3px;font-weight:600;border-radius:2px}table.files tr.up-tree a:hover{background-color:#dfe2e5}table.files tbody tr:first-child td{border-top:0}.branch-infobar{padding:8px;color:#586069;background-color:#fafbfc;border:solid #dfe2e5;border-width:1px 1px 0;border-top-left-radius:3px;border-top-right-radius:3px}.branch-infobar::before{display:table;content:""}.branch-infobar::after{display:table;clear:both;content:""}.branch-infobar .muted-link{display:inline-block;margin-left:10px}.branch-infobar .muted-link .octicon{color:#959da5}.branch-infobar .muted-link:hover .octicon{color:inherit}.spinner-forking{display:block;margin:20px auto 40px}.prereceive-feedback{padding:15px;margin-bottom:15px;border:1px solid #dfe2e5;border-left:3px solid #caa21a;border-radius:3px}.prereceive-feedback-heading{margin-top:0;margin-bottom:10px;color:#b08800}.file-navigation-options{float:right;margin-left:3px}.file-navigation-options.active .dropdown-menu-content{display:block}.file-navigation-options .dropdown-menu{width:360px;padding:15px}.file-navigation-options .dropdown-divider{margin:15px -15px}.file-navigation-option{position:relative;display:inline-block;margin-left:3px}.file-navigation-option .select-menu{display:inline-block;margin-right:0;margin-bottom:0;vertical-align:middle}.file-navigation-option .select-menu-button .octicon:only-child{margin-left:2px}.file-navigation-option .zeroclipboard-button{padding-right:8px}.file-navigation-option .input-group{width:290px}.file-navigation-option .input-group .form-control{width:calc(100% + 2px);height:28px;min-height:0;margin-right:-1px;margin-left:-1px;border-radius:0}.file-navigation-option .input-group .select-menu-button{position:relative;z-index:2}.profile-picture{margin:10px 0 0}.profile-picture > p{float:left;margin:0;line-height:30px}.profile-picture > img{float:left;margin:0 10px 0 0;border-radius:3px}.app-owner{margin:15px 0 0}.edit-profile-avatar{width:200px}.edit-profile-avatar .drag-and-drop{padding:0;color:#666;border-width:0}.edit-profile-avatar input{cursor:pointer}.edit-profile-avatar.is-bad-file{border:0}.edit-profile-avatar .manual-file-chooser{position:absolute;top:0;left:0;height:34px;padding:0;cursor:pointer}.button-change-avatar{overflow:hidden}.profile-picture-spinner{background-image:url("/images/spinners/octocat-spinner-128.gif");background-repeat:no-repeat;background-position:center;background-size:64px 64px}.avatar-upload .flash{width:100%;padding:30px 15px;border:dashed 1px #d73a49;box-shadow:none}.avatar-upload .upload-state{display:none;padding:10px 0}.avatar-upload .upload-state p{margin:0;font-size:12px;color:#586069}.avatar-upload .avatar-upload .octicon{display:inline-block}.is-uploading .avatar-upload .loading{display:block;padding:0}.is-uploading .avatar-upload .loading img{vertical-align:top}.is-uploading .avatar-upload .button-change-avatar{display:none}.is-bad-file .avatar-upload .bad-file{display:block;margin:0}.is-too-big .avatar-upload .too-big{display:block;margin:0}.is-bad-dimensions .avatar-upload .bad-dimensions{display:block;margin:0}.is-bad-format .avatar-upload .bad-format{display:block;margin:0}.is-failed .avatar-upload .failed-request{display:block;margin:0}.is-empty .avatar-upload .file-empty{display:block;margin:0}dl.new-email-form{padding:10px 10px 0;margin:0 -10px 10px;border-top:1px solid #e5e5e5}.email-actions{float:right}.email-actions > span{float:left}.email-actions form{display:inline}.email-actions span.label{padding:0 10px;font-size:13px;color:#586069}.email-actions .octicon-alert{color:#ca5633}.boxed-group .fork-flag{margin-left:16px;font-size:12px;color:#586069}.selected-user-key{background-color:#fffdef}.user-key-type{padding-right:20px;padding-left:10px;text-align:center}.user-key-badge{display:block;padding-right:5px;padding-left:5px;margin-top:3px;font-size:12px;line-height:1.4;border:solid 1px #ddd;border-radius:3px}.user-key-email-badge{display:inline-table;margin-right:4px}.user-key-email{display:table-cell;padding:1px 5px;font-size:12px;line-height:1.4;border:solid 1px #ddd;border-radius:3px}.user-key-email.unverified{border-top-right-radius:0;border-bottom-right-radius:0}.user-key-email-unverified{display:table-cell;padding-right:5px;padding-left:5px;font-size:11px;color:#666;background-color:#ecebec;border:solid 1px #ddd;border-left:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.user-key-details{width:400px;line-height:1.6;white-space:normal}.user-key-details code{font-size:13px}.recent-user-key{color:#28a745}.recent-user-key-access{color:#1e7e34}.unverified-user-key, +.unverified-user-key-notice{color:#cb2431}.notification-center .overview{padding:0 10px 10px;border-bottom:1px solid #ddd}.oauth-app-info-container .float-left-container{float:left;text-align:left}.oauth-app-info-container .float-right-container{float:right;text-align:right}.oauth-app-info-container dl.keys{margin:10px 0}.oauth-app-info-container dl.keys dt{margin-top:10px;font-weight:600;color:#586069}.oauth-app-info-container dl.keys dd{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;color:#333}.oauth-app-info-container .user-count{font-size:30px;font-weight:300;color:#586069}.logo-uploader-container{display:block}.logo-upload{position:relative;display:inline-block}.logo-upload a.delete, +.logo-upload span.delete{position:absolute;left:88px;display:none;padding:8px 10px}.logo-upload a.delete:hover, +.logo-upload span.delete:hover{color:#cb2431}.logo-upload-container{display:inline-block}.logo-upload-container .logo-upload-label .manual-file-chooser{top:0;left:0;width:130px;height:34px;padding:0;margin-left:0;cursor:pointer}.logo-upload-container .upload-state{padding:10px 0}.logo-upload-container .upload-state p{margin:0;font-size:12px;color:#586069}.logo-box{display:inline-block;float:left;width:120px;height:120px;background-color:#eee;border:1px solid #ccc;border-radius:3px}.logo-box img{display:none;width:118px;height:118px;border-radius:3px}.logo-placeholder{color:#586069;text-align:center;text-shadow:0 1px 0 #fff}.logo-placeholder p{margin:0;font-size:14px}.has-uploaded-logo .logo-placeholder, +.has-uploaded-logo .or{display:none}.has-uploaded-logo:hover a.delete, +.has-uploaded-logo:hover span.delete{display:block}.has-uploaded-logo .logo-box img{display:block}.saved-reply-form{border:1px solid #ddd;border-radius:3px}.saved-reply-form .tabnav-tab.selected{border-radius:3px 3px 0 0}.saved-reply-form .form-actions{margin-right:10px;margin-bottom:8px}.saved-reply-form .comment{border:0}.saved-reply-form .comment-body{padding:5px 5px 15px;background-color:transparent;border-bottom:1px solid #eee}.saved-reply-settings-container.has-replies .listgroup{display:block}.saved-reply-settings-container.has-replies .blankslate{display:none}.saved-reply-settings-container .listgroup{display:none}.access-token{border-bottom:1px solid #e5e5e5}.access-token:last-child{border:0}.access-token .last-used{margin-right:10px}.access-token .zeroclipboard-link{display:inline-block;vertical-align:text-bottom}.access-token.new-token{background-color:rgba(108,198,68,0.1)}.access-token.new-token .octicon-check{color:#28a745}.access-token .token-description{max-width:450px;color:#24292e}.access-token .token{font-size:14px}.access-token .sso-ready-badge{display:inline-block;padding:1px 4px;font-size:10px;line-height:16px;color:#767676;vertical-align:middle;background:none;border:1px solid #e5e5e5;border-radius:2px}.access-token .sso-ready-badge:focus{outline:none}.access-token .sso-ready-badge:hover{border-color:#ccc}.access-token .sso-ready-badge.ready{color:#55a532}.access-token .sso-ready-badge.ready:hover{border-color:#55a532}.access-token .credential-authorization-statuses{position:relative;display:inline-block}.access-token .credential-authorization-statuses.active .dropdown-menu-content{display:block}.access-token .credential-authorization-statuses .dropdown-menu{top:-4px;min-width:400px;max-width:500px;padding-top:0;padding-bottom:0}.access-token .credential-authorization-menu{padding:15px;font-size:13px;line-height:1.4}.access-token .credential-authorization-menu .status-heading{color:#24292e}.access-token .credential-authorization-status-list{max-height:235px;padding:0;margin:15px -15px -15px;overflow:scroll;border-top:1px solid #eee;transition:max-height 0.25s ease-in-out}.access-token .credential-authorization-status-item{position:relative;padding:10px 15px 10px 12px;background-color:#fafbfc;border-bottom:1px solid #eee}.access-token .credential-authorization-status-item:last-child{border-bottom:0;border-radius:0 0 2px 2px}.access-token .credential-authorization-status-icon{width:30px;margin-right:10px}.access-token .credential-authorization-status-avatar{position:relative;top:5px}.regenerate-token-cta .btn-danger{margin-left:30px}.personal-access-tokens-group{padding:0 10px}.personal-access-tokens label{display:inline}.personal-access-tokens label p{display:inline-block;margin:0;font-size:13px;font-weight:400}.personal-access-tokens .child-scopes{margin-left:20px;list-style:none}.personal-access-tokens .child-scopes .token-scope{width:180px;font-weight:400}.personal-access-tokens .child-scopes .child-scopes{margin-left:0}.token-scope{display:inline-block;width:200px;padding:2px 0;margin:0;font-size:13px;color:#24292e}.token-scope input{margin-right:5px}.callback-urls dl dd .form-control{width:100%}.callback-urls.has-many .callback-url-action-cell{display:table-cell}.callback-description{margin-top:20px}.callback-description .octicon{padding-left:0}.callback-url .label{display:none;width:64px;text-align:center}.callback-url.is-default-callback .label{display:inline-block}.callback-url.is-default-callback .btn{display:none}.callback-url-wrap{display:table;width:100%}.callback-url-field-cell{display:table-cell}.callback-url-action-cell{display:none;width:70px;text-align:right}.boxed-group.application-show-group dl.form-group > dd .form-control.wide{width:460px}.boxed-group.application-show-group dl.form-group > dd .form-control.short{height:50px;min-height:50px}.application-show-group .errored .note{display:none}.application-show-group .drag-and-drop{padding:0;text-align:left;background-color:transparent;border:0}.application-show-group .drag-and-drop img{margin-bottom:1px;vertical-align:bottom}.application-show-group .drag-and-drop span{padding:0}.application-show-group .dragover .logo-box{box-shadow:#c9ff00 0 0 3px}.application-show-group .is-uploading .loading{display:inline-block}.application-show-group .is-uploading .default{display:none}.application-show-group .is-failed .failed-request{display:inline-block}.application-show-group .is-failed .default{display:none}.application-show-group .is-bad-file .bad-file{display:inline-block}.application-show-group .is-bad-file .default{display:none}.application-show-group .is-too-big .file-too-big{display:inline-block}.application-show-group .is-too-big .default{display:none}.application-show-group .is-bad-format .bad-format{display:inline-block}.application-show-group .is-bad-format .default{display:none}.application-show-group .is-default .default{display:block}.post-recovery-token .octospinner, +.post-recovery-token .create-recovery-token-error{display:none}.post-recovery-token.loading .octospinner{display:block}.post-recovery-token.failed .create-recovery-token-error{display:block}.security-history .security-history-timestamp{float:right;color:#586069}table.security-history-detail{width:100%;font-size:12px}table.security-history-detail td{max-width:200px;word-wrap:break-word}.settings-email .email-actions .settings-remove-email{float:right;padding-right:7px;padding-left:7px;margin-left:5px;line-height:24px;color:#cb2431;cursor:pointer}.settings-email .email-actions .settings-remove-email.settings-disabled-remove-email{display:block;color:#6a737d}.settings-email .octicon-info{margin-left:5px}.settings-email .css-truncate-target{max-width:300px}.email-preference-exceptions{font-size:12px}.email-preference-exceptions h5{margin:15px 0 5px;color:#666}.email-preference-exceptions .exception-list{list-style:none}.email-preference-exceptions .exception{max-width:400px;padding:5px;padding-left:0;border-top:1px solid #eee}.email-preference-exceptions .exception:last-child{border-bottom:1px solid #eee}.email-preference-exceptions.opt-in-list{display:none}.transactional-only .email-preference-exceptions.opt-in-list{display:block}.transactional-only .email-preference-exceptions.opt-out-list{display:none}.two-factor-intro{width:675px;margin:40px auto 0}.two-factor-intro .two-factor-graphic{margin:20px 0}.two-factor-intro .two-factor-explain{padding:0;margin:0 0 40px;font-size:13px;list-style:none}.two-factor-intro .two-factor-explain li{float:left;padding:0;margin:0}.two-factor-intro .two-factor-explain .step-one{width:185px;margin-right:36px}.two-factor-intro .two-factor-explain .step-two{width:230px;margin-right:42px}.two-factor-intro .two-factor-explain .step-three{width:180px}.two-factor-graphic{width:675px;height:135px;background-image:url("/images/modules/settings/2fa_guide.png");background-repeat:no-repeat}.two-factor-recovery-codes{margin:30px 0;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:21px}.two-factor-recovery-code-mark{width:24px;height:24px;font-size:24px;line-height:16px;color:#bbb}.two-factor-recovery-code{display:inline-block;width:48%;line-height:1.6;text-align:center}.two-factor-recovery-code::before{position:relative;top:-3px;margin-right:10px;font-size:10px;color:#d8d8d8;content:"\25CF"}.recovery-codes-saving-options{margin-left:35px}.recovery-codes-saving-options .recovery-code-save-button{width:115px;margin-right:15px;text-align:center}.recovery-codes-warning{margin:0 -15px}.recovery-codes-warning .recovery-codes-warning-octicon{height:40px;margin-right:15px}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.two-factor-graphic{background-image:url("/images/modules/settings/2fa_guide@2x.png");background-size:675px 135px}}.btn-two-factor-state{min-width:70px}.sms-or-app{width:100%;padding:40px 0 0;margin:0;border-top:1px solid #ddd}.sms-or-app::before{display:table;content:""}.sms-or-app::after{display:table;clear:both;content:""}.sms-or-app li{float:left;width:325px;padding:0;list-style:none}.sms-or-app li:first-child{margin-right:25px}.sms-or-app li .btn{display:block;width:100%;height:100%;padding-top:12px;padding-bottom:12px;margin:10px 0;font-size:15px;text-align:center}.sms-or-app small{font-size:80%}.app-only{padding:20px 0 0}.app-only li{float:none;width:auto}.app-only li .btn{display:inline-block;width:auto;padding-right:20px;padding-left:20px}.two-factor-wrapper{width:500px;margin:40px auto}.two-factor-lead{font-size:16px}.two-factor-qr-code{text-align:center}.two-factor-steps{padding:15px 15px 0;margin:30px 0;border:1px solid #eee;border-radius:3px}.two-factor-steps .error-icon{position:relative;top:2px;left:5px;color:#cb2431}.two-factor-steps .sent-message{position:relative;top:2px;left:5px;color:#28a745}.container.two-factor-toggle{width:700px}.sms-country-code-field{padding-right:10px}.two-factor-toggle{margin-top:40px}.two-factor-toggle .two-factor-status{padding:20px 0;margin:0 0 20px;color:#586069;border-bottom:1px solid #eaeaea}.two-factor-toggle .two-factor-status p{margin:0}.two-factor-toggle .two-factor-status .btn{position:relative;top:-3px;float:right}.two-factor-toggle .two-factor-on{padding:3px 5px;margin-right:5px;color:#fff;text-shadow:0 1px 1px rgba(0,0,0,0.1);background-color:#28a745;border-radius:2px}.two-factor-settings-group{position:relative;padding:0 0 20px 220px;margin:0 0 20px;border-bottom:1px solid #ddd}.two-factor-settings-group > h3{position:absolute;left:0;width:200px;font-size:14px}.two-factor-settings-group > h3 .octicon{position:absolute;left:-24px;color:#cb2431}.two-factor-settings-group li{line-height:1.5;list-style:none}.u2f-registrations{padding-left:24px}.u2f-registration{position:relative;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #f8f8f8}.u2f-registration.is-sending .u2f-registration-delete{display:none}.u2f-registration.is-sending .spinner{position:relative;top:3px}.u2f-registration-nickname{font-weight:600}.u2f-registration-icon{position:absolute;left:-24px;color:rgba(47,38,6,0.5)}.new-u2f-registration{position:relative}.new-u2f-registration .add-u2f-registration-form{display:none;margin-bottom:10px}.new-u2f-registration.is-active .add-u2f-registration-link{display:none}.new-u2f-registration.is-active .add-u2f-registration-form{display:block}.new-u2f-registration .u2f-request-interaction, +.new-u2f-registration .u2f-request-error{display:none}.new-u2f-registration.is-sending .u2f-request-interaction{display:block}.new-u2f-registration.is-showing-error .u2f-request-error{display:block}.new-u2f-registration .u2f-error-icon{font-size:64px}.u2f-box .u2f-sorry{display:block}.u2f-box .new-u2f-registration{display:none}.u2f-box.available .u2f-sorry{display:none}.u2f-box.available .new-u2f-registration{display:block}.github-access-banner{position:relative;padding:10px 20px 10px 70px;margin:0 0 20px;font-size:14px;border:1px solid #ddd;border-radius:3px}.github-access-banner .octicon{position:absolute;top:20px;left:20px;color:#cb2431}.error-icon, +.spinner, +.sent-message, +.sms-error-message{display:none}.sms-error-message{margin-top:15px}.is-sending .spinner{display:inline-block}.is-sent .sent-message{display:inline-block}.is-not-sent .sms-error-message{display:block}.is-not-sent .error-icon{display:inline-block}.qr-code-table{display:inline-block;padding:20px;margin:30px auto;border:1px solid #eee;border-radius:3px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.04)}.qr-code-table tr{background:transparent;border:0}.qr-code-table th, +.qr-code-table td{padding:0;border:0}.qr-code-table td{width:3px;height:3px}.qr-code-table .black{background:#000}.qr-code-table .white{background:#fff}.confirmation-phrase{font-style:italic;font-weight:400}.do-not-copy-me{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.session-device{position:relative;padding:15px;line-height:18px;color:#586069}.session-device .btn{float:right;margin-top:4px}.session-device .session-state-indicator{float:left;width:8px;height:8px;margin-top:10px;border-radius:5px}.session-device .session-state-indicator.recent{background-color:#28a745;box-shadow:0 0 10px rgba(108,198,68,0.5)}.session-device .session-state-indicator.not-recent{background-image:linear-gradient(#aaa,#ccc);box-shadow:0 1px 0 #fff}.session-device .session-icon{float:left;width:32px;margin-top:1px;margin-left:15px;color:#bbb;text-align:center}.session-device .sessions-more-info{margin-top:10px}.session-device.session-current{margin-top:0;background-color:#fff}.session-device.session-current .sessions-more-info{color:#586069}.session-device.session-current .sessions-more-info::after{border-top-color:#fff}.session-device.session-current .octicon{color:#586069}.session-details{margin-left:70px}.session-details:hover .octicon{color:#0366d6;cursor:pointer}.session-details.open .sessions-more-info{display:block}.collaborators .collab-list{border-bottom-width:0}.collaborators .collab-list-item:first-child .collab-list-cell{border-top-width:0}.collaborators .collab-list-cell{padding-top:15px;padding-bottom:15px;vertical-align:middle}.collaborators .collab-meta{width:140px}.collaborators .collab-remove{padding-right:20px;text-align:right}.collaborators .collab-remove .remove-link{color:#586069}.collaborators .collab-remove .remove-link:hover{color:#cb2431}.collaborators .collab-team-link{width:300px}.collaborators .collab-team-link:hover{text-decoration:none}.collaborators .collab-team-link .avatar{float:left;margin-top:1px;margin-right:10px}.collaborators .collab-team-link.disabled{pointer-events:none}.collaborators .collab-info{height:100%;color:#666}.collaborators .collab-info .description{padding-right:50px;margin-top:3px;margin-bottom:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.collaborators .collab-info .collab-name{display:block;font-size:14px}.collaborators .collab-info .collab-message{position:relative;top:25%;display:block}.collaborators .copy-invite-modal{width:352px}.collaborators .cancel-invite-cell{width:113px;padding-left:0}.access-sub-heading{float:right;font-weight:400;line-height:1.4;color:#586069}.access-form-wrapper{padding:10px;background-color:#fcfcfc;border-top:1px solid #ddd;border-radius:0 0 3px 3px}.access-flash{padding:8px;margin-right:10px;margin-bottom:10px;margin-left:10px}.repo-access-group .blankslate{display:none}.repo-access-group.is-empty .blankslate{display:block}.repo-access-group.no-form .add-team-form{display:none}.repo-access-group .select-menu-item.has-access{display:none}.oauth-pending-deletion-list-item{background-color:#fafbfc;box-shadow:inset 0 0 8px #eee}.oauth-pending-deletion-list-item:hover{background-color:#fafbfc}.oauth-pending-deletion-list-item .oauth-pending-deletion{display:inline-block;width:19%;line-height:30px}.oauth-pending-deletion-list-item .active{display:none}.oauth-pending-deletion{display:none;width:100%}.boxed-group-list .access-level{color:#586069}.boxed-group-list .access-level.css-truncate-target{max-width:500px}.settings-next{font-size:14px;line-height:1.5}.settings-next label{font-size:14px}.settings-next .note{font-size:13px}.settings-next .form-checkbox input[type="radio"], +.settings-next .form-checkbox input[type="checkbox"]{margin-top:4px}dl.form-group > dd textarea.compact{height:100px;min-height:0}.form-hr{margin-top:15px;margin-bottom:15px;border-bottom-color:#e5e5e5}.listgroup{list-style:none;border:1px solid #e5e5e5;border-radius:3px}.listgroup-item{min-height:inherit;padding:10px;font-size:13px;line-height:26px;color:#586069}.listgroup-item::before{display:table;content:""}.listgroup-item::after{display:table;clear:both;content:""}.listgroup-item + .listgroup-item{border-top:1px solid #e5e5e5}.listgroup-item.listgroup-item-preview{line-height:inherit}.listgroup-item.listgroup-item-preview .BtnGroup{margin-top:5px}.listgroup-item .css-truncate-target{max-width:615px}.listgroup-item-title{display:block;font-weight:600}.listgroup-item-body{display:block}.listgroup-header{border-top:0;border-bottom:1px solid #e5e5e5}.listgroup-overflow{max-height:240px;overflow-y:auto;background-color:#f5f5f5}.listgroup-sm .listgroup-item{padding-top:5px;padding-bottom:5px}.protected-branches{margin-top:15px;margin-bottom:15px}.protected-branch-options, +.repo-data-options{margin-left:20px;opacity:0.5}.protected-branch-options.active, +.repo-data-options.active{opacity:1}.protected-branch-reviews.on .require-code-owner-review, +.protected-branch-reviews.on .reviews-dismiss-on-push, +.protected-branch-reviews.on .reviews-include-dismiss, +.protected-branch-reviews.on .require-approving-reviews{display:block}.protected-branch-reviews .require-code-owner-review, +.protected-branch-reviews .reviews-dismiss-on-push, +.protected-branch-reviews .reviews-include-dismiss, +.protected-branch-reviews .require-approving-reviews{display:none}.protected-branch-orgs-and-repo-admins{padding:10px;background-color:#fafbfc}.authorized-pushers{width:440px}.authorized-pushers .add-protected-branch-user-or-team{display:block}.authorized-pushers .user-or-team-limit-reached{display:none;padding:10px;font-size:13px}.authorized-pushers.at-limit .add-protected-branch-user-or-team{display:none}.authorized-pushers.at-limit .user-or-team-limit-reached{display:block;width:440px}.protected-branch-authorized-pushers-table{margin-top:10px}.protected-branch-authorized-pushers-table .boxed-group-inner{max-height:350px;overflow-y:auto}.protected-branch-authorized-pushers-table .table-list{border-bottom:0}.protected-branch-authorized-pushers-table .table-list-cell{vertical-align:middle}.protected-branch-authorized-pushers-table .table-list-cell:first-child{width:100%}.protected-branch-authorized-pushers-table .avatar, +.protected-branch-authorized-pushers-table .octicon-jersey, +.protected-branch-authorized-pushers-table .octicon-organization{width:36px;margin-right:10px;text-align:center}.protected-branch-pusher{color:#333}.user-already-added::after{display:inline-block;padding:1px 5px;margin-left:6px;font-size:11px;line-height:1.4;color:#fff;content:"Already added";background-color:#d15704;border-radius:3px}.protected-branch-admin-permission{float:left;padding:3px;margin:-2px 0 -2px -4px;line-height:normal;border:1px solid transparent;border-radius:3px}.protected-branch-admin-permission.active{animation:toggle-color 1s ease-in-out 0s}@keyframes toggle-color{0%{background-color:transparent}50%{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}100%{background-color:transparent}}.automated-check-options{margin-top:10px}.automated-check-options .listgroup-item label{font-size:inherit}.automated-check-options .listgroup-item input[type="checkbox"]{float:none;margin-top:-2px;margin-right:5px;margin-left:0}.automated-check-options .label{margin-top:4px}.repository-merge-features .form-group.errored label{color:inherit}.repository-merge-features .form-group.errored .error{position:inherit;padding:0;margin-top:0;margin-left:6px;font-size:11px;color:#cb2431;background:transparent;border:0}.repository-merge-features .form-group.errored .error::before, .repository-merge-features .form-group.errored .error::after{display:none}.setup-wrapper{width:750px;padding-top:30px;margin:0 auto}.setup-wrapper::before{display:table;content:""}.setup-wrapper::after{display:table;clear:both;content:""}.setup-header{padding-bottom:20px;margin:0 auto 30px;overflow:hidden;text-align:left;border-bottom:1px solid #ddd}.setup-header h1{margin-top:0;margin-bottom:0;font-size:45px;font-weight:400;line-height:1.1;letter-spacing:-1px}.setup-header h1 .octicon{color:#bbb}.setup-header .lead{margin-top:2px;margin-bottom:0;font-size:21px}.setup-header .lead a{color:#586069}.setup-header .lead a:hover{color:#0366d6;text-decoration:none}.setup-org{padding-bottom:0;border-bottom:0}.setup-main{float:left;width:450px}.setup-main.without-secondary{margin-left:150px}.setup-secondary{float:right;width:250px}.setup-secondary .info{padding-top:0;padding-bottom:0;margin-top:-10px;font-size:12px;line-height:18px;color:#586069;text-align:center}.setup-info-module{margin-bottom:30px;background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.075)}.setup-info-module h2{padding:15px;margin-bottom:15px;overflow:hidden;font-size:16px;border-bottom:1px solid #ddd}.setup-info-module h2 .price{float:right;font-weight:600;color:#586069}.setup-info-module h3{padding:0 15px;margin:0 0 -7px;font-size:14px}.setup-info-module p{padding:0 15px;margin:15px 0}.setup-info-module .setup-info-note{padding:1px 0;margin:0;background:#f9f9f9;border-top:1px solid #e0e0e0}.features-list{padding:0 15px 15px;margin:0;font-size:14px;list-style:none}.features-list li{margin-top:10px}.features-list li:first-child{margin-top:0}.features-list .list-divider{margin:15px -15px;border-top:1px solid #eee}.features-list .octicon-check{margin-right:5px;color:#60b044}.features-list .octicon-question{font-size:12px;color:#555}.features-list .tooltipped::after{width:250px;white-space:normal}.features-list.features-list-org{padding-bottom:0}.setup-form-container .setup-form-title{font-size:16px}.setup-form-container .secure{float:right;margin-top:2px;font-size:11px;color:#60b044;text-transform:uppercase}.setup-form-container hr{margin-top:25px;margin-bottom:25px}.setup-form-container .form-actions{padding-top:0;padding-bottom:0;text-align:left}.team-member-container{margin-bottom:20px}.team-member-container .team-member-username{line-height:1.2}.setup-form{padding-bottom:15px}.setup-form .form-group dd .form-control{width:100%}.setup-form .form-group dd .form-control.short{width:250px}.setup-form dd{position:relative}.setup-form dd .octicon{position:absolute;top:8px;right:25px}.setup-form .octicon-alert{color:#cb2431}.setup-form .octicon-check{color:#28a745}.setup-form .tos-info, +.setup-form .setup-organization-next{margin:15px 0;border-top:1px solid #eee;border-bottom:1px solid #eee}.setup-form .tos-info{padding:15px 0}.setup-form .setup-organization-next{padding-top:15px;padding-bottom:15px}.setup-form .setup-plans{border-collapse:separate;border:1px solid #d1d5da}.setup-form .setup-plans tr.selected{background-color:#f1f8ff}.setup-form .setup-plans .name{font-weight:600}.setup-form .setup-plans .choose-plan input[type="radio"]{display:none}.setup-form .new-business-initial-admins td{padding:5px 10px;border:1px solid #f5f5f5}.setup-creditcard-form .cc-extras{margin-bottom:15px}.setup-creditcard-form .expiration-form select{width:80px}.setup-creditcard-form .expiration-form, +.setup-creditcard-form .cvv-form, +.setup-creditcard-form .country-form, +.setup-creditcard-form .state-form{float:left;margin:0;word-wrap:normal}.setup-creditcard-form .country-form, +.setup-creditcard-form .postal-code-form{margin-top:0;margin-bottom:15px}.setup-creditcard-form .form-group dd .input-cvv{width:80px}.setup-creditcard-form .form-group select.select-country{width:182px;margin-right:5px}.setup-creditcard-form .form-group select:invalid{color:#6a737d}.setup-creditcard-form .form-group select.select-state{width:113px}.setup-creditcard-form .form-group .card-select-number-field{width:100%}.setup-creditcard-form .form-group .input-vat{width:288px}.setup-creditcard-form .form-group .card-select-number-field-icons{top:1px;right:2px}.setup-creditcard-form .form-group .card-select-number-field-icons > .placeholder{top:8px;right:10px}.setup-creditcard-form .form-group .card-select-number-field-icons > .card{height:20px;margin-top:6px;margin-right:5px;margin-bottom:6px}.setup-creditcard-form .form-group .card-select-number-field-icons > .card.enabled{display:block}.setup-creditcard-form .form-group input.input-postal-code{width:180px}.setup-creditcard-form.is-vat-country .vat-field{display:block}.setup-creditcard-form.is-international .form-group select.select-country{width:300px}.setup-creditcard-form.is-international .state-form{display:none}.setup-creditcard-form.no-postcodes .postal-code-form{display:none}.setup-creditcard-form dd .octicon-credit-card{position:inherit}.setup-creditcard-form .enter-new-card{display:none}.setup-creditcard-form.has-credit-card .enter-new-card{display:inline-block}.setup-creditcard-form.has-credit-card .card-select-number-field-icons, +.setup-creditcard-form.has-credit-card .card-select-number-field, +.setup-creditcard-form.has-credit-card .cancel-enter-new-card{display:none}.setup-creditcard-form .vat-field{display:none}.setup-creditcard-form .vat-field.prefilled{display:block}.setup-creditcard-form .help-text{font-size:80%;font-weight:400;color:#586069}.org-creation-questions, +.user-identification-questions{float:none;width:auto}.org-creation-questions .question, +.user-identification-questions .question{margin-bottom:30px}.org-creation-questions .question-title, +.user-identification-questions .question-title{padding-right:40px;margin-bottom:10px;font-size:14px;line-height:1.5}.org-creation-questions .question-title i, +.user-identification-questions .question-title i{font-size:13px;font-style:normal;font-weight:400;color:#767676}.org-creation-questions .response-group label, +.user-identification-questions .response-group label{font-weight:400}.org-creation-questions .form-checkbox, +.user-identification-questions .form-checkbox{margin:8px 0}.org-creation-questions .other-field .form-control, +.user-identification-questions .other-field .form-control{margin-top:10px}.org-creation-questions .other-field input + .form-control, +.user-identification-questions .other-field input + .form-control{display:none}.org-creation-questions .other-field input:checked + .form-control, +.user-identification-questions .other-field input:checked + .form-control{display:block}.org-creation-questions .alternate-action, +.user-identification-questions .alternate-action{margin-left:10px;line-height:34px}.org-creation-questions .disclaimer, +.user-identification-questions .disclaimer{margin:40px 0 0;text-align:center}.user-identification-questions{margin-top:40px}.user-identification-questions .form-checkbox{float:left;width:250px}.shelf{padding-top:20px;margin-bottom:20px;background-color:#fefefe;border-bottom:1px solid #eff1f3}.shelf .container{position:relative}.shelf-title{margin:0;font-size:30px;font-weight:400}.shelf-content{width:800px;margin:50px auto;text-align:center}.shelf-lead{margin-top:10px;margin-bottom:30px;font-size:18px;color:#586069}.shelf-dismiss{position:absolute;top:0;right:20px;font-size:12px;color:#959da5}.shelf-dismiss:hover{color:#0366d6;text-decoration:none}.shelf-dismiss .close-button{width:28px;height:28px;padding:3px 5px;color:rgba(27,31,35,0.7);border:1px solid rgba(27,31,35,0.15);border-radius:28px}.shelf-dismiss .close-button:hover{color:#24292e;border-color:rgba(27,31,35,0.3)}.shelf-cta{padding:10px 50px;font-size:16px}.intro-shelf{margin-top:0;color:rgba(27,31,35,0.85);background-image:linear-gradient(180deg,hsla(0,0%,100%,0) 60%,#fff),linear-gradient(70deg,#dbedff 32%,#ebfff0);border-bottom:#fff}.intro-shelf .shelf-lead{color:rgba(27,31,35,0.7)}.orgs-help-shelf{padding-top:20px;padding-bottom:20px;margin-top:-20px;margin-bottom:20px;border-bottom:1px solid #eff1f3}.orgs-help-shelf .orgs-help-title{font-size:30px;font-weight:400}.orgs-help-shelf-content{width:800px;margin:50px auto;text-align:center}.orgs-help-shelf-content .orgs-help-lead{padding-right:45px;padding-left:45px;font-size:18px}.orgs-help-shelf-content .orgs-help-divider{display:block;width:150px;margin:40px auto;content:"";border-top:1px solid #d1d5da}.orgs-help-lead{margin-top:10px;margin-bottom:30px;color:#586069}.orgs-help-items{margin-bottom:40px}.orgs-help-item-octicon{width:70px;height:70px;margin:0 auto 15px;text-align:center;background-color:#fff;border:solid 1px #e1e4e8;border-radius:50px}.orgs-help-item-octicon .octicon{margin-top:20px;color:#0366d6}.orgs-help-item-title{margin-bottom:10px;font-weight:400}.orgs-help-item-content{margin-top:0;font-size:14px;color:#586069}.orgs-help-dismiss{float:right;margin-top:5px;margin-right:10px;font-size:12px;color:#586069}.orgs-help-dismiss:hover{color:#0366d6;text-decoration:none}.orgs-help-dismiss .octicon{position:relative;top:1px}.orgs-help-title{margin-top:0;margin-bottom:0}.collection-page .column.main{margin-right:260px!important}.collection-page .column.sidebar{width:240px}.collection-search-results em{padding:0.1em;background-color:#faffa6}.draft-tag{padding:5px 10px;font-weight:600;color:#eee;background-color:#404040}.showcase-page-pattern{position:relative;z-index:-1;height:100px;margin-top:-21px;margin-bottom:-70px}.showcase-page-pattern::after{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:"";background-image:linear-gradient(180deg,hsla(0,0%,100%,0.85),#fff)}.showcase-page-repo-list{border-top:1px solid #eee}.repo-health .repo-health-loading{display:none;font-style:italic}.repo-health.is-loading .repo-health-loading{display:block}.repo-health.is-loading .repo-health-results{display:none}.sortable-button-item:first-of-type .sortable-button[data-direction="up"], +.sortable-button-item:last-of-type .sortable-button[data-direction="down"]{display:none}.org-sso{width:340px;margin:0 auto}.org-sso .sso-title{font-size:24px;font-weight:300;letter-spacing:-0.5px}.org-sso .org-sso-panel{padding:20px;background-color:#fff;border:1px #e1e4e8 solid;border-radius:5px}.org-sso .sso-recovery-callout{padding:15px 10px;text-align:center;border:1px solid #d1d5da;border-radius:5px}.sso-modal{padding:16px}.sso-modal .org-sso{width:auto}.sso-modal .org-sso .org-sso-panel{border:0}.sso-modal .sso-prompt-success, +.sso-modal .sso-prompt-error{display:none}.sso-modal.success .sso-prompt-default{display:none}.sso-modal.success .sso-prompt-success{display:block}.sso-modal.error .sso-prompt-default{display:none}.sso-modal.error .sso-prompt-error{display:block}.sso-modal.error .flash-error{margin-right:-35px;margin-left:-35px;border-right:0;border-left:0;border-radius:0}.tab-size[data-tab-size="1"]{-moz-tab-size:1;tab-size:1}.tab-size[data-tab-size="2"]{-moz-tab-size:2;tab-size:2}.tab-size[data-tab-size="3"]{-moz-tab-size:3;tab-size:3}.tab-size[data-tab-size="4"]{-moz-tab-size:4;tab-size:4}.tab-size[data-tab-size="5"]{-moz-tab-size:5;tab-size:5}.tab-size[data-tab-size="6"]{-moz-tab-size:6;tab-size:6}.tab-size[data-tab-size="7"]{-moz-tab-size:7;tab-size:7}.tab-size[data-tab-size="8"]{-moz-tab-size:8;tab-size:8}.tab-size[data-tab-size="9"]{-moz-tab-size:9;tab-size:9}.tab-size[data-tab-size="10"]{-moz-tab-size:10;tab-size:10}.tab-size[data-tab-size="11"]{-moz-tab-size:11;tab-size:11}.tab-size[data-tab-size="12"]{-moz-tab-size:12;tab-size:12}.tag-input-container{position:relative}.tag-input-container .suggester{position:absolute;z-index:100;width:100%;margin-top:-1px}.tag-input-container ul{list-style:none}.tag-input input{float:left;padding-left:2px;margin:0;background:none;border:0;box-shadow:none}.tag-input input:focus{box-shadow:none}.tag-input .tag-input-tag{float:left;margin-right:5px}.tag-input .tag-input-tag:hover{background-color:#eee}.tag-input-tag{position:relative;padding:5px 30px 5px 10px;background:#eee;border-radius:3px}.tag-input-tag:hover{background-color:#ddd}.tag-input-tag .remove{position:absolute;top:6px;right:6px;display:block;width:18px;height:18px;font-size:15px;line-height:16px;color:#fff;text-align:center;text-decoration:none;cursor:pointer;background:#c8c8c8;border-radius:18px}.tag-input-tag .remove:hover{background:#bd2c00}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item + .task-list-item{margin-top:3px}.task-list-item .handle{display:none}.task-list-item-checkbox{margin:0 0.2em 0.25em -1.6em;vertical-align:middle}.reorderable-task-lists .markdown-body .contains-task-list{padding:0}.reorderable-task-lists .markdown-body li:not(.task-list-item){margin-left:26px}.reorderable-task-lists .markdown-body ol:not(.contains-task-list) li, +.reorderable-task-lists .markdown-body ul:not(.contains-task-list) li{margin-left:0}.reorderable-task-lists .markdown-body li p{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item{padding-right:15px;padding-left:42px;margin-right:-15px;margin-left:-15px;border:1px solid transparent}.reorderable-task-lists .markdown-body .task-list-item + .task-list-item{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item .contains-task-list{padding-top:4px}.reorderable-task-lists .markdown-body .task-list-item .handle{display:block;float:left;width:20px;padding:2px 0 0 2px;margin-left:-43px;opacity:0}.reorderable-task-lists .markdown-body .task-list-item .drag-handle{fill:#333}.reorderable-task-lists .markdown-body .task-list-item.hovered > .handle{opacity:1}.reorderable-task-lists .markdown-body .task-list-item.is-dragging{opacity:0}.review-comment-contents .markdown-body .task-list-item{padding-left:42px;margin-right:-12px;margin-left:-12px;border-top-left-radius:3px;border-bottom-left-radius:3px}.review-comment-contents .markdown-body .task-list-item.hovered{border-left-color:#ededed}.task-run .icon-for-success, +.task-run .icon-for-failure, +.task-run .icon-for-pending, +.task-run .icon-for-inactive{display:none}.task-run.success .icon-for-success{display:inline-block;color:#28a745}.task-run.failure .icon-for-failure{display:inline-block;color:#cb2431}.task-run.pending .icon-for-pending{display:inline-block;color:#6a737d}.task-run.inactive .icon-for-inactive{display:inline-block;color:#6a737d}.task-run .task-run-name{display:inline-block;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}.team-label-ldap{display:inline-block;padding:0 9px;line-height:25px;color:#586069;text-transform:uppercase;cursor:default;border:1px solid #eaeaea;border-radius:3px;box-shadow:none}.team-label-ldap.header-label-ldap{padding:3px 5px}.team-member-ellipsis{width:25px;height:25px;line-height:24px;color:#586069}.team-member-ellipsis:hover{color:#0366d6;background:#f6f8fa}.team-listing .table-list-cell{padding-top:10px;padding-bottom:10px;vertical-align:middle}.team-listing .table-list-cell-checkbox{width:30px;padding-right:0;padding-left:10px}.team-listing .nested-teams-checkbox{padding-left:3px}.team-listing .nested-teams-checkbox.show{padding-right:11px}.team-listing .nested-teams-checkbox.indent-1{padding-left:30px}.team-listing .nested-teams-checkbox.indent-2{padding-left:54px}.team-listing .nested-teams-checkbox.indent-3{padding-left:78px}.team-listing .nested-teams-checkbox.indent-4{padding-left:102px}.team-listing .nested-teams-checkbox.indent-5{padding-left:126px}.team-listing .nested-teams-checkbox.indent-6{padding-left:150px}.team-listing .nested-teams-checkbox.indent-7{padding-left:174px}.team-listing .nested-teams-checkbox.indent-8{padding-left:198px}.team-listing .nested-teams-checkbox.indent-9{padding-left:222px}.team-listing .nested-teams-checkbox.indent-10{padding-left:246px}.team-listing .nested-teams-checkbox.indent-11{padding-left:270px}.team-listing .nested-teams-checkbox.indent-12{padding-left:294px}.team-listing .nested-teams-checkbox.indent-13{padding-left:318px}.team-listing .nested-teams-checkbox.indent-14{padding-left:342px}.team-listing .nested-teams-checkbox.indent-15{padding-left:366px}.team-listing .team-info{width:280px}.team-listing .nested-team-info{width:650px}.team-listing .nested-team-name{max-width:268px}.team-listing .team-name{line-height:1.3;color:#0366d6}.team-listing .description{display:block}.team-listing .shortened-teams-avatars{margin-left:auto}.team-listing .shortened-teams-avatars.width-0{width:300px}.team-listing .shortened-teams-avatars.width-1{width:233px}.team-listing .shortened-teams-avatars.width-2{width:167px}.team-listing .shortened-teams-avatars.width-3{width:99px}.team-listing .team-meta{font-size:14px}.team-listing .team-members-count{width:124px;text-align:right}.team-listing .team-show-more-cell{display:block;width:980px}.team-listing .team-show-more{display:block;width:110px;height:30px;padding-top:6px;margin:auto;color:#0366d6;text-align:center;text-decoration:none;cursor:pointer}.team-listing .team-buttons{width:130px;text-align:right}.team-listing .octicon-chevron-up{display:none}.team-listing .octicon-wrapper{display:inline-block;width:10px}.team-listing .is-open.root-team{background-color:#fafbfc}.team-listing .is-open .expand-nested-team{font-weight:bold;color:#24292e}.team-listing .is-open .octicon-chevron-down{transform:rotate(180deg)}.team-listing .expand-nested-team{color:#6a737d;cursor:pointer}.team-listing .expand-nested-team:hover{color:#0366d6}.team-listing .team-menu{padding-right:15px}.traffic-graph{min-height:150px}.traffic-graph .activity{margin-top:0}.traffic-graph .activity .dots{margin-top:40px}.traffic-graph .path{fill:none;stroke-width:2}.traffic-graph path.total{stroke:#28a745}.traffic-graph path.unique{stroke:#005cc5}.traffic-graph .axis .tick:first-of-type line{stroke:#28a745;stroke-width:2px}.traffic-graph .y line{stroke:#28a745}.traffic-graph .y.unique line{stroke:#005cc5}.traffic-graph .overlay{fill-opacity:0}.uniques-graph .axis .tick:last-child line{stroke:#005cc5;stroke-width:2px}.svg-tip .date{color:#fff}.top-domains .dots{display:block;margin:167px auto 0}.top-domains-icon{display:inline-block;margin-right:5px;vertical-align:middle}table.capped-list{width:100%;line-height:100%}table.capped-list th{padding:8px;text-align:left;background:#f6f8fa;border-bottom:1px solid #dfe2e5}table.capped-list td{padding:8px;font-size:12px;border-bottom:1px solid #eaecef}table.capped-list th.middle, +table.capped-list td.middle{text-align:center}table.capped-list .favicon{width:16px;height:16px;margin:0 5px;vertical-align:middle}table.capped-list .octicon{margin-right:10px;color:#444d56;vertical-align:-1px}table.capped-list tr:nth-child(even){background-color:#fafbfc}.capped-list-label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.traffic-graph-stats{border-top:1px solid #dfe2e5}.traffic-graph-stats .summary-stats{width:100%}.traffic-graph-stats .summary-stats::before{display:table;content:""}.traffic-graph-stats .summary-stats::after{display:table;clear:both;content:""}.traffic-graph-stats .summary-stats li{display:block;float:left;width:50%;padding-bottom:10px}.totals circle{fill:#28a745;stroke:#fff;stroke-width:2}.uniques circle{fill:#005cc5;stroke:#fff;stroke-width:2}.top-lists .is-loading{margin:40px;text-align:center}ul.web-views li{width:140px}ul.clones li{width:170px}.tree-browser{width:100%;margin:0;border-right:0;border-bottom:1px solid #cacaca;border-left:0}.tree-browser td{padding:7px 3px;color:#484848;white-space:nowrap;vertical-align:middle;background:#f8f8f8;border-bottom:1px solid #eee}.tree-browser td.icon{width:17px;padding-right:2px;padding-left:10px}.tree-browser td:first-child{border-left:1px solid #cacaca}.tree-browser td:last-child{border-right:1px solid #cacaca}.tree-browser td a.message{color:#484848}.tree-browser td span.ref{color:#aaa}.tree-browser img{vertical-align:text-bottom}.tree-browser tbody tr:last-child td{border-bottom:0}.tree-browser .history{float:right;padding-right:5px}.tree-browser .octicon-chevron-right{color:transparent}.tree-browser tr[aria-selected="true"] td, +.tree-browser tr.navigation-focus td{background-color:#fff}.tree-browser tr[aria-selected="true"] td .octicon-chevron-right, +.tree-browser tr.navigation-focus td .octicon-chevron-right{color:#0366d6}.tree-browser .octicon-file-directory{color:rgba(3,102,214,0.75)}.tree-browser .octicon-file-submodule{color:#3cbf5e}.tree-browser .octicon-file{color:#586069}.tree-browser .content{max-width:220px}.tree-browser .message{max-width:420px}.tree-browser .css-truncate-target{max-width:100%}.tree-browser-result .css-truncate-target{max-width:870px}.tree-browser-result mark{font-weight:600;color:#0366d6;background-color:transparent}.tree-finder-input, +.tree-finder-input:focus{padding-left:0;margin-left:5px;font-size:inherit;line-height:inherit;border:0;outline:none;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.tree-finder .no-results{display:none}.tree-finder .no-results th{text-align:center}.tree-finder tr td.icon{cursor:pointer}.tree-finder .tree-browser{border-top:1px solid #cacaca}.filterable-empty + .no-results{display:block}.toolbar-commenting{float:right}.toolbar-commenting .dropdown.active .dropdown-menu-content{display:block}.toolbar-commenting .dropdown-menu-s{width:100px}.toolbar-commenting .dropdown-item{font-weight:600;line-height:1em;background:none;border:0}.toolbar-commenting .dropdown-item:hover{color:#0366d6}.toolbar-commenting .dropdown-item:focus{color:#0366d6;outline:none}.toolbar-item{display:block;float:left;padding:4px 5px;color:#586069;background:none;border:0}.toolbar-item.dropdown, .toolbar-item.select-menu{padding:0}.toolbar-item .select-menu-modal{margin-top:2px}.toolbar-item .select-menu-item{padding-left:8px}.toolbar-item .menu-target{display:block;padding:4px 5px;color:#586069;background:none;border:0}.toolbar-item .menu-target:hover, .toolbar-item:hover{color:#0366d6}.toolbar-item .menu-target:focus, .toolbar-item:focus{color:#0366d6;outline:none}.toolbar-item .dropdown-caret{margin-left:-3px}.toolbar-item:disabled{color:#ddd}.toolbar-item .octicon-link, +.toolbar-item .octicon-tasklist{margin-left:-3px}.toolbar-item .octicon-mention{margin-left:-4px}.toolbar-item .octicon-bold{margin-left:-2px}.toolbar-group{display:inline-block;margin-left:20px}.toolbar-group:first-child{margin-left:0}.typeahead-result{position:relative;display:block;min-width:100%;padding:10px;margin-top:0;color:#333;cursor:pointer}.typeahead-result::before{display:table;content:""}.typeahead-result::after{display:table;clear:both;content:""}.typeahead-result:first-child{border-top:0}.typeahead-result:focus, .typeahead-result:hover, .typeahead-result[aria-selected="true"], .typeahead-result.navigation-focus{text-decoration:none}.typeahead-result[aria-selected="true"], .typeahead-result:hover, .typeahead-result.navigation-focus{color:#fff;background-color:#0366d6}.typeahead-result[aria-selected="true"] .octicon-plus, .typeahead-result:hover .octicon-plus, .typeahead-result.navigation-focus .octicon-plus{color:#fff}.typeahead-result.disabled{pointer-events:none;opacity:0.5}.member-suggestion{padding-left:44px}.member-suggestion .avatar{float:left;margin-right:10px;margin-left:-34px}.member-suggestion .member-suggestion-info{width:90%;margin-top:2px;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-suggestion .member-name{font-size:12px;color:#586069}.member-suggestion .member-email{margin-top:0;margin-bottom:0}.member-suggestion .octicon-plus, +.member-suggestion .octicon-check{position:absolute;top:50%;right:15px;margin-top:-8px;color:#ddd}.member-suggestion .already-member-note, +.member-suggestion .non-member-note, +.member-suggestion .non-member-action{margin-top:0;margin-bottom:0;color:#586069}.member-suggestion .non-member-action{display:none}.member-suggestion[aria-selected="true"] .member-name, +.member-suggestion[aria-selected="true"] .non-member-note, +.member-suggestion[aria-selected="true"] .already-member-note, +.member-suggestion[aria-selected="true"] .non-member-action, +.member-suggestion[aria-selected="true"] .member-email, .member-suggestion:hover .member-name, +.member-suggestion:hover .non-member-note, +.member-suggestion:hover .already-member-note, +.member-suggestion:hover .non-member-action, +.member-suggestion:hover .member-email, .member-suggestion.navigation-focus .member-name, +.member-suggestion.navigation-focus .non-member-note, +.member-suggestion.navigation-focus .already-member-note, +.member-suggestion.navigation-focus .non-member-action, +.member-suggestion.navigation-focus .member-email{color:#fff}.member-suggestion[aria-selected="true"] .non-member-note, .member-suggestion:hover .non-member-note, .member-suggestion.navigation-focus .non-member-note{display:none}.member-suggestion[aria-selected="true"] .non-member-action, .member-suggestion:hover .non-member-action, .member-suggestion.navigation-focus .non-member-action{display:block}.member-suggestion[aria-selected="true"] .octicon, .member-suggestion:hover .octicon, .member-suggestion.navigation-focus .octicon{color:#fff}.member-suggestion.not-a-member .member-info, .member-suggestion.disabled .member-info{margin-top:-2px}.non-member-result{padding-left:31px}.team-suggestion{padding-left:32px}.team-suggestion .octicon{float:left;margin-top:2px;margin-left:-22px}.team-suggestion .team-suggestion-info{margin:2px 0 0}.team-suggestion .team-suggestion-info .css-truncate-target{max-width:none}.team-suggestion .team-size, +.team-suggestion .team-description{font-size:12px;color:#586069}.team-suggestion[aria-selected="true"] .team-size, +.team-suggestion[aria-selected="true"] .team-description, .team-suggestion.navigation-focus .team-size, +.team-suggestion.navigation-focus .team-description{color:#fff}.email-suggestion{padding-left:32px}.email-suggestion .octicon-mail{margin-left:-20px;color:#959da5}.email-suggestion .member-suggestion-info{margin-top:1px}.repo-access-add-team .team-name{font-size:13px}.repo-access-add-team .team-description{display:block}.repo-access-add-team .team-size, +.repo-access-add-team .team-description{font-size:12px;color:#586069}.repo-access-add-team[aria-selected="true"] .team-size, +.repo-access-add-team[aria-selected="true"] .team-description, .repo-access-add-team.navigation-focus .team-size, +.repo-access-add-team.navigation-focus .team-description{color:#fff}#user-content-toc{overflow:visible}#user-content-toc tr{border-top:0}#user-content-toc td{padding:0 20px;background-color:#f7f7f7;border:0;border-radius:3px}#user-content-toc ul{padding-left:0;font-weight:600;list-style:none}#user-content-toc ul li{padding-left:0.2em}#user-content-toc ul ul{font-weight:400}#user-content-toc ul ul li::before{float:left;margin-top:-0.2em;margin-right:0.2em;font-size:1.2em;line-height:1;color:#aaa;content:"\231e"}#user-content-toc ul ul ul{padding-left:0.9em}#user-content-toctitle h2{margin-top:1em;margin-bottom:0.5em;font-size:1.25em;border-bottom:0}.user-list em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,255,140,0.5);border-radius:3px}.user-list .avatar{position:absolute;top:0;left:0}.user-list-info{min-height:48px;padding:0;font-size:18px;font-weight:400;line-height:20px}.user-list-meta{overflow:hidden}.user-list-item + .user-list-item{border-top:1px solid #e1e4e8}.follow-list{list-style-type:none}.follow-list .follow-list-item{width:305px;height:100px;padding-bottom:20px;margin-right:20px;margin-bottom:20px}.follow-list .follower-list-align-top{vertical-align:top}.follow-list .flagged-banner{width:75px;padding:3px 0;font-size:10px;font-weight:600;color:#fff;text-transform:uppercase;background-color:#cb2431;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.follow-list .follow-list-name{margin-bottom:1px;font-weight:400}.follow-list .follow-list-name a{color:inherit}.follow-list .follow-list-info{margin-bottom:0.6em;font-size:12px;color:#586069}.follow-list .css-truncate.css-truncate-target{max-width:190px}.wiki-list em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,255,140,0.5);border-radius:3px}.wiki-list .avatar{float:left}.wiki-list .title{min-height:24px;margin:-3px 0 10px 38px;font-weight:600;line-height:1.2}.wiki-list .title .updated-at{font-weight:400}.wiki-list .repo-specific .title, +.wiki-list .repo-specific .full-path{margin-left:0}.wiki-list .description{margin:0 0 10px;overflow:hidden;line-height:20px}.wiki-list .wiki-list-item + .wiki-list-item{border-top:1px #e1e4e8 solid}@media (min-width: 768px){.wiki-rightbar{width:230px!important}}.wiki-rightbar .markdown-body .anchor{display:none}.wiki-rightbar .markdown-body h1{font-size:1.6em}.wiki-rightbar .markdown-body h2{font-size:1.4em}.wiki-rightbar p:last-child, +.wiki-rightbar ul:last-child, +.wiki-rightbar ol:last-child{margin-bottom:0}.wiki-footer .markdown-body, +.wiki-rightbar .markdown-body{font-size:13px}.wiki-footer .markdown-body.wiki-writable > :nth-child(2), +.wiki-rightbar .markdown-body.wiki-writable > :nth-child(2){margin-top:0!important}.wiki-footer .markdown-body img{background:none}.wiki-pages-box .wiki-more-pages{display:none}.wiki-pages-box.wiki-show-more .wiki-more-pages, +.wiki-pages-box .filterable-active .wiki-more-pages{display:block}.wiki-pages-box.wiki-show-more .wiki-more-pages-link, +.wiki-pages-box .filterable-active .wiki-more-pages-link{display:none} +/*# sourceMappingURL=github-cd23942841742563b985244658dbf4a1.css.map */ + @charset "UTF-8"; +/*! + * Primer-marketing + * http://primer.github.io + * + * Released under MIT license. Copyright (c) 2018 GitHub Inc. + */.alt-mono-font{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.alt-h0, +.alt-h1, +.alt-h2, +.alt-h3, +.alt-h4, +.alt-h5, +.alt-h6, +.alt-lead{-webkit-font-smoothing:antialiased;font-family:Roboto,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI","Oxygen","Ubuntu","Cantarell","Open Sans",sans-serif}.alt-h0{font-size:48px;font-weight:300}@media (min-width: 768px){.alt-h0{font-size:54px}}@media (min-width: 1012px){.alt-h0{font-size:72px}}.alt-h1{font-size:36px;font-weight:300}@media (min-width: 768px){.alt-h1{font-size:48px}}@media (min-width: 1012px){.alt-h1{font-size:54px}}.alt-h2{font-size:28px;font-weight:300}@media (min-width: 768px){.alt-h2{font-size:34px}}@media (min-width: 1012px){.alt-h2{font-size:38px}}.alt-h3{font-size:18px;font-weight:400}@media (min-width: 768px){.alt-h3{font-size:20px}}@media (min-width: 1012px){.alt-h3{font-size:22px}}.alt-h4{font-size:16px;font-weight:500}.alt-h5{font-size:14px;font-weight:500}.alt-h6{font-size:12px;font-weight:500}.alt-lead{-webkit-font-smoothing:antialiased;font-size:21px;font-weight:300}@media (min-width: 768px){.alt-lead{font-size:24px}}@media (min-width: 1012px){.alt-lead{font-size:26px}}.alt-text-small{font-size:14px!important}.pullquote{padding-top:0;padding-bottom:0;padding-left:8px;margin-bottom:24px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px;line-height:1.4;color:#586069;border-left:3px solid #e1e4e8}@media (min-width: 768px){.pullquote{padding-left:12px;margin-bottom:32px;margin-left:-15px;font-size:18px;line-height:1.5}}.btn-orange{color:#fff;background-color:#d25a08;background-image:linear-gradient(-180deg,#f7802f 0%,#d25a08 90%)}.btn-orange:focus, .btn-orange.focus{box-shadow:0 0 0 0.2em rgba(247,128,47,0.4)}.btn-orange:hover, .btn-orange.hover{background-color:#c85607;background-image:linear-gradient(-180deg,#f77a25 0%,#c85607 90%);background-position:-0.5em;border-color:rgba(27,31,35,0.5)}.btn-orange:active, .btn-orange.selected, +[open] > .btn-orange{background-color:#c65e17;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-orange:disabled, .btn-orange.disabled{color:hsla(0,0%,100%,0.75);background-color:#e9ad83;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-orange .Counter{color:#f46909;background-color:#fff}.btn-outline-purple{color:#6f42c1;background-color:#fff;background-image:none}.btn-outline-purple .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-purple:hover, .btn-outline-purple:active, .btn-outline-purple.selected, +[open] > .btn-outline-purple{color:#fff;background-color:#6f42c1;background-image:none;border-color:#6f42c1}.btn-outline-purple:hover .Counter, .btn-outline-purple:active .Counter, .btn-outline-purple.selected .Counter, +[open] > .btn-outline-purple .Counter{color:#6f42c1;background-color:#fff}.btn-outline-purple:focus{border-color:#6f42c1;box-shadow:0 0 0 0.2em rgba(111,66,193,0.4)}.btn-outline-purple:disabled, .btn-outline-purple.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-outline-orange{color:#f66a0a;background-color:#fff;background-image:none}.btn-outline-orange .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-orange:hover, .btn-outline-orange:active, .btn-outline-orange.selected, +[open] > .btn-outline-orange{color:#fff;background-color:#f66a0a;background-image:none;border-color:#f66a0a}.btn-outline-orange:hover .Counter, .btn-outline-orange:active .Counter, .btn-outline-orange.selected .Counter, +[open] > .btn-outline-orange .Counter{color:#f66a0a;background-color:#fff}.btn-outline-orange:focus{border-color:#f66a0a;box-shadow:0 0 0 0.2em rgba(246,106,10,0.4)}.btn-outline-orange:disabled, .btn-outline-orange.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-outline-green{color:#28a745;background-color:#fff;background-image:none}.btn-outline-green .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-green:hover, .btn-outline-green:active, .btn-outline-green.selected, +[open] > .btn-outline-green{color:#fff;background-color:#28a745;background-image:none;border-color:#28a745}.btn-outline-green:hover .Counter, .btn-outline-green:active .Counter, .btn-outline-green.selected .Counter, +[open] > .btn-outline-green .Counter{color:#28a745;background-color:#fff}.btn-outline-green:focus{border-color:#28a745;box-shadow:0 0 0 0.2em rgba(40,167,69,0.4)}.btn-outline-green:disabled, .btn-outline-green.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-transparent{color:#fff;background-color:transparent;background-image:none;border:1px solid hsla(0,0%,100%,0.5)}.btn-transparent:hover, .btn-transparent:active{color:#2f363d;background-color:#fff;background-image:none;border-color:#fff}.jumbotron{position:relative;padding-top:40px;padding-bottom:40px}@media (min-width: 544px){.jumbotron{padding-top:60px;padding-bottom:60px}}@media (min-width: 1280px){.jumbotron{padding-top:120px;padding-bottom:120px}}@media (min-width: 1012px){.jumbotron-supertron{height:45vw;min-height:590px;max-height:55vh;padding-top:80px;padding-bottom:80px}}.jumbotron-minitron{padding-top:24px;padding-bottom:24px}@media (min-width: 544px){.jumbotron-minitron{padding-top:32px;padding-bottom:32px}}.jumbotron-shadow::after{position:absolute;bottom:0;left:0;width:100%;height:30px;content:" ";background-color:transparent;background-image:linear-gradient(transparent,rgba(0,0,0,0.05));background-repeat:repeat-x;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.05)}.jumbotron-photo{position:relative;background-color:#24292e;background-size:cover}.jumbotron-photo::before{position:absolute;bottom:0;left:0;display:block;width:100%;height:100%;content:"";background-color:rgba(0,0,0,0.25)}.page-section{padding:32px 0;margin-top:0}@media (min-width: 768px){.page-section{padding:56px 0}}.page-section-jumplink:target{padding-top:112px}@media (min-width: 768px){.page-section-jumplink:target{padding-top:80px}}.data-table{width:100%;margin-top:16px;border-collapse:collapse;border:1px #e1e4e8 solid;box-shadow:0 1px 1px rgba(27,31,35,0.05)}.data-table th{font-weight:400;text-align:left}.data-table td, +.data-table th{padding:16px;border-right:1px #e1e4e8 solid;border-bottom:1px #e1e4e8 solid}.data-table tbody th{width:25%}.data-table tbody th, +.data-table tbody td{border-bottom-color:#e1e4e8}.data-table tbody tr:last-child th, +.data-table tbody tr:last-child td{border-bottom:1px #e1e4e8 solid}.grayscale{filter:grayscale(100%)}@media (min-width: 544px){.border-sm-top{border-top:1px #e1e4e8 solid!important}.border-sm-right{border-right:1px #e1e4e8 solid!important}.border-sm-bottom{border-bottom:1px #e1e4e8 solid!important}.border-sm-left{border-left:1px #e1e4e8 solid!important}.border-sm-top-0{border-top:0!important}.border-sm-right-0{border-right:0!important}.border-sm-bottom-0{border-bottom:0!important}.border-sm-left-0{border-left:0!important}}@media (min-width: 768px){.border-md-top{border-top:1px #e1e4e8 solid!important}.border-md-right{border-right:1px #e1e4e8 solid!important}.border-md-bottom{border-bottom:1px #e1e4e8 solid!important}.border-md-left{border-left:1px #e1e4e8 solid!important}.border-md-top-0{border-top:0!important}.border-md-right-0{border-right:0!important}.border-md-bottom-0{border-bottom:0!important}.border-md-left-0{border-left:0!important}}@media (min-width: 1012px){.border-lg-top{border-top:1px #e1e4e8 solid!important}.border-lg-right{border-right:1px #e1e4e8 solid!important}.border-lg-bottom{border-bottom:1px #e1e4e8 solid!important}.border-lg-left{border-left:1px #e1e4e8 solid!important}.border-lg-top-0{border-top:0!important}.border-lg-right-0{border-right:0!important}.border-lg-bottom-0{border-bottom:0!important}.border-lg-left-0{border-left:0!important}}@media (min-width: 1280px){.border-xl-top{border-top:1px #e1e4e8 solid!important}.border-xl-right{border-right:1px #e1e4e8 solid!important}.border-xl-bottom{border-bottom:1px #e1e4e8 solid!important}.border-xl-left{border-left:1px #e1e4e8 solid!important}.border-xl-top-0{border-top:0!important}.border-xl-right-0{border-right:0!important}.border-xl-bottom-0{border-bottom:0!important}.border-xl-left-0{border-left:0!important}}.border-white-fade{border-color:hsla(0,0%,100%,0.15)!important}@media (min-width: 544px){.position-sm-relative{position:relative!important}.position-sm-absolute{position:absolute!important}.position-sm-fixed{position:fixed!important}}@media (min-width: 768px){.position-md-relative{position:relative!important}.position-md-absolute{position:absolute!important}.position-md-fixed{position:fixed!important}}@media (min-width: 1012px){.position-lg-relative{position:relative!important}.position-lg-absolute{position:absolute!important}.position-lg-fixed{position:fixed!important}}@media (min-width: 1280px){.position-xl-relative{position:relative!important}.position-xl-absolute{position:absolute!important}.position-xl-fixed{position:fixed!important}}.mt-7{margin-top:48px!important}.mb-7{margin-bottom:48px!important}.my-7{margin-top:48px!important;margin-bottom:48px!important}.mt-8{margin-top:64px!important}.mb-8{margin-bottom:64px!important}.my-8{margin-top:64px!important;margin-bottom:64px!important}.mt-9{margin-top:80px!important}.mb-9{margin-bottom:80px!important}.my-9{margin-top:80px!important;margin-bottom:80px!important}.mt-10{margin-top:96px!important}.mb-10{margin-bottom:96px!important}.my-10{margin-top:96px!important;margin-bottom:96px!important}.mt-11{margin-top:112px!important}.mb-11{margin-bottom:112px!important}.my-11{margin-top:112px!important;margin-bottom:112px!important}.mt-12{margin-top:128px!important}.mb-12{margin-bottom:128px!important}.my-12{margin-top:128px!important;margin-bottom:128px!important}@media (min-width: 544px){.mt-sm-7{margin-top:48px!important}.mb-sm-7{margin-bottom:48px!important}.my-sm-7{margin-top:48px!important;margin-bottom:48px!important}}@media (min-width: 544px){.mt-sm-8{margin-top:64px!important}.mb-sm-8{margin-bottom:64px!important}.my-sm-8{margin-top:64px!important;margin-bottom:64px!important}}@media (min-width: 544px){.mt-sm-9{margin-top:80px!important}.mb-sm-9{margin-bottom:80px!important}.my-sm-9{margin-top:80px!important;margin-bottom:80px!important}}@media (min-width: 544px){.mt-sm-10{margin-top:96px!important}.mb-sm-10{margin-bottom:96px!important}.my-sm-10{margin-top:96px!important;margin-bottom:96px!important}}@media (min-width: 544px){.mt-sm-11{margin-top:112px!important}.mb-sm-11{margin-bottom:112px!important}.my-sm-11{margin-top:112px!important;margin-bottom:112px!important}}@media (min-width: 544px){.mt-sm-12{margin-top:128px!important}.mb-sm-12{margin-bottom:128px!important}.my-sm-12{margin-top:128px!important;margin-bottom:128px!important}}@media (min-width: 768px){.mt-md-7{margin-top:48px!important}.mb-md-7{margin-bottom:48px!important}.my-md-7{margin-top:48px!important;margin-bottom:48px!important}}@media (min-width: 768px){.mt-md-8{margin-top:64px!important}.mb-md-8{margin-bottom:64px!important}.my-md-8{margin-top:64px!important;margin-bottom:64px!important}}@media (min-width: 768px){.mt-md-9{margin-top:80px!important}.mb-md-9{margin-bottom:80px!important}.my-md-9{margin-top:80px!important;margin-bottom:80px!important}}@media (min-width: 768px){.mt-md-10{margin-top:96px!important}.mb-md-10{margin-bottom:96px!important}.my-md-10{margin-top:96px!important;margin-bottom:96px!important}}@media (min-width: 768px){.mt-md-11{margin-top:112px!important}.mb-md-11{margin-bottom:112px!important}.my-md-11{margin-top:112px!important;margin-bottom:112px!important}}@media (min-width: 768px){.mt-md-12{margin-top:128px!important}.mb-md-12{margin-bottom:128px!important}.my-md-12{margin-top:128px!important;margin-bottom:128px!important}}@media (min-width: 1012px){.mt-lg-7{margin-top:48px!important}.mb-lg-7{margin-bottom:48px!important}.my-lg-7{margin-top:48px!important;margin-bottom:48px!important}}@media (min-width: 1012px){.mt-lg-8{margin-top:64px!important}.mb-lg-8{margin-bottom:64px!important}.my-lg-8{margin-top:64px!important;margin-bottom:64px!important}}@media (min-width: 1012px){.mt-lg-9{margin-top:80px!important}.mb-lg-9{margin-bottom:80px!important}.my-lg-9{margin-top:80px!important;margin-bottom:80px!important}}@media (min-width: 1012px){.mt-lg-10{margin-top:96px!important}.mb-lg-10{margin-bottom:96px!important}.my-lg-10{margin-top:96px!important;margin-bottom:96px!important}}@media (min-width: 1012px){.mt-lg-11{margin-top:112px!important}.mb-lg-11{margin-bottom:112px!important}.my-lg-11{margin-top:112px!important;margin-bottom:112px!important}}@media (min-width: 1012px){.mt-lg-12{margin-top:128px!important}.mb-lg-12{margin-bottom:128px!important}.my-lg-12{margin-top:128px!important;margin-bottom:128px!important}}@media (min-width: 1280px){.mt-xl-7{margin-top:48px!important}.mb-xl-7{margin-bottom:48px!important}.my-xl-7{margin-top:48px!important;margin-bottom:48px!important}}@media (min-width: 1280px){.mt-xl-8{margin-top:64px!important}.mb-xl-8{margin-bottom:64px!important}.my-xl-8{margin-top:64px!important;margin-bottom:64px!important}}@media (min-width: 1280px){.mt-xl-9{margin-top:80px!important}.mb-xl-9{margin-bottom:80px!important}.my-xl-9{margin-top:80px!important;margin-bottom:80px!important}}@media (min-width: 1280px){.mt-xl-10{margin-top:96px!important}.mb-xl-10{margin-bottom:96px!important}.my-xl-10{margin-top:96px!important;margin-bottom:96px!important}}@media (min-width: 1280px){.mt-xl-11{margin-top:112px!important}.mb-xl-11{margin-bottom:112px!important}.my-xl-11{margin-top:112px!important;margin-bottom:112px!important}}@media (min-width: 1280px){.mt-xl-12{margin-top:128px!important}.mb-xl-12{margin-bottom:128px!important}.my-xl-12{margin-top:128px!important;margin-bottom:128px!important}}.pt-7{padding-top:48px!important}.pb-7{padding-bottom:48px!important}.py-7{padding-top:48px!important;padding-bottom:48px!important}.pt-8{padding-top:64px!important}.pb-8{padding-bottom:64px!important}.py-8{padding-top:64px!important;padding-bottom:64px!important}.pt-9{padding-top:80px!important}.pb-9{padding-bottom:80px!important}.py-9{padding-top:80px!important;padding-bottom:80px!important}.pt-10{padding-top:96px!important}.pb-10{padding-bottom:96px!important}.py-10{padding-top:96px!important;padding-bottom:96px!important}.pt-11{padding-top:112px!important}.pb-11{padding-bottom:112px!important}.py-11{padding-top:112px!important;padding-bottom:112px!important}.pt-12{padding-top:128px!important}.pb-12{padding-bottom:128px!important}.py-12{padding-top:128px!important;padding-bottom:128px!important}@media (min-width: 544px){.pt-sm-7{padding-top:48px!important}.pb-sm-7{padding-bottom:48px!important}.py-sm-7{padding-top:48px!important;padding-bottom:48px!important}}@media (min-width: 544px){.pt-sm-8{padding-top:64px!important}.pb-sm-8{padding-bottom:64px!important}.py-sm-8{padding-top:64px!important;padding-bottom:64px!important}}@media (min-width: 544px){.pt-sm-9{padding-top:80px!important}.pb-sm-9{padding-bottom:80px!important}.py-sm-9{padding-top:80px!important;padding-bottom:80px!important}}@media (min-width: 544px){.pt-sm-10{padding-top:96px!important}.pb-sm-10{padding-bottom:96px!important}.py-sm-10{padding-top:96px!important;padding-bottom:96px!important}}@media (min-width: 544px){.pt-sm-11{padding-top:112px!important}.pb-sm-11{padding-bottom:112px!important}.py-sm-11{padding-top:112px!important;padding-bottom:112px!important}}@media (min-width: 544px){.pt-sm-12{padding-top:128px!important}.pb-sm-12{padding-bottom:128px!important}.py-sm-12{padding-top:128px!important;padding-bottom:128px!important}}@media (min-width: 768px){.pt-md-7{padding-top:48px!important}.pb-md-7{padding-bottom:48px!important}.py-md-7{padding-top:48px!important;padding-bottom:48px!important}}@media (min-width: 768px){.pt-md-8{padding-top:64px!important}.pb-md-8{padding-bottom:64px!important}.py-md-8{padding-top:64px!important;padding-bottom:64px!important}}@media (min-width: 768px){.pt-md-9{padding-top:80px!important}.pb-md-9{padding-bottom:80px!important}.py-md-9{padding-top:80px!important;padding-bottom:80px!important}}@media (min-width: 768px){.pt-md-10{padding-top:96px!important}.pb-md-10{padding-bottom:96px!important}.py-md-10{padding-top:96px!important;padding-bottom:96px!important}}@media (min-width: 768px){.pt-md-11{padding-top:112px!important}.pb-md-11{padding-bottom:112px!important}.py-md-11{padding-top:112px!important;padding-bottom:112px!important}}@media (min-width: 768px){.pt-md-12{padding-top:128px!important}.pb-md-12{padding-bottom:128px!important}.py-md-12{padding-top:128px!important;padding-bottom:128px!important}}@media (min-width: 1012px){.pt-lg-7{padding-top:48px!important}.pb-lg-7{padding-bottom:48px!important}.py-lg-7{padding-top:48px!important;padding-bottom:48px!important}}@media (min-width: 1012px){.pt-lg-8{padding-top:64px!important}.pb-lg-8{padding-bottom:64px!important}.py-lg-8{padding-top:64px!important;padding-bottom:64px!important}}@media (min-width: 1012px){.pt-lg-9{padding-top:80px!important}.pb-lg-9{padding-bottom:80px!important}.py-lg-9{padding-top:80px!important;padding-bottom:80px!important}}@media (min-width: 1012px){.pt-lg-10{padding-top:96px!important}.pb-lg-10{padding-bottom:96px!important}.py-lg-10{padding-top:96px!important;padding-bottom:96px!important}}@media (min-width: 1012px){.pt-lg-11{padding-top:112px!important}.pb-lg-11{padding-bottom:112px!important}.py-lg-11{padding-top:112px!important;padding-bottom:112px!important}}@media (min-width: 1012px){.pt-lg-12{padding-top:128px!important}.pb-lg-12{padding-bottom:128px!important}.py-lg-12{padding-top:128px!important;padding-bottom:128px!important}}@media (min-width: 1280px){.pt-xl-7{padding-top:48px!important}.pb-xl-7{padding-bottom:48px!important}.py-xl-7{padding-top:48px!important;padding-bottom:48px!important}}@media (min-width: 1280px){.pt-xl-8{padding-top:64px!important}.pb-xl-8{padding-bottom:64px!important}.py-xl-8{padding-top:64px!important;padding-bottom:64px!important}}@media (min-width: 1280px){.pt-xl-9{padding-top:80px!important}.pb-xl-9{padding-bottom:80px!important}.py-xl-9{padding-top:80px!important;padding-bottom:80px!important}}@media (min-width: 1280px){.pt-xl-10{padding-top:96px!important}.pb-xl-10{padding-bottom:96px!important}.py-xl-10{padding-top:96px!important;padding-bottom:96px!important}}@media (min-width: 1280px){.pt-xl-11{padding-top:112px!important}.pb-xl-11{padding-bottom:112px!important}.py-xl-11{padding-top:112px!important;padding-bottom:112px!important}}@media (min-width: 1280px){.pt-xl-12{padding-top:128px!important}.pb-xl-12{padding-bottom:128px!important}.py-xl-12{padding-top:128px!important;padding-bottom:128px!important}}hr{border-bottom-color:#eee}.img-responsive{display:block;width:100%;max-width:100%;height:auto}@font-face{font-family:InterUI;font-style:normal;font-weight:400;src:local("InterUI"),local("InterUI-Regular"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff")}@font-face{font-family:InterUI;font-style:normal;font-weight:500;src:local("InterUI Medium"),local("InterUI-Medium"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff")}.bg-blue-dark{background-color:#032f62!important}.text-blue-mktg{color:#1277eb!important}.text-blue-light{color:#79b8ff!important}.text-white-fade{color:hsla(0,0%,100%,0.7)!important}.h000-mktg, +.h00-mktg, +.h0-mktg, +.h1-mktg, +.h2-mktg, +.h3-mktg, +.h4-mktg, +.h5-mktg, +.h6-mktg, +.lead-mktg{font-family:InterUI,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Oxygen,Ubuntu,Cantarell,"Open Sans",sans-serif;font-weight:500}.lead-mktg{font-size:21px!important;font-weight:normal!important}.h000-mktg, +.h000{font-size:48px!important}@media (min-width: 768px){.h000-mktg, + .h000{font-size:64px!important}}.h00-mktg{font-size:40px!important}@media (min-width: 768px){.h00-mktg{font-size:48px!important}}.h0-mktg{font-size:32px!important}@media (min-width: 768px){.h0-mktg{font-size:40px!important}}.h1-mktg{font-size:26px!important}@media (min-width: 768px){.h1-mktg{font-size:32px!important}}.h2-mktg{font-size:22px!important}@media (min-width: 768px){.h2-mktg{font-size:24px!important}}.h3-mktg{font-size:18px!important}@media (min-width: 768px){.h3-mktg{font-size:20px!important}}.h4-mktg{font-size:16px!important}.h5-mktg{font-size:14px!important}.h6-mktg{font-size:12px!important}.text-gray-light-ultra{font-style:normal;font-weight:400;color:#808891}.underline-dashed{display:inline;padding-bottom:4px;background-image:linear-gradient(to right,#d1d5da 50%,hsla(0,0%,100%,0) 0%);background-repeat:repeat-x;background-position:bottom;background-size:10px 2px}.link-mktg{color:#1277eb;text-decoration:none!important;box-shadow:0 1px 0 0 rgba(18,119,235,0.5);transition:0.2s}.link-mktg:hover{color:#0366d6;box-shadow:0 1px 0 0 #1277eb}.Tile{position:relative;display:block;min-height:250px;background-color:#f6f8fa;border-radius:3px;transition:0.4s}.Tile:hover{background-color:#fff;box-shadow:0 4px 14px rgba(0,0,0,0.1)}.Tile:active{box-shadow:0 2px 7px rgba(0,0,0,0.1)}.Tile--dots::before{position:absolute;top:0;left:0;z-index:-1;width:180px;height:180px;content:"";background:url("/images/modules/site/patterns/dots-small.svg");opacity:0;transition:0.4s}.Tile--dots::after{position:absolute;right:0;bottom:0;z-index:-1;width:180px;height:180px;content:"";background:url("/images/modules/site/patterns/dots-small.svg");opacity:0;transition:0.4s}.Tile--dots:hover::before{opacity:1;transform:translate3d(-18px,-18px,0)}.Tile--dots:hover::after{opacity:1;transform:translate3d(23px,23px,0)}.Tile--dots:active::before{opacity:0.5;transform:translate3d(-10px,-10px,0)}.Tile--dots:active::after{opacity:0.5;transform:translate3d(18px,18px,0)}.Tile--symbol::before{position:absolute;top:16px;right:24px;font-size:24px;content:"â";opacity:0;transition:0.4s,color 0s;transform:rotate(-45deg) translateX(-3px)}.Tile--symbol:hover::before{opacity:1;transform:rotate(-45deg) translateX(0)}.Tile--symbol:active::before{opacity:1;transition:0.2s;transform:rotate(-45deg) translateX(-5px)}.Tile-date{position:absolute;bottom:24px;left:24px;margin-bottom:0;line-height:1;color:#959da5}.bg-dots-gray{background:url("/images/modules/site/patterns/dots-small.svg")}.dots-4{position:relative}.dots-4::before{position:absolute;top:-31px;left:-31px;z-index:-1;width:75%;height:75%;content:"";background:url("/images/modules/site/patterns/dots-small.svg")}.dots-3{position:relative}.dots-3::before{position:absolute;top:-21px;left:-21px;z-index:-1;width:75%;height:75%;content:"";background:url("/images/modules/site/patterns/dots-small.svg")}.Point:hover .Point-symbol{transform:translateY(-5px)}.Point-symbol{transition:0.2s;transform:translateY(0)}.Bump-link-symbol{display:inline-block;transition:0.2s;transform:translateX(0)}.Bump-link:hover .Bump-link-symbol{transform:translateX(3px)}.Bump-link--hover .Bump-link-symbol{color:inherit;opacity:0;transition:0.2s;transform:translateX(0)}.Bump-link--hover:hover .Bump-link-symbol{opacity:1;transform:translateX(3px)}.btn-mktg{display:inline-block;padding:16px 24px;font-size:14px;font-weight:500;color:#fff;background-color:#1277eb;border:0;border-radius:3px;transition:0.2s}.btn-mktg:hover{text-decoration:none;background-color:#0366d6}.btn-primary-mktg{background-color:#2ebc4f}.btn-primary-mktg:hover{background-color:#28a745}.btn-large-mktg{padding:20px 32px;font-size:16px}.btn-outline-mktg{color:#1277eb!important;background-color:transparent!important;box-shadow:0 0 0 1px rgba(18,119,235,0.5) inset}.btn-outline-mktg:hover{color:#0366d6!important;text-decoration:none;box-shadow:0 0 0 1px #1277eb inset}.top-0{top:0!important}.right-0{right:0!important}.bottom-0{bottom:0!important}.left-0{left:0!important}.top-n0{top:-0!important}.right-n0{right:-0!important}.bottom-n0{bottom:-0!important}.left-n0{left:-0!important}.top-1{top:4px!important}.right-1{right:4px!important}.bottom-1{bottom:4px!important}.left-1{left:4px!important}.top-n1{top:-4px!important}.right-n1{right:-4px!important}.bottom-n1{bottom:-4px!important}.left-n1{left:-4px!important}.top-2{top:8px!important}.right-2{right:8px!important}.bottom-2{bottom:8px!important}.left-2{left:8px!important}.top-n2{top:-8px!important}.right-n2{right:-8px!important}.bottom-n2{bottom:-8px!important}.left-n2{left:-8px!important}.top-3{top:16px!important}.right-3{right:16px!important}.bottom-3{bottom:16px!important}.left-3{left:16px!important}.top-n3{top:-16px!important}.right-n3{right:-16px!important}.bottom-n3{bottom:-16px!important}.left-n3{left:-16px!important}.top-4{top:24px!important}.right-4{right:24px!important}.bottom-4{bottom:24px!important}.left-4{left:24px!important}.top-n4{top:-24px!important}.right-n4{right:-24px!important}.bottom-n4{bottom:-24px!important}.left-n4{left:-24px!important}.top-5{top:32px!important}.right-5{right:32px!important}.bottom-5{bottom:32px!important}.left-5{left:32px!important}.top-n5{top:-32px!important}.right-n5{right:-32px!important}.bottom-n5{bottom:-32px!important}.left-n5{left:-32px!important}.top-6{top:40px!important}.right-6{right:40px!important}.bottom-6{bottom:40px!important}.left-6{left:40px!important}.top-n6{top:-40px!important}.right-n6{right:-40px!important}.bottom-n6{bottom:-40px!important}.left-n6{left:-40px!important}.top-7{top:48px!important}.right-7{right:48px!important}.bottom-7{bottom:48px!important}.left-7{left:48px!important}.top-n7{top:-48px!important}.right-n7{right:-48px!important}.bottom-n7{bottom:-48px!important}.left-n7{left:-48px!important}.top-8{top:64px!important}.right-8{right:64px!important}.bottom-8{bottom:64px!important}.left-8{left:64px!important}.top-n8{top:-64px!important}.right-n8{right:-64px!important}.bottom-n8{bottom:-64px!important}.left-n8{left:-64px!important}.top-9{top:80px!important}.right-9{right:80px!important}.bottom-9{bottom:80px!important}.left-9{left:80px!important}.top-n9{top:-80px!important}.right-n9{right:-80px!important}.bottom-n9{bottom:-80px!important}.left-n9{left:-80px!important}.top-10{top:96px!important}.right-10{right:96px!important}.bottom-10{bottom:96px!important}.left-10{left:96px!important}.top-n10{top:-96px!important}.right-n10{right:-96px!important}.bottom-n10{bottom:-96px!important}.left-n10{left:-96px!important}.top-11{top:112px!important}.right-11{right:112px!important}.bottom-11{bottom:112px!important}.left-11{left:112px!important}.top-n11{top:-112px!important}.right-n11{right:-112px!important}.bottom-n11{bottom:-112px!important}.left-n11{left:-112px!important}.top-12{top:128px!important}.right-12{right:128px!important}.bottom-12{bottom:128px!important}.left-12{left:128px!important}.top-n12{top:-128px!important}.right-n12{right:-128px!important}.bottom-n12{bottom:-128px!important}.left-n12{left:-128px!important}@media (min-width: 544px){.top-sm-0{top:0!important}.right-sm-0{right:0!important}.bottom-sm-0{bottom:0!important}.left-sm-0{left:0!important}.top-sm-n0{top:-0!important}.right-sm-n0{right:-0!important}.bottom-sm-n0{bottom:-0!important}.left-sm-n0{left:-0!important}}@media (min-width: 544px){.top-sm-1{top:4px!important}.right-sm-1{right:4px!important}.bottom-sm-1{bottom:4px!important}.left-sm-1{left:4px!important}.top-sm-n1{top:-4px!important}.right-sm-n1{right:-4px!important}.bottom-sm-n1{bottom:-4px!important}.left-sm-n1{left:-4px!important}}@media (min-width: 544px){.top-sm-2{top:8px!important}.right-sm-2{right:8px!important}.bottom-sm-2{bottom:8px!important}.left-sm-2{left:8px!important}.top-sm-n2{top:-8px!important}.right-sm-n2{right:-8px!important}.bottom-sm-n2{bottom:-8px!important}.left-sm-n2{left:-8px!important}}@media (min-width: 544px){.top-sm-3{top:16px!important}.right-sm-3{right:16px!important}.bottom-sm-3{bottom:16px!important}.left-sm-3{left:16px!important}.top-sm-n3{top:-16px!important}.right-sm-n3{right:-16px!important}.bottom-sm-n3{bottom:-16px!important}.left-sm-n3{left:-16px!important}}@media (min-width: 544px){.top-sm-4{top:24px!important}.right-sm-4{right:24px!important}.bottom-sm-4{bottom:24px!important}.left-sm-4{left:24px!important}.top-sm-n4{top:-24px!important}.right-sm-n4{right:-24px!important}.bottom-sm-n4{bottom:-24px!important}.left-sm-n4{left:-24px!important}}@media (min-width: 544px){.top-sm-5{top:32px!important}.right-sm-5{right:32px!important}.bottom-sm-5{bottom:32px!important}.left-sm-5{left:32px!important}.top-sm-n5{top:-32px!important}.right-sm-n5{right:-32px!important}.bottom-sm-n5{bottom:-32px!important}.left-sm-n5{left:-32px!important}}@media (min-width: 544px){.top-sm-6{top:40px!important}.right-sm-6{right:40px!important}.bottom-sm-6{bottom:40px!important}.left-sm-6{left:40px!important}.top-sm-n6{top:-40px!important}.right-sm-n6{right:-40px!important}.bottom-sm-n6{bottom:-40px!important}.left-sm-n6{left:-40px!important}}@media (min-width: 544px){.top-sm-7{top:48px!important}.right-sm-7{right:48px!important}.bottom-sm-7{bottom:48px!important}.left-sm-7{left:48px!important}.top-sm-n7{top:-48px!important}.right-sm-n7{right:-48px!important}.bottom-sm-n7{bottom:-48px!important}.left-sm-n7{left:-48px!important}}@media (min-width: 544px){.top-sm-8{top:64px!important}.right-sm-8{right:64px!important}.bottom-sm-8{bottom:64px!important}.left-sm-8{left:64px!important}.top-sm-n8{top:-64px!important}.right-sm-n8{right:-64px!important}.bottom-sm-n8{bottom:-64px!important}.left-sm-n8{left:-64px!important}}@media (min-width: 544px){.top-sm-9{top:80px!important}.right-sm-9{right:80px!important}.bottom-sm-9{bottom:80px!important}.left-sm-9{left:80px!important}.top-sm-n9{top:-80px!important}.right-sm-n9{right:-80px!important}.bottom-sm-n9{bottom:-80px!important}.left-sm-n9{left:-80px!important}}@media (min-width: 544px){.top-sm-10{top:96px!important}.right-sm-10{right:96px!important}.bottom-sm-10{bottom:96px!important}.left-sm-10{left:96px!important}.top-sm-n10{top:-96px!important}.right-sm-n10{right:-96px!important}.bottom-sm-n10{bottom:-96px!important}.left-sm-n10{left:-96px!important}}@media (min-width: 544px){.top-sm-11{top:112px!important}.right-sm-11{right:112px!important}.bottom-sm-11{bottom:112px!important}.left-sm-11{left:112px!important}.top-sm-n11{top:-112px!important}.right-sm-n11{right:-112px!important}.bottom-sm-n11{bottom:-112px!important}.left-sm-n11{left:-112px!important}}@media (min-width: 544px){.top-sm-12{top:128px!important}.right-sm-12{right:128px!important}.bottom-sm-12{bottom:128px!important}.left-sm-12{left:128px!important}.top-sm-n12{top:-128px!important}.right-sm-n12{right:-128px!important}.bottom-sm-n12{bottom:-128px!important}.left-sm-n12{left:-128px!important}}@media (min-width: 768px){.top-md-0{top:0!important}.right-md-0{right:0!important}.bottom-md-0{bottom:0!important}.left-md-0{left:0!important}.top-md-n0{top:-0!important}.right-md-n0{right:-0!important}.bottom-md-n0{bottom:-0!important}.left-md-n0{left:-0!important}}@media (min-width: 768px){.top-md-1{top:4px!important}.right-md-1{right:4px!important}.bottom-md-1{bottom:4px!important}.left-md-1{left:4px!important}.top-md-n1{top:-4px!important}.right-md-n1{right:-4px!important}.bottom-md-n1{bottom:-4px!important}.left-md-n1{left:-4px!important}}@media (min-width: 768px){.top-md-2{top:8px!important}.right-md-2{right:8px!important}.bottom-md-2{bottom:8px!important}.left-md-2{left:8px!important}.top-md-n2{top:-8px!important}.right-md-n2{right:-8px!important}.bottom-md-n2{bottom:-8px!important}.left-md-n2{left:-8px!important}}@media (min-width: 768px){.top-md-3{top:16px!important}.right-md-3{right:16px!important}.bottom-md-3{bottom:16px!important}.left-md-3{left:16px!important}.top-md-n3{top:-16px!important}.right-md-n3{right:-16px!important}.bottom-md-n3{bottom:-16px!important}.left-md-n3{left:-16px!important}}@media (min-width: 768px){.top-md-4{top:24px!important}.right-md-4{right:24px!important}.bottom-md-4{bottom:24px!important}.left-md-4{left:24px!important}.top-md-n4{top:-24px!important}.right-md-n4{right:-24px!important}.bottom-md-n4{bottom:-24px!important}.left-md-n4{left:-24px!important}}@media (min-width: 768px){.top-md-5{top:32px!important}.right-md-5{right:32px!important}.bottom-md-5{bottom:32px!important}.left-md-5{left:32px!important}.top-md-n5{top:-32px!important}.right-md-n5{right:-32px!important}.bottom-md-n5{bottom:-32px!important}.left-md-n5{left:-32px!important}}@media (min-width: 768px){.top-md-6{top:40px!important}.right-md-6{right:40px!important}.bottom-md-6{bottom:40px!important}.left-md-6{left:40px!important}.top-md-n6{top:-40px!important}.right-md-n6{right:-40px!important}.bottom-md-n6{bottom:-40px!important}.left-md-n6{left:-40px!important}}@media (min-width: 768px){.top-md-7{top:48px!important}.right-md-7{right:48px!important}.bottom-md-7{bottom:48px!important}.left-md-7{left:48px!important}.top-md-n7{top:-48px!important}.right-md-n7{right:-48px!important}.bottom-md-n7{bottom:-48px!important}.left-md-n7{left:-48px!important}}@media (min-width: 768px){.top-md-8{top:64px!important}.right-md-8{right:64px!important}.bottom-md-8{bottom:64px!important}.left-md-8{left:64px!important}.top-md-n8{top:-64px!important}.right-md-n8{right:-64px!important}.bottom-md-n8{bottom:-64px!important}.left-md-n8{left:-64px!important}}@media (min-width: 768px){.top-md-9{top:80px!important}.right-md-9{right:80px!important}.bottom-md-9{bottom:80px!important}.left-md-9{left:80px!important}.top-md-n9{top:-80px!important}.right-md-n9{right:-80px!important}.bottom-md-n9{bottom:-80px!important}.left-md-n9{left:-80px!important}}@media (min-width: 768px){.top-md-10{top:96px!important}.right-md-10{right:96px!important}.bottom-md-10{bottom:96px!important}.left-md-10{left:96px!important}.top-md-n10{top:-96px!important}.right-md-n10{right:-96px!important}.bottom-md-n10{bottom:-96px!important}.left-md-n10{left:-96px!important}}@media (min-width: 768px){.top-md-11{top:112px!important}.right-md-11{right:112px!important}.bottom-md-11{bottom:112px!important}.left-md-11{left:112px!important}.top-md-n11{top:-112px!important}.right-md-n11{right:-112px!important}.bottom-md-n11{bottom:-112px!important}.left-md-n11{left:-112px!important}}@media (min-width: 768px){.top-md-12{top:128px!important}.right-md-12{right:128px!important}.bottom-md-12{bottom:128px!important}.left-md-12{left:128px!important}.top-md-n12{top:-128px!important}.right-md-n12{right:-128px!important}.bottom-md-n12{bottom:-128px!important}.left-md-n12{left:-128px!important}}@media (min-width: 1012px){.top-lg-0{top:0!important}.right-lg-0{right:0!important}.bottom-lg-0{bottom:0!important}.left-lg-0{left:0!important}.top-lg-n0{top:-0!important}.right-lg-n0{right:-0!important}.bottom-lg-n0{bottom:-0!important}.left-lg-n0{left:-0!important}}@media (min-width: 1012px){.top-lg-1{top:4px!important}.right-lg-1{right:4px!important}.bottom-lg-1{bottom:4px!important}.left-lg-1{left:4px!important}.top-lg-n1{top:-4px!important}.right-lg-n1{right:-4px!important}.bottom-lg-n1{bottom:-4px!important}.left-lg-n1{left:-4px!important}}@media (min-width: 1012px){.top-lg-2{top:8px!important}.right-lg-2{right:8px!important}.bottom-lg-2{bottom:8px!important}.left-lg-2{left:8px!important}.top-lg-n2{top:-8px!important}.right-lg-n2{right:-8px!important}.bottom-lg-n2{bottom:-8px!important}.left-lg-n2{left:-8px!important}}@media (min-width: 1012px){.top-lg-3{top:16px!important}.right-lg-3{right:16px!important}.bottom-lg-3{bottom:16px!important}.left-lg-3{left:16px!important}.top-lg-n3{top:-16px!important}.right-lg-n3{right:-16px!important}.bottom-lg-n3{bottom:-16px!important}.left-lg-n3{left:-16px!important}}@media (min-width: 1012px){.top-lg-4{top:24px!important}.right-lg-4{right:24px!important}.bottom-lg-4{bottom:24px!important}.left-lg-4{left:24px!important}.top-lg-n4{top:-24px!important}.right-lg-n4{right:-24px!important}.bottom-lg-n4{bottom:-24px!important}.left-lg-n4{left:-24px!important}}@media (min-width: 1012px){.top-lg-5{top:32px!important}.right-lg-5{right:32px!important}.bottom-lg-5{bottom:32px!important}.left-lg-5{left:32px!important}.top-lg-n5{top:-32px!important}.right-lg-n5{right:-32px!important}.bottom-lg-n5{bottom:-32px!important}.left-lg-n5{left:-32px!important}}@media (min-width: 1012px){.top-lg-6{top:40px!important}.right-lg-6{right:40px!important}.bottom-lg-6{bottom:40px!important}.left-lg-6{left:40px!important}.top-lg-n6{top:-40px!important}.right-lg-n6{right:-40px!important}.bottom-lg-n6{bottom:-40px!important}.left-lg-n6{left:-40px!important}}@media (min-width: 1012px){.top-lg-7{top:48px!important}.right-lg-7{right:48px!important}.bottom-lg-7{bottom:48px!important}.left-lg-7{left:48px!important}.top-lg-n7{top:-48px!important}.right-lg-n7{right:-48px!important}.bottom-lg-n7{bottom:-48px!important}.left-lg-n7{left:-48px!important}}@media (min-width: 1012px){.top-lg-8{top:64px!important}.right-lg-8{right:64px!important}.bottom-lg-8{bottom:64px!important}.left-lg-8{left:64px!important}.top-lg-n8{top:-64px!important}.right-lg-n8{right:-64px!important}.bottom-lg-n8{bottom:-64px!important}.left-lg-n8{left:-64px!important}}@media (min-width: 1012px){.top-lg-9{top:80px!important}.right-lg-9{right:80px!important}.bottom-lg-9{bottom:80px!important}.left-lg-9{left:80px!important}.top-lg-n9{top:-80px!important}.right-lg-n9{right:-80px!important}.bottom-lg-n9{bottom:-80px!important}.left-lg-n9{left:-80px!important}}@media (min-width: 1012px){.top-lg-10{top:96px!important}.right-lg-10{right:96px!important}.bottom-lg-10{bottom:96px!important}.left-lg-10{left:96px!important}.top-lg-n10{top:-96px!important}.right-lg-n10{right:-96px!important}.bottom-lg-n10{bottom:-96px!important}.left-lg-n10{left:-96px!important}}@media (min-width: 1012px){.top-lg-11{top:112px!important}.right-lg-11{right:112px!important}.bottom-lg-11{bottom:112px!important}.left-lg-11{left:112px!important}.top-lg-n11{top:-112px!important}.right-lg-n11{right:-112px!important}.bottom-lg-n11{bottom:-112px!important}.left-lg-n11{left:-112px!important}}@media (min-width: 1012px){.top-lg-12{top:128px!important}.right-lg-12{right:128px!important}.bottom-lg-12{bottom:128px!important}.left-lg-12{left:128px!important}.top-lg-n12{top:-128px!important}.right-lg-n12{right:-128px!important}.bottom-lg-n12{bottom:-128px!important}.left-lg-n12{left:-128px!important}}@media (min-width: 1280px){.top-xl-0{top:0!important}.right-xl-0{right:0!important}.bottom-xl-0{bottom:0!important}.left-xl-0{left:0!important}.top-xl-n0{top:-0!important}.right-xl-n0{right:-0!important}.bottom-xl-n0{bottom:-0!important}.left-xl-n0{left:-0!important}}@media (min-width: 1280px){.top-xl-1{top:4px!important}.right-xl-1{right:4px!important}.bottom-xl-1{bottom:4px!important}.left-xl-1{left:4px!important}.top-xl-n1{top:-4px!important}.right-xl-n1{right:-4px!important}.bottom-xl-n1{bottom:-4px!important}.left-xl-n1{left:-4px!important}}@media (min-width: 1280px){.top-xl-2{top:8px!important}.right-xl-2{right:8px!important}.bottom-xl-2{bottom:8px!important}.left-xl-2{left:8px!important}.top-xl-n2{top:-8px!important}.right-xl-n2{right:-8px!important}.bottom-xl-n2{bottom:-8px!important}.left-xl-n2{left:-8px!important}}@media (min-width: 1280px){.top-xl-3{top:16px!important}.right-xl-3{right:16px!important}.bottom-xl-3{bottom:16px!important}.left-xl-3{left:16px!important}.top-xl-n3{top:-16px!important}.right-xl-n3{right:-16px!important}.bottom-xl-n3{bottom:-16px!important}.left-xl-n3{left:-16px!important}}@media (min-width: 1280px){.top-xl-4{top:24px!important}.right-xl-4{right:24px!important}.bottom-xl-4{bottom:24px!important}.left-xl-4{left:24px!important}.top-xl-n4{top:-24px!important}.right-xl-n4{right:-24px!important}.bottom-xl-n4{bottom:-24px!important}.left-xl-n4{left:-24px!important}}@media (min-width: 1280px){.top-xl-5{top:32px!important}.right-xl-5{right:32px!important}.bottom-xl-5{bottom:32px!important}.left-xl-5{left:32px!important}.top-xl-n5{top:-32px!important}.right-xl-n5{right:-32px!important}.bottom-xl-n5{bottom:-32px!important}.left-xl-n5{left:-32px!important}}@media (min-width: 1280px){.top-xl-6{top:40px!important}.right-xl-6{right:40px!important}.bottom-xl-6{bottom:40px!important}.left-xl-6{left:40px!important}.top-xl-n6{top:-40px!important}.right-xl-n6{right:-40px!important}.bottom-xl-n6{bottom:-40px!important}.left-xl-n6{left:-40px!important}}@media (min-width: 1280px){.top-xl-7{top:48px!important}.right-xl-7{right:48px!important}.bottom-xl-7{bottom:48px!important}.left-xl-7{left:48px!important}.top-xl-n7{top:-48px!important}.right-xl-n7{right:-48px!important}.bottom-xl-n7{bottom:-48px!important}.left-xl-n7{left:-48px!important}}@media (min-width: 1280px){.top-xl-8{top:64px!important}.right-xl-8{right:64px!important}.bottom-xl-8{bottom:64px!important}.left-xl-8{left:64px!important}.top-xl-n8{top:-64px!important}.right-xl-n8{right:-64px!important}.bottom-xl-n8{bottom:-64px!important}.left-xl-n8{left:-64px!important}}@media (min-width: 1280px){.top-xl-9{top:80px!important}.right-xl-9{right:80px!important}.bottom-xl-9{bottom:80px!important}.left-xl-9{left:80px!important}.top-xl-n9{top:-80px!important}.right-xl-n9{right:-80px!important}.bottom-xl-n9{bottom:-80px!important}.left-xl-n9{left:-80px!important}}@media (min-width: 1280px){.top-xl-10{top:96px!important}.right-xl-10{right:96px!important}.bottom-xl-10{bottom:96px!important}.left-xl-10{left:96px!important}.top-xl-n10{top:-96px!important}.right-xl-n10{right:-96px!important}.bottom-xl-n10{bottom:-96px!important}.left-xl-n10{left:-96px!important}}@media (min-width: 1280px){.top-xl-11{top:112px!important}.right-xl-11{right:112px!important}.bottom-xl-11{bottom:112px!important}.left-xl-11{left:112px!important}.top-xl-n11{top:-112px!important}.right-xl-n11{right:-112px!important}.bottom-xl-n11{bottom:-112px!important}.left-xl-n11{left:-112px!important}}@media (min-width: 1280px){.top-xl-12{top:128px!important}.right-xl-12{right:128px!important}.bottom-xl-12{bottom:128px!important}.left-xl-12{left:128px!important}.top-xl-n12{top:-128px!important}.right-xl-n12{right:-128px!important}.bottom-xl-n12{bottom:-128px!important}.left-xl-n12{left:-128px!important}}.z-n1{z-index:-1}.z-n2{z-index:-2}.site-subheader{position:relative;z-index:2;padding-top:16px;padding-bottom:16px}.site-subheader-overlay{margin-bottom:-96px}@media (min-width: 1012px){.site-subheader-overlay{margin-bottom:-72px}}.site-subheader-sticky{position:-webkit-sticky;position:sticky;top:0;z-index:21}.site-subheader-sticky.is-stuck{background-color:#fff;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.1)}.site-subheader-sticky.is-stuck::after{position:absolute;right:0;bottom:-12px;left:0;z-index:-1;display:block;height:12px;content:"";background:linear-gradient(rgba(0,0,0,0.075),rgba(0,0,0,0.001)) repeat-x 0 0}.subheader-title{display:block;margin-bottom:10px;font-weight:400;text-align:center}@media (min-width: 1012px){.subheader-title{float:left;text-align:left}}.subheader-nav{font-size:14px}@media (min-width: 768px){.subheader-nav{font-size:16px}}.subheader-nav .btn-outline-purple{font-size:inherit}.subheader-nav .nav-item.selected{color:#24292e}.site-subheader-business{margin-bottom:0;border-bottom:1px solid rgba(0,0,0,0.1)}.site-subheader-pricing{background-color:#fafbfc}.subheader-nav-business .nav-item{color:#6a737d}.subheader-nav-business .nav-item:hover{color:#586069}.plans-cards{display:flex;flex:0 1 100%;flex-direction:column;align-items:center}@media (min-width: 768px){.plans-cards{align-items:stretch;flex-flow:row wrap;justify-content:center}}@media (min-width: 1012px){.plans-cards{flex-wrap:nowrap}}.plans-card{display:flex;margin-right:10px;margin-bottom:20px;margin-left:10px;font-size:14px;flex-direction:column}.plans-card-pricing-footnote{display:inline-block;margin-left:-0.5em}.plans-card-btn{padding:16px;border-color:#e1e4e8;border-width:1px 0 0;border-radius:0 0 2px 2px}.plans-card-btn:hover, .plans-card-btn:active, .plans-card-btn.selected{border-color:transparent}.plans-card-text{display:flex;flex-direction:column;flex:1 1 auto}.pricing-table{text-align:center}.pricing-table thead th{border-bottom:1px #e1e4e8 solid}.pricing-table .pricing-table-spacer{height:5px;border:0}.pricing-table td:first-child{font-weight:500;text-align:left}.pricing-table td, +.pricing-table th{width:18%;padding:8px 16px}.pricing-table td:first-child, +.pricing-table th:first-child{width:28%;padding-left:0}.pricing-table td{border-bottom:1px solid #eaecef}.pricing-table td + td{border-right:1px solid #eaecef;border-left:1px solid #eaecef}.pricing-table-responsive{display:block;width:100%;min-height:0.01%;overflow-x:auto}@media (min-width: 768px){.pricing-table-responsive{display:table}}.pricing-table-header .octicon-link{visibility:hidden}.pricing-table-header:hover .octicon-link{visibility:visible}.jumbotron-codelines{color:hsla(0,0%,100%,0.6);background:url("/images/modules/site/heroes/simple-codelines.svg"),#2b3137;background-position:center 10%;background-size:cover}.jumbotron-netneutrality{background:#24292e}@media (min-width: 768px){.jumbotron-netneutrality{background:url("/images/modules/site/netneutrality/netneutrality.png"),#24292e;background-position:center top;background-size:150% auto}}@media (min-width: 1012px){.jumbotron-netneutrality{background-size:130% auto}}@media (min-width: 1280px){.jumbotron-netneutrality{background-size:cover}}.jumbotron-integrations{background-image:url("/images/modules/site/heroes/features-hero-integrations.svg");background-repeat:no-repeat;background-position:top center;background-size:110% auto}.jumbotron-endpoints{background-image:url("/images/modules/site/heroes/features-hero-integrations-endpoints.svg");background-repeat:no-repeat;background-position:center;background-size:100%}.jumbotron-projects{background-image:url("/images/modules/site/heroes/features-hero-project-management.svg");background-position:top center,0 0;background-size:110% auto}.jumbotron-code-review{background-image:url("/images/modules/site/heroes/features-hero-code-review.svg");background-position:top center,0 0;background-size:110% auto}.jumbotron-link{font-weight:400;border-bottom:1px solid hsla(0,0%,100%,0.125)}.jumbotron-link:hover{text-decoration:none;border-bottom-color:hsla(0,0%,100%,0.75)}.jumbotron-video{position:relative;margin-top:24px;margin-bottom:-24px}@media (min-width: 544px){.jumbotron-video{margin-top:32px;margin-bottom:-32px}}@media (min-width: 1012px){.jumbotron-video{margin-top:48px;margin-bottom:-48px}}@media (min-width: 1280px){.jumbotron-video{margin-top:64px;margin-bottom:-64px}}.jumbotron-video-close{position:absolute;top:0;right:-40px}.jumbotron-link-followup{position:relative;z-index:1;display:inline-block;padding:4px;margin:0 auto;line-height:1;white-space:normal}.jumbotron-link-followup:hover{text-decoration:none}@media (min-width: 768px){.jumbotron-link-followup{display:block;margin:0}}.jumbotron-link-followup .jumbotron-link-followup-icon{position:relative;left:-4px;width:25px;height:25px;margin-left:-30px;vertical-align:middle}@media (min-width: 768px){.jumbotron-link-followup .jumbotron-link-followup-icon{width:30px;height:30px;margin-top:-2px;margin-left:-40px}}.featurette-heading{text-align:center}@media (min-width: 768px){.featurette-heading{text-align:inherit}}.featurette-benefit-img{width:50px;vertical-align:top}@media (min-width: 768px){.featurette-benefit-img{width:60px}}.featurette-icon{width:100%;height:auto}.featurette-illo{padding:0 5%}@media (min-width: 768px){.featurette-illo{padding:0}}.business-security-cta{padding-top:40px;padding-bottom:40px;border-top:1px solid #eee}.business-security-cta .container{width:500px;max-width:90%}@media (min-width: 1012px){.business-security-cta{height:690px;padding-top:290px;padding-bottom:0;background-image:url("/images/modules/site/business-security-billboard-bg.svg");background-repeat:no-repeat;background-position:center 20px;background-size:1850px 675px;border-top:0}}@media (min-width: 768px){.illflow{height:600px;background-image:url("/images/modules/site/illflow_window_ui.png");background-repeat:no-repeat;background-position:top center;background-size:795px auto}}@media (min-width: 768px){.illflow-purple .selected{background-color:#f5f0ff}.illflow-purple .selected::after{border-color:transparent transparent #f5f0ff}.illflow-purple .illflow-item .illflow-item-heading{color:#6f42c1}}@media (min-width: 768px){.illflow-blue .selected{background-color:#f1f8ff}.illflow-blue .selected::after{border-color:transparent transparent #f1f8ff}.illflow-blue .illflow-item .illflow-item-heading{color:#0366d6}}@media (min-width: 768px){.illflow-no-bg{background-image:none}}.illflow-no-bg .illflow-item::before{background-image:none}@media (min-width: 768px){.illflow-steps{margin-top:24px;margin-right:-24px;margin-left:-24px}.illflow-steps::before{display:table;content:""}.illflow-steps::after{display:table;clear:both;content:""}}.illflow-step{display:none}@media (min-width: 768px){.illflow-step.active{display:block}}.illflow-item{position:relative;padding:0 10%;margin-bottom:40px;text-align:center}.illflow-item::before{position:absolute;top:10%;left:-6%;z-index:-1;display:block;padding-top:200%;padding-left:110%;content:"";background-image:url("/images/modules/site/illflow_window_ui.png");background-repeat:no-repeat;background-size:100% auto}@media (min-width: 768px){.illflow-item::before{display:none}}.illflow-item .illflow-item-heading{position:relative;color:#444d56}@media (min-width: 768px){.illflow-item{float:left;width:33.333333%;padding:24px;margin-bottom:0;cursor:pointer;border-radius:6px}.illflow-item:not(.selected):hover{background-color:#fafbfc}.illflow-item.selected .illflow-item-heading{color:#24292e}.illflow-item.selected::after{position:absolute;top:-30px;left:50%;display:block;width:0;height:0;margin-left:-15px;pointer-events:none;content:" ";border-style:outset solid solid;border-width:15px}.illflow-item.selected:first-child::after{left:75%}.illflow-item.selected:last-child::after{left:25%}}.illflow-item-description{margin-top:0}.illflow-img{display:block;width:400px;height:auto;margin:0 auto}@media (min-width: 768px){.illflow-bizsecurity{height:auto;background-image:url("/images/modules/site/business-security-illflow-bg.png");background-size:1000px auto}}.illflow-bizsecurity .img-responsive{max-width:400px}.illflow-bizsecurity .illflow-item::before{display:none}.IconNav{font-size:12px;transition:transform ease 0.4s}@media (min-width: 1012px){.IconNav{font-size:14px}}.IconNav-item{border-bottom:3px solid transparent}.IconNav-item .IconNav-img{max-height:60px;transition:transform ease-in-out 0.25s}.IconNav-item:hover .IconNav-img{transform:translateY(-10px)}.IconNav-item.selected{border-color:#444d56}.IconNav.is-stuck{transform:translateY(-70px)}.IconNav.is-stuck .IconNav-img{opacity:0;transition:opacity ease-in-out 0.4s,transform ease-in-out 0.25s}.IconNav.is-stuck:hover{transform:translateY(0)}.IconNav.is-stuck:hover .IconNav-img{opacity:1}.home-hero-signup .form-label{display:block;margin-bottom:5px;font-size:16px;font-weight:inherit;text-align:left}.home-hero-signup .form-control-lg{width:100%;min-height:46px;padding:10px;font-size:16px;border-radius:5px}.home-hero-signup .form-control-lg:-ms-input-placeholder{color:#24292e}.home-hero-signup .form-control-lg::-ms-input-placeholder{color:#24292e}.home-hero-signup .form-control-lg::placeholder{color:#24292e}.home-hero-signup .form-control-lg:focus{box-shadow:0 0 0 0.2em hsla(0,0%,100%,0.3)}.home-hero-signup .form-control-note{margin-top:5px;margin-bottom:0;font-size:12px;color:#6a737d}.home-hero-signup .form-control-note .notice-highlight{color:#959da5}.casestudy-hero{background-position:center;background-size:cover}.casestudy-square::after, +.casestudy-rectangle::after{display:block;content:"";transition:padding-bottom 0.3s}.casestudy-square::after{padding-bottom:100%}.casestudy-rectangle::after{padding-bottom:50%}.casestudy-hero-btn{position:absolute;top:16px;right:16px;z-index:2;opacity:0;transform:translate3d(-5px,5px,0) scale(0.95)}.casestudy-hero-btn, +.casestudy-header, +.casestudy-facts{transition:0.4s}.casestudy-controls{transition:transform 0.4s}.casestudy-link{flex:1;background-position:center;background-size:cover;transition:transform 0.3s,box-shadow 0.3s}.casestudy-link .casestudy-facts{opacity:0}.casestudy-link:hover{text-decoration:none}@media (min-width: 544px){.casestudy-link:hover .casestudy-controls{transform:scale(1.08)}}.casestudy-link:hover .casestudy-title{color:#1277eb!important}@media (min-width: 544px){.casestudy-link:hover .casestudy-header{opacity:0}}@media (min-width: 544px){.casestudy-link:hover .casestudy-hero-btn, + .casestudy-link:hover .casestudy-facts{opacity:1!important;transform:translate3d(0,0,0) scale(1)}}.is-expanded .casestudy-link:hover{transform:scale(1)}.col-12 .casestudy-link .casestudy-square::after{padding-bottom:25%}.col-12 .casestudy-link .casestudy-facts{display:none!important}.col-12 .casestudy-link .casestudy-header{opacity:1!important}.MarketingBody{font-size:16px}.MarketingBody > p{margin-bottom:24px;color:#586069}.MarketingBody h2, +.MarketingBody h3{margin-bottom:8px;font-family:InterUI,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Oxygen,Ubuntu,Cantarell,"Open Sans",sans-serif;font-weight:400}.MarketingBody blockquote{padding-top:0;padding-bottom:0;padding-left:8px;margin-bottom:24px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px;line-height:1.4;color:#586069;border-left:3px solid #e1e4e8;padding:0;font-size:20px!important;color:#1277eb;border:0}@media (min-width: 768px){.MarketingBody blockquote{padding-left:12px;margin-bottom:32px;margin-left:-15px;font-size:18px;line-height:1.5}}.MarketingBody ul, +.MarketingBody ol{padding-left:1.25em;margin-bottom:24px;overflow:hidden;color:#586069}.MarketingBody p + ul{margin-top:-8px}.MarketingBody .video-responsive{margin-right:16px;margin-bottom:16px;margin-left:16px}.MarketingBody-lead{font-family:InterUI,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Oxygen,Ubuntu,Cantarell,"Open Sans",sans-serif}.MarketingBody-lead > p:first-child{-webkit-font-smoothing:antialiased;font-size:21px;font-weight:300;color:#24292e!important}@media (min-width: 768px){.MarketingBody-lead > p:first-child{font-size:24px}}@media (min-width: 1012px){.MarketingBody-lead > p:first-child{font-size:26px}}.MarketingBody-lead a{color:#1277eb;text-decoration:none!important;box-shadow:0 1px 0 0 rgba(18,119,235,0.5);transition:0.2s}.MarketingBody-lead a:hover{color:#0366d6;box-shadow:0 1px 0 0 #1277eb}.Story{min-width:280px}@media (min-width: 1012px){.Story--large{min-width:330px;max-width:400px}}.Story--stagger:nth-child(even){margin-top:-16px}.Story--stagger:nth-child(odd){margin-bottom:-16px}.Story-link{transition:transform 0.3s}.Story-link:hover{text-decoration:none;transform:scale(1.025)}.Story-link:hover .Story-title{color:#e36209!important;text-decoration:underline}.Story-link--customer:hover .Story-title{color:#6f42c1!important}.Story-title{transition:color 0.3s}.summarylink .summarylink-illustration{display:none;transition:opacity 0.7s}@media (min-width: 544px){.summarylink .summarylink-illustration{top:-50%;display:block;opacity:0}}.summarylink:hover, .summarylink:active{text-decoration:none}.summarylink:hover .circle, .summarylink:active .circle{text-decoration:none;transform:scale(1.05)}@media (min-width: 544px){.summarylink:hover .summarylink-illustration, .summarylink:active .summarylink-illustration{top:24px;opacity:1}}@media (min-width: 544px){.summarylink:hover .summarylink-btn, .summarylink:active .summarylink-btn{border-color:#d1d5da;box-shadow:0 1px 15px rgba(27,31,35,0.15)}}.summarylink:hover .summarylink-btn .octicon, .summarylink:active .summarylink-btn .octicon{filter:grayscale(0%)}.summarylink-btn{border:solid 1px transparent;transition:box-shadow 0.3s,border-color 0.3s}@media (min-width: 544px){.summarylink-btn .octicon{filter:grayscale(100%);transition:filter 0.3s}}@media (min-width: 544px){.summarylink-illustration{position:absolute;top:0;right:40px;width:25%}}@media (min-width: 1012px){.summarylink-illustration{top:16px;right:auto;left:40%;width:15%}}@media (min-width: 768px){.communitystats{padding-left:50%}}.communitystats .summarylink:nth-child(1) .circle{width:225px;height:225px}.communitystats .summarylink:nth-child(2) .circle{left:20%;width:175px;height:175px}@media (min-width: 1012px){.communitystats .summarylink:nth-child(2) .circle{top:40px;left:25%}}.communitystats .summarylink:nth-child(3) .circle{left:10%;width:140px;height:140px}@media (min-width: 1012px){.communitystats .summarylink:nth-child(3) .circle{left:16%}}.communitystats .circle{transition:transform 0.3s}.communitystats .circle.bg-orange{background-color:#fb8532!important}@media (min-width: 768px){.communitystats .circle{position:absolute;left:0}}@media (min-width: 768px){.communitystats .summarylink-btn{max-width:400px}}.logo-img{position:relative;display:inline-block;width:auto;height:25px;margin:10px;vertical-align:middle}@media (min-width: 768px){.logo-img{width:auto;height:30px;margin:10px}}@media (min-width: 1012px){.logo-img{height:35px;margin:10px 20px}}.logo-img-sm{position:relative;display:inline-block;width:auto;height:20px;margin:10px;vertical-align:middle}@media (min-width: 768px){.logo-img-sm{width:auto;height:25px;margin:10px}}.logo-img-lg{width:auto;height:35px;margin:5px 15px}@media (min-width: 768px){.logo-img-lg{width:auto;height:40px;margin:10px 15px}}@media (min-width: 1012px){.logo-img-lg{height:50px;margin:10px 25px}}.tooltipped-logo{display:inline-block}.tooltipped-logo.tooltipped-s::after, .tooltipped-logo.tooltipped-se::after, .tooltipped-logo.tooltipped-sw::after{font-size:14px}.Slots{height:1.5em;margin-bottom:-0.15em}.Slots-item{height:2em;padding-top:5px}@keyframes RotateSlot{0%{margin-top:0}3%{margin-top:-2em}20%{margin-top:-2em}23%{margin-top:-4em}40%{margin-top:-4em}43%{margin-top:-6em}60%{margin-top:-6em}63%{margin-top:-8em}90%{margin-top:-8em}93%{margin-top:0}100%{margin-top:0}}.Slots-item:first-of-type{animation-name:RotateSlot;animation-duration:15s;animation-timing-function:ease-in;animation-delay:2.5s;animation-iteration-count:infinite}.apps-cluster .CircleBadge{margin:16px}@media (min-width: 1012px){.apps-cluster .CircleBadge{position:relative}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(odd){margin-top:-24px;animation-delay:1.5s;animation-direction:reverse}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(even){margin-top:24px;animation-duration:6s}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(1){animation-delay:2.1s}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(4){animation-delay:0.7s;animation-direction:reverse}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(6){animation-delay:0.3s}}.apps-cluster .CircleBadge.tooltipped:hover{box-shadow:0 3px 8px 0 rgba(0,0,0,0.2)}@keyframes appsClusterFloat{0%{top:0}40%{top:8px}100%{top:0}}.apps-quadrangle{position:relative;width:280px;height:280px}.apps-quadrangle .CircleBadge{position:absolute}.apps-quadrangle .CircleBadge::after{position:absolute;top:50%;left:0;z-index:-1;display:inline-block;height:3px;content:"";background-color:#e1e4e8;animation:2s ease-in-out infinite alternate forwards connect_four}.apps-quadrangle .CircleBadge:nth-child(1){top:0;left:0}.apps-quadrangle .CircleBadge:nth-child(2){top:0;right:0}.apps-quadrangle .CircleBadge:nth-child(2)::after{margin-top:32px;margin-left:-40px;transform:rotate(-45deg) scale(-1,1);transform-origin:96px 96px;animation-delay:0.7s}.apps-quadrangle .CircleBadge:nth-child(3){top:auto;bottom:0;left:0}.apps-quadrangle .CircleBadge:nth-child(3)::after{animation-delay:1.7s}.apps-quadrangle .CircleBadge:nth-child(4){top:auto;right:0;bottom:0}.apps-quadrangle .CircleBadge:nth-child(4)::after{content:none}@keyframes connect_four{from{width:0}to{width:280px}}.video-responsive{position:relative;max-width:100%;height:0;padding-bottom:56.25%}.video-responsive iframe, +.video-responsive object, +.video-responsive embed{position:absolute;top:0;left:0;width:100%;height:100%}.togglevideo .togglevideo-hidewhencollapsed{display:none}.togglevideo.is-expanded .togglevideo-hidewhenexpanded{display:none}.togglevideo.is-expanded .togglevideo-showwhenexpanded{display:block}@media (min-width: 768px){.togglevideo.is-expanded .togglevideo-hidewhenexpanded-md{display:none}}.DeveloperVideo-data{right:0;bottom:0;left:0;z-index:0;background:#24292e}@media (min-width: 768px){.DeveloperVideo-data{padding-top:30%;background:none;background-image:linear-gradient(transparent,rgba(27,31,35,0.95))}}.DeveloperVideoData-play{top:calc(50% - 40px);left:calc(50% - 40px);z-index:1}@media (min-width: 768px){.DeveloperVideoData-play{top:20%}}@media (min-width: 1012px){.DeveloperVideoData-play{top:calc(50% - 40px)}}.TenYearNav{top:calc(50% - 175px);z-index:10}.TenYearNav-digits{opacity:0}.TenYearNav-year{display:block;border-left:8px solid #d1d5da;transition:border 0.3s ease-in-out}.TenYearNav-year.blue{color:#2188ff!important;border-color:#2188ff}.TenYearNav-year.purple{color:#8a63d2!important;border-color:#8a63d2}.TenYearNav-year.yellow{color:#ffd33d!important;border-color:#ffd33d}.TenYearNav-year.green{color:#34d058!important;border-color:#34d058}.TenYearNav-year.red{color:#ea4a5a!important;border-color:#ea4a5a}.TenYearNav-year.orange{color:#fb8532!important;border-color:#fb8532}.TenYearNav-year.selected, .TenYearNav-year:hover{border-left-width:16px}.TenYearNav-year.selected .TenYearNav-digits, .TenYearNav-year:hover .TenYearNav-digits{background:#fff;opacity:1}.TenYears-hero{margin-top:-15%}@media (min-height: 720px){.TenYears-hero{margin-top:0}}.TenYears-year{font-size:60px;font-weight:500;line-height:0.9}@media (min-width: 768px){.TenYears-year{font-size:80px}}.btn-tenyear{border:2px solid #0366d6;box-shadow:6px 6px 0 0 #0366d6;transition:box-shadow 0.15s,margin 0.15s}.btn-tenyear:hover{box-shadow:0 0 0 0 #0366d6}.tentpole-purple{border:2px solid #6f42c1;box-shadow:10px 10px 0 0 #6f42c1}.tentpole-blue{border:2px solid #0366d6;box-shadow:10px 10px 0 0 #0366d6}.tentpole-green{border:2px solid #28a745;box-shadow:10px 10px 0 0 #28a745}.tentpole-yellow{border:2px solid #dbab09;box-shadow:10px 10px 0 0 #dbab09}.tentpole-date{top:-20px}.TenYearsImg-lowerleft{bottom:0;left:4%}@media (min-width: 1280px){.TenYearsImg-lowerleft{left:-5%}}.TenYearsImg-lowerright{right:4%;bottom:0}@media (min-width: 1280px){.TenYearsImg-lowerright{right:-10%}}.TenYearsImg-midright{top:10%;right:0}@media (min-width: 1012px){.TenYearsImg-midright{right:-6%}}.alt-mono-font{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace!important}.text-yellow-700{color:#dbab09}.text-yellow-800{color:#b08800}.bg-yellow-700{background-color:#dbab09}.text-orange-600{color:#e36209}@media (min-width: 768px){.mt-md-n10{margin-top:-96px!important}}@media (min-width: 1012px){.mt-lg-n10{margin-top:-96px!important}}.z-n1{z-index:-1}.rotated{transform:rotate(15deg)}@media (min-width: 768px){.px-md-8{padding-right:64px!important;padding-left:64px!important}}@media (min-width: 768px){.mt-md-n80{margin-top:-80px!important}}@media (min-width: 1012px){.mt-lg-n120{margin-top:-120px!important}}.DateNav .selected{color:#586069}.DateContent{display:none}.DateContent.active{display:block}@media (min-width: 544px){.callout-permalink-stacked{height:560px}}.callout-permalink-stacked-image{width:220px;max-width:272px;height:220px;max-height:272px}@media (min-width: 1012px){.callout-permalink-stacked-image{width:20vw;height:20vw}}.callout-permalink-stacked-image .icon-webcasts, +.callout-permalink-stacked-image .icon-whitepapers, +.callout-permalink-stacked-image .icon-videos, +.callout-permalink-stacked-image .icon-case-studies, +.callout-permalink-stacked-image .icon-events{bottom:0;left:0;display:none}@media (min-width: 1012px){.callout-permalink-stacked-image .dot, + .callout-permalink-stacked-image .rainbow, + .callout-permalink-stacked-image .rect, + .callout-permalink-stacked-image .square{transform:scale(0.9)}}.callout-permalink-stacked-image.webcasts{background-color:#f6f8fa;border-radius:50%}.callout-permalink-stacked-image.webcasts .icon-webcasts{display:block}.callout-permalink-stacked-image.webcasts .square{display:none}.callout-permalink-stacked-image.webcasts .rect{top:28%;right:32px}.callout-permalink-stacked-image.webcasts .rect-path{fill:#fdaeb7}.callout-permalink-stacked-image.webcasts .rainbow{top:42%;left:80px}@media (min-width: 1012px){.callout-permalink-stacked-image.webcasts .rainbow{display:none}}@media (min-width: 1280px){.callout-permalink-stacked-image.webcasts .rainbow{display:inline-block}}.callout-permalink-stacked-image.webcasts .dot{right:32px;bottom:8px}.callout-permalink-stacked-image.whitepapers{overflow:hidden}.callout-permalink-stacked-image.whitepapers::after{position:absolute;z-index:-1;content:"";border-color:transparent transparent #f6f8fa transparent;border-style:solid;border-width:0 0 272px 272px}.callout-permalink-stacked-image.whitepapers .icon-whitepapers{display:block}.callout-permalink-stacked-image.whitepapers .rainbow, +.callout-permalink-stacked-image.whitepapers .square{display:none}.callout-permalink-stacked-image.whitepapers .dot{top:42%;left:45%}.callout-permalink-stacked-image.whitepapers .dot .dot-circle-element{fill:#f66a0a}.callout-permalink-stacked-image.whitepapers .rect{right:7%;bottom:7%}@media (min-width: 1012px){.callout-permalink-stacked-image.whitepapers .rect{display:none}}@media (min-width: 1280px){.callout-permalink-stacked-image.whitepapers .rect{display:inline-block}}.callout-permalink-stacked-image.case-studies{background-color:#f6f8fa}.callout-permalink-stacked-image.case-studies .icon-case-studies{display:block}.callout-permalink-stacked-image.case-studies .square{display:none}.callout-permalink-stacked-image.case-studies .rect{top:27px;right:5%;transform:rotate(90deg)}.callout-permalink-stacked-image.case-studies .rect-path{fill:#28a745}.callout-permalink-stacked-image.case-studies .rainbow{top:30%;left:20%}@media (min-width: 1012px){.callout-permalink-stacked-image.case-studies .rainbow{display:none}}@media (min-width: 1280px){.callout-permalink-stacked-image.case-studies .rainbow{display:inline-block}}.callout-permalink-stacked-image.case-studies .dot{right:20%;bottom:16%}.callout-permalink-stacked-image.videos{width:65%;background-color:#f6f8fa}@media (min-width: 1012px){.callout-permalink-stacked-image.videos{width:75%}}.callout-permalink-stacked-image.videos .icon-videos{display:block}.callout-permalink-stacked-image.videos .rect{display:none}.callout-permalink-stacked-image.videos .rainbow{top:24%;left:82%}.callout-permalink-stacked-image.videos .rainbow-path{stroke:#ffdf5d}.callout-permalink-stacked-image.videos .square{right:-26%;bottom:14%}.callout-permalink-stacked-image.videos .dot{top:10%;left:14%}@media (min-width: 1012px){.callout-permalink-stacked-image.videos .dot{display:none}}@media (min-width: 1280px){.callout-permalink-stacked-image.videos .dot{display:inline-block}}.callout-permalink-stacked-image.events::before{position:absolute;left:31px;width:100%;max-width:220px;height:100%;max-height:272px;content:"";background-color:#f6f8fa;transform:skewX(-10deg)}.callout-permalink-stacked-image.events .icon-events{display:block}.callout-permalink-stacked-image.events .square, +.callout-permalink-stacked-image.events .rainbow{display:none}.callout-permalink-stacked-image.events .dot{top:20%;left:10%}.callout-permalink-stacked-image.events .dot .dot-circle-element{fill:#0366d6}.callout-permalink-stacked-image.events .rect{top:55%;right:0}@media (min-width: 1012px){.callout-permalink-big{margin-bottom:-220px}}.callout-permalink-big-figcaption{bottom:48px;background-color:#fff}@media (min-width: 768px){.callout-permalink-big-figcaption{left:-40px}}@media (min-width: 1012px){.callout-permalink-big-figcaption{bottom:240px}}@media (min-width: 1280px){.callout-permalink-big-figcaption{bottom:300px}}.callout-permalink-big-figcaption .icon-webcasts, +.callout-permalink-big-figcaption .icon-whitepapers, +.callout-permalink-big-figcaption .icon-videos, +.callout-permalink-big-figcaption .icon-case-studies, +.callout-permalink-big-figcaption .icon-events{display:none}.callout-permalink-big-figcaption .icon-videos, +.callout-permalink-big-figcaption .icon-events, +.callout-permalink-big-figcaption .icon-case-studies{top:-120px}.callout-permalink-big-figcaption .icon-webcasts, +.callout-permalink-big-figcaption .icon-whitepapers{top:-150px}.webcasts .callout-permalink-big-figcaption .icon-webcasts{display:block}.whitepapers .callout-permalink-big-figcaption .icon-whitepapers{display:block}.videos .callout-permalink-big-figcaption .icon-videos{display:block}.case-studies .callout-permalink-big-figcaption .icon-case-studies{display:block}.events .callout-permalink-big-figcaption .icon-events{display:block}.callout-permalink-big-image{position:relative;z-index:-2;height:270px}@media (min-width: 768px){.callout-permalink-big-image{height:45vw;max-height:560px}}.callout-permalink-big-image .square{display:none}.callout-permalink-big-image .dot{right:10%;bottom:40%}.callout-permalink-big-image .rect{top:20%;right:20%}.callout-permalink-big-image .rainbow{left:17%}.webcasts .callout-permalink-big-image{max-width:560px;min-height:calc(100vw - 48px);max-height:560px;background-color:#f6f8fa;border-radius:50%}@media (min-width: 768px){.webcasts .callout-permalink-big-image{min-height:auto}}.webcasts .callout-permalink-big-image .rect-path{fill:#fdaeb7}.webcasts .callout-permalink-big-image .rainbow{display:none}@media (min-width: 544px){.webcasts .callout-permalink-big-image .rainbow{top:4%;left:20%;display:inline}}.events .callout-permalink-big-image{max-width:272px}.events .callout-permalink-big-image::before{position:absolute;left:31px;width:100%;max-width:calc(100vw - 100px);height:100%;max-height:560px;content:"";background-color:#f6f8fa;transform:skewX(-10deg)}@media (min-width: 768px){.events .callout-permalink-big-image::before{left:-10%;width:44vw;max-width:360px}}.events .callout-permalink-big-image .rainbow{display:none}.events .callout-permalink-big-image .dot-circle-element{fill:#0366d6}.events .callout-permalink-big-image .dot{top:6%;right:-44%}@media (min-width: 1012px){.events .callout-permalink-big-image .rainbow{top:-6%;left:27%;display:inline}}.whitepapers .callout-permalink-big-image{overflow:hidden}.whitepapers .callout-permalink-big-image::after{position:absolute;z-index:-1;content:"";border-color:transparent transparent #f6f8fa transparent;border-style:solid;border-width:0 0 calc(100vw - 48px) calc(100vw - 48px)}@media (min-width: 768px){.whitepapers .callout-permalink-big-image::after{border-width:0 0 360px 360px}}@media (min-width: 1012px){.whitepapers .callout-permalink-big-image::after{border-width:0 0 560px 560px}}.whitepapers .callout-permalink-big-image .icon-whitepapers{display:block}.whitepapers .callout-permalink-big-image .rainbow{display:none}.whitepapers .callout-permalink-big-image .dot-circle-element{fill:#f66a0a}.videos .callout-permalink-big-image{width:75%;background-color:#f6f8fa}.videos .callout-permalink-big-image .icon-videos{display:block}.videos .callout-permalink-big-image .rect{display:none}.videos .callout-permalink-big-image .rainbow{top:-10%;left:60%;transform:scaleX(-1)}@media (min-width: 768px){.videos .callout-permalink-big-image .rainbow{top:10%}}.videos .callout-permalink-big-image .rainbow-path{stroke:#ffdf5d}.videos .callout-permalink-big-image .dot{right:-20%}.case-studies .callout-permalink-big-image{background-color:#f6f8fa}.case-studies .callout-permalink-big-image .icon-case-studies{display:block}.case-studies .callout-permalink-big-image .rainbow{display:none}@media (min-width: 1012px){.case-studies .callout-permalink-big-image .rainbow{top:10%;left:27%;display:inline}.case-studies .callout-permalink-big-image .dot{bottom:30%}}.case-studies .callout-permalink-big-image .rect{transform:rotate(90deg)}.case-studies .callout-permalink-big-image .rect-path{fill:#28a745}@keyframes hvr-bob{0%{transform:translateY(-8px)}50%{transform:translateY(-4px)}100%{transform:translateY(-8px)}}@keyframes hvr-bob-float{100%{transform:translateY(-8px)}}.callout-permalink-stacked-link .callout-permalink-stacked-image, +.callout-permalink-stacked-link .callout-permalink-big-image, +.callout-permalink-big-link .callout-permalink-stacked-image, +.callout-permalink-big-link .callout-permalink-big-image{transition:0.3s;transform:translateY(0)}.callout-permalink-stacked-link .icon, +.callout-permalink-big-link .icon{transition:0.3s;transform:translateY(0)}.callout-permalink-stacked-link .dot, +.callout-permalink-stacked-link .square, +.callout-permalink-stacked-link .rect, +.callout-permalink-stacked-link .rainbow, +.callout-permalink-big-link .dot, +.callout-permalink-big-link .square, +.callout-permalink-big-link .rect, +.callout-permalink-big-link .rainbow{transform:perspective(1px) translateZ(0)}.callout-permalink-stacked-link:hover .callout-permalink-stacked-image, +.callout-permalink-stacked-link:hover .callout-permalink-big-image, +.callout-permalink-big-link:hover .callout-permalink-stacked-image, +.callout-permalink-big-link:hover .callout-permalink-big-image{transition:0.3s;transform:translateY(-8px)}.callout-permalink-stacked-link:hover .callout-permalink-stacked-image .icon, +.callout-permalink-stacked-link:hover .callout-permalink-big-image .icon, +.callout-permalink-big-link:hover .callout-permalink-stacked-image .icon, +.callout-permalink-big-link:hover .callout-permalink-big-image .icon{transform:scale(1.1)}.callout-permalink-stacked-link:hover .callout-permalink-stacked-image .dot, +.callout-permalink-stacked-link:hover .callout-permalink-stacked-image .square, +.callout-permalink-stacked-link:hover .callout-permalink-stacked-image .rect, +.callout-permalink-stacked-link:hover .callout-permalink-stacked-image .rainbow, +.callout-permalink-stacked-link:hover .callout-permalink-big-image .dot, +.callout-permalink-stacked-link:hover .callout-permalink-big-image .square, +.callout-permalink-stacked-link:hover .callout-permalink-big-image .rect, +.callout-permalink-stacked-link:hover .callout-permalink-big-image .rainbow, +.callout-permalink-big-link:hover .callout-permalink-stacked-image .dot, +.callout-permalink-big-link:hover .callout-permalink-stacked-image .square, +.callout-permalink-big-link:hover .callout-permalink-stacked-image .rect, +.callout-permalink-big-link:hover .callout-permalink-stacked-image .rainbow, +.callout-permalink-big-link:hover .callout-permalink-big-image .dot, +.callout-permalink-big-link:hover .callout-permalink-big-image .square, +.callout-permalink-big-link:hover .callout-permalink-big-image .rect, +.callout-permalink-big-link:hover .callout-permalink-big-image .rainbow{animation-name:hvr-bob-float,hvr-bob;animation-duration:0.3s,1.5s;animation-fill-mode:forwards;animation-timing-function:ease-out,ease-in-out;animation-delay:0s,0.3s;animation-iteration-count:1,infinite;animation-direction:normal,alternate}@font-face{font-family:oswald-medium;font-style:normal;font-weight:500;src:local("oswald-medium"),local("oswald-medium"),url(data:font/ttf;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("truetype")}@font-face{font-family:Track;src:url(data:font/eot;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=);src:url(data:font/eot?#iefix;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("embedded-opentype"),url(data:font/woff2;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff2"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff"),url(data:font/ttf;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("truetype");font-style:normal;font-weight:400}@font-face{font-family:Titillium;src:url(data:font/eot;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=);src:url(data:font/eot?#iefix;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("embedded-opentype"),url(data:font/woff2;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff2"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff"),url(data:font/ttf;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("truetype");font-style:normal;font-weight:400}.btf-display-text{font-family:oswald-medium,sans-serif}.name-md-title{word-wrap:normal}@media (min-width: 768px){.name-md-title{font-size:40px}}.track-2{letter-spacing:2px}.lh-tall{line-height:1.7}.btf-gradient-purple{background-image:linear-gradient(to right,#9f67a8,#5174b6)}.btf-gradient-blue{background-image:linear-gradient(to right,#5174b6,#0b98ad)}.btf-gradient-teal{background-image:linear-gradient(to right,#0b98ad,#14b098)}.btf-gradient-green{background-image:linear-gradient(to right,#14b098,#6cb980)}@media (min-width: 768px){.p-md-7{padding:48px!important}}@media (min-width: 1012px){.p-lg-8{min-width:410px;padding:64px!important}}@media (min-width: 1012px){.mt-lg-n175{margin-top:-175px!important}}@media (min-width: 768px){.mt-md-n12{margin-top:-128px!important}}.mt-auto{margin-top:auto}@media (min-width: 768px){.left-md-475{left:475px!important}}.bottom-600-lg300{bottom:600px!important}@media (min-width: 1012px){.bottom-600-lg300{bottom:300px!important}}.btf-border{border-top:1px solid #2f363d}.btf-container{max-width:1400px}.z-2{z-index:2}.btf-play{top:calc(50% - 80px);left:calc(50% - 66px)}.signup-prompt{border:1px solid rgba(27,31,35,0.075)}@media (min-width: 768px){.signup-prompt{background:url("/images/modules/site/site-signup-prompt.png");background-position:center 10%;background-size:cover}}@media (min-width: 1012px){.signup-prompt{background-position:center 30%;background-size:100% auto}}.signup-prompt-bg{background-image:linear-gradient(180deg,hsla(0,0%,100%,0) 50%,#fff),linear-gradient(70deg,#eaf5ff 32%,#f6fff8)}@media (min-width: 1012px){.enterprise-prompt{background:url("/images/modules/site/patterns/dots-large.svg");background-position:center 10%}}@media (min-width: 768px){.banner-half{max-width:506px}}.server-stats .container{width:auto;max-width:1012px;padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto}@media (min-width: 544px){.server-stats .container{padding-right:40px;padding-left:40px}}@media (min-width: 1012px){.server-stats .container{padding-right:16px;padding-left:16px}}.icon-cta{padding-left:24px}.icon-cta > .octicon{float:left;width:16px;margin-top:0.1em;margin-left:-24px;color:#6a737d;text-align:center} +/*# sourceMappingURL=site-0be82e42e6ce84ef34fecbf8469a45aa.css.map */ + </style> + <style> + /* Page tweaks */ + .preview-page { + margin-top: 64px; + } + /* User-content tweaks */ + .timeline-comment-wrapper > .timeline-comment:after, + .timeline-comment-wrapper > .timeline-comment:before { + content: none; + } + /* User-content overrides */ + .discussion-timeline.wide { + width: 920px; + } + </style> +</head> +<body> + <div class="page"> + <div id="preview-page" class="preview-page" data-autorefresh-url=""> + + + + <div role="main" class="main-content"> + <div class="container new-discussion-timeline experiment-repo-nav"> + <div class="repository-content"> + <div id="readme" class="readme boxed-group clearfix announce instapaper_body md"> + + <h3> + <span class="octicon octicon-book"></span> + README.md + </h3> + + <article class="markdown-body entry-content" itemprop="text" id="grip-content"> + <h1> +<a id="user-content-naughtyattributes" class="anchor" href="#naughtyattributes" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>NaughtyAttributes</h1> +<p><a href="https://unity3d.com/get-unity/download" rel="nofollow"><img src="https://camo.githubusercontent.com/9e52c753ed2ea53a57c23d9daa3e09261135077b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f756e6974792d323031382e332532422d626c75652e737667" alt="Unity 2018.3+" data-canonical-src="https://img.shields.io/badge/unity-2018.3%2B-blue.svg" style="max-width:100%;"></a> +<a href="https://openupm.com/packages/com.dbrizov.naughtyattributes/" rel="nofollow"><img src="https://camo.githubusercontent.com/6c7d9a4d17a39962a7d14409953367813104e9dc/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f636f6d2e646272697a6f762e6e617567687479617474726962757465733f6c6162656c3d6f70656e75706d2672656769737472795f7572693d68747470733a2f2f7061636b6167652e6f70656e75706d2e636f6d" alt="openupm" data-canonical-src="https://img.shields.io/npm/v/com.dbrizov.naughtyattributes?label=openupm&registry_uri=https://package.openupm.com" style="max-width:100%;"></a> +<a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/a2753323735099059bdc88b724534a1a6bd134ee/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d627269676874677265656e2e737667" alt="License: MIT" data-canonical-src="https://img.shields.io/badge/License-MIT-brightgreen.svg" style="max-width:100%;"></a></p> +<p>NaughtyAttributes is an extension for the Unity Inspector.</p> +<p>It expands the range of attributes that Unity provides so that you can create powerful inspectors without the need of custom editors or property drawers. It also provides attributes that can be applied to non-serialized fields or functions.</p> +<p>Most of the attributes are implemented using Unity's <code>CustomPropertyDrawer</code>, so they will work in your custom editors. If you want all of the attributes to work in your custom editors, however, you must inherit from <code>NaughtyInspector</code> and use the <code>NaughtyEditorGUI.PropertyField_Layout</code> function instead of <code>EditorGUILayout.PropertyField</code>.</p> +<h2> +<a id="user-content-system-requirements" class="anchor" href="#system-requirements" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>System Requirements</h2> +<p>Unity 2018.3.0 or later versions. Feel free to try older version. Don't forget to include the NaughtyAttributes namespace.</p> +<h2> +<a id="user-content-installation" class="anchor" href="#installation" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Installation</h2> +<ol> +<li>The package is available on the <a href="https://openupm.com" rel="nofollow">openupm registry</a>. You can install it via <a href="https://github.com/openupm/openupm-cli">openupm-cli</a>.</li> +</ol> +<pre><code>openupm add com.dbrizov.naughtyattributes +</code></pre> +<ol start="2"> +<li>You can also install via git url by adding this entry in your <strong>manifest.json</strong> +</li> +</ol> +<pre><code>"com.dbrizov.naughtyattributes": "https://github.com/dbrizov/NaughtyAttributes.git#upm" +</code></pre> +<ol start="3"> +<li>You can also download it from the <a href="https://assetstore.unity.com/packages/tools/utilities/naughtyattributes-129996" rel="nofollow">Asset Store</a> +</li> +</ol> +<h2> +<a id="user-content-documentation" class="anchor" href="#documentation" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Documentation</h2> +<ul> +<li><a href="https://dbrizov.github.io/na-docs/" rel="nofollow">Documentation</a></li> +<li><a href="https://github.com/dbrizov/na-docs">Documentation Repo</a></li> +</ul> +<h2> +<a id="user-content-support" class="anchor" href="#support" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Support</h2> +<p>NaughtyAttributes is an open-source project that I am developing in my free time. If you like it you can support me by donating.</p> +<ul> +<li><a href="https://paypal.me/dbrizov" rel="nofollow">PayPal</a></li> +<li><a href="https://www.buymeacoffee.com/dbrizov" rel="nofollow">Buy Me A Coffee</a></li> +</ul> +<h1> +<a id="user-content-overview" class="anchor" href="#overview" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Overview</h1> +<h2> +<a id="user-content-drawer-attributes" class="anchor" href="#drawer-attributes" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Drawer Attributes</h2> +<p>Provide special draw options to serialized fields. +A field can have only one DrawerAttribute. If a field has more than one, only the bottom one will be used.</p> +<h3> +<a id="user-content-animatorparam" class="anchor" href="#animatorparam" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>AnimatorParam</h3> +<p>Select an Animator paramater via dropdown interface.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + <span class="pl-k">public</span> <span class="pl-en">Animator</span> <span class="pl-smi">someAnimator</span>; + + [<span class="pl-en">AnimatorParam</span>(<span class="pl-s"><span class="pl-pds">"</span>someAnimator<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">paramHash</span>; + + [<span class="pl-en">AnimatorParam</span>(<span class="pl-s"><span class="pl-pds">"</span>someAnimator<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-smi">paramName</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/AnimatorParam_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/AnimatorParam_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-button" class="anchor" href="#button" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Button</h3> +<p>A method can be marked as a button. A button appears in the inspector and executes the method if clicked. +Works both with instance and static methods.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Button</span>] + <span class="pl-k">private</span> <span class="pl-k">void</span> <span class="pl-en">MethodOne</span>() { } + + [<span class="pl-en">Button</span>(<span class="pl-s"><span class="pl-pds">"</span>Button Text<span class="pl-pds">"</span></span>)] + <span class="pl-k">private</span> <span class="pl-k">void</span> <span class="pl-en">MethodTwo</span>() { } +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Button_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Button_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-curverange" class="anchor" href="#curverange" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>CurveRange</h3> +<p>Set bounds and modify curve color for AnimationCurves</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">CurveRange</span>(<span class="pl-k">-</span><span class="pl-c1">1</span>, <span class="pl-k">-</span><span class="pl-c1">1</span>, <span class="pl-c1">1</span>, <span class="pl-c1">1</span>)] + <span class="pl-k">public</span> <span class="pl-en">AnimationCurve</span> <span class="pl-smi">curve</span>; + + [<span class="pl-en">CurveRange</span>(<span class="pl-smi">EColor</span>.<span class="pl-smi">Orange</span>)] + <span class="pl-k">public</span> <span class="pl-en">AnimationCurve</span> <span class="pl-smi">curve1</span>; + + [<span class="pl-en">CurveRange</span>(<span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">5</span>, <span class="pl-c1">5</span>, <span class="pl-smi">EColor</span>.<span class="pl-smi">Red</span>)] + <span class="pl-k">public</span> <span class="pl-en">AnimationCurve</span> <span class="pl-smi">curve2</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/CurveRange_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/CurveRange_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-dropdown" class="anchor" href="#dropdown" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Dropdown</h3> +<p>Provides an interface for dropdown value selection.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Dropdown</span>(<span class="pl-s"><span class="pl-pds">"</span>intValues<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">intValue</span>; + + [<span class="pl-en">Dropdown</span>(<span class="pl-s"><span class="pl-pds">"</span>StringValues<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-smi">stringValue</span>; + + [<span class="pl-en">Dropdown</span>(<span class="pl-s"><span class="pl-pds">"</span>GetVectorValues<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-en">Vector3</span> <span class="pl-smi">vectorValue</span>; + + <span class="pl-k">private</span> <span class="pl-k">int</span>[] <span class="pl-smi">intValues</span> <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-k">int</span>[] { <span class="pl-c1">1</span>, <span class="pl-c1">2</span>, <span class="pl-c1">3</span>, <span class="pl-c1">4</span>, <span class="pl-c1">5</span> }; + + <span class="pl-k">private</span> <span class="pl-en">List</span><<span class="pl-k">string</span>> <span class="pl-smi">StringValues</span> { <span class="pl-k">get</span> { <span class="pl-k">return</span> <span class="pl-k">new</span> <span class="pl-en">List</span><<span class="pl-k">string</span>>() { <span class="pl-s"><span class="pl-pds">"</span>A<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>B<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>C<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>D<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>E<span class="pl-pds">"</span></span> }; } } + + <span class="pl-k">private</span> <span class="pl-en">DropdownList</span><<span class="pl-en">Vector3</span>> <span class="pl-en">GetVectorValues</span>() + { + <span class="pl-k">return</span> <span class="pl-k">new</span> <span class="pl-en">DropdownList</span><<span class="pl-en">Vector3</span>>() + { + { <span class="pl-s"><span class="pl-pds">"</span>Right<span class="pl-pds">"</span></span>, <span class="pl-smi">Vector3</span>.<span class="pl-smi">right</span> }, + { <span class="pl-s"><span class="pl-pds">"</span>Left<span class="pl-pds">"</span></span>, <span class="pl-smi">Vector3</span>.<span class="pl-smi">left</span> }, + { <span class="pl-s"><span class="pl-pds">"</span>Up<span class="pl-pds">"</span></span>, <span class="pl-smi">Vector3</span>.<span class="pl-smi">up</span> }, + { <span class="pl-s"><span class="pl-pds">"</span>Down<span class="pl-pds">"</span></span>, <span class="pl-smi">Vector3</span>.<span class="pl-smi">down</span> }, + { <span class="pl-s"><span class="pl-pds">"</span>Forward<span class="pl-pds">"</span></span>, <span class="pl-smi">Vector3</span>.<span class="pl-smi">forward</span> }, + { <span class="pl-s"><span class="pl-pds">"</span>Back<span class="pl-pds">"</span></span>, <span class="pl-smi">Vector3</span>.<span class="pl-smi">back</span> } + }; + } +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Dropdown_Inspector.gif" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Dropdown_Inspector.gif" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-enumflags" class="anchor" href="#enumflags" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>EnumFlags</h3> +<p>Provides dropdown interface for setting enum flags.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">enum</span> <span class="pl-en">Direction</span> +{ + <span class="pl-en">None</span> <span class="pl-k">=</span> <span class="pl-c1">0</span>, + <span class="pl-en">Right</span> <span class="pl-k">=</span> <span class="pl-c1">1</span> <span class="pl-k"><<</span> <span class="pl-c1">0</span>, + <span class="pl-en">Left</span> <span class="pl-k">=</span> <span class="pl-c1">1</span> <span class="pl-k"><<</span> <span class="pl-c1">1</span>, + <span class="pl-en">Up</span> <span class="pl-k">=</span> <span class="pl-c1">1</span> <span class="pl-k"><<</span> <span class="pl-c1">2</span>, + <span class="pl-en">Down</span> <span class="pl-k">=</span> <span class="pl-c1">1</span> <span class="pl-k"><<</span> <span class="pl-c1">3</span> +} + +<span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">EnumFlags</span>] + <span class="pl-k">public</span> <span class="pl-en">Direction</span> <span class="pl-smi">flags</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/EnumFlags_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/EnumFlags_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-expandable" class="anchor" href="#expandable" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Expandable</h3> +<p>Make scriptable objects expandable.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Expandable</span>] + <span class="pl-k">public</span> <span class="pl-en">ScriptableObject</span> <span class="pl-smi">scriptableObject</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Expandable_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Expandable_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-horizontalline" class="anchor" href="#horizontalline" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>HorizontalLine</h3> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">HorizontalLine</span>(<span class="pl-smi">color</span>: <span class="pl-smi">EColor</span>.<span class="pl-smi">Red</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">red</span>; + + [<span class="pl-en">HorizontalLine</span>(<span class="pl-smi">color</span>: <span class="pl-smi">EColor</span>.<span class="pl-smi">Green</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">green</span>; + + [<span class="pl-en">HorizontalLine</span>(<span class="pl-smi">color</span>: <span class="pl-smi">EColor</span>.<span class="pl-smi">Blue</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">blue</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/HorizontalLine_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/HorizontalLine_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-infobox" class="anchor" href="#infobox" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>InfoBox</h3> +<p>Used for providing additional information.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">InfoBox</span>(<span class="pl-s"><span class="pl-pds">"</span>This is my int<span class="pl-pds">"</span></span>, <span class="pl-smi">EInfoBoxType</span>.<span class="pl-smi">Normal</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">myInt</span>; + + [<span class="pl-en">InfoBox</span>(<span class="pl-s"><span class="pl-pds">"</span>This is my float<span class="pl-pds">"</span></span>, <span class="pl-smi">EInfoBoxType</span>.<span class="pl-smi">Warning</span>)] + <span class="pl-k">public</span> <span class="pl-k">float</span> <span class="pl-smi">myFloat</span>; + + [<span class="pl-en">InfoBox</span>(<span class="pl-s"><span class="pl-pds">"</span>This is my vector<span class="pl-pds">"</span></span>, <span class="pl-smi">EInfoBoxType</span>.<span class="pl-smi">Error</span>)] + <span class="pl-k">public</span> <span class="pl-en">Vector3</span> <span class="pl-smi">myVector</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/InfoBox_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/InfoBox_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-inputaxis" class="anchor" href="#inputaxis" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>InputAxis</h3> +<p>Select an input axis via dropdown interface.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">InputAxis</span>] + <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-smi">inputAxis</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/InputAxis_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/InputAxis_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-minmaxslider" class="anchor" href="#minmaxslider" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>MinMaxSlider</h3> +<p>A double slider. The <strong>min value</strong> is saved to the <strong>X</strong> property, and the <strong>max value</strong> is saved to the <strong>Y</strong> property of a <strong>Vector2</strong> field.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">MinMaxSlider</span>(<span class="pl-c1">0.0f</span>, <span class="pl-c1">100.0f</span>)] + <span class="pl-k">public</span> <span class="pl-en">Vector2</span> <span class="pl-smi">minMaxSlider</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/MinMaxSlider_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/MinMaxSlider_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-progressbar" class="anchor" href="#progressbar" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ProgressBar</h3> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">ProgressBar</span>(<span class="pl-s"><span class="pl-pds">"</span>Health<span class="pl-pds">"</span></span>, <span class="pl-c1">300</span>, <span class="pl-smi">EColor</span>.<span class="pl-smi">Red</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">health</span> <span class="pl-k">=</span> <span class="pl-c1">250</span>; + + [<span class="pl-en">ProgressBar</span>(<span class="pl-s"><span class="pl-pds">"</span>Mana<span class="pl-pds">"</span></span>, <span class="pl-c1">100</span>, <span class="pl-smi">EColor</span>.<span class="pl-smi">Blue</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">mana</span> <span class="pl-k">=</span> <span class="pl-c1">25</span>; + + [<span class="pl-en">ProgressBar</span>(<span class="pl-s"><span class="pl-pds">"</span>Stamina<span class="pl-pds">"</span></span>, <span class="pl-c1">200</span>, <span class="pl-smi">EColor</span>.<span class="pl-smi">Green</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">stamina</span> <span class="pl-k">=</span> <span class="pl-c1">150</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ProgressBar_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ProgressBar_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-reorderablelist" class="anchor" href="#reorderablelist" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ReorderableList</h3> +<p>Provides array type fields with an interface for easy reordering of elements.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">ReorderableList</span>] + <span class="pl-k">public</span> <span class="pl-k">int</span>[] <span class="pl-smi">intArray</span>; + + [<span class="pl-en">ReorderableList</span>] + <span class="pl-k">public</span> <span class="pl-en">List</span><<span class="pl-k">float</span>> <span class="pl-smi">floatArray</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ReorderableList_Inspector.gif" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ReorderableList_Inspector.gif" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-readonly" class="anchor" href="#readonly" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ReadOnly</h3> +<p>Makes a field read only.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">ReadOnly</span>] + <span class="pl-k">public</span> <span class="pl-en">Vector3</span> <span class="pl-smi">forwardVector</span> <span class="pl-k">=</span> <span class="pl-smi">Vector3</span>.<span class="pl-smi">forward</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ReadOnly_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ReadOnly_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-resizabletextarea" class="anchor" href="#resizabletextarea" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ResizableTextArea</h3> +<p>A resizable text area where you can see the whole text. +Unlike Unity's <strong>Multiline</strong> and <strong>TextArea</strong> attributes where you can see only 3 rows of a given text, and in order to see it or modify it you have to manually scroll down to the desired row.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">ResizableTextArea</span>] + <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-smi">resizableTextArea</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ResizableTextArea_Inspector.gif" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ResizableTextArea_Inspector.gif" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-scene" class="anchor" href="#scene" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Scene</h3> +<p>Select a scene from the build settings via dropdown interface.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Scene</span>] + <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-smi">bootScene</span>; <span class="pl-c"><span class="pl-c">//</span> scene name</span> + + [<span class="pl-en">Scene</span>] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">tutorialScene</span>; <span class="pl-c"><span class="pl-c">//</span> scene index</span> +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Scene_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Scene_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-showassetpreview" class="anchor" href="#showassetpreview" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ShowAssetPreview</h3> +<p>Shows the texture preview of a given asset (Sprite, Prefab...).</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">ShowAssetPreview</span>] + <span class="pl-k">public</span> <span class="pl-en">Sprite</span> <span class="pl-smi">sprite</span>; + + [<span class="pl-en">ShowAssetPreview</span>(<span class="pl-c1">128</span>, <span class="pl-c1">128</span>)] + <span class="pl-k">public</span> <span class="pl-en">GameObject</span> <span class="pl-smi">prefab</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ShowAssetPreview_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ShowAssetPreview_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-shownativeproperty" class="anchor" href="#shownativeproperty" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ShowNativeProperty</h3> +<p>Shows native C# properties in the inspector. +All native properties are displayed at the bottom of the inspector after the non-serialized fields and before the method buttons. +It supports only certain types <strong>(bool, int, long, float, double, string, Vector2, Vector3, Vector4, Color, Bounds, Rect, UnityEngine.Object)</strong>.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + <span class="pl-k">public</span> <span class="pl-en">List</span><<span class="pl-en">Transform</span>> <span class="pl-smi">transforms</span>; + + [<span class="pl-en">ShowNativeProperty</span>] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">TransformsCount</span> <span class="pl-k">=></span> <span class="pl-smi">transforms</span>.<span class="pl-smi">Count</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ShowNativeProperty_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ShowNativeProperty_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-shownonserializedfield" class="anchor" href="#shownonserializedfield" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ShowNonSerializedField</h3> +<p>Shows non-serialized fields in the inspector. +All non-serialized fields are displayed at the bottom of the inspector before the method buttons. +Keep in mind that if you change a non-static non-serialized field in the code - the value in the inspector will be updated after you press <strong>Play</strong> in the editor. +There is no such issue with static non-serialized fields because their values are updated at compile time. +It supports only certain types <strong>(bool, int, long, float, double, string, Vector2, Vector3, Vector4, Color, Bounds, Rect, UnityEngine.Object)</strong>.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">ShowNonSerializedField</span>] + <span class="pl-k">private</span> <span class="pl-k">int</span> <span class="pl-smi">myInt</span> <span class="pl-k">=</span> <span class="pl-c1">10</span>; + + [<span class="pl-en">ShowNonSerializedField</span>] + <span class="pl-k">private</span> <span class="pl-k">const</span> <span class="pl-k">float</span> <span class="pl-smi">PI</span> <span class="pl-k">=</span> <span class="pl-c1">3.14159f</span>; + + [<span class="pl-en">ShowNonSerializedField</span>] + <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">readonly</span> <span class="pl-en">Vector3</span> <span class="pl-smi">CONST_VECTOR</span> <span class="pl-k">=</span> <span class="pl-smi">Vector3</span>.<span class="pl-smi">one</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ShowNonSerializedField_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ShowNonSerializedField_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-tag" class="anchor" href="#tag" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Tag</h3> +<p>Select a tag via dropdown interface.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Tag</span>] + <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-smi">tagField</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Tag_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Tag_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h2> +<a id="user-content-meta-attributes" class="anchor" href="#meta-attributes" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Meta Attributes</h2> +<p>Give the fields meta data. A field can have more than one meta attributes.</p> +<h3> +<a id="user-content-boxgroup" class="anchor" href="#boxgroup" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>BoxGroup</h3> +<p>Surrounds grouped fields with a box.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">BoxGroup</span>(<span class="pl-s"><span class="pl-pds">"</span>Integers<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">firstInt</span>; + [<span class="pl-en">BoxGroup</span>(<span class="pl-s"><span class="pl-pds">"</span>Integers<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">secondInt</span>; + + [<span class="pl-en">BoxGroup</span>(<span class="pl-s"><span class="pl-pds">"</span>Floats<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">float</span> <span class="pl-smi">firstFloat</span>; + [<span class="pl-en">BoxGroup</span>(<span class="pl-s"><span class="pl-pds">"</span>Floats<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">float</span> <span class="pl-smi">secondFloat</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/BoxGroup_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/BoxGroup_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-foldout" class="anchor" href="#foldout" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Foldout</h3> +<p>Makes a foldout group.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Foldout</span>(<span class="pl-s"><span class="pl-pds">"</span>Integers<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">firstInt</span>; + [<span class="pl-en">Foldout</span>(<span class="pl-s"><span class="pl-pds">"</span>Integers<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">secondInt</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Foldout_Inspector.gif" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Foldout_Inspector.gif" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-enableif--disableif" class="anchor" href="#enableif--disableif" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>EnableIf / DisableIf</h3> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">enableMyInt</span>; + + [<span class="pl-en">EnableIf</span>(<span class="pl-s"><span class="pl-pds">"</span>enableMyInt<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">myInt</span>; + + [<span class="pl-en">EnableIf</span>(<span class="pl-s"><span class="pl-pds">"</span>Enabled<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">float</span> <span class="pl-smi">myFloat</span>; + + [<span class="pl-en">EnableIf</span>(<span class="pl-s"><span class="pl-pds">"</span>NotEnabled<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-en">Vector3</span> <span class="pl-smi">myVector</span>; + + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-en">Enabled</span>() { <span class="pl-k">return</span> <span class="pl-c1">true</span>; } + + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">NotEnabled</span> <span class="pl-k">=></span> <span class="pl-c1">false</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/EnableIf_Inspector.gif" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/EnableIf_Inspector.gif" alt="inspector" style="max-width:100%;"></a></p> +<p>You can have more than one condition.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">flag0</span>; + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">flag1</span>; + + [<span class="pl-en">EnableIf</span>(<span class="pl-smi">EConditionOperator</span>.<span class="pl-smi">And</span>, <span class="pl-s"><span class="pl-pds">"</span>flag0<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>flag1<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">enabledIfAll</span>; + + [<span class="pl-en">EnableIf</span>(<span class="pl-smi">EConditionOperator</span>.<span class="pl-smi">Or</span>, <span class="pl-s"><span class="pl-pds">"</span>flag0<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>flag1<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">enabledIfAny</span>; +}</pre></div> +<h3> +<a id="user-content-showif--hideif" class="anchor" href="#showif--hideif" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ShowIf / HideIf</h3> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">showInt</span>; + + [<span class="pl-en">ShowIf</span>(<span class="pl-s"><span class="pl-pds">"</span>showInt<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">myInt</span>; + + [<span class="pl-en">ShowIf</span>(<span class="pl-s"><span class="pl-pds">"</span>AlwaysShow<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">float</span> <span class="pl-smi">myFloat</span>; + + [<span class="pl-en">ShowIf</span>(<span class="pl-s"><span class="pl-pds">"</span>NeverShow<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-en">Vector3</span> <span class="pl-smi">myVector</span>; + + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-en">AlwaysShow</span>() { <span class="pl-k">return</span> <span class="pl-c1">true</span>; } + + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">NeverShow</span> <span class="pl-k">=></span> <span class="pl-c1">false</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ShowIf_Inspector.gif" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ShowIf_Inspector.gif" alt="inspector" style="max-width:100%;"></a></p> +<p>You can have more than one condition.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">flag0</span>; + <span class="pl-k">public</span> <span class="pl-k">bool</span> <span class="pl-smi">flag1</span>; + + [<span class="pl-en">ShowIf</span>(<span class="pl-smi">EConditionOperator</span>.<span class="pl-smi">And</span>, <span class="pl-s"><span class="pl-pds">"</span>flag0<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>flag1<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">showIfAll</span>; + + [<span class="pl-en">ShowIf</span>(<span class="pl-smi">EConditionOperator</span>.<span class="pl-smi">Or</span>, <span class="pl-s"><span class="pl-pds">"</span>flag0<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>flag1<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">showIfAny</span>; +}</pre></div> +<h3> +<a id="user-content-label" class="anchor" href="#label" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Label</h3> +<p>Override default field label.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Label</span>(<span class="pl-s"><span class="pl-pds">"</span>Short Name<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-smi">veryVeryLongName</span>; + + [<span class="pl-en">Label</span>(<span class="pl-s"><span class="pl-pds">"</span>RGB<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-en">Vector3</span> <span class="pl-smi">vectorXYZ</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Label_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Label_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-onvaluechanged" class="anchor" href="#onvaluechanged" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>OnValueChanged</h3> +<p>Detects a value change and executes a callback. +Keep in mind that the event is detected only when the value is changed from the inspector. +If you want a runtime event, you should probably use an event/delegate and subscribe to it.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">OnValueChanged</span>(<span class="pl-s"><span class="pl-pds">"</span>OnValueChangedCallback<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">myInt</span>; + + <span class="pl-k">private</span> <span class="pl-k">void</span> <span class="pl-en">OnValueChangedCallback</span>() + { + <span class="pl-smi">Debug</span>.<span class="pl-en">Log</span>(<span class="pl-smi">myInt</span>); + } +}</pre></div> +<h2> +<a id="user-content-validator-attributes" class="anchor" href="#validator-attributes" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Validator Attributes</h2> +<p>Used for validating the fields. A field can have infinite number of validator attributes.</p> +<h3> +<a id="user-content-minvalue--maxvalue" class="anchor" href="#minvalue--maxvalue" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>MinValue / MaxValue</h3> +<p>Clamps integer and float fields.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">MinValue</span>(<span class="pl-c1">0</span>), <span class="pl-en">MaxValue</span>(<span class="pl-c1">10</span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">myInt</span>; + + [<span class="pl-en">MinValue</span>(<span class="pl-c1">0.0f</span>)] + <span class="pl-k">public</span> <span class="pl-k">float</span> <span class="pl-smi">myFloat</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/MinValueMaxValue_Inspector.gif" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/MinValueMaxValue_Inspector.gif" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-required" class="anchor" href="#required" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Required</h3> +<p>Used to remind the developer that a given reference type field is required.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">Required</span>] + <span class="pl-k">public</span> <span class="pl-en">Transform</span> <span class="pl-smi">myTransform</span>; + + [<span class="pl-en">Required</span>(<span class="pl-s"><span class="pl-pds">"</span>Custom required text<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-en">GameObject</span> <span class="pl-smi">myGameObject</span>; +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/Required_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/Required_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> +<h3> +<a id="user-content-validateinput" class="anchor" href="#validateinput" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>ValidateInput</h3> +<p>The most powerful ValidatorAttribute.</p> +<div class="highlight highlight-source-cs"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">_NaughtyComponent</span> : <span class="pl-en">MonoBehaviour</span> +{ + [<span class="pl-en">ValidateInput</span>(<span class="pl-s"><span class="pl-pds">"</span>IsNotNull<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-en">Transform</span> <span class="pl-smi">myTransform</span>; + + [<span class="pl-en">ValidateInput</span>(<span class="pl-s"><span class="pl-pds">"</span>IsGreaterThanZero<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>myInteger must be greater than zero<span class="pl-pds">"</span></span>)] + <span class="pl-k">public</span> <span class="pl-k">int</span> <span class="pl-smi">myInt</span>; + + <span class="pl-k">private</span> <span class="pl-k">bool</span> <span class="pl-en">IsNotNull</span>(<span class="pl-en">Transform</span> <span class="pl-smi">tr</span>) + { + <span class="pl-k">return</span> <span class="pl-smi">tr</span> <span class="pl-k">!=</span> <span class="pl-c1">null</span>; + } + + <span class="pl-k">private</span> <span class="pl-k">bool</span> <span class="pl-en">IsGreaterThanZero</span>(<span class="pl-k">int</span> <span class="pl-smi">value</span>) + { + <span class="pl-k">return</span> <span class="pl-smi">value</span> <span class="pl-k">></span> <span class="pl-c1">0</span>; + } +}</pre></div> +<p><a href="https://github.com/dbrizov/NaughtyAttributes/blob/master/Assets/NaughtyAttributes/Documentation~/ValidateInput_Inspector.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/dbrizov/NaughtyAttributes/raw/master/Assets/NaughtyAttributes/Documentation~/ValidateInput_Inspector.png" alt="inspector" style="max-width:100%;"></a></p> + + </article> + </div> + </div> + </div> + </div> + + + + </div> + <div> </div> + </div><script> + function showCanonicalImages() { + var images = document.getElementsByTagName('img'); + if (!images) { + return; + } + for (var index = 0; index < images.length; index++) { + var image = images[index]; + if (image.getAttribute('data-canonical-src') && image.src !== image.getAttribute('data-canonical-src')) { + image.src = image.getAttribute('data-canonical-src'); + } + } + } + + function scrollToHash() { + if (location.hash && !document.querySelector(':target')) { + var element = document.getElementById('user-content-' + location.hash.slice(1)); + if (element) { + element.scrollIntoView(); + } + } + } + + function autorefreshContent(eventSourceUrl) { + var initialTitle = document.title; + var contentElement = document.getElementById('grip-content'); + var source = new EventSource(eventSourceUrl); + var isRendering = false; + + source.onmessage = function(ev) { + var msg = JSON.parse(ev.data); + if (msg.updating) { + isRendering = true; + document.title = '(Rendering) ' + document.title; + } else { + isRendering = false; + document.title = initialTitle; + contentElement.innerHTML = msg.content; + showCanonicalImages(); + } + } + + source.onerror = function(e) { + if (e.readyState === EventSource.CLOSED && isRendering) { + isRendering = false; + document.title = initialTitle; + } + } + } + + window.onhashchange = function() { + scrollToHash(); + } + + window.onload = function() { + scrollToHash(); + } + + showCanonicalImages(); + + var autorefreshUrl = document.getElementById('preview-page').getAttribute('data-autorefresh-url'); + if (autorefreshUrl) { + autorefreshContent(autorefreshUrl); + } + </script> +</body> +</html> \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/README.html.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/README.html.meta new file mode 100644 index 0000000..42c42d4 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/README.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f1c5c604e6d27cc4d86e81f45c704e11 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples.meta new file mode 100644 index 0000000..db0978e --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b1e9ff0668650a54da2c458e80a90032 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene.meta new file mode 100644 index 0000000..91002d8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: afb4c815411c28b449e61fbaa1a8bfa3 +folderAsset: yes +timeCreated: 1507995550 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity new file mode 100644 index 0000000..3c13413 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity @@ -0,0 +1,2415 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657874, g: 0.49641258, b: 0.5748172, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 4890085278179872738, guid: 98ee975b74776234986f4d35f14c4ccc, + type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &106181862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 106181863} + m_Layer: 0 + m_Name: ===== Drawer Attributes ===== + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &106181863 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106181862} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &114650323 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 114650324} + - component: {fileID: 114650325} + - component: {fileID: 114650326} + m_Layer: 0 + m_Name: EnableIf_DisableIf + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &114650324 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114650323} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 24 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114650325 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114650323} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bed506d8be3a10f45bec4bf2237bec87, type: 3} + m_Name: + m_EditorClassIdentifier: + enable1: 0 + enable2: 0 + enum1: 0 + enum2: 0 + enableIfAll: + enableIfAny: + enableIfEnum: + enableIfEnumFlag: + enableIfEnumFlagMulti: + nest1: + enable1: 1 + enable2: 0 + enum1: 0 + enum2: 0 + enableIfAll: 1 + enableIfAny: 2 + enableIfEnum: 0 + enableIfEnumFlag: 0 + enableIfEnumFlagMulti: 0 + nest2: + enable1: 1 + enable2: 1 + enum1: 0 + enum2: 0 + enableIfAll: {x: 0.25, y: 0.75} + enableIfAny: {x: 0.25, y: 0.75} + enableIfEnum: {x: 0.25, y: 0.75} + enableIfEnumFlag: {x: 0, y: 0} + enableIfEnumFlagMulti: {x: 0, y: 0} +--- !u!114 &114650326 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114650323} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0e48a088cb96287448c3be58932bfcb7, type: 3} + m_Name: + m_EditorClassIdentifier: + disable1: 0 + disable2: 0 + enum1: 0 + enum2: 0 + disableIfAll: + disableIfAny: + disableIfEnum: + disableIfEnumFlag: + disableIfEnumFlagMulti: + nest1: + disable1: 1 + disable2: 0 + enum1: 0 + enum2: 0 + disableIfAll: 1 + disableIfAny: 2 + disableIfEnum: 3 + disableIfEnumFlag: 0 + disableIfEnumFlagMulti: 0 + nest2: + disable1: 1 + disable2: 1 + enum1: 0 + enum2: 0 + enableIfAll: {x: 0.25, y: 0.75} + enableIfAny: {x: 0.25, y: 0.75} + enableIfEnum: {x: 0.25, y: 0.75} + disableIfEnumFlag: {x: 0, y: 0} + disableIfEnumFlagMulti: {x: 0, y: 0} +--- !u!1 &155697335 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 155697336} + - component: {fileID: 155697337} + m_Layer: 0 + m_Name: InputAxis + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &155697336 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155697335} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &155697337 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155697335} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e0cc8a31c22090847b75538c0ed2d2fc, type: 3} + m_Name: + m_EditorClassIdentifier: + inputAxis0: + nest1: + inputAxis1: Horizontal + nest2: + inputAxis2: Vertical +--- !u!1 &237121640 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 237121641} + - component: {fileID: 237121642} + m_Layer: 0 + m_Name: ReadOnly + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &237121641 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237121640} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 28 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &237121642 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237121640} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5443d37a05e188846bda9b05b067184e, type: 3} + m_Name: + m_EditorClassIdentifier: + readOnlyInt: 5 + nest1: + readOnlyFloat: 3.14 + nest2: + readOnlyString: +--- !u!1 &369789276 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 369789277} + - component: {fileID: 369789278} + m_Layer: 0 + m_Name: Required + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &369789277 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 369789276} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 31 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &369789278 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 369789276} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9c8c10b2234650d42b2a8efad6b413db, type: 3} + m_Name: + m_EditorClassIdentifier: + trans0: {fileID: 0} + nest1: + trans1: {fileID: 0} + nest2: + trans2: {fileID: 0} +--- !u!1 &572382748 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 572382749} + - component: {fileID: 572382751} + m_Layer: 0 + m_Name: Foldout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &572382749 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 572382748} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 23 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &572382751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 572382748} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3b437215d92efa74ea85ff726ca0dd09, type: 3} + m_Name: + m_EditorClassIdentifier: + int0: 0 + int1: 0 + float0: 0 + float1: 0 + slider0: {x: 0.25, y: 0.75} + slider1: {x: 0.25, y: 0.75} + str0: + str1: + trans0: {fileID: 0} + trans1: {fileID: 0} +--- !u!1 &607441873 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 607441874} + - component: {fileID: 607441875} + m_Layer: 0 + m_Name: MinMaxSlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &607441874 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 607441873} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &607441875 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 607441873} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fd67fbde6acdd6a44944f12e507067c5, type: 3} + m_Name: + m_EditorClassIdentifier: + minMaxSlider0: {x: 0, y: 0.5} + nest1: + minMaxSlider1: {x: 0.25, y: 0.75} + nest2: + minMaxSlider2: {x: 6, y: 11} +--- !u!1 &706445688 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 706445689} + - component: {fileID: 706445690} + m_Layer: 0 + m_Name: NaughtyComponent + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &706445689 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 706445688} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &706445690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 706445688} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9c928ea15ae74a44089beb2e534c1a35, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &732714203 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 732714204} + m_Layer: 0 + m_Name: ===== Meta Attributes ===== + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &732714204 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 732714203} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 21 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &779670086 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 779670087} + - component: {fileID: 779670088} + m_Layer: 0 + m_Name: Dropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &779670087 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779670086} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &779670088 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779670086} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3855e37cd6b01194e8166573c7c4b37d, type: 3} + m_Name: + m_EditorClassIdentifier: + intValue: 1 + nest1: + stringValue: A + nest2: + vectorValue: {x: 1, y: 0, z: 0} +--- !u!1 &892661554 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 892661555} + - component: {fileID: 892661556} + m_Layer: 0 + m_Name: Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &892661555 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892661554} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &892661556 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892661554} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 281a85803caf74a459439020a0840fa4, type: 3} + m_Name: + m_EditorClassIdentifier: + scene0: DemoScene + nest1: + scene1: DemoScene + nest2: + scene2: 0 +--- !u!1 &933563384 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 933563385} + - component: {fileID: 933563386} + m_Layer: 0 + m_Name: ShowAssetPreview + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &933563385 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 933563384} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 16 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &933563386 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 933563384} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 705c14aa9ecaa274289972381f471367, type: 3} + m_Name: + m_EditorClassIdentifier: + sprite0: {fileID: 21300000, guid: 005888ede18a58e4db8d069cfa3007cb, type: 3} + prefab0: {fileID: 1981131855061102, guid: 7ec354ef3daae7641b7a3fa5e1fe0c81, type: 3} + nest1: + sprite1: {fileID: 21300000, guid: 005888ede18a58e4db8d069cfa3007cb, type: 3} + prefab1: {fileID: 1981131855061102, guid: 7ec354ef3daae7641b7a3fa5e1fe0c81, type: 3} + nest2: + sprite2: {fileID: 21300000, guid: 005888ede18a58e4db8d069cfa3007cb, type: 3} + prefab2: {fileID: 1981131855061102, guid: 7ec354ef3daae7641b7a3fa5e1fe0c81, + type: 3} +--- !u!1 &948946033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 948946034} + - component: {fileID: 948946035} + m_Layer: 0 + m_Name: ProgressBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &948946034 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948946033} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &948946035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948946033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 96ca4c27fc649764b9d1625f1740cb9e, type: 3} + m_Name: + m_EditorClassIdentifier: + health: 50 + nest1: + mana: 25 + nest2: + stamina: 75 + elixir: 50 + maxElixir: 100 +--- !u!1 &993534225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 993534226} + - component: {fileID: 993534227} + m_Layer: 0 + m_Name: Layer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &993534226 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993534225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &993534227 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993534225} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 460459d6ac76acd4d872f94cf444e6fa, type: 3} + m_Name: + m_EditorClassIdentifier: + layerNumber0: 5 + layerName0: UI + nest1: + layerNumber1: 0 + layerName1: Default + nest2: + layerNumber2: 4 + layerName2: Water +--- !u!1 &1139446979 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1139446980} + - component: {fileID: 1139446981} + m_Layer: 0 + m_Name: HorizontalLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1139446980 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139446979} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1139446981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139446979} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5cc6d3f8d4a53374887b3d620a6972e3, type: 3} + m_Name: + m_EditorClassIdentifier: + line0: 0 + nest1: + line1: 0 + nest2: + line2: 0 +--- !u!1 &1148579783 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1148579784} + m_Layer: 0 + m_Name: Tests + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1148579784 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1148579783} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 106181863} + - {fileID: 1178133860} + - {fileID: 2043059161} + - {fileID: 2082563173} + - {fileID: 779670087} + - {fileID: 2015414598} + - {fileID: 1622801696} + - {fileID: 1139446980} + - {fileID: 1552114400} + - {fileID: 155697336} + - {fileID: 993534226} + - {fileID: 607441874} + - {fileID: 948946034} + - {fileID: 1747151588} + - {fileID: 1202167595} + - {fileID: 892661555} + - {fileID: 933563385} + - {fileID: 1989156459} + - {fileID: 1194502638} + - {fileID: 1609261820} + - {fileID: 1380469385} + - {fileID: 732714204} + - {fileID: 1784643785} + - {fileID: 572382749} + - {fileID: 114650324} + - {fileID: 1524906391} + - {fileID: 1293624596} + - {fileID: 1871127830} + - {fileID: 237121641} + - {fileID: 1641427334} + - {fileID: 1706612702} + - {fileID: 369789277} + - {fileID: 1463483878} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1178133859 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1178133860} + - component: {fileID: 1178133862} + - component: {fileID: 1178133861} + m_Layer: 0 + m_Name: AnimatorParam + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1178133860 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1178133859} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1178133861 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1178133859} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9bff20ccdde00fc49a62bad6a4ef9982, type: 3} + m_Name: + m_EditorClassIdentifier: + animator0: {fileID: 1178133862} + hash0: 1943738498 + name0: Float0 + nest1: + animator1: {fileID: 1178133862} + hash1: 726565755 + name1: Float0 + nest2: + animator2: {fileID: 1178133862} + hash1: -392453409 + name1: Trigger0 +--- !u!95 &1178133862 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1178133859} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 63ee86efd213bf34285c95f33e79dc6c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!1 &1194502637 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1194502638} + - component: {fileID: 1194502639} + m_Layer: 0 + m_Name: ShowNonSerializedField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1194502638 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1194502637} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 18 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1194502639 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1194502637} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 913d67a695253f744bdc776625b9b948, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1202167594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1202167595} + - component: {fileID: 1202167596} + m_Layer: 0 + m_Name: ResizableTextArea + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1202167595 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1202167594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1202167596 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1202167594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fb4f4bb2e3e063340a24f4bb24528bb5, type: 3} + m_Name: + m_EditorClassIdentifier: + text0: '1 + + 2 + + 3' + nest1: + text1: '1 + + 2 + + 3 + + 4 + + 5' + nest2: + text2: '1 + + 2 + + 3 + + 4 + + 5 + + 6 + + 7' +--- !u!1 &1293624595 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1293624596} + - component: {fileID: 1293624597} + m_Layer: 0 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1293624596 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1293624595} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 26 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1293624597 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1293624595} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7488af014527ebf42af5c4fc4d5f4f5b, type: 3} + m_Name: + m_EditorClassIdentifier: + int0: 0 + nest1: + int1: 0 + nest2: + vector2: {x: 0.25, y: 0.75} +--- !u!1 &1380469384 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1380469385} + - component: {fileID: 1380469386} + m_Layer: 0 + m_Name: Tag + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1380469385 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380469384} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 20 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1380469386 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380469384} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8bcc0d5613b48fb43bd36c9d37e99900, type: 3} + m_Name: + m_EditorClassIdentifier: + tag0: + nest1: + tag1: MainCamera + nest2: + tag2: Player +--- !u!1 &1444377589 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1444377591} + - component: {fileID: 1444377590} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1444377590 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1444377589} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1444377591 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1444377589} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1463483877 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1463483878} + - component: {fileID: 1463483879} + m_Layer: 0 + m_Name: ValidateInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1463483878 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1463483877} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 32 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1463483879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1463483877} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 94adafcfe59aa344c9b5596b2cc6ecd0, type: 3} + m_Name: + m_EditorClassIdentifier: + int0: 0 + nest1: + int1: 0 + nest2: + int2: 0 + inheritedNest: + int1: 0 + nest2: + int2: 0 +--- !u!1 &1524906390 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1524906391} + - component: {fileID: 1524906392} + - component: {fileID: 1524906393} + m_Layer: 0 + m_Name: ShowIf_HideIf + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1524906391 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1524906390} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 25 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1524906392 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1524906390} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4fdbfcfbf5b056a4bac491fe21569572, type: 3} + m_Name: + m_EditorClassIdentifier: + show1: 0 + show2: 0 + enum1: 0 + enum2: 0 + showIfAll: + showIfAny: + showIfEnum: + showIfEnumFlag: + showIfEnumFlagMulti: + nest1: + show1: 1 + show2: 0 + enum1: 0 + enum2: 0 + showIfAll: 0 + showIfAny: 0 + showIfEnum: 0 + showIfEnumFlag: 0 + showIfEnumFlagMulti: 0 + nest2: + show1: 1 + show2: 1 + enum1: 0 + enum2: 0 + showIfAll: {x: 0.25, y: 0.75} + showIfAny: {x: 0.25, y: 0.75} + showIfEnum: {x: 0.25, y: 0.75} + showIfEnumFlag: {x: 0, y: 0} + showIfEnumFlagMulti: {x: 0, y: 0} +--- !u!114 &1524906393 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1524906390} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3cf166cb519e666419bb79b0c50c5ee1, type: 3} + m_Name: + m_EditorClassIdentifier: + hide1: 0 + hide2: 0 + enum1: 0 + enum2: 0 + hideIfAll: + hideIfAny: + hideIfEnum: + hideIfEnumFlag: + hideIfEnumFlagMulti: + nest1: + hide1: 1 + hide2: 0 + enum1: 0 + enum2: 0 + hideIfAll: 0 + hideIfAny: 0 + hideIfEnum: 0 + hideIfEnumFlag: 0 + hideIfEnumFlagMulti: 0 + nest2: + hide1: 1 + hide2: 1 + enum1: 0 + enum2: 0 + hideIfAll: {x: 0.25, y: 0.75} + hideIfAny: {x: 0.25, y: 0.75} + hideIfEnum: {x: 0.25, y: 0.75} + hideIfEnumFlag: {x: 0, y: 0} + hideIfEnumFlagMulti: {x: 0, y: 0} +--- !u!1 &1552114399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1552114400} + - component: {fileID: 1552114401} + m_Layer: 0 + m_Name: InfoBox + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1552114400 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1552114399} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1552114401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1552114399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0dcb08e489c17644e9eacaa1ec5fe781, type: 3} + m_Name: + m_EditorClassIdentifier: + normal: 0 + nest1: + warning: 0 + nest2: + error: 0 +--- !u!1 &1591883662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1591883666} + - component: {fileID: 1591883665} + - component: {fileID: 1591883664} + - component: {fileID: 1591883663} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1591883663 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_Enabled: 1 +--- !u!124 &1591883664 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_Enabled: 1 +--- !u!20 &1591883665 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1591883666 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1591883662} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1609261819 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1609261820} + - component: {fileID: 1609261821} + m_Layer: 0 + m_Name: 'SortingLayer ' + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1609261820 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1609261819} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 19 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1609261821 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1609261819} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8ed73e666d447964d93c4840f05423dc, type: 3} + m_Name: + m_EditorClassIdentifier: + layerNumber0: 0 + layerName0: Default + nest1: + layerNumber1: 0 + layerName1: Default + nest2: + layerNumber2: 0 + layerName2: Default +--- !u!1 &1622801695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1622801696} + - component: {fileID: 1622801697} + m_Layer: 0 + m_Name: Expandable + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1622801696 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622801695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1622801697 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622801695} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 64c4c9aee2b494d44be9bb0b7f12ed7c, type: 3} + m_Name: + m_EditorClassIdentifier: + precedingField: 5 + obj0: {fileID: 11400000, guid: 9cf80899b80517945a2d2390fb48877f, type: 2} + nest1: + obj1: {fileID: 11400000, guid: 9cf80899b80517945a2d2390fb48877f, type: 2} + nest2: + obj2: {fileID: 11400000, guid: 9cf80899b80517945a2d2390fb48877f, type: 2} +--- !u!1 &1641427333 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1641427334} + m_Layer: 0 + m_Name: ===== Validator Attributes ===== + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1641427334 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1641427333} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 29 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1706612701 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1706612702} + - component: {fileID: 1706612703} + m_Layer: 0 + m_Name: MinValue_MaxValue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1706612702 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706612701} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 30 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1706612703 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706612701} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 450a05787c54e6b4fa88ffe223bcee87, type: 3} + m_Name: + m_EditorClassIdentifier: + min0Int: 0 + max0Int: 0 + range01Float: 0 + range01Vector2: {x: 0, y: 0} + range01Vector3: {x: 0, y: 0, z: 0} + range01Vector4: {x: 0, y: 0, z: 0, w: 0} + min0Vector2Int: {x: 0, y: 0} + max100Vector2Int: {x: 0, y: 0} + min0Vector3Int: {x: 0, y: 0, z: 0} + max100Vector3Int: {x: 0, y: 0, z: 0} + nest1: + min0Int: 0 + max0Int: 0 + range01Float: 0 + range01Vector2: {x: 0, y: 0} + range01Vector3: {x: 0, y: 0, z: 0} + range01Vector4: {x: 0, y: 0, z: 0, w: 0} + min0Vector2Int: {x: 0, y: 0} + max100Vector2Int: {x: 0, y: 0} + min0Vector3Int: {x: 0, y: 0, z: 0} + max100Vector3Int: {x: 0, y: 0, z: 0} + nest2: + min0Int: 0 + max0Int: 0 + range01Float: 0 + range01Vector2: {x: 0, y: 0} + range01Vector3: {x: 0, y: 0, z: 0} + range01Vector4: {x: 0, y: 0, z: 0, w: 0} + min0Vector2Int: {x: 0, y: 0} + max100Vector2Int: {x: 0, y: 0} + min0Vector3Int: {x: 0, y: 0, z: 0} + max100Vector3Int: {x: 0, y: 0, z: 0} +--- !u!1 &1747151587 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1747151588} + - component: {fileID: 1747151589} + m_Layer: 0 + m_Name: ReorderableList + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1747151588 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1747151587} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1747151589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1747151587} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c93fde7cd79390148ac576c3a159a77b, type: 3} + m_Name: + m_EditorClassIdentifier: + intArray: 020000000300000001000000 + vectorList: + - {x: 2, y: 2, z: 2} + - {x: 3, y: 3, z: 3} + - {x: 1, y: 1, z: 1} + structList: + - Int: 2 + Float: 2 + Vector: {x: 2, y: 2, z: 2} + - Int: 3 + Float: 3 + Vector: {x: 3, y: 3, z: 3} + - Int: 1 + Float: 1 + Vector: {x: 1, y: 1, z: 1} + gameObjectsList: [] + transformsList: [] + monoBehavioursList: [] +--- !u!1 &1784643784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1784643785} + - component: {fileID: 1784643786} + m_Layer: 0 + m_Name: BoxGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1784643785 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1784643784} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 22 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1784643786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1784643784} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3920f5ea384951b4990e4d9e8032d12e, type: 3} + m_Name: + m_EditorClassIdentifier: + int0: 0 + int1: 0 + float0: 0 + float1: 0 + slider0: {x: 0.25, y: 0.75} + slider1: {x: 0.25, y: 0.75} + str0: + str1: + trans0: {fileID: 0} + trans1: {fileID: 0} +--- !u!1 &1871127829 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1871127830} + - component: {fileID: 1871127831} + m_Layer: 0 + m_Name: OnValueChanged + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1871127830 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1871127829} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 27 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1871127831 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1871127829} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ff1df679e5b32f64bb106752c63933fa, type: 3} + m_Name: + m_EditorClassIdentifier: + int0: 0 + nest1: + int1: 0 + nest2: + int2: 0 +--- !u!1 &1989156458 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1989156459} + - component: {fileID: 1989156460} + m_Layer: 0 + m_Name: ShowNativeProperty + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1989156459 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1989156458} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 17 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1989156460 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1989156458} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b5a73795d25dd334e90a5a347c6079d9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &2015414597 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2015414598} + - component: {fileID: 2015414599} + m_Layer: 0 + m_Name: EnumFlags + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2015414598 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2015414597} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2015414599 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2015414597} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b7f6b84ce0d7674d8a386fde729279c, type: 3} + m_Name: + m_EditorClassIdentifier: + flags0: 0 + nest1: + flags1: 6 + nest2: + flags2: -1 +--- !u!1 &2043059160 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2043059161} + - component: {fileID: 2043059162} + m_Layer: 0 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2043059161 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043059160} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2043059162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043059160} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b592f12a9f69ac3408f6f870762232c7, type: 3} + m_Name: + m_EditorClassIdentifier: + myInt: 0 +--- !u!1 &2082563172 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2082563173} + - component: {fileID: 2082563174} + m_Layer: 0 + m_Name: CurveRange + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2082563173 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082563172} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1148579784} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2082563174 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082563172} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6587b100d001e7e46b9aaae7f1180b40, type: 3} + m_Name: + m_EditorClassIdentifier: + curves: + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -1 + value: -1 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve1: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve2: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 10 + value: 10 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + nest1: + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + nest2: + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 5 + value: 5 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity.meta new file mode 100644 index 0000000..819f1ec --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoScene.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 07845a5477be2b149a6f1cb32b5a3a5b +timeCreated: 1507998788 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting new file mode 100644 index 0000000..a88ae38 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!850595691 &4890085278179872738 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: DemoSceneSettings + serializedVersion: 2 + m_GIWorkflowMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 0 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_TextureCompression: 1 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRRussianRouletteStartBounce: 2 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting.meta new file mode 100644 index 0000000..3af7b5e --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/DemoSceneSettings.lighting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 98ee975b74776234986f4d35f14c4ccc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets.meta new file mode 100644 index 0000000..931e8f8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 53a462744f22ca549927c5e6ea797362 +folderAsset: yes +timeCreated: 1509089305 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab new file mode 100644 index 0000000..64055f6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1981131855061102 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4344736110947706} + - component: {fileID: 33062901823624450} + - component: {fileID: 65233182844289960} + - component: {fileID: 23099360439063292} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4344736110947706 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33062901823624450 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!65 &65233182844289960 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &23099360439063292 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981131855061102} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab.meta new file mode 100644 index 0000000..f493507 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/Cube.prefab.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7ec354ef3daae7641b7a3fa5e1fe0c81 +timeCreated: 1509089337 +licenseType: Free +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim new file mode 100644 index 0000000..9536161 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim @@ -0,0 +1,169 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: DummyAnimation + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 1 + value: {x: 0, y: 0, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: + classID: 4 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: + classID: 4 + script: {fileID: 0} + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 1 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim.meta new file mode 100644 index 0000000..d66e3b6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimation.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 31fbd6c92d19aaa48910857627a54a25 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller new file mode 100644 index 0000000..bb64cae --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller @@ -0,0 +1,120 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-1567792821050049497 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: DummyAnimation + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 31fbd6c92d19aaa48910857627a54a25, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: DummyAnimatorController + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: Float0 + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Float1 + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Int0 + m_Type: 3 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Int1 + m_Type: 3 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Bool0 + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Bool1 + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Trigger0 + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Trigger1 + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 945276690032550857} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1107 &945276690032550857 +AnimatorStateMachine: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -1567792821050049497} + m_Position: {x: 390, y: 80, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -1567792821050049497} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller.meta new file mode 100644 index 0000000..2ce8a9c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/DummyAnimatorController.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63ee86efd213bf34285c95f33e79dc6c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset new file mode 100644 index 0000000..353dc47 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset @@ -0,0 +1,17 @@ +%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: 753bdb918c6038142acddbd7aae6958f, type: 3} + m_Name: NaughtyScriptableObject + m_EditorClassIdentifier: + listA: + - {fileID: 11400000, guid: 149474eb879a6a641b560ca17d48712f, type: 2} + - {fileID: 11400000, guid: 149474eb879a6a641b560ca17d48712f, type: 2} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset.meta new file mode 100644 index 0000000..dbcb741 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/NaughtyScriptableObject.asset.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9cf80899b80517945a2d2390fb48877f +timeCreated: 1518639643 +licenseType: Free +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset new file mode 100644 index 0000000..3907d95 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset @@ -0,0 +1,17 @@ +%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: 19472ac11eae27a4b804f354ca7d9c00, type: 3} + m_Name: TestScriptableObjectA + m_EditorClassIdentifier: + listB: + - {fileID: 11400000, guid: 05371aa7630d3ef44ac0106af06cd73c, type: 2} + - {fileID: 11400000, guid: 05371aa7630d3ef44ac0106af06cd73c, type: 2} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset.meta new file mode 100644 index 0000000..3143872 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectA.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 149474eb879a6a641b560ca17d48712f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset new file mode 100644 index 0000000..79f5b60 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset @@ -0,0 +1,15 @@ +%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: c2b396aeebc9d984da298eee313896bc, type: 3} + m_Name: TestScriptableObjectB + m_EditorClassIdentifier: + slider: {x: 3, y: 7} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset.meta new file mode 100644 index 0000000..7645ee1 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/TestScriptableObjectB.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 05371aa7630d3ef44ac0106af06cd73c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/icon-github.png b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/icon-github.png new file mode 100644 index 0000000000000000000000000000000000000000..228b09acd4249ed0fa5d53891e819ae1be108358 GIT binary patch literal 29968 zcmYg%1yodB)b<^^8$l6iDQW4H5TsLDIz&of$N@$|DFG=#hL8qn1f)Z{C58?G2}ip7 zyYqhQTmR2mEOh3cd-gqdpJzY&+51FlYbp~HJRkr7fcS-qqAmbnfd9k*@NmFC$G(%7 z;2$hc`4{?l;13MXHUj)VzPpOCCjbyqqJJU47X&Q;Faj?WpXvJ|{w?|;%%I74cW2`D z{$(X2<L~0JDH2{W%FFo^l1E07WUmlNl(Uey3Q7FU4(fgDrI@C($u5zbOG;yQpQfwh zEjG>M%apvPP}WcJUOpmBVQlm&h9^tVk-a!p`99=gEh4}zV{=U)4*!ME)SznPZt>_M z-bh2`n*Ps*lP@YmANKndQwgVL^PbX$&5~u5Dc0bB(Us@Hp9;|-eD+b$3162dihv9Q z4|j+{E*|i7-#_S8vPE>*z+(x$9<B(ykL7k$$6xz!W5Q3=DFXy_Je7-Y(I$ddeon%n zNScwXJSmU)L%4yE6sRU~FGmc!I9AZ<Nekn-mvCe~&nx6|=gKC0;Uz<R1R27-t*(m2 z=@5fM$Z&u~!m(WVKmC0Ap_$@5Nx=qo@0_;aA&IF5k3X1jPo<XuJ${5@G*2n?F!etx z6hC`GNA*4C-7GTjJypnu@XAm;N&K0w?Ihv5>P5RV%RZO9D;o%Cp66TiU~Ju%=99?* zc;?r30v##LJZ_-W(mexes`wG|!-9$K#cLK$w;_Bt+PR>!T%^@V_d8NxL}Nbr*<lR5 zL-oFp!ATmHlwQOL&ym&<8*3a!vyOo%dF3aznIBoFOPfuUi1bGc07CMe@yD`3{nyF- zP>%1RU%4UWRl6QqY~p~a(rX@}Mf|>uv@&VavTq1NA@J&elK1aRsD`(JeP=e4ZaG|d zVrk6+5#A}mwmDHF<`W<Lkl&A-m!w=X{+Jn^11ke_*U8+8EI)<6C7;LxG^_16Z3AM1 z)V;J=(u@t1QIhf5O@gM4xTU#>npI3Vw~!&u_8-Z4;cS}tEkfWgklWcfkft5sjB!v_ z;_=2?=TOtjThl~Y+>lEK_%V|nxN)KO*fWujb&L?px16DLGxj-SDA8@LyxTDTqR9C2 zNj5amvwIyA9?haDT#L|pV20EA2gtOdUuRbFO5}IN{8gq<yg+Z%7St)x-ynYoY485I zY9L(vrC;rtFFt-7S&Sd@1+R=E>(BNbxqX}R;`6qf^j+VD#{LG_1+c>Wt<?|eFaMZN zZ`_b$OBchbEZyurnL6Ge-+h=~_=@t?WfM+WA|f510Wix$e7Dwc^77cq#|Wav<byL* z?KyvZb|QkYsBfTil-MicV_z1ENaq4CJ+J+)pH~y9_Gx08W6k3(Z?E&k^Xy|GyUQT& zh~OyP=~yEgaUUsg0mf8C>&xGd(<vUS+GoC5TwBnOw2Uwg#`r@g6o_)gWJGF=NN11& zy!uX~Vr~$%eH`k>sQbf6=@II7OzoSwuq{L7`V%Qj`n3fn89*$6hljfOS)&=goAn9> z923R586`*MPbX*5&s%g+Y~j^sd<1DvD}J@)@1)f3_HNaQOtWhDZMiL0K>H;WXR)%a z{>=wyEVmYDnC_aF9;!R%Smbfwr{FmsJ59(!c^IEV=)bsYd!_Ou7~sw(Q2({XHRRwi zWT~Uw1NCULQ~8m>J`H?fv!(@gW-|Tb9Gr~W!2GA*U^wMnHnX9C=UiiN!+s(;ye$$g zlhF`to(26F%?B=*PTqrgUj3B^j~j^q(=#!eXBeLtxKV}GEvUWkv2PF7K(}I56|QYl zWV(y%_*QCzh$e*WKK_cTxj_ZtwH3g*$-tZ3nwW5nUr|<IZZ6^Ory<2hx|4x<09L@8 zcy*a6jrvd)VD=q+<MyuoU;Z`@{1)ZjzJk1R&R8>RAnO1=1r-$JoVH!xV!9T9&o)tS zs{w8FKQ8O*zv}otCehna%{D{W8EpF;be|<m*GBLfy?S2*jmDQtINet_ozf%W5vx{m zvYEen+rn;d1yB!Zh{08)eDk_k#cpeu^_tJ}N#)4f5&CGUqJe2Ul!wL7%M(hZFz*6* zr{1621;}Z<a}%5t<6g1Ng6E3f{2_66ms(f%+&xDcd&3h+f!(5U;<C?}$8MGq^Nro& zqC(7D#M#p%r#``?L6_M94;X+2tG{37O$@gE0UDF~A5wUau_SP|#6o+Myv#_igg*-K zlTg3&$j3<T(#8MHWu-5eN3f#$PG3M9-<|C`MDtVrSO5@YSm(1ykL2N%0<8i_7Si}S zuHP~@<J|5sOJS{H_(ik_Jewi31i~P4XBZOM*)0H$zCgBWfbw&{Y)9qL3gbkToh4b^ zhm)9*esCmaDsFbB{$K2;aqs*&hB3AIo)F$QGfcWCDipQH?$K~2-5Pk4Ri=lK4$kHC zJQ@Bru_kc<kz2-euZ3#OlBZFvJbV0)EGGl&ALE#&!M`C+@0epB=`cLL#Sw|C5OLZ} zDe2xsHGHo|iWDwKPRzn+OHQE#<i|hC&$F+K^+nF`+fudtjv(1EoyMviVj!?nYnxjJ za$2+Xn9N0gO5?$P3c&`w)<WBPhlh*`_munYi=oJTZC7o}{DgAWE!DP4ea^m6#bd2d z)222T^Ht|_K>NKDok`Y<uDju|DJ0JUi#X6iwp0}MF|SdeNX6NI^|r~!__I=fX$@a$ zBHexSensx&E$4UTVPnRv*4n-p3-oeJ!ZY&|E{m(GgSc?P1ex5jM<KzOTf_U9jRf*= z7pw-#2Me5EP>*^j({JRTC@DY(4S7C?Nm1sEhK$$XdGMxEBCQ0n2^w^aZeRNjN(YqM zn7szgdc?7~5R|;W&oER}9~=3kBdl^sLEa~1T{DAd_u*XCE;*{yLnQdmfUS3FV}?E- ze7q)U9VWZ)zM;rUNfzi{S#fm~v0ugR>I4HK8uV>?(-be2&R+*kJZ8SnAEY(lgW>Ps z&AN4pD*Nz=JzZjix$hk{#?<EJ4OhWl`_6~A(7LuaHPC2oFcPggft$-~s;^CMUxuHn z%#&H+|HJ4Y@u@8}5ojrEUp`hNRmha3zLBU>h^5*6yG#vR+1TOq-ZD?K-xmOxLh*Z~ zu<AJhrKm}LSO#!)|MCs?;upPEmpr!}SJY!eDNnjNRL=`O<{ULh!{n$)YQh!c4~dE8 zTBJl5bqXmU;4vO0T>LBYlUB&S_xbWpRirc4#Hju@@?YndreCw-uQS%2SwGiHho<pj zuZJ_5;kjEbQt9TjZ@!@rzPp~;7%7Fua1$-7bSYL>om^<c!qYy3h9s<N5wt{Nz+`Lk zo2Dgt!?j9&FC@aF49T{+pEctI6%3J6oeMo%O4;6Nm}>0)Gl~n3kaTBj>qkMFXB*jI z>p>iW7Rjx9xIzuvMdrV}RjotHwG#|6V36yULw*9-2ctWtn*4zF#_nOnU2bfpzRi3% z(5j@UR%+TQuYZ|({+Q|Zb_`jYUK(I_JoU8PB#E&>7j7t6NpRch2e*uiZ?-C`*qlak zy4qhecu)yH)z9}Gfnr@Mp9``n+A@$Ya+EAT+}*p#g~ml!h!2`*rsIW7bNzM#G3P7{ zUa}%IJMa(pTK(PD0ff=oiEe%rU*8RDViw7>p&zUqRY9aVxfEiak&6^BFV(It-tj9v zzQ^(EZ{gek&eY1(Y%BE4^z)D6BM74e$Kp&7G1cA6B{z{n4yt82<{wO+ca1Wr2b;PY zJVz=QZrNVKv<^mRGoQ$@m(q83E<&J@=^%bFGdBFYPUP$hOvL+aR8LE8a800U(LeI# zy2=948*Wfibu$ZZO;f1=e)Kf<h5)i`_k;E7?v{E>O&1P8r}2Oi)AMPMEaL6MP${~U zma^YqoGSXTj=h4-99v|9r@flN6rIw#`5!;0aw++2QIb>dWqb40*kN3Fr4xwKq~lP= zAclc|doK)p$bSXD)Ls3CX}ULHbS5V1X^7KbKyMho9}xM=$z0F6q&?WdZu#n(B<;8U zOS+VzqSuZVLos_o?yXQY&f;uS<8p?-(l@y6!{T66B;cGHYkZzoVYMQd^edpEq_m=M zdyrwd^>!4=v+Hhm6vxj+^5g<l4?);2>N0b+YrQzpn{C})HtiKNbl%=T+H+W7_Msr< zb-SGS9j}=DYAu8q&0qi?DM*KcBjBXDQX@MIn8)diH(vH{Mqi?6H&uDi3n`v@9iVd= zU_WVkMwPWrb==|XcE(<&wg8a<!sHgC3_R`RTg~q&Ul2ZSzpQ=n74`hG>CtyELYV{} z{XI_AY&Ly1&CfsBScv6XoYzHnbN(nm2B1|FsgR&+=w}c(+D7tpvx!3jxgnP`w@c;p zNa2z2;SM3(CGMO(>w+YxmJWU$$L6b)9rLzsiG0KbV97DH5EQ<#Pi)UxW*ViUe_*aU zRvYyD(Wd5;sYyYtjy?9VWlHTgi+WF(6PP;bY67L}jp~!Q831SZ#^N0t;HCzuLe5Dg ztKF@9tqB{^usA%9y-12DCHplG=o_C=eOygUYh`0N77A7cw;shew^tdDruz3DN>Ov9 zV4X*D$vj<{uI*^-ZYYxU73~au*EeOUX>>-_U*YHcZ{Vg$M9PX@R}%(se4Ta3Y-1Ho zyW+%iFs`Qx-+FB2f2Qp=?N+LXh)zeNBRuFm9*t=|)rW;qs%G~)Bvi6YZ6KT!U`udy zw7^bbfWWGuY908eT*nHtxA_(ac2b*B+>0}}%sQ|y_cf3_;p}l_?iZGBTJ_Ku;`@+n ztiKQDEy`Feq8F89u_#q9mpjhSl>@g&8Ys|y=@8<Bw{L}GZ@Nj9fbkP}mAJEW`3b7F zZ~<uB78jh7Qo5HxmA~SzJE;HY;agopWa#S+N?};wZcPEWNNH?V?Le)9imMtV)7uS9 zxnE}Y^XR+-$z#5isS&8{vge!;x$fMCLnA$R;kJ6cs>p@lkn;x6#JrNb<Q>$lGGM(( zp)3PXb)a*A*<S<cwAak2lumH#nx~s<2S`guvX{L<cq*%k)V4;w8}0dP#PaD*jd=Ub z**{}h=L`x_aIDdPKsk^_o;%!_Z>b-omf$<MQdfI}<Q!>O`(|3@<m#$h?y&L^oHi%K zb@<mG1xchdI4?UmcC54qX_wg5W^361Rb#^2$Aat)pLz#^04pvk-Cs}_4O|Lh4wjk{ zJX7@c2;m)Z-rlWsjf@tfe`?J&+x*uVFGwwH0{mM31XuSR4YAAiZ74L#)AjN(&Z9Yj zio+zjo|2-dY<fWHk~dfJDP2iLX{yg0ANVb7vXPwxhMf(J6YqQrTi;Zd>TP6m%OT~Q zSat|#x*e717B{4=8QF3q|3wEN-Yh2Yk<Zd#c^#}EcORirilUDdX>s~{keh`2C|c)h z>M=ex#h2$j%MHG>ZFY;7Lm^*8!h?W#9aJWa|7Zd6cc-}L)WNh~F{1)lXPTP1^w7QK zrA<ci_>uo(8e1kht++}C?JobJ`;p#(V%vx8U<$x~Z@iU%+bZlCMAS~iMkjgu#h?wd zfB==!9C6J+@#E>l{0TdXYSZlC<KBFW5A3$I!cf(Y2eQeM!+?cf1pH1mIJ)QdkYQ$r zhBf`2%5Ar)nrLm?qxcHtivd$+TITUH+pESl>%~<>%_nE)KpE~pN_E0AQ+st=T@K$H z?d8Tj<3dFZTT#oG<HI{{82iF-=Bv5l><^UwZ|mykKaU`|Z78oE&Aoyi=D5ihleecK zrG@0X6n*`snw3anN&nsELN${Vy;<zR$Gv@t(HgV$NQzS%CMd~$)_9;H9fxMZ|32;o zI@-c4&oq)x2z|bdDJg!EDu@J{fB5fq2HIRb`db|vNwAE~uT<O<TTix4L%ulu4?^u1 zSl3oKA<-pHqq!|K_r)urRU_slDkY71Dwy^k>J|Z2raC8Rr^-v8U-sHh3}zL*#khW2 zRMIR~W4Ch;b#K$m7d@@z^|4;7j`;J}%qDh=LM)1(^@mN5;d>-vRVuDys@v_5;B%au zhJSnnW?&4vqy=hY-;O9LS68i7eD%i!i71Z{W6rUOEdTyF3=oTL>^U{$?*FJGHD{s! z$f5I%P>XcENxj%+4yWI9lrh;QQ|N<I(*g}!if8*#LrAD>ohCjAeX+mWm4e(ULE6VN z!A@s%aCj3aJzu7V@cbp>U_4lQpy<wm`PsC7s6DmFOk{HU=nX2KKWc$}URTWB^~o|t zcl349-;cAOy3~5Ty)SfbM;e+x%CtH-TU(x;aiM57@V?{xx?D-s&NtK_mdy8rS&m{N z1*|CZ+xikzM88*1tW1BJ-(yQ9>j`-8-z4Lfv5JT;Y%Hi#^C(%4oNLj-n#r<kbi7M} zqRLD=yKv!!V(x0o{Ub#;Yws;dF&da_YBzb&4%j^G<RohjHzlhIz>ly5O5VJ$gDyKP zQrwdP9zOk61x@2vhV)>dQeKnKis1+SQVE_8MMJ|O|9_PA`(@K7NnW`Fetg*g_xZUX zR1*I_1du~xN)q>;J%|f~UL5P64fOrG+mTIzNS={~>Yv30b$85TlBEg-3h*7)wQtoo zXDK&tb#<ibTe3GQ%+j#9g74LSl*JOYrD3&LrwiUhkoTW@w^6psVvwOyi>)owJXU*+ znoD{byG_!vu-)z8#%XtUIh#hG)k8~GLuYTx&upg4`>w~tH&<VS{y8_$KqyMS9sSM` zA+D6&Z9whObKb5XYFcl^g@Q0H#$O7O-_$~TpT<Ovqdr_VwmQ<UB0N9D>;*Wgoh)Ft zVf<zTl-7y3OmvLfID};?uRbH$UJiHzDqx6D#hW(rQBTIhkvs1E+6tAecYQn3P)Ijl z@8F|xvwCOH(aktivztbM@zM~<2lIlhe0_wvM`-6qw(?HxdQ}ohugBIdVjpN_ujW$$ zjrJU&A4TUUEV(xIjDk%s*>H(pAvk}M8rq2hd31Az@BY*ShNkuEkz0@Z4+!6Tmj-l! zNVi##_w_4Rzo%R5!0Qm^F9uuTKX0V%ptv2?5`>ngX`6hI!ML321H)&e1~{V!AKN^6 zbuX`a-`|^Tei)Kos#g$_rVH6B6eiw@E;Cgvc76%`O*bs;wL9b`8>x0pqxdDsCC4{6 zy)5hqx|pX>7l`Y0v|h>3zN84(62M%WcdzMBHAZ``#6?D*^YuH6!uRW|9v8}6h-jYs ze|K(8v1J_S1=-Xc;%b6u><)kbcrt>aB3f&%oZVKtn@Ru)N=Odm8@#<})d4p*f;;Ts z-D3UAVRL=rPHZF(yL@&}Nduuk>)zL8Fx;E|!-ea6UQuI3^&E5l;B2bgFgRahU<YHr zXL)?j*-mSV$8P5fX8%m+AU=6n@t39|2iWqi3@XVw>O@ev+HY#MuYXbJM{R{%o6O{V zpfI!73yn=gdbyWpZ&UVV7LuNwxt;QzdL7B>at#;_jjWq6wCk;>%&0GjDK|{(5vf7q z^Yb_N04H;BCAy!=R0f#;L4?PV{jx*y^eV^+Q;il^nCzE1duu&0v|Ez^+`IpU-wlR| zpyDZYra;oPX!uhU+~<Pm=gBO&48ITOt#cLU&AG5iZuSB#H7(VPVoJf3D=EHFQ1q>V z_EIe*?3i9kSk~}eNp21dfL`kZ`jIXMC`NfmDH<6|`}}UL3M7SsYh&^c2j2KTmIm&Q zDIWw2C2$>nX<N}{laUDSIdKOon5B=y)B<)bqkjr?@GYlwo5vDo+kJ+aBREu*Dcqk$ z+#Kxyl<f>1Ol{=hfA<7gItUL|=Ey;aK-8qTI^Rj*1v@OhH4Bk$=&~K$PYF0RDx^|{ z@nTJm>vn{tceWnT^v(T^ni~vU+e3Kb+Fmv;eQg&llZ=h7VoW7!jY~-(KqbjX4g>Lz z@=&RjbB$|QyBaYXW|#jZbP=AQLSrBB`I?7H)bztcnhES}B8xW}IviCq*xJ)$w}t~h zh`-)0vz&cXFYiBHzDfl-(MY(inwpXz<wB=isunqwL7;10#nl;->4M+@$I~fca6~qZ zl9CQWa&U259iZzw^&fJvjfm4YsUh{*xs_c>kD|&kf=POMMrPaI`~*?_BI1%4$YDGy z<9EAOVolTw`s8+<;ps}?4UMJv^NLx{v7%kM{k5*ni4rOnrsNN(h}Kysgzdjlk+&7J z^#9{-F^z*>uIMP|y~~z|WBJUqm9FBCd%lf-+;OWM=~K4#flP|jWl?f8wikVO6~AZT z|EA7u@pG9Z!jm^jSA(90?06a|DK(9Kt|*A#*>H8`Uk8Q{#ixeAg9jxTE5V)32OkE4 zL7pPMY0o>~v`eCE79RhKD<f?pvFi@g?0$drUnM~aVYdtRh^>4ieQ(}*5J)avkoUod zhT2?t-xYi8=HN4%*)DoK#X^_}pW)LlpN;K-p^e)Ebh@e?dFD$B`Nk`GDj&PvH?Q8` zG+k4)jffipYv9<gP9r(pj0lHC5B<E+@-Ho0hHG)MRK=k!EVYE$piFCG&=wi*P53>F z<Ba0p--oqmAQbC=QsUPnA8fby*6ShOc0CFNmNK;hmL$4yoBPxKs5HM~XzwpP+xQoJ zgQw-oZx+FARW&gyZp`Twj#p<=_>fpAOQxLiE(_Z073OjO#xdbz*{H*6yk@XAHkiDi zsW#|2-Nq$VYw8Bu=)`7Fr-%y)Qlnc-dO_+>Mi8;r-CwBQxmNCqiQN1^zs>UV>Oj<P zA-ueLR}4qD+i+}*Y+&ME7B2-Z1gB;*_<h7H%f+`(2`=pF>NnlU$0zi`cjMZF>+M!v zYLUvUy~RtT9_DADuds&M6l}BT!Ti+%q9Xjg9P)byNw3VpEE%~i40M6~cXQxHozJ%H zvp@CV=WM>gXz)SaXQ$YOSoVK$VuN9Sm3sN?Ikm4Ji2S~M2HW6+Lp?R2hX(Mly-CUE z*!r$=ef3peW7P~l!r~+8z>TE3y#wNU@b?k-kp_?CowhRpM|W(jH6)K#uUtT5!&(OT z#wk0skhpmdBu7}M0u=lkmig@co8%izJ3(_az!beq5pQwvLh-4o&L=Tc<kjAi9q0*G z<`Bl5h0mQo4rsEu6Z={R8-I##E<k2m%lYt+QAm2NUiISsezPr{L<M<q0OVyA80WL# z$L!2$VFTZ){5-c((n0)1<d^g=afZA?#TK%3vO$MkDr$GdzKrc)sAT<m$(Q&&`Thx# zM_D`226V}Ev`cQr>Q65qOT-%qV?bK`6Yun}%V_P^oG!Cc)2}29+D?vjcW>Zh+e(3Y zu%FxY8^iAz6fqOJWPg)&a=9Syl#}`K^4}>MbYotLE*|`V7J9x-HuJvif1u9Gx+R72 zm+BcCN8uCN_v5d~mt?-%EV3XoUgFeypMhHTT{1kl-c_8)=2dz1p#`M5SK?2xd@Tn5 zn~Rbo)_B)2x9KiSDUmus=Lu6zHoEye+fIDGMkeO__DcmN>3B1YW5iQt4X&0b^E6#A z2^!r0<SwImJV%z5hY{u48#owFTIa(hZG*=k9l%Pn>fSCmT?UM7=sjpV!aQ8<>U?hQ zp^_9jp90#|RX4H4&bF%R`s;qPx0#wKGVcC@*kqzb{v+jhM2LvoK>!)_rOv8110Et^ z`~^2M@4090sNPhx%DT9v451&4Ot(X*`o=t+FqM{bYS2`R7-Olg-5HfqsM}En(jXcW zpNAA*K#DVSi$m5~-&KCDSWtn&MBY!))!4~mUilItoo#7m9Mn4?`&)58u`-i+%}ikG z>32TO_|}K2d^r36<TFq5+D~Se%FpioJ;>phoxJ422_9`+Q#tHZcN;B3Qp>5}z%MtZ zw%?}x!~RW$o;mqsRzjKqHLYb-Khq$nBKprCh{5jm$1yP0>RKLQJ8t@!-o(I*JQ8y# z^H!SY?7(`(nO9-&jvICIsMJ?%V!9U3E-38~6xiw`woZ`rAIP0S6cMM(03#XaS6X0P z!{v@dyGX{4n_s<jbjW#|WbrjyzW(&2cVvj_(=t`f<X{cfyTpMlo`BO*2HxQ#2}4Eh zm-+=B#WV^hTp_QB++VnMJ|5d7J@H<C6}3t54Q;(nM)T))U=aVn<nLpTYP=I1tt3gU zDgE=kAIk;%$6Vu|V*TTt+1uT*SM6W*!L?g{yds<*^a^sC_*aypBWrY_t-NA#bkD5S zUbv2za;1#1m7x6v8>#k%Q$fY%-vn8=zPxl(Lxl@cyk8xEat_6CCmjR%?jO<EGUMG! zJJSUN8Q{(NjFnSOt8#Rec<X(gaO}x{HN{Vq6&D~a^5{(Xl<{s`Bz&0BNp*t8jx71A z3|Sk)J#b{sweHG*%EDnws-S7WuI|baxHY@GJmYiYjD1qefl1-|+7jK*(B9v+RO*{a zSL3qaN8j&~1%s>>-$q3IBZ`ob7Nb~zqpMzLVrMjOkgVeY?{6Qp2S8+cB{s<*ybu2F z5ZnZANAKiOztLq$WH}>u{{kIMWMxnC-S|)OBv6;tDIPz;o9bcE{u6i6a|c)nUmOQN z8EV##lu0koSV(hnzS{&vO?zX}2EqU8GF3Yax&hDYATXO$ky}7+?6a|GScgrzWKAAb zHQkT5?cx_PcJF3;L>I^W#Z!ZwPp*~O=>!QA%B;jBgot!Mx=2PkMnZe5z{ru@#@MhT zq%gl1G}+jj9EVM4;#5<-vL|==3chK2_AnZl|KQ)0V(Js7R8qVniRBOSd_D5x@s6e4 zdFRY|oI<*}UF?b3=cB<?2`o7VU^OA2RIQWoF8VGhA%<h?2!SUf^TTfk)JJJ-h=~ne zXI}ZhuPNKvO*hr?`|tl(w-xGSM3*O`2Cja3HTY3`Ib1c(@np{1(#SOyp9ue+JICa@ zwrD*Frg+9%>zXQ2&NLR_nOH47HFMf=!EN}sEZS_S6fDgM*R8V!O8j3hK#TZr%@qVD zAqc)<Irm8DGb7upy}%g!JIBQX{Vqo}QJ?0S)dn?L;QM!dyz{vP*}b<BeX+;dy9!A9 zugp~CC`YXhQ12_JdsMdYa(d>Lq|`{KlKWf3VX~7`@N18=zO0C?L4dDrH%;V|M=M`D zxnQ9AvTh$=nIuVWLtLk&QtLXV9G8L{$-L5i3@o>k=#hu-lm8ea$%T54lJ^_deRonq z&wi6ky(<9y<ALeighp8#`^twQNAQlEOeUDJ;ivo%Y&YtTcxZ3pIRZ`E^MjD%tpdES z3=+#zT)LY}|9KUI>2K?<sF6=te@ByGdHpU2)w@#Sh$Um0Cf{-*d!B8LI5w_vd=lMf z@HvF~OYR?Ez9y5gCW*rdLerR-8Sm+;$6L!Y+9-Au@e{M#dT<mbrah?+-P&WQxwUvn zAUyny21oD!pV^<@T2N|(YLny)s<fV(IS$e`bIcqqV;`v(A`bomBhT^qmJu9Nln^;| zy)evSjW5SoWBoP@syw5@NMj;OMG<OPoWngka|&IjV2D_~kNF?uzw0J4$zzR9awniV zdX}n{od^u+O^KICeD*Um(GDj7;PP0ESh)4JSo<Ai4+OGt@9sKebusXW<T^^otjP?R zKQ_qep*X@AaIJu`7T^@)xF|t}sQV|@Qby>mrv5(WCn?$*Ft1bctoXICE=#Fb8p~oe zJ_W!4-zfDAm`H=Hucz-zA73SN&-rh-_1?iv`lCjT+ujEyU%Wm#lTHu^>mQ7QK|Buh zeGO2f#RXbA8*^!~W=6;2?8grq+!xok2eQkp=5^i2@bYoq@fup*Pvj-v*TrFm4r7uN z2@LX5FDZ@fSkB>m3c}hN&hrZR@#+fmtho=8WuqMmRTDT@-TakLH*bN}sRg<Xd2;L5 z)`?Lp*OBDa3sn)2C`c}0Pu)G4I?4cHhPIQ^A!V?7!;3Y2u0DK6>|+R}Gt-KB=#6>4 zG;L9SKC`&u@Uz&_mz_dDDX>n2$H%w6WBF6VBWH$Wm8aB0w*9PXKkHQMrAtrw$S>U# zeLgqoTIQ8Ito=h>8Mp2J4KNr9m2!7-Ow9z*k@ME=o)dl*wY!`SY@yOJ_=2Wff4#c< zPPKQgXd0R4+jfJ?Bs&Yxy#;3MXDpAeWV95&E>HD$HAPpMTHX#M_kaEL_b6gp${_IZ zvyt$9g8hyuzq6+aq3#Sudj?|+27fZMncr%?^=1bJ+jQ?1Jw@3b_2N$1pe+@yM767q z5oJ|jZ^Vl)^LQHxyA-nb$Y;f$s->$|slH4Qy=d&I^WpmCpmt!UH<`A*;~xuEq|N_g zlBtBZTe-`@Mn2oCI1Oe`ZJ&C7x>pykJ<*l6cp*tUNwT7T{%hKg(o&MJv11N<yf*FE zy7WaU)uhOGnM8aGrqvXA@AsMGCF;wKP~?59Bqyi4Cy>4GyJCveZiA;#>YMjo-3$P_ z2!DU>QO=PATj8AG!gOE-R0W)UZb>tn&&Vg0Y(X;>hO)eqp4U9DjW(QOO{|Wh8hyMn z%RJsOv`wKe(eb15_7jy4#2?q|kaYGofI;&28IQ4EM)||Wdtq+?-lnE?PIqWsJ?a~h z-bx=#ofj6)Z5f0{Yh57#_ASC(yQX>Ob3Wf?g0g?`D%6sAu!jL?{Y!Ue!;)V!XmfDK zK}*Bws|O<W+`o`H6zSFPH;zTBI47GmTSwWKW^!|1wRUS9PDwA>eiqqk<Koc+Ex7uT zUJ6(DD!mDg>r+e5cP4zc^T5^27d#Xu6E(I=*E_KRVy)bd<^rJ~ckW8sH%m<cIDF#o zqX!KhWaqA*vI>hh7ROre#|TATOX)GU2PGWza0Z%i=%E8I*?C2&r2NV&jzF?JjglX< zVTAZawXq(0Ib=796hRt!ZMyl<ky{xYM~ea&*Iq^S-1<J}M9G--UQ56}0g4LH2Dwmc zCem6)SqBs@^sdzK&#eTqY)tf*)3;HrOA;(YU_#TPzTmj{8^QgwL3U!EGU}tL(bWG7 z&}7m+j;O|EYSclr1UWaWI?b#fV{Y7CJyfwzfcwMgX&a~-KB*<aYwEZyw~%*lg7#WC z?zVKp&U1)?;+{If`^_arakAzmUKv?O!7wnzCmh@~^V%FBp3WO}Bph~eSKy8(HD!O; zxk6L$#U!eZu*DG*jxkMzswz}d^tMGkR`ak5=TIxkbXr_Na6ck{WxGh`4Te3R;#Cn; zY-j{4$6Vca4$O9RAwb>BSm05><J7HOtEOW|4)W`Xcb)?G@HR|E6(M@QFCp!|fnZfA z=emX34(NM#`_(8;+MIc7_?V~VS0f7r*wetfvCfJL;h_Duvwd%h!PMuWemC`HthJPT zhv+yOa`jI%!h;sl2(qVB{`L@jQl^TEwiMfpQZRA=rw9*`iNQP@e99hD&u28IyFU?6 zC<CbTFHz-i=PZiOEZ<0@BJd6%?G0jjv6JR(Jj7>E7q}D0F3r!FOZ6{HM*F=y`)i*7 zCF7D*d^Q*s+{i~UJj!CLr$LNGe!P)MRe#%pJi#S`Yw06~MN?rmrkuInd^gb(zIB_8 z-%J0H<=X0QpMLukd-5XnwQUy3*g*O{Ob}*Gofb)#sIfE3vt@Jdu)`y&p62l2@N2s= zS;CE|&a-{c9-||s;JJtslQ3Iq_*XaHe{0k#Cx=MAv}2`k|K?`AI@^GzP7f>xucGtx zP|vD@KmOk;?hk^M6zqK#R4nF}U3hb<UIz|53cgH{V(QGbUHCiewoq%<LTJ<a<Fy0q zv5JgchPyU(*phY;F82^HHm(clp2GGkZSK#VJus2o3&u%;PBwOk8!DD4wY0&^?CMSz z*xDD7^tdV=b+y>{0o_n9alAsR)vCk%l~EhRLbpEq9t+V;>zKaa9*3wfc@K8uSD##6 z&CTPLxw=9*m{@6UKan$@VWXmonDfa|IAD>Z$hxnQsiYcg2;yk>Mv(wye?lG-rJe!W z=-xfrA9-W~7i(_z0n>Z6<q?(7Pyjfj@-Ajm0i)ZYlm*<ch9kzvgfpd#!$*Koh-ldQ ziY(*}$E`<>TA;57?+EQxDP_)+wBbMv#UTp?3@3Jq>n|_{_C1JPc=^DY09amP$JLs4 z7kVCNOauB0$ENJs#Y~OE4Zl#}uSQG&FX_w`-i!nH@<ch=Ki#C$!Bc&hGVzo-I{ru$ zchmYw?{OtmVe${f`9rt>X!|Gv`dnE}hBSVe0Df;5)&(odmPCs&sMw<P(iK@#QE&=& zm9bDHv5shS!<7}J_01v#5dYQIzj@^#gC=YdTgewvejWU+wi#r&=xhkmrA6t%`(E*> z<PX2Hi(8b~3L<E>5dx^VV;|1Mj-Jy^Ty0a>i?junM%X4y<$nEPtU$yO=3}BPwn-3Y zTyHGerDSh<wg~Lj>;g8=svFii(}J&tvMy?c?v^^O3if2G-{xk`n=s1%#nqLdQ64ZY zqqN?@K>>i}FT;`Z0Ea^j_A;YH-JU-}f#dSbjvTiXt09ph#^93>XyK=q(OHL|JP-SA zDVJaf7>;b|U*9JNauXH!*s{GJFPj=wTUFK<&Nnh^DsF2biANf8W-RH+*wc6xG2ypk zjhHKmi6131C3E)>{i68i20|CD@|63ArF5(BF&lc(e&<V_D1JA~%MS^+rt9hwnj_}l z2~e08t<a1^t=j-4_J?8NEG$wYRql7?#9A}nT_kLDCTH(|16rGAU;A>?mNGAp)B=kA z1*bANDW=aOEG->%hB>$XA&`rY3R^JvnG!#Dz}84P+-uyfqvi3NM<hDM4dqms8j@Z9 zad5Ue(RajLHcI~-%{o2PIHOBCrk=RTT*Z^GI;K!7ZL8OGAE74e2rh_L<T^%?r6Jk( ztotAnOT_$T5X+8`6ccQ7iA8o!v5tFfhZYBw18${s2+#0Dy~f2xrt<fqKC(nPS;juV zu^`C5#WVI&kwE;5Uu;%lmlom=KU>9o>u9w@De+sP@gL~^`7_X*u1siEU1hlb1<{aZ z9Q&Qqmt`U1u+Qo!RCJh%Yqe`ceY&UOkKx8n@z1hME!1!mpDyDP|LZ~mB2ypuasI@` z;WiPV-pPls*Cg+IKZJbLmSa%G8NPD;a?`BUsMEdNzgfEa?HXC}?Ls4Fm|DTnAH7Ea z*!i&;D&Tgh6rMk@T<^+(JF9cqfOkzXIHHsaTnYKEen!&&kxP@WbXisE-!O2{y7*Rj z8J^c+Cq&5g1o^_^mM<JkAIY|PKv}0D%_f;4yKVW_qt=d5I`zt!R_5uafh5w&tPx(| z2qO3OjOcWE&F4E;IH(BgnmA_sMx=|gNf3j1XQ|{s2f7vT{&_JJxA>knkUF(cMHN<K zpQ+EWo^`9nnugy>)T4x?2Pa_}BLox3>-VqOa#&BBAW4}9%gqwf$$S~(Kzw>ng1i7W z)%(CF2cKP?ukbM4zVEt^{E36Ny%4UuiH0hR_r<aY^X3>&;63k7)zsYnIiG|BV6-r{ z<y_;B)dr&)K`HI+XJ@BC>WJGZPz^H_Q#}5KPGOMrRrTLIlW1kDMi|vyMBAxw;M|yy z%+GGxtwvL_H#EjBHdo?Uw_l(iJj+*9JkOt37u)1RRjy|%^tl~X3o$d@LCyG|la1xe z+ZPwVwHJKETmQZ+{i4PtOY}4OQHE!DZwza8{g8>r2&mzR4aQC_;Pge<VL}S?AIupd zwosa40Edmq=X+0Z$d7mTP_wR!<Tk8{4RmQ2UMMmUGx;mcxVYP_7Rlc<NhljMOh|-o zbu~f2QSn6=x4{zboN9)wpc>^v$$@3)=QTo2|4VIrn0~K%Btl3Yug=(ObrI;L2kt#_ zEXFR%bypJl8DxH$lU56x@*{(Fq8CEGB<pw$62*bnErObLbS#osqIu{8(5nA(;^!im ze`+o$DE9J7a{hg)Npp#P!g`aXI_h4+NJHN@>nS&_v(qY9C$Jeg0K0O@#XNb{xUBao zWQ_z+Z!V~mo+up1n3)oHS|nF4c4~+PJ2B`-#4*Ea#wm;AOdPtXxk0@Gz#5fU%F5iL zg%c7Q39@{h`Ang({l{gKat(}DBjO6Idu4B2C3g!IMHSRHnjren_n7VP0&zF4?mk&E z00b`GQL1Et#1l<4VV=C+Vq=J)sXZEP->GLOZj7|`&X)O8y*EcTH_xIrya2IX2v+yw z_PU`P)a4VpRSw}#jW{tvrJz#J)ZQ$3Ggg^Jt!)|SvO9#~@!>U=&8x<S+KZWBnDZ#F z{K)spq6-Sug&||4#{;||bN9^!i-=VgFde<w%?f}1FvNwH!Bezd02g30F+ilg#_x!x z;Y-B7{cf={Dt@Lvltf_LsfEkSkKYBOsVjQrUMefO0kof9-LWwp;;y|ndLaxo1ID<~ zw)|F5tVjo=5$MwhBA4w3EydHc=Xe@!*p@GCP=WwEHIE~g;$8sk>hh+5SRl6~>$|J_ zNcg=Mnlg6u<U#~Jiz$#HM^#}&z~s(_4lXc7_T)}z@pT3n`}RgGjnMBO%3%_l0}p?B z{(Uevymv>zo(KC3#r$ztw0EOS4}|UT-4RBR0^tf|H=-!KO|x@+uytOcwCJWz{p~Rd z@-Pq^aFPM|XRei^qtWD7P7EzA(*&XAi`vY6O%GS6>fA_PyvI-IjADbN;kiVBAr4V( z%Zo6}QFPN1XmU<FE*enDnXjLr!e)HkcOo#(OdjJMKLn1Cmu0O1l}u3ihrdzPg+9r< z-ENcnuRf5yh@OTi#vwo5^d|MIyuea{fSwb$BHPN>x8!Y1*F)p1^tcxgc)0uksHdzT zq8b0ZDW$Xy?Z1|5e|SL7eWgqUlz^tkGXO?pP~uG<_8vAg>To1{9+Ek_W<yfHjaOjC zntv*NwcX~~1<1j-f$aAEm5_A?9=cU|u><dic5QK<BN?=~4GZh0W!$TlwkUJb;=jCu zIJyX5Y&r16fX2u#^0Cm7kr#vSjf|=bOq9y2L1AAhtrZ{a5=T;3$?-1|GphD7041O6 zGY8uLjkD4BUpn^xP<ct*5|*}U;sbUk#B3G{c0`wQTU&?zNfgS3L>tn3!|$vx<?Q4} zIb6ndT)vY;U}Cg%fI*ffu;edyB(~f@dJN?c-ZV*2bDRNfjv7CG7zy^KuXFnO_rfSn z2K^*94|`NU521T_k@PyEOyVdA5cSgs^Pvb3(dmyZhx36lSkN^>O0(}<JE9WA)ovhH zP*h~YhkSTqt1c54%eS-o*`IwO2#G9S{G=DQoPOQ!j#`!!;wrgg4;0p>SxnLL^JX%m z$zx33;zt44Ku;5p+V}bHC<)zf8&8OK>w{-e(Hl?Rq}eT!`ziJ`LC&`@<#z6G@>sf? zZ--{)?L!#d#LaNrEy36kP5!*wH-xWlBtn9%mL8xzLU%D{UXLoY^<jS$QThP3O9p>7 z#ueLK{g53bVYxIkiUovf1|Lr2lIw+Pj3gR89=1S4u;>J4LP1anQrWryX&X(<$1e=) zyj^OfH<$f3fc|IGu7}JyvmLhqb*3VU<}M1ThM)t6O*0*S9(CdG=~-Nl?5=!Vd@<TF z3&^8b41w$(ZXo6gD0;2Xh22Gircu^0f5egaI)xbXLJ;>Ph};VeTmZwR26ih(*7*R< zkYS(p!@-%AwI`BY4W39Jqu6nQF~P(yp?HlGhZk#brX4i1qO~cl(~OYH$w<+v&;mPa zz!raAEK$gu)y1`r&r0he*xL31Oh7ctUcYJ?lVBc5ssab6+2NBcJ<fz!s-Nf&G6LEs z)Nq)(YWXnQD}o~ze50WXNmUn4qK4C%Z<jc6O#m#&5H4JfLb8l5CkE?QVH?3MVJ9=% z$TXm6R|r+$Cx3!XLIUK#zPu)83^fQ17IBSu%5+304%V1};!L|mGP~KOlK>@t+gUlU z6)`|&p8?qfwoReWtjv@71qGFZH8}8uLLX(#ziL>J-(Mh`e+iqhPFd;sQiAZ*b&{tf zSfz_d!8E+Qd48B(xw!FZTz7@95K;oF^r}HPaxw{1HXp?fM`FRsq;E`A<9ipiGNGK9 z$#Z=<OLBKd8u%7$kXA7BeNL=rqFNb<9)I#Wj~fL9Dkl#6lXXZRUQYJ$(*u^USGJR! z^I6>>^J0*%o&+DSv;rHD5(oI<e!X{d%zCpnm)GRV1K`1pP1X1CZY1%i$CnXrJEVXW z^l>R5{n6O763moQ2IvOvTM#Cr6D)}NNxAqJHw5?zK{jJVi9i1*7yzA>FHfu+&2weK zZlu{6Ozb29K<;of_k^gbEeOW=eHxrP2^tFx1#4&#JFaUHbUkA-C>(<CnUVa{-{ox& z4|Y&z=^~1VDDd!60|iChqO0QK#_$^R7hxC1j9zWw7DC3EAWqi9)Ih*}B$<fvZz)|) zY#(gia5T?W5@^3xijcwqrFXH-fe#$xXeU!dHbFK7@MHi*V>LBwlBM}s@lDlt_l1$f z0+vlXER#ZAzBIrLDKPZ&Ix<of?Vht%rAEK^q%ZhosLAA{x$o~`R0fkXyLibO7@_Yw zdac;G9B^m_BZ7x)2t3nEA!j@%kbC4o{omrbS^t>Z!%HO%*%knZG-@cEcvzAqwIE(2 z4H5WUZ@L<p#;FSCWgrFu_-P~n)&p=?6cIl5>O?PD&?CC#ojqy4UvCE;*j3m<T?_#% z{y_4aa(}Rq9OMT#H@8cPxNNDdL0IM15j)!tu|V&Zk`k1XdX3gABt7=;7Ggeaf3SdX z8GkecR9q~=`i?jk#0~v#TNBv@U)?-*q^8W96O>nhVKd6gL`rU|s&@HEZ>S|X`#?Ah zsyWoPSdOUSA^Qx^H_f)=Nr4OI^%x(B3U#QZKQH_JJ={o4@`LFyaYI387-0I)DEORB zn@wTH3m`k^g~J36;?ZvvhBtHivQ9wm-H9=v-#xU-4Un_<&?JHHiY7$HYLN^oepCbG zMKP%uJtvzn1P;4ze{LbT>2=#e-n6Q?#6jR5;Dh@>)=MqIXc^B*b3Mz$B5o9vGmXFx z`SYTzV0;%*itV5$;^zJD$aj0*L!V0y>f+Mw$0O`Q)k~I#c`epuV@4XrnNAjCFLbM= zu^HmuzOUQ{Ebo{Vv(6#nBMrLDhi3>WW49|TsUFLDY5+yUM1og$mh26h`SJw(3VTd- zaMQsOp=9YVlm>^<$hE3$GohX1g3K;>v_CQGq)w}c*14IGag!Ukpcr37Bi7-w{WAp2 zxFU$q7s0e|4v;I$d;}NSQN9}&j-HHGu!l&vg)HtQnhZDj@5B$!a$8%kw;pj&#Yuso z`oOg(F;;^ZA~IymB&R1n#8E{S>GR@-uqfqUv#<UC89h<4Y$3FaF`o1Sw27T~vSelY z3?T?lrNX?{!73o)>FbMYqWd;h52|8-ZRd&2IDC64OLV-K)eWxT#Cms7r{#+<27L-o zV({?7M&Xx32Kq~;V-wLXj1I5)!cv=3+hz>LIzD-4ewSKJFxWA4EWaUm7p4ySk{9Ad z|M7|d+dK^uuS$0?M}}v2VJn6<Sx-}2^6RiNH`d&qLB_Yg^%^|Osh-lD2WUXTEayer zk)jD!2cZC=Rj}JMuiSHV^Tz>OJLUgYuvqSa-UWRB{9<_TudOt8ceq@`GMKK?IQ-4J zB~<)aA6QCj89ze;ID_9stjhcsPcH)0JNTow>-ccz21~Dh*o9%7fWE*Tc7ntoX*g%r z4UXd^3fX@+2w!O@fPVpZ*d!>XtTsUi<Y=YQujt&`0K5dgzD>^_>avH;AGz=f$Ev~( z3sA?31Y^=$?c|^SfD@RZMl*GEW$!LqW{~4PSRbnQGswYws2*`ao}p@eYu(lHE*;~7 z8j|6u)P7ERd8M)Uh>iwQbs<vWj}>t7cIhqxiWfR$5%YubG!WeRIs1R^Fm#FzM6{lt zg1yK?V9|z>)`F<-x;ugt1BwQ#Rpqa@OS&Akw_kk#fEHlne}&B-EMU#TK91hn(F_DL z%ccZj|74G4K*)~X2IQPTBYNC}M_ZVyN6`e3{m^pb78(T8c^7f=;nnY!_OH~yAL#-f zB;WI9jvB4MBMqH8`ODy|jyxfNSIZDQd<f_tWZMx@YSzMTe=v3bm&zZ2{+lGv9KS6R z2hV8lfWR>>YwU>N-5_O~`@tmAg$qhm5H^q1Jx*+o{Z1ctW04|jTz5xoIS*2!9w6J+ z+PC4Yg0t;alZb+4qiL@=4Jn2*$jALrq>)uj$&olHoN%=L9sU4-ZF`&3MS#*Or35=j zl|vXnRj1#U<Rg;!9jiA6E-t(uYnBvny36UphsdINd^hm>u9R{$j1kG;ZCB~EKMI;> z>FasM0yy&>s5sr^bPZTqZ;4{uM`yoEX;NQyP>mCf%rE<3wE?0cZjW$DGH~#U`rhSY z3`blN$T7JrNoi(h89Rt=GOM5W0$ma;nv<|vQ}0KY)OUZ*j4pX}Np$Q{#T-EqFj2Ut z>&CTo-byMOCP@$wK*|na+!sklD2&E+gLz@Kb40rB)Yd4-0?>~0NXJhq7qi~fr|SiH ze&H!tJ{5@{|AYyA`%(@7E3DI^bfR4YEOeqI<ZHNSqP=Cc?{jn77B0+W<6t7X;>ZoC zZeRkmV68;qUj%GX0%R`IU4QrJu^(F=xgbh*r9i$E2f@Pt^##Zg4ZCagjdTV^>h2QQ z^Bc2@J|Y%SDzy53GKkKQ$$y<dZe#r~J(>CpD}4^POO|Y=$_X8MAK)?F9b2&WV8Uah zz@u*#yEjMRr4E~{v@MS{a6j!~a74ZM<%W?^gI-OzrTk;cJDUu01y<)PCd2T(pL&|8 z^`CcCXUP&<?l6y?s5(7ox>W}+(@{*|VyYS8$)1<DO!wb0V*0m2---h{Ls3uYlDyXR z?$Sx`6r6coMm|x9qu3Hs2Y&mbxAi%G-!gX;qeJU8DgRLwE)ai005Ga<@aaCZ1N(D% z(E9910~zIl4Eo%J1WUnCy-UbiDZuE^h5>{#;2E*9%FIe`#)ft;vw#vUKM=nmB7M?E zN(WR&JNYxw^0|!vrW$v>xPF_mV{xVcsWbHv+mzpK1?y-oNb&=_W*5qT{a{Ph)#S1S z*k@nkscU?vKVDR5wc3L|!7%uqmh$CIDw;FHlH7TK+TDm;^r<CG-%oa-6e2P=XXo2( z&q{)yXpB^S8Us1?+vIIie-_3w^fa9cU(amoy)W#3M%zlMl-9ZWUfu`Vb#MSC5e7ic z`PRC7dRUz8wh|id$t#6-$+xd{r=*a#!QgcN`*z=Qz@^*zapw5?L)?z*?x-42dA~DA z2Kz)t8u;U7ZT$mWK?zy--NlDFgr*gZoQsDuOQuIYBO$?etKlzUb_zqBZ}uTzwu+Dr zzYKUr&I6VT)Z#rgSg<I6QqQt@-#iikq|gExqp6x6)C<H)f7{9Hq)0Kke->xlK)n%Y z|37rw_R@(DT6=rkU1lkAEBDQ`((j1e;hbIo0N@yl-J}vS!;u#WFBUY`*B6;-t3jVh z&IGQY31DY6d4O%(HEBVu^36_e@X4>XA4yM%_)LaAx}yBxMiprHN`95i{vetA|9Sx~ zzka1hJ*wJ`ki?#K8`O_$9Ppfk$SDrv0&-cn@KWwo-t-g{(~LE^)3}QRaIaE=IwY7+ zk)<zy>K=(u*3?UYe<AqtIrjVLbT4L@2Ut{eo_{Y`8FYiCzr0>g=v}Uk_t>Mv5F&at z3j37L@W`pY6_b%Mj>y$?KKQ$=cn>c;-4p9-qRZ$HHj?-cV@=tWD_rI^dNvt0nC*{> zE3oIwBYR-9-W51c#r1n+0|42lKCyb*c(0ld<6jIaQ!)L(3G*y>RD5e#=N3tN#U`J_ zbWRp<d~?@+fCI=}%7i8`n?+D_bCn4Vbb<$OwS(vxbJ0!aos_?vvlHF+^Y6z0Yvhxo zN79eoF9qD~x*05C&loYB5*xnXkSEzO&)4q;O|6)t-JsK^ppEWdn?pKOxq+6RA&7*Q zx{g{fp*US?V_;VR7mhw){*bxA2L}syd9nzwCGD7=*%iV5SLh>v@lMP`b3u(z2UNt& z7s5|a?6DVxy;m>ocAvn;j`6@VNVPFC2WMQTG@%|N)FIbQ=_BSg<~ptso$f^QRcCjY z>|n661$B?_!r;lN(Z<};<Fh!8l4gu{8}uVdMaZyHb|m*+QEd^pjZ~*h08&32*L<(; z-cb?*v{!*lruOeKbz6rTa~5Jij{sQtux-)(grb4WU;bdV%~YHk`ZvHWtQP?}KiF~k zT42XpT)6XHOWZT7ATWUa+_z527(!+?$#qy<DTN@SX*(1F|L$8J)KJByZmfPkEIt4H zZocWL{l{OAyS1#%v=?)>_Tw5U%;Vu{FYrxLY#-+{Kcm8WCZdFW>;Vx~{IeMn!cD;J zLEhrtjZI}XgQevCDSCk`$^Nkw=jXAZu#{@*FpS|LRu{odzo1~iu!}d%*1pxjK65&2 z4snDm5Z4+(9NqlIq(jOaA0lsuM0Npyprr=(A~AOe*J_iEr(E)Zj%(%FV*`n9=m!D& zPO2yD#H9JR|0MFrhg0i&)h(Xf5jF;z2HU4&0+fhgO7gJ>_!m~s!h4cN3-}DSM9qC@ zZ63>=9GeyF)t3uBNY-?dnFM18yfgh0ARFknfH-rh{i2E(_*72!z*r_x#`Il{891a) z{awX+^)|zgT}NB4UAMdF0kw;vP8Zj|^}`U$#l~CmBIlE5Ax@TKR;h9o#R%Br6BmP< z_b3vZp^Yt?qqND3^8ab+D&wMhy6|P`ZlpmvL`p(hB@9wpSU^HTB!rcQMMOYa8l;hC z5fFi;mQD$YrAwri?&iJxfA6RLa_7#>oipd0=XuV|3NpS@Q>!Xu-joSy@zAvH=puw_ zCv=~60l+WfuKIWSN?rSthYyM5N5E;V!1T2GZ2sIq4%oTB>lni7XLg;%T9b6X!KP*g zl=ljXI^x6DbP&`eF@t%7x*Y|ZTYwcab;OgSc2h~eSPTs|-$KaScyA5r`Zrp3fTs=S zsh5L;hOXK@wvT=!3&dxR8@AdCk8yC(LY)sd0!fH_eB34vX%QwQ@PPpy$}2dA1R#$j z$;(XdX1lj&*;}LjE8q9@clPo2m8oH};c{h>NzkK>K+DJTj-AQxV+)j8{D>!;ZazRQ z%_t|8@Wl@t(Ja)BSLE?x0H3c20Bo-BA(;9V9gW7O*$x|=re#sd8x$S;91<RP@C@ZP zksS@J7fVxl$gPtbbMZwicB%3ANf6Gs7XoZ|y%c3+QlTEn0iO1-8|t%_%O=2o1KE-6 zosUup20sW`A2(R*BzhxK;Af9>FQk5(!s3a4LE;6^`6{nJzQtB$B+-mSQL&iilJTPD zDFvEkg%l63^L@%FzxFqa3w(NAGmg|d-67x#+5f7DzKM9Y#|KX@H|Q(&u$-)1`gG&V zkI%c%`6sS7nx?6C%<@|Qe%g68kq4G13KlMUq?FajtZaLC#G?#DSLH>-yoy|;b$8<r zK(_O4G&1?^ZQSX3?KYKkz5snu_3$ivRO$W_4Eq!z++-e6r1H@<*uN?!<>q*%*u4`L zHQ6xqahoM{c@`lHI6Az%tcVxpvj@6u&&}Z$#`YQsC?P8`|DPD5D%z{7zjf*x7>YSV zoa45><Uew)kEVDtpJmF&(#}T6GRKo+F}uuSjVU%t$1~pl_u{#KfmsSd_~@;`$2BfA z;hX9APl{-98)}ULov|v1VbP-g`KZvxgWW0(jgErzjM?6m7#x6IyN8WZr^tM0Dt1Ct zJFj3d1lQ{+-9NkwJg9AQn0@$mV~O@|m$GLxhR*6z6`qy`2^?&?T=RPitw|0GQ;vIq zO5W8yN#M*K3CiBeWHU+>{#Ww6DKr{1s^G$d-+_RV{Piacp15n<lM}_n!F)1<1-=U- zR5H37pb4QBD{9+XGB^1&#*1c0mW_rhiuBAch3(e&_(JRWT_8Eb_6S*Z`~8$rHezR| zN$A}I$i4?!zEk?HQNd93su(fdDrln6)#N|@Q9RQGhj-B|K$hP5R)ED<Z1^f}`BB@* zY=82IYSq?j)T^J4#-f?)^?50&xkTT%QGJNGh$1}7Qo{~(E3R<rV4iSQ$fd&weV-bE z9c=dQ$H&$aX`{fyBCM<*=S|HemBQm$2HjmyspK9L#ag+f!MrAU4G}F`^WX(sv__}i zXF2?i^~LeXgZ;_TI?VWythw=+IxC^VIw;pBAFcHG3u~M|Qh*>*H_?f-d)KkENGpVR z|7ZiabOW}!^KakHO0%KvC@;HqJ?o4Q2BKp(R^M~B;MO^Ad|Wj^{A79X)|6{}mUN{9 zv>GMey~CTgJo3N;w_Uu<duPv=CZTZey_w#GU{ju>w$`DK;JG+9lsQz2L7bl>0Be{s zSY1Hjn}&Hrfx+qG>UVzP!8>T?K$6ve9fZ!;2ddo7c&Fa6M*FWQ6r>ZZ;)4jrYiJvw z4qJ(@r033f{#a0Ph0{DBAKKERgiuoMa`0#9uUP?jX$h?NV6h?I!;D)~f~do1fvkNC zlHlSvh5^D=YY9{Ym;E0wC0dJ~t7!y>pV-E)4aeq}tJVY3HqrP6p4aBs+xWnn{+{5| zd2QnQVVL`aknrrdY;UnZ*+)chv-Ea?!}HjP>%I91>IYOBWFK8>sJ6SKcQcv(NqvdU zZo&tA9kyo%gqPb+0Rmp^i9uMBX!*;~8I3G+nog4&cy*s+O9`^G09d|UA_qz@(~5kr z;=vfxg~Ksit@TmV!=WohhLVKt^UHcHZM2ZdpIiGE$@hr=Tg8d1`qY*9DWcovd>df5 zd0NUKzSM)8vDB8g|GL?i&X#cio5+-!1P4)la>AtiKt`xl91Up*!q89}>(Xyb)9Ti) zXt)9ZM+IUh=(JB)Ueh?VNmwersRP!T_~~z034yy~U9=#_+vKyQ@pYzvxlnTYV5`}B z%H=28^1Yw2bYGJTxM0VczAcH7%y|0qLixw_9~eGRxPd;HJoG4dA5laOY(clQ%_PSD z#s_zszklMl^FF<TJKOF(t@xDS2S^KX?`ia9equP|k>qm!>~RWj$I{|sPd36M`0ysO zXH=vmnQ9xaM?-~N%GtMc=NbB0XZq6z6;$fZZnIdShIuPcRs1AH@q}D;FEDG>zUL)O zotXI7NcSKAF>_Bo>-*V?hq0bZ-tal|U|o6sAz@lEd-KwXwcZab@{5swbLENTW1f=Z z)V9Imim-CX1=lp+G>XT^HIGlVb>xdZu0VK*@1@^bv7WPl^@y7Kk+cm1(7LzWgJWtC zWu=ku*gt*nFns}O<<`14P(uwl(Zl!_*XH&dDD3^&xaKW}X)3<8H%IEm(fH7K;=?`Q zKV*9kol&Frg1g&*D-ENY{70`O#bW%&VexyJE)TqzM9ILQn&rsmk@PQQ{&tYD6|Lg^ z%=}$@`N|?IxZwwC2D8lru-+ALal#1?QykK@l;5jgrkF||VI0z{41U7yrIcCCy%d27 zaut2Sp&oocYa^hBg9(e_VJFQ>>XMwTf4%kO7fJPGu}i6s6o(&9(`oRdi~$?Ee!(uP zKQ<R^)M4BKB&`K~u!bV-HQY1xb9XdL+SueI&A_k_jzVE-fqr*6=R^4pCtD||b<K7% z&2Z0<yj}(VqZ4366H(u9-919&9SRS@@f2Y<yV)JOimpS5Rr4~xxc*GQ22Kvp{+8aC z-((#1B;g%EAhh8vNPJ<rNK8o++IV)R-Ykqx$ds+AlDM;|NVSIA$S`IlqC0ZAc$)QK zaV=xo-ePJy&kUas2LFk@Fsn2%3`@geKPOR&7Qo~Jc<eI3xZ36U&irWNFKCjogtjTJ z3kpUI5aK|H`;MmUjh$_kbHbVf?dRXKy8WS9{a0Be4z+dEQB!lPrEmHM|6A;1=@k`9 z#>A?AqJPqGWUG1cr@K&!jys>8UnSu|Z}EXj1w1glMQ$wk7YPtbgX{T~Fq+toH1IQu zo@&^!un1-+c9F#-u9FRx8<5Bh!|-=|-JoD%v+$m!ycAo><bmrqF{tr?m1bh-GURv5 zSsS*Xnfq*|#G=uDiLx}4?nF|y9tR%|JU1ldWdLIQA(N(-mPmusp%}#XOv#~)V(njW zU0Eio(nbX>l)u++x04~9k#y82QvR5&oBZgy$+SxlqhecI=OWJ@AiOHd8=k`XDt@qj zdm_<S5{6JB|Cr;T#VXF3hx#3Ryxmp;8&IV-liGh$f2ze2q#04l)JWgtdD{DcQRk}I z{QfmuE-6!|q3E01y&dOtY-}s-Yh&Z+hqw^m51kG2Z;;?yAM^MnZA@6|2w}{(4MbBH z*N<ZDmVOkcS3UZ)6n0Q@mam3=s>hYl&<^`#f3J$}!!~4ZkfJ<`Ew?$K;ak_ei+8r= z&x8XlN@u##N$}oyj^wAWAgws|pO7n<cjrg5xA?FZ4)lJB;1PkcIqb|e3#`5c-c_{Q zGAs{DX**08a8$I{K-H2vbx3dqcKe>^5JgbrZa#5QaViP63Nxo3RugpHd>PjJVkCYQ zJ!*htVfh_vxpq&f*))<@3s;PUX#4GSlBNb<h8+BEz;Vw=D=dtri_})vuzp+QsEj*x z=3zHIMC3PUKuWI9?x)FA&xDk92ial~UKUb;1Lnz)7})K4qe3kqB9hpb*IfJ@UrBop zH<Es)Q=sNEoxAM(VzEK>2d)p+-D4m2%J1DZrJItdsK=1$&L<yE@Ah@DQT$m7PLOs{ z!Gn`Vm({YxH0v)-#ATyaP3~-M`SvZn{8zQ!?EM>A1DxnDx;sD8zJW)Pna}JOOPG#= zM}8VHQQm4wg5uC1yHR1qZyM=@Td5Q2AUQRu2v;<4z$*FD=$*g7rnfQiog+(v{T4E) zcXlhCPkwAT)#MXssvxIM{2abWEZ~>nO&!IpV78UO!o;{(Mw$9<5Ieb-V92Wp8OM7X z{hS5)wR~KgE0r0r(!m`Rb>&dO*&Sz`YfIx8Ztt)VxL8$k&MQ`1ty*WgeHF#4+QDOj zi1JE#oMQF7HA;^&*s7LpT5CnSzw*z1Sl3(SiiQ}C#>SUj<;zRrL_=q^a{l(oLE6_D zm<ax%8SQg%NZG`L(*WL=$e-1mulr^+m9tLe>rZ7-%p@_Un=);qceqbiQ*q&0w2ho5 z!(*%O#lJM;E*Cw|$W>NT$?4%naOUU4JPR<!rS)Q8mgrBWrti`c^osJP_~Ie_CMUpS zcDVMGWzh&dj1W}!BdFn3L}fXlS;{FB92L@<D!#53Zthos*(_jqXsItoXRhHH7t8kC zPe(7ncsP!Ng))jax^(TKL;7?5Bp1n>;;BBnG?}pxYQ0!DsBHr)<rM{7Z=ad=CS*j$ z@9&^WyBcQiKz3uX)nKCND2}MHEQeR;YIvqDy^K~~Ei$zN^R+RhJMra*DA~t*?f4*& znHoRt@8(x$cAMP`z!6?ngBa?aKcHm;GEC|!mDHPz?*M?_^5cF?$~MyKd7_Y@W^O+D zlb@F1CltdCzR6AcMSsy^uLqlDH6-a@mX*O2BFaDI`Z%pp`gOs&F#L;;<*F@z{#h;R zEvw4UG37$_jY*@GMGijh{v1xd$*%Bs@rp``DqLfs`!_h<DtP0lDpv<6A5T_kQMlSl z&uvA&>(=<K;~*1_#kR%389-j`*igu5Tigrmg5i!7=XB#f@Ms{pZd&00G`6wN>JA$4 zbx+_`EVW1~MV5I^K^L#AWu4)t49LaIr0wzuf>?daJ{-oAvZjn?xru1HxlIclz7;tr zwx@oXi@tQf11!)D9$X&5m$*o6{{%pOT9!+T#gLRUUA_7qWv&atFyqT(>^6$S!dDY# zBd0`Rc-O@KQx2~VQ)Zqn@Q%qq$ME1u1}DxIV>hMaXFO|bzwAx|5uCkurD~2$AX{al zd(W0J@AeSN;M)XStzu6C_jo`!7U_wUDw|}*dq7PW#jDBlx!gaWaHMYRbn`|+zcI4M z%1WW07~nhPaQ`4#x1C&R)AyzSR7y$U;CCDIAr5-LbGnJNagDTsbqCqv$Qr1yjBFYG z%-}rjK}UGz@LC!-gAeB*$>89dJ_{gO>bGX|r?>2_9DjsL>>|n@A>MnpMj#yvSK!!P zMqGGTwF{vf<bN%H3nfuLAm|jLm~1Yy>TyIfblzCIk4!ez#}#;!f%vi5tGD=uJ$kv3 z?a`iN^<ce3j`UkqpA%m+%fA?=&BodsHe3<1u=cnnZ=3vAk{c5~i<v@?e=~{Vi>|PM z+v?PWE7cT|uWRbjkO4&h^KfWvm|8762Yxs~Z$c>sijKW%J~Q0aYRs(L=A+j6t_4}r z-(@x@?xJQZS=jRnQ&OvS5;5Ub4gr4@#)pSV63tPz9-_v3EcZ+dO3%GY{2l{*$_<&} z-Hdlu=cpiTG-2GAKk*OqBCU1F`A@$-&j`v=jBNiJVzAGw&?aDQa(&KR#JYfNIW@GF zJCuOSntEJPw-lRxm`k{?x%Gx<V~5T5&3u^%Z}FYablc#4fKl%W9H$O7C`-#{7^H!( znCYCJ&$WC5Mx%{)#8+y!MW#_dbxquNpio=-8^YVPBi^^>W5JJaxTc0ZvcF80Hzl9m zk3&+Sf)E4E5BufPu+5;3qDU}V62>R6)jz%`2Q_wb4Cmdrb~D^NOb4lhc0OFeUjfJ> zW0FO4_+p7vlirYF_u<vR*csHHj0563ym%%Rz1#BC#{=rPFE+Dsr4H{B@S)2<JeK;^ z@wLm~SPoGnBw-?`7l)vZXjWe88KK{uJ;B9YexT<-izakAXIH)(cODMZ)H+VwJG!63 zqVcP4Ai47TdJn!PCFswpT1AB*>H6AK-)JD2cTuY;Ld~h}Q|}~lEy|f;nzf4#S_QI( zO5B3{`k<210aRZX(#c|r6|ZVxmn#~jO;hz2m7hcYpn-imT1^#YX(=i#(?+P8RxQzL zNvbiitOr)@{R~ojf*j|d%tQ}~`xQ$5D)91O5{4G-)bE?_ri1rzWv-j!#_X82SPg|O z8X3xOp7L<%b*v{TG`KoGU;&*iV(y{fTRHlPK3GtS^c$kVnRl5`khVH$-D^+6@(;m8 z{gw`J=R1lAnQUwT;OjH?2XBP|^v+hx!jCgBNUP${AuHyBsEy+En2J!9kwwoXCRjyy z*2c6cZ}Ok++IFZEea)*}s84Ln4xNzhLf9oi<_;2jw+DzBJZz>I67V&Ea=ht(E$sQw z;rhc8jP;Sf_L#0%D&b*z_ek)yw$I76zPty+?^hFb#QbxAk!|s+?8gEYoYP*<Ucg<y z&u5(D1N!IBC8RDV8O=!mK;&C`0HLx0a@&)WqoF`3QEm*@rKj@VJGihx?}%Dl_{~^7 z=ic&8+i+ep-NMAzj0}ss#*1BTIWITSrzI`c&cG-=N9roFrIy+$VF$Y*4HFe`*IVoE zv`-`^0)6@h01yZ9YgGtANwsGK<Xy<ClizwDVVH9@`oaxOU1ygEqSsPXFHF(n8Efw+ zD!6IFU>+fVdu}311?5P`m>8r<7T_2WT^ZaDA7(9P?814-ITpkbvXW08cHa!b+A(L_ z;~%6mYQHG?`xaaVnzmz918!<DF+Hib&RTBJgp`fMU*M@Ophz0!(;NWuT6nya!)re! z`?q!07A@o<7WH<c#4XUe?9qCVY}xp7?|J_tO2L+&ahOCYDljiqKj#92=xRMy)_1>k z&CN)1vA7*GZrug^Gxd!Z2-$oNW{o*j62*7Pm4w9sFI$CFw00&=jppNMWpzPR`f<{S z|1Ej^G5%}C=0;ZQUgg8Z8EvG~oU$nO<7`j#Z<6C#R&I{3BX7QdWQ|`nHDU+6oj9~T zE)(A+8?+;xg+h?rR711G(MEAcapWl0Zck7JlEwZZ`kXJ9qxPT>oBJkreVuT?^TXeP z4SVLit>T|Xf%1e#B&u$~e<I7fN9xowXNT?CK^r51_zl9kR``}jee=t6n0{(}7RCn_ zl9i;dJ-;k8(>CIGJ|x&|yc@Sa=Jc5wbac%8pEDsp(lPO2agh-JRNO%U5%o{ssJ>_) zJuPC$8_8zGvLgHR3wtDLx221@lZEp4ozH(L(Jc8gt-}ab%b9<DwjXd#RzAPnfwyr7 z)U+3110q&B9tELjOjonE{`w%M&$(-8hzBhcM;XT5jNi(Dkc}u}|84W~5wIlFu4iEP z=!A@U6#o&3h5Ft&zWm;}KRM@6+WAUs{yOpJYklYDj{%z?J`JrEe_R!?hP0~u!rVZw zq(LU!sZQ}befr@n>{HQCD+u!;;&{D-jp!Q&9j>_W7YhLLb#^guY4iK8RRjg28)Tlj zL4BElOG&rg=fz4@tGmrw2nbS{U%aEZa4T`@xLM)M5YBw&8Ci}GKMLw|qX4<^u0+pb zMe;7$J7AQI;J_cmYQIyW!=Otzm#;JL=WEx?OSL0|gEEAAI0h>1xi&XTZiAJ2!22ib zCVG1&Ana^YfBh9jT3rj<74*P5g`inF^}a;mzXJ+&V^zXx;pHE-GOctMx<I2OLbFUS zU4V^i!?c204R^Gz**bGX$4hiLZ_Jy_q<7K_P}H|0$9YF-ZpPd{+J8&S^Z(Hx=?C%G zLn66hD#txcdRV|q>N{nNfwaN`ha(8tU!RnANIR%k!H748gk5nikNiuD6kRcAq25g` zfc}p7faW%N9HS+#_~YIVh+7;iK?=fG(hnO44T2*oymZzuUd0V$u3lZsTpCSnFUX;H zI=+xb9{X}IgG=&)rdA+ny?z$fr99RTUaC#7QPgzBw?LbuYB@WL;CxP-JbuXlB$#|e z(_7{9QEe&2(wn=?R;YZ0!97wj5idtaff$nnGxDJxaHN)udd_zC<{R~qe81kbwVgEN zW&H*AOl#<^`k7Rw>JuU7x@Z=YY#f=pnd<>9u&4YE4&Y!-f1OAw1%R1kIK3OT*<SR7 z*Rya;{L5wW#uMPs2K?Og2j1dS^{Y?z@D+FdW)~|mvTihvz`*KeC$RPSdRi0v5XfVi zJdRK<?5M|+&d)b{(hEui=SK-ItknP7V~oU1<QiEPSWIgiQ{>{&NdxXsQ3i>JfLzUc zo4{a&ja8Fzb$3s$>ssL?vAI-V-D_*0?^fAhoEdoWs=>96frL%?7f-H$uW8vfv2Gj~ zCYC?H6wGpu!bFwjYJIi}E3ZTF^`KDn&QtDOaC~S1*pyB!|4zAO>r3=q6V8Q^gC|8; zpkL6hx@}u|Fo?Hn2oCs(@~X0B7`3TKyk*-|h?xO{ECI#5ljZA(B6E;iv=m`mM_Rqb zsr?@FY-|QPhb~#i0%`{YiK6br-hn1LCT!Te+X_3W9pF>(Uu#*lk=xY_Ep?x@jId`0 zk-R#EZ~gAH;PS(-6>+A9>iUu70BTKpgWvM_#2m+M=)mPF0-ChBCG(voSfX*zweRo> zw{{RD?(?rzmU^P87EM7@&cZoAxf}`_tS3t;PGti{)XZnI1UlyPUtZ_`!1+?6HdXIi z|LNa~qvvTx5>eVKGWe1Q!X!fUNRU~Jm5_4YSr>r{xJ{Vf&+3rDKs{H9OxRB+`vhbH zWae1E)W2y*(jo8j_e|L^xlN9SWS_qSeMuL+uKCmy_0HXvY6~)?(<CG4e4HJM(vDtk zya7-{L;3IxQAoq4j1A`Ww@L?8Xn1)5@#1-2o#XjE4nJWWiR!5Y(az>uucqJFGDv&{ zzzN3jgEV%!z+Rv=@h`5x7%FLfVIV$C2#mt|#zhW%@wSPC){gg<=+dO*lAChr3AVF` zrf-eb;Win~$ua?sFM5lp0G5mW+><gGczq&F0szW4o$x!(K%)<4a3$LaP^05ssdeHX zTU*$--A_5pCc3J<*{P+sx-68Ks!kGdvd#a2Nqnc%fqv^+H2<!s{?@}xdYL~FDt)8o zS>o;8RT`WwZd#zOsu0&i(xFtZBpfohg9O`i{(NhB0-O%s`Uo*BspYDo15-7<$51i= z1<QyS2?4x%VLiVnTvv@^uJuZuD7`-N3lO&c!yD`Ug1xp6)G#{dABQ97da)XbBc$q_ zCg~_iBz1>Q*aWo<(#e4GhBi%QHLRrzd`bESYdIy4YLL3yLfTY*uDU9k(cYMS4Az~R zrw`NrRek&OtuW15z-43IprG;tEoHSbHq#8Z*_Zq<unZHmYk?$R(5l@|Cg9i}tyr4P z4!&^QLD~oq1r^o1rRb5z^3ZroD1SkuMTl;zfUc$e^3I#lb~i1WEb4>FIiwj`BLW`) zx@}%I>x{91j+$bngPHjzGx7MlY@KFG@nVa+IVd>}yv?ssa+QIrnMyHO%@A~b-Jv+z zE{z?$%pM}%4=TbyJ@gps$O@yZAhByxvMA3a%-1lAHElPYxuaVq^e;7z3jokW-Tp^_ zX-&K?IHhu6Pe=P9q(2;bl6<~`3)=>{31c)%<b4{9w-n|4Q>7A2BB4&5Y!cLk-6h?* zCQUdAj{$(+;wS@GcSl_DC4>pjV|_GU7QSQmaoLC2mxQ;z%7+6V@{^6=g7QZ=h6kXq zkSLie&%#eW^tbdkQ@$|uNcl4fESPa6%F%G4vE^oAeafL0B18QzLhubveS+%5?2|zQ znfd^wIx3v#>zCO7kuE1hBbO&qyYw2(ogn%4_3Hh<EhsbieVz`>m~Ao(e{MPgN(*f4 zlDpmTSlpOEb|#vg;akk<d6oGtjK_maEaRR>P>~!HFyru6i@BT?N~Q`XO@!VV`iY|$ zVQAWjHa4)^TN#IQT{WMS?i&d(JzWmH)Xuy?OBBLg+y}R$hrl)Wz_KF?eDl$rC;knQ zyG&>@JBbaRQXakjA2~`|npAvudMZycQ(wufpH6LdE-V?ZL}i8#rUC7GN5F-b>O}@w z>xqsyntqaC(F4pi1Wl9lbR#eS#T#-Zo_bI~w~@IxY4N+Us-Aou&W=DKR1%PWv}m*x zqU@fEiJ>YaVu@qhxN5}2IFww}0Ft~(8s=DQC!qJVVB|-<3+GnA$h6a2NeVKi(}i)D z7gdBSW}Uw0G`kGMV*!0v(z5^!+Gg0S4#XfQoTFmd%Wg<ks*^q-wfcvf>ZdnXgrCTf zPW)j@Uri-pffy1)#t&fe#hK&|7jUyBlgIU`{1eFLWmi=hu$GE;j#k_nCT+?!QO*_U zRUWg~tW+K-tRmaKtFi)c5FEWBVkKR8gy#Rwo)fM5`E0PdHZDsv-~VSvJ=G&;IcN~Z zTW*Mv#IKfe?r1)>lNA6;!Oe6~dupa%R_2!xc6=vWPdateB^~tUa@j^FA+$z#`L9gs z4tqFo$$k7SjOSpXZ%Gxweb-%lfu_Xx0CGFX?=&R$^b#+?xn<wFVbUOuz2%4M-Z1X* z^+LWDVgYGScb7A9gzhB@4{ms?S5E#7!WG-RZRdo&nE&*i7ZQ{#)%~Vl?=5MAd?_mm z4Q`U>a8lOgtV?YNP}Vh{0Cr`VSWR3N`5Vb&2!(0>Qj@fvEqd+~Dd&!ucF|jH41#W~ zKEm;vKRG-X{4mdPaCy9Ty0z!A5hj=IcyOt1+mV3aeNl>tdMAEbEZ$F^$FoO2(y~N5 z6(4W)c+dsKLw*!s694q5ijWPG9t(Lum!u>CN7egj$OHmjfC4S_-O?g6D@vZ?3op3~ z80(6>Xrj0WtrKLy%lTpIJve_UWb$L4U3I{|uuTF#aN8zF$F$`c;NZ%#I1i%IL2JVN zPzj0<jT8C%?qYzbBTkBP(G-r2@OjRg@x!0%Kg}u39BfJpMie6bD=vrk1OWB$<f7gF z_^&8#iOP#?(N6L=_cpfgMLBKSE{K2`ah~?M(cQS~bPR=J6_y1PSgY_IGP=ol*)Fa8 zWnampRD2!TLH{>k(QZkX!&_Kf*kxAC7~*@JAaCA3J^_G-HPtt|00l62t0b6Ek=T`* zR_~^-;s(WW)z*q-=g@Utz~T5EM{vg8#-L*rsU)DTeLwD;(!rAe$TbeTPt;NGL?|?4 z>w|vSNq-ai(?e*sumeAAml7?cn>{2B#-bCb$0!jK@I0n3&p$6lS0@cTxdG7o^5J)} zMJZEPpHF6p=9_wZe*|+5S?$Y&z+i-1z7p<f1oZNS6}D2?eoE5|htn36;oh+Y@*$Ph zwKb?B8lWXQlQ-T@!=63(>9ovB(WH~6b=IsZSD0a4bM?X&8^r|*moKutsT^F=;Zmo1 z3N&k(6@~R9uu#!_?_24L)r(xDa2nPZPtcigYUH!v{N52r&I4;Sg85j?!v*oKsXICN zH~elhnT2G=YatYUl~6YBtSrb-C{nmEhzCPY)FT~n77H&eHe}G;)xCIdem-lTa;)K4 ziCPboqSXV+#Tgez4QIYN=-Uf#CMzCxsu$NxkU0RJYgz-|Gf4zdc#xzqyMg?kI0=ZT z)H&|F`+|A|aRgUKUwNh{$1m1%pLtrZJNaD14~?k#l-o0{bV@6ZzRa<JI4;1Mt@|!C z(@6mv5a!S27GGe4GP{s&ryXRsnqbhEz4EOk8@M3J&vIQFFe6y4obA%>Fm+=BGwoQ9 zsZND|;L)O#2<s7Y4zNyLc^pg}$mdA0ki5)V*Q;dVcS20TY@6qPrHRKq@OzU72K4t+ zqUCM&^C0rSzB`{y0NSc`YCcuFkPE&;f3%QID~|7d#XpzLzntKr66~P=i{fp<8uTGR zfk#Ao*RZ0)XV0=n;g}e2OR!to@k0ePmE)F9M<%$viNy!;M}C9oR_NVuqX%r(D&ou# zG=w3FLH|!m^H{YVFs(X*<?;2F#4FYRM86k}6<Ar246trtaA$O1A<%3a`TZNcZ{hph z*r#${k{`@oN-0`I6xrM=z}cSrJQPl^vzqYSJG6*WaMk2)L5j?G)=5B{zb}!NIOXt} z_SG*;yjU9E0%nnJXV|3_V}};)d{F8oKf+njZVX|tSnvZUp`LyI9aI<X7i0!u>W!6H zS*`CU4~>=2DS<R_64aExIhW=`{z5%I{Y?)yJ)s|Y3ffp~c77`m+Jw97j+Xz&oh#t3 zen0Ix5cAdB7F&syggn0-rw0qj@R)t+grgApi8ZR7TJhc1)6F$xSF$%<7*EozN=NB} zeY;_Gu?C-<!Y{RVcAy~-AWT3pm()bfw?HQ#8eBTr6?Ub}JW<9k?Nsw~h}?qCBzlQX z^V{GZ*-nKHbY)9EhRx~{a?o2RaQ_Dqg(6$=-~v-I&&uqn?&-H|Axs1U8SYZ}xmi{0 z8i7I(ZF;%}m?#z5+=`9Cpv0PB4JfmLqYxGFz)$sB|Li#LfaZ?`{i%SDE1$$Sw&yH( zDl9uDzo*4_&9j-wKTXGV0qkg%&e5-RZn7qA70ZSRK~Heb`%47f$GL;eV*2h&yLei3 zgd<ECBd;tz@X=`b#waCG4}qJZl~pg>ZU0GQ0FZ^SdOl30vCV8Pw~lO!A0XbCi48og zLdZU^Xj|&YZtYwzpxWgIrt7wgxF~<?!Zj;rFJ~%b0Ww;#^?81~%yVM}&+uceaSZ2h z`x8)$4EnJnYjxdoD<`|i?Ipy<u18bv`i)+7um$04{0eV2IS!hrc%1LSjnAJQqgd}$ zB%NO)x;FK+0kinaXy0h!B-7sI|4uQ5(<(QbdQDDbZW&ob<dlrZ_0HJ*WRnxPS#Xg% zBZV}D;nj(Jv4~-q|NZ-29V2LI&=W^Z>AAX43eQnk2tNxpv6S`8riOY+t2tKj#+4Oa z{UhR|A1XUIVFFDVgZTqbBK>HL${m5-lv}EvsImBwKecCq9PYpHj~OQ*YkuPF0zL4K z^+ewV=2yUvqe*-5ud1lIZrihwVQ(2iei|U)O(ibTkE!G^Vgp!Y<wku9Fmwmxq<d*^ zgcv~hT1BwQjq*d76o+`=EnbSQ6oB>`Fc8XnRfP(BS%bk5e@L>qh+LG2HS+M_O03mn zH-;#npWX@3Uw3vOa-Zs$4*&<3J)AwN8yt$pPB<7=s_9MUS4XYle2r|UMuX5S5$OaO zrbJNpFMEDEk=6u1jF&Z6Y6E_rpqW>6CU#U>@iW?5K1I5zlYeSECK#E{OTh~Q)aq1D zPf+|nG_bRP?7$5?u3Rdp8%9-oI&|1c46@koydwJNQ{ttmtNPJZ*yx+#);nv?a4NTj z;jqW&&+t@Ayqs=gRtXMw+EUzS9mCC{!7L8z)@y6WoxFvxEh9T<vCMeZoD+_0gZ2Gx zOoDY^@+CHe5N_{0PJX7lkmJh(dnGXdvS-KG!@Pu^ie{4%Rd)$ph<hfUon_-=oOa^8 z!HBe#_4MAE3SSekY88e)38yw%KOm8b^b+yX0~ZXKDaz6{R9%u|T&xdvk4=Bo)KIBq ziaJN9i20opYVS}39(qg6)lXDuPhTpGc!Xi7#6=~6(d2QX_tC(v3B?>(L0665CK5SB zx1}_>*F`beYh~bc*!&1!gFVi8L$q1{`p3zh7)uP8u3SBHg*;LqaCwmuWzx2MmsVk5 zZmV4A7#l&Sk~`8WcTtby%X-Yt3n<|*@H8?$Y7#rKbN=uWe-dPNYdbFPQ~EXadv!ka zVr2BZ(c8xPL<eh3koTo&?}B)~VEF5hQoIlX7WJjj)6=`LSUm^lO-ig*@2zwwc+1~* zXz2~9MF=)#nTf|%FRcC)j&$7bjK*Iixwxs!2rF24AxD%UB~yEu66UM&!m%d}o2x6X zd(XnmbiFl|!$>WQdh@7h$_860G7Tj3BgO9nyRK-VYfe^_N6E$w#V|Fzfqg*(%dYC< zuOJ7#N3+U*ut6_co&Q|<%X8m5k9N5JB|P>l<}>quB|<@e(qJ5@v>;Sm$rQ$lvvT#? zWAZu}Vu&?of2Mvzj4<h62E9EmC@j{qdozd+dfaAhT10Y>VzmB=`PI}riRz-ChQA!G z-a8sBO=&zxyU!$uH$@N+C-vw|-lxR9??m{k;pV&k$z+f}to1$>jF0(6(-YbxQO<2J zt<pVU4P3DL&#T_eZ`dSLVqx^zTj%Yxtud7$9g(Nl!e(DX_R#BE;aELC)l^vWv)+tt z;x%1O-mj7cVE6ybjge(%ezXe!%RQ4B@75ZIDP#;DPZ><W`tjg+Al0b}|AQM@{riV# zJ`IF{XQAIWe}~sDE3%t0!4GGMz0=HhC3{`A>EE5*2avCgSe1q#ye+5HX*5k+D{L)p zs)u$ZZ~Tx2NDCzrXE?LY%`K+TAji@v+S16JHzHZOvE`9&S=<M9H9nppZ6^PXJU{)G zcqra}rgQ%OKT@9J?`N<llw?`J$|8eor@z_ZmkcT@oCkGIVx4-45Kf>ejcw7Yi*3hm z2o~+ywGAHdDKGOflS@Le1^b!P>n4GeAGNQ|e+mcP-;Ap)shd2IkuZesVpBAa+!8)= zpe12F6aoX<3@m&PJlD|w1_bCkxL&J}h7b@C^m7p!5cU}dtIzLPlpm!?{lG#wk_KDO zvO#(#NxmSXL_5_Zfar=P*}BaJ!9a{0SkRW~2#8FNk5H2+R_$?d?4$wBldve!HwQGH zkfEvrH<R-Jibv!-=fUTwrOIu+O%A%d^j$wU%GgCjhbnNYuhM-ydm$<!vLe$pipK<~ zuY+}scQdX;KYzp89YDB6*n?NNdz(4wVz`a!9dj}Cx+dV8;_gIh5+C%(VO<kp)z=P) z=D!Bht=8b|#K=4HAk)_Ziz?EP1d@v|>x8Nq4Dw{3gs~@P!Eqfu*Q?BPf9-FzU<mrT zLJX_!H2AiE%CUCn*FXSnL`{8^Xuesf<-<q9AbgR6P@v`W6(#@+0S@LJU)j66Du5dB zBOO1IKOH#blxt)MPxvUHK_cz;5eHDZM(JLae$D9ruhj1}9m1Jc`|+pe;(s+s+oDH( zcz`bLZCvZLzEr;JJ5EO{_Qq}bA?{T&ebTbQcXT~M^k@)#=G`cr25VuAF3OV)^^5bn zy>-qP*=%=vf7Lx6uq?iwOf0eu5BS?JC`-}XMX>K`@_Oh2ofl(oGYJlMv*+3H#W)fn z8rcIrf(;h*ZD}zR#l~fM^Cbr%!Xx+<_mtNS3`|p*QUmJChMi5Tuu!MZ?G_cL-F}=> z!ZkmZ@mp-bLrd@Gn0wB+pWRYiV2*Xb$OJ?<SA&RFz#WpTKwu#YuDp7@(&uOEss`7; zceQr{+I}rbC|F~|_nJW+${M<;q_3c<A8id%VO&;oPjPVHG#Wobul(zn7Jcxu2Nox4 zVucMa5|S0RC#<F;x7`f^9?~z+p`Yc)_VC3!>F3X@d~P&Bmtojkq1OG%lYoW8_-(RG zl$Ou-xOnHz@RO8>OURxFpER_ur~?t{<D>5n4zT<75kV0tB%l%bC8NdV#r*z0%6ZTA zWS)4J3=yY(MPY$mGDkS{`_W+i-uJO9CXiSX*9Wb{TlrnZz$XqDdV&xvP&<q%dPWZM zt{0fim@oRL0E)@(EY|7|!69tSl@OD$sDH%9YWR;|6T9X_^_8BAXVv&%?L@`upOm}J zTB~z|PcoAJo`Ch3nW1DumC11qrm@uBSZuy&2P-ILP1DY8fi?5Azoet>xxmglCBZ#W zTQo$PfAzFbjp2e~XhWt??_&hy8|2VTX=hR6@5wu(i=jS5NrY<$9$;lwURA}vFXmwn zpL@h{0nCtgnxc*0h%G;a@8BMq@y(~b6`XTU+oC@pmjvjmNN;PP#ORi}^Nez`oH#b^ zJqUe4yuBtMQU>2><O=i&VKWh3mg%Dh;VdfokE`??gDvUizu4`LtVZ^U5!U;qR4p>x zrFwr7NW3R>OPTF^6~6=qilXg1N2x%Q;Ex-RYLC)u-^Nl2q56RT^9fG<ZQ1*~>SwC@ zr<B~#o_;}G<kwLj>Hjo<6wxCTI0J!u%(HH?fAaYtG{FvfVL3#~cPA1U+)Pg%ase55 z%dWWNF@G3=w|Yl=Ji`*gW!nK8V~SQ0MF7~Js~w0($4znSf8fmLVEGX%dr&S2;Y@`Q z$O4t}pK9=Pdth(vtvTU$fYOj%;@)!)2&-WSV=#j7>F(a5eVf+AJ0Gi=3M>@;O)iM= ztE^2u;NH_gUUWqRIK%3N19~~e@O~~AW!f@jJDo>@6+gdZB`^qaFyn9n!|YXf?92e? zY44(qIx3Bx9@{z&-bG(Yh$^|MbNslQT<OFyENa7u`-3&>j#0%Nb|Zy$sc@^$>(sUL j^<2*u$qv!Zn`=dQ$m@Wo$V%|A4*)z<(Nsn}w)przcCP>i literal 0 HcmV?d00001 diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/icon-github.png.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/icon-github.png.meta new file mode 100644 index 0000000..c92bc5d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Samples/DemoScene/TestAssets/icon-github.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 005888ede18a58e4db8d069cfa3007cb +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + 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: 1 + 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: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 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: 1 + - 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: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts.meta new file mode 100644 index 0000000..238d7e9 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 66686847ee1fa044bb15dfe473666178 +folderAsset: yes +timeCreated: 1507995546 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core.meta new file mode 100644 index 0000000..a055450 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 1f67e408a6d0adf4ab29d095ccd8b116 +folderAsset: yes +timeCreated: 1507998942 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta new file mode 100644 index 0000000..132a3c2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c76425e719cd4424d868674bcfb233f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs new file mode 100644 index 0000000..c73cd8d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class AllowNestingAttribute : DrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta new file mode 100644 index 0000000..343dfec --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95b49d3abe880c044adbe7faf6b7b4ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs new file mode 100644 index 0000000..214cd66 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs @@ -0,0 +1,24 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class AnimatorParamAttribute : DrawerAttribute + { + public string AnimatorName { get; private set; } + public AnimatorControllerParameterType? AnimatorParamType { get; private set; } + + public AnimatorParamAttribute(string animatorName) + { + AnimatorName = animatorName; + AnimatorParamType = null; + } + + public AnimatorParamAttribute(string animatorName, AnimatorControllerParameterType animatorParamType) + { + AnimatorName = animatorName; + AnimatorParamType = animatorParamType; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta new file mode 100644 index 0000000..db61add --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7373332cb77b42744a415d6b4add445d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs new file mode 100644 index 0000000..45dcd71 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs @@ -0,0 +1,30 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class CurveRangeAttribute : DrawerAttribute + { + public Vector2 Min { get; private set; } + public Vector2 Max { get; private set; } + public EColor Color { get; private set; } + + public CurveRangeAttribute(Vector2 min, Vector2 max, EColor color = EColor.Clear) + { + Min = min; + Max = max; + Color = color; + } + + public CurveRangeAttribute(EColor color) + : this(Vector2.zero, Vector2.one, color) + { + } + + public CurveRangeAttribute(float minX, float minY, float maxX, float maxY, EColor color = EColor.Clear) + : this(new Vector2(minX, minY), new Vector2(maxX, maxY), color) + { + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta new file mode 100644 index 0000000..93b60ab --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bbdf3fb8882c7514c9a01108122cda7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs new file mode 100644 index 0000000..90d4f2d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs @@ -0,0 +1,11 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + /// <summary> + /// Base class for all drawer attributes + /// </summary> + public class DrawerAttribute : PropertyAttribute, INaughtyAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta new file mode 100644 index 0000000..aa54215 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9df37fdebccf65c4da5b0a14f6dad5f5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs new file mode 100644 index 0000000..3d95064 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs @@ -0,0 +1,57 @@ +using System.Collections; +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class DropdownAttribute : DrawerAttribute + { + public string ValuesName { get; private set; } + + public DropdownAttribute(string valuesName) + { + ValuesName = valuesName; + } + } + + public interface IDropdownList : IEnumerable<KeyValuePair<string, object>> + { + } + + public class DropdownList<T> : IDropdownList + { + private List<KeyValuePair<string, object>> _values; + + public DropdownList() + { + _values = new List<KeyValuePair<string, object>>(); + } + + public void Add(string displayName, T value) + { + _values.Add(new KeyValuePair<string, object>(displayName, value)); + } + + public IEnumerator<KeyValuePair<string, object>> GetEnumerator() + { + return _values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public static explicit operator DropdownList<object>(DropdownList<T> target) + { + DropdownList<object> result = new DropdownList<object>(); + foreach (var kvp in target) + { + result.Add(kvp.Key, kvp.Value); + } + + return result; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta new file mode 100644 index 0000000..b25926d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2cb864a1092cec04f8a4dbb556e8ed31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs new file mode 100644 index 0000000..2fcb134 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class EnumFlagsAttribute : DrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta new file mode 100644 index 0000000..25a52af --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8b31eb6d7299e54d89dcabc4cad0e6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs new file mode 100644 index 0000000..b4e8ebd --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ExpandableAttribute : DrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs.meta new file mode 100644 index 0000000..8fa04e4 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/Expandable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 60926d6ca7f9ced469e9248ff1192da6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs new file mode 100644 index 0000000..50d59a8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class HorizontalLineAttribute : DrawerAttribute + { + public const float DefaultHeight = 2.0f; + public const EColor DefaultColor = EColor.Gray; + + public float Height { get; private set; } + public EColor Color { get; private set; } + + public HorizontalLineAttribute(float height = DefaultHeight, EColor color = DefaultColor) + { + Height = height; + Color = color; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta new file mode 100644 index 0000000..ecfd258 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2fdd6f99acca2fd42a4f3162d585ce95 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs new file mode 100644 index 0000000..8867d97 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EInfoBoxType + { + Normal, + Warning, + Error + } + + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class InfoBoxAttribute : DrawerAttribute + { + public string Text { get; private set; } + public EInfoBoxType Type { get; private set; } + + public InfoBoxAttribute(string text, EInfoBoxType type = EInfoBoxType.Normal) + { + Text = text; + Type = type; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta new file mode 100644 index 0000000..8748a6e --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afd1d6323740c734893fa8397c53113b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs new file mode 100644 index 0000000..416a107 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class InputAxisAttribute : DrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta new file mode 100644 index 0000000..da3b2c4 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85033978c18810f46af271bbe94cf4aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs new file mode 100644 index 0000000..87c1bce --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class LayerAttribute : DrawerAttribute + { + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs.meta new file mode 100644 index 0000000..93d97f7 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/LayerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 668d19ebe071176448d1af816a9a0ce0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs new file mode 100644 index 0000000..f76d602 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinMaxSliderAttribute : DrawerAttribute + { + public float MinValue { get; private set; } + public float MaxValue { get; private set; } + + public MinMaxSliderAttribute(float minValue, float maxValue) + { + MinValue = minValue; + MaxValue = maxValue; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta new file mode 100644 index 0000000..03e5dcf --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4aaa73f574deaa54187cb54aae571b24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs new file mode 100644 index 0000000..72b7ea8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs @@ -0,0 +1,37 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ProgressBarAttribute : DrawerAttribute + { + public string Name { get; private set; } + public float MaxValue { get; set; } + public string MaxValueName { get; private set; } + public EColor Color { get; private set; } + + public ProgressBarAttribute(string name, float maxValue, EColor color = EColor.Blue) + { + Name = name; + MaxValue = maxValue; + Color = color; + } + + public ProgressBarAttribute(string name, string maxValueName, EColor color = EColor.Blue) + { + Name = name; + MaxValueName = maxValueName; + Color = color; + } + + public ProgressBarAttribute(float maxValue, EColor color = EColor.Blue) + : this("", maxValue, color) + { + } + + public ProgressBarAttribute(string maxValueName, EColor color = EColor.Blue) + : this("", maxValueName, color) + { + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta new file mode 100644 index 0000000..11029f0 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e19e4db6f4d08f849aa8ea8155cd2760 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs new file mode 100644 index 0000000..e84e664 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ResizableTextAreaAttribute : DrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta new file mode 100644 index 0000000..cc11d00 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56d9a4b795ef4a94d86b94e55fb81240 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs new file mode 100644 index 0000000..0cc044b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class SceneAttribute : DrawerAttribute + { + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta new file mode 100644 index 0000000..f22649b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e054de18423364f4688b72a0f2a472b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs new file mode 100644 index 0000000..dd628ff --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowAssetPreviewAttribute : DrawerAttribute + { + public const int DefaultWidth = 64; + public const int DefaultHeight = 64; + + public int Width { get; private set; } + public int Height { get; private set; } + + public ShowAssetPreviewAttribute(int width = DefaultWidth, int height = DefaultHeight) + { + Width = width; + Height = height; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta new file mode 100644 index 0000000..4893b92 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b7dd9b44abc0054cb5cd68d74be2c1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs new file mode 100644 index 0000000..0df4964 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class SortingLayerAttribute : DrawerAttribute + { + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs.meta new file mode 100644 index 0000000..d4cfaf8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/SortingLayerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b7564ee02deb3974a85d8617eea098fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs new file mode 100644 index 0000000..296d8d3 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class TagAttribute : DrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta new file mode 100644 index 0000000..618033c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8903399bbd7c9d745a7b9188ab6c8320 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta new file mode 100644 index 0000000..3096ac4 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5cf879ed72221e740a7aa02ef9c366a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs new file mode 100644 index 0000000..5deef56 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs @@ -0,0 +1,33 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EButtonEnableMode + { + /// <summary> + /// Button should be active always + /// </summary> + Always, + /// <summary> + /// Button should be active only in editor + /// </summary> + Editor, + /// <summary> + /// Button should be active only in playmode + /// </summary> + Playmode + } + + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class ButtonAttribute : SpecialCaseDrawerAttribute + { + public string Text { get; private set; } + public EButtonEnableMode SelectedEnableMode { get; private set; } + + public ButtonAttribute(string text = null, EButtonEnableMode enabledMode = EButtonEnableMode.Always) + { + this.Text = text; + this.SelectedEnableMode = enabledMode; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta new file mode 100644 index 0000000..cc7be5c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8fe363a25ec5e24a9dd510bb0b4a0d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs new file mode 100644 index 0000000..91af2ea --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReorderableListAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta new file mode 100644 index 0000000..add3c4a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6189b48f4055e6c47aa132632d898fa6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs new file mode 100644 index 0000000..10d0336 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + public class ShowNativePropertyAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta new file mode 100644 index 0000000..5aed9a2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8e9b7b71c94a1f459336a24cfe04b1b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs new file mode 100644 index 0000000..a4303dd --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowNonSerializedFieldAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta new file mode 100644 index 0000000..84d5624 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ea09f60df536734184a8920ff8bda6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs new file mode 100644 index 0000000..204f9c6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class SpecialCaseDrawerAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta new file mode 100644 index 0000000..3b4bd25 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95a59093f8ed1af48a8be75fa3050a3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs new file mode 100644 index 0000000..bd16238 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public interface INaughtyAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta new file mode 100644 index 0000000..e2dd9d9 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: edda855906d15e541b46efd812fd70f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes.meta new file mode 100644 index 0000000..547f24d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64c95d02a2004854585e8d923d6680d0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs new file mode 100644 index 0000000..bb6380a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class BoxGroupAttribute : MetaAttribute, IGroupAttribute + { + public string Name { get; private set; } + + public BoxGroupAttribute(string name = "") + { + Name = name; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta new file mode 100644 index 0000000..d68d8de --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07da8af1e3be52c4789678bf4138ae11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs new file mode 100644 index 0000000..c8fd6e3 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class DisableIfAttribute : EnableIfAttributeBase + { + public DisableIfAttribute(string condition) + : base(condition) + { + Inverted = true; + } + + public DisableIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = true; + } + + public DisableIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = true; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta new file mode 100644 index 0000000..b91dc52 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 52a0d5c249ac8fd42a4fb4d61bc2f797 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs new file mode 100644 index 0000000..c801413 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class EnableIfAttribute : EnableIfAttributeBase + { + public EnableIfAttribute(string condition) + : base(condition) + { + Inverted = false; + } + + public EnableIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = false; + } + + public EnableIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = false; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta new file mode 100644 index 0000000..f3a696c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a616ae826c8ebae45a89d6a8cb68a843 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs new file mode 100644 index 0000000..cebc67a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs @@ -0,0 +1,39 @@ +using System; + +namespace NaughtyAttributes +{ + public abstract class EnableIfAttributeBase : MetaAttribute + { + public string[] Conditions { get; private set; } + public EConditionOperator ConditionOperator { get; private set; } + public bool Inverted { get; protected set; } + + /// <summary> + /// If this not null, <see cref="Conditions"/>[0] is name of an enum variable. + /// </summary> + public Enum EnumValue { get; private set; } + + public EnableIfAttributeBase(string condition) + { + ConditionOperator = EConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public EnableIfAttributeBase(EConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + + public EnableIfAttributeBase(string enumName, Enum enumValue) + : this(enumName) + { + if (enumValue == null) + { + throw new ArgumentNullException(nameof(enumValue), "This parameter must be an enum value."); + } + + EnumValue = enumValue; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta new file mode 100644 index 0000000..45fd5eb --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ba6385cd022e164b89ead1937173ddc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs new file mode 100644 index 0000000..f1b81bd --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class FoldoutAttribute : MetaAttribute, IGroupAttribute + { + public string Name { get; private set; } + + public FoldoutAttribute(string name) + { + Name = name; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs.meta new file mode 100644 index 0000000..e39736b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/FoldoutAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95f184555d5079243b2d25b35a641a74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs new file mode 100644 index 0000000..88a0850 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class HideIfAttribute : ShowIfAttributeBase + { + public HideIfAttribute(string condition) + : base(condition) + { + Inverted = true; + } + + public HideIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = true; + } + + public HideIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = true; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta new file mode 100644 index 0000000..888cf89 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ab2d0fcfb13a214ea6ef7629c96a761 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs new file mode 100644 index 0000000..b30ac9a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs @@ -0,0 +1,8 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + public interface IGroupAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs.meta new file mode 100644 index 0000000..47db85d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/IGroupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7c437b9ac50575347a7b12520f37f9a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs new file mode 100644 index 0000000..3098273 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class LabelAttribute : MetaAttribute + { + public string Label { get; private set; } + + public LabelAttribute(string label) + { + Label = label; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta new file mode 100644 index 0000000..9488d54 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79e0e0c0a7c25ea4fbe8eecaa4d559a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs new file mode 100644 index 0000000..9436bf3 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class MetaAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta new file mode 100644 index 0000000..a7be132 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a482b4e0fbf0f4547a5d522182a68d24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs new file mode 100644 index 0000000..8358af9 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class OnValueChangedAttribute : MetaAttribute + { + public string CallbackName { get; private set; } + + public OnValueChangedAttribute(string callbackName) + { + CallbackName = callbackName; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta new file mode 100644 index 0000000..4a92c4b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e16a27c5576022b4bbe997c7db9051f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs new file mode 100644 index 0000000..95110f6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReadOnlyAttribute : MetaAttribute + { + + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs.meta new file mode 100644 index 0000000..24ec846 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ReadOnlyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e57264747ba93b94fbff12733de29499 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs new file mode 100644 index 0000000..fce3763 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class ShowIfAttribute : ShowIfAttributeBase + { + public ShowIfAttribute(string condition) + : base(condition) + { + Inverted = false; + } + + public ShowIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = false; + } + + public ShowIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = false; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta new file mode 100644 index 0000000..4556ac2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ada427cfd2c9b04989d6d18dea27985 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs new file mode 100644 index 0000000..1ead58b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs @@ -0,0 +1,39 @@ +using System; + +namespace NaughtyAttributes +{ + public class ShowIfAttributeBase : MetaAttribute + { + public string[] Conditions { get; private set; } + public EConditionOperator ConditionOperator { get; private set; } + public bool Inverted { get; protected set; } + + /// <summary> + /// If this not null, <see cref="Conditions"/>[0] is name of an enum variable. + /// </summary> + public Enum EnumValue { get; private set; } + + public ShowIfAttributeBase(string condition) + { + ConditionOperator = EConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public ShowIfAttributeBase(EConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + + public ShowIfAttributeBase(string enumName, Enum enumValue) + : this(enumName) + { + if (enumValue == null) + { + throw new ArgumentNullException(nameof(enumValue), "This parameter must be an enum value."); + } + + EnumValue = enumValue; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta new file mode 100644 index 0000000..e82a9ad --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0532b1c4d8a9ccf4b9f98f0bbe4a6747 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef new file mode 100644 index 0000000..569e4e6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef @@ -0,0 +1,12 @@ +{ + "name": "NaughtyAttributes.Core", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta new file mode 100644 index 0000000..731749c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 776d03a35f1b52c4a9aed9f56d7b4229 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility.meta new file mode 100644 index 0000000..80be476 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d61a3a977073c740ae13a3683ed22a1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs new file mode 100644 index 0000000..ab50f1d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + public enum EColor + { + Clear, + White, + Black, + Gray, + Red, + Pink, + Orange, + Yellow, + Green, + Blue, + Indigo, + Violet + } + + public static class EColorExtensions + { + public static Color GetColor(this EColor color) + { + switch (color) + { + case EColor.Clear: + return new Color32(0, 0, 0, 0); + case EColor.White: + return new Color32(255, 255, 255, 255); + case EColor.Black: + return new Color32(0, 0, 0, 255); + case EColor.Gray: + return new Color32(128, 128, 128, 255); + case EColor.Red: + return new Color32(255, 0, 63, 255); + case EColor.Pink: + return new Color32(255, 152, 203, 255); + case EColor.Orange: + return new Color32(255, 128, 0, 255); + case EColor.Yellow: + return new Color32(255, 211, 0, 255); + case EColor.Green: + return new Color32(98, 200, 79, 255); + case EColor.Blue: + return new Color32(0, 135, 189, 255); + case EColor.Indigo: + return new Color32(75, 0, 130, 255); + case EColor.Violet: + return new Color32(128, 0, 255, 255); + default: + return new Color32(0, 0, 0, 255); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta new file mode 100644 index 0000000..0f32c5e --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 059f8674a8065924ea9c678298b5cd63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs new file mode 100644 index 0000000..d0894f5 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs @@ -0,0 +1,10 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EConditionOperator + { + And, + Or + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta new file mode 100644 index 0000000..60e3264 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c227b6c19fc67b46ad294d95818f85a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta new file mode 100644 index 0000000..d5aba48 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf91d63e37bed3e4cbf75d576fc03a21 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs new file mode 100644 index 0000000..3410e74 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MaxValueAttribute : ValidatorAttribute + { + public float MaxValue { get; private set; } + + public MaxValueAttribute(float maxValue) + { + MaxValue = maxValue; + } + + public MaxValueAttribute(int maxValue) + { + MaxValue = maxValue; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta new file mode 100644 index 0000000..b02fdbc --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a748250af5ccfd7499cfb444aafb8a03 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs new file mode 100644 index 0000000..956ca7a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinValueAttribute : ValidatorAttribute + { + public float MinValue { get; private set; } + + public MinValueAttribute(float minValue) + { + MinValue = minValue; + } + + public MinValueAttribute(int minValue) + { + MinValue = minValue; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta new file mode 100644 index 0000000..9d90191 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40133bac7c8d42b4d837138430a503e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs new file mode 100644 index 0000000..61e3618 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class RequiredAttribute : ValidatorAttribute + { + public string Message { get; private set; } + + public RequiredAttribute(string message = null) + { + Message = message; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta new file mode 100644 index 0000000..7f87cfc --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b0cdf49d1687849458b1a8d4786553d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs new file mode 100644 index 0000000..2b738c3 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ValidateInputAttribute : ValidatorAttribute + { + public string CallbackName { get; private set; } + public string Message { get; private set; } + + public ValidateInputAttribute(string callbackName, string message = null) + { + CallbackName = callbackName; + Message = message; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta new file mode 100644 index 0000000..0addd1a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c4171d68fb5bc0448d3ac298973e82c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs new file mode 100644 index 0000000..db5dcb5 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class ValidatorAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta new file mode 100644 index 0000000..f5daea8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0f3c43bed2dbc5249b6c6ec7859c2020 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor.meta new file mode 100644 index 0000000..8110aa8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b76068e69df25a94ab378b0b6829c4f0 +folderAsset: yes +timeCreated: 1507995613 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta new file mode 100644 index 0000000..79b2c37 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3041a2296f3b1749b3ef18e695adee4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs new file mode 100644 index 0000000..2953c61 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs @@ -0,0 +1,23 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(HorizontalLineAttribute))] + public class HorizontalLineDecoratorDrawer : DecoratorDrawer + { + public override float GetHeight() + { + HorizontalLineAttribute lineAttr = (HorizontalLineAttribute)attribute; + return EditorGUIUtility.singleLineHeight + lineAttr.Height; + } + + public override void OnGUI(Rect position) + { + Rect rect = EditorGUI.IndentedRect(position); + rect.y += EditorGUIUtility.singleLineHeight / 3.0f; + HorizontalLineAttribute lineAttr = (HorizontalLineAttribute)attribute; + NaughtyEditorGUI.HorizontalLine(rect, lineAttr.Height, lineAttr.Color.GetColor()); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta new file mode 100644 index 0000000..719f6d8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ec99f3a124f20e40b8f5edfeb1ecced +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs new file mode 100644 index 0000000..83cdbd2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs @@ -0,0 +1,59 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(InfoBoxAttribute))] + public class InfoBoxDecoratorDrawer : DecoratorDrawer + { + public override float GetHeight() + { + return GetHelpBoxHeight(); + } + + public override void OnGUI(Rect rect) + { + InfoBoxAttribute infoBoxAttribute = (InfoBoxAttribute)attribute; + + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect infoBoxRect = new Rect( + rect.x + indentLength, + rect.y, + rect.width - indentLength, + GetHelpBoxHeight()); + + DrawInfoBox(infoBoxRect, infoBoxAttribute.Text, infoBoxAttribute.Type); + } + + private float GetHelpBoxHeight() + { + InfoBoxAttribute infoBoxAttribute = (InfoBoxAttribute)attribute; + float minHeight = EditorGUIUtility.singleLineHeight * 2.0f; + float desiredHeight = GUI.skin.box.CalcHeight(new GUIContent(infoBoxAttribute.Text), EditorGUIUtility.currentViewWidth); + float height = Mathf.Max(minHeight, desiredHeight); + + return height; + } + + private void DrawInfoBox(Rect rect, string infoText, EInfoBoxType infoBoxType) + { + MessageType messageType = MessageType.None; + switch (infoBoxType) + { + case EInfoBoxType.Normal: + messageType = MessageType.Info; + break; + + case EInfoBoxType.Warning: + messageType = MessageType.Warning; + break; + + case EInfoBoxType.Error: + messageType = MessageType.Error; + break; + } + + NaughtyEditorGUI.HelpBox(rect, infoText, messageType); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta new file mode 100644 index 0000000..5f50ace --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9c18b0e698717442b7631c5066d667f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef new file mode 100644 index 0000000..e1aafc2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "NaughtyAttributes.Editor", + "references": [ + "NaughtyAttributes.Core" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta new file mode 100644 index 0000000..70dc9f2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f88fb04354076c646a4107a491394033 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs new file mode 100644 index 0000000..03adaee --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs @@ -0,0 +1,221 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(UnityEngine.Object), true)] + public class NaughtyInspector : UnityEditor.Editor + { + private List<SerializedProperty> _serializedProperties = new List<SerializedProperty>(); + private IEnumerable<FieldInfo> _nonSerializedFields; + private IEnumerable<PropertyInfo> _nativeProperties; + private IEnumerable<MethodInfo> _methods; + private Dictionary<string, SavedBool> _foldouts = new Dictionary<string, SavedBool>(); + + protected virtual void OnEnable() + { + _nonSerializedFields = ReflectionUtility.GetAllFields( + target, f => f.GetCustomAttributes(typeof(ShowNonSerializedFieldAttribute), true).Length > 0); + + _nativeProperties = ReflectionUtility.GetAllProperties( + target, p => p.GetCustomAttributes(typeof(ShowNativePropertyAttribute), true).Length > 0); + + _methods = ReflectionUtility.GetAllMethods( + target, m => m.GetCustomAttributes(typeof(ButtonAttribute), true).Length > 0); + } + + protected virtual void OnDisable() + { + ReorderableListPropertyDrawer.Instance.ClearCache(); + } + + public override void OnInspectorGUI() + { + GetSerializedProperties(ref _serializedProperties); + + bool anyNaughtyAttribute = _serializedProperties.Any(p => PropertyUtility.GetAttribute<INaughtyAttribute>(p) != null); + if (!anyNaughtyAttribute) + { + DrawDefaultInspector(); + } + else + { + DrawSerializedProperties(); + } + + DrawNonSerializedFields(); + DrawNativeProperties(); + DrawButtons(); + } + + protected void GetSerializedProperties(ref List<SerializedProperty> outSerializedProperties) + { + outSerializedProperties.Clear(); + using (var iterator = serializedObject.GetIterator()) + { + if (iterator.NextVisible(true)) + { + do + { + outSerializedProperties.Add(serializedObject.FindProperty(iterator.name)); + } + while (iterator.NextVisible(false)); + } + } + } + + protected void DrawSerializedProperties() + { + serializedObject.Update(); + + // Draw non-grouped serialized properties + foreach (var property in GetNonGroupedProperties(_serializedProperties)) + { + if (property.name.Equals("m_Script", System.StringComparison.Ordinal)) + { + using (new EditorGUI.DisabledScope(disabled: true)) + { + EditorGUILayout.PropertyField(property); + } + } + else + { + NaughtyEditorGUI.PropertyField_Layout(property, includeChildren: true); + } + } + + // Draw grouped serialized properties + foreach (var group in GetGroupedProperties(_serializedProperties)) + { + IEnumerable<SerializedProperty> visibleProperties = group.Where(p => PropertyUtility.IsVisible(p)); + if (!visibleProperties.Any()) + { + continue; + } + + NaughtyEditorGUI.BeginBoxGroup_Layout(group.Key); + foreach (var property in visibleProperties) + { + NaughtyEditorGUI.PropertyField_Layout(property, includeChildren: true); + } + + NaughtyEditorGUI.EndBoxGroup_Layout(); + } + + // Draw foldout serialized properties + foreach (var group in GetFoldoutProperties(_serializedProperties)) + { + IEnumerable<SerializedProperty> visibleProperties = group.Where(p => PropertyUtility.IsVisible(p)); + if (!visibleProperties.Any()) + { + continue; + } + + if (!_foldouts.ContainsKey(group.Key)) + { + _foldouts[group.Key] = new SavedBool($"{target.GetInstanceID()}.{group.Key}", false); + } + + _foldouts[group.Key].Value = EditorGUILayout.Foldout(_foldouts[group.Key].Value, group.Key, true); + if (_foldouts[group.Key].Value) + { + foreach (var property in visibleProperties) + { + NaughtyEditorGUI.PropertyField_Layout(property, true); + } + } + } + + serializedObject.ApplyModifiedProperties(); + } + + protected void DrawNonSerializedFields(bool drawHeader = false) + { + if (_nonSerializedFields.Any()) + { + if (drawHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Non-Serialized Fields", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + } + + foreach (var field in _nonSerializedFields) + { + NaughtyEditorGUI.NonSerializedField_Layout(serializedObject.targetObject, field); + } + } + } + + protected void DrawNativeProperties(bool drawHeader = false) + { + if (_nativeProperties.Any()) + { + if (drawHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Native Properties", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + } + + foreach (var property in _nativeProperties) + { + NaughtyEditorGUI.NativeProperty_Layout(serializedObject.targetObject, property); + } + } + } + + protected void DrawButtons(bool drawHeader = false) + { + if (_methods.Any()) + { + if (drawHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Buttons", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + } + + foreach (var method in _methods) + { + NaughtyEditorGUI.Button(serializedObject.targetObject, method); + } + } + } + + private static IEnumerable<SerializedProperty> GetNonGroupedProperties(IEnumerable<SerializedProperty> properties) + { + return properties.Where(p => PropertyUtility.GetAttribute<IGroupAttribute>(p) == null); + } + + private static IEnumerable<IGrouping<string, SerializedProperty>> GetGroupedProperties(IEnumerable<SerializedProperty> properties) + { + return properties + .Where(p => PropertyUtility.GetAttribute<BoxGroupAttribute>(p) != null) + .GroupBy(p => PropertyUtility.GetAttribute<BoxGroupAttribute>(p).Name); + } + + private static IEnumerable<IGrouping<string, SerializedProperty>> GetFoldoutProperties(IEnumerable<SerializedProperty> properties) + { + return properties + .Where(p => PropertyUtility.GetAttribute<FoldoutAttribute>(p) != null) + .GroupBy(p => PropertyUtility.GetAttribute<FoldoutAttribute>(p).Name); + } + + private static GUIStyle GetHeaderGUIStyle() + { + GUIStyle style = new GUIStyle(EditorStyles.centeredGreyMiniLabel); + style.fontStyle = FontStyle.Bold; + style.alignment = TextAnchor.UpperCenter; + + return style; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta new file mode 100644 index 0000000..b63e99f --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b9b53879f7c93b42835c3ad9e0d0a66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta new file mode 100644 index 0000000..7d7dbed --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4327d74fca5deaa4c83c483fe468d274 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs new file mode 100644 index 0000000..6c39132 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs @@ -0,0 +1,16 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(AllowNestingAttribute))] + public class AllowNestingPropertyDrawer : PropertyDrawerBase + { + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + EditorGUI.PropertyField(rect, property, label, true); + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta new file mode 100644 index 0000000..f2f2145 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3175e7041b8f4348bd652485a78e7b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs new file mode 100644 index 0000000..cf3da38 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs @@ -0,0 +1,173 @@ +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEditor.Animations; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(AnimatorParamAttribute))] + public class AnimatorParamPropertyDrawer : PropertyDrawerBase + { + private const string InvalidAnimatorControllerWarningMessage = "Target animator controller is null"; + private const string InvalidTypeWarningMessage = "{0} must be an int or a string"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + AnimatorParamAttribute animatorParamAttribute = PropertyUtility.GetAttribute<AnimatorParamAttribute>(property); + bool validAnimatorController = GetAnimatorController(property, animatorParamAttribute.AnimatorName) != null; + bool validPropertyType = property.propertyType == SerializedPropertyType.Integer || property.propertyType == SerializedPropertyType.String; + + return (validAnimatorController && validPropertyType) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + AnimatorParamAttribute animatorParamAttribute = PropertyUtility.GetAttribute<AnimatorParamAttribute>(property); + + AnimatorController animatorController = GetAnimatorController(property, animatorParamAttribute.AnimatorName); + if (animatorController == null) + { + DrawDefaultPropertyAndHelpBox(rect, property, InvalidAnimatorControllerWarningMessage, MessageType.Warning); + return; + } + + int parametersCount = animatorController.parameters.Length; + List<AnimatorControllerParameter> animatorParameters = new List<AnimatorControllerParameter>(parametersCount); + for (int i = 0; i < parametersCount; i++) + { + AnimatorControllerParameter parameter = animatorController.parameters[i]; + if (animatorParamAttribute.AnimatorParamType == null || parameter.type == animatorParamAttribute.AnimatorParamType) + { + animatorParameters.Add(parameter); + } + } + + switch (property.propertyType) + { + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, animatorParameters); + break; + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, animatorParameters); + break; + default: + DrawDefaultPropertyAndHelpBox(rect, property, string.Format(InvalidTypeWarningMessage, property.name), MessageType.Warning); + break; + } + + EditorGUI.EndProperty(); + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, List<AnimatorControllerParameter> animatorParameters) + { + int paramNameHash = property.intValue; + int index = 0; + + for (int i = 0; i < animatorParameters.Count; i++) + { + if (paramNameHash == animatorParameters[i].nameHash) + { + index = i + 1; // +1 because the first option is reserved for (None) + break; + } + } + + string[] displayOptions = GetDisplayOptions(animatorParameters); + + int newIndex = EditorGUI.Popup(rect, label.text, index, displayOptions); + int newValue = newIndex == 0 ? 0 : animatorParameters[newIndex - 1].nameHash; + + if (property.intValue != newValue) + { + property.intValue = newValue; + } + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, List<AnimatorControllerParameter> animatorParameters) + { + string paramName = property.stringValue; + int index = 0; + + for (int i = 0; i < animatorParameters.Count; i++) + { + if (paramName.Equals(animatorParameters[i].name, System.StringComparison.Ordinal)) + { + index = i + 1; // +1 because the first option is reserved for (None) + break; + } + } + + string[] displayOptions = GetDisplayOptions(animatorParameters); + + int newIndex = EditorGUI.Popup(rect, label.text, index, displayOptions); + string newValue = newIndex == 0 ? null : animatorParameters[newIndex - 1].name; + + if (!property.stringValue.Equals(newValue, System.StringComparison.Ordinal)) + { + property.stringValue = newValue; + } + } + + private static string[] GetDisplayOptions(List<AnimatorControllerParameter> animatorParams) + { + string[] displayOptions = new string[animatorParams.Count + 1]; + displayOptions[0] = "(None)"; + + for (int i = 0; i < animatorParams.Count; i++) + { + displayOptions[i + 1] = animatorParams[i].name; + } + + return displayOptions; + } + + private static AnimatorController GetAnimatorController(SerializedProperty property, string animatorName) + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo animatorFieldInfo = ReflectionUtility.GetField(target, animatorName); + if (animatorFieldInfo != null && + animatorFieldInfo.FieldType == typeof(Animator)) + { + Animator animator = animatorFieldInfo.GetValue(target) as Animator; + if (animator != null) + { + AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController; + return animatorController; + } + } + + PropertyInfo animatorPropertyInfo = ReflectionUtility.GetProperty(target, animatorName); + if (animatorPropertyInfo != null && + animatorPropertyInfo.PropertyType == typeof(Animator)) + { + Animator animator = animatorPropertyInfo.GetValue(target) as Animator; + if (animator != null) + { + AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController; + return animatorController; + } + } + + MethodInfo animatorGetterMethodInfo = ReflectionUtility.GetMethod(target, animatorName); + if (animatorGetterMethodInfo != null && + animatorGetterMethodInfo.ReturnType == typeof(Animator) && + animatorGetterMethodInfo.GetParameters().Length == 0) + { + Animator animator = animatorGetterMethodInfo.Invoke(target, null) as Animator; + if (animator != null) + { + AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController; + return animatorController; + } + } + + return null; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta new file mode 100644 index 0000000..4c3a7e6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98ff8cb1bcefae740a68d9a5c5ee3563 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs new file mode 100644 index 0000000..8f5a6c5 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs @@ -0,0 +1,47 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(CurveRangeAttribute))] + public class CurveRangePropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + float propertyHeight = property.propertyType == SerializedPropertyType.AnimationCurve + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + + return propertyHeight; + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + // Check user error + if (property.propertyType != SerializedPropertyType.AnimationCurve) + { + string message = string.Format("Field {0} is not an AnimationCurve", property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + return; + } + + var curveRangeAttribute = (CurveRangeAttribute)attribute; + var curveRanges = new Rect( + curveRangeAttribute.Min.x, + curveRangeAttribute.Min.y, + curveRangeAttribute.Max.x - curveRangeAttribute.Min.x, + curveRangeAttribute.Max.y - curveRangeAttribute.Min.y); + + EditorGUI.CurveField( + rect, + property, + curveRangeAttribute.Color == EColor.Clear ? Color.green : curveRangeAttribute.Color.GetColor(), + curveRanges, + label); + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta new file mode 100644 index 0000000..adea11e --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 798b8c99fbc072a4b83ee387e472a2bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs new file mode 100644 index 0000000..9018486 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs @@ -0,0 +1,177 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Reflection; +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(DropdownAttribute))] + public class DropdownPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + DropdownAttribute dropdownAttribute = (DropdownAttribute)attribute; + object values = GetValues(property, dropdownAttribute.ValuesName); + FieldInfo fieldInfo = ReflectionUtility.GetField(PropertyUtility.GetTargetObjectWithProperty(property), property.name); + + float propertyHeight = AreValuesValid(values, fieldInfo) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + + return propertyHeight; + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + DropdownAttribute dropdownAttribute = (DropdownAttribute)attribute; + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + object valuesObject = GetValues(property, dropdownAttribute.ValuesName); + FieldInfo dropdownField = ReflectionUtility.GetField(target, property.name); + + if (AreValuesValid(valuesObject, dropdownField)) + { + if (valuesObject is IList && dropdownField.FieldType == GetElementType(valuesObject)) + { + // Selected value + object selectedValue = dropdownField.GetValue(target); + + // Values and display options + IList valuesList = (IList)valuesObject; + object[] values = new object[valuesList.Count]; + string[] displayOptions = new string[valuesList.Count]; + + for (int i = 0; i < values.Length; i++) + { + object value = valuesList[i]; + values[i] = value; + displayOptions[i] = value == null ? "<null>" : value.ToString(); + } + + // Selected value index + int selectedValueIndex = Array.IndexOf(values, selectedValue); + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + NaughtyEditorGUI.Dropdown( + rect, property.serializedObject, target, dropdownField, label.text, selectedValueIndex, values, displayOptions); + } + else if (valuesObject is IDropdownList) + { + // Current value + object selectedValue = dropdownField.GetValue(target); + + // Current value index, values and display options + int index = -1; + int selectedValueIndex = -1; + List<object> values = new List<object>(); + List<string> displayOptions = new List<string>(); + IDropdownList dropdown = (IDropdownList)valuesObject; + + using (IEnumerator<KeyValuePair<string, object>> dropdownEnumerator = dropdown.GetEnumerator()) + { + while (dropdownEnumerator.MoveNext()) + { + index++; + + KeyValuePair<string, object> current = dropdownEnumerator.Current; + if (current.Value?.Equals(selectedValue) == true) + { + selectedValueIndex = index; + } + + values.Add(current.Value); + + if (current.Key == null) + { + displayOptions.Add("<null>"); + } + else if (string.IsNullOrWhiteSpace(current.Key)) + { + displayOptions.Add("<empty>"); + } + else + { + displayOptions.Add(current.Key); + } + } + } + + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + NaughtyEditorGUI.Dropdown( + rect, property.serializedObject, target, dropdownField, label.text, selectedValueIndex, values.ToArray(), displayOptions.ToArray()); + } + } + else + { + string message = string.Format("Invalid values with name '{0}' provided to '{1}'. Either the values name is incorrect or the types of the target field and the values field/property/method don't match", + dropdownAttribute.ValuesName, dropdownAttribute.GetType().Name); + + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private object GetValues(SerializedProperty property, string valuesName) + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo valuesFieldInfo = ReflectionUtility.GetField(target, valuesName); + if (valuesFieldInfo != null) + { + return valuesFieldInfo.GetValue(target); + } + + PropertyInfo valuesPropertyInfo = ReflectionUtility.GetProperty(target, valuesName); + if (valuesPropertyInfo != null) + { + return valuesPropertyInfo.GetValue(target); + } + + MethodInfo methodValuesInfo = ReflectionUtility.GetMethod(target, valuesName); + if (methodValuesInfo != null && + methodValuesInfo.ReturnType != typeof(void) && + methodValuesInfo.GetParameters().Length == 0) + { + return methodValuesInfo.Invoke(target, null); + } + + return null; + } + + private bool AreValuesValid(object values, FieldInfo dropdownField) + { + if (values == null || dropdownField == null) + { + return false; + } + + if ((values is IList && dropdownField.FieldType == GetElementType(values)) || + (values is IDropdownList)) + { + return true; + } + + return false; + } + + private Type GetElementType(object values) + { + Type valuesType = values.GetType(); + Type elementType = ReflectionUtility.GetListElementType(valuesType); + + return elementType; + } + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta new file mode 100644 index 0000000..fecae2c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd080b36769bcd94d909fc0431cf25e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs new file mode 100644 index 0000000..df2da6d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs @@ -0,0 +1,38 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(EnumFlagsAttribute))] + public class EnumFlagsPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + Enum targetEnum = PropertyUtility.GetTargetObjectOfProperty(property) as Enum; + + return (targetEnum != null) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + Enum targetEnum = PropertyUtility.GetTargetObjectOfProperty(property) as Enum; + if (targetEnum != null) + { + Enum enumNew = EditorGUI.EnumFlagsField(rect, label.text, targetEnum); + property.intValue = (int)Convert.ChangeType(enumNew, targetEnum.GetType()); + } + else + { + string message = attribute.GetType().Name + " can be used only on enums"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta new file mode 100644 index 0000000..c0081d2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b750e1461c1126d4399459b90b31e75e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs new file mode 100644 index 0000000..705e17a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs @@ -0,0 +1,195 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ExpandableAttribute))] + public class ExpandablePropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (property.objectReferenceValue == null) + { + return GetPropertyHeight(property); + } + + System.Type propertyType = PropertyUtility.GetPropertyType(property); + if (typeof(ScriptableObject).IsAssignableFrom(propertyType)) + { + ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; + if (scriptableObject == null) + { + return GetPropertyHeight(property); + } + + if (property.isExpanded) + { + using (SerializedObject serializedObject = new SerializedObject(scriptableObject)) + { + float totalHeight = EditorGUIUtility.singleLineHeight; + + using (var iterator = serializedObject.GetIterator()) + { + if (iterator.NextVisible(true)) + { + do + { + SerializedProperty childProperty = serializedObject.FindProperty(iterator.name); + if (childProperty.name.Equals("m_Script", System.StringComparison.Ordinal)) + { + continue; + } + + bool visible = PropertyUtility.IsVisible(childProperty); + if (!visible) + { + continue; + } + + float height = GetPropertyHeight(childProperty); + totalHeight += height; + } + while (iterator.NextVisible(false)); + } + } + + totalHeight += EditorGUIUtility.standardVerticalSpacing; + return totalHeight; + } + } + else + { + return GetPropertyHeight(property); + } + } + else + { + return GetPropertyHeight(property) + GetHelpBoxHeight(); + } + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.objectReferenceValue == null) + { + EditorGUI.PropertyField(rect, property, label, false); + } + else + { + System.Type propertyType = PropertyUtility.GetPropertyType(property); + if (typeof(ScriptableObject).IsAssignableFrom(propertyType)) + { + ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; + if (scriptableObject == null) + { + EditorGUI.PropertyField(rect, property, label, false); + } + else + { + // Draw a foldout + Rect foldoutRect = new Rect() + { + x = rect.x, + y = rect.y, + width = EditorGUIUtility.labelWidth, + height = EditorGUIUtility.singleLineHeight + }; + + property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, label, toggleOnLabelClick: true); + + // Draw the scriptable object field + Rect propertyRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.PropertyField(propertyRect, property, label, false); + + // Draw the child properties + if (property.isExpanded) + { + DrawChildProperties(rect, property); + } + } + } + else + { + string message = $"{typeof(ExpandableAttribute).Name} can only be used on scriptable objects"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + } + + property.serializedObject.ApplyModifiedProperties(); + EditorGUI.EndProperty(); + } + + private void DrawChildProperties(Rect rect, SerializedProperty property) + { + ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; + if (scriptableObject == null) + { + return; + } + + Rect boxRect = new Rect() + { + x = 0.0f, + y = rect.y + EditorGUIUtility.singleLineHeight, + width = rect.width * 2.0f, + height = rect.height - EditorGUIUtility.singleLineHeight + }; + + GUI.Box(boxRect, GUIContent.none); + + using (new EditorGUI.IndentLevelScope()) + { + SerializedObject serializedObject = new SerializedObject(scriptableObject); + serializedObject.Update(); + + using (var iterator = serializedObject.GetIterator()) + { + float yOffset = EditorGUIUtility.singleLineHeight; + + if (iterator.NextVisible(true)) + { + do + { + SerializedProperty childProperty = serializedObject.FindProperty(iterator.name); + if (childProperty.name.Equals("m_Script", System.StringComparison.Ordinal)) + { + continue; + } + + bool visible = PropertyUtility.IsVisible(childProperty); + if (!visible) + { + continue; + } + + float childHeight = GetPropertyHeight(childProperty); + Rect childRect = new Rect() + { + x = rect.x, + y = rect.y + yOffset, + width = rect.width, + height = childHeight + }; + + NaughtyEditorGUI.PropertyField(childRect, childProperty, true); + + yOffset += childHeight; + } + while (iterator.NextVisible(false)); + } + } + + serializedObject.ApplyModifiedProperties(); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta new file mode 100644 index 0000000..d5925fe --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1ddb7194615bdc4e8b2088c8d165d8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs new file mode 100644 index 0000000..1fbcfeb --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(InputAxisAttribute))] + public class InputAxisPropertyDrawer : PropertyDrawerBase + { + private static readonly string AssetPath = Path.Combine("ProjectSettings", "InputManager.asset"); + private const string AxesPropertyPath = "m_Axes"; + private const string NamePropertyPath = "m_Name"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.String) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.String) + { + var inputManagerAsset = AssetDatabase.LoadAssetAtPath(AssetPath, typeof(object)); + var inputManager = new SerializedObject(inputManagerAsset); + + var axesProperty = inputManager.FindProperty(AxesPropertyPath); + var axesSet = new HashSet<string>(); + axesSet.Add("(None)"); + + for (var i = 0; i < axesProperty.arraySize; i++) + { + var axis = axesProperty.GetArrayElementAtIndex(i).FindPropertyRelative(NamePropertyPath).stringValue; + axesSet.Add(axis); + } + + var axes = axesSet.ToArray(); + + string propertyString = property.stringValue; + int index = 0; + // check if there is an entry that matches the entry and get the index + // we skip index 0 as that is a special custom case + for (int i = 1; i < axes.Length; i++) + { + if (axes[i].Equals(propertyString, System.StringComparison.Ordinal)) + { + index = i; + break; + } + } + + // Draw the popup box with the current selected index + int newIndex = EditorGUI.Popup(rect, label.text, index, axes); + + // Adjust the actual string value of the property based on the selection + string newValue = newIndex > 0 ? axes[newIndex] : string.Empty; + + if (!property.stringValue.Equals(newValue, System.StringComparison.Ordinal)) + { + property.stringValue = newValue; + } + } + else + { + string message = string.Format("{0} supports only string fields", typeof(InputAxisAttribute).Name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta new file mode 100644 index 0000000..08f8f46 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0de9d3dfe2d466a458be838edf361645 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs new file mode 100644 index 0000000..d789eb9 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs @@ -0,0 +1,88 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(LayerAttribute))] + public class LayerPropertyDrawer : PropertyDrawerBase + { + private const string TypeWarningMessage = "{0} must be an int or a string"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + bool validPropertyType = property.propertyType == SerializedPropertyType.String || property.propertyType == SerializedPropertyType.Integer; + + return validPropertyType + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + switch (property.propertyType) + { + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, GetLayers()); + break; + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, GetLayers()); + break; + default: + string message = string.Format(TypeWarningMessage, property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + break; + } + + EditorGUI.EndProperty(); + } + + private string[] GetLayers() + { + return UnityEditorInternal.InternalEditorUtility.layers; + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, string[] layers) + { + int index = IndexOf(layers, property.stringValue); + int newIndex = EditorGUI.Popup(rect, label.text, index, layers); + string newLayer = layers[newIndex]; + + if (!property.stringValue.Equals(newLayer, StringComparison.Ordinal)) + { + property.stringValue = layers[newIndex]; + } + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, string[] layers) + { + int index = 0; + string layerName = LayerMask.LayerToName(property.intValue); + for (int i = 0; i < layers.Length; i++) + { + if (layerName.Equals(layers[i], StringComparison.Ordinal)) + { + index = i; + break; + } + } + + int newIndex = EditorGUI.Popup(rect, label.text, index, layers); + string newLayerName = layers[newIndex]; + int newLayerNumber = LayerMask.NameToLayer(newLayerName); + + if (property.intValue != newLayerNumber) + { + property.intValue = newLayerNumber; + } + } + + private static int IndexOf(string[] layers, string layer) + { + var index = Array.IndexOf(layers, layer); + return Mathf.Clamp(index, 0, layers.Length - 1); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta new file mode 100644 index 0000000..4b2ac86 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7278ba0893ab7d940b5f944e5b1cf1a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs new file mode 100644 index 0000000..7866c56 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs @@ -0,0 +1,108 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(MinMaxSliderAttribute))] + public class MinMaxSliderPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.Vector2 || property.propertyType == SerializedPropertyType.Vector2Int) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + MinMaxSliderAttribute minMaxSliderAttribute = (MinMaxSliderAttribute)attribute; + + if (property.propertyType == SerializedPropertyType.Vector2 || property.propertyType == SerializedPropertyType.Vector2Int) + { + EditorGUI.BeginProperty(rect, label, property); + + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + float labelWidth = EditorGUIUtility.labelWidth + NaughtyEditorGUI.HorizontalSpacing; + float floatFieldWidth = EditorGUIUtility.fieldWidth; + float sliderWidth = rect.width - labelWidth - 2.0f * floatFieldWidth; + float sliderPadding = 5.0f; + + Rect labelRect = new Rect( + rect.x, + rect.y, + labelWidth, + rect.height); + + Rect sliderRect = new Rect( + rect.x + labelWidth + floatFieldWidth + sliderPadding - indentLength, + rect.y, + sliderWidth - 2.0f * sliderPadding + indentLength, + rect.height); + + Rect minFloatFieldRect = new Rect( + rect.x + labelWidth - indentLength, + rect.y, + floatFieldWidth + indentLength, + rect.height); + + Rect maxFloatFieldRect = new Rect( + rect.x + labelWidth + floatFieldWidth + sliderWidth - indentLength, + rect.y, + floatFieldWidth + indentLength, + rect.height); + + // Draw the label + EditorGUI.LabelField(labelRect, label.text); + + // Draw the slider + EditorGUI.BeginChangeCheck(); + + if (property.propertyType == SerializedPropertyType.Vector2) + { + Vector2 sliderValue = property.vector2Value; + EditorGUI.MinMaxSlider(sliderRect, ref sliderValue.x, ref sliderValue.y, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); + + sliderValue.x = EditorGUI.FloatField(minFloatFieldRect, sliderValue.x); + sliderValue.x = Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); + + sliderValue.y = EditorGUI.FloatField(maxFloatFieldRect, sliderValue.y); + sliderValue.y = Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); + + if (EditorGUI.EndChangeCheck()) + { + property.vector2Value = sliderValue; + } + } + else if (property.propertyType == SerializedPropertyType.Vector2Int) + { + Vector2Int sliderValue = property.vector2IntValue; + float xValue = sliderValue.x; + float yValue = sliderValue.y; + EditorGUI.MinMaxSlider(sliderRect, ref xValue, ref yValue, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); + + sliderValue.x = EditorGUI.IntField(minFloatFieldRect, (int)xValue); + sliderValue.x = (int)Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); + + sliderValue.y = EditorGUI.IntField(maxFloatFieldRect, (int)yValue); + sliderValue.y = (int)Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); + + if (EditorGUI.EndChangeCheck()) + { + property.vector2IntValue = sliderValue; + } + } + + EditorGUI.EndProperty(); + } + else + { + string message = minMaxSliderAttribute.GetType().Name + " can be used only on Vector2 or Vector2Int fields"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta new file mode 100644 index 0000000..4613ffe --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27011af81554b5b4489b155f09275475 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs new file mode 100644 index 0000000..84d8823 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs @@ -0,0 +1,154 @@ +using UnityEngine; +using UnityEditor; +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ProgressBarAttribute))] + public class ProgressBarPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + ProgressBarAttribute progressBarAttribute = PropertyUtility.GetAttribute<ProgressBarAttribute>(property); + var maxValue = GetMaxValue(property, progressBarAttribute); + + return IsNumber(property) && IsNumber(maxValue) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (!IsNumber(property)) + { + string message = string.Format("Field {0} is not a number", property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + return; + } + + ProgressBarAttribute progressBarAttribute = PropertyUtility.GetAttribute<ProgressBarAttribute>(property); + var value = property.propertyType == SerializedPropertyType.Integer ? property.intValue : property.floatValue; + var valueFormatted = property.propertyType == SerializedPropertyType.Integer ? value.ToString() : string.Format("{0:0.00}", value); + var maxValue = GetMaxValue(property, progressBarAttribute); + + if (maxValue != null && IsNumber(maxValue)) + { + var fillPercentage = value / CastToFloat(maxValue); + var barLabel = (!string.IsNullOrEmpty(progressBarAttribute.Name) ? "[" + progressBarAttribute.Name + "] " : "") + valueFormatted + "/" + maxValue; + var barColor = progressBarAttribute.Color.GetColor(); + var labelColor = Color.white; + + var indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect barRect = new Rect() + { + x = rect.x + indentLength, + y = rect.y, + width = rect.width - indentLength, + height = EditorGUIUtility.singleLineHeight + }; + + DrawBar(barRect, Mathf.Clamp01(fillPercentage), barLabel, barColor, labelColor); + } + else + { + string message = string.Format( + "The provided dynamic max value for the progress bar is not correct. Please check if the '{0}' is correct, or the return type is float/int", + nameof(progressBarAttribute.MaxValueName)); + + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private object GetMaxValue(SerializedProperty property, ProgressBarAttribute progressBarAttribute) + { + if (string.IsNullOrEmpty(progressBarAttribute.MaxValueName)) + { + return progressBarAttribute.MaxValue; + } + else + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo valuesFieldInfo = ReflectionUtility.GetField(target, progressBarAttribute.MaxValueName); + if (valuesFieldInfo != null) + { + return valuesFieldInfo.GetValue(target); + } + + PropertyInfo valuesPropertyInfo = ReflectionUtility.GetProperty(target, progressBarAttribute.MaxValueName); + if (valuesPropertyInfo != null) + { + return valuesPropertyInfo.GetValue(target); + } + + MethodInfo methodValuesInfo = ReflectionUtility.GetMethod(target, progressBarAttribute.MaxValueName); + if (methodValuesInfo != null && + (methodValuesInfo.ReturnType == typeof(float) || methodValuesInfo.ReturnType == typeof(int)) && + methodValuesInfo.GetParameters().Length == 0) + { + return methodValuesInfo.Invoke(target, null); + } + + return null; + } + } + + private void DrawBar(Rect rect, float fillPercent, string label, Color barColor, Color labelColor) + { + if (Event.current.type != EventType.Repaint) + { + return; + } + + var fillRect = new Rect(rect.x, rect.y, rect.width * fillPercent, rect.height); + + EditorGUI.DrawRect(rect, new Color(0.13f, 0.13f, 0.13f)); + EditorGUI.DrawRect(fillRect, barColor); + + // set alignment and cache the default + var align = GUI.skin.label.alignment; + GUI.skin.label.alignment = TextAnchor.UpperCenter; + + // set the color and cache the default + var c = GUI.contentColor; + GUI.contentColor = labelColor; + + // calculate the position + var labelRect = new Rect(rect.x, rect.y - 2, rect.width, rect.height); + + // draw~ + EditorGUI.DropShadowLabel(labelRect, label); + + // reset color and alignment + GUI.contentColor = c; + GUI.skin.label.alignment = align; + } + + private bool IsNumber(SerializedProperty property) + { + bool isNumber = property.propertyType == SerializedPropertyType.Float || property.propertyType == SerializedPropertyType.Integer; + return isNumber; + } + + private bool IsNumber(object obj) + { + return (obj is float) || (obj is int); + } + + private float CastToFloat(object obj) + { + if (obj is int) + { + return (int)obj; + } + else + { + return (float)obj; + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta new file mode 100644 index 0000000..dfb90f1 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bcbc424b10864b4eb6e3bcfb276cdf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs new file mode 100644 index 0000000..36afd85 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs @@ -0,0 +1,94 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyDrawerBase : PropertyDrawer + { + public sealed override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + // Check if visible + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return; + } + + // Validate + ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes<ValidatorAttribute>(property); + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(property); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(property); + + using (new EditorGUI.DisabledScope(disabled: !enabled)) + { + OnGUI_Internal(rect, property, PropertyUtility.GetLabel(property)); + } + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + PropertyUtility.CallOnValueChangedCallbacks(property); + } + } + + protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label); + + sealed override public float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return 0.0f; + } + + return GetPropertyHeight_Internal(property, label); + } + + protected virtual float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return EditorGUI.GetPropertyHeight(property, includeChildren: true); + } + + protected float GetPropertyHeight(SerializedProperty property) + { + SpecialCaseDrawerAttribute specialCaseAttribute = PropertyUtility.GetAttribute<SpecialCaseDrawerAttribute>(property); + if (specialCaseAttribute != null) + { + return specialCaseAttribute.GetDrawer().GetPropertyHeight(property); + } + + return EditorGUI.GetPropertyHeight(property, includeChildren: true); + } + + public virtual float GetHelpBoxHeight() + { + return EditorGUIUtility.singleLineHeight * 2.0f; + } + + public void DrawDefaultPropertyAndHelpBox(Rect rect, SerializedProperty property, string message, MessageType messageType) + { + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect helpBoxRect = new Rect( + rect.x + indentLength, + rect.y, + rect.width - indentLength, + GetHelpBoxHeight()); + + NaughtyEditorGUI.HelpBox(helpBoxRect, message, MessageType.Warning, context: property.serializedObject.targetObject); + + Rect propertyRect = new Rect( + rect.x, + rect.y + GetHelpBoxHeight(), + rect.width, + GetPropertyHeight(property)); + + EditorGUI.PropertyField(propertyRect, property, true); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta new file mode 100644 index 0000000..71a80b6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 574f5fa6033f26342816a8a5f39749e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs new file mode 100644 index 0000000..6a78fa1 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs @@ -0,0 +1,80 @@ +using UnityEngine; +using UnityEditor; +using System.Text.RegularExpressions; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ResizableTextAreaAttribute))] + public class ResizableTextAreaPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (property.propertyType == SerializedPropertyType.String) + { + float labelHeight = EditorGUIUtility.singleLineHeight; + float textAreaHeight = GetTextAreaHeight(property.stringValue); + return labelHeight + textAreaHeight; + } + else + { + return GetPropertyHeight(property) + GetHelpBoxHeight(); + } + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.String) + { + Rect labelRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.LabelField(labelRect, label.text); + + EditorGUI.BeginChangeCheck(); + + Rect textAreaRect = new Rect() + { + x = labelRect.x, + y = labelRect.y + EditorGUIUtility.singleLineHeight, + width = labelRect.width, + height = GetTextAreaHeight(property.stringValue) + }; + + string textAreaValue = EditorGUI.TextArea(textAreaRect, property.stringValue); + + if (EditorGUI.EndChangeCheck()) + { + property.stringValue = textAreaValue; + } + } + else + { + string message = typeof(ResizableTextAreaAttribute).Name + " can only be used on string fields"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private int GetNumberOfLines(string text) + { + string content = Regex.Replace(text, @"\r\n|\n\r|\r|\n", Environment.NewLine); + string[] lines = content.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + return lines.Length; + } + + private float GetTextAreaHeight(string text) + { + float height = (EditorGUIUtility.singleLineHeight - 3.0f) * GetNumberOfLines(text) + 3.0f; + return height; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta new file mode 100644 index 0000000..4b1e4a5 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e27ffd9a96b58c46bb74cc93de3e06f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs new file mode 100644 index 0000000..9b0dfb3 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs @@ -0,0 +1,99 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; +using System.Text.RegularExpressions; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(SceneAttribute))] + public class ScenePropertyDrawer : PropertyDrawerBase + { + private const string SceneListItem = "{0} ({1})"; + private const string ScenePattern = @".+\/(.+)\.unity"; + private const string TypeWarningMessage = "{0} must be an int or a string"; + private const string BuildSettingsWarningMessage = "No scenes in the build settings"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + bool validPropertyType = property.propertyType == SerializedPropertyType.String || property.propertyType == SerializedPropertyType.Integer; + bool anySceneInBuildSettings = GetScenes().Length > 0; + + return (validPropertyType && anySceneInBuildSettings) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + string[] scenes = GetScenes(); + bool anySceneInBuildSettings = scenes.Length > 0; + if (!anySceneInBuildSettings) + { + DrawDefaultPropertyAndHelpBox(rect, property, BuildSettingsWarningMessage, MessageType.Warning); + return; + } + + string[] sceneOptions = GetSceneOptions(scenes); + switch (property.propertyType) + { + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, scenes, sceneOptions); + break; + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, sceneOptions); + break; + default: + string message = string.Format(TypeWarningMessage, property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + break; + } + + EditorGUI.EndProperty(); + } + + private string[] GetScenes() + { + return EditorBuildSettings.scenes + .Where(scene => scene.enabled) + .Select(scene => Regex.Match(scene.path, ScenePattern).Groups[1].Value) + .ToArray(); + } + + private string[] GetSceneOptions(string[] scenes) + { + return scenes.Select((s, i) => string.Format(SceneListItem, s, i)).ToArray(); + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, string[] scenes, string[] sceneOptions) + { + int index = IndexOf(scenes, property.stringValue); + int newIndex = EditorGUI.Popup(rect, label.text, index, sceneOptions); + string newScene = scenes[newIndex]; + + if (!property.stringValue.Equals(newScene, StringComparison.Ordinal)) + { + property.stringValue = scenes[newIndex]; + } + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, string[] sceneOptions) + { + int index = property.intValue; + int newIndex = EditorGUI.Popup(rect, label.text, index, sceneOptions); + + if (property.intValue != newIndex) + { + property.intValue = newIndex; + } + } + + private static int IndexOf(string[] scenes, string scene) + { + var index = Array.IndexOf(scenes, scene); + return Mathf.Clamp(index, 0, scenes.Length - 1); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta new file mode 100644 index 0000000..a416544 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f5ed440d4f429e42a5da7bc5df48fd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs new file mode 100644 index 0000000..ee3d10b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs @@ -0,0 +1,110 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ShowAssetPreviewAttribute))] + public class ShowAssetPreviewPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture != null) + { + return GetPropertyHeight(property) + GetAssetPreviewSize(property).y; + } + else + { + return GetPropertyHeight(property); + } + } + else + { + return GetPropertyHeight(property) + GetHelpBoxHeight(); + } + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + Rect propertyRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.PropertyField(propertyRect, property, label); + + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture != null) + { + Rect previewRect = new Rect() + { + x = rect.x + NaughtyEditorGUI.GetIndentLength(rect), + y = rect.y + EditorGUIUtility.singleLineHeight, + width = rect.width, + height = GetAssetPreviewSize(property).y + }; + + GUI.Label(previewRect, previewTexture); + } + } + else + { + string message = property.name + " doesn't have an asset preview"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private Texture2D GetAssetPreview(SerializedProperty property) + { + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue != null) + { + Texture2D previewTexture = AssetPreview.GetAssetPreview(property.objectReferenceValue); + return previewTexture; + } + + return null; + } + + return null; + } + + private Vector2 GetAssetPreviewSize(SerializedProperty property) + { + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture == null) + { + return Vector2.zero; + } + else + { + int targetWidth = ShowAssetPreviewAttribute.DefaultWidth; + int targetHeight = ShowAssetPreviewAttribute.DefaultHeight; + + ShowAssetPreviewAttribute showAssetPreviewAttribute = PropertyUtility.GetAttribute<ShowAssetPreviewAttribute>(property); + if (showAssetPreviewAttribute != null) + { + targetWidth = showAssetPreviewAttribute.Width; + targetHeight = showAssetPreviewAttribute.Height; + } + + int width = Mathf.Clamp(targetWidth, 0, previewTexture.width); + int height = Mathf.Clamp(targetHeight, 0, previewTexture.height); + + return new Vector2(width, height); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta new file mode 100644 index 0000000..5a4d16d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24dee3fc91cfe94438de1e3c158f187f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs new file mode 100644 index 0000000..8822715 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs @@ -0,0 +1,91 @@ +using UnityEngine; +using UnityEditor; +using System; +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(SortingLayerAttribute))] + public class SortingLayerPropertyDrawer : PropertyDrawerBase + { + private const string TypeWarningMessage = "{0} must be an int or a string"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + bool validPropertyType = property.propertyType == SerializedPropertyType.String || property.propertyType == SerializedPropertyType.Integer; + + return validPropertyType + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + switch (property.propertyType) + { + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, GetLayers()); + break; + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, GetLayers()); + break; + default: + string message = string.Format(TypeWarningMessage, property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + break; + } + + EditorGUI.EndProperty(); + } + + private string[] GetLayers() + { + Type internalEditorUtilityType = typeof(UnityEditorInternal.InternalEditorUtility); + PropertyInfo sortingLayersProperty = internalEditorUtilityType.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic); + return (string[])sortingLayersProperty.GetValue(null, new object[0]); + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, string[] layers) + { + int index = IndexOf(layers, property.stringValue); + int newIndex = EditorGUI.Popup(rect, label.text, index, layers); + string newLayer = layers[newIndex]; + + if (!property.stringValue.Equals(newLayer, StringComparison.Ordinal)) + { + property.stringValue = layers[newIndex]; + } + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, string[] layers) + { + int index = 0; + string layerName = SortingLayer.IDToName(property.intValue); + for (int i = 0; i < layers.Length; i++) + { + if (layerName.Equals(layers[i], StringComparison.Ordinal)) + { + index = i; + break; + } + } + + int newIndex = EditorGUI.Popup(rect, label.text, index, layers); + string newLayerName = layers[newIndex]; + int newLayerNumber = SortingLayer.NameToID(newLayerName); + + if (property.intValue != newLayerNumber) + { + property.intValue = newLayerNumber; + } + } + + private static int IndexOf(string[] layers, string layer) + { + var index = Array.IndexOf(layers, layer); + return Mathf.Clamp(index, 0, layers.Length - 1); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs.meta new file mode 100644 index 0000000..d99bdf9 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/SortingLayerPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b0ed20ed34d732246a98cde96351fccb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs new file mode 100644 index 0000000..7a00a40 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(TagAttribute))] + public class TagPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.String) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.String) + { + // generate the taglist + custom tags + List<string> tagList = new List<string>(); + tagList.Add("(None)"); + tagList.Add("Untagged"); + tagList.AddRange(UnityEditorInternal.InternalEditorUtility.tags); + + string propertyString = property.stringValue; + int index = 0; + // check if there is an entry that matches the entry and get the index + // we skip index 0 as that is a special custom case + for (int i = 1; i < tagList.Count; i++) + { + if (tagList[i].Equals(propertyString, System.StringComparison.Ordinal)) + { + index = i; + break; + } + } + + // Draw the popup box with the current selected index + int newIndex = EditorGUI.Popup(rect, label.text, index, tagList.ToArray()); + + // Adjust the actual string value of the property based on the selection + string newValue = newIndex > 0 ? tagList[newIndex] : string.Empty; + + if (!property.stringValue.Equals(newValue, System.StringComparison.Ordinal)) + { + property.stringValue = newValue; + } + } + else + { + string message = string.Format("{0} supports only string fields", typeof(TagAttribute).Name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta new file mode 100644 index 0000000..75f76c5 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3df4c068c970ab6498df7a60efbde311 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta new file mode 100644 index 0000000..88cd458 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 750a102004a7e4f46a2046a3d74cae19 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs new file mode 100644 index 0000000..fea369d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs @@ -0,0 +1,205 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public class ReorderableListPropertyDrawer : SpecialCasePropertyDrawerBase + { + public static readonly ReorderableListPropertyDrawer Instance = new ReorderableListPropertyDrawer(); + + private readonly Dictionary<string, ReorderableList> _reorderableListsByPropertyName = new Dictionary<string, ReorderableList>(); + + private GUIStyle _labelStyle; + + private GUIStyle GetLabelStyle() + { + if (_labelStyle == null) + { + _labelStyle = new GUIStyle(EditorStyles.boldLabel); + _labelStyle.richText = true; + } + + return _labelStyle; + } + + private string GetPropertyKeyName(SerializedProperty property) + { + return property.serializedObject.targetObject.GetInstanceID() + "." + property.name; + } + + protected override float GetPropertyHeight_Internal(SerializedProperty property) + { + if (property.isArray) + { + string key = GetPropertyKeyName(property); + + if (_reorderableListsByPropertyName.TryGetValue(key, out ReorderableList reorderableList) == false) + { + return 0; + } + + return reorderableList.GetHeight(); + } + + return EditorGUI.GetPropertyHeight(property, true); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + if (property.isArray) + { + string key = GetPropertyKeyName(property); + + ReorderableList reorderableList = null; + if (!_reorderableListsByPropertyName.ContainsKey(key)) + { + reorderableList = new ReorderableList(property.serializedObject, property, true, true, true, true) + { + drawHeaderCallback = (Rect r) => + { + EditorGUI.LabelField(r, string.Format("{0}: {1}", label.text, property.arraySize), GetLabelStyle()); + HandleDragAndDrop(r, reorderableList); + }, + + drawElementCallback = (Rect r, int index, bool isActive, bool isFocused) => + { + SerializedProperty element = property.GetArrayElementAtIndex(index); + r.y += 1.0f; + r.x += 10.0f; + r.width -= 10.0f; + + EditorGUI.PropertyField(new Rect(r.x, r.y, r.width, EditorGUIUtility.singleLineHeight), element, true); + }, + + elementHeightCallback = (int index) => + { + return EditorGUI.GetPropertyHeight(property.GetArrayElementAtIndex(index)) + 4.0f; + } + }; + + _reorderableListsByPropertyName[key] = reorderableList; + } + + reorderableList = _reorderableListsByPropertyName[key]; + + if (rect == default) + { + reorderableList.DoLayoutList(); + } + else + { + reorderableList.DoList(rect); + } + } + else + { + string message = typeof(ReorderableListAttribute).Name + " can be used only on arrays or lists"; + NaughtyEditorGUI.HelpBox_Layout(message, MessageType.Warning, context: property.serializedObject.targetObject); + EditorGUILayout.PropertyField(property, true); + } + } + + public void ClearCache() + { + _reorderableListsByPropertyName.Clear(); + } + + private Object GetAssignableObject(Object obj, ReorderableList list) + { + System.Type listType = PropertyUtility.GetPropertyType(list.serializedProperty); + System.Type elementType = ReflectionUtility.GetListElementType(listType); + + if (elementType == null) + { + return null; + } + + System.Type objType = obj.GetType(); + + if (elementType.IsAssignableFrom(objType)) + { + return obj; + } + + if (objType == typeof(GameObject)) + { + if (typeof(Transform).IsAssignableFrom(elementType)) + { + Transform transform = ((GameObject)obj).transform; + if (elementType == typeof(RectTransform)) + { + RectTransform rectTransform = transform as RectTransform; + return rectTransform; + } + else + { + return transform; + } + } + else if (typeof(MonoBehaviour).IsAssignableFrom(elementType)) + { + return ((GameObject)obj).GetComponent(elementType); + } + } + + return null; + } + + private void HandleDragAndDrop(Rect rect, ReorderableList list) + { + var currentEvent = Event.current; + var usedEvent = false; + + switch (currentEvent.type) + { + case EventType.DragExited: + if (GUI.enabled) + { + HandleUtility.Repaint(); + } + + break; + + case EventType.DragUpdated: + case EventType.DragPerform: + if (rect.Contains(currentEvent.mousePosition) && GUI.enabled) + { + // Check each single object, so we can add multiple objects in a single drag. + bool didAcceptDrag = false; + Object[] references = DragAndDrop.objectReferences; + foreach (Object obj in references) + { + Object assignableObject = GetAssignableObject(obj, list); + if (assignableObject != null) + { + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if (currentEvent.type == EventType.DragPerform) + { + list.serializedProperty.arraySize++; + int arrayEnd = list.serializedProperty.arraySize - 1; + list.serializedProperty.GetArrayElementAtIndex(arrayEnd).objectReferenceValue = assignableObject; + didAcceptDrag = true; + } + } + } + + if (didAcceptDrag) + { + GUI.changed = true; + DragAndDrop.AcceptDrag(); + usedEvent = true; + } + } + + break; + } + + if (usedEvent) + { + currentEvent.Use(); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta new file mode 100644 index 0000000..4ff1a66 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bf36691a6d456564db2fcbfa8726b3f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs new file mode 100644 index 0000000..0490b50 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public abstract class SpecialCasePropertyDrawerBase + { + public void OnGUI(Rect rect, SerializedProperty property) + { + // Check if visible + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return; + } + + // Validate + ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes<ValidatorAttribute>(property); + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(property); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(property); + + using (new EditorGUI.DisabledScope(disabled: !enabled)) + { + OnGUI_Internal(rect, property, PropertyUtility.GetLabel(property)); + } + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + PropertyUtility.CallOnValueChangedCallbacks(property); + } + } + + public float GetPropertyHeight(SerializedProperty property) + { + return GetPropertyHeight_Internal(property); + } + + protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label); + protected abstract float GetPropertyHeight_Internal(SerializedProperty property); + } + + public static class SpecialCaseDrawerAttributeExtensions + { + private static Dictionary<Type, SpecialCasePropertyDrawerBase> _drawersByAttributeType; + + static SpecialCaseDrawerAttributeExtensions() + { + _drawersByAttributeType = new Dictionary<Type, SpecialCasePropertyDrawerBase>(); + _drawersByAttributeType[typeof(ReorderableListAttribute)] = ReorderableListPropertyDrawer.Instance; + } + + public static SpecialCasePropertyDrawerBase GetDrawer(this SpecialCaseDrawerAttribute attr) + { + SpecialCasePropertyDrawerBase drawer; + if (_drawersByAttributeType.TryGetValue(attr.GetType(), out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta new file mode 100644 index 0000000..c60287c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 771776453ad34b045a41dea54856fa12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta new file mode 100644 index 0000000..949d96d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 41caedece93df91439d624dc9d124424 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs new file mode 100644 index 0000000..0e7d3b7 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs @@ -0,0 +1,53 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class MaxValuePropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + MaxValueAttribute maxValueAttribute = PropertyUtility.GetAttribute<MaxValueAttribute>(property); + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue > maxValueAttribute.MaxValue) + { + property.intValue = (int)maxValueAttribute.MaxValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue > maxValueAttribute.MaxValue) + { + property.floatValue = maxValueAttribute.MaxValue; + } + } + else if (property.propertyType == SerializedPropertyType.Vector2) + { + property.vector2Value = Vector2.Min(property.vector2Value, new Vector2(maxValueAttribute.MaxValue, maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3) + { + property.vector3Value = Vector3.Min(property.vector3Value, new Vector3(maxValueAttribute.MaxValue, maxValueAttribute.MaxValue, maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector4) + { + property.vector4Value = Vector4.Min(property.vector4Value, new Vector4(maxValueAttribute.MaxValue, maxValueAttribute.MaxValue, maxValueAttribute.MaxValue, maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector2Int) + { + property.vector2IntValue = Vector2Int.Min(property.vector2IntValue, new Vector2Int((int)maxValueAttribute.MaxValue, (int)maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3Int) + { + property.vector3IntValue = Vector3Int.Min(property.vector3IntValue, new Vector3Int((int)maxValueAttribute.MaxValue, (int)maxValueAttribute.MaxValue, (int)maxValueAttribute.MaxValue)); + } + else + { + string warning = maxValueAttribute.GetType().Name + " can be used only on int, float, Vector or VectorInt fields"; + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta new file mode 100644 index 0000000..3e809ac --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 627b8e9e7bda6fa408c6f47fb8285665 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs new file mode 100644 index 0000000..80df069 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs @@ -0,0 +1,53 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class MinValuePropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + MinValueAttribute minValueAttribute = PropertyUtility.GetAttribute<MinValueAttribute>(property); + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue < minValueAttribute.MinValue) + { + property.intValue = (int)minValueAttribute.MinValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue < minValueAttribute.MinValue) + { + property.floatValue = minValueAttribute.MinValue; + } + } + else if (property.propertyType == SerializedPropertyType.Vector2) + { + property.vector2Value = Vector2.Max(property.vector2Value, new Vector2(minValueAttribute.MinValue, minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3) + { + property.vector3Value = Vector3.Max(property.vector3Value, new Vector3(minValueAttribute.MinValue, minValueAttribute.MinValue, minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector4) + { + property.vector4Value = Vector4.Max(property.vector4Value, new Vector4(minValueAttribute.MinValue, minValueAttribute.MinValue, minValueAttribute.MinValue, minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector2Int) + { + property.vector2IntValue = Vector2Int.Max(property.vector2IntValue, new Vector2Int((int)minValueAttribute.MinValue, (int)minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3Int) + { + property.vector3IntValue = Vector3Int.Max(property.vector3IntValue, new Vector3Int((int)minValueAttribute.MinValue, (int)minValueAttribute.MinValue, (int)minValueAttribute.MinValue)); + } + else + { + string warning = minValueAttribute.GetType().Name + " can be used only on int, float, Vector or VectorInt fields"; + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta new file mode 100644 index 0000000..b3bb871 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03dd23f6c0598074fb1b721dcd8fe023 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs new file mode 100644 index 0000000..1c0411f --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyValidatorBase + { + public abstract void ValidateProperty(SerializedProperty property); + } + + public static class ValidatorAttributeExtensions + { + private static Dictionary<Type, PropertyValidatorBase> _validatorsByAttributeType; + + static ValidatorAttributeExtensions() + { + _validatorsByAttributeType = new Dictionary<Type, PropertyValidatorBase>(); + _validatorsByAttributeType[typeof(MinValueAttribute)] = new MinValuePropertyValidator(); + _validatorsByAttributeType[typeof(MaxValueAttribute)] = new MaxValuePropertyValidator(); + _validatorsByAttributeType[typeof(RequiredAttribute)] = new RequiredPropertyValidator(); + _validatorsByAttributeType[typeof(ValidateInputAttribute)] = new ValidateInputPropertyValidator(); + } + + public static PropertyValidatorBase GetValidator(this ValidatorAttribute attr) + { + PropertyValidatorBase validator; + if (_validatorsByAttributeType.TryGetValue(attr.GetType(), out validator)) + { + return validator; + } + else + { + return null; + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta new file mode 100644 index 0000000..97fe581 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f332c8e1c3627d742aa9158af7b02ccc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs new file mode 100644 index 0000000..1133650 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs @@ -0,0 +1,31 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class RequiredPropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + RequiredAttribute requiredAttribute = PropertyUtility.GetAttribute<RequiredAttribute>(property); + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue == null) + { + string errorMessage = property.name + " is required"; + if (!string.IsNullOrEmpty(requiredAttribute.Message)) + { + errorMessage = requiredAttribute.Message; + } + + NaughtyEditorGUI.HelpBox_Layout(errorMessage, MessageType.Error, context: property.serializedObject.targetObject); + } + } + else + { + string warning = requiredAttribute.GetType().Name + " works only on reference types"; + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta new file mode 100644 index 0000000..d24143a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a7e657ea45f6414682b5f41be9541b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs new file mode 100644 index 0000000..1252c70 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs @@ -0,0 +1,76 @@ +using UnityEditor; +using System.Reflection; +using System; + +namespace NaughtyAttributes.Editor +{ + public class ValidateInputPropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + ValidateInputAttribute validateInputAttribute = PropertyUtility.GetAttribute<ValidateInputAttribute>(property); + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + MethodInfo validationCallback = ReflectionUtility.GetMethod(target, validateInputAttribute.CallbackName); + + if (validationCallback != null && + validationCallback.ReturnType == typeof(bool)) + { + ParameterInfo[] callbackParameters = validationCallback.GetParameters(); + + if (callbackParameters.Length == 0) + { + if (!(bool)validationCallback.Invoke(target, null)) + { + if (string.IsNullOrEmpty(validateInputAttribute.Message)) + { + NaughtyEditorGUI.HelpBox_Layout( + property.name + " is not valid", MessageType.Error, context: property.serializedObject.targetObject); + } + else + { + NaughtyEditorGUI.HelpBox_Layout( + validateInputAttribute.Message, MessageType.Error, context: property.serializedObject.targetObject); + } + } + } + else if (callbackParameters.Length == 1) + { + FieldInfo fieldInfo = ReflectionUtility.GetField(target, property.name); + Type fieldType = fieldInfo.FieldType; + Type parameterType = callbackParameters[0].ParameterType; + + if (fieldType == parameterType) + { + if (!(bool)validationCallback.Invoke(target, new object[] { fieldInfo.GetValue(target) })) + { + if (string.IsNullOrEmpty(validateInputAttribute.Message)) + { + NaughtyEditorGUI.HelpBox_Layout( + property.name + " is not valid", MessageType.Error, context: property.serializedObject.targetObject); + } + else + { + NaughtyEditorGUI.HelpBox_Layout( + validateInputAttribute.Message, MessageType.Error, context: property.serializedObject.targetObject); + } + } + } + else + { + string warning = "The field type is not the same as the callback's parameter type"; + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + else + { + string warning = + validateInputAttribute.GetType().Name + + " needs a callback with boolean return type and an optional single parameter of the same type as the field"; + + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta new file mode 100644 index 0000000..3f6e539 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f6adf84ed53a7840a456e8b4dce38d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility.meta new file mode 100644 index 0000000..ed16edd --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: acb4475c71a3fe947a81ced84ab89c6d +folderAsset: yes +timeCreated: 1508062761 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs new file mode 100644 index 0000000..ca5f4ca --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs @@ -0,0 +1,55 @@ +using UnityEngine; +using System.Reflection; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class ButtonUtility + { + public static bool IsEnabled(Object target, MethodInfo method) + { + EnableIfAttributeBase enableIfAttribute = method.GetCustomAttribute<EnableIfAttributeBase>(); + if (enableIfAttribute == null) + { + return true; + } + + List<bool> conditionValues = PropertyUtility.GetConditionValues(target, enableIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = PropertyUtility.GetConditionsFlag(conditionValues, enableIfAttribute.ConditionOperator, enableIfAttribute.Inverted); + return enabled; + } + else + { + string message = enableIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, target); + + return false; + } + } + + public static bool IsVisible(Object target, MethodInfo method) + { + ShowIfAttributeBase showIfAttribute = method.GetCustomAttribute<ShowIfAttributeBase>(); + if (showIfAttribute == null) + { + return true; + } + + List<bool> conditionValues = PropertyUtility.GetConditionValues(target, showIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = PropertyUtility.GetConditionsFlag(conditionValues, showIfAttribute.ConditionOperator, showIfAttribute.Inverted); + return enabled; + } + else + { + string message = showIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, target); + + return false; + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta new file mode 100644 index 0000000..cf4dace --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a273f81125ec52d4cb5dec2228afda0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs new file mode 100644 index 0000000..ee17a7a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs @@ -0,0 +1,380 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEditor.Experimental.SceneManagement; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class NaughtyEditorGUI + { + public const float IndentLength = 15.0f; + public const float HorizontalSpacing = 2.0f; + + private static GUIStyle _buttonStyle = new GUIStyle(GUI.skin.button) { richText = true }; + + private delegate void PropertyFieldFunction(Rect rect, SerializedProperty property, GUIContent label, bool includeChildren); + + public static void PropertyField(Rect rect, SerializedProperty property, bool includeChildren) + { + PropertyField_Implementation(rect, property, includeChildren, DrawPropertyField); + } + + public static void PropertyField_Layout(SerializedProperty property, bool includeChildren) + { + Rect dummyRect = new Rect(); + PropertyField_Implementation(dummyRect, property, includeChildren, DrawPropertyField_Layout); + } + + private static void DrawPropertyField(Rect rect, SerializedProperty property, GUIContent label, bool includeChildren) + { + EditorGUI.PropertyField(rect, property, label, includeChildren); + } + + private static void DrawPropertyField_Layout(Rect rect, SerializedProperty property, GUIContent label, bool includeChildren) + { + EditorGUILayout.PropertyField(property, label, includeChildren); + } + + private static void PropertyField_Implementation(Rect rect, SerializedProperty property, bool includeChildren, PropertyFieldFunction propertyFieldFunction) + { + SpecialCaseDrawerAttribute specialCaseAttribute = PropertyUtility.GetAttribute<SpecialCaseDrawerAttribute>(property); + if (specialCaseAttribute != null) + { + specialCaseAttribute.GetDrawer().OnGUI(rect, property); + } + else + { + // Check if visible + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return; + } + + // Validate + ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes<ValidatorAttribute>(property); + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(property); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(property); + + using (new EditorGUI.DisabledScope(disabled: !enabled)) + { + propertyFieldFunction.Invoke(rect, property, PropertyUtility.GetLabel(property), includeChildren); + } + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + PropertyUtility.CallOnValueChangedCallbacks(property); + } + } + } + + public static float GetIndentLength(Rect sourceRect) + { + Rect indentRect = EditorGUI.IndentedRect(sourceRect); + float indentLength = indentRect.x - sourceRect.x; + + return indentLength; + } + + public static void BeginBoxGroup_Layout(string label = "") + { + EditorGUILayout.BeginVertical(GUI.skin.box); + if (!string.IsNullOrEmpty(label)) + { + EditorGUILayout.LabelField(label, EditorStyles.boldLabel); + } + } + + public static void EndBoxGroup_Layout() + { + EditorGUILayout.EndVertical(); + } + + /// <summary> + /// Creates a dropdown + /// </summary> + /// <param name="rect">The rect the defines the position and size of the dropdown in the inspector</param> + /// <param name="serializedObject">The serialized object that is being updated</param> + /// <param name="target">The target object that contains the dropdown</param> + /// <param name="dropdownField">The field of the target object that holds the currently selected dropdown value</param> + /// <param name="label">The label of the dropdown</param> + /// <param name="selectedValueIndex">The index of the value from the values array</param> + /// <param name="values">The values of the dropdown</param> + /// <param name="displayOptions">The display options for the values</param> + public static void Dropdown( + Rect rect, SerializedObject serializedObject, object target, FieldInfo dropdownField, + string label, int selectedValueIndex, object[] values, string[] displayOptions) + { + EditorGUI.BeginChangeCheck(); + + int newIndex = EditorGUI.Popup(rect, label, selectedValueIndex, displayOptions); + object newValue = values[newIndex]; + + object dropdownValue = dropdownField.GetValue(target); + if (dropdownValue == null || !dropdownValue.Equals(newValue)) + { + Undo.RecordObject(serializedObject.targetObject, "Dropdown"); + + // TODO: Problem with structs, because they are value type. + // The solution is to make boxing/unboxing but unfortunately I don't know the compile time type of the target object + dropdownField.SetValue(target, newValue); + } + } + + public static void Button(UnityEngine.Object target, MethodInfo methodInfo) + { + bool visible = ButtonUtility.IsVisible(target, methodInfo); + if (!visible) + { + return; + } + + if (methodInfo.GetParameters().All(p => p.IsOptional)) + { + ButtonAttribute buttonAttribute = (ButtonAttribute)methodInfo.GetCustomAttributes(typeof(ButtonAttribute), true)[0]; + string buttonText = string.IsNullOrEmpty(buttonAttribute.Text) ? ObjectNames.NicifyVariableName(methodInfo.Name) : buttonAttribute.Text; + + bool buttonEnabled = ButtonUtility.IsEnabled(target, methodInfo); + + EButtonEnableMode mode = buttonAttribute.SelectedEnableMode; + buttonEnabled &= + mode == EButtonEnableMode.Always || + mode == EButtonEnableMode.Editor && !Application.isPlaying || + mode == EButtonEnableMode.Playmode && Application.isPlaying; + + bool methodIsCoroutine = methodInfo.ReturnType == typeof(IEnumerator); + if (methodIsCoroutine) + { + buttonEnabled &= (Application.isPlaying ? true : false); + } + + EditorGUI.BeginDisabledGroup(!buttonEnabled); + + if (GUILayout.Button(buttonText, _buttonStyle)) + { + object[] defaultParams = methodInfo.GetParameters().Select(p => p.DefaultValue).ToArray(); + IEnumerator methodResult = methodInfo.Invoke(target, defaultParams) as IEnumerator; + + if (!Application.isPlaying) + { + // Set target object and scene dirty to serialize changes to disk + EditorUtility.SetDirty(target); + + PrefabStage stage = PrefabStageUtility.GetCurrentPrefabStage(); + if (stage != null) + { + // Prefab mode + EditorSceneManager.MarkSceneDirty(stage.scene); + } + else + { + // Normal scene + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + } + } + else if (methodResult != null && target is MonoBehaviour behaviour) + { + behaviour.StartCoroutine(methodResult); + } + } + + EditorGUI.EndDisabledGroup(); + } + else + { + string warning = typeof(ButtonAttribute).Name + " works only on methods with no parameters"; + HelpBox_Layout(warning, MessageType.Warning, context: target, logToConsole: true); + } + } + + public static void NativeProperty_Layout(UnityEngine.Object target, PropertyInfo property) + { + object value = property.GetValue(target, null); + + if (value == null) + { + string warning = string.Format("{0} is null. {1} doesn't support reference types with null value", ObjectNames.NicifyVariableName(property.Name), typeof(ShowNativePropertyAttribute).Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + else if (!Field_Layout(value, ObjectNames.NicifyVariableName(property.Name))) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNativePropertyAttribute).Name, property.PropertyType.Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + } + + public static void NonSerializedField_Layout(UnityEngine.Object target, FieldInfo field) + { + object value = field.GetValue(target); + + if (value == null) + { + string warning = string.Format("{0} is null. {1} doesn't support reference types with null value", ObjectNames.NicifyVariableName(field.Name), typeof(ShowNonSerializedFieldAttribute).Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + else if (!Field_Layout(value, ObjectNames.NicifyVariableName(field.Name))) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNonSerializedFieldAttribute).Name, field.FieldType.Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + } + + public static void HorizontalLine(Rect rect, float height, Color color) + { + rect.height = height; + EditorGUI.DrawRect(rect, color); + } + + public static void HelpBox(Rect rect, string message, MessageType type, UnityEngine.Object context = null, bool logToConsole = false) + { + EditorGUI.HelpBox(rect, message, type); + + if (logToConsole) + { + DebugLogMessage(message, type, context); + } + } + + public static void HelpBox_Layout(string message, MessageType type, UnityEngine.Object context = null, bool logToConsole = false) + { + EditorGUILayout.HelpBox(message, type); + + if (logToConsole) + { + DebugLogMessage(message, type, context); + } + } + + public static bool Field_Layout(object value, string label) + { + using (new EditorGUI.DisabledScope(disabled: true)) + { + bool isDrawn = true; + Type valueType = value.GetType(); + + if (valueType == typeof(bool)) + { + EditorGUILayout.Toggle(label, (bool)value); + } + else if (valueType == typeof(short)) + { + EditorGUILayout.IntField(label, (short)value); + } + else if (valueType == typeof(ushort)) + { + EditorGUILayout.IntField(label, (ushort)value); + } + else if (valueType == typeof(int)) + { + EditorGUILayout.IntField(label, (int)value); + } + else if (valueType == typeof(uint)) + { + EditorGUILayout.LongField(label, (uint)value); + } + else if (valueType == typeof(long)) + { + EditorGUILayout.LongField(label, (long)value); + } + else if (valueType == typeof(ulong)) + { + EditorGUILayout.TextField(label, ((ulong)value).ToString()); + } + else if (valueType == typeof(float)) + { + EditorGUILayout.FloatField(label, (float)value); + } + else if (valueType == typeof(double)) + { + EditorGUILayout.DoubleField(label, (double)value); + } + else if (valueType == typeof(string)) + { + EditorGUILayout.TextField(label, (string)value); + } + else if (valueType == typeof(Vector2)) + { + EditorGUILayout.Vector2Field(label, (Vector2)value); + } + else if (valueType == typeof(Vector3)) + { + EditorGUILayout.Vector3Field(label, (Vector3)value); + } + else if (valueType == typeof(Vector4)) + { + EditorGUILayout.Vector4Field(label, (Vector4)value); + } + else if (valueType == typeof(Vector2Int)) + { + EditorGUILayout.Vector2IntField(label, (Vector2Int)value); + } + else if (valueType == typeof(Vector3Int)) + { + EditorGUILayout.Vector3IntField(label, (Vector3Int)value); + } + else if (valueType == typeof(Color)) + { + EditorGUILayout.ColorField(label, (Color)value); + } + else if (valueType == typeof(Bounds)) + { + EditorGUILayout.BoundsField(label, (Bounds)value); + } + else if (valueType == typeof(Rect)) + { + EditorGUILayout.RectField(label, (Rect)value); + } + else if (valueType == typeof(RectInt)) + { + EditorGUILayout.RectIntField(label, (RectInt)value); + } + else if (typeof(UnityEngine.Object).IsAssignableFrom(valueType)) + { + EditorGUILayout.ObjectField(label, (UnityEngine.Object)value, valueType, true); + } + else if (valueType.BaseType == typeof(Enum)) + { + EditorGUILayout.EnumPopup(label, (Enum)value); + } + else if (valueType.BaseType == typeof(System.Reflection.TypeInfo)) + { + EditorGUILayout.TextField(label, value.ToString()); + } + else + { + isDrawn = false; + } + + return isDrawn; + } + } + + private static void DebugLogMessage(string message, MessageType type, UnityEngine.Object context) + { + switch (type) + { + case MessageType.None: + case MessageType.Info: + Debug.Log(message, context); + break; + case MessageType.Warning: + Debug.LogWarning(message, context); + break; + case MessageType.Error: + Debug.LogError(message, context); + break; + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta new file mode 100644 index 0000000..704d3e5 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6ff27ff7705d6064e935bb2159a1b453 +timeCreated: 1510926159 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs new file mode 100644 index 0000000..e42db4b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs @@ -0,0 +1,374 @@ +using UnityEditor; +using System.Reflection; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyUtility + { + public static T GetAttribute<T>(SerializedProperty property) where T : class + { + T[] attributes = GetAttributes<T>(property); + return (attributes.Length > 0) ? attributes[0] : null; + } + + public static T[] GetAttributes<T>(SerializedProperty property) where T : class + { + FieldInfo fieldInfo = ReflectionUtility.GetField(GetTargetObjectWithProperty(property), property.name); + if (fieldInfo == null) + { + return new T[] { }; + } + + return (T[])fieldInfo.GetCustomAttributes(typeof(T), true); + } + + public static GUIContent GetLabel(SerializedProperty property) + { + LabelAttribute labelAttribute = GetAttribute<LabelAttribute>(property); + string labelText = (labelAttribute == null) + ? property.displayName + : labelAttribute.Label; + + GUIContent label = new GUIContent(labelText); + return label; + } + + public static void CallOnValueChangedCallbacks(SerializedProperty property) + { + OnValueChangedAttribute[] onValueChangedAttributes = GetAttributes<OnValueChangedAttribute>(property); + if (onValueChangedAttributes.Length == 0) + { + return; + } + + object target = GetTargetObjectWithProperty(property); + property.serializedObject.ApplyModifiedProperties(); // We must apply modifications so that the new value is updated in the serialized object + + foreach (var onValueChangedAttribute in onValueChangedAttributes) + { + MethodInfo callbackMethod = ReflectionUtility.GetMethod(target, onValueChangedAttribute.CallbackName); + if (callbackMethod != null && + callbackMethod.ReturnType == typeof(void) && + callbackMethod.GetParameters().Length == 0) + { + callbackMethod.Invoke(target, new object[] { }); + } + else + { + string warning = string.Format( + "{0} can invoke only methods with 'void' return type and 0 parameters", + onValueChangedAttribute.GetType().Name); + + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } + + public static bool IsEnabled(SerializedProperty property) + { + ReadOnlyAttribute readOnlyAttribute = GetAttribute<ReadOnlyAttribute>(property); + if (readOnlyAttribute != null) + { + return false; + } + + EnableIfAttributeBase enableIfAttribute = GetAttribute<EnableIfAttributeBase>(property); + if (enableIfAttribute == null) + { + return true; + } + + object target = GetTargetObjectWithProperty(property); + + // deal with enum conditions + if (enableIfAttribute.EnumValue != null) + { + Enum value = GetEnumValue(target, enableIfAttribute.Conditions[0]); + if (value != null) + { + bool matched = value.GetType().GetCustomAttribute<FlagsAttribute>() == null + ? enableIfAttribute.EnumValue.Equals(value) + : value.HasFlag(enableIfAttribute.EnumValue); + + return matched != enableIfAttribute.Inverted; + } + + string message = enableIfAttribute.GetType().Name + " needs a valid enum field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + + // deal with normal conditions + List<bool> conditionValues = GetConditionValues(target, enableIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = GetConditionsFlag(conditionValues, enableIfAttribute.ConditionOperator, enableIfAttribute.Inverted); + return enabled; + } + else + { + string message = enableIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + } + + public static bool IsVisible(SerializedProperty property) + { + ShowIfAttributeBase showIfAttribute = GetAttribute<ShowIfAttributeBase>(property); + if (showIfAttribute == null) + { + return true; + } + + object target = GetTargetObjectWithProperty(property); + + // deal with enum conditions + if (showIfAttribute.EnumValue != null) + { + Enum value = GetEnumValue(target, showIfAttribute.Conditions[0]); + if (value != null) + { + bool matched = value.GetType().GetCustomAttribute<FlagsAttribute>() == null + ? showIfAttribute.EnumValue.Equals(value) + : value.HasFlag(showIfAttribute.EnumValue); + + return matched != showIfAttribute.Inverted; + } + + string message = showIfAttribute.GetType().Name + " needs a valid enum field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + + // deal with normal conditions + List<bool> conditionValues = GetConditionValues(target, showIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = GetConditionsFlag(conditionValues, showIfAttribute.ConditionOperator, showIfAttribute.Inverted); + return enabled; + } + else + { + string message = showIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + } + + /// <summary> + /// Gets an enum value from reflection. + /// </summary> + /// <param name="target">The target object.</param> + /// <param name="enumName">Name of a field, property, or method that returns an enum.</param> + /// <returns>Null if can't find an enum value.</returns> + internal static Enum GetEnumValue(object target, string enumName) + { + FieldInfo enumField = ReflectionUtility.GetField(target, enumName); + if (enumField != null && enumField.FieldType.IsSubclassOf(typeof(Enum))) + { + return (Enum)enumField.GetValue(target); + } + + PropertyInfo enumProperty = ReflectionUtility.GetProperty(target, enumName); + if (enumProperty != null && enumProperty.PropertyType.IsSubclassOf(typeof(Enum))) + { + return (Enum)enumProperty.GetValue(target); + } + + MethodInfo enumMethod = ReflectionUtility.GetMethod(target, enumName); + if (enumMethod != null && enumMethod.ReturnType.IsSubclassOf(typeof(Enum))) + { + return (Enum)enumMethod.Invoke(target, null); + } + + return null; + } + + internal static List<bool> GetConditionValues(object target, string[] conditions) + { + List<bool> conditionValues = new List<bool>(); + foreach (var condition in conditions) + { + FieldInfo conditionField = ReflectionUtility.GetField(target, condition); + if (conditionField != null && + conditionField.FieldType == typeof(bool)) + { + conditionValues.Add((bool)conditionField.GetValue(target)); + } + + PropertyInfo conditionProperty = ReflectionUtility.GetProperty(target, condition); + if (conditionProperty != null && + conditionProperty.PropertyType == typeof(bool)) + { + conditionValues.Add((bool)conditionProperty.GetValue(target)); + } + + MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, condition); + if (conditionMethod != null && + conditionMethod.ReturnType == typeof(bool) && + conditionMethod.GetParameters().Length == 0) + { + conditionValues.Add((bool)conditionMethod.Invoke(target, null)); + } + } + + return conditionValues; + } + + internal static bool GetConditionsFlag(List<bool> conditionValues, EConditionOperator conditionOperator, bool invert) + { + bool flag; + if (conditionOperator == EConditionOperator.And) + { + flag = true; + foreach (var value in conditionValues) + { + flag = flag && value; + } + } + else + { + flag = false; + foreach (var value in conditionValues) + { + flag = flag || value; + } + } + + if (invert) + { + flag = !flag; + } + + return flag; + } + + public static Type GetPropertyType(SerializedProperty property) + { + object obj = GetTargetObjectOfProperty(property); + Type objType = obj.GetType(); + + return objType; + } + + /// <summary> + /// Gets the object the property represents. + /// </summary> + /// <param name="property"></param> + /// <returns></returns> + public static object GetTargetObjectOfProperty(SerializedProperty property) + { + if (property == null) + { + return null; + } + + string path = property.propertyPath.Replace(".Array.data[", "["); + object obj = property.serializedObject.targetObject; + string[] elements = path.Split('.'); + + foreach (var element in elements) + { + if (element.Contains("[")) + { + string elementName = element.Substring(0, element.IndexOf("[")); + int index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else + { + obj = GetValue_Imp(obj, element); + } + } + + return obj; + } + + /// <summary> + /// Gets the object that the property is a member of + /// </summary> + /// <param name="property"></param> + /// <returns></returns> + public static object GetTargetObjectWithProperty(SerializedProperty property) + { + string path = property.propertyPath.Replace(".Array.data[", "["); + object obj = property.serializedObject.targetObject; + string[] elements = path.Split('.'); + + for (int i = 0; i < elements.Length - 1; i++) + { + string element = elements[i]; + if (element.Contains("[")) + { + string elementName = element.Substring(0, element.IndexOf("[")); + int index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else + { + obj = GetValue_Imp(obj, element); + } + } + + return obj; + } + + private static object GetValue_Imp(object source, string name) + { + if (source == null) + { + return null; + } + + Type type = source.GetType(); + + while (type != null) + { + FieldInfo field = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + if (field != null) + { + return field.GetValue(source); + } + + PropertyInfo property = type.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); + if (property != null) + { + return property.GetValue(source, null); + } + + type = type.BaseType; + } + + return null; + } + + private static object GetValue_Imp(object source, string name, int index) + { + IEnumerable enumerable = GetValue_Imp(source, name) as IEnumerable; + if (enumerable == null) + { + return null; + } + + IEnumerator enumerator = enumerable.GetEnumerator(); + for (int i = 0; i <= index; i++) + { + if (!enumerator.MoveNext()) + { + return null; + } + } + + return enumerator.Current; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta new file mode 100644 index 0000000..dce67c6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 312eedcb79c7a5542b87c0b848e3e2fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs new file mode 100644 index 0000000..57d28ea --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class ReflectionUtility + { + public static IEnumerable<FieldInfo> GetAllFields(object target, Func<FieldInfo, bool> predicate) + { + if (target == null) + { + Debug.LogError("The target object is null. Check for missing scripts."); + yield break; + } + + List<Type> types = GetSelfAndBaseTypes(target); + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable<FieldInfo> fieldInfos = types[i] + .GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var fieldInfo in fieldInfos) + { + yield return fieldInfo; + } + } + } + + public static IEnumerable<PropertyInfo> GetAllProperties(object target, Func<PropertyInfo, bool> predicate) + { + if (target == null) + { + Debug.LogError("The target object is null. Check for missing scripts."); + yield break; + } + + List<Type> types = GetSelfAndBaseTypes(target); + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable<PropertyInfo> propertyInfos = types[i] + .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var propertyInfo in propertyInfos) + { + yield return propertyInfo; + } + } + } + + public static IEnumerable<MethodInfo> GetAllMethods(object target, Func<MethodInfo, bool> predicate) + { + if (target == null) + { + Debug.LogError("The target object is null. Check for missing scripts."); + yield break; + } + + List<Type> types = GetSelfAndBaseTypes(target); + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable<MethodInfo> methodInfos = types[i] + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var methodInfo in methodInfos) + { + yield return methodInfo; + } + } + } + + public static FieldInfo GetField(object target, string fieldName) + { + return GetAllFields(target, f => f.Name.Equals(fieldName, StringComparison.Ordinal)).FirstOrDefault(); + } + + public static PropertyInfo GetProperty(object target, string propertyName) + { + return GetAllProperties(target, p => p.Name.Equals(propertyName, StringComparison.Ordinal)).FirstOrDefault(); + } + + public static MethodInfo GetMethod(object target, string methodName) + { + return GetAllMethods(target, m => m.Name.Equals(methodName, StringComparison.Ordinal)).FirstOrDefault(); + } + + public static Type GetListElementType(Type listType) + { + if (listType.IsGenericType) + { + return listType.GetGenericArguments()[0]; + } + else + { + return listType.GetElementType(); + } + } + + /// <summary> + /// Get type and all base types of target, sorted as following: + /// <para />[target's type, base type, base's base type, ...] + /// </summary> + /// <param name="target"></param> + /// <returns></returns> + private static List<Type> GetSelfAndBaseTypes(object target) + { + List<Type> types = new List<Type>() + { + target.GetType() + }; + + while (types.Last().BaseType != null) + { + types.Add(types.Last().BaseType); + } + + return types; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta new file mode 100644 index 0000000..73b6ea9 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 1d86c581f02a55f458e36bf7e81e3084 +timeCreated: 1520258793 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs new file mode 100644 index 0000000..e463f49 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs @@ -0,0 +1,34 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + internal class SavedBool + { + private bool _value; + private string _name; + + public bool Value + { + get + { + return _value; + } + set + { + if (_value == value) + { + return; + } + + _value = value; + EditorPrefs.SetBool(_name, value); + } + } + + public SavedBool(string name, bool value) + { + _name = name; + _value = EditorPrefs.GetBool(name, value); + } + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs.meta new file mode 100644 index 0000000..aebf007 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Editor/Utility/SavedBool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 18613afe66b0c0344a2be5f430bf965a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test.meta new file mode 100644 index 0000000..6eca4f6 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce2bd76b5676a434bb8a84254f67f1dc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs new file mode 100644 index 0000000..c5a371c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs @@ -0,0 +1,53 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class AnimatorParamTest : MonoBehaviour + { + public Animator animator0; + + [AnimatorParam("animator0")] + public int hash0; + + [AnimatorParam("animator0")] + public string name0; + + public AnimatorParamNest1 nest1; + + [Button("Log 'hash0' and 'name0'")] + private void TestLog() + { + Debug.Log($"hash0 = {hash0}"); + Debug.Log($"name0 = {name0}"); + Debug.Log($"Animator.StringToHash(name0) = {Animator.StringToHash(name0)}"); + } + } + + [System.Serializable] + public class AnimatorParamNest1 + { + public Animator animator1; + private Animator Animator1 => animator1; + + [AnimatorParam("Animator1", AnimatorControllerParameterType.Bool)] + public int hash1; + + [AnimatorParam("Animator1", AnimatorControllerParameterType.Float)] + public string name1; + + public AnimatorParamNest2 nest2; + } + + [System.Serializable] + public class AnimatorParamNest2 + { + public Animator animator2; + private Animator GetAnimator2() => animator2; + + [AnimatorParam("GetAnimator2", AnimatorControllerParameterType.Int)] + public int hash1; + + [AnimatorParam("GetAnimator2", AnimatorControllerParameterType.Trigger)] + public string name1; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs.meta new file mode 100644 index 0000000..a8daa63 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/AnimatorParamTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9bff20ccdde00fc49a62bad6a4ef9982 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs new file mode 100644 index 0000000..789d1f8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs @@ -0,0 +1,32 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class BoxGroupTest : MonoBehaviour + { + [BoxGroup("Integers")] + public int int0; + [BoxGroup("Integers")] + public int int1; + + [BoxGroup("Floats")] + public float float0; + [BoxGroup("Floats")] + public float float1; + + [BoxGroup("Sliders")] + [MinMaxSlider(0, 1)] + public Vector2 slider0; + [BoxGroup("Sliders")] + [MinMaxSlider(0, 1)] + public Vector2 slider1; + + public string str0; + public string str1; + + [BoxGroup] + public Transform trans0; + [BoxGroup] + public Transform trans1; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta new file mode 100644 index 0000000..0c5ee54 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3920f5ea384951b4990e4d9e8032d12e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs new file mode 100644 index 0000000..d7f6f04 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs @@ -0,0 +1,39 @@ +using System.Collections; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ButtonTest : MonoBehaviour + { + public int myInt; + + [Button(enabledMode: EButtonEnableMode.Always)] + private void IncrementMyInt() + { + myInt++; + } + + [Button("Decrement My Int", EButtonEnableMode.Editor)] + private void DecrementMyInt() + { + myInt--; + } + + [Button(enabledMode: EButtonEnableMode.Playmode)] + private void LogMyInt(string prefix = "MyInt = ") + { + Debug.Log(prefix + myInt); + } + + [Button("StartCoroutine")] + private IEnumerator IncrementMyIntCoroutine() + { + int seconds = 5; + for (int i = 0; i < seconds; i++) + { + myInt++; + yield return new WaitForSeconds(1.0f); + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta new file mode 100644 index 0000000..1d7d58f --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b592f12a9f69ac3408f6f870762232c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs new file mode 100644 index 0000000..f33f2d2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class CurveRangeTest : MonoBehaviour + { + [CurveRange(0f, 0f, 1f, 1f, EColor.Yellow)] + public AnimationCurve[] curves; + + [CurveRange(-1, -1, 1, 1, EColor.Red)] + public AnimationCurve curve; + + [CurveRange(EColor.Orange)] + public AnimationCurve curve1; + + [CurveRange(0, 0, 10, 10)] + public AnimationCurve curve2; + + public CurveRangeNest1 nest1; + + [System.Serializable] + public class CurveRangeNest1 + { + [CurveRange(0, 0, 1, 1, EColor.Green)] + public AnimationCurve curve; + + public CurveRangeNest2 nest2; + } + + [System.Serializable] + public class CurveRangeNest2 + { + [CurveRange(0, 0, 5, 5, EColor.Blue)] + public AnimationCurve curve; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta new file mode 100644 index 0000000..e43f8f0 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6587b100d001e7e46b9aaae7f1180b40 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs new file mode 100644 index 0000000..6913166 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs @@ -0,0 +1,120 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class DisableIfTest : MonoBehaviour + { + public bool disable1; + public bool disable2; + public DisableIfEnum enum1; + [EnumFlags] public DisableIfEnumFlag enum2; + + [DisableIf(EConditionOperator.And, "disable1", "disable2")] + [ReorderableList] + public int[] disableIfAll; + + [DisableIf(EConditionOperator.Or, "disable1", "disable2")] + [ReorderableList] + public int[] disableIfAny; + + [DisableIf("enum1", DisableIfEnum.Case0)] + [ReorderableList] + public int[] disableIfEnum; + + [DisableIf("enum2", DisableIfEnumFlag.Flag0)] + [ReorderableList] + public int[] disableIfEnumFlag; + + [DisableIf("enum2", DisableIfEnumFlag.Flag0 | DisableIfEnumFlag.Flag1)] + [ReorderableList] + public int[] disableIfEnumFlagMulti; + + public DisableIfNest1 nest1; + } + + [System.Serializable] + public class DisableIfNest1 + { + public bool disable1; + public bool disable2; + public DisableIfEnum enum1; + [EnumFlags] public DisableIfEnumFlag enum2; + public bool Disable1 { get { return disable1; } } + public bool Disable2 { get { return disable2; } } + public DisableIfEnum Enum1 { get { return enum1; } } + public DisableIfEnumFlag Enum2 { get { return enum2; } } + + [DisableIf(EConditionOperator.And, "Disable1", "Disable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int disableIfAll = 1; + + [DisableIf(EConditionOperator.Or, "Disable1", "Disable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int disableIfAny = 2; + + [DisableIf("Enum1", DisableIfEnum.Case1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int disableIfEnum = 3; + + [DisableIf("Enum2", DisableIfEnumFlag.Flag0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int disableIfEnumFlag; + + [DisableIf("Enum2", DisableIfEnumFlag.Flag0 | DisableIfEnumFlag.Flag1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int disableIfEnumFlagMulti; + + public DisableIfNest2 nest2; + } + + [System.Serializable] + public class DisableIfNest2 + { + public bool disable1; + public bool disable2; + public DisableIfEnum enum1; + [EnumFlags] public DisableIfEnumFlag enum2; + public bool GetDisable1() { return disable1; } + public bool GetDisable2() { return disable2; } + public DisableIfEnum GetEnum1() { return enum1; } + public DisableIfEnumFlag GetEnum2() { return enum2; } + + [DisableIf(EConditionOperator.And, "GetDisable1", "GetDisable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAll = new Vector2(0.25f, 0.75f); + + [DisableIf(EConditionOperator.Or, "GetDisable1", "GetDisable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAny = new Vector2(0.25f, 0.75f); + + [DisableIf("GetEnum1", DisableIfEnum.Case2)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfEnum = new Vector2(0.25f, 0.75f); + + [DisableIf("GetEnum2", DisableIfEnumFlag.Flag0)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 disableIfEnumFlag; + + [DisableIf("GetEnum2", DisableIfEnumFlag.Flag0 | DisableIfEnumFlag.Flag1)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 disableIfEnumFlagMulti; + } + + [System.Serializable] + public enum DisableIfEnum + { + Case0, + Case1, + Case2 + } + + [Flags] + public enum DisableIfEnumFlag + { + Flag0 = 1, + Flag1 = 2, + Flag2 = 4, + Flag3 = 8 + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta new file mode 100644 index 0000000..c3a1e7a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e48a088cb96287448c3be58932bfcb7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs new file mode 100644 index 0000000..723eca8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs @@ -0,0 +1,45 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace NaughtyAttributes.Test +{ + public class DropdownTest : MonoBehaviour + { + [Dropdown("intValues")] + public int intValue; + +#pragma warning disable 414 + private int[] intValues = new int[] { 1, 2, 3 }; +#pragma warning restore 414 + + public DropdownNest1 nest1; + } + + [System.Serializable] + public class DropdownNest1 + { + [Dropdown("StringValues")] + public string stringValue; + + private List<string> StringValues { get { return new List<string>() { "A", "B", "C" }; } } + + public DropdownNest2 nest2; + } + + [System.Serializable] + public class DropdownNest2 + { + [Dropdown("GetVectorValues")] + public Vector3 vectorValue; + + private DropdownList<Vector3> GetVectorValues() + { + return new DropdownList<Vector3>() + { + { "Right", Vector3.right }, + { "Up", Vector3.up }, + { "Forward", Vector3.forward } + }; + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta new file mode 100644 index 0000000..ec7fa24 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3855e37cd6b01194e8166573c7c4b37d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs new file mode 100644 index 0000000..6e744f5 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs @@ -0,0 +1,120 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class EnableIfTest : MonoBehaviour + { + public bool enable1; + public bool enable2; + public EnableIfEnum enum1; + [EnumFlags] public EnableIfEnumFlag enum2; + + [EnableIf(EConditionOperator.And, "enable1", "enable2")] + [ReorderableList] + public int[] enableIfAll; + + [EnableIf(EConditionOperator.Or, "enable1", "enable2")] + [ReorderableList] + public int[] enableIfAny; + + [EnableIf("enum1", EnableIfEnum.Case0)] + [ReorderableList] + public int[] enableIfEnum; + + [EnableIf("enum2", EnableIfEnumFlag.Flag0)] + [ReorderableList] + public int[] enableIfEnumFlag; + + [EnableIf("enum2", EnableIfEnumFlag.Flag0 | EnableIfEnumFlag.Flag1)] + [ReorderableList] + public int[] enableIfEnumFlagMulti; + + public EnableIfNest1 nest1; + } + + [System.Serializable] + public class EnableIfNest1 + { + public bool enable1; + public bool enable2; + public EnableIfEnum enum1; + [EnumFlags] public EnableIfEnumFlag enum2; + public bool Enable1 { get { return enable1; } } + public bool Enable2 { get { return enable2; } } + public EnableIfEnum Enum1 { get { return enum1; } } + public EnableIfEnumFlag Enum2 { get { return enum2; } } + + [EnableIf(EConditionOperator.And, "Enable1", "Enable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int enableIfAll; + + [EnableIf(EConditionOperator.Or, "Enable1", "Enable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int enableIfAny; + + [EnableIf("Enum1", EnableIfEnum.Case1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int enableIfEnum; + + [EnableIf("Enum2", EnableIfEnumFlag.Flag0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int enableIfEnumFlag; + + [EnableIf("Enum2", EnableIfEnumFlag.Flag0 | EnableIfEnumFlag.Flag1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int enableIfEnumFlagMulti; + + public EnableIfNest2 nest2; + } + + [System.Serializable] + public class EnableIfNest2 + { + public bool enable1; + public bool enable2; + public EnableIfEnum enum1; + [EnumFlags] public EnableIfEnumFlag enum2; + public bool GetEnable1() { return enable1; } + public bool GetEnable2() { return enable2; } + public EnableIfEnum GetEnum1() { return enum1; } + public EnableIfEnumFlag GetEnum2() { return enum2; } + + [EnableIf(EConditionOperator.And, "GetEnable1", "GetEnable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAll = new Vector2(0.25f, 0.75f); + + [EnableIf(EConditionOperator.Or, "GetEnable1", "GetEnable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAny = new Vector2(0.25f, 0.75f); + + [EnableIf("GetEnum1", EnableIfEnum.Case2)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfEnum = new Vector2(0.25f, 0.75f); + + [EnableIf("GetEnum2", EnableIfEnumFlag.Flag0)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfEnumFlag; + + [EnableIf("GetEnum2", EnableIfEnumFlag.Flag0 | EnableIfEnumFlag.Flag1)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfEnumFlagMulti; + } + + [System.Serializable] + public enum EnableIfEnum + { + Case0, + Case1, + Case2 + } + + [Flags] + public enum EnableIfEnumFlag + { + Flag0 = 1, + Flag1 = 2, + Flag2 = 4, + Flag3 = 8 + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta new file mode 100644 index 0000000..c22fe7b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bed506d8be3a10f45bec4bf2237bec87 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs new file mode 100644 index 0000000..9472334 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs @@ -0,0 +1,39 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public enum TestEnum + { + None = 0, + B = 1 << 0, + C = 1 << 1, + D = 1 << 2, + E = 1 << 3, + F = 1 << 4, + All = ~0 + } + + public class EnumFlagsTest : MonoBehaviour + { + [EnumFlags] + public TestEnum flags0; + + public EnumFlagsNest1 nest1; + } + + [System.Serializable] + public class EnumFlagsNest1 + { + [EnumFlags] + public TestEnum flags1; + + public EnumFlagsNest2 nest2; + } + + [System.Serializable] + public class EnumFlagsNest2 + { + [EnumFlags] + public TestEnum flags2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta new file mode 100644 index 0000000..b548675 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b7f6b84ce0d7674d8a386fde729279c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs new file mode 100644 index 0000000..8c08b8c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs @@ -0,0 +1,31 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ExpandableTest : MonoBehaviour + { + // See #294 + public int precedingField = 5; + + [Expandable] + public ScriptableObject obj0; + + public ExpandableScriptableObjectNest1 nest1; + } + + [System.Serializable] + public class ExpandableScriptableObjectNest1 + { + [Expandable] + public ScriptableObject obj1; + + public ExpandableScriptableObjectNest2 nest2; + } + + [System.Serializable] + public class ExpandableScriptableObjectNest2 + { + [Expandable] + public ScriptableObject obj2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs.meta new file mode 100644 index 0000000..ffa82d1 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ExpandableTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64c4c9aee2b494d44be9bb0b7f12ed7c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs new file mode 100644 index 0000000..c171cc8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs @@ -0,0 +1,32 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class FoldoutTest : MonoBehaviour + { + [Foldout("Integers")] + public int int0; + [Foldout("Integers")] + public int int1; + + [Foldout("Floats")] + public float float0; + [Foldout("Floats")] + public float float1; + + [Foldout("Sliders")] + [MinMaxSlider(0, 1)] + public Vector2 slider0; + [Foldout("Sliders")] + [MinMaxSlider(0, 1)] + public Vector2 slider1; + + public string str0; + public string str1; + + [Foldout("Transforms")] + public Transform trans0; + [Foldout("Transforms")] + public Transform trans1; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs.meta new file mode 100644 index 0000000..8c72e06 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/FoldoutTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b437215d92efa74ea85ff726ca0dd09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs new file mode 100644 index 0000000..ec5c7c1 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs @@ -0,0 +1,119 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class HideIfTest : MonoBehaviour + { + public bool hide1; + public bool hide2; + public HideIfEnum enum1; + [EnumFlags] public HideIfEnumFlag enum2; + + [HideIf(EConditionOperator.And, "hide1", "hide2")] + [ReorderableList] + public int[] hideIfAll; + + [HideIf(EConditionOperator.Or, "hide1", "hide2")] + [ReorderableList] + public int[] hideIfAny; + + [HideIf("enum1", HideIfEnum.Case0)] + [ReorderableList] + public int[] hideIfEnum; + + [HideIf("enum2", HideIfEnumFlag.Flag0)] + [ReorderableList] + public int[] hideIfEnumFlag; + + [HideIf("enum2", HideIfEnumFlag.Flag0 | HideIfEnumFlag.Flag1)] + [ReorderableList] + public int[] hideIfEnumFlagMulti; + + public HideIfNest1 nest1; + } + + [System.Serializable] + public class HideIfNest1 + { + public bool hide1; + public bool hide2; + public HideIfEnum enum1; + [EnumFlags] public HideIfEnumFlag enum2; + public bool Hide1 { get { return hide1; } } + public bool Hide2 { get { return hide2; } } + public HideIfEnum Enum1 { get { return enum1; } } + public HideIfEnumFlag Enum2 { get { return enum2; } } + + [HideIf(EConditionOperator.And, "Hide1", "Hide2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int hideIfAll; + + [HideIf(EConditionOperator.Or, "Hide1", "Hide2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int hideIfAny; + + [HideIf("Enum1", HideIfEnum.Case1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int hideIfEnum; + + [HideIf("Enum2", HideIfEnumFlag.Flag0)] + [AllowNesting] + public int hideIfEnumFlag; + + [HideIf("Enum2", HideIfEnumFlag.Flag0 | HideIfEnumFlag.Flag1)] + [AllowNesting] + public int hideIfEnumFlagMulti; + + public HideIfNest2 nest2; + } + + [System.Serializable] + public class HideIfNest2 + { + public bool hide1; + public bool hide2; + public HideIfEnum enum1; + [EnumFlags] public HideIfEnumFlag enum2; + public bool GetHide1() { return hide1; } + public bool GetHide2() { return hide2; } + public HideIfEnum GetEnum1() { return enum1; } + public HideIfEnumFlag GetEnum2() { return enum2; } + + [HideIf(EConditionOperator.And, "GetHide1", "GetHide2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 hideIfAll = new Vector2(0.25f, 0.75f); + + [HideIf(EConditionOperator.Or, "GetHide1", "GetHide2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 hideIfAny = new Vector2(0.25f, 0.75f); + + [HideIf("GetEnum1", HideIfEnum.Case2)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 hideIfEnum = new Vector2(0.25f, 0.75f); + + [HideIf("GetEnum2", HideIfEnumFlag.Flag0)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 hideIfEnumFlag; + + [HideIf("GetEnum2", HideIfEnumFlag.Flag0 | HideIfEnumFlag.Flag1)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 hideIfEnumFlagMulti; + } + + public enum HideIfEnum + { + Case0, + Case1, + Case2 + } + + [Flags] + public enum HideIfEnumFlag + { + Flag0 = 1, + Flag1 = 2, + Flag2 = 4, + Flag3 = 8 + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta new file mode 100644 index 0000000..6115ad2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3cf166cb519e666419bb79b0c50c5ee1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs new file mode 100644 index 0000000..2bbe587 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs @@ -0,0 +1,51 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class HorizontalLineTest : MonoBehaviour + { + [HorizontalLine(color: EColor.Black)] + [Header("Black")] + [HorizontalLine(color: EColor.Blue)] + [Header("Blue")] + [HorizontalLine(color: EColor.Gray)] + [Header("Gray")] + [HorizontalLine(color: EColor.Green)] + [Header("Green")] + [HorizontalLine(color: EColor.Indigo)] + [Header("Indigo")] + [HorizontalLine(color: EColor.Orange)] + [Header("Orange")] + [HorizontalLine(color: EColor.Pink)] + [Header("Pink")] + [HorizontalLine(color: EColor.Red)] + [Header("Red")] + [HorizontalLine(color: EColor.Violet)] + [Header("Violet")] + [HorizontalLine(color: EColor.White)] + [Header("White")] + [HorizontalLine(color: EColor.Yellow)] + [Header("Yellow")] + [HorizontalLine(10.0f)] + [Header("Thick")] + public int line0; + + public HorizontalLineNest1 nest1; + } + + [System.Serializable] + public class HorizontalLineNest1 + { + [HorizontalLine] + public int line1; + + public HorizontalLineNest2 nest2; + } + + [System.Serializable] + public class HorizontalLineNest2 + { + [HorizontalLine] + public int line2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta new file mode 100644 index 0000000..4d7ff37 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5cc6d3f8d4a53374887b3d620a6972e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs new file mode 100644 index 0000000..a1dd5f8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class InfoBoxTest : MonoBehaviour + { + [InfoBox("Normal", EInfoBoxType.Normal)] + public int normal; + + public InfoBoxNest1 nest1; + } + + [System.Serializable] + public class InfoBoxNest1 + { + [InfoBox("Warning", EInfoBoxType.Warning)] + public int warning; + + public InfoBoxNest2 nest2; + } + + [System.Serializable] + public class InfoBoxNest2 + { + [InfoBox("Error", EInfoBoxType.Error)] + public int error; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta new file mode 100644 index 0000000..68dc824 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0dcb08e489c17644e9eacaa1ec5fe781 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs new file mode 100644 index 0000000..2080e30 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs @@ -0,0 +1,34 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class InputAxisTest : MonoBehaviour + { + [InputAxis] + public string inputAxis0; + + public InputAxisNest1 nest1; + + [Button] + private void LogInputAxis0() + { + Debug.Log(inputAxis0); + } + } + + [System.Serializable] + public class InputAxisNest1 + { + [InputAxis] + public string inputAxis1; + + public InputAxisNest2 nest2; + } + + [System.Serializable] + public struct InputAxisNest2 + { + [InputAxis] + public string inputAxis2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta new file mode 100644 index 0000000..b44a862 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e0cc8a31c22090847b75538c0ed2d2fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs new file mode 100644 index 0000000..5f40e6e --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class LabelTest : MonoBehaviour + { + [Label("Label 0")] + public int int0; + + public LabelNest1 nest1; + } + + [System.Serializable] + public class LabelNest1 + { + [Label("Label 1")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int int1; + + public LabelNest2 nest2; + } + + [System.Serializable] + public class LabelNest2 + { + [Label("Label 2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 vector2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta new file mode 100644 index 0000000..114af72 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7488af014527ebf42af5c4fc4d5f4f5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs new file mode 100644 index 0000000..52ac6fe --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs @@ -0,0 +1,46 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class LayerTest : MonoBehaviour + { + [Layer] + public int layerNumber0; + + [Layer] + public string layerName0; + + public LayerNest1 nest1; + + [Button] + public void DebugLog() + { + Debug.LogFormat("{0} = {1}", nameof(layerNumber0), layerNumber0); + Debug.LogFormat("{0} = {1}", nameof(layerName0), layerName0); + Debug.LogFormat("LayerToName({0}) = {1}", layerNumber0, LayerMask.LayerToName(layerNumber0)); + Debug.LogFormat("NameToLayer({0}) = {1}", layerName0, LayerMask.NameToLayer(layerName0)); + } + } + + [System.Serializable] + public class LayerNest1 + { + [Layer] + public int layerNumber1; + + [Layer] + public string layerName1; + + public LayerNest2 nest2; + } + + [System.Serializable] + public struct LayerNest2 + { + [Layer] + public int layerNumber2; + + [Layer] + public string layerName2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs.meta new file mode 100644 index 0000000..d66d32c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/LayerTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 460459d6ac76acd4d872f94cf444e6fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs new file mode 100644 index 0000000..f1ec981 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class MinMaxSliderTest : MonoBehaviour + { + [MinMaxSlider(0.0f, 1.0f)] + public Vector2 minMaxSlider0 = new Vector2(0.25f, 0.75f); + + public MinMaxSliderNest1 nest1; + } + + [System.Serializable] + public class MinMaxSliderNest1 + { + [MinMaxSlider(0.0f, 1.0f)] + public Vector2 minMaxSlider1 = new Vector2(0.25f, 0.75f); + + public MinMaxSliderNest2 nest2; + } + + [System.Serializable] + public class MinMaxSliderNest2 + { + [MinMaxSlider(1, 11)] + public Vector2Int minMaxSlider2 = new Vector2Int(6, 11); + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta new file mode 100644 index 0000000..7580a81 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fd67fbde6acdd6a44944f12e507067c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs new file mode 100644 index 0000000..43d1586 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs @@ -0,0 +1,129 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class MinMaxValueTest : MonoBehaviour + { + [MinValue(0)] + public int min0Int; + + [MaxValue(0)] + public int max0Int; + + [MinValue(0), MaxValue(1)] + public float range01Float; + + [MinValue(0), MaxValue(1)] + public Vector2 range01Vector2; + + [MinValue(0), MaxValue(1)] + public Vector3 range01Vector3; + + [MinValue(0), MaxValue(1)] + public Vector4 range01Vector4; + + [MinValue(0)] + public Vector2Int min0Vector2Int; + + [MaxValue(100)] + public Vector2Int max100Vector2Int; + + [MinValue(0)] + public Vector3Int min0Vector3Int; + + [MaxValue(100)] + public Vector3Int max100Vector3Int; + + public MinMaxValueNest1 nest1; + } + + [System.Serializable] + public class MinMaxValueNest1 + { + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int min0Int; + + [MaxValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int max0Int; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public float range01Float; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector2 range01Vector2; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector3 range01Vector3; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector4 range01Vector4; + + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector2Int min0Vector2Int; + + [MaxValue(100)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector2Int max100Vector2Int; + + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector3Int min0Vector3Int; + + [MaxValue(100)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector3Int max100Vector3Int; + + public MinMaxValueNest2 nest2; + } + + [System.Serializable] + public class MinMaxValueNest2 + { + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int min0Int; + + [MaxValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int max0Int; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public float range01Float; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector2 range01Vector2; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector3 range01Vector3; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector4 range01Vector4; + + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector2Int min0Vector2Int; + + [MaxValue(100)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector2Int max100Vector2Int; + + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector3Int min0Vector3Int; + + [MaxValue(100)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Vector3Int max100Vector3Int; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta new file mode 100644 index 0000000..328dee3 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 450a05787c54e6b4fa88ffe223bcee87 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef new file mode 100644 index 0000000..910f548 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef @@ -0,0 +1,14 @@ +{ + "name": "NaughtyAttributes.Test", + "references": [ + "NaughtyAttributes.Core" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta new file mode 100644 index 0000000..c3d49e7 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: df1dea26b8503004d92d621e88aa9421 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs new file mode 100644 index 0000000..360df14 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs @@ -0,0 +1,51 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class OnValueChangedTest : MonoBehaviour + { + [OnValueChanged("OnValueChangedMethod1")] + [OnValueChanged("OnValueChangedMethod2")] + public int int0; + + private void OnValueChangedMethod1() + { + Debug.LogFormat("int0: {0}", int0); + } + + private void OnValueChangedMethod2() + { + Debug.LogFormat("int0: {0}", int0); + } + + public OnValueChangedNest1 nest1; + } + + [System.Serializable] + public class OnValueChangedNest1 + { + [OnValueChanged("OnValueChangedMethod")] + [AllowNesting] + public int int1; + + private void OnValueChangedMethod() + { + Debug.LogFormat("int1: {0}", int1); + } + + public OnValueChangedNest2 nest2; + } + + [System.Serializable] + public class OnValueChangedNest2 + { + [OnValueChanged("OnValueChangedMethod")] + [AllowNesting] + public int int2; + + private void OnValueChangedMethod() + { + Debug.LogFormat("int2: {0}", int2); + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta new file mode 100644 index 0000000..bfd1ab2 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff1df679e5b32f64bb106752c63933fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs new file mode 100644 index 0000000..0534812 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs @@ -0,0 +1,35 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ProgressBarTest : MonoBehaviour + { + [Header("Constant ProgressBar")] + [ProgressBar("Health", 100, EColor.Red)] + public float health = 50.0f; + + [Header("Nested ProgressBar")] + public ProgressBarNest1 nest1; + + [Header("Dynamic ProgressBar")] + [ProgressBar("Elixir", "maxElixir", color: EColor.Violet)] + public int elixir = 50; + public int maxElixir = 100; + } + + [System.Serializable] + public class ProgressBarNest1 + { + [ProgressBar("Mana", 100, EColor.Blue)] + public float mana = 25.0f; + + public ProgressBarNest2 nest2; + } + + [System.Serializable] + public class ProgressBarNest2 + { + [ProgressBar("Stamina", 100, EColor.Green)] + public float stamina = 75.0f; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta new file mode 100644 index 0000000..db88429 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96ca4c27fc649764b9d1625f1740cb9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs new file mode 100644 index 0000000..d832097 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ReadOnlyTest : MonoBehaviour + { + [ReadOnly] + public int readOnlyInt = 5; + + public ReadOnlyNest1 nest1; + } + + [System.Serializable] + public class ReadOnlyNest1 + { + [ReadOnly] + [AllowNesting] + public float readOnlyFloat = 3.14f; + + public ReadOnlyNest2 nest2; + } + + [System.Serializable] + public struct ReadOnlyNest2 + { + [ReadOnly] + [AllowNesting] + public string readOnlyString; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta new file mode 100644 index 0000000..d65c60c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5443d37a05e188846bda9b05b067184e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs new file mode 100644 index 0000000..6b3e439 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ReorderableListTest : MonoBehaviour + { + [ReorderableList] + public int[] intArray; + + [ReorderableList] + public List<Vector3> vectorList; + + [ReorderableList] + public List<SomeStruct> structList; + + [ReorderableList] + public GameObject[] gameObjectsList; + + [ReorderableList] + public List<Transform> transformsList; + + [ReorderableList] + public List<MonoBehaviour> monoBehavioursList; + } + + [System.Serializable] + public struct SomeStruct + { + public int Int; + public float Float; + public Vector3 Vector; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta new file mode 100644 index 0000000..b993018 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c93fde7cd79390148ac576c3a159a77b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs new file mode 100644 index 0000000..ea04936 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class RequiredTest : MonoBehaviour + { + [Required] + public Transform trans0; + + public RequiredNest1 nest1; + } + + [System.Serializable] + public class RequiredNest1 + { + [Required] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Transform trans1; + + public RequiredNest2 nest2; + } + + [System.Serializable] + public class RequiredNest2 + { + [Required("trans2 is invalid custom message - hohoho")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Transform trans2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta new file mode 100644 index 0000000..bc51260 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c8c10b2234650d42b2a8efad6b413db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs new file mode 100644 index 0000000..aa57a3d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ResizableTextAreaTest : MonoBehaviour + { + [ResizableTextArea] + public string text0; + + public ResizableTextAreaNest1 nest1; + } + + [System.Serializable] + public class ResizableTextAreaNest1 + { + [ResizableTextArea] + public string text1; + + public ResizableTextAreaNest2 nest2; + } + + [System.Serializable] + public class ResizableTextAreaNest2 + { + [ResizableTextArea] + public string text2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta new file mode 100644 index 0000000..380566d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb4f4bb2e3e063340a24f4bb24528bb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs new file mode 100644 index 0000000..70d37c0 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class SceneTest : MonoBehaviour + { + [Scene] + public string scene0; + + public SceneNest1 nest1; + } + + [System.Serializable] + public class SceneNest1 + { + [Scene] + public string scene1; + + public SceneNest2 nest2; + } + + [System.Serializable] + public struct SceneNest2 + { + [Scene] + public int scene2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta new file mode 100644 index 0000000..3ceca2f --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 281a85803caf74a459439020a0840fa4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs new file mode 100644 index 0000000..c20b754 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowAssetPreviewTest : MonoBehaviour + { + [ShowAssetPreview] + public Sprite sprite0; + + [ShowAssetPreview(96, 96)] + public GameObject prefab0; + + public ShowAssetPreviewNest1 nest1; + } + + [System.Serializable] + public class ShowAssetPreviewNest1 + { + [ShowAssetPreview] + public Sprite sprite1; + + [ShowAssetPreview(96, 96)] + public GameObject prefab1; + + public ShowAssetPreviewNest2 nest2; + } + + [System.Serializable] + public class ShowAssetPreviewNest2 + { + [ShowAssetPreview] + public Sprite sprite2; + + [ShowAssetPreview(96, 96)] + public GameObject prefab2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta new file mode 100644 index 0000000..b636853 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 705c14aa9ecaa274289972381f471367 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs new file mode 100644 index 0000000..fe19d63 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs @@ -0,0 +1,119 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowIfTest : MonoBehaviour + { + public bool show1; + public bool show2; + public ShowIfEnum enum1; + [EnumFlags] public ShowIfEnumFlag enum2; + + [ShowIf(EConditionOperator.And, "show1", "show2")] + [ReorderableList] + public int[] showIfAll; + + [ShowIf(EConditionOperator.Or, "show1", "show2")] + [ReorderableList] + public int[] showIfAny; + + [ShowIf("enum1", ShowIfEnum.Case0)] + [ReorderableList] + public int[] showIfEnum; + + [ShowIf("enum2", ShowIfEnumFlag.Flag0)] + [ReorderableList] + public int[] showIfEnumFlag; + + [ShowIf("enum2", ShowIfEnumFlag.Flag0 | ShowIfEnumFlag.Flag1)] + [ReorderableList] + public int[] showIfEnumFlagMulti; + + public ShowIfNest1 nest1; + } + + [System.Serializable] + public class ShowIfNest1 + { + public bool show1; + public bool show2; + public ShowIfEnum enum1; + [EnumFlags] public ShowIfEnumFlag enum2; + public bool Show1 { get { return show1; } } + public bool Show2 { get { return show2; } } + public ShowIfEnum Enum1 { get { return enum1; } } + public ShowIfEnumFlag Enum2 { get { return enum2; } } + + [ShowIf(EConditionOperator.And, "Show1", "Show2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int showIfAll; + + [ShowIf(EConditionOperator.Or, "Show1", "Show2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int showIfAny; + + [ShowIf("Enum1", ShowIfEnum.Case1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int showIfEnum; + + [ShowIf("Enum2", ShowIfEnumFlag.Flag0)] + [AllowNesting] + public int showIfEnumFlag; + + [ShowIf("Enum2", ShowIfEnumFlag.Flag0 | ShowIfEnumFlag.Flag1)] + [AllowNesting] + public int showIfEnumFlagMulti; + + public ShowIfNest2 nest2; + } + + [System.Serializable] + public class ShowIfNest2 + { + public bool show1; + public bool show2; + public ShowIfEnum enum1; + [EnumFlags] public ShowIfEnumFlag enum2; + public bool GetShow1() { return show1; } + public bool GetShow2() { return show2; } + public ShowIfEnum GetEnum1() { return enum1; } + public ShowIfEnumFlag GetEnum2() { return enum2; } + + [ShowIf(EConditionOperator.And, "GetShow1", "GetShow2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 showIfAll = new Vector2(0.25f, 0.75f); + + [ShowIf(EConditionOperator.Or, "GetShow1", "GetShow2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 showIfAny = new Vector2(0.25f, 0.75f); + + [ShowIf("GetEnum1", ShowIfEnum.Case2)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 showIfEnum = new Vector2(0.25f, 0.75f); + + [ShowIf("GetEnum2", ShowIfEnumFlag.Flag0)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 showIfEnumFlag; + + [ShowIf("GetEnum2", ShowIfEnumFlag.Flag0 | ShowIfEnumFlag.Flag1)] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 showIfEnumFlagMulti; + } + + public enum ShowIfEnum + { + Case0, + Case1, + Case2 + } + + [Flags] + public enum ShowIfEnumFlag + { + Flag0 = 1, + Flag1 = 2, + Flag2 = 4, + Flag3 = 8 + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta new file mode 100644 index 0000000..749d05c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4fdbfcfbf5b056a4bac491fe21569572 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs new file mode 100644 index 0000000..6f4b379 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs @@ -0,0 +1,79 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowNativePropertyTest : MonoBehaviour + { + [ShowNativeProperty] + private Transform Transform + { + get + { + return transform; + } + } + + [ShowNativeProperty] + private Transform ParentTransform + { + get + { + return transform.parent; + } + } + + [ShowNativeProperty] + private ushort MyUShort + { + get + { + return ushort.MaxValue; + } + } + + [ShowNativeProperty] + private short MyShort + { + get + { + return short.MaxValue; + } + } + + [ShowNativeProperty] + private ulong MyULong + { + get + { + return ulong.MaxValue; + } + } + + [ShowNativeProperty] + private long MyLong + { + get + { + return long.MaxValue; + } + } + + [ShowNativeProperty] + private uint MyUInt + { + get + { + return uint.MaxValue; + } + } + + [ShowNativeProperty] + private int MyInt + { + get + { + return int.MaxValue; + } + } + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta new file mode 100644 index 0000000..19f9e31 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b5a73795d25dd334e90a5a347c6079d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs new file mode 100644 index 0000000..cace150 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs @@ -0,0 +1,33 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowNonSerializedFieldTest : MonoBehaviour + { +#pragma warning disable 414 + [ShowNonSerializedField] + private ushort myUShort = ushort.MaxValue; + + [ShowNonSerializedField] + private short myShort = short.MaxValue; + + [ShowNonSerializedField] + private uint myUInt = uint.MaxValue; + + [ShowNonSerializedField] + private int myInt = 10; + + [ShowNonSerializedField] + private ulong myULong = ulong.MaxValue; + + [ShowNonSerializedField] + private long myLong = long.MaxValue; + + [ShowNonSerializedField] + private const float PI = 3.14159f; + + [ShowNonSerializedField] + private static readonly Vector3 CONST_VECTOR = Vector3.one; +#pragma warning restore 414 + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta new file mode 100644 index 0000000..404ff1b --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 913d67a695253f744bdc776625b9b948 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs new file mode 100644 index 0000000..e77bfec --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs @@ -0,0 +1,46 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class SortingLayerTest : MonoBehaviour + { + [SortingLayer] + public int layerNumber0; + + [SortingLayer] + public string layerName0; + + public SortingLayerNest1 nest1; + + [Button] + public void DebugLog() + { + Debug.LogFormat("{0} = {1}", nameof(layerNumber0), layerNumber0); + Debug.LogFormat("{0} = {1}", nameof(layerName0), layerName0); + Debug.LogFormat("LayerToName({0}) = {1}", layerNumber0, SortingLayer.IDToName(layerNumber0)); + Debug.LogFormat("NameToLayer({0}) = {1}", layerName0, SortingLayer.NameToID(layerName0)); + } + } + + [System.Serializable] + public class SortingLayerNest1 + { + [SortingLayer] + public int layerNumber1; + + [SortingLayer] + public string layerName1; + + public SortingLayerNest2 nest2; + } + + [System.Serializable] + public struct SortingLayerNest2 + { + [SortingLayer] + public int layerNumber2; + + [SortingLayer] + public string layerName2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs.meta new file mode 100644 index 0000000..e8cd99c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/SortingLayerTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ed73e666d447964d93c4840f05423dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs new file mode 100644 index 0000000..cb77fb8 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs @@ -0,0 +1,34 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class TagTest : MonoBehaviour + { + [Tag] + public string tag0; + + public TagNest1 nest1; + + [Button] + private void LogTag0() + { + Debug.Log(tag0); + } + } + + [System.Serializable] + public class TagNest1 + { + [Tag] + public string tag1; + + public TagNest2 nest2; + } + + [System.Serializable] + public struct TagNest2 + { + [Tag] + public string tag2; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs.meta new file mode 100644 index 0000000..88ea5af --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/TagTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bcc0d5613b48fb43bd36c9d37e99900 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs new file mode 100644 index 0000000..8e7b091 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs @@ -0,0 +1,52 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ValidateInputTest : MonoBehaviour + { + [ValidateInput("NotZero0", "int0 must not be zero")] + public int int0; + + private bool NotZero0(int value) + { + return value != 0; + } + + public ValidateInputNest1 nest1; + + public ValidateInputInheritedNest inheritedNest; + } + + [System.Serializable] + public class ValidateInputNest1 + { + [ValidateInput("NotZero1")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int int1; + + private bool NotZero1(int value) + { + return value != 0; + } + + public ValidateInputNest2 nest2; + } + + [System.Serializable] + public class ValidateInputNest2 + { + [ValidateInput("NotZero2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int int2; + + private bool NotZero2(int value) + { + return value != 0; + } + } + + [System.Serializable] + public class ValidateInputInheritedNest : ValidateInputNest1 + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta new file mode 100644 index 0000000..f57070a --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94adafcfe59aa344c9b5596b2cc6ecd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs new file mode 100644 index 0000000..aff1dfa --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class _NaughtyComponent : MonoBehaviour + { + } + + [System.Serializable] + public class MyClass + { + } + + [System.Serializable] + public struct MyStruct + { + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta new file mode 100644 index 0000000..5702f19 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 9c928ea15ae74a44089beb2e534c1a35 +timeCreated: 1507996629 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs new file mode 100644 index 0000000..c8d80fb --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + //[CreateAssetMenu(fileName = "NaughtyScriptableObject", menuName = "NaughtyAttributes/_NaughtyScriptableObject")] + public class _NaughtyScriptableObject : ScriptableObject + { + [Expandable] + public List<_TestScriptableObjectA> listA; + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta new file mode 100644 index 0000000..eb5d253 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 753bdb918c6038142acddbd7aae6958f +timeCreated: 1518639587 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs new file mode 100644 index 0000000..ee7b36f --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs @@ -0,0 +1,12 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace NaughtyAttributes.Test +{ + //[CreateAssetMenu(fileName = "TestScriptableObjectA", menuName = "NaughtyAttributes/TestScriptableObjectA")] + public class _TestScriptableObjectA : ScriptableObject + { + [Expandable] + public List<_TestScriptableObjectB> listB; + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs.meta new file mode 100644 index 0000000..5037e5c --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectA.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19472ac11eae27a4b804f354ca7d9c00 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs new file mode 100644 index 0000000..89a474d --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs @@ -0,0 +1,12 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace NaughtyAttributes.Test +{ + //[CreateAssetMenu(fileName = "TestScriptableObjectB", menuName = "NaughtyAttributes/TestScriptableObjectB")] + public class _TestScriptableObjectB : ScriptableObject + { + [MinMaxSlider(0, 10)] + public Vector2Int slider; + } +} \ No newline at end of file diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs.meta new file mode 100644 index 0000000..0562e57 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/Scripts/Test/_TestScriptableObjectB.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2b396aeebc9d984da298eee313896bc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/package.json b/Assets/Framework/ThirdParty/NaughtyAttributes/package.json new file mode 100644 index 0000000..960db05 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/package.json @@ -0,0 +1,21 @@ +{ + "name": "com.dbrizov.naughtyattributes", + "displayName": "NaughtyAttributes", + "version": "2.1.4", + "unity": "2018.4", + "description": "NaughtyAttributes is an extension for the Unity Inspector.", + "keywords": [ "attribute", "inspector", "editor" ], + "category": "editor extensions", + "dependencies": {}, + "samples": [ + { + "displayName": "Demo Scene", + "description": "Demo Scene", + "path": "Samples/DemoScene" + } + ], + "author": { + "name": "Denis Rizov", + "url": "https://github.com/dbrizov" + } +} diff --git a/Assets/Framework/ThirdParty/NaughtyAttributes/package.json.meta b/Assets/Framework/ThirdParty/NaughtyAttributes/package.json.meta new file mode 100644 index 0000000..6f1fa82 --- /dev/null +++ b/Assets/Framework/ThirdParty/NaughtyAttributes/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: db9a5ca20403b0344ae64015de8f8c86 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 0000000..eb3b54f --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 24335843f110e5c4b89023c88a99ee1a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources.meta b/Assets/Resources.meta new file mode 100644 index 0000000..ec84c71 --- /dev/null +++ b/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc523243b4f6e0f40a65d8b6f4677c2e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TestScripts.meta b/Assets/TestScripts.meta new file mode 100644 index 0000000..cac19d7 --- /dev/null +++ b/Assets/TestScripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af948cddee419074187fe53931f28c3d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: