Decompiled source of For The Company Beta v3.0.0

plugins/Darkbrewery-Emblem/Emblem.dll

Decompiled 7 months ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using Emblem;
using Emblem.Components;
using Emblem.Managers;
using HarmonyLib;
using LethalConfig;
using LethalConfig.ConfigItems;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.Video;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Emblem")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Emblem")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e4927ee1-3a47-4f93-8784-804356949316")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("Darkbrewery.Emblem", "Emblem", "1.3.2")]
public class EmblemPlugin : BaseUnityPlugin
{
	private UIComponent uiComponent;

	private HeaderReplacement headerReplacement;

	private Boardwalk boardwalk;

	private BackgroundManager backgroundManager;

	private LoadingText loadingText;

	private MenuMoodSetter menuMoodSetter;

	private Harmony harmony;

	private CustomMediaManager customMediaManager;

	private SceneManagerHelper sceneManagerHelper;

	private InterfaceDecorator interfaceDecorator;

	private VersionStyler versionStyler;

	private Slideshow slideshow;

	private void Awake()
	{
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Expected O, but got Unknown
		LogWarden.Initialize(((BaseUnityPlugin)this).Logger);
		LogWarden.LogInfo("   #####################################################################   ");
		LogWarden.LogInfo(" %%                                                                     %% ");
		LogWarden.LogInfo("#            EEEEE   M     M   BBBBB    L      EEEEE   M     M            #");
		LogWarden.LogInfo("   *    ==   E       MM   MM   B    B   L      E       MM   MM   ==    *   ");
		LogWarden.LogInfo(" *   *       EEEE    M M M M   BBBBB    L      EEEE    M M M M       *   * ");
		LogWarden.LogInfo("   *    ==   E       M  M  M   B    B   L      E       M  M  M   ==    *   ");
		LogWarden.LogInfo("#            EEEEE   M     M   BBBBB    LLLLL  EEEEE   M     M            #");
		LogWarden.LogInfo(" %%                                                                     %% ");
		LogWarden.LogInfo("   ######################### BY DARKBREWERY ############################   ");
		LogWarden.LogInfo("Stirring from darkness...");
		try
		{
			harmony = new Harmony("com.darkbrewery.emblem.harmony");
			Configurator.InitializeInstance(((BaseUnityPlugin)this).Config);
			customMediaManager = new CustomMediaManager();
			uiComponent = new UIComponent();
			backgroundManager = new BackgroundManager();
			headerReplacement = new HeaderReplacement();
			boardwalk = new Boardwalk();
			loadingText = new LoadingText();
			menuMoodSetter = new MenuMoodSetter();
			versionStyler = new VersionStyler();
			slideshow = new Slideshow(((Component)this).transform);
			interfaceDecorator = new InterfaceDecorator(uiComponent, backgroundManager, headerReplacement, boardwalk, loadingText, menuMoodSetter, versionStyler, slideshow);
			sceneManagerHelper = new SceneManagerHelper(interfaceDecorator);
			harmony.PatchAll();
			LogWarden.LogInfo("Successfully deployed, its intent shrouded");
		}
		catch (Exception arg)
		{
			LogWarden.LogError($"Error initializing Emblem plugin: {arg}");
		}
	}
}
public class DelayHelper : MonoBehaviour
{
	private static DelayHelper instance;

	private Dictionary<string, Coroutine> coroutineDictionary = new Dictionary<string, Coroutine>();

	private Dictionary<TextMeshProUGUI, Coroutine> typingCoroutines = new Dictionary<TextMeshProUGUI, Coroutine>();

	private static DelayHelper GetInstance()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Expected O, but got Unknown
		if ((Object)(object)instance == (Object)null)
		{
			GameObject val = new GameObject("GlobalDelayHelper");
			instance = val.AddComponent<DelayHelper>();
			Object.DontDestroyOnLoad((Object)val);
		}
		return instance;
	}

	public static void StopAll()
	{
		foreach (Coroutine value in GetInstance().coroutineDictionary.Values)
		{
			((MonoBehaviour)GetInstance()).StopCoroutine(value);
		}
		GetInstance().coroutineDictionary.Clear();
	}

	public static void StartDelayedAction(float delayInSeconds, Action action)
	{
		GetInstance().DelayedAction(delayInSeconds, action);
	}

	private void DelayedAction(float delayInSeconds, Action action)
	{
		((MonoBehaviour)this).StartCoroutine(DelayCoroutine(delayInSeconds, action));
	}

	private IEnumerator DelayCoroutine(float delayInSeconds, Action action)
	{
		yield return (object)new WaitForSeconds(delayInSeconds);
		action?.Invoke();
	}

	public static void StartRepeatingAction(string name, float intervalInSeconds, Action action)
	{
		StopRepeatingAction(name);
		Coroutine value = ((MonoBehaviour)GetInstance()).StartCoroutine(GetInstance().RepeatingActionCoroutine(intervalInSeconds, action));
		GetInstance().coroutineDictionary[name] = value;
	}

	public static void StopRepeatingAction(string name)
	{
		if ((Object)(object)instance != (Object)null && instance.coroutineDictionary.TryGetValue(name, out var value))
		{
			((MonoBehaviour)instance).StopCoroutine(value);
			instance.coroutineDictionary.Remove(name);
		}
	}

	private IEnumerator RepeatingActionCoroutine(float intervalInSeconds, Action action)
	{
		while (true)
		{
			yield return (object)new WaitForSeconds(intervalInSeconds);
			action?.Invoke();
		}
	}

	public static void StartFadeAction(Image image, float duration, Action onComplete = null)
	{
		GetInstance().FadeImageCoroutine(image, duration, onComplete);
	}

	private void FadeImageCoroutine(Image image, float duration, Action onComplete)
	{
		((MonoBehaviour)this).StartCoroutine(FadeImage(image, duration, onComplete));
	}

	private IEnumerator FadeImage(Image image, float duration, Action onComplete)
	{
		float currentTime = 0f;
		Color startColor = ((Graphic)image).color;
		Color endColor = new Color(startColor.r, startColor.g, startColor.b, 0f);
		while (currentTime < duration)
		{
			currentTime += Time.deltaTime;
			((Graphic)image).color = Color.Lerp(startColor, endColor, currentTime / duration);
			yield return null;
		}
		((Graphic)image).color = endColor;
		onComplete?.Invoke();
	}

	public static void StartTypingText(TextMeshProUGUI textComponent, string text, float typingSpeed, float flashDuration = 0.3f, int flashCount = 2)
	{
		GetInstance().TypingTextCoroutine(textComponent, text, typingSpeed, flashDuration, flashCount);
	}

	private void TypingTextCoroutine(TextMeshProUGUI textComponent, string text, float typingSpeed, float flashDuration, int flashCount)
	{
		if (typingCoroutines.TryGetValue(textComponent, out var value))
		{
			((MonoBehaviour)this).StopCoroutine(value);
			typingCoroutines.Remove(textComponent);
		}
		Coroutine value2 = ((MonoBehaviour)this).StartCoroutine(TypeTextWithCursorFlash(textComponent, text, typingSpeed, flashDuration, flashCount));
		typingCoroutines[textComponent] = value2;
	}

	private IEnumerator TypeTextWithCursorFlash(TextMeshProUGUI textComponent, string text, float typingSpeed, float flashDuration, int flashCount)
	{
		StringBuilder stringBuilder = new StringBuilder();
		for (int j = 0; j < flashCount; j++)
		{
			((TMP_Text)textComponent).text = "_";
			yield return (object)new WaitForSeconds(flashDuration);
			((TMP_Text)textComponent).text = "";
			yield return (object)new WaitForSeconds(flashDuration);
		}
		foreach (char value in text)
		{
			stringBuilder.Append(value);
			((TMP_Text)textComponent).text = stringBuilder.ToString() + "_";
			yield return (object)new WaitForSeconds(typingSpeed);
			((TMP_Text)textComponent).text = stringBuilder.ToString();
		}
	}
}
public class EmblemFolder
{
	private readonly string basePluginsPath;

	private readonly Dictionary<string, string> fullPathCache = new Dictionary<string, string>();

	private readonly Dictionary<string, IEnumerable<string>> validPathsCache = new Dictionary<string, IEnumerable<string>>();

	private readonly Lazy<IEnumerable<string>> emblemDirectories;

	public EmblemFolder()
	{
		basePluginsPath = Path.Combine(Paths.BepInExRootPath, "plugins");
		emblemDirectories = new Lazy<IEnumerable<string>>(() => FindEmblemDirectories());
	}

	private IEnumerable<string> FindEmblemDirectories()
	{
		try
		{
			return (from dir in Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories)
				where Path.GetFileName(dir).Equals("Emblem", StringComparison.OrdinalIgnoreCase)
				select dir).ToList();
		}
		catch (Exception ex)
		{
			LogWarden.LogError("[EmblemFolder] Error finding Emblem directories: " + ex.Message);
			return new List<string>();
		}
	}

	public string FindFullPath(string inputPath)
	{
		if (fullPathCache.TryGetValue(inputPath, out var value))
		{
			return value;
		}
		string path = ExtractRelativePathFromEmblem(inputPath);
		string[] directories = Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories);
		foreach (string text in directories)
		{
			if (text.EndsWith("Emblem", StringComparison.OrdinalIgnoreCase))
			{
				string text2 = Path.Combine(text, path);
				if (File.Exists(text2) || Directory.Exists(text2))
				{
					fullPathCache[inputPath] = text2;
					return text2;
				}
			}
		}
		LogWarden.LogError("[EmblemFolder] Could not find a valid path for: " + inputPath);
		return null;
	}

	public IEnumerable<string> FindAllValidPaths(string inputPathPattern)
	{
		if (validPathsCache.TryGetValue(inputPathPattern, out var value))
		{
			return value;
		}
		string path = ExtractRelativePathFromEmblem(inputPathPattern);
		string[] directories = Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories);
		List<string> list = new List<string>();
		string[] array = directories;
		foreach (string text in array)
		{
			if (text.EndsWith("Emblem", StringComparison.OrdinalIgnoreCase))
			{
				string searchPattern = Path.Combine(text, path);
				list.AddRange(Directory.GetFiles(text, searchPattern, SearchOption.AllDirectories));
			}
		}
		validPathsCache[inputPathPattern] = list;
		return list;
	}

	private string ExtractRelativePathFromEmblem(string path)
	{
		string[] array = path.Split(new char[2]
		{
			Path.DirectorySeparatorChar,
			Path.AltDirectorySeparatorChar
		}, StringSplitOptions.RemoveEmptyEntries);
		int num = Array.FindIndex(array, (string segment) => segment.Equals("Emblem", StringComparison.OrdinalIgnoreCase));
		if (num != -1 && num < array.Length - 1)
		{
			return Path.Combine(array.Skip(num + 1).ToArray());
		}
		return path;
	}
}
public class ImageFilters
{
	private readonly Configurator configManager;

	public ImageFilters(Configurator configManager)
	{
		this.configManager = configManager;
	}

	public void Blend(string targetImagePath, Color vignetteColor)
	{
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Expected O, but got Unknown
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_011d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_0151: Unknown result type (might be due to invalid IL or missing references)
		Transform val = PathFinder.Probe(targetImagePath);
		if ((Object)(object)val == (Object)null)
		{
			LogWarden.LogError("ImageFilters.Blend: Image with path '" + targetImagePath + "' not found.");
			return;
		}
		GameObject gameObject = ((Component)val).gameObject;
		Transform val2 = gameObject.transform.Find("VignetteOverlay");
		if (!configManager.enableRadiantTaper.Value)
		{
			if ((Object)(object)val2 != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)val2).gameObject);
				LogWarden.LogInfo("ImageFilters.Blend: Vignette effect removed from '" + targetImagePath + "'.");
			}
			return;
		}
		GameObject val3;
		if ((Object)(object)val2 != (Object)null)
		{
			val3 = ((Component)val2).gameObject;
		}
		else
		{
			val3 = new GameObject("VignetteOverlay");
			RectTransform obj = val3.AddComponent<RectTransform>();
			((Transform)obj).SetParent(gameObject.transform, false);
			((Transform)obj).SetAsLastSibling();
			Rect rect = gameObject.GetComponent<RectTransform>().rect;
			float width = ((Rect)(ref rect)).width;
			rect = gameObject.GetComponent<RectTransform>().rect;
			obj.sizeDelta = new Vector2(width, ((Rect)(ref rect)).height);
		}
		Image obj2 = val3.GetComponent<Image>() ?? val3.AddComponent<Image>();
		Texture2D val4 = CreateVignetteTexture(((Texture)gameObject.GetComponent<Image>().sprite.texture).width, ((Texture)gameObject.GetComponent<Image>().sprite.texture).height, vignetteColor);
		obj2.sprite = Sprite.Create(val4, new Rect(0f, 0f, (float)((Texture)val4).width, (float)((Texture)val4).height), new Vector2(0.5f, 0.5f));
		((Graphic)obj2).raycastTarget = false;
	}

	private Texture2D CreateVignetteTexture(int width, int height, Color vignetteColor)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Expected O, but got Unknown
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		Texture2D val = new Texture2D(width, height, (TextureFormat)4, false);
		Color val2 = default(Color);
		for (int i = 0; i < height; i++)
		{
			for (int j = 0; j < width; j++)
			{
				float distance2 = j;
				float distance3 = width - j;
				float distance4 = height - i;
				float distance5 = i;
				float num = Mathf.Max(CalculateExponentialBlend(distance2, width), CalculateExponentialBlend(distance3, width));
				float num2 = Mathf.Max(CalculateExponentialBlend(distance4, height), CalculateExponentialBlend(distance5, height));
				float num3 = Mathf.Max(num, num2);
				((Color)(ref val2))..ctor(vignetteColor.r, vignetteColor.g, vignetteColor.b, num3);
				val.SetPixel(j, i, val2);
			}
		}
		val.Apply();
		return val;
		static float CalculateExponentialBlend(float distance, float totalDistance)
		{
			float num4 = 0.97f * totalDistance;
			if (distance > num4)
			{
				return Mathf.Clamp01(Mathf.Pow((distance - num4) / (totalDistance - num4), 2f));
			}
			return 0f;
		}
	}
}
public class HotLoad
{
	private GameObject mainButtons;

	private GameObject loadingScreen;

	private InputAction toggleAction;

	public static HotLoad Instance { get; private set; }

	public static void Initialize()
	{
		if (Instance == null)
		{
			Instance = new HotLoad();
		}
	}

	private HotLoad()
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Expected O, but got Unknown
		mainButtons = FindObject("Canvas/MenuContainer/MainButtons");
		loadingScreen = FindObject("Canvas/MenuContainer/LoadingScreen");
		toggleAction = new InputAction((string)null, (InputActionType)0, "<Keyboard>/backslash", (string)null, (string)null, (string)null);
		toggleAction.performed += delegate
		{
			ToggleUI();
		};
		toggleAction.Enable();
	}

	public void OnDestroy()
	{
		InputAction obj = toggleAction;
		if (obj != null)
		{
			obj.Disable();
		}
		InputAction obj2 = toggleAction;
		if (obj2 != null)
		{
			obj2.Dispose();
		}
		Instance = null;
	}

	private GameObject FindObject(string path)
	{
		Transform val = PathFinder.Probe(path);
		if ((Object)(object)val != (Object)null)
		{
			return ((Component)val).gameObject;
		}
		Debug.LogError((object)("[HotLoad] '" + path + "' not found."));
		return null;
	}

	private void ToggleUI()
	{
		if ((Object)(object)mainButtons != (Object)null && (Object)(object)loadingScreen != (Object)null)
		{
			bool activeSelf = mainButtons.activeSelf;
			mainButtons.SetActive(!activeSelf);
			loadingScreen.SetActive(activeSelf);
		}
	}
}
namespace Emblem
{
	internal static class LethalConfigCompat
	{
		public const string GUID = "ainavt.lc.lethalconfig";

		public static bool IsAvailable => Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig");

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public static void AddIntSlider(ConfigEntry<int> entry, bool restartRequired)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			if (IsAvailable)
			{
				LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(entry, restartRequired));
			}
		}
	}
	public class CRTEffect : MonoBehaviour
	{
		private Volume volume;

		public void SetupVolume(GameObject gameObject)
		{
			volume = gameObject.GetComponent<Volume>() ?? gameObject.AddComponent<Volume>();
			if ((Object)(object)volume == (Object)null)
			{
				LogWarden.LogError("[CRT] Failed to add or get Volume component on gameObject.");
				return;
			}
			volume.isGlobal = true;
			volume.priority = 2.1474836E+09f;
			if ((Object)(object)volume.profile == (Object)null)
			{
				volume.profile = ScriptableObject.CreateInstance<VolumeProfile>();
				if ((Object)(object)volume.profile == (Object)null)
				{
					LogWarden.LogError("[CRT] Failed to create a new VolumeProfile.");
					return;
				}
			}
			((Behaviour)volume).enabled = true;
			LogWarden.LogInfo("[CRT] Volume component for CRT effects has been enabled.");
			SetupCRTEffects();
		}

		private void SetupCRTEffects()
		{
			if ((Object)(object)volume.profile == (Object)null)
			{
				LogWarden.LogError("[CRT] VolumeProfile is null in SetupCRTEffects.");
				return;
			}
			ConfigureChromaticAberration();
			ConfigureFilmGrain();
			ConfigureVignette();
			ConfigureLensDistortion();
		}

		private T GetOrAddEffect<T>(bool overrides = true) where T : VolumeComponent, new()
		{
			VolumeComponent? obj = volume.profile.components.Find((VolumeComponent x) => x is T);
			return ((T)(object)((obj is T) ? obj : null)) ?? volume.profile.Add<T>(overrides);
		}

		public void DisableCRTEffects()
		{
			DisableEffect<ChromaticAberration>();
			DisableEffect<FilmGrain>();
			DisableEffect<Vignette>();
			DisableEffect<LensDistortion>();
		}

		private void DisableEffect<T>() where T : VolumeComponent
		{
			if (!((Object)(object)volume == (Object)null) && !((Object)(object)volume.profile == (Object)null))
			{
				VolumeComponent? obj = volume.profile.components.Find((VolumeComponent x) => x is T);
				T val = (T)(object)((obj is T) ? obj : null);
				if ((Object)(object)val != (Object)null && ((VolumeComponent)val).active)
				{
					((VolumeComponent)val).active = false;
				}
				else
				{
					LogWarden.LogWarning("[CRT] Attempted to disable a non-existent or inactive effect.");
				}
			}
		}

		private void ConfigureChromaticAberration()
		{
			ChromaticAberration orAddEffect = GetOrAddEffect<ChromaticAberration>(overrides: true);
			((VolumeComponent)orAddEffect).active = true;
			((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.04f;
		}

		private void ConfigureFilmGrain()
		{
			FilmGrain orAddEffect = GetOrAddEffect<FilmGrain>(overrides: true);
			((VolumeComponent)orAddEffect).active = true;
			((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.4f;
			((VolumeParameter<FilmGrainLookup>)(object)orAddEffect.type).value = (FilmGrainLookup)2;
			((VolumeParameter<float>)(object)orAddEffect.response).value = 0.2f;
		}

		private void ConfigureVignette()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			Vignette orAddEffect = GetOrAddEffect<Vignette>(overrides: true);
			((VolumeComponent)orAddEffect).active = true;
			((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.4f;
			((VolumeParameter<Color>)(object)orAddEffect.color).value = Color.black;
			((VolumeParameter<Vector2>)(object)orAddEffect.center).value = new Vector2(0.5f, 0.5f);
			((VolumeParameter<float>)(object)orAddEffect.roundness).value = 1f;
			((VolumeParameter<float>)(object)orAddEffect.smoothness).value = 0.5f;
		}

		private void ConfigureLensDistortion()
		{
			LensDistortion orAddEffect = GetOrAddEffect<LensDistortion>(overrides: true);
			((VolumeComponent)orAddEffect).active = true;
			((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.2f;
			((VolumeParameter<float>)(object)orAddEffect.scale).value = 1f;
		}
	}
	public class ScanlineEffectApplier : MonoBehaviour
	{
		private static Material scanlineMaterial;

		private void LoadMaterialFromAssetBundle(string bundleResourceName, string materialName)
		{
			AssetBundle val = LoadAssetBundleFromEmbeddedResource(bundleResourceName);
			if ((Object)(object)val != (Object)null)
			{
				scanlineMaterial = val.LoadAsset<Material>(materialName);
				val.Unload(false);
			}
			else
			{
				LogWarden.LogError("[Scanlines] Failed to load the scanline material from the asset bundle.");
			}
		}

		private AssetBundle LoadAssetBundleFromEmbeddedResource(string resourceName)
		{
			using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
			if (stream == null)
			{
				LogWarden.LogError("[Scanlines] Embedded resource not found.");
				return null;
			}
			byte[] array = new byte[stream.Length];
			stream.Read(array, 0, array.Length);
			return AssetBundle.LoadFromMemory(array);
		}

		private void Awake()
		{
			if ((Object)(object)scanlineMaterial == (Object)null)
			{
				LoadMaterialFromAssetBundle("Emblem.Assets.scanlines", "Scanlines");
			}
		}

		public void ApplyScanlines(string targetGameObjectName)
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)scanlineMaterial == (Object)null))
			{
				GameObject val = GameObject.Find(targetGameObjectName);
				if ((Object)(object)val == (Object)null)
				{
					LogWarden.LogError("[Scanlines] GameObject with name '" + targetGameObjectName + "' not found.");
					return;
				}
				Transform obj = val.transform.Find("Scanlines");
				GameObject val2 = (GameObject)(((object)((obj != null) ? ((Component)obj).gameObject : null)) ?? ((object)new GameObject("Scanlines")));
				val2.transform.SetParent(val.transform, false);
				Image obj2 = val2.GetComponent<Image>() ?? val2.AddComponent<Image>();
				((Graphic)obj2).material = scanlineMaterial;
				((Graphic)obj2).raycastTarget = false;
				RectTransform component = val2.GetComponent<RectTransform>();
				component.anchorMin = Vector2.zero;
				component.anchorMax = Vector2.one;
				component.sizeDelta = Vector2.zero;
				((Transform)component).localPosition = Vector3.zero;
				((Transform)component).SetAsLastSibling();
			}
		}

		public void RemoveScanlines(string targetGameObjectName)
		{
			GameObject val = GameObject.Find(targetGameObjectName);
			if ((Object)(object)val == (Object)null)
			{
				LogWarden.LogError("[Scanlines] GameObject with name '" + targetGameObjectName + "' not found to remove scanlines.");
				return;
			}
			Transform val2 = val.transform.Find("Scanlines");
			if ((Object)(object)val2 != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)val2).gameObject);
			}
			else
			{
				LogWarden.LogInfo("[Scanlines] No scanlines effect found to remove.");
			}
		}
	}
	public class ConfigWatcher : IDisposable
	{
		private readonly FileSystemWatcher _watcher;

		public event Action OnConfigChanged;

		public ConfigWatcher(string filePath)
		{
			_watcher = new FileSystemWatcher
			{
				Path = Path.GetDirectoryName(filePath),
				Filter = Path.GetFileName(filePath),
				NotifyFilter = NotifyFilters.LastWrite
			};
			_watcher.Changed += ConfigChanged;
			_watcher.EnableRaisingEvents = true;
		}

		private void ConfigChanged(object sender, FileSystemEventArgs e)
		{
			if (File.Exists(e.FullPath))
			{
				_watcher.EnableRaisingEvents = false;
				Thread.Sleep(1000);
				_watcher.EnableRaisingEvents = true;
				this.OnConfigChanged?.Invoke();
			}
		}

		public void Dispose()
		{
			if (_watcher != null)
			{
				_watcher.EnableRaisingEvents = false;
				_watcher.Changed -= ConfigChanged;
				_watcher.Dispose();
			}
		}
	}
	public static class ColorParser
	{
		public static Color RGBA(string rgbaString)
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			string[] array = rgbaString.Split(new char[1] { ',' });
			if (array.Length != 4)
			{
				return Color.white;
			}
			float num = Mathf.Clamp01((float)int.Parse(array[0]) / 255f);
			float num2 = Mathf.Clamp01((float)int.Parse(array[1]) / 255f);
			float num3 = Mathf.Clamp01((float)int.Parse(array[2]) / 255f);
			float num4 = Mathf.Clamp01(float.Parse(array[3]));
			return new Color(num, num2, num3, num4);
		}

		public static Color RGB(string rgbString)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			string[] array = rgbString.Split(new char[1] { ',' });
			if (array.Length < 3 || array.Length > 4)
			{
				return Color.white;
			}
			float num = Mathf.Clamp01((float)int.Parse(array[0]) / 255f);
			float num2 = Mathf.Clamp01((float)int.Parse(array[1]) / 255f);
			float num3 = Mathf.Clamp01((float)int.Parse(array[2]) / 255f);
			return new Color(num, num2, num3, 1f);
		}
	}
	public static class LogWarden
	{
		private static ManualLogSource loggerInstance;

		public static void Initialize(ManualLogSource logger)
		{
			loggerInstance = logger;
		}

		public static void LogError(string message)
		{
			ManualLogSource obj = loggerInstance;
			if (obj != null)
			{
				obj.LogError((object)message);
			}
		}

		public static void LogWarning(string message)
		{
			ManualLogSource obj = loggerInstance;
			if (obj != null)
			{
				obj.LogWarning((object)message);
			}
		}

		public static void LogInfo(string message)
		{
			ManualLogSource obj = loggerInstance;
			if (obj != null)
			{
				obj.LogInfo((object)message);
			}
		}
	}
	public class MainThreadDispatcher : MonoBehaviour
	{
		private static readonly ConcurrentQueue<Action> _queue = new ConcurrentQueue<Action>();

		private static MainThreadDispatcher _instance;

		public static MainThreadDispatcher EnsureInstance()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			if ((Object)(object)_instance == (Object)null)
			{
				GameObject val = new GameObject("MainThreadDispatcher");
				_instance = val.AddComponent<MainThreadDispatcher>();
				Object.DontDestroyOnLoad((Object)val);
				Debug.Log((object)"[Emblem][MainThreadDispatcher] Instance created and set to DontDestroyOnLoad.");
			}
			return _instance;
		}

		public static void Enqueue(Action action)
		{
			EnsureInstance();
			Debug.Log((object)"[Emblem][MainThreadDispatcher] Action enqueued.");
			_queue.Enqueue(action);
		}

		private void Update()
		{
			Action result;
			while (_queue.TryDequeue(out result))
			{
				try
				{
					result();
				}
				catch (Exception arg)
				{
					Debug.LogError((object)$"[MainThreadDispatcher] Exception during action execution: {arg}");
				}
			}
		}
	}
	public static class PathFinder
	{
		public static Transform Probe(string path)
		{
			Transform val = null;
			string[] array = path.Split(new char[1] { '/' });
			foreach (string text in array)
			{
				if ((Object)(object)val == (Object)null)
				{
					GameObject obj = GameObject.Find(text);
					val = ((obj != null) ? obj.transform : null);
				}
				else
				{
					val = val.Find(text);
				}
				if ((Object)(object)val == (Object)null)
				{
					GameObject[] array2 = Resources.FindObjectsOfTypeAll<GameObject>();
					foreach (GameObject val2 in array2)
					{
						if (((Object)val2).name == text)
						{
							val = val2.transform;
							break;
						}
					}
				}
				if ((Object)(object)val == (Object)null)
				{
					LogWarden.LogError("[Pathfinder] Element '" + text + "' not found in path '" + path + "'.");
					return null;
				}
			}
			return val;
		}
	}
	public class Configurator
	{
		private static Configurator _instance;

		private static readonly object _lock = new object();

		private ConfigWatcher _configWatcher;

		public ConfigFile Config { get; private set; }

		public static Configurator Instance
		{
			get
			{
				if (_instance == null)
				{
					throw new Exception("Configurator must be initialized with a ConfigFile before use.");
				}
				return _instance;
			}
		}

		public ConfigEntry<bool> enableReplaceMainHeader { get; private set; }

		public ConfigEntry<string> mainHeaderPath { get; private set; }

		public ConfigEntry<float> mainHeaderYOffset { get; private set; }

		public ConfigEntry<int> mainHeaderScale { get; private set; }

		public ConfigEntry<int> mainHeaderAlpha { get; private set; }

		public ConfigEntry<bool> enableMainBackground { get; private set; }

		public ConfigEntry<string> mainBackgroundPath { get; private set; }

		public ConfigEntry<string> mainBackgroundColor { get; private set; }

		public ConfigEntry<bool> enableMenuColorChange { get; private set; }

		public ConfigEntry<string> menuFontColor { get; private set; }

		public ConfigEntry<string> menuRolloverBGColor { get; private set; }

		public ConfigEntry<string> menuRolloverFontColor { get; private set; }

		public ConfigEntry<bool> enableReplaceLoadHeader { get; private set; }

		public ConfigEntry<string> loadHeaderPath { get; private set; }

		public ConfigEntry<float> loadHeaderYOffset { get; private set; }

		public ConfigEntry<int> loadHeaderScale { get; private set; }

		public ConfigEntry<int> loadHeaderAlpha { get; private set; }

		public ConfigEntry<bool> loadHeaderStretch { get; private set; }

		public ConfigEntry<bool> enableLoadBackground { get; private set; }

		public ConfigEntry<string> loadBackgroundPath { get; private set; }

		public ConfigEntry<string> loadBackgroundColor { get; private set; }

		public ConfigEntry<bool> enableLoadingTextChange { get; private set; }

		public ConfigEntry<string> loadTextString { get; private set; }

		public ConfigEntry<string> loadTextColor { get; private set; }

		public ConfigEntry<float> loadTextSize { get; private set; }

		public ConfigEntry<float> loadTextYOffset { get; private set; }

		public ConfigEntry<bool> enableReplaceBorder { get; private set; }

		public ConfigEntry<string> borderColor { get; private set; }

		public ConfigEntry<float> borderPadding { get; private set; }

		public ConfigEntry<bool> enableCustomVersion { get; private set; }

		public ConfigEntry<string> versionTextString { get; private set; }

		public ConfigEntry<string> versionColor { get; private set; }

		public ConfigEntry<float> versionFontSize { get; private set; }

		public ConfigEntry<float> versionYOffset { get; private set; }

		public ConfigEntry<string> versionAlign { get; private set; }

		public ConfigEntry<bool> enableRadiantTaper { get; private set; }

		public ConfigEntry<bool> enableCRT { get; private set; }

		public ConfigEntry<bool> enableScanlines { get; private set; }

		public ConfigEntry<bool> enableTypedLoadText { get; private set; }

		public ConfigEntry<bool> enableGlitchyLogo { get; private set; }

		public ConfigEntry<bool> enableSlideshow { get; private set; }

		public ConfigEntry<string> slideshowSections { get; private set; }

		public ConfigEntry<float> slideshowDelay { get; private set; }

		public ConfigEntry<float> slideTransTime { get; private set; }

		private Configurator(ConfigFile config)
		{
			Config = config;
			_configWatcher = new ConfigWatcher(config.ConfigFilePath);
			_configWatcher.OnConfigChanged += ApplyConfigChanges;
			Initialize();
		}

		private void ApplyConfigChanges()
		{
			MainThreadDispatcher.Enqueue(delegate
			{
				Config.Reload();
				LogWarden.LogInfo("[ConfigWatcher] Detected change in configuration file.");
			});
		}

		public static Configurator InitializeInstance(ConfigFile config)
		{
			lock (_lock)
			{
				if (_instance == null)
				{
					_instance = new Configurator(config);
				}
				return _instance;
			}
		}

		private void Initialize()
		{
			enableReplaceMainHeader = BindConfig("1. Main Logo", "Enable", defaultValue: false, "Enable or disable header image replacement.");
			mainHeaderPath = BindConfig("1. Main Logo", "Path", "Defaults/Header/HeaderWhite.png", "Relative to your /Emblem/ folder: Specify a .png file. A folder will randomly select an image starting with the prefix 'Header'. Leave blank to use nothing.");
			mainHeaderYOffset = BindConfig("1. Main Logo", "Offset", 20f, "Vertical Y offset percentage from top. Set to -1 for no adjustment.");
			mainHeaderScale = BindConfig("1. Main Logo", "Scale", 60, "Image scale. This will maintain aspect ratio. 100 for apx original size");
			mainHeaderAlpha = BindConfig("1. Main Logo", "Alpha", 100, "Image transparency. 0 for invisible and 100 for completely opaque.");
			enableMainBackground = BindConfig("2. Main Background", "Enable", defaultValue: true, "Enable or disable the custom main menu background.");
			mainBackgroundPath = BindConfig("2. Main Background", "Path", "Defaults/Background", "Relative to your /Emblem/ folder: Specify a .png, .mp4. A folder will randomly select an image starting with the prefix 'Background'. Separate multiple mp4 paths with a | to pick one randomly");
			mainBackgroundColor = BindConfig("2. Main Background", "Color", "0,0,0", "Background color for Main Menu Screen in RGB format (ex: '0,0,0' for black). No alpha value as this is the bottom layer");
			enableMenuColorChange = BindConfig("3. Menu Colors", "Enable", defaultValue: false, "Do you even want to mess with menu colors?");
			menuFontColor = BindConfig("3. Menu Colors", "Color", "230,100,65,1", "Color of menu font.");
			menuRolloverBGColor = BindConfig("3. Menu Colors", "Highlight BG Color", "230,100,65,1", "Background color of a menu items on rollover.");
			menuRolloverFontColor = BindConfig("3. Menu Colors", "Highlight Font Color", "0,0,0,1", "Font color of menu items on rollover.");
			enableReplaceLoadHeader = BindConfig("4. Loading Image", "Enable", defaultValue: false, "Enable or disable loading image replacement.");
			loadHeaderPath = BindConfig("4. Loading Image", "Path", "Defaults/Loading", "Relative to your /Emblem/ folder: Specify a .png file. A folder will randomly select an image starting with the prefix 'Loading'. Leave blank to use nothing");
			loadHeaderYOffset = BindConfig("4. Loading Image", "Offset", 50f, "Vertical Y offset percentage from top. Set to -1 for no adjustment.");
			loadHeaderScale = BindConfig("4. Loading Image", "Scale", 60, "Image scale. This will maintain aspect ratio.");
			loadHeaderAlpha = BindConfig("4. Loading Image", "Alpha", 100, "Image transparency. 0 for invisible and 100 for completely opaque.");
			loadHeaderStretch = BindConfig("4. Loading Image", "Stretch", defaultValue: false, "Stretch the loading image to fit the screen vertically. This will override scale and offset");
			enableLoadBackground = BindConfig("5. Loading Background", "Enable", defaultValue: false, "Enable or disable the loading screen background.");
			loadBackgroundPath = BindConfig("5. Loading Background", "Path", "Defaults/Background", "Relative to your /Emblem/ folder: Specify a .png, .mp4. A folder will randomly select an image starting with the prefix 'LoadBackground'. Separate multiple mp4 paths with a | to pick one randomly");
			loadBackgroundColor = BindConfig("5. Loading Background", "Color", "0,0,0,1", "Background color for Loading Screen in RGBA format (ex: '255,255,255,1' for white).");
			enableLoadingTextChange = BindConfig("6. Loading Text", "Enable", defaultValue: false, "Enable or disable the custom loading text feature.");
			loadTextString = BindConfig("6. Loading Text", "Text", "Loading...", "Text displayed on the loading screen. Separate multiple texts with '|' to choose one at random. Use \\n for linebreaks");
			loadTextColor = BindConfig("6. Loading Text", "Color", "255,139,0,1", "Color of the font in RGBA format (ex: '0,0,0,1' for blue).");
			loadTextSize = BindConfig("6. Loading Text", "Font Size", 40f, "Size of the font used in the loading text.");
			loadTextYOffset = BindConfig("6. Loading Text", "Offset", 50f, "Vertical Y offset percentage from top.");
			enableReplaceBorder = BindConfig("7. Borders", "Hide", defaultValue: false, "Enable or disable the corner borders.");
			borderColor = BindConfig("7. Borders", "Color", "115,59,0,1", "The color of the border in RGBA format (ex: '0,255,0,1' for green).");
			borderPadding = BindConfig("7. Borders", "Padding", 10f, "How far should the border be from corners of the screen.");
			enableCustomVersion = BindConfig("8. Version Number", "Enable", defaultValue: false, "Play around in version styling? This will disable word wrapping");
			versionTextString = BindConfig("8. Version Number", "Text", "[ %VERSION% ]", "Format string for the version text. Use %VERSION% for the original string. Use \\n for linebreaks");
			versionColor = BindConfig("8. Version Number", "Color", "230,100,65,0.45", "The color of the text in RGBA format (ex: '255,0,0,1' for red)..");
			versionFontSize = BindConfig("8. Version Number", "Font Size", 16f, "Font size of the version text.");
			versionYOffset = BindConfig("8. Version Number", "Offset", 95.8f, "Vertical Y offset percentage from top.");
			versionAlign = BindConfig("8. Version Number", "Alignment", "Center", "Text Position \nOptions: Left, Center, Right");
			enableRadiantTaper = BindConfig("9. Experimental", "Radiant Taper", defaultValue: false, "Use the vignette blending effect on background images and their background color");
			enableCRT = BindConfig("9. Experimental", "Retro TV Style", defaultValue: false, "Make the entire menu scene look like a CRT monitor");
			enableScanlines = BindConfig("9. Experimental", "Scanline Shader", defaultValue: false, "Add subtle scanlines to the entire scene");
			enableTypedLoadText = BindConfig("9. Experimental", "Typed Loading Text", defaultValue: false, "Enable the typing effect on the load text This requires multiple strings and slideshow enabled");
			enableGlitchyLogo = BindConfig("9. Experimental", "Glitchy Logo", defaultValue: false, "Add fancy effects to the main logo");
			enableSlideshow = BindConfig("Slideshow", "Enable", defaultValue: false, "Use the slideshow feature. Each path section must be using image prefixs.");
			slideshowSections = BindConfig("Slideshow", "Apply To", "", "Specify which sections the slideshow applies to. Separate multiple sections with commas.\nOptions: Header, Background, Loading, LoadBackground, LoadText.");
			slideshowDelay = BindConfig("Slideshow", "Timer", 10f, "Set the delay timer in seconds for the slideshow feature. Range: 0.1 - 30 seconds.");
			slideTransTime = BindConfig("Slideshow", "Transition Length", 2f, "How many seconds the transition should take to fade.");
		}

		private ConfigEntry<T> BindConfig<T>(string section, string key, T defaultValue, string description)
		{
			return Config.Bind<T>(section, key, defaultValue, description);
		}
	}
	public class LoadingText
	{
		private string[] textOptions;

		private int lastIndex = -1;

		private Configurator ConfigManager => Configurator.Instance;

		public LoadingText()
		{
			ConfigManager.enableLoadingTextChange.SettingChanged += delegate
			{
				ToggleLoadText();
			};
			ConfigManager.loadTextString.SettingChanged += delegate
			{
				UpdateTextOptions();
			};
			ConfigManager.loadTextString.SettingChanged += delegate
			{
				UpdateTextProperties();
			};
			ConfigManager.loadTextSize.SettingChanged += delegate
			{
				UpdateTextProperties();
			};
			ConfigManager.loadTextColor.SettingChanged += delegate
			{
				UpdateTextProperties();
			};
			ConfigManager.loadTextYOffset.SettingChanged += delegate
			{
				UpdateTextProperties();
			};
			ConfigManager.enableTypedLoadText.SettingChanged += delegate
			{
				StartTextUpdates();
			};
			ConfigManager.slideshowSections.SettingChanged += delegate
			{
				StartTextUpdates();
			};
		}

		public void ToggleLoadText()
		{
			RectTransform val = FindLoadingTextContainer();
			if ((Object)(object)val == (Object)null)
			{
				LogWarden.LogError("[LoadText] LoadingTextContainer not found.");
				return;
			}
			TextMeshProUGUI componentInChildren = ((Component)val).GetComponentInChildren<TextMeshProUGUI>(true);
			Transform obj = ((Transform)val).Find("LoadMessage");
			TextMeshProUGUI val2 = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null);
			if ((Object)(object)componentInChildren == (Object)null || (Object)(object)val2 == (Object)null)
			{
				LogWarden.LogError("[LoadText] Could not find the original or cloned LoadingText components.");
				return;
			}
			bool value = ConfigManager.enableLoadingTextChange.Value;
			((Component)componentInChildren).gameObject.SetActive(!value);
			((Component)val2).gameObject.SetActive(value);
			LogWarden.LogInfo("[LoadText] ToggleLoadText: Original is " + (value ? "inactive" : "active") + ", cloned is " + (value ? "active" : "inactive") + ".");
		}

		public void ApplyLoadingCustomizations()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = FindLoadingTextContainer();
			if ((Object)(object)val == (Object)null)
			{
				LogWarden.LogError("[LoadText] LoadingTextContainer not found.");
				return;
			}
			TextMeshProUGUI componentInChildren = ((Component)val).GetComponentInChildren<TextMeshProUGUI>();
			if ((Object)(object)componentInChildren == (Object)null)
			{
				LogWarden.LogError("[LoadText] Original TextMeshProUGUI component not found.");
				return;
			}
			GameObject val2 = new GameObject("LoadMessage");
			val2.transform.SetParent((Transform)(object)val);
			val2.transform.localScale = Vector3.one;
			TextMeshProUGUI val3 = val2.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val3).rectTransform.sizeDelta = ((TMP_Text)componentInChildren).rectTransform.sizeDelta;
			((TMP_Text)val3).rectTransform.anchoredPosition = ((TMP_Text)componentInChildren).rectTransform.anchoredPosition;
			((TMP_Text)val3).text = ((TMP_Text)componentInChildren).text;
			((TMP_Text)val3).font = ((TMP_Text)componentInChildren).font;
			((TMP_Text)val3).fontStyle = ((TMP_Text)componentInChildren).fontStyle;
			((TMP_Text)val3).fontSize = ((TMP_Text)componentInChildren).fontSize;
			((Graphic)val3).color = Color.white;
			((TMP_Text)val3).alignment = (TextAlignmentOptions)514;
			SetTextProperties(val3, ConfigManager.loadTextString.Value);
			AdjustTextContainerAnchors(((TMP_Text)val3).rectTransform);
			((Transform)val).SetAsLastSibling();
			ToggleLoadText();
			StartTextUpdates();
		}

		public void StartTextUpdates()
		{
			if (ShouldStartUpdates())
			{
				float value = ConfigManager.slideshowDelay.Value;
				DelayHelper.StartRepeatingAction("textUpdates", value, UpdateLoadingText);
			}
		}

		private bool ShouldStartUpdates()
		{
			if (!(from s in ConfigManager.slideshowSections.Value.Split(new char[1] { ',' })
				select s.Trim().ToLower()).Contains("loadtext") || !ConfigManager.enableLoadingTextChange.Value)
			{
				return false;
			}
			return true;
		}

		private TextMeshProUGUI GetTextComponent()
		{
			RectTransform val = FindLoadingTextContainer();
			if ((Object)(object)val == (Object)null)
			{
				return null;
			}
			Transform val2 = ((Transform)val).Find("LoadMessage");
			if ((Object)(object)val2 == (Object)null)
			{
				LogWarden.LogError("[LoadText] 'LoadMessage' GameObject not found.");
				return null;
			}
			TextMeshProUGUI component = ((Component)val2).GetComponent<TextMeshProUGUI>();
			if ((Object)(object)component == (Object)null)
			{
				LogWarden.LogError("[LoadText] TextMeshProUGUI component not found on 'LoadMessage'.");
				return null;
			}
			return component;
		}

		public void UpdateLoadingText()
		{
			TextMeshProUGUI textComponent = GetTextComponent();
			if (!((Object)(object)textComponent == (Object)null) && ConfigManager.enableLoadingTextChange.Value)
			{
				string randomLoadingText = GetRandomLoadingText(ConfigManager.loadTextString.Value);
				if (ConfigManager.enableTypedLoadText.Value)
				{
					DelayHelper.StartTypingText(textComponent, randomLoadingText, 0.05f, 0.5f);
				}
				else
				{
					((TMP_Text)textComponent).text = randomLoadingText;
				}
				LogWarden.LogInfo("[LoadText] Updated loading text to: " + randomLoadingText);
			}
		}

		private RectTransform FindLoadingTextContainer()
		{
			Transform val = PathFinder.Probe("Canvas/MenuContainer/LoadingScreen/LoadingTextContainer");
			if ((Object)(object)val == (Object)null)
			{
				LogWarden.LogError("[LoadText] Loading text container not found at path: Canvas/MenuContainer/LoadingScreen/LoadingTextContainer");
				return null;
			}
			RectTransform component = ((Component)val).GetComponent<RectTransform>();
			EnsureFullScreenContainer(component);
			return component;
		}

		private void EnsureFullScreenContainer(RectTransform container)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			container.anchorMin = Vector2.zero;
			container.anchorMax = Vector2.one;
			container.offsetMin = Vector2.zero;
			container.offsetMax = Vector2.zero;
		}

		private string GetRandomLoadingText(string allTexts)
		{
			if (textOptions == null || textOptions.Length == 0)
			{
				textOptions = allTexts.Split(new char[1] { '|' });
			}
			if (textOptions.Length == 1)
			{
				return textOptions[0];
			}
			int num;
			do
			{
				num = Random.Range(0, textOptions.Length);
			}
			while (num == lastIndex && textOptions.Length > 1);
			lastIndex = num;
			return textOptions[num];
		}

		public void UpdateTextProperties()
		{
			TextMeshProUGUI textComponent = GetTextComponent();
			if ((Object)(object)textComponent == (Object)null)
			{
				LogWarden.LogError("[LoadText] Text component not found.");
			}
			else
			{
				SetTextProperties(textComponent, ConfigManager.loadTextString.Value);
			}
		}

		private void UpdateTextOptions()
		{
			string value = ConfigManager.loadTextString.Value;
			textOptions = value.Split(new char[1] { '|' });
			LogWarden.LogInfo("[LoadText] Text options updated.");
		}

		private void SetTextProperties(TextMeshProUGUI textComponent, string text)
		{
			if ((Object)(object)textComponent != (Object)null)
			{
				string arg = (((TMP_Text)textComponent).text = GetRandomLoadingText(text));
				((TMP_Text)textComponent).enableWordWrapping = false;
				((TMP_Text)textComponent).fontSize = ConfigManager.loadTextSize.Value;
				SetTextColor(textComponent);
				AdjustTextContainerAnchors(((TMP_Text)textComponent).rectTransform);
				LogWarden.LogInfo($"[LoadText] Text properties updated: Text set to '{arg}' with size {ConfigManager.loadTextSize.Value} and color.");
			}
		}

		private void SetTextColor(TextMeshProUGUI textComponent)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Color val2 = (((Graphic)textComponent).color = ColorParser.RGBA(ConfigManager.loadTextColor.Value));
				LogWarden.LogInfo($"[LoadText] Font color set to: {val2}");
				Color val3 = Color.Lerp(Color.black, val2, 0.3f);
				((TMP_Text)textComponent).outlineColor = Color32.op_Implicit(val3);
				((TMP_Text)textComponent).outlineWidth = 1f;
				((TMP_Text)textComponent).enableVertexGradient = false;
				((TMP_Text)textComponent).ForceMeshUpdate(false, false);
				LogWarden.LogInfo($"[LoadText] Outline color set to: {val3}");
			}
			catch (Exception ex)
			{
				LogWarden.LogError("[LoadText] Error setting font color using ColorParser: " + ex.Message);
			}
		}

		private void AdjustTextContainerAnchors(RectTransform rectTransform)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			float value = ConfigManager.loadTextYOffset.Value;
			float num = Mathf.Lerp(-44f, 144f, value / 100f);
			float num2 = 1f - num / 100f;
			rectTransform.pivot = new Vector2(0.5f, 0.5f);
			rectTransform.anchorMin = new Vector2(0.5f, num2);
			rectTransform.anchorMax = new Vector2(0.5f, num2);
			rectTransform.anchoredPosition = new Vector2(0f, 0f);
		}
	}
	public static class UI
	{
		public const string MenuCont = "Canvas/MenuContainer";

		public const string MainBtns = "Canvas/MenuContainer/MainButtons";

		public const string MainImg = "Canvas/MenuContainer/MainButtons/HeaderImage";

		public const string MainHeader = "Canvas/MenuContainer/MainButtons/MainHeader";

		public const string CustBgImg = "Canvas/MenuContainer/MainButtons/Background";

		public const string LoadScreen = "Canvas/MenuContainer/LoadingScreen";

		public const string LoadImg = "Canvas/MenuContainer/LoadingScreen/Image";

		public const string LoadHeader = "Canvas/MenuContainer/LoadingScreen/LoadHeader";

		public const string LoadTextCont = "Canvas/MenuContainer/LoadingScreen/LoadingTextContainer";

		public const string LoadText = "Canvas/MenuContainer/LoadingScreen/LoadingTextContainer/LoadingText";
	}
}
namespace Emblem.Managers
{
	public class InterfaceDecorator
	{
		private readonly UIComponent uiComponent;

		private readonly BackgroundManager backgroundManager;

		private readonly HeaderReplacement headerReplacement;

		private readonly Boardwalk boardwalk;

		private readonly LoadingText loadingText;

		private readonly MenuMoodSetter menuMoodSetter;

		private readonly VersionStyler versionStyler;

		private readonly Slideshow slideshow;

		public InterfaceDecorator(UIComponent uiComponent, BackgroundManager backgroundManager, HeaderReplacement headerReplacement, Boardwalk boardwalk, LoadingText loadingText, MenuMoodSetter menuMoodSetter, VersionStyler versionStyler, Slideshow slideshow)
		{
			this.uiComponent = uiComponent;
			this.backgroundManager = backgroundManager;
			this.headerReplacement = headerReplacement;
			this.boardwalk = boardwalk;
			this.loadingText = loadingText;
			this.menuMoodSetter = menuMoodSetter;
			this.versionStyler = versionStyler;
			this.slideshow = slideshow;
		}

		public void ApplyInitCustomizations()
		{
			uiComponent.SetVolumeLayerMaskOnAllCameras(-1);
			uiComponent.ToggleCRTEffect();
		}

		public void ApplyMainMenuCustomizations()
		{
			uiComponent.SetVolumeLayerMaskOnAllCameras(-1);
			headerReplacement.InitializeAndReplaceHeaders();
			backgroundManager.ApplyMainMenuBackground();
			uiComponent.SetMainBackgroundColor();
			uiComponent.ResetRectTransformProperties();
			uiComponent.ToggleCRTEffect();
			uiComponent.ToggleScanlines();
			uiComponent.CreateBackgrounds();
			menuMoodSetter.HarmonizeMenuHues("Canvas/MenuContainer/MainButtons");
			boardwalk.ToggleBorder();
			versionStyler.InitializeVersionStyling();
			loadingText.ApplyLoadingCustomizations();
			backgroundManager.ApplyLoadingBackground();
			DelayHelper.StartDelayedAction(0.3f, delegate
			{
				menuMoodSetter.HarmonizeMenuHues("Canvas/MenuContainer/MainButtons");
			});
		}
	}
	public class SceneManagerHelper
	{
		private readonly InterfaceDecorator interfaceDecorator;

		public SceneManagerHelper(InterfaceDecorator interfaceDecorator)
		{
			this.interfaceDecorator = interfaceDecorator;
			SceneManager.sceneLoaded += OnSceneLoaded;
		}

		private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			DelayHelper.StopAll();
			HotLoad.Instance?.OnDestroy();
			if (((Scene)(ref scene)).name == "InitSceneLaunchOptions" || ((Scene)(ref scene)).name == "InitScene" || ((Scene)(ref scene)).name == "InitSceneLANMode")
			{
				LogWarden.LogInfo("[SceneManager] Applying customizations to Init.");
				interfaceDecorator.ApplyInitCustomizations();
			}
			if (((Scene)(ref scene)).name == "MainMenu")
			{
				MainThreadDispatcher.EnsureInstance();
				LogWarden.LogInfo("[SceneManager] Applying customizations to MainMenu.");
				interfaceDecorator.ApplyMainMenuCustomizations();
				HotLoad.Initialize();
			}
		}

		public void Unsubscribe()
		{
			SceneManager.sceneLoaded -= OnSceneLoaded;
		}
	}
}
namespace Emblem.Components
{
	public class BackgroundManager
	{
		private readonly ImageFilters imageFilters;

		private Configurator ConfigManager => Configurator.Instance;

		private CustomMediaManager MediaManager => CustomMediaManager.Instance;

		public BackgroundManager()
		{
			imageFilters = new ImageFilters(ConfigManager);
			ConfigManager.enableMainBackground.SettingChanged += delegate
			{
				ToggleBackground("main");
			};
			ConfigManager.enableLoadBackground.SettingChanged += delegate
			{
				ToggleBackground("load");
			};
			ConfigManager.mainBackgroundPath.SettingChanged += delegate
			{
				RefreshBackgroundPath("main");
			};
			ConfigManager.loadBackgroundPath.SettingChanged += delegate
			{
				RefreshBackgroundPath("load");
			};
			ConfigManager.mainBackgroundColor.SettingChanged += delegate
			{
				ApplyMainMenuBackground();
			};
			ConfigManager.loadBackgroundColor.SettingChanged += delegate
			{
				ApplyLoadingBackground();
			};
			ConfigManager.enableSlideshow.SettingChanged += delegate
			{
				ToggleBackgroundSlideshow();
			};
			ConfigManager.slideshowSections.SettingChanged += delegate
			{
				ToggleBackgroundSlideshow();
			};
			ConfigManager.slideshowDelay.SettingChanged += delegate
			{
				ToggleBackgroundSlideshow();
			};
			ConfigManager.slideTransTime.SettingChanged += delegate
			{
				ToggleBackgroundSlideshow();
			};
		}

		private void ToggleBackground(string type)
		{
			if (!(type == "main"))
			{
				if (type == "load")
				{
					bool value = ConfigManager.enableLoadBackground.Value;
					DestroyBackground("LoadingScreen/LoadBackground");
					if (value)
					{
						ApplyLoadingBackground();
					}
				}
			}
			else
			{
				bool value2 = ConfigManager.enableMainBackground.Value;
				DestroyBackground("MenuContainer/MainBackground");
				if (value2)
				{
					ApplyMainMenuBackground();
				}
			}
		}

		private void DestroyBackground(string path)
		{
			GameObject val = GameObject.Find(path);
			if ((Object)(object)val != (Object)null)
			{
				Object.Destroy((Object)(object)val);
			}
		}

		private void RefreshBackgroundPath(string type)
		{
			if (!(type == "main"))
			{
				if (type == "load" && ConfigManager.enableLoadBackground.Value)
				{
					ApplyLoadingBackground();
				}
			}
			else if (ConfigManager.enableMainBackground.Value)
			{
				ApplyMainMenuBackground();
			}
		}

		public void ApplyMainMenuBackground()
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			ApplyBackground(ConfigManager.enableMainBackground.Value, ConfigManager.mainBackgroundPath.Value, ColorParser.RGB(ConfigManager.mainBackgroundColor.Value), "MenuContainer", "MainBackground");
			StartBackgroundSlideshow("main");
		}

		public void ApplyLoadingBackground()
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			ApplyBackground(ConfigManager.enableLoadBackground.Value, ConfigManager.loadBackgroundPath.Value, ColorParser.RGB(ConfigManager.loadBackgroundColor.Value), "LoadingScreen", "LoadBackground");
			StartBackgroundSlideshow("load");
		}

		private void ApplyBackground(bool isEnabled, string backgroundPath, Color backgroundColor, string parentObjectName, string backgroundObjectName)
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			if (isEnabled && !string.IsNullOrEmpty(backgroundPath))
			{
				Transform obj = PathFinder.Probe(parentObjectName);
				GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
				if ((Object)(object)val == (Object)null)
				{
					LogWarden.LogError("[Background] " + parentObjectName + " not found in the scene.");
				}
				else if (backgroundPath.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase))
				{
					HandleVideoBackground(val, backgroundPath, backgroundObjectName);
				}
				else
				{
					HandleImageBackground(val, backgroundPath, backgroundObjectName, backgroundColor);
				}
			}
		}

		private void HandleVideoBackground(GameObject parentObject, string backgroundPath, string videoObjectName)
		{
			string text = MediaManager.LoadCustomVideoPath(backgroundPath);
			if (text != null)
			{
				(parentObject.GetComponent<BackgroundVideoManager>() ?? parentObject.AddComponent<BackgroundVideoManager>()).InitializeVideo(parentObject, text, videoObjectName);
			}
		}

		public void HandleImageBackground(GameObject parentObject, string backgroundPath, string backgroundObjectName, Color backgroundColor)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			Sprite customSprite = MediaManager.LoadCustomImage(backgroundPath, backgroundObjectName);
			GameObject val = CreateBackgroundImage(parentObject.transform, customSprite, backgroundObjectName);
			imageFilters.Blend(((Object)val).name, backgroundColor);
			if (ConfigManager.enableSlideshow.Value)
			{
				float value = ConfigManager.slideTransTime.Value;
				if (val.GetComponent<DelayHelper>() == null)
				{
					val.AddComponent<DelayHelper>();
				}
				new Slideshow(val.transform).StartFade(value);
			}
		}

		private GameObject CreateBackgroundImage(Transform parentTransform, Sprite customSprite, string objectName)
		{
			if ((Object)(object)customSprite == (Object)null)
			{
				LogWarden.LogError("[Background] No custom sprite provided for background image creation.");
				return null;
			}
			GameObject orCreateBackgroundObject = GetOrCreateBackgroundObject(parentTransform, objectName);
			Image val = SetImageComponent(orCreateBackgroundObject, customSprite);
			AdjustImageToFit(parentTransform, ((Component)val).GetComponent<RectTransform>(), customSprite);
			return orCreateBackgroundObject;
		}

		private GameObject GetOrCreateBackgroundObject(Transform parentTransform, string objectName)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			Transform val = parentTransform.Find(objectName);
			GameObject val2;
			if ((Object)(object)val != (Object)null)
			{
				val2 = ((Component)val).gameObject;
				val2.transform.SetAsFirstSibling();
			}
			else
			{
				val2 = new GameObject(objectName);
				val2.transform.SetParent(parentTransform, false);
				val2.transform.SetAsFirstSibling();
			}
			return val2;
		}

		private Image SetImageComponent(GameObject backgroundImageObject, Sprite customSprite)
		{
			Image val = backgroundImageObject.GetComponent<Image>();
			if ((Object)(object)val == (Object)null)
			{
				val = backgroundImageObject.AddComponent<Image>();
			}
			val.sprite = customSprite;
			val.preserveAspect = true;
			return val;
		}

		private void AdjustImageToFit(Transform parentTransform, RectTransform rectTransform, Sprite customSprite)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			rectTransform.anchorMin = new Vector2(0.5f, 0f);
			rectTransform.anchorMax = new Vector2(0.5f, 1f);
			rectTransform.pivot = new Vector2(0.5f, 0.5f);
			Rect rect = ((Component)parentTransform).GetComponent<RectTransform>().rect;
			float height = ((Rect)(ref rect)).height;
			Bounds bounds = customSprite.bounds;
			float num = ((Bounds)(ref bounds)).size.y * customSprite.pixelsPerUnit;
			float num2 = height / num;
			bounds = customSprite.bounds;
			rectTransform.sizeDelta = new Vector2(((Bounds)(ref bounds)).size.x * customSprite.pixelsPerUnit * num2, 0f);
		}

		public void ToggleBackgroundSlideshow()
		{
			if (ConfigManager.enableSlideshow.Value)
			{
				StartBackgroundSlideshow("main");
				StartBackgroundSlideshow("load");
			}
			else
			{
				DelayHelper.StopRepeatingAction("background");
				DelayHelper.StopRepeatingAction("loadbackground");
			}
		}

		public void StartBackgroundSlideshow(string type)
		{
			if (!ConfigManager.enableSlideshow.Value)
			{
				return;
			}
			string[] array = ConfigManager.slideshowSections.Value.Split(new char[1] { ',' });
			float value = ConfigManager.slideshowDelay.Value;
			string[] array2 = array;
			for (int i = 0; i < array2.Length; i++)
			{
				string text = array2[i].Trim().ToLower();
				if (type == "main" && text == "background")
				{
					DelayHelper.StartRepeatingAction("background", value, delegate
					{
						ApplyMainMenuBackground();
					});
				}
				else if (type == "load" && text == "loadbackground")
				{
					DelayHelper.StartRepeatingAction("loadbackground", value, delegate
					{
						ApplyLoadingBackground();
					});
				}
			}
		}
	}
	public class BackgroundVideoManager : MonoBehaviour
	{
		private VideoPlayer videoPlayer;

		public string VideoPath { get; set; }

		public void InitializeVideo(GameObject targetGameObject, string videoPath, string videoObjectName)
		{
			VideoPath = videoPath;
			if ((Object)(object)targetGameObject == (Object)null)
			{
				LogWarden.LogError("[Video] Target GameObject not found in the scene.");
			}
			else
			{
				CreateBackgroundVideo(targetGameObject, videoObjectName);
			}
		}

		private void CreateBackgroundVideo(GameObject targetGameObject, string backgroundObjectName)
		{
			if (!string.IsNullOrEmpty(VideoPath))
			{
				string text = (VideoPath.StartsWith("file://", StringComparison.OrdinalIgnoreCase) ? VideoPath : ("file://" + VideoPath));
				string text2 = text.Replace(Paths.BepInExRootPath, "");
				text2 = text2.TrimStart(new char[1] { Path.DirectorySeparatorChar });
				LogWarden.LogInfo("[Video] Initializing video with relative path: " + text2);
				GameObject orCreateBackgroundObject = GetOrCreateBackgroundObject(targetGameObject.transform, backgroundObjectName);
				RawImage rawImage = orCreateBackgroundObject.GetComponent<RawImage>() ?? orCreateBackgroundObject.AddComponent<RawImage>();
				videoPlayer = orCreateBackgroundObject.GetComponent<VideoPlayer>() ?? orCreateBackgroundObject.AddComponent<VideoPlayer>();
				AudioSource audioSource = orCreateBackgroundObject.GetComponent<AudioSource>() ?? orCreateBackgroundObject.AddComponent<AudioSource>();
				ConfigureVideoPlayer(text, audioSource, rawImage);
				AdjustRawImage(rawImage);
				LogWarden.LogInfo("[Video] Background video added to the scene.");
			}
		}

		private GameObject GetOrCreateBackgroundObject(Transform parentTransform, string objectName)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			Transform val = parentTransform.Find(objectName);
			GameObject val2;
			if ((Object)(object)val != (Object)null)
			{
				val2 = ((Component)val).gameObject;
				val2.transform.SetAsFirstSibling();
			}
			else
			{
				val2 = new GameObject(objectName);
				val2.transform.SetParent(parentTransform, false);
				val2.transform.SetAsFirstSibling();
			}
			return val2;
		}

		private void ConfigureVideoPlayer(string fullPath, AudioSource audioSource, RawImage rawImage)
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Expected O, but got Unknown
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Expected O, but got Unknown
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Expected O, but got Unknown
			videoPlayer.playOnAwake = true;
			videoPlayer.isLooping = true;
			videoPlayer.renderMode = (VideoRenderMode)2;
			videoPlayer.audioOutputMode = (VideoAudioOutputMode)1;
			videoPlayer.SetTargetAudioSource((ushort)0, audioSource);
			videoPlayer.source = (VideoSource)1;
			videoPlayer.url = fullPath;
			videoPlayer.aspectRatio = (VideoAspectRatio)1;
			RenderTexture val = new RenderTexture(1920, 1080, 0);
			videoPlayer.targetTexture = val;
			rawImage.texture = (Texture)(object)val;
			videoPlayer.errorReceived += new ErrorEventHandler(OnVideoErrorReceived);
			videoPlayer.prepareCompleted += new EventHandler(OnVideoPrepared);
			videoPlayer.Prepare();
		}

		private void AdjustRawImage(RawImage rawImage)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			RectTransform component = ((Component)rawImage).GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0f);
			component.anchorMax = new Vector2(1f, 1f);
			component.pivot = new Vector2(0.5f, 0.5f);
			component.offsetMin = Vector2.zero;
			component.offsetMax = Vector2.zero;
		}

		private void OnVideoErrorReceived(VideoPlayer source, string message)
		{
			LogWarden.LogError("Video Error: " + message);
		}

		private void OnVideoPrepared(VideoPlayer source)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			source.prepareCompleted -= new EventHandler(OnVideoPrepared);
			LogWarden.LogInfo("[Video] Prepared and ready to play.");
			source.Play();
		}
	}
	public class Boardwalk
	{
		private RectTransform cloneRectTransform;

		private Image originalImage;

		private Image cloneImage;

		private Configurator ConfigManager => Configurator.Instance;

		public Boardwalk()
		{
			ConfigManager.enableReplaceBorder.SettingChanged += delegate
			{
				ToggleBorderVisibility();
			};
			ConfigManager.borderPadding.SettingChanged += delegate
			{
				SetBorderPadding();
			};
			ConfigManager.borderColor.SettingChanged += delegate
			{
				SetBorderColor();
			};
		}

		public void ToggleBorder()
		{
			foreach (string item in new List<string> { "MainButtons", "LobbyHostSettings", "DeleteFileConfirmation", "NewsPanel", "MenuNotification", "LANWarning", "LobbyList", "CreditsPanel" })
			{
				Transform val = PathFinder.Probe(item);
				if ((Object)(object)val != (Object)null)
				{
					HideOriginalBorder(val);
					if (item == "MainButtons" && !ConfigManager.enableReplaceBorder.Value)
					{
						CreateBorderCopy(val);
					}
				}
				else
				{
					LogWarden.LogWarning("[Border] " + item + " not found.");
				}
			}
		}

		private void ToggleBorderVisibility()
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)cloneRectTransform == (Object)null || (Object)(object)cloneImage == (Object)null)
			{
				ToggleBorder();
			}
			if ((Object)(object)originalImage != (Object)null)
			{
				((Graphic)originalImage).color = new Color(((Graphic)originalImage).color.r, ((Graphic)originalImage).color.g, ((Graphic)originalImage).color.b, ConfigManager.enableReplaceBorder.Value ? 1f : 0f);
				LogWarden.LogInfo("[Border] Border visibility has been toggled");
			}
			if ((Object)(object)cloneRectTransform != (Object)null && (Object)(object)cloneImage != (Object)null)
			{
				((Graphic)cloneImage).color = new Color(((Graphic)cloneImage).color.r, ((Graphic)cloneImage).color.g, ((Graphic)cloneImage).color.b, ConfigManager.enableReplaceBorder.Value ? 0f : 1f);
			}
		}

		private void HideOriginalBorder(Transform borderTransform)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			Image component = ((Component)borderTransform).GetComponent<Image>();
			if ((Object)(object)component != (Object)null)
			{
				((Graphic)component).color = new Color(((Graphic)component).color.r, ((Graphic)component).color.g, ((Graphic)component).color.b, 0f);
			}
			else
			{
				LogWarden.LogWarning("[Border] No Image component found on " + ((Object)borderTransform).name);
			}
		}

		private void CreateBorderCopy(Transform borderTransform)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Expected O, but got Unknown
			GameObject gameObject = ((Component)borderTransform).gameObject;
			Image component = gameObject.GetComponent<Image>();
			if ((Object)(object)component == (Object)null)
			{
				LogWarden.LogWarning("[Border] No Image component found on " + ((Object)borderTransform).name + ". Cannot clone.");
			}
			else if ((Object)(object)cloneRectTransform == (Object)null)
			{
				GameObject val = new GameObject("Corners");
				val.transform.SetParent(gameObject.transform.parent);
				val.transform.SetSiblingIndex(3);
				cloneRectTransform = val.AddComponent<RectTransform>();
				CopyRectTransformSettings(((Graphic)component).rectTransform, cloneRectTransform);
				float value = ConfigManager.borderPadding.Value;
				SetBorderPadding();
				cloneImage = val.AddComponent<Image>();
				SetImageProperties(cloneImage, component);
				SetBorderColor();
				LogWarden.LogInfo("[Border] Updated with padding " + value + " and color set to " + ConfigManager.borderColor.Value);
			}
		}

		private void CopyRectTransformSettings(RectTransform original, RectTransform clone)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			((Transform)clone).localPosition = ((Transform)original).localPosition;
			((Transform)clone).localRotation = ((Transform)original).localRotation;
			((Transform)clone).localScale = ((Transform)original).localScale;
			clone.anchorMin = original.anchorMin;
			clone.anchorMax = original.anchorMax;
			clone.anchoredPosition = original.anchoredPosition;
			clone.sizeDelta = original.sizeDelta;
			clone.pivot = original.pivot;
		}

		private void SetBorderPadding()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			float value = ConfigManager.borderPadding.Value;
			cloneRectTransform.offsetMax = new Vector2(0f - value, 0f - value);
			cloneRectTransform.offsetMin = new Vector2(value, value);
			LogWarden.LogInfo("[Border] Padding set to " + value);
		}

		private void SetBorderColor()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			string value = ConfigManager.borderColor.Value;
			((Graphic)cloneImage).color = ColorParser.RGBA(value);
			LogWarden.LogInfo("[Border] Color set to " + value);
		}

		private void SetImageProperties(Image cloneImage, Image originalImage)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			cloneImage.sprite = originalImage.sprite;
			cloneImage.type = originalImage.type;
			cloneImage.fillCenter = originalImage.fillCenter;
			cloneImage.pixelsPerUnitMultiplier = originalImage.pixelsPerUnitMultiplier;
			((Graphic)cloneImage).raycastTarget = false;
		}
	}
	public class MenuMoodSetter
	{
		private static readonly HashSet<string> loggedMessages = new HashSet<string>();

		private Configurator ConfigManager => Configurator.Instance;

		public MenuMoodSetter()
		{
			ConfigManager.enableMenuColorChange.SettingChanged += delegate
			{
				ToggleMenuHues();
			};
			ConfigManager.menuFontColor.SettingChanged += delegate
			{
				HarmonizeMenuHues("MainButtons");
			};
			ConfigManager.menuRolloverFontColor.SettingChanged += delegate
			{
				HarmonizeMenuHues("MainButtons");
			};
			ConfigManager.menuRolloverBGColor.SettingChanged += delegate
			{
				HarmonizeMenuHues("MainButtons");
			};
		}

		private void ToggleMenuHues()
		{
			if (!ConfigManager.enableMenuColorChange.Value)
			{
				RemoveAllColorCustomizations("Canvas/MenuContainer/MainButtons");
				LogWarden.LogInfo("[MoodSetter] Menu color change is disabled. All color tags removed.");
			}
			else
			{
				HarmonizeMenuHues("Canvas/MenuContainer/MainButtons");
			}
		}

		private void RemoveAllColorCustomizations(string gameObject)
		{
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			Transform val = PathFinder.Probe(gameObject);
			if ((Object)(object)val == (Object)null)
			{
				LogWarden.LogError("[MoodSetter] " + gameObject + " object not found. Cannot remove customizations.");
				return;
			}
			TMP_Text[] componentsInChildren = ((Component)val).GetComponentsInChildren<TMP_Text>();
			foreach (TMP_Text val2 in componentsInChildren)
			{
				val2.text = RemoveColorTags(val2.text);
			}
			Button[] componentsInChildren2 = ((Component)val).GetComponentsInChildren<Button>();
			for (int i = 0; i < componentsInChildren2.Length; i++)
			{
				Image component = ((Component)componentsInChildren2[i]).GetComponent<Image>();
				if ((Object)(object)component != (Object)null)
				{
					((Graphic)component).color = Color.white;
				}
			}
			LogWarden.LogInfo("[MoodSetter] All color customizations have been removed from " + gameObject);
		}

		public void HarmonizeMenuHues(string gameObject)
		{
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			if (!ConfigManager.enableMenuColorChange.Value)
			{
				LogWarden.LogInfo("[MoodSetter] Menu color change is disabled.");
				return;
			}
			LogOnce("[MoodSetter] Harmonizing menu hues...");
			Transform val = PathFinder.Probe(gameObject);
			if ((Object)(object)val == (Object)null)
			{
				LogWarden.LogError("[MoodSetter] " + gameObject + " object not found.");
				return;
			}
			LogOnce("[MoodSetter] " + gameObject + " object found. Processing children...");
			LogOnce("[MoodSetter] Painting menu font color: " + ConfigManager.menuFontColor.Value);
			LogOnce("[MoodSetter] Painting menu rollover font color: " + ConfigManager.menuRolloverFontColor.Value);
			LogOnce("[MoodSetter] Painting menu rollover background: " + ConfigManager.menuRolloverBGColor.Value);
			foreach (Transform item in val)
			{
				Transform val2 = item;
				if (!((Object)(object)((Component)val2).GetComponent<Button>() == (Object)null))
				{
					DisableAnimator(val2);
					SetupEventTriggers(val2);
					SetTextColor(val2, ConfigManager.menuFontColor.Value);
				}
			}
		}

		private void LogOnce(string message)
		{
			if (!loggedMessages.Contains(message))
			{
				LogWarden.LogInfo(message);
				loggedMessages.Add(message);
			}
		}

		private void DisableAnimator(Transform buttonTransform)
		{
			Animator component = ((Component)buttonTransform).GetComponent<Animator>();
			if ((Object)(object)component != (Object)null)
			{
				((Behaviour)component).enabled = false;
			}
		}

		private void SetupEventTriggers(Transform buttonTransform)
		{
			EventTrigger orAddComponent = GetOrAddComponent<EventTrigger>(((Component)buttonTransform).gameObject);
			AddEventTrigger(orAddComponent, (EventTriggerType)0, delegate
			{
				OnMouseEnter(buttonTransform);
			});
			AddEventTrigger(orAddComponent, (EventTriggerType)1, delegate
			{
				OnMouseExit(buttonTransform);
			});
			AddEventTrigger(orAddComponent, (EventTriggerType)4, delegate
			{
				ResetButtonState(buttonTransform);
			});
		}

		private void OnMouseEnter(Transform buttonTransform)
		{
			if (ConfigManager.enableMenuColorChange.Value)
			{
				SetTextColor(buttonTransform, ConfigManager.menuRolloverFontColor.Value);
				SetSelectionHighlight(buttonTransform, enabled: true, ConfigManager.menuRolloverBGColor.Value);
			}
			else
			{
				SetTextColor(buttonTransform, "0,0,0,1");
				SetSelectionHighlight(buttonTransform, enabled: true, "230,100,65,1");
			}
		}

		private void OnMouseExit(Transform buttonTransform)
		{
			if (ConfigManager.enableMenuColorChange.Value)
			{
				SetTextColor(buttonTransform, ConfigManager.menuFontColor.Value);
				SetSelectionHighlight(buttonTransform, enabled: false, "");
			}
			else
			{
				SetTextColor(buttonTransform, "230,100,65,1");
				SetSelectionHighlight(buttonTransform, enabled: false, "");
			}
		}

		private void ResetButtonState(Transform buttonTransform)
		{
			if (ConfigManager.enableMenuColorChange.Value)
			{
				SetTextColor(buttonTransform, ConfigManager.menuFontColor.Value);
				SetSelectionHighlight(buttonTransform, enabled: false, "");
			}
			else
			{
				SetTextColor(buttonTransform, "230,100,65,1");
				SetSelectionHighlight(buttonTransform, enabled: false, "");
			}
		}

		private void SetTextColor(Transform buttonTransform, string colorString)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			TMP_Text componentInChildren = ((Component)buttonTransform).GetComponentInChildren<TMP_Text>();
			if (!((Object)(object)componentInChildren == (Object)null))
			{
				string text = RemoveColorTags(componentInChildren.text);
				Color val = ColorParser.RGBA(colorString);
				string text2 = ColorUtility.ToHtmlStringRGB(new Color(val.r, val.g, val.b));
				componentInChildren.text = "<color=#" + text2 + ">" + text + "</color>";
				componentInChildren.alpha = val.a;
			}
		}

		private string RemoveColorTags(string text)
		{
			return Regex.Replace(text, "<color=#[0-9A-Fa-f]{6,8}>(.*?)</color>", "$1");
		}

		private void SetSelectionHighlight(Transform buttonTransform, bool enabled, string colorString)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			Transform val = buttonTransform.Find("SelectionHighlight");
			Image val2 = default(Image);
			if (!((Object)(object)val == (Object)null) && ((Component)val).TryGetComponent<Image>(ref val2))
			{
				((Behaviour)val2).enabled = enabled;
				if (enabled)
				{
					Color color = ColorParser.RGBA(colorString);
					((Graphic)val2).color = color;
				}
			}
		}

		private T GetOrAddComponent<T>(GameObject obj) where T : Component
		{
			return obj.GetComponent<T>() ?? obj.AddComponent<T>();
		}

		private void AddEventTrigger(EventTrigger trigger, EventTriggerType type, UnityAction<BaseEventData> action)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			Entry val = new Entry
			{
				eventID = type
			};
			((UnityEvent<BaseEventData>)(object)val.callback).AddListener(action);
			trigger.triggers.Add(val);
		}
	}
	public class Slideshow
	{
		private readonly Transform parentTransform;

		private Configurator ConfigManager => Configurator.Instance;

		public Slideshow(Transform parentTransform)
		{
			this.parentTransform = parentTransform;
		}

		public void StartFade(float duration)
		{
			if (!ConfigManager.enableSlideshow.Value)
			{
				return;
			}
			GameObject orCreateSlideObject = GetOrCreateSlideObject("FrameFlipper");
			Image slideImage = orCreateSlideObject.GetComponent<Image>();
			Image backgroundImage = ((Component)parentTransform).GetComponentInChildren<Image>();
			DelayHelper.StartFadeAction(slideImage, duration, delegate
			{
				//IL_002a: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)backgroundImage != (Object)null)
				{
					slideImage.sprite = backgroundImage.sprite;
					((Graphic)slideImage).color = Color.white;
				}
			});
		}

		private GameObject GetOrCreateSlideObject(string objectName)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			Transform val = parentTransform.Find(objectName);
			GameObject val2;
			if ((Object)(object)val != (Object)null)
			{
				val2 = ((Component)val).gameObject;
			}
			else
			{
				val2 = new GameObject(objectName);
				val2.transform.SetParent(parentTransform, false);
				Image val3 = val2.AddComponent<Image>();
				val3.preserveAspect = false;
				Image componentInChildren = ((Component)parentTransform).GetComponentInChildren<Image>();
				if ((Object)(object)componentInChildren != (Object)null && (Object)(object)componentInChildren.sprite != (Object)null)
				{
					val3.sprite = componentInChildren.sprite;
					((Graphic)val3).color = Color.white;
				}
				else
				{
					((Graphic)val3).color = Color.clear;
				}
				RectTransform component = val2.GetComponent<RectTransform>();
				component.anchorMin = new Vector2(0f, 0f);
				component.anchorMax = new Vector2(1f, 1f);
				component.sizeDelta = Vector2.zero;
				component.offsetMin = Vector2.zero;
				component.offsetMax = Vector2.zero;
			}
			val2.transform.SetAsFirstSibling();
			return val2;
		}
	}
	public class VersionStyler
	{
		private GameObject versionStyled;

		private Configurator ConfigManager => Configurator.Instance;

		public VersionStyler()
		{
			ConfigManager.enableCustomVersion.SettingChanged += delegate
			{
				ToggleVersionStyling();
			};
			ConfigManager.versionTextString.SettingChanged += delegate
			{
				ApplyVersionStyling(versionStyled.transform);
			};
			ConfigManager.versionColor.SettingChanged += delegate
			{
				ApplyVersionStyling(versionStyled.transform);
			};
			ConfigManager.versionFontSize.SettingChanged += delegate
			{
				ApplyVersionStyling(versionStyled.transform);
			};
			ConfigManager.versionYOffset.SettingChanged += delegate
			{
				ApplyVersionStyling(versionStyled.transform);
			};
			ConfigManager.versionAlign.SettingChanged += delegate
			{
				ApplyVersionStyling(versionStyled.transform);
			};
		}

		public void InitializeVersionStyling()
		{
			if (!((Object)(object)versionStyled != (Object)null))
			{
				Transform val = PathFinder.Probe("Canvas/MenuContainer/VersionNum");
				if ((Object)(object)val == (Object)null)
				{
					LogWarden.LogError("[Version] Original version number GameObject not found.");
					return;
				}
				versionStyled = Object.Instantiate<GameObject>(((Component)val).gameObject, val.parent);
				((Object)versionStyled).name = "VersionStyled";
				ApplyVersionStyling(versionStyled.transform);
				((Component)val).gameObject.SetActive(!ConfigManager.enableCustomVersion.Value);
				versionStyled.SetActive(ConfigManager.enableCustomVersion.Value);
			}
		}

		private void ToggleVersionStyling()
		{
			InitializeVersionStyling();
			bool value = ConfigManager.enableCustomVersion.Value;
			versionStyled.SetActive(value);
			((Component)PathFinder.Probe("Canvas/MenuContainer/VersionNum")).gameObject.SetActive(!value);
			string text = (value ? "enabled" : "disabled");
			LogWarden.LogInfo("[Version] Custom version styling is now " + text + ".");
		}

		private void ApplyVersionStyling(Transform versionTextTransform)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			Transform val = PathFinder.Probe("Canvas/MenuContainer/VersionNum");
			TextMeshProUGUI val2 = default(TextMeshProUGUI);
			if ((Object)(object)val == (Object)null || !((Component)val).TryGetComponent<TextMeshProUGUI>(ref val2))
			{
				LogWarden.LogError("[Version] Original TextMeshPro component not found on version number GameObject.");
				return;
			}
			TextMeshProUGUI val3 = default(TextMeshProUGUI);
			if (!((Component)versionTextTransform).TryGetComponent<TextMeshProUGUI>(ref val3))
			{
				LogWarden.LogError("[Version] TextMeshPro component not found on styled version GameObject.");
				return;
			}
			string value = ConfigManager.versionTextString.Value;
			string text = ((TMP_Text)val2).text;
			string text2 = value.Replace("%VERSION%", text);
			Color val4 = ColorParser.RGBA(ConfigManager.versionColor.Value);
			((TMP_Text)val3).text = "<color=#" + ColorUtility.ToHtmlStringRGB(val4) + ">" + text2 + "</color>";
			((TMP_Text)val3).alpha = val4.a;
			((TMP_Text)val3).fontSize = ConfigManager.versionFontSize.Value;
			((TMP_Text)val3).enableWordWrapping = false;
			AdjustTextAlignment(val3);
			float num = 1f - ConfigManager.versionYOffset.Value / 100f;
			RectTransform component = ((Component)val3).GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, num);
			component.anchorMax = new Vector2(1f, num);
			component.pivot = new Vector2(0.5f, 0.5f);
			component.sizeDelta = new Vector2(0f, component.sizeDelta.y);
			component.anchoredPosition = new Vector2(0f, 0f);
		}

		private void AdjustTextAlignment(TextMeshProUGUI versionText)
		{
			string value = ConfigManager.versionAlign.Value;
			switch (value)
			{
			case "Left":
				((TMP_Text)versionText).alignment = (TextAlignmentOptions)513;
				break;
			case "Center":
				((TMP_Text)versionText).alignment = (TextAlignmentOptions)514;
				break;
			case "Right":
				((TMP_Text)versionText).alignment = (TextAlignmentOptions)516;
				break;
			default:
				LogWarden.LogWarning("[Version] Invalid alignment option '" + value + "' specified. Defaulting to 'Center'.");
				((TMP_Text)versionText).alignment = (TextAlignmentOptions)514;
				break;
			}
		}
	}
	public class GlitchyLogo : MonoBehaviour
	{
		private RectTransform logoTransform;

		private Image logoImage;

		private Vector3 originalScale;

		private Vector3 originalPosition;

		private Quaternion originalRotation;

		private Color originalColor;

		private Vector2 originalSizeDelta;

		private Vector2 originalAnchorMin;

		private Vector2 originalAnchorMax;

		private Configurator ConfigManager => Configurator.Instance;

		private void Awake()
		{
			logoTransform = ((Component)this).GetComponent<RectTransform>();
			logoImage = ((Component)this).GetComponent<Image>();
			if ((Object)(object)logoTransform == (Object)null || (Object)(object)logoImage == (Object)null)
			{
				LogWarden.LogError("GlitchyLogo: Required components (RectTransform, Image) are missing from this GameObject.");
			}
			else
			{
				StoreOriginalProperties();
				LogWarden.LogInfo("GlitchyLogo: Components successfully initialized and properties stored.");
			}
			SceneManager.sceneLoaded += OnSceneLoaded;
			ConfigManager.mainHeaderAlpha.SettingChanged += OnSettingsChanged;
			ConfigManager.mainHeaderScale.SettingChanged += OnSettingsChanged;
			ConfigManager.mainHeaderYOffset.SettingChanged += OnSettingsChanged;
		}

		private void OnEnable()
		{
			StartGlitchEffect();
			LogWarden.LogInfo("GlitchyLogo: Glitch effect resumed due to GameObject being enabled.");
		}

		private void OnDestroy()
		{
			SceneManager.sceneLoaded -= OnSceneLoaded;
			ConfigManager.mainHeaderAlpha.SettingChanged -= OnSettingsChanged;
			ConfigManager.mainHeaderScale.SettingChanged -= OnSettingsChanged;
			ConfigManager.mainHeaderYOffset.SettingChanged -= OnSettingsChanged;
		}

		private void OnSettingsChanged(object sender, EventArgs e)
		{
			((MonoBehaviour)this).StopAllCoroutines();
			StoreOriginalProperties();
			StartGlitchEffect();
		}

		private void StoreOriginalProperties()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			originalScale = ((Transform)logoTransform).localScale;
			originalPosition = ((Transform)logoTransform).localPosition;
			originalRotation = ((Transform)logoTransform).localRotation;
			originalColor = ((Graphic)logoImage).color;
			originalSizeDelta = logoTransform.sizeDelta;
			originalAnchorMin = logoTransform.anchorMin;
			originalAnchorMax = logoTransform.anchorMax;
		}

		public void StartGlitchEffect()
		{
			((MonoBehaviour)this).StartCoroutine(GlitchCycle());
		}

		private IEnumerator GlitchCycle()
		{
			while (true)
			{
				yield return (object)new WaitForSeconds(Random.Range(0.5f, 5f));
				int numberOfWaves = Random.Range(2, 7);
				for (int wave = 0; wave < numberOfWaves; wave++)
				{
					int num = Random.Range(1, 7);
					List<IEnumerator> list = new List<IEnumerator>();
					for (int i = 0; i < num; i++)
					{
						list.Add(ApplyRandomEffect());
					}
					foreach (IEnumerator item in list)
					{
						((MonoBehaviour)this).StartCoroutine(item);
					}
					yield return (object)new WaitForSeconds(0.04f);
					RestoreOriginalProperties();
				}
			}
		}

		private IEnumerator ApplyRandomEffect()
		{
			switch (Random.Range(0, 9))
			{
			case 0:
				yield return ApplyPositionShiftEffect();
				break;
			case 1:
				yield return ApplyRotationEffect();
				break;
			case 2:
				yield return ApplyColorShiftEffect();
				break;
			case 3:
				yield return ApplyScaleJitterEffect();
				break;
			case 4:
				yield return ApplyOpacityFlickerEffect();
				break;
			case 5:
				yield return ApplyHueShiftEffect();
				break;
			case 6:
				yield return ApplyMirrorFlipEffect();
				break;
			case 7:
				yield return ApplyVerticalMirrorFlipEffect();
				break;
			case 8:
				yield return ApplyRectStretchEffect();
				break;
			}
		}

		private IEnumerator ApplyPositionShiftEffect()
		{
			RectTransform obj = logoTransform;
			((Transform)obj).localPosition = ((Transform)obj).localPosition + new Vector3((float)Random.Range(-25, 25), (float)Random.Range(-25, 25), 0f);
			yield return null;
		}

		private IEnumerator ApplyRotationEffect()
		{
			((Transform)logoTransform).localRotation = Quaternion.Euler(0f, 0f, (float)Random.Range(-1, 1));
			yield return null;
		}

		private IEnumerator ApplyColorShiftEffect()
		{
			((Graphic)logoImage).color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), originalColor.a);
			yield return null;
		}

		private IEnumerator ApplyScaleJitterEffect()
		{
			float num = Random.Range(0.6f, 1.4f);
			((Transform)logoTransform).localScale = new Vector3(originalScale.x * num, originalScale.y * num, originalScale.z);
			yield return null;
		}

		private IEnumerator ApplyOpacityFlickerEffect()
		{
			float num = Random.Range(0.3f, 1f);
			((Graphic)logoImage).color = new Color(originalColor.r, originalColor.g, originalColor.b, num);
			yield return null;
		}

		private IEnumerator ApplyHueShiftEffect()
		{
			float duration = 0.03f;
			float elapsed = 0.01f;
			while (elapsed < duration)
			{
				elapsed += Time.deltaTime;
				float num = Mathf.Lerp(0f, 1f, elapsed / duration);
				((Graphic)logoImage).color = Color.HSVToRGB(num, 1f, 1f);
				yield return null;
			}
		}

		private IEnumerator ApplyMirrorFlipEffect()
		{
			((Transform)logoTransform).localScale = new Vector3(0f - ((Transform)logoTransform).localScale.x, ((Transform)logoTransform).localScale.y, ((Transform)logoTransform).localScale.z);
			yield return null;
		}

		private IEnumerator ApplyVerticalMirrorFlipEffect()
		{
			((Transform)logoTransform).localScale = new Vector3(((Transform)logoTransform).localScale.x, 0f - ((Transform)logoTransform).localScale.y, ((Transform)logoTransform).localScale.z);
			yield return null;
		}

		private IEnumerator ApplyRectStretchEffect()
		{
			logoTransform.sizeDelta = new Vector2(originalSizeDelta.x * Random.Range(0.8f, 1.2f), originalSizeDelta.y * Random.Range(0.8f, 1.2f));
			yield return null;
		}

		public void StopGlitchEffect()
		{
			((MonoBehaviour)this).StopAllCoroutines();
			RestoreOriginalProperties();
			LogWarden.LogInfo("GlitchyLogo: Glitch effects stopped and properties restored.");
		}

		private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			if (((Scene)(ref scene)).name != "MainMenu")
			{
				StopGlitchEffect();
			}
		}

		private void RestoreOriginalProperties()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			((Transform)logoTransform).localScale = originalScale;
			((Transform)logoTransform).localPosition = originalPosition;
			((Transform)logoTransform).localRotation = originalRotation;
			((Graphic)logoImage).color = originalColor;
			logoTransform.sizeDelta = originalSizeDelta;
			logoTransform.anchorMin = originalAnchorMin;
			logoTransform.anchorMax = originalAnchorMax;
		}
	}
	public class CustomMediaManager
	{
		private static CustomMediaManager _instance;

		private static readonly object _lock = new object();

		private readonly EmblemFolder emblemFolder;

		private Dictionary<string, string> lastSelectedImages = new Dictionary<string, string>();

		public static CustomMediaManager Instance
		{
			get
			{
				if (_instance == null)
				{
					lock (_lock)
					{
						if (_instance == null)
						{
							_instance = new CustomMediaManager();
						}
					}
				}
				return _instance;
			}
		}

		public CustomMediaManager()
		{
			emblemFolder = new EmblemFolder();
		}

		public string LoadCustomVideoPath(string path)
		{
			string text = path;
			if (path.Contains("|"))
			{
				string[] array = path.Split(new char[1] { '|' });
				text = array[Ra