Skip to content

Commit 2b4d983

Browse files
committed
Fix: paket issue
1 parent 9355c21 commit 2b4d983

File tree

11 files changed

+1130
-900
lines changed

11 files changed

+1130
-900
lines changed

.paket/Paket.Restore.targets

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2+
<!-- Prevent dotnet template engine to parse this file -->
3+
<!--/-:cnd:noEmit-->
4+
<PropertyGroup>
5+
<!-- make MSBuild track this file for incremental builds. -->
6+
<!-- ref https://blogs.msdn.microsoft.com/msbuild/2005/09/26/how-to-ensure-changes-to-a-custom-target-file-prompt-a-rebuild/ -->
7+
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
8+
<!-- Mark that this target file has been loaded. -->
9+
<IsPaketRestoreTargetsFileLoaded>true</IsPaketRestoreTargetsFileLoaded>
10+
<PaketToolsPath>$(MSBuildThisFileDirectory)</PaketToolsPath>
11+
<PaketRootPath>$(MSBuildThisFileDirectory)..\</PaketRootPath>
12+
<PaketRestoreCacheFile>$(PaketRootPath)paket-files\paket.restore.cached</PaketRestoreCacheFile>
13+
<PaketLockFilePath>$(PaketRootPath)paket.lock</PaketLockFilePath>
14+
<MonoPath Condition="'$(MonoPath)' == '' And Exists('/Library/Frameworks/Mono.framework/Commands/mono')">/Library/Frameworks/Mono.framework/Commands/mono</MonoPath>
15+
<MonoPath Condition="'$(MonoPath)' == ''">mono</MonoPath>
16+
<!-- Paket command -->
17+
<PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket.exe')">$(PaketRootPath)paket.exe</PaketExePath>
18+
<PaketExePath Condition=" '$(PaketExePath)' == '' ">$(PaketToolsPath)paket.exe</PaketExePath>
19+
<PaketCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketExePath)"</PaketCommand>
20+
<PaketCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"</PaketCommand>
21+
<PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' AND Exists('$(PaketRootPath)paket.bootstrapper.exe')">$(PaketRootPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
22+
<PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' ">$(PaketToolsPath)paket.bootstrapper.exe</PaketBootStrapperExePath>
23+
<PaketBootStrapperCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
24+
<PaketBootStrapperCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)"</PaketBootStrapperCommand>
25+
26+
<!-- Disable automagic references for F# dotnet sdk -->
27+
<!-- This will not do anything for other project types -->
28+
<!-- see https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1032-fsharp-in-dotnet-sdk.md -->
29+
<DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference>
30+
<DisableImplicitSystemValueTupleReference>true</DisableImplicitSystemValueTupleReference>
31+
</PropertyGroup>
32+
33+
<Target Name="PaketRestore" BeforeTargets="_GenerateDotnetCliToolReferenceSpecs;_GenerateProjectRestoreGraphPerFramework;_GenerateRestoreGraphWalkPerFramework;CollectPackageReferences" >
34+
35+
<!-- Step 1 Check if lockfile is properly restored -->
36+
<PropertyGroup>
37+
<PaketRestoreRequired>true</PaketRestoreRequired>
38+
<NoWarn>$(NoWarn);NU1603</NoWarn>
39+
</PropertyGroup>
40+
41+
<PropertyGroup Condition="Exists('$(PaketRestoreCacheFile)') ">
42+
<PaketRestoreCachedHash>$([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))</PaketRestoreCachedHash>
43+
<PaketRestoreLockFileHash>$([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))</PaketRestoreLockFileHash>
44+
<PaketRestoreRequired>true</PaketRestoreRequired>
45+
<PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired>
46+
<PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '' ">true</PaketRestoreRequired>
47+
</PropertyGroup>
48+
49+
<!-- Do a global restore if required -->
50+
<Exec Command='$(PaketBootStrapperCommand)' Condition="Exists('$(PaketBootStrapperExePath)') AND !(Exists('$(PaketExePath)'))" ContinueOnError="false" />
51+
<Exec Command='$(PaketCommand) restore' Condition=" '$(PaketRestoreRequired)' == 'true' " ContinueOnError="false" />
52+
53+
<!-- Step 2 Detect project specific changes -->
54+
<PropertyGroup>
55+
<PaketReferencesCachedFilePath>$(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached</PaketReferencesCachedFilePath>
56+
<!-- MyProject.fsproj.paket.references has the highest precedence -->
57+
<PaketOriginalReferencesFilePath>$(MSBuildProjectFullPath).paket.references</PaketOriginalReferencesFilePath>
58+
<!-- MyProject.paket.references -->
59+
<PaketOriginalReferencesFilePath Condition=" !Exists('$(PaketOriginalReferencesFilePath)')">$(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references</PaketOriginalReferencesFilePath>
60+
<!-- paket.references -->
61+
<PaketOriginalReferencesFilePath Condition=" !Exists('$(PaketOriginalReferencesFilePath)')">$(MSBuildProjectDirectory)\paket.references</PaketOriginalReferencesFilePath>
62+
<PaketResolvedFilePath>$(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).paket.resolved</PaketResolvedFilePath>
63+
<PaketRestoreRequired>true</PaketRestoreRequired>
64+
<PaketRestoreRequiredReason>references-file-or-cache-not-found</PaketRestoreRequiredReason>
65+
</PropertyGroup>
66+
67+
<!-- Step 2 a Detect changes in references file -->
68+
<PropertyGroup Condition="Exists('$(PaketOriginalReferencesFilePath)') AND Exists('$(PaketReferencesCachedFilePath)') ">
69+
<PaketRestoreCachedHash>$([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)'))</PaketRestoreCachedHash>
70+
<PaketRestoreReferencesFileHash>$([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)'))</PaketRestoreReferencesFileHash>
71+
<PaketRestoreRequiredReason>references-file</PaketRestoreRequiredReason>
72+
<PaketRestoreRequired Condition=" '$(PaketRestoreReferencesFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired>
73+
</PropertyGroup>
74+
75+
<PropertyGroup Condition="!Exists('$(PaketOriginalReferencesFilePath)') AND !Exists('$(PaketReferencesCachedFilePath)') ">
76+
<!-- If both don't exist there is nothing to do. -->
77+
<PaketRestoreRequired>false</PaketRestoreRequired>
78+
</PropertyGroup>
79+
80+
<!-- Step 2 b detect relevant changes in project file (new targetframework) -->
81+
<PropertyGroup Condition=" !Exists('$(PaketResolvedFilePath)') AND '$(TargetFramework)' != '' ">
82+
<PaketRestoreRequired>true</PaketRestoreRequired>
83+
<PaketRestoreRequiredReason>target-framework '$(TargetFramework)'</PaketRestoreRequiredReason>
84+
</PropertyGroup>
85+
86+
<!-- Step 3 Restore project specific stuff if required -->
87+
<Message Condition=" '$(PaketRestoreRequired)' == 'true' " Importance="low" Text="Detected a change ('$(PaketRestoreRequiredReason)') in the project file '$(MSBuildProjectFullPath)', calling paket restore" />
88+
<Exec Command='$(PaketCommand) restore --project "$(MSBuildProjectFullPath)"' Condition=" '$(PaketRestoreRequired)' == 'true' " ContinueOnError="false" />
89+
90+
<!-- This shouldn't actually happen, but just to be sure. -->
91+
<Error Condition=" !Exists('$(PaketResolvedFilePath)') AND '$(TargetFramework)' != '' " Text="A paket file for the framework '$(TargetFramework)' is missing. Please delete 'paket-files/paket.restore.cached' and call 'paket restore'." />
92+
93+
<!-- Step 4 forward all msbuild properties (PackageReference, DotNetCliToolReference) to msbuild -->
94+
<ReadLinesFromFile Condition="Exists('$(PaketResolvedFilePath)')" File="$(PaketResolvedFilePath)" >
95+
<Output TaskParameter="Lines" ItemName="PaketReferencesFileLines"/>
96+
</ReadLinesFromFile>
97+
98+
<ItemGroup Condition=" Exists('$(PaketResolvedFilePath)') AND '@(PaketReferencesFileLines)' != '' " >
99+
<PaketReferencesFileLinesInfo Include="@(PaketReferencesFileLines)" >
100+
<PackageName>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0])</PackageName>
101+
<PackageVersion>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1])</PackageVersion>
102+
</PaketReferencesFileLinesInfo>
103+
<PackageReference Include="%(PaketReferencesFileLinesInfo.PackageName)">
104+
<Version>%(PaketReferencesFileLinesInfo.PackageVersion)</Version>
105+
</PackageReference>
106+
</ItemGroup>
107+
108+
<PropertyGroup>
109+
<PaketCliToolFilePath>$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).paket.clitools</PaketCliToolFilePath>
110+
</PropertyGroup>
111+
112+
<ReadLinesFromFile File="$(PaketCliToolFilePath)" >
113+
<Output TaskParameter="Lines" ItemName="PaketCliToolFileLines"/>
114+
</ReadLinesFromFile>
115+
116+
<ItemGroup Condition=" '@(PaketCliToolFileLines)' != '' " >
117+
<PaketCliToolFileLinesInfo Include="@(PaketCliToolFileLines)" >
118+
<PackageName>$([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0])</PackageName>
119+
<PackageVersion>$([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1])</PackageVersion>
120+
</PaketCliToolFileLinesInfo>
121+
<DotNetCliToolReference Include="%(PaketCliToolFileLinesInfo.PackageName)">
122+
<Version>%(PaketCliToolFileLinesInfo.PackageVersion)</Version>
123+
</DotNetCliToolReference>
124+
</ItemGroup>
125+
126+
<PropertyGroup>
127+
<RestoreConfigFile>$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).NuGet.Config</RestoreConfigFile>
128+
</PropertyGroup>
129+
130+
</Target>
131+
132+
<Target Name="PaketDisableDirectPack" AfterTargets="_IntermediatePack" BeforeTargets="GenerateNuspec" Condition="('$(IsPackable)' == '' Or '$(IsPackable)' == 'true') And Exists('$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references')" >
133+
<PropertyGroup>
134+
<ContinuePackingAfterGeneratingNuspec>false</ContinuePackingAfterGeneratingNuspec>
135+
</PropertyGroup>
136+
</Target>
137+
138+
<Target Name="PaketOverrideNuspec" AfterTargets="GenerateNuspec" Condition="('$(IsPackable)' == '' Or '$(IsPackable)' == 'true') And Exists('$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references')" >
139+
<PropertyGroup>
140+
<PaketProjectFile>$(MSBuildProjectDirectory)/$(MSBuildProjectFile)</PaketProjectFile>
141+
<ContinuePackingAfterGeneratingNuspec>true</ContinuePackingAfterGeneratingNuspec>
142+
<UseNewPack>false</UseNewPack>
143+
<UseNewPack Condition=" '$(NuGetToolVersion)' != '4.0.0' ">true</UseNewPack>
144+
</PropertyGroup>
145+
146+
<ItemGroup>
147+
<_NuspecFiles Include="$(BaseIntermediateOutputPath)*.nuspec"/>
148+
</ItemGroup>
149+
150+
<Exec Command='$(PaketCommand) fix-nuspecs files "@(_NuspecFiles)" project-file "$(PaketProjectFile)" ' Condition="@(_NuspecFiles) != ''" />
151+
152+
<ConvertToAbsolutePath Condition="@(_NuspecFiles) != ''" Paths="@(_NuspecFiles)">
153+
<Output TaskParameter="AbsolutePaths" PropertyName="NuspecFileAbsolutePath" />
154+
</ConvertToAbsolutePath>
155+
156+
<!-- Call Pack -->
157+
<PackTask Condition="$(UseNewPack)"
158+
PackItem="$(PackProjectInputFile)"
159+
PackageFiles="@(_PackageFiles)"
160+
PackageFilesToExclude="@(_PackageFilesToExclude)"
161+
PackageVersion="$(PackageVersion)"
162+
PackageId="$(PackageId)"
163+
Title="$(Title)"
164+
Authors="$(Authors)"
165+
Description="$(Description)"
166+
Copyright="$(Copyright)"
167+
RequireLicenseAcceptance="$(PackageRequireLicenseAcceptance)"
168+
LicenseUrl="$(PackageLicenseUrl)"
169+
ProjectUrl="$(PackageProjectUrl)"
170+
IconUrl="$(PackageIconUrl)"
171+
ReleaseNotes="$(PackageReleaseNotes)"
172+
Tags="$(PackageTags)"
173+
DevelopmentDependency="$(DevelopmentDependency)"
174+
BuildOutputInPackage="@(_BuildOutputInPackage)"
175+
TargetPathsToSymbols="@(_TargetPathsToSymbols)"
176+
TargetFrameworks="@(_TargetFrameworks)"
177+
AssemblyName="$(AssemblyName)"
178+
PackageOutputPath="$(PackageOutputAbsolutePath)"
179+
IncludeSymbols="$(IncludeSymbols)"
180+
IncludeSource="$(IncludeSource)"
181+
PackageTypes="$(PackageType)"
182+
IsTool="$(IsTool)"
183+
RepositoryUrl="$(RepositoryUrl)"
184+
RepositoryType="$(RepositoryType)"
185+
SourceFiles="@(_SourceFiles->Distinct())"
186+
NoPackageAnalysis="$(NoPackageAnalysis)"
187+
MinClientVersion="$(MinClientVersion)"
188+
Serviceable="$(Serviceable)"
189+
FrameworkAssemblyReferences="@(_FrameworkAssemblyReferences)"
190+
ContinuePackingAfterGeneratingNuspec="$(ContinuePackingAfterGeneratingNuspec)"
191+
NuspecOutputPath="$(BaseIntermediateOutputPath)"
192+
IncludeBuildOutput="$(IncludeBuildOutput)"
193+
BuildOutputFolder="$(BuildOutputTargetFolder)"
194+
ContentTargetFolders="$(ContentTargetFolders)"
195+
RestoreOutputPath="$(RestoreOutputAbsolutePath)"
196+
NuspecFile="$(NuspecFileAbsolutePath)"
197+
NuspecBasePath="$(NuspecBasePath)"
198+
NuspecProperties="$(NuspecProperties)"/>
199+
200+
<PackTask Condition="! $(UseNewPack)"
201+
PackItem="$(PackProjectInputFile)"
202+
PackageFiles="@(_PackageFiles)"
203+
PackageFilesToExclude="@(_PackageFilesToExclude)"
204+
PackageVersion="$(PackageVersion)"
205+
PackageId="$(PackageId)"
206+
Title="$(Title)"
207+
Authors="$(Authors)"
208+
Description="$(Description)"
209+
Copyright="$(Copyright)"
210+
RequireLicenseAcceptance="$(PackageRequireLicenseAcceptance)"
211+
LicenseUrl="$(PackageLicenseUrl)"
212+
ProjectUrl="$(PackageProjectUrl)"
213+
IconUrl="$(PackageIconUrl)"
214+
ReleaseNotes="$(PackageReleaseNotes)"
215+
Tags="$(PackageTags)"
216+
TargetPathsToAssemblies="@(_TargetPathsToAssemblies->'%(FinalOutputPath)')"
217+
TargetPathsToSymbols="@(_TargetPathsToSymbols)"
218+
TargetFrameworks="@(_TargetFrameworks)"
219+
AssemblyName="$(AssemblyName)"
220+
PackageOutputPath="$(PackageOutputAbsolutePath)"
221+
IncludeSymbols="$(IncludeSymbols)"
222+
IncludeSource="$(IncludeSource)"
223+
PackageTypes="$(PackageType)"
224+
IsTool="$(IsTool)"
225+
RepositoryUrl="$(RepositoryUrl)"
226+
RepositoryType="$(RepositoryType)"
227+
SourceFiles="@(_SourceFiles->Distinct())"
228+
NoPackageAnalysis="$(NoPackageAnalysis)"
229+
MinClientVersion="$(MinClientVersion)"
230+
Serviceable="$(Serviceable)"
231+
AssemblyReferences="@(_References)"
232+
ContinuePackingAfterGeneratingNuspec="$(ContinuePackingAfterGeneratingNuspec)"
233+
NuspecOutputPath="$(BaseIntermediateOutputPath)"
234+
IncludeBuildOutput="$(IncludeBuildOutput)"
235+
BuildOutputFolder="$(BuildOutputTargetFolder)"
236+
ContentTargetFolders="$(ContentTargetFolders)"
237+
RestoreOutputPath="$(RestoreOutputAbsolutePath)"
238+
NuspecFile="$(NuspecFileAbsolutePath)"
239+
NuspecBasePath="$(NuspecBasePath)"
240+
NuspecProperties="$(NuspecProperties)"/>
241+
</Target>
242+
<!--/+:cnd:noEmit-->
243+
</Project>

FSharp.Plotly.sln

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Microsoft Visual Studio Solution File, Format Version 12.00
2-
# Visual Studio 14
3-
VisualStudioVersion = 14.0.25420.1
2+
# Visual Studio 15
3+
VisualStudioVersion = 15.0.27004.2002
44
MinimumVisualStudioVersion = 10.0.40219.1
55
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{63297B98-5CED-492C-A5B7-A5B4F73CF142}"
66
ProjectSection(SolutionItems) = preProject
@@ -10,8 +10,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{63297B
1010
EndProject
1111
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}"
1212
EndProject
13-
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Plotly", "src\FSharp.Plotly\FSharp.Plotly.fsproj", "{8A8D5B08-BFD1-4953-8624-F1520A342232}"
14-
EndProject
1513
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{BF60BC93-E09B-4E5F-9D85-95A519479D54}"
1614
ProjectSection(SolutionItems) = preProject
1715
build.fsx = build.fsx
@@ -57,16 +55,14 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Plotly.Tests", "test
5755
EndProject
5856
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Plotly.WPF", "src\FSharp.Plotly.WPF\FSharp.Plotly.WPF.fsproj", "{8540F0CB-E9DE-4FBF-B691-C13A4A28E6B8}"
5957
EndProject
58+
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Plotly", "src\FSharp.Plotly\FSharp.Plotly.fsproj", "{A57AEBC7-0C03-487E-B8A3-0F6CBDAD88F3}"
59+
EndProject
6060
Global
6161
GlobalSection(SolutionConfigurationPlatforms) = preSolution
6262
Debug|Any CPU = Debug|Any CPU
6363
Release|Any CPU = Release|Any CPU
6464
EndGlobalSection
6565
GlobalSection(ProjectConfigurationPlatforms) = postSolution
66-
{8A8D5B08-BFD1-4953-8624-F1520A342232}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
67-
{8A8D5B08-BFD1-4953-8624-F1520A342232}.Debug|Any CPU.Build.0 = Debug|Any CPU
68-
{8A8D5B08-BFD1-4953-8624-F1520A342232}.Release|Any CPU.ActiveCfg = Release|Any CPU
69-
{8A8D5B08-BFD1-4953-8624-F1520A342232}.Release|Any CPU.Build.0 = Release|Any CPU
7066
{B7F06453-847A-4894-9705-7BFB793E5AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
7167
{B7F06453-847A-4894-9705-7BFB793E5AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
7268
{B7F06453-847A-4894-9705-7BFB793E5AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -75,6 +71,10 @@ Global
7571
{8540F0CB-E9DE-4FBF-B691-C13A4A28E6B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
7672
{8540F0CB-E9DE-4FBF-B691-C13A4A28E6B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
7773
{8540F0CB-E9DE-4FBF-B691-C13A4A28E6B8}.Release|Any CPU.Build.0 = Release|Any CPU
74+
{A57AEBC7-0C03-487E-B8A3-0F6CBDAD88F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
75+
{A57AEBC7-0C03-487E-B8A3-0F6CBDAD88F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
76+
{A57AEBC7-0C03-487E-B8A3-0F6CBDAD88F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
77+
{A57AEBC7-0C03-487E-B8A3-0F6CBDAD88F3}.Release|Any CPU.Build.0 = Release|Any CPU
7878
EndGlobalSection
7979
GlobalSection(SolutionProperties) = preSolution
8080
HideSolutionNode = FALSE
@@ -84,4 +84,7 @@ Global
8484
{8E6D5255-776D-4B61-85F9-73C37AA1FB9A} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}
8585
{B7F06453-847A-4894-9705-7BFB793E5AFC} = {ED8079DD-2B06-4030-9F0F-DC548F98E1C4}
8686
EndGlobalSection
87+
GlobalSection(ExtensibilityGlobals) = postSolution
88+
SolutionGuid = {6B093780-85CB-449D-9030-8C934CEFB224}
89+
EndGlobalSection
8790
EndGlobal

0 commit comments

Comments
 (0)