Update to .NET SDK 6.0.102 and Runtime 6.0.2

This commit is contained in:
Omair Majid 2022-02-15 11:46:24 -05:00
parent ecf6e43a6b
commit 4f642ff2a7
11 changed files with 98 additions and 14600 deletions

1
.gitignore vendored
View File

@ -14,3 +14,4 @@
/dotnet-s390x-prebuilts-2021-10-29.tar.gz
/dotnet-9e8b04bbff820c93c142f99a507a46b976f5c14c.tar.gz
/dotnet-v6.0.101.tar.gz
/dotnet-v6.0.102.tar.gz

View File

@ -1,29 +0,0 @@
From c5211f8557f2fb019416cf1f6c01142965270479 Mon Sep 17 00:00:00 2001
From: Doug Bunting <6431421+dougbu@users.noreply.github.com>
Date: Sun, 16 Jan 2022 22:55:10 -0800
Subject: [PATCH] Always build App.Ref and the targeting packs - set
`$(IsTargetingPackBuilding)` to `true` unconditionally - leave all _use_ of
`$(IsTargetingPackBuilding)`
See https://github.com/dotnet/aspnetcore/issues/39471 for details and backporting.
---
Directory.Build.props | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index e100d883e9..d71b308905 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -138,11 +138,7 @@
<TargetingPackName>Microsoft.AspNetCore.App.Ref</TargetingPackName>
<RuntimeInstallerBaseName>aspnetcore-runtime</RuntimeInstallerBaseName>
<TargetingPackInstallerBaseName>aspnetcore-targeting-pack</TargetingPackInstallerBaseName>
-
- <!-- This is used to produce targeting pack installers/packages once per major.minor. -->
- <IsTargetingPackBuilding
- Condition=" '$(IsTargetingPackBuilding)' == '' AND '$(AspNetCorePatchVersion)' != '0' ">false</IsTargetingPackBuilding>
- <IsTargetingPackBuilding Condition=" '$(IsTargetingPackBuilding)' == '' ">true</IsTargetingPackBuilding>
+ <IsTargetingPackBuilding>true</IsTargetingPackBuilding>
<!--
Archives and installers using this prefix are intended for internal use only.

View File

@ -122,8 +122,6 @@ if [ ! -f "${unmodified_tarball_name}.tar.gz" ]; then
pushd installer
git checkout "${tag}"
git submodule update --init --recursive
patch -p1 -i ../../installer-12736-no-sudo.patch
patch -p1 -i ../../installer-12852-fix-internal-urls.patch
clean_dotnet_cache
mkdir -p "../${unmodified_tarball_name}"
./build.sh /p:ArcadeBuildTarball=true /p:TarballDir="$(readlink -f ../"${unmodified_tarball_name}")"

View File

@ -20,10 +20,10 @@
# until that's done, disable LTO. This has to happen before setting the flags below.
%define _lto_cflags %{nil}
%global host_version 6.0.1
%global runtime_version 6.0.1
%global host_version 6.0.2
%global runtime_version 6.0.2
%global aspnetcore_runtime_version %{runtime_version}
%global sdk_version 6.0.101
%global sdk_version 6.0.102
%global templates_version %{runtime_version}
#%%global templates_version %%(echo %%{runtime_version} | awk 'BEGIN { FS="."; OFS="." } {print $1, $2, $3+1 }')
@ -59,7 +59,7 @@
Name: dotnet6.0
Version: %{sdk_rpm_version}
Release: 3%{?dist}
Release: 1%{?dist}
Summary: .NET Runtime and SDK
License: MIT and ASL 2.0 and BSD and LGPLv2+ and CC-BY and CC0 and MS-PL and EPL-1.0 and GPL+ and GPLv2 and ISC and OFL and zlib
URL: https://github.com/dotnet/
@ -85,10 +85,7 @@ Source11: dotnet.sh.in
Patch100: runtime-arm64-lld-fix.patch
# Mono still has a dependency on (now unbuildable) ILStrip which was removed from CoreCLR: https://github.com/dotnet/runtime/pull/60315
Patch101: runtime-mono-remove-ilstrip.patch
# https://github.com/dotnet/runtime/pull/62170
Patch102: runtime-62170-clang13.patch
# Extracted from https://github.com/dotnet/installer/pull/13009
Patch103: runtime-63653-build-all-packages.patch
Patch102: runtime-fedora-37-rid.patch
# https://github.com/dotnet/command-line-api/pull/1401
Patch300: command-line-api-use-work-tree-with-git-apply.patch
@ -122,20 +119,13 @@ Patch900: roslyn-analyzers-no-apphost.patch
Patch1000: msbuild-no-systemsecurity.patch
Patch1001: msbuild-no-systemconfiguration.patch
# Extracted from https://github.com/dotnet/installer/pull/13009
Patch1100: aspnetcore-39471-build-all-packages.patch
# Disable telemetry by default; make it opt-in
Patch1500: sdk-telemetry-optout.patch
# https://github.com/dotnet/sdk/pull/22373
Patch1501: sdk-22373-portablerid.patch
# https://github.com/dotnet/sdk/pull/21557
Patch1502: sdk-21557-man-pages.patch
# https://github.com/dotnet/installer/pull/12516
Patch1600: installer-12516-portablerid.patch
# https://github.com/dotnet/installer/pull/12736
Patch1601: installer-12736-no-sudo.patch
%if 0%{?fedora} || 0%{?rhel} >= 8
@ -417,7 +407,6 @@ pushd src/runtime.*
%patch100 -p1
%patch101 -p1
%patch102 -p1
%patch103 -p1
popd
pushd src/command-line-api.*
@ -462,18 +451,16 @@ pushd src/msbuild.*
popd
pushd src/aspnetcore.*
%patch1100 -p1
popd
pushd src/sdk.*
%patch1500 -p1
%patch1501 -p1
%patch1502 -p1
popd
pushd src/installer.*
%patch1600 -p1
%patch1601 -p1
popd
# Disable package validation which breaks our build.
@ -604,6 +591,9 @@ install install_location_%{runtime_arch} %{buildroot}%{_sysconfdir}/dotnet/
install -dm 0755 %{buildroot}%{_libdir}/dotnet/source-built-artifacts
install -m 0644 artifacts/%{runtime_arch}/Release/Private.SourceBuilt.Artifacts.*.tar.gz %{buildroot}/%{_libdir}/dotnet/source-built-artifacts/
# Quick and dirty check for https://github.com/dotnet/source-build/issues/2731
test -f %{buildroot}%{_libdir}/dotnet/sdk/%{sdk_version}/Sdks/Microsoft.NET.Sdk/Sdk/Sdk.props
# Check debug symbols in all elf objects. This is not in %%check
# because native binaries are stripped by rpm-build after %%install.
@ -673,6 +663,9 @@ export COMPlus_LTTng=0
%changelog
* Mon Feb 14 2022 Omair Majid <omajid@redhat.com> - 6.0.102-1
- Update to .NET SDK 6.0.102 and Runtime 6.0.2
* Fri Jan 28 2022 Omair Majid <omajid@redhat.com> - 6.0.101-3
- Update to .NET SDK 6.0.101 and Runtime 6.0.1

View File

@ -1,39 +0,0 @@
From f8e115fadf6e8b392fa007e78d9b77fc64590cdd Mon Sep 17 00:00:00 2001
From: Daniel Plaisted <dsplaisted@gmail.com>
Date: Mon, 29 Nov 2021 20:19:30 -0800
Subject: [PATCH] Don't set ulimit
1ES pools should now have ulimit set already now
---
build.sh | 4 +---
run-build.sh | 4 ----
2 files changed, 1 insertion(+), 7 deletions(-)
diff --git a/build.sh b/build.sh
index 594a355fafa..7ff647c4060 100755
--- a/build.sh
+++ b/build.sh
@@ -53,7 +53,5 @@ dockerbuild()
if [ ! -z "$BUILD_IN_DOCKER" ]; then
dockerbuild $args
else
- # Run under sudo so we can set ulimit
- # See https://github.com/dotnet/core-eng/issues/14808
- sudo -E $DIR/run-build.sh $args
+ $DIR/run-build.sh $args
fi
diff --git a/run-build.sh b/run-build.sh
index fe839eb8009..7b98aedc0be 100755
--- a/run-build.sh
+++ b/run-build.sh
@@ -25,10 +25,6 @@ CUSTOM_BUILD_ARGS=
# Set nuget package cache under the repo
[ -z $NUGET_PACKAGES ] && export NUGET_PACKAGES="$REPOROOT/.nuget/packages"
-# Set max number of files open, helps avoid errors during NuGet restore
-# See https://github.com/dotnet/core-eng/issues/14808
-ulimit -n 16384
-
args=( )
while [[ $# > 0 ]]; do

View File

@ -1,129 +0,0 @@
From 4582256e7ad537e315c5aa8f16bf049350d2de41 Mon Sep 17 00:00:00 2001
From: MichaelSimons <msimons@microsoft.com>
Date: Thu, 16 Dec 2021 02:29:27 +0000
Subject: [PATCH 1/2] Add logic to convert internal repo uris in
version.details.xml
---
...ourceBuildIntermediateNupkgDependencies.cs | 38 +++++++++++++++++++
.../tools/SourceBuildArcadeTarball.targets | 4 +-
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs b/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs
index 59f7eb49919..1217d166aae 100644
--- a/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs
+++ b/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs
@@ -3,6 +3,7 @@
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
@@ -21,6 +22,11 @@ public class Tarball_ReadSourceBuildIntermediateNupkgDependencies : Task
[Required]
public string SourceBuildIntermediateNupkgPrefix { get; set; }
+ /// <summary>
+ /// Convert any internal repo references to the public GitHub repos.
+ /// </summary>
+ public bool ConvertInternalRepos { get; set; }
+
/// <summary>
/// The intermediate nupkg RID to use if any RID-specific intermediate nupkgs are required.
/// If this parameter isn't specified, RID-specific intermediate nupkgs can't be used and
@@ -88,6 +94,11 @@ XName CreateQualifiedName(string plainName)
string dependencyVersion = d.Attribute("Version")?.Value;
string uri = d.Element(CreateQualifiedName("Uri"))?.Value;
+ if (ConvertInternalRepos)
+ {
+ uri = ConvertInternalRepo(uri);
+ }
+
string sha = d.Element(CreateQualifiedName("Sha"))?.Value;
string sourceBuildRepoName = sourceBuildElement.Attribute("RepoName")?.Value;
@@ -137,5 +148,32 @@ XName CreateQualifiedName(string plainName)
return !Log.HasLoggedErrors;
}
+
+ private string ConvertInternalRepo(string uri)
+ {
+ if (uri.StartsWith("https://dev.azure.com", StringComparison.OrdinalIgnoreCase))
+ {
+ string[] repoParts = uri.Substring(uri.LastIndexOf('/')).Split('-', 2);
+
+ if (repoParts.Length != 2)
+ {
+ Log.LogError($"Repo '{uri}' does not end with the expected <GH organization>-<GH repo> format");
+ return null;
+ }
+
+ string org = repoParts[0];
+ string repo = repoParts[1];
+
+ // The internal Nuget.Client repo has suffix which needs to be accounted for.
+ if (uri.EndsWith("-Trusted", StringComparison.OrdinalIgnoreCase))
+ {
+ repo = repo.Substring(0, repo.Length - 8);
+ }
+
+ uri = $"https://github.com/{org}/{repo}";
+ }
+
+ return uri;
+ }
}
}
diff --git a/src/SourceBuild/Arcade/tools/SourceBuildArcadeTarball.targets b/src/SourceBuild/Arcade/tools/SourceBuildArcadeTarball.targets
index 1717371dc87..9a49c349924 100644
--- a/src/SourceBuild/Arcade/tools/SourceBuildArcadeTarball.targets
+++ b/src/SourceBuild/Arcade/tools/SourceBuildArcadeTarball.targets
@@ -19,6 +19,7 @@
<TarballSourceDir>$(TarballRootDir)src/</TarballSourceDir>
<TarballGitInfoDir>$(TarballRootDir)git-info/</TarballGitInfoDir>
<CloneVerbosity>quiet</CloneVerbosity> <!-- Support quiet and full -->
+ <ConvertInternalRepos Condition="'$(ConvertInternalRepos)' == '' and '$(VSS_NUGET_EXTERNAL_FEED_ENDPOINTS)' == '' ">true</ConvertInternalRepos>
</PropertyGroup>
<Target Name="CreateSourceTarball"
@@ -203,7 +204,8 @@
<Tarball_ReadSourceBuildIntermediateNupkgDependencies
VersionDetailsXmlFile="$([MSBuild]::NormalizePath($(TarballVersionDetailsFile)))"
SourceBuildIntermediateNupkgPrefix="$(SourceBuildIntermediateNupkgPrefix)"
- SourceBuildIntermediateNupkgRid="$(SourceBuildIntermediateNupkgRid)">
+ SourceBuildIntermediateNupkgRid="$(SourceBuildIntermediateNupkgRid)"
+ ConvertInternalRepos="$(ConvertInternalRepos)">
<Output TaskParameter="Dependencies" ItemName="SourceBuildRepos" />
</Tarball_ReadSourceBuildIntermediateNupkgDependencies>
From 6e467b43033aefd1af39ddcbf625ef30d5440e7f Mon Sep 17 00:00:00 2001
From: MichaelSimons <msimons@microsoft.com>
Date: Thu, 16 Dec 2021 18:31:15 +0000
Subject: [PATCH 2/2] code review updates
---
.../Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs b/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs
index 1217d166aae..9b6365dfccd 100644
--- a/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs
+++ b/src/SourceBuild/Arcade/src/Tarball_ReadSourceBuildIntermediateNupkgDependencies.cs
@@ -165,9 +165,10 @@ private string ConvertInternalRepo(string uri)
string repo = repoParts[1];
// The internal Nuget.Client repo has suffix which needs to be accounted for.
- if (uri.EndsWith("-Trusted", StringComparison.OrdinalIgnoreCase))
+ const string trustedSuffix = "-Trusted";
+ if (uri.EndsWith(trustedSuffix, StringComparison.OrdinalIgnoreCase))
{
- repo = repo.Substring(0, repo.Length - 8);
+ repo = repo.Substring(0, repo.Length - trustedSuffix.Length);
}
uri = $"https://github.com/{org}/{repo}";

View File

@ -1,76 +0,0 @@
From 9cd95a5608b667e22727d9eb1a5330efd61dfe50 Mon Sep 17 00:00:00 2001
From: Jan Vorlicek <janvorli@microsoft.com>
Date: Mon, 29 Nov 2021 17:32:45 -0800
Subject: [PATCH] Fix clang 13 induced runtime issues
The clang 13 optimizer started to assume that "this" pointer is always
properly aligned. That lead to elimination of some code that was actually
needed.
It also takes pointer aliasing rules more strictly in one place in jit.
That caused the optimizer to falsely assume that a callee with an argument
passed by reference is not modifying that argument and used a stale
copy of the original value at the caller site.
This change fixes both of the issues. With this fix, runtime compiled
using clang 13 seems to be fully functional.
---
src/coreclr/inc/corhlpr.h | 8 ++++----
src/coreclr/jit/bitsetasshortlong.h | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/coreclr/inc/corhlpr.h b/src/coreclr/inc/corhlpr.h
index 450514da95c1..427e8cdc0ff5 100644
--- a/src/coreclr/inc/corhlpr.h
+++ b/src/coreclr/inc/corhlpr.h
@@ -336,7 +336,7 @@ struct COR_ILMETHOD_SECT
const COR_ILMETHOD_SECT* Next() const
{
if (!More()) return(0);
- return ((COR_ILMETHOD_SECT*)(((BYTE *)this) + DataSize()))->Align();
+ return ((COR_ILMETHOD_SECT*)Align(((BYTE *)this) + DataSize()));
}
const BYTE* Data() const
@@ -374,9 +374,9 @@ struct COR_ILMETHOD_SECT
return((AsSmall()->Kind & CorILMethod_Sect_FatFormat) != 0);
}
- const COR_ILMETHOD_SECT* Align() const
+ static const void* Align(const void* p)
{
- return((COR_ILMETHOD_SECT*) ((((UINT_PTR) this) + 3) & ~3));
+ return((void*) ((((UINT_PTR) p) + 3) & ~3));
}
protected:
@@ -579,7 +579,7 @@ typedef struct tagCOR_ILMETHOD_FAT : IMAGE_COR_ILMETHOD_FAT
const COR_ILMETHOD_SECT* GetSect() const {
if (!More()) return (0);
- return(((COR_ILMETHOD_SECT*) (GetCode() + GetCodeSize()))->Align());
+ return(((COR_ILMETHOD_SECT*) COR_ILMETHOD_SECT::Align(GetCode() + GetCodeSize())));
}
} COR_ILMETHOD_FAT;
diff --git a/src/coreclr/jit/bitsetasshortlong.h b/src/coreclr/jit/bitsetasshortlong.h
index d343edeeda4c..365cf346a10a 100644
--- a/src/coreclr/jit/bitsetasshortlong.h
+++ b/src/coreclr/jit/bitsetasshortlong.h
@@ -345,7 +345,7 @@ class BitSetOps</*BitSetType*/ BitSetShortLongRep,
{
if (IsShort(env))
{
- (size_t&)out = (size_t)out & ((size_t)gen | (size_t)in);
+ out = (BitSetShortLongRep)((size_t)out & ((size_t)gen | (size_t)in));
}
else
{
@@ -361,7 +361,7 @@ class BitSetOps</*BitSetType*/ BitSetShortLongRep,
{
if (IsShort(env))
{
- (size_t&)in = (size_t)use | ((size_t)out & ~(size_t)def);
+ in = (BitSetShortLongRep)((size_t)use | ((size_t)out & ~(size_t)def));
}
else
{

View File

@ -1,34 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Santiago Fernandez Madero <safern@microsoft.com>
Date: Tue, 11 Jan 2022 13:55:22 -0800
Subject: [PATCH] [release/6.0] Build all packages when in source-build
Originating PR: https://github.com/dotnet/runtime/pull/63653
---
eng/packaging.targets | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/eng/packaging.targets b/eng/packaging.targets
index 6bcf86dc9f2..ee8e95167d9 100644
--- a/eng/packaging.targets
+++ b/eng/packaging.targets
@@ -34,6 +34,10 @@
'$(IsRIDSpecificProject)' != 'true' and
'$(PreReleaseVersionLabel)' == 'servicing' and
'$(GitHubRepositoryName)' != 'runtimelab'">false</GeneratePackageOnBuild>
+ <!-- When in source-build we need to generate all packages when building for all configurations even in servicing. -->
+ <GeneratePackageOnBuild Condition="!$(GeneratePackageOnBuild) and
+ '$(BuildAllConfigurations)' == 'true' and
+ '$(DotNetBuildFromSource)' == 'true'">true</GeneratePackageOnBuild>
<!-- Search for the documentation file in the intellisense package and otherwise pick up the generated one. -->
<LibIntellisenseDocumentationFilePath>$(XmlDocFileRoot)1033\$(AssemblyName).xml</LibIntellisenseDocumentationFilePath>
<UseIntellisenseDocumentationFile Condition="'$(UseIntellisenseDocumentationFile)' == '' and Exists('$(LibIntellisenseDocumentationFilePath)')">true</UseIntellisenseDocumentationFile>
@@ -279,7 +283,7 @@
</Target>
<Target Name="ValidateServicingVersionIsPropertlySet"
- Condition="'$(PreReleaseVersionLabel)' == 'servicing'"
+ Condition="'$(PreReleaseVersionLabel)' == 'servicing' and '$(DotNetBuildFromSource)' != 'true'"
AfterTargets="GenerateNuspec">
<Error Condition="'$(ServicingVersion)' == '0'" Text="ServicingVersion is set to 0 and it should be an increment of the patch version from the last released package." />
</Target>

View File

@ -0,0 +1,84 @@
diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json
index bf6dfc3c1a1..1de4979b8ee 100644
--- a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json
+++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json
@@ -3029,6 +3029,38 @@
"any",
"base"
],
+ "fedora.37": [
+ "fedora.37",
+ "fedora",
+ "linux",
+ "unix",
+ "any",
+ "base"
+ ],
+ "fedora.37-arm64": [
+ "fedora.37-arm64",
+ "fedora.37",
+ "fedora-arm64",
+ "fedora",
+ "linux-arm64",
+ "linux",
+ "unix-arm64",
+ "unix",
+ "any",
+ "base"
+ ],
+ "fedora.37-x64": [
+ "fedora.37-x64",
+ "fedora.37",
+ "fedora-x64",
+ "fedora",
+ "linux-x64",
+ "linux",
+ "unix-x64",
+ "unix",
+ "any",
+ "base"
+ ],
"freebsd": [
"freebsd",
"unix",
diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json
index 2e6ec616b74..70a1582ba64 100644
--- a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json
+++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json
@@ -1146,6 +1146,23 @@
"fedora-x64"
]
},
+ "fedora.37": {
+ "#import": [
+ "fedora"
+ ]
+ },
+ "fedora.37-arm64": {
+ "#import": [
+ "fedora.37",
+ "fedora-arm64"
+ ]
+ },
+ "fedora.37-x64": {
+ "#import": [
+ "fedora.37",
+ "fedora-x64"
+ ]
+ },
"freebsd": {
"#import": [
"unix"
diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props b/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props
index 1945bb9af0e..75c6d28a30f 100644
--- a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props
+++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props
@@ -71,7 +71,7 @@
<RuntimeGroup Include="fedora">
<Parent>linux</Parent>
<Architectures>x64;arm64</Architectures>
- <Versions>23;24;25;26;27;28;29;30;31;32;33;34;35;36</Versions>
+ <Versions>23;24;25;26;27;28;29;30;31;32;33;34;35;36;37</Versions>
<TreatVersionsAsCompatible>false</TreatVersionsAsCompatible>
</RuntimeGroup>

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
SHA512 (dotnet-v6.0.101.tar.gz) = e42d85d4cf5769e38059ea4f546e20452f4975a2ba448f81999deffb8a4e517d098ef23b8576c4654ec7a3b5e35006a90e5bf5ae2808012d3ed068f9d0a7eb90
SHA512 (dotnet-v6.0.102.tar.gz) = dcb4102b1a6c9e1889d80f8cecf30da00ad16320cbbf14de891db632ebaa0b872501865957429107ade0caef569a2f2ed5ccb70111de7772838b820997f0c36e