[O] legacy version support

This commit is contained in:
Clansty 2025-11-10 13:24:36 +08:00
parent c7ea71ca70
commit 3cfcab097b
No known key found for this signature in database
GPG Key ID: 3A6BE8BAF2EDE134
45 changed files with 152 additions and 13 deletions

View File

@ -35,7 +35,17 @@ public class Config : IConfig
foreach (var section in reflectionManager.SectionValues)
{
InitializeSection(section);
try
{
InitializeSection(section);
}
catch (Exception ex)
{
Utility.Log($"Failed to initialize config section {section.Path}");
#if DEBUG
Utility.Log(ex.ToString());
#endif
}
}
}

View File

@ -36,7 +36,10 @@
</ItemGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="mscorlib">
<HintPath>../Libs/mscorlib.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="0Harmony" />
<Reference Include="AMDaemon.NET" />
<Reference Include="Assembly-CSharp" />

View File

@ -0,0 +1,18 @@
using System.Collections.Generic;
namespace AquaMai.Core;
// Unity 2017 兼容
public static class Extensions
{
public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dic, TKey key, TValue defaultValue = default)
{
return dic.TryGetValue(key, out var value) ? value : defaultValue;
}
public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> kvp, out TKey key, out TValue value)
{
key = kvp.Key;
value = kvp.Value;
}
}

View File

@ -55,6 +55,17 @@ public class EnableConditionHelper
# endif
return true;
}
return ShouldSkipMethodOrClassByGameVersion(getCustomAttribute, type, displayName);
}
public static bool ShouldSkipClassByGameVersion(Type type)
{
return ShouldSkipMethodOrClassByGameVersion(type.GetCustomAttribute, type);
}
private static bool ShouldSkipMethodOrClassByGameVersion(Func<Type, object> getCustomAttribute, Type type, string methodName = "")
{
var displayName = type.FullName + (string.IsNullOrEmpty(methodName) ? "" : $".{methodName}");
var enableGameVersion = (EnableGameVersionAttribute)getCustomAttribute(typeof(EnableGameVersionAttribute));
if (enableGameVersion != null && !enableGameVersion.ShouldEnable(GameInfo.GameVersion))
{

View File

@ -18,7 +18,16 @@ public class MessageHelper
_genericManager = genericManager;
}
public static void ShowMessage(string message, WindowSizeID size = WindowSizeID.Middle, string title = null, Sprite sprite = null, bool retain = false)
public delegate void ShowMessageDelegate(string message, WindowSizeID size = WindowSizeID.Middle, string title = null, Sprite sprite = null, bool retain = false);
public static ShowMessageDelegate ShowMessage = GameInfo.GameVersion > 22000
? _ShowMessage
: (string message, WindowSizeID size = WindowSizeID.Middle, string title = null, Sprite sprite = null, bool retain = false) =>
{
MelonLogger.Warning($"[MessageHelper] ShowMessage is not supported in this game version. {title}: {message}");
};
private static void _ShowMessage(string message, WindowSizeID size = WindowSizeID.Middle, string title = null, Sprite sprite = null, bool retain = false)
{
if (_genericManager is null)
{

View File

@ -84,6 +84,11 @@ public class Startup
private static void CollectWantedPatches(List<Type> wantedPatches, Type type)
{
if (EnableConditionHelper.ShouldSkipClassByGameVersion(type))
{
return;
}
InvokeLifecycleMethod(type, ModLifecycleMethod.OnBeforeEnableCheck);
if (EnableConditionHelper.ShouldSkipClass(type))

View File

@ -37,7 +37,10 @@
</ItemGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="mscorlib">
<HintPath>../Libs/mscorlib.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="0Harmony" />
<Reference Include="AMDaemon.NET" />
<Reference Include="Assembly-CSharp" />

View File

@ -1,6 +1,7 @@
using System.Collections;
using System.Linq;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using AquaMai.Mods.Types;
using DB;
@ -25,6 +26,7 @@ namespace AquaMai.Mods.Enhancement;
""")]
[EnableGameVersion(23000)]
public static class ServerAnnouncement
{
private class ServerAnnouncementEntry : ConditionalMessage

View File

@ -1,5 +1,6 @@
using System.Linq;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using AquaMai.Mods.Types;
using JetBrains.Annotations;
@ -19,6 +20,7 @@ namespace AquaMai.Mods.Enhancement;
""")]
[EnableGameVersion(23000)]
public class ServerNotice
{
private const string FieldName = "_aquaMaiServerNotice";

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using AquaMai.Mods.Types;
using HarmonyLib;
@ -24,6 +25,7 @@ namespace AquaMai.Mods.Enhancement;
defaultOn: true,
exampleHidden: true,
zh: "加载服务器下发的资源(如果支持)")]
[EnableGameVersion(23000)]
public class ServerResources
{
[ConfigEntry]

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using Monitor;
using UI;
@ -20,6 +21,7 @@ namespace AquaMai.Mods.Fancy;
: musicBase, musicTab, musicLvBase, musicLvText
""")]
[EnableGameVersion(23000)]
public class CustomTrackStartDiff
{
// 自定义在歌曲开始界面上显示的难度 (并不是真的自定义难度)

View File

@ -4,6 +4,7 @@ using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using DB;
using HarmonyLib;
using MAI2.Util;
@ -20,6 +21,7 @@ namespace AquaMai.Mods.Fancy.GamePlay.CustomNoteTypes;
name: "自定义 Note 类型",
en: "Custom Note Types."
)]
[EnableGameVersion(23000)]
public class CustomNoteTypes
{
/*

View File

@ -1,4 +1,5 @@
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using Monitor;
using TMPro;
@ -17,6 +18,7 @@ namespace AquaMai.Mods.Fancy.GamePlay;
, TRACK X , DX/,
""")]
[EnableGameVersion(23000)]
public class DisableTrackStartTabs
{
// 在歌曲开始界面, 把 TRACK X 字样, DX/标准谱面的显示框, 以及画面下方的滴蜡熊隐藏掉, 让他看起来不那么 sinmai, 更像是 majdata

View File

@ -16,7 +16,7 @@ namespace AquaMai.Mods.Fancy.GamePlay;
en: "Enable the game to correctly judge Touch Hold outside the C zone. Experimental implementation, reported to be unstable",
zh: "使游戏可以正常判定非 C 区的 Touch Hold。实验性实现据反馈不稳定"
)]
[EnableGameVersion(maxVersion: 25699)]
[EnableGameVersion(23000, 25699)]
public class FixJudgeTouchHoldInNormalArea
{
// This patch fixes the issue in GameVersion <= 1.56 where Touch Hold could appear in any zone but were only judged in C zone

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using Manager;
using Monitor;
@ -13,6 +14,7 @@ namespace AquaMai.Mods.Fancy.GamePlay;
name: "星星缩入动画",
en: "Make the Slide Track disappear with an inward-shrinking animation, similar to AstroDX.",
zh: "使 Slide Track 消失时有类似 AstroDX 一样的向内缩入的动画")]
[EnableGameVersion(23000)]
public class SlideArrowAnimation
{
private static List<SpriteRenderer> _animatingSpriteRenderers = [];

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using MAI2.Util;
using Manager;
@ -13,6 +14,7 @@ namespace AquaMai.Mods.Fancy.GamePlay;
name: "星星渐入",
zh: "让星星在启动拍等待期间从 50% 透明度渐入为 100%,取代原本在击打星星头时就完成渐入",
en: "Slides will fade in instead of instantly appearing.")]
[EnableGameVersion(23000)]
public class SlideFadeInTweak
{
[HarmonyPrefix]

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using Monitor;
using UnityEngine;
@ -16,6 +17,7 @@ namespace AquaMai.Mods.Fancy.GamePlay;
Slide , 使 Slide
""")]
[EnableGameVersion(23000)]
public class SlideLayerReverse
{
[HarmonyPostfix]

View File

@ -1,4 +1,5 @@
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using Process.AdvertiseCommercial;
@ -9,6 +10,7 @@ namespace AquaMai.Mods.Fancy;
defaultOn: true,
en: "Ignores 5 mins total timeout on commercial screen.",
zh: "忽略闲置时的视频广告画面的5分钟总时长限制")]
[EnableGameVersion(23000)]
public class IgnoreCommercialTimeout
{
[HarmonyPrefix]

View File

@ -15,6 +15,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using AquaMai.Core.Attributes;
using Tomlet;
using Tomlet.Attributes;
using UI.DaisyChainList;
@ -27,6 +28,7 @@ namespace AquaMai.Mods.Fancy;
"曲目伪装术",
en: "Mimicking KoP final song's hidden track information feature, better paired with custom intro cinematic feature",
zh: "仿 KoP 决赛曲揭晓时的曲目信息隐藏特性,配合自定义乐曲开场视频功能使用效果更佳")]
[EnableGameVersion(23000)]
public class TrackCamouflage
{
[ConfigEntry(

View File

@ -10,7 +10,7 @@ using UnityEngine;
namespace AquaMai.Mods.Fix;
[EnableGameVersion(24000)]
[EnableGameVersion(25000)]
[ConfigSection(exampleHidden: true, defaultOn: true)]
public class FixLevelDisplay
{
@ -28,7 +28,7 @@ public class FixLevelDisplay
GameObject ____difficultyUtageQuesionMarkDoubleDigit)
{
// 在 KLD 表门和里门不应用修改
if (GameInfo.GameVersion >= 25500 && GameManager.IsKaleidxScopeMode)
if (GameManager.IsKaleidxScopeMode)
{
if (Singleton<KaleidxScopeManager>.Instance.gateId == 8 ||
Singleton<KaleidxScopeManager>.Instance.gateId == 10)

View File

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using AquaMai.Config.Attributes;
using AquaMai.Core;
using HarmonyLib;
using Manager;
using Manager.MaiStudio;

View File

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using HarmonyLib;
using MelonLoader;
@ -15,6 +16,7 @@ namespace AquaMai.Mods.GameSystem.Assets;
en: "Use custom font(s) as fallback or fully replace the original game font.",
zh: "使用自定义字体作为回退(解决中文字形缺失问题),或完全替换游戏原字体",
defaultOn: true)]
[EnableGameVersion(23000)]
public class Fonts
{
[ConfigEntry(

View File

@ -10,6 +10,7 @@ using Manager;
using MelonLoader;
using Monitor;
using AquaMai.Config.Attributes;
using AquaMai.Core;
using AquaMai.Core.Helpers;
namespace AquaMai.Mods.GameSystem.Assets;

View File

@ -20,6 +20,7 @@ namespace AquaMai.Mods.GameSystem.Assets;
en: "Custom Play Song Background\nPriority: game source PV > local mp4 PV > jacket",
zh: "自定义歌曲游玩界面背景\n优先级: 首先读游戏自带 PV, 然后读本地 mp4 格式 PV, 最后读封面",
defaultOn: true)]
[EnableGameVersion(23000)]
public class MovieLoader
{
[ConfigEntry(

View File

@ -7,6 +7,7 @@ using Manager;
using MelonLoader;
using UnityEngine;
using AquaMai.Config.Attributes;
using AquaMai.Core;
using AquaMai.Core.Helpers;
using AquaMai.Core.Resources;
@ -124,6 +125,28 @@ public class CustomCameraId
yield break;
}
private static CameraParameter _gameCameraParam;
private static CameraParameter _qrCameraParam;
[HarmonyPostfix]
[HarmonyPatch(typeof(CameraManager), "Initialize")]
public static void SetCameraResolution(CameraManager __instance)
{
WebCamDevice qrDevice = WebCamTexture.devices[Enum.TryParse<CameraManager.CameraTypeEnum>("Chime", out _) ? chimeCamera : leftQrCamera];
WebCamTexture qrTexture = new WebCamTexture(qrDevice.name);
qrTexture.Play();
_qrCameraParam = new CameraParameter(qrTexture.width, qrTexture.height, (int)qrTexture.requestedFPS);
AccessTools.Field(typeof(CameraManager), "QrCameraParam").SetValue(__instance, _qrCameraParam);
qrTexture.Stop();
WebCamDevice gameDevice = WebCamTexture.devices[photoCamera];
WebCamTexture gameTexture = new WebCamTexture(gameDevice.name);
gameTexture.Play();
_gameCameraParam = new CameraParameter(gameTexture.width, gameTexture.height, (int)gameTexture.requestedFPS);
AccessTools.Field(typeof(CameraManager), "GameCameraParam").SetValue(__instance, _gameCameraParam);
gameTexture.Stop();
}
public static void OnBeforePatch()
{
if (!printCameraList)

View File

@ -16,6 +16,7 @@ namespace AquaMai.Mods.GameSystem;
name: "去除倒计时",
en: "Disable timers (hidden and set to 65535 seconds).",
zh: "去除并隐藏游戏中的倒计时")]
[EnableGameVersion(23000)]
public class DisableTimeout
{
[ConfigEntry(

View File

@ -70,7 +70,7 @@ public partial class SinglePlayer
zh: "单人模式下刷卡登录直接进入下一个界面,无需跳过倒计时")]
public static bool autoSkip = false;
[EnableGameVersion(21500, noWarn: true)]
[EnableGameVersion(23000, noWarn: true)]
[EnableIf(nameof(autoSkip))]
[HarmonyPostfix]
[HarmonyPatch(typeof(EntryMonitor), "DecideEntry")]

View File

@ -14,6 +14,7 @@ using Net.VO.Mai2;
using Process;
using Util;
using System.Runtime.CompilerServices;
using AquaMai.Core;
namespace AquaMai.Mods.GameSystem;
@ -29,6 +30,7 @@ namespace AquaMai.Mods.GameSystem;
Mod
//
""")]
[EnableGameVersion(23000)]
public class Unlock
{
public static void OnBeforeEnableCheck()

View File

@ -2,6 +2,7 @@
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using UnityEngine;
namespace AquaMai.Mods.GameSystem;
@ -10,6 +11,7 @@ namespace AquaMai.Mods.GameSystem;
name: "图形设置",
en: "Resolution Settings / Windowed Mode.",
zh: "分辨率设置 / 窗口化")]
[EnableGameVersion(23000)]
public class Window
{
[ConfigEntry(

View File

@ -19,6 +19,7 @@ namespace AquaMai.Mods.Tweaks.TimeSaving;
name: "登录后直接选歌",
en: "Directly enter the song selection screen after login.",
zh: "登录完成后直接进入选歌界面")]
[EnableGameVersion(23000)]
public class EntryToMusicSelection
{
[ConfigEntry(name: "仅游客模式", zh: "仅在游客模式启用", en: "Enable only in Guest Mode")]

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using Process;
using Process.Information;
@ -10,6 +11,7 @@ namespace AquaMai.Mods.Tweaks.TimeSaving;
name: "跳过活动提示",
en: "Skip possible prompts like \"New area discovered\", \"New songs added\", \"There are events\" during game login/registration.",
zh: "跳过登录 / 注册游戏时候可能的 “发现了新的区域哟” “乐曲增加” “有活动哟” 之类的提示")]
[EnableGameVersion(23000)]
public class SkipEventInfo
{
[HarmonyPostfix]

View File

@ -20,6 +20,7 @@ namespace AquaMai.Mods.UX;
name: "AutoPlay 时不保存成绩",
en: "Do not save scores when AutoPlay is used",
defaultOn: true)]
[EnableGameVersion(25500)]
// 收编自 https://github.com/Starrah/DontRuinMyAccount/blob/master/Core.cs
public class DontRuinMyAccount
{

View File

@ -1,5 +1,6 @@
using System;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using Manager;
using MelonLoader;
@ -13,6 +14,7 @@ namespace AquaMai.Mods.UX;
name: "两位数曲目修复",
en: "Make track number in top right corner display two digits (in Normal mode)",
zh: "让右上角的当前曲目数字可以显示两位数(在普通模式中)")]
[EnableGameVersion(25500)]
public class FixTrackNumDisplay
{
private static Sprite[] customSprites;

View File

@ -4,6 +4,7 @@ using System;
using MelonLoader;
using Manager;
using System.Reflection;
using AquaMai.Core.Attributes;
using MAI2.Util;
using UnityEngine;
@ -15,6 +16,7 @@ namespace AquaMai.Mods.UX;
zh: "按 Enter 键获得 KLD 里门的钥匙 (DXPASS)",
defaultOn: true
)]
[EnableGameVersion(25500)]
public class GrantFinalGateKey
{
[HarmonyPostfix]

View File

@ -3,6 +3,7 @@ using AquaMai.Config.Attributes;
using System;
using System.Diagnostics;
using System.Linq;
using AquaMai.Core.Attributes;
using MelonLoader;
using Manager;
@ -14,6 +15,7 @@ namespace AquaMai.Mods.UX;
zh: "在正常模式中,隐藏乱码曲 Xaleid◆scopiX",
defaultOn: true
)]
[EnableGameVersion(25500)]
public class Hide1879
{
[HarmonyPostfix]

View File

@ -28,6 +28,7 @@ namespace AquaMai.Mods.UX;
en: "Save immediate after playing a song.",
zh: "打完一首歌的时候立即向服务器保存成绩",
defaultOn: true)]
[EnableGameVersion(23000)]
public class ImmediateSave
{
[ConfigEntry(name: "显示保存中提示")]

View File

@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using HarmonyLib;
using MAI2.Util;
using Manager;
@ -21,6 +22,7 @@ namespace AquaMai.Mods.UX;
name: "判定详情统计",
zh: "在游戏总结的计分板中显示击打误差的详细信息(以帧为单位)",
en: "Show detailed accuracy info in the score board.")]
[EnableGameVersion(23000)]
public class JudgeAccuracyInfo
{
public class AccuracyEntryList

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using AquaMai.Config.Attributes;
using AquaMai.Config.Types;
using AquaMai.Core;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using AquaMai.Mods.Tweaks.TimeSaving;
using HarmonyLib;
@ -18,6 +19,7 @@ namespace AquaMai.Mods.UX;
name: "一键登录与登出",
en: "One key to proceed to music select (during entry) or end current PC (during music select).",
zh: "一键跳过登录过程直接进入选歌界面,或在选歌界面直接结束本局游戏")]
[EnableGameVersion(23000)]
public class OneKeyEntryEnd
{
[ConfigEntry(name: "按键")]

View File

@ -1,5 +1,6 @@
using AquaMai.Config.Attributes;
using AquaMai.Config.Types;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using HarmonyLib;
using MAI2.Util;
@ -11,8 +12,9 @@ namespace AquaMai.Mods.UX;
[ConfigSection(
name: "一键重开和跳过",
en: "One key to retry (1.30+) or skip current chart in gameplay.",
zh: "在游戏中途一键重试1.30+)或跳过当前谱面")]
en: "One key to retry or skip current chart in gameplay.",
zh: "在游戏中途一键重试或跳过当前谱面")]
[EnableGameVersion(23000)]
public class OneKeyRetrySkip
{
[ConfigEntry("重开按键")]

View File

@ -15,6 +15,7 @@ using Process;
using UnityEngine;
using AquaMai.Config.Attributes;
using AquaMai.Config.Types;
using AquaMai.Core.Attributes;
using MelonLoader;
namespace AquaMai.Mods.UX.PracticeMode;
@ -23,6 +24,7 @@ namespace AquaMai.Mods.UX.PracticeMode;
[ConfigSection(
en: "Practice Mode.",
name: "练习模式")]
[EnableGameVersion(23000)]
public class PracticeMode
{
[ConfigEntry(

View File

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using AquaMai.Config.Attributes;
using AquaMai.Config.Types;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using AquaMai.Core.Resources;
using AquaMai.Mods.UX.PracticeMode;
@ -20,6 +21,7 @@ namespace AquaMai.Mods.Utils;
[ConfigSection(
name: "实时触摸显示",
zh: "在游戏过程中在副屏显示触摸输入,可用于调试吃和蹭的问题")]
[EnableGameVersion(23000)]
public static class DisplayTouchInGame
{
private static GameObject prefab;

View File

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Reflection;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using AquaMai.Core.Resources;
using AquaMai.Core.Types;
@ -21,6 +22,7 @@ namespace AquaMai.Mods.Utils;
[ConfigSection(
name: "移动正解音",
en: "Move answer sound")]
[EnableGameVersion(23000)]
public class MoveAnswerSound : IPlayerSettingsItem
{
[ConfigEntry(

View File

@ -6,6 +6,7 @@ using System.IO.Compression;
using System.Text.RegularExpressions;
using System.Threading;
using AquaMai.Config.Attributes;
using AquaMai.Core.Attributes;
using AquaMai.Core.Helpers;
using HarmonyLib;
using Main;
@ -20,6 +21,7 @@ namespace AquaMai.Mods.Utils;
en: "Show error log in the game.",
zh: "在游戏中显示错误日志窗口而不是关闭游戏进程",
defaultOn: true)]
[EnableGameVersion(23000)]
public class ShowErrorLog
{
private static Ui _errorUi;

View File

@ -30,12 +30,12 @@ public static class AssemblyLoader
public static void LoadAssemblies()
{
foreach (var (assemblyName, assemblyFileName) in Assemblies)
foreach (var assembly in Assemblies)
{
# if DEBUG
MelonLoader.MelonLogger.Msg($"Loading assembly \"{assemblyFileName}\"...");
MelonLoader.MelonLogger.Msg($"Loading assembly \"{assembly.Key}\"...");
# endif
LoadedAssemblies[assemblyName] = LoadAssemblyFromResource(assemblyFileName);
LoadedAssemblies[assembly.Key] = LoadAssemblyFromResource(assembly.Value);
}
}

Binary file not shown.