Skip to content

Commit

Permalink
Merge pull request #2749 from JeffreySu/Developer
Browse files Browse the repository at this point in the history
Developer
  • Loading branch information
JeffreySu authored Dec 20, 2022
2 parents acfd978 + 73113b5 commit 882ecf3
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 33 deletions.
15 changes: 5 additions & 10 deletions Samples/All/net7-mvc/Senparc.Weixin.Sample.Net7.sln
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.TenPayV3.net
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.TenPayV3.Test.net7", "..\..\..\src\Senparc.Weixin.TenPay\Senparc.Weixin.TenPayV3.Test\Senparc.Weixin.TenPayV3.Test.net7.csproj", "{757A2C42-8B3F-4F7F-B948-7453A80267C8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.MP", "..\..\MP\Senparc.Weixin.Sample.MP\Senparc.Weixin.Sample.MP.net7.csproj", "{81A078A9-97D1-446D-88ED-87F4BB484D91}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.MP.net7", "..\..\MP\Senparc.Weixin.Sample.MP\Senparc.Weixin.Sample.MP.net7.csproj", "{81A078A9-97D1-446D-88ED-87F4BB484D91}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "不同模块 Samples", "不同模块 Samples", "{34CFB1D8-6025-4E93-A67F-D94DD3B9198F}"
EndProject
Expand All @@ -87,13 +87,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common Files", "Common File
Common Files\site.css = Common Files\site.css
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.Work", "..\..\Work\Senparc.Weixin.Sample.Work\Senparc.Weixin.Sample.Work.net7.csproj", "{DEFD229C-0482-4924-8746-73D21B9DAB02}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.Work.net7", "..\..\Work\Senparc.Weixin.Sample.Work\Senparc.Weixin.Sample.Work.net7.csproj", "{DEFD229C-0482-4924-8746-73D21B9DAB02}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.WxOpen", "..\..\WxOpen\Senparc.Weixin.Sample.WxOpen\Senparc.Weixin.Sample.WxOpen.net7.csproj", "{5CDE163E-A083-418F-B70A-63F25A957666}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.WxOpen.net7", "..\..\WxOpen\Senparc.Weixin.Sample.WxOpen\Senparc.Weixin.Sample.WxOpen.net7.csproj", "{5CDE163E-A083-418F-B70A-63F25A957666}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.TenPayV2", "..\..\TenPayV2\Senparc.Weixin.Sample.TenPayV2\Senparc.Weixin.Sample.TenPayV2.net7.csproj", "{94C58964-01E0-4AA0-AF98-5851208D9755}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.TenPayV2.net7", "..\..\TenPayV2\Senparc.Weixin.Sample.TenPayV2\Senparc.Weixin.Sample.TenPayV2.net7.csproj", "{94C58964-01E0-4AA0-AF98-5851208D9755}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.TenPayV3", "..\..\TenPayV3\Senparc.Weixin.Sample.TenPayV3\Senparc.Weixin.Sample.TenPayV3.net7.csproj", "{D70B89B9-27BC-45DD-A908-4282F101B409}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Senparc.Weixin.Sample.TenPayV3.net7", "..\..\TenPayV3\Senparc.Weixin.Sample.TenPayV3\Senparc.Weixin.Sample.TenPayV3.net7.csproj", "{D70B89B9-27BC-45DD-A908-4282F101B409}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Senparc.Weixin.Sample.Shared", "..\Senparc.Weixin.Sample.Shared\Senparc.Weixin.Sample.Shared.shproj", "{81A03BCD-B887-4A40-8867-FF6B8D61CFC3}"
EndProject
Expand Down Expand Up @@ -569,7 +569,6 @@ Global
{81A078A9-97D1-446D-88ED-87F4BB484D91}.Debug|x86.ActiveCfg = Debug|Any CPU
{81A078A9-97D1-446D-88ED-87F4BB484D91}.Debug|x86.Build.0 = Debug|Any CPU
{81A078A9-97D1-446D-88ED-87F4BB484D91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81A078A9-97D1-446D-88ED-87F4BB484D91}.Release|Any CPU.Build.0 = Release|Any CPU
{81A078A9-97D1-446D-88ED-87F4BB484D91}.Release|x64.ActiveCfg = Release|Any CPU
{81A078A9-97D1-446D-88ED-87F4BB484D91}.Release|x64.Build.0 = Release|Any CPU
{81A078A9-97D1-446D-88ED-87F4BB484D91}.Release|x86.ActiveCfg = Release|Any CPU
Expand All @@ -587,7 +586,6 @@ Global
{DEFD229C-0482-4924-8746-73D21B9DAB02}.Debug|x86.ActiveCfg = Debug|Any CPU
{DEFD229C-0482-4924-8746-73D21B9DAB02}.Debug|x86.Build.0 = Debug|Any CPU
{DEFD229C-0482-4924-8746-73D21B9DAB02}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DEFD229C-0482-4924-8746-73D21B9DAB02}.Release|Any CPU.Build.0 = Release|Any CPU
{DEFD229C-0482-4924-8746-73D21B9DAB02}.Release|x64.ActiveCfg = Release|Any CPU
{DEFD229C-0482-4924-8746-73D21B9DAB02}.Release|x64.Build.0 = Release|Any CPU
{DEFD229C-0482-4924-8746-73D21B9DAB02}.Release|x86.ActiveCfg = Release|Any CPU
Expand All @@ -605,7 +603,6 @@ Global
{5CDE163E-A083-418F-B70A-63F25A957666}.Debug|x86.ActiveCfg = Debug|Any CPU
{5CDE163E-A083-418F-B70A-63F25A957666}.Debug|x86.Build.0 = Debug|Any CPU
{5CDE163E-A083-418F-B70A-63F25A957666}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5CDE163E-A083-418F-B70A-63F25A957666}.Release|Any CPU.Build.0 = Release|Any CPU
{5CDE163E-A083-418F-B70A-63F25A957666}.Release|x64.ActiveCfg = Release|Any CPU
{5CDE163E-A083-418F-B70A-63F25A957666}.Release|x64.Build.0 = Release|Any CPU
{5CDE163E-A083-418F-B70A-63F25A957666}.Release|x86.ActiveCfg = Release|Any CPU
Expand All @@ -623,7 +620,6 @@ Global
{94C58964-01E0-4AA0-AF98-5851208D9755}.Debug|x86.ActiveCfg = Debug|Any CPU
{94C58964-01E0-4AA0-AF98-5851208D9755}.Debug|x86.Build.0 = Debug|Any CPU
{94C58964-01E0-4AA0-AF98-5851208D9755}.Release|Any CPU.ActiveCfg = Release|Any CPU
{94C58964-01E0-4AA0-AF98-5851208D9755}.Release|Any CPU.Build.0 = Release|Any CPU
{94C58964-01E0-4AA0-AF98-5851208D9755}.Release|x64.ActiveCfg = Release|Any CPU
{94C58964-01E0-4AA0-AF98-5851208D9755}.Release|x64.Build.0 = Release|Any CPU
{94C58964-01E0-4AA0-AF98-5851208D9755}.Release|x86.ActiveCfg = Release|Any CPU
Expand All @@ -641,7 +637,6 @@ Global
{D70B89B9-27BC-45DD-A908-4282F101B409}.Debug|x86.ActiveCfg = Debug|Any CPU
{D70B89B9-27BC-45DD-A908-4282F101B409}.Debug|x86.Build.0 = Debug|Any CPU
{D70B89B9-27BC-45DD-A908-4282F101B409}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D70B89B9-27BC-45DD-A908-4282F101B409}.Release|Any CPU.Build.0 = Release|Any CPU
{D70B89B9-27BC-45DD-A908-4282F101B409}.Release|x64.ActiveCfg = Release|Any CPU
{D70B89B9-27BC-45DD-A908-4282F101B409}.Release|x64.Build.0 = Release|Any CPU
{D70B89B9-27BC-45DD-A908-4282F101B409}.Release|x86.ActiveCfg = Release|Any CPU
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Text;
using Senparc.Weixin.Entities;
using Senparc.Weixin.Helpers.Tests;

namespace Senparc.WeixinTests.Entities
{
Expand Down Expand Up @@ -44,9 +45,16 @@ public void PrivateKeyTest()
Console.WriteLine(senparcWeixinSetting.TenPayV3_PrivateKey);
Assert.IsTrue(senparcWeixinSetting.TenPayV3_PrivateKey.Length > 100);

var exceptResult = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDee2pWWXyO6nhEdf5nj/MvQj0/tDNBrwCT+JK38ZY8xIzNbIj7J2+oBPimkFpjtETRr1YoV4BDSxt0/3E0Rdb6+gTGhdYavXM7aYA7qY/EA1eI81Zp32Hfsvnl07tFybA1W/m2CRlJQIlmXBYurd9F0Os3MSZjRBoWyrd9ISgsKcco+wdeJkxGW12MoYNVZutAlXZBoNDisjZLc2koCi7fDspsjezOTUcBnbKtTohMB7lYaFORMItELXCQ6rHwIE8zO3sYzHIkM3MR8ilSJ59CnLh0R53uqkQJ7AGVgbv97XsUMjnPiWT4B9xzvR4KGWnMs0tBr/J/0mfZlRqqOLE5AgMBAAECggEAL9XjUDufX28kervP/l5iEDgyyR6qoqXI/wfELA6imeA80EFTJYUeKccf21hQRv28ikUjxjrCFjXw6l/97BpUFdRp8HFYTpmLTCvr6WgUxDVfvc9sNglUlu95caPrsR6jZ2WmNDCSokBhCoQkNNcnmXBJEq3brh43ac0eVKYraAsQ4G+CHhdzmbB8XLc+lg2qekqXOLiNRNCm9FAJ1669EiJrK2ry9rWFZvP9d5DuyqL9djX0ff+DqUvvQiV3usQlmeJdRVAgajWJYyVec0g442wY5xKfGZ0K+l8wp2ne5nxz7F6XBONWpTrpO8EUVN0ix5nnzBvQKSNDaIeFncEkMQKBgQD1JxSP+Ky3I1dGQpXpMXC3WOYiJyZqv5BmH3A+XKErEmEXwa0CfXnxhnS0yA8Ipp4SFuu3ynynhw/2/Ca1fXd3TRG0Xg0oVNSbN8Oscrj8GnCu2yCM/RM/5sJFyc/sH+hExyApSfqmnUINLytMBtJDRKOXEeC1d/z1ET8c1mkJhQKBgQDoU4nfxtMsN1gPkHhdvvH1xcPB/mUknjzCi/336YDfmABtgZ4kcK7HVDhDW7+JnB1m66xptCHfCWiIkWQwxDK19h1wChigxbqY1aTkvlGMQQaNQYVHxPMPjqhl1WxCt20IW72dRpmruPGMggZmhBiX5vmIOIl87VHLvCo0c9FdJQKBgQCwCjkszWCRPhKMxIHL65HKR08ylTR0EU2K1+aNEY02VcNdANnQ4POxKWEi9Eo/Zw45ZTYtS31J+6XOMPFHAGrKQ5CEGcmO/aOSNnAPpG4LspzaI0Zzl8O77mPxI2NoZt0ujmMc4x/XhzOILigENx3D6kUi1VasWRZPkOvmNF1G1QKBgQCNTWHqDM+bcP3KWaAbxGr9hI8Pil6R6vwhh2usQQT0+UopUFCS8UYcTgj6Tu8sDxuC4Yw3rrO4p8xAY82AK5R8P3igEEPyZNCc7DQiO+71UwddGqCpigwbRjT92tTBrzZNgx7MbYhBfXbMcrjZ2TXsDbtvMpPMu7qoI4W36UlJUQKBgQCzRtp0q5bq9mMic01F17Hhq5xnGExs3EMA18USh4p0Xh2eX0klKI2CskPPr7uRUiuTTg0o4dZ+W91hIQw3WVTFWfod1KfijjV2RaFqE9iW1/iCarTC3NOCtPIr8iJZmPRbqQH8Ja4GOsTza50y5eo+YRmwhWcLFbA7/WTcvNZ5qw==";
var exceptResult = TenPayHelperTests.EXCEPT_RESULT;

Assert.AreEqual(exceptResult, senparcWeixinSetting.TenPayV3_PrivateKey);

//测试 TenPayV3_PrivateKey 对象没有变化
var tenPayV3PrivateKeyHashCode = senparcWeixinSetting.TenPayV3_PrivateKey.GetHashCode();
var readKey = senparcWeixinSetting.TenPayV3_PrivateKey;
var newTenPayV3PrivateKeyHashCode = senparcWeixinSetting.TenPayV3_PrivateKey.GetHashCode();
Assert.AreEqual(tenPayV3PrivateKeyHashCode, newTenPayV3PrivateKeyHashCode);

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Senparc.Weixin.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Senparc.Weixin.Helpers.Tests
{
[TestClass()]
public class TenPayHelperTests
{
internal const string EXCEPT_RESULT = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDee2pWWXyO6nhEdf5nj/MvQj0/tDNBrwCT+JK38ZY8xIzNbIj7J2+oBPimkFpjtETRr1YoV4BDSxt0/3E0Rdb6+gTGhdYavXM7aYA7qY/EA1eI81Zp32Hfsvnl07tFybA1W/m2CRlJQIlmXBYurd9F0Os3MSZjRBoWyrd9ISgsKcco+wdeJkxGW12MoYNVZutAlXZBoNDisjZLc2koCi7fDspsjezOTUcBnbKtTohMB7lYaFORMItELXCQ6rHwIE8zO3sYzHIkM3MR8ilSJ59CnLh0R53uqkQJ7AGVgbv97XsUMjnPiWT4B9xzvR4KGWnMs0tBr/J/0mfZlRqqOLE5AgMBAAECggEAL9XjUDufX28kervP/l5iEDgyyR6qoqXI/wfELA6imeA80EFTJYUeKccf21hQRv28ikUjxjrCFjXw6l/97BpUFdRp8HFYTpmLTCvr6WgUxDVfvc9sNglUlu95caPrsR6jZ2WmNDCSokBhCoQkNNcnmXBJEq3brh43ac0eVKYraAsQ4G+CHhdzmbB8XLc+lg2qekqXOLiNRNCm9FAJ1669EiJrK2ry9rWFZvP9d5DuyqL9djX0ff+DqUvvQiV3usQlmeJdRVAgajWJYyVec0g442wY5xKfGZ0K+l8wp2ne5nxz7F6XBONWpTrpO8EUVN0ix5nnzBvQKSNDaIeFncEkMQKBgQD1JxSP+Ky3I1dGQpXpMXC3WOYiJyZqv5BmH3A+XKErEmEXwa0CfXnxhnS0yA8Ipp4SFuu3ynynhw/2/Ca1fXd3TRG0Xg0oVNSbN8Oscrj8GnCu2yCM/RM/5sJFyc/sH+hExyApSfqmnUINLytMBtJDRKOXEeC1d/z1ET8c1mkJhQKBgQDoU4nfxtMsN1gPkHhdvvH1xcPB/mUknjzCi/336YDfmABtgZ4kcK7HVDhDW7+JnB1m66xptCHfCWiIkWQwxDK19h1wChigxbqY1aTkvlGMQQaNQYVHxPMPjqhl1WxCt20IW72dRpmruPGMggZmhBiX5vmIOIl87VHLvCo0c9FdJQKBgQCwCjkszWCRPhKMxIHL65HKR08ylTR0EU2K1+aNEY02VcNdANnQ4POxKWEi9Eo/Zw45ZTYtS31J+6XOMPFHAGrKQ5CEGcmO/aOSNnAPpG4LspzaI0Zzl8O77mPxI2NoZt0ujmMc4x/XhzOILigENx3D6kUi1VasWRZPkOvmNF1G1QKBgQCNTWHqDM+bcP3KWaAbxGr9hI8Pil6R6vwhh2usQQT0+UopUFCS8UYcTgj6Tu8sDxuC4Yw3rrO4p8xAY82AK5R8P3igEEPyZNCc7DQiO+71UwddGqCpigwbRjT92tTBrzZNgx7MbYhBfXbMcrjZ2TXsDbtvMpPMu7qoI4W36UlJUQKBgQCzRtp0q5bq9mMic01F17Hhq5xnGExs3EMA18USh4p0Xh2eX0klKI2CskPPr7uRUiuTTg0o4dZ+W91hIQw3WVTFWfod1KfijjV2RaFqE9iW1/iCarTC3NOCtPIr8iJZmPRbqQH8Ja4GOsTza50y5eo+YRmwhWcLFbA7/WTcvNZ5qw==";


[TestMethod()]
public void TryGetPrivateKeyFromFileTest()
{
var privateKey = "~/apiclient_key.pem";
TenPayHelper.TryGetPrivateKeyFromFile(ref privateKey);

Console.WriteLine(privateKey);
Assert.IsTrue(privateKey.Length > 100);

Assert.AreEqual(EXCEPT_RESULT, privateKey);

//测试不会再次被改写
var privateKeyHashCode = privateKey.GetHashCode();
TenPayHelper.TryGetPrivateKeyFromFile(ref privateKey);
var newPrivateKeyHashCode = privateKey.GetHashCode();
Assert.AreEqual(privateKeyHashCode, newPrivateKeyHashCode);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ and limitations under the License.
----------------------------------------------------------------*/

using Senparc.Weixin.Exceptions;
using Senparc.Weixin.Helpers;
using System;
using System.Collections.Generic;
using System.IO;
Expand All @@ -55,9 +56,10 @@ namespace Senparc.Weixin.Entities
/// <summary>
/// Senparc.Weixin SDK 中单个公众号配置信息
/// </summary>
public record class SenparcWeixinSettingItem : ISenparcWeixinSettingForMP, ISenparcWeixinSettingForWxOpen, ISenparcWeixinSettingForWork,
ISenparcWeixinSettingForOldTenpay, ISenparcWeixinSettingForTenpayV3,
ISenparcWeixinSettingForOpen, ISenparcWeixinSettingForExtension
public record class SenparcWeixinSettingItem : ISenparcWeixinSettingForMP,
ISenparcWeixinSettingForWxOpen, ISenparcWeixinSettingForWork,
ISenparcWeixinSettingForOldTenpay, ISenparcWeixinSettingForTenpayV3,
ISenparcWeixinSettingForOpen, ISenparcWeixinSettingForExtension
{
/// <summary>
/// 唯一标识
Expand Down Expand Up @@ -152,8 +154,6 @@ public SenparcWeixinSettingItem(ISenparcWeixinSettingForExtension setting, bool
}
#endregion



#region 公众号

/// <summary>
Expand Down Expand Up @@ -304,29 +304,15 @@ public virtual string TenPayV3_PrivateKey
{
get
{
if (_tenPayV3_PrivateKey != null && _tenPayV3_PrivateKey.Length < 100 && _tenPayV3_PrivateKey.StartsWith("~/"))
{
//虚拟路径
//尝试读取文件
var filePath = CO2NET.Utilities.ServerUtility.ContentRootMapPath(_tenPayV3_PrivateKey);
if (!File.Exists(filePath))
{
Senparc.Weixin.WeixinTrace.BaseExceptionLog(new WeixinException("TenPayV3_PrivateKey 证书文件不存在!" + filePath));
}

var fileContent = File.ReadAllText(filePath);
Regex regex = new Regex(@"(--([^\r\n])+--[\r\n]{0,1})|[\r\n]");
var privateKey = regex.Replace(fileContent, "");
_tenPayV3_PrivateKey = privateKey;
}
return _tenPayV3_PrivateKey;
return TenPayHelper.TryGetPrivateKeyFromFile(ref _tenPayV3_PrivateKey);
}
set
{

_tenPayV3_PrivateKey = value;
}
}

/// <summary>
/// 微信支付(V3)证书序列号
/// <para>查看地址:https://pay.weixin.qq.com/index.php/core/cert/api_cert#/api-cert-manage</para>
Expand Down
31 changes: 31 additions & 0 deletions src/Senparc.Weixin/Senparc.Weixin/Helpers/TenPay/TenPayHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ and limitations under the License.
----------------------------------------------------------------*/

using Senparc.Weixin.Entities;
using Senparc.Weixin.Exceptions;
using System.IO;
using System.Text.RegularExpressions;

namespace Senparc.Weixin.Helpers
{
Expand All @@ -48,11 +51,39 @@ public static string GetRegisterKey(string mchId, string subMchId)
return mchId + "_" + subMchId;
}

/// <summary>
/// 获取微信支付(V3)注册 TenPayV3InfoCollection 以及 Cert HrrpClient 时提供的 Key 或 Name
/// </summary>
/// <param name="senparcWeixinSettingForTenpayV3"></param>
/// <returns></returns>
public static string GetRegisterKey(ISenparcWeixinSettingForTenpayV3 senparcWeixinSettingForTenpayV3)
{
return GetRegisterKey(senparcWeixinSettingForTenpayV3.TenPayV3_MchId, senparcWeixinSettingForTenpayV3.TenPayV3_SubMchId);
}

/// <summary>
/// 尝试从文件获取正确格式的私钥
/// </summary>
/// <returns></returns>
public static string TryGetPrivateKeyFromFile(ref string tenPayV3_PrivateKey)
{
if (tenPayV3_PrivateKey != null && tenPayV3_PrivateKey.Length < 100 && tenPayV3_PrivateKey.StartsWith("~/"))
{
//虚拟路径
//尝试读取文件
var filePath = CO2NET.Utilities.ServerUtility.ContentRootMapPath(tenPayV3_PrivateKey);
if (!File.Exists(filePath))
{
Senparc.Weixin.WeixinTrace.BaseExceptionLog(new WeixinException("TenPayV3_PrivateKey 证书文件不存在!" + filePath));
}

var fileContent = File.ReadAllText(filePath);
Regex regex = new Regex(@"(--([^\r\n])+--[\r\n]{0,1})|[\r\n]");
var privateKey = regex.Replace(fileContent, "");
tenPayV3_PrivateKey = privateKey;
}
return tenPayV3_PrivateKey;
}

}
}

0 comments on commit 882ecf3

Please sign in to comment.